From ed3e2ecb90493799d2cf9b4eaa4eb539b8dd55c1 Mon Sep 17 00:00:00 2001 From: Mm2PL Date: Sat, 2 Dec 2023 01:21:56 +0100 Subject: [PATCH] Add settings page and model for uploaded images --- src/CMakeLists.txt | 4 + .../imageuploader/UploadedImageModel.cpp | 61 +++++++++++++ .../imageuploader/UploadedImageModel.hpp | 27 ++++++ src/widgets/dialogs/SettingsDialog.cpp | 2 + .../settingspages/ImageUploaderPage.cpp | 88 +++++++++++++++++++ .../settingspages/ImageUploaderPage.hpp | 24 +++++ 6 files changed, 206 insertions(+) create mode 100644 src/singletons/imageuploader/UploadedImageModel.cpp create mode 100644 src/singletons/imageuploader/UploadedImageModel.hpp create mode 100644 src/widgets/settingspages/ImageUploaderPage.cpp create mode 100644 src/widgets/settingspages/ImageUploaderPage.hpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index aa91ecd83..fe12ad5a7 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -432,6 +432,8 @@ set(SOURCE_FILES singletons/imageuploader/ImageUploader.cpp singletons/imageuploader/ImageUploader.hpp singletons/imageuploader/UploadedImage.hpp + singletons/imageuploader/UploadedImageModel.cpp + singletons/imageuploader/UploadedImageModel.hpp singletons/Logging.cpp singletons/Logging.hpp singletons/NativeMessaging.cpp @@ -668,6 +670,8 @@ set(SOURCE_FILES widgets/settingspages/PluginsPage.hpp widgets/settingspages/SettingsPage.cpp widgets/settingspages/SettingsPage.hpp + widgets/settingspages/ImageUploaderPage.cpp + widgets/settingspages/ImageUploaderPage.hpp widgets/splits/ClosedSplits.cpp widgets/splits/ClosedSplits.hpp diff --git a/src/singletons/imageuploader/UploadedImageModel.cpp b/src/singletons/imageuploader/UploadedImageModel.cpp new file mode 100644 index 000000000..c382b63c9 --- /dev/null +++ b/src/singletons/imageuploader/UploadedImageModel.cpp @@ -0,0 +1,61 @@ +#include "singletons/imageuploader/UploadedImageModel.hpp" + +#include "common/SignalVectorModel.hpp" +#include "messages/Image.hpp" +#include "singletons/imageuploader/ImageUploader.hpp" +#include "util/StandardItemHelper.hpp" +#include "widgets/listview/ImagePtrItemDelegate.hpp" + +#include +#include +#include +#include +#include + +namespace chatterino { +UploadedImageModel::UploadedImageModel(QObject *parent) + : SignalVectorModel(4, parent) +{ +} +// image, path, delete url + +UploadedImage UploadedImageModel::getItemFromRow( + std::vector &row, const UploadedImage &original) +{ + return original; +} + +void UploadedImageModel::getRowFromItem(const UploadedImage &item, + std::vector &row) +{ + row[0]->setData(item.imageLink, ImagePtrItemDelegate::IMAGE_URL_ROLE); + row[0]->setData(item.imageLink, UploadedImageModel::DOUBLE_CLICK_LINK_ROLE); + row[0]->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); + + auto locale = QLocale::system(); + setStringItem(row[1], + locale.toString(QDateTime::fromSecsSinceEpoch(item.timestamp), + QLocale::ShortFormat), + false); + + if (item.deletionLink.isNull()) + { + setStringItem(row[2], "N/A", false); + } + else + { + setStringItem(row[2], "[Double click to open]", false); + row[2]->setData(item.deletionLink, DOUBLE_CLICK_LINK_ROLE); + } + + if (item.localPath.isNull()) + { + setStringItem(row[3], "n/a", false); + } + else + { + setStringItem(row[3], item.localPath, true); + } +} + +} // namespace chatterino diff --git a/src/singletons/imageuploader/UploadedImageModel.hpp b/src/singletons/imageuploader/UploadedImageModel.hpp new file mode 100644 index 000000000..e8850337c --- /dev/null +++ b/src/singletons/imageuploader/UploadedImageModel.hpp @@ -0,0 +1,27 @@ +#pragma once + +#include "common/SignalVectorModel.hpp" +#include "singletons/imageuploader/ImageUploader.hpp" + +#include +#include + +namespace chatterino { + +class UploadedImageModel : public SignalVectorModel +{ + explicit UploadedImageModel(QObject *parent); + friend class ImageUploader; + +protected: + UploadedImage getItemFromRow(std::vector &row, + const UploadedImage &original) override; + + void getRowFromItem(const UploadedImage &item, + std::vector &row) override; + +public: + static constexpr auto DOUBLE_CLICK_LINK_ROLE = Qt::UserRole + 2; +}; + +} // namespace chatterino diff --git a/src/widgets/dialogs/SettingsDialog.cpp b/src/widgets/dialogs/SettingsDialog.cpp index 1ee94b4cf..79701a348 100644 --- a/src/widgets/dialogs/SettingsDialog.cpp +++ b/src/widgets/dialogs/SettingsDialog.cpp @@ -16,6 +16,7 @@ #include "widgets/settingspages/GeneralPage.hpp" #include "widgets/settingspages/HighlightingPage.hpp" #include "widgets/settingspages/IgnoresPage.hpp" +#include "widgets/settingspages/ImageUploaderPage.hpp" #include "widgets/settingspages/KeyboardSettingsPage.hpp" #include "widgets/settingspages/ModerationPage.hpp" #include "widgets/settingspages/NicknamesPage.hpp" @@ -222,6 +223,7 @@ void SettingsDialog::addTabs() this->addTab([]{return new ModerationPage;}, "Moderation", ":/settings/moderation.svg", SettingsTabId::Moderation); this->addTab([]{return new NotificationPage;}, "Live Notifications", ":/settings/notification2.svg"); this->addTab([]{return new ExternalToolsPage;}, "External tools", ":/settings/externaltools.svg"); + this->addTab([]{return new ImageUploaderPage;}, "Image Uploader", ":/settings/imageuploader.svg"); #ifdef CHATTERINO_HAVE_PLUGINS this->addTab([]{return new PluginsPage;}, "Plugins", ":/settings/plugins.svg"); #endif diff --git a/src/widgets/settingspages/ImageUploaderPage.cpp b/src/widgets/settingspages/ImageUploaderPage.cpp new file mode 100644 index 000000000..04104d620 --- /dev/null +++ b/src/widgets/settingspages/ImageUploaderPage.cpp @@ -0,0 +1,88 @@ +#include "widgets/settingspages/ImageUploaderPage.hpp" + +#include "Application.hpp" +#include "singletons/imageuploader/ImageUploader.hpp" +#include "singletons/imageuploader/UploadedImageModel.hpp" +#include "util/LayoutCreator.hpp" +#include "widgets/helper/EditableModelView.hpp" +#include "widgets/listview/ImagePtrItemDelegate.hpp" + +#include +#include +#include +#include +#include +#include + +namespace chatterino { + +ImageUploaderPage::ImageUploaderPage() + : imgDelegate_(new ImagePtrItemDelegate()) +{ + LayoutCreator layoutCreator(this); + auto layout = layoutCreator.emplace(); + + auto *model = getApp()->imageUploader->createModel(nullptr); + //EditableModelView *view = + // layout.emplace(model).getElement(); + + auto container = layout.emplace(); + container->setContentsMargins(0, 0, 0, 0); + + auto buttons = container.emplace(); + auto *forget = buttons.emplace().getElement(); + forget->setText("Remove image from log"); + buttons->addStretch(); + + auto *view = layout.emplace().getElement(); + view->setModel(model); + + view->setItemDelegateForColumn(0, this->imgDelegate_); + view->setSelectionMode(QAbstractItemView::SingleSelection); + view->setSelectionBehavior(QAbstractItemView::SelectRows); + + view->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); + model->setHeaderData(0, Qt::Horizontal, "Image (double click to open)", + Qt::DisplayRole); + + view->horizontalHeader()->setSectionResizeMode( + 1, QHeaderView::ResizeToContents); + model->setHeaderData(1, Qt::Horizontal, "Date uploaded", Qt::DisplayRole); + + view->horizontalHeader()->setSectionResizeMode( + 2, QHeaderView::ResizeToContents); + model->setHeaderData(2, Qt::Horizontal, "Delete link", Qt::DisplayRole); + + view->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Interactive); + model->setHeaderData(3, Qt::Horizontal, "Path", Qt::DisplayRole); + + QObject::connect(forget, &QPushButton::pressed, this, [view, model]() { + auto selected = view->selectionModel()->selectedRows(0); + std::vector rows; + for (auto &&index : selected) + { + rows.push_back(index.row()); + } + + std::sort(rows.begin(), rows.end(), std::greater{}); + + for (auto &&row : rows) + { + model->removeRow(row); + } + getApp()->imageUploader->save(); + }); + QObject::connect( + view, &QTableView::doubleClicked, [](const QModelIndex &clicked) { + auto url = clicked.data(UploadedImageModel::DOUBLE_CLICK_LINK_ROLE) + .toString(); + QDesktopServices::openUrl(QUrl(url)); + }); +} + +ImageUploaderPage::~ImageUploaderPage() +{ + delete this->imgDelegate_; +} + +} // namespace chatterino diff --git a/src/widgets/settingspages/ImageUploaderPage.hpp b/src/widgets/settingspages/ImageUploaderPage.hpp new file mode 100644 index 000000000..d0953f42d --- /dev/null +++ b/src/widgets/settingspages/ImageUploaderPage.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include "widgets/settingspages/SettingsPage.hpp" + +namespace chatterino { + +class ImagePtrItemDelegate; + +class ImageUploaderPage : public SettingsPage +{ + ImagePtrItemDelegate *imgDelegate_; + +public: + ImageUploaderPage(); + ~ImageUploaderPage() override; + + ImageUploaderPage(ImageUploaderPage &cpy) = delete; + ImageUploaderPage(ImageUploaderPage &&move) = delete; + ImageUploaderPage &operator=(const ImageUploaderPage ©Assign) = delete; + ImageUploaderPage &&operator=(const ImageUploaderPage &&moveAssign) = + delete; +}; + +} // namespace chatterino