Files

336 lines
8.3 KiB
C#

using System;
using System.CodeDom.Compiler;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Threading;
namespace AxCopilot.Views;
public class TrayMenuWindow : Window, IComponentConnector
{
private struct POINT
{
public int X;
public int Y;
}
private DispatcherTimer? _autoCloseTimer;
private static readonly Brush BulbOnBrush = new SolidColorBrush(Color.FromRgb(byte.MaxValue, 185, 0));
private static readonly Brush BulbOffBrush = new SolidColorBrush(Color.FromRgb(120, 120, 140));
internal Border RootBorder;
internal StackPanel MenuPanel;
private bool _contentLoaded;
public event Action? Opening;
public TrayMenuWindow()
{
InitializeComponent();
base.MouseLeave += delegate
{
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_0033: Expected O, but got Unknown
DispatcherTimer? autoCloseTimer = _autoCloseTimer;
if (autoCloseTimer != null)
{
autoCloseTimer.Stop();
}
_autoCloseTimer = new DispatcherTimer
{
Interval = TimeSpan.FromMilliseconds(400.0)
};
_autoCloseTimer.Tick += delegate
{
_autoCloseTimer.Stop();
Hide();
};
_autoCloseTimer.Start();
};
base.MouseEnter += delegate
{
DispatcherTimer? autoCloseTimer = _autoCloseTimer;
if (autoCloseTimer != null)
{
autoCloseTimer.Stop();
}
};
}
public TrayMenuWindow AddItem(string glyph, string text, Action onClick)
{
Border border = CreateItemBorder(glyph, text);
border.MouseLeftButtonUp += delegate
{
Hide();
onClick();
};
MenuPanel.Children.Add(border);
return this;
}
public TrayMenuWindow AddItem(string glyph, string text, Action onClick, out Border itemRef)
{
Border border = CreateItemBorder(glyph, text);
border.MouseLeftButtonUp += delegate
{
Hide();
onClick();
};
MenuPanel.Children.Add(border);
itemRef = border;
return this;
}
public TrayMenuWindow AddToggleItem(string glyph, string text, bool initialChecked, Action<bool> onToggle, out Func<bool> getChecked, out Action<string> setText)
{
TextBlock glyphBlock = new TextBlock
{
Text = glyph,
FontFamily = new FontFamily("Segoe MDL2 Assets"),
FontSize = 14.0,
Foreground = (initialChecked ? BulbOnBrush : BulbOffBrush),
VerticalAlignment = VerticalAlignment.Center,
Width = 20.0,
TextAlignment = TextAlignment.Center
};
if (initialChecked)
{
glyphBlock.Effect = new DropShadowEffect
{
Color = Color.FromRgb(byte.MaxValue, 185, 0),
BlurRadius = 12.0,
ShadowDepth = 0.0,
Opacity = 0.7
};
}
TextBlock label = new TextBlock
{
Text = text,
FontSize = 13.0,
VerticalAlignment = VerticalAlignment.Center
};
label.SetResourceReference(TextBlock.ForegroundProperty, "PrimaryText");
StackPanel child = new StackPanel
{
Orientation = Orientation.Horizontal,
Children =
{
(UIElement)glyphBlock,
(UIElement)label
}
};
Border border = new Border
{
Child = child,
CornerRadius = new CornerRadius(6.0),
Padding = new Thickness(12.0, 8.0, 16.0, 8.0),
Cursor = Cursors.Hand,
Background = Brushes.Transparent
};
border.MouseEnter += delegate
{
border.Background = (TryFindResource("ItemHoverBackground") as Brush) ?? Brushes.Transparent;
};
border.MouseLeave += delegate
{
border.Background = Brushes.Transparent;
};
border.MouseLeftButtonUp += delegate
{
initialChecked = !initialChecked;
glyphBlock.Foreground = (initialChecked ? BulbOnBrush : BulbOffBrush);
glyphBlock.Effect = (initialChecked ? new DropShadowEffect
{
Color = Color.FromRgb(byte.MaxValue, 185, 0),
BlurRadius = 12.0,
ShadowDepth = 0.0,
Opacity = 0.7
} : null);
onToggle(initialChecked);
};
getChecked = () => initialChecked;
setText = delegate(string t)
{
label.Text = t;
};
MenuPanel.Children.Add(border);
return this;
}
public TrayMenuWindow AddSeparator()
{
Border border = new Border
{
Height = 1.0,
Margin = new Thickness(16.0, 5.0, 16.0, 5.0)
};
border.SetResourceReference(Border.BackgroundProperty, "SeparatorColor");
MenuPanel.Children.Add(border);
return this;
}
public void ShowAtTray()
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
Rect workArea = SystemParameters.WorkArea;
base.Opacity = 0.0;
Show();
UpdateLayout();
double actualWidth = base.ActualWidth;
double actualHeight = base.ActualHeight;
POINT cursorPosition = GetCursorPosition();
double pixelsPerDip = VisualTreeHelper.GetDpi(this).PixelsPerDip;
double num = (double)cursorPosition.X / pixelsPerDip;
double num2 = (double)cursorPosition.Y / pixelsPerDip;
double num3 = num - actualWidth - 8.0;
double num4 = num2 - actualHeight - 8.0;
if (num3 < ((Rect)(ref workArea)).Left)
{
num3 = ((Rect)(ref workArea)).Left + 4.0;
}
if (num4 < ((Rect)(ref workArea)).Top)
{
num4 = ((Rect)(ref workArea)).Top + 4.0;
}
if (num3 + actualWidth > ((Rect)(ref workArea)).Right)
{
num3 = ((Rect)(ref workArea)).Right - actualWidth - 4.0;
}
if (num4 + actualHeight > ((Rect)(ref workArea)).Bottom)
{
num4 = ((Rect)(ref workArea)).Bottom - actualHeight - 4.0;
}
base.Left = num3;
base.Top = num4;
Activate();
DoubleAnimation animation = new DoubleAnimation(0.0, 1.0, TimeSpan.FromMilliseconds(120.0))
{
EasingFunction = new CubicEase
{
EasingMode = EasingMode.EaseOut
}
};
BeginAnimation(UIElement.OpacityProperty, animation);
}
public void ShowWithUpdate()
{
this.Opening?.Invoke();
ShowAtTray();
}
private Border CreateItemBorder(string glyph, string text)
{
TextBlock glyphBlock = new TextBlock
{
Text = glyph,
FontFamily = new FontFamily("Segoe MDL2 Assets"),
FontSize = 14.0,
VerticalAlignment = VerticalAlignment.Center,
Width = 20.0,
TextAlignment = TextAlignment.Center
};
glyphBlock.SetResourceReference(TextBlock.ForegroundProperty, "SecondaryText");
TextBlock textBlock = new TextBlock
{
Text = text,
FontSize = 13.0,
VerticalAlignment = VerticalAlignment.Center
};
textBlock.SetResourceReference(TextBlock.ForegroundProperty, "PrimaryText");
StackPanel child = new StackPanel
{
Orientation = Orientation.Horizontal,
Children =
{
(UIElement)glyphBlock,
(UIElement)textBlock
}
};
Border border = new Border
{
Child = child,
CornerRadius = new CornerRadius(6.0),
Padding = new Thickness(12.0, 8.0, 16.0, 8.0),
Cursor = Cursors.Hand,
Background = Brushes.Transparent
};
border.MouseEnter += delegate
{
border.Background = (TryFindResource("ItemHoverBackground") as Brush) ?? Brushes.Transparent;
glyphBlock.Foreground = (TryFindResource("AccentColor") as Brush) ?? Brushes.Blue;
};
border.MouseLeave += delegate
{
border.Background = Brushes.Transparent;
glyphBlock.SetResourceReference(TextBlock.ForegroundProperty, "SecondaryText");
};
return border;
}
private void Window_Deactivated(object sender, EventArgs e)
{
Hide();
}
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetCursorPos(out POINT lpPoint);
private static POINT GetCursorPosition()
{
GetCursorPos(out var lpPoint);
return lpPoint;
}
[DebuggerNonUserCode]
[GeneratedCode("PresentationBuildTasks", "10.0.5.0")]
public void InitializeComponent()
{
if (!_contentLoaded)
{
_contentLoaded = true;
Uri resourceLocator = new Uri("/AxCopilot;component/views/traymenuwindow.xaml", UriKind.Relative);
Application.LoadComponent(this, resourceLocator);
}
}
[DebuggerNonUserCode]
[GeneratedCode("PresentationBuildTasks", "10.0.5.0")]
[EditorBrowsable(EditorBrowsableState.Never)]
void IComponentConnector.Connect(int connectionId, object target)
{
switch (connectionId)
{
case 1:
((TrayMenuWindow)target).Deactivated += Window_Deactivated;
break;
case 2:
RootBorder = (Border)target;
break;
case 3:
MenuPanel = (StackPanel)target;
break;
default:
_contentLoaded = true;
break;
}
}
}