Some bugs fixed
[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 }
111
112 void MainWindow::saveSettings()
113 {
114     QSettings config;
115     config.setValue("MainWindow/geometry", saveGeometry());
116     config.setValue("MainWindow/state", saveState());
117     config.setValue("MainWindow/visible", isVisible());
118     config.setValue("MainWindow/wordsListDock/floating", wordsListDock->isFloating());
119     config.setValue("MainWindow/wordsListDock/geometry", wordsListDock->geometry());
120     config.setValue("MainWindow/instantSearch", m_instantSearch);
121     config.setValue("MainWindow/defaultStyleSheet", defaultStyleSheet());
122 }
123
124 void MainWindow::on_actionAbout_triggered()
125 {
126     QMessageBox::about(this,
127             tr("About QStarDict"),
128             tr("<b>QStarDict %1 </b> - Qt version of StarDict<br>").arg(QSTARDICT_VERSION) +
129             tr("Copyright (C) 2007-2009 Alexander Rodin "
130                "<a href=\"http://qstardict.ylsoftware.com\">http://qstardict.ylsoftware.com</a><br>"
131                "Package by SR<br>"
132                "<a href=\"http://sr.uz\">http://sr.uz</a>"));
133 }
134
135 void MainWindow::on_actionSettings_triggered()
136 {
137     SettingsDialog dialog(this);
138     dialog.exec();
139 }
140
141 void MainWindow::on_actionHelp_triggered()
142 {
143     QDesktopServices::openUrl(QUrl("http://wiki.qstardict.ylsoftware.com"));
144 }
145
146 void MainWindow::on_queryButton_clicked()
147 {
148     if (searchBox->text().simplified().isEmpty())
149     {
150         setWindowTitle(tr("QStarDict"));
151         translationView->clear();
152         wordsList->clear();
153         return;
154     }
155     wordsList->clear();
156     wordsList->addItems(m_dict->findSimilarWords(searchBox->text()));
157     translationView->translate(searchBox->text());
158 }
159
160 void MainWindow::reload()
161 {
162     wordsList->clear();
163     wordsList->addItems(m_dict->findSimilarWords(translationView->translatedWord()));
164     translationView->reload();
165 }
166
167 void MainWindow::queryEdited(const QString &)
168 {
169     if (m_queryTimer)
170         killTimer(m_queryTimer);
171     m_queryTimer = startTimer(600);
172 }
173
174 void MainWindow::timerEvent(QTimerEvent *event)
175 {
176     if (event->timerId() == m_queryTimer)
177     {
178         killTimer(m_queryTimer);
179         m_queryTimer = 0;
180         on_queryButton_clicked();
181     }
182     else
183         QMainWindow::timerEvent(event);
184 }
185
186 void MainWindow::wordTranslated(const QString &word)
187 {
188     #ifndef MAEMO
189     if (word.simplified().isEmpty())
190         setWindowTitle(tr("QStarDict"));
191     else
192         setWindowTitle(tr("%1 - QStarDict").arg(word));
193     #endif // MAEMO
194     if (m_queryTimer)
195     {
196         killTimer(m_queryTimer);
197         m_queryTimer = 0;
198     }
199 }
200
201 void MainWindow::wordsListItemActivated(QListWidgetItem *item)
202 {
203     searchBox->setText(item->text());
204     translationView->translate(item->text());
205     #ifndef MAEMO
206     setWindowTitle(tr("%1 - QStarDict").arg(translationView->translatedWord()));
207     #endif // MAEMO
208 }
209
210 void MainWindow::setInstantSearch(bool instantSearch)
211 {
212     if (instantSearch == m_instantSearch)
213         return;
214     m_instantSearch = instantSearch;
215     if (m_instantSearch)
216         connect(searchBox, SIGNAL(textEdited(const QString&)), SLOT(queryEdited(const QString&)));
217     else
218         disconnect(searchBox, SIGNAL(textEdited(const QString&)), this, SLOT(queryEdited(const QString&)));
219 }
220
221 void MainWindow::setDict(DictCore *dict)
222 {
223     m_dict = dict;
224     translationView->setDict(dict);
225 }
226
227 void MainWindow::keyPressEvent(QKeyEvent *event)
228 {
229     if (event->text().size() || event->key() == Qt::Key_Escape)
230     {
231         if (! searchBox->hasFocus())
232         {
233             searchBox->setText(event->text());
234             searchBox->setFocus(Qt::OtherFocusReason);
235         }
236         if (event->key() == Qt::Key_Escape)
237         {
238             if (searchBox->text().isEmpty())
239                 close();
240             else
241                 searchBox->clear();
242         }
243     }
244     QMainWindow::keyPressEvent(event);
245 }
246
247 void MainWindow::closeEvent(QCloseEvent *event)
248 {
249     #ifndef MAEMO
250     if (! Application::instance()->trayIcon()->isVisible())
251         Application::instance()->quit();
252     #endif // MAEMO
253
254     QMainWindow::closeEvent(event);
255 }
256
257 }
258
259 // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc
260