diff libgui/src/settings-dialog.cc @ 16402:7fa90eb41240

gui: individually configurable styles of the editor lexers * color-picker.cc/.h: new class for a simple color picker * libgui/src/module.mk: added color-picker.cc/.h * file-editor-tab.cc(update_lexer): read config of the lexer from settings file * file-editor-tab(notice_settings): editor font not directly configured from the settings file but via the lexer settings in update_lexer * lexer-octave-gui.cc(constructor): inherits from QsciLexerOctave instaead of QsciLexer, code cleanup * lexer-octave-gui.cc(language,lexer,defaultFont,defaultColor,description): removed, original methods used and configured via settings * lexer-octave-gui.h: removed functions language,lexer,defaultFont,defaultColor, description and enum; using methods of octave lexer instead * settings-dialog.cc(constructor): editor font not configured from settings, defining lexers for supported languages and reading their actual settings from the settings file (via read_lexer_settings) * settings-dialog.cc(read_lexer_settings): new function for reading the lexers settings from settings file and creating the tabs with interactive elements for configuring these settings * settings-dialog.cc(write_changed_settings): remove settings for editor font, defining lexers for supported languages and writing the settings from the dialog into the settings file (via write_lexer_settings) * settings-dialog.cc(write_lexer_settings): new funciton for getting the new lexer settings from the interactive elements and write them into the settings file * settings-dialog.h: new functiond read_lexer_settings, write_lexer_settings * settings-dialog.ui: new tab for the editor styles which contents is dynamically created in settings_dialog ()
author Torsten <ttl@justmail.de>
date Sun, 31 Mar 2013 23:56:11 +0200
parents 4bb1b82076e5
children f62163bed4dc
line wrap: on
line diff
--- a/libgui/src/settings-dialog.cc	Sun Mar 31 14:45:28 2013 -0400
+++ b/libgui/src/settings-dialog.cc	Sun Mar 31 23:56:11 2013 +0200
@@ -31,6 +31,16 @@
 #include <QDir>
 #include <QFileInfo>
 
+#ifdef HAVE_QSCINTILLA
+#include <QScrollArea>
+#include "color-picker.h"
+#include <Qsci/qscilexercpp.h>
+#include <Qsci/qscilexerbash.h>
+#include <Qsci/qscilexerperl.h>
+#include <Qsci/qscilexerbatch.h>
+#include <Qsci/qscilexerdiff.h>
+#endif
+
 settings_dialog::settings_dialog (QWidget *p):
   QDialog (p), ui (new Ui::settings_dialog)
 {
@@ -71,8 +81,6 @@
   ui->editor_showLineNumbers->setChecked (settings->value ("editor/showLineNumbers",true).toBool () );
   ui->editor_highlightCurrentLine->setChecked (settings->value ("editor/highlightCurrentLine",true).toBool () );
   ui->editor_codeCompletion->setChecked (settings->value ("editor/codeCompletion",true).toBool () );
-  ui->editor_fontName->setCurrentFont (QFont (settings->value ("editor/fontName","Courier New").toString()) );
-  ui->editor_fontSize->setValue (settings->value ("editor/fontSize",10).toInt ());
   ui->editor_longWindowTitle->setChecked (settings->value ("editor/longWindowTitle",false).toBool ());
   ui->editor_restoreSession->setChecked (settings->value ("editor/restoreSession",true).toBool ());
   ui->terminal_fontName->setCurrentFont (QFont (settings->value ("terminal/fontName","Courier New").toString()) );
@@ -114,6 +122,29 @@
   ui->proxyPort->setText (settings->value ("proxyPort").toString ());
   ui->proxyUserName->setText (settings->value ("proxyUserName").toString ());
   ui->proxyPassword->setText (settings->value ("proxyPassword").toString ());
+
+#ifdef HAVE_QSCINTILLA
+  // editor styles: create lexer, read settings, and create dialog elements
+  QsciLexer *lexer;
+  lexer = new lexer_octave_gui ();
+  read_lexer_settings (lexer,settings);
+  delete lexer;
+  lexer = new QsciLexerCPP ();
+  read_lexer_settings (lexer,settings);
+  delete lexer;
+  lexer = new QsciLexerPerl ();
+  read_lexer_settings (lexer,settings);
+  delete lexer;
+  lexer = new QsciLexerBatch ();
+  read_lexer_settings (lexer,settings);
+  delete lexer;
+  lexer = new QsciLexerDiff ();
+  read_lexer_settings (lexer,settings);
+  delete lexer;
+  lexer = new QsciLexerBash ();
+  read_lexer_settings (lexer,settings);
+  delete lexer;
+#endif    
 }
 
 settings_dialog::~settings_dialog ()
@@ -121,6 +152,80 @@
   delete ui;
 }
 
+
+#ifdef HAVE_QSCINTILLA
+void
+settings_dialog::read_lexer_settings (QsciLexer *lexer, QSettings *settings)
+{
+  lexer->readSettings (*settings);
+  int styles = 0;
+  while (lexer->description(styles) != "")
+    styles++;
+  QGridLayout *style_grid = new QGridLayout ();
+  QLabel *description[styles];
+  QFontComboBox *select_font[styles];
+  QSpinBox *font_size[styles];
+  QCheckBox *attrib_font[3][styles];
+  color_picker *color[styles];
+  int default_size = 10;
+  QFont default_font = QFont ();
+  for (int i = 0; i < styles; i++)  // create dialog elements for all styles
+    {
+      QString actual_name = lexer->description (i);
+      QFont   actual_font = lexer->font (i);
+      description[i] = new QLabel (actual_name);
+      select_font[i] = new QFontComboBox ();
+      select_font[i]->setObjectName (actual_name+"_font");
+      font_size[i] = new QSpinBox ();
+      font_size[i]->setObjectName (actual_name+"_size");
+      if (i == 0) // the default
+        {
+          select_font[i]->setCurrentFont (actual_font);
+          default_font = actual_font;
+          font_size[i]->setRange (6,24);
+          default_size = actual_font.pointSize ();
+          font_size[i]->setValue (default_size);
+        }
+      else   // other styles
+        {
+          select_font[i]->setCurrentFont (actual_font);
+          if (actual_font.family () == default_font.family ())
+            select_font[i]->setEditText (lexer->description (0));
+          font_size[i]->setRange (-4,4);
+          font_size[i]->setValue (actual_font.pointSize ()-default_size);
+          font_size[i]->setToolTip ("Difference to the defalt size");
+        }
+      attrib_font[0][i] = new QCheckBox (tr("b"));
+      attrib_font[1][i] = new QCheckBox (tr("i"));
+      attrib_font[2][i] = new QCheckBox (tr("u"));
+      attrib_font[0][i]->setChecked(Qt::Checked && actual_font.bold ());
+      attrib_font[0][i]->setObjectName (actual_name+"_bold");
+      attrib_font[1][i]->setChecked(Qt::Checked && actual_font.italic ());
+      attrib_font[1][i]->setObjectName (actual_name+"_italic");
+      attrib_font[2][i]->setChecked(Qt::Checked && actual_font.underline ());
+      attrib_font[2][i]->setObjectName (actual_name+"_underline");
+      color[i] = new color_picker (lexer->color (i));
+      color[i]->setObjectName (actual_name+"_color");
+      int column = 1;
+      style_grid->addWidget (description[i],   i,column++);
+      style_grid->addWidget (select_font[i],   i,column++);
+      style_grid->addWidget (font_size[i],     i,column++);
+      style_grid->addWidget (attrib_font[0][i],i,column++);
+      style_grid->addWidget (attrib_font[1][i],i,column++);
+      style_grid->addWidget (attrib_font[2][i],i,column++);
+      style_grid->addWidget (color[i],         i,column++);
+    }
+  // place grid with elements into the tab
+  QScrollArea *scroll_area = new QScrollArea ();
+  QWidget *scroll_area_contents = new QWidget ();
+  scroll_area_contents->setObjectName (QString (lexer->language ())+"_styles");
+  scroll_area_contents->setLayout (style_grid);
+  scroll_area->setWidget (scroll_area_contents);
+  ui->tabs_editor_styles->addTab (scroll_area,lexer->language ());
+}
+#endif  
+
+
 void
 settings_dialog::write_changed_settings ()
 {
@@ -147,8 +252,6 @@
   settings->setValue ("editor/showLineNumbers", ui->editor_showLineNumbers->isChecked ());
   settings->setValue ("editor/highlightCurrentLine", ui->editor_highlightCurrentLine->isChecked ());
   settings->setValue ("editor/codeCompletion", ui->editor_codeCompletion->isChecked ());
-  settings->setValue ("editor/fontName", ui->editor_fontName->currentFont().family());
-  settings->setValue ("editor/fontSize", ui->editor_fontSize->value());
   settings->setValue ("editor/longWindowTitle", ui->editor_longWindowTitle->isChecked());
   settings->setValue ("editor/restoreSession", ui->editor_restoreSession->isChecked ());
   settings->setValue ("terminal/fontSize", ui->terminal_fontSize->value());
@@ -177,4 +280,87 @@
     }
   settings->setValue ("terminal/cursorType", cursorType);
   settings->sync ();
+
+#ifdef HAVE_QSCINTILLA
+  // editor styles: create lexer, get dialog contents, and write settings
+  QsciLexer *lexer;
+  lexer = new lexer_octave_gui ();
+  write_lexer_settings (lexer,settings);
+  delete lexer;
+  lexer = new QsciLexerCPP ();
+  write_lexer_settings (lexer,settings);
+  delete lexer;
+  lexer = new QsciLexerPerl ();
+  write_lexer_settings (lexer,settings);
+  delete lexer;
+  lexer = new QsciLexerBatch ();
+  write_lexer_settings (lexer,settings);
+  delete lexer;
+  lexer = new QsciLexerDiff ();
+  write_lexer_settings (lexer,settings);
+  delete lexer;
+  lexer = new QsciLexerBash ();
+  write_lexer_settings (lexer,settings);
+  delete lexer;
+#endif
 }
+
+#ifdef HAVE_QSCINTILLA
+void
+settings_dialog::write_lexer_settings (QsciLexer *lexer, QSettings *settings)
+{
+  QWidget *tab = ui->tabs_editor_styles->
+            findChild <QWidget *>(QString (lexer->language ())+"_styles");
+  int styles = 0;
+  while (lexer->description(styles) != "")
+    styles++;
+  QFontComboBox *select_font;
+  QSpinBox *font_size;
+  QCheckBox *attrib_font[3];
+  color_picker *color;
+  int default_size = 10;
+  QFont default_font = QFont ("Courier New",10,-1,0);
+  for (int i = 0; i < styles; i++)  // get dialog elements and their contents
+    {
+      QString actual_name = lexer->description (i);
+      select_font    = tab->findChild <QFontComboBox *>(actual_name+"_font");
+      font_size      = tab->findChild <QSpinBox *>(actual_name+"_size");
+      attrib_font[0] = tab->findChild <QCheckBox *>(actual_name+"_bold");
+      attrib_font[1] = tab->findChild <QCheckBox *>(actual_name+"_italic");
+      attrib_font[2] = tab->findChild <QCheckBox *>(actual_name+"_underline");
+      color          = tab->findChild <color_picker *>(actual_name+"_color");
+      QFont new_font = default_font;
+      if (select_font)
+        {
+          new_font = select_font->currentFont ();
+          if (i == 0)
+            default_font = new_font;
+          else
+            if (select_font->currentText () == lexer->description (0))
+              new_font = default_font;
+        }
+      if (font_size)
+        {
+          if (i == 0)
+            {
+              default_size = font_size->value ();
+              new_font.setPointSize (font_size->value ());
+            }
+          else
+            new_font.setPointSize (font_size->value ()+default_size);
+        }
+      if (attrib_font[0])
+        new_font.setBold (attrib_font[0]->isChecked ());
+      if (attrib_font[1])
+        new_font.setItalic (attrib_font[1]->isChecked ());
+      if (attrib_font[2])
+        new_font.setUnderline (attrib_font[2]->isChecked ());
+      lexer->setFont (new_font,i);
+      if (i == 0)
+        lexer->setDefaultFont (new_font);
+      if (color)
+        lexer->setColor (color->color (),i);
+    }
+  lexer->writeSettings (*settings);
+}
+#endif