init
[qstardict] / qstardict / mainwindow.cpp
diff --git a/qstardict/mainwindow.cpp b/qstardict/mainwindow.cpp
new file mode 100644 (file)
index 0000000..ce20a74
--- /dev/null
@@ -0,0 +1,260 @@
+/*****************************************************************************
+ * mainwindow.cpp - QStarDict, a StarDict clone written with using Qt        *
+ * Copyright (C) 2007-2009 Alexander                                         *
+ *                                                                           *
+ * This program 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 2 of the License, or         *
+ * (at your option) any later version.                                       *
+ *                                                                           *
+ * This program 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 this program; if not, write to the Free Software Foundation, Inc.,   *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.               *
+ *****************************************************************************/
+
+#include "mainwindow.h"
+
+#include <QApplication>
+#include <QCloseEvent>
+#include <QDesktopServices>
+#include <QDir>
+#include <QFile>
+#include <QFileDialog>
+#include <QListWidgetItem>
+#include <QKeyEvent>
+#include <QMenu>
+#include <QMessageBox>
+#include <QSettings>
+#include <QTextStream>
+#include <QTimerEvent>
+#include <QToolBar>
+#include "dictcore.h"
+#include "application.h"
+#include "popupwindow.h"
+#include "settingsdialog.h"
+#include "trayicon.h"
+
+namespace QStarDict 
+{
+
+MainWindow::MainWindow(QWidget *parent)
+        : QMainWindow(parent)
+{
+    setupUi(this);
+    m_dict = 0;
+    translationView->setDict(m_dict);
+
+    QFont font;
+    font.setPointSize(16);
+
+    menu_File->insertActions(actionQuit, translationView->toolBar()->actions());
+
+    QAction *actionWordsListDock = wordsListDock->toggleViewAction();
+    menu_Options->insertAction(menu_Options->actions().first(), actionWordsListDock);
+    actionWordsListDock->setFont(font);
+    wordsList->setProperty("FingerScrollable", true);
+    translationView->setProperty("FingerScrollable", true);
+    createConnections();
+
+    loadSettings();
+}
+
+MainWindow::~MainWindow()
+{
+    saveSettings();
+}
+
+void MainWindow::showTranslation(const QString &text)
+{
+    searchBox->setText(text);
+    on_queryButton_clicked();
+}
+
+void MainWindow::createConnections()
+{
+    connect(actionAboutQt, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
+    connect(actionQuit, SIGNAL(triggered()), qApp, SLOT(quit()));
+    actionScan->setChecked(Application::instance()->popupWindow()->isScan());
+    connect(actionScan, SIGNAL(toggled(bool)), 
+            Application::instance()->popupWindow(), SLOT(setScan(bool)));
+    connect(Application::instance()->popupWindow(), SIGNAL(scanChanged(bool)),
+            actionScan, SLOT(setChecked(bool)));
+    connect(wordsList, SIGNAL(itemActivated(QListWidgetItem*)),
+            SLOT(wordsListItemActivated(QListWidgetItem*)));
+    connect(wordsList, SIGNAL(itemClicked(QListWidgetItem*)),
+            SLOT(wordsListItemActivated(QListWidgetItem*)));
+
+    connect(translationView, SIGNAL(wordTranslated(const QString&)),
+            SLOT(wordTranslated(const QString&)));
+}
+
+void MainWindow::loadSettings()
+{
+    QSettings config;
+    restoreGeometry(config.value("MainWindow/geometry", QByteArray()).toByteArray());
+    restoreState(config.value("MainWindow/state", QByteArray()).toByteArray());
+    setVisible(config.value("MainWindow/visible", true).toBool());
+    #ifndef MAEMO
+    if (isHidden() && ! Application::instance()->trayIcon()->isVisible())
+        show();
+    #endif // MAEMO
+    wordsListDock->setFloating(config.value("MainWindow/wordsListDock/floating", wordsListDock->isFloating()).toBool());
+    wordsListDock->setGeometry(config.value("MainWindow/wordsListDock/geometry", wordsListDock->geometry()).toRect());
+    setInstantSearch(config.value("MainWindow/instantSearch", true).toBool());
+    setDefaultStyleSheet(config.value("MainWindow/defaultStyleSheet", defaultStyleSheet()).toString());
+}
+
+void MainWindow::saveSettings()
+{
+    QSettings config;
+    config.setValue("MainWindow/geometry", saveGeometry());
+    config.setValue("MainWindow/state", saveState());
+    config.setValue("MainWindow/visible", isVisible());
+    config.setValue("MainWindow/wordsListDock/floating", wordsListDock->isFloating());
+    config.setValue("MainWindow/wordsListDock/geometry", wordsListDock->geometry());
+    config.setValue("MainWindow/instantSearch", m_instantSearch);
+    config.setValue("MainWindow/defaultStyleSheet", defaultStyleSheet());
+}
+
+void MainWindow::on_actionAbout_triggered()
+{
+    QMessageBox::about(this,
+            tr("About QStarDict"),
+            tr("<b>QStarDict %1 </b> - Qt version of StarDict<br>").arg(QSTARDICT_VERSION) +
+            tr("Copyright (C) 2007-2009 Alexander Rodin "
+               "<a href=\"http://qstardict.ylsoftware.com\">http://qstardict.ylsoftware.com</a><br>"
+               "Package by SR<br>"
+               "<a href=\"http://sr.uz\">http://sr.uz</a>"));
+}
+
+void MainWindow::on_actionSettings_triggered()
+{
+    SettingsDialog dialog(this);
+    dialog.exec();
+}
+
+void MainWindow::on_actionHelp_triggered()
+{
+    QDesktopServices::openUrl(QUrl("http://wiki.qstardict.ylsoftware.com"));
+}
+
+void MainWindow::on_queryButton_clicked()
+{
+    if (searchBox->text().simplified().isEmpty())
+    {
+        setWindowTitle(tr("QStarDict"));
+        translationView->clear();
+        wordsList->clear();
+        return;
+    }
+    wordsList->clear();
+    wordsList->addItems(m_dict->findSimilarWords(searchBox->text()));
+    translationView->translate(searchBox->text());
+}
+
+void MainWindow::reload()
+{
+    wordsList->clear();
+    wordsList->addItems(m_dict->findSimilarWords(translationView->translatedWord()));
+    translationView->reload();
+}
+
+void MainWindow::queryEdited(const QString &)
+{
+    if (m_queryTimer)
+        killTimer(m_queryTimer);
+    m_queryTimer = startTimer(200);
+}
+
+void MainWindow::timerEvent(QTimerEvent *event)
+{
+    if (event->timerId() == m_queryTimer)
+    {
+        killTimer(m_queryTimer);
+        m_queryTimer = 0;
+        on_queryButton_clicked();
+    }
+    else
+        QMainWindow::timerEvent(event);
+}
+
+void MainWindow::wordTranslated(const QString &word)
+{
+    #ifndef MAEMO
+    if (word.simplified().isEmpty())
+        setWindowTitle(tr("QStarDict"));
+    else
+        setWindowTitle(tr("%1 - QStarDict").arg(word));
+    #endif // MAEMO
+    if (m_queryTimer)
+    {
+        killTimer(m_queryTimer);
+        m_queryTimer = 0;
+    }
+}
+
+void MainWindow::wordsListItemActivated(QListWidgetItem *item)
+{
+    searchBox->setText(item->text());
+    translationView->translate(item->text());
+    #ifndef MAEMO
+    setWindowTitle(tr("%1 - QStarDict").arg(translationView->translatedWord()));
+    #endif // MAEMO
+}
+
+void MainWindow::setInstantSearch(bool instantSearch)
+{
+    if (instantSearch == m_instantSearch)
+        return;
+    m_instantSearch = instantSearch;
+    if (m_instantSearch)
+        connect(searchBox, SIGNAL(textEdited(const QString&)), SLOT(queryEdited(const QString&)));
+    else
+        disconnect(searchBox, SIGNAL(textEdited(const QString&)), this, SLOT(queryEdited(const QString&)));
+}
+
+void MainWindow::setDict(DictCore *dict)
+{
+    m_dict = dict;
+    translationView->setDict(dict);
+}
+
+void MainWindow::keyPressEvent(QKeyEvent *event)
+{
+    if (event->text().size() || event->key() == Qt::Key_Escape)
+    {
+        if (! searchBox->hasFocus())
+        {
+            searchBox->setText(event->text());
+            searchBox->setFocus(Qt::OtherFocusReason);
+        }
+        if (event->key() == Qt::Key_Escape)
+        {
+            if (searchBox->text().isEmpty())
+                close();
+            else
+                searchBox->clear();
+        }
+    }
+    QMainWindow::keyPressEvent(event);
+}
+
+void MainWindow::closeEvent(QCloseEvent *event)
+{
+    #ifndef MAEMO
+    if (! Application::instance()->trayIcon()->isVisible())
+        Application::instance()->quit();
+    #endif // MAEMO
+
+    QMainWindow::closeEvent(event);
+}
+
+}
+
+// vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc
+