PageRenderTime 26ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/ggap/prefsdialog.cpp

https://bitbucket.org/muntyan/ggap
C++ | 280 lines | 218 code | 56 blank | 6 comment | 33 complexity | ec4fc0ff93b309804a8303e4e91c1ac2 MD5 | raw file
Possible License(s): GPL-2.0, CC-BY-SA-3.0
  1. #include "ggap/prefsdialog.h"
  2. #include "ggap/prefsdialog-p.h"
  3. #include "ggap/gap.h"
  4. #include "ggap/wswindow.h"
  5. #include "ggap/help.h"
  6. #include "ui_prefs.h"
  7. #include "ggap/help-topics.h"
  8. #include <moo/debug.h>
  9. #include <QtGui>
  10. #include <QDir>
  11. using namespace ggap;
  12. QPointer<AdvancedPrefsDialog> AdvancedPrefsDialog::instance;
  13. ///////////////////////////////////////////////////////////////////////////
  14. // PrefsDialogBase
  15. //
  16. PrefsDialogBase::PrefsDialogBase(QWidget *parent) :
  17. NiceDialog(parent)
  18. {
  19. }
  20. void PrefsDialogBase::accept()
  21. {
  22. NiceDialog::accept();
  23. apply();
  24. }
  25. ///////////////////////////////////////////////////////////////////////////
  26. // PrefsDialog
  27. //
  28. struct PrefsDialog::Private {
  29. Ui::PrefsDialog ui;
  30. QFont worksheetFont;
  31. QFont helpFont;
  32. QString gapDir;
  33. QString gapExe;
  34. QString gapArgs;
  35. QStringList gapRoots;
  36. static QPointer<PrefsDialog> instance;
  37. };
  38. QPointer<PrefsDialog> PrefsDialog::Private::instance;
  39. PrefsDialog::PrefsDialog(QWidget *parent) :
  40. PrefsDialogBase(parent),
  41. priv(new Private)
  42. {
  43. priv->ui.setupUi(this);
  44. init();
  45. }
  46. PrefsDialog::~PrefsDialog()
  47. {
  48. delete priv;
  49. }
  50. void PrefsDialog::showDialog(QWidget *parent)
  51. {
  52. NiceDialog::showDialog(Private::instance, parent);
  53. }
  54. void PrefsDialog::execDialog(QWidget *parent)
  55. {
  56. showDialog(parent);
  57. Private::instance->exec();
  58. }
  59. void PrefsDialog::on_buttonAdvanced_clicked()
  60. {
  61. AdvancedPrefsDialog::showDialog(this);
  62. }
  63. static void setFontEntry(QLineEdit *entry, const QFont &font)
  64. {
  65. entry->setText(QString("%1, %2").arg(font.family()).arg(font.pointSize()));
  66. entry->setFont(font);
  67. }
  68. static QString norm_file_path(const QString &p)
  69. {
  70. return QDir::fromNativeSeparators(p);
  71. }
  72. static QString disp_file_path(const QString &p)
  73. {
  74. return QDir::toNativeSeparators(p);
  75. }
  76. static QString norm_dir_path(const QString &p)
  77. {
  78. QString np = QDir::fromNativeSeparators(p);
  79. if (np.endsWith('/') && np != "/")
  80. np.chop(1);
  81. return np;
  82. }
  83. static QString disp_dir_path(const QString &p)
  84. {
  85. QString np = p;
  86. if (!np.isEmpty() && !np.endsWith('/'))
  87. np.append('/');
  88. return QDir::toNativeSeparators(np);
  89. }
  90. void PrefsDialog::on_buttonUseDefaultGap_stateChanged(int state)
  91. {
  92. bool enabled = !priv->ui.buttonUseDefaultGap->isEnabled() || state == Qt::Unchecked;
  93. priv->ui.labelGapDir->setEnabled(enabled);
  94. priv->ui.labelGapExe->setEnabled(enabled);
  95. priv->ui.entryGapDir->setEnabled(enabled);
  96. priv->ui.entryGapExe->setEnabled(enabled);
  97. priv->ui.buttonGapDir->setEnabled(enabled);
  98. priv->ui.buttonGapExe->setEnabled(enabled);
  99. }
  100. void PrefsDialog::init()
  101. {
  102. GapOptions go;
  103. QString dfltRootDir = go.defaultRootDir();
  104. QString dfltExe = go.defaultExe();
  105. priv->ui.buttonUseDefaultGap->setEnabled(!dfltExe.isEmpty());
  106. priv->ui.buttonUseDefaultGap->setChecked(prefsValue(Prefs::UseDefaultGap) &&
  107. priv->ui.buttonUseDefaultGap->isEnabled());
  108. priv->gapDir = norm_dir_path(GapOptions().rootDir());
  109. priv->gapExe = GapOptions().exe();
  110. priv->gapRoots = prefsValue(Prefs::ExtraGapRoots);
  111. priv->gapArgs = GapOptions().args();
  112. if (priv->gapArgs.isEmpty())
  113. priv->gapArgs = "";
  114. priv->ui.entryGapDir->setText(disp_dir_path(priv->gapDir));
  115. priv->ui.entryGapExe->setText(disp_file_path(priv->gapExe));
  116. priv->ui.entryGapArgs->setText(priv->gapArgs);
  117. priv->ui.entryGapRoots->setText(priv->gapRoots.join("; "));
  118. priv->worksheetFont = prefsValue(Prefs::WorksheetFont);
  119. priv->helpFont = prefsValue(Prefs::HelpFont);
  120. setFontEntry(priv->ui.entryWorksheetFont, priv->worksheetFont);
  121. setFontEntry(priv->ui.entryHelpFont, priv->helpFont);
  122. }
  123. void PrefsDialog::apply()
  124. {
  125. setPrefsValue(Prefs::UseDefaultGap, priv->ui.buttonUseDefaultGap->isChecked());
  126. if (!priv->ui.buttonUseDefaultGap->isChecked())
  127. {
  128. QString gapDir = norm_dir_path(priv->ui.entryGapDir->text());
  129. QString gapExe = norm_file_path(priv->ui.entryGapExe->text());
  130. if (gapDir != priv->gapDir)
  131. setPrefsValue(Prefs::GapRootDir, gapDir);
  132. if (gapExe != priv->gapExe)
  133. setPrefsValue(Prefs::GapExe, gapExe);
  134. }
  135. QString gapArgs = priv->ui.entryGapArgs->text();
  136. if (gapArgs != priv->gapArgs)
  137. setPrefsValue(Prefs::GapArgs, gapArgs);
  138. setPrefsValue(Prefs::ExtraGapRoots, priv->gapRoots);
  139. setPrefsValue(Prefs::WorksheetFont, priv->worksheetFont);
  140. setPrefsValue(Prefs::HelpFont, priv->helpFont);
  141. moo::AppWindow::allApplyPrefs();
  142. }
  143. void PrefsDialog::on_buttonGapDir_clicked()
  144. {
  145. QString oldDir = norm_dir_path(priv->ui.entryGapDir->text());
  146. QString newDir = moo::dlg::dirName(this, tr("Choose GAP Directory"), oldDir);
  147. if (newDir.isEmpty())
  148. return;
  149. newDir = norm_dir_path(newDir);
  150. if (newDir == oldDir)
  151. return;
  152. priv->ui.entryGapDir->setText(disp_dir_path(newDir));
  153. QString newExe;
  154. QDir d(newDir);
  155. #ifdef Q_OS_WIN32
  156. if (d.exists("bin/gapw95.exe"))
  157. newExe = d.filePath("bin/gapw95.exe");
  158. #else
  159. if (d.exists("bin/gap"))
  160. newExe = d.filePath("bin/gap");
  161. else if (d.exists("bin/gap.sh"))
  162. newExe = d.filePath("bin/gap.sh");
  163. #endif
  164. if (!newExe.isEmpty())
  165. priv->ui.entryGapExe->setText(disp_file_path(newExe));
  166. }
  167. void PrefsDialog::on_buttonGapExe_clicked()
  168. {
  169. QString oldExe = norm_file_path(priv->ui.entryGapExe->text());
  170. QString newExe = moo::dlg::exeFileName(this, tr("Choose GAP Executable"), oldExe);
  171. if (newExe.isEmpty())
  172. return;
  173. newExe = norm_file_path(newExe);
  174. if (newExe == oldExe)
  175. return;
  176. priv->ui.entryGapExe->setText(disp_file_path(newExe));
  177. QFileInfo fi(newExe);
  178. if (!fi.exists())
  179. return;
  180. {
  181. QString tmp = fi.symLinkTarget();
  182. if (!tmp.isEmpty())
  183. fi = tmp;
  184. }
  185. QDir d = fi.dir();
  186. if (d.exists() && d.dirName().toLower() == "bin")
  187. {
  188. d.cdUp();
  189. priv->ui.entryGapDir->setText(disp_dir_path(d.path()));
  190. }
  191. }
  192. void PrefsDialog::on_buttonGapRoots_clicked()
  193. {
  194. EditFileListDialog dlg(priv->gapRoots, true,
  195. tr("Choose Directories"), this);
  196. if (dlg.exec())
  197. {
  198. QStringList dirs = dlg.dirs();
  199. mDebug("misc") << dirs;
  200. priv->gapRoots = dirs;
  201. priv->ui.entryGapRoots->setText(priv->gapRoots.join("; "));
  202. }
  203. }
  204. static void font_dialog(PrefsDialog *dlg, QFont *font, QLineEdit *entry)
  205. {
  206. bool ok;
  207. QFont newFont = QFontDialog::getFont(&ok, *font, dlg, PrefsDialog::tr("Choose Font"));
  208. if (!ok)
  209. return;
  210. *font = newFont;
  211. setFontEntry(entry, newFont);
  212. }
  213. void PrefsDialog::on_buttonWorksheetFont_clicked()
  214. {
  215. font_dialog(this, &priv->worksheetFont, priv->ui.entryWorksheetFont);
  216. }
  217. void PrefsDialog::on_buttonHelpFont_clicked()
  218. {
  219. font_dialog(this, &priv->helpFont, priv->ui.entryHelpFont);
  220. }
  221. void PrefsDialog::on_buttonBox_helpRequested()
  222. {
  223. QDesktopServices::openUrl(HELP_PREFS_DIALOG);
  224. }