Move common things to AppCore from GuiApp

This commit is contained in:
2023-08-07 12:06:34 +02:00
parent 3d0eda54fb
commit 936c3896b9
48 changed files with 427 additions and 187 deletions

View File

@@ -0,0 +1,94 @@
using FileTime.App.Core.Models;
namespace FileTime.App.Core.Configuration;
public class CommandBindingConfiguration
{
public List<KeyConfig> Keys { get; set; }
public string Command { get; set; }
public string KeysDisplayText => GetKeysDisplayText();
public CommandBindingConfiguration()
{
Command = null!;
Keys = null!;
}
public CommandBindingConfiguration(string command, IEnumerable<KeyConfig> keys)
{
Keys = new List<KeyConfig>(keys);
Command = command;
}
public CommandBindingConfiguration(string command, KeyConfig key)
{
Keys = new List<KeyConfig> { key };
Command = command;
}
public CommandBindingConfiguration(string command, IEnumerable<Keys> keys)
{
Keys = keys.Select(k => new KeyConfig(k)).ToList();
Command = command;
}
public CommandBindingConfiguration(string command, Keys key)
{
Keys = new List<KeyConfig>() { new(key) };
Command = command;
}
public string GetKeysDisplayText()
{
var s = "";
foreach (var k in Keys)
{
var keyString = k.Key.ToString();
if (keyString.Length == 1)
{
s += AddKeyWithCtrlOrAlt(k, s, (_, _, _) => k.Shift ? keyString.ToUpper() : keyString.ToLower());
}
else
{
s += AddKeyWithCtrlOrAlt(k, s, AddSpecialKey);
}
}
return s;
}
private static string AddKeyWithCtrlOrAlt(
KeyConfig key,
string currentText,
Func<KeyConfig, string, bool, string> keyProcessor)
{
var s = "";
var ctrlOrAlt = key.Ctrl || key.Alt;
if (ctrlOrAlt && currentText.Length > 0 && currentText.Last() != ' ') s += " ";
if (key.Ctrl) s += "CTRL+";
if (key.Alt) s += "ALT+";
s += keyProcessor(key, currentText, ctrlOrAlt);
if (ctrlOrAlt) s += " ";
return s;
}
private static string AddSpecialKey(KeyConfig key, string currentText, bool wasCtrlOrAlt)
{
var s = "";
if (currentText.Length > 0 && currentText.Last() != ' ' && !wasCtrlOrAlt) s += " ";
s += key.Key.ToString();
if (!wasCtrlOrAlt) s += " ";
return s;
}
}

View File

@@ -0,0 +1,8 @@
namespace FileTime.App.Core.Configuration;
public class KeyBindingConfiguration
{
public bool UseDefaultBindings { get; set; } = true;
public List<CommandBindingConfiguration> DefaultKeyBindings { get; set; } = new();
public List<CommandBindingConfiguration> KeyBindings { get; set; } = new();
}

View File

@@ -0,0 +1,31 @@
using FileTime.App.Core.Models;
namespace FileTime.App.Core.Configuration;
public class KeyConfig
{
public Keys Key { get; set; }
public bool Shift { get; set; }
public bool Alt { get; set; }
public bool Ctrl { get; set; }
public KeyConfig() { }
public KeyConfig(
Keys key,
bool shift = false,
bool alt = false,
bool ctrl = false)
{
Key = key;
Shift = shift;
Alt = alt;
Ctrl = ctrl;
}
public bool AreEquals(KeyConfig otherKeyConfig) =>
Key.Equals(otherKeyConfig.Key)
&& Alt == otherKeyConfig.Alt
&& Shift == otherKeyConfig.Shift
&& Ctrl == otherKeyConfig.Ctrl;
}

View File

@@ -0,0 +1,15 @@
namespace FileTime.App.Core.Configuration;
public class ProgramConfiguration
{
public string? Path { get; set; }
public string? Arguments { get; set; }
public ProgramConfiguration() { }
public ProgramConfiguration(string? path, string? arguments = null)
{
Path = path;
Arguments = arguments;
}
}

View File

@@ -0,0 +1,7 @@
namespace FileTime.App.Core.Configuration;
public class ProgramsConfiguration
{
public List<ProgramConfiguration> DefaultEditorPrograms { get; set; } = new();
public List<ProgramConfiguration> EditorPrograms { get; set; } = new();
}

View File

@@ -0,0 +1,7 @@
namespace FileTime.App.Core.Configuration;
public static class SectionNames
{
public const string KeybindingSectionName = "KeyBindings";
public const string ProgramsSectionName = "Programs";
}

View File

@@ -0,0 +1,9 @@
using FileTime.App.Core.Configuration;
namespace FileTime.App.Core.Extensions;
public static class KeyConfigExtensions
{
public static bool AreKeysEqual(this IReadOnlyList<KeyConfig> collection1, IReadOnlyList<KeyConfig> collection2)
=> collection1.Count == collection2.Count && collection1.Zip(collection2).All(t => t.First.AreEquals(t.Second));
}

View File

@@ -0,0 +1,26 @@
namespace FileTime.App.Core.Models;
public class GeneralKeyEventArgs
{
private readonly Action<bool> _handledChanged;
private bool _handled;
public required Keys Key { get; init; }
public bool Handled
{
get => _handled;
set
{
if (_handled != value)
{
_handled = value;
_handledChanged(value);
}
}
}
public GeneralKeyEventArgs(Action<bool> handledChanged)
{
_handledChanged = handledChanged;
}
}

View File

@@ -0,0 +1,58 @@
namespace FileTime.App.Core.Models;
public enum Keys
{
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
F1,
F2,
F3,
F4,
F5,
F6,
F7,
F8,
F9,
F10,
F11,
F12,
Up,
Down,
Left,
Right,
Enter,
Escape,
Back,
Space,
PageUp,
PageDown,
Comma,
Question,
Tab,
LWin,
RWin,
}

View File

@@ -0,0 +1,8 @@
using FileTime.App.Core.Models;
namespace FileTime.App.Core.Services;
public interface IAppKeyService<TKey>
{
Keys? MapKey(TKey key);
}

View File

@@ -0,0 +1,10 @@
using FileTime.App.Core.Configuration;
namespace FileTime.App.Core.Services;
public interface IKeyboardConfigurationService
{
IReadOnlyList<CommandBindingConfiguration> CommandBindings { get; }
IReadOnlyList<CommandBindingConfiguration> UniversalCommandBindings { get; }
IReadOnlyList<CommandBindingConfiguration> AllShortcut { get; }
}

View File

@@ -0,0 +1,7 @@
namespace FileTime.App.Core.Services;
public interface ILifecycleService
{
Task InitStartupHandlersAsync();
Task ExitAsync();
}