diff libgui/src/settings-dialog.cc @ 29524:730cac3d6d5a

allow reloading default colors and styles in the preferences dialog * gui-settings.h: define constants for the new button texts and related tooltips * resource-manager.cc (read_lexer_settings): new argument indicating that only the defaults have to be reloaded ignoring current settings file entries, do not write lexer styles into the settings file in this case but only configure the given lexer accordingly * resource-manager.h: new argument for read_lexer_settings * settings-dialog.cc (settings_dialog): checkbox for second editor color mode now added via code together with the new button for reloading the default styles, connect button signal with update_editor_lexers; (update_editor_lexers): argument now used for reloading default values, which is also passed to all calls of update_lexer, get the mode from the checkbox; (update_lexer): new argument, which is also passed to read_lexer_settings, also update font style elements from the lexer configures with the default values and not only the color pickers; (write_lexer_settings): remove mode argument and get mode from checkbox, save it into settings file here (write_changed_settings): instead here, call write_lexer_settings without mode parameter; (read_workspace_colors): add button for reloading default values, connect to update_workspace_colors; (update_workspace_colors): get mode from the checkbox, not as argument, get colors from settings or the default values; (read_terminal_colors): see read_workspace_colors; (update_terminal_colors): see update_workspace_colors; (read_varedit_colors): see read_workspace_colors; (update_varedit_colors): see update_workspace_colors; * settings-dialog.h: new arg in update color slots, changed arguments in update and write lexer slots * settings-dialog.ui: remove the color check box for the editor styles and add a grid layout instead
author Torsten Lilge <ttl-octave@mailbox.org>
date Sun, 11 Apr 2021 19:22:31 +0200
parents 5384bb4efc51
children 3d34b70b5a49
line wrap: on
line diff
--- a/libgui/src/settings-dialog.cc	Sun Apr 11 19:22:30 2021 +0200
+++ b/libgui/src/settings-dialog.cc	Sun Apr 11 19:22:31 2021 +0200
@@ -454,16 +454,30 @@
 #if defined (HAVE_QSCINTILLA)
 
     int ed_mode = settings->value (ed_color_mode).toInt ();
-    editor_cb_color_mode->setText (settings_color_modes);
-    editor_cb_color_mode->setToolTip (settings_color_modes_tooltip);
-    editor_cb_color_mode->setChecked (ed_mode > 0);
+
+    QCheckBox *cb_color_mode = new QCheckBox (settings_color_modes,
+                                              group_box_editor_styles);
+    cb_color_mode->setToolTip (settings_color_modes_tooltip);
+    cb_color_mode->setChecked (ed_mode > 0);
+    cb_color_mode->setObjectName (ed_color_mode.key);
+
+    QPushButton *pb_reload_default_colors = new QPushButton (settings_reload_styles);
+    pb_reload_default_colors->setToolTip (settings_reload_styles_tooltip);
+
+    editor_style_grid->addWidget (cb_color_mode, 0, 0);
+    editor_style_grid->addWidget (pb_reload_default_colors, 0, 1);
+    editor_style_grid->addItem (new QSpacerItem (5,5,QSizePolicy::Expanding), 0, 2);
+
+
 
     // update colors depending on second theme selection
-    connect (editor_cb_color_mode, SIGNAL (stateChanged (int)),
+    connect (cb_color_mode, SIGNAL (stateChanged (int)),
              this, SLOT (update_editor_lexers (int)));
+    connect (pb_reload_default_colors, &QPushButton::clicked,
+             [=] () { update_editor_lexers (settings_reload_default_colors_flag); });
 
     // finally read the lexer colors using the update slot
-    update_editor_lexers (ed_mode);
+    update_editor_lexers ();
 
 #endif
 
@@ -607,12 +621,15 @@
     scmgr.import_export (shortcut_manager::OSC_DEFAULT);
   }
 
-  void settings_dialog::update_editor_lexers (int mode)
+  void settings_dialog::update_editor_lexers (int def)
   {
 #if defined (HAVE_QSCINTILLA)
-     int m = mode;
-     if (m > 1)
-       m = 1;
+    QCheckBox *cb_color_mode
+      = group_box_editor_styles->findChild <QCheckBox *> (ed_color_mode.key);
+
+    int m = 0;
+    if (cb_color_mode && cb_color_mode->isChecked ())
+      m = 1;
 
     // editor styles: create lexer, read settings, and
     // create or update dialog elements
@@ -623,54 +640,56 @@
 
 #if defined (HAVE_LEXER_OCTAVE)
     lexer = new QsciLexerOctave ();
-    update_lexer (lexer, settings, m);
+    update_lexer (lexer, settings, m, def);
     delete lexer;
 #elif defined (HAVE_LEXER_MATLAB)
     lexer = new QsciLexerMatlab ();
-    update_lexer (lexer, settings, m);
+    update_lexer (lexer, settings, m, def);
     delete lexer;
 #endif
 
     lexer = new QsciLexerCPP ();
-    update_lexer (lexer, settings, m);
+    update_lexer (lexer, settings, m, def);
     delete lexer;
 
     lexer = new QsciLexerJava ();
-    update_lexer (lexer, settings, m);
+    update_lexer (lexer, settings, m, def);
     delete lexer;
 
     lexer = new QsciLexerPerl ();
-    update_lexer (lexer, settings, m);
+    update_lexer (lexer, settings, m, def);
     delete lexer;
 
     lexer = new QsciLexerBatch ();
-    update_lexer (lexer, settings, m);
+    update_lexer (lexer, settings, m, def);
     delete lexer;
 
     lexer = new QsciLexerDiff ();
-    update_lexer (lexer, settings, m);
+    update_lexer (lexer, settings, m, def);
     delete lexer;
 
     lexer = new QsciLexerBash ();
-    update_lexer (lexer, settings, m);
+    update_lexer (lexer, settings, m, def);
     delete lexer;
 
     lexer = new octave_txt_lexer ();
-    update_lexer (lexer, settings, m);
+    update_lexer (lexer, settings, m, def);
     delete lexer;
 #endif
   }
 
 #if defined (HAVE_QSCINTILLA)
 
-  void settings_dialog::update_lexer (QsciLexer *lexer,
-                                      gui_settings *settings, int mode)
+  void settings_dialog::update_lexer (QsciLexer *lexer, gui_settings *settings,
+                                      int mode, int def)
   {
     // Get lexer settings and copy from default settings if not yet
     // available in normal settings file
     resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
-    rmgr.read_lexer_settings (lexer, settings, mode);
+    rmgr.read_lexer_settings (lexer, settings, mode, def);
 
+    // When reloading default styles, the style tabs do already exists.
+    // Otherwise, check if they exist or not.
     QString lexer_name = lexer->language ();
 
     int index = -1;
@@ -691,16 +710,18 @@
         return;
       }
 
-    // Update the color picker in all styles
+    // Update the styles elements in all styles
     int styles[ed_max_lexer_styles];  // array for saving valid styles
     int max_style = rmgr.get_valid_lexer_styles (lexer, styles);
     QWidget *tab = tabs_editor_lexers->widget (index);
-    color_picker *color, *bg_color;
+    int default_size = 0;
+    QString default_family;
 
     for (int i = 0; i < max_style; i++)  // create dialog elements for all styles
       {
         QString actual_name = lexer->description (styles[i]);
-        bg_color = tab->findChild <color_picker *> (actual_name + "_bg_color");
+        color_picker *bg_color
+          = tab->findChild <color_picker *> (actual_name + "_bg_color");
         if (bg_color)
           {
             // Update
@@ -715,9 +736,49 @@
               }
           }
 
-        color = tab->findChild <color_picker *> (actual_name + "_color");
+        color_picker *color = tab->findChild <color_picker *> (actual_name + "_color");
         if (color)
           color->set_color (lexer->color (styles[i]));
+
+        QFont font = lexer->font (styles[i]);
+
+        QCheckBox *cb = tab->findChild <QCheckBox *> (actual_name + "_bold");
+        if (cb)
+          cb->setChecked (font.bold ());
+        cb = tab->findChild <QCheckBox *> (actual_name + "_italic");
+        if (cb)
+          cb->setChecked (font.italic ());
+        cb = tab->findChild <QCheckBox *> (actual_name + "_underline");
+        if (cb)
+          cb->setChecked (font.underline ());
+
+        QFontComboBox *fcb = tab->findChild <QFontComboBox *> (actual_name + "_font");
+        if (fcb)
+          {
+            if (styles[i] == 0)
+              {
+                default_family = font.family ();
+                fcb->setEditText (default_family);
+              }
+            else
+              {
+                if (font.family () == default_family)
+                  fcb->setEditText (lexer->description (0));
+                else
+                  fcb->setEditText (font.family ());
+              }
+          }
+        QSpinBox *fs = tab->findChild <QSpinBox *> (actual_name + "_size");
+        if (fs)
+          {
+            if (styles[i] == 0)
+              {
+                default_size = font.pointSize ();
+                fs->setValue (default_size);
+              }
+            else
+              fs->setValue (font.pointSize () - default_size);
+          }
       }
 
   }
@@ -817,10 +878,18 @@
   }
 
   void settings_dialog::write_lexer_settings (QsciLexer *lexer,
-                                              gui_settings *settings, int mode)
+                                              gui_settings *settings)
   {
     resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
 
+    QCheckBox *cb_color_mode
+      = group_box_editor_styles->findChild <QCheckBox *> (ed_color_mode.key);
+    int mode = 0;
+    if (cb_color_mode && cb_color_mode->isChecked ())
+      mode = 1;
+
+    settings->setValue (ed_color_mode.key, mode);
+
     QWidget *tab = tabs_editor_lexers->
       findChild <QWidget *> (QString (lexer->language ()) + "_styles");
     int styles[ed_max_lexer_styles];  // array for saving valid styles
@@ -896,11 +965,7 @@
           }
       }
 
-    int m = mode;
-    if (m > 1)
-      m = 1;
-
-    const char* group = QString ("Scintilla" + settings_color_modes_ext[m])
+    const char* group = QString ("Scintilla" + settings_color_modes_ext[mode])
                                 .toStdString ().c_str ();
 
     lexer->writeSettings (*settings, group);
@@ -970,11 +1035,6 @@
     settings->setValue (global_ov_startup_dir.key, le_octave_dir->text ());
 
     //editor
-    int ed_mode = 0;
-    if (editor_cb_color_mode->isChecked ())
-      ed_mode = 1;
-    settings->setValue (ed_color_mode.key, ed_mode);
-
     settings->setValue (global_use_custom_editor.key, useCustomFileEditor->isChecked ());
     settings->setValue (global_custom_editor.key, customFileEditor->text ());
     settings->setValue (ed_show_line_numbers.key, editor_showLineNumbers->isChecked ());
@@ -1084,43 +1144,43 @@
 #if defined (HAVE_LEXER_OCTAVE)
 
     lexer = new QsciLexerOctave ();
-    write_lexer_settings (lexer, settings, ed_mode);
+    write_lexer_settings (lexer, settings);
     delete lexer;
 
 #elif defined (HAVE_LEXER_MATLAB)
 
     lexer = new QsciLexerMatlab ();
-    write_lexer_settings (lexer, settings, ed_mode);
+    write_lexer_settings (lexer, settings);
     delete lexer;
 
 #endif
 
     lexer = new QsciLexerCPP ();
-    write_lexer_settings (lexer, settings, ed_mode);
+    write_lexer_settings (lexer, settings);
     delete lexer;
 
     lexer = new QsciLexerJava ();
-    write_lexer_settings (lexer, settings, ed_mode);
+    write_lexer_settings (lexer, settings);
     delete lexer;
 
     lexer = new QsciLexerPerl ();
-    write_lexer_settings (lexer, settings, ed_mode);
+    write_lexer_settings (lexer, settings);
     delete lexer;
 
     lexer = new QsciLexerBatch ();
-    write_lexer_settings (lexer, settings, ed_mode);
+    write_lexer_settings (lexer, settings);
     delete lexer;
 
     lexer = new QsciLexerDiff ();
-    write_lexer_settings (lexer, settings, ed_mode);
+    write_lexer_settings (lexer, settings);
     delete lexer;
 
     lexer = new QsciLexerBash ();
-    write_lexer_settings (lexer, settings, ed_mode);
+    write_lexer_settings (lexer, settings);
     delete lexer;
 
     lexer = new octave_txt_lexer ();
-    write_lexer_settings (lexer, settings, ed_mode);
+    write_lexer_settings (lexer, settings);
     delete lexer;
 
 #endif
@@ -1179,7 +1239,13 @@
     cb_color_mode->setObjectName (ws_color_mode.key);
     connect (m_ws_enable_colors, SIGNAL (toggled (bool)),
              cb_color_mode, SLOT (setEnabled (bool)));
-    style_grid->addWidget (cb_color_mode, row, column++);
+    style_grid->addWidget (cb_color_mode, row, column);
+
+    QPushButton *pb_reload_default_colors = new QPushButton (settings_reload_colors);
+    pb_reload_default_colors->setToolTip (settings_reload_colors_tooltip);
+    connect (m_ws_enable_colors, SIGNAL (toggled (bool)),
+             pb_reload_default_colors, SLOT (setEnabled (bool)));
+    style_grid->addWidget (pb_reload_default_colors, row+1, column++);
 
     bool colors_enabled = settings->value (ws_enable_colors).toBool ();
 
@@ -1214,20 +1280,27 @@
     m_ws_enable_colors->setChecked (colors_enabled);
     m_ws_hide_tool_tips->setEnabled (colors_enabled);
     cb_color_mode->setEnabled (colors_enabled);
+    pb_reload_default_colors->setEnabled (colors_enabled);
 
     // place grid with elements into the tab
     workspace_colors_box->setLayout (style_grid);
 
-    // update colors depending on second theme selection
+    // update colors depending on second theme selection or reloading
+    // the dfault values
     connect (cb_color_mode, SIGNAL (stateChanged (int)),
              this, SLOT (update_workspace_colors (int)));
+    connect (pb_reload_default_colors, &QPushButton::clicked,
+             [=] () { update_workspace_colors (settings_reload_default_colors_flag); });
   }
 
-  void settings_dialog::update_workspace_colors (int mode)
+  void settings_dialog::update_workspace_colors (int def)
   {
-    int m = mode;
-    if (m > 1)
-      m = 1; // Currently one more color mode
+    QCheckBox *cb_color_mode
+      = workspace_colors_box->findChild <QCheckBox *> (ws_color_mode.key);
+
+    int m = 0;
+    if (cb_color_mode && cb_color_mode->isChecked ())
+      m = 1;
 
     resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
     gui_settings *settings = rmgr.get_settings ();
@@ -1238,7 +1311,18 @@
       {
         c_picker = workspace_colors_box->findChild <color_picker *> (ws_colors[i].key);
         if (c_picker)
-          c_picker->set_color (settings->color_value (ws_colors[i], m));
+          {
+            if (def != settings_reload_default_colors_flag)
+              {
+                // Get current value from settings or the default
+                c_picker->set_color (settings->color_value (ws_colors[i], m));
+              }
+            else
+              {
+                // Get the default value
+                c_picker->set_color (settings->get_color_value (ws_colors[i].def, m));
+              }
+          }
       }
   }
 
@@ -1282,6 +1366,10 @@
     cb_color_mode->setObjectName (cs_color_mode.key);
     style_grid->addWidget (cb_color_mode, 0, 0);
 
+    QPushButton *pb_reload_default_colors = new QPushButton (settings_reload_colors);
+    pb_reload_default_colors->setToolTip (settings_reload_colors_tooltip);
+    style_grid->addWidget (pb_reload_default_colors, 1, 0);
+
     int column = 1;               // column 0 is for the color mode checkbox
     const int color_columns = 2;  // place colors in so many columns
     int row = 0;
@@ -1310,13 +1398,18 @@
     // update colors depending on second theme selection
     connect (cb_color_mode, SIGNAL (stateChanged (int)),
              this, SLOT (update_terminal_colors (int)));
+    connect (pb_reload_default_colors, &QPushButton::clicked,
+             [=] () { update_terminal_colors (settings_reload_default_colors_flag); });
   }
 
-  void settings_dialog::update_terminal_colors (int mode)
+  void settings_dialog::update_terminal_colors (int def)
   {
-    int m = mode;
-    if (m > 1)
-      m = 1; // Currently one more color mode
+    QCheckBox *cb_color_mode
+      = terminal_colors_box->findChild <QCheckBox *> (cs_color_mode.key);
+
+    int m = 0;
+    if (cb_color_mode && cb_color_mode->isChecked ())
+      m = 1;
 
     resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
     gui_settings *settings = rmgr.get_settings ();
@@ -1327,7 +1420,18 @@
       {
         c_picker = terminal_colors_box->findChild <color_picker *> (cs_colors[i].key);
         if (c_picker)
-          c_picker->set_color (settings->color_value (cs_colors[i], m));
+          {
+            if (def != settings_reload_default_colors_flag)
+              {
+                // Get current value from settings or the default
+                c_picker->set_color (settings->color_value (cs_colors[i], m));
+              }
+            else
+              {
+                // Get the default value
+                c_picker->set_color (settings->get_color_value (cs_colors[i].def, m));
+              }
+          }
       }
   }
 
@@ -1368,6 +1472,10 @@
     cb_color_mode->setObjectName (ve_color_mode.key);
     style_grid->addWidget (cb_color_mode, 0, 0);
 
+    QPushButton *pb_reload_default_colors = new QPushButton (settings_reload_colors);
+    pb_reload_default_colors->setToolTip (settings_reload_colors_tooltip);
+    style_grid->addWidget (pb_reload_default_colors, 1, 0);
+
     int column = 1;
     int color_columns = 2;
     int row = 0;
@@ -1397,13 +1505,18 @@
     // update colors depending on second theme selection
     connect (cb_color_mode, SIGNAL (stateChanged (int)),
              this, SLOT (update_varedit_colors (int)));
+    connect (pb_reload_default_colors, &QPushButton::clicked,
+             [=] () { update_varedit_colors (settings_reload_default_colors_flag); });
   }
 
-  void settings_dialog::update_varedit_colors (int mode)
+  void settings_dialog::update_varedit_colors (int def)
   {
-    int m = mode;
-    if (m > 1)
-      m = 1; // Currently one more color mode
+    QCheckBox *cb_color_mode
+      = varedit_colors_box->findChild <QCheckBox *> (ve_color_mode.key);
+
+    int m = 0;
+    if (cb_color_mode && cb_color_mode->isChecked ())
+      m = 1;
 
     resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
     gui_settings *settings = rmgr.get_settings ();
@@ -1414,7 +1527,18 @@
       {
         c_picker = varedit_colors_box->findChild <color_picker *> (ve_colors[i].key);
         if (c_picker)
-          c_picker->set_color (settings->color_value (ve_colors[i], m));
+          {
+            if (def != settings_reload_default_colors_flag)
+              {
+                // Get current value from settings or the default
+                c_picker->set_color (settings->color_value (ve_colors[i], m));
+              }
+            else
+              {
+                // Get the default value
+                c_picker->set_color (settings->get_color_value (ve_colors[i].def, m));
+              }
+          }
       }
   }