using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Interop; using System.Windows.Media; using System.Windows.Media.Effects; using System.Windows.Threading; namespace AxCopilot.Views; internal sealed class PlanViewerWindow : Window { private const int WM_NCHITTEST = 132; private const int HTLEFT = 10; private const int HTRIGHT = 11; private const int HTTOP = 12; private const int HTTOPLEFT = 13; private const int HTTOPRIGHT = 14; private const int HTBOTTOM = 15; private const int HTBOTTOMLEFT = 16; private const int HTBOTTOMRIGHT = 17; private const int ResizeGrip = 12; private const string DragDataFormat = "PlanStepIndex"; private readonly StackPanel _stepsPanel; private readonly ScrollViewer _scrollViewer; private readonly StackPanel _btnPanel; private readonly Border _statusBar; private readonly TextBlock _statusText; private readonly TextBlock _progressText; private readonly HashSet _expandedSteps = new HashSet(); private int _dragSourceIndex = -1; private Point _dragStartPoint; private TaskCompletionSource? _tcs; private string _planText = ""; private List _steps = new List(); private int _currentStep = -1; private bool _isExecuting; public string PlanText => _planText; public List Steps => _steps; [DllImport("user32.dll")] private static extern nint SendMessage(nint hWnd, int msg, nint wParam, nint lParam); public PlanViewerWindow() { base.Width = 640.0; base.Height = 520.0; base.MinWidth = 480.0; base.MinHeight = 360.0; base.WindowStartupLocation = WindowStartupLocation.CenterScreen; base.WindowStyle = WindowStyle.None; base.AllowsTransparency = true; base.Background = Brushes.Transparent; base.ResizeMode = ResizeMode.CanResize; base.ShowInTaskbar = false; Brush background = (Application.Current.TryFindResource("LauncherBackground") as Brush) ?? new SolidColorBrush(Color.FromRgb(26, 27, 46)); Brush foreground = (Application.Current.TryFindResource("PrimaryText") as Brush) ?? Brushes.White; Brush brush = (Application.Current.TryFindResource("SecondaryText") as Brush) ?? Brushes.Gray; Brush brush2 = (Application.Current.TryFindResource("AccentColor") as Brush) ?? new SolidColorBrush(Color.FromRgb(75, 94, 252)); Brush borderBrush = (Application.Current.TryFindResource("BorderColor") as Brush) ?? Brushes.Gray; Border border = new Border { Background = background, CornerRadius = new CornerRadius(14.0), BorderBrush = borderBrush, BorderThickness = new Thickness(1.0), Effect = new DropShadowEffect { BlurRadius = 20.0, ShadowDepth = 4.0, Opacity = 0.35, Color = Colors.Black } }; Grid grid = new Grid { RowDefinitions = { new RowDefinition { Height = GridLength.Auto }, new RowDefinition { Height = GridLength.Auto }, new RowDefinition { Height = GridLength.Auto }, new RowDefinition { Height = new GridLength(1.0, GridUnitType.Star) }, new RowDefinition { Height = GridLength.Auto } } }; Grid grid2 = new Grid { Background = Brushes.Transparent, Margin = new Thickness(20.0, 14.0, 12.0, 0.0) }; grid2.MouseLeftButtonDown += TitleBar_MouseLeftButtonDown; StackPanel stackPanel = new StackPanel { Orientation = Orientation.Horizontal }; stackPanel.Children.Add(new TextBlock { Text = "\ue9d2", FontFamily = new FontFamily("Segoe MDL2 Assets"), FontSize = 18.0, Foreground = brush2, VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0.0, 0.0, 10.0, 0.0) }); stackPanel.Children.Add(new TextBlock { Text = "실행 계획", FontSize = 16.0, FontWeight = FontWeights.Bold, Foreground = foreground, VerticalAlignment = VerticalAlignment.Center }); grid2.Children.Add(stackPanel); Border border2 = new Border { Width = 32.0, Height = 32.0, CornerRadius = new CornerRadius(8.0), Background = Brushes.Transparent, Cursor = Cursors.Hand, HorizontalAlignment = HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Center, Child = new TextBlock { Text = "\ue8bb", FontFamily = new FontFamily("Segoe MDL2 Assets"), FontSize = 12.0, Foreground = brush, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center } }; border2.MouseEnter += delegate(object s, MouseEventArgs _) { ((Border)s).Background = new SolidColorBrush(Color.FromArgb(24, byte.MaxValue, byte.MaxValue, byte.MaxValue)); }; border2.MouseLeave += delegate(object s, MouseEventArgs _) { ((Border)s).Background = Brushes.Transparent; }; border2.MouseLeftButtonUp += delegate { Hide(); }; grid2.Children.Add(border2); Grid.SetRow(grid2, 0); grid.Children.Add(grid2); _statusBar = new Border { Visibility = Visibility.Collapsed, Margin = new Thickness(20.0, 8.0, 20.0, 0.0), Padding = new Thickness(12.0, 6.0, 12.0, 6.0), CornerRadius = new CornerRadius(8.0), Background = new SolidColorBrush(Color.FromArgb(21, ((SolidColorBrush)brush2).Color.R, ((SolidColorBrush)brush2).Color.G, ((SolidColorBrush)brush2).Color.B)) }; Grid grid3 = new Grid(); _statusText = new TextBlock { Text = "실행 중...", FontSize = 12.0, Foreground = brush2, VerticalAlignment = VerticalAlignment.Center }; grid3.Children.Add(_statusText); _progressText = new TextBlock { Text = "", FontSize = 12.0, Foreground = brush, HorizontalAlignment = HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Center }; grid3.Children.Add(_progressText); _statusBar.Child = grid3; Grid.SetRow(_statusBar, 1); grid.Children.Add(_statusBar); Brush hoverBg = (Application.Current.TryFindResource("ItemHoverBackground") as Brush) ?? new SolidColorBrush(Color.FromArgb(24, byte.MaxValue, byte.MaxValue, byte.MaxValue)); StackPanel stackPanel2 = new StackPanel { Orientation = Orientation.Horizontal, HorizontalAlignment = HorizontalAlignment.Right, Margin = new Thickness(20.0, 6.0, 20.0, 0.0) }; Border border3 = MakeToolbarButton("\ue70d", "모두 열기", brush, hoverBg); border3.MouseLeftButtonUp += delegate { for (int i = 0; i < _steps.Count; i++) { _expandedSteps.Add(i); } RenderSteps(); }; stackPanel2.Children.Add(border3); Border border4 = MakeToolbarButton("\ue70e", "모두 닫기", brush, hoverBg); border4.MouseLeftButtonUp += delegate { _expandedSteps.Clear(); RenderSteps(); }; stackPanel2.Children.Add(border4); Grid.SetRow(stackPanel2, 2); grid.Children.Add(stackPanel2); _scrollViewer = new ScrollViewer { VerticalScrollBarVisibility = ScrollBarVisibility.Auto, Margin = new Thickness(16.0, 6.0, 16.0, 0.0), Padding = new Thickness(4.0) }; _stepsPanel = new StackPanel(); _scrollViewer.Content = _stepsPanel; Grid.SetRow(_scrollViewer, 3); grid.Children.Add(_scrollViewer); _btnPanel = new StackPanel { Orientation = Orientation.Horizontal, HorizontalAlignment = HorizontalAlignment.Center, Margin = new Thickness(20.0, 12.0, 20.0, 16.0) }; Grid.SetRow(_btnPanel, 4); grid.Children.Add(_btnPanel); border.Child = grid; base.Content = border; base.SourceInitialized += delegate { nint handle = new WindowInteropHelper(this).Handle; HwndSource.FromHwnd(handle)?.AddHook(WndProc); }; } private static Border MakeToolbarButton(string icon, string label, Brush fg, Brush hoverBg) { Border border = new Border { CornerRadius = new CornerRadius(6.0), Padding = new Thickness(8.0, 3.0, 8.0, 3.0), Margin = new Thickness(0.0, 0.0, 4.0, 0.0), Background = Brushes.Transparent, Cursor = Cursors.Hand }; StackPanel stackPanel = new StackPanel { Orientation = Orientation.Horizontal }; stackPanel.Children.Add(new TextBlock { Text = icon, FontFamily = new FontFamily("Segoe MDL2 Assets"), FontSize = 9.0, Foreground = fg, VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0.0, 0.0, 4.0, 0.0) }); stackPanel.Children.Add(new TextBlock { Text = label, FontSize = 11.5, Foreground = fg }); border.Child = stackPanel; border.MouseEnter += delegate(object s, MouseEventArgs _) { ((Border)s).Background = hoverBg; }; border.MouseLeave += delegate(object s, MouseEventArgs _) { ((Border)s).Background = Brushes.Transparent; }; return border; } private void TitleBar_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (e.ClickCount == 2) { return; } try { DragMove(); } catch { } } private nint WndProc(nint hwnd, int msg, nint wParam, nint lParam, ref bool handled) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) if (msg == 132) { Point val = PointFromScreen(new Point((double)(short)(((IntPtr)lParam).ToInt32() & 0xFFFF), (double)(short)(((IntPtr)lParam).ToInt32() >> 16))); double actualWidth = base.ActualWidth; double actualHeight = base.ActualHeight; int num = 0; if (((Point)(ref val)).X < 12.0 && ((Point)(ref val)).Y < 12.0) { num = 13; } else if (((Point)(ref val)).X > actualWidth - 12.0 && ((Point)(ref val)).Y < 12.0) { num = 14; } else if (((Point)(ref val)).X < 12.0 && ((Point)(ref val)).Y > actualHeight - 12.0) { num = 16; } else if (((Point)(ref val)).X > actualWidth - 12.0 && ((Point)(ref val)).Y > actualHeight - 12.0) { num = 17; } else if (((Point)(ref val)).X < 12.0) { num = 10; } else if (((Point)(ref val)).X > actualWidth - 12.0) { num = 11; } else if (((Point)(ref val)).Y < 12.0) { num = 12; } else if (((Point)(ref val)).Y > actualHeight - 12.0) { num = 15; } if (num != 0) { handled = true; return num; } } return IntPtr.Zero; } public Task ShowPlanAsync(string planText, List steps, TaskCompletionSource tcs) { _planText = planText; _steps = steps; _tcs = tcs; _currentStep = -1; _isExecuting = false; _expandedSteps.Clear(); RenderSteps(); BuildApprovalButtons(); _statusBar.Visibility = Visibility.Collapsed; Show(); Activate(); return tcs.Task; } public void SwitchToExecutionMode() { _isExecuting = true; _statusBar.Visibility = Visibility.Visible; _statusText.Text = "▶ 계획 실행 중..."; _progressText.Text = $"0 / {_steps.Count}"; BuildExecutionButtons(); } public void UpdateCurrentStep(int stepIndex) { if (stepIndex >= 0 && stepIndex < _steps.Count) { _currentStep = stepIndex; _progressText.Text = $"{stepIndex + 1} / {_steps.Count}"; _expandedSteps.Add(stepIndex); RenderSteps(); } } public void MarkComplete() { _isExecuting = false; _statusText.Text = "✓ 계획 실행 완료"; _statusText.Foreground = new SolidColorBrush(Color.FromRgb(16, 185, 129)); _progressText.Text = $"{_steps.Count} / {_steps.Count}"; _currentStep = _steps.Count; RenderSteps(); BuildCloseButton(); } private void RenderSteps() { _stepsPanel.Children.Clear(); Brush brush = (Application.Current.TryFindResource("PrimaryText") as Brush) ?? Brushes.White; Brush secondaryText = (Application.Current.TryFindResource("SecondaryText") as Brush) ?? Brushes.Gray; Brush accentBrush = (Application.Current.TryFindResource("AccentColor") as Brush) ?? new SolidColorBrush(Color.FromRgb(75, 94, 252)); Brush brush2 = (Application.Current.TryFindResource("ItemBackground") as Brush) ?? new SolidColorBrush(Color.FromRgb(42, 43, 64)); Brush hoverBg = (Application.Current.TryFindResource("ItemHoverBackground") as Brush) ?? new SolidColorBrush(Color.FromArgb(24, byte.MaxValue, byte.MaxValue, byte.MaxValue)); bool flag = !_isExecuting && _currentStep < 0; for (int i = 0; i < _steps.Count; i++) { string text = _steps[i]; int capturedIdx = i; bool flag2 = i < _currentStep; bool flag3 = i == _currentStep; bool flag4 = i > _currentStep; bool flag5 = _expandedSteps.Contains(i); Border border = new Border { CornerRadius = new CornerRadius(10.0), Padding = new Thickness(10.0, 7.0, 10.0, 7.0), Margin = new Thickness(0.0, 0.0, 0.0, 5.0), Background = (flag3 ? new SolidColorBrush(Color.FromArgb(24, ((SolidColorBrush)accentBrush).Color.R, ((SolidColorBrush)accentBrush).Color.G, ((SolidColorBrush)accentBrush).Color.B)) : brush2), BorderBrush = (flag3 ? accentBrush : Brushes.Transparent), BorderThickness = new Thickness(flag3 ? 1.5 : 0.0), AllowDrop = flag }; border.Cursor = Cursors.Hand; border.MouseLeftButtonUp += delegate(object s, MouseButtonEventArgs e) { if (!(e.OriginalSource is Border { Tag: var tag }) || !(tag?.ToString() == "DragHandle")) { if (_expandedSteps.Contains(capturedIdx)) { _expandedSteps.Remove(capturedIdx); } else { _expandedSteps.Add(capturedIdx); } RenderSteps(); } }; Grid grid = new Grid(); int value = (flag ? 1 : 0); int value2 = ((!flag) ? 1 : 2); int value3 = (flag ? 3 : 2); int value4 = (flag ? 4 : (-1)); if (flag) { grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); } grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1.0, GridUnitType.Star) }); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); if (flag) { grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); } if (flag) { Color color = Color.FromArgb(85, 128, 128, 128); SolidColorBrush dimBrush = new SolidColorBrush(color); Border border2 = new Border { Tag = "DragHandle", Width = 20.0, Cursor = Cursors.SizeAll, Background = Brushes.Transparent, Margin = new Thickness(0.0, 0.0, 6.0, 0.0), VerticalAlignment = VerticalAlignment.Center, Child = new TextBlock { Text = "\ue8fd", FontFamily = new FontFamily("Segoe MDL2 Assets"), FontSize = 11.0, Foreground = dimBrush, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center } }; border2.MouseEnter += delegate(object s, MouseEventArgs _) { ((TextBlock)((Border)s).Child).Foreground = secondaryText; }; border2.MouseLeave += delegate(object s, MouseEventArgs _) { ((TextBlock)((Border)s).Child).Foreground = dimBrush; }; border2.PreviewMouseLeftButtonDown += delegate(object s, MouseButtonEventArgs e) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) _dragSourceIndex = capturedIdx; _dragStartPoint = e.GetPosition(_stepsPanel); e.Handled = true; }; border2.PreviewMouseMove += delegate(object s, MouseEventArgs e) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Expected O, but got Unknown if (_dragSourceIndex >= 0 && e.LeftButton == MouseButtonState.Pressed) { Point position = e.GetPosition(_stepsPanel); if (Math.Abs(((Point)(ref position)).X - ((Point)(ref _dragStartPoint)).X) > SystemParameters.MinimumHorizontalDragDistance || Math.Abs(((Point)(ref position)).Y - ((Point)(ref _dragStartPoint)).Y) > SystemParameters.MinimumVerticalDragDistance) { int dragSourceIndex = _dragSourceIndex; _dragSourceIndex = -1; DragDrop.DoDragDrop((DependencyObject)s, new DataObject("PlanStepIndex", dragSourceIndex), DragDropEffects.Move); ((DispatcherObject)this).Dispatcher.InvokeAsync((Action)RenderSteps); } } }; border2.PreviewMouseLeftButtonUp += delegate { _dragSourceIndex = -1; }; Grid.SetColumn(border2, 0); grid.Children.Add(border2); border.DragOver += delegate(object s, DragEventArgs e) { if (e.Data.GetDataPresent("PlanStepIndex")) { int num = (int)e.Data.GetData("PlanStepIndex"); if (num != capturedIdx) { ((Border)s).BorderBrush = accentBrush; ((Border)s).BorderThickness = new Thickness(1.5); e.Effects = DragDropEffects.Move; } else { e.Effects = DragDropEffects.None; } e.Handled = true; } }; border.DragLeave += delegate(object s, DragEventArgs _) { bool flag6 = _currentStep == capturedIdx; ((Border)s).BorderBrush = (flag6 ? accentBrush : Brushes.Transparent); ((Border)s).BorderThickness = new Thickness(flag6 ? 1.5 : 0.0); }; border.Drop += delegate(object s, DragEventArgs e) { if (!e.Data.GetDataPresent("PlanStepIndex")) { e.Handled = true; } else { int num = (int)e.Data.GetData("PlanStepIndex"); int num2 = capturedIdx; if (num != num2 && num >= 0 && num < _steps.Count) { string item = _steps[num]; _steps.RemoveAt(num); int index = ((num < num2) ? (num2 - 1) : num2); _steps.Insert(index, item); _expandedSteps.Clear(); RenderSteps(); } e.Handled = true; } }; } UIElement element = (flag2 ? new TextBlock { Text = "\ue73e", FontFamily = new FontFamily("Segoe MDL2 Assets"), FontSize = 13.0, Foreground = new SolidColorBrush(Color.FromRgb(16, 185, 129)), VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0.0, 0.0, 10.0, 0.0), Width = 20.0, TextAlignment = TextAlignment.Center } : ((!flag3) ? ((UIElement)new Border { Width = 22.0, Height = 22.0, CornerRadius = new CornerRadius(11.0), Background = new SolidColorBrush(Color.FromArgb(37, 128, 128, 128)), Margin = new Thickness(0.0, 0.0, 10.0, 0.0), VerticalAlignment = VerticalAlignment.Center, Child = new TextBlock { Text = $"{i + 1}", FontSize = 11.0, Foreground = secondaryText, FontWeight = FontWeights.SemiBold, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center } }) : ((UIElement)new TextBlock { Text = "\ue768", FontFamily = new FontFamily("Segoe MDL2 Assets"), FontSize = 13.0, Foreground = accentBrush, VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0.0, 0.0, 10.0, 0.0), Width = 20.0, TextAlignment = TextAlignment.Center }))); Grid.SetColumn(element, value); grid.Children.Add(element); TextBlock textBlock = new TextBlock { Text = text, FontSize = 13.0, Foreground = (flag2 ? secondaryText : brush), VerticalAlignment = VerticalAlignment.Center, Opacity = ((flag4 && _isExecuting) ? 0.6 : 1.0), TextDecorations = (flag2 ? TextDecorations.Strikethrough : null), Margin = new Thickness(0.0, 0.0, 4.0, 0.0) }; if (flag5) { textBlock.TextWrapping = TextWrapping.Wrap; textBlock.TextTrimming = TextTrimming.None; } else { textBlock.TextWrapping = TextWrapping.NoWrap; textBlock.TextTrimming = TextTrimming.CharacterEllipsis; textBlock.ToolTip = text; } Grid.SetColumn(textBlock, value2); grid.Children.Add(textBlock); Border border3 = new Border { Width = 22.0, Height = 22.0, CornerRadius = new CornerRadius(4.0), Background = Brushes.Transparent, Cursor = Cursors.Hand, VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0.0, 0.0, flag ? 4 : 0, 0.0), Child = new TextBlock { Text = (flag5 ? "\ue70e" : "\ue70d"), FontFamily = new FontFamily("Segoe MDL2 Assets"), FontSize = 9.0, Foreground = new SolidColorBrush(Color.FromArgb(112, 128, 128, 128)), HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center } }; border3.MouseEnter += delegate(object s, MouseEventArgs _) { ((Border)s).Background = hoverBg; }; border3.MouseLeave += delegate(object s, MouseEventArgs _) { ((Border)s).Background = Brushes.Transparent; }; border3.MouseLeftButtonUp += delegate(object _, MouseButtonEventArgs e) { if (_expandedSteps.Contains(capturedIdx)) { _expandedSteps.Remove(capturedIdx); } else { _expandedSteps.Add(capturedIdx); } RenderSteps(); e.Handled = true; }; Grid.SetColumn(border3, value3); grid.Children.Add(border3); if (flag) { StackPanel stackPanel = new StackPanel { Orientation = Orientation.Horizontal, VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(2.0, 0.0, 0.0, 0.0) }; if (i > 0) { Border border4 = CreateMiniButton("\ue70e", secondaryText, hoverBg); border4.ToolTip = "위로 이동"; border4.MouseLeftButtonUp += delegate(object _, MouseButtonEventArgs e) { SwapSteps(capturedIdx, capturedIdx - 1); e.Handled = true; }; stackPanel.Children.Add(border4); } if (i < _steps.Count - 1) { Border border5 = CreateMiniButton("\ue70d", secondaryText, hoverBg); border5.ToolTip = "아래로 이동"; border5.MouseLeftButtonUp += delegate(object _, MouseButtonEventArgs e) { SwapSteps(capturedIdx, capturedIdx + 1); e.Handled = true; }; stackPanel.Children.Add(border5); } Border border6 = CreateMiniButton("\ue70f", accentBrush, hoverBg); border6.ToolTip = "편집"; border6.MouseLeftButtonUp += delegate(object _, MouseButtonEventArgs e) { EditStep(capturedIdx); e.Handled = true; }; stackPanel.Children.Add(border6); Border border7 = CreateMiniButton("\ue74d", new SolidColorBrush(Color.FromRgb(220, 38, 38)), hoverBg); border7.ToolTip = "삭제"; border7.MouseLeftButtonUp += delegate(object _, MouseButtonEventArgs e) { if (_steps.Count > 1) { _steps.RemoveAt(capturedIdx); _expandedSteps.Remove(capturedIdx); RenderSteps(); } e.Handled = true; }; stackPanel.Children.Add(border7); Grid.SetColumn(stackPanel, value4); grid.Children.Add(stackPanel); } border.Child = grid; _stepsPanel.Children.Add(border); } if (flag) { Brush foreground = (Application.Current.TryFindResource("SecondaryText") as Brush) ?? Brushes.Gray; Brush hb2 = (Application.Current.TryFindResource("ItemHoverBackground") as Brush) ?? new SolidColorBrush(Color.FromArgb(24, byte.MaxValue, byte.MaxValue, byte.MaxValue)); Border border8 = new Border { CornerRadius = new CornerRadius(10.0), Padding = new Thickness(14.0, 8.0, 14.0, 8.0), Margin = new Thickness(0.0, 4.0, 0.0, 0.0), Background = Brushes.Transparent, BorderBrush = new SolidColorBrush(Color.FromArgb(48, 128, 128, 128)), BorderThickness = new Thickness(1.0), Cursor = Cursors.Hand }; StackPanel stackPanel2 = new StackPanel { Orientation = Orientation.Horizontal, HorizontalAlignment = HorizontalAlignment.Center }; stackPanel2.Children.Add(new TextBlock { Text = "\ue710", FontFamily = new FontFamily("Segoe MDL2 Assets"), FontSize = 12.0, Foreground = foreground, VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0.0, 0.0, 6.0, 0.0) }); stackPanel2.Children.Add(new TextBlock { Text = "단계 추가", FontSize = 12.0, Foreground = foreground }); border8.Child = stackPanel2; border8.MouseEnter += delegate(object s, MouseEventArgs _) { ((Border)s).Background = hb2; }; border8.MouseLeave += delegate(object s, MouseEventArgs _) { ((Border)s).Background = Brushes.Transparent; }; border8.MouseLeftButtonUp += delegate { _steps.Add("새 단계"); RenderSteps(); EditStep(_steps.Count - 1); }; _stepsPanel.Children.Add(border8); } if (_currentStep >= 0 && _stepsPanel.Children.Count > _currentStep) { _stepsPanel.UpdateLayout(); FrameworkElement frameworkElement = (FrameworkElement)_stepsPanel.Children[Math.Min(_currentStep, _stepsPanel.Children.Count - 1)]; frameworkElement.BringIntoView(); } } private void SwapSteps(int a, int b) { if (a >= 0 && b >= 0 && a < _steps.Count && b < _steps.Count) { List steps = _steps; List steps2 = _steps; string value = _steps[b]; string value2 = _steps[a]; steps[a] = value; steps2[b] = value2; RenderSteps(); } } private void EditStep(int index) { if (index < 0 || index >= _steps.Count) { return; } Brush brush = (Application.Current.TryFindResource("PrimaryText") as Brush) ?? Brushes.White; Brush background = (Application.Current.TryFindResource("ItemBackground") as Brush) ?? new SolidColorBrush(Color.FromRgb(42, 43, 64)); Brush borderBrush = (Application.Current.TryFindResource("AccentColor") as Brush) ?? new SolidColorBrush(Color.FromRgb(75, 94, 252)); if (index >= _stepsPanel.Children.Count) { return; } Border border = new Border { CornerRadius = new CornerRadius(10.0), Padding = new Thickness(10.0, 8.0, 10.0, 8.0), Margin = new Thickness(0.0, 0.0, 0.0, 5.0), Background = background, BorderBrush = borderBrush, BorderThickness = new Thickness(1.5) }; TextBox textBox = new TextBox { Text = _steps[index], FontSize = 13.0, Background = Brushes.Transparent, Foreground = brush, CaretBrush = brush, BorderThickness = new Thickness(0.0), AcceptsReturn = false, TextWrapping = TextWrapping.Wrap, Padding = new Thickness(4.0) }; int capturedIdx = index; textBox.KeyDown += delegate(object _, KeyEventArgs e) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Invalid comparison between Unknown and I4 //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Invalid comparison between Unknown and I4 if ((int)e.Key == 6) { _steps[capturedIdx] = textBox.Text.Trim(); RenderSteps(); e.Handled = true; } if ((int)e.Key == 13) { RenderSteps(); e.Handled = true; } }; textBox.LostFocus += delegate { _steps[capturedIdx] = textBox.Text.Trim(); RenderSteps(); }; border.Child = textBox; _stepsPanel.Children[index] = border; textBox.Focus(); textBox.SelectAll(); } private void BuildApprovalButtons() { _btnPanel.Children.Clear(); Brush brush = (Application.Current.TryFindResource("AccentColor") as Brush) ?? new SolidColorBrush(Color.FromRgb(75, 94, 252)); Border border = CreateActionButton("\ue73e", "승인", brush, Brushes.White, filled: true); border.MouseLeftButtonUp += delegate { _tcs?.TrySetResult(null); SwitchToExecutionMode(); }; _btnPanel.Children.Add(border); Border border2 = CreateActionButton("\ue70f", "수정 요청", brush, brush, filled: false); border2.MouseLeftButtonUp += delegate { ShowEditInput(); }; _btnPanel.Children.Add(border2); Border border3 = CreateActionButton("\ue72c", "재확인", (Application.Current.TryFindResource("SecondaryText") as Brush) ?? Brushes.Gray, (Application.Current.TryFindResource("PrimaryText") as Brush) ?? Brushes.White, filled: false); border3.MouseLeftButtonUp += delegate { _tcs?.TrySetResult("계획을 다시 검토하고 더 구체적으로 수정해주세요."); }; _btnPanel.Children.Add(border3); SolidColorBrush solidColorBrush = new SolidColorBrush(Color.FromRgb(220, 38, 38)); Border border4 = CreateActionButton("\ue711", "취소", solidColorBrush, solidColorBrush, filled: false); border4.MouseLeftButtonUp += delegate { _tcs?.TrySetResult("취소"); Hide(); }; _btnPanel.Children.Add(border4); } private void BuildExecutionButtons() { _btnPanel.Children.Clear(); Brush borderColor = (Application.Current.TryFindResource("SecondaryText") as Brush) ?? Brushes.Gray; Border border = CreateActionButton("\ue921", "숨기기", borderColor, (Application.Current.TryFindResource("PrimaryText") as Brush) ?? Brushes.White, filled: false); border.MouseLeftButtonUp += delegate { Hide(); }; _btnPanel.Children.Add(border); } private void BuildCloseButton() { _btnPanel.Children.Clear(); Brush borderColor = (Application.Current.TryFindResource("AccentColor") as Brush) ?? new SolidColorBrush(Color.FromRgb(75, 94, 252)); Border border = CreateActionButton("\ue73e", "닫기", borderColor, Brushes.White, filled: true); border.MouseLeftButtonUp += delegate { Hide(); }; _btnPanel.Children.Add(border); } private void ShowEditInput() { Border border = new Border(); border.Margin = new Thickness(20.0, 0.0, 20.0, 12.0); border.Padding = new Thickness(12.0, 8.0, 12.0, 8.0); border.CornerRadius = new CornerRadius(10.0); border.Background = (Application.Current.TryFindResource("ItemBackground") as Brush) ?? new SolidColorBrush(Color.FromRgb(42, 43, 64)); Border border2 = border; StackPanel stackPanel = new StackPanel(); stackPanel.Children.Add(new TextBlock { Text = "수정 사항을 입력하세요:", FontSize = 11.5, Foreground = ((Application.Current.TryFindResource("SecondaryText") as Brush) ?? Brushes.Gray), Margin = new Thickness(0.0, 0.0, 0.0, 6.0) }); TextBox textBox = new TextBox { MinHeight = 44.0, MaxHeight = 120.0, AcceptsReturn = true, TextWrapping = TextWrapping.Wrap, FontSize = 13.0, Background = ((Application.Current.TryFindResource("LauncherBackground") as Brush) ?? new SolidColorBrush(Color.FromRgb(26, 27, 46))), Foreground = ((Application.Current.TryFindResource("PrimaryText") as Brush) ?? Brushes.White), CaretBrush = ((Application.Current.TryFindResource("PrimaryText") as Brush) ?? Brushes.White), BorderBrush = ((Application.Current.TryFindResource("BorderColor") as Brush) ?? Brushes.Gray), BorderThickness = new Thickness(1.0), Padding = new Thickness(10.0, 8.0, 10.0, 8.0) }; stackPanel.Children.Add(textBox); Brush background = (Application.Current.TryFindResource("AccentColor") as Brush) ?? new SolidColorBrush(Color.FromRgb(75, 94, 252)); Border border3 = new Border { Background = background, CornerRadius = new CornerRadius(8.0), Padding = new Thickness(14.0, 6.0, 14.0, 6.0), Margin = new Thickness(0.0, 8.0, 0.0, 0.0), Cursor = Cursors.Hand, HorizontalAlignment = HorizontalAlignment.Right, Child = new TextBlock { Text = "전송", FontSize = 12.5, FontWeight = FontWeights.SemiBold, Foreground = Brushes.White } }; border3.MouseEnter += delegate(object s, MouseEventArgs _) { ((Border)s).Opacity = 0.85; }; border3.MouseLeave += delegate(object s, MouseEventArgs _) { ((Border)s).Opacity = 1.0; }; border3.MouseLeftButtonUp += delegate { string text = textBox.Text.Trim(); if (!string.IsNullOrEmpty(text)) { _tcs?.TrySetResult(text); } }; stackPanel.Children.Add(border3); border2.Child = stackPanel; if (!(_btnPanel.Parent is Grid grid)) { return; } for (int num = grid.Children.Count - 1; num >= 0; num--) { if (grid.Children[num] is Border { Tag: var tag } && tag?.ToString() == "EditPanel") { grid.Children.RemoveAt(num); } } border2.Tag = "EditPanel"; Grid.SetRow(border2, 4); grid.Children.Add(border2); _btnPanel.Margin = new Thickness(20.0, 0.0, 20.0, 16.0); textBox.Focus(); } private static Border CreateMiniButton(string icon, Brush fg, Brush hoverBg) { Border border = new Border { Width = 24.0, Height = 24.0, CornerRadius = new CornerRadius(6.0), Background = Brushes.Transparent, Cursor = Cursors.Hand, Margin = new Thickness(1.0, 0.0, 1.0, 0.0), Child = new TextBlock { Text = icon, FontFamily = new FontFamily("Segoe MDL2 Assets"), FontSize = 10.0, Foreground = fg, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center } }; border.MouseEnter += delegate(object s, MouseEventArgs _) { ((Border)s).Background = hoverBg; }; border.MouseLeave += delegate(object s, MouseEventArgs _) { ((Border)s).Background = Brushes.Transparent; }; return border; } private static Border CreateActionButton(string icon, string text, Brush borderColor, Brush textColor, bool filled) { Color color = ((SolidColorBrush)borderColor).Color; Border border = new Border { CornerRadius = new CornerRadius(12.0), Padding = new Thickness(16.0, 8.0, 16.0, 8.0), Margin = new Thickness(4.0, 0.0, 4.0, 0.0), Cursor = Cursors.Hand, Background = (filled ? borderColor : new SolidColorBrush(Color.FromArgb(24, color.R, color.G, color.B))), BorderBrush = (filled ? Brushes.Transparent : new SolidColorBrush(Color.FromArgb(128, color.R, color.G, color.B))), BorderThickness = new Thickness(filled ? 0.0 : 1.2) }; StackPanel stackPanel = new StackPanel { Orientation = Orientation.Horizontal }; stackPanel.Children.Add(new TextBlock { Text = icon, FontFamily = new FontFamily("Segoe MDL2 Assets"), FontSize = 12.0, Foreground = (filled ? Brushes.White : textColor), VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0.0, 0.0, 6.0, 0.0) }); stackPanel.Children.Add(new TextBlock { Text = text, FontSize = 12.5, FontWeight = FontWeights.SemiBold, Foreground = (filled ? Brushes.White : textColor) }); border.Child = stackPanel; border.MouseEnter += delegate(object s, MouseEventArgs _) { ((Border)s).Opacity = 0.85; }; border.MouseLeave += delegate(object s, MouseEventArgs _) { ((Border)s).Opacity = 1.0; }; return border; } }