Some optimization to settings and searching.
[jenirok] / src / gui / mainwindow.cpp
index d340fa1..4388860 100644 (file)
 #include <QtGui/QWidget>
 #include <QtGui/QHBoxLayout>
 #include <QtGui/QMessageBox>
+#include <QtGui/QDialogButtonBox>
+#include <QtGui/QTextEdit>
+#include <QtCore/QDebug>
 #include <QMaemo5InformationBox>
-#include <QDebug>
 #include "mainwindow.h"
 #include "settingsdialog.h"
 #include "searchdialog.h"
 #include "daemon.h"
 #include "settings.h"
 #include "db.h"
+#include "source.h"
+#include "sourcecoreconfig.h"
 
 namespace
 {
-       const QString START_ICON = ":/icons/start.png";
-       const QString CLOSE_ICON = ":/icons/stop.png";
+    const QString START_ICON = ":/icons/start.png";
+    const QString CLOSE_ICON = ":/icons/stop.png";
 }
 
 MainWindow::MainWindow(QWidget* parent): QMainWindow(parent),
 searchResults_(0), settingsDialog_(0), running_(false),
-toggleButton_(0), searchDialog_(0)
+toggleButton_(0), searchDialog_(0), aboutDialog_(0), warning_(0),
+logWindow_(0)
 {
-       setWindowTitle(tr("Jenirok"));
-       setAttribute(Qt::WA_Maemo5StackedWindow);
-       QWidget* mainWidget = new QWidget(this);
-
-       if(Daemon::isRunning())
-       {
-               toggleButton_ = createButton(tr("Stop daemon"));
-               toggleButton_->setIcon(QIcon(CLOSE_ICON));
-               running_ = true;
-       }
-       else
-       {
-               toggleButton_ = createButton(tr("Start daemon"));
-               toggleButton_->setIcon(QIcon(START_ICON));
-               running_ = false;
-       }
-
-       QToolButton* searchButton = createButton(tr("Search"));
-       searchButton->setIcon(QIcon::fromTheme("general_search"));
-
-       QSize size(64, 64);
-       searchButton->setIconSize(size);
-       toggleButton_->setIconSize(size);
-
-       QHBoxLayout *buttonLayout = new QHBoxLayout;
-       buttonLayout->addWidget(toggleButton_, Qt::AlignLeft);
-       buttonLayout->addWidget(searchButton, Qt::AlignRight);
-
-       mainWidget->setLayout(buttonLayout);
-
-       connect(toggleButton_, SIGNAL(pressed()), this, SLOT(toggleDaemon()));
-       connect(searchButton, SIGNAL(pressed()), this, SLOT(openSearch()));
-
-       setCentralWidget(mainWidget);
-       menuBar()->addAction(tr("Settings"), this, SLOT(showSettings()));
+    setWindowTitle(tr("Jenirok"));
+    setAttribute(Qt::WA_Maemo5StackedWindow);
+    QWidget* mainWidget = new QWidget(this);
+
+    if(Daemon::isRunning())
+    {
+        toggleButton_ = createButton(tr("Stop daemon"));
+        toggleButton_->setIcon(QIcon(CLOSE_ICON));
+        running_ = true;
+    }
+    else
+    {
+        toggleButton_ = createButton(tr("Start daemon"));
+        toggleButton_->setIcon(QIcon(START_ICON));
+        running_ = false;
+    }
+
+    QSizePolicy policy;
+
+    policy.setHorizontalPolicy(QSizePolicy::Preferred);
+
+    toggleButton_->setSizePolicy(policy);
+
+    QToolButton* searchButton = createButton(tr("Search"));
+    searchButton->setIcon(QIcon::fromTheme("general_search"));
+    searchButton->setSizePolicy(policy);
+
+    QToolButton* logButton = createButton(tr("Log"));
+    logButton->setIcon(QIcon::fromTheme("general_call"));
+    logButton->setSizePolicy(policy);
+
+    QSize size(64, 64);
+    searchButton->setIconSize(size);
+    toggleButton_->setIconSize(size);
+    logButton->setIconSize(size);
+
+    QHBoxLayout *buttonLayout = new QHBoxLayout;
+    buttonLayout->addWidget(toggleButton_, Qt::AlignHCenter);
+    buttonLayout->addWidget(searchButton, Qt::AlignHCenter);
+    buttonLayout->addWidget(logButton, Qt::AlignHCenter);
+
+    mainWidget->setLayout(buttonLayout);
+
+    connect(toggleButton_, SIGNAL(pressed()), this, SLOT(toggleDaemon()));
+    connect(searchButton, SIGNAL(pressed()), this, SLOT(openSearch()));
+    connect(logButton, SIGNAL(pressed()), this, SLOT(openLog()));
+
+    setCentralWidget(mainWidget);
+    menuBar()->addAction(tr("Settings"), this, SLOT(showSettings()));
+    menuBar()->addAction(tr("About"), this, SLOT(showAbout()));
 }
 
 MainWindow::~MainWindow()
 {
-       DB::removeDatabase();
+    DB::removeDatabase();
 }
 
 void MainWindow::showSettings()
 {
-       if(!settingsDialog_)
-       {
-               settingsDialog_ = new SettingsDialog(this);
-       }
+    if(warning_ && warning_->isVisible())
+    {
+        warning_->hide();
+    }
+
+    if(!settingsDialog_)
+    {
+        settingsDialog_ = new SettingsDialog(this);
 
-       settingsDialog_->show();
+        if(searchDialog_)
+        {
+            connect(settingsDialog_, SIGNAL(saved()), searchDialog_, SLOT(loadSearchTypes()));
+        }
+    }
+
+    settingsDialog_->show();
 }
 
 void MainWindow::toggleDaemon()
@@ -102,66 +132,123 @@ void MainWindow::toggleDaemon()
 
     if(running_)
     {
-               readyText = tr("Daemon was successfully stopped.");
-               failText = tr("Unable to stop daemon.");
-               buttonText = tr("Start daemon");
-               ret = Daemon::stop();
+        readyText = tr("Daemon was successfully stopped.");
+        failText = tr("Unable to stop daemon.");
+        buttonText = tr("Start daemon");
+        ret = Daemon::stop();
     }
     else
     {
-       readyText = tr("Daemon was successfully started.");
-       failText = tr("Unable to start daemon.");
-       buttonText = tr("Stop daemon");
-       ret = Daemon::start();
+        if(Settings::instance()->getConnectionType() == Settings::ALWAYS_ASK)
+        {
+            if(!warning_)
+            {
+                warning_ = new QDialog(this);
+                warning_->setWindowTitle(tr("Unable to start daemon"));
+                QHBoxLayout* warningLayout = new QHBoxLayout;
+                QTextEdit* text = new QTextEdit(tr("Daemon cannot be started because it's not allowed to connect to the Internet. You have to either allow automatic Internet connection in Jenirok settings or in global Maemo settings."));
+                text->setReadOnly(true);
+                QDialogButtonBox* buttons = new QDialogButtonBox;
+                buttons->setOrientation(Qt::Vertical);
+                QPushButton* settingsButton = new QPushButton(tr("Open settings"));
+                connect(settingsButton, SIGNAL(pressed()), this, SLOT(showSettings()));
+                QPushButton* okButton = new QPushButton(tr("Close"));
+                connect(okButton, SIGNAL(pressed()), warning_, SLOT(hide()));
+                buttons->addButton(settingsButton, QDialogButtonBox::YesRole);
+                buttons->addButton(okButton, QDialogButtonBox::AcceptRole);
+                warningLayout->addWidget(text);
+                warningLayout->addWidget(buttons);
+                warning_->setLayout(warningLayout);
+            }
+
+            warning_->show();
+
+            return;
+        }
+
+        readyText = tr("Daemon was successfully started.");
+        failText = tr("Unable to start daemon.");
+        buttonText = tr("Stop daemon");
+        ret = Daemon::start();
     }
 
     if(!ret)
     {
-       QMessageBox::critical(this, tr("Error"), failText);
+        QMessageBox::critical(this, tr("Error"), failText);
     }
     else
     {
-       QMaemo5InformationBox::information(this, readyText);
-       toggleButton_->setText(buttonText);
-       toggleButton_->setIcon(QIcon(running_ ? START_ICON : CLOSE_ICON));
-       running_ = !running_;
+        QMaemo5InformationBox::information(this, readyText, 800);
+        toggleButton_->setText(buttonText);
+        toggleButton_->setIcon(QIcon(running_ ? START_ICON : CLOSE_ICON));
+        running_ = !running_;
     }
 
 }
 
-void MainWindow::openSearch()
+void MainWindow::openSearch(QString const& str)
 {
-       DB::connect();
+    Source::SourceId sourceId = Source::stringToId(Settings::instance()->get("source"));
+    SourceCoreConfig* config = SourceCoreConfig::getCoreConfig(sourceId);
+
+    Q_ASSERT(config != 0);
 
-       QString username = Settings::instance()->get("eniro_username");
-       QString password = Settings::instance()->get("eniro_password");
+    bool readyToSearch = config->readyToSearch();
+    delete config;
 
-       DB::disconnect();
+    if(!readyToSearch)
+    {
+        QMessageBox::information(this, tr("Info"), tr("You need to set login details or other options in settings before using this feature."));
+        return;
+    }
 
-       if(username.isEmpty() || password.isEmpty())
-       {
-               QMessageBox::information(this, tr("Info"), tr("You need to set Eniro login details in settings before using this feature."));
-               return;
-       }
+    if(!searchDialog_)
+    {
+        searchDialog_ = new SearchDialog(this);
+        connect(searchDialog_, SIGNAL(search(SearchDialog::SearchDetails&)),
+                this, SIGNAL(search(SearchDialog::SearchDetails&)));
+
+        if(settingsDialog_)
+        {
+            connect(settingsDialog_, SIGNAL(saved()), searchDialog_, SLOT(loadSearchTypes()));
+        }
+    }
 
-       if(!searchDialog_)
-       {
-               searchDialog_ = new SearchDialog(this);
-               connect(searchDialog_, SIGNAL(search(SearchDialog::SearchDetails&)), this, SLOT(handleSearch(SearchDialog::SearchDetails&)));
-       }
+    if(!str.isEmpty())
+    {
+        searchDialog_->setSearchString(str);
+    }
 
-       searchDialog_->show();
+    searchDialog_->show();
+}
+
+void MainWindow::openLog()
+{
+    if(!logWindow_)
+    {
+        logWindow_ = new LogWindow(this);
+        connect(logWindow_, SIGNAL(logItemSelected(Source::Result const&)), this, SIGNAL(logItemSelected(Source::Result const&)));
+        connect(logWindow_, SIGNAL(openSearch(QString const&)), this, SLOT(openSearch(QString const&)));
+    }
+
+    logWindow_->show();
 }
 
 QToolButton* MainWindow::createButton(QString const& text)
 {
-       QToolButton* button = new QToolButton();
-       button->setText(text);
-       button->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
-       return button;
+    QToolButton* button = new QToolButton();
+    button->setText(text);
+    button->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
+    return button;
 }
 
-void MainWindow::handleSearch(SearchDialog::SearchDetails& details)
+void MainWindow::showAbout()
 {
-       emit search(details);
+    if(!aboutDialog_)
+    {
+        aboutDialog_ = new AboutDialog(this);
+    }
+
+    aboutDialog_->show();
+
 }