Initial commit to new repository
This commit is contained in:
736
.decompiledproj/AxCopilot/Views/SkillGalleryWindow.cs
Normal file
736
.decompiledproj/AxCopilot/Views/SkillGalleryWindow.cs
Normal file
@@ -0,0 +1,736 @@
|
||||
using System;
|
||||
using System.CodeDom.Compiler;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Forms;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Markup;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Effects;
|
||||
using AxCopilot.Services.Agent;
|
||||
using Microsoft.Win32;
|
||||
|
||||
namespace AxCopilot.Views;
|
||||
|
||||
public class SkillGalleryWindow : Window, IComponentConnector
|
||||
{
|
||||
private string _selectedCategory = "전체";
|
||||
|
||||
internal Border BtnCloseGallery;
|
||||
|
||||
internal StackPanel CategoryFilterBar;
|
||||
|
||||
internal StackPanel SkillListPanel;
|
||||
|
||||
internal TextBlock GalleryStatus;
|
||||
|
||||
private bool _contentLoaded;
|
||||
|
||||
public SkillGalleryWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
base.Loaded += delegate
|
||||
{
|
||||
BuildCategoryFilter();
|
||||
RenderSkills();
|
||||
};
|
||||
}
|
||||
|
||||
private void TitleBar_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
|
||||
Point position = e.GetPosition(this);
|
||||
if (!(((Point)(ref position)).X > base.ActualWidth - 160.0))
|
||||
{
|
||||
if (e.ClickCount == 2)
|
||||
{
|
||||
base.WindowState = ((base.WindowState != WindowState.Maximized) ? WindowState.Maximized : WindowState.Normal);
|
||||
}
|
||||
else
|
||||
{
|
||||
DragMove();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void BtnClose_Click(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
Close();
|
||||
}
|
||||
|
||||
private void BtnAddSkill_Click(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
SkillEditorWindow skillEditorWindow = new SkillEditorWindow
|
||||
{
|
||||
Owner = this
|
||||
};
|
||||
if (skillEditorWindow.ShowDialog() == true)
|
||||
{
|
||||
BuildCategoryFilter();
|
||||
RenderSkills();
|
||||
}
|
||||
}
|
||||
|
||||
private void BtnImport_Click(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
Microsoft.Win32.OpenFileDialog openFileDialog = new Microsoft.Win32.OpenFileDialog
|
||||
{
|
||||
Filter = "스킬 패키지 (*.zip)|*.zip",
|
||||
Title = "가져올 스킬 zip 파일을 선택하세요"
|
||||
};
|
||||
if (openFileDialog.ShowDialog() == true)
|
||||
{
|
||||
int num = SkillService.ImportSkills(openFileDialog.FileName);
|
||||
if (num > 0)
|
||||
{
|
||||
CustomMessageBox.Show($"스킬 {num}개를 성공적으로 가져왔습니다.", "스킬 가져오기");
|
||||
BuildCategoryFilter();
|
||||
RenderSkills();
|
||||
}
|
||||
else
|
||||
{
|
||||
CustomMessageBox.Show("스킬 가져오기에 실패했습니다.", "스킬 가져오기");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void BuildCategoryFilter()
|
||||
{
|
||||
CategoryFilterBar.Children.Clear();
|
||||
IReadOnlyList<SkillDefinition> skills = SkillService.Skills;
|
||||
List<string> list = new string[1] { "전체" }.Concat(skills.Select((SkillDefinition s) => string.IsNullOrEmpty(s.Requires) ? "내장" : "고급 (런타임)").Distinct()).ToList();
|
||||
string userFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "AxCopilot", "skills");
|
||||
if (skills.Any((SkillDefinition s) => s.FilePath.StartsWith(userFolder, StringComparison.OrdinalIgnoreCase)) && !list.Contains("사용자"))
|
||||
{
|
||||
list.Add("사용자");
|
||||
}
|
||||
foreach (string item in list)
|
||||
{
|
||||
Border border = new Border();
|
||||
border.Tag = item;
|
||||
border.CornerRadius = new CornerRadius(8.0);
|
||||
border.Padding = new Thickness(14.0, 5.0, 14.0, 5.0);
|
||||
border.Margin = new Thickness(0.0, 0.0, 6.0, 0.0);
|
||||
border.Background = ((item == _selectedCategory) ? new SolidColorBrush(Color.FromRgb(75, 94, 252)) : ((TryFindResource("ItemBackground") as Brush) ?? Brushes.Transparent));
|
||||
border.Cursor = System.Windows.Input.Cursors.Hand;
|
||||
Border border2 = border;
|
||||
border2.Child = new TextBlock
|
||||
{
|
||||
Text = item,
|
||||
FontSize = 12.0,
|
||||
FontWeight = FontWeights.SemiBold,
|
||||
Foreground = ((item == _selectedCategory) ? Brushes.White : ((TryFindResource("SecondaryText") as Brush) ?? Brushes.Gray))
|
||||
};
|
||||
border2.MouseLeftButtonUp += delegate(object s, MouseButtonEventArgs _)
|
||||
{
|
||||
if (s is Border { Tag: string tag })
|
||||
{
|
||||
_selectedCategory = tag;
|
||||
BuildCategoryFilter();
|
||||
RenderSkills();
|
||||
}
|
||||
};
|
||||
CategoryFilterBar.Children.Add(border2);
|
||||
}
|
||||
}
|
||||
|
||||
private void RenderSkills()
|
||||
{
|
||||
SkillListPanel.Children.Clear();
|
||||
List<SkillDefinition> list = FilterSkills(SkillService.Skills);
|
||||
string userFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "AxCopilot", "skills");
|
||||
foreach (SkillDefinition item in list)
|
||||
{
|
||||
SkillListPanel.Children.Add(BuildSkillCard(item, userFolder));
|
||||
}
|
||||
if (list.Count == 0)
|
||||
{
|
||||
SkillListPanel.Children.Add(new TextBlock
|
||||
{
|
||||
Text = "표시할 스킬이 없습니다.",
|
||||
FontSize = 13.0,
|
||||
Foreground = ((TryFindResource("SecondaryText") as Brush) ?? Brushes.Gray),
|
||||
Margin = new Thickness(0.0, 20.0, 0.0, 0.0),
|
||||
HorizontalAlignment = System.Windows.HorizontalAlignment.Center
|
||||
});
|
||||
}
|
||||
int count = SkillService.Skills.Count;
|
||||
int num = SkillService.Skills.Count((SkillDefinition s) => s.IsAvailable);
|
||||
GalleryStatus.Text = $"총 {count}개 스킬 | 사용 가능 {num}개 | 런타임 필요 {count - num}개";
|
||||
}
|
||||
|
||||
private List<SkillDefinition> FilterSkills(IReadOnlyList<SkillDefinition> skills)
|
||||
{
|
||||
string userFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "AxCopilot", "skills");
|
||||
string selectedCategory = _selectedCategory;
|
||||
if (1 == 0)
|
||||
{
|
||||
}
|
||||
List<SkillDefinition> result = selectedCategory switch
|
||||
{
|
||||
"내장" => skills.Where((SkillDefinition s) => string.IsNullOrEmpty(s.Requires) && !s.FilePath.StartsWith(userFolder, StringComparison.OrdinalIgnoreCase)).ToList(),
|
||||
"고급 (런타임)" => skills.Where((SkillDefinition s) => !string.IsNullOrEmpty(s.Requires)).ToList(),
|
||||
"사용자" => skills.Where((SkillDefinition s) => s.FilePath.StartsWith(userFolder, StringComparison.OrdinalIgnoreCase)).ToList(),
|
||||
_ => skills.ToList(),
|
||||
};
|
||||
if (1 == 0)
|
||||
{
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private Border BuildSkillCard(SkillDefinition skill, string userFolder)
|
||||
{
|
||||
Brush bgBrush = (TryFindResource("ItemBackground") as Brush) ?? Brushes.Transparent;
|
||||
Brush foreground = (TryFindResource("PrimaryText") as Brush) ?? Brushes.White;
|
||||
Brush brush = (TryFindResource("SecondaryText") as Brush) ?? Brushes.Gray;
|
||||
bool isUser = skill.FilePath.StartsWith(userFolder, StringComparison.OrdinalIgnoreCase);
|
||||
bool flag = !string.IsNullOrEmpty(skill.Requires);
|
||||
Border card = new Border
|
||||
{
|
||||
Background = bgBrush,
|
||||
CornerRadius = new CornerRadius(10.0),
|
||||
Padding = new Thickness(14.0, 10.0, 14.0, 10.0),
|
||||
Margin = new Thickness(0.0, 0.0, 0.0, 6.0)
|
||||
};
|
||||
Grid grid = new Grid();
|
||||
grid.ColumnDefinitions.Add(new ColumnDefinition
|
||||
{
|
||||
Width = new GridLength(1.0, GridUnitType.Auto)
|
||||
});
|
||||
grid.ColumnDefinitions.Add(new ColumnDefinition());
|
||||
grid.ColumnDefinitions.Add(new ColumnDefinition
|
||||
{
|
||||
Width = new GridLength(1.0, GridUnitType.Auto)
|
||||
});
|
||||
Border border = new Border
|
||||
{
|
||||
Width = 38.0,
|
||||
Height = 38.0,
|
||||
CornerRadius = new CornerRadius(10.0),
|
||||
Background = new SolidColorBrush(Color.FromArgb(48, 75, 94, 252)),
|
||||
Margin = new Thickness(0.0, 0.0, 12.0, 0.0),
|
||||
VerticalAlignment = VerticalAlignment.Center
|
||||
};
|
||||
border.Child = new TextBlock
|
||||
{
|
||||
Text = skill.Icon,
|
||||
FontFamily = new FontFamily("Segoe MDL2 Assets"),
|
||||
FontSize = 16.0,
|
||||
Foreground = (skill.IsAvailable ? new SolidColorBrush(Color.FromRgb(75, 94, 252)) : brush),
|
||||
HorizontalAlignment = System.Windows.HorizontalAlignment.Center,
|
||||
VerticalAlignment = VerticalAlignment.Center
|
||||
};
|
||||
Grid.SetColumn(border, 0);
|
||||
StackPanel stackPanel = new StackPanel
|
||||
{
|
||||
VerticalAlignment = VerticalAlignment.Center
|
||||
};
|
||||
StackPanel stackPanel2 = new StackPanel
|
||||
{
|
||||
Orientation = System.Windows.Controls.Orientation.Horizontal,
|
||||
Margin = new Thickness(0.0, 0.0, 0.0, 3.0)
|
||||
};
|
||||
stackPanel2.Children.Add(new TextBlock
|
||||
{
|
||||
Text = "/" + skill.Name,
|
||||
FontSize = 13.0,
|
||||
FontWeight = FontWeights.SemiBold,
|
||||
FontFamily = new FontFamily("Consolas"),
|
||||
Foreground = (skill.IsAvailable ? new SolidColorBrush(Color.FromRgb(75, 94, 252)) : brush),
|
||||
Opacity = (skill.IsAvailable ? 1.0 : 0.6),
|
||||
VerticalAlignment = VerticalAlignment.Center
|
||||
});
|
||||
stackPanel2.Children.Add(new TextBlock
|
||||
{
|
||||
Text = " " + skill.Label,
|
||||
FontSize = 12.5,
|
||||
Foreground = foreground,
|
||||
VerticalAlignment = VerticalAlignment.Center
|
||||
});
|
||||
if (isUser)
|
||||
{
|
||||
stackPanel2.Children.Add(MakeBadge("사용자", "#34D399"));
|
||||
}
|
||||
else if (flag)
|
||||
{
|
||||
stackPanel2.Children.Add(MakeBadge("고급", "#A78BFA"));
|
||||
}
|
||||
else
|
||||
{
|
||||
stackPanel2.Children.Add(MakeBadge("내장", "#9CA3AF"));
|
||||
}
|
||||
if (!skill.IsAvailable)
|
||||
{
|
||||
stackPanel2.Children.Add(MakeBadge(skill.UnavailableHint, "#F87171"));
|
||||
}
|
||||
stackPanel.Children.Add(stackPanel2);
|
||||
stackPanel.Children.Add(new TextBlock
|
||||
{
|
||||
Text = skill.Description,
|
||||
FontSize = 11.5,
|
||||
Foreground = brush,
|
||||
TextWrapping = TextWrapping.Wrap,
|
||||
Opacity = (skill.IsAvailable ? 1.0 : 0.6)
|
||||
});
|
||||
Grid.SetColumn(stackPanel, 1);
|
||||
StackPanel actions = new StackPanel
|
||||
{
|
||||
Orientation = System.Windows.Controls.Orientation.Horizontal,
|
||||
VerticalAlignment = VerticalAlignment.Center,
|
||||
Margin = new Thickness(8.0, 0.0, 0.0, 0.0)
|
||||
};
|
||||
actions.Children.Add(MakeActionBtn("\ue70f", "#3B82F6", isUser ? "편집 (시각적 편집기)" : "편집 (파일 열기)", delegate
|
||||
{
|
||||
if (isUser)
|
||||
{
|
||||
SkillEditorWindow skillEditorWindow = new SkillEditorWindow(skill)
|
||||
{
|
||||
Owner = this
|
||||
};
|
||||
if (skillEditorWindow.ShowDialog() == true)
|
||||
{
|
||||
SkillService.LoadSkills();
|
||||
BuildCategoryFilter();
|
||||
RenderSkills();
|
||||
}
|
||||
return;
|
||||
}
|
||||
try
|
||||
{
|
||||
Process.Start(new ProcessStartInfo(skill.FilePath)
|
||||
{
|
||||
UseShellExecute = true
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
CustomMessageBox.Show("파일을 열 수 없습니다: " + ex.Message, "편집");
|
||||
}
|
||||
}));
|
||||
actions.Children.Add(MakeActionBtn("\ue8c8", "#10B981", "복제", delegate
|
||||
{
|
||||
try
|
||||
{
|
||||
string text = Path.Combine(userFolder);
|
||||
if (!Directory.Exists(text))
|
||||
{
|
||||
Directory.CreateDirectory(text);
|
||||
}
|
||||
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(skill.FilePath);
|
||||
string text2 = Path.Combine(text, fileNameWithoutExtension + "_copy.skill.md");
|
||||
int num = 2;
|
||||
while (File.Exists(text2))
|
||||
{
|
||||
text2 = Path.Combine(text, $"{fileNameWithoutExtension}_copy{num++}.skill.md");
|
||||
}
|
||||
File.Copy(skill.FilePath, text2);
|
||||
SkillService.LoadSkills();
|
||||
BuildCategoryFilter();
|
||||
RenderSkills();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
CustomMessageBox.Show("복제 실패: " + ex.Message, "복제");
|
||||
}
|
||||
}));
|
||||
actions.Children.Add(MakeActionBtn("\uede1", "#F59E0B", "내보내기 (.zip)", delegate
|
||||
{
|
||||
FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog
|
||||
{
|
||||
Description = "내보낼 폴더를 선택하세요"
|
||||
};
|
||||
if (folderBrowserDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
|
||||
{
|
||||
string text = SkillService.ExportSkill(skill, folderBrowserDialog.SelectedPath);
|
||||
if (text != null)
|
||||
{
|
||||
CustomMessageBox.Show("내보내기 완료:\n" + text, "내보내기");
|
||||
}
|
||||
else
|
||||
{
|
||||
CustomMessageBox.Show("내보내기에 실패했습니다.", "내보내기");
|
||||
}
|
||||
}
|
||||
}));
|
||||
if (isUser)
|
||||
{
|
||||
actions.Children.Add(MakeActionBtn("\ue74d", "#F87171", "삭제", delegate
|
||||
{
|
||||
MessageBoxResult messageBoxResult = CustomMessageBox.Show("스킬 '/" + skill.Name + "'을 삭제하시겠습니까?", "스킬 삭제", MessageBoxButton.YesNo, MessageBoxImage.Question);
|
||||
if (messageBoxResult != MessageBoxResult.Yes)
|
||||
{
|
||||
return;
|
||||
}
|
||||
try
|
||||
{
|
||||
File.Delete(skill.FilePath);
|
||||
SkillService.LoadSkills();
|
||||
BuildCategoryFilter();
|
||||
RenderSkills();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
CustomMessageBox.Show("삭제 실패: " + ex.Message, "삭제");
|
||||
}
|
||||
}));
|
||||
}
|
||||
Grid.SetColumn(actions, 2);
|
||||
grid.Children.Add(border);
|
||||
grid.Children.Add(stackPanel);
|
||||
grid.Children.Add(actions);
|
||||
card.Child = grid;
|
||||
card.Cursor = System.Windows.Input.Cursors.Hand;
|
||||
card.MouseEnter += delegate
|
||||
{
|
||||
card.Background = new SolidColorBrush(Color.FromArgb(24, byte.MaxValue, byte.MaxValue, byte.MaxValue));
|
||||
};
|
||||
card.MouseLeave += delegate
|
||||
{
|
||||
card.Background = bgBrush;
|
||||
};
|
||||
card.MouseLeftButtonUp += delegate(object _, MouseButtonEventArgs e)
|
||||
{
|
||||
if (e.OriginalSource is FrameworkElement frameworkElement)
|
||||
{
|
||||
for (FrameworkElement frameworkElement2 = frameworkElement; frameworkElement2 != null; frameworkElement2 = VisualTreeHelper.GetParent((DependencyObject)(object)frameworkElement2) as FrameworkElement)
|
||||
{
|
||||
if (frameworkElement2 == actions)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
ShowSkillDetail(skill);
|
||||
};
|
||||
return card;
|
||||
}
|
||||
|
||||
private Border MakeBadge(string text, string colorHex)
|
||||
{
|
||||
Color color = (Color)ColorConverter.ConvertFromString(colorHex);
|
||||
return new Border
|
||||
{
|
||||
Background = new SolidColorBrush(Color.FromArgb(37, color.R, color.G, color.B)),
|
||||
CornerRadius = new CornerRadius(4.0),
|
||||
Padding = new Thickness(5.0, 1.0, 5.0, 1.0),
|
||||
Margin = new Thickness(6.0, 0.0, 0.0, 0.0),
|
||||
VerticalAlignment = VerticalAlignment.Center,
|
||||
Child = new TextBlock
|
||||
{
|
||||
Text = text,
|
||||
FontSize = 9.5,
|
||||
FontWeight = FontWeights.SemiBold,
|
||||
Foreground = new SolidColorBrush(color)
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private Border MakeActionBtn(string icon, string colorHex, string tooltip, Action action)
|
||||
{
|
||||
Color col = (Color)ColorConverter.ConvertFromString(colorHex);
|
||||
Border btn = new Border
|
||||
{
|
||||
Width = 28.0,
|
||||
Height = 28.0,
|
||||
CornerRadius = new CornerRadius(6.0),
|
||||
Background = Brushes.Transparent,
|
||||
Cursor = System.Windows.Input.Cursors.Hand,
|
||||
Margin = new Thickness(2.0, 0.0, 0.0, 0.0),
|
||||
ToolTip = tooltip,
|
||||
Child = new TextBlock
|
||||
{
|
||||
Text = icon,
|
||||
FontFamily = new FontFamily("Segoe MDL2 Assets"),
|
||||
FontSize = 12.0,
|
||||
Foreground = new SolidColorBrush(col),
|
||||
HorizontalAlignment = System.Windows.HorizontalAlignment.Center,
|
||||
VerticalAlignment = VerticalAlignment.Center
|
||||
}
|
||||
};
|
||||
btn.MouseEnter += delegate
|
||||
{
|
||||
btn.Background = new SolidColorBrush(Color.FromArgb(32, col.R, col.G, col.B));
|
||||
};
|
||||
btn.MouseLeave += delegate
|
||||
{
|
||||
btn.Background = Brushes.Transparent;
|
||||
};
|
||||
btn.MouseLeftButtonUp += delegate
|
||||
{
|
||||
action();
|
||||
};
|
||||
return btn;
|
||||
}
|
||||
|
||||
private void ShowSkillDetail(SkillDefinition skill)
|
||||
{
|
||||
Brush background = (TryFindResource("LauncherBackground") as Brush) ?? Brushes.Black;
|
||||
Brush fgBrush = (TryFindResource("PrimaryText") as Brush) ?? Brushes.White;
|
||||
Brush subBrush = (TryFindResource("SecondaryText") as Brush) ?? Brushes.Gray;
|
||||
Brush background2 = (TryFindResource("ItemBackground") as Brush) ?? Brushes.Transparent;
|
||||
Brush brush = (TryFindResource("BorderColor") as Brush) ?? Brushes.Gray;
|
||||
Window popup = new Window
|
||||
{
|
||||
Title = "/" + skill.Name,
|
||||
Width = 580.0,
|
||||
Height = 480.0,
|
||||
WindowStyle = WindowStyle.None,
|
||||
AllowsTransparency = true,
|
||||
Background = Brushes.Transparent,
|
||||
WindowStartupLocation = WindowStartupLocation.CenterOwner,
|
||||
Owner = this
|
||||
};
|
||||
Border border = new Border
|
||||
{
|
||||
Background = background,
|
||||
CornerRadius = new CornerRadius(12.0),
|
||||
BorderBrush = brush,
|
||||
BorderThickness = new Thickness(1.0, 1.0, 1.0, 1.0),
|
||||
Effect = new DropShadowEffect
|
||||
{
|
||||
BlurRadius = 20.0,
|
||||
ShadowDepth = 4.0,
|
||||
Opacity = 0.3,
|
||||
Color = Colors.Black
|
||||
}
|
||||
};
|
||||
Grid grid = new Grid();
|
||||
grid.RowDefinitions.Add(new RowDefinition
|
||||
{
|
||||
Height = new GridLength(44.0)
|
||||
});
|
||||
grid.RowDefinitions.Add(new RowDefinition());
|
||||
Border border2 = new Border
|
||||
{
|
||||
CornerRadius = new CornerRadius(12.0, 12.0, 0.0, 0.0),
|
||||
Background = background2
|
||||
};
|
||||
border2.MouseLeftButtonDown += delegate(object _, MouseButtonEventArgs e)
|
||||
{
|
||||
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
|
||||
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
|
||||
Point position = e.GetPosition(popup);
|
||||
if (!(((Point)(ref position)).X > popup.ActualWidth - 50.0))
|
||||
{
|
||||
popup.DragMove();
|
||||
}
|
||||
};
|
||||
Grid grid2 = new Grid
|
||||
{
|
||||
Margin = new Thickness(16.0, 0.0, 12.0, 0.0)
|
||||
};
|
||||
StackPanel stackPanel = new StackPanel
|
||||
{
|
||||
Orientation = System.Windows.Controls.Orientation.Horizontal,
|
||||
VerticalAlignment = VerticalAlignment.Center
|
||||
};
|
||||
stackPanel.Children.Add(new TextBlock
|
||||
{
|
||||
Text = skill.Icon,
|
||||
FontFamily = new FontFamily("Segoe MDL2 Assets"),
|
||||
FontSize = 14.0,
|
||||
Foreground = new SolidColorBrush(Color.FromRgb(75, 94, 252)),
|
||||
VerticalAlignment = VerticalAlignment.Center,
|
||||
Margin = new Thickness(0.0, 1.0, 8.0, 0.0)
|
||||
});
|
||||
stackPanel.Children.Add(new TextBlock
|
||||
{
|
||||
Text = "/" + skill.Name + " " + skill.Label,
|
||||
FontSize = 14.0,
|
||||
FontWeight = FontWeights.SemiBold,
|
||||
Foreground = fgBrush,
|
||||
VerticalAlignment = VerticalAlignment.Center
|
||||
});
|
||||
grid2.Children.Add(stackPanel);
|
||||
Border border3 = new Border
|
||||
{
|
||||
Width = 28.0,
|
||||
Height = 28.0,
|
||||
CornerRadius = new CornerRadius(6.0),
|
||||
Cursor = System.Windows.Input.Cursors.Hand,
|
||||
HorizontalAlignment = System.Windows.HorizontalAlignment.Right,
|
||||
VerticalAlignment = VerticalAlignment.Center
|
||||
};
|
||||
border3.Child = new TextBlock
|
||||
{
|
||||
Text = "\ue8bb",
|
||||
FontFamily = new FontFamily("Segoe MDL2 Assets"),
|
||||
FontSize = 10.0,
|
||||
Foreground = subBrush,
|
||||
HorizontalAlignment = System.Windows.HorizontalAlignment.Center,
|
||||
VerticalAlignment = VerticalAlignment.Center
|
||||
};
|
||||
border3.MouseEnter += delegate(object s, System.Windows.Input.MouseEventArgs _)
|
||||
{
|
||||
((Border)s).Background = new SolidColorBrush(Color.FromArgb(51, byte.MaxValue, 68, 68));
|
||||
};
|
||||
border3.MouseLeave += delegate(object s, System.Windows.Input.MouseEventArgs _)
|
||||
{
|
||||
((Border)s).Background = Brushes.Transparent;
|
||||
};
|
||||
border3.MouseLeftButtonUp += delegate
|
||||
{
|
||||
popup.Close();
|
||||
};
|
||||
grid2.Children.Add(border3);
|
||||
border2.Child = grid2;
|
||||
Grid.SetRow(border2, 0);
|
||||
ScrollViewer scrollViewer = new ScrollViewer
|
||||
{
|
||||
VerticalScrollBarVisibility = ScrollBarVisibility.Auto,
|
||||
Padding = new Thickness(20.0, 16.0, 20.0, 16.0)
|
||||
};
|
||||
StackPanel stackPanel2 = new StackPanel();
|
||||
Grid metaGrid = new Grid
|
||||
{
|
||||
Margin = new Thickness(0.0, 0.0, 0.0, 14.0)
|
||||
};
|
||||
metaGrid.ColumnDefinitions.Add(new ColumnDefinition
|
||||
{
|
||||
Width = new GridLength(80.0)
|
||||
});
|
||||
metaGrid.ColumnDefinitions.Add(new ColumnDefinition());
|
||||
int num = 0;
|
||||
AddMetaRow("명령어", "/" + skill.Name, num++);
|
||||
AddMetaRow("라벨", skill.Label, num++);
|
||||
AddMetaRow("설명", skill.Description, num++);
|
||||
if (!string.IsNullOrEmpty(skill.Requires))
|
||||
{
|
||||
AddMetaRow("런타임", skill.Requires, num++);
|
||||
}
|
||||
if (!string.IsNullOrEmpty(skill.AllowedTools))
|
||||
{
|
||||
AddMetaRow("허용 도구", skill.AllowedTools, num++);
|
||||
}
|
||||
AddMetaRow("상태", skill.IsAvailable ? "✓ 사용 가능" : ("✗ " + skill.UnavailableHint), num++);
|
||||
AddMetaRow("경로", skill.FilePath, num++);
|
||||
stackPanel2.Children.Add(metaGrid);
|
||||
stackPanel2.Children.Add(new Border
|
||||
{
|
||||
Height = 1.0,
|
||||
Background = brush,
|
||||
Margin = new Thickness(0.0, 4.0, 0.0, 12.0)
|
||||
});
|
||||
stackPanel2.Children.Add(new TextBlock
|
||||
{
|
||||
Text = "시스템 프롬프트 (미리보기)",
|
||||
FontSize = 11.0,
|
||||
FontWeight = FontWeights.SemiBold,
|
||||
Foreground = subBrush,
|
||||
Margin = new Thickness(0.0, 0.0, 0.0, 6.0)
|
||||
});
|
||||
Border border4 = new Border
|
||||
{
|
||||
Background = background2,
|
||||
CornerRadius = new CornerRadius(8.0),
|
||||
Padding = new Thickness(12.0, 10.0, 12.0, 10.0)
|
||||
};
|
||||
string text = skill.SystemPrompt;
|
||||
if (text.Length > 2000)
|
||||
{
|
||||
text = text.Substring(0, 2000) + "\n\n... (이하 생략)";
|
||||
}
|
||||
border4.Child = new TextBlock
|
||||
{
|
||||
Text = text,
|
||||
FontSize = 11.5,
|
||||
FontFamily = new FontFamily("Consolas, Cascadia Code, Segoe UI"),
|
||||
Foreground = fgBrush,
|
||||
TextWrapping = TextWrapping.Wrap,
|
||||
Opacity = 0.85
|
||||
};
|
||||
stackPanel2.Children.Add(border4);
|
||||
scrollViewer.Content = stackPanel2;
|
||||
Grid.SetRow(scrollViewer, 1);
|
||||
grid.Children.Add(border2);
|
||||
grid.Children.Add(scrollViewer);
|
||||
border.Child = grid;
|
||||
popup.Content = border;
|
||||
popup.ShowDialog();
|
||||
void AddMetaRow(string label, string value, int row)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(value))
|
||||
{
|
||||
metaGrid.RowDefinitions.Add(new RowDefinition
|
||||
{
|
||||
Height = GridLength.Auto
|
||||
});
|
||||
TextBlock element = new TextBlock
|
||||
{
|
||||
Text = label,
|
||||
FontSize = 11.5,
|
||||
Foreground = subBrush,
|
||||
Margin = new Thickness(0.0, 2.0, 0.0, 2.0)
|
||||
};
|
||||
Grid.SetRow(element, row);
|
||||
Grid.SetColumn(element, 0);
|
||||
metaGrid.Children.Add(element);
|
||||
TextBlock element2 = new TextBlock
|
||||
{
|
||||
Text = value,
|
||||
FontSize = 11.5,
|
||||
Foreground = fgBrush,
|
||||
TextWrapping = TextWrapping.Wrap,
|
||||
Margin = new Thickness(0.0, 2.0, 0.0, 2.0)
|
||||
};
|
||||
Grid.SetRow(element2, row);
|
||||
Grid.SetColumn(element2, 1);
|
||||
metaGrid.Children.Add(element2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[DebuggerNonUserCode]
|
||||
[GeneratedCode("PresentationBuildTasks", "10.0.5.0")]
|
||||
public void InitializeComponent()
|
||||
{
|
||||
if (!_contentLoaded)
|
||||
{
|
||||
_contentLoaded = true;
|
||||
Uri resourceLocator = new Uri("/AxCopilot;component/views/skillgallerywindow.xaml", UriKind.Relative);
|
||||
System.Windows.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:
|
||||
((Border)target).MouseLeftButtonDown += TitleBar_MouseLeftButtonDown;
|
||||
break;
|
||||
case 2:
|
||||
((Border)target).MouseLeftButtonUp += BtnAddSkill_Click;
|
||||
break;
|
||||
case 3:
|
||||
((Border)target).MouseLeftButtonUp += BtnImport_Click;
|
||||
break;
|
||||
case 4:
|
||||
BtnCloseGallery = (Border)target;
|
||||
BtnCloseGallery.MouseLeftButtonUp += BtnClose_Click;
|
||||
break;
|
||||
case 5:
|
||||
CategoryFilterBar = (StackPanel)target;
|
||||
break;
|
||||
case 6:
|
||||
SkillListPanel = (StackPanel)target;
|
||||
break;
|
||||
case 7:
|
||||
GalleryStatus = (TextBlock)target;
|
||||
break;
|
||||
default:
|
||||
_contentLoaded = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user