changeset 29783:5154c91e0d98

eliminate some connections to parent objects in octave_dock_widget classes This is another change aimed at removing connections to parent objects and ultimately, to avoid needing to store references to base_qobject in any widgets. * octave-dock-widget.h, octave-dock-widget.cc (octave_dock_widget::interpreter_event): Delete signals. (octave_dock_widget::octave_dock_widget): Don't connect interpreter_event signals to base_qobject slots. * file-editor-interface.h (file_editor_interface::interpreter_event): Declare signals here. * variable-editor.h (variable_editor::interpreter_event): Likewise. * main-window.cc (main_window::main_window): Make interpreter_event connections for the editor. * octave-qobject.h, octave-qobject.cc (base_qobject::connect_interpreter_events): New function. (base_qobject::variable_editor_widget): Make interpreter_event connections here. * QTerminal.h, QTerminal.cc (QTerminal::create, QTerminal::construct): Eliminate MAIN_WIN argument. Change all callers. (QTerminal::construct): Don't make connections to main window signals or slots here. (QTerminal::request_edit_mfile_signal, QTerminal::request_open_file_signal, QTerminal::set_screen_size_signal, QTerminal::clear_command_window_request): New signals. * QUnixTerminalImpl.h, QUnixTerminalImpl.cpp (QUnixTerminalImpl::initialize, QUnixTerminalImpl::QUnixTerminalImpl): Eliminate MAIN_WIN argument. Change all callers. (QUnixTerminalImpl::initialize): Don't make connections to main window signals or slots here. * QWinTerminalImpl.h, QWinTerminalImpl.cpp (QWinTerminalImpl::QWinTerminalImpl): Eliminate MAIN_WIN argument. Change all callers. Don't make connections to main window slot here. (QWinTerminalImpl::set_screen_size_signal): Delete. Signal moved to QTerminal base class. * terminal-dock-widget.h, terminal-dock-widget.cc (terminal_dock_widget::get_qteriminal, terminal_dock_widget::get_command_widget): New functions. (terminal_dock_widget::terminal_dock_widget): Don't make connections to main window signals or slots here. * main-window.h, main-window.cc (main_window::main_window): Make connections from terminal widgets to main window here.
author John W. Eaton <jwe@octave.org>
date Fri, 18 Jun 2021 15:41:36 -0400
parents 02461b0ccc00
children 6dbb7356d83b
files libgui/qterminal/libqterminal/QTerminal.cc libgui/qterminal/libqterminal/QTerminal.h libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.cpp libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.h libgui/qterminal/libqterminal/win32/QWinTerminalImpl.cpp libgui/qterminal/libqterminal/win32/QWinTerminalImpl.h libgui/src/m-editor/file-editor-interface.h libgui/src/main-window.cc libgui/src/octave-dock-widget.cc libgui/src/octave-dock-widget.h libgui/src/octave-qobject.cc libgui/src/octave-qobject.h libgui/src/terminal-dock-widget.cc libgui/src/terminal-dock-widget.h libgui/src/variable-editor.h
diffstat 15 files changed, 143 insertions(+), 92 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/qterminal/libqterminal/QTerminal.cc	Fri Jun 18 01:20:46 2021 -0400
+++ b/libgui/qterminal/libqterminal/QTerminal.cc	Fri Jun 18 15:41:36 2021 -0400
@@ -49,14 +49,12 @@
 #endif
 
 QTerminal *
-QTerminal::create (octave::base_qobject& oct_qobj, QWidget *p, QWidget *main_win)
+QTerminal::create (octave::base_qobject& oct_qobj, QWidget *p)
 {
-  // p:       real parent
-  // xparent: main window for signal connections
 #if defined (Q_OS_WIN32)
-  QTerminal *terminal = new QWinTerminalImpl (oct_qobj, p, main_win);
+  QTerminal *terminal = new QWinTerminalImpl (oct_qobj, p);
 #else
-  QTerminal *terminal = new QUnixTerminalImpl (oct_qobj, p, main_win);
+  QTerminal *terminal = new QUnixTerminalImpl (oct_qobj, p);
 #endif
 
   // FIXME: this function should probably be called from or part of the
@@ -65,7 +63,7 @@
   // Unix- and Windows-specific versions would need access to the
   // base_qobject object, or the design would have to change significantly.
 
-  terminal->construct (oct_qobj, main_win);
+  terminal->construct (oct_qobj);
 
   return terminal;
 }
@@ -276,7 +274,7 @@
 }
 
 void
-QTerminal::construct (octave::base_qobject& oct_qobj, QWidget *xparent)
+QTerminal::construct (octave::base_qobject& oct_qobj)
 {
   octave::resource_manager& rmgr = oct_qobj.get_resource_manager ();
 
@@ -316,33 +314,12 @@
 
   _contextMenu->addSeparator ();
 
-  _contextMenu->addAction (tr ("Clear Window"), xparent,
-                           SLOT (handle_clear_command_window_request ()));
+  _contextMenu->addAction (tr ("Clear Window"), this,
+                           SIGNAL (clear_command_window_request ()));
 
   connect (this, SIGNAL (customContextMenuRequested (QPoint)),
            this, SLOT (handleCustomContextMenuRequested (QPoint)));
 
-  connect (this, SIGNAL (report_status_message (const QString&)),
-           xparent, SLOT (report_status_message (const QString&)));
-
-  connect (this, SIGNAL (edit_mfile_request (const QString&, int)),
-           xparent, SLOT (edit_mfile (const QString&, int)));
-
-  connect (this, SIGNAL (execute_command_in_terminal_signal (const QString&)),
-           xparent, SLOT (execute_command_in_terminal (const QString&)));
-
-  connect (xparent, SIGNAL (init_terminal_size_signal ()),
-           this, SLOT (init_terminal_size ()));
-
-  connect (xparent, SIGNAL (copyClipboard_signal ()),
-           this, SLOT (copyClipboard ()));
-
-  connect (xparent, SIGNAL (pasteClipboard_signal ()),
-           this, SLOT (pasteClipboard ()));
-
-  connect (xparent, SIGNAL (selectAll_signal ()),
-           this, SLOT (selectAll ()));
-
   // extra interrupt action
   _interrupt_action = new QAction (this);
   addAction (_interrupt_action);
--- a/libgui/qterminal/libqterminal/QTerminal.h	Fri Jun 18 01:20:46 2021 -0400
+++ b/libgui/qterminal/libqterminal/QTerminal.h	Fri Jun 18 15:41:36 2021 -0400
@@ -52,7 +52,7 @@
 public:
 
   static QTerminal *
-  create (octave::base_qobject& oct_qobj, QWidget *xparent, QWidget* main_win);
+  create (octave::base_qobject& oct_qobj, QWidget *xparent);
 
   virtual ~QTerminal (void) = default;
 
@@ -108,6 +108,14 @@
 
   void execute_command_in_terminal_signal (const QString&);
 
+  void request_edit_mfile_signal (const QString&, int);
+
+  void request_open_file_signal (const QString&, const QString&, int);
+
+  void set_screen_size_signal (int, int);
+
+  void clear_command_window_request (void);
+
 public slots:
 
   virtual void copyClipboard (void) = 0;
@@ -141,7 +149,7 @@
   QTerminal (octave::base_qobject& oct_qobj, QWidget *xparent = nullptr)
             : QWidget (xparent), m_octave_qobj (oct_qobj) { }
 
-  void construct (octave::base_qobject& oct_qobj, QWidget *xparent);
+  void construct (octave::base_qobject& oct_qobj);
 
 private:
 
--- a/libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.cpp	Fri Jun 18 01:20:46 2021 -0400
+++ b/libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.cpp	Fri Jun 18 15:41:36 2021 -0400
@@ -25,13 +25,13 @@
 #include <termios.h>
 
 QUnixTerminalImpl::QUnixTerminalImpl(octave::base_qobject& oct_qobj,
-                                     QWidget *p, QWidget *main_win)
+                                     QWidget *p)
     : QTerminal(oct_qobj, p)
 {
-    initialize(main_win);
+    initialize();
 }
 
-void QUnixTerminalImpl::initialize(QWidget* main_win)
+void QUnixTerminalImpl::initialize()
 {
     m_terminalView = new TerminalView(this);
     m_terminalView->setKeyboardCursorShape(TerminalView::UnderlineCursor);
@@ -51,9 +51,9 @@
     m_terminalView->filterChain ()->addFilter (file_filter);
 
     connect (file_filter, SIGNAL (request_edit_mfile_signal (const QString&, int)),
-             main_win, SLOT (edit_mfile (const QString&, int)));
+             this, SIGNAL (request_edit_mfile_signal (const QString&, int)));
     connect (file_filter, SIGNAL (request_open_file_signal (const QString&, const QString&,int)),
-             main_win, SIGNAL (open_file_signal (const QString&, const QString&,int)));
+             this, SIGNAL (request_open_file_signal (const QString&, const QString&,int)));
 
     connect(m_terminalView, SIGNAL(customContextMenuRequested(QPoint)),
             this, SLOT(handleCustomContextMenuRequested(QPoint)));
--- a/libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.h	Fri Jun 18 01:20:46 2021 -0400
+++ b/libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.h	Fri Jun 18 15:41:36 2021 -0400
@@ -36,7 +36,7 @@
     int fdstderr;
 
 public:
-    QUnixTerminalImpl(octave::base_qobject&, QWidget *parent, QWidget *main_win);
+    QUnixTerminalImpl(octave::base_qobject&, QWidget *parent);
     virtual ~QUnixTerminalImpl();
 
     void setTerminalFont(const QFont &font);
@@ -65,7 +65,7 @@
     virtual void resizeEvent(QResizeEvent *);
 
 private:
-    void initialize (QWidget* main_win);
+    void initialize ();
     void connectToPty();
 
     TerminalView *m_terminalView;
--- a/libgui/qterminal/libqterminal/win32/QWinTerminalImpl.cpp	Fri Jun 18 01:20:46 2021 -0400
+++ b/libgui/qterminal/libqterminal/win32/QWinTerminalImpl.cpp	Fri Jun 18 15:41:36 2021 -0400
@@ -1442,15 +1442,12 @@
 //////////////////////////////////////////////////////////////////////////////
 
 QWinTerminalImpl::QWinTerminalImpl (octave::base_qobject& oct_qobj,
-                                    QWidget* parent, QWidget* main_win)
+                                    QWidget* parent)
     : QTerminal (oct_qobj, parent), d (new QConsolePrivate (this)),
       allowTripleClick (false)
 {
     installEventFilter (this);
 
-    connect (this, SIGNAL (set_screen_size_signal (int, int)),
-             main_win, SLOT (set_screen_size (int, int)));
-
     setAcceptDrops (true);
 }
 
--- a/libgui/qterminal/libqterminal/win32/QWinTerminalImpl.h	Fri Jun 18 01:20:46 2021 -0400
+++ b/libgui/qterminal/libqterminal/win32/QWinTerminalImpl.h	Fri Jun 18 15:41:36 2021 -0400
@@ -49,7 +49,7 @@
   friend class QConsoleView;
 
 public:
-  QWinTerminalImpl (octave::base_qobject&, QWidget* parent, QWidget* main_win);
+  QWinTerminalImpl (octave::base_qobject&, QWidget* parent);
   ~QWinTerminalImpl (void);
 
   void setTerminalFont (const QFont& font);
@@ -77,7 +77,6 @@
 signals:
   void terminated (void);
   void titleChanged (const QString&);
-  void set_screen_size_signal (int, int);
 
 protected:
   void viewPaintEvent (QConsoleView*, QPaintEvent*);
--- a/libgui/src/m-editor/file-editor-interface.h	Fri Jun 18 01:20:46 2021 -0400
+++ b/libgui/src/m-editor/file-editor-interface.h	Fri Jun 18 15:41:36 2021 -0400
@@ -78,6 +78,11 @@
 
     virtual void enable_menu_shortcuts (bool enable) = 0;
 
+  signals:
+
+    void interpreter_event (const fcn_callback& fcn);
+    void interpreter_event (const meth_callback& meth);
+
   public slots:
 
     virtual void toplevel_change (bool) = 0;
--- a/libgui/src/main-window.cc	Fri Jun 18 01:20:46 2021 -0400
+++ b/libgui/src/main-window.cc	Fri Jun 18 15:41:36 2021 -0400
@@ -57,6 +57,7 @@
 #if defined (HAVE_QSCINTILLA)
 #  include "file-editor.h"
 #endif
+#include "command-widget.h"
 #include "gui-preferences-cs.h"
 #include "gui-preferences-dw.h"
 #include "gui-preferences-ed.h"
@@ -170,6 +171,70 @@
     connect (this, &main_window::settings_changed,
              m_command_window, &terminal_dock_widget::notice_settings);
 
+    if (m_octave_qobj.experimental_terminal_widget ())
+      {
+        command_widget *cmd_widget = m_command_window->get_command_widget ();
+
+        connect (m_command_window, &terminal_dock_widget::settings_changed,
+                 cmd_widget, &command_widget::notice_settings);
+
+        m_octave_qobj.connect_interpreter_events (cmd_widget);
+      }
+    else
+      {
+        QTerminal *cmd_widget = m_command_window->get_qterminal ();
+
+        connect (m_command_window, &terminal_dock_widget::settings_changed,
+                 cmd_widget, &QTerminal::notice_settings);
+
+        // Connect the interrupt signal (emitted by Ctrl-C)
+        connect (cmd_widget, &QTerminal::interrupt_signal,
+                 &m_octave_qobj, &base_qobject::interpreter_interrupt);
+
+        // Connect the visibility signal to the terminal for
+        // dis-/enabling timers.
+        connect (m_command_window, &terminal_dock_widget::visibilityChanged,
+                 cmd_widget, &QTerminal::handle_visibility_changed);
+
+        // The following connections were previously made in
+        // QTerminal::construct, QWinTerminalImpl::QWinTerminalImpl, and
+        // QUnixTerminalImpl::QUnixTerminalImpl.  Similar actions should
+        // probably be possible for the new command widget.
+
+        connect (cmd_widget, &QTerminal::report_status_message,
+                 this, &main_window::report_status_message);
+
+        connect (cmd_widget, &QTerminal::edit_mfile_request,
+                 this, &main_window::edit_mfile);
+
+        connect (cmd_widget, &QTerminal::execute_command_in_terminal_signal,
+                 this, &main_window::execute_command_in_terminal);
+
+        connect (this, &main_window::init_terminal_size_signal,
+                 cmd_widget, &QTerminal::init_terminal_size);
+
+        connect (this, &main_window::copyClipboard_signal,
+                 cmd_widget, &QTerminal::copyClipboard);
+
+        connect (this, &main_window::pasteClipboard_signal,
+                 cmd_widget, &QTerminal::pasteClipboard);
+
+        connect (this, &main_window::selectAll_signal,
+                 cmd_widget, &QTerminal::selectAll);
+
+        connect (cmd_widget, &QTerminal::request_edit_mfile_signal,
+                 this, &main_window::edit_mfile);
+
+        connect (cmd_widget, &QTerminal::request_open_file_signal,
+                 this, QOverload<const QString&, const QString&, int>::of (&main_window::open_file_signal));
+
+        connect (cmd_widget, &QTerminal::set_screen_size_signal,
+                 this, &main_window::set_screen_size);
+
+        connect (cmd_widget, &QTerminal::clear_command_window_request,
+                 this, &main_window::handle_clear_command_window_request);
+      }
+
     m_doc_browser_window = m_octave_qobj.documentation_widget (this);
 
     make_dock_widget_connections (m_doc_browser_window);
@@ -210,6 +275,11 @@
 
     make_dock_widget_connections (editor);
 
+    // The editor is currently different from other dock widgets.  Until
+    // those differences are resolved, make interpreter_event
+    // connections here instead of in base_qobject::editor_widget.
+    m_octave_qobj.connect_interpreter_events (editor);
+
     connect (editor, &file_editor::request_settings_dialog,
              this, QOverload<const QString&>::of (&main_window::process_settings_dialog_request));
 
--- a/libgui/src/octave-dock-widget.cc	Fri Jun 18 01:20:46 2021 -0400
+++ b/libgui/src/octave-dock-widget.cc	Fri Jun 18 15:41:36 2021 -0400
@@ -229,12 +229,6 @@
     connect (m_close_action, &QAction::triggered,
              this, &octave_dock_widget::change_visibility);
 
-    connect (this, QOverload<const fcn_callback&>::of (&octave_dock_widget::interpreter_event),
-             &oct_qobj, QOverload<const fcn_callback&>::of (&base_qobject::interpreter_event));
-
-    connect (this, QOverload<const meth_callback&>::of (&octave_dock_widget::interpreter_event),
-             &oct_qobj, QOverload<const meth_callback&>::of (&base_qobject::interpreter_event));
-
     m_close_action->setToolTip (tr ("Hide widget"));
 
     setStyleSheet (qdockwidget_css (QString (":/actions/icons/widget-close.png"),
--- a/libgui/src/octave-dock-widget.h	Fri Jun 18 01:20:46 2021 -0400
+++ b/libgui/src/octave-dock-widget.h	Fri Jun 18 15:41:36 2021 -0400
@@ -112,9 +112,6 @@
 
     void queue_make_widget (void);
 
-    void interpreter_event (const fcn_callback& fcn);
-    void interpreter_event (const meth_callback& meth);
-
   protected:
 
     virtual void closeEvent (QCloseEvent *e);
--- a/libgui/src/octave-qobject.cc	Fri Jun 18 01:20:46 2021 -0400
+++ b/libgui/src/octave-qobject.cc	Fri Jun 18 15:41:36 2021 -0400
@@ -633,6 +633,8 @@
         connect (qt_link (),
                  &qt_interpreter_events::refresh_variable_editor_signal,
                  this, &base_qobject::refresh_variable_editor);
+
+        connect_interpreter_events<variable_editor> (m_variable_editor_widget);
       }
 
     return m_variable_editor_widget;
@@ -838,7 +840,7 @@
   void base_qobject::interpreter_event (const fcn_callback& fcn)
   {
     // The following is a direct function call across threads.  It works
-    // because the it is accessing a thread-safe queue of events that
+    // because it is accessing a thread-safe queue of events that
     // are later executed by the Octave interpreter in the other thread.
 
     // See also the comments in interpreter-qobject.h about
@@ -850,7 +852,7 @@
   void base_qobject::interpreter_event (const meth_callback& meth)
   {
     // The following is a direct function call across threads.  It works
-    // because the it is accessing a thread-safe queue of events that
+    // because it is accessing a thread-safe queue of events that
     // are later executed by the Octave interpreter in the other thread.
 
     // See also the comments in interpreter-qobject.h about
--- a/libgui/src/octave-qobject.h	Fri Jun 18 01:20:46 2021 -0400
+++ b/libgui/src/octave-qobject.h	Fri Jun 18 15:41:36 2021 -0400
@@ -181,6 +181,15 @@
 
     virtual bool confirm_shutdown (void);
 
+    template <typename T> void connect_interpreter_events (T *widget)
+    {
+      connect (widget, QOverload<const fcn_callback&>::of (&T::interpreter_event),
+               this, QOverload<const fcn_callback&>::of (&base_qobject::interpreter_event));
+
+      connect (widget, QOverload<const meth_callback&>::of (&T::interpreter_event),
+               this, QOverload<const meth_callback&>::of (&base_qobject::interpreter_event));
+    }
+
   public slots:
 
     void execute_command (const QString& command);
--- a/libgui/src/terminal-dock-widget.cc	Fri Jun 18 01:20:46 2021 -0400
+++ b/libgui/src/terminal-dock-widget.cc	Fri Jun 18 15:41:36 2021 -0400
@@ -53,7 +53,7 @@
     if (m_experimental_terminal_widget)
       m_terminal = new command_widget (oct_qobj, this);
     else
-      m_terminal = QTerminal::create (oct_qobj, this, p);
+      m_terminal = QTerminal::create (oct_qobj, this);
 
     m_terminal->setObjectName ("OctaveTerminal");
     m_terminal->setFocusPolicy (Qt::StrongFocus);
@@ -64,41 +64,6 @@
     setWidget (m_terminal);
     setFocusProxy (m_terminal);
 
-    // FIXME: The new terminal needs to be a more specific type than
-    // QWidget for this to work properly and to be able to use the new
-    // signal/slot connection style.  Probably the new terminal widget
-    // should be derived from QTerminal.
-    connect (this, SIGNAL (settings_changed (const gui_settings *)),
-             m_terminal, SLOT (notice_settings (const gui_settings *)));
-
-    if (m_experimental_terminal_widget)
-      {
-        // Any interpreter_event signal from the terminal widget is
-        // handled the same as for the parent terminal dock widget.
-
-        connect (m_terminal, SIGNAL (interpreter_event (const fcn_callback&)),
-                 this, SIGNAL (interpreter_event (const fcn_callback&)));
-
-        connect (m_terminal, SIGNAL (interpreter_event (const meth_callback&)),
-                 this, SIGNAL (interpreter_event (const meth_callback&)));
-      }
-    else
-      {
-        // FIXME: As with the settings_changed signal above, the
-        // following connections won't work with the new signal/slot
-        // connection style because m_terminal is a pointer to QWidget
-        // instead of QTerminal.
-
-        // Connect the interrupt signal (emitted by Ctrl-C)
-        connect (m_terminal, SIGNAL (interrupt_signal (void)),
-                 &oct_qobj, SLOT (interpreter_interrupt (void)));
-
-        // Connect the visibility signal to the terminal for
-        // dis-/enabling timers.
-        connect (this, SIGNAL (visibilityChanged (bool)),
-                 m_terminal, SLOT (handle_visibility_changed (bool)));
-      }
-
     // Chose a reasonable size at startup in order to avoid truncated
     // startup messages
     resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
@@ -134,6 +99,18 @@
     return w->hasFocus ();
   }
 
+  QTerminal * terminal_dock_widget::get_qterminal (void)
+  {
+    return (m_experimental_terminal_widget
+            ? nullptr : dynamic_cast<QTerminal *> (m_terminal));
+  }
+
+  command_widget * terminal_dock_widget::get_command_widget (void)
+  {
+    return (m_experimental_terminal_widget
+            ? dynamic_cast<command_widget *> (m_terminal) : nullptr);
+  }
+
   void terminal_dock_widget::notice_settings (const gui_settings *settings)
   {
     emit settings_changed (settings);
--- a/libgui/src/terminal-dock-widget.h	Fri Jun 18 01:20:46 2021 -0400
+++ b/libgui/src/terminal-dock-widget.h	Fri Jun 18 15:41:36 2021 -0400
@@ -30,8 +30,11 @@
 
 #include "octave-dock-widget.h"
 
+class QTerminal;
+
 namespace octave
 {
+  class command_widget;
   class base_qobject;
 
   class terminal_dock_widget : public octave_dock_widget
@@ -46,6 +49,16 @@
 
     bool has_focus (void) const;
 
+    // FIXME: The next two functions could be eliminated (or combined)
+    // if we had a common interface for the old and new terminal
+    // widgets.
+
+    // Only valid if using the old terminal widget.
+    QTerminal * get_qterminal (void);
+
+    // Only valid if using the new terminal widget.
+    command_widget * get_command_widget (void);
+
   signals:
 
     void settings_changed (const gui_settings *settings);
--- a/libgui/src/variable-editor.h	Fri Jun 18 01:20:46 2021 -0400
+++ b/libgui/src/variable-editor.h	Fri Jun 18 15:41:36 2021 -0400
@@ -333,6 +333,9 @@
 
     void delete_selected_signal (void);
 
+    void interpreter_event (const fcn_callback& fcn);
+    void interpreter_event (const meth_callback& meth);
+
   public slots:
 
     void callUpdate (const QModelIndex&, const QModelIndex&);