From c2fc2e998d90006b00fbb945168a96e05c10bea7 Mon Sep 17 00:00:00 2001 From: Yuriy Puchkov Date: Tue, 4 Aug 2020 19:08:16 +0300 Subject: [PATCH] Remove screenshot feature --- graphics.qrc | 1 + img/material/black/delete.png | Bin 0 -> 6803 bytes img/material/black/delete.svg | 7 ++ src/utils/history.h | 2 +- src/widgets/historywidget.cpp | 194 +++++++++++++++++++++------------- src/widgets/historywidget.h | 5 + 6 files changed, 134 insertions(+), 75 deletions(-) create mode 100644 img/material/black/delete.png create mode 100644 img/material/black/delete.svg diff --git a/graphics.qrc b/graphics.qrc index 87a2a790..43919bdc 100644 --- a/graphics.qrc +++ b/graphics.qrc @@ -2,6 +2,7 @@ img/app/flameshot.svg img/app/flameshot.png + img/material/black/delete.svg img/material/black/undo-variant.svg img/material/black/text.svg img/material/black/square.svg diff --git a/img/material/black/delete.png b/img/material/black/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..024a1100afb102c888a6f2625b00d938fe8f122d GIT binary patch literal 6803 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 B&@2D| literal 0 HcmV?d00001 diff --git a/img/material/black/delete.svg b/img/material/black/delete.svg new file mode 100644 index 00000000..0fcbb634 --- /dev/null +++ b/img/material/black/delete.svg @@ -0,0 +1,7 @@ + + + + + Svg Vector Icons : http://www.onlinewebfonts.com/icon + + \ No newline at end of file diff --git a/src/utils/history.h b/src/utils/history.h index 6a2fc686..4f720336 100644 --- a/src/utils/history.h +++ b/src/utils/history.h @@ -1,7 +1,7 @@ #ifndef HISTORY_H #define HISTORY_H -#define HISTORY_MAX_SIZE 10 +#define HISTORY_MAX_SIZE 20 #define HISTORY_THUNB_SCALE 1.5 #define HISTORY_THUNB_WIDTH 160*HISTORY_THUNB_SCALE #define HISTORY_THUNB_HEIGH 90*HISTORY_THUNB_SCALE diff --git a/src/widgets/historywidget.cpp b/src/widgets/historywidget.cpp index 20b8140f..d13c68f3 100644 --- a/src/widgets/historywidget.cpp +++ b/src/widgets/historywidget.cpp @@ -18,6 +18,7 @@ #include #include #include +#include HistoryWidget::HistoryWidget(QWidget *parent) : QDialog(parent) @@ -43,88 +44,133 @@ HistoryWidget::HistoryWidget(QWidget *parent) : QDialog(parent) } void HistoryWidget::loadHistory() { - History history = History(); - QList historyFiles = history.history(); - + // get settings ConfigEnterprise configEnterprise; QSettings *settings = configEnterprise.settings(); settings->beginGroup("S3"); QString s3BaseUrl = settings->value("S3_URL").toString(); settings->endGroup(); + // read history files + History history = History(); + QList historyFiles = history.history(); + if(historyFiles.isEmpty()) { - QPushButton *buttonEmpty = new QPushButton; - buttonEmpty->setText(tr("Screenshots history is empty")); - buttonEmpty->setMinimumSize(1, HISTORYPIXMAP_MAX_PREVIEW_HEIGHT); - connect(buttonEmpty, &QPushButton::clicked, this, [=](){ - this->close(); - }); - m_pVBox->addWidget(buttonEmpty); - return; + setEmptyMessage(); } - foreach(QString fileName, historyFiles) { - // generate url - QString fullFileName = history.path() + fileName; - QString url = s3BaseUrl + fileName; - - // load pixmap - QPixmap pixmap; - pixmap.load( fullFileName, "png" ); - - if (pixmap.height() / HISTORYPIXMAP_MAX_PREVIEW_HEIGHT >= pixmap.width() / HISTORYPIXMAP_MAX_PREVIEW_WIDTH) { - pixmap = pixmap.scaledToHeight(HISTORYPIXMAP_MAX_PREVIEW_HEIGHT); - } else { - pixmap = pixmap.scaledToWidth(HISTORYPIXMAP_MAX_PREVIEW_WIDTH); + else { + // generate history list + foreach(QString fileName, historyFiles) { + addLine(s3BaseUrl + fileName, history.path() + fileName); } - - // get file info - QFileInfo *pFileInfo = new QFileInfo(fullFileName); - QString lastModified = pFileInfo->lastModified().toString(" yyyy-MM-dd hh:mm:ss"); - - // screenshot preview - QLabel *pScreenshot = new QLabel(); - pScreenshot->setStyleSheet("padding: 5px;"); - pScreenshot->setMinimumHeight(HISTORYPIXMAP_MAX_PREVIEW_HEIGHT); - pScreenshot->setPixmap(pixmap); - - // screenshot datetime - QLabel *pScreenshotText = new QLabel(); - pScreenshotText->setStyleSheet("padding: 5px;"); - pScreenshotText->setMinimumHeight(HISTORYPIXMAP_MAX_PREVIEW_HEIGHT); - pScreenshotText->setText(lastModified); - - // copy url - QPushButton *buttonCopyUrl = new QPushButton; - buttonCopyUrl->setText(tr("Copy URL")); - buttonCopyUrl->setMinimumHeight(HISTORYPIXMAP_MAX_PREVIEW_HEIGHT); - connect(buttonCopyUrl, &QPushButton::clicked, this, [=](){ - QApplication::clipboard()->setText(url); - m_notification->showMessage(tr("URL copied to clipboard.")); - this->close(); - }); - - // open in browser - QPushButton *buttonOpen = new QPushButton; - buttonOpen->setText(tr("Open in browser")); - buttonOpen->setMinimumHeight(HISTORYPIXMAP_MAX_PREVIEW_HEIGHT); - connect(buttonOpen, &QPushButton::clicked, this, [=](){ - QDesktopServices::openUrl(QUrl(url)); - this->close(); - }); - - // layout - QHBoxLayout *phbl = new QHBoxLayout(); - phbl->addWidget(pScreenshot); - phbl->addWidget(pScreenshotText); - phbl->addWidget(buttonCopyUrl); - phbl->addWidget(buttonOpen); - - phbl->setStretchFactor(pScreenshot, 3); - phbl->setStretchFactor(pScreenshotText, 2); - phbl->setStretchFactor(buttonCopyUrl, 2); - phbl->setStretchFactor(buttonOpen, 2); - - // add to scroll - m_pVBox->addLayout(phbl); + } +} + +void HistoryWidget::setEmptyMessage() { + QPushButton *buttonEmpty = new QPushButton; + buttonEmpty->setText(tr("Screenshots history is empty")); + buttonEmpty->setMinimumSize(1, HISTORYPIXMAP_MAX_PREVIEW_HEIGHT); + connect(buttonEmpty, &QPushButton::clicked, this, [=](){ + this->close(); + }); + m_pVBox->addWidget(buttonEmpty); +} + +void HistoryWidget::addLine(const QString &url, const QString &fullFileName) { + QHBoxLayout *phbl = new QHBoxLayout(); + + // load pixmap + QPixmap pixmap; + pixmap.load( fullFileName, "png" ); + + if (pixmap.height() / HISTORYPIXMAP_MAX_PREVIEW_HEIGHT >= pixmap.width() / HISTORYPIXMAP_MAX_PREVIEW_WIDTH) { + pixmap = pixmap.scaledToHeight(HISTORYPIXMAP_MAX_PREVIEW_HEIGHT); + } else { + pixmap = pixmap.scaledToWidth(HISTORYPIXMAP_MAX_PREVIEW_WIDTH); + } + + // get file info + QFileInfo *pFileInfo = new QFileInfo(fullFileName); + QString lastModified = pFileInfo->lastModified().toString(" yyyy-MM-dd\nhh:mm:ss"); + + // screenshot preview + QLabel *pScreenshot = new QLabel(); + pScreenshot->setStyleSheet("padding: 5px;"); + pScreenshot->setMinimumHeight(HISTORYPIXMAP_MAX_PREVIEW_HEIGHT); + pScreenshot->setPixmap(pixmap); + + // screenshot datetime + QLabel *pScreenshotText = new QLabel(); + pScreenshotText->setStyleSheet("padding: 5px;"); + pScreenshotText->setMinimumHeight(HISTORYPIXMAP_MAX_PREVIEW_HEIGHT); + pScreenshotText->setAlignment(Qt::AlignCenter); + pScreenshotText->setText(lastModified); + + // copy url + QPushButton *buttonCopyUrl = new QPushButton; + buttonCopyUrl->setText(tr("Copy URL")); + buttonCopyUrl->setMinimumHeight(HISTORYPIXMAP_MAX_PREVIEW_HEIGHT); + connect(buttonCopyUrl, &QPushButton::clicked, this, [=](){ + QApplication::clipboard()->setText(url); + m_notification->showMessage(tr("URL copied to clipboard.")); + this->close(); + }); + + // open in browser + QPushButton *buttonOpen = new QPushButton; + buttonOpen->setText(tr("Open in browser")); + buttonOpen->setMinimumHeight(HISTORYPIXMAP_MAX_PREVIEW_HEIGHT); + connect(buttonOpen, &QPushButton::clicked, this, [=](){ + QDesktopServices::openUrl(QUrl(url)); + this->close(); + }); + + // delete + QPushButton *buttonDelete = new QPushButton; + buttonDelete->setIcon(QIcon(":/img/material/black/delete.svg")); + buttonDelete->setMinimumHeight(HISTORYPIXMAP_MAX_PREVIEW_HEIGHT); + connect(buttonDelete, &QPushButton::clicked, this, [=](){ + removeItem(phbl, fullFileName); + }); + + // layout + phbl->addWidget(pScreenshot); + phbl->addWidget(pScreenshotText); + phbl->addWidget(buttonCopyUrl); + phbl->addWidget(buttonOpen); + phbl->addWidget(buttonDelete); + + phbl->setStretchFactor(pScreenshot, 6); + phbl->setStretchFactor(pScreenshotText, 4); + phbl->setStretchFactor(buttonCopyUrl, 4); + phbl->setStretchFactor(buttonOpen, 4); + phbl->setStretchFactor(buttonDelete, 1); + + + // add to scroll + m_pVBox->addLayout(phbl); +} + +void HistoryWidget::removeItem(QLayout *pl, const QString &fullFileName) { + // TODO - send delete request + qDebug() << "Delete image on S3"; + + // delete cached image on local dist + QFile file(fullFileName); + file.remove(); + + // remove current row or refresh list + while(pl->count() > 0) + { + QLayoutItem *item = pl->takeAt(0); + delete item->widget(); + delete item; + } + m_pVBox->removeItem(pl); + delete pl; + + // set "empty" message if no items left + if(m_pVBox->count() == 0) { + setEmptyMessage(); } } diff --git a/src/widgets/historywidget.h b/src/widgets/historywidget.h index e0f1bac1..c685a501 100644 --- a/src/widgets/historywidget.h +++ b/src/widgets/historywidget.h @@ -7,7 +7,9 @@ #include #include #include +#include +class QLayout; class QVBoxLayout; class NotificationWidget; @@ -21,6 +23,9 @@ signals: private: void loadHistory(); + void addLine(const QString &, const QString &); + void removeItem(QLayout *, const QString &); + void setEmptyMessage(); private: QVBoxLayout *m_pVBox;