diff libgui/src/main-window.cc @ 27620:45bb5bbaf291

don't use singleton pattern for resource manager in GUI Move ownership of the resource_manager object to the base_qobject class. Store reference to resource_manager object as a member variable in most objects that need to access it. Eliminate static member functions in resource_managar class. Provide a get_resource_manager method in the base_qboject class and a global __get_resource_manager__ function for those instances where we can't easily provide local access to the resource_manager object. There are many changes to many files, but most are straightforward.
author John W. Eaton <jwe@octave.org>
date Fri, 01 Nov 2019 18:16:49 -0400
parents deb8877f2c34
children 8b6e928e0705
line wrap: on
line diff
--- a/libgui/src/main-window.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/main-window.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -89,24 +89,27 @@
 namespace octave
 {
   static file_editor_interface *
-  create_default_editor (QWidget *p)
+  create_default_editor (QWidget *p, resource_manager& rmgr)
   {
 #if defined (HAVE_QSCINTILLA)
-    return new file_editor (p);
+    return new file_editor (p, rmgr);
 #else
     octave_unused_parameter (p);
+    octave_unused_parameter (rmgr);
 
     return 0;
 #endif
   }
 
   main_window::main_window (base_qobject& oct_qobj)
-    : QMainWindow (), m_octave_qobj (oct_qobj), m_workspace_model (nullptr),
+    : QMainWindow (), m_octave_qobj (oct_qobj),
+      m_resource_manager (m_octave_qobj.get_resource_manager ()),
+      m_workspace_model (nullptr),
       m_status_bar (nullptr), m_command_window (nullptr),
       m_history_window (nullptr), m_file_browser_window (nullptr),
       m_doc_browser_window (nullptr), m_editor_window (nullptr),
       m_workspace_window (nullptr), m_variable_editor_window (nullptr),
-      m_external_editor (new external_editor_interface (this)),
+      m_external_editor (new external_editor_interface (this, m_resource_manager)),
       m_active_editor (m_external_editor), m_settings_dlg (nullptr),
       m_find_files_dlg (nullptr), m_set_path_dlg (nullptr),
       m_release_notes_window (nullptr), m_community_news_window (nullptr),
@@ -114,29 +117,29 @@
       m_prevent_readline_conflicts (true), m_suppress_dbg_location (true),
       m_closing (false), m_file_encoding (QString ())
   {
-    if (resource_manager::is_first_run ())
+    if (m_resource_manager.is_first_run ())
       {
         // Before wizard.
         m_octave_qobj.config_translators ();
 
-        welcome_wizard welcomeWizard;
+        welcome_wizard welcomeWizard (m_resource_manager);
 
         if (welcomeWizard.exec () == QDialog::Rejected)
           exit (1);
 
         // Install settings file.
-        resource_manager::reload_settings ();
+        m_resource_manager.reload_settings ();
       }
     else
       {
         // Get settings file.
-        resource_manager::reload_settings ();
+        m_resource_manager.reload_settings ();
 
         // After settings.
         m_octave_qobj.config_translators ();
       }
 
-    resource_manager::update_network_settings ();
+    m_resource_manager.update_network_settings ();
 
     // We provide specific terminal capabilities, so ensure that
     // TERM is always set appropriately.
@@ -151,15 +154,16 @@
 
     construct_central_widget ();
 
-    m_workspace_model = new workspace_model ();
+    m_workspace_model = new workspace_model (m_resource_manager);
     m_status_bar = new QStatusBar ();
-    m_command_window = new terminal_dock_widget (this);
-    m_history_window = new history_dock_widget (this);
-    m_file_browser_window = new files_dock_widget (this);
-    m_doc_browser_window = new documentation_dock_widget (this);
-    m_editor_window = create_default_editor (this);
-    m_variable_editor_window = new variable_editor (this);
-    m_workspace_window = new workspace_view (this);
+    m_command_window = new terminal_dock_widget (this, m_resource_manager);
+    m_history_window = new history_dock_widget (this, m_resource_manager);
+    m_file_browser_window = new files_dock_widget (this, m_resource_manager);
+    m_doc_browser_window
+      = new documentation_dock_widget (this, m_resource_manager);
+    m_editor_window = create_default_editor (this, m_resource_manager);
+    m_variable_editor_window = new variable_editor (this, m_resource_manager);
+    m_workspace_window = new workspace_view (this, m_resource_manager);
 
     // Set active editor depending on editor window. If the latter is
     // not initialized (qscintilla not present), use the external editor.
@@ -176,7 +180,7 @@
 
     m_default_style = qapp->style ()->objectName ();
 
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     bool connect_to_web = true;
     QDateTime last_checked;
@@ -259,7 +263,7 @@
   {
     bool closenow = true;
 
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     if (settings->value ("prompt_to_exit", false).toBool ())
       {
@@ -347,7 +351,7 @@
 
   void main_window::request_reload_settings (void)
   {
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     if (settings)
       emit settings_changed (settings);
@@ -362,7 +366,7 @@
   {
     // FIXME: Remove, if for all common KDE versions (bug #54607) is resolved.
     int opts = 0;  // No options by default.
-    if (! resource_manager::get_settings ()->value ("use_native_file_dialogs",
+    if (! m_resource_manager.get_settings ()->value ("use_native_file_dialogs",
                                                     true).toBool ())
       opts = QFileDialog::DontUseNativeDialog;
 
@@ -386,7 +390,7 @@
   {
     // FIXME: Remove, if for all common KDE versions (bug #54607) is resolved.
     int opts = 0;  // No options by default.
-    if (! resource_manager::get_settings ()->value ("use_native_file_dialogs",
+    if (! m_resource_manager.get_settings ()->value ("use_native_file_dialogs",
                                                     true).toBool ())
       opts = QFileDialog::DontUseNativeDialog;
 
@@ -661,7 +665,7 @@
 
   void main_window::load_and_display_community_news (int serial)
   {
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     bool connect_to_web
       = (settings
@@ -674,8 +678,8 @@
 
     QThread *worker_thread = new QThread;
 
-    news_reader *reader = new news_reader (base_url, page, serial,
-                                           connect_to_web);
+    news_reader *reader = new news_reader (m_resource_manager, base_url,
+                                           page, serial, connect_to_web);
 
     reader->moveToThread (worker_thread);
 
@@ -782,7 +786,8 @@
         return;
       }
 
-    m_settings_dlg = new settings_dialog (this, desired_tab);
+    m_settings_dlg
+      = new settings_dialog (this, m_resource_manager, desired_tab);
 
     connect (m_settings_dlg, SIGNAL (apply_new_settings (void)),
              this, SLOT (request_reload_settings (void)));
@@ -895,7 +900,7 @@
     m_suppress_dbg_location
       = ! settings->value ("terminal/print_debug_location", false).toBool ();
 
-    resource_manager::update_network_settings ();
+    m_resource_manager.update_network_settings ();
 
     emit active_dock_changed (nullptr, m_active_dock); // update dock widget styles
 
@@ -970,7 +975,7 @@
   {
     // FIXME: Remove, if for all common KDE versions (bug #54607) is resolved.
     int opts = QFileDialog::ShowDirsOnly;
-    if (! resource_manager::get_settings ()->value ("use_native_file_dialogs",
+    if (! m_resource_manager.get_settings ()->value ("use_native_file_dialogs",
                                                     true).toBool ())
       opts = QFileDialog::DontUseNativeDialog;
 
@@ -1225,7 +1230,7 @@
     // Open file isn't a file_editor_tab or editor function since the file
     // might be opened in an external editor. Hence, functionality is here.
 
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
     bool is_internal = m_editor_window
                        && ! settings->value ("useCustomFileEditor",false).toBool ();
 
@@ -1242,7 +1247,7 @@
     fileDialog->setDirectory (m_current_directory_combo_box->itemText (0));
 
     // FIXME: Remove, if for all common KDE versions (bug #54607) is resolved.
-    if (! resource_manager::get_settings ()->value ("use_native_file_dialogs",
+    if (! m_resource_manager.get_settings ()->value ("use_native_file_dialogs",
                                                     true).toBool ())
       fileDialog->setOption(QFileDialog::DontUseNativeDialog);
 
@@ -1268,7 +1273,7 @@
     // editor window or the main window. The latter is chosen, if a custom
     // editor is used or qscintilla is not available
     QWidget *p = m_editor_window;
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
     if (! p || settings->value ("useCustomFileEditor",false).toBool ())
       p = this;
     QString new_name = QInputDialog::getText (p, tr ("New Function"),
@@ -1427,7 +1432,7 @@
 
   void main_window::read_settings (void)
   {
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     if (! settings)
       {
@@ -1527,7 +1532,7 @@
 
   void main_window::write_settings (void)
   {
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
     if (! settings)
       {
         qDebug ("Error: gui_settings pointer from resource manager is NULL.");
@@ -1622,7 +1627,7 @@
   void main_window::handle_octave_ready (void)
   {
     // actions after the startup files are executed
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     QDir startup_dir = QDir ();    // current octave dir after startup
 
@@ -1675,7 +1680,7 @@
     if (m_set_path_dlg)  // m_set_path_dlg is a guarded pointer!
       return;
 
-    m_set_path_dlg = new set_path_dialog (this);
+    m_set_path_dlg = new set_path_dialog (this, m_resource_manager);
 
     m_set_path_dlg->setModal (false);
     m_set_path_dlg->setAttribute (Qt::WA_DeleteOnClose);
@@ -1712,7 +1717,7 @@
 
     if (! m_find_files_dlg)
       {
-        m_find_files_dlg = new find_files_dialog (this);
+        m_find_files_dlg = new find_files_dialog (this, m_resource_manager);
 
         connect (m_find_files_dlg, SIGNAL (finished (int)),
                  this, SLOT (find_files_finished (int)));
@@ -1837,7 +1842,7 @@
   void main_window::restore_create_file_setting (void)
   {
     // restore the new files creation setting
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
     settings->setValue ("editor/create_new_file",false);
     disconnect (m_editor_window, SIGNAL (file_loaded_signal (void)),
                 this, SLOT (restore_create_file_setting (void)));
@@ -1998,10 +2003,6 @@
     connect (qApp, SIGNAL (aboutToQuit (void)),
              shortcut_manager::instance, SLOT (cleanup_instance (void)));
 
-    // gui_settings are saved upon deletion (i.e., cleanup_instance)
-    connect (qApp, SIGNAL (aboutToQuit (void)),
-             resource_manager::instance, SLOT (cleanup_instance (void)));
-
     connect (qApp, SIGNAL (focusChanged (QWidget*, QWidget*)),
              this, SLOT (focus_changed (QWidget*, QWidget*)));
 
@@ -2292,7 +2293,7 @@
     construct_new_menu (file_menu);
 
     m_open_action
-      = file_menu->addAction (resource_manager::icon ("document-open"),
+      = file_menu->addAction (m_resource_manager.icon ("document-open"),
                               tr ("Open..."));
     m_open_action->setShortcutContext (Qt::ApplicationShortcut);
     m_open_action->setToolTip (tr ("Open an existing file in editor"));
@@ -2333,7 +2334,7 @@
     QMenu *new_menu = p->addMenu (tr ("New"));
 
     m_new_script_action
-      = new_menu->addAction (resource_manager::icon ("document-new"),
+      = new_menu->addAction (m_resource_manager.icon ("document-new"),
                              tr ("New Script"));
     m_new_script_action->setShortcutContext (Qt::ApplicationShortcut);
 
@@ -2372,18 +2373,18 @@
     QKeySequence ctrl_shift = Qt::ControlModifier + Qt::ShiftModifier;
 
     m_undo_action
-      = edit_menu->addAction (resource_manager::icon ("edit-undo"), tr ("Undo"));
+      = edit_menu->addAction (m_resource_manager.icon ("edit-undo"), tr ("Undo"));
     m_undo_action->setShortcutContext (Qt::ApplicationShortcut);
 
     edit_menu->addSeparator ();
 
     m_copy_action
-      = edit_menu->addAction (resource_manager::icon ("edit-copy"),
+      = edit_menu->addAction (m_resource_manager.icon ("edit-copy"),
                               tr ("Copy"), this, SLOT (copyClipboard (void)));
     m_copy_action->setShortcutContext (Qt::ApplicationShortcut);
 
     m_paste_action
-      = edit_menu->addAction (resource_manager::icon ("edit-paste"),
+      = edit_menu->addAction (m_resource_manager.icon ("edit-paste"),
                               tr ("Paste"), this, SLOT (pasteClipboard (void)));
     m_paste_action->setShortcutContext (Qt::ApplicationShortcut);
 
@@ -2398,7 +2399,7 @@
     edit_menu->addSeparator ();
 
     m_find_files_action
-      = edit_menu->addAction (resource_manager::icon ("edit-find"),
+      = edit_menu->addAction (m_resource_manager.icon ("edit-find"),
                               tr ("Find Files..."));
 
     edit_menu->addSeparator ();
@@ -2418,7 +2419,7 @@
       = edit_menu->addAction (tr ("Set Path"));
 
     m_preferences_action
-      = edit_menu->addAction (resource_manager::icon ("preferences-system"),
+      = edit_menu->addAction (m_resource_manager.icon ("preferences-system"),
                               tr ("Preferences..."));
 
     connect (m_find_files_action, SIGNAL (triggered (void)),
@@ -2457,7 +2458,7 @@
                                                     const char *member)
   {
     QAction *action = add_action (m_debug_menu,
-                                  resource_manager::icon (QString (icon)),
+                                  m_resource_manager.icon (QString (icon)),
                                   item, member);
 
     action->setEnabled (false);
@@ -2679,10 +2680,10 @@
     m_main_tool_bar->addWidget (new QLabel (tr ("Current Directory: ")));
     m_main_tool_bar->addWidget (m_current_directory_combo_box);
     QAction *current_dir_up
-      = m_main_tool_bar->addAction (resource_manager::icon ("go-up"),
+      = m_main_tool_bar->addAction (m_resource_manager.icon ("go-up"),
                                     tr ("One directory up"));
     QAction *current_dir_search
-      = m_main_tool_bar->addAction (resource_manager::icon ("folder"),
+      = m_main_tool_bar->addAction (m_resource_manager.icon ("folder"),
                                     tr ("Browse directories"));
 
     connect (m_current_directory_combo_box, SIGNAL (activated (QString)),
@@ -2703,7 +2704,7 @@
 
   void main_window::focus_console_after_command (void)
   {
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
     if (settings->value ("terminal/focus_after_command",false).toBool ())
       focus_command_window ();
   }