323 lines
11 KiB
C#
323 lines
11 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.Interop;
|
|
using System.Windows.Markup;
|
|
using System.Windows.Media;
|
|
using AxCopilot.Services;
|
|
|
|
namespace AxCopilot.Views;
|
|
|
|
public class ShortcutHelpWindow : Window, IComponentConnector
|
|
{
|
|
private record ShortcutRow(string Key, string Description, string Icon = "\ue72d", string Color = "#4B5EFC");
|
|
|
|
private const int WM_NCLBUTTONDOWN = 161;
|
|
|
|
private const int HTBOTTOMRIGHT = 17;
|
|
|
|
internal ItemsControl NavigationItems;
|
|
|
|
internal ItemsControl FileActionItems;
|
|
|
|
internal ItemsControl ViewItems;
|
|
|
|
internal ItemsControl RunItems;
|
|
|
|
internal ItemsControl PrefixItems;
|
|
|
|
internal CheckBox ThemeColorChk;
|
|
|
|
private bool _contentLoaded;
|
|
|
|
[DllImport("user32.dll")]
|
|
private static extern void ReleaseCapture();
|
|
|
|
[DllImport("user32.dll")]
|
|
private static extern nint SendMessage(nint hWnd, int msg, nint wParam, nint lParam);
|
|
|
|
public ShortcutHelpWindow()
|
|
{
|
|
InitializeComponent();
|
|
base.Loaded += delegate
|
|
{
|
|
SettingsService settingsService = (Application.Current as App)?.SettingsService;
|
|
if (settingsService != null)
|
|
{
|
|
ThemeColorChk.IsChecked = settingsService.Settings.Launcher.ShortcutHelpUseThemeColor;
|
|
}
|
|
BuildItems();
|
|
};
|
|
}
|
|
|
|
private void BuildItems()
|
|
{
|
|
bool valueOrDefault = ThemeColorChk.IsChecked == true;
|
|
ShortcutRow[] rows = new ShortcutRow[6]
|
|
{
|
|
new ShortcutRow("↑ / ↓", "결과 목록 위/아래로 이동", "\ue74a"),
|
|
new ShortcutRow("PageUp / PageDown", "목록 5칸 빠른 이동", "\ue74a"),
|
|
new ShortcutRow("Home / End", "목록 처음 항목 / 마지막 항목으로 점프", "\ue74a"),
|
|
new ShortcutRow("Tab", "선택 항목 제목을 입력창에 자동 완성", "\ue748", "#7B68EE"),
|
|
new ShortcutRow("→", "파일/앱 선택 시 액션 모드(복사·실행 등) 진입", "\ue76c", "#107C10"),
|
|
new ShortcutRow("Escape", "액션 모드면 일반 모드로 복귀, 아니면 AX Commander 닫기", "\ue711", "#C50F1F")
|
|
};
|
|
ShortcutRow[] rows2 = new ShortcutRow[10]
|
|
{
|
|
new ShortcutRow("Enter", "선택 항목 실행 (파일 열기·명령 실행·URL 열기 등)", "\ue768", "#107C10"),
|
|
new ShortcutRow("Ctrl+Enter", "선택 파일·앱을 관리자(UAC 상승) 권한으로 실행", "\ue7ef", "#C50F1F"),
|
|
new ShortcutRow("Alt+Enter", "선택 항목의 Windows 속성 대화 상자 열기", "\ue7ee", "#8B2FC9"),
|
|
new ShortcutRow("Ctrl+C", "선택 항목의 파일 이름(확장자 제외)을 클립보드에 복사", "\ue8c8", "#0078D4"),
|
|
new ShortcutRow("Ctrl+Shift+C", "선택 항목의 전체 경로를 클립보드에 복사", "\ue8c8", "#0078D4"),
|
|
new ShortcutRow("Ctrl+Shift+E", "파일 탐색기를 열고 선택 항목 위치를 하이라이트", "\ue8da", "#107C10"),
|
|
new ShortcutRow("Ctrl+T", "선택 항목 폴더 경로에서 터미널(wt/cmd) 열기", "\ue756", "#323130"),
|
|
new ShortcutRow("Ctrl+P", "선택 항목을 즐겨찾기에 추가 (이미 있으면 제거)", "\ue734", "#D97706"),
|
|
new ShortcutRow("F2", "선택 파일·폴더의 이름 변경 모드로 전환", "\ue70f", "#6B2C91"),
|
|
new ShortcutRow("Delete", "선택 항목을 최근 목록에서 제거 (확인 후 실행)", "\ue74d", "#C50F1F")
|
|
};
|
|
ShortcutRow[] rows3 = new ShortcutRow[6]
|
|
{
|
|
new ShortcutRow("Ctrl+B", "즐겨찾기 목록 보기 (다시 누르면 닫기, 토글)", "\ue735", "#D97706"),
|
|
new ShortcutRow("Ctrl+R", "최근 실행 목록 보기 (다시 누르면 닫기, 토글)", "\ue81c", "#0078D4"),
|
|
new ShortcutRow("Ctrl+H", "클립보드 히스토리 목록 보기", "\ue77f", "#8B2FC9"),
|
|
new ShortcutRow("Ctrl+D", "다운로드 폴더 경로 바로 열기", "\ue8b7", "#107C10"),
|
|
new ShortcutRow("Ctrl+F", "입력 초기화 후 파일 검색 모드로 포커스 이동", "\ue71e"),
|
|
new ShortcutRow("F1", "헬프 화면 열기 (help 입력과 동일)", "\ue897")
|
|
};
|
|
ShortcutRow[] rows4 = new ShortcutRow[7]
|
|
{
|
|
new ShortcutRow("Ctrl+1 ~ Ctrl+9", "표시 중인 N번째 결과를 즉시 실행 (번호 배지와 연동)", "\ue8c4", "#107C10"),
|
|
new ShortcutRow("Ctrl+L", "입력창 전체 초기화", "\ue711", "#9999BB"),
|
|
new ShortcutRow("Ctrl+W", "AX Commander 창 즉시 닫기", "\ue711", "#9999BB"),
|
|
new ShortcutRow("Ctrl+K", "이 단축키 참조 창 열기", "\ue8fd"),
|
|
new ShortcutRow("Ctrl+,", "설정 창 열기", "\ue713"),
|
|
new ShortcutRow("F5", "파일 인덱스 즉시 재구축", "\ue72c", "#107C10"),
|
|
new ShortcutRow("Shift+Enter", "Large Type / 병합 실행 / 캡처 모드: 지연 캡처(3/5/10초) 타이머", "\ue8a7", "#7B68EE")
|
|
};
|
|
ShortcutRow[] rows5 = new ShortcutRow[9]
|
|
{
|
|
new ShortcutRow("cd [경로/별칭]", "지정한 경로 또는 등록된 폴더 별칭을 탐색기로 열기", "\ue8da", "#107C10"),
|
|
new ShortcutRow("~ [이름]", "워크스페이스 저장(save)/복원(restore)/목록(list)", "\ue8b7", "#C50F1F"),
|
|
new ShortcutRow("# [검색어]", "클립보드 히스토리 검색·붙여넣기", "\ue77f", "#8B2FC9"),
|
|
new ShortcutRow("fav [검색어]", "즐겨찾기 목록 검색 및 열기. add/del 로 관리", "\ue735", "#D97706"),
|
|
new ShortcutRow("recent [검색어]", "최근 실행 항목 검색", "\ue81c", "#0078D4"),
|
|
new ShortcutRow("cap [모드]", "화면 캡처 (region/window/scroll/screen) · Shift+Enter: 지연 캡처", "\ue722", "#C09010"),
|
|
new ShortcutRow("help [검색어]", "도움말 및 기능 목록 검색", "\ue897"),
|
|
new ShortcutRow("/ [명령]", "시스템 명령 (lock/sleep/restart/shutdown 등)", "\ue7e8", "#C50F1F"),
|
|
new ShortcutRow("! [질문]", "AX Agent — Ollama/vLLM/Gemini/Claude", "\ue8bd", "#8B2FC9")
|
|
};
|
|
NavigationItems.Items.Clear();
|
|
FileActionItems.Items.Clear();
|
|
ViewItems.Items.Clear();
|
|
RunItems.Items.Clear();
|
|
PrefixItems.Items.Clear();
|
|
Populate(NavigationItems, rows, valueOrDefault);
|
|
Populate(FileActionItems, rows2, valueOrDefault);
|
|
Populate(ViewItems, rows3, valueOrDefault);
|
|
Populate(RunItems, rows4, valueOrDefault);
|
|
Populate(PrefixItems, rows5, valueOrDefault);
|
|
}
|
|
|
|
private static void Populate(ItemsControl control, ShortcutRow[] rows, bool useThemeColor)
|
|
{
|
|
Brush foreground = (Application.Current.TryFindResource("PrimaryText") as Brush) ?? new SolidColorBrush(Color.FromRgb(51, 51, 85));
|
|
Brush background = (Application.Current.TryFindResource("ItemBackground") as Brush) ?? new SolidColorBrush(Color.FromRgb(238, 238, byte.MaxValue));
|
|
string text = ((Application.Current.TryFindResource("AccentColor") is SolidColorBrush solidColorBrush) ? $"#{solidColorBrush.Color.R:X2}{solidColorBrush.Color.G:X2}{solidColorBrush.Color.B:X2}" : "#4B5EFC");
|
|
foreach (ShortcutRow shortcutRow in rows)
|
|
{
|
|
string text2 = (useThemeColor ? text : shortcutRow.Color);
|
|
Grid grid = new Grid
|
|
{
|
|
Margin = new Thickness(0.0, 0.0, 0.0, 3.0)
|
|
};
|
|
grid.ColumnDefinitions.Add(new ColumnDefinition
|
|
{
|
|
Width = new GridLength(28.0)
|
|
});
|
|
grid.ColumnDefinitions.Add(new ColumnDefinition
|
|
{
|
|
Width = new GridLength(148.0)
|
|
});
|
|
grid.ColumnDefinitions.Add(new ColumnDefinition
|
|
{
|
|
Width = new GridLength(1.0, GridUnitType.Star)
|
|
});
|
|
Border border = new Border
|
|
{
|
|
Width = 22.0,
|
|
Height = 22.0,
|
|
CornerRadius = new CornerRadius(5.0),
|
|
Background = ParseBrush(text2 + "22"),
|
|
VerticalAlignment = VerticalAlignment.Center,
|
|
HorizontalAlignment = HorizontalAlignment.Center
|
|
};
|
|
border.Child = new TextBlock
|
|
{
|
|
Text = shortcutRow.Icon,
|
|
FontFamily = new FontFamily("Segoe MDL2 Assets"),
|
|
FontSize = 10.0,
|
|
Foreground = ParseBrush(text2),
|
|
HorizontalAlignment = HorizontalAlignment.Center,
|
|
VerticalAlignment = VerticalAlignment.Center
|
|
};
|
|
Grid.SetColumn(border, 0);
|
|
grid.Children.Add(border);
|
|
Border border2 = new Border
|
|
{
|
|
Background = background,
|
|
CornerRadius = new CornerRadius(5.0),
|
|
Padding = new Thickness(7.0, 3.0, 7.0, 3.0),
|
|
Margin = new Thickness(4.0, 1.0, 8.0, 1.0),
|
|
VerticalAlignment = VerticalAlignment.Center,
|
|
HorizontalAlignment = HorizontalAlignment.Left
|
|
};
|
|
border2.Child = new TextBlock
|
|
{
|
|
Text = shortcutRow.Key,
|
|
FontFamily = new FontFamily("Consolas, Courier New"),
|
|
FontSize = 11.0,
|
|
Foreground = foreground,
|
|
VerticalAlignment = VerticalAlignment.Center
|
|
};
|
|
Grid.SetColumn(border2, 1);
|
|
grid.Children.Add(border2);
|
|
TextBlock element = new TextBlock
|
|
{
|
|
Text = shortcutRow.Description,
|
|
FontSize = 11.5,
|
|
Foreground = foreground,
|
|
VerticalAlignment = VerticalAlignment.Center,
|
|
TextWrapping = TextWrapping.Wrap,
|
|
LineHeight = 16.0
|
|
};
|
|
Grid.SetColumn(element, 2);
|
|
grid.Children.Add(element);
|
|
control.Items.Add(grid);
|
|
}
|
|
}
|
|
|
|
private static SolidColorBrush ParseBrush(string hex)
|
|
{
|
|
try
|
|
{
|
|
return new SolidColorBrush((Color)ColorConverter.ConvertFromString(hex));
|
|
}
|
|
catch
|
|
{
|
|
return new SolidColorBrush(Colors.Transparent);
|
|
}
|
|
}
|
|
|
|
private void ThemeColorChk_Changed(object sender, RoutedEventArgs e)
|
|
{
|
|
SettingsService settingsService = (Application.Current as App)?.SettingsService;
|
|
if (settingsService != null)
|
|
{
|
|
settingsService.Settings.Launcher.ShortcutHelpUseThemeColor = ThemeColorChk.IsChecked == true;
|
|
settingsService.Save();
|
|
}
|
|
BuildItems();
|
|
}
|
|
|
|
private void ResizeGrip_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
|
|
{
|
|
if (e.ButtonState == MouseButtonState.Pressed)
|
|
{
|
|
ReleaseCapture();
|
|
SendMessage(new WindowInteropHelper(this).Handle, 161, 17, IntPtr.Zero);
|
|
}
|
|
}
|
|
|
|
private void Close_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
Close();
|
|
}
|
|
|
|
private void Window_KeyDown(object sender, KeyEventArgs e)
|
|
{
|
|
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0009: Invalid comparison between Unknown and I4
|
|
if ((int)e.Key == 13)
|
|
{
|
|
Close();
|
|
}
|
|
}
|
|
|
|
private void Window_MouseDown(object sender, MouseButtonEventArgs e)
|
|
{
|
|
if (e.ChangedButton == MouseButton.Left && e.LeftButton == MouseButtonState.Pressed)
|
|
{
|
|
try
|
|
{
|
|
DragMove();
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
}
|
|
|
|
[DebuggerNonUserCode]
|
|
[GeneratedCode("PresentationBuildTasks", "10.0.5.0")]
|
|
public void InitializeComponent()
|
|
{
|
|
if (!_contentLoaded)
|
|
{
|
|
_contentLoaded = true;
|
|
Uri resourceLocator = new Uri("/AxCopilot;component/views/shortcuthelpwindow.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:
|
|
((ShortcutHelpWindow)target).KeyDown += Window_KeyDown;
|
|
((ShortcutHelpWindow)target).MouseDown += Window_MouseDown;
|
|
break;
|
|
case 2:
|
|
((Button)target).Click += Close_Click;
|
|
break;
|
|
case 3:
|
|
NavigationItems = (ItemsControl)target;
|
|
break;
|
|
case 4:
|
|
FileActionItems = (ItemsControl)target;
|
|
break;
|
|
case 5:
|
|
ViewItems = (ItemsControl)target;
|
|
break;
|
|
case 6:
|
|
RunItems = (ItemsControl)target;
|
|
break;
|
|
case 7:
|
|
PrefixItems = (ItemsControl)target;
|
|
break;
|
|
case 8:
|
|
((Border)target).MouseLeftButtonDown += ResizeGrip_MouseLeftButtonDown;
|
|
break;
|
|
case 9:
|
|
ThemeColorChk = (CheckBox)target;
|
|
ThemeColorChk.Checked += ThemeColorChk_Changed;
|
|
ThemeColorChk.Unchecked += ThemeColorChk_Changed;
|
|
break;
|
|
case 10:
|
|
((Button)target).Click += Close_Click;
|
|
break;
|
|
default:
|
|
_contentLoaded = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|