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 \