view libgui/graphics/ToolBarButton.cc @ 30788:c11d34f72b3c

provide different icon sets for the GUI * FigureWindow.cc (FigureWindow): rename icon path used for figure icons * ToolBarButton.cc (get_icon): dito * libgui/src/cursors: moved directory into libgui/src/icons/cursors * gui-preferences-global.h: update enum for icon related string list, renamed global_icon_fallback_paths into global_icon_paths and extended by cursors directory, string lists for icon themes and the related names * libgui/src/icons/octave/128x128/document-open.png * libgui/src/icons/octave/128x128/folder-new.png * libgui/src/icons/octave/128x128/folder-up.png * libgui/src/icons/octave/128x128/folder.png * libgui/src/icons/octave/128x128/user-home.png: moved from tango theme * libgui/src/icons/octave/scalable/document-open.svg * libgui/src/icons/octave/scalable/folder-new.svg * libgui/src/icons/octave/scalable/folder-up.svg * libgui/src/icons/octave/scalable/folder.svg * libgui/src/icons/octave/scalable/user-home.svg: moved from tango theme * libgui/src/icons/tango/128x128/document-open.png * libgui/src/icons/tango/128x128/folder-new.png * libgui/src/icons/tango/128x128/folder-up.png * libgui/src/icons/tango/128x128/folder.png * libgui/src/icons/tango/128x128/user-home.png: recovered tango versions * libgui/src/icons/tango/scalable/document-open.svg * libgui/src/icons/tango/scalable/folder-new.svg * libgui/src/icons/tango/scalable/folder-up.svg * libgui/src/icons/tango/scalable/folder.svg * libgui/src/icons/tango/scalable/user-home.svg: recovered tango versions * module.mk: updated according to changed icon files * octave-dock-widget.cc (label_dock_widget): use second boolean argument of ressource_manager::icon for icons only available in the octave theme and using new icon search path for octave only icons in style sheets; (octave_dock_widget, make_window, make_widget, set_style): dito; * resource-manager.cc (config_icon_theme): check new and old icon theme preference and transfer old into new if required, add fallbacks search paths depending on current theme; (icon): look for icon in current theme, if not existing, go through the defined icon search paths, use second boolean argument for icons that are only available in the octave icon theme like widget-xyz icnos * resource-manager.h: updated secon boolean argument of icon function * resource.qrc: update icon file names and paths * settings-dialog.cc (settings_dialog): fill new combo box with names of available icon themes; (write_changed_settings): write current index of combo box in pref file * settings-dialog.ui: replaced check box for system icon theme by combo box for icon themes
author Torsten Lilge <ttl-octave@mailbox.org>
date Sun, 27 Feb 2022 20:21:12 +0100
parents 439eb9bd4c04
children ca7d58406f82 c6d54dd31a7e
line wrap: on
line source

////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2011-2022 The Octave Project Developers
//
// See the file COPYRIGHT.md in the top-level directory of this
// distribution or <https://octave.org/copyright/>.
//
// This file is part of Octave.
//
// Octave is free software: you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Octave is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Octave; see the file COPYING.  If not, see
// <https://www.gnu.org/licenses/>.
//
////////////////////////////////////////////////////////////////////////

// This file should not include config.h.  It is only included in other
// C++ source files that should have included config.h before including
// this file.

#include <QAction>
#include <QIcon>
#include <QString>
#include <QWidget>

#include "ToolBarButton.h"
#include "QtHandlesUtils.h"
#include "octave-qobject.h"
#include "gui-preferences-global.h"

namespace octave
{
  template <typename T>
  ToolBarButton<T>::ToolBarButton (octave::base_qobject& oct_qobj,
                                   octave::interpreter& interp,
                                   const graphics_object& go, QAction *action)
    : Object (oct_qobj, interp, go, action), m_separator (nullptr)
  {
    typename T::properties& tp = properties<T> ();

    action->setToolTip (Utils::fromStdString (tp.get_tooltipstring ()));
    action->setVisible (tp.is_visible ());

    // Get the icon data from cdata or as a named icon
    QImage img = Utils::makeImageFromCData (tp.get_cdata (), 24, 24);

    if (img.width () == 0)
      {
        QIcon ico;
        std::string name = tp.get___named_icon__ ();
        if (! name.empty ())
          ico = get_icon (name);

        action->setIcon (ico);
      }
    else
      action->setIcon (QIcon (QPixmap::fromImage (img)));

    if (tp.is_separator ())
      {
        m_separator = new QAction (action);
        m_separator->setSeparator (true);
        m_separator->setVisible (tp.is_visible ());
      }
    action->setEnabled (tp.is_enable ());

    QWidget *w = qobject_cast<QWidget *> (action->parent ());

    w->insertAction (w->actions ().back (), action);
    if (m_separator)
      w->insertAction (action, m_separator);
  }

  template <typename T>
  ToolBarButton<T>::~ToolBarButton (void)
  { }

  template <typename T>
  void
  ToolBarButton<T>::update (int pId)
  {
    typename T::properties& tp = properties<T> ();
    QAction *action = qWidget<QAction> ();

    switch (pId)
      {
      case base_properties::ID_VISIBLE:
        action->setVisible (tp.is_visible ());
        if (m_separator)
          m_separator->setVisible (tp.is_visible ());
        break;

      case T::properties::ID_TOOLTIPSTRING:
        action->setToolTip (Utils::fromStdString (tp.get_tooltipstring ()));
        break;

      case T::properties::ID_CDATA:
        {
          // Get the icon data from cdata or as a named icon
          QImage img = Utils::makeImageFromCData (tp.get_cdata (), 24, 24);

          if (img.width () == 0)
            {
              QIcon ico;
              std::string name = tp.get___named_icon__ ();
              if (! name.empty ())
                ico = get_icon (name);

              action->setIcon (ico);
            }
          else
            action->setIcon (QIcon (QPixmap::fromImage (img)));
        }
        break;

      case T::properties::ID_SEPARATOR:
        if (tp.is_separator ())
          {
            if (! m_separator)
              {
                m_separator = new QAction (action);
                m_separator->setSeparator (true);
                m_separator->setVisible (tp.is_visible ());

                QWidget *w = qobject_cast<QWidget *> (action->parent ());

                w->insertAction (action, m_separator);
              }
          }
        else
          {
            if (m_separator)
              delete m_separator;
            m_separator = nullptr;
          }
        break;

      case T::properties::ID_ENABLE:
        action->setEnabled (tp.is_enable ());
        break;

      default:
        Object::update (pId);
        break;
      }
  }

  template <typename T>
  QIcon ToolBarButton<T>::get_icon (const std::string& name)
  {
    return QIcon (global_icon_paths.at (ICON_THEME_OCTAVE) + QString::fromStdString (name) + ".png");
  }

}