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 //! \author Mateusz Półrola <mateusz.polrola@comarch.pl>
25 #include "MainWindow.h"
28 #include <QMaemo5InformationBox>
32 MainWindow::MainWindow(Backbone *backbone, QWidget *parent):
33 GUIInterface(parent) {
35 this->backbone = backbone;
43 connectTranslationWidget();
46 connectBookmarksWidget();
48 setExactSearch(false);
50 setMinimumSize(750, 400);
54 searchBarWidget->setFocus();
57 MainWindow::~MainWindow() {
61 void MainWindow::initializeUI() {
64 setAttribute(Qt::WA_Maemo5StackedWindow);
68 /*translationWidget is another stacked window, so we don't add it to
69 layout, only create it with this widget as parent
70 it must be created as first object in main window, otherwise sometimes
71 when app starts in maemo, when trying to set stacked window attribute
73 translationWidget = new TranslationWidget(this);
78 setWindowIcon(QIcon(":/icons/64x64/mdictionary.png"));
79 setWindowTitle("mDictionary");
81 mainLayout = new QVBoxLayout();
82 QWidget* w = new QWidget();
83 w->setLayout(mainLayout);
86 menuBar = new QMenuBar();
89 notifyManager = new NotifyManager(this);
91 initializeSearchWidgets();
96 void MainWindow::initializeSearchWidgets() {
97 searchBarWidget = new SearchBarWidget();
99 wordListWidget = new WordListWidget();
101 welcomeScreenWidget = new WelcomeScreenWidget();
104 //At start we set widget as welcome screen widget
105 mainLayout->addWidget(welcomeScreenWidget);
106 mainLayout->addWidget(searchBarWidget, 0, Qt::AlignBottom);
108 translationWidget->hide();
109 //we add word list and welcome screen to splitter
110 splitter = new QSplitter(Qt::Horizontal);
111 splitter->addWidget(wordListWidget);
112 splitter->addWidget(welcomeScreenWidget);
113 splitter->setStretchFactor(1, 150);
115 mainLayout->addWidget(splitter, 1);
116 mainLayout->addWidget(searchBarWidget, 0, Qt::AlignBottom);
120 void MainWindow::initializeMenu() {
121 initializeMenuWidgets();
124 menuWidget = new MenuWidget(this);
126 menuWidget->addSubMenu(tr("Settings"), settingsWidget);
127 menuWidget->addSubMenu(tr("Dictionaries"), dictManagerWidget);
128 menuWidget->addSubMenu(tr("Bookmarks"), bookmarksWidget);
129 menuWidget->addSubMenu(tr("About"), aboutWidget);
131 menuBar->addAction(menuWidget);
133 connect(menuWidget, SIGNAL(setApplicationMenu(QWidget*)),
134 notifyManager, SLOT(setMenu(QWidget*)));
136 dictionariesAction = menuBar->addAction(tr("&Dictionaries"));
137 connect(dictionariesAction, SIGNAL(triggered()),
138 dictManagerWidget, SLOT(show()));
140 settingsAction = menuBar->addAction(tr("&Settings"));
141 connect(settingsAction, SIGNAL(triggered()),
142 settingsWidget, SLOT(show()));
144 QMenu* m = menuBar->addMenu(tr("&Bookmarks"));
145 bookmarksShowAllAction = new QAction(tr("Show all"), m);
147 bookmarksRemoveAllAction = new QAction(tr("Remove all"), m);
149 m->addAction(bookmarksShowAllAction);
150 m->addAction(bookmarksRemoveAllAction);
152 aboutAction = menuBar->addAction(tr("&About"));
153 connect(aboutAction, SIGNAL(triggered()),
154 aboutWidget, SLOT(show()));
159 void MainWindow::initializeMenuWidgets() {
160 dictManagerWidget = new DictManagerWidget(this);
161 dictManagerWidget->hide();
163 settingsWidget = new SettingsWidget(this);
164 settingsWidget->hide();
166 connect(settingsWidget, SIGNAL(notify(Notify::NotifyType,QString)),
167 this, SLOT(showNotification(Notify::NotifyType,QString)));
169 bookmarksWidget = new BookmarksWidget(this);
170 bookmarksWidget->hide();
172 aboutWidget = new AboutWidget(this);
176 void MainWindow::closeEvent(QCloseEvent *event) {
177 //request to stop all searches and close app
182 bool MainWindow::isInExactSearch() {
186 void MainWindow::setExactSearch(bool exact) {
187 _exactSearch = exact;
190 void MainWindow::setExactSearchString(QString word) {
194 void MainWindow::wordListReady() {
195 //gets results from backbone
196 QMultiHash<QString, Translation*> backboneResult = backbone->result();
197 QHash<QString, QList<Translation*> > searchResult;
203 //if nothing was found
204 if(backboneResult.count() == 0) {
205 showNotification(Notify::Info, tr("Can't find any matching words"));
207 //show empty list to remove results of old search
208 Q_EMIT showWordList(searchResult);
211 //find translations of the same key word
212 QMultiHash<QString, Translation*>::iterator i;
213 for(i = backboneResult.begin(); i != backboneResult.end(); i++) {
214 searchResult[i.key()].push_back(i.value());
217 //show search results
218 Q_EMIT showWordList(searchResult);
221 if(isInExactSearch()) {
222 QList<Translation*> exactTranslation;
223 if(checkExactSearch(searchResult, exactTranslation)) {
224 Q_EMIT searchTranslations(exactTranslation);
227 showNotification(Notify::Info,
228 tr("Can't find exactly matching word"));
231 setExactSearch(false);
235 wordListWidget->setFocus();
238 bool MainWindow::checkExactSearch(
239 QHash<QString, QList<Translation *> > searchResult,
240 QList<Translation *> &found) {
242 bool foundExactMatch = false;
243 QHash<QString, QList<Translation*> >::iterator j;
244 for(j = searchResult.begin(); j != searchResult.end(); j++) {
245 if(j.key().toLower() == searchString.toLower()
246 && !foundExactMatch) {
254 void MainWindow::translationsReady() {
259 Q_EMIT showTranslation(backbone->xmls());
260 wordListWidget->setFocus();
262 notifyManager->screenChanged();
267 void MainWindow::hideWelcomeScreen() {
269 //switch welcome screen with word list
270 if(!wordListWidget->isVisible()) {
271 mainLayout->removeWidget(welcomeScreenWidget);
272 welcomeScreenWidget->deleteLater();
274 mainLayout->insertWidget(0, wordListWidget);
277 //switch welcome screen with translation widget
278 if(!translationWidget->isVisible()) {
279 splitter->insertWidget(1,translationWidget);
280 splitter->setStretchFactor(1, 150);
281 welcomeScreenWidget->deleteLater();
286 QList<CommonDictInterface*> MainWindow::getPlugins() {
287 return backbone->getPlugins();
290 QHash<CommonDictInterface*, bool> MainWindow::getDictionaries() {
291 return backbone->getDictionaries();
295 void MainWindow::search(QString word) {
296 setExactSearch(false);
297 searchBarWidget->search(word);
299 if(translationWidget->isVisible()) {
300 translationWidget->hide();
306 void MainWindow::searchExact(QString word) {
307 setExactSearch(true);
308 searchBarWidget->search(word);
311 void MainWindow::searchDelay(QString word) {
312 searchBarWidget->searchDelay(word);
319 void MainWindow::searchingInterrupted() {
320 //make sure to unset exact search mode
321 setExactSearch(false);
324 void MainWindow::addToHistory(QList<Translation *> trans) {
325 if(trans.count() > 0) {
326 backbone->history()->add(trans[0]->key());
330 void MainWindow::historyNext() {
331 if(backbone->history()->nextAvailable()) {
332 QString next = backbone->history()->next();
334 setExactSearch(true);
340 void MainWindow::historyPrev() {
341 if(backbone->history()->prevAvailable()) {
343 setExactSearch(true);
345 QString prev = backbone->history()->previous();
350 void MainWindow::disableMenu() {
352 if(menuBar->actions().contains(menuWidget)) {
353 menuBar->removeAction(menuWidget);
356 menuBar->setEnabled(false);
360 void MainWindow::enableMenu() {
362 if(!menuBar->actions().contains(menuWidget)) {
363 menuBar->addAction(menuWidget);
366 menuBar->setEnabled(true);
370 void MainWindow::showHistory(QPoint p) {
372 HistoryListDialog historyDialog(backbone->history()->list(), searchBarWidget);
375 QPoint newPos = mapFromGlobal(p);
376 newPos.setY(searchBarWidget->pos().y() -
377 historyDialog.sizeHint().height());
378 newPos.setX(width() - historyDialog.sizeHint().width());
380 historyDialog.move(newPos);
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()));
469 //connect(wordListWidget, SIGNAL(addBookmark(QList<Translation*>)),
470 // this, SIGNAL(setBusy()));
472 //connect(backbone, SIGNAL(bookmarkReady()),
473 // this, SIGNAL(setIdle()));
476 void MainWindow::connectSearchBar() {
477 connect(searchBarWidget, SIGNAL(searchForTranslations(QString)),
478 this, SIGNAL(searchWordList(QString)));
480 connect(searchBarWidget, SIGNAL(stopSearching()),
481 this, SIGNAL(stopSearching()));
483 connect(this, SIGNAL(setBusy()),
484 searchBarWidget, SLOT(setBusy()));
486 connect(this, SIGNAL(setIdle()),
487 searchBarWidget, SLOT(setIdle()));
489 connect(searchBarWidget, SIGNAL(historyNext()),
490 this, SLOT(historyNext()));
492 connect(searchBarWidget, SIGNAL(historyPrev()),
493 this, SLOT(historyPrev()));
495 connect(searchBarWidget, SIGNAL(historyShow(QPoint)),
496 this, SLOT(showHistory(QPoint)));
498 connect(searchBarWidget, SIGNAL(refreshHistoryButtons()),
499 backbone->history(), SLOT(refreshStatus()));
501 connect(backbone->history(), SIGNAL(historyChanged(bool,bool,bool)),
502 searchBarWidget, SLOT(updateHistoryButtons(bool,bool,bool)));
505 void MainWindow::connectWordList() {
507 SIGNAL(showWordList(QHash<QString, QList<Translation*> >)),
509 SLOT(showSearchResults(QHash<QString,QList<Translation*> >)));
511 connect(wordListWidget, SIGNAL(showTranslation(QList<Translation*>)),
512 this, SIGNAL(searchTranslations(QList<Translation*>)));
517 connect(this, SIGNAL(setBusy()),
518 wordListWidget, SLOT(lockList()));
520 connect(this, SIGNAL(setIdle()),
521 wordListWidget, SLOT(unlockList()));
523 connect(wordListWidget, SIGNAL(addBookmark(QList<Translation*>)),
524 backbone, SLOT(addBookmark(QList<Translation*>)));
526 connect(wordListWidget, SIGNAL(removeBookmark(QList<Translation*>)),
527 backbone, SLOT(removeBookmark(QList<Translation*>)));
530 void MainWindow::connectTranslationWidget() {
531 connect(this, SIGNAL(showTranslation(QStringList)),
532 translationWidget, SLOT(show(QStringList)));
535 connect(translationWidget, SIGNAL(search(QString)),
536 this, SLOT(search(QString)));
538 connect(translationWidget, SIGNAL(notify(Notify::NotifyType, QString)),
539 this, SLOT(showNotification(Notify::NotifyType,QString)));
541 connect(translationWidget, SIGNAL(search(QString)),
542 this, SLOT(searchExact(QString)));
547 void MainWindow::connectDictManager() {
548 connect(dictManagerWidget, SIGNAL(addDictionary(CommonDictInterface*)),
549 this, SIGNAL(addNewDictionary(CommonDictInterface*)));
551 connect(dictManagerWidget, SIGNAL(removeDictionary(CommonDictInterface*)),
552 this, SIGNAL(removeDictionary(CommonDictInterface*)));
554 connect(dictManagerWidget,
555 SIGNAL(selectedDictionaries(QList<CommonDictInterface*>)),
556 this, SIGNAL(selectedDictionaries(QList<CommonDictInterface*>)));
559 void MainWindow::connectMenu() {
560 connect(this, SIGNAL(setBusy()),
561 this, SLOT(disableMenu()));
563 connect(this, SIGNAL(setIdle()),
564 this, SLOT(enableMenu()));
568 void MainWindow::connectBookmarksWidget() {
570 //after removing bookmarks we search for them once again to clear the words list
571 connect(bookmarksWidget, SIGNAL(removeAllBookmarks()),
572 this, SLOT(removeBookmarks()));
575 connect(bookmarksWidget, SIGNAL(showAllBookmarks()),
576 menuWidget, SLOT(hideMenu()));
578 connect(bookmarksWidget, SIGNAL(showAllBookmarks()),
579 backbone, SLOT(fetchBookmarks()));
583 connect(bookmarksRemoveAllAction, SIGNAL(triggered()),
584 this, SLOT(removeBookmarks()));
585 connect(bookmarksShowAllAction, SIGNAL(triggered()),
586 backbone, SLOT(fetchBookmarks()));
592 void MainWindow::removeBookmarks() {
595 par = bookmarksWidget;
599 if(QMessageBox::question(par, tr("Delete all bookmarks"),
600 tr("Do you want to delete all bookmarks? (This action cannot be revoked, and will clear current word list)"),
601 QMessageBox::Yes, QMessageBox::Cancel) == QMessageBox::Yes) {
602 backbone->removeAllBookmarks();
603 ((WordListWidget*)wordListWidget)->clear();