+/*******************************************************************************
+
+ This file is part of mDictionary.
+
+ mDictionary is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ mDictionary is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with mDictionary. If not, see <http://www.gnu.org/licenses/>.
+
+ Copyright 2010 Comarch S.A.
+
+*******************************************************************************/
+
+//Created by Mateusz Półrola
+
#include "MainWindow.h"
#include "ui_MainWindow.h"
+#include <QtGui>
+#ifdef Q_WS_MAEMO_5
+ #include <QMaemo5InformationBox>
+#endif
+
MainWindow::MainWindow(Backbone *backbone, QWidget *parent):
- QMainWindow(parent),
+ GUIInterface(parent),
ui(new Ui::MainWindow) {
this->backbone = backbone;
- ui->setupUi(this);
- setAttribute(Qt::WA_Maemo5StackedWindow);
-
- searchBarWidget = new SearchBarWidget(backbone);
- wordListWidget = new WordListWidget(backbone);
- translationWidget = new TranslationWidget(backbone, this);
+ initializeUI();
- connect(wordListWidget, SIGNAL(clicked(QModelIndex)),
- translationWidget, SLOT(show(QModelIndex)));
+ connectBackbone();
+ connectSearchBar();
+ connectWordList();
+ connectTranslationWidget();
+ connectDictManager();
+ connectMenu();
+ connectBookmarksWidget();
- ui->centralWidget->layout()->addWidget(wordListWidget);
- ui->centralWidget->layout()->addWidget(searchBarWidget);
+ setExactSearch(false);
- connect(this, SIGNAL(quit()),
- backbone, SLOT(quit()));
+ setWindowTitle("mDictionary");
- connect(backbone, SIGNAL(closeOk()),
- this, SLOT(closeOk()));
+ showMaximized();
}
MainWindow::~MainWindow() {
}
+void MainWindow::initializeUI() {
+ ui->setupUi(this);
+
+ #ifdef Q_WS_MAEMO_5
+ setAttribute(Qt::WA_Maemo5StackedWindow);
+ #endif
+
+ searchBarWidget = new SearchBarWidget;
+
+ wordListWidget = new WordListWidget;
+
+ //translationWidget is antoher stacked window, so we don't add it to layout
+ //only create it with this widget as parent
+ translationWidget = new TranslationWidget(this);
+
+ welcomeScreenWidget = new WelcomeScreenWidget;
+
+
+ #ifdef Q_WS_MAEMO_5
+ //At start we set widget as welcome screen widget
+ ui->centralWidget->layout()->addWidget(welcomeScreenWidget);
+ QVBoxLayout* vl = (QVBoxLayout*)(ui->centralWidget->layout());
+ vl->addWidget(searchBarWidget, 0, Qt::AlignBottom);
+ #else
+ translationWidget->hide();
+ //we add to splitter word list and welcome screen
+ splitter = new QSplitter(Qt::Horizontal);
+ splitter->addWidget(wordListWidget);
+ splitter->addWidget(welcomeScreenWidget);
+ splitter->setStretchFactor(1, 150);
+ ui->centralWidget->layout()->addWidget(splitter);
+ ui->centralWidget->layout()->addWidget(searchBarWidget);
+ #endif
+
+
+
+ dictManagerWidget = new DictManagerWidget(this);
+ dictManagerWidget->hide();
+
+ settingsWidget = new SettingsWidget(this);
+ settingsWidget->hide();
+
+ bookmarksWidget = new BookmarksWidget(this);
+ bookmarksWidget->hide();
+
+ aboutWidget = new AboutWidget(this);
+ aboutWidget->hide();
+
+
+ //creating menus
+
+ #ifdef Q_WS_MAEMO_5
+ menuWidget = new MenuWidget(this);
+ menuWidget->addSubMenu(tr("Settings"), settingsWidget);
+ menuWidget->addSubMenu(tr("Dictionaries"), dictManagerWidget);
+ menuWidget->addSubMenu(tr("Bookmarks"), bookmarksWidget);
+ menuWidget->addSubMenu(tr("About"), aboutWidget);
+ ui->menuBar->addAction(menuWidget);
+ #else
+ dictionariesAction = ui->menuBar->addAction(tr("Dictionaries"));
+ connect(dictionariesAction, SIGNAL(triggered()),
+ dictManagerWidget, SLOT(show()));
+
+ settingsAction = ui->menuBar->addAction(tr("Settings"));
+ connect(settingsAction, SIGNAL(triggered()),
+ settingsWidget, SLOT(show()));
+
+ QMenu* m = ui->menuBar->addMenu(tr("Bookmarks"));
+ bookmarksShowAllAction = new QAction(tr("Show all"), m);
+
+ bookmarksRemoveAllAction = new QAction(tr("Remove all"), m);
+
+ m->addAction(bookmarksShowAllAction);
+ m->addAction(bookmarksRemoveAllAction);
+
+ aboutAction = ui->menuBar->addAction(tr("About"));
+ connect(aboutAction, SIGNAL(triggered()),
+ aboutWidget, SLOT(show()));
+ #endif
+
+}
+
void MainWindow::closeEvent(QCloseEvent *event) {
- if(searchBarWidget->isSearching()) {
+ //reqest to stop all searches and close app
emit quit();
- event->ignore();
+ event->accept();
+}
+
+bool MainWindow::exactSearch() {
+ return _exactSearch;
+}
+
+void MainWindow::setExactSearch(bool exact) {
+ _exactSearch = exact;
+}
+
+void MainWindow::setSearchString(QString word) {
+ searchString = word;
+}
+
+void MainWindow::wordListReady() {
+ //gets results from backbone
+ QMultiHash<QString, Translation*> res = backbone->result();
+ QHash<QString, QList<Translation*> > searchResult;
+
+ #ifdef Q_WS_MAEMO_5
+ //switch welcome screen with word list
+ if(!wordListWidget->isVisible()) {
+ int i = ui->centralWidget->layout()->indexOf(welcomeScreenWidget);
+ QBoxLayout* l = (QBoxLayout*)(ui->centralWidget->layout());
+ l->removeWidget(welcomeScreenWidget);
+ welcomeScreenWidget->deleteLater();
+ l->insertWidget(0, wordListWidget);
+ }
+ #endif
+
+ //if nothing was found
+ if(res.count() == 0) {
+ #ifdef Q_WS_MAEMO_5
+ QMaemo5InformationBox::information(this,
+ tr("Can't find any matching words"),
+ QMaemo5InformationBox::DefaultTimeout);
+ #endif
+ //show empty list to remove results of old search
+ emit showWordList(searchResult);
+ }
+ else {
+ //find translations of the same key word
+ QMultiHash<QString, Translation*>::iterator i;
+ for(i = res.begin(); i != res.end(); i++) {
+ searchResult[i.key()].push_back(i.value());
+ }
+
+
+ if(!exactSearch()) {
+ emit showWordList(searchResult);
+ }
+ else {
+ #ifndef Q_WS_MAEMO_5
+ //on desktop we show word list in exact search
+ emit showWordList(searchResult);
+ #endif
+ bool foundExactMatch = false;
+ QHash<QString, QList<Translation*> >::iterator j;
+ for(j = searchResult.begin(); j != searchResult.end(); j++) {
+ if(j.key() == searchString && !foundExactMatch) {
+ foundExactMatch = true;
+ emit searchTranslations(j.value());
+ break;
+ }
+ }
+
+ if(!foundExactMatch) {
+ #ifdef Q_WS_MAEMO_5
+ QMaemo5InformationBox::information(this,
+ tr("Can't find exactly matching word"),
+ QMaemo5InformationBox::DefaultTimeout);
+ #endif
+
+ emit showWordList(searchResult);
+ }
+
+ }
+ }
+ setExactSearch(false);
+}
+
+void MainWindow::translationsReady() {
+ #ifndef Q_WS_MAEMO_5
+ //switch welcome screen with translation widget
+ if(!translationWidget->isVisible()) {
+ int i = ui->centralWidget->layout()->indexOf(welcomeScreenWidget);
+ QBoxLayout* l = (QBoxLayout*)(ui->centralWidget->layout());
+ QSplitter* s = (QSplitter*)((QWidgetItem*)(l->itemAt(0))->widget());
+ s->insertWidget(1,translationWidget);
+ s->setStretchFactor(1, 150);
+ welcomeScreenWidget->deleteLater();
+ }
+ #endif
+
+ emit showTranslation(backbone->htmls());
+}
+
+QList<CommonDictInterface*> MainWindow::getPlugins() {
+ return backbone->getPlugins();
+}
+
+QHash<CommonDictInterface*, bool> MainWindow::getDictionaries() {
+ return backbone->getDictionaries();
+}
+
+void MainWindow::searchExact(QString word) {
+ setExactSearch(true);
+ //searching with searchBar, not directly by emiting searchWordList(),
+ //because it will set search word in searchBar's edit line
+ //this function is only used by history and when searching from attributes
+ searchBarWidget->search(word);
+}
+
+
+
+void MainWindow::breakSearching() {
+ //make sure to unset exact search mode
+ setExactSearch(false);
+}
+
+void MainWindow::addToHistory(QList<Translation *> trans) {
+ if(trans.count() > 0) {
+ backbone->history()->add(trans[0]->key());
+ translationWidget->setWindowTitle(trans[0]->key());
+ }
+}
+
+void MainWindow::historyNext() {
+ if(backbone->history()->nextAvailable()) {
+ QString next = backbone->history()->next();
+ #ifndef Q_WS_MAEMO_5
+ setExactSearch(true);
+ #endif
+ searchBarWidget->searchDelay(next);
+ }
+}
+
+void MainWindow::historyPrev() {
+ if(backbone->history()->prevAvailable()) {
+ #ifndef Q_WS_MAEMO_5
+ setExactSearch(true);
+ #endif
+ QString prev = backbone->history()->previous();
+ searchBarWidget->searchDelay(prev);
}
}
-void MainWindow::closeOk() {
- QMainWindow::close();
+void MainWindow::disableMenu() {
+ #ifdef Q_WS_MAEMO_5
+ if(ui->menuBar->actions().contains(menuWidget)) {
+ ui->menuBar->removeAction(menuWidget);
+ }
+ #else
+ ui->menuBar->setEnabled(false);
+ #endif
+}
+
+void MainWindow::enableMenu() {
+ #ifdef Q_WS_MAEMO_5
+ if(!ui->menuBar->actions().contains(menuWidget)) {
+ ui->menuBar->addAction(menuWidget);
+ }
+ #else
+ ui->menuBar->setEnabled(true);
+ #endif
+}
+
+void MainWindow::showHistory() {
+ HistoryListDialog historyDialog(backbone->history()->list(), this);
+ if(historyDialog.exec() == QDialog::Accepted) {
+ backbone->history()->setCurrentElement(historyDialog.selectedRow());
+ searchExact(historyDialog.selectedWord());
+ }
+}
+
+void MainWindow::setSettings(Settings *s) {
+ backbone->setSettings(s);
+}
+
+Settings* MainWindow::settings() {
+ return backbone->settings();
+}
+
+void MainWindow::connectBackbone() {
+ connect(this, SIGNAL(quit()),
+ backbone, SLOT(quit()));
+
+ connect(this, SIGNAL(searchWordList(QString)),
+ backbone, SLOT(search(QString)));
+
+ connect(this, SIGNAL(searchTranslations(QList<Translation*>)),
+ backbone, SLOT(searchHtml(QList<Translation*>)));
+
+ connect(this, SIGNAL(stopSearching()),
+ backbone, SLOT(stopSearching()));
+
+ connect(this, SIGNAL(stopSearching()),
+ this, SLOT(breakSearching()));
+
+ connect(this, SIGNAL(addNewDictionary(CommonDictInterface*)),
+ backbone, SLOT(addDictionary(CommonDictInterface*)));
+
+ connect(this, SIGNAL(removeDictionary(CommonDictInterface*)),
+ backbone, SLOT(removeDictionary(CommonDictInterface*)));
+
+ connect(this, SIGNAL(selectedDictionaries(QList<CommonDictInterface*>)),
+ backbone, SLOT(selectedDictionaries(QList<CommonDictInterface*>)));
+
+
+ connect(backbone, SIGNAL(ready()),
+ this, SIGNAL(setIdle()));
+
+ connect(backbone, SIGNAL(htmlReady()),
+ this, SIGNAL(setIdle()));
+
+
+ connect(backbone, SIGNAL(ready()),
+ this, SLOT(wordListReady()));
+
+ connect(backbone, SIGNAL(htmlReady()),
+ this, SLOT(translationsReady()));
+
+ connect(backbone, SIGNAL(searchCanceled()),
+ this, SIGNAL(setIdle()));
+
+
+
+
+ connect(this, SIGNAL(searchWordList(QString)),
+ this, SIGNAL(setBusy()));
+
+ connect(this, SIGNAL(searchTranslations(QList<Translation*>)),
+ this, SIGNAL(setBusy()));
+
+ connect(this, SIGNAL(stopSearching()),
+ this, SIGNAL(setIdle()));
+
+ connect(this, SIGNAL(searchWordList(QString)),
+ this, SLOT(setSearchString(QString)));
+
+ connect(this, SIGNAL(searchTranslations(QList<Translation*>)),
+ this, SLOT(addToHistory(QList<Translation*>)));
+
+
+}
+
+void MainWindow::connectSearchBar() {
+ connect(searchBarWidget, SIGNAL(searchForTranslations(QString)),
+ this, SIGNAL(searchWordList(QString)));
+
+ connect(searchBarWidget, SIGNAL(stopSearching()),
+ this, SIGNAL(stopSearching()));
+
+ connect(this, SIGNAL(setBusy()),
+ searchBarWidget, SLOT(setBusy()));
+
+ connect(this, SIGNAL(setIdle()),
+ searchBarWidget, SLOT(setIdle()));
+
+ connect(searchBarWidget, SIGNAL(historyNext()),
+ this, SLOT(historyNext()));
+
+ connect(searchBarWidget, SIGNAL(historyPrev()),
+ this, SLOT(historyPrev()));
+
+ connect(searchBarWidget, SIGNAL(historyShow()),
+ this, SLOT(showHistory()));
+
+ connect(searchBarWidget, SIGNAL(refreshHistoryButtons()),
+ backbone->history(), SLOT(refreshStatus()));
+
+ connect(backbone->history(), SIGNAL(historyChanged(bool,bool,bool)),
+ searchBarWidget, SLOT(updateHistoryButtons(bool,bool,bool)));
+}
+
+void MainWindow::connectWordList() {
+ connect(this,
+ SIGNAL(showWordList(QHash<QString, QList<Translation*> >)),
+ wordListWidget,
+ SLOT(showSearchResults(QHash<QString,QList<Translation*> >)));
+
+ connect(wordListWidget, SIGNAL(showTranslation(QList<Translation*>)),
+ this, SIGNAL(searchTranslations(QList<Translation*>)));
+
+
+
+
+ connect(this, SIGNAL(setBusy()),
+ wordListWidget, SLOT(lockList()));
+
+ connect(this, SIGNAL(setIdle()),
+ wordListWidget, SLOT(unlockList()));
+
+ connect(wordListWidget, SIGNAL(addBookmark(QList<Translation*>)),
+ backbone, SLOT(addBookmark(QList<Translation*>)));
+
+ connect(wordListWidget, SIGNAL(removeBookmark(QList<Translation*>)),
+ backbone, SLOT(removeBookmark(QList<Translation*>)));
+}
+
+void MainWindow::connectTranslationWidget() {
+ connect(this, SIGNAL(showTranslation(QStringList)),
+ translationWidget, SLOT(show(QStringList)));
+
+}
+
+void MainWindow::connectDictManager() {
+ connect(dictManagerWidget, SIGNAL(addDictionary(CommonDictInterface*)),
+ this, SIGNAL(addNewDictionary(CommonDictInterface*)));
+
+ connect(dictManagerWidget, SIGNAL(removeDictionary(CommonDictInterface*)),
+ this, SIGNAL(removeDictionary(CommonDictInterface*)));
+
+ connect(dictManagerWidget,
+ SIGNAL(selectedDictionaries(QList<CommonDictInterface*>)),
+ this, SIGNAL(selectedDictionaries(QList<CommonDictInterface*>)));
+}
+
+void MainWindow::connectMenu() {
+ connect(this, SIGNAL(setBusy()),
+ this, SLOT(disableMenu()));
+
+ connect(this, SIGNAL(setIdle()),
+ this, SLOT(enableMenu()));
+}
+
+
+void MainWindow::connectBookmarksWidget() {
+ #ifdef Q_WS_MAEMO_5
+ //after removing bookmarks we search for it once again to clear word list
+ connect(bookmarksWidget, SIGNAL(removeAllBookmarks()),
+ backbone, SLOT(removeAllBookmark()));
+
+ connect(bookmarksWidget, SIGNAL(removeAllBookmarks()),
+ backbone, SLOT(fetchBookmarks()));
+
+
+ connect(bookmarksWidget, SIGNAL(showAllBookmarks()),
+ menuWidget, SLOT(hideMenu()));
+
+ connect(bookmarksWidget, SIGNAL(showAllBookmarks()),
+ backbone, SLOT(fetchBookmarks()));
+
+
+ #else
+ connect(bookmarksShowAllAction, SIGNAL(triggered()),
+ backbone, SLOT(fetchBookmarks()));
+
+ connect(bookmarksRemoveAllAction, SIGNAL(triggered()),
+ backbone, SLOT(removeAllBookmark()));
+
+ connect(bookmarksRemoveAllAction, SIGNAL(triggered()),
+ backbone, SLOT(fetchBookmarks()));
+ #endif
}