Compare commits

...

10 Commits

19 changed files with 789 additions and 13 deletions

5
.gitignore vendored
View File

@@ -1,4 +1,3 @@
bin/
obj/ obj/
publish/ publish/
tools/ tools/
@@ -9,3 +8,7 @@ src/*/.vs/
*.DotSettings *.DotSettings
build/Fody* build/Fody*
*.vs/ *.vs/
*.dll
*.exe
*.log
*.pdb

View File

@@ -0,0 +1,100 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v6.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v6.0": {
"EVE-O-Preview/1.0.0": {
"dependencies": {
"LightInject": "7.0.1",
"MediatR": "9.0.0",
"Microsoft.CSharp": "4.7.0",
"Microsoft.NET.ILLink.Analyzers": "7.0.100-1.23211.1",
"Microsoft.NET.ILLink.Tasks": "7.0.100-1.23211.1",
"Newtonsoft.Json": "13.0.3"
},
"runtime": {
"EVE-O-Preview.dll": {}
}
},
"LightInject/7.0.1": {
"runtime": {
"lib/netstandard2.0/LightInject.dll": {
"assemblyVersion": "7.0.1.0",
"fileVersion": "7.0.1.0"
}
}
},
"MediatR/9.0.0": {
"runtime": {
"lib/netstandard2.1/MediatR.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.0.0"
}
}
},
"Microsoft.CSharp/4.7.0": {},
"Microsoft.NET.ILLink.Analyzers/7.0.100-1.23211.1": {},
"Microsoft.NET.ILLink.Tasks/7.0.100-1.23211.1": {},
"Newtonsoft.Json/13.0.3": {
"runtime": {
"lib/net6.0/Newtonsoft.Json.dll": {
"assemblyVersion": "13.0.0.0",
"fileVersion": "13.0.3.27908"
}
}
}
}
},
"libraries": {
"EVE-O-Preview/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"LightInject/7.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-aw4ayG2Pe68i+85ws8zYk7MPCKjEd4DeBoTqVvmjA2cfpYYNnw+v0E5T3PKdriKaxdKF+eUzlnxWWZnYK/gx4w==",
"path": "lightinject/7.0.1",
"hashPath": "lightinject.7.0.1.nupkg.sha512"
},
"MediatR/9.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-8b3UYNxegHVYcJMG2zH8wn+YqxLvXG+eMfj0cMCq/jTW72p6O3PCKMkrIv0mqyxdW7bA4gblsocw7n+/9Akg5g==",
"path": "mediatr/9.0.0",
"hashPath": "mediatr.9.0.0.nupkg.sha512"
},
"Microsoft.CSharp/4.7.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==",
"path": "microsoft.csharp/4.7.0",
"hashPath": "microsoft.csharp.4.7.0.nupkg.sha512"
},
"Microsoft.NET.ILLink.Analyzers/7.0.100-1.23211.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-0GvbEgDGcUQA9KuWcQU1WwYHXt1tBzNr1Nls/M57rM7NA/AndFwCaCEoJpJkmxRY7xLlPDBnmGp8h5+FNqUngg==",
"path": "microsoft.net.illink.analyzers/7.0.100-1.23211.1",
"hashPath": "microsoft.net.illink.analyzers.7.0.100-1.23211.1.nupkg.sha512"
},
"Microsoft.NET.ILLink.Tasks/7.0.100-1.23211.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-tvG8XZYLjT0o3WicCyKBZysVWo1jC9HdCFmNRmddx3WbAz0UCsd0qKZqpiEo99VLA8Re+FzWK51OcRldQPbt2Q==",
"path": "microsoft.net.illink.tasks/7.0.100-1.23211.1",
"hashPath": "microsoft.net.illink.tasks.7.0.100-1.23211.1.nupkg.sha512"
},
"Newtonsoft.Json/13.0.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==",
"path": "newtonsoft.json/13.0.3",
"hashPath": "newtonsoft.json.13.0.3.nupkg.sha512"
}
}
}

View File

@@ -0,0 +1,128 @@
{
"ConfigVersion": 1,
"CycleGroup1ForwardHotkeys": [
"F14",
"Control+F14"
],
"CycleGroup1BackwardHotkeys": [
"F13",
"Control+F13"
],
"CycleGroup1ClientsOrder": {
"EVE - Example DPS Toon 1": 1,
"EVE - Example DPS Toon 2": 2,
"EVE - Example DPS Toon 3": 3
},
"CycleGroup2ForwardHotkeys": [
"F16",
"Control+F16"
],
"CycleGroup2BackwardHotkeys": [
"F15",
"Control+F15"
],
"CycleGroup2ClientsOrder": {
"EVE - Example Logi Toon 1": 1,
"EVE - Example Scout Toon 2": 2,
"EVE - Example Tackle Toon 3": 3
},
"CycleGroup3ForwardHotkeys": [
""
],
"CycleGroup3BackwardHotkeys": [
""
],
"CycleGroup3ClientsOrder": {
"EVE - cycle group 3": 1
},
"CycleGroup4ForwardHotkeys": [
""
],
"CycleGroup4BackwardHotkeys": [
""
],
"CycleGroup4ClientsOrder": {
"EVE - cycle group 4": 1
},
"CycleGroup5ForwardHotkeys": [
""
],
"CycleGroup5BackwardHotkeys": [
""
],
"CycleGroup5ClientsOrder": {
"EVE - cycle group 5": 1
},
"PerClientActiveClientHighlightColor": {
"EVE - Example Toon 1": "Red",
"EVE - Example Toon 2": "Green"
},
"PerClientThumbnailSize": {
"EVE - Example Toon 1": "200, 200",
"EVE - Example Toon 2": "200, 200"
},
"PerClientThumbnailRegion": {},
"PerClientZoomAnchor": {
"EVE - Example Toon 1": 1,
"EVE - Example Toon 2": 7
},
"MinimizeToTray": true,
"ThumbnailRefreshPeriod": 500,
"ThumbnailResizeTimeoutPeriod": 500,
"WineCompatibilityMode": false,
"ThumbnailsOpacity": 0.5,
"EnableClientLayoutTracking": false,
"HideActiveClientThumbnail": false,
"HideLoginClientThumbnail": false,
"MinimizeInactiveClients": false,
"WindowsAnimationStyle": 1,
"ShowThumbnailsAlwaysOnTop": true,
"EnablePerClientThumbnailLayouts": false,
"HideThumbnailsOnLostFocus": false,
"HideThumbnailsDelay": 2,
"ThumbnailSize": "408, 177",
"ThumbnailMaximumSize": "960, 540",
"ThumbnailMinimumSize": "192, 108",
"EnableThumbnailSnap": true,
"ThumbnailSnapRange": 20,
"EnableThumbnailZoom": false,
"ThumbnailZoomFactor": 2,
"ThumbnailZoomAnchor": 0,
"OverlayLabelAnchor": 0,
"ShowThumbnailOverlays": true,
"ShowThumbnailFrames": false,
"LockThumbnailLocation": false,
"ThumbnailSnapToGrid": true,
"ThumbnailSnapToGridSizeX": 102,
"ThumbnailSnapToGridSizeY": 44,
"EnableActiveClientHighlight": false,
"ActiveClientHighlightColor": "GreenYellow",
"OverlayLabelColor": "Orange",
"OverlayLabelSize": 10,
"EnableThumbnailRegionSnipping": true,
"DefaultThumbnailRegion": "1187, 1252, 398, 174",
"CurrentProfile": "Default",
"AvailableProfiles": [
"Default"
],
"IconName": "IconOriginal",
"ActiveClientHighlightThickness": 3,
"LoginThumbnailLocation": "5, 5",
"ToggleTrackingHotkey": "Alt+F16",
"ToggleSingleProcessHotkey": "Control+F16",
"ToggleAllThumbnailsHotkey": "Shift+Alt+Oem3",
"ThumbnailsManuallyHidden": false,
"PerClientLayout": {},
"FlatLayout": {
"EVE - Sn v1 cosunoo (2)": "1938, 1100",
"EVE - Primorium (1)": "1530, 1100",
"EVE - PhatPhuckDave (3)": "1122, 1100"
},
"ClientLayout": {},
"ClientHotkey": {},
"DisableThumbnail": {},
"PriorityClients": [],
"ExecutablesToPreview": [
"exefile"
]
}

View File

@@ -0,0 +1,18 @@
{
"runtimeOptions": {
"tfm": "net6.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "6.0.0"
},
{
"name": "Microsoft.WindowsDesktop.App",
"version": "6.0.0"
}
],
"configProperties": {
"System.Reflection.Metadata.MetadataUpdater.IsSupported": false
}
}
}

View File

@@ -0,0 +1,91 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v8.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v8.0": {
"EVE-O-Preview/1.0.0": {
"dependencies": {
"LightInject": "7.0.1",
"MediatR": "9.0.0",
"Microsoft.CSharp": "4.7.0",
"Microsoft.NET.ILLink.Tasks": "8.0.18",
"Newtonsoft.Json": "13.0.3"
},
"runtime": {
"EVE-O-Preview.dll": {}
}
},
"LightInject/7.0.1": {
"runtime": {
"lib/net8.0/LightInject.dll": {
"assemblyVersion": "7.0.1.0",
"fileVersion": "7.0.1.0"
}
}
},
"MediatR/9.0.0": {
"runtime": {
"lib/netstandard2.1/MediatR.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.0.0"
}
}
},
"Microsoft.CSharp/4.7.0": {},
"Microsoft.NET.ILLink.Tasks/8.0.18": {},
"Newtonsoft.Json/13.0.3": {
"runtime": {
"lib/net6.0/Newtonsoft.Json.dll": {
"assemblyVersion": "13.0.0.0",
"fileVersion": "13.0.3.27908"
}
}
}
}
},
"libraries": {
"EVE-O-Preview/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"LightInject/7.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-aw4ayG2Pe68i+85ws8zYk7MPCKjEd4DeBoTqVvmjA2cfpYYNnw+v0E5T3PKdriKaxdKF+eUzlnxWWZnYK/gx4w==",
"path": "lightinject/7.0.1",
"hashPath": "lightinject.7.0.1.nupkg.sha512"
},
"MediatR/9.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-8b3UYNxegHVYcJMG2zH8wn+YqxLvXG+eMfj0cMCq/jTW72p6O3PCKMkrIv0mqyxdW7bA4gblsocw7n+/9Akg5g==",
"path": "mediatr/9.0.0",
"hashPath": "mediatr.9.0.0.nupkg.sha512"
},
"Microsoft.CSharp/4.7.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==",
"path": "microsoft.csharp/4.7.0",
"hashPath": "microsoft.csharp.4.7.0.nupkg.sha512"
},
"Microsoft.NET.ILLink.Tasks/8.0.18": {
"type": "package",
"serviceable": true,
"sha512": "sha512-OiXqr2YIBEV9dsAWEtasK470ALyJ0VxJ9k4MotOxlWV6HeEgrJKYMW4HHj1OCCXvqE0/A25wEKPkpfiBARgDZA==",
"path": "microsoft.net.illink.tasks/8.0.18",
"hashPath": "microsoft.net.illink.tasks.8.0.18.nupkg.sha512"
},
"Newtonsoft.Json/13.0.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==",
"path": "newtonsoft.json/13.0.3",
"hashPath": "newtonsoft.json.13.0.3.nupkg.sha512"
}
}
}

View File

@@ -0,0 +1,127 @@
{
"ConfigVersion": 1,
"CycleGroup1ForwardHotkeys": [
"F14",
"Control+F14"
],
"CycleGroup1BackwardHotkeys": [
"F13",
"Control+F13"
],
"CycleGroup1ClientsOrder": {
"EVE - Example DPS Toon 1": 1,
"EVE - Example DPS Toon 2": 2,
"EVE - Example DPS Toon 3": 3
},
"CycleGroup2ForwardHotkeys": [
"F16",
"Control+F16"
],
"CycleGroup2BackwardHotkeys": [
"F15",
"Control+F15"
],
"CycleGroup2ClientsOrder": {
"EVE - Example Logi Toon 1": 1,
"EVE - Example Scout Toon 2": 2,
"EVE - Example Tackle Toon 3": 3
},
"CycleGroup3ForwardHotkeys": [
""
],
"CycleGroup3BackwardHotkeys": [
""
],
"CycleGroup3ClientsOrder": {
"EVE - cycle group 3": 1
},
"CycleGroup4ForwardHotkeys": [
""
],
"CycleGroup4BackwardHotkeys": [
""
],
"CycleGroup4ClientsOrder": {
"EVE - cycle group 4": 1
},
"CycleGroup5ForwardHotkeys": [
""
],
"CycleGroup5BackwardHotkeys": [
""
],
"CycleGroup5ClientsOrder": {
"EVE - cycle group 5": 1
},
"PerClientActiveClientHighlightColor": {
"EVE - Example Toon 1": "Red",
"EVE - Example Toon 2": "Green"
},
"PerClientThumbnailSize": {
"EVE - Example Toon 1": "200, 200",
"EVE - Example Toon 2": "200, 200"
},
"PerClientThumbnailRegion": {},
"PerClientZoomAnchor": {
"EVE - Example Toon 1": 1,
"EVE - Example Toon 2": 7
},
"MinimizeToTray": true,
"ThumbnailRefreshPeriod": 500,
"ThumbnailResizeTimeoutPeriod": 500,
"WineCompatibilityMode": false,
"ThumbnailsOpacity": 1.0,
"EnableClientLayoutTracking": false,
"HideActiveClientThumbnail": false,
"HideLoginClientThumbnail": false,
"MinimizeInactiveClients": false,
"WindowsAnimationStyle": 1,
"ShowThumbnailsAlwaysOnTop": true,
"EnablePerClientThumbnailLayouts": false,
"HideThumbnailsOnLostFocus": false,
"HideThumbnailsDelay": 2,
"ThumbnailSize": "421, 186",
"ThumbnailMaximumSize": "960, 540",
"ThumbnailMinimumSize": "192, 108",
"EnableThumbnailSnap": true,
"ThumbnailSnapRange": 150,
"EnableThumbnailZoom": false,
"ThumbnailZoomFactor": 2,
"ThumbnailZoomAnchor": 0,
"OverlayLabelAnchor": 0,
"ShowThumbnailOverlays": true,
"ShowThumbnailFrames": false,
"LockThumbnailLocation": false,
"ThumbnailSnapToGrid": false,
"ThumbnailSnapToGridSizeX": 100,
"ThumbnailSnapToGridSizeY": 50,
"EnableActiveClientHighlight": true,
"ActiveClientHighlightColor": "GreenYellow",
"OverlayLabelColor": "Orange",
"OverlayLabelSize": 10,
"EnableThumbnailRegionSnipping": true,
"DefaultThumbnailRegion": "1191, 1245, 401, 180",
"CurrentProfile": "Default",
"AvailableProfiles": [
"Default"
],
"IconName": "IconOriginal",
"ActiveClientHighlightThickness": 3,
"LoginThumbnailLocation": "5, 5",
"ToggleTrackingHotkey": null,
"PerClientLayout": {},
"FlatLayout": {
"EVE - Sn v1 cosunoo (2)": "1990, 1072",
"EVE - Primorium (1)": "1569, 1072",
"EVE - PhatPhuckDave (3)": "1148, 1072"
},
"ClientLayout": {},
"ClientHotkey": {},
"DisableThumbnail": {
"EVE - PhatPhuckDave (3)": false
},
"PriorityClients": [],
"ExecutablesToPreview": [
"exefile"
]
}

View File

@@ -0,0 +1,20 @@
{
"runtimeOptions": {
"tfm": "net8.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "8.0.0"
},
{
"name": "Microsoft.WindowsDesktop.App",
"version": "8.0.0"
}
],
"configProperties": {
"System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": true,
"CSWINRT_USE_WINDOWS_UI_XAML_PROJECTIONS": false
}
}
}

View File

@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net8.0-windows8.0</TargetFramework> <TargetFramework>net6.0-windows</TargetFramework>
<OutputType>WinExe</OutputType> <OutputType>WinExe</OutputType>
<RootNamespace>EveOMock</RootNamespace> <RootNamespace>EveOMock</RootNamespace>
<AssemblyName>ExeFile</AssemblyName> <AssemblyName>ExeFile</AssemblyName>

View File

@@ -124,6 +124,10 @@ namespace EveOPreview.Configuration.Implementation {
this.IconName = ""; this.IconName = "";
this.LoginThumbnailLocation = new Point(5, 5); this.LoginThumbnailLocation = new Point(5, 5);
this.ToggleTrackingHotkey = "Alt+F16";
this.ToggleSingleProcessHotkey = "Control+F16";
this.ToggleAllThumbnailsHotkey = "Alt+F12";
this.ThumbnailsManuallyHidden = false;
} }
[JsonProperty("ConfigVersion")] [JsonProperty("ConfigVersion")]
@@ -318,6 +322,21 @@ namespace EveOPreview.Configuration.Implementation {
get; set; get; set;
} }
[JsonProperty("ToggleSingleProcessHotkey")]
public string ToggleSingleProcessHotkey {
get; set;
}
[JsonProperty("ToggleAllThumbnailsHotkey")]
public string ToggleAllThumbnailsHotkey {
get; set;
}
[JsonProperty("ThumbnailsManuallyHidden")]
public bool ThumbnailsManuallyHidden {
get; set;
}
[JsonProperty] [JsonProperty]
private Dictionary<string, Dictionary<string, Point>> PerClientLayout { private Dictionary<string, Dictionary<string, Point>> PerClientLayout {
get; set; get; set;

View File

@@ -25,6 +25,9 @@ namespace EveOPreview.Configuration {
Dictionary<string, int> CycleGroup5ClientsOrder { get; set; } Dictionary<string, int> CycleGroup5ClientsOrder { get; set; }
string ToggleTrackingHotkey { get; set; } string ToggleTrackingHotkey { get; set; }
string ToggleSingleProcessHotkey { get; set; }
string ToggleAllThumbnailsHotkey { get; set; }
bool ThumbnailsManuallyHidden { get; set; }
Dictionary<string, Color> PerClientActiveClientHighlightColor { get; set; } Dictionary<string, Color> PerClientActiveClientHighlightColor { get; set; }
Dictionary<string, Size> PerClientThumbnailSize { get; set; } Dictionary<string, Size> PerClientThumbnailSize { get; set; }

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<DefineConstants Condition="'$(EVEOTarget)'=='Linux'">LINUX</DefineConstants> <DefineConstants Condition="'$(EVEOTarget)'=='Linux'">LINUX</DefineConstants>
<TargetFramework>net8.0-windows8.0</TargetFramework> <TargetFramework>net6.0-windows</TargetFramework>
<OutputType>WinExe</OutputType> <OutputType>WinExe</OutputType>
<PublishSingleFile>true</PublishSingleFile> <PublishSingleFile>true</PublishSingleFile>
<IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract> <IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>

View File

@@ -0,0 +1,20 @@
using System.Threading;
using System.Threading.Tasks;
using EveOPreview.Mediator.Messages;
using EveOPreview.Services;
using MediatR;
namespace EveOPreview.Mediator.Handlers.Services {
public sealed class ReRegisterHotkeysHandler : INotificationHandler<ReRegisterHotkeys> {
private readonly IThumbnailManager _thumbnailManager;
public ReRegisterHotkeysHandler(IThumbnailManager thumbnailManager) {
this._thumbnailManager = thumbnailManager;
}
public Task Handle(ReRegisterHotkeys notification, CancellationToken cancellationToken) {
this._thumbnailManager.ReRegisterHotkeys();
return Task.CompletedTask;
}
}
}

View File

@@ -0,0 +1,5 @@
using MediatR;
namespace EveOPreview.Mediator.Messages {
public sealed class ReRegisterHotkeys : INotification {}
}

View File

@@ -133,6 +133,10 @@ namespace EveOPreview.Presenters {
this.View.AvailableProfiles = this._configuration.AvailableProfiles; this.View.AvailableProfiles = this._configuration.AvailableProfiles;
this.View.CurrentProfile = this._configuration.CurrentProfile; this.View.CurrentProfile = this._configuration.CurrentProfile;
this.View.ToggleTrackingHotkey = this._configuration.ToggleTrackingHotkey;
this.View.ToggleSingleProcessHotkey = this._configuration.ToggleSingleProcessHotkey;
this.View.ToggleAllThumbnailsHotkey = this._configuration.ToggleAllThumbnailsHotkey;
this.View.IconName = this._configuration.IconName; this.View.IconName = this._configuration.IconName;
} }
@@ -181,6 +185,13 @@ namespace EveOPreview.Presenters {
this._configuration.AvailableProfiles = this.View.AvailableProfiles; this._configuration.AvailableProfiles = this.View.AvailableProfiles;
this._configuration.CurrentProfile = this.View.CurrentProfile; this._configuration.CurrentProfile = this.View.CurrentProfile;
this._configuration.ToggleTrackingHotkey = this.View.ToggleTrackingHotkey;
this._configuration.ToggleSingleProcessHotkey = this.View.ToggleSingleProcessHotkey;
this._configuration.ToggleAllThumbnailsHotkey = this.View.ToggleAllThumbnailsHotkey;
// Re-register hotkeys if they changed
await this._mediator.Publish(new ReRegisterHotkeys());
// Publish region settings update if they changed // Publish region settings update if they changed
if (this._configuration.EnableThumbnailRegionSnipping != this.View.EnableThumbnailRegionSnipping || if (this._configuration.EnableThumbnailRegionSnipping != this.View.EnableThumbnailRegionSnipping ||
this._configuration.DefaultThumbnailRegion != this.View.DefaultThumbnailRegion) { this._configuration.DefaultThumbnailRegion != this.View.DefaultThumbnailRegion) {

View File

@@ -23,7 +23,7 @@ namespace EveOPreview.Services {
private const int WINDOW_POSITION_THRESHOLD_HIGH = 31_000; private const int WINDOW_POSITION_THRESHOLD_HIGH = 31_000;
private const int WINDOW_SIZE_THRESHOLD = 10; private const int WINDOW_SIZE_THRESHOLD = 10;
private const int FORCED_REFRESH_CYCLE_THRESHOLD = 2; private const int FORCED_REFRESH_CYCLE_THRESHOLD = 2;
private const int DEFAULT_LOCATION_CHANGE_NOTIFICATION_DELAY = 2; private const int DEFAULT_LOCATION_CHANGE_NOTIFICATION_DELAY = 0;
private const string DEFAULT_CLIENT_TITLE = "EVE"; private const string DEFAULT_CLIENT_TITLE = "EVE";
#endregion #endregion
@@ -52,6 +52,8 @@ namespace EveOPreview.Services {
private List<HotkeyHandler> _cycleClientHotkeyHandlers = new List<HotkeyHandler>(); private List<HotkeyHandler> _cycleClientHotkeyHandlers = new List<HotkeyHandler>();
private HotkeyHandler _toggleTrackingHotkey; private HotkeyHandler _toggleTrackingHotkey;
private HotkeyHandler _toggleSingleProcessHotkey;
private HotkeyHandler _toggleAllThumbnailsHotkey;
#endregion #endregion
public ThumbnailManager(IMediator mediator, IThumbnailConfiguration configuration, public ThumbnailManager(IMediator mediator, IThumbnailConfiguration configuration,
@@ -106,10 +108,11 @@ namespace EveOPreview.Services {
// RegisterCycleClientHotkey(this._configuration.CycleGroup5BackwardHotkeys?.Select(x => // RegisterCycleClientHotkey(this._configuration.CycleGroup5BackwardHotkeys?.Select(x =>
// this._configuration.StringToKey(x)), false, this._configuration.CycleGroup5ClientsOrder); // this._configuration.StringToKey(x)), false, this._configuration.CycleGroup5ClientsOrder);
// //
// Setup toggle tracking hotkey (Ctrl+T) // Setup toggle tracking hotkey
var mainHandle = this._processMonitor.GetMainProcess().Handle; var mainHandle = this._processMonitor.GetMainProcess().Handle;
System.Diagnostics.Debug.WriteLine($"Registering hotkey with main window handle: {mainHandle}"); System.Diagnostics.Debug.WriteLine($"Registering hotkey with main window handle: {mainHandle}");
this._toggleTrackingHotkey = new HotkeyHandler(mainHandle, Keys.Alt | Keys.F16); var toggleTrackingKey = this._configuration.StringToKey(this._configuration.ToggleTrackingHotkey);
this._toggleTrackingHotkey = new HotkeyHandler(mainHandle, toggleTrackingKey);
this._toggleTrackingHotkey.Pressed += (object s, HandledEventArgs e) => { this._toggleTrackingHotkey.Pressed += (object s, HandledEventArgs e) => {
var foregroundHandle = this._windowManager.GetForegroundWindowHandle(); var foregroundHandle = this._windowManager.GetForegroundWindowHandle();
if (foregroundHandle != IntPtr.Zero) { if (foregroundHandle != IntPtr.Zero) {
@@ -137,9 +140,10 @@ namespace EveOPreview.Services {
var registered = this._toggleTrackingHotkey.Register(); var registered = this._toggleTrackingHotkey.Register();
System.Diagnostics.Debug.WriteLine($"Hotkey registration result: {registered}"); System.Diagnostics.Debug.WriteLine($"Hotkey registration result: {registered}");
// Setup single process tracking hotkey (Ctrl+F16) // Setup single process tracking hotkey
var toggleSingleProcessHotkey = new HotkeyHandler(mainHandle, Keys.Control | Keys.F16); var toggleSingleProcessKey = this._configuration.StringToKey(this._configuration.ToggleSingleProcessHotkey);
toggleSingleProcessHotkey.Pressed += (object s, HandledEventArgs e) => { this._toggleSingleProcessHotkey = new HotkeyHandler(mainHandle, toggleSingleProcessKey);
this._toggleSingleProcessHotkey.Pressed += (object s, HandledEventArgs e) => {
var foregroundHandle = this._windowManager.GetForegroundWindowHandle(); var foregroundHandle = this._windowManager.GetForegroundWindowHandle();
if (foregroundHandle != IntPtr.Zero) { if (foregroundHandle != IntPtr.Zero) {
uint processId; uint processId;
@@ -165,8 +169,98 @@ namespace EveOPreview.Services {
} }
} }
}; };
registered = toggleSingleProcessHotkey.Register(); registered = this._toggleSingleProcessHotkey.Register();
System.Diagnostics.Debug.WriteLine($"Single process hotkey registration result: {registered}"); System.Diagnostics.Debug.WriteLine($"Single process hotkey registration result: {registered}");
// Setup toggle all thumbnails hotkey
var toggleAllThumbnailsKey = this._configuration.StringToKey(this._configuration.ToggleAllThumbnailsHotkey);
this._toggleAllThumbnailsHotkey = new HotkeyHandler(mainHandle, toggleAllThumbnailsKey);
this._toggleAllThumbnailsHotkey.Pressed += (object s, HandledEventArgs e) => {
this._configuration.ThumbnailsManuallyHidden = !this._configuration.ThumbnailsManuallyHidden;
System.Diagnostics.Debug.WriteLine(
$"Toggled all thumbnails: {(this._configuration.ThumbnailsManuallyHidden ? "Hidden" : "Visible")}");
e.Handled = true;
};
registered = this._toggleAllThumbnailsHotkey.Register();
System.Diagnostics.Debug.WriteLine($"Toggle all thumbnails hotkey registration result: {registered}");
}
public void ReRegisterHotkeys() {
// Unregister existing hotkeys
this._toggleTrackingHotkey?.Unregister();
this._toggleSingleProcessHotkey?.Unregister();
this._toggleAllThumbnailsHotkey?.Unregister();
// Re-register with new settings
var mainHandle = this._processMonitor.GetMainProcess().Handle;
var toggleTrackingKey = this._configuration.StringToKey(this._configuration.ToggleTrackingHotkey);
this._toggleTrackingHotkey = new HotkeyHandler(mainHandle, toggleTrackingKey);
this._toggleTrackingHotkey.Pressed += (object s, HandledEventArgs e) => {
var foregroundHandle = this._windowManager.GetForegroundWindowHandle();
if (foregroundHandle != IntPtr.Zero) {
uint processId;
GetWindowThreadProcessId(foregroundHandle, out processId);
var process = Process.GetProcessById((int)processId);
if (process != null) {
System.Diagnostics.Debug.WriteLine($"Found process: {process.ProcessName}");
if (_configuration.IsExecutableToPreview(process.ProcessName)) {
System.Diagnostics.Debug.WriteLine("Removing from executables to preview");
var exesToPreview = _configuration.ExecutablesToPreview.ToList();
exesToPreview.Remove(process.ProcessName.ToLower());
_configuration.ExecutablesToPreview = exesToPreview;
} else {
System.Diagnostics.Debug.WriteLine("Adding to executables to preview");
var exesToPreview = _configuration.ExecutablesToPreview.ToList();
exesToPreview.Add(process.ProcessName.ToLower());
_configuration.ExecutablesToPreview = exesToPreview;
}
e.Handled = true;
}
}
};
this._toggleTrackingHotkey.Register();
var toggleSingleProcessKey = this._configuration.StringToKey(this._configuration.ToggleSingleProcessHotkey);
this._toggleSingleProcessHotkey = new HotkeyHandler(mainHandle, toggleSingleProcessKey);
this._toggleSingleProcessHotkey.Pressed += (object s, HandledEventArgs e) => {
var foregroundHandle = this._windowManager.GetForegroundWindowHandle();
if (foregroundHandle != IntPtr.Zero) {
uint processId;
GetWindowThreadProcessId(foregroundHandle, out processId);
var process = Process.GetProcessById((int)processId);
if (process != null) {
System.Diagnostics.Debug.WriteLine($"Found process: {process.ProcessName} (PID: {process.Id})");
// Get the current tracked PID from ProcessMonitor
var currentTrackedPid = this._processMonitor.GetTrackedPid();
if (currentTrackedPid == process.Id) {
// Stop tracking this process
this._processMonitor.SetTrackedPid(0);
System.Diagnostics.Debug.WriteLine($"Stopped tracking process {process.Id}");
} else {
// Start tracking this process
this._processMonitor.SetTrackedPid(process.Id);
System.Diagnostics.Debug.WriteLine($"Started tracking process {process.Id}");
}
e.Handled = true;
}
}
};
this._toggleSingleProcessHotkey.Register();
var toggleAllThumbnailsKey = this._configuration.StringToKey(this._configuration.ToggleAllThumbnailsHotkey);
this._toggleAllThumbnailsHotkey = new HotkeyHandler(mainHandle, toggleAllThumbnailsKey);
this._toggleAllThumbnailsHotkey.Pressed += (object s, HandledEventArgs e) => {
this._configuration.ThumbnailsManuallyHidden = !this._configuration.ThumbnailsManuallyHidden;
System.Diagnostics.Debug.WriteLine(
$"Toggled all thumbnails: {(this._configuration.ThumbnailsManuallyHidden ? "Hidden" : "Visible")}");
e.Handled = true;
};
this._toggleAllThumbnailsHotkey.Register();
} }
public IThumbnailView GetClientByTitle(string title) { public IThumbnailView GetClientByTitle(string title) {
@@ -439,7 +533,8 @@ namespace EveOPreview.Services {
} }
bool hideAllThumbnails = bool hideAllThumbnails =
this._configuration.HideThumbnailsOnLostFocus && !(isClientWindow || isMainWindowActive); this._configuration.HideThumbnailsOnLostFocus && !(isClientWindow || isMainWindowActive) ||
this._configuration.ThumbnailsManuallyHidden;
// Wait for some time before hiding all previews // Wait for some time before hiding all previews
if (hideAllThumbnails) { if (hideAllThumbnails) {

View File

@@ -8,6 +8,7 @@ namespace EveOPreview.Services {
void UpdateThumbnailsSize(); void UpdateThumbnailsSize();
void UpdateThumbnailFrames(); void UpdateThumbnailFrames();
void UpdateThumbnailRegionSettings(); void UpdateThumbnailRegionSettings();
void ReRegisterHotkeys();
IThumbnailView GetClientByTitle(string title); IThumbnailView GetClientByTitle(string title);
IThumbnailView GetClientByPointer(System.IntPtr ptr); IThumbnailView GetClientByPointer(System.IntPtr ptr);

View File

@@ -64,6 +64,12 @@ namespace EveOPreview.View {
HideThumbnailsOnLostFocusCheckBox = new CheckBox(); HideThumbnailsOnLostFocusCheckBox = new CheckBox();
EnablePerClientThumbnailsLayoutsCheckBox = new CheckBox(); EnablePerClientThumbnailsLayoutsCheckBox = new CheckBox();
MinimizeToTrayCheckBox = new CheckBox(); MinimizeToTrayCheckBox = new CheckBox();
ToggleTrackingHotkeyLabel = new Label();
ToggleTrackingHotkeyTextBox = new TextBox();
ToggleSingleProcessHotkeyLabel = new Label();
ToggleSingleProcessHotkeyTextBox = new TextBox();
ToggleAllThumbnailsHotkeyLabel = new Label();
ToggleAllThumbnailsHotkeyTextBox = new TextBox();
EnableThumbnailRegionSnippingCheckBox = new CheckBox(); EnableThumbnailRegionSnippingCheckBox = new CheckBox();
RegionLeftLabel = new Label(); RegionLeftLabel = new Label();
RegionLeftNumericEdit = new NumericUpDown(); RegionLeftNumericEdit = new NumericUpDown();
@@ -256,6 +262,12 @@ namespace EveOPreview.View {
GeneralSettingsPanel.Controls.Add(HideThumbnailsOnLostFocusCheckBox); GeneralSettingsPanel.Controls.Add(HideThumbnailsOnLostFocusCheckBox);
GeneralSettingsPanel.Controls.Add(EnablePerClientThumbnailsLayoutsCheckBox); GeneralSettingsPanel.Controls.Add(EnablePerClientThumbnailsLayoutsCheckBox);
GeneralSettingsPanel.Controls.Add(MinimizeToTrayCheckBox); GeneralSettingsPanel.Controls.Add(MinimizeToTrayCheckBox);
GeneralSettingsPanel.Controls.Add(ToggleTrackingHotkeyLabel);
GeneralSettingsPanel.Controls.Add(ToggleTrackingHotkeyTextBox);
GeneralSettingsPanel.Controls.Add(ToggleSingleProcessHotkeyLabel);
GeneralSettingsPanel.Controls.Add(ToggleSingleProcessHotkeyTextBox);
GeneralSettingsPanel.Controls.Add(ToggleAllThumbnailsHotkeyLabel);
GeneralSettingsPanel.Controls.Add(ToggleAllThumbnailsHotkeyTextBox);
GeneralSettingsPanel.Dock = DockStyle.Fill; GeneralSettingsPanel.Dock = DockStyle.Fill;
GeneralSettingsPanel.Location = new Point(4, 4); GeneralSettingsPanel.Location = new Point(4, 4);
GeneralSettingsPanel.Margin = new Padding(4); GeneralSettingsPanel.Margin = new Padding(4);
@@ -378,6 +390,63 @@ namespace EveOPreview.View {
MinimizeToTrayCheckBox.UseVisualStyleBackColor = true; MinimizeToTrayCheckBox.UseVisualStyleBackColor = true;
MinimizeToTrayCheckBox.CheckedChanged += OptionChanged_Handler; MinimizeToTrayCheckBox.CheckedChanged += OptionChanged_Handler;
// //
// ToggleTrackingHotkeyLabel
//
ToggleTrackingHotkeyLabel.AutoSize = true;
ToggleTrackingHotkeyLabel.Location = new Point(9, 230);
ToggleTrackingHotkeyLabel.Margin = new Padding(4, 0, 4, 0);
ToggleTrackingHotkeyLabel.Name = "ToggleTrackingHotkeyLabel";
ToggleTrackingHotkeyLabel.Size = new Size(94, 15);
ToggleTrackingHotkeyLabel.TabIndex = 28;
ToggleTrackingHotkeyLabel.Text = "Toggle Tracking:";
//
// ToggleTrackingHotkeyTextBox
//
ToggleTrackingHotkeyTextBox.Location = new Point(145, 227);
ToggleTrackingHotkeyTextBox.Margin = new Padding(4);
ToggleTrackingHotkeyTextBox.Name = "ToggleTrackingHotkeyTextBox";
ToggleTrackingHotkeyTextBox.Size = new Size(137, 23);
ToggleTrackingHotkeyTextBox.TabIndex = 29;
ToggleTrackingHotkeyTextBox.Leave += HotkeyTextBox_Leave;
//
// ToggleSingleProcessHotkeyLabel
//
ToggleSingleProcessHotkeyLabel.AutoSize = true;
ToggleSingleProcessHotkeyLabel.Location = new Point(9, 260);
ToggleSingleProcessHotkeyLabel.Margin = new Padding(4, 0, 4, 0);
ToggleSingleProcessHotkeyLabel.Name = "ToggleSingleProcessHotkeyLabel";
ToggleSingleProcessHotkeyLabel.Size = new Size(124, 15);
ToggleSingleProcessHotkeyLabel.TabIndex = 30;
ToggleSingleProcessHotkeyLabel.Text = "Toggle Single Process:";
//
// ToggleSingleProcessHotkeyTextBox
//
ToggleSingleProcessHotkeyTextBox.Location = new Point(145, 257);
ToggleSingleProcessHotkeyTextBox.Margin = new Padding(4);
ToggleSingleProcessHotkeyTextBox.Name = "ToggleSingleProcessHotkeyTextBox";
ToggleSingleProcessHotkeyTextBox.Size = new Size(137, 23);
ToggleSingleProcessHotkeyTextBox.TabIndex = 31;
ToggleSingleProcessHotkeyTextBox.Leave += HotkeyTextBox_Leave;
//
// ToggleAllThumbnailsHotkeyLabel
//
ToggleAllThumbnailsHotkeyLabel.AutoSize = true;
ToggleAllThumbnailsHotkeyLabel.Location = new Point(9, 290);
ToggleAllThumbnailsHotkeyLabel.Margin = new Padding(4, 0, 4, 0);
ToggleAllThumbnailsHotkeyLabel.Name = "ToggleAllThumbnailsHotkeyLabel";
ToggleAllThumbnailsHotkeyLabel.Size = new Size(129, 15);
ToggleAllThumbnailsHotkeyLabel.TabIndex = 32;
ToggleAllThumbnailsHotkeyLabel.Text = "Toggle All Thumbnails:";
//
// ToggleAllThumbnailsHotkeyTextBox
//
ToggleAllThumbnailsHotkeyTextBox.Location = new Point(145, 287);
ToggleAllThumbnailsHotkeyTextBox.Margin = new Padding(4);
ToggleAllThumbnailsHotkeyTextBox.Name = "ToggleAllThumbnailsHotkeyTextBox";
ToggleAllThumbnailsHotkeyTextBox.Size = new Size(137, 23);
ToggleAllThumbnailsHotkeyTextBox.TabIndex = 33;
ToggleAllThumbnailsHotkeyTextBox.Leave += HotkeyTextBox_Leave;
//
// ThumbnailTabPage // ThumbnailTabPage
// //
ThumbnailTabPage.BackColor = SystemColors.Control; ThumbnailTabPage.BackColor = SystemColors.Control;
@@ -1354,7 +1423,7 @@ namespace EveOPreview.View {
// VersionLabel // VersionLabel
// //
VersionLabel.AutoSize = true; VersionLabel.AutoSize = true;
VersionLabel.Font = new Font("Microsoft Sans Serif", 12F, FontStyle.Bold); VersionLabel.Font = new Font("Microsoft Sans Serif", 12F, FontStyle.Bold, GraphicsUnit.Point);
VersionLabel.Location = new Point(155, 10); VersionLabel.Location = new Point(155, 10);
VersionLabel.Margin = new Padding(4, 0, 4, 0); VersionLabel.Margin = new Padding(4, 0, 4, 0);
VersionLabel.Name = "VersionLabel"; VersionLabel.Name = "VersionLabel";
@@ -1365,7 +1434,7 @@ namespace EveOPreview.View {
// NameLabel // NameLabel
// //
NameLabel.AutoSize = true; NameLabel.AutoSize = true;
NameLabel.Font = new Font("Microsoft Sans Serif", 12F, FontStyle.Bold); NameLabel.Font = new Font("Microsoft Sans Serif", 12F, FontStyle.Bold, GraphicsUnit.Point);
NameLabel.Location = new Point(5, 10); NameLabel.Location = new Point(5, 10);
NameLabel.Margin = new Padding(4, 0, 4, 0); NameLabel.Margin = new Padding(4, 0, 4, 0);
NameLabel.Name = "NameLabel"; NameLabel.Name = "NameLabel";
@@ -1530,5 +1599,11 @@ namespace EveOPreview.View {
private RadioButton OverlayLabelSWRadioButton; private RadioButton OverlayLabelSWRadioButton;
private Label label1; private Label label1;
private ComboBox AnimationStyleCombo; private ComboBox AnimationStyleCombo;
private Label ToggleTrackingHotkeyLabel;
private TextBox ToggleTrackingHotkeyTextBox;
private Label ToggleSingleProcessHotkeyLabel;
private TextBox ToggleSingleProcessHotkeyTextBox;
private Label ToggleAllThumbnailsHotkeyLabel;
private TextBox ToggleAllThumbnailsHotkeyTextBox;
} }
} }

View File

@@ -229,6 +229,21 @@ namespace EveOPreview.View {
set => ThumbnailSnapRangeNumericEdit.Value = value; set => ThumbnailSnapRangeNumericEdit.Value = value;
} }
public string ToggleTrackingHotkey {
get => this.ToggleTrackingHotkeyTextBox.Text;
set => this.ToggleTrackingHotkeyTextBox.Text = value;
}
public string ToggleSingleProcessHotkey {
get => this.ToggleSingleProcessHotkeyTextBox.Text;
set => this.ToggleSingleProcessHotkeyTextBox.Text = value;
}
public string ToggleAllThumbnailsHotkey {
get => this.ToggleAllThumbnailsHotkeyTextBox.Text;
set => this.ToggleAllThumbnailsHotkeyTextBox.Text = value;
}
public bool EnableActiveClientHighlight { public bool EnableActiveClientHighlight {
get => this.EnableActiveClientHighlightCheckBox.Checked; get => this.EnableActiveClientHighlightCheckBox.Checked;
set => this.EnableActiveClientHighlightCheckBox.Checked = value; set => this.EnableActiveClientHighlightCheckBox.Checked = value;
@@ -487,6 +502,11 @@ namespace EveOPreview.View {
this._suppressEvents = false; this._suppressEvents = false;
} }
// Update snap grid X and Y to 1/4 of width and height
Size currentSize = this.ThumbnailSize;
this.ThumbnailSnapToGridSizeX = currentSize.Width / 4;
this.ThumbnailSnapToGridSizeY = currentSize.Height / 4;
this.ThumbnailsSizeChanged?.Invoke(); this.ThumbnailsSizeChanged?.Invoke();
} }
@@ -533,6 +553,11 @@ namespace EveOPreview.View {
this._suppressEvents = false; this._suppressEvents = false;
} }
// Update snap grid X and Y to 1/4 of width and height
Size currentSize = this.ThumbnailSize;
this.ThumbnailSnapToGridSizeX = currentSize.Width / 4;
this.ThumbnailSnapToGridSizeY = currentSize.Height / 4;
// Prevent the default scroll behavior // Prevent the default scroll behavior
((HandledMouseEventArgs)e).Handled = true; ((HandledMouseEventArgs)e).Handled = true;
@@ -648,5 +673,36 @@ namespace EveOPreview.View {
private void AnimationStyleCombo_SelectedIndexChanged(object sender, EventArgs e) {} private void AnimationStyleCombo_SelectedIndexChanged(object sender, EventArgs e) {}
private void GeneralSettingsPanel_Paint(object sender, PaintEventArgs e) {} private void GeneralSettingsPanel_Paint(object sender, PaintEventArgs e) {}
private void HotkeyTextBox_Leave(object sender, EventArgs e) {
if (sender is System.Windows.Forms.TextBox textBox) {
string hotkeyText = textBox.Text.Trim();
if (!string.IsNullOrEmpty(hotkeyText)) {
try {
// Try to parse the hotkey to validate it
var keysConverter = new KeysConverter();
var key = keysConverter.ConvertFromInvariantString(hotkeyText);
if (key == null || (Keys)key == Keys.None) {
MessageBox.Show(
$"Invalid hotkey: {hotkeyText}\n\nPlease enter a valid hotkey combination (e.g., Alt+F1, Ctrl+Shift+A)",
"Invalid Hotkey", MessageBoxButtons.OK, MessageBoxIcon.Warning);
textBox.Focus();
return;
}
} catch (Exception) {
MessageBox.Show(
$"Invalid hotkey: {hotkeyText}\n\nPlease enter a valid hotkey combination (e.g., Alt+F1, Ctrl+Shift+A)",
"Invalid Hotkey", MessageBoxButtons.OK, MessageBoxIcon.Warning);
textBox.Focus();
return;
}
}
// If we get here, the hotkey is valid (or empty), so trigger the option change
this.OptionChanged_Handler(sender, e);
}
}
} }
} }

View File

@@ -47,6 +47,10 @@ namespace EveOPreview.View {
string CurrentProfile { get; set; } string CurrentProfile { get; set; }
List<string> AvailableProfiles { get; set; } List<string> AvailableProfiles { get; set; }
string ToggleTrackingHotkey { get; set; }
string ToggleSingleProcessHotkey { get; set; }
string ToggleAllThumbnailsHotkey { get; set; }
string IconName { get; set; } string IconName { get; set; }
void SetDocumentationUrl(string url); void SetDocumentationUrl(string url);