changeset 27648:2952471e29a7

eliminate global access to resource_manager in qterminal widget * QTerminal.h, QTerminal.cc (QTerminal::create): Accept reference to octave_qobject. Change all uses. Call construct to set up signal/slot connections and context menu after creating object. (QTerminal::construct): New function. Move body of QTerminal constructor here. * libgui/qterminal/module.mk: Use full list of CPPFLAGS for interpreter directories.
author John W. Eaton <jwe@octave.org>
date Wed, 06 Nov 2019 14:29:42 -0500
parents 2a506bc4a7af
children 91d43a00620d
files libgui/qterminal/libqterminal/QTerminal.cc libgui/qterminal/libqterminal/QTerminal.h libgui/qterminal/module.mk libgui/src/main-window.cc libgui/src/octave-qobject.cc libgui/src/terminal-dock-widget.cc
diffstat 6 files changed, 149 insertions(+), 104 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/qterminal/libqterminal/QTerminal.cc	Wed Nov 06 12:42:12 2019 -0500
+++ b/libgui/qterminal/libqterminal/QTerminal.cc	Wed Nov 06 14:29:42 2019 -0500
@@ -21,9 +21,21 @@
 
 */
 
+#include <QKeySequence>
+#include <QWidget>
+#include <QStringList>
+#include <QColor>
+#include <QList>
+#include <QMenu>
+#include <QClipboard>
+#include <QApplication>
+#include <QAction>
+
 #include "gui-preferences-cs.h"
 #include "gui-preferences-sc.h"
 #include "gui-preferences-global.h"
+#include "octave-qobject.h"
+#include "resource-manager.h"
 
 #include "QTerminal.h"
 #if defined (Q_OS_WIN32)
@@ -33,13 +45,23 @@
 #endif
 
 QTerminal *
-QTerminal::create (QWidget *xparent)
+QTerminal::create (octave::base_qobject& oct_qobj, QWidget *xparent)
 {
 #if defined (Q_OS_WIN32)
-  return new QWinTerminalImpl (xparent);
+  QTerminal *terminal = new QWinTerminalImpl (xparent);
 #else
-  return new QUnixTerminalImpl (xparent);
+  QTerminal *terminal = new QUnixTerminalImpl (xparent);
 #endif
+
+  // FIXME: this function should probably be called from or part of the
+  // QTerminal constructor, but I think that would mean some major
+  // surgery because then the constructor for QTerminal and the derived
+  // 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, xparent);
+
+  return terminal;
 }
 
 // slot for disabling the interrupt action when terminal loses focus
@@ -263,3 +285,94 @@
   bool ctrld = settings->value (sc_main_ctrld.key, sc_main_ctrld.def).toBool ();
   _nop_action->setEnabled (! ctrld);
 }
+
+void
+QTerminal::construct (octave::base_qobject& oct_qobj, QWidget *xparent)
+{
+  octave::resource_manager& rmgr = oct_qobj.get_resource_manager ();
+
+  // context menu
+  setContextMenuPolicy (Qt::CustomContextMenu);
+
+  _contextMenu = new QMenu (this);
+
+  _copy_action
+    = _contextMenu->addAction (rmgr.icon ("edit-copy"), tr ("Copy"), this,
+                               SLOT (copyClipboard ()));
+
+  _paste_action
+    = _contextMenu->addAction (rmgr.icon ("edit-paste"), tr ("Paste"), this,
+                               SLOT (pasteClipboard ()));
+
+  _contextMenu->addSeparator ();
+
+  _selectall_action
+    = _contextMenu->addAction (tr ("Select All"), this, SLOT (selectAll ()));
+
+  _run_selection_action
+    = _contextMenu->addAction (tr ("Run Selection"), this,
+                               SLOT (run_selection ()));
+
+  m_edit_selected_action
+    = _contextMenu->addAction (tr ("Edit selection"), this,
+                               SLOT (edit_selected ()));
+  m_help_selected_action
+    = _contextMenu->addAction (tr ("Help on selection"), this,
+                               SLOT (help_on_expression ()));
+  m_doc_selected_action
+    = _contextMenu->addAction (tr ("Documentation on selection"), this,
+                               SLOT (doc_on_expression ()));
+
+  _edit_action = _contextMenu->addAction (tr (""), this, SLOT (edit_file ()));
+
+  _contextMenu->addSeparator ();
+
+  _contextMenu->addAction (tr ("Clear Window"), parent (),
+                           SLOT (handle_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 (show_doc_signal (const QString&)),
+           xparent, SLOT (handle_show_doc (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 (settings_changed (const gui_settings *)),
+           this, SLOT (notice_settings (const gui_settings *)));
+
+  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);
+
+  _interrupt_action->setShortcut
+    (QKeySequence (Qt::ControlModifier + Qt::Key_C));
+
+  connect (_interrupt_action, SIGNAL (triggered ()),
+           this, SLOT (terminal_interrupt ()));
+
+  // dummy (nop) action catching Ctrl-D in terminal, no connection
+  _nop_action = new QAction (this);
+  addAction (_nop_action);
+
+  _nop_action->setShortcut (QKeySequence (Qt::ControlModifier + Qt::Key_D));
+}
--- a/libgui/qterminal/libqterminal/QTerminal.h	Wed Nov 06 12:42:12 2019 -0500
+++ b/libgui/qterminal/libqterminal/QTerminal.h	Wed Nov 06 14:29:42 2019 -0500
@@ -24,20 +24,25 @@
 #ifndef QTERMINAL_H
 #define QTERMINAL_H
 
-#include <QKeySequence>
-#include <QWidget>
-#include <QStringList>
 #include <QColor>
 #include <QList>
-#include <QMenu>
-#include <QClipboard>
-#include <QApplication>
-#include <QAction>
+#include <QPoint>
+#include <QString>
+#include <QWidget>
 
+// For now, we need to use the following #include and using statement
+// for the signal/slot macros.  Could maybe change later when using
+// Qt5-style signal/slot connections.
 #include "gui-settings.h"
-#include "resource-manager.h"
+using octave::gui_settings;
 
-using octave::gui_settings;
+namespace octave
+{
+  class base_qobject;
+}
+
+class QMenu;
+class QAction;
 
 class QTerminal : public QWidget
 {
@@ -45,7 +50,8 @@
 
 public:
 
-  static QTerminal *create (QWidget *xparent = nullptr);
+  static QTerminal *
+  create (octave::base_qobject& oct_qobj, QWidget *xparent = nullptr);
 
   virtual ~QTerminal (void) = default;
 
@@ -133,96 +139,9 @@
 
 protected:
 
-  QTerminal (QWidget *xparent = nullptr) : QWidget (xparent)
-  {
-    octave::resource_manager& rmgr
-      = octave::__get_resource_manager__ ("QTerminal::QTerminal");
-
-    // context menu
-    setContextMenuPolicy (Qt::CustomContextMenu);
-
-    _contextMenu = new QMenu (this);
-
-    _copy_action
-      = _contextMenu->addAction (rmgr.icon ("edit-copy"), tr ("Copy"), this,
-                                 SLOT (copyClipboard ()));
-
-    _paste_action
-      = _contextMenu->addAction (rmgr.icon ("edit-paste"), tr ("Paste"), this,
-                                 SLOT (pasteClipboard ()));
-
-    _contextMenu->addSeparator ();
-
-    _selectall_action
-      = _contextMenu->addAction (tr ("Select All"), this, SLOT (selectAll ()));
-
-    _run_selection_action
-      = _contextMenu->addAction (tr ("Run Selection"), this,
-                                 SLOT (run_selection ()));
-
-    m_edit_selected_action
-      = _contextMenu->addAction (tr ("Edit selection"), this,
-                                 SLOT (edit_selected ()));
-    m_help_selected_action
-      = _contextMenu->addAction (tr ("Help on selection"), this,
-                                 SLOT (help_on_expression ()));
-    m_doc_selected_action
-      = _contextMenu->addAction (tr ("Documentation on selection"), this,
-                                 SLOT (doc_on_expression ()));
-
-    _edit_action = _contextMenu->addAction (tr (""), this, SLOT (edit_file ()));
-
-    _contextMenu->addSeparator ();
-
-    _contextMenu->addAction (tr ("Clear Window"), parent (),
-                             SLOT (handle_clear_command_window_request ()));
+  QTerminal (QWidget *xparent = nullptr) : QWidget (xparent) { }
 
-    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 (show_doc_signal (const QString&)),
-             xparent, SLOT (handle_show_doc (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 (settings_changed (const gui_settings *)),
-             this, SLOT (notice_settings (const gui_settings *)));
-
-    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);
-
-    _interrupt_action->setShortcut
-      (QKeySequence (Qt::ControlModifier + Qt::Key_C));
-
-    connect (_interrupt_action, SIGNAL (triggered ()),
-             this, SLOT (terminal_interrupt ()));
-
-    // dummy (nop) action catching Ctrl-D in terminal, no connection
-    _nop_action = new QAction (this);
-    addAction (_nop_action);
-
-    _nop_action->setShortcut (QKeySequence (Qt::ControlModifier + Qt::Key_D));
-  }
+  void construct (octave::base_qobject& oct_qobj, QWidget *xparent);
 
 private:
 
--- a/libgui/qterminal/module.mk	Wed Nov 06 12:42:12 2019 -0500
+++ b/libgui/qterminal/module.mk	Wed Nov 06 14:29:42 2019 -0500
@@ -43,7 +43,18 @@
   $(AM_CPPFLAGS) \
   @QT_CPPFLAGS@ \
   -I$(srcdir)/libgui/qterminal/libqterminal \
-  -I$(srcdir)/libgui/src
+  -I$(srcdir)/libgui/src \
+  -Iliboctave \
+  -I$(srcdir)/liboctave/array \
+  -Iliboctave/numeric -I$(srcdir)/liboctave/numeric \
+  -Iliboctave/operators -I$(srcdir)/liboctave/operators \
+  -I$(srcdir)/liboctave/system \
+  -I$(srcdir)/liboctave/util \
+  -Ilibinterp -I$(srcdir)/libinterp \
+  -Ilibinterp/parse-tree -I$(srcdir)/libinterp/parse-tree \
+  -Ilibinterp/corefcn -I$(srcdir)/libinterp/corefcn \
+  -I$(srcdir)/libinterp/octave-value \
+  -I$(srcdir)/liboctave/wrappers
 
 %canon_reldir%_libqterminal_la_CFLAGS = ${CPICFLAG} ${XTRA_CFLAGS}
 
--- a/libgui/src/main-window.cc	Wed Nov 06 12:42:12 2019 -0500
+++ b/libgui/src/main-window.cc	Wed Nov 06 14:29:42 2019 -0500
@@ -29,6 +29,7 @@
 
 #include <QAction>
 #include <QApplication>
+#include <QClipboard>
 #include <QDateTime>
 #include <QDebug>
 #include <QDesktopServices>
--- a/libgui/src/octave-qobject.cc	Wed Nov 06 12:42:12 2019 -0500
+++ b/libgui/src/octave-qobject.cc	Wed Nov 06 14:29:42 2019 -0500
@@ -28,6 +28,7 @@
 #include <utility>
 
 #include <QApplication>
+#include <QClipboard>
 #include <QFile>
 #include <QTextCodec>
 #include <QThread>
--- a/libgui/src/terminal-dock-widget.cc	Wed Nov 06 12:42:12 2019 -0500
+++ b/libgui/src/terminal-dock-widget.cc	Wed Nov 06 14:29:42 2019 -0500
@@ -42,7 +42,7 @@
   terminal_dock_widget::terminal_dock_widget (QWidget *p,
                                               base_qobject& oct_qobj)
     : octave_dock_widget ("TerminalDockWidget", p, oct_qobj),
-      m_terminal (QTerminal::create (p))
+      m_terminal (QTerminal::create (oct_qobj, p))
   {
     m_terminal->setObjectName ("OctaveTerminal");
     m_terminal->setFocusPolicy (Qt::StrongFocus);