changeset 31638:474e184321d3

move some functions from resource_manager to gui_settings * gui-settings.h, gui-settings.cc (gui_settings::get_default_font_family, gui_settings::get_default_font, gui_settings::reload, gui_settings::check): Rename and move here from resource-manager.h and resource-manager.cc. Change all uses. * resource-manager.h, resource-manager.cc (resource_manager::is_first_run): Delete. * gui-preferences-global.h (global_skip_welcome_wizard): New gui_pref object. * main-window.cc (main_window::main_window): Check this setting to determine whether to display welcome wizard.
author John W. Eaton <jwe@octave.org>
date Sun, 04 Dec 2022 22:56:23 -0500
parents 34c3cd39c4b9
children ca7d58406f82
files libgui/src/gui-preferences-global.h libgui/src/gui-settings.cc libgui/src/gui-settings.h libgui/src/main-window.cc libgui/src/octave-qobject.cc libgui/src/resource-manager.cc libgui/src/resource-manager.h libgui/src/welcome-wizard.cc
diffstat 8 files changed, 215 insertions(+), 224 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/src/gui-preferences-global.h	Sun Dec 04 15:29:51 2022 -0500
+++ b/libgui/src/gui-preferences-global.h	Sun Dec 04 22:56:23 2022 -0500
@@ -34,6 +34,9 @@
 
 // Global preferences
 
+const gui_pref
+global_skip_welcome_wizard ("global_skip_welcome_wizard", false);
+
 // Get the default monospaced font
 #if defined (Q_OS_WIN)
 const QString global_font_family = "Courier";
--- a/libgui/src/gui-settings.cc	Sun Dec 04 15:29:51 2022 -0500
+++ b/libgui/src/gui-settings.cc	Sun Dec 04 22:56:23 2022 -0500
@@ -27,15 +27,37 @@
 #  include "config.h"
 #endif
 
+#include <cmath>
+
 #include <QApplication>
 #include <QFile>
+#include <QFileInfo>
+#include <QFontComboBox>
+#include <QFontDatabase>
+#include <QMessageBox>
 #include <QSettings>
+#include <QString>
+#include <QStringList>
 
+#include "gui-preferences-cs.h"
 #include "gui-preferences-global.h"
 #include "gui-settings.h"
 
+#include "oct-env.h"
+
 namespace octave
 {
+  QString gui_settings::file_name (void) const
+  {
+    return fileName ();
+  }
+
+  QString gui_settings::directory_name (void) const
+  {
+    QFileInfo sfile (fileName ());
+
+    return sfile.absolutePath ();
+  }
 
   QColor gui_settings::get_color_value (const QVariant& def, int mode) const
   {
@@ -175,4 +197,150 @@
       //QIcon::setThemeName (current_theme);
       return QIcon ();
   }
+
+  QString gui_settings::get_default_font_family (void)
+  {
+    QString default_family;
+
+    // Get all available fixed width fonts via a font combobox
+    QFontComboBox font_combo_box;
+    font_combo_box.setFontFilters (QFontComboBox::MonospacedFonts);
+    QStringList fonts;
+
+    for (int index = 0; index < font_combo_box.count(); index++)
+      fonts << font_combo_box.itemText(index);
+
+#if defined (Q_OS_MAC)
+    // Use hard coded default on macOS, since selection of fixed width
+    // default font is unreliable (see bug #59128).
+    // Test for macOS default fixed width font
+    if (fonts.contains (global_mono_font.def.toString ()))
+      default_family = global_mono_font.def.toString ();
+#endif
+
+    // If default font is still empty (on all other platforms or
+    // if macOS default font is not available): use QFontDatabase
+    if (default_family.isEmpty ())
+      {
+        // Get the system's default monospaced font
+        QFont fixed_font = QFontDatabase::systemFont (QFontDatabase::FixedFont);
+        default_family = fixed_font.defaultFamily ();
+
+        // Since this might be unreliable, test all available fixed width fonts
+        if (! fonts.contains (default_family))
+          {
+            // Font returned by QFontDatabase is not in fixed fonts list.
+            // Fallback: take first from this list
+            default_family = fonts[0];
+          }
+      }
+
+    // Test env variable which has preference
+    std::string env_default_family = sys::env::getenv ("OCTAVE_DEFAULT_FONT");
+    if (! env_default_family.empty ())
+      default_family = QString::fromStdString (env_default_family);
+
+    return default_family;
+  }
+
+  QStringList gui_settings::get_default_font (void)
+  {
+    QString default_family = get_default_font_family ();
+
+    // determine the fefault font size of the system
+    // FIXME: QApplication::font () does not return the monospace font,
+    //        but the size should be probably near to the monospace font
+    QFont font = QApplication::font ();
+
+    int font_size = font.pointSize ();
+    if (font_size == -1)
+      font_size = static_cast <int> (std::floor(font.pointSizeF ()));
+
+    // check for valid font size, otherwise take default 10
+    QString default_font_size = "10";
+    if (font_size > 0)
+      default_font_size = QString::number (font_size);
+
+    std::string env_default_font_size
+      = sys::env::getenv ("OCTAVE_DEFAULT_FONT_SIZE");
+
+    if (! env_default_font_size.empty ())
+      default_font_size = QString::fromStdString (env_default_font_size);
+
+    QStringList result;
+    result << default_family;
+    result << default_font_size;
+    return result;
+  }
+
+  void gui_settings::reload (void)
+  {
+    // Declare some empty options, which may be set at first startup for
+    // writing them into the newly created settings file
+    QString custom_editor;
+    QStringList def_font;
+
+    // Check whether the settings file does not yet exist
+    if (! QFile::exists (file_name ()))
+      {
+        // Get the default font (for terminal)
+        def_font = get_default_font ();
+
+        // Get a custom editor defined as env variable
+        std::string env_default_editor
+          = sys::env::getenv ("OCTAVE_DEFAULT_EDITOR");
+
+        if (! env_default_editor.empty ())
+          custom_editor = QString::fromStdString (env_default_editor);
+      }
+
+    check ();
+
+    // Write some settings that were dynamically determined at first startup
+
+    // Custom editor
+    if (! custom_editor.isEmpty ())
+      setValue (global_custom_editor.key, custom_editor);
+
+    // Default monospace font for the terminal
+    if (def_font.count () > 1)
+      {
+        setValue (cs_font.key, def_font[0]);
+        setValue (cs_font_size.key, def_font[1].toInt ());
+      }
+
+    // Write the default monospace font into the settings for later use by
+    // console and editor as fallbacks of their font preferences.
+    setValue (global_mono_font.key, get_default_font_family ());
+  }
+
+  void gui_settings::check (void)
+  {
+    if (status () == QSettings::NoError)
+      {
+        // Test usability (force file to be really created)
+        setValue ("dummy", 0);
+        sync ();
+      }
+
+    if (! (QFile::exists (file_name ())
+           && isWritable ()
+           && status () == QSettings::NoError))
+      {
+        QString msg
+          = QString (QT_TR_NOOP ("Error %1 creating the settings file\n%2\n"
+                                 "Make sure you have read and write permissions to\n%3\n\n"
+                                 "Octave GUI must be closed now."));
+
+        QMessageBox::critical (nullptr,
+                               QString (QT_TR_NOOP ("Octave Critical Error")),
+                               msg.arg (status ())
+                                  .arg (file_name ())
+                                  .arg (directory_name ()));
+
+        exit (1);
+      }
+    else
+      remove ("dummy");  // Remove test entry
+  }
 }
--- a/libgui/src/gui-settings.h	Sun Dec 04 15:29:51 2022 -0500
+++ b/libgui/src/gui-settings.h	Sun Dec 04 22:56:23 2022 -0500
@@ -40,6 +40,9 @@
 
   public:
 
+    // Location, name, and format of settings file determined by
+    // settings in qt_application class construtor.
+
     gui_settings (QObject *parent = nullptr)
       : QSettings (parent)
     { }
@@ -64,6 +67,10 @@
 
     ~gui_settings (void) = default;
 
+    QString file_name (void) const;
+
+    QString directory_name (void) const;
+
     using QSettings::value;
 
     QVariant value (const gui_pref& pref) const
@@ -122,18 +129,30 @@
 
     QKeySequence sc_def_value (const sc_pref& pref) const;
 
-    // Both config_icon_theme and icon could be global functions instead
-    // of member functions.  But at least for the icon function,
-    // defining it as a member function means that we can create a
-    // single gui_settings object and access multiple icon objects
-    // rather than having to create a separate settings object each time
-    // that an icon is needed.  OTOH, creating the base QSettings object
-    // is supposed to be fast, so that may not matter.  Hmm.
+    // config_icon_theme, icon, get_default_font_family,
+    // get_default_font, and possibly reload and check could be global
+    // functions instead of member functions.  But at least for the icon
+    // function, defining it as a member function means that we can
+    // create a single gui_settings object and access multiple icon
+    // objects rather than having to create a separate settings object
+    // each time that an icon is needed.  OTOH, creating the base
+    // QSettings object is supposed to be fast, so that may not matter.
+    // Hmm.
 
     void config_icon_theme (void);
 
     QIcon icon (const QString& icon_name, bool octave_only = false,
                 const QString& icon_alt_name = QString ());
+
+    QString get_default_font_family (void);
+
+    QStringList get_default_font (void);
+
+    void reload (void);
+
+  private:
+
+    void check (void);
   };
 
 }
--- a/libgui/src/main-window.cc	Sun Dec 04 15:29:51 2022 -0500
+++ b/libgui/src/main-window.cc	Sun Dec 04 22:56:23 2022 -0500
@@ -111,7 +111,9 @@
   {
     resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
 
-    if (rmgr.is_first_run ())
+    gui_settings settings;
+
+    if (! settings.value (global_skip_welcome_wizard).toBool ())
       {
         // Before wizard.
         m_octave_qobj.config_translators ();
@@ -121,13 +123,15 @@
         if (welcomeWizard.exec () == QDialog::Rejected)
           exit (1);
 
+        settings.setValue (global_skip_welcome_wizard.key, QVariant (true));
+
         // Install settings file.
-        rmgr.reload_settings ();
+        settings.reload ();
       }
     else
       {
         // Get settings file.
-        rmgr.reload_settings ();
+        settings.reload ();
 
         // After settings.
         m_octave_qobj.config_translators ();
@@ -135,8 +139,6 @@
 
     setObjectName (gui_obj_name_main_window);
 
-    gui_settings settings;
-
     settings.config_icon_theme ();
 
     rmgr.update_network_settings ();
--- a/libgui/src/octave-qobject.cc	Sun Dec 04 15:29:51 2022 -0500
+++ b/libgui/src/octave-qobject.cc	Sun Dec 04 22:56:23 2022 -0500
@@ -307,13 +307,13 @@
         else
           {
             // Get settings file.
-            m_resource_manager.reload_settings ();
+            gui_settings settings;
+
+            settings.reload ();
 
             // After settings.
             config_translators ();
 
-            gui_settings settings;
-
             settings.config_icon_theme ();
 
             // Initilize the shortcut-manager
--- a/libgui/src/resource-manager.cc	Sun Dec 04 15:29:51 2022 -0500
+++ b/libgui/src/resource-manager.cc	Sun Dec 04 22:56:23 2022 -0500
@@ -35,10 +35,7 @@
 
 #include <QDir>
 #include <QFile>
-#include <QFontComboBox>
-#include <QFontDatabase>
 #include <QLibraryInfo>
-#include <QMessageBox>
 #include <QNetworkProxy>
 #include <QStandardPaths>
 
@@ -59,26 +56,12 @@
 #include "oct-env.h"
 
 #include "defaults.h"
-#include "error.h"
-#include "help.h"
 
 namespace octave
 {
   resource_manager::resource_manager (void)
-    : m_settings_directory (), m_settings_file (), m_temporary_files ()
-  {
-    // Location, name, and format of settings file determined by
-    // settings in qt_application class construtor.
-
-    check_settings ();
-
-    gui_settings settings;
-
-    m_settings_file = settings.fileName ();
-
-    QFileInfo sfile (m_settings_file);
-    m_settings_directory = sfile.absolutePath ();
-  }
+    : m_temporary_files ()
+  { }
 
   resource_manager::~resource_manager (void)
   {
@@ -142,134 +125,6 @@
 
   }
 
-  QString resource_manager::get_settings_directory (void)
-  {
-    return m_settings_directory;
-  }
-
-  QString resource_manager::get_settings_file (void)
-  {
-    return m_settings_file;
-  }
-
-  QString resource_manager::get_default_font_family (void)
-  {
-    QString default_family;
-
-    // Get all available fixed width fonts via a font combobox
-    QFontComboBox font_combo_box;
-    font_combo_box.setFontFilters (QFontComboBox::MonospacedFonts);
-    QStringList fonts;
-
-    for (int index = 0; index < font_combo_box.count(); index++)
-      fonts << font_combo_box.itemText(index);
-
-#if defined (Q_OS_MAC)
-    // Use hard coded default on macOS, since selection of fixed width
-    // default font is unreliable (see bug #59128).
-    // Test for macOS default fixed width font
-    if (fonts.contains (global_mono_font.def.toString ()))
-      default_family = global_mono_font.def.toString ();
-#endif
-
-    // If default font is still empty (on all other platforms or
-    // if macOS default font is not available): use QFontDatabase
-    if (default_family.isEmpty ())
-      {
-        // Get the system's default monospaced font
-        QFont fixed_font = QFontDatabase::systemFont (QFontDatabase::FixedFont);
-        default_family = fixed_font.defaultFamily ();
-
-        // Since this might be unreliable, test all available fixed width fonts
-        if (! fonts.contains (default_family))
-          {
-            // Font returned by QFontDatabase is not in fixed fonts list.
-            // Fallback: take first from this list
-            default_family = fonts[0];
-          }
-      }
-
-    // Test env variable which has preference
-    std::string env_default_family = sys::env::getenv ("OCTAVE_DEFAULT_FONT");
-    if (! env_default_family.empty ())
-      default_family = QString::fromStdString (env_default_family);
-
-    return default_family;
-  }
-
-  QStringList resource_manager::get_default_font (void)
-  {
-    QString default_family = get_default_font_family ();
-
-    // determine the fefault font size of the system
-    // FIXME: QApplication::font () does not return the monospace font,
-    //        but the size should be probably near to the monospace font
-    QFont font = QApplication::font ();
-
-    int font_size = font.pointSize ();
-    if (font_size == -1)
-      font_size = static_cast <int> (std::floor(font.pointSizeF ()));
-
-    // check for valid font size, otherwise take default 10
-    QString default_font_size = "10";
-    if (font_size > 0)
-      default_font_size = QString::number (font_size);
-
-    std::string env_default_font_size
-      = sys::env::getenv ("OCTAVE_DEFAULT_FONT_SIZE");
-
-    if (! env_default_font_size.empty ())
-      default_font_size = QString::fromStdString (env_default_font_size);
-
-    QStringList result;
-    result << default_family;
-    result << default_font_size;
-    return result;
-  }
-
-  void resource_manager::reload_settings (void)
-  {
-    // Declare some empty options, which may be set at first startup for
-    // writing them into the newly created settings file
-    QString custom_editor;
-    QStringList def_font;
-
-    // Check whether the settings file does not yet exist
-    if (! QFile::exists (m_settings_file))
-      {
-        // Get the default font (for terminal)
-        def_font = get_default_font ();
-
-        // Get a custom editor defined as env variable
-        std::string env_default_editor
-          = sys::env::getenv ("OCTAVE_DEFAULT_EDITOR");
-
-        if (! env_default_editor.empty ())
-          custom_editor = QString::fromStdString (env_default_editor);
-      }
-
-    check_settings ();
-
-    gui_settings settings;
-
-    // Write some settings that were dynamically determined at first startup
-
-    // Custom editor
-    if (! custom_editor.isEmpty ())
-      settings.setValue (global_custom_editor.key, custom_editor);
-
-    // Default monospace font for the terminal
-    if (def_font.count () > 1)
-      {
-        settings.setValue (cs_font.key, def_font[0]);
-        settings.setValue (cs_font_size.key, def_font[1].toInt ());
-      }
-
-    // Write the default monospace font into the settings for later use by
-    // console and editor as fallbacks of their font preferences.
-    settings.setValue (global_mono_font.key, get_default_font_family ());
-  }
-
 #if defined (HAVE_QSCINTILLA)
   int resource_manager::get_valid_lexer_styles (QsciLexer *lexer, int *styles)
   {
@@ -330,7 +185,7 @@
         //               and convert the color by inverting the lightness
 
         // Get the default font
-        QStringList def_font = get_default_font ();
+        QStringList def_font = settings.get_default_font ();
         QFont df (def_font[0], def_font[1].toInt ());
         QFont dfa = copy_font_attributes (lexer->defaultFont (), df);
         lexer->setDefaultFont (dfa);
@@ -370,38 +225,6 @@
   }
 #endif
 
-  void resource_manager::check_settings (void)
-  {
-    gui_settings settings;
-
-    if (settings.status () == QSettings::NoError)
-      {
-        // Test usability (force file to be really created)
-        settings.setValue ("dummy", 0);
-        settings.sync ();
-      }
-
-    if (! (QFile::exists (settings.fileName ())
-           && settings.isWritable ()
-           && settings.status () == QSettings::NoError))
-      {
-        QString msg
-          = QString (QT_TR_NOOP ("Error %1 creating the settings file\n%2\n"
-                                 "Make sure you have read and write permissions to\n%3\n\n"
-                                 "Octave GUI must be closed now."));
-
-        QMessageBox::critical (nullptr,
-                               QString (QT_TR_NOOP ("Octave Critical Error")),
-                               msg.arg (settings.status ())
-                                  .arg (get_settings_file ())
-                                  .arg (get_settings_directory ()));
-
-        exit (1);
-      }
-    else
-      settings.remove ("dummy");  // Remove test entry
-  }
-
   bool resource_manager::update_settings_key (const QString& old_key,
                                               const QString& new_key)
   {
@@ -418,11 +241,6 @@
     return false;
   }
 
-  bool resource_manager::is_first_run (void) const
-  {
-    return ! QFile::exists (m_settings_file);
-  }
-
   void resource_manager::update_network_settings (void)
   {
     QNetworkProxy proxy;
--- a/libgui/src/resource-manager.h	Sun Dec 04 15:29:51 2022 -0500
+++ b/libgui/src/resource-manager.h	Sun Dec 04 22:56:23 2022 -0500
@@ -59,22 +59,12 @@
     void config_translators (QTranslator *qt_tr, QTranslator *qsci_tr,
                              QTranslator *gui_tr);
 
-    QString get_settings_directory (void);
-
-    QString get_settings_file (void);
-
-    QString get_default_font_family (void);
-
-    QStringList get_default_font (void);
-
     QPointer<QTemporaryFile>
     create_tmp_file (const QString& extension = QString (),
                      const QString& contents = QString ());
 
     void remove_tmp_file (QPointer<QTemporaryFile> tmp_file);
 
-    void reload_settings (void);
-
 #if defined (HAVE_QSCINTILLA)
     int get_valid_lexer_styles (QsciLexer *lexer, int *styles);
     void read_lexer_settings (QsciLexer *lexer, int mode = 0, int def = 0);
@@ -82,8 +72,6 @@
 
     bool update_settings_key (const QString& new_key, const QString& old_key);
 
-    bool is_first_run (void) const;
-
     void update_network_settings (void);
 
     void get_codecs (QStringList *codecs);
@@ -92,8 +80,6 @@
 
   private:
 
-    void check_settings (void);
-
     /*!
      * Copys the attributes bold, italic and underline from QFont
      * @p attr to the font @p base and returns the result without
@@ -103,10 +89,6 @@
     */
     QFont copy_font_attributes (const QFont& attr, const QFont& base) const;
 
-    QString m_settings_directory;
-
-    QString m_settings_file;
-
     QList<QTemporaryFile *> m_temporary_files;
   };
 }
--- a/libgui/src/welcome-wizard.cc	Sun Dec 04 15:29:51 2022 -0500
+++ b/libgui/src/welcome-wizard.cc	Sun Dec 04 22:56:23 2022 -0500
@@ -144,10 +144,9 @@
   {
     // Create default settings file.
 
-    resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
-    rmgr.reload_settings ();
+    gui_settings settings;
 
-    gui_settings settings;
+    settings.reload ();
 
     settings.setValue (nr_allow_connection.key,
                        m_allow_web_connect_state);
@@ -157,7 +156,7 @@
     QDialog::accept ();
   }
 
-  initial_page::initial_page (base_qobject& oct_qobj, welcome_wizard *wizard)
+  initial_page::initial_page (base_qobject&, welcome_wizard *wizard)
     : QWidget (wizard),
       m_title (new QLabel (tr ("Welcome to Octave!"), this)),
       m_message (new QLabel (this)),
@@ -169,7 +168,7 @@
     ft.setPointSize (20);
     m_title->setFont (ft);
 
-    resource_manager& rmgr = oct_qobj.get_resource_manager ();
+    gui_settings settings;
 
     m_message->setText
       (tr ("<html><body>\n"
@@ -177,7 +176,7 @@
            "Click 'Next' to create a configuration file and launch Octave.</p>\n"
            "<p>The configuration file is stored in<br>%1.</p>\n"
            "</body></html>").
-       arg (rmgr.get_settings_file ()));
+       arg (settings.file_name ()));
     m_message->setWordWrap (true);
     m_message->setMinimumWidth (400);