#include "PreferencesDialog.h" #include "ui_PreferencesDialog.h" #include "sqlitedb.h" #include "FileDialog.h" #include #include #include #include #include QHash PreferencesDialog::m_hCache; PreferencesDialog::PreferencesDialog(QWidget* parent) : QDialog(parent), ui(new Ui::PreferencesDialog) { ui->setupUi(this); ui->treeSyntaxHighlighting->setColumnHidden(0, true); ui->labelDatabaseDefaultSqlText->setVisible(false); ui->editDatabaseDefaultSqlText->setVisible(false); ui->fr_bin_bg->installEventFilter(this); ui->fr_bin_fg->installEventFilter(this); ui->fr_reg_bg->installEventFilter(this); ui->fr_reg_fg->installEventFilter(this); ui->fr_null_bg->installEventFilter(this); ui->fr_null_fg->installEventFilter(this); #ifndef CHECKNEWVERSION ui->labelUpdates->setVisible(false); ui->checkUpdates->setVisible(false); #endif loadSettings(); } /* * Destroys the object and frees any allocated resources */ PreferencesDialog::~PreferencesDialog() { delete ui; } void PreferencesDialog::chooseLocation() { QString s = FileDialog::getExistingDirectory( this, tr("Choose a directory"), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); if(!s.isEmpty()) ui->locationEdit->setText(s); } void PreferencesDialog::loadSettings() { ui->encodingComboBox->setCurrentIndex(ui->encodingComboBox->findText(getSettingsValue("db", "defaultencoding").toString(), Qt::MatchFixedString)); ui->comboDefaultLocation->setCurrentIndex(getSettingsValue("db", "savedefaultlocation").toInt()); ui->locationEdit->setText(getSettingsValue("db", "defaultlocation").toString()); ui->checkUpdates->setChecked(getSettingsValue("checkversion", "enabled").toBool()); ui->checkHideSchemaLinebreaks->setChecked(getSettingsValue("db", "hideschemalinebreaks").toBool()); ui->foreignKeysCheckBox->setChecked(getSettingsValue("db", "foreignkeys").toBool()); ui->spinPrefetchSize->setValue(getSettingsValue("db", "prefetchsize").toInt()); ui->editDatabaseDefaultSqlText->setText(getSettingsValue("db", "defaultsqltext").toString()); ui->defaultFieldTypeComboBox->addItems(sqlb::Field::Datatypes); int defaultFieldTypeIndex = getSettingsValue("db", "defaultfieldtype").toInt(); if (defaultFieldTypeIndex < sqlb::Field::Datatypes.count()) { ui->defaultFieldTypeComboBox->setCurrentIndex(defaultFieldTypeIndex); } ui->comboDataBrowserFont->setCurrentIndex(ui->comboEditorFont->findText(getSettingsValue("databrowser", "font").toString())); ui->spinDataBrowserFontSize->setValue(getSettingsValue("databrowser", "fontsize").toInt()); loadColorSetting(ui->fr_null_fg, "null_fg"); loadColorSetting(ui->fr_null_bg, "null_bg"); loadColorSetting(ui->fr_reg_fg, "reg_fg"); loadColorSetting(ui->fr_reg_bg, "reg_bg"); loadColorSetting(ui->fr_bin_fg, "bin_fg"); loadColorSetting(ui->fr_bin_bg, "bin_bg"); ui->txtNull->setText(getSettingsValue("databrowser", "null_text").toString()); ui->editFilterEscape->setText(getSettingsValue("databrowser", "filter_escape").toString()); ui->spinFilterDelay->setValue(getSettingsValue("databrowser", "filter_delay").toInt()); for(int i=0; i < ui->treeSyntaxHighlighting->topLevelItemCount(); ++i) { QString name = ui->treeSyntaxHighlighting->topLevelItem(i)->text(0); QString colorname = getSettingsValue("syntaxhighlighter", name + "_colour").toString(); QColor color = QColor(colorname); ui->treeSyntaxHighlighting->topLevelItem(i)->setTextColor(2, color); ui->treeSyntaxHighlighting->topLevelItem(i)->setBackgroundColor(2, color); ui->treeSyntaxHighlighting->topLevelItem(i)->setText(2, colorname); if (name != "null") { ui->treeSyntaxHighlighting->topLevelItem(i)->setCheckState(3, getSettingsValue("syntaxhighlighter", name + "_bold").toBool() ? Qt::Checked : Qt::Unchecked); ui->treeSyntaxHighlighting->topLevelItem(i)->setCheckState(4, getSettingsValue("syntaxhighlighter", name + "_italic").toBool() ? Qt::Checked : Qt::Unchecked); ui->treeSyntaxHighlighting->topLevelItem(i)->setCheckState(5, getSettingsValue("syntaxhighlighter", name + "_underline").toBool() ? Qt::Checked : Qt::Unchecked); } } ui->comboEditorFont->setCurrentIndex(ui->comboEditorFont->findText(getSettingsValue("editor", "font").toString())); ui->spinEditorFontSize->setValue(getSettingsValue("editor", "fontsize").toInt()); ui->spinTabSize->setValue(getSettingsValue("editor", "tabsize").toInt()); ui->spinLogFontSize->setValue(getSettingsValue("log", "fontsize").toInt()); ui->checkAutoCompletion->setChecked(getSettingsValue("editor", "auto_completion").toBool()); ui->checkErrorIndicators->setChecked(getSettingsValue("editor", "error_indicators").toBool()); ui->checkHorizontalTiling->setChecked(getSettingsValue("editor", "horizontal_tiling").toBool()); ui->listExtensions->addItems(getSettingsValue("extensions", "list").toStringList()); ui->checkRegexDisabled->setChecked(getSettingsValue("extensions", "disableregex").toBool()); fillLanguageBox(); } void PreferencesDialog::saveSettings() { setSettingsValue("db", "defaultencoding", ui->encodingComboBox->currentText()); setSettingsValue("db", "defaultlocation", ui->locationEdit->text()); setSettingsValue("db", "savedefaultlocation", ui->comboDefaultLocation->currentIndex()); setSettingsValue("db", "hideschemalinebreaks", ui->checkHideSchemaLinebreaks->isChecked()); setSettingsValue("db", "foreignkeys", ui->foreignKeysCheckBox->isChecked()); setSettingsValue("db", "prefetchsize", ui->spinPrefetchSize->value()); setSettingsValue("db", "defaultsqltext", ui->editDatabaseDefaultSqlText->text()); setSettingsValue("db", "defaultfieldtype", ui->defaultFieldTypeComboBox->currentIndex()); setSettingsValue("checkversion", "enabled", ui->checkUpdates->isChecked()); setSettingsValue("databrowser", "font", ui->comboDataBrowserFont->currentText()); setSettingsValue("databrowser", "fontsize", ui->spinDataBrowserFontSize->value()); saveColorSetting(ui->fr_null_fg, "null_fg"); saveColorSetting(ui->fr_null_bg, "null_bg"); saveColorSetting(ui->fr_reg_fg, "reg_fg"); saveColorSetting(ui->fr_reg_bg, "reg_bg"); saveColorSetting(ui->fr_bin_fg, "bin_fg"); saveColorSetting(ui->fr_bin_bg, "bin_bg"); setSettingsValue("databrowser", "null_text", ui->txtNull->text()); setSettingsValue("databrowser", "filter_escape", ui->editFilterEscape->text()); setSettingsValue("databrowser", "filter_delay", ui->spinFilterDelay->value()); for(int i=0; i < ui->treeSyntaxHighlighting->topLevelItemCount(); ++i) { QString name = ui->treeSyntaxHighlighting->topLevelItem(i)->text(0); setSettingsValue("syntaxhighlighter", name + "_colour", ui->treeSyntaxHighlighting->topLevelItem(i)->text(2)); setSettingsValue("syntaxhighlighter", name + "_bold", ui->treeSyntaxHighlighting->topLevelItem(i)->checkState(3) == Qt::Checked); setSettingsValue("syntaxhighlighter", name + "_italic", ui->treeSyntaxHighlighting->topLevelItem(i)->checkState(4) == Qt::Checked); setSettingsValue("syntaxhighlighter", name + "_underline", ui->treeSyntaxHighlighting->topLevelItem(i)->checkState(5) == Qt::Checked); } setSettingsValue("editor", "font", ui->comboEditorFont->currentText()); setSettingsValue("editor", "fontsize", ui->spinEditorFontSize->value()); setSettingsValue("editor", "tabsize", ui->spinTabSize->value()); setSettingsValue("log", "fontsize", ui->spinLogFontSize->value()); setSettingsValue("editor", "auto_completion", ui->checkAutoCompletion->isChecked()); setSettingsValue("editor", "error_indicators", ui->checkErrorIndicators->isChecked()); setSettingsValue("editor", "horizontal_tiling", ui->checkHorizontalTiling->isChecked()); QStringList extList; foreach(QListWidgetItem* item, ui->listExtensions->findItems(QString("*"), Qt::MatchWrap | Qt::MatchWildcard)) extList.append(item->text()); setSettingsValue("extensions", "list", extList); setSettingsValue("extensions", "disableregex", ui->checkRegexDisabled->isChecked()); // Warn about restarting to change language QVariant newLanguage = ui->languageComboBox->itemData(ui->languageComboBox->currentIndex()); if (newLanguage != getSettingsValue("General", "language")) QMessageBox::information(this, QApplication::applicationName(), tr("The language will change after you restart the application.")); setSettingsValue("General", "language", newLanguage); accept(); } QVariant PreferencesDialog::getSettingsValue(const QString& group, const QString& name) { // Have a look in the cache first QHash::iterator cacheIndex = m_hCache.find(group + name); if(cacheIndex != m_hCache.end()) { return cacheIndex.value(); } else { // Nothing found in the cache, so get the value from the settings file or get the default value if there is no value set yet QSettings settings(QApplication::organizationName(), QApplication::organizationName()); QVariant value = settings.value(group + "/" + name, getSettingsDefaultValue(group, name)); // Store this value in the cache for further usage and return it afterwards m_hCache.insert(group + name, value); return value; } } void PreferencesDialog::setSettingsValue(const QString& group, const QString& name, const QVariant& value, bool dont_save_to_disk) { // Sometime the value has to be saved for the current session only but get discarded when the application exits. // In order to achieve this this flag can be set which disables the save to disk mechanism and only leaves the save to cache part active. if(dont_save_to_disk == false) { // Set the group and save the given value QSettings settings(QApplication::organizationName(), QApplication::organizationName()); settings.beginGroup(group); settings.setValue(name, value); settings.endGroup(); } // Also change it in the cache m_hCache[group + name] = value; } QVariant PreferencesDialog::getSettingsDefaultValue(const QString& group, const QString& name) { // db/defaultencoding? if(group == "db" && name == "defaultencoding") return "UTF-8"; // db/savedefaultlocation? if(group == "db" && name == "savedefaultlocation") return 2; // db/defaultlocation? if(group == "db" && name == "defaultlocation") return QDir::homePath(); // db/lastlocation? if(group == "db" && name == "lastlocation") return getSettingsValue("db", "defaultlocation"); // db/hideschemalinebreaks? if(group == "db" && name == "hideschemalinebreaks") return true; // db/foreignkeys? if(group == "db" && name == "foreignkeys") return true; // db/prefetchsize? if(group == "db" && name == "prefetchsize") return 50000; // db/defaultsqltext? if(group == "db" && name == "defaultsqltext") return ""; // exportcsv/firstrowheader? if(group == "exportcsv" && name == "firstrowheader") return true; // exportcsv/separator? if(group == "exportcsv" && name == "separator") return ','; // exportcsv/quotecharacter? if(group == "exportcsv" && name == "quotecharacter") return '"'; // MainWindow/geometry? if(group == "MainWindow" && name == "geometry") return ""; // MainWindow/windowState? if(group == "MainWindow" && name == "windowState") return ""; // SQLLogDock/Log? if(group == "SQLLogDock" && name == "Log") return "Application"; // General/recentFileList? if(group == "General" && name == "recentFileList") return QStringList(); // General/language? if(group == "General" && name == "language") return QLocale::system().name(); // checkversion/enabled if(group == "checkversion" && name == "enabled") return true; // Data Browser/NULL Fields if(group == "databrowser") { if(name == "font") return "Sans Serif"; if(name == "fontsize") return 10; if(name == "null_text") return "NULL"; if(name == "filter_escape") return "\\"; if(name == "filter_delay") return 200; if(name == "null_fg_colour") return QColor(Qt::lightGray).name(); if(name == "null_bg_colour") return QColor(Qt::white).name(); if(name == "reg_fg_colour") return QColor(Qt::black).name(); if(name == "reg_bg_colour") return QColor(Qt::white).name(); if(name == "bin_fg_colour") return QColor(Qt::lightGray).name(); if(name == "bin_bg_colour") return QColor(Qt::white).name(); } // syntaxhighlighter? if(group == "syntaxhighlighter") { // Bold? Only tables, functions and keywords are bold by default if(name.right(4) == "bold") return name == "keyword_bold" || name == "table_bold" || name == "function_bold"; // Italic? Nothing by default if(name.right(6) == "italic") return false; // Underline? Nothing by default if(name.right(9) == "underline") return false; // Colour? if(name.right(6) == "colour") { if(name == "keyword_colour") return QColor(Qt::darkBlue).name(); else if(name == "function_colour") return QColor(Qt::blue).name(); else if(name == "table_colour") return QColor(Qt::darkCyan).name(); else if(name == "comment_colour") return QColor(Qt::darkGreen).name(); else if(name == "identifier_colour") return QColor(Qt::darkMagenta).name(); else if(name == "string_colour") return QColor(Qt::red).name(); else if(name == "currentline_colour") return QColor(236, 236, 245).name(); } } // editor/font? if(group == "editor" && name == "font") return "Monospace"; // editor/fontsize or log/fontsize? if((group == "editor" || group == "log") && name == "fontsize") return 9; if(group == "editor") { if(name == "tabsize") { return 4; } } // editor/auto_completion? if(group == "editor" && name == "auto_completion") return true; // editor/error_indicators? if(group == "editor" && name == "error_indicators") return true; // editor/horizontal_tiling? if(group == "editor" && name == "horizontal_tiling") return false; // extensions/list? if(group == "extensions" && name == "list") return QStringList(); // extensions/disableregex? if(group == "extension" && name == "disableregex") return false; // PlotDock/lineType or pointShape? if(group == "PlotDock") { // QCPGraph::lsLine if(name == "lineType") return 1; // QCPScatterStyle::ssDisk if(name == "pointShape") return 4; } // Unknown combination of group and name? Return an invalid QVariant! return QVariant(); } void PreferencesDialog::showColourDialog(QTreeWidgetItem* item, int column) { if(item->text(column).left(1) != "#") return; QColor colour = QColorDialog::getColor(QColor(item->text(column)), this); if(colour.isValid()) { item->setTextColor(column, colour); item->setBackgroundColor(column, colour); item->setText(column, colour.name()); } } bool PreferencesDialog::eventFilter(QObject *obj, QEvent *event) { // Use mouse click and enter press on the frames to pop up a colour dialog if (obj == ui->fr_bin_bg || obj == ui->fr_bin_fg || obj == ui->fr_reg_bg || obj == ui->fr_reg_fg || obj == ui->fr_null_bg || obj == ui->fr_null_fg) { if (event->type() == QEvent::KeyPress) { QKeyEvent *key = static_cast(event); // Not interesting, so send to the parent (might be shortcuts) if((key->key() != Qt::Key_Enter) && (key->key() != Qt::Key_Return)) { return QDialog::eventFilter(obj, event); } } else if (event->type() != QEvent::MouseButtonPress) { // Not a key event neither a mouse event, send to the parent return QDialog::eventFilter(obj, event); } QFrame *frame = qobject_cast(obj); QColor oldColour = frame->palette().color(frame->backgroundRole()); QColor colour = QColorDialog::getColor(oldColour, frame); if (colour.isValid()) { QPalette palette = frame->palette(); palette.setColor(frame->backgroundRole(), colour); frame->setPalette(palette); } // Consume return true; } // Send any other events to the parent return QDialog::eventFilter(obj, event); } void PreferencesDialog::addExtension() { QString file = FileDialog::getOpenFileName( this, tr("Select extension file"), tr("Extensions(*.so *.dll);;All files(*)")); if(QFile::exists(file)) ui->listExtensions->addItem(file); } void PreferencesDialog::removeExtension() { if(ui->listExtensions->currentIndex().isValid()) ui->listExtensions->takeItem(ui->listExtensions->currentIndex().row()); } void PreferencesDialog::fillLanguageBox() { QDir translationsDir(QCoreApplication::applicationDirPath() + "/translations", "sqlb_*.qm"); QLocale systemLocale = QLocale::system(); // Add default language if (systemLocale.name() == "en_US") { ui->languageComboBox->addItem(QIcon(":/flags/en_US"), "English (United States) [System Language]", "en_US"); } else { ui->languageComboBox->addItem(QIcon(":/flags/en_US"), "English (United States) [Default Language]", "en_US"); } // Get available *.qm files from translation dir near executable as well as from resources QFileInfoList file_infos = translationsDir.entryInfoList(); file_infos += QDir(":/translations").entryInfoList(); foreach(const QFileInfo &file, file_infos) { QLocale locale(file.baseName().remove("sqlb_")); // Skip invalid locales if(locale.name() == "C") continue; // Skip translations that were already loaded if (ui->languageComboBox->findData(locale.name(), Qt::UserRole, Qt::MatchExactly) != -1) continue; QString language = QLocale::languageToString(locale.language()) + " (" + QLocale::countryToString(locale.country()) + ")"; if (locale == systemLocale) language += " [System language]"; ui->languageComboBox->addItem(QIcon(":/flags/" + locale.name()), language, locale.name()); } ui->languageComboBox->model()->sort(0); // Try to select the language for the stored locale int index = ui->languageComboBox->findData(getSettingsValue("General", "language"), Qt::UserRole, Qt::MatchExactly); // If there's no translation for the current locale, default to English if(index < 0) index = ui->languageComboBox->findData("en_US", Qt::UserRole, Qt::MatchExactly); QString chosenLanguage = ui->languageComboBox->itemText(index); QVariant chosenLocale = ui->languageComboBox->itemData(index); QIcon chosenIcon = ui->languageComboBox->itemIcon(index); // There's no "move" method, so we remove and add the chosen language again at the top ui->languageComboBox->removeItem(index); ui->languageComboBox->insertItem(0, chosenIcon, chosenLanguage, chosenLocale); ui->languageComboBox->setCurrentIndex(0); } void PreferencesDialog::loadColorSetting(QFrame *frame, const QString & settingName) { QPalette palette = frame->palette(); palette.setColor(frame->backgroundRole(), QColor(getSettingsValue("databrowser", settingName + "_colour").toString())); frame->setPalette(palette); } void PreferencesDialog::saveColorSetting(QFrame *frame, const QString & settingName) { setSettingsValue("databrowser", settingName + "_colour", frame->palette().color(frame->backgroundRole())); }