File indexing completed on 2024-04-14 05:43:07
0001 /* This file is part of the KDE project 0002 Copyright (C) 2000, 2009 David Faure <faure@kde.org> 0003 Copyright (C) 2002-2003 Alexander Kellett <lypanov@kde.org> 0004 0005 This program is free software; you can redistribute it and/or 0006 modify it under the terms of the GNU General Public License as 0007 published by the Free Software Foundation; either version 2 of 0008 the License, or (at your option) version 3. 0009 0010 This program is distributed in the hope that it will be useful, 0011 but WITHOUT ANY WARRANTY; without even the implied warranty of 0012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 0013 GNU General Public License for more details. 0014 0015 You should have received a copy of the GNU General Public License 0016 along with this program. If not, see <http://www.gnu.org/licenses/> 0017 */ 0018 0019 #include "commandhistory.h" 0020 #include "commands.h" 0021 0022 #include <KActionCollection> 0023 #include <KBookmarkManager> 0024 0025 #include <QAction> 0026 #include <QUndoCommand> 0027 #include <QUndoStack> 0028 0029 class CommandHistory::Private 0030 { 0031 public: 0032 Private() 0033 : m_manager(nullptr) 0034 , m_undoStack() 0035 { 0036 } 0037 KBookmarkManager *m_manager; 0038 QUndoStack m_undoStack; 0039 }; 0040 0041 CommandHistory::CommandHistory(QObject *parent) 0042 : QObject(parent) 0043 , d(new CommandHistory::Private) 0044 { 0045 } 0046 0047 CommandHistory::~CommandHistory() 0048 { 0049 delete d; 0050 } 0051 0052 void CommandHistory::setBookmarkManager(KBookmarkManager *manager) 0053 { 0054 clearHistory(); // we can't keep old commands pointing to the wrong model/manager... 0055 d->m_manager = manager; 0056 } 0057 0058 void CommandHistory::createActions(KActionCollection *actionCollection) 0059 { 0060 // TODO use QUndoView? 0061 0062 QAction *standardAction = KStandardAction::create(KStandardAction::Undo, nullptr, nullptr, nullptr); 0063 QAction *undoAction = d->m_undoStack.createUndoAction(actionCollection); 0064 undoAction->setIcon(standardAction->icon()); 0065 actionCollection->addAction(KStandardAction::name(KStandardAction::Undo), undoAction); 0066 actionCollection->setDefaultShortcuts(undoAction, standardAction->shortcuts()); 0067 disconnect(undoAction, &QAction::triggered, &d->m_undoStack, nullptr); 0068 connect(undoAction, &QAction::triggered, this, &CommandHistory::undo); 0069 delete standardAction; 0070 0071 standardAction = KStandardAction::create(KStandardAction::Redo, nullptr, nullptr, nullptr); 0072 QAction *redoAction = d->m_undoStack.createRedoAction(actionCollection); 0073 redoAction->setIcon(standardAction->icon()); 0074 actionCollection->addAction(KStandardAction::name(KStandardAction::Redo), redoAction); 0075 actionCollection->setDefaultShortcuts(redoAction, standardAction->shortcuts()); 0076 disconnect(redoAction, &QAction::triggered, &d->m_undoStack, nullptr); 0077 connect(redoAction, &QAction::triggered, this, &CommandHistory::redo); 0078 delete standardAction; 0079 } 0080 0081 void CommandHistory::undo() 0082 { 0083 const int idx = d->m_undoStack.index(); 0084 const QUndoCommand *cmd = d->m_undoStack.command(idx - 1); 0085 if (cmd) { 0086 d->m_undoStack.undo(); 0087 commandExecuted(cmd); 0088 } 0089 } 0090 0091 void CommandHistory::redo() 0092 { 0093 const int idx = d->m_undoStack.index(); 0094 const QUndoCommand *cmd = d->m_undoStack.command(idx); 0095 if (cmd) { 0096 d->m_undoStack.redo(); 0097 commandExecuted(cmd); 0098 } 0099 } 0100 0101 void CommandHistory::commandExecuted(const QUndoCommand *k) 0102 { 0103 const IKEBCommand *cmd = dynamic_cast<const IKEBCommand *>(k); 0104 Q_ASSERT(cmd); 0105 0106 KBookmark bk = d->m_manager->findByAddress(cmd->affectedBookmarks()); 0107 Q_ASSERT(bk.isGroup()); 0108 0109 Q_EMIT notifyCommandExecuted(bk.toGroup()); 0110 } 0111 0112 void CommandHistory::notifyDocSaved() 0113 { 0114 d->m_undoStack.setClean(); 0115 } 0116 0117 void CommandHistory::addCommand(QUndoCommand *cmd) 0118 { 0119 if (!cmd) 0120 return; 0121 d->m_undoStack.push(cmd); // calls cmd->redo() 0122 CommandHistory::commandExecuted(cmd); 0123 } 0124 0125 void CommandHistory::clearHistory() 0126 { 0127 if (d->m_undoStack.count() > 0) { 0128 d->m_undoStack.clear(); 0129 Q_EMIT notifyCommandExecuted(d->m_manager->root()); // not really, but we still want to update the GUI 0130 } 0131 } 0132 0133 KBookmarkManager *CommandHistory::bookmarkManager() 0134 { 0135 return d->m_manager; 0136 } 0137 0138 #include "moc_commandhistory.cpp"