From b28351fba19a16565754355b37ca5dbc9db99e92 Mon Sep 17 00:00:00 2001 From: mhtvsSFrpHdE <2bemperor47@gmail.com> Date: Sat, 12 Aug 2023 20:37:32 +0800 Subject: [PATCH 1/4] Add new option "Reverse order" --- src/qlipperpreferencesdialog.ui | 124 +++++++++++++++++--------------- 1 file changed, 67 insertions(+), 57 deletions(-) diff --git a/src/qlipperpreferencesdialog.ui b/src/qlipperpreferencesdialog.ui index 4285263..9087ced 100755 --- a/src/qlipperpreferencesdialog.ui +++ b/src/qlipperpreferencesdialog.ui @@ -42,10 +42,17 @@ Preferences - - + + - Clipboard Entries Count: + Confirm Clear History + + + + + + + Change global keyboard shortcut to invoke the menu on screen @@ -97,7 +104,14 @@ - + + + + Clipboard Entries Count: + + + + Useful for bigger text blocks copied for example from dummy terminals (minicom, etc.) @@ -107,21 +121,7 @@ - - - - Keyboard Shortcut: - - - - - - - Change global keyboard shortcut to invoke the menu on screen - - - - + Tray icon image: @@ -131,23 +131,7 @@ - - - - - - - - 20 - 20 - - - - QToolButton::InstantPopup - - - - + Use clipboard extensions (X11 Selections, OS X Find Buffer) when it's supported @@ -157,7 +141,27 @@ - + + + + Synchronize history to storage instantly + + + + + + + Qt::Vertical + + + + 20 + 96 + + + + + @@ -176,37 +180,43 @@ - - + + - Clear Items on Exit + + + + + 20 + 20 + + + + QToolButton::InstantPopup - - + + - Synchronize history to storage instantly + Keyboard Shortcut: - - - - Qt::Vertical - - - - 20 - 96 - + + + + Clear Items on Exit - + - - + + + + Newly copied data appears at end of the menu + - Confirm Clear History + Reverse order From 45f97a32e4d1488aec1a6f89252ceba25cdd117a Mon Sep 17 00:00:00 2001 From: mhtvsSFrpHdE <2bemperor47@gmail.com> Date: Sat, 12 Aug 2023 20:39:57 +0800 Subject: [PATCH 2/4] Link new interface element to code --- src/qlipperpreferences.cpp | 4 ++++ src/qlipperpreferences.h | 1 + src/qlipperpreferencesdialog.cpp | 2 ++ 3 files changed, 7 insertions(+) diff --git a/src/qlipperpreferences.cpp b/src/qlipperpreferences.cpp index 09b17e7..9e02638 100755 --- a/src/qlipperpreferences.cpp +++ b/src/qlipperpreferences.cpp @@ -223,6 +223,10 @@ bool QlipperPreferences::confirmOnClear() const return value("confirmClear", true).toBool(); } +bool QlipperPreferences::reverseOrder() const{ + return value("reverseOrder", false).toBool(); +} + bool QlipperPreferences::networkSend() const { return value("networkSend", false).toBool(); diff --git a/src/qlipperpreferences.h b/src/qlipperpreferences.h index 4823865..cee5be7 100755 --- a/src/qlipperpreferences.h +++ b/src/qlipperpreferences.h @@ -55,6 +55,7 @@ class QlipperPreferences : public QSettings bool platformExtensions() const; PSESynchronization synchronizePSE() const; bool clearItemsOnExit() const; + bool reverseOrder() const; bool synchronizeHistory() const; bool confirmOnClear() const; diff --git a/src/qlipperpreferencesdialog.cpp b/src/qlipperpreferencesdialog.cpp index 59ea849..7d39010 100755 --- a/src/qlipperpreferencesdialog.cpp +++ b/src/qlipperpreferencesdialog.cpp @@ -42,6 +42,7 @@ QlipperPreferencesDialog::QlipperPreferencesDialog(QWidget *parent) : synchronizePSE->setEnabled(pse); synchronizePSE->setCurrentIndex(s->synchronizePSE()); clearItemsOnExit->setChecked(s->clearItemsOnExit()); + reverseOrder->setChecked(s->reverseOrder()); synchronizeHistory->setChecked(s->synchronizeHistory()); confirmOnClear->setChecked(s->confirmOnClear()); @@ -106,6 +107,7 @@ void QlipperPreferencesDialog::accept() s->setValue("synchronizePSE", synchronizePSE->currentIndex()); s->setValue("shortcut", shortcutWidget->keySequence().toString()); s->setValue("clearItemsOnExit", clearItemsOnExit->isChecked()); + s->setValue("reverseOrder", reverseOrder->isChecked()); s->setValue("synchronizeHistory", synchronizeHistory->isChecked()); s->setValue("confirmClear", confirmOnClear->isChecked()); From 1f3b8ef8f78a21dca9a5b15f0dcd70dba677e75b Mon Sep 17 00:00:00 2001 From: mhtvsSFrpHdE <2bemperor47@gmail.com> Date: Sat, 12 Aug 2023 20:40:46 +0800 Subject: [PATCH 3/4] Implement reverse order --- src/qlippermodel.cpp | 76 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 62 insertions(+), 14 deletions(-) diff --git a/src/qlippermodel.cpp b/src/qlippermodel.cpp index 1a08565..e5d04f8 100644 --- a/src/qlippermodel.cpp +++ b/src/qlippermodel.cpp @@ -166,35 +166,83 @@ void QlipperModel::clipboard_changed(QClipboard::Mode mode) int ix = m_dynamic.indexOf(item); if (ix == -1) { + bool reverseOrder = QlipperPreferences::Instance()->reverseOrder(); + const int sticky_count = m_sticky.count(); beginInsertRows(QModelIndex(), sticky_count, sticky_count); - m_dynamic.prepend(item); + if (reverseOrder) + { + m_dynamic.append(item); + } + else + { + m_dynamic.prepend(item); + } endInsertRows(); const int max_history = QlipperPreferences::Instance()->historyCount(); if (m_dynamic.count() > max_history) { - beginRemoveRows(QModelIndex(), sticky_count + max_history - 1, sticky_count + m_dynamic.count() - 1); - m_dynamic.erase(m_dynamic.begin() + (max_history - 1), m_dynamic.end()); - endRemoveRows(); + if (reverseOrder) + { + auto removeRowsBeginPosition = sticky_count; + auto removeRowsEndPosition = removeRowsBeginPosition + (m_dynamic.count() - max_history); + beginRemoveRows(QModelIndex(), removeRowsBeginPosition, removeRowsEndPosition); + auto dataBeginPosition = m_dynamic.begin(); + auto dataEndPosition = dataBeginPosition + (m_dynamic.count() - max_history); + m_dynamic.erase(dataBeginPosition, dataEndPosition); + endRemoveRows(); + } + else + { + auto removeRowsBeginPosition = sticky_count + max_history - 1; + auto removeRowsEndPosition = sticky_count + m_dynamic.count() - 1; + beginRemoveRows(QModelIndex(), removeRowsBeginPosition, removeRowsEndPosition); + auto beginPosition = m_dynamic.begin() + (max_history - 1); + auto endPosition = m_dynamic.end(); + m_dynamic.erase(beginPosition, endPosition); + endRemoveRows(); + } } - ix = 0; + ix = reverseOrder + ? m_dynamic.count() - 1 + : 0; } setCurrentDynamic(ix); } void QlipperModel::setCurrentDynamic(int ix) { - // move if not already on top - if (ix != 0) + bool reverseOrder = QlipperPreferences::Instance()->reverseOrder(); + const int sticky_count = m_sticky.count(); + auto m_dynamic_count = m_dynamic.count(); + + if (reverseOrder) { - const int sticky_count = m_sticky.count(); - beginMoveRows(QModelIndex(), sticky_count + ix, sticky_count + ix, QModelIndex(), sticky_count); - m_dynamic.move(ix, 0); - endMoveRows(); - } + auto m_dynamic_lastIndex = m_dynamic_count - 1; + + // move if not already on end + if (ix != m_dynamic_lastIndex) + { + beginMoveRows(QModelIndex(), sticky_count + ix, sticky_count + ix, QModelIndex(), sticky_count + m_dynamic_count); + m_dynamic.move(ix, m_dynamic_lastIndex); + endMoveRows(); + } - m_currentIndex = index(m_sticky.count()); - m_network->sendData(m_dynamic.at(0).content()); + m_currentIndex = index(m_sticky.count() + m_dynamic_lastIndex); + m_network->sendData(m_dynamic.at(m_dynamic_lastIndex).content()); + } + else + { + // move if not already on top + if (ix != 0) + { + beginMoveRows(QModelIndex(), sticky_count + ix, sticky_count + ix, QModelIndex(), sticky_count); + m_dynamic.move(ix, 0); + endMoveRows(); + } + m_currentIndex = index(m_sticky.count()); + m_network->sendData(m_dynamic.at(0).content()); + } if (QlipperPreferences::Instance()->synchronizeHistory()) { From 8c89ab682079c6082db2b8f9ae33b5d0002fb3cd Mon Sep 17 00:00:00 2001 From: mhtvsSFrpHdE <2bemperor47@gmail.com> Date: Sat, 12 Aug 2023 20:42:44 +0800 Subject: [PATCH 4/4] Fix crash in debug mode When click OK to save Qlipper Preferences, program will crash in debug mode, but runs fine in release mode. This commit is questionable and could break release mode behavior. The commit author have no desire to do further investigation. --- src/qlippermodel.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/qlippermodel.cpp b/src/qlippermodel.cpp index e5d04f8..fcb0af0 100644 --- a/src/qlippermodel.cpp +++ b/src/qlippermodel.cpp @@ -66,6 +66,13 @@ QlipperModel::~QlipperModel() void QlipperModel::resetPreferences() { + // If sticky items is empty, code will crash in Debug mode for unknown reason + // It will not crash in Release mode + if (m_sticky.count() == 0) + { + return; + } + beginRemoveRows(QModelIndex(), 0, m_sticky.count() - 1); m_sticky.clear(); endRemoveRows();