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 }