119 lines
4.6 KiB
C#
119 lines
4.6 KiB
C#
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Input;
|
|
using System.Windows.Media;
|
|
|
|
namespace JJServiceManager
|
|
{
|
|
/// <summary>설정 화면</summary>
|
|
public sealed class SettingsWindow : Window
|
|
{
|
|
private readonly AppSettings _s;
|
|
private readonly CheckBox _startup, _hotkey, _opLog, _shutdownButtons;
|
|
private readonly TextBox _hotkeyBox;
|
|
private readonly ComboBox _logMode, _esc;
|
|
private ModifierKeys _mods;
|
|
private Key _key;
|
|
|
|
public SettingsWindow(AppSettings current)
|
|
{
|
|
_s = current;
|
|
|
|
Title = "설정";
|
|
Width = 720;
|
|
SizeToContent = SizeToContent.Height;
|
|
ResizeMode = ResizeMode.NoResize;
|
|
FontFamily = new FontFamily("Malgun Gothic");
|
|
FontSize = 13;
|
|
Background = Brushes2.Make("#FAFAFA");
|
|
WindowStartupLocation = WindowStartupLocation.CenterOwner;
|
|
ShowInTaskbar = false;
|
|
AppIcon.Apply(this);
|
|
|
|
var root = XamlLoader.LoadElement("Settings.xaml");
|
|
Content = root;
|
|
|
|
_startup = root.Find<CheckBox>("chkStartup");
|
|
_hotkey = root.Find<CheckBox>("chkHotkey");
|
|
_opLog = root.Find<CheckBox>("chkOpLog");
|
|
_shutdownButtons = root.Find<CheckBox>("chkShutdownButtons");
|
|
_hotkeyBox = root.Find<TextBox>("txtHotkey");
|
|
_logMode = root.Find<ComboBox>("cmbLogMode");
|
|
_esc = root.Find<ComboBox>("cmbEsc");
|
|
root.Find<TextBlock>("txtDataPath").Text = "설정 파일: " + SettingsStore.SettingsPath
|
|
+ "\n작업 로그 파일: " + OperationLogFile.Folder;
|
|
|
|
// 현재 값 표시
|
|
_startup.IsChecked = current.RunAtStartup;
|
|
_hotkey.IsChecked = current.HotkeyEnabled;
|
|
_opLog.IsChecked = current.ShowOperationLog;
|
|
_shutdownButtons.IsChecked = current.ShowShutdownButtons;
|
|
_logMode.SelectedIndex = (int)current.LogWindowMode;
|
|
_esc.SelectedIndex = (int)current.EscAction;
|
|
_mods = (ModifierKeys)current.HotkeyModifiers;
|
|
_key = (Key)current.HotkeyKey;
|
|
ShowHotkey();
|
|
|
|
// 단축키: 클릭 후 직접 눌러서 지정
|
|
_hotkeyBox.GotKeyboardFocus += (s, e) => _hotkeyBox.Background = Brushes2.Make("#FFF8E1");
|
|
_hotkeyBox.LostKeyboardFocus += (s, e) => { _hotkeyBox.Background = Brushes2.Make("#FAFAFA"); ShowHotkey(); };
|
|
_hotkeyBox.PreviewKeyDown += OnHotkeyKeyDown;
|
|
|
|
root.Find<Button>("btnOk").Click += (s, e) => Save();
|
|
root.Find<Button>("btnCancel").Click += (s, e) => Close();
|
|
PreviewKeyDown += (s, e) =>
|
|
{
|
|
if (e.Key == Key.Escape && !_hotkeyBox.IsKeyboardFocused) Close();
|
|
};
|
|
}
|
|
|
|
private void OnHotkeyKeyDown(object sender, KeyEventArgs e)
|
|
{
|
|
e.Handled = true;
|
|
var key = e.Key == Key.System ? e.SystemKey : e.Key;
|
|
var mods = Keyboard.Modifiers;
|
|
if (Keyboard.IsKeyDown(Key.LWin) || Keyboard.IsKeyDown(Key.RWin)) mods |= ModifierKeys.Windows;
|
|
|
|
// 보조키만 누른 상태: 진행 중 표시
|
|
if (key is Key.LeftCtrl or Key.RightCtrl or Key.LeftAlt or Key.RightAlt
|
|
or Key.LeftShift or Key.RightShift or Key.LWin or Key.RWin)
|
|
{
|
|
_hotkeyBox.Text = HotkeyManager.Format(mods, Key.None) + "…";
|
|
return;
|
|
}
|
|
|
|
// Tab은 포커스 이동에 사용
|
|
if (key == Key.Tab && mods == ModifierKeys.None)
|
|
{
|
|
e.Handled = false;
|
|
return;
|
|
}
|
|
|
|
if ((mods & (ModifierKeys.Control | ModifierKeys.Alt | ModifierKeys.Windows)) == 0)
|
|
{
|
|
_hotkeyBox.Text = "Ctrl / Alt / Win 중 하나와 함께 누르세요";
|
|
return;
|
|
}
|
|
|
|
_mods = mods;
|
|
_key = key;
|
|
ShowHotkey();
|
|
}
|
|
|
|
private void ShowHotkey() => _hotkeyBox.Text = HotkeyManager.Format(_mods, _key);
|
|
|
|
private void Save()
|
|
{
|
|
_s.RunAtStartup = _startup.IsChecked == true;
|
|
_s.HotkeyEnabled = _hotkey.IsChecked == true;
|
|
_s.HotkeyModifiers = (int)_mods;
|
|
_s.HotkeyKey = (int)_key;
|
|
_s.ShowOperationLog = _opLog.IsChecked == true;
|
|
_s.ShowShutdownButtons = _shutdownButtons.IsChecked == true;
|
|
_s.LogWindowMode = (LogWindowMode)System.Math.Max(0, _logMode.SelectedIndex);
|
|
_s.EscAction = (EscAction)System.Math.Max(0, _esc.SelectedIndex);
|
|
DialogResult = true;
|
|
}
|
|
}
|
|
}
|