Mercurial > octave
changeset 27303:07b330708e3c
use Qt signals for interpreter callbacks in Qt graphics toolkit
* Backend.h, Backend.cc (Backend::m_interpreter): New data member.
(Backend::createObject): Pass pointer to invoking Backend object in
signal argument list.
(Backend::interpreter_event): New slots. Access interpreter
event_manager to post interpreter callbacks events here.
* ObjectFactory.h, ObjectFactory.cc (ObjectFactory::createObject): New
arg, backend. Connect interpreter_event signal from newly created
object to interpreter_event slot in backend object.
* __init_qt__.cc (__init__): Pass interpreter to Backend constructor.
* module.mk (OCTAVE_GUI_GRAPHICS_MOC): New files, moc-Canvas.cc and
moc-Container.cc.
* Object.h (Object::interpreter_event): New signals.
* Canvas.h, Canvas.cc (Canvas::interprter_event): New signals.
(Canvas::canvasMouseReleaseEvent): Emit interpreter_event signal
instead of accessing interpreter event_manager object directly here.
* GLCanvas.cc (GLCanvas::do_print): Emit interpreter_event signal
instead of accessing interpreter event_manager object directly here.
* Container.h, Container.cc (Container::interpreter_event):
New signals.
(Container::canvas): Forward Canvas interpreter_event signals to
Container interpreter_event signals.
* ButtonGroup.cc (ButtonGroup::ButtonGroup) Forward Container
interpreter_event signals to the ButtonGroup interpreter_event
signal. Since ButtonGroup is derived from Object, this connection and
the one made by ObjectFactory::createObject has the effect of passing
the interpreter_event signal up to the Backend interpreter_event slot.
* Figure.cc (Figure::Figure): Likewise, for Figure.
* Panel.cc (Panel::Panel): Likewise, for Panel.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Mon, 29 Jul 2019 10:43:20 -0400 |
parents | 5f170ea12fa1 |
children | b8715e8eb39e |
files | libgui/graphics/Backend.cc libgui/graphics/Backend.h libgui/graphics/ButtonGroup.cc libgui/graphics/Canvas.cc libgui/graphics/Canvas.h libgui/graphics/Container.cc libgui/graphics/Container.h libgui/graphics/Figure.cc libgui/graphics/GLCanvas.cc libgui/graphics/Object.h libgui/graphics/ObjectFactory.cc libgui/graphics/ObjectFactory.h libgui/graphics/Panel.cc libgui/graphics/__init_qt__.cc libgui/graphics/module.mk |
diffstat | 15 files changed, 104 insertions(+), 25 deletions(-) [+] |
line wrap: on
line diff
--- a/libgui/graphics/Backend.cc Mon Jul 29 10:43:04 2019 -0400 +++ b/libgui/graphics/Backend.cc Mon Jul 29 10:43:20 2019 -0400 @@ -37,6 +37,9 @@ #include "ObjectProxy.h" #include "QtHandlesUtils.h" +#include "event-manager.h" +#include "interpreter.h" + //#if INTPTR_MAX == INT32_MAX //# define OCTAVE_PTR_TYPE octave_uint32 //# define OCTAVE_INTPTR_TYPE uint32_t @@ -72,13 +75,13 @@ return ""; } - Backend::Backend (void) - : QObject (), base_graphics_toolkit ("qt") + Backend::Backend (octave::interpreter& interp) + : QObject (), base_graphics_toolkit ("qt"), m_interpreter (interp) { ObjectFactory *factory = ObjectFactory::instance (); - connect (this, SIGNAL (createObject (double)), - factory, SLOT (createObject (double)), + connect (this, SIGNAL (createObject (Backend *, double)), + factory, SLOT (createObject (Backend *, double)), Qt::BlockingQueuedConnection); } @@ -113,7 +116,7 @@ OCTAVE_PTR_TYPE tmp (reinterpret_cast<OCTAVE_INTPTR_TYPE> (proxy)); gObj.get_properties ().set (toolkitObjectProperty (go), tmp); - emit createObject (go.get_handle ().value ()); + emit createObject (this, go.get_handle ().value ()); return true; } @@ -315,4 +318,17 @@ return nullptr; } + void Backend::interpreter_event (const octave::fcn_callback& fcn) + { + octave::event_manager& evmgr = m_interpreter.get_event_manager (); + + evmgr.post_event (fcn); + } + + void Backend::interpreter_event (const octave::meth_callback& meth) + { + octave::event_manager& evmgr = m_interpreter.get_event_manager (); + + evmgr.post_event (meth); + } };
--- a/libgui/graphics/Backend.h Mon Jul 29 10:43:04 2019 -0400 +++ b/libgui/graphics/Backend.h Mon Jul 29 10:43:20 2019 -0400 @@ -25,8 +25,14 @@ #include <QObject> +#include "event-manager.h" #include "graphics.h" +namespace octave +{ + class interpreter; +} + namespace QtHandles { @@ -40,7 +46,7 @@ Q_OBJECT public: - Backend (void); + Backend (octave::interpreter& interp); ~Backend (void); @@ -70,7 +76,16 @@ static ObjectProxy * toolkitObjectProxy (const graphics_object& go); signals: - void createObject (double handle); + void createObject (Backend *, double handle); + + public slots: + + void interpreter_event (const octave::fcn_callback& fcn); + void interpreter_event (const octave::meth_callback& meth); + + private: + + octave::interpreter& m_interpreter; }; }
--- a/libgui/graphics/ButtonGroup.cc Mon Jul 29 10:43:04 2019 -0400 +++ b/libgui/graphics/ButtonGroup.cc Mon Jul 29 10:43:20 2019 -0400 @@ -136,6 +136,12 @@ m_container = new Container (frame); m_container->canvas (m_handle); + connect (m_container, SIGNAL (interpeter_event (const fcn_callback&)), + this, SIGNAL (interpeter_event (const fcn_callback&))); + + connect (m_container, SIGNAL (interpeter_event (const meth_callback&)), + this, SIGNAL (interpeter_event (const meth_callback&))); + if (frame->hasMouseTracking ()) { foreach (QWidget *w, frame->findChildren<QWidget*> ())
--- a/libgui/graphics/Canvas.cc Mon Jul 29 10:43:04 2019 -0400 +++ b/libgui/graphics/Canvas.cc Mon Jul 29 10:43:20 2019 -0400 @@ -875,15 +875,9 @@ props = anno_dlg.get_properties (); props.prepend (figObj.get_handle ().as_octave_value ()); - octave::event_manager& evmgr - = octave::__get_event_manager__ ("Canvas::canvasMouseReleaseEvent"); - - evmgr.post_event - ([this, props] (void) + emit interpreter_event + ([this, props] (octave::interpreter& interp) { - octave::interpreter& interp - = octave::__get_interpreter__ ("Canvas::canvasMouseReleaseEvent"); - interp.feval ("annotation", props); redraw ();
--- a/libgui/graphics/Canvas.h Mon Jul 29 10:43:04 2019 -0400 +++ b/libgui/graphics/Canvas.h Mon Jul 29 10:43:20 2019 -0400 @@ -23,8 +23,10 @@ #if ! defined (octave_Canvas_h) #define octave_Canvas_h 1 +#include <QObject> #include <QPoint> +#include "event-manager.h" #include "graphics.h" #include "Figure.h" @@ -39,8 +41,10 @@ namespace QtHandles { - class Canvas + class Canvas : public QObject { + Q_OBJECT + public: enum EventMask { @@ -73,6 +77,11 @@ virtual uint8NDArray getPixels (void) { return do_getPixels (m_handle); }; + signals: + + void interpreter_event (const octave::fcn_callback& fcn); + void interpreter_event (const octave::meth_callback& meth); + protected: virtual void draw (const graphics_handle& handle) = 0; virtual void drawZoomBox (const QPoint& p1, const QPoint& p2) = 0;
--- a/libgui/graphics/Container.cc Mon Jul 29 10:43:04 2019 -0400 +++ b/libgui/graphics/Container.cc Mon Jul 29 10:43:20 2019 -0400 @@ -61,6 +61,12 @@ m_canvas = Canvas::create (fig.get ("renderer").string_value (), this, gh); + connect (m_canvas, SIGNAL (interpeter_event (const fcn_callback&)), + this, SIGNAL (interpeter_event (const fcn_callback&))); + + connect (m_canvas, SIGNAL (interpeter_event (const meth_callback&)), + this, SIGNAL (interpeter_event (const meth_callback&))); + QWidget *canvasWidget = m_canvas->qWidget (); canvasWidget->lower ();
--- a/libgui/graphics/Container.h Mon Jul 29 10:43:04 2019 -0400 +++ b/libgui/graphics/Container.h Mon Jul 29 10:43:20 2019 -0400 @@ -27,6 +27,7 @@ #include "GenericEventNotify.h" +#include "event-manager.h" #include "graphics.h" namespace QtHandles @@ -38,12 +39,19 @@ class Container : public ContainerBase { + Q_OBJECT + public: Container (QWidget *parent); ~Container (void); Canvas * canvas (const graphics_handle& handle, bool create = true); + signals: + + void interpreter_event (const octave::fcn_callback& fcn); + void interpreter_event (const octave::meth_callback& meth); + protected: void childEvent (QChildEvent *event); void resizeEvent (QResizeEvent *event);
--- a/libgui/graphics/Figure.cc Mon Jul 29 10:43:04 2019 -0400 +++ b/libgui/graphics/Figure.cc Mon Jul 29 10:43:20 2019 -0400 @@ -118,6 +118,12 @@ m_container = new Container (win); win->setCentralWidget (m_container); + connect (m_container, SIGNAL (interpeter_event (const fcn_callback&)), + this, SIGNAL (interpeter_event (const fcn_callback&))); + + connect (m_container, SIGNAL (interpeter_event (const meth_callback&)), + this, SIGNAL (interpeter_event (const meth_callback&))); + figure::properties& fp = properties<figure> (); // Adjust figure position
--- a/libgui/graphics/GLCanvas.cc Mon Jul 29 10:43:04 2019 -0400 +++ b/libgui/graphics/GLCanvas.cc Mon Jul 29 10:43:20 2019 -0400 @@ -174,10 +174,7 @@ } catch (octave::execution_exception& e) { - octave::event_manager& evmgr - = octave::__get_event_manager__ ("GLCanvas::do_print"); - - evmgr.post_event + emit interpreter_event ([] (void) { std::rethrow_exception (std::current_exception ());
--- a/libgui/graphics/Object.h Mon Jul 29 10:43:04 2019 -0400 +++ b/libgui/graphics/Object.h Mon Jul 29 10:43:20 2019 -0400 @@ -25,6 +25,7 @@ #include <QObject> +#include "event-manager.h" #include "graphics.h" class QObject; @@ -77,6 +78,11 @@ static Object * fromQObject (QObject *obj); + signals: + + void interpreter_event (const octave::fcn_callback& fcn); + void interpreter_event (const octave::meth_callback& meth); + public slots: void slotUpdate (int pId); void slotFinalize (void);
--- a/libgui/graphics/ObjectFactory.cc Mon Jul 29 10:43:04 2019 -0400 +++ b/libgui/graphics/ObjectFactory.cc Mon Jul 29 10:43:20 2019 -0400 @@ -27,6 +27,7 @@ #include <QApplication> #include <QThread> +#include "event-manager.h" #include "graphics.h" #include "Backend.h" @@ -73,7 +74,7 @@ } void - ObjectFactory::createObject (double handle) + ObjectFactory::createObject (Backend *backend, double handle) { gh_manager::auto_lock lock; @@ -142,7 +143,14 @@ go.type ().c_str ()); if (obj) - proxy->setObject (obj); + { + proxy->setObject (obj); + + connect (obj, + SIGNAL (interpreter_event (const octave::fcn_callback&)), + backend, + SLOT (interpreter_event (const octave::meth_callback&))); + } } else qWarning ("ObjectFactory::createObject: no proxy for handle %g",
--- a/libgui/graphics/ObjectFactory.h Mon Jul 29 10:43:04 2019 -0400 +++ b/libgui/graphics/ObjectFactory.h Mon Jul 29 10:43:20 2019 -0400 @@ -29,7 +29,7 @@ namespace QtHandles { - + class Backend; class Object; class ObjectFactory : public QObject @@ -40,7 +40,7 @@ static ObjectFactory * instance (void); public slots: - void createObject (double handle); + void createObject (Backend *, double handle); private: ObjectFactory (void)
--- a/libgui/graphics/Panel.cc Mon Jul 29 10:43:04 2019 -0400 +++ b/libgui/graphics/Panel.cc Mon Jul 29 10:43:20 2019 -0400 @@ -120,6 +120,12 @@ m_container = new Container (frame); m_container->canvas (m_handle); + connect (m_container, SIGNAL (interpeter_event (const fcn_callback&)), + this, SIGNAL (interpeter_event (const fcn_callback&))); + + connect (m_container, SIGNAL (interpeter_event (const meth_callback&)), + this, SIGNAL (interpeter_event (const meth_callback&))); + if (frame->hasMouseTracking ()) { foreach (QWidget *w, frame->findChildren<QWidget*> ())
--- a/libgui/graphics/__init_qt__.cc Mon Jul 29 10:43:04 2019 -0400 +++ b/libgui/graphics/__init_qt__.cc Mon Jul 29 10:43:20 2019 -0400 @@ -65,7 +65,7 @@ octave::gtk_manager& gtk_mgr = interp.get_gtk_manager (); - graphics_toolkit tk (new Backend ()); + graphics_toolkit tk (new Backend (interp)); gtk_mgr.load_toolkit (tk); octave::interpreter::add_atexit_function ("__shutdown_qt__");
--- a/libgui/graphics/module.mk Mon Jul 29 10:43:04 2019 -0400 +++ b/libgui/graphics/module.mk Mon Jul 29 10:43:20 2019 -0400 @@ -7,6 +7,8 @@ %reldir%/moc-Backend.cc \ %reldir%/moc-ButtonControl.cc \ %reldir%/moc-ButtonGroup.cc \ + %reldir%/moc-Canvas.cc \ + %reldir%/moc-Container.cc \ %reldir%/moc-ContextMenu.cc \ %reldir%/moc-EditControl.cc \ %reldir%/moc-Figure.cc \