changeset 29162:bb6bb306b8a6

copy lexer settings from default settings file for new languages * file-editor-tab.cc (update_lexer_settings): call the new member function of the resource manager for loading the current lexer settings instead of the related lexer function directly * resource-manager.cc (get_default_font): move the code for determining the default monospace font and size into a separate function; (reload_settings): call new function for the default font and size; (read_lexer_settings): new member function testing for lexer settings in a given settings file and copy them from the default settings if not available * resource-manager.h: include Qsci/qscilexer.h, new member function get_default_font and read_lexer_settings * settings-dialog.cc (read_lexer_settings): call the new member function of the resource manager for loading the current lexer settings instead of the related lexer function directly
author Torsten Lilge <ttl-octave@mailbox.org>
date Tue, 08 Dec 2020 21:34:55 +0100
parents b58e3a04fab3
children 8f67ad8b3103
files libgui/src/m-editor/file-editor-tab.cc libgui/src/resource-manager.cc libgui/src/resource-manager.h libgui/src/settings-dialog.cc
diffstat 4 files changed, 106 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/src/m-editor/file-editor-tab.cc	Tue Dec 08 11:13:26 2020 -0800
+++ b/libgui/src/m-editor/file-editor-tab.cc	Tue Dec 08 21:34:55 2020 +0100
@@ -861,7 +861,7 @@
     if (update_apis_only)
       return;   // We are done here
 
-    lexer->readSettings (*settings);
+    rmgr.read_lexer_settings (lexer, settings);
 
     m_edit_area->setCaretForegroundColor (lexer->color (0));
     m_edit_area->setIndentationGuidesForegroundColor (lexer->color (0));
--- a/libgui/src/resource-manager.cc	Tue Dec 08 11:13:26 2020 -0800
+++ b/libgui/src/resource-manager.cc	Tue Dec 08 21:34:55 2020 +0100
@@ -255,10 +255,35 @@
     return default_family;
   }
 
-  void resource_manager::reload_settings (void)
+  QStringList resource_manager::get_default_font (void)
   {
     QString default_family = get_default_font_family ();
 
+    // determine the fefault fotn size of the system
+    QFont font = QFont (default_family);
+    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)
+  {
     if (! QFile::exists (m_settings_file))
       {
         QDir ("/").mkpath (m_settings_directory);
@@ -271,24 +296,8 @@
         QString settings_text = in.readAll ();
         qt_settings.close ();
 
-        default_family = get_default_font_family ();
-
-        // determine the fefault fotn size of the system
-        QFont font = QFont (default_family);
-        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);
+        // Get the default font
+        QStringList def_font = get_default_font ();
 
         // Get the default custom editor
 #if defined (Q_OS_WIN32)
@@ -305,8 +314,8 @@
 
         // Replace placeholders
         settings_text.replace ("__default_custom_editor__", custom_editor);
-        settings_text.replace ("__default_font__", default_family);
-        settings_text.replace ("__default_font_size__", default_font_size);
+        settings_text.replace ("__default_font__", def_font.at(0));
+        settings_text.replace ("__default_font_size__", def_font.at (1));
 
         QFile user_settings (m_settings_file);
 
@@ -325,8 +334,72 @@
     // Write the default monospace font into the settings for later use by
     // console and editor as fallbacks of their font preferences.
     if (m_settings)
-      m_settings->setValue (global_mono_font.key, default_family);
+      m_settings->setValue (global_mono_font.key,
+                            get_default_font_family ());
+
+  }
+
+  void resource_manager::read_lexer_settings (QsciLexer *lexer,
+                                              QSettings *settings)
+  {
+    // Test whether the settings for lexer is already contained in the
+    // given gui settings file. If yes, load them, if not copy them from the
+    // default settings file.
+    // This is useful when a new language support is implemented and the
+    // existing settings file is used (which is of course the common case).
+
+    settings->beginGroup ("Scintilla");
+    settings->beginGroup (lexer->language ());
+
+    QStringList lexer_keys = settings->allKeys ();
+
+    if (lexer_keys.count () == 0)
+      {
+        // No Lexer keys found
+        // => copy all settings from the default settings
+        QSettings def_settings (default_qt_settings_file (),
+                                QSettings::IniFormat);
+        // Get all lexer keys and copy the ones for the given lexer
+        def_settings.beginGroup ("Scintilla");
+        def_settings.beginGroup (lexer->language ());
+
+        // Get the default font
+        QStringList def_font = get_default_font ();
 
+        lexer_keys = def_settings.allKeys ();
+
+        for (int i = 0; i < lexer_keys.count (); i++)
+          {
+            QString key = lexer_keys.at (i);
+            if (key.contains ("font"))
+              {
+                // font setting, insert default font and size
+                QStringList val = def_settings.value (key).toStringList ();
+                val.removeFirst ();
+                val.removeFirst ();
+                val.prepend (def_font.at (1));
+                val.prepend (def_font.at (0));
+                settings->setValue (key, val);
+              }
+            else
+              {
+                // No font setting just copy
+                QVariant var = def_settings.value (key);
+                settings->setValue (key, var);
+              }
+          }
+
+        def_settings.endGroup ();
+        def_settings.endGroup ();
+
+      }
+
+    settings->endGroup ();
+    settings->endGroup ();
+
+    settings->sync ();
+
+    lexer->readSettings (*settings);
   }
 
   void resource_manager::set_settings (const QString& file)
--- a/libgui/src/resource-manager.h	Tue Dec 08 11:13:26 2020 -0800
+++ b/libgui/src/resource-manager.h	Tue Dec 08 21:34:55 2020 +0100
@@ -29,6 +29,7 @@
 #include <QComboBox>
 #include <QIcon>
 #include <QPointer>
+#include <Qsci/qscilexer.h>
 #include <QTranslator>
 #include <QTemporaryFile>
 
@@ -69,6 +70,8 @@
 
     QString get_default_font_family (void);
 
+    QStringList get_default_font (void);
+
     QPointer<QTemporaryFile>
     create_tmp_file (const QString& extension = QString (),
                      const QString& contents = QString ());
@@ -77,6 +80,8 @@
 
     void reload_settings (void);
 
+    void read_lexer_settings (QsciLexer *lexer, QSettings *settings);
+
     void set_settings (const QString& file);
 
     bool update_settings_key (const QString& new_key, const QString& old_key);
--- a/libgui/src/settings-dialog.cc	Tue Dec 08 11:13:26 2020 -0800
+++ b/libgui/src/settings-dialog.cc	Tue Dec 08 21:34:55 2020 +0100
@@ -664,8 +664,12 @@
                                              gui_settings *settings)
   {
 #if defined (HAVE_QSCINTILLA)
+    resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
 
-    lexer->readSettings (*settings);
+    // Get lexer settings and copy from default settings if not yet
+    // available in normal settings file
+    rmgr.read_lexer_settings (lexer, settings);
+
     int styles[MaxLexerStyles];  // array for saving valid styles
     // (enum is not continuous)
     int max_style = get_valid_lexer_styles (lexer, styles);