Update layout management system to use JSON

This commit is contained in:
Anton Kasyanov
2016-06-05 01:34:44 +03:00
parent a30834db6c
commit 4949c17065
11 changed files with 162 additions and 352 deletions

View File

@@ -1,5 +1,10 @@
namespace EveOPreview.Configuration using System.Collections.Generic;
using System.Drawing;
using Newtonsoft.Json;
namespace EveOPreview.Configuration
{ {
// TODO Add Save and Load to this class
public class ApplicationConfiguration : IApplicationConfiguration public class ApplicationConfiguration : IApplicationConfiguration
{ {
public ApplicationConfiguration() public ApplicationConfiguration()
@@ -10,11 +15,11 @@
this.ThumbnailsOpacity = 0.5; this.ThumbnailsOpacity = 0.5;
this.EnableClientsLocationTracking = false; this.EnableClientLayoutTracking = false;
this.HideActiveClientThumbnail = false; this.HideActiveClientThumbnail = false;
this.ShowThumbnailsAlwaysOnTop = true; this.ShowThumbnailsAlwaysOnTop = true;
this.HideThumbnailsOnLostFocus = false; this.HideThumbnailsOnLostFocus = false;
this.EnablePerClientThumbnailsLayouts = false; this.EnablePerClientThumbnailLayouts = false;
this.SyncThumbnailsSize = true; this.SyncThumbnailsSize = true;
this.ThumbnailsWidth = 250; this.ThumbnailsWidth = 250;
@@ -26,6 +31,10 @@
this.ShowThumbnailOverlays = true; this.ShowThumbnailOverlays = true;
this.ShowThumbnailFrames = true; this.ShowThumbnailFrames = true;
this.PerClientLayout = new Dictionary<string, Dictionary<string, Point>>();
this.FlatLayout = new Dictionary<string, Point>();
this.ClientLayout = new Dictionary<string, ClientLayout>();
} }
public bool MinimizeToTray { get; set; } public bool MinimizeToTray { get; set; }
@@ -33,11 +42,11 @@
public double ThumbnailsOpacity { get; set; } public double ThumbnailsOpacity { get; set; }
public bool EnableClientsLocationTracking { get; set; } public bool EnableClientLayoutTracking { get; set; }
public bool HideActiveClientThumbnail { get; set; } public bool HideActiveClientThumbnail { get; set; }
public bool ShowThumbnailsAlwaysOnTop { get; set; } public bool ShowThumbnailsAlwaysOnTop { get; set; }
public bool HideThumbnailsOnLostFocus { get; set; } public bool HideThumbnailsOnLostFocus { get; set; }
public bool EnablePerClientThumbnailsLayouts { get; set; } public bool EnablePerClientThumbnailLayouts { get; set; }
public bool SyncThumbnailsSize { get; set; } public bool SyncThumbnailsSize { get; set; }
public int ThumbnailsWidth { get; set; } public int ThumbnailsWidth { get; set; }
@@ -49,5 +58,75 @@
public bool ShowThumbnailOverlays { get; set; } public bool ShowThumbnailOverlays { get; set; }
public bool ShowThumbnailFrames { get; set; } public bool ShowThumbnailFrames { get; set; }
[JsonProperty]
private Dictionary<string, Dictionary<string, Point>> PerClientLayout { get; set; }
[JsonProperty]
private Dictionary<string, Point> FlatLayout { get; set; }
[JsonProperty]
private Dictionary<string, ClientLayout> ClientLayout { get; set; }
public Point GetThumbnailLocation(string currentClient, string activeClient, Point defaultLocation)
{
Dictionary<string, Point> layoutSource = null;
if (this.EnablePerClientThumbnailLayouts)
{
if (!string.IsNullOrEmpty(activeClient))
{
this.PerClientLayout.TryGetValue(activeClient, out layoutSource);
}
}
else
{
layoutSource = this.FlatLayout;
}
if (layoutSource == null)
{
return defaultLocation;
}
Point location;
return layoutSource.TryGetValue(currentClient, out location) ? location : defaultLocation;
}
public void SetThumbnailLocation(string currentClient, string activeClient, Point location)
{
Dictionary<string, Point> layoutSource;
if (this.EnablePerClientThumbnailLayouts)
{
if (string.IsNullOrEmpty(activeClient))
{
return;
}
if (!this.PerClientLayout.TryGetValue(activeClient, out layoutSource))
{
layoutSource = new Dictionary<string, Point>();
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;
}
} }
} }

View File

@@ -1,6 +1,6 @@
namespace EveOPreview.Configuration namespace EveOPreview.Configuration
{ {
public class WindowProperties public class ClientLayout
{ {
public int X { get; set; } public int X { get; set; }
public int Y { get; set; } public int Y { get; set; }

View File

@@ -1,4 +1,6 @@
namespace EveOPreview.Configuration using System.Drawing;
namespace EveOPreview.Configuration
{ {
public interface IApplicationConfiguration public interface IApplicationConfiguration
{ {
@@ -7,11 +9,11 @@
double ThumbnailsOpacity { get; set; } double ThumbnailsOpacity { get; set; }
bool EnableClientsLocationTracking { get; set; } bool EnableClientLayoutTracking { get; set; }
bool HideActiveClientThumbnail { get; set; } bool HideActiveClientThumbnail { get; set; }
bool ShowThumbnailsAlwaysOnTop { get; set; } bool ShowThumbnailsAlwaysOnTop { get; set; }
bool HideThumbnailsOnLostFocus { get; set; } bool HideThumbnailsOnLostFocus { get; set; }
bool EnablePerClientThumbnailsLayouts { get; set; } bool EnablePerClientThumbnailLayouts { get; set; }
bool SyncThumbnailsSize { get; set; } bool SyncThumbnailsSize { get; set; }
int ThumbnailsWidth { get; set; } int ThumbnailsWidth { get; set; }
@@ -23,5 +25,11 @@
bool ShowThumbnailOverlays { get; set; } bool ShowThumbnailOverlays { get; set; }
bool ShowThumbnailFrames { get; set; } bool ShowThumbnailFrames { get; set; }
Point GetThumbnailLocation(string currentClient, string activeClient, Point defaultLocation);
void SetThumbnailLocation(string currentClient, string activeClient, Point location);
ClientLayout GetClientLayout(string currentClient);
void SetClientLayout(string currentClient, ClientLayout layout);
} }
} }

View File

@@ -123,7 +123,7 @@
<Compile Include="DwmAPI\DWM_TNP_CONSTANTS.cs" /> <Compile Include="DwmAPI\DWM_TNP_CONSTANTS.cs" />
<Compile Include="DwmAPI\MARGINS.cs" /> <Compile Include="DwmAPI\MARGINS.cs" />
<Compile Include="DwmAPI\RECT.cs" /> <Compile Include="DwmAPI\RECT.cs" />
<Compile Include="Configuration\WindowProperties.cs" /> <Compile Include="Configuration\ClientLayout.cs" />
<Compile Include="ApplicationBase\IPresenter.cs" /> <Compile Include="ApplicationBase\IPresenter.cs" />
<Compile Include="Presentation\MainPresenter.cs" /> <Compile Include="Presentation\MainPresenter.cs" />
<Compile Include="Presentation\ViewCloseRequest.cs" /> <Compile Include="Presentation\ViewCloseRequest.cs" />
@@ -219,9 +219,7 @@
<ItemGroup> <ItemGroup>
<Content Include="icon.ico" /> <Content Include="icon.ico" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup />
<Folder Include="GUI\" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.

View File

@@ -7,6 +7,7 @@ namespace EveOPreview.UI
public interface IThumbnailManager public interface IThumbnailManager
{ {
void Activate(); void Activate();
void Deactivate();
void SetThumbnailState(IntPtr thumbnailId, bool hideAlways); void SetThumbnailState(IntPtr thumbnailId, bool hideAlways);
void SetThumbnailsSize(Size size); void SetThumbnailsSize(Size size);

View File

@@ -23,7 +23,7 @@ namespace EveOPreview.UI
#endregion #endregion
public MainPresenter(IApplicationController controller, IMainView view, IApplicationConfiguration configuration, IConfigurationStorage configurationStorage, public MainPresenter(IApplicationController controller, IMainView view, IApplicationConfiguration configuration, IConfigurationStorage configurationStorage,
IThumbnailDescriptionViewFactory thumbnailDescriptionViewFactory, IThumbnailManager thumbnailManager) IThumbnailManager thumbnailManager, IThumbnailDescriptionViewFactory thumbnailDescriptionViewFactory)
: base(controller, view) : base(controller, view)
{ {
this._configuration = configuration; this._configuration = configuration;
@@ -52,6 +52,7 @@ namespace EveOPreview.UI
private void ExitApplication() private void ExitApplication()
{ {
this._thumbnailManager.Deactivate();
this._exitApplication = true; this._exitApplication = true;
this.View.Close(); this.View.Close();
} }
@@ -100,11 +101,11 @@ namespace EveOPreview.UI
this.View.ThumbnailsOpacity = this._configuration.ThumbnailsOpacity; this.View.ThumbnailsOpacity = this._configuration.ThumbnailsOpacity;
this.View.EnableClientsLocationTracking = this._configuration.EnableClientsLocationTracking; this.View.EnableClientLayoutTracking = this._configuration.EnableClientLayoutTracking;
this.View.HideActiveClientThumbnail = this._configuration.HideActiveClientThumbnail; this.View.HideActiveClientThumbnail = this._configuration.HideActiveClientThumbnail;
this.View.ShowThumbnailsAlwaysOnTop = this._configuration.ShowThumbnailsAlwaysOnTop; this.View.ShowThumbnailsAlwaysOnTop = this._configuration.ShowThumbnailsAlwaysOnTop;
this.View.HideThumbnailsOnLostFocus = this._configuration.HideThumbnailsOnLostFocus; this.View.HideThumbnailsOnLostFocus = this._configuration.HideThumbnailsOnLostFocus;
this.View.EnablePerClientThumbnailsLayouts = this._configuration.EnablePerClientThumbnailsLayouts; this.View.EnablePerClientThumbnailsLayouts = this._configuration.EnablePerClientThumbnailLayouts;
this.View.SyncThumbnailsSize = this._configuration.SyncThumbnailsSize; this.View.SyncThumbnailsSize = this._configuration.SyncThumbnailsSize;
this.View.ThumbnailsWidth = this._configuration.ThumbnailsWidth; this.View.ThumbnailsWidth = this._configuration.ThumbnailsWidth;
@@ -124,11 +125,11 @@ namespace EveOPreview.UI
this._configuration.ThumbnailsOpacity = (float)this.View.ThumbnailsOpacity; this._configuration.ThumbnailsOpacity = (float)this.View.ThumbnailsOpacity;
this._configuration.EnableClientsLocationTracking = this.View.EnableClientsLocationTracking; this._configuration.EnableClientLayoutTracking = this.View.EnableClientLayoutTracking;
this._configuration.HideActiveClientThumbnail = this.View.HideActiveClientThumbnail; this._configuration.HideActiveClientThumbnail = this.View.HideActiveClientThumbnail;
this._configuration.ShowThumbnailsAlwaysOnTop = this.View.ShowThumbnailsAlwaysOnTop; this._configuration.ShowThumbnailsAlwaysOnTop = this.View.ShowThumbnailsAlwaysOnTop;
this._configuration.HideThumbnailsOnLostFocus = this.View.HideThumbnailsOnLostFocus; this._configuration.HideThumbnailsOnLostFocus = this.View.HideThumbnailsOnLostFocus;
this._configuration.EnablePerClientThumbnailsLayouts = this.View.EnablePerClientThumbnailsLayouts; this._configuration.EnablePerClientThumbnailLayouts = this.View.EnablePerClientThumbnailsLayouts;
this._configuration.SyncThumbnailsSize = this.View.SyncThumbnailsSize; this._configuration.SyncThumbnailsSize = this.View.SyncThumbnailsSize;
this._configuration.ThumbnailsWidth = this.View.ThumbnailsWidth; this._configuration.ThumbnailsWidth = this.View.ThumbnailsWidth;

View File

@@ -2,9 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Drawing; using System.Drawing;
using System.IO;
using System.Windows.Threading; using System.Windows.Threading;
using System.Xml.Linq;
using EveOPreview.Configuration; using EveOPreview.Configuration;
namespace EveOPreview.UI namespace EveOPreview.UI
@@ -18,6 +16,7 @@ namespace EveOPreview.UI
#region Private fields #region Private fields
private readonly IApplicationConfiguration _configuration; private readonly IApplicationConfiguration _configuration;
private readonly IConfigurationStorage _configurationStorage;
private readonly DispatcherTimer _thumbnailUpdateTimer; private readonly DispatcherTimer _thumbnailUpdateTimer;
private readonly IThumbnailViewFactory _thumbnailViewFactory; private readonly IThumbnailViewFactory _thumbnailViewFactory;
private readonly Dictionary<IntPtr, IThumbnailView> _thumbnailViews; private readonly Dictionary<IntPtr, IThumbnailView> _thumbnailViews;
@@ -29,20 +28,12 @@ namespace EveOPreview.UI
private bool _isHoverEffectActive; private bool _isHoverEffectActive;
private Size _thumbnailBaseSize; private Size _thumbnailBaseSize;
private Point _thumbnailBaseLocation; private Point _thumbnailBaseLocation;
// TODO To be moved into a separate class
private readonly Dictionary<string, Dictionary<string, Point>> _uniqueLayouts;
private readonly Dictionary<string, Point> _flatLayout;
private readonly Dictionary<string, string> _flatLayoutShortcuts;
private readonly Dictionary<string, WindowProperties> _clientLayout;
// TODO To be removed
private readonly Dictionary<string, string> _xmlBadToOkChars;
#endregion #endregion
public ThumbnailManager(IApplicationConfiguration configuration, IThumbnailViewFactory factory) public ThumbnailManager(IApplicationConfiguration configuration, IConfigurationStorage configurationStorage, IThumbnailViewFactory factory)
{ {
this._configuration = configuration; this._configuration = configuration;
this._configurationStorage = configurationStorage;
this._thumbnailViewFactory = factory; this._thumbnailViewFactory = factory;
this._activeClientHandle = (IntPtr)0; this._activeClientHandle = (IntPtr)0;
@@ -56,23 +47,7 @@ namespace EveOPreview.UI
// DispatcherTimer setup // DispatcherTimer setup
this._thumbnailUpdateTimer = new DispatcherTimer(); this._thumbnailUpdateTimer = new DispatcherTimer();
this._thumbnailUpdateTimer.Tick += ThumbnailUpdateTimerTick; this._thumbnailUpdateTimer.Tick += ThumbnailUpdateTimerTick;
this._thumbnailUpdateTimer.Interval = new TimeSpan(0, 0, 0, 0, 500); // TODO Make it configurable this._thumbnailUpdateTimer.Interval = new TimeSpan(0, 0, 0, 0, configuration.ThumbnailRefreshPeriod);
// TODO Move mayouts stuff out
_uniqueLayouts = new Dictionary<string, Dictionary<string, Point>>();
_flatLayout = new Dictionary<string, Point>();
_flatLayoutShortcuts = new Dictionary<string, string>();
_clientLayout = new Dictionary<string, WindowProperties>();
// TODO To be removed
_xmlBadToOkChars = new Dictionary<string, string>();
_xmlBadToOkChars["<"] = "---lt---";
_xmlBadToOkChars["&"] = "---amp---";
_xmlBadToOkChars[">"] = "---gt---";
_xmlBadToOkChars["\""] = "---quot---";
_xmlBadToOkChars["\'"] = "---apos---";
_xmlBadToOkChars[","] = "---comma---";
_xmlBadToOkChars["."] = "---dot---";
} }
public event Action<IList<IThumbnailView>> ThumbnailsAdded; public event Action<IList<IThumbnailView>> ThumbnailsAdded;
@@ -82,8 +57,6 @@ namespace EveOPreview.UI
public void Activate() public void Activate()
{ {
this.LoadLayout();
this._thumbnailUpdateTimer.Start(); this._thumbnailUpdateTimer.Start();
this.RefreshThumbnails(); this.RefreshThumbnails();
@@ -150,15 +123,7 @@ namespace EveOPreview.UI
continue; continue;
} }
if (this._configuration.EnablePerClientThumbnailsLayouts) view.Location = this._configuration.GetThumbnailLocation(view.Title, this._activeClientTitle, view.Location);
{
this.ApplyPerClientLayout(view, this._activeClientTitle);
}
else
{
this.ApplyFlatLayout(view);
}
view.IsOverlayEnabled = this._configuration.ShowThumbnailOverlays; view.IsOverlayEnabled = this._configuration.ShowThumbnailOverlays;
if (!this._isHoverEffectActive) if (!this._isHoverEffectActive)
{ {
@@ -176,7 +141,6 @@ namespace EveOPreview.UI
public void SetupThumbnailFrames() public void SetupThumbnailFrames()
{ {
// TODO Drop config dependency
this.DisableViewEvents(); this.DisableViewEvents();
foreach (KeyValuePair<IntPtr, IThumbnailView> entry in this._thumbnailViews) foreach (KeyValuePair<IntPtr, IThumbnailView> entry in this._thumbnailViews)
@@ -203,14 +167,14 @@ namespace EveOPreview.UI
this._ignoreViewEvents = true; this._ignoreViewEvents = true;
} }
private Process[] GetClientProcesses() private static Process[] GetClientProcesses()
{ {
return Process.GetProcessesByName(ThumbnailManager.ClientProcessName); return Process.GetProcessesByName(ThumbnailManager.ClientProcessName);
} }
private void UpdateThumbnailsList() private void UpdateThumbnailsList()
{ {
Process[] clientProcesses = this.GetClientProcesses(); Process[] clientProcesses = ThumbnailManager.GetClientProcesses();
List<IntPtr> processHandles = new List<IntPtr>(clientProcesses.Length); List<IntPtr> processHandles = new List<IntPtr>(clientProcesses.Length);
IntPtr foregroundWindowHandle = DwmApiNativeMethods.GetForegroundWindow(); IntPtr foregroundWindowHandle = DwmApiNativeMethods.GetForegroundWindow();
@@ -248,7 +212,7 @@ namespace EveOPreview.UI
this._thumbnailViews.Add(processHandle, view); this._thumbnailViews.Add(processHandle, view);
this.SetupClientWindow(processHandle, processTitle); this.ApplyClientLayout(processHandle, processTitle);
viewsAdded.Add(view); viewsAdded.Add(view);
} }
@@ -263,7 +227,7 @@ namespace EveOPreview.UI
// view.RegisterShortcut(value); // view.RegisterShortcut(value);
//} //}
this.SetupClientWindow(processHandle, processTitle); this.ApplyClientLayout(processHandle, processTitle);
viewsUpdated.Add(view); viewsUpdated.Add(view);
} }
@@ -352,9 +316,12 @@ namespace EveOPreview.UI
DwmApiNativeMethods.ShowWindowAsync(id, DwmApiNativeMethods.SW_SHOWNORMAL); DwmApiNativeMethods.ShowWindowAsync(id, DwmApiNativeMethods.SW_SHOWNORMAL);
} }
this.UpdateClientLocation(); if (this._configuration.EnableClientLayoutTracking)
{
this.UpdateClientLayouts();
}
this.SaveLayout(); // Stores info about client window locations this._configurationStorage.Save();
foreach (KeyValuePair<IntPtr, IThumbnailView> entry in this._thumbnailViews) foreach (KeyValuePair<IntPtr, IThumbnailView> entry in this._thumbnailViews)
{ {
@@ -386,27 +353,11 @@ namespace EveOPreview.UI
IThumbnailView view = this._thumbnailViews[id]; IThumbnailView view = this._thumbnailViews[id];
this.UpdateThumbnailPosition(view.Title, view.Location); this._configuration.SetThumbnailLocation(view.Title, this._activeClientTitle, view.Location);
view.Refresh(); view.Refresh();
} }
private void SetupClientWindow(IntPtr clientHandle, string clientTitle)
{
if (!this._configuration.EnableClientsLocationTracking)
{
return;
}
WindowProperties windowProperties;
if (!this._clientLayout.TryGetValue(clientTitle, out windowProperties))
{
return;
}
DwmApiNativeMethods.MoveWindow(clientHandle, windowProperties.X, windowProperties.Y, windowProperties.Width, windowProperties.Height, true);
}
private bool IsClientWindowActive(IntPtr windowHandle) private bool IsClientWindowActive(IntPtr windowHandle)
{ {
foreach (KeyValuePair<IntPtr, IThumbnailView> entry in _thumbnailViews) foreach (KeyValuePair<IntPtr, IThumbnailView> entry in _thumbnailViews)
@@ -420,26 +371,6 @@ namespace EveOPreview.UI
return false; return false;
} }
private void UpdateThumbnailPosition(string title, Point position)
{
if (!this._configuration.EnablePerClientThumbnailsLayouts)
{
_flatLayout[title] = position;
return;
}
Dictionary<string, Point> layout;
if (_uniqueLayouts.TryGetValue(_activeClientTitle, out layout))
{
layout[title] = position;
}
else if (_activeClientTitle == "")
{
_uniqueLayouts[_activeClientTitle] = new Dictionary<string, Point>();
_uniqueLayouts[_activeClientTitle][title] = position;
}
}
private void ThumbnailZoomIn(IThumbnailView view) private void ThumbnailZoomIn(IThumbnailView view)
{ {
int zoomFactor = this._configuration.ThumbnailZoomFactor; int zoomFactor = this._configuration.ThumbnailZoomFactor;
@@ -449,7 +380,7 @@ namespace EveOPreview.UI
this.DisableViewEvents(); this.DisableViewEvents();
view.Size = new Size((int)(zoomFactor * view.Size.Width), (int)(zoomFactor * view.Size.Height)); view.Size = new Size(zoomFactor * view.Size.Width, zoomFactor * view.Size.Height);
int locationX = view.Location.X; int locationX = view.Location.X;
int locationY = view.Location.Y; int locationY = view.Location.Y;
@@ -509,250 +440,42 @@ namespace EveOPreview.UI
this.EnableViewEvents(); this.EnableViewEvents();
} }
// ************************************************************************ private void ApplyClientLayout(IntPtr clientHandle, string clientTitle)
// ************************************************************************
// ************************************************************************
// ************************************************************************
// ************************************************************************
// ************************************************************************
// TODO Reenable this method
private void UpdateClientLocation()
{ {
Process[] processes = Process.GetProcessesByName("ExeFile"); ClientLayout clientLayout = this._configuration.GetClientLayout(clientTitle);
List<IntPtr> processHandles = new List<IntPtr>();
foreach (Process process in processes) if (clientLayout == null)
{ {
RECT rect = new RECT(); return;
}
DwmApiNativeMethods.MoveWindow(clientHandle, clientLayout.X, clientLayout.Y, clientLayout.Width, clientLayout.Height, true);
}
private void UpdateClientLayouts()
{
Process[] clientProcesses = ThumbnailManager.GetClientProcesses();
foreach (Process process in clientProcesses)
{
RECT rect;
DwmApiNativeMethods.GetWindowRect(process.MainWindowHandle, out rect); DwmApiNativeMethods.GetWindowRect(process.MainWindowHandle, out rect);
int left = Math.Abs(rect.Left); int left = Math.Abs(rect.Left);
int right = Math.Abs(rect.Right); int right = Math.Abs(rect.Right);
int client_width = Math.Abs(left - right); int clientWidth = Math.Abs(left - right);
int top = Math.Abs(rect.Top); int top = Math.Abs(rect.Top);
int bottom = Math.Abs(rect.Bottom); int bottom = Math.Abs(rect.Bottom);
int client_height = Math.Abs(top - bottom); int clientHeight = Math.Abs(top - bottom);
WindowProperties location = new WindowProperties(); ClientLayout clientLayout = new ClientLayout();
location.X = rect.Left; clientLayout.X = rect.Left;
location.Y = rect.Top; clientLayout.Y = rect.Top;
location.Width = client_width; clientLayout.Width = clientWidth;
location.Height = client_height; clientLayout.Height = clientHeight;
this._configuration.SetClientLayout(process.MainWindowTitle, clientLayout);
_clientLayout[process.MainWindowTitle] = location;
}
}
// TODO Layouting and stuff should be renewed later
private string remove_nonconform_xml_characters(string entry)
{
foreach (var kv in _xmlBadToOkChars)
{
entry = entry.Replace(kv.Key, kv.Value);
}
return entry;
}
private string restore_nonconform_xml_characters(string entry)
{
foreach (var kv in _xmlBadToOkChars)
{
entry = entry.Replace(kv.Value, kv.Key);
}
return entry;
}
private XElement MakeXElement(string input)
{
string clean = remove_nonconform_xml_characters(input).Replace(" ", "_");
return new XElement(clean);
}
private string ParseXElement(XElement input)
{
return restore_nonconform_xml_characters(input.Name.ToString()).Replace("_", " ");
}
private void LoadLayout()
{
if (File.Exists("layout.xml"))
{
XElement rootElement = XElement.Load("layout.xml");
foreach (var el in rootElement.Elements())
{
Dictionary<string, Point> inner = new Dictionary<string, Point>();
foreach (var inner_el in el.Elements())
{
inner[ParseXElement(inner_el)] = new Point(Convert.ToInt32(inner_el.Element("x")?.Value), Convert.ToInt32(inner_el.Element("y")?.Value));
}
_uniqueLayouts[ParseXElement(el)] = inner;
}
}
if (File.Exists("flat_layout.xml"))
{
XElement rootElement = XElement.Load("flat_layout.xml");
foreach (var el in rootElement.Elements())
{
_flatLayout[ParseXElement(el)] = new Point(Convert.ToInt32(el.Element("x").Value), Convert.ToInt32(el.Element("y").Value));
_flatLayoutShortcuts[ParseXElement(el)] = "";
if (el.Element("shortcut") != null)
{
_flatLayoutShortcuts[ParseXElement(el)] = el.Element("shortcut").Value;
}
}
}
if (File.Exists("client_layout.xml"))
{
XElement rootElement = XElement.Load("client_layout.xml");
foreach (var el in rootElement.Elements())
{
WindowProperties location = new WindowProperties();
location.X = Convert.ToInt32(el.Element("x").Value);
location.Y = Convert.ToInt32(el.Element("y").Value);
location.Width = Convert.ToInt32(el.Element("width").Value);
location.Height = Convert.ToInt32(el.Element("height").Value);
_clientLayout[ParseXElement(el)] = location;
}
}
}
private void SaveLayout()
{
XElement el = new XElement("layouts");
foreach (var client in _uniqueLayouts.Keys)
{
if (client == "")
{
continue;
}
XElement layout = MakeXElement(client);
foreach (var thumbnail_ in _uniqueLayouts[client])
{
string thumbnail = thumbnail_.Key;
if (thumbnail == "" || thumbnail == "...")
{
continue;
}
XElement position = MakeXElement(thumbnail);
position.Add(new XElement("x", thumbnail_.Value.X));
position.Add(new XElement("y", thumbnail_.Value.Y));
layout.Add(position);
}
el.Add(layout);
}
el.Save("layout.xml");
XElement el2 = new XElement("flat_layout");
foreach (var clientKV in _flatLayout)
{
if (clientKV.Key == "" || clientKV.Key == "...")
{
continue;
}
XElement layout = MakeXElement(clientKV.Key);
layout.Add(new XElement("x", clientKV.Value.X));
layout.Add(new XElement("y", clientKV.Value.Y));
string shortcut;
if (_flatLayoutShortcuts.TryGetValue(clientKV.Key, out shortcut))
{
layout.Add(new XElement("shortcut", shortcut));
}
el2.Add(layout);
}
el2.Save("flat_layout.xml");
XElement el3 = new XElement("client_layout");
foreach (var clientKV in _clientLayout)
{
if (clientKV.Key == "" || clientKV.Key == "...")
{
continue;
}
XElement layout = MakeXElement(clientKV.Key);
layout.Add(new XElement("x", clientKV.Value.X));
layout.Add(new XElement("y", clientKV.Value.Y));
layout.Add(new XElement("width", clientKV.Value.Width));
layout.Add(new XElement("height", clientKV.Value.Height));
el3.Add(layout);
}
el3.Save("client_layout.xml");
}
private void ApplyPerClientLayout(IThumbnailView thumbnailWindow, string last_known_active_window)
{
Dictionary<string, Point> layout;
if (_uniqueLayouts.TryGetValue(last_known_active_window, out layout))
{
Point new_loc;
if (this._configuration.EnablePerClientThumbnailsLayouts && layout.TryGetValue(thumbnailWindow.Title, out new_loc))
{
thumbnailWindow.Location = new_loc;
}
else
{
// create inner dict
layout[thumbnailWindow.Title] = thumbnailWindow.Location;
}
}
else if (last_known_active_window != "")
{
// create outer dict
_uniqueLayouts[last_known_active_window] = new Dictionary<string, Point>();
_uniqueLayouts[last_known_active_window][thumbnailWindow.Title] = thumbnailWindow.Location;
}
}
private void ApplyFlatLayout(IThumbnailView thumbnailWindow)
{
Point layout;
if (_flatLayout.TryGetValue(thumbnailWindow.Title, out layout))
{
thumbnailWindow.Location = layout;
}
else if (thumbnailWindow.Title != "")
{
_flatLayout[thumbnailWindow.Title] = thumbnailWindow.Location;
} }
} }
} }

View File

@@ -45,7 +45,7 @@ namespace EveOPreview.UI
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
this.MinimizeToTrayCheckBox = new System.Windows.Forms.CheckBox(); this.MinimizeToTrayCheckBox = new System.Windows.Forms.CheckBox();
this.ThumbnailsOpacityScrollBar = new System.Windows.Forms.HScrollBar(); this.ThumbnailsOpacityScrollBar = new System.Windows.Forms.HScrollBar();
this.EnableClientsLocationTrackingCheckBox = new System.Windows.Forms.CheckBox(); this.EnableClientLayoutTrackingCheckBox = new System.Windows.Forms.CheckBox();
this.HideActiveClientThumbnailCheckBox = new System.Windows.Forms.CheckBox(); this.HideActiveClientThumbnailCheckBox = new System.Windows.Forms.CheckBox();
this.ShowThumbnailsAlwaysOnTopCheckBox = new System.Windows.Forms.CheckBox(); this.ShowThumbnailsAlwaysOnTopCheckBox = new System.Windows.Forms.CheckBox();
this.HideThumbnailsOnLostFocusCheckBox = new System.Windows.Forms.CheckBox(); this.HideThumbnailsOnLostFocusCheckBox = new System.Windows.Forms.CheckBox();
@@ -122,7 +122,7 @@ namespace EveOPreview.UI
ContentFlowLayoutPanel.BackColor = System.Drawing.SystemColors.Control; ContentFlowLayoutPanel.BackColor = System.Drawing.SystemColors.Control;
ContentFlowLayoutPanel.Controls.Add(this.MinimizeToTrayCheckBox); ContentFlowLayoutPanel.Controls.Add(this.MinimizeToTrayCheckBox);
ContentFlowLayoutPanel.Controls.Add(OpacityPanel); ContentFlowLayoutPanel.Controls.Add(OpacityPanel);
ContentFlowLayoutPanel.Controls.Add(this.EnableClientsLocationTrackingCheckBox); ContentFlowLayoutPanel.Controls.Add(this.EnableClientLayoutTrackingCheckBox);
ContentFlowLayoutPanel.Controls.Add(this.HideActiveClientThumbnailCheckBox); ContentFlowLayoutPanel.Controls.Add(this.HideActiveClientThumbnailCheckBox);
ContentFlowLayoutPanel.Controls.Add(this.ShowThumbnailsAlwaysOnTopCheckBox); ContentFlowLayoutPanel.Controls.Add(this.ShowThumbnailsAlwaysOnTopCheckBox);
ContentFlowLayoutPanel.Controls.Add(this.HideThumbnailsOnLostFocusCheckBox); ContentFlowLayoutPanel.Controls.Add(this.HideThumbnailsOnLostFocusCheckBox);
@@ -171,14 +171,14 @@ namespace EveOPreview.UI
// //
// EnableClientsLocationTrackingCheckBox // EnableClientsLocationTrackingCheckBox
// //
this.EnableClientsLocationTrackingCheckBox.AutoSize = true; this.EnableClientLayoutTrackingCheckBox.AutoSize = true;
this.EnableClientsLocationTrackingCheckBox.Location = new System.Drawing.Point(3, 58); this.EnableClientLayoutTrackingCheckBox.Location = new System.Drawing.Point(3, 58);
this.EnableClientsLocationTrackingCheckBox.Name = "EnableClientsLocationTrackingCheckBox"; this.EnableClientLayoutTrackingCheckBox.Name = "EnableClientLayoutTrackingCheckBox";
this.EnableClientsLocationTrackingCheckBox.Size = new System.Drawing.Size(127, 17); this.EnableClientLayoutTrackingCheckBox.Size = new System.Drawing.Size(127, 17);
this.EnableClientsLocationTrackingCheckBox.TabIndex = 32; this.EnableClientLayoutTrackingCheckBox.TabIndex = 32;
this.EnableClientsLocationTrackingCheckBox.Text = "Track client locations"; this.EnableClientLayoutTrackingCheckBox.Text = "Track client locations";
this.EnableClientsLocationTrackingCheckBox.UseVisualStyleBackColor = true; this.EnableClientLayoutTrackingCheckBox.UseVisualStyleBackColor = true;
this.EnableClientsLocationTrackingCheckBox.CheckedChanged += new System.EventHandler(this.OptionChanged_Handler); this.EnableClientLayoutTrackingCheckBox.CheckedChanged += new System.EventHandler(this.OptionChanged_Handler);
// //
// HideActiveClientThumbnailCheckBox // HideActiveClientThumbnailCheckBox
// //
@@ -655,7 +655,7 @@ namespace EveOPreview.UI
private NumericUpDown ThumbnailZoomFactorNumericEdit; private NumericUpDown ThumbnailZoomFactorNumericEdit;
private Panel ZoomAnchorPanel; private Panel ZoomAnchorPanel;
private CheckedListBox ThumbnailsList; private CheckedListBox ThumbnailsList;
private CheckBox EnableClientsLocationTrackingCheckBox; private CheckBox EnableClientLayoutTrackingCheckBox;
private HScrollBar ThumbnailsOpacityScrollBar; private HScrollBar ThumbnailsOpacityScrollBar;
private CheckBox MinimizeToTrayCheckBox; private CheckBox MinimizeToTrayCheckBox;
private NotifyIcon NotifyIcon; private NotifyIcon NotifyIcon;

View File

@@ -50,15 +50,15 @@ namespace EveOPreview.UI
} }
} }
public bool EnableClientsLocationTracking public bool EnableClientLayoutTracking
{ {
get get
{ {
return this.EnableClientsLocationTrackingCheckBox.Checked; return this.EnableClientLayoutTrackingCheckBox.Checked;
} }
set set
{ {
this.EnableClientsLocationTrackingCheckBox.Checked = value; this.EnableClientLayoutTrackingCheckBox.Checked = value;
} }
} }

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<root> <root>
<!-- <!--
Microsoft ResX Schema Microsoft ResX Schema
@@ -147,7 +147,7 @@
<metadata name="ThumbnailsOpacityScrollBar.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <metadata name="ThumbnailsOpacityScrollBar.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value> <value>True</value>
</metadata> </metadata>
<metadata name="EnableClientsLocationTrackingCheckBox.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <metadata name="EnableClientLayoutTrackingCheckBox.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value> <value>True</value>
</metadata> </metadata>
<metadata name="HideActiveClientThumbnailCheckBox.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <metadata name="HideActiveClientThumbnailCheckBox.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">

View File

@@ -14,7 +14,7 @@ namespace EveOPreview.UI
double ThumbnailsOpacity { get; set; } double ThumbnailsOpacity { get; set; }
bool EnableClientsLocationTracking { get; set; } bool EnableClientLayoutTracking { get; set; }
bool HideActiveClientThumbnail { get; set; } bool HideActiveClientThumbnail { get; set; }
bool ShowThumbnailsAlwaysOnTop { get; set; } bool ShowThumbnailsAlwaysOnTop { get; set; }
bool HideThumbnailsOnLostFocus { get; set; } bool HideThumbnailsOnLostFocus { get; set; }