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