Browse Source

stores 5 most recently used scenes

Chris Friesen 12 years ago
parent
commit
b7d4404be8

+ 5 - 0
Bin/Data/Scripts/Editor.as

@@ -159,6 +159,10 @@ void LoadConfig()
             if (fileSystem.DirExists(newImportPath))
             if (fileSystem.DirExists(newImportPath))
                 uiImportPath = newImportPath;
                 uiImportPath = newImportPath;
         }
         }
+        if (resourcesElem.HasAttribute("recentscenes"))
+        {
+            uiRecentScenes = resourcesElem.GetAttribute("recentscenes").Split(';');
+        }
     }
     }
 
 
     if (!renderingElem.isNull)
     if (!renderingElem.isNull)
@@ -250,6 +254,7 @@ void SaveConfig()
     resourcesElem.SetBool("rememberresourcepath", rememberResourcePath);
     resourcesElem.SetBool("rememberresourcepath", rememberResourcePath);
     resourcesElem.SetAttribute("resourcepath", sceneResourcePath);
     resourcesElem.SetAttribute("resourcepath", sceneResourcePath);
     resourcesElem.SetAttribute("importpath", uiImportPath);
     resourcesElem.SetAttribute("importpath", uiImportPath);
+    resourcesElem.SetAttribute("recentscenes", Join(uiRecentScenes, ";"));
 
 
     if (renderer !is null)
     if (renderer !is null)
     {
     {

+ 1 - 0
Bin/Data/Scripts/Editor/EditorImport.as

@@ -83,6 +83,7 @@ void ImportScene(const String&in fileName)
             args.Push("-l");
             args.Push("-l");
         if (fileSystem.SystemRun(fileSystem.programDir + "AssetImporter", args) == 0)
         if (fileSystem.SystemRun(fileSystem.programDir + "AssetImporter", args) == 0)
         {
         {
+            skipMruScene = true; // set to avoid adding tempscene to mru
             LoadScene(tempSceneName);
             LoadScene(tempSceneName);
             fileSystem.Delete(tempSceneName);
             fileSystem.Delete(tempSceneName);
             UpdateWindowTitle();
             UpdateWindowTitle();

+ 21 - 0
Bin/Data/Scripts/Editor/EditorScene.as

@@ -29,6 +29,7 @@ Array<XMLFile@> sceneCopyBuffer;
 
 
 bool suppressSceneChanges = false;
 bool suppressSceneChanges = false;
 bool inSelectionModify = false;
 bool inSelectionModify = false;
+bool skipMruScene = false;
 
 
 Array<EditActionGroup> undoStack;
 Array<EditActionGroup> undoStack;
 uint undoStackPos = 0;
 uint undoStackPos = 0;
@@ -198,6 +199,12 @@ bool LoadScene(const String&in fileName)
 
 
     suppressSceneChanges = false;
     suppressSceneChanges = false;
 
 
+    // global variable to mostly bypass adding mru upon importing tempscene
+    if (!skipMruScene)
+        UpdateSceneMru(fileName);
+
+    skipMruScene = false;
+
     ResetCamera();
     ResetCamera();
     CreateGizmo();
     CreateGizmo();
     CreateGrid();
     CreateGrid();
@@ -223,6 +230,7 @@ bool SaveScene(const String&in fileName)
 
 
     if (success)
     if (success)
     {
     {
+        UpdateSceneMru(fileName);
         sceneModified = false;
         sceneModified = false;
         UpdateWindowTitle();
         UpdateWindowTitle();
     }
     }
@@ -872,3 +880,16 @@ bool SaveParticleData(const String&in fileName)
 
 
     return false;
     return false;
 }
 }
+
+void UpdateSceneMru(String filename)
+{
+    while (uiRecentScenes.Find(filename) > -1)
+        uiRecentScenes.Erase(uiRecentScenes.Find(filename));
+
+    uiRecentScenes.Insert(0, filename);
+
+    for(uint i=uiRecentScenes.length-1;i>=maxRecentSceneCount;i--)
+        uiRecentScenes.Erase(i);
+
+    PopulateMruScenes();
+}

+ 29 - 0
Bin/Data/Scripts/Editor/EditorUI.as

@@ -4,6 +4,7 @@ XMLFile@ uiStyle;
 XMLFile@ iconStyle;
 XMLFile@ iconStyle;
 UIElement@ uiMenuBar;
 UIElement@ uiMenuBar;
 UIElement@ quickMenu;
 UIElement@ quickMenu;
+Window@ mruScenesPopup;
 Array<QuickMenuItem@> quickMenuItems;
 Array<QuickMenuItem@> quickMenuItems;
 FileSelector@ uiFileSelector;
 FileSelector@ uiFileSelector;
 
 
@@ -21,6 +22,8 @@ const ShortStringHash INDENT_MODIFIED_BY_ICON_VAR("IconIndented");
 const int SHOW_POPUP_INDICATOR = -1;
 const int SHOW_POPUP_INDICATOR = -1;
 const uint MAX_QUICK_MENU_ITEMS = 10;
 const uint MAX_QUICK_MENU_ITEMS = 10;
 
 
+const uint maxRecentSceneCount = 5;
+
 Array<String> uiSceneFilters = {"*.xml", "*.bin", "*.*"};
 Array<String> uiSceneFilters = {"*.xml", "*.bin", "*.*"};
 Array<String> uiElementFilters = {"*.xml"};
 Array<String> uiElementFilters = {"*.xml"};
 Array<String> uiAllFilters = {"*.*"};
 Array<String> uiAllFilters = {"*.*"};
@@ -38,6 +41,7 @@ String uiNodePath = fileSystem.programDir + "Data/Objects";
 String uiImportPath;
 String uiImportPath;
 String uiScriptPath = fileSystem.programDir + "Data/Scripts";
 String uiScriptPath = fileSystem.programDir + "Data/Scripts";
 String uiParticlePath = fileSystem.programDir + "Data/Particles";
 String uiParticlePath = fileSystem.programDir + "Data/Particles";
+Array<String> uiRecentScenes;
 
 
 bool uiFaded = false;
 bool uiFaded = false;
 float uiMinOpacity = 0.3;
 float uiMinOpacity = 0.3;
@@ -277,6 +281,10 @@ void CreateMenuBar()
         popup.AddChild(CreateMenuItem("Open scene...", @PickFile, 'O', QUAL_CTRL));
         popup.AddChild(CreateMenuItem("Open scene...", @PickFile, 'O', QUAL_CTRL));
         popup.AddChild(CreateMenuItem("Save scene", @SaveSceneWithExistingName, 'S', QUAL_CTRL));
         popup.AddChild(CreateMenuItem("Save scene", @SaveSceneWithExistingName, 'S', QUAL_CTRL));
         popup.AddChild(CreateMenuItem("Save scene as...", @PickFile, 'S', QUAL_SHIFT | QUAL_CTRL));
         popup.AddChild(CreateMenuItem("Save scene as...", @PickFile, 'S', QUAL_SHIFT | QUAL_CTRL));
+        Menu@ openRecentScene = CreateMenuItem("Open recent scene");
+        popup.AddChild(openRecentScene);
+        mruScenesPopup = CreatePopup(openRecentScene);
+        PopulateMruScenes();
         CreateChildDivider(popup);
         CreateChildDivider(popup);
 
 
         Menu@ childMenu = CreateMenuItem("Load node", null, SHOW_POPUP_INDICATOR);
         Menu@ childMenu = CreateMenuItem("Load node", null, SHOW_POPUP_INDICATOR);
@@ -1345,3 +1353,24 @@ void HandleMessageAcknowledgement(StringHash eventType, VariantMap& eventData)
     else
     else
         messageBoxCallback = null;
         messageBoxCallback = null;
 }
 }
+
+void PopulateMruScenes()
+{
+    mruScenesPopup.RemoveAllChildren();
+    for (uint i=0; i < uiRecentScenes.length; ++i)
+        mruScenesPopup.AddChild(CreateMenuItem(uiRecentScenes[i], @LoadMostRecentScene, 0, 0, false));
+}
+
+bool LoadMostRecentScene()
+{
+    Menu@ menu = GetEventSender();
+    if (menu is null)
+        return false;
+
+    Text@ text = menu.GetChildren()[0];
+    if (text is null)
+        return false;
+
+    return LoadScene(text.text);
+}
+