1 Commits

Author SHA1 Message Date
b4bb15672a Update config for artifact recovery 2026-01-14 20:34:35 +01:00
16 changed files with 215 additions and 727 deletions

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

@@ -66,11 +66,11 @@
"EVE - Example Toon 1": 1,
"EVE - Example Toon 2": 7
},
"MinimizeToTray": true,
"MinimizeToTray": false,
"ThumbnailRefreshPeriod": 500,
"ThumbnailResizeTimeoutPeriod": 500,
"WineCompatibilityMode": false,
"ThumbnailsOpacity": 1.0,
"ThumbnailsOpacity": 0.5,
"EnableClientLayoutTracking": false,
"HideActiveClientThumbnail": false,
"HideLoginClientThumbnail": false,
@@ -80,11 +80,11 @@
"EnablePerClientThumbnailLayouts": false,
"HideThumbnailsOnLostFocus": false,
"HideThumbnailsDelay": 2,
"ThumbnailSize": "429, 140",
"ThumbnailSize": "408, 177",
"ThumbnailMaximumSize": "960, 540",
"ThumbnailMinimumSize": "192, 108",
"EnableThumbnailSnap": true,
"ThumbnailSnapRange": 0,
"ThumbnailSnapRange": 20,
"EnableThumbnailZoom": false,
"ThumbnailZoomFactor": 2,
"ThumbnailZoomAnchor": 0,
@@ -93,14 +93,14 @@
"ShowThumbnailFrames": false,
"LockThumbnailLocation": false,
"ThumbnailSnapToGrid": true,
"ThumbnailSnapToGridSizeX": 107,
"ThumbnailSnapToGridSizeY": 35,
"EnableActiveClientHighlight": true,
"ThumbnailSnapToGridSizeX": 102,
"ThumbnailSnapToGridSizeY": 44,
"EnableActiveClientHighlight": false,
"ActiveClientHighlightColor": "GreenYellow",
"OverlayLabelColor": "Orange",
"OverlayLabelSize": 10,
"EnableThumbnailRegionSnipping": true,
"DefaultThumbnailRegion": "1205, 1269, 429, 140",
"DefaultThumbnailRegion": "1187, 1252, 398, 174",
"CurrentProfile": "Default",
"AvailableProfiles": [
"Default"
@@ -110,15 +110,13 @@
"LoginThumbnailLocation": "5, 5",
"ToggleTrackingHotkey": "Alt+F16",
"ToggleSingleProcessHotkey": "Control+F16",
"ToggleAllThumbnailsHotkey": "Alt+Oem3",
"ToggleAllThumbnailsHotkey": "Alt+F12",
"ThumbnailsManuallyHidden": false,
"PerClientLayout": {},
"FlatLayout": {
"EVE - Quartio": "0, 1295",
"EVE - Tertiale": "0, 1155",
"EVE - Secundamen": "0, 1015",
"EVE - Primorium": "0, 875",
"EVE - PhatPhuckDave": "0, 735"
"EVE - Sn v1 cosunoo (2)": "1938, 1100",
"EVE - Primorium (1)": "1530, 1100",
"EVE - PhatPhuckDave (3)": "1122, 1100"
},
"ClientLayout": {},
"ClientHotkey": {},
@@ -127,4 +125,4 @@
"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

@@ -80,11 +80,11 @@
"EnablePerClientThumbnailLayouts": false,
"HideThumbnailsOnLostFocus": false,
"HideThumbnailsDelay": 2,
"ThumbnailSize": "451, 238",
"ThumbnailSize": "451, 388",
"ThumbnailMaximumSize": "960, 540",
"ThumbnailMinimumSize": "192, 108",
"EnableThumbnailSnap": true,
"ThumbnailSnapRange": 150,
"ThumbnailSnapRange": 0,
"EnableThumbnailZoom": false,
"ThumbnailZoomFactor": 2,
"ThumbnailZoomAnchor": 0,
@@ -94,13 +94,13 @@
"LockThumbnailLocation": false,
"ThumbnailSnapToGrid": true,
"ThumbnailSnapToGridSizeX": 112,
"ThumbnailSnapToGridSizeY": 59,
"ThumbnailSnapToGridSizeY": 97,
"EnableActiveClientHighlight": true,
"ActiveClientHighlightColor": "GreenYellow",
"OverlayLabelColor": "Orange",
"OverlayLabelSize": 10,
"EnableThumbnailRegionSnipping": true,
"DefaultThumbnailRegion": "1664, 188, 451, 238",
"DefaultThumbnailRegion": "1384, 188, 451, 388",
"CurrentProfile": "Default",
"AvailableProfiles": [
"Default"
@@ -111,25 +111,18 @@
"ToggleTrackingHotkey": "Alt+F16",
"ToggleSingleProcessHotkey": "Control+F16",
"ToggleAllThumbnailsHotkey": "Shift+Alt+Oem3",
"ThumbnailsManuallyHidden": false,
"ThumbnailsManuallyHidden": true,
"PerClientLayout": {},
"FlatLayout": {
"EVE - Sn v1 cosunoo (2)": "1995, 1058",
"EVE - Primorium (1)": "240, 645",
"EVE - PhatPhuckDave (3)": "224, -2",
"EVE - Primorium (3)": "146, 285",
"EVE - PhatPhuckDave (2)": "146, 57",
"EVE - Sn v1 cosunoo (1)": "154, 472",
"EVE - Sn v1 cosunoo (3)": "292, 517",
"EVE - Primorium (2)": "224, 236",
"EVE - PhatPhuckDave (1)": "292, 57",
"EVE - Secundamen (1)": "224, 474"
"EVE - Quartio": "-1229, 1067",
"EVE - Tertiale": "-1680, 1067",
"EVE - Secundamen": "-2131, 1067",
"EVE - Primorium": "-2576, 679",
"EVE - PhatPhuckDave": "-2576, 291"
},
"ClientLayout": {},
"ClientHotkey": {},
"DisableThumbnail": {
"EVE - PhatPhuckDave (1)": false
},
"DisableThumbnail": {},
"PriorityClients": [],
"ExecutablesToPreview": [
"exefile"

View File

@@ -1,135 +0,0 @@
{
"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": "451, 238",
"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": true,
"ThumbnailSnapToGridSizeX": 112,
"ThumbnailSnapToGridSizeY": 59,
"EnableActiveClientHighlight": true,
"ActiveClientHighlightColor": "GreenYellow",
"OverlayLabelColor": "Orange",
"OverlayLabelSize": 10,
"EnableThumbnailRegionSnipping": true,
"DefaultThumbnailRegion": "1664, 188, 451, 238",
"CurrentProfile": "Default",
"ProfileReadOnly": false,
"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)": "1995, 1058",
"EVE - Primorium (1)": "240, 645",
"EVE - PhatPhuckDave (3)": "224, -2",
"EVE - Primorium (3)": "146, 285",
"EVE - PhatPhuckDave (2)": "146, 57",
"EVE - Sn v1 cosunoo (1)": "154, 472",
"EVE - Sn v1 cosunoo (3)": "292, 517",
"EVE - Primorium (2)": "224, 236",
"EVE - PhatPhuckDave (1)": "292, 57",
"EVE - Secundamen (1)": "224, 474"
},
"ClientLayout": {},
"ClientHotkey": {},
"DisableThumbnail": {
"EVE - PhatPhuckDave (1)": false
},
"PriorityClients": [],
"ExecutablesToPreview": [
"exefile"
]
}

View File

@@ -1,4 +0,0 @@
{
"CurrentProfile": "capacitor",
"ProfileReadOnly": true
}

View File

@@ -1,130 +0,0 @@
{
"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": "451, 238",
"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": true,
"ThumbnailSnapToGridSizeX": 112,
"ThumbnailSnapToGridSizeY": 59,
"EnableActiveClientHighlight": true,
"ActiveClientHighlightColor": "GreenYellow",
"OverlayLabelColor": "Orange",
"OverlayLabelSize": 10,
"EnableThumbnailRegionSnipping": true,
"DefaultThumbnailRegion": "1384, 188, 451, 238",
"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 - Quartio": "0, 1239",
"EVE - Tertiale": "0, 1003",
"EVE - Secundamen": "0, 767",
"EVE - Primorium": "448, 1121",
"EVE - PhatPhuckDave": "448, 885"
},
"ClientLayout": {},
"ClientHotkey": {},
"DisableThumbnail": {},
"PriorityClients": [],
"ExecutablesToPreview": [
"exefile"
]
}

View File

@@ -1,130 +0,0 @@
{
"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": "451, 388",
"ThumbnailMaximumSize": "960, 540",
"ThumbnailMinimumSize": "192, 108",
"EnableThumbnailSnap": true,
"ThumbnailSnapRange": 0,
"EnableThumbnailZoom": false,
"ThumbnailZoomFactor": 2,
"ThumbnailZoomAnchor": 0,
"OverlayLabelAnchor": 0,
"ShowThumbnailOverlays": true,
"ShowThumbnailFrames": false,
"LockThumbnailLocation": false,
"ThumbnailSnapToGrid": true,
"ThumbnailSnapToGridSizeX": 112,
"ThumbnailSnapToGridSizeY": 97,
"EnableActiveClientHighlight": true,
"ActiveClientHighlightColor": "GreenYellow",
"OverlayLabelColor": "Orange",
"OverlayLabelSize": 10,
"EnableThumbnailRegionSnipping": true,
"DefaultThumbnailRegion": "1384, 188, 451, 388",
"CurrentProfile": "Default",
"AvailableProfiles": [
"Default"
],
"IconName": "IconOriginal",
"ActiveClientHighlightThickness": 3,
"LoginThumbnailLocation": "5, 5",
"ToggleTrackingHotkey": "Alt+F16",
"ToggleSingleProcessHotkey": "Control+F16",
"ToggleAllThumbnailsHotkey": "Shift+Alt+Oem3",
"ThumbnailsManuallyHidden": true,
"PerClientLayout": {},
"FlatLayout": {
"EVE - Quartio": "-1229, 1067",
"EVE - Tertiale": "-1680, 1067",
"EVE - Secundamen": "-2131, 1067",
"EVE - Primorium": "-2576, 679",
"EVE - PhatPhuckDave": "-2576, 291"
},
"ClientLayout": {},
"ClientHotkey": {},
"DisableThumbnail": {},
"PriorityClients": [],
"ExecutablesToPreview": [
"exefile"
]
}

View File

@@ -1,14 +1,9 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.IO;
using Newtonsoft.Json;
namespace EveOPreview.Configuration.Implementation {
class ConfigurationStorage : IConfigurationStorage {
private const string CONFIGURATION_FILE_NAME = "EVE-O-Preview.json";
private const string PROFILES_DIRECTORY = "Profiles";
private const string MASTER_CONFIG_FILE = "master.json";
private readonly IAppConfig _appConfig;
private readonly IThumbnailConfiguration _thumbnailConfiguration;
@@ -19,185 +14,39 @@ namespace EveOPreview.Configuration.Implementation {
}
public void Load() {
string masterConfigPath = this.GetMasterConfigPath();
string filename = this.GetConfigFileName();
// First, load the master configuration which contains ProfileReadOnly and CurrentProfile
string currentProfile = "Default";
bool profileReadOnly = false;
if (File.Exists(masterConfigPath)) {
string masterRawData = File.ReadAllText(masterConfigPath);
var masterConfig = JsonConvert.DeserializeObject<dynamic>(masterRawData);
if (masterConfig.CurrentProfile != null) {
currentProfile = masterConfig.CurrentProfile.ToString();
}
if (masterConfig.ProfileReadOnly != null) {
profileReadOnly = (bool)masterConfig.ProfileReadOnly;
}
if (!File.Exists(filename)) {
return;
}
this._thumbnailConfiguration.CurrentProfile = currentProfile;
this._thumbnailConfiguration.ProfileReadOnly = profileReadOnly;
string rawData = File.ReadAllText(filename);
// Scan the profiles directory for available profiles AFTER loading master config
List<string> scannedProfiles = this.ScanAvailableProfiles();
JsonSerializerSettings jsonSerializerSettings =
new JsonSerializerSettings() { ObjectCreationHandling = ObjectCreationHandling.Replace };
// Replace AvailableProfiles with scanned profiles (they are the source of truth)
this._thumbnailConfiguration.AvailableProfiles.Clear();
foreach (string profile in scannedProfiles) {
this._thumbnailConfiguration.AvailableProfiles.Add(profile);
}
// StageHotkeyArraysToAvoidDuplicates(rawData);
// Ensure CurrentProfile is in the list
if (!string.IsNullOrEmpty(this._thumbnailConfiguration.CurrentProfile) &&
!this._thumbnailConfiguration.AvailableProfiles.Contains(this._thumbnailConfiguration.CurrentProfile)) {
this._thumbnailConfiguration.AvailableProfiles.Add(this._thumbnailConfiguration.CurrentProfile);
}
// Then, load the profile-specific configuration
// IMPORTANT: Reset the configuration to clean state before loading
// to avoid merging with existing default values
string profileConfigPath = this.GetProfileConfigPath(currentProfile);
if (File.Exists(profileConfigPath)) {
string profileRawData = File.ReadAllText(profileConfigPath);
JsonSerializerSettings jsonSerializerSettings =
new JsonSerializerSettings() { ObjectCreationHandling = ObjectCreationHandling.Replace };
JsonConvert.PopulateObject(profileRawData, this._thumbnailConfiguration, jsonSerializerSettings);
} else {
// Try to load from legacy config file for backwards compatibility
string legacyConfigPath = this.GetConfigFileName();
if (File.Exists(legacyConfigPath)) {
string legacyRawData = File.ReadAllText(legacyConfigPath);
JsonSerializerSettings jsonSerializerSettings =
new JsonSerializerSettings() { ObjectCreationHandling = ObjectCreationHandling.Replace };
JsonConvert.PopulateObject(legacyRawData, this._thumbnailConfiguration, jsonSerializerSettings);
}
}
// Restore the values we just set (they might have been overwritten by profile load)
this._thumbnailConfiguration.CurrentProfile = currentProfile;
this._thumbnailConfiguration.ProfileReadOnly = profileReadOnly;
// Re-scan profiles after loading in case the profile overwrote AvailableProfiles
this._thumbnailConfiguration.AvailableProfiles.Clear();
foreach (string profile in scannedProfiles) {
this._thumbnailConfiguration.AvailableProfiles.Add(profile);
}
JsonConvert.PopulateObject(rawData, this._thumbnailConfiguration, jsonSerializerSettings);
// Validate data after loading it
this._thumbnailConfiguration.ApplyRestrictions();
}
public void Save() {
// Save master configuration (contains ProfileReadOnly and CurrentProfile)
this.SaveMasterConfig();
// If profile is read-only, don't save to the profile file
if (!this._thumbnailConfiguration.ProfileReadOnly) {
this.SaveProfileConfig();
}
}
private void SaveMasterConfig() {
string masterConfigPath = this.GetMasterConfigPath();
string directory = Path.GetDirectoryName(masterConfigPath);
if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) {
Directory.CreateDirectory(directory);
}
// Create a minimal master config with only ProfileReadOnly and CurrentProfile
// AvailableProfiles is determined by scanning the folder, not saved here
var masterConfig = new {
CurrentProfile = this._thumbnailConfiguration.CurrentProfile ?? "Default",
ProfileReadOnly = this._thumbnailConfiguration.ProfileReadOnly
};
string rawData = JsonConvert.SerializeObject(masterConfig, Formatting.Indented);
try {
File.WriteAllText(masterConfigPath, rawData);
} catch (IOException) {
// Ignore error if for some reason the updated config cannot be written down
}
}
private void SaveProfileConfig() {
string profileConfigPath = this.GetProfileConfigPath();
string directory = Path.GetDirectoryName(profileConfigPath);
if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) {
Directory.CreateDirectory(directory);
}
// Serialize the full configuration to the profile file
string rawData = JsonConvert.SerializeObject(this._thumbnailConfiguration, Formatting.Indented);
string filename = this.GetConfigFileName();
try {
File.WriteAllText(profileConfigPath, rawData);
File.WriteAllText(filename, rawData);
} catch (IOException) {
// Ignore error if for some reason the updated config cannot be written down
}
}
private string GetMasterConfigPath() {
return Path.Combine(PROFILES_DIRECTORY, MASTER_CONFIG_FILE);
}
private string GetProfileConfigPath() {
return this.GetProfileConfigPath(this._thumbnailConfiguration.CurrentProfile ?? "Default");
}
private string GetProfileConfigPath(string profileName) {
string sanitizedProfileName = this.SanitizeFileName(profileName);
return Path.Combine(PROFILES_DIRECTORY, $"{sanitizedProfileName}.json");
}
private string GetConfigFileName() {
return string.IsNullOrEmpty(this._appConfig.ConfigFileName) ? ConfigurationStorage.CONFIGURATION_FILE_NAME
: this._appConfig.ConfigFileName;
}
private string SanitizeFileName(string fileName) {
string invalidChars = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars());
foreach (char c in invalidChars) {
fileName = fileName.Replace(c, '_');
}
return fileName;
}
private List<string> ScanAvailableProfiles() {
List<string> profiles = new List<string>();
if (!Directory.Exists(PROFILES_DIRECTORY)) {
profiles.Add("Default");
return profiles;
}
try {
foreach (string filePath in Directory.GetFiles(PROFILES_DIRECTORY, "*.json")) {
string fileName = Path.GetFileNameWithoutExtension(filePath);
// Skip the master config file
if (fileName.Equals(MASTER_CONFIG_FILE.Replace(".json", ""), StringComparison.OrdinalIgnoreCase)) {
continue;
}
// Add the profile name
if (!string.IsNullOrEmpty(fileName) && !profiles.Contains(fileName)) {
profiles.Add(fileName);
}
}
} catch (IOException) {
// If there's an error scanning the directory, just return what we have
}
// Ensure Default is always in the list
if (!profiles.Contains("Default")) {
profiles.Add("Default");
}
return profiles;
}
}
}
}

View File

@@ -120,7 +120,6 @@ namespace EveOPreview.Configuration.Implementation {
this.CurrentProfile = "Default";
this.AvailableProfiles = new List<string> { "Default" };
this.ProfileReadOnly = false;
this.IconName = "";
@@ -305,10 +304,7 @@ namespace EveOPreview.Configuration.Implementation {
public Rectangle DefaultThumbnailRegion { get; set; }
public string CurrentProfile { get; set; }
[JsonIgnore]
public List<string> AvailableProfiles { get; set; }
[JsonProperty("ProfileReadOnly")]
public bool ProfileReadOnly { get; set; }
[JsonProperty("IconName")]
public string IconName {
get; set;

View File

@@ -81,7 +81,6 @@ namespace EveOPreview.Configuration {
string CurrentProfile { get; set; }
List<string> AvailableProfiles { get; set; }
bool ProfileReadOnly { get; set; }
string IconName { get; set; }

View File

@@ -132,7 +132,6 @@ namespace EveOPreview.Presenters {
this.View.AvailableProfiles = this._configuration.AvailableProfiles;
this.View.CurrentProfile = this._configuration.CurrentProfile;
this.View.ProfileReadOnly = this._configuration.ProfileReadOnly;
this.View.ToggleTrackingHotkey = this._configuration.ToggleTrackingHotkey;
this.View.ToggleSingleProcessHotkey = this._configuration.ToggleSingleProcessHotkey;
@@ -185,7 +184,6 @@ namespace EveOPreview.Presenters {
this._configuration.AvailableProfiles = this.View.AvailableProfiles;
this._configuration.CurrentProfile = this.View.CurrentProfile;
this._configuration.ProfileReadOnly = this.View.ProfileReadOnly;
this._configuration.ToggleTrackingHotkey = this.View.ToggleTrackingHotkey;
this._configuration.ToggleSingleProcessHotkey = this.View.ToggleSingleProcessHotkey;

View File

@@ -177,8 +177,6 @@ namespace EveOPreview.Services {
this._toggleAllThumbnailsHotkey = new HotkeyHandler(mainHandle, toggleAllThumbnailsKey);
this._toggleAllThumbnailsHotkey.Pressed += (object s, HandledEventArgs e) => {
this._configuration.ThumbnailsManuallyHidden = !this._configuration.ThumbnailsManuallyHidden;
this._hideThumbnailsDelay = 0;
this.RefreshThumbnails();
System.Diagnostics.Debug.WriteLine(
$"Toggled all thumbnails: {(this._configuration.ThumbnailsManuallyHidden ? "Hidden" : "Visible")}");
e.Handled = true;
@@ -258,8 +256,6 @@ namespace EveOPreview.Services {
this._toggleAllThumbnailsHotkey = new HotkeyHandler(mainHandle, toggleAllThumbnailsKey);
this._toggleAllThumbnailsHotkey.Pressed += (object s, HandledEventArgs e) => {
this._configuration.ThumbnailsManuallyHidden = !this._configuration.ThumbnailsManuallyHidden;
this._hideThumbnailsDelay = 0;
this.RefreshThumbnails();
System.Diagnostics.Debug.WriteLine(
$"Toggled all thumbnails: {(this._configuration.ThumbnailsManuallyHidden ? "Hidden" : "Visible")}");
e.Handled = true;

View File

@@ -27,13 +27,10 @@ namespace EveOPreview.View {
/// </summary>
private void InitializeComponent() {
components = new System.ComponentModel.Container();
RestoreWindowMenuItem = new ToolStripMenuItem();
ExitMenuItem = new ToolStripMenuItem();
TitleMenuItem = new ToolStripMenuItem();
SeparatorMenuItem = new ToolStripSeparator();
ProfileSeparatorMenuItem = new ToolStripSeparator();
ProfilesMenuItem = new ToolStripMenuItem();
ProfileReadOnlyMenuItem = new ToolStripMenuItem();
ToolStripMenuItem RestoreWindowMenuItem;
ToolStripMenuItem ExitMenuItem;
ToolStripMenuItem TitleMenuItem;
ToolStripSeparator SeparatorMenuItem;
TabControl ContentTabControl;
TabPage GeneralTabPage;
Panel GeneralSettingsPanel;
@@ -85,7 +82,8 @@ namespace EveOPreview.View {
PickRegionButton = new Button();
ProfileLabel = new Label();
ProfileComboBox = new ComboBox();
ProfileReadOnlyCheckBox = new CheckBox();
SaveProfileButton = new Button();
DeleteProfileButton = new Button();
ThumbnailSnapRangeLabel = new Label();
ThumbnailSnapRangeNumericEdit = new NumericUpDown();
ThumbnailSnapToGridCheckBox = new CheckBox();
@@ -135,6 +133,10 @@ namespace EveOPreview.View {
DocumentationLink = new LinkLabel();
NotifyIcon = new NotifyIcon(components);
TrayMenu = new ContextMenuStrip(components);
RestoreWindowMenuItem = new ToolStripMenuItem();
ExitMenuItem = new ToolStripMenuItem();
TitleMenuItem = new ToolStripMenuItem();
SeparatorMenuItem = new ToolStripSeparator();
ContentTabControl = new TabControl();
GeneralTabPage = new TabPage();
GeneralSettingsPanel = new Panel();
@@ -214,26 +216,6 @@ namespace EveOPreview.View {
SeparatorMenuItem.Name = "SeparatorMenuItem";
SeparatorMenuItem.Size = new Size(150, 6);
//
// ProfileSeparatorMenuItem
//
ProfileSeparatorMenuItem.Name = "ProfileSeparatorMenuItem";
ProfileSeparatorMenuItem.Size = new Size(150, 6);
//
// ProfilesMenuItem
//
ProfilesMenuItem.DropDownItems.Clear();
ProfilesMenuItem.Name = "ProfilesMenuItem";
ProfilesMenuItem.Size = new Size(153, 22);
ProfilesMenuItem.Text = "Profiles";
//
// ProfileReadOnlyMenuItem
//
ProfileReadOnlyMenuItem.CheckOnClick = true;
ProfileReadOnlyMenuItem.Name = "ProfileReadOnlyMenuItem";
ProfileReadOnlyMenuItem.Size = new Size(153, 22);
ProfileReadOnlyMenuItem.Text = "Read Only";
ProfileReadOnlyMenuItem.Click += ProfileReadOnlyMenuItem_Click;
//
// ContentTabControl
//
ContentTabControl.Alignment = TabAlignment.Left;
@@ -492,7 +474,8 @@ namespace EveOPreview.View {
ThumbnailSettingsPanel.Controls.Add(PickRegionButton);
ThumbnailSettingsPanel.Controls.Add(ProfileLabel);
ThumbnailSettingsPanel.Controls.Add(ProfileComboBox);
ThumbnailSettingsPanel.Controls.Add(ProfileReadOnlyCheckBox);
ThumbnailSettingsPanel.Controls.Add(SaveProfileButton);
ThumbnailSettingsPanel.Controls.Add(DeleteProfileButton);
ThumbnailSettingsPanel.Controls.Add(ThumbnailSnapRangeLabel);
ThumbnailSettingsPanel.Controls.Add(ThumbnailSnapRangeNumericEdit);
ThumbnailSettingsPanel.Controls.Add(ThumbnailSnapToGridCheckBox);
@@ -653,16 +636,27 @@ namespace EveOPreview.View {
ProfileComboBox.TabIndex = 51;
ProfileComboBox.SelectedIndexChanged += ProfileComboBox_SelectedIndexChanged;
//
// ProfileReadOnlyCheckBox
// SaveProfileButton
//
ProfileReadOnlyCheckBox.AutoSize = true;
ProfileReadOnlyCheckBox.Location = new Point(310, 278);
ProfileReadOnlyCheckBox.Margin = new Padding(4);
ProfileReadOnlyCheckBox.Name = "ProfileReadOnlyCheckBox";
ProfileReadOnlyCheckBox.Size = new Size(107, 19);
ProfileReadOnlyCheckBox.TabIndex = 54;
ProfileReadOnlyCheckBox.Text = "Read Only";
ProfileReadOnlyCheckBox.UseVisualStyleBackColor = true;
SaveProfileButton.Location = new Point(179, 277);
SaveProfileButton.Margin = new Padding(4);
SaveProfileButton.Name = "SaveProfileButton";
SaveProfileButton.Size = new Size(56, 21);
SaveProfileButton.TabIndex = 52;
SaveProfileButton.Text = "Save";
SaveProfileButton.UseVisualStyleBackColor = true;
SaveProfileButton.Click += SaveProfileButton_Click;
//
// DeleteProfileButton
//
DeleteProfileButton.Location = new Point(243, 277);
DeleteProfileButton.Margin = new Padding(4);
DeleteProfileButton.Name = "DeleteProfileButton";
DeleteProfileButton.Size = new Size(56, 21);
DeleteProfileButton.TabIndex = 53;
DeleteProfileButton.Text = "Delete";
DeleteProfileButton.UseVisualStyleBackColor = true;
DeleteProfileButton.Click += DeleteProfileButton_Click;
//
// ThumbnailSnapRangeLabel
//
@@ -1473,7 +1467,7 @@ namespace EveOPreview.View {
//
TrayMenu.ImageScalingSize = new Size(24, 24);
TrayMenu.Items.AddRange(
new ToolStripItem[] { TitleMenuItem, RestoreWindowMenuItem, SeparatorMenuItem, ProfileSeparatorMenuItem, ProfilesMenuItem, ProfileReadOnlyMenuItem, ExitMenuItem });
new ToolStripItem[] { TitleMenuItem, RestoreWindowMenuItem, SeparatorMenuItem, ExitMenuItem });
TrayMenu.Name = "contextMenuStrip1";
TrayMenu.Size = new Size(154, 76);
//
@@ -1536,13 +1530,6 @@ namespace EveOPreview.View {
#endregion
private NotifyIcon NotifyIcon;
private ContextMenuStrip TrayMenu;
private ToolStripMenuItem TitleMenuItem;
private ToolStripMenuItem RestoreWindowMenuItem;
private ToolStripMenuItem ExitMenuItem;
private ToolStripMenuItem ProfilesMenuItem;
private ToolStripMenuItem ProfileReadOnlyMenuItem;
private ToolStripSeparator SeparatorMenuItem;
private ToolStripSeparator ProfileSeparatorMenuItem;
private TabPage ZoomTabPage;
private CheckBox EnableClientLayoutTrackingCheckBox;
private CheckBox HideActiveClientThumbnailCheckBox;
@@ -1591,7 +1578,8 @@ namespace EveOPreview.View {
private Label RegionHeightLabel;
private Button PickRegionButton;
private ComboBox ProfileComboBox;
private CheckBox ProfileReadOnlyCheckBox;
private Button SaveProfileButton;
private Button DeleteProfileButton;
private Label ProfileLabel;
private Label ThumbnailSnapRangeLabel;
private NumericUpDown ThumbnailSnapRangeNumericEdit;

View File

@@ -21,7 +21,6 @@ namespace EveOPreview.View {
private Size _minimumSize;
private Size _maximumSize;
private string _iconName;
private string _lastSetProfile;
#endregion
public MainForm(ApplicationContext context) {
@@ -303,6 +302,15 @@ namespace EveOPreview.View {
}
}
public string CurrentProfile {
get => this.ProfileComboBox.Text;
set {
if (this.ProfileComboBox.Items.Contains(value)) {
this.ProfileComboBox.SelectedItem = value;
}
}
}
public List<string> AvailableProfiles {
get => this.ProfileComboBox.Items.Cast<string>().ToList();
set {
@@ -310,85 +318,36 @@ namespace EveOPreview.View {
foreach (var profile in value) {
this.ProfileComboBox.Items.Add(profile);
}
this.UpdateTrayProfilesMenu(value);
}
}
public bool ProfileReadOnly {
get => this.ProfileReadOnlyCheckBox.Checked;
set {
this.ProfileReadOnlyCheckBox.Checked = value;
this.ProfileReadOnlyMenuItem.Checked = value;
}
}
public string CurrentProfile {
get => this.ProfileComboBox.Text;
set {
this._lastSetProfile = value;
if (this.ProfileComboBox.Items.Contains(value)) {
this.ProfileComboBox.SelectedItem = value;
}
this.UpdateTrayProfilesMenuCheckedState();
}
}
private void ProfileComboBox_SelectedIndexChanged(object sender, EventArgs e) {
if (!this._suppressEvents && this.ProfileComboBox.SelectedItem != null) {
string newProfile = this.ProfileComboBox.SelectedItem.ToString();
// Only restart if this is a user-initiated change (not during initial load)
if (newProfile != this._lastSetProfile) {
this._lastSetProfile = newProfile;
// Save ONLY the master config, not the profile file
// This prevents corrupting the target profile with current settings
SaveMasterOnly();
Application.Restart();
Environment.Exit(0);
}
if (!this._suppressEvents) {
this.ApplicationSettingsChanged?.Invoke();
}
}
private void SaveMasterOnly() {
// Set to read-only temporarily so Save() only saves master config
bool originalReadOnly = this.ProfileReadOnlyCheckBox.Checked;
this.ProfileReadOnlyCheckBox.Checked = true;
this.ApplicationSettingsChanged?.Invoke();
this.ProfileReadOnlyCheckBox.Checked = originalReadOnly;
}
private void UpdateTrayProfilesMenu(List<string> profiles) {
this._suppressEvents = true;
this.ProfilesMenuItem.DropDownItems.Clear();
foreach (string profile in profiles) {
var menuItem = new ToolStripMenuItem(profile);
if (profile == this.CurrentProfile) {
menuItem.Checked = true;
}
menuItem.Click += (sender, e) => {
if (!this._suppressEvents) {
this.CurrentProfile = profile;
// Save ONLY the master config, not the profile file
bool originalReadOnly = this.ProfileReadOnlyCheckBox.Checked;
this.ProfileReadOnlyCheckBox.Checked = true;
private void SaveProfileButton_Click(object sender, EventArgs e) {
using (var inputDialog = new InputDialog("Save Profile", "Enter profile name:")) {
if (inputDialog.ShowDialog() == DialogResult.OK) {
string profileName = inputDialog.InputText;
if (!string.IsNullOrWhiteSpace(profileName)) {
this.ProfileComboBox.Items.Add(profileName);
this.ProfileComboBox.SelectedItem = profileName;
this.ApplicationSettingsChanged?.Invoke();
this.ProfileReadOnlyCheckBox.Checked = originalReadOnly;
Application.Restart();
Environment.Exit(0);
}
};
this.ProfilesMenuItem.DropDownItems.Add(menuItem);
}
}
this._suppressEvents = false;
}
private void UpdateTrayProfilesMenuCheckedState() {
this._suppressEvents = true;
foreach (ToolStripMenuItem item in this.ProfilesMenuItem.DropDownItems) {
item.Checked = (item.Text == this.CurrentProfile);
private void DeleteProfileButton_Click(object sender, EventArgs e) {
if (this.ProfileComboBox.SelectedItem != null) {
string selectedProfile = this.ProfileComboBox.SelectedItem.ToString();
if (selectedProfile != "Default") {
this.ProfileComboBox.Items.Remove(selectedProfile);
this.ApplicationSettingsChanged?.Invoke();
}
}
this._suppressEvents = false;
}
public new void Show() {// Registers the current instance as the application's Main Form
@@ -673,12 +632,6 @@ namespace EveOPreview.View {
private void ExitMenuItemClick_Handler(object sender, EventArgs e) {
this.ApplicationExitRequested?.Invoke();
}
private void ProfileReadOnlyMenuItem_Click(object sender, EventArgs e) {
if (!this._suppressEvents) {
this.ApplicationSettingsChanged?.Invoke();
}
}
#endregion
private void InitZoomAnchorMap() {

View File

@@ -46,7 +46,6 @@ namespace EveOPreview.View {
string CurrentProfile { get; set; }
List<string> AvailableProfiles { get; set; }
bool ProfileReadOnly { get; set; }
string ToggleTrackingHotkey { get; set; }
string ToggleSingleProcessHotkey { get; set; }