diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 8544402..5292e67 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -44,6 +44,7 @@ #include "model/danboorupoolmodel.h" #include "mainwindow.h" #include "danbooruconnectwidget.h" +#include "danboorusearchwidget.h" #include "danboorusettings.h" #include "generalpage.h" @@ -62,8 +63,10 @@ DanbooruMainWindow::DanbooruMainWindow(QWidget *parent) m_model(new DanbooruPostModel(this)), m_poolModel(new DanbooruPoolModel(this)), m_service(new DanbooruService()), + m_connectWidget(nullptr), + m_searchWidget(new DanbooruSearchWidget(this)), m_tableView(new QTableView(this)), - m_cache(0) + m_cache(nullptr) { m_service->setParent(this); @@ -99,21 +102,11 @@ DanbooruMainWindow::DanbooruMainWindow(QWidget *parent) QVector boardsList = { QUrl("http://konachan.com"), QUrl("https://yande.re") }; - m_connectWidget = new DanbooruConnectWidget(boardsList); + m_connectWidget = new DanbooruConnectWidget(boardsList, this); statusBar()->addPermanentWidget(m_connectWidget); m_connectWidget->hide(); - // Set up PoolWidget - m_tableView->setModel(m_poolModel); - QDockWidget* dockWidget = new QDockWidget(i18n("Pools"), this); - dockWidget->setAllowedAreas(Qt::BottomDockWidgetArea); - dockWidget->setWidget(m_tableView); - dockWidget->setObjectName("PoolView"); - // Prevent the use of winId() when detached, leads to QQuickWidget bugs - dockWidget->setFeatures(QDockWidget::DockWidgetClosable); - addDockWidget(Qt::BottomDockWidgetArea, dockWidget); - m_tableView->hide(); - dockWidget->hide(); + setupDockWidgets(); // then, setup our actions setupActions(); @@ -139,10 +132,12 @@ DanbooruMainWindow::DanbooruMainWindow(QWidget *parent) actionCollection()->action(QLatin1String("find"))->setEnabled(true); actionCollection()->action(QLatin1String("poolDownload"))->setEnabled(true); - m_view->rootObject()->setProperty("poolMode", QVariant(false)); - m_connectWidget->hide(); - m_service->setPostTags(QStringList()); - m_service->getPostList(); + if (DanbooruSettings::self()->autoDownload()) { + m_view->rootObject()->setProperty("poolMode", QVariant(false)); + m_connectWidget->hide(); + m_service->setPostTags(QStringList()); + m_service->getPostList(); + } }); @@ -167,9 +162,20 @@ DanbooruMainWindow::DanbooruMainWindow(QWidget *parent) }); - connect(dockWidget, &QDockWidget::visibilityChanged, [this](bool visible) { - actionCollection()->action(QLatin1String("poolDownload"))->setChecked(visible); + connect(m_searchWidget, &DanbooruSearchWidget::accepted, [this]() { + QDockWidget* searchDockWidget = findChild(QLatin1String("SearchView")); + searchDockWidget->hide(); + + m_model->clear(); + m_service->setPostTags(m_searchWidget->selectedTags()); + m_view->rootObject()->setProperty("poolMode", QVariant(false)); + m_service->getPostList(); + }); + + connect(m_searchWidget, &DanbooruSearchWidget::rejected, [this]() { + QDockWidget* searchDockWidget = findChild(QLatin1String("SearchView")); + searchDockWidget->hide(); }); } @@ -189,6 +195,7 @@ void DanbooruMainWindow::loadSettings() } + void DanbooruMainWindow::setupActions() { @@ -199,7 +206,7 @@ void DanbooruMainWindow::setupActions() QAction *fetchAction = new QAction(QIcon::fromTheme(QLatin1String("download")), i18n("Download"), this); - QAction *findAction = new QAction(QIcon::fromTheme(QLatin1String("edit-find")), + KToggleAction *findAction = new KToggleAction(QIcon::fromTheme(QLatin1String("edit-find")), i18n("Search"), this); KToggleAction *poolAction = new KToggleAction(QIcon::fromTheme(QLatin1String("image-x-generic")), i18n("Pools"), this); @@ -208,6 +215,9 @@ void DanbooruMainWindow::setupActions() findAction->setEnabled(false); poolAction->setEnabled(false); + poolAction->setChecked(false); + findAction->setChecked(false); + actionCollection()->addAction(QLatin1String("connect"), connectAction); actionCollection()->addAction(QLatin1String("fetch"), fetchAction); actionCollection()->addAction(QLatin1String("find"), findAction); @@ -215,19 +225,19 @@ void DanbooruMainWindow::setupActions() actionCollection()->setDefaultShortcut(connectAction, KStandardShortcut::Open); actionCollection()->setDefaultShortcut(findAction, KStandardShortcut::Find); - // actionCollection()->removeAction(actionCollection()->action("help_contents")); KStandardAction::quit(qApp, SLOT(quit()), actionCollection()); KStandardAction::preferences(this, SLOT(optionsPreferences()), actionCollection()); connect(connectAction, &QAction::triggered, this, &DanbooruMainWindow::connectToBoard); connect(fetchAction, &QAction::triggered, this, &DanbooruMainWindow::downloadPosts); + connect(poolAction, &KToggleAction::toggled, [this](bool checked) { if (!m_service) { return; } - QDockWidget* dockWidget = findChild(QLatin1String("PoolView")); + QDockWidget* poolDockWidget = findChild(QLatin1String("PoolView")); if (checked) { @@ -235,16 +245,69 @@ void DanbooruMainWindow::setupActions() m_service->getPoolList(); } - dockWidget->show(); + poolDockWidget->show(); m_tableView->show(); } else { - dockWidget->hide(); + poolDockWidget->hide(); m_tableView->hide(); } }); + connect(findAction, &KToggleAction::toggled, [this](bool checked) { + + QDockWidget* searchDockWidget = findChild(QLatin1String("SearchView")); + + if (checked) { + searchDockWidget->show(); + m_searchWidget->show(); + } else { + searchDockWidget->hide(); + m_searchWidget->hide(); + } + + }); + +} + + +void DanbooruMainWindow::setupDockWidgets() { + + // Set up PoolWidget + m_tableView->setModel(m_poolModel); + QDockWidget* poolDockWidget = new QDockWidget(i18n("Pools"), this); + poolDockWidget->setAllowedAreas(Qt::BottomDockWidgetArea); + poolDockWidget->setWidget(m_tableView); + poolDockWidget->setObjectName("PoolView"); + // Prevent the use of winId() when detached, leads to QQuickWidget bugs + poolDockWidget->setFeatures(QDockWidget::DockWidgetClosable); + addDockWidget(Qt::BottomDockWidgetArea, poolDockWidget); + m_tableView->hide(); + poolDockWidget->hide(); + + // Find widget + QDockWidget *searchDockWidget = new QDockWidget(QLatin1String(""), this); + searchDockWidget->setAllowedAreas(Qt::TopDockWidgetArea); + searchDockWidget->setWidget(m_searchWidget); + searchDockWidget->setObjectName("SearchView"); + // FIXME: Get rid of the close button in the widget + searchDockWidget->setFeatures(QDockWidget::NoDockWidgetFeatures); + addDockWidget(Qt::TopDockWidgetArea, searchDockWidget); + searchDockWidget->hide(); + m_searchWidget->hide(); + searchDockWidget->setTitleBarWidget(new QWidget(this)); + + // Connections + + connect(poolDockWidget, &QDockWidget::visibilityChanged, [this](bool visible) { + actionCollection()->action(QLatin1String("poolDownload"))->setChecked(visible); + }); + + connect(searchDockWidget, &QDockWidget::visibilityChanged, [this](bool visible) { + actionCollection()->action(QLatin1String("find"))->setChecked(visible); + }); + } void DanbooruMainWindow::connectToBoard() @@ -267,6 +330,7 @@ void DanbooruMainWindow::downloadPosts() return; } + m_model->clear(); m_service->setPostTags(QStringList()); m_view->rootObject()->setProperty("poolMode", QVariant(false)); m_service->getPostList(); diff --git a/src/mainwindow.h b/src/mainwindow.h index 77ca87b..9435766 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -43,6 +43,7 @@ class DanbooruService; class DanbooruPostModel; class DanbooruPoolModel; class DanbooruConnectWidget; +class DanbooruSearchWidget; /** * This class serves as the main window for danbooru_client. It handles the @@ -62,6 +63,7 @@ private: DanbooruPoolModel *m_poolModel; DanbooruService *m_service; DanbooruConnectWidget *m_connectWidget; + DanbooruSearchWidget *m_searchWidget; QTableView *m_tableView; KImageCache *m_cache; static QHash ratingMap; @@ -79,6 +81,7 @@ public: private: void setupActions(); + void setupDockWidgets(); void setupConnections(); private Q_SLOTS: