Russian translation. Gui fix.
[qstardict] / qstardict / mainwindow.cpp
1 /*****************************************************************************
2  * mainwindow.cpp - QStarDict, a StarDict clone written with using Qt        *
3  * Copyright (C) 2007-2009 Alexander                                         *
4  *                                                                           *
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.                                       *
9  *                                                                           *
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.                              *
14  *                                                                           *
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  *****************************************************************************/
19
20 #include "mainwindow.h"
21
22 #include <QApplication>
23 #include <QCloseEvent>
24 #include <QDesktopServices>
25 #include <QDir>
26 #include <QFile>
27 #include <QFileDialog>
28 #include <QListWidgetItem>
29 #include <QKeyEvent>
30 #include <QMenu>
31 #include <QMessageBox>
32 #include <QSettings>
33 #include <QTextStream>
34 #include <QTimerEvent>
35 #include <QToolBar>
36 #include "dictcore.h"
37 #include "application.h"
38 #include "popupwindow.h"
39 #include "settingsdialog.h"
40 #include "trayicon.h"
41
42 namespace QStarDict 
43 {
44
45 MainWindow::MainWindow(QWidget *parent)
46         : QMainWindow(parent)
47 {
48     setupUi(this);
49     m_dict = 0;
50     translationView->setDict(m_dict);
51
52     QFont font;
53     font.setPointSize(16);
54
55     menu_File->insertActions(actionQuit, translationView->toolBar()->actions());
56
57     QAction *actionWordsListDock = wordsListDock->toggleViewAction();
58     menu_Options->insertAction(menu_Options->actions().first(), actionWordsListDock);
59     actionWordsListDock->setFont(font);
60     //wordsList->setProperty("FingerScrollable", true);
61     //translationView->setProperty("FingerScrollable", true);
62     createConnections();
63
64     loadSettings();
65 }
66
67 MainWindow::~MainWindow()
68 {
69     saveSettings();
70 }
71
72 void MainWindow::showTranslation(const QString &text)
73 {
74     searchBox->setText(text);
75     on_queryButton_clicked();
76 }
77
78 void MainWindow::createConnections()
79 {
80     connect(actionAboutQt, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
81     connect(actionQuit, SIGNAL(triggered()), qApp, SLOT(quit()));
82     actionScan->setChecked(Application::instance()->popupWindow()->isScan());
83     connect(actionScan, SIGNAL(toggled(bool)), 
84             Application::instance()->popupWindow(), SLOT(setScan(bool)));
85     connect(Application::instance()->popupWindow(), SIGNAL(scanChanged(bool)),
86             actionScan, SLOT(setChecked(bool)));
87     connect(wordsList, SIGNAL(itemActivated(QListWidgetItem*)),
88             SLOT(wordsListItemActivated(QListWidgetItem*)));
89     connect(wordsList, SIGNAL(itemClicked(QListWidgetItem*)),
90             SLOT(wordsListItemActivated(QListWidgetItem*)));
91
92     connect(translationView, SIGNAL(wordTranslated(const QString&)),
93             SLOT(wordTranslated(const QString&)));
94 }
95
96 void MainWindow::loadSettings()
97 {
98     QSettings config;
99     restoreGeometry(config.value("MainWindow/geometry", QByteArray()).toByteArray());
100     restoreState(config.value("MainWindow/state", QByteArray()).toByteArray());
101     setVisible(config.value("MainWindow/visible", true).toBool());
102     #ifndef MAEMO
103     if (isHidden() && ! Application::instance()->trayIcon()->isVisible())
104         show();
105     #endif // MAEMO
106     wordsListDock->setFloating(config.value("MainWindow/wordsListDock/floating", wordsListDock->isFloating()).toBool());
107     wordsListDock->setGeometry(config.value("MainWindow/wordsListDock/geometry", wordsListDock->geometry()).toRect());
108     setInstantSearch(config.value("MainWindow/instantSearch", true).toBool());
109     setDefaultStyleSheet(config.value("MainWindow/defaultStyleSheet", defaultStyleSheet()).toString());
110     actionToolBar->setChecked(config.value("MainWindow/toolBar",true).toBool());
111     translationView->toggleToolBar(actionToolBar->isChecked());
112 }
113
114 void MainWindow::saveSettings()
115 {
116     QSettings config;
117     config.setValue("MainWindow/geometry", saveGeometry());
118     config.setValue("MainWindow/state", saveState());
119     config.setValue("MainWindow/visible", isVisible());
120     config.setValue("MainWindow/wordsListDock/floating", wordsListDock->isFloating());
121     config.setValue("MainWindow/wordsListDock/geometry", wordsListDock->geometry());
122     config.setValue("MainWindow/instantSearch", m_instantSearch);
123     config.setValue("MainWindow/defaultStyleSheet", defaultStyleSheet());
124     config.setValue("MainWindow/toolBar", actionToolBar->isChecked());
125 }
126
127 void MainWindow::on_actionAbout_triggered()
128 {
129     QMessageBox::about(this,
130             tr("About QStarDict"),
131             tr("<b>QStarDict %1 </b> - Qt version of StarDict ").arg(QSTARDICT_VERSION) +
132             tr("Copyright (C) 2007-2009 Alexander Rodin<br>"
133                "Package by SR"));
134 }
135
136 void MainWindow::on_actionSettings_triggered()
137 {
138     SettingsDialog dialog(this);
139     dialog.exec();
140 }
141
142 void MainWindow::on_actionHelp_triggered()
143 {
144     QDesktopServices::openUrl(QUrl("http://wiki.qstardict.ylsoftware.com"));
145 }
146
147 void MainWindow::on_queryButton_clicked()
148 {
149     if (searchBox->text().simplified().isEmpty())
150     {
151         setWindowTitle(tr("QStarDict"));
152         translationView->clear();
153         wordsList->clear();
154         return;
155     }
156     wordsList->clear();
157     wordsList->addItems(m_dict->findSimilarWords(searchBox->text()));
158     translationView->translate(searchBox->text());
159 }
160
161 void MainWindow::reload()
162 {
163     wordsList->clear();
164     wordsList->addItems(m_dict->findSimilarWords(translationView->translatedWord()));
165     translationView->reload();
166 }
167
168 void MainWindow::queryEdited(const QString &)
169 {
170     if (m_queryTimer)
171         killTimer(m_queryTimer);
172     m_queryTimer = startTimer(600);
173 }
174
175 void MainWindow::timerEvent(QTimerEvent *event)
176 {
177     if (event->timerId() == m_queryTimer)
178     {
179         killTimer(m_queryTimer);
180         m_queryTimer = 0;
181         on_queryButton_clicked();
182     }
183     else
184         QMainWindow::timerEvent(event);
185 }
186
187 void MainWindow::wordTranslated(const QString &word)
188 {
189     #ifndef MAEMO
190     if (word.simplified().isEmpty())
191         setWindowTitle(tr("QStarDict"));
192     else
193         setWindowTitle(tr("%1 - QStarDict").arg(word));
194     #endif // MAEMO
195     if (m_queryTimer)
196     {
197         killTimer(m_queryTimer);
198         m_queryTimer = 0;
199     }
200 }
201
202 void MainWindow::wordsListItemActivated(QListWidgetItem *item)
203 {
204     searchBox->setText(item->text());
205     translationView->translate(item->text());
206     #ifndef MAEMO
207     setWindowTitle(tr("%1 - QStarDict").arg(translationView->translatedWord()));
208     #endif // MAEMO
209 }
210
211 void MainWindow::setInstantSearch(bool instantSearch)
212 {
213     if (instantSearch == m_instantSearch)
214         return;
215     m_instantSearch = instantSearch;
216     if (m_instantSearch)
217         connect(searchBox, SIGNAL(textEdited(const QString&)), SLOT(queryEdited(const QString&)));
218     else
219         disconnect(searchBox, SIGNAL(textEdited(const QString&)), this, SLOT(queryEdited(const QString&)));
220 }
221
222 void MainWindow::setDict(DictCore *dict)
223 {
224     m_dict = dict;
225     translationView->setDict(dict);
226 }
227
228 void MainWindow::keyPressEvent(QKeyEvent *event)
229 {
230     if (event->text().size() || event->key() == Qt::Key_Escape)
231     {
232         if (! searchBox->hasFocus())
233         {
234             searchBox->setText(event->text());
235             searchBox->setFocus(Qt::OtherFocusReason);
236         }
237         if (event->key() == Qt::Key_Escape)
238         {
239             if (searchBox->text().isEmpty())
240                 close();
241             else
242                 searchBox->clear();
243         }
244     }
245     QMainWindow::keyPressEvent(event);
246 }
247
248 void MainWindow::closeEvent(QCloseEvent *event)
249 {
250     #ifndef MAEMO
251     if (! Application::instance()->trayIcon()->isVisible())
252         Application::instance()->quit();
253     #endif // MAEMO
254
255     QMainWindow::closeEvent(event);
256 }
257
258 void MainWindow::on_actionToolBar_toggled(bool CheckedState)
259 {
260     translationView->toggleToolBar(CheckedState);
261     //CheckedState ? translationView->m_toolBar->hide() : translationView->m_toolBar->show();
262 }
263
264 }
265
266 // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc
267