changeset 18861:3f6280d0a36b gui-release

allow export and import of shortcut sets * settings-dialog.ui: new buttons for import/export of one of the shortcut sets * settings-dialog.cc (constrctor): bundle the code for the shortcut settings, connect slots to signals from the import/export-buttons; (im-/export_shortcut_set1/2): four new slots for the buttons signals * settings-dialog.h: new slots * shortcut-manager.cc (do_fill_treewidget): some code formatting; (do_write_shortcuts): set and settings as parameters, distinguish if all or only one set has to be written into the file; (import_shortcuts): new function for reading a shortcut set from a settings file; (do_import_export): new function called from the static wrapper function import_export for importing or exporting a shortcut sets; (enter_shortcut::enter_shortcut, enter_shortcut::handle_direct_shortcut, enter_shortcut::keyPressevent): added some comments * shortcut-manager.h (write_shortcuts): new parameters set and settings; (import_export): new static function; (do_write_shortcuts): new parameters set and settings; (do_import_export, import_shortcuts): new functions
author Torsten <ttl@justmail.de>
date Thu, 12 Jun 2014 18:45:29 +0200
parents 2e68c34521e0
children 4b98fc5c2eb1
files libgui/src/settings-dialog.cc libgui/src/settings-dialog.h libgui/src/settings-dialog.ui libgui/src/shortcut-manager.cc libgui/src/shortcut-manager.h
diffstat 5 files changed, 223 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/src/settings-dialog.cc	Sun Jun 08 16:34:22 2014 -0700
+++ b/libgui/src/settings-dialog.cc	Thu Jun 12 18:45:29 2014 +0200
@@ -58,8 +58,6 @@
 {
   ui->setupUi (this);
 
-  shortcut_manager::fill_treewidget (ui->shortcuts_treewidget);
-
   QSettings *settings = resource_manager::get_settings ();
 
   // restore last geometry
@@ -280,12 +278,27 @@
   read_terminal_colors (settings);
 
   // shortcuts
+
   ui->cb_prevent_readline_conflicts->setChecked (
     settings->value ("shortcuts/prevent_readline_conflicts", true).toBool ());
   int set = settings->value ("shortcuts/set",0).toInt ();
   ui->rb_sc_set1->setChecked (set == 0);
   ui->rb_sc_set2->setChecked (set == 1);
 
+  // initialize the tree view with all shortcut data
+  shortcut_manager::fill_treewidget (ui->shortcuts_treewidget);
+
+  // connect the buttons for import/export of the shortcut sets
+  connect (ui->btn_import_shortcut_set1, SIGNAL (clicked ()),
+           this, SLOT (import_shortcut_set1 ()));
+  connect (ui->btn_export_shortcut_set1, SIGNAL (clicked ()),
+           this, SLOT (export_shortcut_set1 ()));
+  connect (ui->btn_import_shortcut_set2, SIGNAL (clicked ()),
+           this, SLOT (import_shortcut_set2 ()));
+  connect (ui->btn_export_shortcut_set2, SIGNAL (clicked ()),
+           this, SLOT (export_shortcut_set2 ()));
+
+
 #ifdef HAVE_QSCINTILLA
   // editor styles: create lexer, read settings, and create dialog elements
   QsciLexer *lexer;
@@ -713,7 +726,7 @@
   if (ui->rb_sc_set2->isChecked ())
     set = 1;
   settings->setValue ("shortcuts/set",set);
-  shortcut_manager::write_shortcuts ();
+  shortcut_manager::write_shortcuts (0, settings);  // 0: write both sets
 
   // settings dialog's geometry
   settings->setValue ("settings/last_tab",ui->tabWidget->currentIndex ());
@@ -882,3 +895,28 @@
       ui->pb_file_browser_dir->setDisabled (disable);
     }
 }
+
+// slots for import/export of shortcut sets
+void
+settings_dialog::import_shortcut_set1 ()
+{
+  shortcut_manager::import_export (true,1);
+}
+
+void
+settings_dialog::export_shortcut_set1 ()
+{
+  shortcut_manager::import_export (false,1);
+}
+
+void
+settings_dialog::import_shortcut_set2 ()
+{
+  shortcut_manager::import_export (true,2);
+}
+
+void
+settings_dialog::export_shortcut_set2 ()
+{
+  shortcut_manager::import_export (false,2);
+}
--- a/libgui/src/settings-dialog.h	Sun Jun 08 16:34:22 2014 -0700
+++ b/libgui/src/settings-dialog.h	Thu Jun 12 18:45:29 2014 +0200
@@ -52,6 +52,12 @@
   void get_dir (QLineEdit*, const QString&);
   void set_disabled_pref_file_browser_dir (bool disable);
 
+  // slots for import/export-buttons of shortcut sets
+  void import_shortcut_set1 ();
+  void export_shortcut_set1 ();
+  void import_shortcut_set2 ();
+  void export_shortcut_set2 ();
+
 private:
   Ui::settings_dialog * ui;
 #ifdef HAVE_QSCINTILLA
--- a/libgui/src/settings-dialog.ui	Sun Jun 08 16:34:22 2014 -0700
+++ b/libgui/src/settings-dialog.ui	Thu Jun 12 18:45:29 2014 +0200
@@ -32,7 +32,7 @@
       </size>
      </property>
      <property name="currentIndex">
-      <number>1</number>
+      <number>6</number>
      </property>
      <widget class="QWidget" name="tab_general">
       <property name="enabled">
@@ -1738,33 +1738,57 @@
               </widget>
              </item>
              <item>
-              <layout class="QHBoxLayout" name="horizontalLayout_14">
-               <item>
-                <widget class="QLabel" name="label_22">
+              <layout class="QGridLayout" name="gridLayout_12">
+               <property name="topMargin">
+                <number>10</number>
+               </property>
+               <item row="3" column="0">
+                <layout class="QHBoxLayout" name="horizontalLayout_16">
+                 <property name="topMargin">
+                  <number>0</number>
+                 </property>
+                </layout>
+               </item>
+               <item row="1" column="2">
+                <widget class="QRadioButton" name="rb_sc_set2">
                  <property name="text">
-                  <string>Use Shortcut Set: </string>
+                  <string>Use this set</string>
                  </property>
                 </widget>
                </item>
-               <item>
+               <item row="0" column="0">
+                <widget class="QLabel" name="label_23">
+                 <property name="text">
+                  <string>Set 1:</string>
+                 </property>
+                </widget>
+               </item>
+               <item row="1" column="4">
+                <widget class="QPushButton" name="btn_export_shortcut_set2">
+                 <property name="text">
+                  <string>Export</string>
+                 </property>
+                </widget>
+               </item>
+               <item row="1" column="3">
+                <widget class="QPushButton" name="btn_import_shortcut_set2">
+                 <property name="text">
+                  <string>Import</string>
+                 </property>
+                </widget>
+               </item>
+               <item row="0" column="2">
                 <widget class="QRadioButton" name="rb_sc_set1">
                  <property name="text">
-                  <string>Set 1</string>
+                  <string>Use this set</string>
                  </property>
                  <property name="checked">
                   <bool>true</bool>
                  </property>
                 </widget>
                </item>
-               <item>
-                <widget class="QRadioButton" name="rb_sc_set2">
-                 <property name="text">
-                  <string>Set 2</string>
-                 </property>
-                </widget>
-               </item>
-               <item>
-                <spacer name="horizontalSpacer_17">
+               <item row="0" column="5">
+                <spacer name="horizontalSpacer_26">
                  <property name="orientation">
                   <enum>Qt::Horizontal</enum>
                  </property>
@@ -1776,6 +1800,43 @@
                  </property>
                 </spacer>
                </item>
+               <item row="0" column="4">
+                <widget class="QPushButton" name="btn_export_shortcut_set1">
+                 <property name="text">
+                  <string>Export</string>
+                 </property>
+                </widget>
+               </item>
+               <item row="0" column="3">
+                <widget class="QPushButton" name="btn_import_shortcut_set1">
+                 <property name="text">
+                  <string>Import</string>
+                 </property>
+                </widget>
+               </item>
+               <item row="1" column="0">
+                <widget class="QLabel" name="label_24">
+                 <property name="text">
+                  <string>Set 2:</string>
+                 </property>
+                </widget>
+               </item>
+               <item row="0" column="1">
+                <spacer name="horizontalSpacer_33">
+                 <property name="orientation">
+                  <enum>Qt::Horizontal</enum>
+                 </property>
+                 <property name="sizeType">
+                  <enum>QSizePolicy::Fixed</enum>
+                 </property>
+                 <property name="sizeHint" stdset="0">
+                  <size>
+                   <width>20</width>
+                   <height>20</height>
+                  </size>
+                 </property>
+                </spacer>
+               </item>
               </layout>
              </item>
              <item>
--- a/libgui/src/shortcut-manager.cc	Sun Jun 08 16:34:22 2014 -0700
+++ b/libgui/src/shortcut-manager.cc	Thu Jun 12 18:45:29 2014 +0200
@@ -34,6 +34,7 @@
 #include <QCheckBox>
 #include <QHeaderView>
 #include <QAction>
+#include <QFileDialog>
 
 #include "error.h"
 #include "resource-manager.h"
@@ -300,7 +301,7 @@
       QColor fg = QColor (tree_item->foreground (1).color ());
       fg.setAlpha (128);
       tree_item->setForeground (1, QBrush (fg));
-      tree_item->setForeground (3,QBrush (fg));
+      tree_item->setForeground (3, QBrush (fg));
 
       // write the shortcuts
       tree_item->setText (0, sc.description);
@@ -315,18 +316,35 @@
 
 }
 
+// write one or all actual shortcut set(s) into a settings file
 void
-shortcut_manager::do_write_shortcuts ()
+shortcut_manager::do_write_shortcuts (int set, QSettings* settings)
 {
-  for (int i = 0; i < _sc.count (); i++)
+  if (set)
     {
-      _settings->setValue("shortcuts/"+_sc.at (i).settings_key, _sc.at (i).actual_sc[0].toString ());
-      _settings->setValue("shortcuts/"+_sc.at (i).settings_key+"_1", _sc.at (i).actual_sc[1].toString ());
+      // set is not zero, only write the desired set (index = set-1)
+      // into the settings file that the user has selected for this export
+      for (int i = 0; i < _sc.count (); i++)  // loop over all shortcuts
+        {
+          settings->setValue("shortcuts/"+_sc.at (i).settings_key,
+                             _sc.at (i).actual_sc[set-1].toString ());
+        }
+    }
+  else
+    {
+      // set is zero, write all sets into the normal octave settings file
+      // (this is only the case when called from the closing settings dialog)
+      for (int i = 0; i < _sc.count (); i++)  // loop over all shortcuts
+        {
+          settings->setValue("shortcuts/"+_sc.at (i).settings_key,
+                             _sc.at (i).actual_sc[0].toString ());
+          settings->setValue("shortcuts/"+_sc.at (i).settings_key+"_1",
+                            _sc.at (i).actual_sc[1].toString ());
+        }
+      delete _dialog;  // the dialog for key sequences can be removed now
     }
 
-  _settings->sync ();
-
-  delete _dialog;
+  settings->sync ();    // sync the settings file
 }
 
 void
@@ -498,26 +516,85 @@
   _edit_actual->setText (_label_default->text ());
 }
 
+// import a shortcut set from a given settings file and refresh the tree view
+void
+shortcut_manager::import_shortcuts (int set, QSettings *settings)
+{
+  for (int i = 0; i < _sc.count (); i++)
+    {
+      // update the list of all shortcuts
+      shortcut_t sc = _sc.at (i);           // make a copy
+      sc.actual_sc[set-1] = QKeySequence (  // get new shortcut from settings
+        settings->value ("shortcuts/"+sc.settings_key,sc.actual_sc[set-1]).
+                        toString ());       // and use the old one as default
+      _sc.replace (i,sc);                   // replace the old with the new one
+
+      // update the tree view
+      QTreeWidgetItem* tree_item = _index_item_hash[i]; // get related tree item
+      tree_item->setText (2*set, sc.actual_sc [set-1]); // display new shortcut
+    }
+}
+
+// import or export of shortcut sets,
+// called from settings dialog when related buttons are clicked
+void
+shortcut_manager::do_import_export (bool import, int set)
+{
+  QString file;
+
+  // get the file name to read or write the shortcuts,
+  // the default extension is .osc (octave shortcuts)
+  if (import)
+    {
+      file = QFileDialog::getOpenFileName (this,
+              tr ("Import shortcut set %1 from file ...").arg (set), QString (),
+              tr ("Octave Shortcut Files (*.osc);;All Files (*)"));
+    }
+  else
+    {
+      file = QFileDialog::getSaveFileName (this,
+              tr ("Export shortcut set %1 into file ...").arg (set), QString (),
+              tr ("Octave Shortcut Files (*.osc);;All Files (*)"));
+    }
+
+  // create a settings object related to this file
+  QSettings *osc_settings = new QSettings (file, QSettings::IniFormat);
+  if (osc_settings)
+    {
+      // the settings object was successfully created: carry on
+      if (import)
+        import_shortcuts (set, osc_settings);   // import (special action)
+      else
+        do_write_shortcuts (set, osc_settings); // export, like saving settings
+    }
+  else
+    qWarning () << tr ("Failed to open %1 as octave shortcut file"). arg (file);
+
+}
 
 
+// enter_shortcut:
+// class derived from QLineEdit for directly entering key sequences which
 enter_shortcut::enter_shortcut (QWidget *p) : QLineEdit (p)
 {
-  _direct_shortcut = true;
+  _direct_shortcut = true;      // the shortcut is directly entered
 }
 
 enter_shortcut::~enter_shortcut ()
 {
 }
 
+// slot for checkbox whether the shortcut is directly entered or not
 void
 enter_shortcut::handle_direct_shortcut (int state)
 {
   if (state)
-    _direct_shortcut = true;
+    _direct_shortcut = true;  // the shortcut is directly entered
   else
-    _direct_shortcut = false;
+    _direct_shortcut = false; // the shortcut has to be written as text
 }
 
+// new keyPressEvent
 void
 enter_shortcut::keyPressEvent (QKeyEvent *e)
 {
@@ -548,4 +625,3 @@
       setText (QKeySequence(key));
     }
 }
-
--- a/libgui/src/shortcut-manager.h	Sun Jun 08 16:34:22 2014 -0700
+++ b/libgui/src/shortcut-manager.h	Thu Jun 12 18:45:29 2014 +0200
@@ -63,10 +63,10 @@
       instance->do_init_data ();
   }
 
-  static void write_shortcuts ()
+  static void write_shortcuts (int set, QSettings *settings)
   {
     if (instance_ok ())
-      instance->do_write_shortcuts ();
+      instance->do_write_shortcuts (set, settings);
   }
 
   static void set_shortcut (QAction *action, const QString& key)
@@ -81,6 +81,12 @@
       instance->do_fill_treewidget (tree_view);
   }
 
+  static void import_export (bool import, int set)
+  {
+    if (instance_ok ())
+      instance->do_import_export (import, set);
+  }
+
 public slots:
 
 signals:
@@ -107,10 +113,12 @@
 
   void init (QString, QString, QKeySequence);
   void do_init_data ();
-  void do_write_shortcuts ();
+  void do_write_shortcuts (int set, QSettings *settings);
   void do_set_shortcut (QAction *action, const QString& key);
   void do_fill_treewidget (QTreeWidget *tree_view);
+  void do_import_export (bool import, int set);
   void shortcut_dialog (int);
+  void import_shortcuts (int set, QSettings *settings);
 
   struct shortcut_t
   {