diff --git a/Source/Editor/Content/ContentFilter.cs b/Source/Editor/Content/ContentFilter.cs
deleted file mode 100644
index 12cca5c41..000000000
--- a/Source/Editor/Content/ContentFilter.cs
+++ /dev/null
@@ -1,257 +0,0 @@
-using FlaxEditor.Content;
-using FlaxEditor.Content.GUI;
-using FlaxEngine;
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-namespace FlaxEditor.Content
-{
- ///
- /// class with is controling visability of items in content window
- ///
- internal class ContentFilter
- {
- #region Filters Config
- ///
- /// all suported files by engine Content Folder
- ///
- public static readonly List SuportedFileExtencionsInContentFolder = new List()
- {
- ".flax",
- ".json",
- ".scene",
- ".prefab",
- };
- ///
- /// all suported files by engine Source Folder
- ///
- public static readonly List SuportedFileExtencionsInSourceFolder = new List()
- {
- ".shader",
- ".cs",
- ".h",
- ".cpp",
- };
- ///
- /// ignores folders in source folder (top layer),
- /// for example obj folder is default c# project folder
- ///
- internal static readonly List HideFoldersInSourceFolder = new List()
- {
- "obj", // default c# project folder
- "Properties", // c# project stuff ?
- };
- ///
- /// ignores files in source folder (top layer),
- ///
- internal static readonly List HideFilesInSourceFolder = new List() //dont edit
- {
- "Game.csproj", //solucion file
- "Game.Gen.cs", //auto-generated not be edited
- "GameEditorTarget.Build.cs",
- "GameTarget.Build.cs",
- };
- #endregion
- internal static ContentItem gameSettings;
- internal static List buildFiles;
-
- internal static ContentTreeNode settings;
- internal static ContentTreeNode shaders;
- internal static ProjectTreeNode engine;
- internal static List plugins = new();
- internal static List FilterFolder(ContentFolder folder)
- {
- return FilterFolder(folder, SuportedFileExtencionsInContentFolder.ToArray(), SuportedFileExtencionsInSourceFolder.ToArray());
- }
- internal static List FilterFolder(ContentFolder folder, string[] FileExtencionsInContentFolder, string[] ExtencionsInSourceFolder)
- {
- if (folder.CanHaveAssets)
- {
- for (int i = 0; i < folder.Children.Count; i++)
- {
- bool Visible = false;
- for (int j = 0; j < FileExtencionsInContentFolder.Length; j++)
- {
- if ((folder.Children[i].Path.EndsWith(FileExtencionsInContentFolder[j]) || folder.Children[i].IsFolder))
- {
- if (folder.Children[i].Visible)
- {
- Visible = true;
- }
- break;
- }
- }
- folder.Children[i].Visible = Visible;
- }
- }
- else if (folder.CanHaveScripts)
- {
- for (int i = 0; i < folder.Children.Count; i++)
- {
- bool Visible = false;
- for (int j = 0; j < ExtencionsInSourceFolder.Length; j++)
- {
- if ((folder.Children[i].Path.EndsWith(ExtencionsInSourceFolder[j]) || folder.Children[i].IsFolder))
- {
- if (folder.Children[i].Visible)
- {
- Visible = true;
- }
- break;
- }
- }
- folder.Children[i].Visible = Visible;
- }
- }
- return folder.Children;
- }
- internal static ProjectTreeNode Filter(ProjectTreeNode tree)
- {
- var content = tree.Children[0] as ContentTreeNode;
- var source = tree.Children[1] as ContentTreeNode;
- //filter content folder (top layer)
- buildFiles = new();
- for (int i = 0; i < content.Folder.Children.Count; i++)
- {
- if (content.Folder.Children[i].FileName == "GameSettings.json")
- {
- gameSettings = content.Folder.Children[i];
- content.Folder.Children[i].Visible = false;
- break;
- }
- }
-
- int hindenCount = 0;
-
- for (int i = content.Children.Count - 1; i >= 0; i--)//we are starting from back it faster
- {
- var node = content.Children[i] as ContentTreeNode;
- if (node.Folder.FileName == "Settings")
- {
- settings = node;
- hindenCount++;
- node.Visible = false;
- node.Folder.Visible = false;
- }
- if (node.Folder.FileName == "Shaders")
- {
- shaders = node;
- hindenCount++;
- node.Visible = false;
- node.Folder.Visible = false;
-
- }
- if (hindenCount == 2)
- break;
- }
-
-
- //-----------------------------------------------------------------------------------------------------
-
- //filter source folder (top layer)
- hindenCount = 0;
- for (int i = 0; i < source.Folder.Children.Count; i++)
- {
- for (int j = 0; j < HideFilesInSourceFolder.Count; j++)
- {
- if (source.Folder.Children[i].FileName == HideFilesInSourceFolder[j])
- {
- source.Folder.Children[i].Visible = false;
- hindenCount++;
- if(i > 1)
- {
- buildFiles.Add(source.Folder.Children[i]);
- }
- if (HideFilesInSourceFolder.Count == hindenCount) goto HideFilesInSourceFolderComplited;
- break;
- }
- }
- }
- HideFilesInSourceFolderComplited:
- hindenCount = 0;
- for (int i = source.Children.Count - 1; i >= 0; i--)
- {
- var node = source.Children[i] as ContentTreeNode;
- for (int j = 0; j < HideFoldersInSourceFolder.Count; j++)
- {
- if (node.Folder.FileName == HideFoldersInSourceFolder[j])
- {
- node.Visible = false;
- node.Folder.Visible = false;
- hindenCount++;
- if (HideFoldersInSourceFolder.Count == hindenCount) goto HideFoldersInSourceFolderComplited;
- break;
- }
- }
- }
- HideFoldersInSourceFolderComplited:
- //content
- return tree;
- }
- internal static void UpdateFilterVisability(ContentSettingsDropdown dropdown)
- {
- engine.Visible = false;
- engine.Folder.Visible = false;
-
- foreach (var item in plugins)
- {
- item.Visible = false;
- item.Folder.Visible = false;
- }
- foreach (var item in buildFiles)
- {
- item.Visible = false;
- }
- gameSettings.Visible = false;
- settings.Visible = false;
- settings.Folder.Visible = false;
-
- shaders.Visible = false;
- shaders.Folder.Visible = false;
-
- for (int i = 0; i < dropdown.Selection.Count; i++)
- {
- if (dropdown.Selection[i] == 0) //Show Engine Content
- {
- engine.Visible = true;
- engine.Folder.Visible = true;
- }
-
- if (dropdown.Selection[i] == 1)//Show Plugin Content
- {
- foreach (var item in plugins)
- {
- item.Visible = true;
- item.Folder.Visible = true;
- }
- }
-
- if (dropdown.Selection[i] == 2)//Show Build Files
- {
- foreach (var item in buildFiles)
- {
- item.Visible = true;
- }
- }
-
- if (dropdown.Selection[i] == 3)//Show Game Settings
- {
- gameSettings.Visible = true;
- settings.Visible = true;
- settings.Folder.Visible = true;
- }
-
- if (dropdown.Selection[i] == 4)//"Show Shader Source"
- {
- shaders.Visible = true;
- shaders.Folder.Visible = true;
- }
- }
- engine.ParentTree.PerformLayout();
- Editor.Instance.Windows.ContentWin.RefreshView();
- }
- }
-}
diff --git a/Source/Editor/Content/GUI/ContentNavigationButton.cs b/Source/Editor/Content/GUI/ContentNavigation.cs
similarity index 59%
rename from Source/Editor/Content/GUI/ContentNavigationButton.cs
rename to Source/Editor/Content/GUI/ContentNavigation.cs
index beec247da..7adf6aa62 100644
--- a/Source/Editor/Content/GUI/ContentNavigationButton.cs
+++ b/Source/Editor/Content/GUI/ContentNavigation.cs
@@ -1,6 +1,7 @@
// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
using FlaxEditor.GUI;
+using FlaxEditor.GUI.ContextMenu;
using FlaxEditor.GUI.Drag;
using FlaxEngine;
using FlaxEngine.GUI;
@@ -72,7 +73,6 @@ namespace FlaxEditor.Content.GUI
if (_dragOverItems == null)
_dragOverItems = new DragItems(ValidateDragItem);
-
_dragOverItems.OnDragEnter(data);
var result = GetDragEffect(data);
_validDragOver = result != DragDropEffect.None;
@@ -122,4 +122,70 @@ namespace FlaxEditor.Content.GUI
return result;
}
}
+
+ sealed class ContentNavigationSeparator : ComboBox
+ {
+ public ContentNavigationButton Target;
+
+ public ContentNavigationSeparator(ContentNavigationButton target, float x, float y, float height)
+ {
+ Target = target;
+ Bounds = new Rectangle(x, y, 16, height);
+ Offsets = new Margin(Bounds.X, Bounds.Width, Bounds.Y, Bounds.Height);
+ UpdateTransform();
+
+ MaximumItemsInViewCount = 20;
+ var style = Style.Current;
+ BackgroundColor = style.BackgroundNormal;
+ BackgroundColorHighlighted = BackgroundColor;
+ BackgroundColorSelected = BackgroundColor;
+ }
+
+ protected override ContextMenu OnCreatePopup()
+ {
+ // Update items
+ ClearItems();
+ foreach (var child in Target.TargetNode.Children)
+ {
+ if (child is ContentTreeNode node)
+ {
+ if (node.Folder.VisibleInHierarchy) // Respect the filter set by ContentFilterConfig.Filter(...)
+ AddItem(node.Folder.ShortName);
+ }
+ }
+
+ return base.OnCreatePopup();
+ }
+
+ public override void Draw()
+ {
+ var style = Style.Current;
+ var rect = new Rectangle(Float2.Zero, Size);
+ var color = IsDragOver ? style.BackgroundSelected * 0.6f : (_mouseDown ? style.BackgroundSelected : (IsMouseOver ? style.BackgroundHighlighted : Color.Transparent));
+ Render2D.FillRectangle(rect, color);
+ Render2D.DrawSprite(Editor.Instance.Icons.ArrowRight12, new Rectangle(rect.Location.X, rect.Y + rect.Size.Y * 0.25f, rect.Size.X, rect.Size.X), EnabledInHierarchy ? style.Foreground : style.ForegroundDisabled);
+ }
+
+ protected override void OnLayoutMenuButton(ContextMenuButton button, int index, bool construct = false)
+ {
+ button.Icon = Editor.Instance.Icons.FolderClosed32;
+ if (_tooltips != null && _tooltips.Length > index)
+ button.TooltipText = _tooltips[index];
+ }
+
+ protected override void OnItemClicked(int index)
+ {
+ base.OnItemClicked(index);
+
+ var item = _items[index];
+ foreach (var child in Target.TargetNode.Children)
+ {
+ if (child is ContentTreeNode node && node.Folder.ShortName == item)
+ {
+ Editor.Instance.Windows.ContentWin.Navigate(node);
+ return;
+ }
+ }
+ }
+ }
}
diff --git a/Source/Editor/Content/GUI/ContentNavigationBar.cs b/Source/Editor/Content/GUI/ContentNavigationBar.cs
deleted file mode 100644
index 673ac806e..000000000
--- a/Source/Editor/Content/GUI/ContentNavigationBar.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-using FlaxEditor.GUI;
-using FlaxEngine;
-
-namespace FlaxEditor.Content.GUI
-{
- internal class ContentNavigationBar : NavigationBar
- {
- ToolStrip _toolstrip;
- internal float ofssetFromRightEdge = 80;
- internal ContentNavigationBar(ToolStrip toolstrip) : base()
- {
- _toolstrip = toolstrip;
- }
- ///
- protected override void Arrange()
- {
- base.Arrange();
- var lastToolstripButton = _toolstrip.LastButton;
- var parentSize = Parent.Size;
- Bounds = new Rectangle
- (
- new Float2(lastToolstripButton.Right, 0),
- new Float2(parentSize.X - X - ofssetFromRightEdge, _toolstrip.Height)
- );
- }
- }
-}
diff --git a/Source/Editor/Content/GUI/ContentNavigationButtonSeparator.cs b/Source/Editor/Content/GUI/ContentNavigationButtonSeparator.cs
deleted file mode 100644
index cad63066d..000000000
--- a/Source/Editor/Content/GUI/ContentNavigationButtonSeparator.cs
+++ /dev/null
@@ -1,85 +0,0 @@
-using FlaxEditor;
-using FlaxEditor.GUI;
-using FlaxEditor.GUI.ContextMenu;
-using FlaxEngine;
-using FlaxEngine.GUI;
-using System.Collections.Generic;
-
-namespace FlaxEditor.Content.GUI
-{
- internal class ContentNavigationButtonSeparator : ComboBox
- {
- public ContentNavigationButton Target { get; }
- public ContentNavigationButtonSeparator(ContentNavigationButton target, float x, float y,float height)
- {
- Target = target;
- Bounds = new Rectangle(x, y, 16, height);
- Offsets = new Margin(Bounds.X, Bounds.Width, Bounds.Y, Bounds.Height);
- UpdateTransform();
-
- MaximumItemsInViewCount = 20;
- var style = Style.Current;
- BackgroundColor = style.BackgroundNormal;
- BackgroundColorHighlighted = BackgroundColor;
- BackgroundColorSelected = BackgroundColor;
- }
- protected override ContextMenu OnCreatePopup()
- {
- UpdateDropDownItems();
- return base.OnCreatePopup();
- }
- internal void UpdateDropDownItems()
- {
- ClearItems();
- _items = new();
- for (int i = 0; i < Target.TargetNode.Children.Count; i++)
- {
- if (Target.TargetNode.Children[i] is ContentTreeNode node)
- {
- if (node.Folder.VisibleInHierarchy) // respect the filter set by ContentFilterConfig.Filter(...)
- AddItem(node.Folder.ShortName);
- }
- }
- }
- ///
- public override void Draw()
- {
- // Cache data
- var style = Style.Current;
- var clientRect = new Rectangle(Float2.Zero, Size);
- // Draw background
- if (IsDragOver)
- {
- Render2D.FillRectangle(clientRect, Style.Current.BackgroundSelected * 0.6f);
- }
- else if (_mouseDown)
- {
- Render2D.FillRectangle(clientRect, style.BackgroundSelected);
- }
- else if (IsMouseOver)
- {
- Render2D.FillRectangle(clientRect, style.BackgroundHighlighted);
- }
-
- Render2D.DrawSprite(Editor.Instance.Icons.ArrowRight12, new Rectangle(clientRect.Location.X, clientRect.Y + ((Size.Y / 2f)/2f), Size.X, Size.X), EnabledInHierarchy ? Style.Current.Foreground : Style.Current.ForegroundDisabled);
- }
- protected override void OnLayoutMenuButton(ref ContextMenuButton button, int index, bool construct = false)
- {
- var style = Style.Current;
- button.Icon = Editor.Instance.Icons.FolderClosed32;
- if (_tooltips != null && _tooltips.Length > index)
- {
- button.TooltipText = _tooltips[index];
- }
- }
- protected override void OnItemClicked(int index)
- {
- base.OnItemClicked(index);
- if (Target.TargetNode.Children[index] is ContentTreeNode node)
- {
- Editor.Instance.Windows.ContentWin.Navigate(node);
- }
- // Navigate calls the OnDestroy at some point dont place code below or editor will crash
- }
- }
-}
diff --git a/Source/Editor/Content/GUI/ContentSettingsDropdown.cs b/Source/Editor/Content/GUI/ContentSettingsDropdown.cs
deleted file mode 100644
index 04722a674..000000000
--- a/Source/Editor/Content/GUI/ContentSettingsDropdown.cs
+++ /dev/null
@@ -1,95 +0,0 @@
-using FlaxEditor.Content;
-using FlaxEditor.CustomEditors.Editors;
-using FlaxEditor.GUI;
-using FlaxEditor.GUI.ContextMenu;
-using FlaxEditor.States;
-using FlaxEditor.Utilities;
-using FlaxEngine;
-using FlaxEngine.GUI;
-using FlaxEngine.Json;
-using System.Collections.Generic;
-using System.Linq;
-
-namespace FlaxEditor.Content.GUI
-{
- class ContentSettingsDropdown : ComboBox
- {
- internal readonly List Settings = new()
- {
- "Show Engine Content",
- "Show Plugin Content",
- "Show Build Files",
- "Show Game Settings",
- "Show Shader Source"
- };
- public ContentSettingsDropdown()
- {
- SupportMultiSelect = true;
- MaximumItemsInViewCount = 20;
- var style = Style.Current;
- BackgroundColor = style.BackgroundNormal;
- BackgroundColorHighlighted = BackgroundColor;
- BackgroundColorSelected = BackgroundColor;
-
- }
- protected override ContextMenu OnCreatePopup()
- {
- UpdateDropDownItems();
- return base.OnCreatePopup();
- }
- internal void UpdateDropDownItems()
- {
- ClearItems();
-
- for (int i = 0; i < Settings.Count; i++)
- {
- AddItem(Settings[i]);
- }
- }
- ///
- public override void Draw()
- {
- // Cache data
- var style = Style.Current;
- var clientRect = new Rectangle(Float2.Zero, Size);
- // Draw background
- if (IsDragOver)
- {
- Render2D.FillRectangle(clientRect, Style.Current.BackgroundSelected * 0.6f);
- }
- else if (_mouseDown)
- {
- Render2D.FillRectangle(clientRect, style.BackgroundSelected);
- }
- else if (IsMouseOver)
- {
- Render2D.FillRectangle(clientRect, style.BackgroundHighlighted);
- }
- float size = (Size.Y / 1.5f); //Icon size
- // Draw text
- Render2D.DrawText(Font.GetFont(), "Settings", new Rectangle(size, 0, Size.X - Size.Y, Size.Y), TextColor, TextAlignment.Center, TextAlignment.Center);
- Render2D.DrawSprite(Editor.Instance.Icons.Settings12, new Rectangle((Size.Y - size) / 2.0f, (Size.Y - size) / 2.0f, size, size));
- }
- protected override void OnLayoutMenuButton(ref ContextMenuButton button, int index, bool construct = false)
- {
- var style = Style.Current;
- if (_selectedIndices.Contains(index))
- {
- button.Icon = style.CheckBoxTick;
- }
- else
- {
- button.Icon = SpriteHandle.Default;
- }
- if (_tooltips != null && _tooltips.Length > index)
- {
- button.TooltipText = _tooltips[index];
- }
- }
- protected override void OnSelectedIndexChanged()
- {
- ContentFilter.UpdateFilterVisability(this);
- base.OnSelectedIndexChanged();
- }
- }
-}
diff --git a/Source/Editor/Content/Items/ContentItem.cs b/Source/Editor/Content/Items/ContentItem.cs
index e6a8c309c..94db3a5b9 100644
--- a/Source/Editor/Content/Items/ContentItem.cs
+++ b/Source/Editor/Content/Items/ContentItem.cs
@@ -441,11 +441,9 @@ namespace FlaxEditor.Content
{
get
{
+ // Skip when hidden
if (!Visible)
- {
return Rectangle.Empty;
- }
-
var view = Parent as ContentView;
var size = Size;
switch (view?.ViewType ?? ContentViewType.Tiles)
@@ -453,7 +451,7 @@ namespace FlaxEditor.Content
case ContentViewType.Tiles:
{
var textHeight = DefaultTextHeight * size.X / DefaultWidth;
- return new Rectangle(0, size.Y - textHeight, size.X - 2, textHeight);
+ return new Rectangle(0, size.Y - textHeight, size.X, textHeight);
}
case ContentViewType.List:
{
@@ -671,8 +669,6 @@ namespace FlaxEditor.Content
///
public override void Draw()
{
-
- // Cache data
var size = Size;
var style = Style.Current;
var view = Parent as ContentView;
diff --git a/Source/Editor/Content/Tree/RootContentTreeNode.cs b/Source/Editor/Content/Tree/RootContentTreeNode.cs
index 6dde4cbb2..328c51874 100644
--- a/Source/Editor/Content/Tree/RootContentTreeNode.cs
+++ b/Source/Editor/Content/Tree/RootContentTreeNode.cs
@@ -17,6 +17,6 @@ namespace FlaxEditor.Content
}
///
- public override string NavButtonLabel => string.Empty;
+ public override string NavButtonLabel => " /";
}
}
diff --git a/Source/Editor/GUI/ComboBox.cs b/Source/Editor/GUI/ComboBox.cs
index da38268b2..da2106450 100644
--- a/Source/Editor/GUI/ComboBox.cs
+++ b/Source/Editor/GUI/ComboBox.cs
@@ -3,9 +3,9 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using FlaxEditor.GUI.ContextMenu;
using FlaxEngine;
using FlaxEngine.GUI;
-using FlaxEditor.GUI.ContextMenu;
namespace FlaxEditor.GUI
{
@@ -399,13 +399,14 @@ namespace FlaxEditor.GUI
OnItemClicked((int)btn.Tag);
if (SupportMultiSelect)
{
+ // Don't hide in multi-select, so user can edit multiple elements instead of just one
UpdateButtons();
_popupMenu?.PerformLayout();
}
else
{
_popupMenu?.Hide();
- }//[nori_sc] don't hide it Support MultiSelect is on actions per min is important for UX, if some one wont to set more then 5 elements in multi select menu let them do it
+ }
};
}
@@ -423,13 +424,15 @@ namespace FlaxEditor.GUI
if (_items.Count > 0)
{
UpdateButtons();
+
// Show dropdown list
_popupMenu.MinimumWidth = Width;
_popupMenu.Show(this, new Float2(1, Height));
}
}
+
///
- /// update buttons layout and repains
+ /// Updates buttons layout.
///
private void UpdateButtons()
{
@@ -443,7 +446,7 @@ namespace FlaxEditor.GUI
for (int i = 0; i < _items.Count; i++)
{
var btn = _popupMenu.AddButton(_items[i]);
- OnLayoutMenuButton(ref btn, i, true);
+ OnLayoutMenuButton(btn, i, true);
btn.Tag = i;
}
}
@@ -457,25 +460,23 @@ namespace FlaxEditor.GUI
if (itemControls[i] is ContextMenuButton btn)
{
btn.Text = _items[i];
- OnLayoutMenuButton(ref btn, i, true);
+ OnLayoutMenuButton(btn, i, true);
}
}
}
}
+
///
- /// caled when button is created or repainted u can overite it to give the button custom look
+ /// Called when button is created or updated. Can be used to customize the visuals.
///
- /// button refrance
- /// curent item index
+ /// The button.
+ /// The item index.
/// true if button is created else it is repainting the button
- protected virtual void OnLayoutMenuButton(ref FlaxEditor.GUI.ContextMenu.ContextMenuButton button,int index, bool construct = false)
+ protected virtual void OnLayoutMenuButton(ContextMenuButton button, int index, bool construct = false)
{
- var style = Style.Current;
button.Checked = _selectedIndices.Contains(index);
if (_tooltips != null && _tooltips.Length > index)
- {
button.TooltipText = _tooltips[index];
- }
}
///
@@ -498,6 +499,8 @@ namespace FlaxEditor.GUI
_popupMenu = null;
}
+ if (IsDisposing)
+ return;
_selectedIndices.Clear();
_selectedIndices = null;
_items.Clear();
diff --git a/Source/Editor/GUI/ContextMenu/ContextMenuButton.cs b/Source/Editor/GUI/ContextMenu/ContextMenuButton.cs
index c2b130e4e..e371f7c4b 100644
--- a/Source/Editor/GUI/ContextMenu/ContextMenuButton.cs
+++ b/Source/Editor/GUI/ContextMenu/ContextMenuButton.cs
@@ -138,7 +138,7 @@ namespace FlaxEditor.GUI.ContextMenu
// Draw icon
const float iconSize = 14;
- var icon = Checked ? Style.Current.CheckBoxTick : Icon;
+ var icon = Checked ? style.CheckBoxTick : Icon;
if (icon.IsValid)
Render2D.DrawSprite(icon, new Rectangle(-iconSize - 1, (Height - iconSize) / 2, iconSize, iconSize), textColor);
}
diff --git a/Source/Editor/GUI/NavigationBar.cs b/Source/Editor/GUI/NavigationBar.cs
index 3c717423b..b3811b4a9 100644
--- a/Source/Editor/GUI/NavigationBar.cs
+++ b/Source/Editor/GUI/NavigationBar.cs
@@ -50,14 +50,9 @@ namespace FlaxEditor.GUI
{
if (toolstrip == null)
return;
-
var lastToolstripButton = toolstrip.LastButton;
var parentSize = Parent.Size;
- Bounds = new Rectangle
- (
- new Float2(lastToolstripButton.Right + 8.0f, 0),
- new Float2(parentSize.X - X - 8.0f, toolstrip.Height)
- );
+ Bounds = new Rectangle(lastToolstripButton.Right + 8.0f, 0, parentSize.X - X - 8.0f, toolstrip.Height);
}
}
}
diff --git a/Source/Editor/Modules/ContentDatabaseModule.cs b/Source/Editor/Modules/ContentDatabaseModule.cs
index ecafbf5d4..29d6b2c00 100644
--- a/Source/Editor/Modules/ContentDatabaseModule.cs
+++ b/Source/Editor/Modules/ContentDatabaseModule.cs
@@ -902,6 +902,23 @@ namespace FlaxEditor.Modules
}
if (sortChildren)
node.SortChildren();
+
+ // Ignore some special folders
+ if (node is MainContentTreeNode mainNode && mainNode.Folder.ShortName == "Source")
+ {
+ var mainNodeChild = mainNode.Folder.Find(StringUtils.CombinePaths(mainNode.Path, "obj")) as ContentFolder;
+ if (mainNodeChild != null)
+ {
+ mainNodeChild.Visible = false;
+ mainNodeChild.Node.Visible = false;
+ }
+ mainNodeChild = mainNode.Folder.Find(StringUtils.CombinePaths(mainNode.Path, "Properties")) as ContentFolder;
+ if (mainNodeChild != null)
+ {
+ mainNodeChild.Visible = false;
+ mainNodeChild.Node.Visible = false;
+ }
+ }
}
private void LoadScripts(ContentTreeNode parent, string[] files)
diff --git a/Source/Editor/Windows/ContentWindow.Navigation.cs b/Source/Editor/Windows/ContentWindow.Navigation.cs
index ca3de992d..b1def7ae8 100644
--- a/Source/Editor/Windows/ContentWindow.Navigation.cs
+++ b/Source/Editor/Windows/ContentWindow.Navigation.cs
@@ -196,18 +196,19 @@ namespace FlaxEditor.Windows
}
float x = NavigationBar.DefaultButtonsMargin;
float h = _toolStrip.ItemsHeight - 2 * ToolStrip.DefaultMarginV;
- for (int i = nodes.Count - 2; i >= 0; i--)
+ for (int i = nodes.Count - 1; i >= 0; i--)
{
- var button = new ContentNavigationButton(nodes[i], x - 100, ToolStrip.DefaultMarginV, h);
+ var button = new ContentNavigationButton(nodes[i], x, ToolStrip.DefaultMarginV, h);
button.PerformLayout();
x += button.Width + NavigationBar.DefaultButtonsMargin;
_navigationBar.AddChild(button);
- if (i == 0)
- continue;
- var buttonSeparator = new ContentNavigationButtonSeparator(button, x, ToolStrip.DefaultMarginV, h);
- buttonSeparator.PerformLayout();
- x += buttonSeparator.Width + NavigationBar.DefaultButtonsMargin;
- _navigationBar.AddChild(buttonSeparator);
+ if (i > 0)
+ {
+ var separator = new ContentNavigationSeparator(button, x, ToolStrip.DefaultMarginV, h);
+ separator.PerformLayout();
+ x += separator.Width + NavigationBar.DefaultButtonsMargin;
+ _navigationBar.AddChild(separator);
+ }
}
nodes.Clear();
@@ -224,21 +225,13 @@ namespace FlaxEditor.Windows
///
/// Gets the current view folder.
///
- public ContentFolder CurrentViewFolder
- {
- get
- {
- var node = SelectedNode;
- return node?.Folder;
- }
- }
+ public ContentFolder CurrentViewFolder => SelectedNode?.Folder;
///
/// Shows the root folder.
///
public void ShowRoot()
{
- // Show root folder
_tree.Select(_root);
}
}
diff --git a/Source/Editor/Windows/ContentWindow.Search.cs b/Source/Editor/Windows/ContentWindow.Search.cs
index a6fd2c81e..a1072d158 100644
--- a/Source/Editor/Windows/ContentWindow.Search.cs
+++ b/Source/Editor/Windows/ContentWindow.Search.cs
@@ -191,6 +191,7 @@ namespace FlaxEditor.Windows
}
// Search by filter only
+ bool showAllFiles = _showAllFiles;
if (string.IsNullOrWhiteSpace(query))
{
if (SelectedNode == _root)
@@ -199,12 +200,12 @@ namespace FlaxEditor.Windows
for (int i = 0; i < _root.ChildrenCount; i++)
{
if (_root.GetChild(i) is ContentTreeNode node)
- UpdateItemsSearchFilter(node.Folder, items, filters);
+ UpdateItemsSearchFilter(node.Folder, items, filters, showAllFiles);
}
}
else
{
- UpdateItemsSearchFilter(CurrentViewFolder, items, filters);
+ UpdateItemsSearchFilter(CurrentViewFolder, items, filters, showAllFiles);
}
}
// Search by asset ID
@@ -221,12 +222,12 @@ namespace FlaxEditor.Windows
for (int i = 0; i < _root.ChildrenCount; i++)
{
if (_root.GetChild(i) is ContentTreeNode node)
- UpdateItemsSearchFilter(node.Folder, items, filters, query);
+ UpdateItemsSearchFilter(node.Folder, items, filters, showAllFiles, query);
}
}
else
{
- UpdateItemsSearchFilter(CurrentViewFolder, items, filters, query);
+ UpdateItemsSearchFilter(CurrentViewFolder, items, filters, showAllFiles, query);
}
}
@@ -234,42 +235,34 @@ namespace FlaxEditor.Windows
_view.ShowItems(items, _sortType);
}
- private void UpdateItemsSearchFilter(ContentFolder folder, List items, bool[] filters)
+ private void UpdateItemsSearchFilter(ContentFolder folder, List items, bool[] filters, bool showAllFiles)
{
for (int i = 0; i < folder.Children.Count; i++)
{
var child = folder.Children[i];
-
if (child is ContentFolder childFolder)
{
- UpdateItemsSearchFilter(childFolder, items, filters);
+ UpdateItemsSearchFilter(childFolder, items, filters, showAllFiles);
}
- else
+ else if (filters[(int)child.SearchFilter] && (showAllFiles || !(child is FileItem)))
{
- if (filters[(int)child.SearchFilter])
- {
- items.Add(child);
- }
+ items.Add(child);
}
}
}
- private void UpdateItemsSearchFilter(ContentFolder folder, List items, bool[] filters, string filterText)
+ private void UpdateItemsSearchFilter(ContentFolder folder, List items, bool[] filters, bool showAllFiles, string filterText)
{
for (int i = 0; i < folder.Children.Count; i++)
{
var child = folder.Children[i];
-
if (child is ContentFolder childFolder)
{
- UpdateItemsSearchFilter(childFolder, items, filters, filterText);
+ UpdateItemsSearchFilter(childFolder, items, filters, showAllFiles, filterText);
}
- else if (filters[(int)child.SearchFilter])
+ else if (filters[(int)child.SearchFilter] && (showAllFiles || !(child is FileItem)) && QueryFilterHelper.Match(filterText, child.ShortName))
{
- if (filters[(int)child.SearchFilter] && QueryFilterHelper.Match(filterText, child.ShortName))
- {
- items.Add(child);
- }
+ items.Add(child);
}
}
}
diff --git a/Source/Editor/Windows/ContentWindow.cs b/Source/Editor/Windows/ContentWindow.cs
index 2a779ec01..f4fb4afdc 100644
--- a/Source/Editor/Windows/ContentWindow.cs
+++ b/Source/Editor/Windows/ContentWindow.cs
@@ -4,6 +4,7 @@ using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
+using System.Linq;
using System.Xml;
using FlaxEditor.Content;
using FlaxEditor.Content.GUI;
@@ -39,14 +40,13 @@ namespace FlaxEditor.Windows
private readonly ToolStripButton _navigateForwardButton;
private readonly ToolStripButton _navigateUpButton;
- private ContentNavigationBar _navigationBar;
+ private NavigationBar _navigationBar;
private Tree _tree;
private TextBox _foldersSearchBox;
private TextBox _itemsSearchBox;
private ViewDropdown _viewDropdown;
- private ContentSettingsDropdown _ContentSettingDropdown;
- private const float _ContentDropdownSizeX = 100;
private SortType _sortType;
+ private bool _showEngineFiles = true, _showPluginsFiles = true, _showAllFiles = true;
private RootContentTreeNode _root;
@@ -66,6 +66,57 @@ namespace FlaxEditor.Windows
///
public ContentView View => _view;
+ internal bool ShowEngineFiles
+ {
+ get => _showEngineFiles;
+ set
+ {
+ if (_showEngineFiles != value)
+ {
+ _showEngineFiles = value;
+ if (Editor.ContentDatabase.Engine != null)
+ {
+ Editor.ContentDatabase.Engine.Visible = value;
+ Editor.ContentDatabase.Engine.Folder.Visible = value;
+ RefreshView();
+ }
+ }
+ }
+ }
+
+ internal bool ShowPluginsFiles
+ {
+ get => _showPluginsFiles;
+ set
+ {
+ if (_showPluginsFiles != value)
+ {
+ _showPluginsFiles = value;
+ foreach (var project in Editor.ContentDatabase.Projects)
+ {
+ if (project == Editor.ContentDatabase.Game || project == Editor.ContentDatabase.Engine)
+ continue;
+ project.Visible = value;
+ project.Folder.Visible = value;
+ RefreshView();
+ }
+ }
+ }
+ }
+
+ internal bool ShowAllFiles
+ {
+ get => _showAllFiles;
+ set
+ {
+ if (_showAllFiles != value)
+ {
+ _showAllFiles = value;
+ RefreshView();
+ }
+ }
+ }
+
///
/// Initializes a new instance of the class.
///
@@ -75,7 +126,7 @@ namespace FlaxEditor.Windows
{
Title = "Content";
Icon = editor.Icons.Folder32;
-
+
// Content database events
editor.ContentDatabase.WorkspaceModified += () => _isWorkspaceDirty = true;
editor.ContentDatabase.ItemRemoved += OnContentDatabaseItemRemoved;
@@ -110,24 +161,11 @@ namespace FlaxEditor.Windows
_navigateForwardButton = (ToolStripButton)_toolStrip.AddButton(Editor.Icons.Right64, NavigateForward).LinkTooltip("Navigate forward");
_navigateUpButton = (ToolStripButton)_toolStrip.AddButton(Editor.Icons.Up64, NavigateUp).LinkTooltip("Navigate up");
_toolStrip.AddSeparator();
+
// Navigation bar
-
- _navigationBar = new ContentNavigationBar(_toolStrip)
+ _navigationBar = new NavigationBar
{
Parent = _toolStrip,
- ofssetFromRightEdge = _ContentDropdownSizeX
- };
- var DropdownSettingsPanel = new Panel(ScrollBars.None)
- {
- Parent = _toolStrip,
- Size = new Float2(_ContentDropdownSizeX, _toolStrip.Height)
- };
- //setings Dropdown
- _ContentSettingDropdown = new ContentSettingsDropdown
- {
- AnchorPreset = AnchorPresets.StretchAll,
- Parent = DropdownSettingsPanel,
- Offsets = new Margin(2, 4, 4, 4)
};
// Split panel
@@ -231,10 +269,6 @@ namespace FlaxEditor.Windows
private ContextMenu OnViewDropdownPopupCreate(ComboBox comboBox)
{
var menu = new ContextMenu();
-
- var showFileExtensionsButton = menu.AddButton("Show file extensions", () => View.ShowFileExtensions = !View.ShowFileExtensions);
- showFileExtensionsButton.Checked = View.ShowFileExtensions;
- showFileExtensionsButton.AutoCheck = true;
var viewScale = menu.AddButton("View Scale");
viewScale.CloseMenuOnClick = false;
@@ -259,6 +293,33 @@ namespace FlaxEditor.Windows
}
};
+ var show = menu.AddChildMenu("Show");
+ {
+ var b = show.ContextMenu.AddButton("File extensions", () => View.ShowFileExtensions = !View.ShowFileExtensions);
+ b.TooltipText = "Shows all files with extensions";
+ b.Checked = View.ShowFileExtensions;
+ b.CloseMenuOnClick = false;
+ b.AutoCheck = true;
+
+ b = show.ContextMenu.AddButton("Engine files", () => ShowEngineFiles = !ShowEngineFiles);
+ b.TooltipText = "Shows in-built engine content";
+ b.Checked = ShowEngineFiles;
+ b.CloseMenuOnClick = false;
+ b.AutoCheck = true;
+
+ b = show.ContextMenu.AddButton("Plugins files", () => ShowPluginsFiles = !ShowPluginsFiles);
+ b.TooltipText = "Shows plugin projects content";
+ b.Checked = ShowPluginsFiles;
+ b.CloseMenuOnClick = false;
+ b.AutoCheck = true;
+
+ b = show.ContextMenu.AddButton("All files", () => ShowAllFiles = !ShowAllFiles);
+ b.TooltipText = "Shows all files including other than assets and source code";
+ b.Checked = ShowAllFiles;
+ b.CloseMenuOnClick = false;
+ b.AutoCheck = true;
+ }
+
var filters = menu.AddChildMenu("Filters");
for (int i = 0; i < _viewDropdown.Items.Count; i++)
{
@@ -367,7 +428,7 @@ namespace FlaxEditor.Windows
{
if (!item.CanRename)
return;
-
+
// Show element in the view
Select(item, true);
@@ -444,10 +505,7 @@ namespace FlaxEditor.Windows
if (!Editor.ContentEditing.IsValidAssetName(item, newShortName, out string hint))
{
// Invalid name
- MessageBox.Show("Given asset name is invalid. " + hint,
- "Invalid name",
- MessageBoxButtons.OK,
- MessageBoxIcon.Error);
+ MessageBox.Show("Given asset name is invalid. " + hint, "Invalid name", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
@@ -893,7 +951,7 @@ namespace FlaxEditor.Windows
if (target == _root)
{
// Special case for root folder
- List items = new List(8);
+ var items = new List(8);
for (int i = 0; i < _root.ChildrenCount; i++)
{
if (_root.GetChild(i) is ContentTreeNode node)
@@ -905,9 +963,11 @@ namespace FlaxEditor.Windows
}
else
{
-
// Show folder contents
- _view.ShowItems(ContentFilter.FilterFolder(target.Folder), _sortType, false, true);
+ var items = target.Folder.Children;
+ if (!_showAllFiles)
+ items = items.Where(x => !(x is FileItem)).ToList();
+ _view.ShowItems(items, _sortType, false, true);
}
}
@@ -930,12 +990,6 @@ namespace FlaxEditor.Windows
_navigateUpButton.Enabled = folder != null && _tree.SelectedNode != _root;
}
- private void RemoveFolder2Root(ContentTreeNode node)
- {
- // Remove from the root
- _root.RemoveChild(node);
- }
-
///
public override void OnInit()
{
@@ -947,18 +1001,20 @@ namespace FlaxEditor.Windows
_root.Expand(true);
// Add game project on top, plugins in the middle and engine at bottom
- _root.AddChild(ContentFilter.Filter(Editor.ContentDatabase.Game));
+ _root.AddChild(Editor.ContentDatabase.Game);
Editor.ContentDatabase.Projects.Sort();
foreach (var project in Editor.ContentDatabase.Projects)
{
project.SortChildrenRecursive();
if (project == Editor.ContentDatabase.Game || project == Editor.ContentDatabase.Engine)
continue;
+ project.Visible = _showPluginsFiles;
+ project.Folder.Visible = _showPluginsFiles;
_root.AddChild(project);
- ContentFilter.plugins.Add(project);
}
+ Editor.ContentDatabase.Engine.Visible = _showEngineFiles;
+ Editor.ContentDatabase.Engine.Folder.Visible = _showEngineFiles;
_root.AddChild(Editor.ContentDatabase.Engine);
- ContentFilter.engine = Editor.ContentDatabase.Engine;
Editor.ContentDatabase.Game?.Expand(true);
_tree.Margin = new Margin(0.0f, 0.0f, -16.0f, 2.0f); // Hide root node
@@ -1029,7 +1085,6 @@ namespace FlaxEditor.Windows
///
public override bool OnMouseUp(Float2 location, MouseButton button)
{
- // Check if it's a right mouse button
if (button == MouseButton.Right)
{
// Find control that is under the mouse
@@ -1067,6 +1122,15 @@ namespace FlaxEditor.Windows
return base.OnMouseUp(location, button);
}
+
+ ///
+ protected override void PerformLayoutBeforeChildren()
+ {
+ base.PerformLayoutBeforeChildren();
+
+ _navigationBar?.UpdateBounds(_toolStrip);
+ }
+
///
public override bool UseLayoutData => true;
@@ -1076,13 +1140,10 @@ namespace FlaxEditor.Windows
LayoutSerializeSplitter(writer, "Split", _split);
writer.WriteAttributeString("Scale", _view.ViewScale.ToString(CultureInfo.InvariantCulture));
writer.WriteAttributeString("ShowFileExtensions", _view.ShowFileExtensions.ToString());
+ writer.WriteAttributeString("ShowEngineFiles", ShowEngineFiles.ToString());
+ writer.WriteAttributeString("ShowPluginsFiles", ShowPluginsFiles.ToString());
+ writer.WriteAttributeString("ShowAllFiles", ShowAllFiles.ToString());
writer.WriteAttributeString("ViewType", _view.ViewType.ToString());
- for (int i = 0; i < _ContentSettingDropdown.Selection.Count; i++)
- {
- if(_ContentSettingDropdown.Selection.Count != 0)
- writer.WriteAttributeString(_ContentSettingDropdown.Settings[_ContentSettingDropdown.Selection[i]].Replace(' ', '_'), _ContentSettingDropdown.Selection[i].ToString());
- }
-
}
///
@@ -1093,17 +1154,14 @@ namespace FlaxEditor.Windows
_view.ViewScale = value1;
if (bool.TryParse(node.GetAttribute("ShowFileExtensions"), out bool value2))
_view.ShowFileExtensions = value2;
+ if (bool.TryParse(node.GetAttribute("ShowEngineFiles"), out value2))
+ ShowEngineFiles = value2;
+ if (bool.TryParse(node.GetAttribute("ShowPluginsFiles"), out value2))
+ ShowPluginsFiles = value2;
+ if (bool.TryParse(node.GetAttribute("ShowAllFiles"), out value2))
+ ShowAllFiles = value2;
if (Enum.TryParse(node.GetAttribute("ViewType"), out ContentViewType viewType))
_view.ViewType = viewType;
-
- for (int i = 0; i < _ContentSettingDropdown.Settings.Count; i++)
- {
- int flag;
- if (int.TryParse(node.GetAttribute(_ContentSettingDropdown.Settings[i].Replace(' ', '_')), out flag))
- _ContentSettingDropdown.Selection.Add(flag);
-
- }
- ContentFilter.UpdateFilterVisability(_ContentSettingDropdown);
}
///