changeset 27218:a044202208af

more refactoring of GUI classes that manage the interpreter * interpreter-qobject.h, interpreter-qobject.cc (interpreter_qobject::m_app_context): Delete. (interpreter_qobject::m_octave_qobject, interpreter_qobject::m_qt_link): New data members. (interpreter_qobject::interpreter_qobject): Accept reference to base_qobject as argument instead of qt_application object. Make octave_qt_link connections here. (interpreter_qobject::confirm_shutdown, interpreter_qobject::qt_link): New functions. * main-window.h, main-window.cc (main_window::m_octave_qapp, main_window::m_octave_qt_link): Delete data members. (main_window::m_octave_qobj): New data membeer. (main_window::main_window): Don't pass pointer to octave_qt_link as separate argument. In other member functions, get QApplication and octave_qt_link objects from m_octave_qobj as needed. * octave-qobject.h, octave-qobject.cc (base_qobject::m_octave_qt_link): Delete. (base_qobject::base_qobject): Don't make connections to octave_qt_lnk signals here. (base_qobject::confirm_shutdown_octave_internal): Delete. (base_qobject::confirm_shutdown_octave): Call interpreter_qobject::confirm_shutdown instead of confirm_shutdown_octave_internal. (gui_qobject::confirm_shutdown_octave): Likewise.
author John W. Eaton <jwe@octave.org>
date Fri, 28 Jun 2019 14:42:44 -0400
parents de0762d72d52
children b88d66c631c8
files libgui/src/interpreter-qobject.cc libgui/src/interpreter-qobject.h libgui/src/main-window.cc libgui/src/main-window.h libgui/src/octave-qobject.cc libgui/src/octave-qobject.h
diffstat 6 files changed, 135 insertions(+), 101 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/src/interpreter-qobject.cc	Thu Jun 27 13:27:22 2019 -0400
+++ b/libgui/src/interpreter-qobject.cc	Fri Jun 28 14:42:44 2019 -0400
@@ -26,6 +26,8 @@
 #endif
 
 #include "interpreter-qobject.h"
+#include "octave-qobject.h"
+#include "octave-qt-link.h"
 #include "qt-application.h"
 
 #include "input.h"
@@ -33,15 +35,28 @@
 
 namespace octave
 {
-  interpreter_qobject::interpreter_qobject (qt_application& app_context)
-    : QObject (), m_app_context (app_context)
-  { }
+  interpreter_qobject::interpreter_qobject (base_qobject *oct_qobj)
+    : QObject (), m_octave_qobject (oct_qobj),
+      m_qt_link (new octave_qt_link ())
+  {
+    octave_link::connect_link (m_qt_link);
+
+    connect (m_qt_link, SIGNAL (confirm_shutdown_signal (void)),
+             m_octave_qobject, SLOT (confirm_shutdown_octave (void)));
+
+    connect (m_qt_link,
+             SIGNAL (copy_image_to_clipboard_signal (const QString&, bool)),
+             m_octave_qobject,
+             SLOT (copy_image_to_clipboard (const QString&, bool)));
+  }
 
   void interpreter_qobject::execute (void)
   {
-    // The application context owns the interpreter.
+    // The Octave application context owns the interpreter.
 
-    interpreter& interp = m_app_context.create_interpreter ();
+    qt_application& app_context = m_octave_qobject->app_context ();
+
+    interpreter& interp = app_context.create_interpreter ();
 
     int exit_status = 0;
 
@@ -51,7 +66,7 @@
 
         interp.initialize ();
 
-        if (m_app_context.start_gui_p ())
+        if (app_context.start_gui_p ())
           {
             input_system& input_sys = interp.get_input_system ();
 
@@ -79,8 +94,21 @@
     // Whether or not initialization succeeds we need to clean up the
     // interpreter once we are done with it.
 
-    m_app_context.delete_interpreter ();
+    app_context.delete_interpreter ();
 
     emit octave_finished_signal (exit_status);
   }
+
+  void interpreter_qobject::confirm_shutdown (bool closenow)
+  {
+    // Wait for link thread to go to sleep state.
+    m_qt_link->lock ();
+
+    m_qt_link->shutdown_confirmation (closenow);
+
+    m_qt_link->unlock ();
+
+    // Awake the worker thread so that it continues shutting down (or not).
+    m_qt_link->wake_all ();
+  }
 }
--- a/libgui/src/interpreter-qobject.h	Thu Jun 27 13:27:22 2019 -0400
+++ b/libgui/src/interpreter-qobject.h	Fri Jun 28 14:42:44 2019 -0400
@@ -28,7 +28,8 @@
 
 namespace octave
 {
-  class qt_application;
+  class base_qobject;
+  class octave_qt_link;
 
   class interpreter_qobject : public QObject
   {
@@ -36,10 +37,14 @@
 
   public:
 
-    interpreter_qobject (qt_application& app_context);
+    interpreter_qobject (base_qobject *oct_qobj);
 
     ~interpreter_qobject (void) = default;
 
+    octave_qt_link * qt_link (void) { return m_qt_link; }
+
+    void confirm_shutdown (bool closenow);
+
   signals:
 
     void octave_ready_signal (void);
@@ -53,7 +58,9 @@
 
   private:
 
-    qt_application& m_app_context;
+    base_qobject *m_octave_qobject;
+
+    octave_qt_link *m_qt_link;
   };
 }
 
--- a/libgui/src/main-window.cc	Thu Jun 27 13:27:22 2019 -0400
+++ b/libgui/src/main-window.cc	Fri Jun 28 14:42:44 2019 -0400
@@ -96,11 +96,8 @@
 #endif
   }
 
-  main_window::main_window (base_qobject& qobj,
-                            octave_qt_link *lnk)
-    : QMainWindow (),
-      m_octave_qapp (qobj.octave_qapp ()), m_octave_qt_link (lnk),
-      m_workspace_model (nullptr),
+  main_window::main_window (base_qobject& qobj)
+    : QMainWindow (), m_octave_qobj (qobj), m_workspace_model (nullptr),
       m_status_bar (nullptr), m_command_window (nullptr),
       m_history_window (nullptr), m_file_browser_window (nullptr),
       m_doc_browser_window (nullptr), m_editor_window (nullptr),
@@ -166,7 +163,9 @@
     QGuiApplication::setDesktopFileName ("org.octave.Octave.desktop");
 #endif
 
-    m_default_style = m_octave_qapp->style ()->objectName ();
+    QApplication *qapp = m_octave_qobj.qapplication ();
+
+    m_default_style = qapp->style ()->objectName ();
 
     QSettings *settings = resource_manager::get_settings ();
 
@@ -432,8 +431,12 @@
 
   void main_window::file_remove_proxy (const QString& o, const QString& n)
   {
+    interpreter_qobject *interp_qobj = m_octave_qobj.interpreter_qobj ();
+
+    octave_qt_link *qt_link = interp_qobj->qt_link ();
+
     // Wait for worker to suspend
-    m_octave_qt_link->lock ();
+    qt_link->lock ();
 
     // Close the file if opened
 #if defined (HAVE_QSCINTILLA)
@@ -444,8 +447,8 @@
 #endif
 
     // We are done: Unlock and wake the worker thread
-    m_octave_qt_link->unlock ();
-    m_octave_qt_link->wake_all ();
+    qt_link->unlock ();
+    qt_link->wake_all ();
   }
 
   void main_window::open_online_documentation_page (void)
@@ -675,7 +678,11 @@
 
     QStyle *new_style = QStyleFactory::create (preferred_style);
     if (new_style)
-      m_octave_qapp->setStyle (new_style);
+      {
+        QApplication *qapp = m_octave_qobj.qapplication ();
+
+        qapp->setStyle (new_style);
+      }
 
     // the widget's icons (when floating)
     QString icon_set
@@ -1653,13 +1660,17 @@
     connect (m_workspace_model, SIGNAL (model_changed (void)),
              m_workspace_window, SLOT (handle_model_changed (void)));
 
-    connect (m_octave_qt_link,
+    interpreter_qobject *interp_qobj = m_octave_qobj.interpreter_qobj ();
+
+    octave_qt_link *qt_link = interp_qobj->qt_link ();
+
+    connect (qt_link,
              SIGNAL (edit_variable_signal (const QString&,
                                            const octave_value&)),
              this,
              SLOT (edit_variable (const QString&, const octave_value&)));
 
-    connect (m_octave_qt_link, SIGNAL (refresh_variable_editor_signal (void)),
+    connect (qt_link, SIGNAL (refresh_variable_editor_signal (void)),
              this, SLOT (refresh_variable_editor (void)));
 
     connect (m_workspace_model,
@@ -1814,12 +1825,12 @@
              m_editor_window, SLOT (handle_file_renamed (bool)));
 
     // Signals for removing/renaming files/dirs in the temrinal window
-    connect (m_octave_qt_link, SIGNAL (file_renamed_signal (bool)),
+    connect (qt_link, SIGNAL (file_renamed_signal (bool)),
              m_editor_window, SLOT (handle_file_renamed (bool)));
 #endif
 
     // Signals for removing/renaming files/dirs in the temrinal window
-    connect (m_octave_qt_link,
+    connect (qt_link,
              SIGNAL (file_remove_signal (const QString&, const QString&)),
              this, SLOT (file_remove_proxy (const QString&, const QString&)));
 
@@ -1831,88 +1842,92 @@
 
   void main_window::construct_octave_qt_link (void)
   {
-    connect (m_octave_qt_link,
+    interpreter_qobject *interp_qobj = m_octave_qobj.interpreter_qobj ();
+
+    octave_qt_link *qt_link = interp_qobj->qt_link ();
+
+    connect (qt_link,
              SIGNAL (set_workspace_signal (bool, bool, const symbol_info_list&)),
              m_workspace_model,
              SLOT (set_workspace (bool, bool, const symbol_info_list&)));
 
-    connect (m_octave_qt_link, SIGNAL (clear_workspace_signal (void)),
+    connect (qt_link, SIGNAL (clear_workspace_signal (void)),
              m_workspace_model, SLOT (clear_workspace (void)));
 
-    connect (m_octave_qt_link, SIGNAL (change_directory_signal (QString)),
+    connect (qt_link, SIGNAL (change_directory_signal (QString)),
              this, SLOT (change_directory (QString)));
 
-    connect (m_octave_qt_link, SIGNAL (change_directory_signal (QString)),
+    connect (qt_link, SIGNAL (change_directory_signal (QString)),
              m_file_browser_window, SLOT (update_octave_directory (QString)));
 
-    connect (m_octave_qt_link, SIGNAL (change_directory_signal (QString)),
+    connect (qt_link, SIGNAL (change_directory_signal (QString)),
              m_editor_window, SLOT (update_octave_directory (QString)));
 
-    connect (m_octave_qt_link,
+    connect (qt_link,
              SIGNAL (execute_command_in_terminal_signal (QString)),
              this, SLOT (execute_command_in_terminal (QString)));
 
-    connect (m_octave_qt_link,
+    connect (qt_link,
              SIGNAL (set_history_signal (const QStringList&)),
              m_history_window, SLOT (set_history (const QStringList&)));
 
-    connect (m_octave_qt_link,
+    connect (qt_link,
              SIGNAL (append_history_signal (const QString&)),
              m_history_window, SLOT (append_history (const QString&)));
 
-    connect (m_octave_qt_link,
+    connect (qt_link,
              SIGNAL (clear_history_signal (void)),
              m_history_window, SLOT (clear_history (void)));
 
-    connect (m_octave_qt_link, SIGNAL (enter_debugger_signal (void)),
+    connect (qt_link, SIGNAL (enter_debugger_signal (void)),
              this, SLOT (handle_enter_debugger (void)));
 
-    connect (m_octave_qt_link, SIGNAL (exit_debugger_signal (void)),
+    connect (qt_link, SIGNAL (exit_debugger_signal (void)),
              this, SLOT (handle_exit_debugger (void)));
 
-    connect (m_octave_qt_link,
+    connect (qt_link,
              SIGNAL (show_preferences_signal (void)),
              this, SLOT (process_settings_dialog_request (void)));
 
-    connect (m_octave_qt_link,
+    connect (qt_link,
              SIGNAL (gui_preference_signal (const QString&, const QString&,
                                             QString*)),
              this, SLOT (gui_preference (const QString&, const QString&,
                                          QString*)));
 
-    connect (m_octave_qt_link,
+    connect (qt_link,
              SIGNAL (edit_file_signal (const QString&)),
              m_active_editor,
              SLOT (handle_edit_file_request (const QString&)));
 
-    connect (m_octave_qt_link,
+    connect (qt_link,
              SIGNAL (insert_debugger_pointer_signal (const QString&, int)),
              this,
              SLOT (handle_insert_debugger_pointer_request (const QString&,
                                                            int)));
 
-    connect (m_octave_qt_link,
+    connect (qt_link,
              SIGNAL (delete_debugger_pointer_signal (const QString&, int)),
              this,
              SLOT (handle_delete_debugger_pointer_request (const QString&,
                                                            int)));
 
-    connect (m_octave_qt_link,
+    connect (qt_link,
              SIGNAL (update_breakpoint_marker_signal (bool, const QString&,
                                                       int, const QString&)),
              this,
              SLOT (handle_update_breakpoint_marker_request (bool, const QString&,
                                                             int, const QString&)));
 
-    connect (m_octave_qt_link,
+    connect (qt_link,
              SIGNAL (show_doc_signal (const QString &)),
              this, SLOT (handle_show_doc (const QString &)));
 
-    connect (m_octave_qt_link,
+    connect (qt_link,
              SIGNAL (register_doc_signal (const QString &)),
              this, SLOT (handle_register_doc (const QString &)));
 
-    connect (m_octave_qt_link,
+    connect (qt_link,
              SIGNAL (unregister_doc_signal (const QString &)),
              this, SLOT (handle_unregister_doc (const QString &)));
   }
@@ -2428,8 +2443,12 @@
     QSettings *settings = resource_manager::get_settings ();
     *read_value = settings->value (key).toString ();
 
+    interpreter_qobject *interp_qobj = m_octave_qobj.interpreter_qobj ();
+
+    octave_qt_link *qt_link = interp_qobj->qt_link ();
+
     // Wait for worker to suspend
-    m_octave_qt_link->lock ();
+    qt_link->lock ();
 
     // Some preferences need extra handling
     QString adjusted_value = gui_preference_adjust (key, value);
@@ -2442,8 +2461,8 @@
       }
 
     // We are done: Unlock and wake the worker thread
-    m_octave_qt_link->unlock ();
-    m_octave_qt_link->wake_all ();
+    qt_link->unlock ();
+    qt_link->wake_all ();
   }
 
   void main_window::rename_variable_callback (const main_window::name_pair& names)
--- a/libgui/src/main-window.h	Thu Jun 27 13:27:22 2019 -0400
+++ b/libgui/src/main-window.h	Fri Jun 28 14:42:44 2019 -0400
@@ -77,7 +77,7 @@
     typedef std::pair <std::string, std::string> name_pair;
     typedef std::pair <int, int> int_pair;
 
-    main_window (base_qobject& qapp, octave_qt_link *lnk);
+    main_window (base_qobject& qapp);
 
     ~main_window (void);
 
@@ -306,9 +306,7 @@
 
     QList<octave_dock_widget *> dock_widget_list (void);
 
-    QApplication *m_octave_qapp;
-
-    octave_qt_link *m_octave_qt_link;
+    base_qobject& m_octave_qobj;
 
     workspace_model *m_workspace_model;
 
--- a/libgui/src/octave-qobject.cc	Thu Jun 27 13:27:22 2019 -0400
+++ b/libgui/src/octave-qobject.cc	Fri Jun 28 14:42:44 2019 -0400
@@ -87,11 +87,10 @@
     : QObject (), m_app_context (app_context),
       m_argc (m_app_context.sys_argc ()),
       m_argv (m_app_context.sys_argv ()),
-      m_octave_qapp (new octave_qapplication (m_argc, m_argv)),
+      m_qapplication (new octave_qapplication (m_argc, m_argv)),
       m_qt_tr (new QTranslator ()), m_gui_tr (new QTranslator ()),
       m_qsci_tr (new QTranslator ()), m_translators_installed (false),
-      m_octave_qt_link (new octave_qt_link ()),
-      m_interpreter_qobject (new interpreter_qobject (m_app_context)),
+      m_interpreter_qobj (new interpreter_qobject (this)),
       m_main_thread (new QThread ())
   {
     std::string show_gui_msgs =
@@ -127,23 +126,14 @@
     qRegisterMetaType<octave_value_list> ("octave_value_list");
 
     // Force left-to-right alignment (see bug #46204)
-    m_octave_qapp->setLayoutDirection (Qt::LeftToRight);
-
-    octave_link::connect_link (m_octave_qt_link);
-
-    connect (m_octave_qt_link, SIGNAL (confirm_shutdown_signal (void)),
-             this, SLOT (confirm_shutdown_octave (void)));
-
-    connect (m_octave_qt_link,
-             SIGNAL (copy_image_to_clipboard_signal (const QString&, bool)),
-             this, SLOT (copy_image_to_clipboard (const QString&, bool)));
+    m_qapplication->setLayoutDirection (Qt::LeftToRight);
 
     connect_uiwidget_links ();
 
-    connect (m_interpreter_qobject, SIGNAL (octave_finished_signal (int)),
+    connect (m_interpreter_qobj, SIGNAL (octave_finished_signal (int)),
              this, SLOT (handle_octave_finished (int)));
 
-    connect (m_interpreter_qobject, SIGNAL (octave_finished_signal (int)),
+    connect (m_interpreter_qobj, SIGNAL (octave_finished_signal (int)),
              m_main_thread, SLOT (quit (void)));
 
     connect (m_main_thread, SIGNAL (finished (void)),
@@ -152,8 +142,8 @@
 
   base_qobject::~base_qobject (void)
   {
-    delete m_interpreter_qobject;
-    delete m_octave_qapp;
+    delete m_interpreter_qobj;
+    delete m_qapplication;
 
     string_vector::delete_c_str_vec (m_argv);
   }
@@ -165,9 +155,9 @@
 
     resource_manager::config_translators (m_qt_tr, m_qsci_tr, m_gui_tr);
 
-    m_octave_qapp->installTranslator (m_qt_tr);
-    m_octave_qapp->installTranslator (m_gui_tr);
-    m_octave_qapp->installTranslator (m_qsci_tr);
+    m_qapplication->installTranslator (m_qt_tr);
+    m_qapplication->installTranslator (m_gui_tr);
+    m_qapplication->installTranslator (m_qsci_tr);
 
     m_translators_installed = true;
   }
@@ -176,16 +166,16 @@
   {
     // Defer initializing and executing the interpreter until after the main
     // window and QApplication are running to prevent race conditions
-    QTimer::singleShot (0, m_interpreter_qobject, SLOT (execute (void)));
+    QTimer::singleShot (0, m_interpreter_qobj, SLOT (execute (void)));
 
-    m_interpreter_qobject->moveToThread (m_main_thread);
+    m_interpreter_qobj->moveToThread (m_main_thread);
 
     m_main_thread->start ();
   }
 
   int base_qobject::exec (void)
   {
-    return m_octave_qapp->exec ();
+    return m_qapplication->exec ();
   }
 
   void base_qobject::handle_octave_finished (int exit_status)
@@ -195,7 +185,7 @@
 
   void base_qobject::confirm_shutdown_octave (void)
   {
-    confirm_shutdown_octave_internal (true);
+    m_interpreter_qobj->confirm_shutdown (true);
   }
 
   void base_qobject::copy_image_to_clipboard (const QString& file,
@@ -332,19 +322,6 @@
                                              const QString&)));
   }
 
-  void base_qobject::confirm_shutdown_octave_internal (bool closenow)
-  {
-    // Wait for link thread to go to sleep state.
-    m_octave_qt_link->lock ();
-
-    m_octave_qt_link->shutdown_confirmation (closenow);
-
-    m_octave_qt_link->unlock ();
-
-    // Awake the worker thread so that it continues shutting down (or not).
-    m_octave_qt_link->wake_all ();
-  }
-
   cli_qobject::cli_qobject (qt_application& app_context)
     : base_qobject (app_context)
   {
@@ -354,16 +331,15 @@
     // After settings.
     config_translators ();
 
-    m_octave_qapp->setQuitOnLastWindowClosed (false);
+    m_qapplication->setQuitOnLastWindowClosed (false);
 
     start_main_thread ();
   }
 
   gui_qobject::gui_qobject (qt_application& app_context)
-    : base_qobject (app_context),
-      m_main_window (new main_window (*this, m_octave_qt_link))
+    : base_qobject (app_context), m_main_window (new main_window (*this))
   {
-    connect (m_interpreter_qobject, SIGNAL (octave_ready_signal (void)),
+    connect (m_interpreter_qobj, SIGNAL (octave_ready_signal (void)),
              m_main_window, SLOT (handle_octave_ready (void)));
 
     m_app_context.gui_running (true);
@@ -383,6 +359,6 @@
     if (m_main_window)
       closenow = m_main_window->confirm_shutdown_octave ();
 
-    confirm_shutdown_octave_internal (closenow);
+    m_interpreter_qobj->confirm_shutdown (closenow);
   }
 }
--- a/libgui/src/octave-qobject.h	Thu Jun 27 13:27:22 2019 -0400
+++ b/libgui/src/octave-qobject.h	Fri Jun 28 14:42:44 2019 -0400
@@ -40,7 +40,6 @@
 {
   class interpreter_qobject;
   class main_window;
-  class octave_qt_link;
   class qt_application;
 
   //! This class is a simple wrapper around QApplication so that we can
@@ -84,7 +83,18 @@
 
     int exec (void);
 
-    QApplication *octave_qapp (void) { return m_octave_qapp; };
+    // The Octave application context.
+    qt_application& app_context (void) { return m_app_context; }
+
+    // The Qt QApplication.
+    QApplication * qapplication (void) { return m_qapplication; };
+
+    interpreter_qobject * interpreter_qobj (void)
+    {
+      return m_interpreter_qobj;
+    }
+
+    QThread *main_thread (void) { return m_main_thread; }
 
   public slots:
 
@@ -127,7 +137,7 @@
     int m_argc;
     char **m_argv;
 
-    QApplication *m_octave_qapp;
+    QApplication *m_qapplication;
 
     QTranslator *m_qt_tr;
     QTranslator *m_gui_tr;
@@ -135,15 +145,11 @@
 
     bool m_translators_installed;
 
-    octave_qt_link *m_octave_qt_link;
-
-    interpreter_qobject *m_interpreter_qobject;
+    interpreter_qobject *m_interpreter_qobj;
 
     QThread *m_main_thread;
 
     void connect_uiwidget_links (void);
-
-    void confirm_shutdown_octave_internal (bool closenow);
   };
 
   //! This object provides a command-line interface to Octave that may