diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index cb583b5..2fd0136 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -45,9 +46,11 @@ #include "libdanbooru/danboorupool.h" #include "model/danboorupostmodel.h" #include "model/danboorupoolmodel.h" +#include "model/danboorutagmodel.h" #include "mainwindow.h" #include "danbooruconnectwidget.h" #include "danboorusearchwidget.h" +#include "danboorutagwidget.h" #include "danboorusettings.h" #include "generalpage.h" #include "blacklistpage.h" @@ -66,9 +69,11 @@ DanbooruMainWindow::DanbooruMainWindow(QWidget *parent) m_view(new QQuickWidget(this)), m_model(new DanbooruPostModel(this)), m_poolModel(new DanbooruPoolModel(this)), + m_tagModel(new DanbooruTagModel(this)), m_service(new DanbooruService()), m_connectWidget(Q_NULLPTR), m_searchWidget(new DanbooruSearchWidget(this)), + m_tagWidget(new DanbooruTagWidget(this)), m_tableView(new QTableView(this)), m_cache(Q_NULLPTR) { @@ -85,6 +90,7 @@ DanbooruMainWindow::DanbooruMainWindow(QWidget *parent) m_cache = new KImageCache(qApp->applicationName(), DanbooruSettings::self()->cacheSize()); m_service->setImageCache(m_cache); m_tableView->setModel(m_poolModel); + m_tagWidget->setModel(m_tagModel); // Set up declarative bindings for the QQuickWidget @@ -125,11 +131,13 @@ DanbooruMainWindow::DanbooruMainWindow(QWidget *parent) actionCollection()->action(QLatin1String("fetch"))->setEnabled(true); actionCollection()->action(QLatin1String("find"))->setEnabled(true); actionCollection()->action(QLatin1String("poolDownload"))->setEnabled(true); + actionCollection()->action(QLatin1String("tags"))->setEnabled(true); if (DanbooruSettings::self()->autoDownload()) { m_view->rootObject()->setProperty("poolMode", QVariant(false)); m_service->setPostTags(QStringList()); m_service->getPostList(); + m_service->getTagList(); } m_connectWidget->hide(); statusBar()->hide(); @@ -144,6 +152,8 @@ DanbooruMainWindow::DanbooruMainWindow(QWidget *parent) &Danbooru::DanbooruPostModel::addPost); connect(m_service, &Danbooru::DanbooruService::poolDownloaded, m_poolModel, &DanbooruPoolModel::addPool); + connect(m_service, &Danbooru::DanbooruService::tagDownloaded, m_tagModel, + &DanbooruTagModel::addTag); connect(m_service, &Danbooru::DanbooruService::poolDownloadFinished, [this]() { m_tableView->resizeColumnsToContents(); } @@ -151,7 +161,7 @@ DanbooruMainWindow::DanbooruMainWindow(QWidget *parent) connect(m_tableView, &QTableView::doubleClicked, [this](QModelIndex index) { auto pool = m_poolModel->poolAt(index.row()); - m_model->clear(); + clearModels(); m_view->rootObject()->setProperty("poolMode", QVariant(true)); m_service->getPool(pool->id()); @@ -162,10 +172,11 @@ DanbooruMainWindow::DanbooruMainWindow(QWidget *parent) QDockWidget* searchDockWidget = findChild(QLatin1String("SearchView")); searchDockWidget->hide(); - m_model->clear(); + clearModels(); m_service->setPostTags(m_searchWidget->selectedTags()); m_view->rootObject()->setProperty("poolMode", QVariant(false)); m_service->getPostList(); + m_service->getRelatedTags(m_searchWidget->selectedTags()); }); connect(m_searchWidget, &DanbooruSearchWidget::rejected, [this]() { @@ -176,6 +187,8 @@ DanbooruMainWindow::DanbooruMainWindow(QWidget *parent) connect(m_view->rootObject(), SIGNAL(downloadRequested(const QUrl&)), this, SLOT(slotHandleDownload(const QUrl&))); + connect(m_tagWidget, &QListView::doubleClicked, this, &DanbooruMainWindow::searchTag); + } DanbooruMainWindow::~DanbooruMainWindow() @@ -209,6 +222,8 @@ void DanbooruMainWindow::loadSettings() m_connectWidget->setBoards(boardsList); } + m_tagWidget->setBlackList(DanbooruSettings::self()->tagBlacklist()); + } @@ -227,17 +242,22 @@ void DanbooruMainWindow::setupActions() KToggleAction *poolAction = new KToggleAction(QIcon::fromTheme(QLatin1String("image-x-generic")), i18n("Pools"), this); + KDualAction* tagAction = new KDualAction(i18n("Show tags"), i18n("Hide tags"), this); + tagAction->setIconForStates(QIcon::fromTheme(QLatin1String("tag"))); + fetchAction->setEnabled(false); findAction->setEnabled(false); poolAction->setEnabled(false); poolAction->setChecked(false); findAction->setChecked(false); + tagAction->setEnabled(false); actionCollection()->addAction(QLatin1String("connect"), connectAction); actionCollection()->addAction(QLatin1String("fetch"), fetchAction); actionCollection()->addAction(QLatin1String("find"), findAction); actionCollection()->addAction(QLatin1String("poolDownload"), poolAction); + actionCollection()->addAction(QLatin1String("tags"), tagAction); actionCollection()->setDefaultShortcut(connectAction, KStandardShortcut::Open); actionCollection()->setDefaultShortcut(findAction, KStandardShortcut::Find); @@ -285,6 +305,20 @@ void DanbooruMainWindow::setupActions() }); + connect(tagAction, &KDualAction::activeChanged, [this](bool checked) { + + QDockWidget* tagDockWidget = findChild(QLatin1String("TagView")); + + if (checked) { + tagDockWidget->show(); + m_tagWidget->show(); + } else { + tagDockWidget->hide(); + m_tagWidget->hide(); + } + + }); + } @@ -317,6 +351,15 @@ void DanbooruMainWindow::setupDockWidgets() { searchDockWidget->hide(); m_searchWidget->hide(); + QDockWidget *tagDockWidget = new QDockWidget(QLatin1String("Tags"), this); + tagDockWidget->setAllowedAreas(Qt::RightDockWidgetArea); + tagDockWidget->setWidget(m_tagWidget); + tagDockWidget->setObjectName("TagView"); + tagDockWidget->setFeatures(QDockWidget::DockWidgetClosable); + addDockWidget(Qt::RightDockWidgetArea, tagDockWidget); + +// tagDockWidget->hide(); +// m_tagWidget->hide(); // Connections @@ -328,6 +371,10 @@ void DanbooruMainWindow::setupDockWidgets() { actionCollection()->action(QLatin1String("find"))->setChecked(visible); }); + connect(tagDockWidget, &QDockWidget::visibilityChanged, [this](bool visible) { + qobject_cast(actionCollection()->action(QLatin1String("tags")))->setActive(visible); + }); + } void DanbooruMainWindow::connectToBoard() @@ -337,8 +384,8 @@ void DanbooruMainWindow::connectToBoard() return; } - m_model->clear(); - m_poolModel->clear(); + + clearModels(); m_service->reset(); statusBar()->show(); m_connectWidget->show(); @@ -355,6 +402,7 @@ void DanbooruMainWindow::downloadPosts() m_service->setPostTags(QStringList()); m_view->rootObject()->setProperty("poolMode", QVariant(false)); m_service->getPostList(); + m_service->getTagList(); } @@ -389,14 +437,15 @@ void DanbooruMainWindow::slotHandleDownload(const QUrl &url) { // TODO: Remember last user directory - settings? saveDialog.setConfirmOverwrite(true); - saveDialog.setDirectory(QStandardPaths::writableLocation(QStandardPaths::HomeLocation)); + saveDialog.setDirectory(QDir::homePath()); saveDialog.selectFile(url.fileName()); if (saveDialog.exec()) { - QString localFileName = saveDialog.selectedFiles().at(0); - QUrl localFile = QUrl::fromLocalFile(localFileName); + QUrl localFile = saveDialog.selectedUrls().at(0); - qDebug() << "URL" << localFile; + if (localFile.isEmpty()) { + return; + } KIO::FileCopyJob *job = KIO::file_copy(url, localFile, -1, KIO::DefaultFlags); @@ -404,10 +453,35 @@ void DanbooruMainWindow::slotHandleDownload(const QUrl &url) { if (job->error()) { return; } + // TODO: Tagging }); } } +void DanbooruMainWindow::searchTag(const QModelIndex &index) +{ + + qDebug() << "Clicked" +// DanbooruTag *tag = m_tagModel->itemAt(index.row()); +// +// if(!tag) { +// return; +// } +// +// auto tagList = QStringList {tag->name()}; +// clearModels(); +// m_service->setPostTags(tagList); +// m_service->getPostList(); +// m_service->getRelatedTags(tagList); +} + +void DanbooruMainWindow::clearModels() +{ + m_model->clear(); + m_tagModel->clear(); + m_poolModel->clear(); +} + } // namespace Danbooru diff --git a/src/mainwindow.h b/src/mainwindow.h index d94210c..aa3fbd5 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -26,6 +26,7 @@ #include "libdanbooru/danboorupost.h" #include +#include #include #include @@ -35,6 +36,7 @@ class QQuickWidget; + namespace Danbooru { @@ -42,8 +44,10 @@ class DanbooruClientView; class DanbooruService; class DanbooruPostModel; class DanbooruPoolModel; +class DanbooruTagModel; class DanbooruConnectWidget; class DanbooruSearchWidget; +class DanbooruTagWidget; /** * This class serves as the main window for danbooru_client. It handles the @@ -61,9 +65,11 @@ private: QQuickWidget *m_view; DanbooruPostModel *m_model; DanbooruPoolModel *m_poolModel; + DanbooruTagModel *m_tagModel; DanbooruService *m_service; DanbooruConnectWidget *m_connectWidget; DanbooruSearchWidget *m_searchWidget; + DanbooruTagWidget *m_tagWidget; QTableView *m_tableView; KImageCache *m_cache; static QHash ratingMap; @@ -83,6 +89,7 @@ private: void setupActions(); void setupDockWidgets(); void setupConnections(); + void clearModels(); private Q_SLOTS: void connectToBoard(); @@ -90,10 +97,7 @@ private Q_SLOTS: void optionsPreferences(); void loadSettings(); void slotHandleDownload(const QUrl &url); - - - - + void searchTag(const QModelIndex &index); }; } // namespace Danbooru