[KLF Application][KLF Tools][KLF Backend][KLF Home]
KLatexFormula Project
klfconfig.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  * file klfconfig.cpp
3  * This file is part of the KLatexFormula Project.
4  * Copyright (C) 2011 by Philippe Faist
5  * philippe.faist at bluewin.ch
6  * *
7  * This program is free software; you can redistribute it and/or modify *
8  * it under the terms of the GNU General Public License as published by *
9  * the Free Software Foundation; either version 2 of the License, or *
10  * (at your option) any later version. *
11  * *
12  * This program is distributed in the hope that it will be useful, *
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15  * GNU General Public License for more details. *
16  * *
17  * You should have received a copy of the GNU General Public License *
18  * along with this program; if not, write to the *
19  * Free Software Foundation, Inc., *
20  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
21  ***************************************************************************/
22 /* $Id: klfconfig.cpp 897 2014-07-28 22:21:48Z phfaist $ */
23 
24 #include <iostream>
25 
26 #include <QApplication>
27 #include <QMessageBox>
28 #include <QObject>
29 #include <QDir>
30 #include <QTextStream>
31 #include <QFont>
32 #include <QFontDatabase>
33 #include <QMap>
34 #include <QString>
35 #include <QListView> // icon view flow
36 #include <QLocale>
37 #include <QDesktopServices> // "My Documents" or "Documents" directory
38 
39 #include <klfmainwin.h>
40 
41 #include <klfutil.h>
42 #include "klfmain.h"
43 #include "klfconfig.h"
44 
45 
46 static const char * __klf_fallback_share_dir =
47 #if defined(Q_OS_WIN32) || defined(Q_OS_WIN64) // windows
48  ".."; // note: program is in a bin/ directory by default (this is for nsis-installer)
49 #elif defined(Q_OS_MAC) || defined(Q_OS_DARWIN) // Mac OS X
50  "../Resources";
51 #else // unix-like system
52  "../share/klatexformula";
53 #endif
54 
55 
56 static const char * __klf_share_dir =
57 #ifdef KLF_SHARE_DIR // defined by the build system
58  KLF_SHARE_DIR;
59 #else
60  NULL;
61 #endif
62 
64 
66 {
67  if (!__klf_share_dir_cached.isEmpty())
68  return __klf_share_dir_cached;
69 
70  klfDbg(klfFmtCC("cmake-share-dir=%s; fallback-share-dir=%s\n", __klf_share_dir,
72 
73  QString sharedir;
74  if (__klf_share_dir != NULL)
75  sharedir = QLatin1String(__klf_share_dir);
76  else
78 
79  __klf_share_dir_cached = klfPrefixedPath(sharedir); // prefixed by app-dir-path
80  klfDbg("share dir is "<<__klf_share_dir_cached) ;
82 }
83 
84 
85 
86 // global variable to access our config
87 // remember to initialize it in main() in main.cpp !
89 
90 
91 
92 /*void settings_write_QTextCharFormat(QSettings& s, const QString& basename,
93  const QTextCharFormat& charfmt)
94  {
95  s.setValue(basename+"_charformat", charfmt);
96  }
97 */
99  const QTextCharFormat& dflt)
100 {
101  QVariant val = s.value(basename+"_charformat", dflt);
102  QTextFormat tf = val.value<QTextFormat>();
103  return tf.toCharFormat();
104 }
105 /*
106  template<class T>
107  void settings_write_list(QSettings& s, const QString& basename, const QList<T>& list)
108  {
109  QList<QVariant> l;
110  int k;
111  for (k = 0; k < list.size(); ++k)
112  l.append(QVariant(list[k]));
113  s.setValue(basename+"_list", l);
114  }
115 */
116 
117 template<class T>
118 static QList<T> settings_read_list(QSettings& s, const QString& basename, const QList<T>& dflt)
119 {
120  QList<QVariant> l = s.value(basename+"_list", QList<QVariant>()).toList();
121  if (l.size() == 0)
122  return dflt;
123  QList<T> list;
124  int k;
125  for (k = 0; k < l.size(); ++k)
126  list.append(l[k].value<T>());
127  return list;
128 }
129 
130 
131 // -----------------------------------------------------
132 
133 
135 {
136 }
137 
138 
139 #define KLFCONFIG_TEST_FIXED_FONT(found_fcode, fdb, fcode, f, fps) \
140  if (!found_fcode && fdb.isFixedPitch(f)) { \
141  fcode = QFont(f, fps); \
142  found_fcode = true; \
143  }
144 
145 /*static int adjust_font_size(QFont f, int idealMXHeightPx)
146 {
147  // idealMXHeightPx is the ideal height of the string "MX" in pixels.
148  int ps = QFontInfo(f).pointSize();
149  / * // start with a little bit smaller font
150  ps -= 3;
151  const int cutoff = 20; //just a cutoff to be sure
152  // and increase font size up to something "ideal"
153  while (ps < cutoff && QFontMetrics(f).size(Qt::TextSingleLine, "MX").height() < idealMXHeightPx) {
154  f.setPointSize(++ps);
155  klfDbg(f.family()<<": Will try instead with font size="<<ps) ;
156  }
157  if (ps >= cutoff)
158  ps = 10; // the default point size in bad case scenario
159  * /
160 
161  return ps;
162 }*/
163 
164 
166 {
168 
169  homeConfigDir = QDir::homePath() + "/.klatexformula";
171  homeConfigSettingsFile = homeConfigDir + "/klatexformula.conf";
173  homeConfigDirRCCResources = homeConfigDir + "/rccresources";
174  homeConfigDirPlugins = homeConfigDir + "/plugins";
175  homeConfigDirPluginData = homeConfigDir + "/plugindata";
176  homeConfigDirI18n = homeConfigDir + "/i18n";
177 
178  //debug: QMessageBox::information(0, "", QString("global share dir=")+globalShareDir);
179 
180  if (qApp->inherits("QApplication")) { // and not QCoreApplication...
181 
182  QFontDatabase fdb;
184  int fps = QFontInfo(f).pointSize();
185 #if defined(Q_WS_X11)
186  double cmuffactor = 1.4;
187  double codeffactor = 1.4;
188 #elif defined(Q_WS_WIN)
189  double cmuffactor = 1.3;
190  double codeffactor = 1.3;
191 #else // mac OS X
192  double cmuffactor = 1.25;
193  double codeffactor = 1.3;
194 #endif
195  int cmufpsfinal = (int)(fps*cmuffactor+0.5);
196  int codefpsfinal = (int)(fps*codeffactor+0.5);
197 
198  defaultStdFont = f;
199 
200  //printf("CMU: %d * %f = %f --> %d\n", fps, cmuffactor, fps*cmuffactor, cmufpsfinal);
201  //printf("Code: %d * %f = %f --> %d\n", fps, codeffactor, fps*codeffactor, codefpsfinal);
202 
203  QFont cmuappfont = f;
204 #ifdef Q_WS_MAC
205  if (fdb.families().contains("CMU Bright")) {
206  // CMU Sans Serif is available ;-)
207  cmuappfont = QFont("CMU Bright", cmufpsfinal);
208  }
209 #else
210  if (fdb.families().contains("CMU Sans Serif")) {
211  // CMU Sans Serif is available ;-)
212  cmuappfont = QFont("CMU Sans Serif", cmufpsfinal);
213  }
214 #endif
215 
216  QFont fcode;
217  bool found_fcode = false;
218  int ps = codefpsfinal;
219  KLFCONFIG_TEST_FIXED_FONT(found_fcode, fdb, fcode, "Courier 10 Pitch", ps);
220  KLFCONFIG_TEST_FIXED_FONT(found_fcode, fdb, fcode, "ETL Fixed", ps);
221  KLFCONFIG_TEST_FIXED_FONT(found_fcode, fdb, fcode, "Courier New", ps);
222  KLFCONFIG_TEST_FIXED_FONT(found_fcode, fdb, fcode, "Efont Fixed", ps);
223  KLFCONFIG_TEST_FIXED_FONT(found_fcode, fdb, fcode, "Adobe Courier", ps);
224  KLFCONFIG_TEST_FIXED_FONT(found_fcode, fdb, fcode, "Courier", ps);
225  KLFCONFIG_TEST_FIXED_FONT(found_fcode, fdb, fcode, "Misc Fixed", ps);
226  KLFCONFIG_TEST_FIXED_FONT(found_fcode, fdb, fcode, "Monospace", ps);
227  if ( ! found_fcode )
228  fcode = f;
229  /* // guess good font size for code font
230 #ifdef Q_WS_X11
231  int fcodeIdealHeight = 20; // the ideal height of the string "MX" in pixels
232 #else
233  int fcodeIdealHeight = 18; // the ideal height of the string "MX" in pixels
234 #endif
235 // #if QT_VERSION < 0x040500
236 // fcodeIdealHeight += 2; // fix for Qt 4.4
237 // #endif
238  ps = adjust_font_size(fcode, fcodeIdealHeight);
239  fcode.setPointSize(ps);*/
240  QFont fcodeMain = fcode;
241  fcodeMain.setPointSize(ps+1);
242 
243  // by default, this is first run!
244  Core.thisVersionMajFirstRun = true;
245  Core.thisVersionMajMinFirstRun = true;
246  Core.thisVersionMajMinRelFirstRun = true;
247  Core.thisVersionExactFirstRun = true;
248 
249  Core.libraryFileName = "library.klf.db";
250  Core.libraryLibScheme = "klf+sqlite";
251 
252  defaultCMUFont = cmuappfont;
253  defaultTTFont = fcode;
254 
255  UI.locale = QLocale::system().name();
256  klfDbg("System locale: "<<QLocale::system().name());
257 #ifdef KLF_NO_CMU_FONT
258  UI.useSystemAppFont = true;
259  UI.applicationFont = defaultStdFont;
260 #else
261  UI.useSystemAppFont = false;
262  UI.applicationFont = cmuappfont;
263 #endif
264  UI.latexEditFont = fcodeMain;
265  UI.preambleEditFont = fcode;
266  UI.previewTooltipMaxSize = QSize(800, 600);
267  UI.labelOutputFixedSize = QSize(280, 80);
268  UI.lastSaveDir = QDir::homePath();
269  UI.symbolsPerLine = 6;
270  UI.userColorList = QList<QColor>();
271  UI.userColorList.append(QColor(0,0,0));
272  UI.userColorList.append(QColor(255,255,255));
273  UI.userColorList.append(QColor(170,0,0));
274  UI.userColorList.append(QColor(0,0,128));
275  UI.userColorList.append(QColor(0,0,255));
276  UI.userColorList.append(QColor(0,85,0));
277  UI.userColorList.append(QColor(255,85,0));
278  UI.userColorList.append(QColor(0,255,255));
279  UI.userColorList.append(QColor(85,0,127));
280  UI.userColorList.append(QColor(128,255,255));
281  UI.colorChooseWidgetRecent = QList<QColor>();
282  UI.colorChooseWidgetCustom = QList<QColor>();
283  UI.maxUserColors = 12;
284  UI.enableToolTipPreview = false;
285  UI.enableRealTimePreview = true;
286  UI.autosaveLibraryMin = 5;
287  UI.showHintPopups = true;
288  UI.clearLatexOnly = false;
289  UI.copyExportProfile = "default";
290  UI.dragExportProfile = "default";
291  UI.glowEffect = false;
292  UI.glowEffectColor = QColor(128, 255, 128, 12);
293  UI.glowEffectRadius = 4;
294  UI.customMathModes = QStringList();
295  UI.showExportProfilesLabel = true;
296  UI.menuExportProfileAffectsDrag = true;
297  UI.menuExportProfileAffectsCopy = true;
298 
299  SyntaxHighlighter.configFlags = 0x05;
300  SyntaxHighlighter.fmtKeyword = QTextCharFormat();
301  SyntaxHighlighter.fmtKeyword.setForeground(QColor(0, 0, 128));
302  SyntaxHighlighter.fmtComment = QTextCharFormat();
303  SyntaxHighlighter.fmtComment.setForeground(QColor(180, 0, 0));
304  SyntaxHighlighter.fmtComment.setFontItalic(true);
305  SyntaxHighlighter.fmtParenMatch = QTextCharFormat();
306  SyntaxHighlighter.fmtParenMatch.setBackground(QColor(180, 238, 180));
307  SyntaxHighlighter.fmtParenMismatch = QTextCharFormat();
308  SyntaxHighlighter.fmtParenMismatch.setBackground(QColor(255, 20, 147));
309  SyntaxHighlighter.fmtLonelyParen = QTextCharFormat();
310  SyntaxHighlighter.fmtLonelyParen.setForeground(QColor(255, 0, 255));
311  SyntaxHighlighter.fmtLonelyParen.setFontWeight(QFont::Bold);
312  }
313 
314  // invalid value, by convention ".". if the config is not read from file, then settings will
315  // be detected in detectMissingSettings()
316  BackendSettings.tempDir = ".";
317  BackendSettings.execLatex = ".";
318  BackendSettings.execDvips = ".";
319  BackendSettings.execGs = ".";
320  BackendSettings.execEpstopdf = ".";
321  BackendSettings.execenv = QStringList();
322 
323  BackendSettings.lborderoffset = 0;
324  BackendSettings.tborderoffset = 0;
325  BackendSettings.rborderoffset = 0;
326  BackendSettings.bborderoffset = 0;
327  BackendSettings.outlineFonts = true;
328 
329  LibraryBrowser.colorFound = QColor(128, 255, 128);
330  LibraryBrowser.colorNotFound = QColor(255, 128, 128);
331  LibraryBrowser.restoreURLs = false;
332  LibraryBrowser.confirmClose = true;
333  LibraryBrowser.groupSubCategories = true;
334  LibraryBrowser.iconViewFlow = QListView::TopToBottom;
335  LibraryBrowser.historyTagCopyToArchive = true;
336  LibraryBrowser.lastFileDialogPath = // "My Documents":
337  QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation);
338  LibraryBrowser.treePreviewSizePercent = 75;
339  LibraryBrowser.listPreviewSizePercent = 75;
340  LibraryBrowser.iconPreviewSizePercent = 100;
341 
343 }
344 
346 {
347  int neededsettings =
348  !BackendSettings.tempDir.compare(".") << 0 |
349  !BackendSettings.execLatex.compare(".") << 1 |
350  !BackendSettings.execDvips.compare(".") << 2 |
351  !BackendSettings.execGs.compare(".") << 3 |
352  !BackendSettings.execEpstopdf.compare(".") << 4 ;
353 
354  if (neededsettings) {
355  KLFBackend::klfSettings defaultsettings;
356  KLFBackend::detectSettings(&defaultsettings);
357  if (neededsettings & (1<<0))
358  BackendSettings.tempDir = defaultsettings.tempdir;
359  if (neededsettings & (1<<1))
360  BackendSettings.execLatex = defaultsettings.latexexec;
361  if (neededsettings & (1<<2))
362  BackendSettings.execDvips = defaultsettings.dvipsexec;
363  if (neededsettings & (1<<3))
364  BackendSettings.execGs = defaultsettings.gsexec;
365  if (neededsettings & (1<<4))
366  BackendSettings.execEpstopdf = defaultsettings.epstopdfexec;
367  BackendSettings.execenv << defaultsettings.execenv;
368  }
369 
370 }
371 
372 
373 
375 {
376  if ( !klfEnsureDir(homeConfigDir) )
377  return -1;
379  return -1;
381  return -1;
383  return -1;
385  return -1;
386 
387  return 0;
388 }
389 
390 
392 {
393  return QFileInfo(BackendSettings.execLatex).isExecutable() &&
394  QFileInfo(BackendSettings.execDvips).isExecutable() &&
396  ( BackendSettings.execEpstopdf.isEmpty() ||
397  QFileInfo(BackendSettings.execEpstopdf).isExecutable()) ;
398 }
399 
400 
401 
402 
404 {
405  klfDbgT(" reading config.") ;
406 
408 
409  QString globalconfig = globalShareDir+"/klatexformula.conf";
410  klfDbg("Testing for global config file "<<globalconfig);
411  if (QFile::exists(globalconfig)) {
412  klfDbg("Reading configuration from "<<globalconfig);
413  // pre-load global settings
414  readFromConfig_v2(globalconfig);
415  }
416 
418  klfDbg("Reading configuration from "<<homeConfigSettingsFile<<" ...");
419  return readFromConfig_v2(homeConfigSettingsFile);
420  }
422  return readFromConfig_v1();
423  }
424 
425  return -1;
426 }
427 
428 template<class T>
429 static void klf_config_read(QSettings &s, const QString& baseName, T *target,
430  const char * listOrMapType = NULL)
431 {
432  // qDebug("klf_config_read<...>(%s)", qPrintable(baseName));
433  QVariant defVal = QVariant::fromValue<T>(*target);
434  QVariant valstrv = s.value(baseName, QVariant());
435  // klfDbg( "\tRead value "<<valstr ) ;
436  if (valstrv.isNull()) {
437  // no such entry in config
438  klfDbg("No entry "<<baseName<<" in config.") ;
439  return;
440  }
441  QString valstr = valstrv.toString();
442  QVariant val = klfLoadVariantFromText(valstr.toLatin1(), defVal.typeName(), listOrMapType);
443  if (val.isValid())
444  *target = val.value<T>();
445 }
446 template<>
448  QTextCharFormat *target,
449  const char * /*listOrMapType*/)
450 {
451  qDebug("klf_config_read<QTextCharFormat>(%s)", qPrintable(baseName));
452  QTextFormat fmt = *target;
453  klf_config_read(s, baseName, &fmt);
454  *target = fmt.toCharFormat();
455 }
456 
457 template<class T>
458 static void klf_config_read_list(QSettings &s, const QString& baseName, QList<T> *target)
459 {
460  QVariantList vlist = klfListToVariantList(*target);
461  klf_config_read(s, baseName, &vlist, QVariant::fromValue<T>(T()).typeName());
462  *target = klfVariantListToList<T>(vlist);
463 }
464 
465 
466 template<class T>
467 static void klf_config_write(QSettings &s, const QString& baseName, const T * value)
468 {
469  QVariant val = QVariant::fromValue<T>(*value);
470  QByteArray datastr = klfSaveVariantToText(val);
471  s.setValue(baseName, QVariant::fromValue<QString>(QString::fromLocal8Bit(datastr)));
472 }
473 
474 template<class T>
475 static void klf_config_write_list(QSettings &s, const QString& baseName, const QList<T> * target)
476 {
477  QVariantList vlist = klfListToVariantList(*target);
478  klf_config_write(s, baseName, &vlist);
479 }
480 
482 {
483  QString s = QString("versionFirstRun-%1_").arg(N);
484  if (N >= 4)
485  return s + QLatin1String(KLF_VERSION_STRING);
486 
487  if (N-- > 0)
488  s += QString("%1").arg(KLF_VERSION_MAJ);
489  if (N-- > 0)
490  s += QString(".%1").arg(KLF_VERSION_MIN);
491  if (N-- > 0)
492  s += QString(".%1").arg(KLF_VERSION_REL);
493  return s;
494 }
495 
496 int KLFConfig::readFromConfig_v2(const QString& fname)
497 {
498  KLF_DEBUG_TIME_BLOCK(KLF_FUNC_NAME) ;
499 
500  QSettings s(fname, QSettings::IniFormat);
501 
502  qDebug("Reading base configuration");
503 
504  s.beginGroup("Core");
505  klf_config_read(s, firstRunConfigKey(1), &Core.thisVersionMajFirstRun);
506  klf_config_read(s, firstRunConfigKey(2), &Core.thisVersionMajMinFirstRun);
507  klf_config_read(s, firstRunConfigKey(3), &Core.thisVersionMajMinRelFirstRun);
508  klf_config_read(s, firstRunConfigKey(4), &Core.thisVersionExactFirstRun);
509  klf_config_read(s, "libraryfilename", &Core.libraryFileName);
510  klf_config_read(s, "librarylibscheme", &Core.libraryLibScheme);
511  s.endGroup();
512 
513  s.beginGroup("UI");
514  klf_config_read(s, "locale", &UI.locale);
515  klf_config_read(s, "usesystemfont", &UI.useSystemAppFont);
516  klf_config_read(s, "applicationfont", &UI.applicationFont);
517  klf_config_read(s, "latexeditfont", &UI.latexEditFont);
518  klf_config_read(s, "preambleeditfont", &UI.preambleEditFont);
519  klf_config_read(s, "previewtooltipmaxsize", &UI.previewTooltipMaxSize);
520  klf_config_read(s, "lbloutputfixedsize", &UI.labelOutputFixedSize);
521  klf_config_read(s, "lastsavedir", &UI.lastSaveDir);
522  klf_config_read(s, "symbolsperline", &UI.symbolsPerLine);
523  klf_config_read_list(s, "usercolorlist", &UI.userColorList);
524  klf_config_read_list(s, "colorchoosewidgetrecent", &UI.colorChooseWidgetRecent);
525  klf_config_read_list(s, "colorchoosewidgetcustom", &UI.colorChooseWidgetCustom);
526  klf_config_read(s, "maxusercolors", &UI.maxUserColors);
527  klf_config_read(s, "enabletooltippreview", &UI.enableToolTipPreview);
528  klf_config_read(s, "enablerealtimepreview", &UI.enableRealTimePreview);
529  klf_config_read(s, "autosavelibrarymin", &UI.autosaveLibraryMin);
530  klf_config_read(s, "showhintpopups", &UI.showHintPopups);
531  klf_config_read(s, "clearlatexonly", &UI.clearLatexOnly);
532  klf_config_read(s, "copyexportprofile", &UI.copyExportProfile);
533  klf_config_read(s, "dragexportprofile", &UI.dragExportProfile);
534  klf_config_read(s, "gloweffect", &UI.glowEffect);
535  klf_config_read(s, "gloweffectcolor", &UI.glowEffectColor);
536  klfDbg("Read glow effect color from config: color="<<UI.glowEffectColor
537  <<", alpha="<<UI.glowEffectColor.alpha());
538  klf_config_read(s, "gloweffectradius", &UI.glowEffectRadius);
539  klf_config_read(s, "custommathmodes", &UI.customMathModes);
540  klf_config_read(s, "showexportprofileslabel", &UI.showExportProfilesLabel);
541  klf_config_read(s, "menuexportprofileaffectsdrag", &UI.menuExportProfileAffectsDrag);
542  klf_config_read(s, "menuexportprofileaffectscopy", &UI.menuExportProfileAffectsCopy);
543  s.endGroup();
544 
545  s.beginGroup("SyntaxHighlighter");
546  klf_config_read(s, "configflags", &SyntaxHighlighter.configFlags);
547  klf_config_read<QTextCharFormat>(s, "keyword", &SyntaxHighlighter.fmtKeyword);
548  klf_config_read<QTextCharFormat>(s, "comment", &SyntaxHighlighter.fmtComment);
549  klf_config_read<QTextCharFormat>(s, "parenmatch", &SyntaxHighlighter.fmtParenMatch);
550  klf_config_read<QTextCharFormat>(s, "parenmismatch", &SyntaxHighlighter.fmtParenMismatch);
551  klf_config_read<QTextCharFormat>(s, "lonelyparen", &SyntaxHighlighter.fmtLonelyParen);
552  s.endGroup();
553 
554  s.beginGroup("BackendSettings");
555  klf_config_read(s, "tempdir", &BackendSettings.tempDir);
556  klf_config_read(s, "latexexec", &BackendSettings.execLatex);
557  klf_config_read(s, "dvipsexec", &BackendSettings.execDvips);
558  klf_config_read(s, "gsexec", &BackendSettings.execGs);
559  klf_config_read(s, "epstopdfexec", &BackendSettings.execEpstopdf);
560  klf_config_read(s, "execenv", &BackendSettings.execenv);
561  klf_config_read(s, "lborderoffset", &BackendSettings.lborderoffset);
562  klf_config_read(s, "tborderoffset", &BackendSettings.tborderoffset);
563  klf_config_read(s, "rborderoffset", &BackendSettings.rborderoffset);
564  klf_config_read(s, "bborderoffset", &BackendSettings.bborderoffset);
565  klf_config_read(s, "outlinefonts", &BackendSettings.outlineFonts);
566  s.endGroup();
567 
568  s.beginGroup("LibraryBrowser");
569  klf_config_read(s, "colorfound", &LibraryBrowser.colorFound);
570  klf_config_read(s, "colornotfound", &LibraryBrowser.colorNotFound);
571  klf_config_read(s, "restoreurls", &LibraryBrowser.restoreURLs);
572  klf_config_read(s, "confirmclose", &LibraryBrowser.confirmClose);
573  klf_config_read(s, "groupsubcategories", &LibraryBrowser.groupSubCategories);
574  klf_config_read(s, "iconviewflow", &LibraryBrowser.iconViewFlow);
575  klf_config_read(s, "historytagcopytoarchive", &LibraryBrowser.historyTagCopyToArchive);
576  klf_config_read(s, "lastfiledialogpath", &LibraryBrowser.lastFileDialogPath);
577  klf_config_read(s, "treepreviewsizepercent", &LibraryBrowser.treePreviewSizePercent);
578  klf_config_read(s, "listpreviewsizepercent", &LibraryBrowser.listPreviewSizePercent);
579  klf_config_read(s, "iconpreviewsizepercent", &LibraryBrowser.iconPreviewSizePercent);
580  s.endGroup();
581 
582  // Special treatment for Plugins.pluginConfig
583  // for reading, we cannot rely on klf_plugins since we are called before plugins are loaded!
584  int k, j;
585  QDir plugindatadir = QDir(homeConfigDirPluginData);
586  QStringList plugindirs = plugindatadir.entryList(QDir::Dirs);
587  for (k = 0; k < plugindirs.size(); ++k) {
588  if (plugindirs[k] == "." || plugindirs[k] == "..")
589  continue;
590  qDebug("Reading config for plugin %s", qPrintable(plugindirs[k]));
591  QString fn = plugindatadir.absoluteFilePath(plugindirs[k])+"/"+plugindirs[k]+".conf";
592  if ( ! QFile::exists(fn) ) {
593  qDebug("\tskipping plugin %s since the file %s does not exist.",
594  qPrintable(plugindirs[k]), qPrintable(fn));
595  continue;
596  }
597  QSettings psettings(fn, QSettings::IniFormat);
598  QVariantMap pconfmap;
599  QStringList keys = psettings.allKeys();
600  for (j = 0; j < keys.size(); ++j) {
601  pconfmap[keys[j]] = psettings.value(keys[j]);
602  }
603  Plugins.pluginConfig[plugindirs[k]] = pconfmap;
604  }
605 
606  // POST-CONFIG-READ SETUP
607 
608  // forbid empty locale
609  if (klfconfig.UI.locale.isEmpty())
610  klfconfig.UI.locale = "en_US";
611  // set Qt default locale to ours
612  QLocale::setDefault(klfconfig.UI.locale);
613 
614  return 0;
615 }
616 
617 
619 {
621  QSettings s(homeConfigSettingsFile, QSettings::IniFormat);
622 
623  bool thisVersionFirstRunFalse = false;
624 
625  s.beginGroup("Core");
626  klf_config_write(s, firstRunConfigKey(1), &thisVersionFirstRunFalse);
627  klf_config_write(s, firstRunConfigKey(2), &thisVersionFirstRunFalse);
628  klf_config_write(s, firstRunConfigKey(3), &thisVersionFirstRunFalse);
629  klf_config_write(s, firstRunConfigKey(4), &thisVersionFirstRunFalse);
630  klf_config_write(s, "libraryfilename", &Core.libraryFileName);
631  klf_config_write(s, "librarylibscheme", &Core.libraryLibScheme);
632  s.endGroup();
633 
634  s.beginGroup("UI");
635  klf_config_write(s, "locale", &UI.locale);
636  klf_config_write(s, "usesystemfont", &UI.useSystemAppFont);
637  klf_config_write(s, "applicationfont", &UI.applicationFont);
638  klf_config_write(s, "latexeditfont", &UI.latexEditFont);
639  klf_config_write(s, "preambleeditfont", &UI.preambleEditFont);
640  klf_config_write(s, "previewtooltipmaxsize", &UI.previewTooltipMaxSize);
641  klf_config_write(s, "lbloutputfixedsize", &UI.labelOutputFixedSize);
642  klf_config_write(s, "lastsavedir", &UI.lastSaveDir);
643  klf_config_write(s, "symbolsperline", &UI.symbolsPerLine);
644  klf_config_write_list(s, "usercolorlist", &UI.userColorList);
645  klf_config_write_list(s, "colorchoosewidgetrecent", &UI.colorChooseWidgetRecent);
646  klf_config_write_list(s, "colorchoosewidgetcustom", &UI.colorChooseWidgetCustom);
647  klf_config_write(s, "maxusercolors", &UI.maxUserColors);
648  klf_config_write(s, "enabletooltippreview", &UI.enableToolTipPreview);
649  klf_config_write(s, "enablerealtimepreview", &UI.enableRealTimePreview);
650  klf_config_write(s, "autosavelibrarymin", &UI.autosaveLibraryMin);
651  klf_config_write(s, "showhintpopups", &UI.showHintPopups);
652  klf_config_write(s, "clearlatexonly", &UI.clearLatexOnly);
653  klf_config_write(s, "copyexportprofile", &UI.copyExportProfile);
654  klf_config_write(s, "dragexportprofile", &UI.dragExportProfile);
655  klf_config_write(s, "gloweffect", &UI.glowEffect);
656  klf_config_write(s, "gloweffectcolor", &UI.glowEffectColor);
657  klf_config_write(s, "gloweffectradius", &UI.glowEffectRadius);
658  klf_config_write(s, "custommathmodes", &UI.customMathModes);
659  klf_config_write(s, "showexportprofileslabel", &UI.showExportProfilesLabel);
660  klf_config_write(s, "menuexportprofileaffectsdrag", &UI.menuExportProfileAffectsDrag);
661  klf_config_write(s, "menuexportprofileaffectscopy", &UI.menuExportProfileAffectsCopy);
662  s.endGroup();
663 
664  s.beginGroup("SyntaxHighlighter");
665  klf_config_write(s, "configflags", &SyntaxHighlighter.configFlags);
666  klf_config_write<QTextFormat>(s, "keyword", &SyntaxHighlighter.fmtKeyword);
667  klf_config_write<QTextFormat>(s, "comment", &SyntaxHighlighter.fmtComment);
668  klf_config_write<QTextFormat>(s, "parenmatch", &SyntaxHighlighter.fmtParenMatch);
669  klf_config_write<QTextFormat>(s, "parenmismatch", &SyntaxHighlighter.fmtParenMismatch);
670  klf_config_write<QTextFormat>(s, "lonelyparen", &SyntaxHighlighter.fmtLonelyParen);
671  s.endGroup();
672 
673  s.beginGroup("BackendSettings");
674  klf_config_write(s, "tempdir", &BackendSettings.tempDir);
675  klf_config_write(s, "latexexec", &BackendSettings.execLatex);
676  klf_config_write(s, "dvipsexec", &BackendSettings.execDvips);
677  klf_config_write(s, "gsexec", &BackendSettings.execGs);
678  klf_config_write(s, "epstopdfexec", &BackendSettings.execEpstopdf);
679  klf_config_write(s, "execenv", &BackendSettings.execenv);
680  klf_config_write(s, "lborderoffset", &BackendSettings.lborderoffset);
681  klf_config_write(s, "tborderoffset", &BackendSettings.tborderoffset);
682  klf_config_write(s, "rborderoffset", &BackendSettings.rborderoffset);
683  klf_config_write(s, "bborderoffset", &BackendSettings.bborderoffset);
684  klf_config_write(s, "outlinefonts", &BackendSettings.outlineFonts);
685  s.endGroup();
686 
687  s.beginGroup("LibraryBrowser");
688  klf_config_write(s, "colorfound", &LibraryBrowser.colorFound);
689  klf_config_write(s, "colornotfound", &LibraryBrowser.colorNotFound);
690  klf_config_write(s, "restoreurls", &LibraryBrowser.restoreURLs);
691  klf_config_write(s, "confirmclose", &LibraryBrowser.confirmClose);
692  klf_config_write(s, "groupsubcategories", &LibraryBrowser.groupSubCategories);
693  klf_config_write(s, "iconviewflow", &LibraryBrowser.iconViewFlow);
694  klf_config_write(s, "historytagcopytoarchive", &LibraryBrowser.historyTagCopyToArchive);
695  klf_config_write(s, "lastfiledialogpath", &LibraryBrowser.lastFileDialogPath);
696  klf_config_write(s, "treepreviewsizepercent", &LibraryBrowser.treePreviewSizePercent);
697  klf_config_write(s, "listpreviewsizepercent", &LibraryBrowser.listPreviewSizePercent);
698  klf_config_write(s, "iconpreviewsizepercent", &LibraryBrowser.iconPreviewSizePercent);
699  s.endGroup();
700 
701  // Special treatment for Plugins.pluginConfig
702  int k;
703  for (k = 0; k < klf_plugins.size(); ++k) {
704  QString fn = homeConfigDirPluginData+"/"+klf_plugins[k].name+"/"+klf_plugins[k].name+".conf";
705  QSettings psettings(fn, QSettings::IniFormat);
706  QVariantMap pconfmap = Plugins.pluginConfig[klf_plugins[k].name];
707  QVariantMap::const_iterator it;
708  for (it = pconfmap.begin(); it != pconfmap.end(); ++it) {
709  psettings.setValue(it.key(), it.value());
710  }
711  psettings.sync();
712  }
713 
714  s.sync();
715  return 0;
716 }
717 
718 
719 
720 
722 {
723  KLF_DEBUG_BLOCK(KLF_FUNC_NAME) ; klfDbg("... for plugin: "<<name) ;
724  return KLFPluginConfigAccess(this, name);
725 }
726 
727 
728 // --------------------------------------
729 
730 
731 
732 
734 {
735  _config = NULL;
736  _pluginname = QString::null;
737 }
739  : _config(other._config), _pluginname(other._pluginname)
740 {
741  klfDbg("made copy. _config="<<_config<<"; _pluginname="<<_pluginname) ;
742  if (_config != NULL) {
743  klfDbg("_config->homeConfigDir: "<<_config->homeConfigDir) ;
744  }
745 }
747 {
748 }
749 
751 {
752  _config = configObject;
753  _pluginname = pluginName;
754 
755  klfDbg("_config="<<_config<<", _pluginname="<<_pluginname) ;
756  if (_config != NULL) {
757  klfDbg("_config->homeConfigDir: "<<_config->homeConfigDir) ;
758  }
759 }
760 
761 
762 
764 {
765  if ( _config == NULL ) {
766  qWarning("KLFPluginConfigAccess::homeConfigDir: Invalid Config Pointer!\n");
767  return QString();
768  }
769  klfDbg("_config->homeConfigDir="<<_config->homeConfigDir) ;
770  return _config->homeConfigDir;
771 }
772 
774 {
775  if ( _config == NULL ) {
776  qWarning("KLFPluginConfigAccess::homeConfigDir: Invalid Config Pointer!\n");
777  return QString();
778  }
779 
780  return _config->globalShareDir;
781 }
782 
784 {
785  if ( _config == NULL ) {
786  qWarning("KLFPluginConfigAccess::tempDir: Invalid Config Pointer!\n");
787  return QString();
788  }
789 
790  return _config->BackendSettings.tempDir;
791 }
792 
794 {
795  if ( _config == NULL ) {
796  qWarning("KLFPluginConfigAccess::homeConfigPluginDataDir: Invalid Config Pointer!\n");
797  return QString();
798  }
799  klfDbg("_config->homeConfigDirPluginData is "<<_config->homeConfigDirPluginData) ;
800 
801  QString d = _config->homeConfigDirPluginData + "/" + _pluginname;
802  if ( createIfNeeded && ! klfEnsureDir(d) ) {
803  qWarning("KLFPluginConfigAccess::homeConfigPluginDataDir: Can't create directory: `%s'",
804  qPrintable(d));
805  return QString();
806  }
807  return d;
808 }
809 
811 {
812  if ( _config == NULL ) {
813  qWarning("KLFPluginConfigAccess::readValue: Invalid Config Pointer!\n");
814  return QVariant();
815  }
816 
817  if ( ! _config->Plugins.pluginConfig[_pluginname].contains(key) )
818  return QVariant();
819 
820  return _config->Plugins.pluginConfig[_pluginname][key];
821 }
822 
824 {
825  if ( _config == NULL ) {
826  qWarning("KLFPluginConfigAccess::makeDefaultValue: Invalid Config Pointer!\n");
827  return QVariant();
828  }
829 
830  if (_config->Plugins.pluginConfig[_pluginname].contains(key))
831  return _config->Plugins.pluginConfig[_pluginname][key];
832 
833  // assign the value into the plugin config, and return it
834  return ( _config->Plugins.pluginConfig[_pluginname][key] = defaultValue );
835 }
836 void KLFPluginConfigAccess::writeValue(const QString& key, const QVariant& value)
837 {
838  if ( _config == NULL ) {
839  qWarning("KLFPluginConfigAccess::writeValue: Invalid Config Pointer!\n");
840  return;
841  }
842 
843  _config->Plugins.pluginConfig[_pluginname][key] = value;
844 }
845 
846 
847 
848 
849 
850 
851 
852 
853 // ----------------------
854 
855 
856 
857 
858 
859 
860 
861 
862 
863 // KEPT FOR COMPATIBILITY WITH OLDER VERSIONS
864 
865 int KLFConfig::readFromConfig_v1()
866 {
867  QSettings s(homeConfigSettingsFileIni, QSettings::IniFormat);
868 
869  s.beginGroup("UI");
870  UI.locale = s.value("locale", UI.locale).toString();
871  // ingnore KLF 3.1 app font setting, we have our nice CMU Sans Serif font ;-)
872  // UI.applicationFont = s.value("applicationfont", UI.applicationFont).value<QFont>();
873  UI.latexEditFont = s.value("latexeditfont", UI.latexEditFont).value<QFont>();
874  UI.preambleEditFont = s.value("preambleeditfont", UI.preambleEditFont).value<QFont>();
875  UI.previewTooltipMaxSize = s.value("previewtooltipmaxsize", UI.previewTooltipMaxSize).toSize();
876  UI.labelOutputFixedSize = s.value("lbloutputfixedsize", UI.labelOutputFixedSize ).toSize();
877  UI.lastSaveDir = s.value("lastsavedir", UI.lastSaveDir).toString();
878  UI.symbolsPerLine = s.value("symbolsperline", UI.symbolsPerLine).toInt();
879  UI.userColorList = settings_read_list(s, "usercolorlist", UI.userColorList);
880  UI.colorChooseWidgetRecent = settings_read_list(s, "colorchoosewidgetrecent", UI.colorChooseWidgetRecent);
881  UI.colorChooseWidgetCustom = settings_read_list(s, "colorchoosewidgetcustom", UI.colorChooseWidgetCustom);
882  UI.maxUserColors = s.value("maxusercolors", UI.maxUserColors).toInt();
883  UI.enableToolTipPreview = s.value("enabletooltippreview", UI.enableToolTipPreview).toBool();
884  UI.enableRealTimePreview = s.value("enablerealtimepreview", UI.enableRealTimePreview).toBool();
885  UI.autosaveLibraryMin = s.value("autosavelibrarymin", UI.autosaveLibraryMin).toInt();
886  s.endGroup();
887 
888  s.beginGroup("SyntaxHighlighter");
889  SyntaxHighlighter.configFlags = s.value("configflags", SyntaxHighlighter.configFlags).toUInt();
890  SyntaxHighlighter.fmtKeyword = settings_read_QTextCharFormat(s, "keyword", SyntaxHighlighter.fmtKeyword);
891  SyntaxHighlighter.fmtComment = settings_read_QTextCharFormat(s, "comment", SyntaxHighlighter.fmtComment);
892  SyntaxHighlighter.fmtParenMatch = settings_read_QTextCharFormat(s, "parenmatch", SyntaxHighlighter.fmtParenMatch);
893  SyntaxHighlighter.fmtParenMismatch = settings_read_QTextCharFormat(s, "parenmismatch", SyntaxHighlighter.fmtParenMismatch);
894  SyntaxHighlighter.fmtLonelyParen = settings_read_QTextCharFormat(s, "lonelyparen", SyntaxHighlighter.fmtLonelyParen);
895  s.endGroup();
896 
897  s.beginGroup("BackendSettings");
898  BackendSettings.tempDir = s.value("tempdir", BackendSettings.tempDir).toString();
899  BackendSettings.execLatex = s.value("latexexec", BackendSettings.execLatex).toString();
900  BackendSettings.execDvips = s.value("dvipsexec", BackendSettings.execDvips).toString();
901  BackendSettings.execGs = s.value("gsexec", BackendSettings.execGs).toString();
902  BackendSettings.execEpstopdf = s.value("epstopdfexec", BackendSettings.execEpstopdf).toString();
903  BackendSettings.lborderoffset = s.value("lborderoffset", BackendSettings.lborderoffset).toInt();
904  BackendSettings.tborderoffset = s.value("tborderoffset", BackendSettings.tborderoffset).toInt();
905  BackendSettings.rborderoffset = s.value("rborderoffset", BackendSettings.rborderoffset).toInt();
906  BackendSettings.bborderoffset = s.value("bborderoffset", BackendSettings.bborderoffset).toInt();
907  s.endGroup();
908 
909  s.beginGroup("LibraryBrowser");
910  LibraryBrowser.colorFound = s.value("colorfound", LibraryBrowser.colorFound).value<QColor>();
911  LibraryBrowser.colorNotFound = s.value("colornotfound", LibraryBrowser.colorNotFound).value<QColor>();
912  s.endGroup();
913 
914  // Special treatment for Plugins.pluginConfig
915  s.beginGroup("Plugins/Config");
916  QStringList pluginList = s.childGroups();
917  s.endGroup();
918  int j;
919  for (j = 0; j < pluginList.size(); ++j) {
920  QString name = pluginList[j];
921  s.beginGroup( QString("Plugins/Config/%1").arg(name) );
922  QMap<QString,QVariant> thispluginconfig;
923  QStringList plconfkeys = s.childKeys();
924  int k;
925  for (k = 0; k < plconfkeys.size(); ++k) {
926  thispluginconfig[plconfkeys[k]] = s.value(plconfkeys[k]);
927  }
928  klfconfig.Plugins.pluginConfig[name] = thispluginconfig;
929  s.endGroup();
930  }
931 
932  return 0;
933 }
934 
virtual QVariant readValue(const QString &key) const
read a value in the config
Definition: klfconfig.cpp:810
static QString __klf_share_dir_cached
Definition: klfconfig.cpp:63
QFont defaultCMUFont
Definition: klfconfig.h:259
setPointSize(int pointSize)
QString locale
When setting this, don't forget to call QLocale::setDefault().
Definition: klfconfig.h:177
contains(const Key &key)
QFont defaultTTFont
Definition: klfconfig.h:263
QString homeConfigDirRCCResources
Definition: klfconfig.h:155
QMap< QString, QMap< QString, QVariant > > pluginConfig
Definition: klfconfig.h:254
#define klfDbgT(streamableItems)
KLFConfig klfconfig
Definition: klfconfig.cpp:88
bool checkExePaths()
Definition: klfconfig.cpp:391
struct KLFConfig::@1 UI
virtual ~KLFPluginConfigAccess()
Definition: klfconfig.cpp:746
arg(const QString &a, int fieldWidth=0, const QChar &fillChar=QLatin1Char( ' ')
#define klfDbg(streamableItems)
virtual QString homeConfigPluginDataDir(bool createIfNeeded=true) const
Definition: klfconfig.cpp:793
#define KLF_DEBUG_BLOCK(msg)
QString homeConfigDirI18n
Definition: klfconfig.h:158
QString tempDir
Definition: klfconfig.h:220
Utility class for plugins to access their configuration space in KLFConfig.
Definition: klfconfig.h:61
homePath()
KLF_EXPORT QString klfPrefixedPath(const QString &path, const QString &reference)
struct KLFConfig::@0 Core
value(int i)
QFont defaultStdFont
Definition: klfconfig.h:261
Structure that stores klatexformula's configuration in memory.
Definition: klfconfig.h:141
setValue(const QString &key, const QVariant &value)
static void klf_config_write(QSettings &s, const QString &baseName, const T *value)
Definition: klfconfig.cpp:467
fromLocal8Bit(const char *str, int size=-1)
append(const T &value)
int readFromConfig()
Definition: klfconfig.cpp:403
static void klf_config_read_list(QSettings &s, const QString &baseName, QList< T > *target)
Definition: klfconfig.cpp:458
KLF_EXPORT QVariant klfLoadVariantFromText(const QByteArray &stringdata, const char *dataTypeName, const char *listOrMapDataTypeName)
setDefault(const QLocale &locale)
entryList(const QStringList &nameFilters, Filters filters=NoFilter, SortFlags sort=NoSort)
QString homeConfigSettingsFileIni
OLD config file.
Definition: klfconfig.h:154
static void klf_config_write_list(QSettings &s, const QString &baseName, const QList< T > *target)
Definition: klfconfig.cpp:475
KLF_EXPORT bool klfEnsureDir(const QString &dir)
int ensureHomeConfigDir()
Definition: klfconfig.cpp:374
KLF_EXPORT QString klf_share_dir_abspath()
Definition: klfconfig.cpp:65
#define KLF_DEBUG_TIME_BLOCK(msg)
virtual QVariant makeDefaultValue(const QString &key, const QVariant &defaultValue)
write the value if inexistant in config
Definition: klfconfig.cpp:823
#define klfFmtCC
#define KLF_FUNC_NAME
struct KLFConfig::@2 SyntaxHighlighter
QList< KLFPluginInfo > klf_plugins
Definition: klfmain.cpp:50
struct KLFConfig::@3 BackendSettings
QString homeConfigDir
Definition: klfconfig.h:151
value(const QString &key, const QVariant &defaultValue=QVariant()
static const char * __klf_fallback_share_dir
Definition: klfconfig.cpp:46
QString homeConfigDirPluginData
Definition: klfconfig.h:157
void detectMissingSettings()
Definition: klfconfig.cpp:345
static void klf_config_read(QSettings &s, const QString &baseName, T *target, const char *listOrMapType=NULL)
Definition: klfconfig.cpp:429
families(WritingSystem writingSystem=Any)
int writeToConfig()
Definition: klfconfig.cpp:618
static QTextCharFormat settings_read_QTextCharFormat(QSettings &s, const QString &basename, const QTextCharFormat &dflt)
Definition: klfconfig.cpp:98
QVariantList klfListToVariantList(const QList< T > &list)
static const char * __klf_share_dir
Definition: klfconfig.cpp:56
static QString firstRunConfigKey(int N)
Definition: klfconfig.cpp:481
KLFPluginConfigAccess getPluginConfigAccess(const QString &name)
Definition: klfconfig.cpp:721
absoluteFilePath(const QString &fileName)
static QList< T > settings_read_list(QSettings &s, const QString &basename, const QList< T > &dflt)
Definition: klfconfig.cpp:118
KLF_EXPORT QByteArray klfSaveVariantToText(const QVariant &value, bool saveListAndMapsAsXML)
void loadDefaults()
Definition: klfconfig.cpp:165
QString globalShareDir
Definition: klfconfig.h:152
#define KLFCONFIG_TEST_FIXED_FONT(found_fcode, fdb, fcode, f, fps)
Definition: klfconfig.cpp:139
virtual QString tempDir() const
Definition: klfconfig.cpp:783
virtual void writeValue(const QString &key, const QVariant &value)
write a value to settings
Definition: klfconfig.cpp:836
virtual QString homeConfigDir() const
Definition: klfconfig.cpp:763
static bool detectSettings(klfSettings *settings, const QString &extraPath=QString())
struct KLFConfig::@4 LibraryBrowser
virtual QString globalShareDir() const
Definition: klfconfig.cpp:773
QString homeConfigSettingsFile
current (now, "new" klatexformula.conf) settings file
Definition: klfconfig.h:153
void klf_config_read< QTextCharFormat >(QSettings &s, const QString &baseName, QTextCharFormat *target, const char *)
Definition: klfconfig.cpp:447
struct KLFConfig::@5 Plugins
beginGroup(const QString &prefix)
QString homeConfigDirPlugins
Definition: klfconfig.h:156
value(const Key &key)

Generated by doxygen 1.8.7