changeset 22177:6e9f5408c0db

Save settings in Qt convention, delete all children in destructors (bug #45366) * QUnixTerminalImpl.cpp (QUnixTerminalImpl::~QUnixTerminalImpl): Delete dynamic objects pointed to by m_terminal (TerminalModel), m_kpty (KPty) and m_terminalView (TerminalView). (bug fix) * files-dock-widget.cc: (files_dock_widget::~files_dock_widget): Rename to save_settings. Return if variable 'settings' is not valid object pointer. (files_dock_widget::save_settings): Added. Similar code as destructor was. Call base class octave_dock_widget::save_settings at end of routine. * files-dock-widget.h: (files_dock_widget::~files_dock_widget): Provide empty destructor. (files_dock_widget::save_settings): Added, public slot. * find-files-dialog.cc: (find_files_dialog::~find_files_dialog): Moved most of the code, except the statement deleting the directory iterator, to new routine save_settings. (find_files_dialog::save_settings): Added. Large portion of the code that was in the destructor. Return immediately if variable 'settings' is not valid object pointer. * find-files-dialog.h: (find_files_dialog::save_settings): Added, public slot. * history-dock-widget.cc: (history_dock_widget::~history_dock_widget): Rename to save_settings. Return if variable 'settings' is not valid object pointer. (history_dock_widget::save_settings): Similar code as destructor was. Call base class octave_dock_widget::save_settings at end of routine. * history-dock-widget.h: (history_dock_widget::~history_dock_widget): Provide empty destructor. (history_dock_widget::save_settings): Added, public slot. * main-window.cc (main_window::prepare_to_exit): If find_files_dlg is valid, call the object's save_settings routine. (main_window::construct): Connect appropriate slot of all objects that must save_settings information to the qApp aboutToQuit signal. (Except for find_files_dlg, see above.) At end of this sequence, connect aboutToQuit to the shortcut_manager and resource_manager function that deletes instance. * octave-dock-widget.cc: (octave_dock_widget::~octave_dock_widget): Rename to save_settings. Return if variable 'settings' is not valid object pointer. (octave_dock_widget::save_settings): Similar code as destructor was. * octave-dock-widget.h: (octave_dock_widget::~octave_dock_widget): Provide empty destructor. (octave_dock_widget::save_settings): Added, public slot. * octave-qt-link.cc (octave_qt_link::do_prompt_new_edit_file): Check that 'settings' pointer is valid before using. * resource-manager.cc: Remove "singleton-cleanup.h" header reference. (resource_manager::instance_ok): Do not add cleanup_instance to worker thread's exit cleanup procedure. * resource-manager.h (resource_manager::instance) Change variable to public for connecting. (resource_manager::cleanup_instance) Change to a public slot for connecting to qApp aboutToQuit signal. (resource_manager::resource_manager): Remove an unused variation of the constructor. (resource_manager::operator =) Removed. * settings-dialog.cc: Add QMessageBox to header file list. (settings_dialog::settings_dialog): If QSettings pointer settings is not valid return immediately. (settings_dialog::show_tab): Condition setting the current index on pointer 'settings' being valid. (settings_dialog::write_changed_settings): Remove FIXME comment. If the settings are not valid, display a dialog about missing file and return. * shortcut-manager.cc: Remove "singleton-cleanup.h" header reference. (shortcut_manager::instance_ok): Do not add cleanup_instance to worker thread's exit cleanup procedure. * shortcut-manager.h (shortcut_manager::instance) Change variable to public for connecting. (shortcut_manager::cleanup_instance) Change to a public slot for connecting to qApp aboutToQuit signal. (shortcut_manager::shortcut_manager): Remove an unused variation of the constructor. (shortcut_manager::operator =) Removed. * terminal-dock-widget.cc (terminal_dock_widget::~terminal_dock_widget): Added. Delete QTerminal terminal. (bug fix) * terminal-dock-widget.h (terminal_dock_widget::~terminal_dock_widget): Added. * workspace-view.cc: (workspace_view::workspace_view): Place code hunk using QSettings pointer 'settings' within a conditional block. (workspace_view::~workspace_view): Rename to save_settings. Return if variable 'settings' is not valid object pointer. (workspace_view::save_settings): Almost same code as destructor was. Call base class octave_dock_widget::save_settings at end of routine. * workspace-view.h: (workspace_view::~workspace_view): Provide empty destructor. (workspace_view::save_settings): Added, public slot.
author Daniel J Sebald <daniel.sebald@ieee.org>
date Mon, 25 Jul 2016 17:44:02 -0400
parents 0f22502738fa
children 30a0756e6318
files libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.cpp libgui/src/files-dock-widget.cc libgui/src/files-dock-widget.h libgui/src/find-files-dialog.cc libgui/src/find-files-dialog.h libgui/src/history-dock-widget.cc libgui/src/history-dock-widget.h libgui/src/main-window.cc libgui/src/octave-dock-widget.cc libgui/src/octave-dock-widget.h libgui/src/octave-qt-link.cc libgui/src/resource-manager.cc libgui/src/resource-manager.h libgui/src/settings-dialog.cc libgui/src/shortcut-manager.cc libgui/src/shortcut-manager.h libgui/src/terminal-dock-widget.cc libgui/src/terminal-dock-widget.h libgui/src/workspace-view.cc libgui/src/workspace-view.h
diffstat 20 files changed, 134 insertions(+), 67 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.cpp	Fri Jul 22 18:44:43 2016 +0100
+++ b/libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.cpp	Mon Jul 25 17:44:02 2016 -0400
@@ -114,6 +114,10 @@
 
 QUnixTerminalImpl::~QUnixTerminalImpl()
 {
+    delete m_terminalModel;
+    delete m_kpty;
+    delete m_terminalView;
+
     // Restore stderr so that any errors at exit might appear somewhere.
     dup2 (fdstderr, STDERR_FILENO);
 
--- a/libgui/src/files-dock-widget.cc	Fri Jul 22 18:44:43 2016 +0100
+++ b/libgui/src/files-dock-widget.cc	Mon Jul 25 17:44:02 2016 -0400
@@ -272,9 +272,14 @@
   _octave_dir = "";
 }
 
-files_dock_widget::~files_dock_widget ()
+void
+files_dock_widget::save_settings (void)
 {
   QSettings *settings = resource_manager::get_settings ();
+
+  if (! settings)
+    return;
+
   int sort_column = _file_tree_view->header ()->sortIndicatorSection ();
   Qt::SortOrder sort_order = _file_tree_view->header ()->sortIndicatorOrder ();
   settings->setValue ("filesdockwidget/sort_files_by_column", sort_column);
@@ -291,6 +296,8 @@
 
   settings->sync ();
 
+  octave_dock_widget::save_settings ();
+
   if (_sig_mapper)
     delete _sig_mapper;
 }
--- a/libgui/src/files-dock-widget.h	Fri Jul 22 18:44:43 2016 +0100
+++ b/libgui/src/files-dock-widget.h	Mon Jul 25 17:44:02 2016 -0400
@@ -52,7 +52,7 @@
 
   files_dock_widget (QWidget *parent = 0);
 
-  ~files_dock_widget ();
+  ~files_dock_widget (void) { }
 
 public slots:
 
@@ -80,6 +80,8 @@
   /** Tells the widget to react on changed settings. */
   void notice_settings (const QSettings *settings);
 
+  void save_settings (void);
+
 private slots:
 
   void headercontextmenu_requested (const QPoint& pos);
--- a/libgui/src/find-files-dialog.cc	Fri Jul 22 18:44:43 2016 +0100
+++ b/libgui/src/find-files-dialog.cc	Mon Jul 25 17:44:02 2016 -0400
@@ -198,10 +198,14 @@
   connect (this, SIGNAL (finished (int)), this, SLOT (handle_done (int)));
 }
 
-find_files_dialog::~find_files_dialog ()
+void
+find_files_dialog::save_settings (void)
 {
   QSettings *settings = resource_manager::get_settings ();
 
+  if (! settings)
+    return;
+
   int sort_column = _file_list->horizontalHeader ()->sortIndicatorSection ();
   Qt::SortOrder sort_order
     = _file_list->horizontalHeader ()->sortIndicatorOrder ();
@@ -225,7 +229,10 @@
                       _content_case_check->isChecked ());
 
   settings->sync ();
+}
 
+find_files_dialog::~find_files_dialog ()
+{
   if (_dir_iterator)
     delete _dir_iterator;
 }
--- a/libgui/src/find-files-dialog.h	Fri Jul 22 18:44:43 2016 +0100
+++ b/libgui/src/find-files-dialog.h	Mon Jul 25 17:44:02 2016 -0400
@@ -40,6 +40,7 @@
 public:
   find_files_dialog (QWidget * parent=0);
   virtual ~find_files_dialog ();
+  void save_settings (void);
 
 signals:
   void file_selected (const QString &fileName);
--- a/libgui/src/history-dock-widget.cc	Fri Jul 22 18:44:43 2016 +0100
+++ b/libgui/src/history-dock-widget.cc	Mon Jul 25 17:44:02 2016 -0400
@@ -142,10 +142,14 @@
   _history_list_view->setTextElideMode (Qt::ElideRight);
 }
 
-history_dock_widget::~history_dock_widget ()
+void
+history_dock_widget::save_settings (void)
 {
   QSettings *settings = resource_manager::get_settings ();
 
+  if (! settings)
+    return;
+
   settings->setValue ("history_dock_widget/filter_active",
                       _filter_checkbox->isChecked ());
   settings->setValue ("history_dock_widget/filter_shown", _filter_shown);
@@ -156,6 +160,8 @@
   settings->setValue ("history_dock_widget/mru_list", mru);
 
   settings->sync ();
+
+  octave_dock_widget::save_settings ();
 }
 
 void
--- a/libgui/src/history-dock-widget.h	Fri Jul 22 18:44:43 2016 +0100
+++ b/libgui/src/history-dock-widget.h	Mon Jul 25 17:44:02 2016 -0400
@@ -39,13 +39,14 @@
 public:
 
   history_dock_widget (QWidget *parent = 0);
-  ~history_dock_widget ();
+  ~history_dock_widget (void) { }
 
 public slots:
 
   void set_history (const QStringList& hist);
   void append_history (const QString& hist_entry);
   void clear_history (void);
+  void save_settings (void);
 
 signals:
 
--- a/libgui/src/main-window.cc	Fri Jul 22 18:44:43 2016 +0100
+++ b/libgui/src/main-window.cc	Mon Jul 25 17:44:02 2016 -0400
@@ -822,6 +822,12 @@
 void
 main_window::prepare_to_exit (void)
 {
+  // Find files dialog is constructed dynamically, not at time of main_window
+  // construction.  Connecting it to qApp aboutToQuit signal would have
+  // caused it to run after QSettings deleted.
+  if (find_files_dlg)
+    find_files_dlg->save_settings ();
+
   write_settings ();
 }
 
@@ -1353,8 +1359,24 @@
 
       construct_tool_bar ();
 
+      // Order is important.  Deleting QSettings must be last.
+      connect (qApp, SIGNAL (aboutToQuit ()),
+               command_window, SLOT (save_settings ()));
+      connect (qApp, SIGNAL (aboutToQuit ()),
+               history_window, SLOT (save_settings ()));
+      connect (qApp, SIGNAL (aboutToQuit ()),
+               file_browser_window, SLOT (save_settings ()));
+      connect (qApp, SIGNAL (aboutToQuit ()),
+               doc_browser_window, SLOT (save_settings ()));
+      connect (qApp, SIGNAL (aboutToQuit ()),
+               workspace_window, SLOT (save_settings ()));
       connect (qApp, SIGNAL (aboutToQuit ()),
                this, SLOT (prepare_to_exit ()));
+      connect (qApp, SIGNAL (aboutToQuit ()),
+               shortcut_manager::instance, SLOT (cleanup_instance ()));
+      // QSettings are saved upon deletion (i.e., cleanup_instance)
+      connect (qApp, SIGNAL (aboutToQuit ()),
+               resource_manager::instance, SLOT (cleanup_instance ()));
 
       connect (qApp, SIGNAL (focusChanged (QWidget*, QWidget*)),
                this, SLOT(focus_changed (QWidget*, QWidget*)));
--- a/libgui/src/octave-dock-widget.cc	Fri Jul 22 18:44:43 2016 +0100
+++ b/libgui/src/octave-dock-widget.cc	Mon Jul 25 17:44:02 2016 -0400
@@ -123,12 +123,16 @@
   setFocusPolicy (Qt::StrongFocus);
 }
 
-octave_dock_widget::~octave_dock_widget ()
+void
+octave_dock_widget::save_settings (void)
 {
   // save state of this dock-widget
   QString name = objectName ();
   QSettings *settings = resource_manager::get_settings ();
 
+  if (! settings)
+    return;
+
   settings->beginGroup ("DockWidgets");
 
 #if defined (Q_OS_WIN32)
--- a/libgui/src/octave-dock-widget.h	Fri Jul 22 18:44:43 2016 +0100
+++ b/libgui/src/octave-dock-widget.h	Mon Jul 25 17:44:02 2016 -0400
@@ -37,7 +37,7 @@
 public:
 
   octave_dock_widget (QWidget *p = 0);
-  virtual ~octave_dock_widget ();
+  virtual ~octave_dock_widget (void) { }
 
   virtual void connect_visibility_changed (void);
   void make_window (void);
@@ -84,6 +84,8 @@
 
   QMainWindow *main_win () { return _parent; }
 
+  void save_settings (void);
+
 protected slots:
 
   /** Slot to steer changing visibility from outside. */
--- a/libgui/src/octave-qt-link.cc	Fri Jul 22 18:44:43 2016 +0100
+++ b/libgui/src/octave-qt-link.cc	Mon Jul 25 17:44:02 2016 -0400
@@ -126,7 +126,7 @@
 {
   QSettings *settings = resource_manager::get_settings ();
 
-  if (settings->value ("editor/create_new_file",false).toBool ())
+  if (! settings || settings->value ("editor/create_new_file",false).toBool ())
     return true;
 
   QFileInfo file_info (QString::fromStdString (file));
--- a/libgui/src/resource-manager.cc	Fri Jul 22 18:44:43 2016 +0100
+++ b/libgui/src/resource-manager.cc	Mon Jul 25 17:44:02 2016 -0400
@@ -37,7 +37,6 @@
 #include "file-ops.h"
 #include "help.h"
 #include "oct-env.h"
-#include "singleton-cleanup.h"
 
 #include "defaults.h"
 
@@ -136,13 +135,8 @@
   bool retval = true;
 
   if (! instance)
-    {
       instance = new resource_manager ();
 
-      if (instance)
-        singleton_cleanup_list::add (cleanup_instance);
-    }
-
   if (! instance)
     {
       error ("unable to create resource_manager object!");
--- a/libgui/src/resource-manager.h	Fri Jul 22 18:44:43 2016 +0100
+++ b/libgui/src/resource-manager.h	Mon Jul 25 17:44:02 2016 -0400
@@ -106,17 +106,15 @@
   static QStringList terminal_color_names (void);
   static QList<QColor> terminal_default_colors (void);
 
-private:
+  static resource_manager *instance;
 
-  static resource_manager *instance;
+public slots:
 
   static void cleanup_instance (void) { delete instance; instance = 0; }
 
-  // No copying!
+private:
 
-  resource_manager (const resource_manager&);
-
-  resource_manager& operator = (const resource_manager&);
+  // No copying!
 
   static bool instance_ok (void);
 
--- a/libgui/src/settings-dialog.cc	Fri Jul 22 18:44:43 2016 +0100
+++ b/libgui/src/settings-dialog.cc	Mon Jul 25 17:44:02 2016 -0400
@@ -34,6 +34,7 @@
 #include <QFileDialog>
 #include <QVector>
 #include <QHash>
+#include <QMessageBox>
 #include <QTextCodec>
 
 #if defined (HAVE_QSCINTILLA)
@@ -263,6 +264,15 @@
 
   QSettings *settings = resource_manager::get_settings ();
 
+  if (! settings)
+    {
+      QMessageBox msgBox (QMessageBox::Warning, tr ("Octave Settings"),
+                          tr ("Unable to save settings.  Missing settings "
+                              "file or unknown directory."));
+      msgBox.exec ();
+      return;
+    }
+
   // restore last geometry
   restoreGeometry (settings->value("settings/geometry").toByteArray ());
 
@@ -613,8 +623,9 @@
   if (tab.isEmpty ())
     {
       QSettings *settings = resource_manager::get_settings ();
-      ui->tabWidget->setCurrentIndex (settings->value ("settings/last_tab",
-                                      0).toInt ());
+      if (settings)
+        ui->tabWidget->setCurrentIndex (settings->value ("settings/last_tab",
+                                        0).toInt ());
     }
   else
     {
--- a/libgui/src/shortcut-manager.cc	Fri Jul 22 18:44:43 2016 +0100
+++ b/libgui/src/shortcut-manager.cc	Mon Jul 25 17:44:02 2016 -0400
@@ -40,7 +40,6 @@
 #include "error.h"
 #include "resource-manager.h"
 #include "shortcut-manager.h"
-#include "singleton-cleanup.h"
 
 shortcut_manager *shortcut_manager::instance = 0;
 
@@ -66,13 +65,8 @@
   bool retval = true;
 
   if (! instance)
-    {
       instance = new shortcut_manager ();
 
-      if (instance)
-        singleton_cleanup_list::add (cleanup_instance);
-    }
-
   if (! instance)
     {
       error ("unable to create shortcut_manager object!");
--- a/libgui/src/shortcut-manager.h	Fri Jul 22 18:44:43 2016 +0100
+++ b/libgui/src/shortcut-manager.h	Mon Jul 25 17:44:02 2016 -0400
@@ -95,8 +95,12 @@
       instance->do_import_export (action);
   }
 
+  static shortcut_manager *instance;
+
 public slots:
 
+  static void cleanup_instance (void) { delete instance; instance = 0; }
+
 signals:
 
 protected:
@@ -109,14 +113,8 @@
 
 private:
 
-  static shortcut_manager *instance;
-  static void cleanup_instance (void) { delete instance; instance = 0; }
-
   // No copying!
 
-  shortcut_manager (const shortcut_manager&);
-  shortcut_manager& operator = (const shortcut_manager&);
-
   static bool instance_ok (void);
 
   void init (QString, QString, QKeySequence);
--- a/libgui/src/terminal-dock-widget.cc	Fri Jul 22 18:44:43 2016 +0100
+++ b/libgui/src/terminal-dock-widget.cc	Mon Jul 25 17:44:02 2016 -0400
@@ -69,3 +69,9 @@
 {
   emit interrupt_signal ();
 }
+
+terminal_dock_widget::~terminal_dock_widget (void)
+{
+  delete terminal;
+}
+
--- a/libgui/src/terminal-dock-widget.h	Fri Jul 22 18:44:43 2016 +0100
+++ b/libgui/src/terminal-dock-widget.h	Mon Jul 25 17:44:02 2016 -0400
@@ -37,6 +37,8 @@
 
   terminal_dock_widget (QWidget *parent = 0);
 
+  ~terminal_dock_widget (void);
+
   bool has_focus (void) const;
 
   void focus (void);
--- a/libgui/src/workspace-view.cc	Fri Jul 22 18:44:43 2016 +0100
+++ b/libgui/src/workspace-view.cc	Mon Jul 25 17:44:02 2016 -0400
@@ -92,43 +92,43 @@
 
   QSettings *settings = resource_manager::get_settings ();
 
-  _filter_shown = settings->value ("workspaceview/filter_shown",true).toBool();
-  _filter_widget->setVisible (_filter_shown);
-
-  ws_layout->setMargin (2);
+  if (settings)
+    {
+      _filter_shown = settings->value ("workspaceview/filter_shown",true).toBool();
+      _filter_widget->setVisible (_filter_shown);
 
-  // Set the empty widget to have our layout.
-  widget ()->setLayout (ws_layout);
+      ws_layout->setMargin (2);
 
-  // Initialize collapse/expand state of the workspace subcategories.
+      // Set the empty widget to have our layout.
+      widget ()->setLayout (ws_layout);
+
+      // Initialize collapse/expand state of the workspace subcategories.
 
-  //enable sorting (setting column and order after model was set)
-  view->setSortingEnabled (true);
-  // Initialize column order and width of the workspace
-  view->horizontalHeader ()->restoreState (
-    settings->value ("workspaceview/column_state").toByteArray ());
-  // Set header properties for sorting
-  view->horizontalHeader ()->setClickable (true);
-  view->horizontalHeader ()->setMovable (true);
-  view->horizontalHeader ()->setSortIndicator (
-    settings->value ("workspaceview/sort_by_column",0).toInt (),
-    static_cast<Qt::SortOrder>
-    (settings->value ("workspaceview/sort_order", Qt::AscendingOrder).toUInt ())
-  );
-  view->horizontalHeader ()->setSortIndicatorShown (true);
+      //enable sorting (setting column and order after model was set)
+      view->setSortingEnabled (true);
+      // Initialize column order and width of the workspace
+      view->horizontalHeader ()->restoreState (settings->value ("workspaceview/column_state").toByteArray ());
+      // Set header properties for sorting
+      view->horizontalHeader ()->setClickable (true);
+      view->horizontalHeader ()->setMovable (true);
+      view->horizontalHeader ()->setSortIndicator (settings->value ("workspaceview/sort_by_column",0).toInt (),
+                                                   static_cast<Qt::SortOrder>
+                                                   (settings->value ("workspaceview/sort_order", Qt::AscendingOrder).toUInt ()));
+      view->horizontalHeader ()->setSortIndicatorShown (true);
 
-  view->horizontalHeader ()->setContextMenuPolicy (Qt::CustomContextMenu);
-  connect (view->horizontalHeader (),
-           SIGNAL (customContextMenuRequested (const QPoint &)),
-           this, SLOT (header_contextmenu_requested (const QPoint &)));
+      view->horizontalHeader ()->setContextMenuPolicy (Qt::CustomContextMenu);
+      connect (view->horizontalHeader (),
+               SIGNAL (customContextMenuRequested (const QPoint &)),
+               this, SLOT (header_contextmenu_requested (const QPoint &)));
 
-  // Init state of the filter
-  _filter->addItems (settings->value ("workspaceview/mru_list").toStringList ());
+      // Init state of the filter
+      _filter->addItems (settings->value ("workspaceview/mru_list").toStringList ());
 
-  bool filter_state =
-    settings->value ("workspaceview/filter_active", false).toBool ();
-  _filter_checkbox->setChecked (filter_state);
-  filter_activate (filter_state);
+      bool filter_state =
+        settings->value ("workspaceview/filter_active", false).toBool ();
+      _filter_checkbox->setChecked (filter_state);
+      filter_activate (filter_state);
+    }
 
   // Connect signals and slots.
 
@@ -146,10 +146,14 @@
            p, SLOT (execute_command_in_terminal (const QString&)));
 }
 
-workspace_view::~workspace_view (void)
+void
+workspace_view::save_settings (void)
 {
   QSettings *settings = resource_manager::get_settings ();
 
+  if (! settings)
+    return;
+
   settings->setValue ("workspaceview/column_state",
                       view->horizontalHeader ()->saveState ());
 
@@ -278,6 +282,8 @@
 
   settings->setValue (key, ! shown);
   settings->sync ();
+
+  octave_dock_widget::save_settings ();
 }
 
 void
--- a/libgui/src/workspace-view.h	Fri Jul 22 18:44:43 2016 +0100
+++ b/libgui/src/workspace-view.h	Mon Jul 25 17:44:02 2016 -0400
@@ -43,7 +43,7 @@
 
   workspace_view (QWidget *parent = 0);
 
-  ~workspace_view (void);
+  ~workspace_view (void) { }
 
 public slots:
 
@@ -51,6 +51,8 @@
 
   void setModel (workspace_model *model);
 
+  void save_settings (void);
+
 signals:
 
   /** signal that user had requested a command on a variable */