Prechádzať zdrojové kódy

Add recent files menu to the Lua Editor (#18581)

Signed-off-by: LafLaurine <[email protected]>
Laurine Lafontaine 7 mesiacov pred
rodič
commit
87b1cc8bf0

+ 54 - 0
Code/Tools/LuaIDE/Source/LUA/LUAEditorMainWindow.cpp

@@ -36,6 +36,7 @@
 #include <AzToolsFramework/UI/LegacyFramework/CustomMenus/CustomMenusAPI.h>
 #include <Source/LUA/TargetContextButton.hxx>
 #include <Source/LUA/LUAEditorDebuggerMessages.h>
+
 #include "DebugAttachmentButton.hxx"
 #include "ClassReferenceFilter.hxx"
 #include "WatchesPanel.hxx"
@@ -44,6 +45,7 @@
 #include "LUAEditorContextMessages.h"
 #include "LUABreakpointTrackerMessages.h"
 #include "LUAEditorSettingsDialog.hxx"
+#include "RecentFiles.h"
 
 #include <Source/AssetDatabaseLocationListener.h>
 #include <Source/LUA/ui_LUAEditorMainWindow.h>
@@ -81,6 +83,7 @@ namespace LUAEditor
         , m_lastFocusedAssetId()
         , m_ptrFindDialog(nullptr)
         , m_settingsDialog(nullptr)
+        , m_actionClearRecentFiles(nullptr)
     {
         initSharedResources();
         auto settingsRegistry = AZ::SettingsRegistry::Get();
@@ -214,6 +217,8 @@ namespace LUAEditor
 
         connect(m_gui->actionOpen, SIGNAL(triggered(bool)), this, SLOT(OnFileMenuOpen()));
 
+        UpdateOpenRecentMenu();
+
         connect(m_gui->actionAutocomplete, SIGNAL(triggered(bool)), this, SLOT(OnAutocompleteChanged(bool)));
 
         auto newState = AZ::UserSettings::CreateFind<LUAEditorMainWindowSavedState>(AZ_CRC_CE("LUA EDITOR MAIN WINDOW STATE"), AZ::UserSettings::CT_LOCAL);
@@ -293,6 +298,53 @@ namespace LUAEditor
         m_gui->actionAutocomplete->blockSignals(false);
     }
 
+    void LUAEditorMainWindow::UpdateOpenRecentMenu()
+    {
+        const QStringList recentFiles = ReadRecentFiles();
+
+        QList<QAction*> actions = m_gui->menuOpenRecent->actions();
+
+        for (int i = actions.size() - 1; i >= 0; i--)
+        {
+            m_gui->menuOpenRecent->removeAction(actions[i]);
+        }
+
+        for (auto& fileName : recentFiles)
+        {
+            QAction* action = new QAction(fileName, this);
+            connect(
+                action,
+                &QAction::triggered,
+                this,
+                [fileName]([[maybe_unused]] bool checked)
+                {
+                    constexpr bool errorOnNotFound = true;
+                    Context_DocumentManagement::Bus::Broadcast(
+                        &Context_DocumentManagement::Bus::Events::OnLoadDocument, fileName.toStdString().c_str(), errorOnNotFound);
+                });
+            m_gui->menuOpenRecent->addAction(action);
+        }
+
+        m_gui->menuOpenRecent->addSeparator();
+
+        m_actionClearRecentFiles = new QAction("Clear Recent Files", this);
+
+        connect(
+            m_actionClearRecentFiles,
+            &QAction::triggered,
+            this,
+            [this]([[maybe_unused]] bool checked)
+            {
+                ClearRecentFile();
+                UpdateOpenRecentMenu();
+            });
+
+        m_gui->menuOpenRecent->addAction(m_actionClearRecentFiles);
+
+        m_gui->menuOpenRecent->setEnabled(!recentFiles.isEmpty());
+        m_actionClearRecentFiles->setEnabled(!recentFiles.isEmpty());
+    }
+
     LUAEditorMainWindow::~LUAEditorMainWindow(void)
     {
         removeEventFilter(this);
@@ -851,6 +903,8 @@ namespace LUAEditor
         const AZStd::string assetId(result->GetFullPath().data());
         Context_DocumentManagement::Bus::Broadcast(&Context_DocumentManagement::Bus::Events::OnLoadDocument, assetId, true);
         AzFramework::StringFunc::Path::Split(assetId.c_str(), nullptr, &m_lastOpenFilePath);
+        AddRecentFile(result->GetFullPath().c_str());
+        UpdateOpenRecentMenu();
     }
 
     void LUAEditorMainWindow::OnFileMenuNew()

+ 3 - 0
Code/Tools/LuaIDE/Source/LUA/LUAEditorMainWindow.hxx

@@ -209,10 +209,13 @@ namespace LUAEditor
         AzToolsFramework::AssetBrowser::AssetBrowserFilterModel* m_filterModel;
         QSharedPointer<AzToolsFramework::AssetBrowser::CompositeFilter> CreateFilter();
 
+        QAction* m_actionClearRecentFiles;
+
         void LogLineSelectionChanged(const AzToolsFramework::Logging::LogLine& logLine);
 
         void OnOptionsMenuRequested();
 
+        void UpdateOpenRecentMenu();
     public:
 
         void SetupLuaFilesPanel();

+ 6 - 0
Code/Tools/LuaIDE/Source/LUA/LUAEditorMainWindow.ui

@@ -36,6 +36,12 @@
     </property>
     <addaction name="actionNew"/>
     <addaction name="actionOpen"/>
+    <widget class="QMenu" name="menuOpenRecent">
+      <property name="title">
+         <string>Open Recent</string>
+      </property>
+    </widget>
+    <addaction name="menuOpenRecent"/>
     <addaction name="actionSave"/>
     <addaction name="actionSaveAs"/>
     <addaction name="actionSaveAll"/>

+ 78 - 0
Code/Tools/LuaIDE/Source/LUA/RecentFiles.cpp

@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+
+#include <QSettings>
+
+#define LUAEDITOR_SETTINGS_RECENT_FILES_KEY        (QString("Recent Files"))
+#define LUAEDITOR_SETTINGS_RECENT_FILES_PATH_KEY   (QString("path"))
+#define LUAEDITOR_SETTINGS_RECENT_FILES_COUNT_MAX  (10)
+#define LUAEDITOR_GROUPNAME "Lua Editor"
+
+#define AZ_QCOREAPPLICATION_SETTINGS_ORGANIZATION_NAME "O3DE"
+#define AZ_QCOREAPPLICATION_SETTINGS_APPLICATION_NAME "O3DE"
+
+QStringList ReadRecentFiles()
+{
+    QSettings settings(QSettings::IniFormat, QSettings::UserScope, AZ_QCOREAPPLICATION_SETTINGS_ORGANIZATION_NAME);
+
+    settings.beginGroup(LUAEDITOR_GROUPNAME);
+    int count = std::min(settings.beginReadArray(LUAEDITOR_SETTINGS_RECENT_FILES_KEY), LUAEDITOR_SETTINGS_RECENT_FILES_COUNT_MAX);
+
+    // QSettings -> QStringList.
+    QStringList recentFiles;
+    {
+        for (int i = 0; i < count; ++i)
+        {
+            settings.setArrayIndex(i);
+            recentFiles.append(settings.value(LUAEDITOR_SETTINGS_RECENT_FILES_PATH_KEY).toString());
+        }
+    }
+
+    settings.endArray();
+    settings.endGroup();
+
+    return recentFiles;
+}
+
+void WriteRecentFiles(const QStringList& recentFiles)
+{
+    QSettings settings(QSettings::IniFormat, QSettings::UserScope, AZ_QCOREAPPLICATION_SETTINGS_ORGANIZATION_NAME);
+
+    settings.beginGroup(LUAEDITOR_GROUPNAME);
+    settings.beginWriteArray(LUAEDITOR_SETTINGS_RECENT_FILES_KEY);
+    int count = std::min(recentFiles.size(),
+            LUAEDITOR_SETTINGS_RECENT_FILES_COUNT_MAX);
+
+    // QSettings -> QStringList.
+    {
+        for (int i = 0; i < count; ++i)
+        {
+            settings.setArrayIndex(i);
+            settings.setValue(LUAEDITOR_SETTINGS_RECENT_FILES_PATH_KEY, recentFiles.at(i));
+        }
+    }
+
+    settings.endArray();
+    settings.endGroup();
+}
+
+void AddRecentFile(const QString& filename)
+{
+    // QSettings -> QStringList.
+    QStringList recentFiles = ReadRecentFiles();
+
+    recentFiles.prepend(filename);
+    recentFiles.removeDuplicates();
+
+    WriteRecentFiles(recentFiles);
+}
+
+void ClearRecentFile()
+{
+    WriteRecentFiles(QStringList());
+}

+ 13 - 0
Code/Tools/LuaIDE/Source/LUA/RecentFiles.h

@@ -0,0 +1,13 @@
+/*
+ * Copyright (c) Contributors to the Open 3D Engine Project.
+ * For complete copyright and license terms please see the LICENSE at the root of this distribution.
+ *
+ * SPDX-License-Identifier: Apache-2.0 OR MIT
+ *
+ */
+#pragma once
+
+QStringList ReadRecentFiles();
+void WriteRecentFiles(const QStringList& filenames);
+void AddRecentFile(const QString& filename);
+void ClearRecentFile();

+ 2 - 0
Code/Tools/LuaIDE/lua_ide_files.cmake

@@ -66,6 +66,8 @@ set(FILES
     Source/LUA/LUAStackTrackerMessages.h
     Source/LUA/LUATargetContextTrackerMessages.h
     Source/LUA/LUAWatchesDebuggerMessages.h
+    Source/LUA/RecentFiles.cpp
+    Source/LUA/RecentFiles.h
     Source/LUA/StackPanel.cpp
     Source/LUA/StackPanel.hxx
     Source/LUA/TargetContextButton.cpp