Browse Source

Add resource directories to resource browser filters

Chris Friesen 11 years ago
parent
commit
eb3247eb2d

+ 127 - 45
Bin/Data/Scripts/Editor/EditorResourceBrowser.as

@@ -17,7 +17,8 @@ int browserSearchSortMode = 0;
 BrowserDir@ rootDir;
 Array<BrowserFile@> browserFiles;
 Dictionary browserDirs;
-Array<int> activeResourceFilters;
+Array<int> activeResourceTypeFilters;
+Array<int> activeResourceDirFilters;
 
 Array<BrowserFile@> browserFilesToScan;
 const uint BROWSER_WORKER_ITEMS_PER_TICK = 10;
@@ -95,6 +96,7 @@ const ShortStringHash EXTENSION_TYPE_HTML(".html");
 const ShortStringHash TEXT_VAR_FILE_ID("browser_file_id");
 const ShortStringHash TEXT_VAR_DIR_ID("browser_dir_id");
 const ShortStringHash TEXT_VAR_RESOURCE_TYPE("resource_type");
+const ShortStringHash TEXT_VAR_RESOURCE_DIR_ID("resource_dir_id");
 
 const int BROWSER_FILE_SOURCE_RESOURCE_DIR = 1;
 
@@ -105,6 +107,7 @@ BrowserFile@ selectedBrowserFile;
 Text@ browserStatusMessage;
 Text@ browserResultsMessage;
 bool ignoreRefreshBrowserResults = false;
+String resourceDirsCache;
 
 void CreateResourceBrowser()
 {
@@ -120,7 +123,13 @@ void RebuildResourceDatabase()
     if (browserWindow is null)
         return;
 
+    String newResourceDirsCache = Join(cache.resourceDirs, ';');
     ScanResourceDirectories();
+    if (newResourceDirsCache != resourceDirsCache)
+    {
+        resourceDirsCache = newResourceDirsCache;
+        PopulateResourceDirFilters();
+    }
     PopulateBrowserDirectories();
     PopulateResourceBrowserFilesByDirectory(rootDir);
 }
@@ -180,41 +189,7 @@ void CreateResourceBrowserUI()
     browserWindow.opacity = uiMaxOpacity;
 
     browserFilterWindow = ui.LoadLayout(cache.GetResource("XMLFile", "UI/EditorResourceFilterWindow.xml"));
-    {
-        UIElement@ options = browserFilterWindow.GetChild("Options", true);
-        CheckBox@ toggleAll = browserFilterWindow.GetChild("ToggleAll", true);
-        SubscribeToEvent(toggleAll, "Toggled", "HandleResourceFilterToggleAllToggled");
-        SubscribeToEvent(browserFilterWindow.GetChild("CloseButton", true), "Released", "HideResourceFilterWindow");
-
-        UIElement@ col1 = browserFilterWindow.GetChild("FilterColumn1", true);
-        UIElement@ col2 = browserFilterWindow.GetChild("FilterColumn2", true);
-        for (int i=-2; i < 21; ++i)
-        {
-            if (i == RESOURCE_TYPE_NOTSET)
-                continue;
-
-            UIElement@ resourceTypeHolder = UIElement();
-            if (i < 10)
-                col1.AddChild(resourceTypeHolder);
-            else
-                col2.AddChild(resourceTypeHolder);
-            resourceTypeHolder.layoutMode = LM_HORIZONTAL;
-            resourceTypeHolder.layoutSpacing = 4;
-
-            Text@ label = Text();
-            label.style = "FileSelectorListText";
-            label.text = ResourceTypeName(i);
-            CheckBox@ checkbox = CheckBox();
-            checkbox.name = i;
-            checkbox.SetStyleAuto();
-            checkbox.vars[TEXT_VAR_RESOURCE_TYPE] = i;
-            checkbox.checked = true;
-            SubscribeToEvent(checkbox, "Toggled", "HandleResourceFilterToggled");

-
-            resourceTypeHolder.AddChild(checkbox);
-            resourceTypeHolder.AddChild(label);
-        }
-    }
+    CreateResourceFilterUI();
     HideResourceFilterWindow();
 
     int height = Min(ui.root.height / 4, 300);
@@ -235,6 +210,45 @@ void CreateResourceBrowserUI()
     SubscribeToEvent(cache, "FileChanged", "HandleFileChanged");
 }
 
+void CreateResourceFilterUI()
+{
+    UIElement@ options = browserFilterWindow.GetChild("TypeOptions", true);
+    CheckBox@ toggleAllTypes = browserFilterWindow.GetChild("ToggleAllTypes", true);
+    CheckBox@ toggleAllResourceDirs = browserFilterWindow.GetChild("ToggleAllResourceDirs", true);
+    SubscribeToEvent(toggleAllTypes, "Toggled", "HandleResourceTypeFilterToggleAllTypesToggled");
+    SubscribeToEvent(toggleAllResourceDirs, "Toggled", "HandleResourceDirFilterToggleAllTypesToggled");
+    SubscribeToEvent(browserFilterWindow.GetChild("CloseButton", true), "Released", "HideResourceFilterWindow");
+
+    UIElement@ col1 = browserFilterWindow.GetChild("TypeFilterColumn1", true);
+    UIElement@ col2 = browserFilterWindow.GetChild("TypeFilterColumn2", true);
+    for (int i=-2; i < 21; ++i)
+    {
+        if (i == RESOURCE_TYPE_NOTSET)
+            continue;
+
+        UIElement@ resourceTypeHolder = UIElement();
+        if (i < 10)
+            col1.AddChild(resourceTypeHolder);
+        else
+            col2.AddChild(resourceTypeHolder);
+        resourceTypeHolder.layoutMode = LM_HORIZONTAL;
+        resourceTypeHolder.layoutSpacing = 4;
+
+        Text@ label = Text();
+        label.style = "EditorAttributeText";
+        label.text = ResourceTypeName(i);
+        CheckBox@ checkbox = CheckBox();
+        checkbox.name = i;
+        checkbox.SetStyleAuto();
+        checkbox.vars[TEXT_VAR_RESOURCE_TYPE] = i;
+        checkbox.checked = true;
+        SubscribeToEvent(checkbox, "Toggled", "HandleResourceTypeFilterToggled");

+
+        resourceTypeHolder.AddChild(checkbox);
+        resourceTypeHolder.AddChild(label);
+    }
+}
+
 void CreateDirList(BrowserDir@ dir, UIElement@ parentUI = null)
 {
     Text@ dirText = Text();
@@ -502,6 +516,35 @@ void ShowResourceFilterWindow()
     browserFilterWindow.BringToFront();
 }
 
+void PopulateResourceDirFilters()
+{
+    UIElement@ resourceDirs = browserFilterWindow.GetChild("DirFilters", true);
+    resourceDirs.RemoveAllChildren();
+    activeResourceDirFilters.Clear();
+    for (int i=0; i < cache.resourceDirs.length; ++i)
+    {
+        UIElement@ resourceDirHolder = UIElement();
+        resourceDirs.AddChild(resourceDirHolder);
+        resourceDirHolder.layoutMode = LM_HORIZONTAL;
+        resourceDirHolder.layoutSpacing = 4;
+        resourceDirHolder.SetFixedHeight(16);
+
+        Text@ label = Text();
+        label.style = "EditorAttributeText";
+        label.text = cache.resourceDirs[i].Replaced(fileSystem.programDir, "");
+        CheckBox@ checkbox = CheckBox();
+        checkbox.name = i;
+        checkbox.SetStyleAuto();
+        checkbox.vars[TEXT_VAR_RESOURCE_DIR_ID] = i;
+        checkbox.checked = true;
+        SubscribeToEvent(checkbox, "Toggled", "HandleResourceDirFilterToggled");

+
+        resourceDirHolder.AddChild(checkbox);
+        resourceDirHolder.AddChild(label);
+    }
+
+}
+
 void PopulateBrowserDirectories()
 {
     browserDirList.RemoveAllItems();
@@ -519,8 +562,10 @@ void PopulateResourceBrowserFilesByDirectory(BrowserDir@ dir)
     for(uint x=0; x < dir.files.length; x++)
     {
         BrowserFile@ file = dir.files[x];
-        int find = activeResourceFilters.Find(file.resourceType);
-        if (find == -1)
+        if (activeResourceDirFilters.Find(file.resourceSourceIndex) > -1)
+            continue;
+
+        if (activeResourceTypeFilters.Find(file.resourceType) == -1)
             files.Push(file);
     }
 
@@ -545,7 +590,10 @@ void PopulateResourceBrowserBySearch()
         {
             @file = browserFiles[x];
             file.sortScore = -1;
-            if (activeResourceFilters.Find(file.resourceType) > -1)
+            if (activeResourceTypeFilters.Find(file.resourceType) > -1)
+                continue;
+
+            if (activeResourceDirFilters.Find(file.resourceSourceIndex) > -1)
                 continue;
 
             int find = file.fullname.Find(query, 0, false);
@@ -603,10 +651,10 @@ void RefreshBrowserResults()
     }
 }
 
-void HandleResourceFilterToggleAllToggled(StringHash eventType, VariantMap& eventData)
+void HandleResourceTypeFilterToggleAllTypesToggled(StringHash eventType, VariantMap& eventData)
 {
     CheckBox@ checkbox = eventData["Element"].GetPtr();
-    UIElement@ filterHolder = browserFilterWindow.GetChild("Filters", true);
+    UIElement@ filterHolder = browserFilterWindow.GetChild("TypeFilters", true);
     Array<UIElement@> children = filterHolder.GetChildren(true);
 
     ignoreRefreshBrowserResults = true;
@@ -620,24 +668,58 @@ void HandleResourceFilterToggleAllToggled(StringHash eventType, VariantMap& even
     RefreshBrowserResults();
 }
 
-void HandleResourceFilterToggled(StringHash eventType, VariantMap& eventData)
+void HandleResourceTypeFilterToggled(StringHash eventType, VariantMap& eventData)
 {
     CheckBox@ checkbox = eventData["Element"].GetPtr();
     if (!checkbox.vars.Contains(TEXT_VAR_RESOURCE_TYPE))
         return;
 
     int resourceType = checkbox.GetVar(TEXT_VAR_RESOURCE_TYPE).GetInt();
-    int find = activeResourceFilters.Find(resourceType);
+    int find = activeResourceTypeFilters.Find(resourceType);
 
     if (checkbox.checked && find != -1)
-        activeResourceFilters.Erase(find);
+        activeResourceTypeFilters.Erase(find);
     else if (!checkbox.checked && find == -1)
-        activeResourceFilters.Push(resourceType);
+        activeResourceTypeFilters.Push(resourceType);
 
     if (ignoreRefreshBrowserResults == false)
         RefreshBrowserResults();
 }
 
+void HandleResourceDirFilterToggleAllTypesToggled(StringHash eventType, VariantMap& eventData)
+{
+    CheckBox@ checkbox = eventData["Element"].GetPtr();
+    UIElement@ filterHolder = browserFilterWindow.GetChild("DirFilters", true);
+    Array<UIElement@> children = filterHolder.GetChildren(true);
+
+    ignoreRefreshBrowserResults = true;
+    for(uint i=0; i < children.length; ++i)
+    {
+        CheckBox@ filter = children[i];
+        if (filter !is null)
+            filter.checked = checkbox.checked;
+    }
+    ignoreRefreshBrowserResults = false;
+    RefreshBrowserResults();
+}
+
+void HandleResourceDirFilterToggled(StringHash eventType, VariantMap& eventData)
+{
+    CheckBox@ checkbox = eventData["Element"].GetPtr();
+    if (!checkbox.vars.Contains(TEXT_VAR_RESOURCE_DIR_ID))
+        return;
+
+    int resourceDir = checkbox.GetVar(TEXT_VAR_RESOURCE_DIR_ID).GetInt();
+    int find = activeResourceDirFilters.Find(resourceDir);
+
+    if (checkbox.checked && find != -1)
+        activeResourceDirFilters.Erase(find);
+    else if (!checkbox.checked && find == -1)
+        activeResourceDirFilters.Push(resourceDir);
+
+    if (ignoreRefreshBrowserResults == false)
+        RefreshBrowserResults();
+}
 
 void HandleRescanResourceBrowserClick(StringHash eventType, VariantMap& eventData)
 {

+ 64 - 32
Bin/Data/UI/EditorResourceFilterWindow.xml

@@ -1,22 +1,18 @@
 <?xml version="1.0"?>
 <element type="Window">
 	<attribute name="Name" value="BrowserFilterMenu" />
-	<attribute name="Size" value="400 80" />
+	<attribute name="Size" value="550 80" />
 	<attribute name="Layout Mode" value="Vertical" />
-	<attribute name="Layout Spacing" value="4" />
+	<attribute name="Layout Spacing" value="0" />
 	<attribute name="Layout Border" value="6 6 6 6" />
 	<attribute name="Is Movable" value="true" />
-	<attribute name="Is Resizable" value="true" />
 	<element>
 		<attribute name="Name" value="Title Bar" />
 		<attribute name="Min Size" value="152 16" />
 		<attribute name="Max Size" value="2147483647 16" />
 		<attribute name="Layout Mode" value="Horizontal" />
-		<attribute name="Layout Spacing" value="8" />
+		<attribute name="Layout Spacing" value="4" />
 		<element type="Text">
-			<attribute name="Top Left Color" value="0.85 0.85 0.85 1" />
-			<attribute name="Top Right Color" value="0.85 0.85 0.85 1" />
-			<attribute name="Bottom Left Color" value="0.85 0.85 0.85 1" />
 			<attribute name="Bottom Right Color" value="0.85 0.85 0.85 1" />
 			<attribute name="Text" value="Resource Filters" />
 		</element>
@@ -24,39 +20,75 @@
 			<attribute name="Name" value="CloseButton" />
 		</element>
 	</element>
+	<element type="BorderImage" style="EditorDivider" />
 	<element style="Panel">
-		<attribute name="Name" value="Options" />
 		<attribute name="Layout Mode" value="Horizontal" />
 		<attribute name="Layout Spacing" value="10" />
-		<attribute name="Layout Border" value="0 4 0 4" />
-		<element>
-			<attribute name="Layout Mode" value="Horizontal" />
+		<attribute name="Layout Border" value="0 6 0 6" />
+		<element style="Panel">
+			<attribute name="Name" value="ResourceDirOptions" />
+			<attribute name="Layout Mode" value="Vertical" />
 			<attribute name="Layout Spacing" value="4" />
-			<element type="CheckBox">
-				<attribute name="Name" value="ToggleAll" />
-				<attribute name="Is Checked" value="true" />
-			</element>
+			<attribute name="Layout Border" value="0 0 0 4" />
+			<attribute name="Max Size" value="300 1000" />
 			<element type="Text">
-				<attribute name="Top Left Color" value="0.85 0.85 0.85 1" />
-				<attribute name="Top Right Color" value="0.85 0.85 0.85 1" />
-				<attribute name="Bottom Left Color" value="0.85 0.85 0.85 1" />
-				<attribute name="Bottom Right Color" value="0.85 0.85 0.85 1" />
-				<attribute name="Text" value="Toggle All" />
+				<attribute name="Text" value="Resource Directories" />
+			</element>
+			<element>
+				<attribute name="Layout Mode" value="Horizontal" />
+				<attribute name="Layout Spacing" value="4" />
+				<attribute name="Max Size" value="100 16" />
+				<element type="CheckBox">
+					<attribute name="Name" value="ToggleAllResourceDirs" />
+					<attribute name="Is Checked" value="true" />
+				</element>
+				<element type="Text" style="EditorAttributeText">
+					<attribute name="Text" value="Toggle All" />
+				</element>
+			</element>
+			<element style="Panel">
+				<attribute name="Name" value="DirFilters" />
+				<attribute name="Layout Mode" value="Vertical" />
+				<attribute name="Layout Spacing" value="2" />
+				<attribute name="Layout Border" value="0 4 0 4" />
 			</element>
-		</element>
-	</element>
-	<element style="Panel">
-		<attribute name="Name" value="Filters" />
-		<attribute name="Layout Mode" value="Horizontal" />
-		<attribute name="Layout Spacing" value="10" />
-		<attribute name="Layout Border" value="0 4 0 4" />
-		<element style="Panel">
-			<attribute name="Name" value="FilterColumn1" />
-			<attribute name="Layout Border" value="6 6 6 6" />
 		</element>
 		<element style="Panel">
-			<attribute name="Name" value="FilterColumn2" />
-			<attribute name="Layout Border" value="6 6 6 6" />
+			<attribute name="Max Size" value="250 1000" />
+			<attribute name="Name" value="TypeOptions" />
+			<attribute name="Layout Mode" value="Vertical" />
+			<attribute name="Layout Spacing" value="4" />
+			<attribute name="Layout Border" value="0 4 0 4" />
+			<element type="Text">
+				<attribute name="Text" value="Resource Types" />
+			</element>
+			<element>
+				<attribute name="Layout Mode" value="Horizontal" />
+				<attribute name="Layout Spacing" value="4" />
+				<element type="CheckBox">
+					<attribute name="Name" value="ToggleAllTypes" />
+					<attribute name="Is Checked" value="true" />
+				</element>
+				<element type="Text" style="EditorAttributeText">
+					<attribute name="Text" value="Toggle All" />
+				</element>
+			</element>
+			<element style="Panel">
+				<attribute name="Name" value="TypeFilters" />
+				<attribute name="Layout Mode" value="Horizontal" />
+				<attribute name="Layout Spacing" value="4" />
+				<attribute name="Layout Border" value="0 4 0 4" />
+				<element style="Panel">
+					<attribute name="Name" value="TypeFilterColumn1" />
+					<attribute name="Layout Border" value="2 0 2 0" />
+					<attribute name="Layout Spacing" value="2" />
+				</element>
+				<element style="Panel">
+					<attribute name="Name" value="TypeFilterColumn2" />
+					<attribute name="Layout Border" value="2 0 2 0" />
+					<attribute name="Layout Spacing" value="2" />
+				</element>
+			</element>
 		</element>
 	</element>
 </element>