Mercurial > octave
changeset 29787:b4d2fa28d1d4
allow terminal window to be opened from command line
* command-widget.h, command-widget.cc (command_widget::update_prompt):
New slot.
(command_widget::insert_interpreter_output): Now public.
(command_widget::command_widget): Don't connect to signals from parent
object here.
* octave-qobject.h, octave-qobject.cc
(base_qobject::m_terminal_widget): New data member.
(base_qobject::terminal_widget): New function. Make (command_widget,
QTerminal)/base_qobject signal/slot connections here instead of in
main_window constructor.
(base_qobject::show_terminal_window): New slot.
(base_qobject::base_qobject): Connect
qt_interpreter_events::show_terminal_window_signal to
base_qobject::show_terminal_window slot.
(base_qobject::~base_qobject): Close and delete terminal widget.
* main-window.h, main-window.cc (main_window::main_window): Acquire
m_command_window from base_qobject instead of constructing here.
* terminal-dock-widget.cc (terminal_dock_widget::terminal_dock_widget):
Make dock widget/terminal widget signal/slot connections here instead
of in main window constructor. Call make_window if parent object is
nullptr.
* event-manager.h, event-manager.cc
(F__event_manager_show_terminal_window__): New function.
(interpreter_events::show_terminal_window): New virtual function.
(event_manager::show_terminal_window): New function.
* qt-interpreter-events.h, qt-interpreter-events.cc
(qt_interpreter_events::show_terminal_window): New signal
(qt_interpreter_events::show_terminal_window): New function.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Sat, 19 Jun 2021 14:34:07 -0400 |
parents | 63c515ff762f |
children | 74d5cf382b86 |
files | libgui/src/command-widget.cc libgui/src/command-widget.h libgui/src/main-window.cc libgui/src/main-window.h libgui/src/octave-qobject.cc libgui/src/octave-qobject.h libgui/src/qt-interpreter-events.cc libgui/src/qt-interpreter-events.h libgui/src/terminal-dock-widget.cc libinterp/corefcn/event-manager.cc libinterp/corefcn/event-manager.h |
diffstat | 11 files changed, 153 insertions(+), 47 deletions(-) [+] |
line wrap: on
line diff
--- a/libgui/src/command-widget.cc Sat Jun 19 10:33:37 2021 -0400 +++ b/libgui/src/command-widget.cc Sat Jun 19 14:34:07 2021 -0400 @@ -94,12 +94,11 @@ connect (stop_button, &QPushButton::clicked, this, &command_widget::interpreter_stop); + } - connect (p, SIGNAL (update_prompt_signal (const QString&)), - m_prompt, SLOT (setText (const QSTring&))); - - connect (p, SIGNAL (interpreter_output_signal (const QString&)), - this, SLOT (insert_interpreter_output (const QString&))); + void command_widget::update_prompt (const QString& prompt) + { + m_prompt->setText (prompt); } void command_widget::insert_interpreter_output (const QString& msg)
--- a/libgui/src/command-widget.h Sat Jun 19 10:33:37 2021 -0400 +++ b/libgui/src/command-widget.h Sat Jun 19 14:34:07 2021 -0400 @@ -61,14 +61,16 @@ public slots: + void update_prompt (const QString& prompt); + + void insert_interpreter_output (const QString& msg); + void notice_settings (const gui_settings *settings); protected slots: void accept_input_line (void); - void insert_interpreter_output (const QString& msg); - private: bool m_incomplete_parse;
--- a/libgui/src/main-window.cc Sat Jun 19 10:33:37 2021 -0400 +++ b/libgui/src/main-window.cc Sat Jun 19 14:34:07 2021 -0400 @@ -54,6 +54,9 @@ #include <QTimer> #include <QToolBar> +// QTerminal includes +#include "QTerminal.h" + #if defined (HAVE_QSCINTILLA) # include "file-editor.h" #endif @@ -164,47 +167,17 @@ m_status_bar->addPermanentWidget (text); m_status_bar->addPermanentWidget (m_profiler_status_indicator); - m_command_window = new terminal_dock_widget (this, m_octave_qobj); + m_command_window = m_octave_qobj.terminal_widget (this); make_dock_widget_connections (m_command_window); 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); - - connect (cmd_widget, &command_widget::interpreter_pause, - &m_octave_qobj, &base_qobject::interpreter_pause); - - connect (cmd_widget, &command_widget::interpreter_resume, - &m_octave_qobj, &base_qobject::interpreter_resume); - - connect (cmd_widget, &command_widget::interpreter_stop, - &m_octave_qobj, &base_qobject::interpreter_stop); - - m_octave_qobj.connect_interpreter_events (cmd_widget); - } - else + if (! m_octave_qobj.experimental_terminal_widget ()) { 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
--- a/libgui/src/main-window.h Sat Jun 19 10:33:37 2021 -0400 +++ b/libgui/src/main-window.h Sat Jun 19 14:34:07 2021 -0400 @@ -43,9 +43,6 @@ #include "external-editor-interface.h" #include "file-editor-interface.h" -// QTerminal includes -#include "QTerminal.h" - // Own includes #include "dialog.h" #include "documentation-dock-widget.h" @@ -312,7 +309,6 @@ //! Dock widgets. //!@{ QPointer<terminal_dock_widget> m_command_window; - QPointer<history_dock_widget> m_history_window; QPointer<files_dock_widget> m_file_browser_window; QPointer<documentation_dock_widget> m_doc_browser_window;
--- a/libgui/src/octave-qobject.cc Sat Jun 19 10:33:37 2021 -0400 +++ b/libgui/src/octave-qobject.cc Sat Jun 19 14:34:07 2021 -0400 @@ -37,6 +37,10 @@ #include <QTimer> #include <QTranslator> +// QTerminal includes +#include "QTerminal.h" + +#include "command-widget.h" #include "documentation-dock-widget.h" #include "files-dock-widget.h" #include "history-dock-widget.h" @@ -47,6 +51,7 @@ #include "qt-interpreter-events.h" #include "resource-manager.h" #include "shortcut-manager.h" +#include "terminal-dock-widget.h" #include "variable-editor.h" #include "workspace-model.h" #include "workspace-view.h" @@ -240,8 +245,13 @@ this, QOverload<const meth_callback&>::of (&base_qobject::interpreter_event)); if (m_app_context.experimental_terminal_widget ()) - connect (qt_link (), &qt_interpreter_events::start_gui_signal, - this, &base_qobject::start_gui); + { + connect (qt_link (), &qt_interpreter_events::start_gui_signal, + this, &base_qobject::start_gui); + + connect (qt_link (), &qt_interpreter_events::show_terminal_window_signal, + this, &base_qobject::show_terminal_window); + } connect (qt_link (), &qt_interpreter_events::copy_image_to_clipboard_signal, this, &base_qobject::copy_image_to_clipboard); @@ -322,6 +332,9 @@ if (! m_main_window) { + if (m_terminal_widget) + m_terminal_widget->close (); + if (m_documentation_widget) m_documentation_widget->close (); @@ -345,6 +358,7 @@ delete m_main_window; } + delete m_terminal_widget; delete m_documentation_widget; delete m_file_browser_widget; delete m_history_widget; @@ -420,6 +434,47 @@ return m_app_context.gui_running (); } + QPointer<terminal_dock_widget> + base_qobject::terminal_widget (main_window *mw) + { + if (m_terminal_widget && mw) + { + m_terminal_widget->set_main_window (mw); + m_terminal_widget->set_adopted (true); + } + else if (! m_terminal_widget) + { + m_terminal_widget + = QPointer<terminal_dock_widget> (new terminal_dock_widget (mw, *this)); + if (experimental_terminal_widget ()) + { + command_widget *cmd_widget + = m_terminal_widget->get_command_widget (); + + connect (cmd_widget, &command_widget::interpreter_pause, + this, &base_qobject::interpreter_pause); + + connect (cmd_widget, &command_widget::interpreter_resume, + this, &base_qobject::interpreter_resume); + + connect (cmd_widget, &command_widget::interpreter_stop, + this, &base_qobject::interpreter_stop); + + connect_interpreter_events (cmd_widget); + } + else + { + QTerminal *cmd_widget = m_terminal_widget->get_qterminal (); + + // Connect the interrupt signal (emitted by Ctrl-C) + connect (cmd_widget, &QTerminal::interrupt_signal, + this, &base_qobject::interpreter_interrupt); + } + } + + return m_terminal_widget; + } + QPointer<documentation_dock_widget> base_qobject::documentation_widget (main_window *mw) { @@ -690,6 +745,19 @@ } } + void base_qobject::show_terminal_window (void) + { + terminal_dock_widget *widget + = (m_terminal_widget + ? m_terminal_widget : terminal_widget ()); + + if (! widget->isVisible ()) + { + widget->show (); + widget->raise (); + } + } + void base_qobject::show_documentation_window (const QString& file) { documentation_dock_widget *widget
--- a/libgui/src/octave-qobject.h Sat Jun 19 10:33:37 2021 -0400 +++ b/libgui/src/octave-qobject.h Sat Jun 19 14:34:07 2021 -0400 @@ -83,6 +83,7 @@ class file_editor_interface; class files_dock_widget; class history_dock_widget; + class terminal_dock_widget; class variable_editor; class workspace_model; class workspace_view; @@ -153,6 +154,9 @@ return m_workspace_model; } + QPointer<terminal_dock_widget> + terminal_widget (main_window *mw = nullptr); + QPointer<documentation_dock_widget> documentation_widget (main_window *mw = nullptr); @@ -199,6 +203,8 @@ void start_gui (bool gui_app); void close_gui (void); + void show_terminal_window (void); + void show_documentation_window (const QString& file); void show_file_browser_window (void); @@ -268,6 +274,8 @@ // adopted by the desktop (main window) if it is also started from // the command line. + QPointer<terminal_dock_widget> m_terminal_widget; + QPointer<documentation_dock_widget> m_documentation_widget; QPointer<files_dock_widget> m_file_browser_widget;
--- a/libgui/src/qt-interpreter-events.cc Sat Jun 19 10:33:37 2021 -0400 +++ b/libgui/src/qt-interpreter-events.cc Sat Jun 19 14:34:07 2021 -0400 @@ -259,6 +259,11 @@ emit apply_new_settings (); } + void qt_interpreter_events::show_terminal_window (void) + { + emit show_terminal_window_signal (); + } + bool qt_interpreter_events::show_documentation (const std::string& file) { emit show_documentation_signal (QString::fromStdString (file));
--- a/libgui/src/qt-interpreter-events.h Sat Jun 19 10:33:37 2021 -0400 +++ b/libgui/src/qt-interpreter-events.h Sat Jun 19 14:34:07 2021 -0400 @@ -117,6 +117,8 @@ void apply_preferences (void); + void show_terminal_window (void); + bool show_documentation (const std::string& file); void show_file_browser (void); @@ -263,6 +265,8 @@ void gui_preference_signal (const QString& key, const QString& value); + void show_terminal_window_signal (void); + void show_documentation_signal (const QString& file); void register_documentation_signal (const QString& file);
--- a/libgui/src/terminal-dock-widget.cc Sat Jun 19 10:33:37 2021 -0400 +++ b/libgui/src/terminal-dock-widget.cc Sat Jun 19 14:34:07 2021 -0400 @@ -51,9 +51,34 @@ // FIXME: we could do this in a better way, but improving it doesn't // matter much if we will eventually be removing the old terminal. if (m_experimental_terminal_widget) - m_terminal = new command_widget (oct_qobj, this); + { + command_widget *widget = new command_widget (oct_qobj, this); + + connect (this, &terminal_dock_widget::settings_changed, + widget, &command_widget::notice_settings); + + connect (this, &terminal_dock_widget::update_prompt_signal, + widget, &command_widget::update_prompt); + + connect (this, &terminal_dock_widget::interpreter_output_signal, + widget, &command_widget::insert_interpreter_output); + + m_terminal = widget; + } else - m_terminal = QTerminal::create (oct_qobj, this); + { + QTerminal *widget = QTerminal::create (oct_qobj, this); + + connect (this, &terminal_dock_widget::settings_changed, + widget, &QTerminal::notice_settings); + + // Connect the visibility signal to the terminal for + // dis-/enabling timers. + connect (this, &terminal_dock_widget::visibilityChanged, + widget, &QTerminal::handle_visibility_changed); + + m_terminal = widget; + } m_terminal->setObjectName ("OctaveTerminal"); m_terminal->setFocusPolicy (Qt::StrongFocus); @@ -91,6 +116,9 @@ win_y = max_y; setGeometry (0, 0, win_x, win_y); + + if (! p) + make_window (); } bool terminal_dock_widget::has_focus (void) const
--- a/libinterp/corefcn/event-manager.cc Sat Jun 19 10:33:37 2021 -0400 +++ b/libinterp/corefcn/event-manager.cc Sat Jun 19 14:34:07 2021 -0400 @@ -619,6 +619,21 @@ %!error <NAME must be a string> openvar (1:10) */ +DEFMETHOD (__event_manager_show_terminal_window__, interp, , , + doc: /* -*- texinfo -*- +@deftypefn {} {} __event_manager_show_terminal_window__ () +Undocumented internal function. +@end deftypefn */) +{ + std::string file; + + octave::event_manager& evmgr = interp.get_event_manager (); + + evmgr.show_terminal_window (); + + return ovl (); +} + DEFMETHOD (__event_manager_show_documentation__, interp, args, , doc: /* -*- texinfo -*- @deftypefn {} {} __event_manager_show_documentation__ (@var{filename})
--- a/libinterp/corefcn/event-manager.h Sat Jun 19 10:33:37 2021 -0400 +++ b/libinterp/corefcn/event-manager.h Sat Jun 19 14:34:07 2021 -0400 @@ -148,6 +148,8 @@ virtual void apply_preferences (void) { } + virtual void show_terminal_window (void) { } + virtual bool show_documentation (const std::string& /*file*/) { return false; @@ -454,6 +456,12 @@ return false; } + void show_terminal_window (void) + { + if (enabled ()) + instance->show_terminal_window (); + } + bool show_documentation (const std::string& file) { return enabled () ? instance->show_documentation (file) : false;