diff --git a/qml/main.qml b/qml/main.qml index 42ee881..752ede0 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -167,12 +167,30 @@ Kirigami.ApplicationWindow { } shortcut: "Ctrl+Shift+F" }, + Kirigami.Action { + text: qsTr("Undo \"%1\"").arg(nativeInterface.undoText) + visible: nativeInterface.undoText.length !== 0 + && nativeInterface.entryFilter.length === 0 + enabled: visible + iconName: "edit-undo" + shortcut: StandardKey.Undo + onTriggered: nativeInterface.undo() + }, + Kirigami.Action { + text: qsTr("Redo \"%1\"").arg(nativeInterface.redoText) + visible: nativeInterface.redoText.length !== 0 + && nativeInterface.entryFilter.length === 0 + enabled: visible + iconName: "edit-redo" + shortcut: StandardKey.Redo + onTriggered: nativeInterface.redo() + }, Kirigami.Action { text: qsTr("Close file") enabled: nativeInterface.fileOpen iconName: "document-close" - onTriggered: nativeInterface.close() shortcut: StandardKey.Close + onTriggered: nativeInterface.close() } ] Controls.Switch { diff --git a/quickgui/controller.cpp b/quickgui/controller.cpp index 40d3807..6366664 100644 --- a/quickgui/controller.cpp +++ b/quickgui/controller.cpp @@ -36,6 +36,10 @@ namespace QtGui { Controller::Controller(QSettings &settings, const QString &filePath, QObject *parent) : QObject(parent) , m_settings(settings) +#ifdef PASSWORD_MANAGER_UNDO_SUPPORT + , m_entryModel(&m_undoStack) + , m_fieldModel(&m_undoStack) +#endif , m_fileOpen(false) , m_fileModified(false) , m_useNativeFileDialog(false) @@ -51,6 +55,11 @@ Controller::Controller(QSettings &settings, const QString &filePath, QObject *pa m_entryFilterModel.setSourceModel(&m_entryModel); connect(&m_entryModel, &QAbstractItemModel::rowsAboutToBeRemoved, this, &Controller::handleEntriesRemoved); +#ifdef PASSWORD_MANAGER_UNDO_SUPPORT + connect(&m_undoStack, &QUndoStack::undoTextChanged, this, &Controller::undoTextChanged); + connect(&m_undoStack, &QUndoStack::redoTextChanged, this, &Controller::redoTextChanged); +#endif + // share settings with main window m_settings.beginGroup(QStringLiteral("mainwindow")); m_recentFiles = m_settings.value(QStringLiteral("recententries")).toStringList(); diff --git a/quickgui/controller.h b/quickgui/controller.h index b1282ff..5e63d8c 100644 --- a/quickgui/controller.h +++ b/quickgui/controller.h @@ -12,6 +12,11 @@ QT_FORWARD_DECLARE_CLASS(QSettings) +#ifdef PASSWORD_MANAGER_GUI_QTWIDGETS +#define PASSWORD_MANAGER_UNDO_SUPPORT +#include +#endif + namespace QtGui { class Controller : public QObject { @@ -37,6 +42,9 @@ class Controller : public QObject { Q_PROPERTY(QString entryFilter READ entryFilter WRITE setEntryFilter NOTIFY entryFilterChanged) Q_PROPERTY(bool hasEntryFilter READ hasEntryFilter NOTIFY hasEntryFilterChanged) Q_PROPERTY(bool filterAsDialog READ filterAsDialog NOTIFY filterAsDialogChanged) + Q_PROPERTY(QUndoStack *undoStack READ undoStack NOTIFY undoStackChanged) + Q_PROPERTY(QString undoText READ undoText NOTIFY undoTextChanged) + Q_PROPERTY(QString redoText READ redoText NOTIFY redoTextChanged) public: explicit Controller(QSettings &settings, const QString &filePath = QString(), QObject *parent = nullptr); @@ -75,6 +83,9 @@ public: void setEntryFilter(const QString &filter); bool hasEntryFilter() const; bool filterAsDialog() const; + QUndoStack *undoStack(); + QString undoText() const; + QString redoText() const; public slots: void init(); @@ -88,6 +99,8 @@ public slots: void handleFileSelectionAcceptedDescriptor(const QString &nativeUrl, const QString &fileName, int fileDescriptor, bool existing); #endif void handleFileSelectionCanceled(); + void undo(); + void redo(); signals: void filePathChanged(const QString &newFilePath); @@ -110,6 +123,9 @@ signals: void entryFilterChanged(const QString &newFilter); void hasEntryFilterChanged(bool hasEntryFilter); void filterAsDialogChanged(bool filterAsDialog); + void undoStackChanged(QUndoStack *undoStack); + void undoTextChanged(const QString &undoText); + void redoTextChanged(const QString &redoText); private slots: void handleEntriesRemoved(const QModelIndex &parentIndex, int first, int last); @@ -128,6 +144,9 @@ private: QString m_password; QString m_windowTitle; Io::PasswordFile m_file; +#ifdef PASSWORD_MANAGER_UNDO_SUPPORT + QUndoStack m_undoStack; +#endif EntryModel m_entryModel; EntryFilterModel m_entryFilterModel; FieldModel m_fieldModel; @@ -288,6 +307,47 @@ inline bool Controller::filterAsDialog() const return m_filterAsDialog; } +inline QUndoStack *Controller::undoStack() +{ +#ifdef PASSWORD_MANAGER_UNDO_SUPPORT + return &m_undoStack; +#else + return nullptr; +#endif +} + +inline QString Controller::undoText() const +{ +#ifdef PASSWORD_MANAGER_UNDO_SUPPORT + return m_undoStack.undoText(); +#else + return QString(); +#endif +} + +inline QString Controller::redoText() const +{ +#ifdef PASSWORD_MANAGER_UNDO_SUPPORT + return m_undoStack.redoText(); +#else + return QString(); +#endif +} + +inline void Controller::undo() +{ +#ifdef PASSWORD_MANAGER_UNDO_SUPPORT + return m_undoStack.undo(); +#endif +} + +inline void Controller::redo() +{ +#ifdef PASSWORD_MANAGER_UNDO_SUPPORT + return m_undoStack.redo(); +#endif +} + } // namespace QtGui #endif // QT_QUICK_GUI_CONTROLLER_H