changeset 27224:9b8903d3e626

Allow figure "keypressfcn" to work with uipanel on the way (bug #56598) * Panel.cc (Panel::Panel): Make sure the canvas listens to key events when the parent figure has non empty "key*fcn" properties. * Figure.cc (Figure::update): Look for uipanel children objects and update their canvas key event mask when the "key*fcn" are changed. * Canvas.cc (Canvas::canvasKeyPressEvent, Canvas::canvasKeyReleaseEvent): Use the handle of the ancestor figure to post changes since the m_handle may a handle to a uipanel.
author Pantxo Diribarne <pantxo.diribarne@gmail.com>
date Tue, 09 Jul 2019 19:41:27 +0200
parents 1ae91e5d70cc
children 57bb8f531707
files libgui/graphics/Canvas.cc libgui/graphics/Figure.cc libgui/graphics/Panel.cc
diffstat 3 files changed, 65 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/graphics/Canvas.cc	Thu Jul 04 21:14:09 2019 +0200
+++ b/libgui/graphics/Canvas.cc	Tue Jul 09 19:41:27 2019 +0200
@@ -664,9 +664,10 @@
                 fprop.set_currentobject (Matrix ());
 
               // Update figure "selectiontype" and "currentpoint"
-              gh_manager::post_set (
-                                    figObj.get_handle (), "selectiontype",
-                                    Utils::figureSelectionType (event, isdblclick), false);
+              gh_manager::post_set (figObj.get_handle (), "selectiontype",
+                                    Utils::figureSelectionType (event,
+                                                                isdblclick),
+                                    false);
 
               updateCurrentPoint (figObj, obj, event);
 
@@ -1029,13 +1030,14 @@
             graphics_object figObj (obj.get_ancestor ("figure"));
 
             updateCurrentPoint (figObj, obj);
-          }
 
-        octave_scalar_map eventData = Utils::makeKeyEventStruct (event);
+            octave_scalar_map eventData = Utils::makeKeyEventStruct (event);
 
-        gh_manager::post_set (m_handle, "currentcharacter",
-                              eventData.getfield ("Character"), false);
-        gh_manager::post_callback (m_handle, "keypressfcn", eventData);
+            gh_manager::post_set (figObj.get_handle (), "currentcharacter",
+                                  eventData.getfield ("Character"), false);
+            gh_manager::post_callback (figObj.get_handle (), "keypressfcn",
+                                       eventData);
+          }
 
         return true;
       }
@@ -1048,8 +1050,15 @@
   {
     if (! event->isAutoRepeat () && (m_eventMask & KeyRelease))
       {
-        gh_manager::post_callback (m_handle, "keyreleasefcn",
-                                   Utils::makeKeyEventStruct (event));
+        gh_manager::auto_lock lock;
+        graphics_object obj = gh_manager::get_object (m_handle);
+
+        if (obj.valid_object ())
+          {
+            graphics_object figObj (obj.get_ancestor ("figure"));
+            gh_manager::post_callback (figObj.get_handle (), "keyreleasefcn",
+                                       Utils::makeKeyEventStruct (event));
+          }
 
         return true;
       }
--- a/libgui/graphics/Figure.cc	Thu Jul 04 21:14:09 2019 +0200
+++ b/libgui/graphics/Figure.cc	Tue Jul 09 19:41:27 2019 +0200
@@ -425,6 +425,25 @@
           m_container->canvas (m_handle)->clearEventMask (Canvas::KeyPress);
         else
           m_container->canvas (m_handle)->addEventMask (Canvas::KeyPress);
+        // Signal the change to uipanels as well
+        foreach (QObject *qobj,
+                 qWidget<QWidget> ()->findChildren<QObject*> ())
+          {
+            if (qobj->objectName () == "UIPanel")
+              {
+                Object *obj = Object::fromQObject (qobj);
+
+                if (obj)
+                  {
+                    if (fp.get_keypressfcn ().isempty ())
+                      obj->innerContainer ()->canvas (m_handle)->
+                        clearEventMask (Canvas::KeyPress);
+                    else
+                      obj->innerContainer ()->canvas (m_handle)->
+                        addEventMask (Canvas::KeyPress);
+                  }
+              }
+          }
         break;
 
       case figure::properties::ID_KEYRELEASEFCN:
@@ -433,6 +452,26 @@
         else
           m_container->canvas (m_handle)->addEventMask (Canvas::KeyRelease);
         break;
+        // Signal the change to uipanels as well
+        foreach (QObject *qobj,
+                 qWidget<QWidget> ()->findChildren<QObject*> ())
+          {
+            if (qobj->objectName () == "UIPanel")
+              {
+                Object *obj = Object::fromQObject (qobj);
+
+                if (obj)
+                  {
+                    if (fp.get_keypressfcn ().isempty ())
+                      obj->innerContainer ()->canvas (m_handle)->
+                        clearEventMask (Canvas::KeyRelease);
+                    else
+                      obj->innerContainer ()->canvas (m_handle)->
+                        addEventMask (Canvas::KeyRelease);
+                  }
+              }
+          }
+        break;
 
       case figure::properties::ID_WINDOWSTYLE:
         if (fp.windowstyle_is ("modal"))
--- a/libgui/graphics/Panel.cc	Thu Jul 04 21:14:09 2019 +0200
+++ b/libgui/graphics/Panel.cc	Tue Jul 09 19:41:27 2019 +0200
@@ -138,6 +138,13 @@
 
     frame->installEventFilter (this);
     m_container->installEventFilter (this);
+    
+    graphics_object fig (go.get_ancestor ("figure"));
+    if (! fig.get ("keypressfcn").isempty ())
+      m_container->canvas (m_handle)->addEventMask (Canvas::KeyPress);
+    
+    if (! fig.get ("keyreleasefcn").isempty ())
+      m_container->canvas (m_handle)->addEventMask (Canvas::KeyRelease);
 
     if (pp.is_visible ())
       QTimer::singleShot (0, frame, SLOT (show (void)));