File indexing completed on 2024-04-28 05:52:37
0001 /* 0002 This file is part of the Okteta Gui library, made within the KDE community. 0003 0004 SPDX-FileCopyrightText: 2019 Friedrich W. H. Kossebau <kossebau@kde.org> 0005 0006 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0007 */ 0008 0009 #include "undoredocontroller.hpp" 0010 0011 // lib 0012 #include <abstractbytearrayview.hpp> 0013 #include <abstractbytearraymodel.hpp> 0014 #include <versionable.hpp> 0015 // KF 0016 #include <KLocalizedString> 0017 // Qt 0018 #include <QKeyEvent> 0019 #include <QMenu> 0020 #include <QAction> 0021 0022 namespace Okteta { 0023 0024 UndoRedoController::UndoRedoController(AbstractByteArrayView* view, AbstractController* parent) 0025 : AbstractController(parent) 0026 , mView(view) 0027 { 0028 } 0029 0030 0031 UndoRedoController::~UndoRedoController() = default; 0032 0033 bool UndoRedoController::handleKeyPress(QKeyEvent* keyEvent) 0034 { 0035 bool keyUsed = false; 0036 0037 if (!mView->isReadOnly()) { 0038 if (keyEvent == QKeySequence::Undo) { 0039 keyUsed = undo(); 0040 } else if (keyEvent == QKeySequence::Redo) { 0041 keyUsed = redo(); 0042 } 0043 } 0044 0045 return keyUsed ? true : AbstractController::handleKeyPress(keyEvent); 0046 } 0047 0048 int UndoRedoController::addContextMenuActions(QMenu* menu) 0049 { 0050 if (mView->isReadOnly()) { 0051 return 0; 0052 } 0053 0054 auto* versionable = qobject_cast<Versionable*>(mView->byteArrayModel()); 0055 0056 if (!versionable) { 0057 return 0; 0058 } 0059 0060 const auto versionIndex = versionable->versionIndex(); 0061 const auto versionCount = versionable->versionCount(); 0062 0063 QAction* undoAction = menu->addAction(QIcon::fromTheme(QStringLiteral("edit-undo")), 0064 i18nc("@action:inmenu", "&Undo") + QLatin1Char('\t') + QKeySequence(QKeySequence::Undo).toString(QKeySequence::NativeText), 0065 mView, [this] { undo(); }); 0066 undoAction->setEnabled(0 < versionIndex); 0067 undoAction->setObjectName(QStringLiteral("edit-undo")); 0068 0069 QAction* redoAction = menu->addAction(QIcon::fromTheme(QStringLiteral("edit-redo")), 0070 i18nc("@action:inmenu", "Re&do") + QLatin1Char('\t') + QKeySequence(QKeySequence::Redo).toString(QKeySequence::NativeText), 0071 mView, [this] { redo(); }); 0072 redoAction->setEnabled(versionIndex+1 < versionCount); 0073 redoAction->setObjectName(QStringLiteral("edit-redo")); 0074 0075 return 2; 0076 } 0077 0078 bool UndoRedoController::undo() 0079 { 0080 auto* versionable = qobject_cast<Okteta::Versionable*>(mView->byteArrayModel()); 0081 0082 if (!versionable) { 0083 return false; 0084 } 0085 0086 const auto versionIndex = versionable->versionIndex(); 0087 0088 if (0 >= versionIndex) { 0089 return false; 0090 } 0091 0092 versionable->revertToVersionByIndex(versionIndex - 1); 0093 return true; 0094 } 0095 0096 bool UndoRedoController::redo() 0097 { 0098 auto* versionable = qobject_cast<Okteta::Versionable*>(mView->byteArrayModel()); 0099 0100 if (!versionable) { 0101 return false; 0102 } 0103 0104 const auto versionIndex = versionable->versionIndex(); 0105 0106 if (versionIndex + 1 >= versionable->versionCount()) { 0107 return false; 0108 } 0109 0110 versionable->revertToVersionByIndex(versionIndex + 1); 0111 return true; 0112 } 0113 0114 }