Mercurial > octave
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)));