1 /*****************************************************************************
2 * settingsdialog.cpp - QStarDict, a StarDict clone written with using Qt *
3 * Copyright (C) 2007 Alexander Rodin *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License along *
16 * with this program; if not, write to the Free Software Foundation, Inc., *
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *
18 *****************************************************************************/
20 #include "settingsdialog.h"
22 #include <QFileDialog>
23 #include <QMessageBox>
24 #include <QStandardItemModel>
25 #include <QHeaderView>
26 #include <QInputDialog>
30 #include "mainwindow.h"
31 #include "popupwindow.h"
32 #include "application.h"
38 int toPercents(double value)
40 int integralValue = static_cast<int>(value * 100.0);
41 if (value * 100.0 - 0.5 > integralValue)
49 SettingsDialog::SettingsDialog(QWidget *parent)
55 DictCore *dict = Application::instance()->dictCore();
56 m_oldPlugins = dict->loadedPlugins();
57 m_oldDicts = dict->loadedDicts();
59 m_pluginsModel = new QStandardItemModel(this);
60 m_pluginsModel->setHorizontalHeaderLabels(
61 QStringList() << tr("Enabled") << tr("Name"));
63 //pluginsTableView->setProperty("FingerScrollable", true);
64 pluginsTableView->setModel(m_pluginsModel);
65 pluginsTableView->verticalHeader()->hide();
66 pluginsTableView->setColumnWidth(0, 90);
67 pluginsTableView->setColumnWidth(1, 400);
69 m_dictsModel = new QStandardItemModel(this);
70 m_dictsModel->setHorizontalHeaderLabels(QStringList() << tr("Enabled") << tr("Name") << tr("Plugin"));
72 //dictsTableView->setProperty("FingerScrollable", true);
73 dictsTableView->setModel(m_dictsModel);
74 dictsTableView->verticalHeader()->hide();
75 dictsTableView->setColumnWidth(0, 90);
76 dictsTableView->setColumnWidth(1, 400);
77 dictsTableView->setColumnWidth(2, 130);
79 // Load global settings
81 systemTrayBox->setChecked(Application::instance()->trayIcon()->isVisible());
83 instantSearchBox->setChecked(Application::instance()->mainWindow()->isInstantSearch());
84 speechCmdEdit->setText(Application::instance()->speaker()->speechCmd());
86 // Load popup window settings
87 PopupWindow *popup = Application::instance()->popupWindow();
88 useScanBox->setChecked(popup->isScan());
89 if (popup->modifierKey())
91 useScanModifierBox->setChecked(true);
93 switch (popup->modifierKey())
95 case Qt::ShiftModifier:
96 modifierName = "Shift";
98 case Qt::ControlModifier:
99 modifierName = "Control";
101 case Qt::AltModifier:
102 modifierName = "Alt";
104 case Qt::MetaModifier:
105 modifierName = "Win";
108 modifierKeyBox->setCurrentIndex(modifierKeyBox->findText(modifierName));
110 showIfNotFoundBox->setChecked(popup->showIfNotFound());
111 popupOpacitySpin->setValue(toPercents(popup->windowOpacity()));
112 timeoutBeforeHideSpin->setValue(popup->timeoutBeforeHide() / 1000.0);
113 popupDefaultWidthSpin->setValue(popup->defaultSize().width());
114 popupDefaultHeightSpin->setValue(popup->defaultSize().height());
115 pronounceWordBox->setChecked(popup->pronounceWord());
117 // Load translations CSS
118 QHash<QString, QString> cssAliases;
119 cssAliases["body"] = tr("All translation");
120 cssAliases["font.dict_name"] = tr("Dictionary name");
121 cssAliases["font.title"] = tr("Title");
122 cssAliases["font.explanation"] = tr("Explanation");
123 cssAliases["font.abbreviature"] = tr("Abbreviation");
124 cssAliases["font.example"] = tr("Example");
125 cssAliases["font.transcription"] = tr("Transcription");
126 apperanceCSSEdit->setElementsAliases(cssAliases);
127 apperanceCSSEdit->setCSS(Application::instance()->mainWindow()->defaultStyleSheet());
129 connect(m_pluginsModel, SIGNAL(itemChanged(QStandardItem*)),
130 SLOT(pluginsItemChanged(QStandardItem*)));
133 void SettingsDialog::accept()
135 // Save dicts and plugins settings
136 DictCore *dict = Application::instance()->dictCore();
137 QStringList loadedPlugins;
138 int rowCount = m_pluginsModel->rowCount();
139 for (int i = 0; i < rowCount; ++i)
140 if (m_pluginsModel->item(i, 0)->checkState() == Qt::Checked)
141 loadedPlugins << m_pluginsModel->item(i, 1)->text();
142 dict->setLoadedPlugins(loadedPlugins);
144 QList<DictCore::Dictionary> loadedDicts;
145 rowCount = m_dictsModel->rowCount();
146 for (int i = 0; i < rowCount; ++i)
147 if (m_dictsModel->item(i, 0)->checkState() == Qt::Checked)
148 loadedDicts << DictCore::Dictionary(m_dictsModel->item(i, 2)->text(), m_dictsModel->item(i, 1)->text());
149 dict->setLoadedDicts(loadedDicts);
151 // Save global settings
153 Application::instance()->trayIcon()->setVisible(systemTrayBox->isChecked());
155 Application::instance()->mainWindow()->setInstantSearch(instantSearchBox->isChecked());
156 Application::instance()->speaker()->setSpeechCmd(speechCmdEdit->text());
158 // Save popup window settings
159 PopupWindow *popup = Application::instance()->popupWindow();
160 popup->setScan(useScanBox->isChecked());
162 if (useScanModifierBox->isChecked())
164 if (modifierKeyBox->currentText() == "Shift")
165 modifierKey = Qt::ShiftModifier;
166 else if (modifierKeyBox->currentText() == "Control")
167 modifierKey = Qt::ControlModifier;
168 else if (modifierKeyBox->currentText() == "Alt")
169 modifierKey = Qt::AltModifier;
170 else if (modifierKeyBox->currentText() == "Win")
171 modifierKey = Qt::MetaModifier;
173 popup->setShowIfNotFound(showIfNotFoundBox->isChecked());
174 popup->setModifierKey(modifierKey);
175 popup->setWindowOpacity(popupOpacitySpin->value() / 100.0);
176 popup->setTimeoutBeforeHide(static_cast<int>(timeoutBeforeHideSpin->value() * 1000.0));
177 popup->setDefaultSize(QSize(popupDefaultWidthSpin->value(), popupDefaultHeightSpin->value()));
178 popup->setPronounceWord(pronounceWordBox->isChecked());
180 // Save translations CSS
181 Application::instance()->mainWindow()->setDefaultStyleSheet(apperanceCSSEdit->css());
182 Application::instance()->popupWindow()->setDefaultStyleSheet(apperanceCSSEdit->css());
185 if (! Application::instance()->trayIcon()->isVisible())
186 Application::instance()->mainWindow()->show();
189 Application::instance()->mainWindow()->reload();
191 Application::instance()->dictCore()->saveSettings();
192 Application::instance()->mainWindow()->saveSettings();
194 Application::instance()->trayIcon()->saveSettings();
200 void SettingsDialog::reject()
202 DictCore *dict = Application::instance()->dictCore();
203 dict->setLoadedPlugins(m_oldPlugins);
204 dict->setLoadedDicts(m_oldDicts);
208 void SettingsDialog::loadDictsList()
211 QList<DictCore::Dictionary> loadedDicts = Application::instance()->dictCore()->loadedDicts();
212 m_dictsModel->setRowCount(0);
213 for (i = 0; i < loadedDicts.size(); ++i)
215 QStandardItem *item = new QStandardItem();
216 item->setCheckable(true);
217 item->setCheckState(Qt::Checked);
218 m_dictsModel->setItem(i, 0, item);
219 m_dictsModel->setItem(i, 1, new QStandardItem(loadedDicts[i].name()));
220 m_dictsModel->setItem(i, 2, new QStandardItem(loadedDicts[i].plugin()));
222 QList<DictCore::Dictionary> dicts = Application::instance()->dictCore()->availableDicts();
223 for (QList<DictCore::Dictionary>::const_iterator iter = dicts.begin(); iter != dicts.end(); ++iter)
225 if (! loadedDicts.contains(*iter))
227 QStandardItem *item = new QStandardItem();
228 item->setCheckable(true);
229 item->setCheckState(Qt::Unchecked);
230 m_dictsModel->setItem(i, 0, item);
231 m_dictsModel->setItem(i, 1, new QStandardItem(iter->name()));
232 m_dictsModel->setItem(i, 2, new QStandardItem(iter->plugin()));
238 void SettingsDialog::loadPluginsList()
240 m_pluginsModel->setRowCount(0);
241 DictCore *dict = Application::instance()->dictCore();
242 QStringList plugins = dict->availablePlugins();
243 QStringList loaded = dict->loadedPlugins();
244 for (int i = 0; i < plugins.size(); ++i)
246 QStandardItem *item = new QStandardItem();
247 item->setCheckable(true);
248 item->setCheckState(loaded.contains(plugins[i]) ? Qt::Checked : Qt::Unchecked);
249 m_pluginsModel->setItem(i, 0, item);
250 m_pluginsModel->setItem(i, 1, new QStandardItem(plugins[i]));
254 void SettingsDialog::on_dictsMoveUpButton_clicked()
256 int currentRow = dictsTableView->currentIndex().row();
259 m_dictsModel->insertRow(currentRow - 1, m_dictsModel->takeRow(currentRow));
260 dictsTableView->selectRow(currentRow - 1);
264 void SettingsDialog::on_dictsMoveDownButton_clicked()
266 int currentRow = dictsTableView->currentIndex().row();
267 if (currentRow < m_dictsModel->rowCount() - 1)
269 m_dictsModel->insertRow(currentRow + 1, m_dictsModel->takeRow(currentRow));
270 dictsTableView->selectRow(currentRow + 1);
274 void SettingsDialog::on_dictsShowInfoButton_clicked()
276 int currentRow = dictsTableView->currentIndex().row();
277 if (currentRow == -1)
279 QString dict = m_dictsModel->item(currentRow, 1)->text();
280 QString plugin = m_dictsModel->item(currentRow, 2)->text();
281 DictPlugin::DictInfo info = Application::instance()->dictCore()->plugin(plugin)->dictInfo(dict);
282 QMessageBox::information(this,
283 tr("Information about dictionary \"%1\"").arg(dict),
284 tr("<b>Name:</b> %1<br>").arg(dict) +
285 tr("<b>Plugin:</b> %1<br>").arg(plugin) +
286 tr("<b>Author:</b> %1<br>").arg(info.author()) +
287 tr("<b>Words count:</b> %1<br>").arg((info.wordsCount() == -1) ? tr("unknown") : QString::number(info.wordsCount())) +
288 tr("<b>Description:</b> %1").arg(info.description()));
291 void SettingsDialog::on_pluginsShowInfoButton_clicked()
293 int currentRow = pluginsTableView->currentIndex().row();
294 if (currentRow == -1)
296 DictPlugin *plugin = Application::instance()->dictCore()->plugin(m_pluginsModel->item(currentRow, 1)->text());
299 QMessageBox::information(this,
300 tr("Information about %1 plugin").arg(plugin->name()),
301 tr("<b>Name:</b> %1<br>").arg(plugin->name()) +
302 tr("<b>Version:</b> %1<br>").arg(plugin->version()) +
303 tr("<b>Authors:</b> %1<br>").arg(plugin->authors().replaceInStrings("<", "<").replaceInStrings(">", ">").join(tr("<br>"))) +
304 tr("<b>Can search similar words:</b> %1<br>").arg(plugin->features().testFlag(DictPlugin::SearchSimilar) ? tr("yes") : tr("no")) +
305 tr("<b>Description:</b> %1").arg(plugin->description()));
308 void SettingsDialog::on_pluginsConfigureButton_clicked()
310 int currentRow = pluginsTableView->currentIndex().row();
311 if (currentRow == -1)
313 DictCore *dict = Application::instance()->dictCore();
314 DictPlugin *plugin = dict->plugin(m_pluginsModel->item(currentRow, 1)->text());
315 if (plugin && plugin->execSettingsDialog(this) == QDialog::Accepted)
322 void SettingsDialog::pluginsItemChanged(QStandardItem *item)
324 if (item->isCheckable())
326 DictCore *dict = Application::instance()->dictCore();
327 QStringList loadedPlugins;
328 int rowCount = m_pluginsModel->rowCount();
329 for (int i = 0; i < rowCount; ++i)
330 if (m_pluginsModel->item(i, 0)->checkState() == Qt::Checked)
331 loadedPlugins << m_pluginsModel->item(i, 1)->text();
332 dict->setLoadedPlugins(loadedPlugins);
338 void SettingsDialog::closeEvent(QCloseEvent *event)
340 SettingsDialog::accept();
345 // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc