mirror of
https://github.com/sourcegit-scm/sourcegit
synced 2025-05-31 09:04:59 +00:00
105 lines
3.9 KiB
C#
105 lines
3.9 KiB
C#
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Controls.Primitives;
|
|
using System.Windows.Media;
|
|
using System.Windows.Shapes;
|
|
|
|
namespace SourceGit.Views.Controls {
|
|
/// <summary>
|
|
/// 用于切换变更显示模式的按钮
|
|
/// </summary>
|
|
public class ChangeDisplaySwitcher : Button {
|
|
|
|
public static readonly DependencyProperty ModeProperty = DependencyProperty.Register(
|
|
"Mode",
|
|
typeof(Models.Change.DisplayMode),
|
|
typeof(ChangeDisplaySwitcher),
|
|
new PropertyMetadata(Models.Change.DisplayMode.Tree, OnModeChanged));
|
|
|
|
public Models.Change.DisplayMode Mode {
|
|
get { return (Models.Change.DisplayMode)GetValue(ModeProperty); }
|
|
set { SetValue(ModeProperty, value); }
|
|
}
|
|
|
|
public static readonly RoutedEvent ModeChangedEvent = EventManager.RegisterRoutedEvent(
|
|
"ModeChanged",
|
|
RoutingStrategy.Bubble,
|
|
typeof(RoutedEventHandler),
|
|
typeof(ChangeDisplaySwitcher));
|
|
|
|
public event RoutedEventHandler ModeChanged {
|
|
add { AddHandler(ModeChangedEvent, value); }
|
|
remove { RemoveHandler(ModeChangedEvent, value); }
|
|
}
|
|
|
|
private Path icon = null;
|
|
|
|
public ChangeDisplaySwitcher() {
|
|
icon = new Path();
|
|
icon.Data = FindResource("Icon.Tree") as Geometry;
|
|
icon.SetResourceReference(Path.FillProperty, "Brush.FG2");
|
|
|
|
Content = icon;
|
|
Style = FindResource("Style.Button") as Style;
|
|
BorderThickness = new Thickness(0);
|
|
ToolTip = App.Text("ChangeDisplayMode");
|
|
|
|
Click += OnClicked;
|
|
}
|
|
|
|
private void OnClicked(object sender, RoutedEventArgs e) {
|
|
if (ContextMenu != null) {
|
|
ContextMenu.IsOpen = true;
|
|
e.Handled = true;
|
|
return;
|
|
}
|
|
|
|
var menu = new ContextMenu();
|
|
menu.Placement = PlacementMode.Bottom;
|
|
menu.PlacementTarget = this;
|
|
menu.StaysOpen = false;
|
|
menu.Focusable = true;
|
|
|
|
FillMenu(menu, "ChangeDisplayMode.Tree", "Icon.Tree", Models.Change.DisplayMode.Tree);
|
|
FillMenu(menu, "ChangeDisplayMode.List", "Icon.List", Models.Change.DisplayMode.List);
|
|
FillMenu(menu, "ChangeDisplayMode.Grid", "Icon.Grid", Models.Change.DisplayMode.Grid);
|
|
|
|
ContextMenu = menu;
|
|
ContextMenu.IsOpen = true;
|
|
e.Handled = true;
|
|
}
|
|
|
|
private void FillMenu(ContextMenu menu, string header, string icon, Models.Change.DisplayMode useMode) {
|
|
var iconMode = new Path();
|
|
iconMode.Width = 12;
|
|
iconMode.Height = 12;
|
|
iconMode.Data = FindResource(icon) as Geometry;
|
|
iconMode.SetResourceReference(Path.FillProperty, "Brush.FG2");
|
|
|
|
var item = new MenuItem();
|
|
item.Icon = iconMode;
|
|
item.Header = App.Text(header);
|
|
item.Click += (o, e) => Mode = useMode;
|
|
|
|
menu.Items.Add(item);
|
|
}
|
|
|
|
private static void OnModeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
|
|
var elem = d as ChangeDisplaySwitcher;
|
|
if (elem != null) {
|
|
switch (elem.Mode) {
|
|
case Models.Change.DisplayMode.Tree:
|
|
elem.icon.Data = elem.FindResource("Icon.Tree") as Geometry;
|
|
break;
|
|
case Models.Change.DisplayMode.List:
|
|
elem.icon.Data = elem.FindResource("Icon.List") as Geometry;
|
|
break;
|
|
case Models.Change.DisplayMode.Grid:
|
|
elem.icon.Data = elem.FindResource("Icon.Grid") as Geometry;
|
|
break;
|
|
}
|
|
elem.RaiseEvent(new RoutedEventArgs(ModeChangedEvent));
|
|
}
|
|
}
|
|
}
|
|
}
|