From e8731c5d013e67ee0153d5a49b38b0e914d14aa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sat, 28 Jun 2014 17:07:08 +0200 Subject: [PATCH] Turn screenshot management into a page. --- CMakeLists.txt | 9 +- depends/util/src/pathutils.cpp | 4 +- gui/ConsoleWindow.cpp | 17 ---- gui/MainWindow.cpp | 29 ++---- gui/dialogs/ScreenshotDialog.cpp | 78 ---------------- gui/dialogs/ScreenshotDialog.h | 40 -------- gui/dialogs/ScreenshotDialog.ui | 110 ---------------------- gui/pagedialog/PageDialog.cpp | 1 + gui/pages/BasePage.h | 4 + logic/LegacyInstance.cpp | 2 + logic/OneSixInstance.cpp | 2 + logic/screenshots/ImgurAlbumCreation.cpp | 3 +- logic/screenshots/ImgurUpload.cpp | 9 +- logic/screenshots/Screenshot.cpp | 14 --- logic/screenshots/Screenshot.h | 16 ++-- logic/screenshots/ScreenshotList.cpp | 113 ----------------------- logic/screenshots/ScreenshotList.h | 70 -------------- 17 files changed, 33 insertions(+), 488 deletions(-) delete mode 100644 gui/dialogs/ScreenshotDialog.cpp delete mode 100644 gui/dialogs/ScreenshotDialog.h delete mode 100644 gui/dialogs/ScreenshotDialog.ui delete mode 100644 logic/screenshots/Screenshot.cpp delete mode 100644 logic/screenshots/ScreenshotList.cpp delete mode 100644 logic/screenshots/ScreenshotList.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 2968e548..a7789db3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -309,6 +309,8 @@ SET(MULTIMC_SOURCES gui/pages/LegacyJarModPage.h gui/pages/InstanceSettingsPage.cpp gui/pages/InstanceSettingsPage.h + gui/pages/ScreenshotsPage.cpp + gui/pages/ScreenshotsPage.h # GUI - dialogs gui/dialogs/AboutDialog.cpp @@ -337,8 +339,6 @@ SET(MULTIMC_SOURCES gui/dialogs/NotificationDialog.h gui/dialogs/ProgressDialog.cpp gui/dialogs/ProgressDialog.h - gui/dialogs/ScreenshotDialog.cpp - gui/dialogs/ScreenshotDialog.h gui/dialogs/SettingsDialog.cpp gui/dialogs/SettingsDialog.h gui/dialogs/UpdateDialog.cpp @@ -529,9 +529,6 @@ SET(MULTIMC_SOURCES # the screenshots feature logic/screenshots/Screenshot.h - logic/screenshots/Screenshot.cpp - logic/screenshots/ScreenshotList.h - logic/screenshots/ScreenshotList.cpp logic/screenshots/ImgurUpload.h logic/screenshots/ImgurUpload.cpp logic/screenshots/ImgurAlbumCreation.h @@ -616,6 +613,7 @@ SET(MULTIMC_UIS gui/pages/LegacyJarModPage.ui gui/pages/InstanceSettingsPage.ui gui/pages/NotesPage.ui + gui/pages/ScreenshotsPage.ui # Dialogs gui/dialogs/SettingsDialog.ui @@ -631,7 +629,6 @@ SET(MULTIMC_UIS gui/dialogs/EditAccountDialog.ui gui/dialogs/LoginDialog.ui gui/dialogs/UpdateDialog.ui - gui/dialogs/ScreenshotDialog.ui gui/dialogs/NotificationDialog.ui # Widgets/other diff --git a/depends/util/src/pathutils.cpp b/depends/util/src/pathutils.cpp index 20888754..3a964806 100644 --- a/depends/util/src/pathutils.cpp +++ b/depends/util/src/pathutils.cpp @@ -138,10 +138,10 @@ void openDirInDefaultProgram(QString path, bool ensureExists) { parentPath.mkpath(dir.absolutePath()); } - QDesktopServices::openUrl("file:///" + dir.absolutePath()); + QDesktopServices::openUrl(QUrl::fromLocalFile(dir.absolutePath())); } void openFileInDefaultProgram(QString filename) { - QDesktopServices::openUrl("file:///" + QFileInfo(filename).absolutePath()); + QDesktopServices::openUrl(QUrl::fromLocalFile(filename)); } diff --git a/gui/ConsoleWindow.cpp b/gui/ConsoleWindow.cpp index ac3752c5..d4ce1581 100644 --- a/gui/ConsoleWindow.cpp +++ b/gui/ConsoleWindow.cpp @@ -24,7 +24,6 @@ #include #include #include -#include "dialogs/ScreenshotDialog.h" #include "logic/net/PasteUpload.h" #include "logic/icons/IconList.h" @@ -174,22 +173,6 @@ void ConsoleWindow::on_closeButton_clicked() void ConsoleWindow::on_btnScreenshots_clicked() { - ScreenshotList *list = new ScreenshotList(proc->instance()); - Task *task = list->load(); - ProgressDialog prog(this); - prog.exec(task); - if (!task->successful()) - { - CustomMessageBox::selectable(this, tr("Failed to load screenshots!"), - task->failReason(), QMessageBox::Warning)->exec(); - return; - } - ScreenshotDialog dialog(list, this); - if (dialog.exec() == ScreenshotDialog::Accepted) - { - CustomMessageBox::selectable(this, tr("Done uploading!"), dialog.message(), - QMessageBox::Information)->exec(); - } } void ConsoleWindow::setMayClose(bool mayclose) diff --git a/gui/MainWindow.cpp b/gui/MainWindow.cpp index e5c7dbb1..bee250c4 100644 --- a/gui/MainWindow.cpp +++ b/gui/MainWindow.cpp @@ -63,7 +63,6 @@ #include "gui/dialogs/UpdateDialog.h" #include "gui/dialogs/EditAccountDialog.h" #include "gui/dialogs/NotificationDialog.h" -#include "dialogs/ScreenshotDialog.h" #include "gui/ConsoleWindow.h" #include "pagedialog/PageDialog.h" @@ -969,6 +968,12 @@ void MainWindow::on_actionEditInstance_triggered() ShowPageDialog(m_selectedInstance, this); } +void MainWindow::on_actionScreenshots_triggered() +{ + ShowPageDialog(m_selectedInstance, this, "screenshots"); +} + + void MainWindow::on_actionManageAccounts_triggered() { AccountListDialog dialog(this); @@ -1510,25 +1515,3 @@ void MainWindow::checkSetDefaultJava() MMC->settings()->set("JavaPath", QString("java")); } } - -void MainWindow::on_actionScreenshots_triggered() -{ - if (!m_selectedInstance) - return; - ScreenshotList *list = new ScreenshotList(m_selectedInstance); - Task *task = list->load(); - ProgressDialog prog(this); - prog.exec(task); - if (!task->successful()) - { - CustomMessageBox::selectable(this, tr("Failed to load screenshots!"), - task->failReason(), QMessageBox::Warning)->exec(); - return; - } - ScreenshotDialog dialog(list, this); - if (dialog.exec() == ScreenshotDialog::Accepted) - { - CustomMessageBox::selectable(this, tr("Done uploading!"), dialog.message(), - QMessageBox::Information)->exec(); - } -} diff --git a/gui/dialogs/ScreenshotDialog.cpp b/gui/dialogs/ScreenshotDialog.cpp deleted file mode 100644 index a88c8dfd..00000000 --- a/gui/dialogs/ScreenshotDialog.cpp +++ /dev/null @@ -1,78 +0,0 @@ -#include "ScreenshotDialog.h" -#include "ui_ScreenshotDialog.h" - -#include -#include - -#include "ProgressDialog.h" -#include "CustomMessageBox.h" -#include "logic/net/NetJob.h" -#include "logic/screenshots/ImgurUpload.h" -#include "logic/screenshots/ImgurAlbumCreation.h" -#include "logic/tasks/SequentialTask.h" - -ScreenshotDialog::ScreenshotDialog(ScreenshotList *list, QWidget *parent) - : QDialog(parent), ui(new Ui::ScreenshotDialog), m_list(list) -{ - ui->setupUi(this); - ui->listView->setModel(m_list); -} - -ScreenshotDialog::~ScreenshotDialog() -{ - delete ui; -} - -QString ScreenshotDialog::message() const -{ - return tr("Visit album
Delete hash: %2 (save " - "this if you want to be able to edit/delete the album)") - .arg(m_imgurAlbum->id(), m_imgurAlbum->deleteHash()); -} - -QList ScreenshotDialog::selected() const -{ - QList list; - QList first = m_list->screenshots(); - for (QModelIndex index : ui->listView->selectionModel()->selectedRows()) - { - list.append(first.at(index.row())); - } - return list; -} - -void ScreenshotDialog::on_uploadBtn_clicked() -{ - m_uploaded = selected(); - if (m_uploaded.isEmpty()) - { - done(NothingDone); - return; - } - SequentialTask *task = new SequentialTask(this); - NetJob *job = new NetJob("Screenshot Upload"); - for (auto shot : m_uploaded) - { - job->addNetAction(ImgurUpload::make(shot)); - } - NetJob *albumTask = new NetJob("Imgur Album Creation"); - albumTask->addNetAction(m_imgurAlbum = ImgurAlbumCreation::make(m_uploaded)); - task->addTask(NetJobPtr(job)); - task->addTask(NetJobPtr(albumTask)); - ProgressDialog prog(this); - if (prog.exec(task) == QDialog::Accepted) - { - accept(); - } - else - { - CustomMessageBox::selectable(this, tr("Failed to upload screenshots!"), - tr("Unknown error"), QMessageBox::Warning)->exec(); - reject(); - } -} - -void ScreenshotDialog::on_deleteBtn_clicked() -{ - m_list->deleteSelected(this); -} diff --git a/gui/dialogs/ScreenshotDialog.h b/gui/dialogs/ScreenshotDialog.h deleted file mode 100644 index 29dd6765..00000000 --- a/gui/dialogs/ScreenshotDialog.h +++ /dev/null @@ -1,40 +0,0 @@ -#pragma once - -#include -#include "logic/screenshots/ScreenshotList.h" - -class ImgurAlbumCreation; - -namespace Ui -{ -class ScreenshotDialog; -} - -class ScreenshotDialog : public QDialog -{ - Q_OBJECT - -public: - explicit ScreenshotDialog(ScreenshotList *list, QWidget *parent = 0); - ~ScreenshotDialog(); - - enum - { - NothingDone = 0x42 - }; - - QString message() const; - QList selected() const; - -private -slots: - void on_uploadBtn_clicked(); - - void on_deleteBtn_clicked(); - -private: - Ui::ScreenshotDialog *ui; - ScreenshotList *m_list; - QList m_uploaded; - std::shared_ptr m_imgurAlbum; -}; diff --git a/gui/dialogs/ScreenshotDialog.ui b/gui/dialogs/ScreenshotDialog.ui deleted file mode 100644 index eb3dafba..00000000 --- a/gui/dialogs/ScreenshotDialog.ui +++ /dev/null @@ -1,110 +0,0 @@ - - - ScreenshotDialog - - - - 0 - 0 - 470 - 300 - - - - Screenshot Manager - - - - :/icons/multimc/scalable/apps/multimc.svg:/icons/multimc/scalable/apps/multimc.svg - - - - - - QAbstractItemView::ExtendedSelection - - - QAbstractItemView::SelectItems - - - - 120 - 90 - - - - QListView::LeftToRight - - - true - - - QListView::Adjust - - - QListView::IconMode - - - - - - - - - Upload - - - - - - - Delete - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Close - - - - - - - - - - - - - closeBtn - clicked() - ScreenshotDialog - reject() - - - 315 - 272 - - - 271 - 258 - - - - - diff --git a/gui/pagedialog/PageDialog.cpp b/gui/pagedialog/PageDialog.cpp index 4db5cd28..56bdfd14 100644 --- a/gui/pagedialog/PageDialog.cpp +++ b/gui/pagedialog/PageDialog.cpp @@ -159,6 +159,7 @@ void PageDialog::showPage(int row) m_pageStack->setCurrentIndex(m_currentPage->stackIndex); m_header->setText(m_currentPage->displayName()); m_iconHeader->setIcon(m_currentPage->icon()); + m_currentPage->opened(); } else { diff --git a/gui/pages/BasePage.h b/gui/pages/BasePage.h index bba4996d..09af3a59 100644 --- a/gui/pages/BasePage.h +++ b/gui/pages/BasePage.h @@ -36,6 +36,10 @@ public: virtual QString helpPage() { return QString(); + } + virtual void opened() + { + } int stackIndex = -1; int listIndex = -1; diff --git a/logic/LegacyInstance.cpp b/logic/LegacyInstance.cpp index 4b856b0d..dd6c0719 100644 --- a/logic/LegacyInstance.cpp +++ b/logic/LegacyInstance.cpp @@ -34,6 +34,7 @@ #include #include #include +#include LegacyInstance::LegacyInstance(const QString &rootDir, SettingsObject *settings, QObject *parent) @@ -57,6 +58,7 @@ QList LegacyInstance::getPages() "Core-mods")); values.append(new TexturePackPage(this)); values.append(new NotesPage(this)); + values.append(new ScreenshotsPage(this)); values.append(new InstanceSettingsPage(&settings())); return values; } diff --git a/logic/OneSixInstance.cpp b/logic/OneSixInstance.cpp index 98244831..2069faad 100644 --- a/logic/OneSixInstance.cpp +++ b/logic/OneSixInstance.cpp @@ -36,6 +36,7 @@ #include #include #include +#include OneSixInstance::OneSixInstance(const QString &rootDir, SettingsObject *settings, QObject *parent) @@ -69,6 +70,7 @@ QList OneSixInstance::getPages() values.append(new ResourcePackPage(this)); values.append(new TexturePackPage(this)); values.append(new NotesPage(this)); + values.append(new ScreenshotsPage(this)); values.append(new InstanceSettingsPage(&settings())); return values; } diff --git a/logic/screenshots/ImgurAlbumCreation.cpp b/logic/screenshots/ImgurAlbumCreation.cpp index e473952e..1bf6c2a3 100644 --- a/logic/screenshots/ImgurAlbumCreation.cpp +++ b/logic/screenshots/ImgurAlbumCreation.cpp @@ -5,7 +5,6 @@ #include #include -#include "logic/screenshots//ScreenshotList.h" #include "logic/net/URLConstants.h" #include "MultiMC.h" #include "logger/QsLog.h" @@ -28,7 +27,7 @@ void ImgurAlbumCreation::start() QStringList ids; for (auto shot : m_screenshots) { - ids.append(shot->imgurId); + ids.append(shot->m_imgurId); } const QByteArray data = "ids=" + ids.join(',').toUtf8() + "&title=Minecraft%20Screenshots&privacy=hidden"; diff --git a/logic/screenshots/ImgurUpload.cpp b/logic/screenshots/ImgurUpload.cpp index 62033ef5..f305aec0 100644 --- a/logic/screenshots/ImgurUpload.cpp +++ b/logic/screenshots/ImgurUpload.cpp @@ -8,7 +8,6 @@ #include #include -#include "logic/screenshots/ScreenshotList.h" #include "logic/net/URLConstants.h" #include "MultiMC.h" #include "logger/QsLog.h" @@ -27,7 +26,7 @@ void ImgurUpload::start() request.setRawHeader("Authorization", "Client-ID 5b97b0713fba4a3"); request.setRawHeader("Accept", "application/json"); - QFile f(m_shot->file); + QFile f(m_shot->m_file.absoluteFilePath()); if (!f.open(QFile::ReadOnly)) { emit failed(m_index_within_job); @@ -46,7 +45,7 @@ void ImgurUpload::start() multipart->append(typePart); QHttpPart namePart; namePart.setHeader(QNetworkRequest::ContentDispositionHeader, "form-data; name=\"name\""); - namePart.setBody(m_shot->timestamp.toString(Qt::ISODate).toUtf8()); + namePart.setBody(m_shot->m_file.baseName().toUtf8()); multipart->append(namePart); auto worker = MMC->qnam(); @@ -84,8 +83,8 @@ void ImgurUpload::downloadFinished() emit failed(m_index_within_job); return; } - m_shot->imgurId = object.value("data").toObject().value("id").toString(); - m_shot->url = object.value("data").toObject().value("link").toString(); + m_shot->m_imgurId = object.value("data").toObject().value("id").toString(); + m_shot->m_url = object.value("data").toObject().value("link").toString(); m_status = Job_Finished; emit succeeded(m_index_within_job); return; diff --git a/logic/screenshots/Screenshot.cpp b/logic/screenshots/Screenshot.cpp deleted file mode 100644 index 882e491f..00000000 --- a/logic/screenshots/Screenshot.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "Screenshot.h" -#include -#include -QIcon ScreenShot::getImage() -{ - if(!imageloaded) - { - QImage image(file); - QImage thumbnail = image.scaledToWidth(256, Qt::SmoothTransformation); - m_image = QIcon(QPixmap::fromImage(thumbnail)); - imageloaded = true; - } - return m_image; -} diff --git a/logic/screenshots/Screenshot.h b/logic/screenshots/Screenshot.h index 815c0d47..b48cbe99 100644 --- a/logic/screenshots/Screenshot.h +++ b/logic/screenshots/Screenshot.h @@ -2,18 +2,18 @@ #include #include +#include #include -#include struct ScreenShot { - QIcon getImage(); - QIcon m_image; - bool imageloaded = false; - QDateTime timestamp; - QString file; - QString url; - QString imgurId; + ScreenShot(QFileInfo file) + { + m_file = file; + } + QFileInfo m_file; + QString m_url; + QString m_imgurId; }; typedef std::shared_ptr ScreenshotPtr; diff --git a/logic/screenshots/ScreenshotList.cpp b/logic/screenshots/ScreenshotList.cpp deleted file mode 100644 index a34f4d46..00000000 --- a/logic/screenshots/ScreenshotList.cpp +++ /dev/null @@ -1,113 +0,0 @@ -#include "ScreenshotList.h" -#include "gui/dialogs/ScreenshotDialog.h" - -#include -#include -#include -#include "gui/dialogs/ProgressDialog.h" -#include "gui/dialogs/CustomMessageBox.h" - -ScreenshotList::ScreenshotList(InstancePtr instance, QObject *parent) - : QAbstractListModel(parent), m_instance(instance) -{ -} - -int ScreenshotList::rowCount(const QModelIndex &) const -{ - return m_screenshots.size(); -} - -QVariant ScreenshotList::data(const QModelIndex &index, int role) const -{ - if (index.row() >= m_screenshots.size() || index.row() < 0) - return QVariant(); - - switch (role) - { - case Qt::DecorationRole: - return m_screenshots.at(index.row())->getImage(); - case Qt::DisplayRole: - return m_screenshots.at(index.row())->timestamp.toString("yyyy-MM-dd HH:mm:ss"); - case Qt::ToolTipRole: - return m_screenshots.at(index.row())->timestamp.toString("yyyy-MM-dd HH:mm:ss"); - case Qt::TextAlignmentRole: - return (int)(Qt::AlignHCenter | Qt::AlignVCenter); - default: - return QVariant(); - } -} - -QVariant ScreenshotList::headerData(int section, Qt::Orientation orientation, int role) const -{ - return QVariant(); -} - -Qt::ItemFlags ScreenshotList::flags(const QModelIndex &index) const -{ - return Qt::ItemIsSelectable | Qt::ItemIsEnabled; -} - -Task *ScreenshotList::load() -{ - return new ScreenshotLoadTask(this); -} - -ScreenshotLoadTask::ScreenshotLoadTask(ScreenshotList *list) : m_list(list) -{ -} - -ScreenshotLoadTask::~ScreenshotLoadTask() -{ -} - -void ScreenshotLoadTask::executeTask() -{ - auto dir = QDir(m_list->instance()->minecraftRoot()); - if (!dir.cd("screenshots")) - { - emitFailed("Selected instance does not have any screenshots!"); - return; - } - dir.setNameFilters(QStringList() << "*.png"); - this->m_results.clear(); - for (auto file : dir.entryList()) - { - ScreenShot *shot = new ScreenShot(); - shot->timestamp = QDateTime::fromString(file, "yyyy-MM-dd_HH.mm.ss.png"); - shot->file = dir.absoluteFilePath(file); - m_results.append(ScreenshotPtr(shot)); - } - m_list->loadShots(m_results); - emitSucceeded(); -} - -void ScreenshotList::deleteSelected(ScreenshotDialog *dialog) -{ - auto screens = dialog->selected(); - if (screens.isEmpty()) - { - return; - } - beginResetModel(); - QList>::const_iterator it; - for (it = screens.cbegin(); it != screens.cend(); it++) - { - auto shot = *it; - if (!QFile(shot->file).remove()) - { - CustomMessageBox::selectable(dialog, tr("Error!"), - tr("Failed to delete screenshots!"), - QMessageBox::Warning)->exec(); - break; - } - } - ProgressDialog refresh(dialog); - Task *t = load(); - if (refresh.exec(t) != QDialog::Accepted) - { - CustomMessageBox::selectable(dialog, tr("Error!"), - tr("Unable to refresh list: %1").arg(t->failReason()), - QMessageBox::Warning)->exec(); - } - endResetModel(); -} diff --git a/logic/screenshots/ScreenshotList.h b/logic/screenshots/ScreenshotList.h deleted file mode 100644 index dc26a698..00000000 --- a/logic/screenshots/ScreenshotList.h +++ /dev/null @@ -1,70 +0,0 @@ -#pragma once - -#include -#include "logic/BaseInstance.h" -#include "logic/tasks/Task.h" - -#include "Screenshot.h" - -class ScreenshotList : public QAbstractListModel -{ - Q_OBJECT -public: - ScreenshotList(InstancePtr instance, QObject *parent = 0); - - QVariant data(const QModelIndex &index, int role) const; - QVariant headerData(int section, Qt::Orientation orientation, int role) const; - - int rowCount(const QModelIndex &parent) const; - - Qt::ItemFlags flags(const QModelIndex &index) const; - - Task *load(); - - void loadShots(QList shots) - { - m_screenshots = shots; - } - - QList screenshots() const - { - return m_screenshots; - } - - InstancePtr instance() const - { - return m_instance; - } - - void deleteSelected(class ScreenshotDialog *dialog); - -signals: - -public -slots: - -private: - QList m_screenshots; - InstancePtr m_instance; -}; - -class ScreenshotLoadTask : public Task -{ - Q_OBJECT - -public: - explicit ScreenshotLoadTask(ScreenshotList *list); - ~ScreenshotLoadTask(); - - QList screenShots() const - { - return m_results; - } - -protected: - virtual void executeTask(); - -private: - ScreenshotList *m_list; - QList m_results; -};