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);
120 mainLayout->addWidget(searchBarWidget,0, Qt::AlignBottom);
124 void MainWindow::initializeMenu() {
125 initializeMenuWidgets();
128 menuWidget = new MenuWidget(this);
130 menuWidget->addSubMenu(tr("Settings"), settingsWidget);
131 menuWidget->addSubMenu(tr("Dictionaries"), dictManagerWidget);
132 menuWidget->addSubMenu(tr("Bookmarks"), bookmarksWidget);
133 menuWidget->addSubMenu(tr("About"), aboutWidget);
135 menuBar->addAction(menuWidget);
137 connect(menuWidget, SIGNAL(setApplicationMenu(QWidget*)),
138 notifyManager, SLOT(setMenu(QWidget*)));
140 dictionariesAction = menuBar->addAction(tr("&Dictionaries"));
141 connect(dictionariesAction, SIGNAL(triggered()),
142 dictManagerWidget, SLOT(show()));
144 settingsAction = menuBar->addAction(tr("&Settings"));
145 connect(settingsAction, SIGNAL(triggered()),
146 settingsWidget, SLOT(show()));
148 QMenu* m = menuBar->addMenu(tr("&Bookmarks"));
149 bookmarksShowAllAction = new QAction(tr("Show all"), m);
151 bookmarksRemoveAllAction = new QAction(tr("Remove all"), m);
153 m->addAction(bookmarksShowAllAction);
154 m->addAction(bookmarksRemoveAllAction);
156 aboutAction = menuBar->addAction(tr("&About"));
157 connect(aboutAction, SIGNAL(triggered()),
158 aboutWidget, SLOT(show()));
163 void MainWindow::initializeMenuWidgets() {
164 dictManagerWidget = new DictManagerWidget(this);
165 dictManagerWidget->hide();
167 settingsWidget = new SettingsWidget(this);
168 settingsWidget->hide();
170 connect(settingsWidget, SIGNAL(notify(Notify::NotifyType,QString)),
171 this, SLOT(showNotification(Notify::NotifyType,QString)));
173 bookmarksWidget = new BookmarksWidget(this);
174 bookmarksWidget->hide();
176 aboutWidget = new AboutWidget(this);
180 void MainWindow::closeEvent(QCloseEvent *event) {
181 //request to stop all searches and close app
186 bool MainWindow::isInExactSearch() {
190 void MainWindow::setExactSearch(bool exact) {
191 _exactSearch = exact;
194 void MainWindow::setExactSearchString(QString word) {
198 void MainWindow::wordListReady() {
199 //gets results from backbone
200 QMultiHash<QString, Translation*> backboneResult = backbone->result();
201 QHash<QString, QList<Translation*> > searchResult;
207 //if nothing was found
208 if(backboneResult.count() == 0) {
209 showNotification(Notify::Info, tr("Can't find any matching words"));
211 //show empty list to remove results of old search
212 Q_EMIT showWordList(searchResult);
215 //find translations of the same key word
216 QMultiHash<QString, Translation*>::iterator i;
217 for(i = backboneResult.begin(); i != backboneResult.end(); i++) {
218 searchResult[i.key()].push_back(i.value());
221 //show search results
222 Q_EMIT showWordList(searchResult);
225 if(isInExactSearch()) {
226 QList<Translation*> exactTranslation;
227 if(checkExactSearch(searchResult, exactTranslation)) {
228 Q_EMIT searchTranslations(exactTranslation);
231 showNotification(Notify::Info,
232 tr("Can't find exactly matching word"));
235 setExactSearch(false);
238 WordListWidget* myWidget = qobject_cast<WordListWidget *>(wordListWidget);
239 myWidget->setFocusOnElement();
240 // wordListWidget->setFocus();
243 bool MainWindow::checkExactSearch(
244 QHash<QString, QList<Translation *> > searchResult,
245 QList<Translation *> &found) {
247 bool foundExactMatch = false;
248 QHash<QString, QList<Translation*> >::iterator j;
249 for(j = searchResult.begin(); j != searchResult.end(); j++) {
250 if(j.key().toLower() == searchString.toLower()
251 && !foundExactMatch) {
259 void MainWindow::translationsReady() {
263 Q_EMIT showTranslation(backbone->xmls());
264 WordListWidget* myWidget = qobject_cast<WordListWidget *>(wordListWidget);
265 myWidget->setFocusOnElement();
267 notifyManager->screenChanged();
272 void MainWindow::hideWelcomeScreen() {
274 //switch welcome screen with word list
275 if(!wordListWidget->isVisible()) {
276 mainLayout->removeWidget(welcomeScreenWidget);
277 welcomeScreenWidget->deleteLater();
279 mainLayout->insertWidget(0, wordListWidget);
282 //switch welcome screen with translation widget
283 if(!translationWidget->isVisible()) {
284 splitter->insertWidget(1,translationWidget);
285 splitter->setStretchFactor(1, 150);
286 welcomeScreenWidget->deleteLater();
291 QList<CommonDictInterface*> MainWindow::getPlugins() {
292 return backbone->getPlugins();
295 QHash<CommonDictInterface*, bool> MainWindow::getDictionaries() {
296 return backbone->getDictionaries();
300 void MainWindow::search(QString word) {
301 setExactSearch(false);
302 searchBarWidget->search(word);
304 if(translationWidget->isVisible()) {
305 translationWidget->hide();
311 void MainWindow::searchExact(QString word) {
312 setExactSearch(true);
313 searchBarWidget->search(word);
316 void MainWindow::searchDelay(QString word) {
317 searchBarWidget->searchDelay(word);
324 void MainWindow::searchingInterrupted() {
325 //make sure to unset exact search mode
326 setExactSearch(false);
329 void MainWindow::addToHistory(QList<Translation *> trans) {
330 if(trans.count() > 0) {
331 backbone->history()->add(trans[0]->key());
335 void MainWindow::historyNext() {
336 if(backbone->history()->nextAvailable()) {
337 QString next = backbone->history()->next();
339 setExactSearch(true);
345 void MainWindow::historyPrev() {
346 if(backbone->history()->prevAvailable()) {
348 setExactSearch(true);
350 QString prev = backbone->history()->previous();
355 void MainWindow::disableMenu() {
357 if(menuBar->actions().contains(menuWidget)) {
358 menuBar->removeAction(menuWidget);
361 menuBar->setEnabled(false);
365 void MainWindow::enableMenu() {
367 if(!menuBar->actions().contains(menuWidget)) {
368 menuBar->addAction(menuWidget);
371 menuBar->setEnabled(true);
375 void MainWindow::showHistory(QPoint p) {
376 HistoryListDialog historyDialog(backbone->history()->list(), this );// searchBarWidget);
378 p.setX(p.x() - historyDialog.sizeHint().width() + 5);
379 p.setY(p.y() - historyDialog.sizeHint().height()- 10); //- 80);
380 historyDialog.move(p);
383 if(historyDialog.exec() == QDialog::Accepted) {
384 backbone->history()->setCurrentElement(historyDialog.selectedRow());
385 searchExact(historyDialog.selectedWord());
389 void MainWindow::setSettings(Settings *s) {
390 backbone->setSettings(s);
393 Settings* MainWindow::settings() {
394 return backbone->settings();
398 void MainWindow::showNotification(Notify::NotifyType type, QString text) {
399 notifyManager->showNotification(type, text);
402 void MainWindow::connectBackbone() {
404 connect(this, SIGNAL(searchWordList(QString)),
405 this, SIGNAL(setBusy()));
407 connect(this, SIGNAL(searchTranslations(QList<Translation*>)),
408 this, SIGNAL(setBusy()));
410 connect(this, SIGNAL(stopSearching()),
411 this, SIGNAL(setIdle()));
413 connect(this, SIGNAL(searchWordList(QString)),
414 this, SLOT(setExactSearchString(QString)));
416 connect(this, SIGNAL(searchTranslations(QList<Translation*>)),
417 this, SLOT(addToHistory(QList<Translation*>)));
421 connect(this, SIGNAL(quit()),
422 backbone, SLOT(quit()));
424 connect(this, SIGNAL(searchWordList(QString)),
425 backbone, SLOT(search(QString)));
427 connect(this, SIGNAL(searchTranslations(QList<Translation*>)),
428 backbone, SLOT(searchXml(QList<Translation*>)));
430 connect(this, SIGNAL(stopSearching()),
431 backbone, SLOT(stopSearching()));
433 connect(this, SIGNAL(stopSearching()),
434 this, SLOT(searchingInterrupted()));
436 connect(this, SIGNAL(addNewDictionary(CommonDictInterface*)),
437 backbone, SLOT(addDictionary(CommonDictInterface*)));
439 connect(this, SIGNAL(removeDictionary(CommonDictInterface*)),
440 backbone, SLOT(removeDictionary(CommonDictInterface*)));
442 connect(this, SIGNAL(selectedDictionaries(QList<CommonDictInterface*>)),
443 backbone, SLOT(selectedDictionaries(QList<CommonDictInterface*>)));
446 connect(backbone, SIGNAL(ready()),
447 this, SIGNAL(setIdle()));
449 connect(backbone, SIGNAL(xmlReady()),
450 this, SIGNAL(setIdle()));
453 connect(backbone, SIGNAL(ready()),
454 this, SLOT(wordListReady()));
456 connect(backbone, SIGNAL(xmlReady()),
457 this, SLOT(translationsReady()));
459 connect(backbone, SIGNAL(searchCanceled()),
460 this, SIGNAL(setIdle()));
462 connect(backbone, SIGNAL(notify(Notify::NotifyType,QString)),
463 this, SLOT(showNotification(Notify::NotifyType,QString)));
465 connect(backbone, SIGNAL(closeOk()),
466 this, SLOT(close()));
468 connect(backbone, SIGNAL(bookmarkMode()),
469 this, SIGNAL(bookmarkMode()));
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(this, SIGNAL(bookmarkMode()),
527 wordListWidget, SLOT(bookmarkModeActive()));
529 connect(wordListWidget, SIGNAL(addBookmark(QList<Translation*>)),
530 backbone, SLOT(addBookmark(QList<Translation*>)));
532 connect(wordListWidget, SIGNAL(removeBookmark(QList<Translation*>)),
533 backbone, SLOT(removeBookmark(QList<Translation*>)));
536 void MainWindow::connectTranslationWidget() {
537 connect(this, SIGNAL(showTranslation(QStringList)),
538 translationWidget, SLOT(show(QStringList)));
541 connect(translationWidget, SIGNAL(search(QString)),
542 this, SLOT(search(QString)));
544 connect(translationWidget, SIGNAL(notify(Notify::NotifyType, QString)),
545 this, SLOT(showNotification(Notify::NotifyType,QString)));
547 connect(translationWidget, SIGNAL(search(QString)),
548 this, SLOT(searchExact(QString)));
553 void MainWindow::connectDictManager() {
554 connect(dictManagerWidget, SIGNAL(addDictionary(CommonDictInterface*)),
555 this, SIGNAL(addNewDictionary(CommonDictInterface*)));
557 connect(dictManagerWidget, SIGNAL(removeDictionary(CommonDictInterface*)),
558 this, SIGNAL(removeDictionary(CommonDictInterface*)));
560 connect(dictManagerWidget,
561 SIGNAL(selectedDictionaries(QList<CommonDictInterface*>)),
562 this, SIGNAL(selectedDictionaries(QList<CommonDictInterface*>)));
565 void MainWindow::connectMenu() {
566 connect(this, SIGNAL(setBusy()),
567 this, SLOT(disableMenu()));
569 connect(this, SIGNAL(setIdle()),
570 this, SLOT(enableMenu()));
574 void MainWindow::connectBookmarksWidget() {
576 //after removing bookmarks we search for them once again to clear the words list
577 connect(bookmarksWidget, SIGNAL(removeAllBookmarks()),
578 this, SLOT(removeBookmarks()));
581 connect(bookmarksWidget, SIGNAL(showAllBookmarks()),
582 menuWidget, SLOT(hideMenu()));
584 connect(bookmarksWidget, SIGNAL(showAllBookmarks()),
585 backbone, SLOT(fetchBookmarks()));
589 connect(bookmarksRemoveAllAction, SIGNAL(triggered()),
590 this, SLOT(removeBookmarks()));
591 connect(bookmarksShowAllAction, SIGNAL(triggered()),
592 backbone, SLOT(fetchBookmarks()));
598 void MainWindow::removeBookmarks() {
601 par = bookmarksWidget;
605 if(QMessageBox::question(par, tr("Delete all bookmarks"),
606 tr("Do you want to delete all bookmarks? (This action cannot be revoked, and will clear current word list)"),
607 QMessageBox::Yes, QMessageBox::Cancel) == QMessageBox::Yes) {
608 backbone->removeAllBookmarks();
609 ((WordListWidget*)wordListWidget)->clear();