diff libgui/src/main-window.cc @ 25700:ba8227df92ae

synchronize gui editor encoding when changing __mfile_encdoing__ (bug #54310) * input.cc (mfile_encoding): call __octave_link_gui_preference__ for setting the preference editor/default_encoding accordingly * main-window.cc (gui_preference_adjust): new method for adjusting and checking some new preferences that have to be set via gui_preference, in this case the default encoding; (gui_preference): use new method gui_preference_adjust and only set the new preference if it has changed; * main-window.h: new proivate method gui_preference_adjust * resource-manager.cc (do_get_codecs): new method reading a string list with all available codecs; (do_combo_encoding): do net get a list of codecs here, but use the new method do_get_codecs * resource-manager.h: new static method get_codecs which only calls new method do_get_codecs
author Torsten <mttl@mailbox.org>
date Sat, 28 Jul 2018 08:29:34 +0200
parents 3418d3729a51
children bd30c6f8cfb7
line wrap: on
line diff
--- a/libgui/src/main-window.cc	Fri Mar 16 13:17:53 2018 +0100
+++ b/libgui/src/main-window.cc	Sat Jul 28 08:29:34 2018 +0200
@@ -2492,6 +2492,41 @@
              this, SLOT (handle_undo_request (void)));
   }
 
+  QString main_window::gui_preference_adjust (const QString& key,
+                                              const QString& value)
+  {
+    QString adjusted_value = value;
+
+    // Immediately return if no new value is given
+    if (adjusted_value.isEmpty ())
+      return adjusted_value;
+
+    // Not all encodings are available. Encodings are uppercase and do not
+    // use CPxxx but IBMxxx or WINDOWS-xxx.
+    if (key == "editor/default_encoding")
+      {
+        adjusted_value = adjusted_value.toUpper ();
+
+        QStringList codecs;
+        resource_manager::get_codecs (&codecs);
+
+        QRegExp re ("^CP(\\d+)$");
+        if (re.indexIn (adjusted_value) > -1)
+          {
+            if (codecs.contains ("IBM" + re.cap (1)))
+              adjusted_value = "IBM" + re.cap (1);
+            else if (codecs.contains ("WINDOWS-" + re.cap (1)))
+              adjusted_value = "WINDOWS-" + re.cap (1);
+            else
+              adjusted_value.clear ();
+          }
+        else if (! codecs.contains (adjusted_value))
+          adjusted_value.clear ();
+      }
+
+    return adjusted_value;
+  }
+
   void main_window::gui_preference (const QString& key, const QString& value,
                                     QString* read_value)
   {
@@ -2501,9 +2536,13 @@
     // Wait for worker to suspend
     m_octave_qt_link->lock ();
 
-    if (! value.isEmpty ())
+    // Some preferences need extra handling
+    QString adjusted_value = gui_preference_adjust (key, value);
+
+    if (! adjusted_value.isEmpty () && (*read_value != adjusted_value))
       {
-        settings->setValue (key, QVariant (value));
+        // Change settings only for new, non-empty values
+        settings->setValue (key, QVariant (adjusted_value));
         emit settings_changed (settings);
       }