Quellcode durchsuchen

Add undo/redo functionality to folder renames (#9697)

- Renaming folders in the ATL controls panel of the audio controls
  editor weren't added to the undo stack.
- This adds undo functionality whenever the user changes the name.

closes #6880

Signed-off-by: amzn-phist <[email protected]>
amzn-phist vor 3 Jahren
Ursprung
Commit
566a2d58c4

+ 36 - 0
Gems/AudioSystem/Code/Source/Editor/AudioControlsEditorUndo.cpp

@@ -222,6 +222,41 @@ namespace AudioControls
         AddFolderItem();
         AddFolderItem();
     }
     }
 
 
+    //-------------------------------------------------------------------------------------------//
+    CUndoFolderRename::CUndoFolderRename(QStandardItem* pItem)
+        : IUndoFolderOperation(pItem)
+    {
+    }
+
+    //-------------------------------------------------------------------------------------------//
+    void CUndoFolderRename::Undo([[maybe_unused]] bool bUndo)
+    {
+        SwapNames();
+    }
+
+    //-------------------------------------------------------------------------------------------//
+    void CUndoFolderRename::Redo()
+    {
+        SwapNames();
+    }
+
+    //-------------------------------------------------------------------------------------------//
+    void CUndoFolderRename::SwapNames()
+    {
+        CUndoSuspend suspendUndo;
+        QATLTreeModel* pTree = CAudioControlsEditorPlugin::GetControlsTree();
+        if (pTree)
+        {
+            QStandardItem* pItem = GetItem(pTree, m_path);
+            if (pItem)
+            {
+                QString oldName = pItem->text();
+                pItem->setText(m_sName);
+                m_sName = oldName;
+            }
+        }
+    }
+
     //-------------------------------------------------------------------------------------------//
     //-------------------------------------------------------------------------------------------//
     CUndoControlModified::CUndoControlModified(CID id)
     CUndoControlModified::CUndoControlModified(CID id)
         : m_id(id)
         : m_id(id)
@@ -379,4 +414,5 @@ namespace AudioControls
             Copy(pTree->invisibleRootItem(), m_original.invisibleRootItem());
             Copy(pTree->invisibleRootItem(), m_original.invisibleRootItem());
         }
         }
     }
     }
+
 } // namespace AudioControls
 } // namespace AudioControls

+ 17 - 0
Gems/AudioSystem/Code/Source/Editor/AudioControlsEditorUndo.h

@@ -17,6 +17,7 @@
 
 
 #include <QATLControlsTreeModel.h>
 #include <QATLControlsTreeModel.h>
 #include <Undo/IUndoObject.h>
 #include <Undo/IUndoObject.h>
+#include <Util/UndoUtil.h>
 
 
 #include <QAbstractItemModel>
 #include <QAbstractItemModel>
 #include <QString>
 #include <QString>
@@ -106,6 +107,21 @@ namespace AudioControls
         void Redo() override;
         void Redo() override;
     };
     };
 
 
+    //-------------------------------------------------------------------------------------------//
+    class CUndoFolderRename
+        : public IUndoFolderOperation
+    {
+    public:
+        explicit CUndoFolderRename(QStandardItem* pItem);
+    protected:
+        int GetSize() override { return sizeof(*this); }
+
+        void Undo(bool bUndo) override;
+        void Redo() override;
+
+        void SwapNames();
+    };
+
     //-------------------------------------------------------------------------------------------//
     //-------------------------------------------------------------------------------------------//
     class CUndoControlModified
     class CUndoControlModified
         : public IUndoObject
         : public IUndoObject
@@ -145,4 +161,5 @@ namespace AudioControls
 
 
         bool bModifiedInitialised;
         bool bModifiedInitialised;
     };
     };
+
 } //namespace AudioControls
 } //namespace AudioControls

+ 25 - 1
Gems/AudioSystem/Code/Source/Editor/QAudioControlTreeWidget.cpp

@@ -11,6 +11,7 @@
 
 
 #include <ACEEnums.h>
 #include <ACEEnums.h>
 #include <ACETypes.h>
 #include <ACETypes.h>
+#include <AudioControlsEditorUndo.h>
 #include <QAudioControlEditorIcons.h>
 #include <QAudioControlEditorIcons.h>
 
 
 using namespace AudioControls;
 using namespace AudioControls;
@@ -65,7 +66,7 @@ QAudioControlSortProxy::QAudioControlSortProxy(QObject* pParent /*= 0*/)
 //-----------------------------------------------------------------------------------------------//
 //-----------------------------------------------------------------------------------------------//
 bool QAudioControlSortProxy::setData(const QModelIndex& index, const QVariant& value, int role /* = Qt::EditRole */)
 bool QAudioControlSortProxy::setData(const QModelIndex& index, const QVariant& value, int role /* = Qt::EditRole */)
 {
 {
-    if ((role == Qt::EditRole))
+    if (role == Qt::EditRole)
     {
     {
         QString sInitialName = value.toString();
         QString sInitialName = value.toString();
         if (sInitialName.isEmpty() || sInitialName.contains(" "))
         if (sInitialName.isEmpty() || sInitialName.contains(" "))
@@ -78,6 +79,7 @@ bool QAudioControlSortProxy::setData(const QModelIndex& index, const QVariant& v
         {
         {
             // Validate that the new folder name is valid
             // Validate that the new folder name is valid
             bool bFoundValidName = false;
             bool bFoundValidName = false;
+            QString sOriginalName = index.data(Qt::DisplayRole).toString();
             QString sCandidateName = sInitialName;
             QString sCandidateName = sInitialName;
             int nNumber = 1;
             int nNumber = 1;
             while (!bFoundValidName)
             while (!bFoundValidName)
@@ -99,12 +101,34 @@ bool QAudioControlSortProxy::setData(const QModelIndex& index, const QVariant& v
                     sibiling = index.sibling(i, 0);
                     sibiling = index.sibling(i, 0);
                 }
                 }
             }
             }
+
+            if (sCandidateName != sOriginalName && !CUndo::IsSuspended())
+            {
+                if (QStandardItem* folderItem = GetStandardItemFromIndex(index); folderItem != nullptr)
+                {
+                    CUndo undo("ATL Folder Rename");
+                    CUndo::Record(new CUndoFolderRename(folderItem));
+                }
+            }
             return QSortFilterProxyModel::setData(index, sCandidateName, role);
             return QSortFilterProxyModel::setData(index, sCandidateName, role);
         }
         }
     }
     }
     return QSortFilterProxyModel::setData(index, value, role);
     return QSortFilterProxyModel::setData(index, value, role);
 }
 }
 
 
+//-----------------------------------------------------------------------------------------------//
+QStandardItem* QAudioControlSortProxy::GetStandardItemFromIndex(const QModelIndex& index)
+{
+    if (auto srcModel = reinterpret_cast<QATLTreeModel*>(sourceModel()); srcModel != nullptr)
+    {
+        if (auto abstractItem = srcModel->itemFromIndex(mapToSource(index)); abstractItem != nullptr)
+        {
+            return reinterpret_cast<QStandardItem*>(abstractItem);
+        }
+    }
+    return nullptr;
+}
+
 //-----------------------------------------------------------------------------------------------//
 //-----------------------------------------------------------------------------------------------//
 bool QAudioControlSortProxy::lessThan(const QModelIndex& left, const QModelIndex& right) const
 bool QAudioControlSortProxy::lessThan(const QModelIndex& left, const QModelIndex& right) const
 {
 {

+ 2 - 0
Gems/AudioSystem/Code/Source/Editor/QAudioControlTreeWidget.h

@@ -49,6 +49,8 @@ public:
     explicit QAudioControlSortProxy(QObject* pParent = 0);
     explicit QAudioControlSortProxy(QObject* pParent = 0);
     bool setData(const QModelIndex& index, const QVariant& value, int role /* = Qt::EditRole */) override;
     bool setData(const QModelIndex& index, const QVariant& value, int role /* = Qt::EditRole */) override;
 
 
+    QStandardItem* GetStandardItemFromIndex(const QModelIndex& index);
+
 protected:
 protected:
     bool lessThan(const QModelIndex& left, const QModelIndex& right) const override;
     bool lessThan(const QModelIndex& left, const QModelIndex& right) const override;
 };
 };