Add settings page and model for uploaded images

This commit is contained in:
Mm2PL 2023-12-02 01:21:56 +01:00
parent f097caa585
commit ed3e2ecb90
No known key found for this signature in database
GPG key ID: 94AC9B80EFA15ED9
6 changed files with 206 additions and 0 deletions

View file

@ -432,6 +432,8 @@ set(SOURCE_FILES
singletons/imageuploader/ImageUploader.cpp singletons/imageuploader/ImageUploader.cpp
singletons/imageuploader/ImageUploader.hpp singletons/imageuploader/ImageUploader.hpp
singletons/imageuploader/UploadedImage.hpp singletons/imageuploader/UploadedImage.hpp
singletons/imageuploader/UploadedImageModel.cpp
singletons/imageuploader/UploadedImageModel.hpp
singletons/Logging.cpp singletons/Logging.cpp
singletons/Logging.hpp singletons/Logging.hpp
singletons/NativeMessaging.cpp singletons/NativeMessaging.cpp
@ -668,6 +670,8 @@ set(SOURCE_FILES
widgets/settingspages/PluginsPage.hpp widgets/settingspages/PluginsPage.hpp
widgets/settingspages/SettingsPage.cpp widgets/settingspages/SettingsPage.cpp
widgets/settingspages/SettingsPage.hpp widgets/settingspages/SettingsPage.hpp
widgets/settingspages/ImageUploaderPage.cpp
widgets/settingspages/ImageUploaderPage.hpp
widgets/splits/ClosedSplits.cpp widgets/splits/ClosedSplits.cpp
widgets/splits/ClosedSplits.hpp widgets/splits/ClosedSplits.hpp

View file

@ -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 <qdatetime.h>
#include <qlocale.h>
#include <qnamespace.h>
#include <QObject>
#include <Qt>
namespace chatterino {
UploadedImageModel::UploadedImageModel(QObject *parent)
: SignalVectorModel<UploadedImage>(4, parent)
{
}
// image, path, delete url
UploadedImage UploadedImageModel::getItemFromRow(
std::vector<QStandardItem *> &row, const UploadedImage &original)
{
return original;
}
void UploadedImageModel::getRowFromItem(const UploadedImage &item,
std::vector<QStandardItem *> &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

View file

@ -0,0 +1,27 @@
#pragma once
#include "common/SignalVectorModel.hpp"
#include "singletons/imageuploader/ImageUploader.hpp"
#include <QObject>
#include <Qt>
namespace chatterino {
class UploadedImageModel : public SignalVectorModel<UploadedImage>
{
explicit UploadedImageModel(QObject *parent);
friend class ImageUploader;
protected:
UploadedImage getItemFromRow(std::vector<QStandardItem *> &row,
const UploadedImage &original) override;
void getRowFromItem(const UploadedImage &item,
std::vector<QStandardItem *> &row) override;
public:
static constexpr auto DOUBLE_CLICK_LINK_ROLE = Qt::UserRole + 2;
};
} // namespace chatterino

View file

@ -16,6 +16,7 @@
#include "widgets/settingspages/GeneralPage.hpp" #include "widgets/settingspages/GeneralPage.hpp"
#include "widgets/settingspages/HighlightingPage.hpp" #include "widgets/settingspages/HighlightingPage.hpp"
#include "widgets/settingspages/IgnoresPage.hpp" #include "widgets/settingspages/IgnoresPage.hpp"
#include "widgets/settingspages/ImageUploaderPage.hpp"
#include "widgets/settingspages/KeyboardSettingsPage.hpp" #include "widgets/settingspages/KeyboardSettingsPage.hpp"
#include "widgets/settingspages/ModerationPage.hpp" #include "widgets/settingspages/ModerationPage.hpp"
#include "widgets/settingspages/NicknamesPage.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 ModerationPage;}, "Moderation", ":/settings/moderation.svg", SettingsTabId::Moderation);
this->addTab([]{return new NotificationPage;}, "Live Notifications", ":/settings/notification2.svg"); this->addTab([]{return new NotificationPage;}, "Live Notifications", ":/settings/notification2.svg");
this->addTab([]{return new ExternalToolsPage;}, "External tools", ":/settings/externaltools.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 #ifdef CHATTERINO_HAVE_PLUGINS
this->addTab([]{return new PluginsPage;}, "Plugins", ":/settings/plugins.svg"); this->addTab([]{return new PluginsPage;}, "Plugins", ":/settings/plugins.svg");
#endif #endif

View file

@ -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 <QBoxLayout>
#include <QDesktopServices>
#include <QHeaderView>
#include <QPushButton>
#include <QTableView>
#include <QUrl>
namespace chatterino {
ImageUploaderPage::ImageUploaderPage()
: imgDelegate_(new ImagePtrItemDelegate())
{
LayoutCreator<ImageUploaderPage> layoutCreator(this);
auto layout = layoutCreator.emplace<QVBoxLayout>();
auto *model = getApp()->imageUploader->createModel(nullptr);
//EditableModelView *view =
// layout.emplace<EditableModelView>(model).getElement();
auto container = layout.emplace<QVBoxLayout>();
container->setContentsMargins(0, 0, 0, 0);
auto buttons = container.emplace<QHBoxLayout>();
auto *forget = buttons.emplace<QPushButton>().getElement();
forget->setText("Remove image from log");
buttons->addStretch();
auto *view = layout.emplace<QTableView>().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<int> 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

View file

@ -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 &copyAssign) = delete;
ImageUploaderPage &&operator=(const ImageUploaderPage &&moveAssign) =
delete;
};
} // namespace chatterino