1 /*******************************************************************************
3 This file is part of mDictionary.
5 mDictionary 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 3 of the License, or
8 (at your option) any later version.
10 mDictionary 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
16 along with mDictionary. If not, see <http://www.gnu.org/licenses/>.
18 Copyright 2010 Comarch S.A.
20 *******************************************************************************/
22 /*! \file MainWindow.cpp
23 \brief Implements interface for GUI
25 \author Mateusz Półrola <mateusz.polrola@comarch.pl>
28 #include "MainWindow.h"
31 #include <QMaemo5InformationBox>
35 MainWindow::MainWindow(Backbone *backbone, QWidget *parent):
36 GUIInterface(parent) {
38 this->backbone = backbone;
46 connectTranslationWidget();
49 connectBookmarksWidget();
51 setExactSearch(false);
53 setMinimumSize(750, 400);
57 searchBarWidget->setFocus();
60 MainWindow::~MainWindow() {
64 void MainWindow::initializeUI() {
67 setAttribute(Qt::WA_Maemo5StackedWindow);
71 /*translationWidget is another stacked window, so we don't add it to
72 layout, only create it with this widget as parent
73 it must be created as first object in main window, otherwise sometimes
74 when app starts in maemo, when trying to set stacked window attribute
76 translationWidget = new TranslationWidget(this);
81 setWindowIcon(QIcon(":/icons/64x64/mdictionary.png"));
82 setWindowTitle("mDictionary");
84 mainLayout = new QVBoxLayout();
85 QWidget* w = new QWidget();
86 w->setLayout(mainLayout);
89 menuBar = new QMenuBar();
92 notifyManager = new NotifyManager(this);
94 initializeSearchWidgets();
99 void MainWindow::initializeSearchWidgets() {
100 searchBarWidget = new SearchBarWidget();
102 wordListWidget = new WordListWidget();
104 welcomeScreenWidget = new WelcomeScreenWidget();
107 //At start we set widget as welcome screen widget
108 mainLayout->addWidget(welcomeScreenWidget);
109 mainLayout->addWidget(searchBarWidget, 0, Qt::AlignBottom);
111 translationWidget->hide();
112 //we add word list and welcome screen to splitter
113 splitter = new QSplitter(Qt::Horizontal);
114 splitter->addWidget(wordListWidget);
115 splitter->addWidget(welcomeScreenWidget);
116 splitter->setStretchFactor(1, 150);
118 mainLayout->addWidget(splitter, 1);
119 mainLayout->addWidget(searchBarWidget, 0, Qt::AlignBottom);
123 void MainWindow::initializeMenu() {
124 initializeMenuWidgets();
127 menuWidget = new MenuWidget(this);
129 menuWidget->addSubMenu(tr("Settings"), settingsWidget);
130 menuWidget->addSubMenu(tr("Dictionaries"), dictManagerWidget);
131 menuWidget->addSubMenu(tr("Bookmarks"), bookmarksWidget);
132 menuWidget->addSubMenu(tr("About"), aboutWidget);
134 menuBar->addAction(menuWidget);
136 connect(menuWidget, SIGNAL(setApplicationMenu(QWidget*)),
137 notifyManager, SLOT(setMenu(QWidget*)));
139 dictionariesAction = menuBar->addAction(tr("&Dictionaries"));
140 connect(dictionariesAction, SIGNAL(triggered()),
141 dictManagerWidget, SLOT(show()));
143 settingsAction = menuBar->addAction(tr("&Settings"));
144 connect(settingsAction, SIGNAL(triggered()),
145 settingsWidget, SLOT(show()));
147 QMenu* m = menuBar->addMenu(tr("&Bookmarks"));
148 bookmarksShowAllAction = new QAction(tr("Show all"), m);
150 bookmarksRemoveAllAction = new QAction(tr("Remove all"), m);
152 m->addAction(bookmarksShowAllAction);
153 m->addAction(bookmarksRemoveAllAction);
155 aboutAction = menuBar->addAction(tr("&About"));
156 connect(aboutAction, SIGNAL(triggered()),
157 aboutWidget, SLOT(show()));
162 void MainWindow::initializeMenuWidgets() {
163 dictManagerWidget = new DictManagerWidget(this);
164 dictManagerWidget->hide();
166 settingsWidget = new SettingsWidget(this);
167 settingsWidget->hide();
169 connect(settingsWidget, SIGNAL(notify(Notify::NotifyType,QString)),
170 this, SLOT(showNotification(Notify::NotifyType,QString)));
172 bookmarksWidget = new BookmarksWidget(this);
173 bookmarksWidget->hide();
175 aboutWidget = new AboutWidget(this);
179 void MainWindow::closeEvent(QCloseEvent *event) {
180 //request to stop all searches and close app
185 bool MainWindow::isInExactSearch() {
189 void MainWindow::setExactSearch(bool exact) {
190 _exactSearch = exact;
193 void MainWindow::setExactSearchString(QString word) {
197 void MainWindow::wordListReady() {
198 //gets results from backbone
199 QMultiHash<QString, Translation*> backboneResult = backbone->result();
200 QHash<QString, QList<Translation*> > searchResult;
206 //if nothing was found
207 if(backboneResult.count() == 0) {
208 showNotification(Notify::Info, tr("Can't find any matching words"));
210 //show empty list to remove results of old search
211 Q_EMIT showWordList(searchResult);
214 //find translations of the same key word
215 QMultiHash<QString, Translation*>::iterator i;
216 for(i = backboneResult.begin(); i != backboneResult.end(); i++) {
217 searchResult[i.key()].push_back(i.value());
220 //show search results
221 Q_EMIT showWordList(searchResult);
224 if(isInExactSearch()) {
225 QList<Translation*> exactTranslation;
226 if(checkExactSearch(searchResult, exactTranslation)) {
227 Q_EMIT searchTranslations(exactTranslation);
230 showNotification(Notify::Info,
231 tr("Can't find exactly matching word"));
234 setExactSearch(false);
238 wordListWidget->setFocus();
241 bool MainWindow::checkExactSearch(
242 QHash<QString, QList<Translation *> > searchResult,
243 QList<Translation *> &found) {
245 bool foundExactMatch = false;
246 QHash<QString, QList<Translation*> >::iterator j;
247 for(j = searchResult.begin(); j != searchResult.end(); j++) {
248 if(j.key().toLower() == searchString.toLower()
249 && !foundExactMatch) {
257 void MainWindow::translationsReady() {
262 Q_EMIT showTranslation(backbone->xmls());
263 wordListWidget->setFocus();
265 notifyManager->screenChanged();
270 void MainWindow::hideWelcomeScreen() {
272 //switch welcome screen with word list
273 if(!wordListWidget->isVisible()) {
274 mainLayout->removeWidget(welcomeScreenWidget);
275 welcomeScreenWidget->deleteLater();
277 mainLayout->insertWidget(0, wordListWidget);
280 //switch welcome screen with translation widget
281 if(!translationWidget->isVisible()) {
282 splitter->insertWidget(1,translationWidget);
283 splitter->setStretchFactor(1, 150);
284 welcomeScreenWidget->deleteLater();
289 QList<CommonDictInterface*> MainWindow::getPlugins() {
290 return backbone->getPlugins();
293 QHash<CommonDictInterface*, bool> MainWindow::getDictionaries() {
294 return backbone->getDictionaries();
298 void MainWindow::search(QString word) {
299 setExactSearch(false);
300 searchBarWidget->search(word);
302 if(translationWidget->isVisible()) {
303 translationWidget->hide();
309 void MainWindow::searchExact(QString word) {
310 setExactSearch(true);
311 searchBarWidget->search(word);
314 void MainWindow::searchDelay(QString word) {
315 searchBarWidget->searchDelay(word);
322 void MainWindow::searchingInterrupted() {
323 //make sure to unset exact search mode
324 setExactSearch(false);
327 void MainWindow::addToHistory(QList<Translation *> trans) {
328 if(trans.count() > 0) {
329 backbone->history()->add(trans[0]->key());
333 void MainWindow::historyNext() {
334 if(backbone->history()->nextAvailable()) {
335 QString next = backbone->history()->next();
337 setExactSearch(true);
343 void MainWindow::historyPrev() {
344 if(backbone->history()->prevAvailable()) {
346 setExactSearch(true);
348 QString prev = backbone->history()->previous();
353 void MainWindow::disableMenu() {
355 if(menuBar->actions().contains(menuWidget)) {
356 menuBar->removeAction(menuWidget);
359 menuBar->setEnabled(false);
363 void MainWindow::enableMenu() {
365 if(!menuBar->actions().contains(menuWidget)) {
366 menuBar->addAction(menuWidget);
369 menuBar->setEnabled(true);
373 void MainWindow::showHistory(QPoint p) {
375 HistoryListDialog historyDialog(backbone->history()->list(), searchBarWidget);
378 QPoint newPos = mapFromGlobal(p);
379 newPos.setY(searchBarWidget->pos().y() -
380 historyDialog.sizeHint().height());
381 newPos.setX(width() - historyDialog.sizeHint().width());
383 historyDialog.move(newPos);
386 if(historyDialog.exec() == QDialog::Accepted) {
387 backbone->history()->setCurrentElement(historyDialog.selectedRow());
388 searchExact(historyDialog.selectedWord());
392 void MainWindow::setSettings(Settings *s) {
393 backbone->setSettings(s);
396 Settings* MainWindow::settings() {
397 return backbone->settings();
401 void MainWindow::showNotification(Notify::NotifyType type, QString text) {
402 notifyManager->showNotification(type, text);
405 void MainWindow::connectBackbone() {
407 connect(this, SIGNAL(searchWordList(QString)),
408 this, SIGNAL(setBusy()));
410 connect(this, SIGNAL(searchTranslations(QList<Translation*>)),
411 this, SIGNAL(setBusy()));
413 connect(this, SIGNAL(stopSearching()),
414 this, SIGNAL(setIdle()));
416 connect(this, SIGNAL(searchWordList(QString)),
417 this, SLOT(setExactSearchString(QString)));
419 connect(this, SIGNAL(searchTranslations(QList<Translation*>)),
420 this, SLOT(addToHistory(QList<Translation*>)));
424 connect(this, SIGNAL(quit()),
425 backbone, SLOT(quit()));
427 connect(this, SIGNAL(searchWordList(QString)),
428 backbone, SLOT(search(QString)));
430 connect(this, SIGNAL(searchTranslations(QList<Translation*>)),
431 backbone, SLOT(searchXml(QList<Translation*>)));
433 connect(this, SIGNAL(stopSearching()),
434 backbone, SLOT(stopSearching()));
436 connect(this, SIGNAL(stopSearching()),
437 this, SLOT(searchingInterrupted()));
439 connect(this, SIGNAL(addNewDictionary(CommonDictInterface*)),
440 backbone, SLOT(addDictionary(CommonDictInterface*)));
442 connect(this, SIGNAL(removeDictionary(CommonDictInterface*)),
443 backbone, SLOT(removeDictionary(CommonDictInterface*)));
445 connect(this, SIGNAL(selectedDictionaries(QList<CommonDictInterface*>)),
446 backbone, SLOT(selectedDictionaries(QList<CommonDictInterface*>)));
449 connect(backbone, SIGNAL(ready()),
450 this, SIGNAL(setIdle()));
452 connect(backbone, SIGNAL(xmlReady()),
453 this, SIGNAL(setIdle()));
456 connect(backbone, SIGNAL(ready()),
457 this, SLOT(wordListReady()));
459 connect(backbone, SIGNAL(xmlReady()),
460 this, SLOT(translationsReady()));
462 connect(backbone, SIGNAL(searchCanceled()),
463 this, SIGNAL(setIdle()));
465 connect(backbone, SIGNAL(notify(Notify::NotifyType,QString)),
466 this, SLOT(showNotification(Notify::NotifyType,QString)));
468 connect(backbone, SIGNAL(closeOk()),
469 this, SLOT(close()));
472 //connect(wordListWidget, SIGNAL(addBookmark(QList<Translation*>)),
473 // this, SIGNAL(setBusy()));
475 //connect(backbone, SIGNAL(bookmarkReady()),
476 // this, SIGNAL(setIdle()));
479 void MainWindow::connectSearchBar() {
480 connect(searchBarWidget, SIGNAL(searchForTranslations(QString)),
481 this, SIGNAL(searchWordList(QString)));
483 connect(searchBarWidget, SIGNAL(stopSearching()),
484 this, SIGNAL(stopSearching()));
486 connect(this, SIGNAL(setBusy()),
487 searchBarWidget, SLOT(setBusy()));
489 connect(this, SIGNAL(setIdle()),
490 searchBarWidget, SLOT(setIdle()));
492 connect(searchBarWidget, SIGNAL(historyNext()),
493 this, SLOT(historyNext()));
495 connect(searchBarWidget, SIGNAL(historyPrev()),
496 this, SLOT(historyPrev()));
498 connect(searchBarWidget, SIGNAL(historyShow(QPoint)),
499 this, SLOT(showHistory(QPoint)));
501 connect(searchBarWidget, SIGNAL(refreshHistoryButtons()),
502 backbone->history(), SLOT(refreshStatus()));
504 connect(backbone->history(), SIGNAL(historyChanged(bool,bool,bool)),
505 searchBarWidget, SLOT(updateHistoryButtons(bool,bool,bool)));
508 void MainWindow::connectWordList() {
510 SIGNAL(showWordList(QHash<QString, QList<Translation*> >)),
512 SLOT(showSearchResults(QHash<QString,QList<Translation*> >)));
514 connect(wordListWidget, SIGNAL(showTranslation(QList<Translation*>)),
515 this, SIGNAL(searchTranslations(QList<Translation*>)));
520 connect(this, SIGNAL(setBusy()),
521 wordListWidget, SLOT(lockList()));
523 connect(this, SIGNAL(setIdle()),
524 wordListWidget, SLOT(unlockList()));
526 connect(wordListWidget, SIGNAL(addBookmark(QList<Translation*>)),
527 backbone, SLOT(addBookmark(QList<Translation*>)));
529 connect(wordListWidget, SIGNAL(removeBookmark(QList<Translation*>)),
530 backbone, SLOT(removeBookmark(QList<Translation*>)));
533 void MainWindow::connectTranslationWidget() {
534 connect(this, SIGNAL(showTranslation(QStringList)),
535 translationWidget, SLOT(show(QStringList)));
538 connect(translationWidget, SIGNAL(search(QString)),
539 this, SLOT(search(QString)));
541 connect(translationWidget, SIGNAL(notify(Notify::NotifyType, QString)),
542 this, SLOT(showNotification(Notify::NotifyType,QString)));
544 connect(translationWidget, SIGNAL(search(QString)),
545 this, SLOT(searchExact(QString)));
550 void MainWindow::connectDictManager() {
551 connect(dictManagerWidget, SIGNAL(addDictionary(CommonDictInterface*)),
552 this, SIGNAL(addNewDictionary(CommonDictInterface*)));
554 connect(dictManagerWidget, SIGNAL(removeDictionary(CommonDictInterface*)),
555 this, SIGNAL(removeDictionary(CommonDictInterface*)));
557 connect(dictManagerWidget,
558 SIGNAL(selectedDictionaries(QList<CommonDictInterface*>)),
559 this, SIGNAL(selectedDictionaries(QList<CommonDictInterface*>)));
562 void MainWindow::connectMenu() {
563 connect(this, SIGNAL(setBusy()),
564 this, SLOT(disableMenu()));
566 connect(this, SIGNAL(setIdle()),
567 this, SLOT(enableMenu()));
571 void MainWindow::connectBookmarksWidget() {
573 //after removing bookmarks we search for them once again to clear the words list
574 connect(bookmarksWidget, SIGNAL(removeAllBookmarks()),
575 this, SLOT(removeBookmarks()));
578 connect(bookmarksWidget, SIGNAL(showAllBookmarks()),
579 menuWidget, SLOT(hideMenu()));
581 connect(bookmarksWidget, SIGNAL(showAllBookmarks()),
582 backbone, SLOT(fetchBookmarks()));
586 connect(bookmarksRemoveAllAction, SIGNAL(triggered()),
587 this, SLOT(removeBookmarks()));
588 connect(bookmarksShowAllAction, SIGNAL(triggered()),
589 backbone, SLOT(fetchBookmarks()));
595 void MainWindow::removeBookmarks() {
598 par = bookmarksWidget;
602 if(QMessageBox::question(par, tr("Delete all bookmarks"),
603 tr("Do you want to delete all bookmarks? (This action cannot be revoked, and will clear current word list)"),
604 QMessageBox::Yes, QMessageBox::Cancel) == QMessageBox::Yes) {
605 backbone->removeAllBookmarks();
606 ((WordListWidget*)wordListWidget)->clear();