diff libgui/graphics/Menu.cc @ 18498:2e7cad6f180c gui-release

Initial integration of QtHandles. * configure.ac: Check for QtOpenGL module. * libgui/Makefile.am: Include libgui/graphics/module.mk. (liboctgui_la_LIBADD): Include graphics/libgui-graphics.la in the list. (rcc-command): Pass "-name DIR" to rcc command. * main-window.cc (main_window::construct): Install qt functions and register qt toolkit. * libgui/src/module.mk (src_libgui_src_la_CPPFLAGS): Include $(FONTCONFIG_CPPFLAGS) and -I$(srcdir)/graphics in the list. * graphics.cc (gtk_manager::gtk_manager): Make qt the default toolkit if it is available. * libgui/graphics/Backend.cc, libgui/graphics/Backend.h, libgui/graphics/BaseControl.cc, libgui/graphics/BaseControl.h, libgui/graphics/ButtonControl.cc, libgui/graphics/ButtonControl.h, libgui/graphics/Canvas.cc, libgui/graphics/Canvas.h, libgui/graphics/CheckBoxControl.cc, libgui/graphics/CheckBoxControl.h, libgui/graphics/Container.cc, libgui/graphics/Container.h, libgui/graphics/ContextMenu.cc, libgui/graphics/ContextMenu.h, libgui/graphics/EditControl.cc, libgui/graphics/EditControl.h, libgui/graphics/Figure.cc, libgui/graphics/Figure.h, libgui/graphics/FigureWindow.cc, libgui/graphics/FigureWindow.h, libgui/graphics/GLCanvas.cc, libgui/graphics/GLCanvas.h, , libgui/graphics/GenericEventNotify.h, libgui/graphics/KeyMap.cc, libgui/graphics/KeyMap.h, libgui/graphics/ListBoxControl.cc, libgui/graphics/ListBoxControl.h, libgui/graphics/Logger.cc, libgui/graphics/Logger.h, libgui/graphics/Menu.cc, libgui/graphics/Menu.h, libgui/graphics/MenuContainer.h, libgui/graphics/MouseModeActionGroup.cc, libgui/graphics/MouseModeActionGroup.h, libgui/graphics/Object.cc, libgui/graphics/Object.h, libgui/graphics/ObjectFactory.cc, libgui/graphics/ObjectFactory.h, libgui/graphics/ObjectProxy.cc, libgui/graphics/ObjectProxy.h, libgui/graphics/Panel.cc, libgui/graphics/Panel.h, libgui/graphics/PopupMenuControl.cc, libgui/graphics/PopupMenuControl.h, libgui/graphics/PushButtonControl.cc, libgui/graphics/PushButtonControl.h, libgui/graphics/PushTool.cc, libgui/graphics/PushTool.h, libgui/graphics/RadioButtonControl.cc, libgui/graphics/RadioButtonControl.h, libgui/graphics/SliderControl.cc, libgui/graphics/SliderControl.h, libgui/graphics/TextControl.cc, libgui/graphics/TextControl.h, libgui/graphics/TextEdit.cc, libgui/graphics/TextEdit.h, libgui/graphics/ToggleButtonControl.cc, libgui/graphics/ToggleButtonControl.h, libgui/graphics/ToggleTool.cc, libgui/graphics/ToggleTool.h, libgui/graphics/ToolBar.cc, libgui/graphics/ToolBar.h, libgui/graphics/ToolBarButton.cc, libgui/graphics/ToolBarButton.h, libgui/graphics/Utils.cc, libgui/graphics/Utils.h, libgui/graphics/__init_qt__.cc, libgui/graphics/__init_qt__.h, libgui/graphics/gl-select.cc, libgui/graphics/gl-select.h, libgui/graphics/images/README, libgui/graphics/images/pan.png, libgui/graphics/images/rotate.png, libgui/graphics/images/select.png, libgui/graphics/images/zoom.png, libgui/graphics/module.mk, libgui/graphics/qthandles.qrc: New files.
author John W. Eaton <jwe@octave.org>
date Thu, 20 Feb 2014 14:05:45 -0500
parents
children 49877d3be064
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libgui/graphics/Menu.cc	Thu Feb 20 14:05:45 2014 -0500
@@ -0,0 +1,328 @@
+/*
+
+Copyright (C) 2011 Michael Goffioul.
+
+This file is part of QtHandles.
+
+Foobar 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.
+
+QtHandles 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 Foobar.  If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <QAction>
+#include <QMainWindow>
+#include <QMenu>
+#include <QMenuBar>
+
+#include "Figure.h"
+#include "Menu.h"
+#include "Utils.h"
+
+//////////////////////////////////////////////////////////////////////////////
+
+namespace QtHandles
+{
+
+//////////////////////////////////////////////////////////////////////////////
+
+static QKeySequence accelSequence (const uimenu::properties& up)
+{
+  std::string s (up.get_accelerator ());
+
+  if (! s.empty ())
+    {
+      char c = s[0];
+      int keyMod = Qt::CTRL;
+
+      if (c >= 'A' && c <= 'Z')
+	keyMod |= Qt::SHIFT;
+      if (c >= 'a' && c <= 'z')
+	c -= ('a' - 'A');
+      if (c >= 'A' && c <= 'Z')
+	return QKeySequence (keyMod | static_cast<int> (c));
+    }
+
+  return QKeySequence ();
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+Menu* Menu::create (const graphics_object& go)
+{
+  Object* parent = Object::parentObject (go);
+
+  if (parent)
+    {
+      QObject* qObj = parent->qObject ();
+
+      if (qObj)
+	return new Menu (go, new QAction (qObj), parent);
+    }
+
+  return 0;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+Menu::Menu (const graphics_object& go, QAction* action, Object* parent)
+    : Object (go, action), m_parent (0), m_separator (0)
+{
+  uimenu::properties& up = properties<uimenu> ();
+
+  action->setText (Utils::fromStdString (up.get_label ()));
+  if (up.is_checked ())
+    {
+      action->setCheckable (true);
+      action->setChecked (up.is_checked ());
+    }
+  action->setEnabled (up.is_enable ());
+  action->setShortcut (accelSequence (up));
+  action->setVisible (up.is_visible ());
+  if (up.is_separator ())
+    {
+      m_separator = new QAction (action);
+      m_separator->setSeparator (true);
+      m_separator->setVisible (up.is_visible ());
+    }
+
+  MenuContainer* menuContainer = dynamic_cast<MenuContainer*> (parent);
+
+  if (menuContainer)
+    m_parent = menuContainer->menu ();
+
+  if (m_parent)
+    {
+      int pos = static_cast<int> (up.get_position ());
+
+      if (pos <= 0)
+	{
+	  if (m_separator)
+	    m_parent->insertAction (0, m_separator);
+	  m_parent->insertAction (0, action);
+
+	  int count = 0;
+
+	  foreach (QAction* a, m_parent->actions ())
+	    if (! a->isSeparator () && a->objectName () != "builtinMenu")
+	      count++;
+	  up.get_property ("position").set
+	    (octave_value (static_cast<double> (count)), true, false);
+	}
+      else
+	{
+
+	  int count = 0;
+	  QAction* before = 0;
+
+	  foreach (QAction* a, m_parent->actions ())
+	    if (! a->isSeparator () && a->objectName () != "builtinMenu")
+	      {
+		count++;
+		if (pos <= count)
+		  {
+		    before = a;
+		    break;
+		  }
+	      }
+
+	  if (m_separator)
+	    m_parent->insertAction (before, m_separator);
+	  m_parent->insertAction (before, action);
+
+	  if (before)
+	    updateSiblingPositions ();
+	  else
+	    up.get_property ("position").set
+	      (octave_value (static_cast<double> (count+1)), true, false);
+	}
+    }
+
+  connect (action, SIGNAL (triggered (bool)), SLOT (actionTriggered (void)));
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+Menu::~Menu (void)
+{
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+void Menu::update (int pId)
+{
+  uimenu::properties& up = properties<uimenu> ();
+  QAction* action = qWidget<QAction> ();
+
+  switch (pId)
+    {
+    case uimenu::properties::ID_LABEL:
+      action->setText (Utils::fromStdString (up.get_label ()));
+      break;
+    case uimenu::properties::ID_CHECKED:
+      if (up.is_checked ())
+	{
+	  action->setCheckable (true);
+	  action->setChecked (up.is_checked ());
+	}
+      else
+	{
+	  action->setChecked (false);
+	  action->setCheckable (false);
+	}
+      break;
+    case uimenu::properties::ID_ENABLE:
+      action->setEnabled (up.is_enable ());
+      break;
+    case uimenu::properties::ID_ACCELERATOR:
+      if (! action->menu ())
+	action->setShortcut (accelSequence (up));
+      break;
+    case uimenu::properties::ID_SEPARATOR:
+      if (up.is_separator ())
+	{
+	  if (! m_separator)
+	    {
+	      m_separator = new QAction (action);
+	      m_separator->setSeparator (true);
+	      m_separator->setVisible (up.is_visible ());
+	      if (m_parent)
+		m_parent->insertAction (action, m_separator);
+	    }
+	}
+      else
+	{
+	  if (m_separator)
+	    delete m_separator;
+	  m_separator = 0;
+	}
+      break;
+    case uimenu::properties::ID_VISIBLE:
+      action->setVisible (up.is_visible ());
+      if (m_separator)
+	m_separator->setVisible (up.is_visible ());
+      break;
+    case uimenu::properties::ID_POSITION:
+      if (m_separator)
+	m_parent->removeAction (m_separator);
+      m_parent->removeAction (action);
+	{
+	  int pos = static_cast<int> (up.get_position ());
+	  QAction* before = 0;
+
+	  if (pos > 0)
+	    {
+	      int count = 0;
+
+	      foreach (QAction* a, m_parent->actions ())
+		if (! a->isSeparator () && a->objectName () != "builtinMenu")
+		  {
+		    count++;
+		    if (pos <= count)
+		      {
+			before = a;
+			break;
+		      }
+		  }
+	    }
+
+	  if (m_separator)
+	    m_parent->insertAction (before, m_separator);
+	  m_parent->insertAction (before, action);
+	  updateSiblingPositions ();
+	}
+      break;
+    default:
+      Object::update (pId);
+      break;
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+QWidget* Menu::menu (void)
+{
+  QAction* action = qWidget<QAction> ();
+  QMenu* _menu = action->menu ();
+
+  if (! _menu)
+    {
+      _menu = new QMenu (action->parentWidget ());
+      action->setMenu (_menu);
+      action->setShortcut (QKeySequence ());
+      connect (_menu, SIGNAL (aboutToShow (void)),
+	       this, SLOT (actionHovered (void)));
+    }
+
+  return _menu;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+void Menu::actionTriggered (void)
+{
+  QAction* action = qWidget<QAction> ();
+
+  if (action->isCheckable ())
+    action->setChecked (! action->isChecked ());
+  gh_manager::post_callback (m_handle, "callback");
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+void Menu::actionHovered (void)
+{
+  gh_manager::post_callback (m_handle, "callback");
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+void Menu::updateSiblingPositions (void)
+{
+  if (m_parent)
+    {
+      double count = 1.0;
+
+      foreach (QAction* a, m_parent->actions ())
+	{
+	  if (! a->isSeparator () && a->objectName () != "builtinMenu")
+	    {
+	      Object* aObj = Object::fromQObject (a);
+
+	      if (aObj)
+		{
+		  graphics_object go = aObj->object ();
+
+		  // Probably overkill as a uimenu child can only be another
+		  // uimenu object.
+		  if (go.isa ("uimenu"))
+		    {
+		      uimenu::properties& up = Utils::properties<uimenu> (go);
+
+		      up.get_property ("position").set
+			(octave_value (count), true, false);
+		    }
+		}
+
+	      count++;
+	    }
+	}
+    }
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+}; // namespace QtHandles