Mercurial > octave
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);