using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Windows.Forms; using Newtonsoft.Json; namespace EveOPreview.Configuration.Implementation { sealed class ThumbnailConfiguration : IThumbnailConfiguration { #region Private fields private bool _enablePerClientThumbnailLayouts; private bool _enableClientLayoutTracking; #endregion public ThumbnailConfiguration() { this.ConfigVersion = 1; this.CycleGroup1ForwardHotkeys = new List { "F14", "Control+F14" }; this.CycleGroup1BackwardHotkeys = new List { "F13", "Control+F13" }; this.CycleGroup1ClientsOrder = new Dictionary { { "EVE - Example DPS Toon 1", 1 }, { "EVE - Example DPS Toon 2", 2 }, { "EVE - Example DPS Toon 3", 3 } }; this.CycleGroup2ForwardHotkeys = new List { "F16", "Control+F16" }; this.CycleGroup2BackwardHotkeys = new List { "F15", "Control+F15" }; this.CycleGroup2ClientsOrder = new Dictionary { { "EVE - Example Logi Toon 1", 1 }, { "EVE - Example Scout Toon 2", 2 }, { "EVE - Example Tackle Toon 3", 3 } }; this.CycleGroup3ForwardHotkeys = new List { "" }; this.CycleGroup3BackwardHotkeys = new List { "" }; this.CycleGroup3ClientsOrder = new Dictionary { { "EVE - cycle group 3", 1 }, }; this.CycleGroup4ForwardHotkeys = new List { "" }; this.CycleGroup4BackwardHotkeys = new List { "" }; this.CycleGroup4ClientsOrder = new Dictionary { { "EVE - cycle group 4", 1 }, }; this.CycleGroup5ForwardHotkeys = new List { "" }; this.CycleGroup5BackwardHotkeys = new List { "" }; this.CycleGroup5ClientsOrder = new Dictionary { { "EVE - cycle group 5", 1 }, }; this.PerClientActiveClientHighlightColor = new Dictionary { {"EVE - Example Toon 1", Color.Red}, {"EVE - Example Toon 2", Color.Green} }; this.PerClientThumbnailSize = new Dictionary { {"EVE - Example Toon 1", new Size(200, 200)}, {"EVE - Example Toon 2", new Size(200, 200)} }; this.PerClientZoomAnchor = new Dictionary { {"EVE - Example Toon 1", ZoomAnchor.N }, {"EVE - Example Toon 2", ZoomAnchor.S} }; this.PerClientLayout = new Dictionary>(); this.FlatLayout = new Dictionary(); this.ClientLayout = new Dictionary(); this.ClientHotkey = new Dictionary(); this.DisableThumbnail = new Dictionary(); this.PriorityClients = new List(); this.ExecutablesToPreview = new List { "exefile" }; this.MinimizeToTray = false; this.ThumbnailRefreshPeriod = 500; this.ThumbnailResizeTimeoutPeriod = 500; #if LINUX this.EnableWineCompatibilityMode = true; #else this.EnableWineCompatibilityMode = false; #endif this.ThumbnailOpacity = 0.5; this.EnableClientLayoutTracking = false; this.HideActiveClientThumbnail = false; this.HideLoginClientThumbnail = false; this.MinimizeInactiveClients = false; this.WindowsAnimationStyle = AnimationStyle.NoAnimation; this.ShowThumbnailsAlwaysOnTop = true; this.EnablePerClientThumbnailLayouts = false; this.HideThumbnailsOnLostFocus = false; this.HideThumbnailsDelay = 2; // 2 thumbnails refresh cycles (1.0 sec) this.ThumbnailSize = new Size(384, 216); this.ThumbnailMinimumSize = new Size(192, 108); this.ThumbnailMaximumSize = new Size(960, 540); this.EnableThumbnailSnap = true; this.ThumbnailZoomEnabled = false; this.ThumbnailZoomFactor = 2; this.ThumbnailZoomAnchor = ZoomAnchor.NW; this.OverlayLabelAnchor = ZoomAnchor.NW; this.ShowThumbnailOverlays = true; this.ShowThumbnailFrames = false; this.LockThumbnailLocation = false; this.ThumbnailSnapToGrid = true; this.ThumbnailSnapToGridSizeX = 100; this.ThumbnailSnapToGridSizeY = 50; this.EnableActiveClientHighlight = false; this.ActiveClientHighlightColor = Color.GreenYellow; this.ActiveClientHighlightThickness = 3; this.OverlayLabelColor = Color.Orange; this.OverlayLabelSize = 10; this.IconName = ""; this.LoginThumbnailLocation = new Point(5, 5); } [JsonProperty("ConfigVersion")] public int ConfigVersion { get; set; } [JsonProperty("CycleGroup1ForwardHotkeys")] public List CycleGroup1ForwardHotkeys { get; set; } [JsonProperty("CycleGroup1BackwardHotkeys")] public List CycleGroup1BackwardHotkeys { get; set; } [JsonProperty("CycleGroup1ClientsOrder")] public Dictionary CycleGroup1ClientsOrder { get; set; } [JsonProperty("CycleGroup2ForwardHotkeys")] public List CycleGroup2ForwardHotkeys { get; set; } [JsonProperty("CycleGroup2BackwardHotkeys")] public List CycleGroup2BackwardHotkeys { get; set; } [JsonProperty("CycleGroup2ClientsOrder")] public Dictionary CycleGroup2ClientsOrder { get; set; } [JsonProperty("CycleGroup3ForwardHotkeys")] public List CycleGroup3ForwardHotkeys { get; set; } [JsonProperty("CycleGroup3BackwardHotkeys")] public List CycleGroup3BackwardHotkeys { get; set; } [JsonProperty("CycleGroup3ClientsOrder")] public Dictionary CycleGroup3ClientsOrder { get; set; } [JsonProperty("CycleGroup4ForwardHotkeys")] public List CycleGroup4ForwardHotkeys { get; set; } [JsonProperty("CycleGroup4BackwardHotkeys")] public List CycleGroup4BackwardHotkeys { get; set; } [JsonProperty("CycleGroup4ClientsOrder")] public Dictionary CycleGroup4ClientsOrder { get; set; } [JsonProperty("CycleGroup5ForwardHotkeys")] public List CycleGroup5ForwardHotkeys { get; set; } [JsonProperty("CycleGroup5BackwardHotkeys")] public List CycleGroup5BackwardHotkeys { get; set; } [JsonProperty("CycleGroup5ClientsOrder")] public Dictionary CycleGroup5ClientsOrder { get; set; } [JsonProperty("PerClientActiveClientHighlightColor")] public Dictionary PerClientActiveClientHighlightColor { get; set; } [JsonProperty("PerClientThumbnailSize")] public Dictionary PerClientThumbnailSize { get; set; } [JsonProperty("PerClientZoomAnchor")] public Dictionary PerClientZoomAnchor{ get; set; } public bool MinimizeToTray { get; set; } public int ThumbnailRefreshPeriod { get; set; } public int ThumbnailResizeTimeoutPeriod { get; set; } [JsonProperty("WineCompatibilityMode")] public bool EnableWineCompatibilityMode { get; set; } [JsonProperty("ThumbnailsOpacity")] public double ThumbnailOpacity { get; set; } public bool EnableClientLayoutTracking { get => this._enableClientLayoutTracking; set { if (!value) { this.ClientLayout.Clear(); } this._enableClientLayoutTracking = value; } } public bool HideActiveClientThumbnail { get; set; } public bool HideLoginClientThumbnail { get; set; } public bool MinimizeInactiveClients { get; set; } public AnimationStyle WindowsAnimationStyle { get; set; } public bool ShowThumbnailsAlwaysOnTop { get; set; } public bool EnablePerClientThumbnailLayouts { get => this._enablePerClientThumbnailLayouts; set { if (!value) { this.PerClientLayout.Clear(); } this._enablePerClientThumbnailLayouts = value; } } public bool HideThumbnailsOnLostFocus { get; set; } public int HideThumbnailsDelay { get; set; } public Size ThumbnailSize { get; set; } public Size ThumbnailMaximumSize { get; set; } public Size ThumbnailMinimumSize { get; set; } public bool EnableThumbnailSnap { get; set; } [JsonProperty("EnableThumbnailZoom")] public bool ThumbnailZoomEnabled { get; set; } public int ThumbnailZoomFactor { get; set; } public ZoomAnchor ThumbnailZoomAnchor { get; set; } public ZoomAnchor OverlayLabelAnchor { get; set; } public bool ShowThumbnailOverlays { get; set; } public bool ShowThumbnailFrames { get; set; } public bool LockThumbnailLocation { get; set; } public bool ThumbnailSnapToGrid { get; set; } public int ThumbnailSnapToGridSizeX { get; set; } public int ThumbnailSnapToGridSizeY { get; set; } public bool EnableActiveClientHighlight { get; set; } public Color ActiveClientHighlightColor { get; set; } public Color OverlayLabelColor { get; set; } public int OverlayLabelSize { get; set; } public string IconName { get; set; } public int ActiveClientHighlightThickness { get; set; } [JsonProperty("LoginThumbnailLocation")] public Point LoginThumbnailLocation { get; set; } [JsonProperty] private Dictionary> PerClientLayout { get; set; } [JsonProperty] private Dictionary FlatLayout { get; set; } [JsonProperty] private Dictionary ClientLayout { get; set; } [JsonProperty] private Dictionary ClientHotkey { get; set; } [JsonProperty] private Dictionary DisableThumbnail { get; set; } [JsonProperty] private List PriorityClients { get; set; } [JsonProperty] private List ExecutablesToPreview { get; set; } public Point GetThumbnailLocation(string currentClient, string activeClient, Point defaultLocation) { Point location; // What this code does: // If Per-Client layouts are enabled // and client name is known // and there is a separate thumbnails layout for this client // and this layout contains an entry for the current client // then return that entry // otherwise try to get client layout from the flat all-clients layout // If there is no layout too then use the default one if (this.EnablePerClientThumbnailLayouts && !string.IsNullOrEmpty(activeClient)) { Dictionary layoutSource; if (this.PerClientLayout.TryGetValue(activeClient, out layoutSource) && layoutSource.TryGetValue(currentClient, out location)) { return location; } } return this.FlatLayout.TryGetValue(currentClient, out location) ? location : defaultLocation; } public Size GetThumbnailSize(string currentClient, string activeClient, Size defaultSize) { Size sizeOfThumbnail; return this.PerClientThumbnailSize.TryGetValue(currentClient, out sizeOfThumbnail) ? sizeOfThumbnail : defaultSize; } public ZoomAnchor GetZoomAnchor(string currentClient, ZoomAnchor defaultZoomAnchor) { ZoomAnchor zoomAnchor; return this.PerClientZoomAnchor.TryGetValue(currentClient, out zoomAnchor) ? zoomAnchor : defaultZoomAnchor; } public void SetThumbnailLocation(string currentClient, string activeClient, Point location) { Dictionary layoutSource; if (this.EnablePerClientThumbnailLayouts) { if (string.IsNullOrEmpty(activeClient)) { return; } if (!this.PerClientLayout.TryGetValue(activeClient, out layoutSource)) { layoutSource = new Dictionary(); this.PerClientLayout[activeClient] = layoutSource; } } else { layoutSource = this.FlatLayout; } layoutSource[currentClient] = location; } public ClientLayout GetClientLayout(string currentClient) { ClientLayout layout; this.ClientLayout.TryGetValue(currentClient, out layout); return layout; } public void SetClientLayout(string currentClient, ClientLayout layout) { this.ClientLayout[currentClient] = layout; } public Keys GetClientHotkey(string currentClient) { string hotkey; if (this.ClientHotkey.TryGetValue(currentClient, out hotkey)) { // Protect from incorrect values object rawValue = (new KeysConverter()).ConvertFromInvariantString(hotkey); return rawValue != null ? (Keys)rawValue : Keys.None; } return Keys.None; } public void SetClientHotkey(string currentClient, Keys hotkey) { this.ClientHotkey[currentClient] = (new KeysConverter()).ConvertToInvariantString(hotkey); } public Keys StringToKey(string hotkey) { object rawValue = (new KeysConverter()).ConvertFromInvariantString(hotkey); return rawValue != null ? (Keys)rawValue : Keys.None; } public bool IsPriorityClient(string currentClient) { return this.PriorityClients.Contains(currentClient); } public bool IsExecutableToPreview(string processName) { return this.ExecutablesToPreview.Any(s => s.Equals(processName, StringComparison.OrdinalIgnoreCase)); } public bool IsThumbnailDisabled(string currentClient) { return this.DisableThumbnail.TryGetValue(currentClient, out bool isDisabled) && isDisabled; } public void ToggleThumbnail(string currentClient, bool isDisabled) { this.DisableThumbnail[currentClient] = isDisabled; } /// /// Applies restrictions to different parameters of the config /// public void ApplyRestrictions() { #if LINUX this.ThumbnailRefreshPeriod = ThumbnailConfiguration.ApplyRestrictions(this.ThumbnailRefreshPeriod, 10, 1000); #else this.ThumbnailRefreshPeriod = ThumbnailConfiguration.ApplyRestrictions(this.ThumbnailRefreshPeriod, 300, 1000); #endif this.ThumbnailResizeTimeoutPeriod = ThumbnailConfiguration.ApplyRestrictions(this.ThumbnailResizeTimeoutPeriod, 200, 5000); this.ThumbnailSize = new Size(ThumbnailConfiguration.ApplyRestrictions(this.ThumbnailSize.Width, this.ThumbnailMinimumSize.Width, this.ThumbnailMaximumSize.Width), ThumbnailConfiguration.ApplyRestrictions(this.ThumbnailSize.Height, this.ThumbnailMinimumSize.Height, this.ThumbnailMaximumSize.Height)); this.ThumbnailOpacity = ThumbnailConfiguration.ApplyRestrictions((int)(this.ThumbnailOpacity * 100.00), 20, 100) / 100.00; this.ThumbnailZoomFactor = ThumbnailConfiguration.ApplyRestrictions(this.ThumbnailZoomFactor, 2, 10); this.ActiveClientHighlightThickness = ThumbnailConfiguration.ApplyRestrictions(this.ActiveClientHighlightThickness, 1, 6); } private static int ApplyRestrictions(int value, int minimum, int maximum) { if (value <= minimum) { return minimum; } if (value >= maximum) { return maximum; } return value; } } }