using System; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Input; namespace QuickClaude { // Right-click menu in QuickClaude's own look: dark, square, Consolas, no theme chrome or blue highlight. public static class DarkMenu { // target: the text box whose Cut/Copy/Paste the menu should offer (null for none). public static ContextMenu Make(TextBox target, Action newConversation) { var menu = new ContextMenu { Template = MenuTemplate, FontFamily = MainWindow.Mono, FontSize = MainWindow.TextSize, Foreground = ConfirmWindow.Text, FocusVisualStyle = null, HasDropShadow = false }; if (target != null) { if (!target.IsReadOnly) menu.Items.Add(Item("Cut", ApplicationCommands.Cut, target)); menu.Items.Add(Item("Copy", ApplicationCommands.Copy, target)); if (!target.IsReadOnly) menu.Items.Add(Item("Paste", ApplicationCommands.Paste, target)); menu.Items.Add(new Separator { Template = SeparatorTemplate }); } var fresh = Item("New conversation", null, null); fresh.Click += (s, e) => newConversation(); menu.Items.Add(fresh); return menu; } static MenuItem Item(string header, ICommand command, IInputElement target) => new MenuItem { Header = header, Command = command, CommandTarget = target, Template = ItemTemplate, FocusVisualStyle = null, Foreground = ConfirmWindow.Text }; static readonly ControlTemplate MenuTemplate = MakeMenuTemplate(); static readonly ControlTemplate ItemTemplate = MakeItemTemplate(); static readonly ControlTemplate SeparatorTemplate = MakeSeparatorTemplate(); static ControlTemplate MakeMenuTemplate() { var bd = new FrameworkElementFactory(typeof(Border)); bd.SetValue(Border.BackgroundProperty, ConfirmWindow.Panel); bd.SetValue(Border.BorderBrushProperty, ConfirmWindow.Edge); bd.SetValue(Border.BorderThicknessProperty, new Thickness(1)); bd.SetValue(Border.PaddingProperty, new Thickness(0, 2, 0, 2)); var items = new FrameworkElementFactory(typeof(StackPanel)); items.SetValue(Panel.IsItemsHostProperty, true); bd.AppendChild(items); var t = new ControlTemplate(typeof(ContextMenu)) { VisualTree = bd }; t.Seal(); return t; } // Header only: no icon column, no gesture text. Faint fill when highlighted, dimmed when disabled. static ControlTemplate MakeItemTemplate() { var bd = new FrameworkElementFactory(typeof(Border), "bd"); bd.SetValue(Border.BackgroundProperty, System.Windows.Media.Brushes.Transparent); bd.SetValue(Border.PaddingProperty, new Thickness(10, 3, 16, 3)); var cp = new FrameworkElementFactory(typeof(ContentPresenter)); cp.SetValue(ContentPresenter.ContentSourceProperty, "Header"); cp.SetValue(ContentPresenter.RecognizesAccessKeyProperty, true); bd.AppendChild(cp); var t = new ControlTemplate(typeof(MenuItem)) { VisualTree = bd }; var hi = new Trigger { Property = MenuItem.IsHighlightedProperty, Value = true }; hi.Setters.Add(new Setter(Border.BackgroundProperty, ConfirmWindow.Hover, "bd")); var off = new Trigger { Property = UIElement.IsEnabledProperty, Value = false }; off.Setters.Add(new Setter(UIElement.OpacityProperty, 0.4, "bd")); t.Triggers.Add(hi); t.Triggers.Add(off); t.Seal(); return t; } static ControlTemplate MakeSeparatorTemplate() { var line = new FrameworkElementFactory(typeof(Border)); line.SetValue(FrameworkElement.HeightProperty, 1.0); line.SetValue(FrameworkElement.MarginProperty, new Thickness(0, 3, 0, 3)); line.SetValue(Border.BackgroundProperty, ConfirmWindow.Edge); var t = new ControlTemplate(typeof(Separator)) { VisualTree = line }; t.Seal(); return t; } } }