diff --git a/demo/Ursa.Demo/Pages/ToolBarDemo.axaml b/demo/Ursa.Demo/Pages/ToolBarDemo.axaml
index e9e4367..d56843e 100644
--- a/demo/Ursa.Demo/Pages/ToolBarDemo.axaml
+++ b/demo/Ursa.Demo/Pages/ToolBarDemo.axaml
@@ -1,24 +1,43 @@
-
-
-
-
-
-
+
+
+
+
+
+
-
+
-
+
-
+
+
+
+
+
+
diff --git a/demo/Ursa.Demo/ViewModels/ToolBarDemoViewModel.cs b/demo/Ursa.Demo/ViewModels/ToolBarDemoViewModel.cs
index d154f0e..d2bd6d5 100644
--- a/demo/Ursa.Demo/ViewModels/ToolBarDemoViewModel.cs
+++ b/demo/Ursa.Demo/ViewModels/ToolBarDemoViewModel.cs
@@ -15,7 +15,14 @@ public partial class ToolBarDemoViewModel: ObservableObject
{
new ToolBarButtonItemViewModel() { Content = "New", OverflowMode = OverflowMode.AsNeeded},
new ToolBarButtonItemViewModel() { Content = "Open" },
- new ToolBarButtonItemViewModel() { Content = "Save" },
+ new ToolBarButtonItemViewModel() { Content = "Save1" },
+ new ToolBarButtonItemViewModel() { Content = "Save2" },
+ new ToolBarButtonItemViewModel() { Content = "Save3" },
+ new ToolBarButtonItemViewModel() { Content = "Save4" },
+ new ToolBarButtonItemViewModel() { Content = "Save5" },
+ new ToolBarButtonItemViewModel() { Content = "Save6" },
+ new ToolBarButtonItemViewModel() { Content = "Save7" },
+ new ToolBarButtonItemViewModel() { Content = "Save8" },
new ToolBarCheckBoxItemViweModel() { Content = "Bold" },
new ToolBarCheckBoxItemViweModel() { Content = "Italic", OverflowMode = OverflowMode.Never},
new ToolBarComboBoxItemViewModel() { Content = "Font Size", Items = new (){ "10", "12", "14" } }
diff --git a/src/Ursa.Themes.Semi/Controls/ToolBar.axaml b/src/Ursa.Themes.Semi/Controls/ToolBar.axaml
index bafdee8..ef78019 100644
--- a/src/Ursa.Themes.Semi/Controls/ToolBar.axaml
+++ b/src/Ursa.Themes.Semi/Controls/ToolBar.axaml
@@ -3,6 +3,28 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:u="https://irihi.tech/ursa">
+
+
+
+
+
+
+
+
@@ -13,27 +35,35 @@
-
-
-
+ DockPanel.Dock="Left"
+ IsVisible="{TemplateBinding Header,
+ Converter={x:Static ObjectConverters.IsNotNull}}" />
+
+
+
+
-
+
@@ -46,5 +76,58 @@
+
+
+
diff --git a/src/Ursa.Themes.Semi/Themes/Shared/ToolBar.axaml b/src/Ursa.Themes.Semi/Themes/Shared/ToolBar.axaml
new file mode 100644
index 0000000..508a5dc
--- /dev/null
+++ b/src/Ursa.Themes.Semi/Themes/Shared/ToolBar.axaml
@@ -0,0 +1,6 @@
+
+
+ M12,16A2,2 0 0,1 14,18A2,2 0 0,1 12,20A2,2 0 0,1 10,18A2,2 0 0,1 12,16M12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12A2,2 0 0,1 12,10M12,4A2,2 0 0,1 14,6A2,2 0 0,1 12,8A2,2 0 0,1 10,6A2,2 0 0,1 12,4Z
+ M16,12A2,2 0 0,1 18,10A2,2 0 0,1 20,12A2,2 0 0,1 18,14A2,2 0 0,1 16,12M10,12A2,2 0 0,1 12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12M4,12A2,2 0 0,1 6,10A2,2 0 0,1 8,12A2,2 0 0,1 6,14A2,2 0 0,1 4,12Z
+
diff --git a/src/Ursa.Themes.Semi/Themes/Shared/_index.axaml b/src/Ursa.Themes.Semi/Themes/Shared/_index.axaml
index d06590f..481acde 100644
--- a/src/Ursa.Themes.Semi/Themes/Shared/_index.axaml
+++ b/src/Ursa.Themes.Semi/Themes/Shared/_index.axaml
@@ -15,5 +15,6 @@
+
diff --git a/src/Ursa/Controls/ToolBar/ToolBar.cs b/src/Ursa/Controls/ToolBar/ToolBar.cs
index 6a0d01c..5c483b7 100644
--- a/src/Ursa/Controls/ToolBar/ToolBar.cs
+++ b/src/Ursa/Controls/ToolBar/ToolBar.cs
@@ -6,13 +6,16 @@ using Avalonia.Controls.Primitives;
using Avalonia.Controls.Templates;
using Avalonia.Layout;
using Avalonia.Markup.Xaml.Templates;
+using Irihi.Avalonia.Shared.Helpers;
namespace Ursa.Controls;
+[PseudoClasses(PC_Overflow)]
[TemplatePart(PART_OverflowPanel, typeof(Panel))]
public class ToolBar: HeaderedItemsControl
{
public const string PART_OverflowPanel = "PART_OverflowPanel";
+ public const string PC_Overflow = ":overflow";
internal Panel? OverflowPanel { get; private set; }
@@ -27,14 +30,14 @@ public class ToolBar: HeaderedItemsControl
get => GetValue(OrientationProperty);
set => SetValue(OrientationProperty, value);
}
-
- public static readonly StyledProperty BandProperty = AvaloniaProperty.Register(
- nameof(Band));
-
- public int Band
+
+ public static readonly StyledProperty PopupPlacementProperty =
+ Popup.PlacementProperty.AddOwner();
+
+ public PlacementMode PopupPlacement
{
- get => GetValue(BandProperty);
- set => SetValue(BandProperty, value);
+ get => GetValue(PopupPlacementProperty);
+ set => SetValue(PopupPlacementProperty, value);
}
public static readonly AttachedProperty OverflowModeProperty =
@@ -49,11 +52,27 @@ public class ToolBar: HeaderedItemsControl
internal static void SetIsOverflowItem(Control obj, bool value) => obj.SetValue(IsOverflowItemProperty, value);
internal static bool GetIsOverflowItem(Control obj) => obj.GetValue(IsOverflowItemProperty);
+ private bool _hasOverflowItems;
+ internal bool HasOverflowItems
+ {
+ get => _hasOverflowItems;
+ set
+ {
+ _hasOverflowItems = value;
+ PseudoClasses.Set(PC_Overflow, value);
+ }
+ }
+
static ToolBar()
{
IsTabStopProperty.OverrideDefaultValue(false);
ItemsPanelProperty.OverrideDefaultValue(DefaultTemplate);
OrientationProperty.OverrideDefaultValue(Orientation.Horizontal);
+ // TODO: use helper method after merged and upgrade helper dependency.
+ IsOverflowItemProperty.Changed.AddClassHandler((o, e) =>
+ {
+ PseudolassesExtensions.Set(o.Classes, PC_Overflow, e.NewValue.Value);
+ });
}
protected override bool NeedsContainerOverride(object? item, int index, out object? recycleKey)
@@ -63,29 +82,11 @@ public class ToolBar: HeaderedItemsControl
protected override Control CreateContainerForItemOverride(object? item, int index, object? recycleKey)
{
- return new ContentPresenter();
- }
-
- protected override void ContainerForItemPreparedOverride(Control container, object? item, int index)
- {
- base.ContainerForItemPreparedOverride(container, item, index);
- if (item is Control s)
+ if(item is Control c)
{
- container[!ToolBar.OverflowModeProperty] = s[!ToolBar.OverflowModeProperty];
- }
- else
- {
- if (container is ContentPresenter p)
- {
- p.ApplyTemplate();
- var c = p.Child;
- if (c != null)
- {
- container[ToolBar.OverflowModeProperty] = c[ToolBar.OverflowModeProperty];
- // container[!ToolBar.OverflowModeProperty] = c[!ToolBar.OverflowModeProperty];
- }
- }
+ return c;
}
+ return ItemTemplate?.Build(item) ?? new ContentPresenter();
}
protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
diff --git a/src/Ursa/Controls/ToolBar/ToolBarOverflowPanel.cs b/src/Ursa/Controls/ToolBar/ToolBarOverflowPanel.cs
deleted file mode 100644
index be52346..0000000
--- a/src/Ursa/Controls/ToolBar/ToolBarOverflowPanel.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-using Avalonia.Controls;
-
-namespace Ursa.Controls;
-
-public class ToolBarOverflowPanel: StackPanel
-{
-
-}
\ No newline at end of file
diff --git a/src/Ursa/Controls/ToolBar/ToolBarPanel.cs b/src/Ursa/Controls/ToolBar/ToolBarPanel.cs
index fffefe9..36f9dde 100644
--- a/src/Ursa/Controls/ToolBar/ToolBarPanel.cs
+++ b/src/Ursa/Controls/ToolBar/ToolBarPanel.cs
@@ -10,18 +10,9 @@ public class ToolBarPanel: StackPanel
private ToolBar? _parent;
private Panel? _overflowPanel;
- internal Panel? OverflowPanel => _overflowPanel ??= _parent?.OverflowPanel;
+ private Panel? OverflowPanel => _overflowPanel ??= _parent?.OverflowPanel;
internal ToolBar? ParentToolBar => _parent ??= this.TemplatedParent as ToolBar;
- public static readonly StyledProperty OrientationProperty =
- StackPanel.OrientationProperty.AddOwner();
-
- public Orientation Orientation
- {
- get => GetValue(OrientationProperty);
- set => SetValue(OrientationProperty, value);
- }
-
static ToolBarPanel()
{
OrientationProperty.OverrideDefaultValue(Orientation.Horizontal);
@@ -38,13 +29,11 @@ public class ToolBarPanel: StackPanel
protected override Size MeasureOverride(Size availableSize)
{
var logicalChildren = _parent?.GetLogicalChildren().OfType().ToList();
- var parent = this.GetLogicalParent();
Size size = new Size();
double spacing = 0;
Size measureSize = availableSize;
bool horizontal = Orientation == Orientation.Horizontal;
bool hasVisibleChildren = false;
- int index = 0;
if (logicalChildren is null) return size;
for (int i = 0; i < logicalChildren.Count; i++)
{
@@ -54,7 +43,6 @@ public class ToolBarPanel: StackPanel
if (mode == OverflowMode.Always)
{
ToolBar.SetIsOverflowItem(control, true);
- continue;
}
else if (mode == OverflowMode.Never)
{
@@ -114,30 +102,33 @@ public class ToolBarPanel: StackPanel
{
Children.Clear();
OverflowPanel?.Children.Clear();
- InvalidateVisual();
var logicalChildren = _parent?.GetLogicalChildren().OfType().ToList();
if(logicalChildren is null) return finalSize;
+ bool overflow = false;
foreach (var child in logicalChildren)
{
if (ToolBar.GetIsOverflowItem(child))
{
OverflowPanel?.Children.Add(child);
+ overflow = true;
}
else
{
- this.Children.Add(child);
+ Children.Add(child);
}
}
+
+ if (_parent != null) _parent.HasOverflowItems = overflow;
return base.ArrangeOverride(finalSize);
}
protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
{
- var list = OverflowPanel?.Children?.ToList();
+ var list = OverflowPanel?.Children.ToList();
if (list is not null)
{
- OverflowPanel?.Children?.Clear();
- this.Children.AddRange(list);
+ OverflowPanel?.Children.Clear();
+ Children.AddRange(list);
}
base.OnDetachedFromVisualTree(e);
}