diff options
author | ByteHamster <ByteHamster@users.noreply.github.com> | 2021-04-04 15:04:13 +0300 |
---|---|---|
committer | Jonathan White <support@dmapps.us> | 2021-05-30 15:44:09 +0300 |
commit | f08086529bbd53706846246d775c6e322fe3dffd (patch) | |
tree | 5bfb861cdf79d2513d6409571d45b464d696becd | |
parent | 5be06190bb1afddcc8840616217ff46a0efaa3c9 (diff) |
Show countdown for clipboard clearing (#6333)
* Closes #1843
Co-authored-by: Jonathan White <support@dmapps.us>
-rw-r--r-- | src/gui/Clipboard.cpp | 30 | ||||
-rw-r--r-- | src/gui/Clipboard.h | 8 | ||||
-rw-r--r-- | src/gui/MainWindow.cpp | 26 | ||||
-rw-r--r-- | src/gui/MainWindow.h | 7 | ||||
-rw-r--r-- | src/gui/styles/base/basestyle.qss | 4 | ||||
-rw-r--r-- | src/gui/styles/dark/DarkStyle.cpp | 3 | ||||
-rw-r--r-- | src/gui/styles/light/LightStyle.cpp | 3 |
7 files changed, 67 insertions, 14 deletions
diff --git a/src/gui/Clipboard.cpp b/src/gui/Clipboard.cpp index ab4a84cf0..804a53143 100644 --- a/src/gui/Clipboard.cpp +++ b/src/gui/Clipboard.cpp @@ -39,8 +39,7 @@ Clipboard::Clipboard(QObject* parent) m_pasteboard = new MacPasteboard(); } #endif - m_timer->setSingleShot(true); - connect(m_timer, SIGNAL(timeout()), SLOT(clearClipboard())); + connect(m_timer, SIGNAL(timeout()), SLOT(countdownTick())); connect(qApp, SIGNAL(aboutToQuit()), SLOT(clearCopiedText())); } @@ -77,7 +76,9 @@ void Clipboard::setText(const QString& text, bool clear) if (config()->get(Config::Security_ClearClipboard).toBool()) { int timeout = config()->get(Config::Security_ClearClipboardTimeout).toInt(); if (timeout > 0) { - m_timer->start(timeout * 1000); + m_secondsElapsed = -1; + countdownTick(); + m_timer->start(1000); } } } @@ -85,15 +86,9 @@ void Clipboard::setText(const QString& text, bool clear) void Clipboard::clearCopiedText() { - if (m_timer->isActive()) { - m_timer->stop(); - } - - clearClipboard(); -} + m_timer->stop(); + emit updateCountdown(-1, ""); -void Clipboard::clearClipboard() -{ auto* clipboard = QApplication::clipboard(); if (!clipboard) { qWarning("Unable to access the clipboard."); @@ -108,6 +103,19 @@ void Clipboard::clearClipboard() m_lastCopied.clear(); } +void Clipboard::countdownTick() +{ + m_secondsElapsed++; + int timeout = config()->get(Config::Security_ClearClipboardTimeout).toInt(); + int timeLeft = timeout - m_secondsElapsed; + if (timeLeft <= 0) { + clearCopiedText(); + } else { + emit updateCountdown(100 * timeLeft / timeout, + QObject::tr("Clearing the clipboard in %1 second(s)…", "", timeLeft).arg(timeLeft)); + } +} + Clipboard* Clipboard::instance() { if (!m_instance) { diff --git a/src/gui/Clipboard.h b/src/gui/Clipboard.h index 7465f30a5..c97d91881 100644 --- a/src/gui/Clipboard.h +++ b/src/gui/Clipboard.h @@ -19,6 +19,7 @@ #ifndef KEEPASSX_CLIPBOARD_H #define KEEPASSX_CLIPBOARD_H +#include <QElapsedTimer> #include <QObject> #ifdef Q_OS_MACOS #include "core/MacPasteboard.h" @@ -39,8 +40,11 @@ public: public slots: void clearCopiedText(); +signals: + void updateCountdown(int percentage, QString message); + private slots: - void clearClipboard(); + void countdownTick(); private: explicit Clipboard(QObject* parent = nullptr); @@ -48,6 +52,8 @@ private: static Clipboard* m_instance; QTimer* m_timer; + int m_secondsElapsed = 0; + #ifdef Q_OS_MACOS // This object lives for the whole program lifetime and we cannot delete it on exit, // so ignore leak warnings. See https://bugreports.qt.io/browse/QTBUG-54832 diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 9954ee6aa..7a53f144d 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -607,6 +607,19 @@ MainWindow::MainWindow() QObject::connect(qApp, SIGNAL(applicationActivated()), this, SLOT(bringToFront())); QObject::connect(qApp, SIGNAL(openFile(QString)), this, SLOT(openDatabase(QString))); QObject::connect(qApp, SIGNAL(quitSignalReceived()), this, SLOT(appExit()), Qt::DirectConnection); + + statusBar()->setFixedHeight(24); + m_progressBarLabel = new QLabel(statusBar()); + m_progressBarLabel->setVisible(false); + statusBar()->addPermanentWidget(m_progressBarLabel); + m_progressBar = new QProgressBar(statusBar()); + m_progressBar->setVisible(false); + m_progressBar->setTextVisible(false); + m_progressBar->setMaximumWidth(100); + m_progressBar->setFixedHeight(15); + m_progressBar->setMaximum(100); + statusBar()->addPermanentWidget(m_progressBar); + connect(clipboard(), SIGNAL(updateCountdown(int, QString)), this, SLOT(updateProgressBar(int, QString))); } MainWindow::~MainWindow() @@ -1342,6 +1355,19 @@ void MainWindow::updateTrayIcon() QApplication::setQuitOnLastWindowClosed(!isTrayIconEnabled()); } +void MainWindow::updateProgressBar(int percentage, QString message) +{ + if (percentage < 0) { + m_progressBar->setVisible(false); + m_progressBarLabel->setVisible(false); + } else { + m_progressBar->setValue(percentage); + m_progressBar->setVisible(true); + m_progressBarLabel->setText(message); + m_progressBarLabel->setVisible(true); + } +} + void MainWindow::obtainContextFocusLock() { m_contextMenuFocusLock = true; diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h index 7db347fbd..8a99d4432 100644 --- a/src/gui/MainWindow.h +++ b/src/gui/MainWindow.h @@ -20,12 +20,16 @@ #define KEEPASSX_MAINWINDOW_H #include <QActionGroup> +#include <QLabel> #include <QMainWindow> +#include <QProgressBar> +#include <QStatusBar> #include <QSystemTrayIcon> #include "core/ScreenLockListener.h" #include "core/SignalMultiplexer.h" #include "gui/Application.h" +#include "gui/Clipboard.h" #include "gui/DatabaseWidget.h" namespace Ui @@ -138,6 +142,7 @@ private slots: private slots: void updateTrayIcon(); + void updateProgressBar(int percentage, QString message); private: static void setShortcut(QAction* action, QKeySequence::StandardKey standard, int fallback = 0); @@ -169,6 +174,8 @@ private: QPointer<QSystemTrayIcon> m_trayIcon; QPointer<ScreenLockListener> m_screenLockListener; QPointer<SearchWidget> m_searchWidget; + QPointer<QProgressBar> m_progressBar; + QPointer<QLabel> m_progressBarLabel; Q_DISABLE_COPY(MainWindow) diff --git a/src/gui/styles/base/basestyle.qss b/src/gui/styles/base/basestyle.qss index ff5d915bb..e015efc25 100644 --- a/src/gui/styles/base/basestyle.qss +++ b/src/gui/styles/base/basestyle.qss @@ -69,3 +69,7 @@ QPlainTextEdit, QTextEdit { background-color: palette(base); padding-left: 4px; } + +QStatusBar { + background-color: palette(window); +} diff --git a/src/gui/styles/dark/DarkStyle.cpp b/src/gui/styles/dark/DarkStyle.cpp index 491f18d1f..74653bc98 100644 --- a/src/gui/styles/dark/DarkStyle.cpp +++ b/src/gui/styles/dark/DarkStyle.cpp @@ -21,6 +21,7 @@ #include <QDialog> #include <QMainWindow> #include <QMenuBar> +#include <QStatusBar> #include <QToolBar> DarkStyle::DarkStyle() @@ -110,7 +111,7 @@ QString DarkStyle::getAppStyleSheet() const void DarkStyle::polish(QWidget* widget) { if (qobject_cast<QMainWindow*>(widget) || qobject_cast<QDialog*>(widget) || qobject_cast<QMenuBar*>(widget) - || qobject_cast<QToolBar*>(widget)) { + || qobject_cast<QToolBar*>(widget) || qobject_cast<QStatusBar*>(widget)) { auto palette = widget->palette(); #if defined(Q_OS_MACOS) if (!osUtils->isDarkMode()) { diff --git a/src/gui/styles/light/LightStyle.cpp b/src/gui/styles/light/LightStyle.cpp index 483e1323b..537e483ba 100644 --- a/src/gui/styles/light/LightStyle.cpp +++ b/src/gui/styles/light/LightStyle.cpp @@ -22,6 +22,7 @@ #include <QDialog> #include <QMainWindow> #include <QMenuBar> +#include <QStatusBar> #include <QToolBar> LightStyle::LightStyle() @@ -111,7 +112,7 @@ QString LightStyle::getAppStyleSheet() const void LightStyle::polish(QWidget* widget) { if (qobject_cast<QMainWindow*>(widget) || qobject_cast<QDialog*>(widget) || qobject_cast<QMenuBar*>(widget) - || qobject_cast<QToolBar*>(widget)) { + || qobject_cast<QToolBar*>(widget) || qobject_cast<QStatusBar*>(widget)) { auto palette = widget->palette(); #if defined(Q_OS_MACOS) if (osUtils->isDarkMode()) { |