Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/keepassxreboot/keepassxc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorByteHamster <ByteHamster@users.noreply.github.com>2021-04-04 15:04:13 +0300
committerJonathan White <support@dmapps.us>2021-05-30 15:44:09 +0300
commitf08086529bbd53706846246d775c6e322fe3dffd (patch)
tree5bfb861cdf79d2513d6409571d45b464d696becd
parent5be06190bb1afddcc8840616217ff46a0efaa3c9 (diff)
Show countdown for clipboard clearing (#6333)
* Closes #1843 Co-authored-by: Jonathan White <support@dmapps.us>
-rw-r--r--src/gui/Clipboard.cpp30
-rw-r--r--src/gui/Clipboard.h8
-rw-r--r--src/gui/MainWindow.cpp26
-rw-r--r--src/gui/MainWindow.h7
-rw-r--r--src/gui/styles/base/basestyle.qss4
-rw-r--r--src/gui/styles/dark/DarkStyle.cpp3
-rw-r--r--src/gui/styles/light/LightStyle.cpp3
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()) {