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;