Files
AX-Copilot-Codex/.decompiledproj/AxCopilot/Views/CustomPresetDialog.cs

665 lines
18 KiB
C#

using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Effects;
using System.Windows.Shapes;
namespace AxCopilot.Views;
internal sealed class CustomPresetDialog : Window
{
private readonly TextBox _nameBox;
private readonly TextBox _descBox;
private readonly TextBox _promptBox;
private readonly ComboBox _tabCombo;
private string _selectedColor;
private string _selectedSymbol;
private Border? _iconPreview;
private TextBlock? _iconPreviewText;
private static readonly (string Label, string Hex)[] Colors = new(string, string)[10]
{
("인디고", "#6366F1"),
("블루", "#3B82F6"),
("티일", "#14B8A6"),
("그린", "#22C55E"),
("옐로우", "#EAB308"),
("오렌지", "#F97316"),
("레드", "#EF4444"),
("핑크", "#EC4899"),
("퍼플", "#A855F7"),
("슬레이트", "#64748B")
};
private static readonly (string Category, (string Label, string Symbol)[] Icons)[] IconSets = new(string, (string, string)[])[5]
{
("업무", new(string, string)[8]
{
("일반", "\ue771"),
("문서", "\ue8a5"),
("메일", "\ue715"),
("캘린더", "\ue787"),
("차트", "\ue9d9"),
("발표", "\ue7f4"),
("계산기", "\ue8ef"),
("메모", "\ue70b")
}),
("기술", new(string, string)[8]
{
("코드", "\ue943"),
("설정", "\ue713"),
("데이터", "\uea86"),
("검색", "\ue721"),
("보안", "\ue72e"),
("서버", "\ue839"),
("버그", "\uebe8"),
("배포", "\ue7f8")
}),
("커뮤니케이션", new(string, string)[8]
{
("대화", "\ue8bd"),
("사람", "\ue77b"),
("팀", "\ue716"),
("전화", "\ue717"),
("알림", "\uea8f"),
("공유", "\ue72d"),
("피드백", "\ue939"),
("질문", "\ue897")
}),
("콘텐츠", new(string, string)[8]
{
("사진", "\ue722"),
("동영상", "\ue714"),
("음악", "\ue8d6"),
("글쓰기", "\ue70f"),
("책", "\ue82d"),
("웹", "\ue774"),
("디자인", "\ue790"),
("다운로드", "\ue896")
}),
("분석", new(string, string)[8]
{
("인사이트", "\ue9d9"),
("대시보드", "\ue809"),
("리포트", "\ue9f9"),
("트렌드", "\ue8a1"),
("필터", "\ue71c"),
("목표", "\ue7c1"),
("비교", "\ue8fd"),
("측정", "\ue7c8")
})
};
public string PresetName => _nameBox.Text.Trim();
public string PresetDescription => _descBox.Text.Trim();
public string PresetSystemPrompt => _promptBox.Text.Trim();
public string PresetTab => (_tabCombo.SelectedItem as ComboBoxItem)?.Tag?.ToString() ?? "Chat";
public string PresetColor => _selectedColor;
public string PresetSymbol => _selectedSymbol;
public CustomPresetDialog(string existingName = "", string existingDesc = "", string existingPrompt = "", string existingColor = "#6366F1", string existingSymbol = "\ue713", string existingTab = "Chat")
{
bool flag = !string.IsNullOrEmpty(existingName);
base.Title = (flag ? "프리셋 편집" : "프리셋 추가");
base.Width = 520.0;
base.SizeToContent = SizeToContent.Height;
base.WindowStartupLocation = WindowStartupLocation.CenterOwner;
base.ResizeMode = ResizeMode.NoResize;
base.WindowStyle = WindowStyle.None;
base.AllowsTransparency = true;
base.Background = Brushes.Transparent;
_selectedColor = existingColor;
_selectedSymbol = existingSymbol;
Brush background = (Application.Current.TryFindResource("LauncherBackground") as Brush) ?? new SolidColorBrush(Color.FromRgb(26, 27, 46));
Brush primaryText = (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) ?? Brushes.Blue;
Brush brush3 = (Application.Current.TryFindResource("ItemBackground") as Brush) ?? new SolidColorBrush(Color.FromRgb(42, 43, 64));
Brush brush4 = (Application.Current.TryFindResource("BorderColor") as Brush) ?? Brushes.Gray;
Border border = new Border
{
Background = background,
CornerRadius = new CornerRadius(16.0),
BorderBrush = brush4,
BorderThickness = new Thickness(1.0),
Padding = new Thickness(28.0, 24.0, 28.0, 24.0),
Effect = new DropShadowEffect
{
BlurRadius = 24.0,
ShadowDepth = 4.0,
Opacity = 0.3,
Color = System.Windows.Media.Colors.Black
}
};
StackPanel stackPanel = new StackPanel();
StackPanel stackPanel2 = new StackPanel
{
Orientation = Orientation.Horizontal,
Margin = new Thickness(0.0, 0.0, 0.0, 20.0)
};
stackPanel2.Children.Add(new TextBlock
{
Text = "\ue710",
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)
});
stackPanel2.Children.Add(new TextBlock
{
Text = (flag ? "프리셋 편집" : "새 커스텀 프리셋"),
FontSize = 17.0,
FontWeight = FontWeights.Bold,
Foreground = primaryText,
VerticalAlignment = VerticalAlignment.Center
});
stackPanel.Children.Add(stackPanel2);
AddLabel(stackPanel, "프리셋 이름", primaryText);
AddHint(stackPanel, "대화 주제 버튼에 표시될 이름입니다", brush);
_nameBox = CreateTextBox(existingName, primaryText, brush3, brush2, brush4);
stackPanel.Children.Add(new Border
{
CornerRadius = new CornerRadius(8.0),
ClipToBounds = true,
Child = _nameBox
});
AddSeparator(stackPanel, brush4);
AddLabel(stackPanel, "설명", primaryText);
AddHint(stackPanel, "프리셋 카드 하단에 표시될 짧은 설명입니다", brush);
_descBox = CreateTextBox(existingDesc, primaryText, brush3, brush2, brush4);
stackPanel.Children.Add(new Border
{
CornerRadius = new CornerRadius(8.0),
ClipToBounds = true,
Child = _descBox
});
AddSeparator(stackPanel, brush4);
AddLabel(stackPanel, "아이콘 & 배경색", primaryText);
StackPanel stackPanel3 = new StackPanel
{
Orientation = Orientation.Horizontal,
Margin = new Thickness(0.0, 0.0, 0.0, 8.0)
};
_iconPreview = new Border
{
Width = 48.0,
Height = 48.0,
CornerRadius = new CornerRadius(24.0),
Background = new SolidColorBrush(ParseColor(_selectedColor))
{
Opacity = 0.2
},
Cursor = Cursors.Hand,
Margin = new Thickness(0.0, 0.0, 16.0, 0.0),
ToolTip = "아이콘 선택"
};
_iconPreviewText = new TextBlock
{
Text = _selectedSymbol,
FontFamily = new FontFamily("Segoe MDL2 Assets"),
FontSize = 20.0,
Foreground = BrushFromHex(_selectedColor),
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center
};
_iconPreview.Child = _iconPreviewText;
_iconPreview.MouseLeftButtonDown += delegate
{
ShowIconPickerPopup();
};
stackPanel3.Children.Add(_iconPreview);
StackPanel stackPanel4 = new StackPanel
{
Margin = new Thickness(0.0, 0.0, 16.0, 0.0)
};
stackPanel4.Children.Add(new TextBlock
{
Text = "탭",
FontSize = 11.0,
Foreground = brush,
Margin = new Thickness(0.0, 0.0, 0.0, 4.0)
});
_tabCombo = new ComboBox
{
Width = 100.0,
FontSize = 12.0,
Foreground = primaryText,
Background = brush3,
BorderBrush = brush4,
BorderThickness = new Thickness(1.0),
Padding = new Thickness(6.0, 4.0, 6.0, 4.0)
};
_tabCombo.Items.Add(new ComboBoxItem
{
Content = "Chat",
Tag = "Chat",
IsSelected = (existingTab == "Chat")
});
_tabCombo.Items.Add(new ComboBoxItem
{
Content = "Cowork",
Tag = "Cowork",
IsSelected = (existingTab == "Cowork")
});
stackPanel4.Children.Add(_tabCombo);
stackPanel3.Children.Add(stackPanel4);
StackPanel stackPanel5 = new StackPanel
{
Children = { (UIElement)new TextBlock
{
Text = "배경색",
FontSize = 11.0,
Foreground = brush,
Margin = new Thickness(0.0, 0.0, 0.0, 4.0)
} }
};
WrapPanel colorPanel = new WrapPanel();
(string, string)[] colors = Colors;
for (int num = 0; num < colors.Length; num++)
{
(string, string) tuple = colors[num];
string item = tuple.Item1;
string item2 = tuple.Item2;
string colorHex = item2;
Border border2 = new Border
{
Width = 22.0,
Height = 22.0,
CornerRadius = new CornerRadius(11.0),
Background = BrushFromHex(item2),
Margin = new Thickness(0.0, 0.0, 5.0, 4.0),
Cursor = Cursors.Hand,
BorderThickness = new Thickness(2.0),
BorderBrush = ((item2 == _selectedColor) ? primaryText : Brushes.Transparent),
ToolTip = item
};
border2.MouseLeftButtonDown += delegate(object s, MouseButtonEventArgs _)
{
_selectedColor = colorHex;
foreach (object child in colorPanel.Children)
{
if (child is Border border3)
{
border3.BorderBrush = Brushes.Transparent;
}
}
if (s is Border border4)
{
border4.BorderBrush = primaryText;
}
UpdateIconPreview();
};
colorPanel.Children.Add(border2);
}
stackPanel5.Children.Add(colorPanel);
stackPanel3.Children.Add(stackPanel5);
stackPanel.Children.Add(stackPanel3);
AddSeparator(stackPanel, brush4);
AddLabel(stackPanel, "시스템 프롬프트", primaryText);
AddHint(stackPanel, "AI가 이 프리셋에서 따를 지침입니다. 비워두면 기본 프롬프트가 사용됩니다.", brush);
_promptBox = CreateTextBox(existingPrompt, primaryText, brush3, brush2, brush4, multiline: true);
stackPanel.Children.Add(new Border
{
CornerRadius = new CornerRadius(8.0),
ClipToBounds = true,
Child = _promptBox
});
TextBlock charCount = new TextBlock
{
FontSize = 10.5,
Foreground = brush,
Margin = new Thickness(0.0, 6.0, 0.0, 0.0),
HorizontalAlignment = HorizontalAlignment.Right
};
UpdateCharCount(charCount);
_promptBox.TextChanged += delegate
{
UpdateCharCount(charCount);
};
stackPanel.Children.Add(charCount);
StackPanel stackPanel6 = new StackPanel
{
Orientation = Orientation.Horizontal,
HorizontalAlignment = HorizontalAlignment.Right,
Margin = new Thickness(0.0, 20.0, 0.0, 0.0)
};
Button button = new Button
{
Content = "취소",
Width = 80.0,
Padding = new Thickness(0.0, 8.0, 0.0, 8.0),
Margin = new Thickness(0.0, 0.0, 10.0, 0.0),
Background = Brushes.Transparent,
Foreground = brush,
BorderBrush = brush4,
BorderThickness = new Thickness(1.0),
Cursor = Cursors.Hand,
FontSize = 13.0
};
button.Click += delegate
{
base.DialogResult = false;
Close();
};
stackPanel6.Children.Add(button);
Button button2 = new Button
{
Content = (flag ? "저장" : "추가"),
Width = 80.0,
Padding = new Thickness(0.0, 8.0, 0.0, 8.0),
Background = brush2,
Foreground = Brushes.White,
BorderThickness = new Thickness(0.0),
Cursor = Cursors.Hand,
FontSize = 13.0,
FontWeight = FontWeights.SemiBold
};
button2.Click += delegate
{
if (string.IsNullOrWhiteSpace(_nameBox.Text))
{
CustomMessageBox.Show("프리셋 이름을 입력하세요.", "입력 오류", MessageBoxButton.OK, MessageBoxImage.Exclamation);
_nameBox.Focus();
}
else
{
base.DialogResult = true;
Close();
}
};
stackPanel6.Children.Add(button2);
stackPanel.Children.Add(stackPanel6);
border.Child = stackPanel;
base.Content = border;
base.KeyDown += delegate(object _, KeyEventArgs ke)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0009: Invalid comparison between Unknown and I4
if ((int)ke.Key == 13)
{
base.DialogResult = false;
Close();
}
};
base.Loaded += delegate
{
_nameBox.Focus();
_nameBox.SelectAll();
};
border.MouseLeftButtonDown += delegate(object _, MouseButtonEventArgs me)
{
if (me.LeftButton == MouseButtonState.Pressed)
{
try
{
DragMove();
}
catch
{
}
}
};
}
private void UpdateIconPreview()
{
if (_iconPreview != null && _iconPreviewText != null)
{
_iconPreview.Background = new SolidColorBrush(ParseColor(_selectedColor))
{
Opacity = 0.2
};
_iconPreviewText.Text = _selectedSymbol;
_iconPreviewText.Foreground = BrushFromHex(_selectedColor);
}
}
private void ShowIconPickerPopup()
{
Brush background = (Application.Current.TryFindResource("LauncherBackground") as Brush) ?? new SolidColorBrush(Color.FromRgb(26, 27, 46));
Brush brush = (Application.Current.TryFindResource("PrimaryText") as Brush) ?? Brushes.White;
Brush foreground = (Application.Current.TryFindResource("SecondaryText") as Brush) ?? Brushes.Gray;
Brush borderBrush = (Application.Current.TryFindResource("BorderColor") as Brush) ?? Brushes.Gray;
Brush hoverBg = (Application.Current.TryFindResource("ItemHoverBackground") as Brush) ?? Brushes.Transparent;
Brush brush2 = (Application.Current.TryFindResource("AccentColor") as Brush) ?? Brushes.Blue;
Window pickerWin = new Window
{
Title = "아이콘 선택",
Width = 340.0,
SizeToContent = SizeToContent.Height,
WindowStartupLocation = WindowStartupLocation.CenterOwner,
Owner = this,
ResizeMode = ResizeMode.NoResize,
WindowStyle = WindowStyle.None,
AllowsTransparency = true,
Background = Brushes.Transparent
};
Border border = new Border
{
Background = background,
CornerRadius = new CornerRadius(12.0),
BorderBrush = borderBrush,
BorderThickness = new Thickness(1.0),
Padding = new Thickness(12.0),
Effect = new DropShadowEffect
{
BlurRadius = 16.0,
ShadowDepth = 3.0,
Opacity = 0.3,
Color = System.Windows.Media.Colors.Black
}
};
StackPanel stackPanel = new StackPanel();
Grid grid = new Grid();
grid.Children.Add(new TextBlock
{
Text = "아이콘 선택",
FontSize = 14.0,
FontWeight = FontWeights.SemiBold,
Foreground = brush,
Margin = new Thickness(0.0, 0.0, 0.0, 10.0),
HorizontalAlignment = HorizontalAlignment.Left
});
TextBlock textBlock = new TextBlock
{
Text = "\ue711",
FontFamily = new FontFamily("Segoe MDL2 Assets"),
FontSize = 12.0,
Foreground = foreground,
Cursor = Cursors.Hand,
HorizontalAlignment = HorizontalAlignment.Right,
VerticalAlignment = VerticalAlignment.Top
};
textBlock.MouseLeftButtonDown += delegate
{
pickerWin.Close();
};
grid.Children.Add(textBlock);
stackPanel.Children.Add(grid);
border.MouseLeftButtonDown += delegate
{
try
{
pickerWin.DragMove();
}
catch
{
}
};
(string, (string, string)[])[] iconSets = IconSets;
for (int num = 0; num < iconSets.Length; num++)
{
var (text, array) = iconSets[num];
stackPanel.Children.Add(new TextBlock
{
Text = text,
FontSize = 11.0,
FontWeight = FontWeights.SemiBold,
Foreground = foreground,
Margin = new Thickness(0.0, 6.0, 0.0, 4.0)
});
WrapPanel wrapPanel = new WrapPanel();
(string, string)[] array2 = array;
for (int num2 = 0; num2 < array2.Length; num2++)
{
(string, string) tuple2 = array2[num2];
string item = tuple2.Item1;
string item2 = tuple2.Item2;
string capturedSymbol = item2;
bool flag = _selectedSymbol == item2;
Border border2 = new Border
{
Width = 36.0,
Height = 36.0,
CornerRadius = new CornerRadius(8.0),
Background = (flag ? new SolidColorBrush(ParseColor(_selectedColor))
{
Opacity = 0.2
} : Brushes.Transparent),
BorderBrush = (flag ? brush2 : Brushes.Transparent),
BorderThickness = new Thickness(flag ? 1.5 : 0.0),
Cursor = Cursors.Hand,
Margin = new Thickness(0.0, 0.0, 4.0, 4.0),
ToolTip = item
};
border2.Child = new TextBlock
{
Text = item2,
FontFamily = new FontFamily("Segoe MDL2 Assets"),
FontSize = 16.0,
Foreground = (flag ? BrushFromHex(_selectedColor) : brush),
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center
};
border2.MouseEnter += delegate(object s, MouseEventArgs _)
{
if (s is Border border3 && !(_selectedSymbol == capturedSymbol))
{
border3.Background = hoverBg;
}
};
border2.MouseLeave += delegate(object s, MouseEventArgs _)
{
if (s is Border border3 && !(_selectedSymbol == capturedSymbol))
{
border3.Background = Brushes.Transparent;
}
};
border2.MouseLeftButtonDown += delegate(object _, MouseButtonEventArgs e)
{
e.Handled = true;
_selectedSymbol = capturedSymbol;
UpdateIconPreview();
pickerWin.Close();
};
wrapPanel.Children.Add(border2);
}
stackPanel.Children.Add(wrapPanel);
}
border.Child = stackPanel;
pickerWin.Content = border;
pickerWin.ShowDialog();
}
private static void AddLabel(StackPanel parent, string text, Brush fg)
{
parent.Children.Add(new TextBlock
{
Text = text,
FontSize = 12.0,
FontWeight = FontWeights.SemiBold,
Foreground = fg,
Margin = new Thickness(0.0, 0.0, 0.0, 6.0)
});
}
private static void AddHint(StackPanel parent, string text, Brush fg)
{
parent.Children.Add(new TextBlock
{
Text = text,
FontSize = 11.0,
Foreground = fg,
Margin = new Thickness(0.0, 0.0, 0.0, 8.0)
});
}
private static void AddSeparator(StackPanel parent, Brush color)
{
parent.Children.Add(new Rectangle
{
Height = 1.0,
Fill = color,
Margin = new Thickness(0.0, 12.0, 0.0, 12.0),
Opacity = 0.5
});
}
private static TextBox CreateTextBox(string text, Brush fg, Brush bg, Brush caret, Brush border, bool multiline = false)
{
TextBox textBox = new TextBox
{
Text = text,
FontSize = 13.0,
Padding = new Thickness(12.0, 8.0, 12.0, 8.0),
Foreground = fg,
Background = bg,
CaretBrush = caret,
BorderBrush = border,
BorderThickness = new Thickness(1.0)
};
if (multiline)
{
textBox.AcceptsReturn = true;
textBox.TextWrapping = TextWrapping.Wrap;
textBox.MinHeight = 100.0;
textBox.MaxHeight = 200.0;
textBox.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
}
return textBox;
}
private void UpdateCharCount(TextBlock tb)
{
tb.Text = $"{_promptBox.Text.Length}자";
}
private static Brush BrushFromHex(string hex)
{
try
{
return new SolidColorBrush((Color)ColorConverter.ConvertFromString(hex));
}
catch
{
return Brushes.Gray;
}
}
private static Color ParseColor(string hex)
{
try
{
return (Color)ColorConverter.ConvertFromString(hex);
}
catch
{
return System.Windows.Media.Colors.Gray;
}
}
}