Skip to content

Commit

Permalink
Merge pull request #8 from yuto-trd/dev
Browse files Browse the repository at this point in the history
1.0.2
  • Loading branch information
yuto-trd authored Oct 2, 2024
2 parents df47a5e + 2ef4e22 commit 8728547
Show file tree
Hide file tree
Showing 7 changed files with 162 additions and 7 deletions.
1 change: 1 addition & 0 deletions samples/ReDocking.Sample/Views/MainWindow.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@
<Border Grid.Row="1" Background="{DynamicResource ReDockingDividerBrush}" />
<dock:ReDockHost Grid.Row="2"
ButtonDisplayModeChanged="OnSideBarButtonDisplayModeChanged"
ButtonFlyoutRequested="OnButtonFlyoutRequested"
ButtonMove="OnSideBarButtonDrop"
IsFloatingEnabled="True">
<dock:ReDockHost.DockAreas>
Expand Down
21 changes: 18 additions & 3 deletions samples/ReDocking.Sample/Views/MainWindow.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,9 +91,8 @@ private void OnSideBarButtonDrop(object? sender, SideBarButtonMoveEventArgs e)

e.Handled = true;
}


private static ReactiveCollection<ToolWindowViewModel> GetItemsSource(MainWindowViewModel viewModel,

internal static ReactiveCollection<ToolWindowViewModel> GetItemsSource(MainWindowViewModel viewModel,
DockAreaLocation location)
{
return (location.ButtonLocation, location.LeftRight) switch
Expand Down Expand Up @@ -145,4 +144,20 @@ private void OnSideBarButtonDisplayModeChanged(object? sender, SideBarButtonDisp

e.Handled = true;
}

private void OnButtonFlyoutRequested(object? sender, SideBarButtonFlyoutRequestedEventArgs e)
{
e.Handled = true;
var flyout = new CustomSideBarButtonMenuFlyout(e.DockHost);
if (e.Button.DockLocation?.LeftRight == SideBarLocation.Left)
{
flyout.Placement = PlacementMode.Right;
}
else
{
flyout.Placement = PlacementMode.Left;
}

flyout.ShowAt(e.Button);
}
}
110 changes: 110 additions & 0 deletions samples/ReDocking.Sample/Views/SideBarButtonMenuFlyout.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
using System.Collections.Generic;

using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Templates;
using Avalonia.Interactivity;
using Avalonia.VisualTree;

using ReDocking.ViewModels;

namespace ReDocking.Views;

public class CustomSideBarButtonMenuFlyout : MenuFlyout
{
private readonly ReDockHost _dockHost;

public CustomSideBarButtonMenuFlyout(ReDockHost dockHost)
{
_dockHost = dockHost;
var list = new List<Control>();

{
var moveMenu = new MenuItem();
moveMenu.Header = "Move to";
moveMenu.ItemsSource = dockHost.DockAreas;
moveMenu.DataTemplates.Add(new FuncDataTemplate<DockArea>(_ => true,
o => new TextBlock
{
[!TextBlock.TextProperty] = o.GetObservable(DockArea.LocalizedNameProperty).ToBinding(),
}));

moveMenu.AddHandler(MenuItem.ClickEvent, OnMoveToSubItemClick);
list.Add(moveMenu);
}

{
var closeMenu = new MenuItem();
closeMenu.Header = "Close";
closeMenu.AddHandler(MenuItem.ClickEvent, OnCloseClick);
list.Add(closeMenu);
}

if (dockHost.IsFloatingEnabled)
{
var displayMenu = new MenuItem();
displayMenu.Header = "Display mode";
displayMenu.ItemsSource = new List<Control>
{
new MenuItem { Header = "Docked", Tag = DockableDisplayMode.Docked },
new MenuItem { Header = "Floating", Tag = DockableDisplayMode.Floating },
};
displayMenu.AddHandler(MenuItem.ClickEvent, OnDisplayModeClick);
list.Add(displayMenu);
}

ItemsSource = list;
}

private void OnCloseClick(object? sender, RoutedEventArgs e)
{
if (Target is not SideBarButton button) return;
if (button is not { DockLocation: { } location }) return;
if (button is not { DataContext: ToolWindowViewModel buttonViewModel }) return;
if (button.FindAncestorOfType<MainWindow>() is not { DataContext: MainWindowViewModel viewModel }) return;

buttonViewModel.IsSelected.Value = false;
var itemsSource = MainWindow.GetItemsSource(viewModel, location);
itemsSource.Remove(buttonViewModel);
}

private void OnDisplayModeClick(object? sender, RoutedEventArgs e)
{
if (e.Source is MenuItem { Tag: DockableDisplayMode mode } &&
Target is SideBarButton button)
{
var args = new SideBarButtonDisplayModeChangedEventArgs(ReDockHost.ButtonDisplayModeChangedEvent, this)
{
DisplayMode = mode, Item = button.DataContext, Button = button
};
_dockHost.RaiseEvent(args);
}
}

private void OnMoveToSubItemClick(object? sender, RoutedEventArgs e)
{
if (e.Source is MenuItem { DataContext: DockArea area } &&
Target is SideBarButton button)
{
// Target
var oldSideBar = button.FindAncestorOfType<SideBar>();
var newSideBar = area.SideBar;
if (oldSideBar is null || newSideBar is null) return;
var oldLocation = button.DockLocation;
var newLocation = area.Location;
if (oldLocation is null || oldLocation == newLocation) return;

var args = new SideBarButtonMoveEventArgs(ReDockHost.ButtonMoveEvent, this)
{
Item = button.DataContext,
Button = button,
SourceSideBar = oldSideBar,
SourceLocation = oldLocation,
DestinationSideBar = newSideBar,
DestinationLocation = newLocation,
DestinationIndex = 0
};
_dockHost.RaiseEvent(args);
}
}
}
17 changes: 16 additions & 1 deletion src/ReDocking/ReDockHost.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,12 @@ public class ReDockHost : ContentControl
RoutedEvent.Register<ReDockHost, SideBarButtonMoveEventArgs>(nameof(ButtonMove), RoutingStrategies.Bubble);

public static readonly RoutedEvent<SideBarButtonDisplayModeChangedEventArgs> ButtonDisplayModeChangedEvent =
RoutedEvent.Register<ReDockHost, SideBarButtonDisplayModeChangedEventArgs>(nameof(ButtonDisplayModeChanged), RoutingStrategies.Bubble);
RoutedEvent.Register<ReDockHost, SideBarButtonDisplayModeChangedEventArgs>(nameof(ButtonDisplayModeChanged),
RoutingStrategies.Bubble);

public static readonly RoutedEvent<SideBarButtonFlyoutRequestedEventArgs> ButtonFlyoutRequestedEvent =
RoutedEvent.Register<ReDockHost, SideBarButtonFlyoutRequestedEventArgs>(nameof(ButtonFlyoutRequested),
RoutingStrategies.Bubble);

public static readonly StyledProperty<bool> IsFloatingEnabledProperty =
AvaloniaProperty.Register<ReDockHost, bool>(nameof(IsFloatingEnabled));
Expand All @@ -37,9 +42,19 @@ public event EventHandler<SideBarButtonDisplayModeChangedEventArgs> ButtonDispla
add => AddHandler(ButtonDisplayModeChangedEvent, value);
remove => RemoveHandler(ButtonDisplayModeChangedEvent, value);
}

public event EventHandler<SideBarButtonFlyoutRequestedEventArgs> ButtonFlyoutRequested
{
add => AddHandler(ButtonFlyoutRequestedEvent, value);
remove => RemoveHandler(ButtonFlyoutRequestedEvent, value);
}

internal void ShowFlyout(SideBarButton button)
{
var args = new SideBarButtonFlyoutRequestedEventArgs(button, this, ButtonFlyoutRequestedEvent, this);
RaiseEvent(args);
if (args.Handled) return;

var flyout = new SideBarButtonMenuFlyout(this);
if (button.DockLocation?.LeftRight == SideBarLocation.Left)
{
Expand Down
4 changes: 2 additions & 2 deletions src/ReDocking/ReDocking.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>

<PackageId>ReDocking.Avalonia</PackageId>
<Version>1.0.1</Version>
<Version>1.0.2</Version>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<Authors>Yuto Terada</Authors>
<RepositoryType>Git</RepositoryType>
<PackageTags>c-sharp;avalonia;avaloniaui;dotnet;dock</PackageTags>
<AssemblyVersion>1.0.1.0</AssemblyVersion>
<AssemblyVersion>1.0.2.0</AssemblyVersion>
<PackageReadmeFile>README.md</PackageReadmeFile>
</PropertyGroup>

Expand Down
2 changes: 1 addition & 1 deletion src/ReDocking/SideBarButton.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public DockableDisplayMode DisplayMode
set => SetValue(DisplayModeProperty, value);
}

internal DockAreaLocation? DockLocation { get; set; }
public DockAreaLocation? DockLocation { get; internal set; }

protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
{
Expand Down
14 changes: 14 additions & 0 deletions src/ReDocking/SideBarButtonFlyoutRequestedEventArgs.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using Avalonia.Interactivity;

namespace ReDocking;

public class SideBarButtonFlyoutRequestedEventArgs(
SideBarButton button,
ReDockHost dockHost,
RoutedEvent routedEvent,
object source)
: RoutedEventArgs(routedEvent, source)
{
public SideBarButton Button { get; } = button;
public ReDockHost DockHost { get; } = dockHost;
}

0 comments on commit 8728547

Please sign in to comment.