diff --git a/Source/Editor/Content/ContentFilter.cs b/Source/Editor/Content/ContentFilter.cs
new file mode 100644
index 000000000..2cbd78e65
--- /dev/null
+++ b/Source/Editor/Content/ContentFilter.cs
@@ -0,0 +1,262 @@
+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;
+ Editor.Instance.Windows.ContentWin.RefreshView(engine);
+ }
+
+ if (dropdown.Selection[i] == 1)//Show Plugin Content
+ {
+ foreach (var item in plugins)
+ {
+ item.Visible = true;
+ item.Folder.Visible = true;
+ Editor.Instance.Windows.ContentWin.RefreshView(item);
+ }
+ }
+
+ 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;
+ Editor.Instance.Windows.ContentWin.RefreshView((ContentTreeNode)settings.Parent);
+ }
+
+ if (dropdown.Selection[i] == 4)//"Show Shader Source"
+ {
+ shaders.Visible = true;
+ shaders.Folder.Visible = true;
+ Editor.Instance.Windows.ContentWin.RefreshView(shaders);
+ }
+ }
+
+
+
+ }
+ }
+}
diff --git a/Source/Editor/Content/GUI/ContentNavigationBar.cs b/Source/Editor/Content/GUI/ContentNavigationBar.cs
new file mode 100644
index 000000000..673ac806e
--- /dev/null
+++ b/Source/Editor/Content/GUI/ContentNavigationBar.cs
@@ -0,0 +1,27 @@
+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/ContentNavigationButton.cs b/Source/Editor/Content/GUI/ContentNavigationButton.cs
index d37e1629b..beec247da 100644
--- a/Source/Editor/Content/GUI/ContentNavigationButton.cs
+++ b/Source/Editor/Content/GUI/ContentNavigationButton.cs
@@ -31,7 +31,7 @@ namespace FlaxEditor.Content.GUI
: base(x, y, height)
{
TargetNode = targetNode;
- Text = targetNode.NavButtonLabel + "/";
+ Text = targetNode.NavButtonLabel;
}
///
diff --git a/Source/Editor/Content/GUI/ContentNavigationButtonSeparator.cs b/Source/Editor/Content/GUI/ContentNavigationButtonSeparator.cs
new file mode 100644
index 000000000..cad63066d
--- /dev/null
+++ b/Source/Editor/Content/GUI/ContentNavigationButtonSeparator.cs
@@ -0,0 +1,85 @@
+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
new file mode 100644
index 000000000..04722a674
--- /dev/null
+++ b/Source/Editor/Content/GUI/ContentSettingsDropdown.cs
@@ -0,0 +1,95 @@
+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/GUI/ContentView.cs b/Source/Editor/Content/GUI/ContentView.cs
index 6065ca9f8..9dca03953 100644
--- a/Source/Editor/Content/GUI/ContentView.cs
+++ b/Source/Editor/Content/GUI/ContentView.cs
@@ -261,11 +261,14 @@ namespace FlaxEditor.Content.GUI
ClearItems();
// Add references and link items
- _items.AddRange(items);
for (int i = 0; i < items.Count; i++)
{
- items[i].Parent = this;
- items[i].AddReference(this);
+ if (items[i].Visible)
+ {
+ items[i].Parent = this;
+ items[i].AddReference(this);
+ _items.Add(items[i]);
+ }
}
if (selection != null)
{
diff --git a/Source/Editor/Content/Items/ContentItem.cs b/Source/Editor/Content/Items/ContentItem.cs
index 66825fb42..377c6dac0 100644
--- a/Source/Editor/Content/Items/ContentItem.cs
+++ b/Source/Editor/Content/Items/ContentItem.cs
@@ -441,6 +441,11 @@ namespace FlaxEditor.Content
{
get
{
+ if (!Visible)
+ {
+ return Rectangle.Empty;
+ }
+
var view = Parent as ContentView;
var size = Size;
switch (view?.ViewType ?? ContentViewType.Tiles)
@@ -448,7 +453,7 @@ namespace FlaxEditor.Content
case ContentViewType.Tiles:
{
var textHeight = DefaultTextHeight * size.X / DefaultWidth;
- return new Rectangle(0, size.Y - textHeight, size.X, textHeight);
+ return new Rectangle(0, size.Y - textHeight, size.X - 2, textHeight);
}
case ContentViewType.List:
{
@@ -642,6 +647,7 @@ namespace FlaxEditor.Content
///
public override void Draw()
{
+
// Cache data
var size = Size;
var style = Style.Current;
diff --git a/Source/Editor/GUI/ComboBox.cs b/Source/Editor/GUI/ComboBox.cs
index 2481316d0..da38268b2 100644
--- a/Source/Editor/GUI/ComboBox.cs
+++ b/Source/Editor/GUI/ComboBox.cs
@@ -5,6 +5,7 @@ using System.Collections.Generic;
using System.Linq;
using FlaxEngine;
using FlaxEngine.GUI;
+using FlaxEditor.GUI.ContextMenu;
namespace FlaxEditor.GUI
{
@@ -396,14 +397,23 @@ namespace FlaxEditor.GUI
_popupMenu.ButtonClicked += btn =>
{
OnItemClicked((int)btn.Tag);
- _popupMenu?.Hide();
+ if (SupportMultiSelect)
+ {
+ 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
};
}
// Check if menu hs been already shown
if (_popupMenu.Visible)
{
- _popupMenu.Hide();
+ if (!SupportMultiSelect)
+ _popupMenu.Hide();
return;
}
@@ -412,31 +422,59 @@ namespace FlaxEditor.GUI
// Check if has any items
if (_items.Count > 0)
{
- // Setup items list
+ UpdateButtons();
+ // Show dropdown list
+ _popupMenu.MinimumWidth = Width;
+ _popupMenu.Show(this, new Float2(1, Height));
+ }
+ }
+ ///
+ /// update buttons layout and repains
+ ///
+ private void UpdateButtons()
+ {
+ if (_popupMenu.Items.Count() != _items.Count)
+ {
var itemControls = _popupMenu.Items.ToArray();
foreach (var e in itemControls)
e.Dispose();
if (Sorted)
_items.Sort();
- var style = Style.Current;
for (int i = 0; i < _items.Count; i++)
{
var btn = _popupMenu.AddButton(_items[i]);
- if (_selectedIndices.Contains(i))
- {
- btn.Icon = style.CheckBoxTick;
- }
- if (_tooltips != null && _tooltips.Length > i)
- {
- btn.TooltipText = _tooltips[i];
- }
-
+ OnLayoutMenuButton(ref btn, i, true);
btn.Tag = i;
}
-
- // Show dropdown list
- _popupMenu.MinimumWidth = Width;
- _popupMenu.Show(this, new Float2(1, Height));
+ }
+ else
+ {
+ var itemControls = _popupMenu.Items.ToArray();
+ if (Sorted)
+ _items.Sort();
+ for (int i = 0; i < _items.Count; i++)
+ {
+ if (itemControls[i] is ContextMenuButton btn)
+ {
+ btn.Text = _items[i];
+ OnLayoutMenuButton(ref btn, i, true);
+ }
+ }
+ }
+ }
+ ///
+ /// caled when button is created or repainted u can overite it to give the button custom look
+ ///
+ /// button refrance
+ /// curent 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)
+ {
+ var style = Style.Current;
+ button.Checked = _selectedIndices.Contains(index);
+ if (_tooltips != null && _tooltips.Length > index)
+ {
+ button.TooltipText = _tooltips[index];
}
}
diff --git a/Source/Editor/Windows/ContentWindow.Navigation.cs b/Source/Editor/Windows/ContentWindow.Navigation.cs
index ad690c2d0..ca3de992d 100644
--- a/Source/Editor/Windows/ContentWindow.Navigation.cs
+++ b/Source/Editor/Windows/ContentWindow.Navigation.cs
@@ -196,12 +196,18 @@ namespace FlaxEditor.Windows
}
float x = NavigationBar.DefaultButtonsMargin;
float h = _toolStrip.ItemsHeight - 2 * ToolStrip.DefaultMarginV;
- for (int i = nodes.Count - 1; i >= 0; i--)
+ for (int i = nodes.Count - 2; i >= 0; i--)
{
- var button = new ContentNavigationButton(nodes[i], x, ToolStrip.DefaultMarginV, h);
+ var button = new ContentNavigationButton(nodes[i], x - 100, 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);
}
nodes.Clear();
diff --git a/Source/Editor/Windows/ContentWindow.cs b/Source/Editor/Windows/ContentWindow.cs
index f993b79f9..58aaf3e4c 100644
--- a/Source/Editor/Windows/ContentWindow.cs
+++ b/Source/Editor/Windows/ContentWindow.cs
@@ -39,11 +39,13 @@ namespace FlaxEditor.Windows
private readonly ToolStripButton _navigateForwardButton;
private readonly ToolStripButton _navigateUpButton;
- private NavigationBar _navigationBar;
+ private ContentNavigationBar _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 RootContentTreeNode _root;
@@ -73,7 +75,7 @@ namespace FlaxEditor.Windows
{
Title = "Content";
Icon = editor.Icons.Folder32;
-
+
// Content database events
editor.ContentDatabase.WorkspaceModified += () => _isWorkspaceDirty = true;
editor.ContentDatabase.ItemRemoved += OnContentDatabaseItemRemoved;
@@ -107,11 +109,25 @@ namespace FlaxEditor.Windows
_navigateBackwardButton = (ToolStripButton)_toolStrip.AddButton(Editor.Icons.Left64, NavigateBackward).LinkTooltip("Navigate backward");
_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 NavigationBar
+
+ _navigationBar = new ContentNavigationBar(_toolStrip)
{
- Parent = this,
+ 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
@@ -215,7 +231,7 @@ 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;
@@ -877,8 +893,9 @@ namespace FlaxEditor.Windows
}
else
{
+
// Show folder contents
- _view.ShowItems(target.Folder.Children, _sortType, false, true);
+ _view.ShowItems(ContentFilter.FilterFolder(target.Folder), _sortType, false, true);
}
}
@@ -918,15 +935,17 @@ namespace FlaxEditor.Windows
_root.Expand(true);
// Add game project on top, plugins in the middle and engine at bottom
- _root.AddChild(Editor.ContentDatabase.Game);
+ _root.AddChild(ContentFilter.Filter(Editor.ContentDatabase.Game));
foreach (var project in Editor.ContentDatabase.Projects)
{
project.SortChildrenRecursive();
if (project == Editor.ContentDatabase.Game || project == Editor.ContentDatabase.Engine)
continue;
_root.AddChild(project);
+ ContentFilter.plugins.Add(project);
}
_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
@@ -1035,15 +1054,6 @@ namespace FlaxEditor.Windows
return base.OnMouseUp(location, button);
}
-
- ///
- protected override void PerformLayoutBeforeChildren()
- {
- base.PerformLayoutBeforeChildren();
-
- _navigationBar?.UpdateBounds(_toolStrip);
- }
-
///
public override bool UseLayoutData => true;
@@ -1054,6 +1064,12 @@ namespace FlaxEditor.Windows
writer.WriteAttributeString("Scale", _view.ViewScale.ToString(CultureInfo.InvariantCulture));
writer.WriteAttributeString("ShowFileExtensions", _view.ShowFileExtensions.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());
+ }
+
}
///
@@ -1066,6 +1082,15 @@ namespace FlaxEditor.Windows
_view.ShowFileExtensions = 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);
}
///