8 Commits
Author SHA1 Message Date
Stone-Red-Code ed84fe37ed Merge branch 'develop'
# Conflicts:
#	update/DesktopMagic.zip
#	update/updateInfo.json
2021-11-06 19:04:04 +01:00
Stone_Red 921d6dfc20 Update README.md 2021-10-24 19:41:39 +02:00
Stone_Red 7761f505b1 Add files via upload 2021-09-23 22:52:43 +02:00
Stone_Red 05271e5f51 Update updateInfo.json 2021-09-23 22:52:32 +02:00
Stone_Red 3d7caf2011 Delete DesktopMagic-Standalone.zip 2021-09-23 22:51:57 +02:00
Stone_Red c25c270bd9 Add files via upload 2021-09-23 22:33:25 +02:00
Stone_Red c29d70ef0d Delete DesktopMagic.zip 2021-09-23 22:32:40 +02:00
Stone_Red 528d1161fe Update updateInfo.json 2021-09-23 22:31:56 +02:00
51 changed files with 1732 additions and 1335 deletions
+1
View File
@@ -12,6 +12,7 @@ obj/
*.user *.user
*.userosscache *.userosscache
*.sln.docstates *.sln.docstates
*GPUCache/
# User-specific files (MonoDevelop/Xamarin Studio) # User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs *.userprefs
+1 -1
View File
@@ -8,7 +8,7 @@
- [Plugin Documentation](https://github.com/Stone-Red-Code/DesktopMagic/wiki) - [Plugin Documentation](https://github.com/Stone-Red-Code/DesktopMagic/wiki)
- [Licence](https://github.com/Stone-Red-Code/DesktopMagic/blob/main/LICENSE) - [Licence](https://github.com/Stone-Red-Code/DesktopMagic/blob/main/LICENSE)
## Usage ## Setup
1. Download one of the [releases](https://github.com/Stone-Red-Code/DesktopMagic/releases). 1. Download one of the [releases](https://github.com/Stone-Red-Code/DesktopMagic/releases).
1. Follow one of the steps below. 1. Follow one of the steps below.
+1 -1
View File
@@ -2,7 +2,7 @@
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "DesktopMagic" #define MyAppName "DesktopMagic"
#define MyAppVersion "0.0.3.0" #define MyAppVersion "0.0.3.1"
#define MyAppPublisher "Stone_Red" #define MyAppPublisher "Stone_Red"
#define MyAppExeName "DesktopMagic.exe" #define MyAppExeName "DesktopMagic.exe"
+22 -6
View File
@@ -3,6 +3,7 @@
using Stone_Red_Utilities.Logging; using Stone_Red_Utilities.Logging;
using System; using System;
using System.IO;
using System.Threading; using System.Threading;
using System.Windows; using System.Windows;
@@ -18,7 +19,7 @@ namespace DesktopMagic
#if DEBUG #if DEBUG
private readonly Updater updater = new Updater(TimeSpan.FromDays(1), "https://raw.githubusercontent.com/Stone-Red-Code/DesktopMagic/develop/update/updateInfo.json"); private readonly Updater updater = new Updater(TimeSpan.FromDays(1), "https://raw.githubusercontent.com/Stone-Red-Code/DesktopMagic/develop/update/updateInfo.json");
#else #else
private readonly Updater updater = new Updater(TimeSpan.FromHours(1), "https://raw.githubusercontent.com/Stone-Red-Code/DesktopMagic/main/update/updateInfo.json"); private readonly Updater updater = new Updater(TimeSpan.FromDays(1), "https://raw.githubusercontent.com/Stone-Red-Code/DesktopMagic/main/update/updateInfo.json");
#endif #endif
public const string AppName = "Desktop Magic"; public const string AppName = "Desktop Magic";
@@ -33,11 +34,11 @@ namespace DesktopMagic
// Try to grab mutex // Try to grab mutex
_mutex = new Mutex(true, $"Stone_Red{AppName}", out bool createdNew); _mutex = new Mutex(true, $"Stone_Red{AppName}", out bool createdNew);
//check if creating new was succesfull //check if creating new was successful
if (!createdNew) if (!createdNew)
{ {
Logger.Log("Shutting down because other instance already running.", "Setup"); Logger.Log("Shutting down because other instance already running.", "Setup");
//Shutdown Aplication //Shutdown Application
Current.Shutdown(); Current.Shutdown();
} }
else else
@@ -59,7 +60,7 @@ namespace DesktopMagic
private void Updater_NoUpdateAvailible() private void Updater_NoUpdateAvailible()
{ {
Logger.Log("No update avalible.", "Updater"); Logger.Log("No update available.", "Updater");
} }
private void Updater_OnException(Exception exception) private void Updater_OnException(Exception exception)
@@ -104,7 +105,7 @@ namespace DesktopMagic
InfoConfig = new OutputConfig() InfoConfig = new OutputConfig()
{ {
Color = ConsoleColor.White, Color = ConsoleColor.White,
LogTarget = LogTarget.Console | LogTarget.File, LogTarget = LogTarget.DebugConsole | LogTarget.File,
FilePath = logFilePath FilePath = logFilePath
}, },
DebugConfig = new OutputConfig() DebugConfig = new OutputConfig()
@@ -114,9 +115,24 @@ namespace DesktopMagic
}, },
FormatConfig = new FormatConfig() FormatConfig = new FormatConfig()
{ {
DebugConsoleFormat = $"> {{{LogFormatType.DateTime}:hh:mm:ss}} | {{{LogFormatType.LogSeverity},-5}} | {{{LogFormatType.Message}}}\n> at {{{LogFormatType.LineNumber},3}} | {{{LogFormatType.FilePath}}}" DebugConsoleFormat = $"> {{{LogFormatType.DateTime}:hh:mm:ss}} | {{{LogFormatType.LogSeverity},-5}} | {{{LogFormatType.Message}}}\nat {{{LogFormatType.LineNumber}}} | {{{LogFormatType.FilePath}}}"
} }
}; };
try
{
if (!Directory.Exists(ApplicationDataPath))
{
_ = Directory.CreateDirectory(ApplicationDataPath);
}
Logger.Log("Created ApplicationData Folder", "Main");
}
catch (Exception ex)
{
Logger.Log(ex.Message, "Setup", LogSeverity.Error);
_ = MessageBox.Show(ex.ToString());
}
Logger.ClearLogFile(LogSeverity.Info); Logger.ClearLogFile(LogSeverity.Info);
Logger.Log("Log setup complete.", "Setup"); Logger.Log("Log setup complete.", "Setup");
} }
@@ -14,8 +14,15 @@
x:Name="window"> x:Name="window">
<Grid> <Grid>
<Rectangle x:Name="panel" Fill="#4CBAFFEF" Stroke="White" Margin="0,0,0,0" Visibility="Collapsed" /> <Rectangle x:Name="panel" Fill="#4CBAFFEF" Stroke="White" Margin="0,0,0,0" Visibility="Collapsed" />
<Viewbox StretchDirection="DownOnly" Stretch="Uniform"> <Border x:Name="border"/>
<TextBlock x:Name="textBlock" FontSize="999" Foreground="White" Text="CPU: 000%" IsHitTestVisible="False" /> <Viewbox x:Name="viewBox" StretchDirection="Both" Stretch="Uniform">
<Viewbox.Clip>
<RectangleGeometry x:Name="rectangleGeometry" RadiusX="{Binding ElementName=border, Path=CornerRadius.TopLeft}" RadiusY="{Binding ElementName=border, Path=CornerRadius.TopLeft}" Rect="{Binding ElementName=border}"/>
</Viewbox.Clip>
<DockPanel x:Name="dockPanel">
<TextBlock x:Name="textBlock" Foreground="White" FontSize="100" Text="CPU: " IsHitTestVisible="False" />
<TextBlock x:Name="valueTextBlock" TextAlignment="Right" FontSize="100" Foreground="White" Text="000%" IsHitTestVisible="False" />
</DockPanel>
</Viewbox> </Viewbox>
</Grid> </Grid>
<WindowChrome.WindowChrome> <WindowChrome.WindowChrome>
@@ -1,4 +1,6 @@
using Microsoft.Win32; using DesktopMagic.Helpers;
using Microsoft.Win32;
using System; using System;
using System.Diagnostics; using System.Diagnostics;
@@ -6,12 +8,10 @@ using System.Timers;
using System.Windows; using System.Windows;
using System.Windows.Interop; using System.Windows.Interop;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Threading;
namespace DesktopMagic namespace DesktopMagic
{ {
/// <summary>
/// Interaktionslogik für TimeWindow.xaml
/// </summary>
public partial class CpuUsageWindow : Window public partial class CpuUsageWindow : Window
{ {
private RegistryKey key; private RegistryKey key;
@@ -41,7 +41,7 @@ namespace DesktopMagic
Timer t = new Timer(); Timer t = new Timer();
t.Interval = 100; t.Interval = 100;
t.Elapsed += T_Elapsed; t.Elapsed += UpdateTimer_Elapsed;
t.Start(); t.Start();
Timer valueTimer = new Timer(); Timer valueTimer = new Timer();
@@ -68,23 +68,37 @@ namespace DesktopMagic
WindowPos.GetWindowLong(helper.Handle, WindowPos.GWL_EXSTYLE) | WindowPos.WS_EX_NOACTIVATE); WindowPos.GetWindowLong(helper.Handle, WindowPos.GWL_EXSTYLE) | WindowPos.WS_EX_NOACTIVATE);
} }
private void T_Elapsed(object sender, ElapsedEventArgs e) private void UpdateTimer_Elapsed(object sender, ElapsedEventArgs e)
{ {
Dispatcher.Invoke(() => Dispatcher.Invoke(() =>
{ {
if (MainWindow.EditMode) if (MainWindow.EditMode)
{ {
panel.Visibility = Visibility.Visible; panel.Visibility = Visibility.Visible;
tileBar.CaptionHeight = tileBar.CaptionHeight = ActualHeight - 10 < 0 ? 0 : ActualHeight - 10;
WindowPos.SetIsLocked(this, false); WindowPos.SetIsLocked(this, false);
ResizeMode = ResizeMode.CanResize;
} }
else else
{ {
panel.Visibility = Visibility.Collapsed; panel.Visibility = Visibility.Collapsed;
tileBar.CaptionHeight = 0;
WindowPos.SetIsLocked(this, true); WindowPos.SetIsLocked(this, true);
ResizeMode = ResizeMode.NoResize;
} }
textBlock.FontFamily = new FontFamily(MainWindow.GlobalFont); rectangleGeometry.Rect = new Rect(0, 0, border.ActualWidth, border.ActualHeight);
textBlock.Foreground = MainWindow.GlobalColor; border.Background = MainWindow.Theme.BackgroundBrush;
border.CornerRadius = new CornerRadius(MainWindow.Theme.CornerRadius);
viewBox.Margin = new Thickness(MainWindow.Theme.Margin);
border.Width = viewBox.ActualWidth + MainWindow.Theme.Margin * 2;
border.Height = viewBox.ActualHeight + MainWindow.Theme.Margin * 2;
textBlock.FontFamily = new FontFamily(MainWindow.Theme.Font);
textBlock.Foreground = MainWindow.Theme.PrimaryBrush;
valueTextBlock.FontFamily = new FontFamily(MainWindow.Theme.Font);
valueTextBlock.Foreground = MainWindow.Theme.PrimaryBrush;
ClculateWidth();
}); });
} }
@@ -93,13 +107,24 @@ namespace DesktopMagic
string cpuUsage = GetCpuUsage(); string cpuUsage = GetCpuUsage();
Dispatcher.Invoke(() => Dispatcher.Invoke(() =>
{ {
textBlock.Text = cpuUsage; valueTextBlock.Text = cpuUsage;
}); });
} }
private void ClculateWidth()
{
string template = "CPU: ###%";
double lenght = 0;
for (int i = 0; i < 9; i++)
{
lenght = Math.Max(StringUtilities.MeasureString(template.Replace('#', i.ToString()[0]), textBlock).Width, lenght);
}
dockPanel.Width = lenght;
}
private string GetCpuUsage() private string GetCpuUsage()
{ {
return "CPU: " + ((int)cpuCounter.NextValue()).ToString().PadLeft(3, '0') + "%"; return $"{(int)cpuCounter.NextValue()}%";
} }
private void Window_LocationChanged(object sender, EventArgs e) private void Window_LocationChanged(object sender, EventArgs e)
@@ -0,0 +1,50 @@
using DesktopMagicPluginAPI;
using System;
using System.Drawing;
using System.Drawing.Text;
namespace DesktopMagic.BuiltInWindowElements
{
internal class DatePlugin : Plugin
{
public override int UpdateInterval => 1000;
private DateTime oldDateTime = new DateTime();
private Color oldColor = Color.White;
private string oldFont;
public override Bitmap Main()
{
if (oldDateTime.Date == DateTime.Now.Date && oldColor == Application.Theme.PrimaryColor && oldFont == Application.Theme.Font)
{
return null;
}
oldDateTime = DateTime.Now;
oldColor = Application.Theme.PrimaryColor;
oldFont = Application.Theme.Font;
string date = DateTime.Now.ToLongDateString();
Font font = new Font(Application.Theme.Font, 200);
Bitmap bmp = new Bitmap(1, 1);
bmp.SetResolution(100, 100);
using Graphics tmpGr = Graphics.FromImage(bmp);
tmpGr.TextRenderingHint = TextRenderingHint.AntiAlias;
SizeF size = tmpGr.MeasureString(date, font);
bmp = new Bitmap((int)size.Width, (int)size.Height);
bmp.SetResolution(100, 100);
using Graphics gr = Graphics.FromImage(bmp);
gr.TextRenderingHint = TextRenderingHint.AntiAlias;
gr.DrawString(date, font, new SolidBrush(Application.Theme.PrimaryColor), 0, 0);
return bmp;
}
}
}
@@ -1,111 +1,33 @@
using Microsoft.Win32; using DesktopMagicPluginAPI;
using NAudio.Wave; using NAudio.Wave;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing; using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices;
using System.Timers;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Media.Imaging;
using System.Windows.Threading;
namespace DesktopMagic namespace DesktopMagic.BuiltInWindowElements
{ {
public partial class MusicVisualizerWindow : Window internal class MusicVisualizerPlugin : Plugin
{ {
[DllImport("user32.dll")] private IWaveIn waveIn;
private static extern void SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
private readonly RegistryKey key;
private readonly IWaveIn waveIn;
private const int fftLength = 1024; // NAudio fft wants powers of two! private const int fftLength = 1024; // NAudio fft wants powers of two!
private readonly SampleAggregator sampleAggregator = new SampleAggregator(fftLength); private readonly SampleAggregator sampleAggregator = new SampleAggregator(fftLength);
private volatile bool calculate = true; private volatile bool calculate = true;
private Bitmap output = new Bitmap(880, 300);
public MusicVisualizerWindow() public override int UpdateInterval => 0;
public override void Start()
{ {
InitializeComponent(); sampleAggregator.FftCalculated += FftCalculated;
Window w = new()
{
Top = -100,
Left = -100,
Width = 0,
Height = 0,
WindowStyle = WindowStyle.ToolWindow,
ShowInTaskbar = false
};
w.Show();
Owner = w;
w.Hide();
sampleAggregator.FftCalculated += new EventHandler<FftEventArgs>(FftCalculated);
sampleAggregator.PerformFFT = true; sampleAggregator.PerformFFT = true;
waveIn = new WasapiLoopbackCapture(); waveIn = new WasapiLoopbackCapture();
waveIn.DataAvailable += OnDataAvailable; waveIn.DataAvailable += OnDataAvailable;
waveIn.StartRecording(); waveIn.StartRecording();
Timer t = new Timer();
t.Interval = 100;
t.Elapsed += T_Elapsed;
t.Start();
key = Registry.CurrentUser.CreateSubKey(@"Software\" + App.AppName);
Top = double.Parse(key.GetValue("MusicVisualizerWindowTop", 100).ToString());
Left = double.Parse(key.GetValue("MusicVisualizerWindowLeft", 100).ToString());
Height = double.Parse(key.GetValue("MusicVisualizerWindowHeight", 200).ToString());
Width = double.Parse(key.GetValue("MusicVisualizerWindowWidth", 500).ToString());
IsEnabled = false;
}
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
//Set the window style to noactivate.
WindowInteropHelper helper = new WindowInteropHelper(this);
WindowPos.SetWindowLong(helper.Handle, WindowPos.GWL_EXSTYLE,
WindowPos.GetWindowLong(helper.Handle, WindowPos.GWL_EXSTYLE) | WindowPos.WS_EX_NOACTIVATE);
}
private void T_Elapsed(object sender, ElapsedEventArgs e)
{
Dispatcher.Invoke(() =>
{
if (MainWindow.EditMode)
{
panel.Visibility = Visibility.Visible;
WindowPos.SetIsLocked(this, false);
}
else
{
panel.Visibility = Visibility.Collapsed;
WindowPos.SetIsLocked(this, true);
}
if (!IsLoaded)
{
calculate = false;
}
else
{
calculate = true;
}
});
} }
private void OnDataAvailable(object sender, WaveInEventArgs e) private void OnDataAvailable(object sender, WaveInEventArgs e)
@@ -134,7 +56,7 @@ namespace DesktopMagic
} }
List<double> fft = new List<double>(); List<double> fft = new List<double>();
for (int i = 0; i < e.Result.Length / 2 - 70; i++) for (int i = 0; i < (e.Result.Length / 2) - 70; i++)
{ {
int v = i; int v = i;
if (v < 20) if (v < 20)
@@ -142,7 +64,7 @@ namespace DesktopMagic
v = 20; v = 20;
} }
int multiplier = 100 - MainWindow.AmplifierLevel * 2; int multiplier = 100 - (MainWindow.AmplifierLevel * 2);
multiplier = multiplier == 0 ? 1 : multiplier; multiplier = multiplier == 0 ? 1 : multiplier;
fft.Add(Math.Abs(e.Result[i].Y * v / multiplier)); fft.Add(Math.Abs(e.Result[i].Y * v / multiplier));
} }
@@ -173,7 +95,7 @@ namespace DesktopMagic
{ {
double temp = 0; double temp = 0;
int j; int j;
for (j = i * count; j < count + i * count; j++) for (j = i * count; j < count + (i * count); j++)
{ {
temp += fft[j]; temp += fft[j];
} }
@@ -227,9 +149,6 @@ namespace DesktopMagic
lastFft = fft; lastFft = fft;
try try
{ {
Stopwatch sw = new Stopwatch();
sw.Start();
Bitmap bm = new Bitmap(885, 300);
int offset = 0; int offset = 0;
if (!MainWindow.MirrorMode && MainWindow.SpectrumMode != 1) if (!MainWindow.MirrorMode && MainWindow.SpectrumMode != 1)
@@ -242,9 +161,9 @@ namespace DesktopMagic
offset = 1; offset = 1;
} }
using (Graphics gr = Graphics.FromImage(bm)) using (Graphics gr = Graphics.FromImage(output))
{ {
gr.SmoothingMode = SmoothingMode.None; gr.Clear(Color.Transparent);
PointF[] points = new PointF[scaledFft.Count + 2]; PointF[] points = new PointF[scaledFft.Count + 2];
int fftIndex = 0; int fftIndex = 0;
@@ -264,8 +183,8 @@ namespace DesktopMagic
if (!fftIndexReverse) if (!fftIndexReverse)
{ {
points[pointIndex + 1] = new PointF(bm.Width - 4 * pointIndex, bm.Height / 2 + value); points[pointIndex + 1] = new PointF(output.Width - (4 * pointIndex), (output.Height / 2) + value);
points[points.Length / 2 + pointIndex + 1] = new PointF(bm.Width - 4 * pointIndex, bm.Height / 2 - value); points[(points.Length / 2) + pointIndex + 1] = new PointF(output.Width - (4 * pointIndex), (output.Height / 2) - value);
} }
break; break;
@@ -274,7 +193,7 @@ namespace DesktopMagic
break; break;
default: default:
points[pointIndex + 1] = new PointF(2 * pointIndex, bm.Height - value - 1 + offset); points[pointIndex + 1] = new PointF(2 * pointIndex, output.Height - value - 1 + offset);
break; break;
} }
@@ -296,17 +215,11 @@ namespace DesktopMagic
} }
} }
SetPoints(points, bm.Width, bm.Height, offset); SetPoints(points, output.Width, output.Height, offset);
Brush brush; Brush brush = MainWindow.MusicVisualzerColor.HasValue
if (MainWindow.MusicVisualzerColor == null) ? new SolidBrush(MainWindow.MusicVisualzerColor.Value)
{ : new SolidBrush(MainWindow.Theme.PrimaryColor);
brush = MainWindow.GlobalSystemColor;
}
else
{
brush = MainWindow.MusicVisualzerColor;
}
if (MainWindow.LineMode) if (MainWindow.LineMode)
{ {
@@ -326,10 +239,7 @@ namespace DesktopMagic
} }
} }
Dispatcher.BeginInvoke((Action)delegate Application.UpdateWindow();
{
image.Source = BitmapToImageSource(bm);
});
} }
catch { } catch { }
} }
@@ -340,51 +250,33 @@ namespace DesktopMagic
{ {
case 1: case 1:
points[0] = new PointF(width, height / 2); points[0] = new PointF(width, height / 2);
points[points.Length - 1] = new PointF(0, height / 2); points[^1] = new PointF(0, height / 2);
points[points.Length / 2] = new PointF(width, height / 2); points[points.Length / 2] = new PointF(width, height / 2);
points[points.Length / 2 - 1] = new PointF(0, height / 2); points[(points.Length / 2) - 1] = new PointF(0, height / 2);
break; break;
case 2: case 2:
points[0] = new PointF(0, 0 - offset); points[0] = new PointF(0, 0 - offset);
points[points.Length - 1] = new PointF(points[points.Length - 2].X, 0 - offset); points[^1] = new PointF(points[^2].X, 0 - offset);
break; break;
default: default:
points[0] = new PointF(0, height); points[0] = new PointF(0, height);
points[points.Length - 1] = new PointF(points[points.Length - 2].X, height); points[^1] = new PointF(points[^2].X, height);
break; break;
} }
} }
private BitmapSource BitmapToImageSource(Bitmap bitmap) public override Bitmap Main()
{ {
BitmapData bitmapData = bitmap.LockBits( return output;
new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.ReadOnly, bitmap.PixelFormat);
BitmapSource bitmapSource = BitmapSource.Create(
bitmapData.Width, bitmapData.Height,
bitmap.HorizontalResolution, bitmap.VerticalResolution,
System.Windows.Media.PixelFormats.Bgra32, null,
bitmapData.Scan0, bitmapData.Stride * bitmapData.Height, bitmapData.Stride);
bitmap.UnlockBits(bitmapData);
return bitmapSource;
} }
private void Window_LocationChanged(object sender, EventArgs e) public override void Stop()
{ {
key.SetValue("MusicVisualizerWindowTop", this.Top); calculate = false;
key.SetValue("MusicVisualizerWindowLeft", this.Left); waveIn?.StopRecording();
}
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
key.SetValue("MusicVisualizerWindowHeight", Height);
key.SetValue("MusicVisualizerWindowWidth", Width);
tileBar.CaptionHeight = ActualHeight - 10;
} }
} }
} }
@@ -0,0 +1,55 @@
using DesktopMagicPluginAPI;
using DesktopMagicPluginAPI.Drawing;
using DesktopMagicPluginAPI.Inputs;
using System;
using System.Drawing;
using System.Drawing.Text;
namespace DesktopMagic.BuiltInWindowElements
{
internal class TimePlugin : Plugin
{
[Element("Display Seconds:")]
private CheckBox checkBox = new CheckBox(true);
public override int UpdateInterval => 1000;
public override Bitmap Main()
{
string time = checkBox.Value ? DateTime.Now.ToLongTimeString() : DateTime.Now.ToShortTimeString();
Font font = new Font(Application.Theme.Font, 200);
Bitmap bmp = new Bitmap(1, 1);
using Graphics tmpGr = Graphics.FromImage(bmp);
tmpGr.TextRenderingHint = TextRenderingHint.AntiAlias;
SizeF size = CalculateSize(tmpGr, font);
bmp = new Bitmap((int)size.Width, (int)size.Height);
bmp.SetResolution(100, 100);
using Graphics gr = Graphics.FromImage(bmp);
gr.TextRenderingHint = TextRenderingHint.AntiAlias;
gr.DrawStringNoLeftPadding(time, font, new SolidBrush(Application.Theme.PrimaryColor), 0, 0);
return bmp;
}
private SizeF CalculateSize(Graphics graphics, Font font)
{
string template = checkBox.Value ? "##:##:##" : "##:##";
SizeF size = new SizeF();
for (int i = 0; i < 9; i++)
{
SizeF newSize = graphics.MeasureStringNoLeftPadding(template.Replace("#", i.ToString()), font);
size.Width = Math.Max(size.Width, newSize.Width);
size.Height = Math.Max(size.Height, newSize.Height);
}
return size;
}
}
}
-91
View File
@@ -1,91 +0,0 @@
using Google.Apis.Auth.OAuth2;
using Google.Apis.Calendar.v3;
using Google.Apis.Calendar.v3.Data;
using Google.Apis.Services;
using Google.Apis.Util.Store;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Threading;
namespace DesktopMagic
{
internal class CalendarManagment
{
private static string[] Scopes = { CalendarService.Scope.CalendarReadonly };
private static string ApplicationName = "Google Calendar API .NET " + App.AppName;
[Obsolete]
public (List<string>, List<string>) GetEvents()
{
List<string> upcomingEventNames = new List<string>();
List<string> upcomingEventTimes = new List<string>();
UserCredential credential;
if (!File.Exists("credentials.json"))
{
return (new(), new());
}
using (FileStream stream = new FileStream("credentials.json", FileMode.Open, FileAccess.Read))
{
// The file token.json stores the user's access and refresh tokens, and is created
// automatically when the authorization flow completes for the first time.
string credPath = "token.json";
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(stream).Secrets,
Scopes,
"user",
CancellationToken.None,
new FileDataStore(credPath, true)).Result;
Debug.WriteLine("Credential file saved to: " + credPath);
}
// Create Google Calendar API service.
CalendarService service = new CalendarService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = ApplicationName,
});
// Define parameters of request.
EventsResource.ListRequest request = service.Events.List("primary");
request.TimeMin = DateTime.Now;
request.ShowDeleted = false;
request.SingleEvents = true;
request.MaxResults = 10;
request.OrderBy = EventsResource.ListRequest.OrderByEnum.StartTime;
// List events.
Events events = request.Execute();
if (events.Items != null && events.Items.Count > 0)
{
foreach (Event eventItem in events.Items)
{
if (upcomingEventNames.Count < 10)
{
string when = eventItem.Start.DateTime.ToString();
if (string.IsNullOrEmpty(when))
{
when = eventItem.Start.Date;
}
upcomingEventNames.Add(eventItem.Summary);
upcomingEventTimes.Add(when);
}
}
}
return (upcomingEventNames, upcomingEventTimes);
}
}
internal class CalendarItems
{
public string eventname { get; set; }
public string dateTime { get; set; }
public string font { get; set; }
public string color { get; set; }
}
}
-38
View File
@@ -1,38 +0,0 @@
<Window x:Class="DesktopMagic.CalendarWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="CalendarWindow" Height="450" Width="800"
Background="Transparent"
WindowStyle="None"
AllowsTransparency="True"
LocationChanged="Window_LocationChanged"
SizeChanged="Window_SizeChanged"
x:Name="window">
<Grid>
<Rectangle x:Name="panel" Fill="#4CBAFFEF" Stroke="White" Margin="0,0,0,0" Visibility="Collapsed" />
<Viewbox StretchDirection="Both" Stretch="Uniform">
<ListView x:Name="listBox" Height="Auto" Width="Auto" Background="Transparent" BorderBrush="Transparent" FontSize="999" Foreground="White">
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<StackPanel>
<TextBlock Text="{Binding eventname}" FontSize="10" FontFamily="{Binding font}" Foreground="{Binding color}" Margin="0,0" />
<TextBlock Text="{Binding dateTime}" FontSize="7" FontFamily="{Binding font}" Foreground="Gray" Margin="0,-3" />
</StackPanel>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Viewbox>
</Grid>
<WindowChrome.WindowChrome>
<WindowChrome x:Name="tileBar" CaptionHeight="3000" ResizeBorderThickness="{x:Static SystemParameters.WindowResizeBorderThickness}" />
</WindowChrome.WindowChrome>
</Window>
-159
View File
@@ -1,159 +0,0 @@
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Timers;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Media;
namespace DesktopMagic
{
/// <summary>
/// Interaktionslogik für TimeWindow.xaml
/// </summary>
public partial class CalendarWindow : Window
{
private RegistryKey key;
private string oldFont = "";
private Brush oldColor;
private List<string> upcomingEventNames = new List<string>();
private List<string> upcomingEventTimes = new List<string>();
public CalendarWindow()
{
InitializeComponent();
Window w = new Window();
w.Top = -100;
w.Left = -100;
w.Width = 0;
w.Height = 0;
w.WindowStyle = WindowStyle.ToolWindow;
w.ShowInTaskbar = false;
w.Show();
Owner = w;
w.Hide();
Timer t = new Timer();
t.Interval = 100;
t.Elapsed += T_Elapsed;
t.Start();
Timer valueTimer = new Timer();
valueTimer.Interval = 600000;
valueTimer.Elapsed += ValueTimer_Elapsed;
;
valueTimer.Start();
key = Registry.CurrentUser.CreateSubKey(@"Software\" + App.AppName);
Top = double.Parse(key.GetValue("CalendarWindowTop", 100).ToString());
Left = double.Parse(key.GetValue("CalendarWindowLeft", 100).ToString());
Height = double.Parse(key.GetValue("CalendarWindowHeight", 200).ToString());
Width = double.Parse(key.GetValue("CalendarWindowWidth", 500).ToString());
//this.IsEnabled = false;
Task.Run(() =>
{
(upcomingEventNames, upcomingEventTimes) = new CalendarManagment().GetEvents();
Dispatcher.Invoke(() =>
{
LoadEvents();
});
});
}
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
//Set the window style to noactivate.
WindowInteropHelper helper = new WindowInteropHelper(this);
WindowPos.SetWindowLong(helper.Handle, WindowPos.GWL_EXSTYLE,
WindowPos.GetWindowLong(helper.Handle, WindowPos.GWL_EXSTYLE) | WindowPos.WS_EX_NOACTIVATE);
}
private void ValueTimer_Elapsed(object sender, ElapsedEventArgs e)
{
Task.Run(() =>
{
(upcomingEventNames, upcomingEventTimes) = new CalendarManagment().GetEvents();
Dispatcher.Invoke(() =>
{
LoadEvents();
});
});
}
private void T_Elapsed(object sender, ElapsedEventArgs e)
{
Dispatcher.Invoke(() =>
{
if (MainWindow.EditMode)
{
panel.Visibility = Visibility.Visible;
WindowPos.SetIsLocked(this, false);
}
else
{
panel.Visibility = Visibility.Collapsed;
WindowPos.SetIsLocked(this, true);
}
if (MainWindow.GlobalFont != oldFont || MainWindow.GlobalColor != oldColor)
{
oldColor = MainWindow.GlobalColor;
oldFont = MainWindow.GlobalFont;
LoadEvents();
}
listBox.SelectedIndex = -1;
});
}
private void LoadEvents()
{
listBox.Items.Clear();
CalendarItems calendarItem = new CalendarItems();
calendarItem.eventname = "Termine: ";
calendarItem.font = MainWindow.GlobalFont;
calendarItem.color = MainWindow.GlobalColor.ToString();
listBox.Items.Add(calendarItem);
for (int i = 0; i < upcomingEventNames.Count; i++)
{
DateTime dateTime = DateTime.Now;
DateTime.TryParse(upcomingEventTimes[i], out dateTime);
calendarItem = new CalendarItems();
calendarItem.eventname = upcomingEventNames[i];
calendarItem.dateTime = dateTime.ToString("dd-MM-yyyy");
calendarItem.font = MainWindow.GlobalFont;
calendarItem.color = MainWindow.GlobalColor.ToString();
if (dateTime < DateTime.Today.AddMonths(12) || upcomingEventTimes[i] == "-")
{
listBox.Items.Add(calendarItem);
}
}
while (listBox.Items.Count < 10)
{
listBox.Items.Add("");
}
}
private void Window_LocationChanged(object sender, EventArgs e)
{
key.SetValue("CalendarWindowTop", Top);
key.SetValue("CalendarWindowLeft", Left);
}
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
key.SetValue("CalendarWindowHeight", Height);
key.SetValue("CalendarWindowWidth", Width);
tileBar.CaptionHeight = ActualHeight - 10;
}
}
}
-23
View File
@@ -1,23 +0,0 @@
<Window x:Class="DesktopMagic.DateWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="DateWindow" Height="450" Width="800"
Background="Transparent"
WindowStyle="None"
AllowsTransparency="True"
LocationChanged="Window_LocationChanged"
SizeChanged="Window_SizeChanged"
x:Name="window">
<Grid>
<Rectangle x:Name="panel" Fill="#4CBAFFEF" Stroke="White" Margin="0,0,0,0" Visibility="Collapsed" />
<Viewbox StretchDirection="DownOnly" Stretch="Uniform">
<TextBlock x:Name="textBlock" FontSize="999" Foreground="White" Text=" " IsHitTestVisible="False" />
</Viewbox>
</Grid>
<WindowChrome.WindowChrome>
<WindowChrome x:Name="tileBar" CaptionHeight="3000" ResizeBorderThickness="{x:Static SystemParameters.WindowResizeBorderThickness}" />
</WindowChrome.WindowChrome>
</Window>
-90
View File
@@ -1,90 +0,0 @@
using Microsoft.Win32;
using System;
using System.Timers;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Media;
namespace DesktopMagic
{
/// <summary>
/// Interaktionslogik für TimeWindow.xaml
/// </summary>
public partial class DateWindow : Window
{
private RegistryKey key;
public DateWindow()
{
InitializeComponent();
Window w = new Window();
w.Top = -100;
w.Left = -100;
w.Width = 0;
w.Height = 0;
w.WindowStyle = WindowStyle.ToolWindow;
w.ShowInTaskbar = false;
w.Show();
Owner = w;
w.Hide();
Timer t = new Timer();
t.Interval = 100;
t.Elapsed += T_Elapsed;
t.Start();
key = Registry.CurrentUser.CreateSubKey(@"Software\" + App.AppName);
Top = double.Parse(key.GetValue("DateWindowTop", 100).ToString());
Left = double.Parse(key.GetValue("DateWindowLeft", 100).ToString());
Height = double.Parse(key.GetValue("DateWindowHeight", 200).ToString());
Width = double.Parse(key.GetValue("DateWindowWidth", 500).ToString());
IsEnabled = false;
}
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
//Set the window style to noactivate.
WindowInteropHelper helper = new WindowInteropHelper(this);
WindowPos.SetWindowLong(helper.Handle, WindowPos.GWL_EXSTYLE,
WindowPos.GetWindowLong(helper.Handle, WindowPos.GWL_EXSTYLE) | WindowPos.WS_EX_NOACTIVATE);
}
private void T_Elapsed(object sender, ElapsedEventArgs e)
{
Dispatcher.Invoke(() =>
{
if (MainWindow.EditMode)
{
panel.Visibility = Visibility.Visible;
WindowPos.SetIsLocked(this, false);
}
else
{
panel.Visibility = Visibility.Collapsed;
WindowPos.SetIsLocked(this, true);
}
textBlock.FontFamily = new FontFamily(MainWindow.GlobalFont);
textBlock.Foreground = MainWindow.GlobalColor;
textBlock.Text = DateTime.Now.ToString("D");
});
}
private void Window_LocationChanged(object sender, EventArgs e)
{
key.SetValue("DateWindowTop", Top);
key.SetValue("DateWindowLeft", Left);
}
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
key.SetValue("DateWindowHeight", Height);
key.SetValue("DateWindowWidth", Width);
tileBar.CaptionHeight = ActualHeight - 10;
}
}
}
+3 -3
View File
@@ -8,11 +8,11 @@
<ApplicationIcon>icon.ico</ApplicationIcon> <ApplicationIcon>icon.ico</ApplicationIcon>
<RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent> <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
<Authors>Stone_Red</Authors> <Authors>Stone_Red</Authors>
<Version>0.0.3.0</Version> <Version>0.0.3.1</Version>
<PackageProjectUrl>https://github.com/Stone-Red-Code/DesktopMagic</PackageProjectUrl> <PackageProjectUrl>https://github.com/Stone-Red-Code/DesktopMagic</PackageProjectUrl>
<RepositoryUrl>https://github.com/Stone-Red-Code/DesktopMagic</RepositoryUrl> <RepositoryUrl>https://github.com/Stone-Red-Code/DesktopMagic</RepositoryUrl>
<AssemblyVersion>0.0.3.0</AssemblyVersion> <AssemblyVersion>0.0.3.1</AssemblyVersion>
<FileVersion>0.0.3.0</FileVersion> <FileVersion>0.0.3.1</FileVersion>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
+49
View File
@@ -0,0 +1,49 @@
<Window x:Class="DesktopMagic.Dialogs.ColorDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:local="clr-namespace:DesktopMagic.Dialogs"
mc:Ignorable="d"
ResizeMode="NoResize"
Title="ColorDialog"
SizeToContent="WidthAndHeight">
<Grid>
<StackPanel Margin="15">
<Label x:Name="label" Content="Label" HorizontalAlignment="Left" VerticalAlignment="Top"/>
<DockPanel>
<Label Content="A:" Width="20" />
<Slider x:Name="alphaSlider" VerticalAlignment="Center" Maximum="255" ValueChanged="ColorSliders_ValueChanged" TickFrequency="1" IsSnapToTickEnabled="True" Background="#00030000" />
</DockPanel>
<DockPanel>
<Label Content="R:" Width="20" />
<Slider x:Name="redSlider" VerticalAlignment="Center" Maximum="255" ValueChanged="ColorSliders_ValueChanged" TickFrequency="1" IsSnapToTickEnabled="True" Background="#00030000" />
</DockPanel>
<DockPanel>
<Label Content="G:" Width="20" />
<Slider x:Name="greenSlider" VerticalAlignment="Center" Maximum="255" ValueChanged="ColorSliders_ValueChanged" TickFrequency="1" IsSnapToTickEnabled="True" Background="#0000FF00" />
</DockPanel>
<DockPanel>
<Label Content="B:" Width="20" />
<Slider x:Name="blueSlider" VerticalAlignment="Center" Maximum="255" ValueChanged="ColorSliders_ValueChanged" TickFrequency="1" IsSnapToTickEnabled="True" Background="#000000FF" />
</DockPanel>
<StackPanel Orientation="Horizontal">
<Border CornerRadius="1" BorderThickness="1.5" BorderBrush="Gray" Height="23" Width="23" Margin="0,0,5,0">
<Rectangle x:Name="colorRechtangle" Fill="White" />
</Border>
<TextBox x:Name="colorHexTextBox" MaxLength="9" CharacterCasing="Upper" Height="23" TextWrapping="Wrap" Width="350" TextChanged="ColorHexTextBox_TextChanged" RenderTransformOrigin="0.5,0.5" VerticalContentAlignment="Center">
<materialDesign:TextFieldAssist.CharacterCounterStyle>
<Style TargetType="TextBlock" />
</materialDesign:TextFieldAssist.CharacterCounterStyle>
</TextBox>
</StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,10,0,0">
<Button x:Name="okButton" Content="{DynamicResource ok }" HorizontalAlignment="Left" Margin="0,0,10,0" VerticalAlignment="Top" Width="100" Click="OkButton_Click" Cursor="Hand"/>
<Button x:Name="cancelButton" Content="{DynamicResource cancel }" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top" Width="100" Click="CancelButton_Click"/>
</StackPanel>
</StackPanel>
</Grid>
</Window>
@@ -0,0 +1,130 @@
using DesktopMagic.Helpers;
using System;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace DesktopMagic.Dialogs
{
/// <summary>
/// Interaction logic for ColorDialog.xaml
/// </summary>
public partial class ColorDialog : Window
{
public ColorDialog(string content, System.Drawing.Color defaultColor, string title = "ColorDialog")
{
InitializeComponent();
label.Content = content;
Title = title;
SetLanguageDictionary();
alphaSlider.Value = defaultColor.A;
redSlider.Value = defaultColor.R;
greenSlider.Value = defaultColor.G;
blueSlider.Value = defaultColor.B;
}
public System.Drawing.Color ResultColor { get; private set; }
public Brush ResultBrush { get; private set; }
private void OkButton_Click(object sender, RoutedEventArgs e)
{
DialogResult = true;
}
private void CancelButton_Click(object sender, RoutedEventArgs e)
{
DialogResult = false;
}
private void ColorSliders_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
colorHexTextBox.Select(colorHexTextBox.Text.Length, 0);
SetColorText();
}
private void ColorHexTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
if (colorHexTextBox.Text.Length > 0)
{
if (colorHexTextBox.Text.ToCharArray()[0] != '#')
{
colorHexTextBox.Text = "#" + colorHexTextBox.Text.Replace("#", "");
}
}
else
{
colorHexTextBox.Text = "#";
colorHexTextBox.Select(colorHexTextBox.Text.Length, 0);
}
if (colorHexTextBox.SelectionStart == 0)
{
if (colorHexTextBox.Text.Length <= 2)
{
colorHexTextBox.Select(colorHexTextBox.Text.Length, 0);
}
else
{
colorHexTextBox.Select(1, 0);
}
}
string hex = colorHexTextBox.Text;
if (MultiColorConverter.TryConvertToMediaColor(hex, out Color color) && MultiColorConverter.TryConvertToSystemColor(hex, out System.Drawing.Color systemColor))
{
alphaSlider.Value = color.A;
redSlider.Value = color.R;
greenSlider.Value = color.G;
blueSlider.Value = color.B;
Brush brush = new SolidColorBrush(color);
ResultBrush = brush;
ResultColor = systemColor;
colorRechtangle.Fill = brush;
colorHexTextBox.Foreground = Brushes.Black;
return;
}
else
{
colorHexTextBox.Foreground = Brushes.Red;
}
}
private void SetColorText()
{
if (alphaSlider.Value == 255)
{
colorHexTextBox.Text = "#";
}
else
{
colorHexTextBox.Text = "#" + ((int)alphaSlider.Value).ToString("X2");
}
colorHexTextBox.Text += ((int)redSlider.Value).ToString("X2") + ((int)greenSlider.Value).ToString("X2") + ((int)blueSlider.Value).ToString("X2");
}
private void SetLanguageDictionary()
{
ResourceDictionary dict = new ResourceDictionary();
string currentCulture = Thread.CurrentThread.CurrentCulture.ToString();
if (currentCulture.Contains("de"))
{
dict.Source = new Uri("..\\Resources\\StringResources.de.xaml", UriKind.Relative);
}
else
{
dict.Source = new Uri("..\\Resources\\StringResources.en.xaml", UriKind.Relative);
}
Resources.MergedDictionaries.Add(dict);
}
}
}
@@ -1,16 +1,17 @@
<Window x:Class="DesktopMagic.InputDialog" <Window x:Class="DesktopMagic.Dialogs.InputDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:DesktopMagic" xmlns:local="clr-namespace:DesktopMagic.Dialogs"
mc:Ignorable="d" mc:Ignorable="d"
Title="InputDialog" Height="152.812" Width="322.812" Title="InputDialog"
ResizeMode="NoResize"> ResizeMode="NoResize"
SizeToContent="WidthAndHeight">
<Grid> <Grid>
<StackPanel VerticalAlignment="Center" HorizontalAlignment="Center" Margin="10"> <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center" Margin="15">
<Label x:Name="label" Content="Label" HorizontalAlignment="Left" VerticalAlignment="Top"/> <Label x:Name="label" Content="Label" HorizontalAlignment="Left" VerticalAlignment="Top"/>
<TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" TextWrapping="Wrap" VerticalAlignment="Top" Width="279" VerticalContentAlignment="Center"/> <TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" TextWrapping="Wrap" VerticalAlignment="Top" Width="280" VerticalContentAlignment="Center"/>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,10,0,0"> <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,10,0,0">
<Button x:Name="okButton" Content="{DynamicResource ok }" HorizontalAlignment="Left" Margin="0,0,10,0" VerticalAlignment="Top" Width="100" Click="OkButton_Click" Cursor="Hand"/> <Button x:Name="okButton" Content="{DynamicResource ok }" HorizontalAlignment="Left" Margin="0,0,10,0" VerticalAlignment="Top" Width="100" Click="OkButton_Click" Cursor="Hand"/>
<Button x:Name="cancelButton" Content="{DynamicResource cancel }" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top" Width="100" Click="CancelButton_Click"/> <Button x:Name="cancelButton" Content="{DynamicResource cancel }" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top" Width="100" Click="CancelButton_Click"/>
@@ -2,25 +2,22 @@
using System.Threading; using System.Threading;
using System.Windows; using System.Windows;
namespace DesktopMagic namespace DesktopMagic.Dialogs
{ {
/// <summary>
/// Interaktionslogik für InputDialog.xaml
/// </summary>
public partial class InputDialog : Window public partial class InputDialog : Window
{ {
public InputDialog(string content, string title = "InputDialog") public InputDialog(string content, string title = "InputDialog")
{ {
InitializeComponent(); InitializeComponent();
label.Content = content; label.Content = content;
this.Title = title; Title = title;
SetLanguageDictionary(); SetLanguageDictionary();
} }
public string ResponseText public string ResponseText
{ {
get { return textBox.Text; } get => textBox.Text;
set { textBox.Text = value; } set => textBox.Text = value;
} }
private void OkButton_Click(object sender, RoutedEventArgs e) private void OkButton_Click(object sender, RoutedEventArgs e)
@@ -46,7 +43,7 @@ namespace DesktopMagic
{ {
dict.Source = new Uri("..\\Resources\\StringResources.en.xaml", UriKind.Relative); dict.Source = new Uri("..\\Resources\\StringResources.en.xaml", UriKind.Relative);
} }
this.Resources.MergedDictionaries.Add(dict); Resources.MergedDictionaries.Add(dict);
} }
} }
} }
+2 -2
View File
@@ -5,5 +5,5 @@
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
[assembly: SuppressMessage("Performance", "CA1822:Member als statisch markieren", Justification = "<Ausstehend>", Scope = "member", Target = "~M:DesktopMagic.PluginWindow.LoadOptions(System.Object)")] [assembly: SuppressMessage("Interoperability", "CA1416:Validate platform compatibility", Justification = "Windows only application")]
[assembly: SuppressMessage("Style", "IDE0090:Use 'new(...)'", Justification = "<Pending>", Scope = "member", Target = "~M:DesktopMagic.MainWindow.GithubButton_Click(System.Object,System.Windows.RoutedEventArgs)")] [assembly: SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "No need to")]
@@ -0,0 +1,76 @@
using System.Globalization;
using System.Text.RegularExpressions;
namespace DesktopMagic.Helpers
{
internal static class MultiColorConverter
{
public static string ConvertToHex(System.Drawing.Color color)
{
return $"#{color.A:X2}{color.R:X2}{color.G:X2}{color.B:X2}";
}
public static string ConvertToHex(System.Windows.Media.Color color)
{
return $"#{color.A:X2}{color.R:X2}{color.G:X2}{color.B:X2}";
}
public static bool TryConvertToSystemColor(string hex, out System.Drawing.Color color)
{
hex = hex.Replace("#", "");
if (hex.Length == 8 && Regex.IsMatch(hex, "(?:[0-9a-fA-F]{8})"))
{
int a = int.Parse(hex.Substring(0, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
int r = int.Parse(hex.Substring(2, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
int g = int.Parse(hex.Substring(4, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
int b = int.Parse(hex.Substring(6, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
color = System.Drawing.Color.FromArgb((byte)a, (byte)r, (byte)g, (byte)b);
return true;
}
else if (hex.Length == 6 && Regex.IsMatch(hex, "(?:[0-9a-fA-F]{6})"))
{
int a = 255;
int r = int.Parse(hex.Substring(0, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
int g = int.Parse(hex.Substring(2, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
int b = int.Parse(hex.Substring(4, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
color = System.Drawing.Color.FromArgb((byte)a, (byte)r, (byte)g, (byte)b);
return true;
}
else
{
color = System.Drawing.Color.Transparent;
return false;
}
}
public static bool TryConvertToMediaColor(string hex, out System.Windows.Media.Color color)
{
hex = hex.Replace("#", "");
if (hex.Length == 8 && Regex.IsMatch(hex, "(?:[0-9a-fA-F]{8})"))
{
int a = int.Parse(hex.Substring(0, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
int r = int.Parse(hex.Substring(2, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
int g = int.Parse(hex.Substring(4, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
int b = int.Parse(hex.Substring(6, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
color = System.Windows.Media.Color.FromArgb((byte)a, (byte)r, (byte)g, (byte)b);
return true;
}
else if (hex.Length == 6 && Regex.IsMatch(hex, "(?:[0-9a-fA-F]{6})"))
{
int a = 255;
int r = int.Parse(hex.Substring(0, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
int g = int.Parse(hex.Substring(2, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
int b = int.Parse(hex.Substring(4, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
color = System.Windows.Media.Color.FromArgb((byte)a, (byte)r, (byte)g, (byte)b);
return true;
}
else
{
color = System.Windows.Media.Colors.Transparent;
return false;
}
}
}
}
@@ -0,0 +1,238 @@
using DesktopMagic.Plugins;
using System;
using System.Windows;
using System.Windows.Controls;
namespace DesktopMagic.Helpers
{
internal class SettingElementGenerator
{
private readonly ComboBox optionsComboBox;
public SettingElementGenerator(ComboBox optionsComboBox)
{
this.optionsComboBox = optionsComboBox;
}
public void Generate(SettingElement settingElement, DockPanel dockPanel, TextBlock textBlock)
{
dockPanel.UpdateLayout();
textBlock.UpdateLayout();
if (settingElement.Element is DesktopMagicPluginAPI.Inputs.Label eLabel)
{
textBlock.Text = eLabel.Value;
textBlock.Margin = new Thickness(0, 5, 3, 0);
textBlock.HorizontalAlignment = HorizontalAlignment.Stretch;
textBlock.TextWrapping = TextWrapping.WrapWithOverflow;
if (eLabel.Bold)
{
textBlock.FontWeight = FontWeights.Bold;
}
eLabel.OnValueChanged += () =>
{
textBlock.Dispatcher.Invoke(() =>
{
textBlock.Text = eLabel.Value;
});
};
}
else if (settingElement.Element is DesktopMagicPluginAPI.Inputs.Button eButton)
{
Button button = new()
{
Content = eButton.Value,
FontSize = 10,
Height = 20,
Margin = new Thickness(0, 10, 0, 10),
Padding = new Thickness(0),
VerticalAlignment = VerticalAlignment.Center,
HorizontalAlignment = HorizontalAlignment.Stretch
};
button.Click += (_s, _e) =>
{
try
{
eButton.Click();
}
catch (Exception ex)
{
DisplayException(ex.Message);
}
};
eButton.OnValueChanged += () =>
{
button.Dispatcher.Invoke(() =>
{
button.Content = eButton.Value;
});
};
_ = dockPanel.Children.Add(button);
}
else if (settingElement.Element is DesktopMagicPluginAPI.Inputs.CheckBox eCheckBox)
{
CheckBox checkBox = new()
{
IsChecked = eCheckBox.Value,
Style = (Style)dockPanel.FindResource("MaterialDesignDarkCheckBox"),
VerticalAlignment = VerticalAlignment.Center,
HorizontalAlignment = HorizontalAlignment.Stretch
};
checkBox.Click += (_s, _e) =>
{
try
{
eCheckBox.Value = checkBox.IsChecked.GetValueOrDefault();
}
catch (Exception ex)
{
DisplayException(ex.Message);
}
};
eCheckBox.OnValueChanged += () =>
{
checkBox.Dispatcher.Invoke(() =>
{
checkBox.IsChecked = eCheckBox.Value;
});
};
_ = dockPanel.Children.Add(checkBox);
}
else if (settingElement.Element is DesktopMagicPluginAPI.Inputs.TextBox eTextBox)
{
TextBox textBox = new()
{
Text = eTextBox.Value,
TextWrapping = TextWrapping.Wrap,
VerticalAlignment = VerticalAlignment.Center,
HorizontalAlignment = HorizontalAlignment.Stretch
};
textBox.TextChanged += (_s, _e) =>
{
try
{
eTextBox.Value = textBox.Text;
}
catch (Exception ex)
{
DisplayException(ex.Message);
}
};
eTextBox.OnValueChanged += () =>
{
textBox.Dispatcher.Invoke(() =>
{
textBox.Text = eTextBox.Value;
});
};
_ = dockPanel.Children.Add(textBox);
}
else if (settingElement.Element is DesktopMagicPluginAPI.Inputs.IntegerUpDown eIntegerUpDown)
{
Xceed.Wpf.Toolkit.IntegerUpDown integerUpDown = new()
{
Value = eIntegerUpDown.Value,
Minimum = eIntegerUpDown.Minimum,
Maximum = eIntegerUpDown.Maximum,
VerticalAlignment = VerticalAlignment.Center,
HorizontalAlignment = HorizontalAlignment.Stretch
};
integerUpDown.ValueChanged += (_s, _e) =>
{
try
{
eIntegerUpDown.Value = integerUpDown.Value.GetValueOrDefault();
}
catch (Exception ex)
{
DisplayException(ex.Message);
}
};
eIntegerUpDown.OnValueChanged += () =>
{
integerUpDown.Dispatcher.Invoke(() =>
{
integerUpDown.Value = eIntegerUpDown.Value;
});
};
_ = dockPanel.Children.Add(integerUpDown);
}
else if (settingElement.Element is DesktopMagicPluginAPI.Inputs.Slider eSlider)
{
Slider slider = new()
{
Value = eSlider.Value,
Minimum = eSlider.Minimum,
Maximum = eSlider.Maximum,
TickFrequency = 1,
IsSnapToTickEnabled = true,
VerticalAlignment = VerticalAlignment.Center,
HorizontalAlignment = HorizontalAlignment.Stretch
};
slider.ValueChanged += (_s, _e) =>
{
try
{
eSlider.Value = slider.Value;
}
catch (Exception ex)
{
DisplayException(ex.Message);
}
};
eSlider.OnValueChanged += () =>
{
slider.Dispatcher.Invoke(() =>
{
slider.Value = eSlider.Value;
});
};
_ = dockPanel.Children.Add(slider);
}
else if (settingElement.Element is DesktopMagicPluginAPI.Inputs.ComboBox eComboBox)
{
ComboBox comboBox = new()
{
ItemsSource = eComboBox.Items,
IsEditable = false,
VerticalAlignment = VerticalAlignment.Center,
HorizontalAlignment = HorizontalAlignment.Stretch,
SelectedIndex = 0
};
comboBox.SelectionChanged += (_s, _e) =>
{
try
{
eComboBox.Value = comboBox.Text;
}
catch (Exception ex)
{
DisplayException(ex.Message);
}
};
eComboBox.OnValueChanged += () =>
{
comboBox.SelectedItem = eComboBox.Value;
};
_ = dockPanel.Children.Add(comboBox);
}
}
private void DisplayException(string message)
{
App.Logger.Log(message, "PluginInput");
_ = MessageBox.Show("File execution error:\n" + message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
int index = MainWindow.WindowNames.IndexOf(optionsComboBox.SelectedItem.ToString());
PluginWindow window = MainWindow.Windows[index];
window?.Exit();
}
}
}
@@ -0,0 +1,25 @@
using System.Globalization;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace DesktopMagic.Helpers
{
internal static class StringUtilities
{
public static Size MeasureString(string input, TextBlock element)
{
FormattedText formattedText = new FormattedText(
input,
CultureInfo.CurrentCulture,
FlowDirection.LeftToRight,
new Typeface(element.FontFamily, element.FontStyle, element.FontWeight, element.FontStretch),
element.FontSize,
Brushes.Black,
new NumberSubstitution(),
1);
return new Size(formattedText.Width, formattedText.Height);
}
}
}
@@ -541,7 +541,7 @@ namespace DesktopMagic
public static extern int GetSystemMetrics(int abc); public static extern int GetSystemMetrics(int abc);
[DllImport("user32.dll", EntryPoint = "GetWindowDC")] [DllImport("user32.dll", EntryPoint = "GetWindowDC")]
public static extern IntPtr GetWindowDC(Int32 ptr); public static extern IntPtr GetWindowDC(int ptr);
[DllImport("user32.dll")] [DllImport("user32.dll")]
public static extern bool IsWindowVisible(IntPtr hWnd); public static extern bool IsWindowVisible(IntPtr hWnd);
@@ -559,7 +559,7 @@ namespace DesktopMagic
public static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp); public static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp);
[DllImport("user32.dll", CharSet = CharSet.Auto)] [DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, int wParam, IntPtr lParam); public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, IntPtr lParam);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr SendMessageTimeout(IntPtr windowHandle, uint Msg, IntPtr wParam, IntPtr lParam, SendMessageTimeoutFlags flags, uint timeout, out IntPtr result); public static extern IntPtr SendMessageTimeout(IntPtr windowHandle, uint Msg, IntPtr wParam, IntPtr lParam, SendMessageTimeoutFlags flags, uint timeout, out IntPtr result);
@@ -590,7 +590,7 @@ namespace DesktopMagic
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, SetWindowPosFlags uFlags); public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, SetWindowPosFlags uFlags);
[DllImport("user32.dll", CharSet = CharSet.Auto)] [DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern Int32 SystemParametersInfo(UInt32 action, UInt32 uParam, string vParam, UInt32 winIni); public static extern int SystemParametersInfo(uint action, uint uParam, string vParam, uint winIni);
[StructLayout(LayoutKind.Sequential)] [StructLayout(LayoutKind.Sequential)]
public struct BbStruct //Blur Behind Structure public struct BbStruct //Blur Behind Structure
@@ -642,37 +642,37 @@ namespace DesktopMagic
public int X public int X
{ {
get { return Left; } get => Left;
set { Right -= (Left - value); Left = value; } set { Right -= (Left - value); Left = value; }
} }
public int Y public int Y
{ {
get { return Top; } get => Top;
set { Bottom -= (Top - value); Top = value; } set { Bottom -= (Top - value); Top = value; }
} }
public int Height public int Height
{ {
get { return Bottom - Top; } get => Bottom - Top;
set { Bottom = value + Top; } set => Bottom = value + Top;
} }
public int Width public int Width
{ {
get { return Right - Left; } get => Right - Left;
set { Right = value + Left; } set => Right = value + Left;
} }
public System.Drawing.Point Location public System.Drawing.Point Location
{ {
get { return new System.Drawing.Point(Left, Top); } get => new System.Drawing.Point(Left, Top);
set { X = value.X; Y = value.Y; } set { X = value.X; Y = value.Y; }
} }
public System.Drawing.Size Size public System.Drawing.Size Size
{ {
get { return new System.Drawing.Size(Width, Height); } get => new System.Drawing.Size(Width, Height);
set { Width = value.Width; Height = value.Height; } set { Width = value.Width; Height = value.Height; }
} }
@@ -703,10 +703,15 @@ namespace DesktopMagic
public override bool Equals(object obj) public override bool Equals(object obj)
{ {
if (obj is RECT) if (obj is RECT rECT)
return Equals((RECT)obj); {
else if (obj is System.Drawing.Rectangle) return Equals(rECT);
return Equals(new RECT((System.Drawing.Rectangle)obj)); }
else if (obj is System.Drawing.Rectangle rectangle)
{
return Equals(new RECT(rectangle));
}
return false; return false;
} }
@@ -29,8 +29,8 @@ namespace DesktopMagic
int cy, int cy,
uint uFlags); uint uFlags);
private const UInt32 SWP_NOSIZE1 = 0x0001; private const uint SWP_NOSIZE1 = 0x0001;
private const UInt32 SWP_NOMOVE1 = 0x0002; private const uint SWP_NOMOVE1 = 0x0002;
private static readonly IntPtr HWND_BOTTOM = new IntPtr(1); private static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
@@ -42,7 +42,7 @@ namespace DesktopMagic
public static void SendWpfWindowBack(Window window) public static void SendWpfWindowBack(Window window)
{ {
var hWnd = new WindowInteropHelper(window).Handle; IntPtr hWnd = new WindowInteropHelper(window).Handle;
SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE1 | SWP_NOMOVE1); SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE1 | SWP_NOMOVE1);
} }
@@ -62,12 +62,12 @@ namespace DesktopMagic
private static void IsLocked_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e) private static void IsLocked_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
{ {
var window = (Window)d; Window window = (Window)d;
var isHooked = d.GetValue(IsHookedProperty) != null; bool isHooked = d.GetValue(IsHookedProperty) != null;
if (!isHooked) if (!isHooked)
{ {
var hook = new WindowLockHook(window); WindowLockHook hook = new WindowLockHook(window);
d.SetValue(IsHookedProperty, hook); d.SetValue(IsHookedProperty, hook);
} }
} }
@@ -82,10 +82,9 @@ namespace DesktopMagic
public WindowLockHook(Window window) public WindowLockHook(Window window)
{ {
this.Window = window; Window = window;
var source = PresentationSource.FromVisual(window) as HwndSource; if (PresentationSource.FromVisual(window) is not HwndSource source)
if (source == null)
{ {
// If there is no hWnd, we need to wait until there is // If there is no hWnd, we need to wait until there is
window.SourceInitialized += Window_SourceInitialized; window.SourceInitialized += Window_SourceInitialized;
@@ -98,7 +97,7 @@ namespace DesktopMagic
private void Window_SourceInitialized(object sender, EventArgs e) private void Window_SourceInitialized(object sender, EventArgs e)
{ {
var source = (HwndSource)PresentationSource.FromVisual(Window); HwndSource source = (HwndSource)PresentationSource.FromVisual(Window);
source.AddHook(WndProc); source.AddHook(WndProc);
} }
@@ -106,7 +105,7 @@ namespace DesktopMagic
{ {
if (msg == WM_WINDOWPOSCHANGING && GetIsLocked(Window)) if (msg == WM_WINDOWPOSCHANGING && GetIsLocked(Window))
{ {
var wp = Marshal.PtrToStructure<WINDOWPOS>(lParam); WINDOWPOS wp = Marshal.PtrToStructure<WINDOWPOS>(lParam);
wp.flags |= SWP_NOMOVE | SWP_NOSIZE; wp.flags |= SWP_NOMOVE | SWP_NOSIZE;
Marshal.StructureToPtr(wp, lParam, false); Marshal.StructureToPtr(wp, lParam, false);
} }
+53 -27
View File
@@ -38,14 +38,15 @@
<CheckBox x:Name="TimeCb" Content="{DynamicResource time}" Click="CheckBox_Click" Style="{StaticResource MaterialDesignDarkCheckBox}" /> <CheckBox x:Name="TimeCb" Content="{DynamicResource time}" Click="CheckBox_Click" Style="{StaticResource MaterialDesignDarkCheckBox}" />
<CheckBox x:Name="DateCb" Content="{DynamicResource date}" Click="CheckBox_Click" Style="{StaticResource MaterialDesignDarkCheckBox}" /> <CheckBox x:Name="DateCb" Content="{DynamicResource date}" Click="CheckBox_Click" Style="{StaticResource MaterialDesignDarkCheckBox}" />
<CheckBox x:Name="CpuUsageCb" Content="{DynamicResource cpuUsage}" Click="CheckBox_Click" Style="{StaticResource MaterialDesignDarkCheckBox}" /> <CheckBox x:Name="CpuUsageCb" Content="{DynamicResource cpuUsage}" Click="CheckBox_Click" Style="{StaticResource MaterialDesignDarkCheckBox}" />
<CheckBox x:Name="CalendarCb" Content="{DynamicResource googleCalendar}" Click="CheckBox_Click" Style="{StaticResource MaterialDesignDarkCheckBox}" Visibility="Collapsed"/> <!--Currently disabled because it's not working--> <CheckBox x:Name="CalendarCb" Content="{DynamicResource googleCalendar}" Click="CheckBox_Click" Style="{StaticResource MaterialDesignDarkCheckBox}" Visibility="Collapsed"/>
<!--Currently disabled because it's not working-->
<CheckBox x:Name="MusicVisualizerCb" Content="{DynamicResource musicVisualizer}" HorizontalAlignment="Left" VerticalAlignment="Top" Click="CheckBox_Click" Style="{StaticResource MaterialDesignDarkCheckBox}" /> <CheckBox x:Name="MusicVisualizerCb" Content="{DynamicResource musicVisualizer}" HorizontalAlignment="Left" VerticalAlignment="Top" Click="CheckBox_Click" Style="{StaticResource MaterialDesignDarkCheckBox}" />
</StackPanel> </StackPanel>
</ScrollViewer> </ScrollViewer>
</DockPanel> </DockPanel>
<DockPanel Grid.Column="1" Margin="2.5,0,0,0"> <DockPanel Grid.Column="1" Margin="2.5,0,0,0">
<ComboBox x:Name="optionsComboBox" DockPanel.Dock="Top" Height="24" SelectedIndex="0" DisplayMemberPath="Item1" SelectionChanged="OptionsComboBox_SelectionChanged" Background="#FFECECEC" Padding="4" VerticalAlignment="Center"/> <ComboBox x:Name="optionsComboBox" DockPanel.Dock="Top" Height="24" SelectedIndex="0" SelectionChanged="OptionsComboBox_SelectionChanged" Background="#FFECECEC" Padding="4" VerticalAlignment="Center"/>
<ScrollViewer Background="#FFBBBBBB"> <ScrollViewer Background="#FFBBBBBB">
<Grid> <Grid>
<StackPanel x:Name="optionsPanel" Margin="3,3,3,0" HorizontalAlignment="Stretch" Visibility="Collapsed" > <StackPanel x:Name="optionsPanel" Margin="3,3,3,0" HorizontalAlignment="Stretch" Visibility="Collapsed" >
@@ -57,11 +58,11 @@
<Style TargetType="TextBlock" /> <Style TargetType="TextBlock" />
</materialDesign:TextFieldAssist.CharacterCounterStyle> </materialDesign:TextFieldAssist.CharacterCounterStyle>
</TextBox> </TextBox>
<ComboBox x:Name="spectrumPlugineComboBox" ItemsSource="{DynamicResource musicVisualizerOptionsComboboxItems}" HorizontalAlignment="Left" VerticalAlignment="Top" Width="120" SelectionChanged="SpectrumPlugineComboBox_SelectionChanged" /> <ComboBox x:Name="spectrumModeComboBox" ItemsSource="{DynamicResource musicVisualizerOptionsComboboxItems}" HorizontalAlignment="Left" VerticalAlignment="Top" Width="120" SelectionChanged="SpectrumModeComboBox_SelectionChanged" />
<CheckBox x:Name="mirrorPlugineCheckBox" Content="{DynamicResource mirrorPlugine}" Click="MirrorPlugineCheckBox_Click" Style="{StaticResource MaterialDesignDarkCheckBox}" /> <CheckBox x:Name="mirrorModeCheckBox" Content="{DynamicResource mirrorMode}" Click="MirrorModeCheckBox_Click" Style="{StaticResource MaterialDesignDarkCheckBox}" />
<CheckBox x:Name="linePlugineCheckBox" Content="{DynamicResource linePlugine}" Click="LinePlugineCheckBox_Click" Style="{StaticResource MaterialDesignDarkCheckBox}" /> <CheckBox x:Name="lineModeCheckBox" Content="{DynamicResource lineMode}" Click="LineModeCheckBox_Click" Style="{StaticResource MaterialDesignDarkCheckBox}" />
<Label Content="{DynamicResource amplifier}" HorizontalAlignment="Left" VerticalAlignment="Top" Padding="0,1" /> <Label Content="{DynamicResource amplifier}" HorizontalAlignment="Left" VerticalAlignment="Top" Padding="0,1" />
<Slider x:Name="amplifierLevelSlider" Margin="-2,0,10,0" HorizontalAlignment="Stretch" VerticalAlignment="Top" ValueChanged="AmplifierLevelSlider_ValueChanged" Maximum="50" Minimum="-50" SmallChange="1" LargeChange="5" Foreground="Gray" /> <Slider x:Name="amplifierLevelSlider" HorizontalAlignment="Stretch" VerticalAlignment="Top" ValueChanged="AmplifierLevelSlider_ValueChanged" Maximum="50" Minimum="-50" SmallChange="1" LargeChange="5" Foreground="Gray" />
<Label x:Name="amplifierLevelLabel" Content="Label" HorizontalAlignment="Left" VerticalAlignment="Top" Padding="0,1" /> <Label x:Name="amplifierLevelLabel" Content="Label" HorizontalAlignment="Left" VerticalAlignment="Top" Padding="0,1" />
</StackPanel> </StackPanel>
</Grid> </Grid>
@@ -73,34 +74,59 @@
<RowDefinition Height="*" /> <RowDefinition Height="*" />
<RowDefinition Height="110" /> <RowDefinition Height="110" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<StackPanel DockPanel.Dock="Top" Margin="{StaticResource DefaultMargin}"> <Grid.ColumnDefinitions>
<ComboBox x:Name="fontComboBox" HorizontalAlignment="Left" VerticalAlignment="Top" Width="181" SelectionChanged="FontComboBox_SelectionChanged" Margin="0,0,0,5" /> <ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid Grid.Column="0" Margin="{StaticResource DefaultMargin}" HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<DockPanel> <TextBlock Text="Display Font: " Grid.Column="0" Grid.Row="0" VerticalAlignment="Center"></TextBlock>
<Label Content="R:" Width="20" /> <ComboBox x:Name="fontComboBox" Grid.Column="1" Grid.Row="0" HorizontalAlignment="Stretch" VerticalAlignment="Top" SelectionChanged="FontComboBox_SelectionChanged" Margin="0,0,0,5" />
<Slider x:Name="redSlider" Maximum="255" ValueChanged="ColorSliders_ValueChanged" TickFrequency="1" IsSnapToTickEnabled="True" Background="#00030000" />
</DockPanel>
<DockPanel>
<Label Content="G:" Width="20" />
<Slider x:Name="greenSlider" Maximum="255" ValueChanged="ColorSliders_ValueChanged" TickFrequency="1" IsSnapToTickEnabled="True" Background="#0000FF00" />
</DockPanel>
<DockPanel>
<Label Content="B:" Width="20" />
<Slider x:Name="blueSlider" Maximum="255" ValueChanged="ColorSliders_ValueChanged" TickFrequency="1" IsSnapToTickEnabled="True" Background="#000000FF" />
</DockPanel>
<StackPanel Orientation="Horizontal"> <TextBlock Text="Corner Radius: " Grid.Column="0" Grid.Row="1" VerticalAlignment="Center"></TextBlock>
<Border CornerRadius="1" BorderThickness="1.5" BorderBrush="Gray" Height="23" Width="23" Margin="0,0,5,0"> <TextBox x:Name="cornerRadiusTextBox" Grid.Column="1" Grid.Row="1" TextChanged="CornerRadiusTextBox_TextChanged" materialDesign:HintAssist.Hint="Enter a number">
<Rectangle x:Name="colorRechtangle" Fill="White" />
</Border>
<TextBox x:Name="colorHexTextBox" MaxLength="7" CharacterCasing="Upper" Height="23" TextWrapping="Wrap" Text="colorHexTextBox" Width="120" TextChanged="ColorHexTextBox_TextChanged" RenderTransformOrigin="0.5,0.5" VerticalContentAlignment="Center">
<materialDesign:TextFieldAssist.CharacterCounterStyle> <materialDesign:TextFieldAssist.CharacterCounterStyle>
<Style TargetType="TextBlock" /> <Style TargetType="TextBlock" />
</materialDesign:TextFieldAssist.CharacterCounterStyle> </materialDesign:TextFieldAssist.CharacterCounterStyle>
</TextBox> </TextBox>
<TextBlock Text="Margin: " Grid.Column="0" Grid.Row="3" VerticalAlignment="Center"></TextBlock>
<TextBox x:Name="marginTextBox" Grid.Column="1" Grid.Row="3" TextChanged="MarginTextBox_TextChanged" materialDesign:HintAssist.Hint="Enter a number">
<materialDesign:TextFieldAssist.CharacterCounterStyle>
<Style TargetType="TextBlock" />
</materialDesign:TextFieldAssist.CharacterCounterStyle>
</TextBox>
</Grid>
<StackPanel Grid.Column="1" Margin="{StaticResource DefaultMargin}" HorizontalAlignment="Stretch">
<DockPanel Margin="0,0,0,5">
<Border CornerRadius="1" BorderThickness="1.5" BorderBrush="Gray" Height="23" Width="23" Margin="0,0,5,0">
<Rectangle x:Name="primaryColorRechtangle" Fill="White" />
</Border>
<Button Content="Change Primary Color" Height="23" FontSize="12" FontWeight="Regular" Click="ChangePrimaryColorButton_Click"/>
</DockPanel>
<DockPanel Margin="0,0,0,5">
<Border CornerRadius="1" BorderThickness="1.5" BorderBrush="Gray" Height="23" Width="23" Margin="0,0,5,0">
<Rectangle x:Name="secondaryColorRechtangle" Fill="White" />
</Border>
<Button Content="Change Secondary Color" Height="23" FontSize="12" FontWeight="Regular" Click="ChangeSecondaryColorButton_Click" />
</DockPanel>
<DockPanel>
<Border CornerRadius="1" BorderThickness="1.5" BorderBrush="Gray" Height="23" Width="23" Margin="0,0,5,0">
<Rectangle x:Name="backgroundColorRechtangle" Fill="White" />
</Border>
<Button Content="Change Background Color" Height="23" FontSize="12" FontWeight="Regular" Click="ChangeBackgroundColorButton_Click" />
</DockPanel>
</StackPanel> </StackPanel>
</StackPanel> <Grid Grid.Row="1" Grid.ColumnSpan="2" VerticalAlignment="Bottom">
<Grid Grid.Row="1" VerticalAlignment="Bottom">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition /> <ColumnDefinition />
<ColumnDefinition /> <ColumnDefinition />
+226 -371
View File
@@ -1,8 +1,16 @@
using Microsoft.Win32; using DesktopMagic.BuiltInWindowElements;
using DesktopMagic.Dialogs;
using DesktopMagic.Helpers;
using DesktopMagic.Plugins;
using Microsoft.Win32;
using Stone_Red_Utilities.Logging;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Globalization;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
@@ -14,39 +22,33 @@ using System.Windows.Media;
namespace DesktopMagic namespace DesktopMagic
{ {
/// <summary>
/// Interaktionslogik für MainWindow.xaml
/// </summary>
public partial class MainWindow : Window public partial class MainWindow : Window
{ {
#region Global settings #region Global settings
public static string GlobalFont { get; protected set; } = "Segoe UI"; internal static Theme Theme = new Theme();
public static Brush GlobalColor { get; protected set; } = Brushes.White; public static bool EditMode { get; private set; } = false;
public static System.Drawing.Brush GlobalSystemColor { get; protected set; } = System.Drawing.Brushes.White;
public static bool EditMode { get; protected set; } = false;
#endregion Global settings #endregion Global settings
#region Music Visualizer Settings #region Music Visualizer Settings
public static int SpectrumMode { get; protected set; } = 0; public static int SpectrumMode { get; private set; } = 0;
public static int AmplifierLevel { get; protected set; } = 0; public static int AmplifierLevel { get; private set; } = 0;
public static bool MirrorMode { get; protected set; } = false; public static bool MirrorMode { get; private set; } = false;
public static bool LineMode { get; protected set; } = false; public static bool LineMode { get; private set; } = false;
public static System.Drawing.Brush MusicVisualzerColor { get; protected set; } public static System.Drawing.Color? MusicVisualzerColor { get; private set; }
#endregion Music Visualizer Settings #endregion Music Visualizer Settings
#region Plugins settings #region Plugins settings
internal static Dictionary<string, List<SettingElement>> PluginsSettings { get; set; } = new Dictionary<string, List<SettingElement>>(); internal static Dictionary<string, List<SettingElement>> PluginsSettings { get; } = new Dictionary<string, List<SettingElement>>();
#endregion Plugins settings #endregion Plugins settings
public static List<Window> Windows { get; protected set; } = new List<Window>(); public static List<PluginWindow> Windows { get; } = new List<PluginWindow>();
public static List<string> WindowNames { get; protected set; } = new List<string>(); public static List<string> WindowNames { get; } = new List<string>();
private readonly RegistryKey key; private readonly RegistryKey key;
private readonly System.Windows.Forms.NotifyIcon notifyIcon = new(); private readonly System.Windows.Forms.NotifyIcon notifyIcon = new();
@@ -65,12 +67,16 @@ namespace DesktopMagic
notifyIcon.Visible = true; notifyIcon.Visible = true;
notifyIcon.Text = App.AppName; notifyIcon.Text = App.AppName;
notifyIcon.Icon = new System.Drawing.Icon(iconStream); notifyIcon.Icon = new System.Drawing.Icon(iconStream);
notifyIcon.ContextMenuStrip = new System.Windows.Forms.ContextMenuStrip();
InitializeComponent(); InitializeComponent();
SetLanguageDictionary(); SetLanguageDictionary();
#if DEBUG
Title = $"{App.AppName} - Dev {Assembly.GetExecutingAssembly().GetName().Version}";
#else
Title = $"{App.AppName} - {Assembly.GetExecutingAssembly().GetName().Version}"; Title = $"{App.AppName} - {Assembly.GetExecutingAssembly().GetName().Version}";
#endif
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -78,18 +84,12 @@ namespace DesktopMagic
} }
} }
#region load #region Load
private void Window_Loaded(object sender, RoutedEventArgs e) private void Window_Loaded(object sender, RoutedEventArgs e)
{ {
try try
{ {
if (!Directory.Exists(App.ApplicationDataPath))
{
_ = Directory.CreateDirectory(App.ApplicationDataPath);
}
App.Logger.Log("Created ApplicationData Folder", "Main");
if (!Directory.Exists(App.ApplicationDataPath + "\\Plugins")) if (!Directory.Exists(App.ApplicationDataPath + "\\Plugins"))
{ {
_ = Directory.CreateDirectory(App.ApplicationDataPath + "\\Plugins"); _ = Directory.CreateDirectory(App.ApplicationDataPath + "\\Plugins");
@@ -102,8 +102,6 @@ namespace DesktopMagic
} }
App.Logger.Log("Created layouts.save file", "Main"); App.Logger.Log("Created layouts.save file", "Main");
_ = optionsComboBox.Items.Add(new Tuple<string, int>((string)FindResource("musicVisualizer"), 0));
//Write To Log File and Load Elements //Write To Log File and Load Elements
App.Logger.Log("Loading Plugin names", "Main"); App.Logger.Log("Loading Plugin names", "Main");
@@ -118,7 +116,8 @@ namespace DesktopMagic
} }
catch (Exception ex) catch (Exception ex)
{ {
MessageBox.Show(ex.ToString()); App.Logger.Log(ex.Message, "Main", LogSeverity.Error);
_ = MessageBox.Show(ex.ToString());
} }
} }
@@ -134,7 +133,10 @@ namespace DesktopMagic
_ = Directory.CreateDirectory(PluginsPath + "\\" + PluginName); _ = Directory.CreateDirectory(PluginsPath + "\\" + PluginName);
File.Move(fileName, $"{PluginsPath}\\{PluginName}\\{PluginName}.dll"); File.Move(fileName, $"{PluginsPath}\\{PluginName}\\{PluginName}.dll");
} }
catch { } catch (Exception ex)
{
App.Logger.Log(ex.Message, "Main", LogSeverity.Error);
}
} }
foreach (string directory in Directory.GetDirectories(PluginsPath)) foreach (string directory in Directory.GetDirectories(PluginsPath))
@@ -160,17 +162,17 @@ namespace DesktopMagic
checkBox.Style = (Style)FindResource("MaterialDesignDarkCheckBox"); checkBox.Style = (Style)FindResource("MaterialDesignDarkCheckBox");
checkBox.Click += CheckBox_Click; checkBox.Click += CheckBox_Click;
bool exsists = false; bool exists = false;
foreach (UIElement item in stackPanel.Children) foreach (UIElement item in stackPanel.Children)
{ {
if (((CheckBox)item).Name == "_PluginCb_" + clearPluginName) if (((CheckBox)item).Name == "_PluginCb_" + clearPluginName)
{ {
exsists = true; exists = true;
break; break;
} }
} }
if (!exsists) if (!exists)
{ {
_ = stackPanel.Children.Add(checkBox); _ = stackPanel.Children.Add(checkBox);
} }
@@ -179,7 +181,7 @@ namespace DesktopMagic
} }
} }
#endregion load #endregion Load
#region Windows #region Windows
@@ -192,83 +194,72 @@ namespace DesktopMagic
private void CheckBox_Click(object sender, RoutedEventArgs e) private void CheckBox_Click(object sender, RoutedEventArgs e)
{ {
CheckBox checkBox = (CheckBox)sender; CheckBox checkBox = (CheckBox)sender;
Window window; PluginWindow window = null;
blockWindowsClosing = false; blockWindowsClosing = false;
switch (checkBox.Name) switch (checkBox.Name)
{ {
case "TimeCb": case "TimeCb":
window = new TimeWindow(); window = new PluginWindow(new TimePlugin(), checkBox.Content.ToString());
break; break;
case "DateCb": case "DateCb":
window = new DateWindow(); window = new PluginWindow(new DatePlugin(), checkBox.Content.ToString());
break; break;
case "CpuUsageCb": case "CpuUsageCb":
window = new CpuUsageWindow(); //window = new PluginWindow();
break;
case "CalendarCb":
window = new CalendarWindow();
break; break;
case "MusicVisualizerCb": case "MusicVisualizerCb":
window = new MusicVisualizerWindow(); window = new PluginWindow(new MusicVisualizerPlugin(), checkBox.Content.ToString());
break; break;
default: default:
if (checkBox.Name.Contains("_PluginCb_")) if (!checkBox.Name.Contains("_PluginCb_"))
{
window = new PluginWindow(checkBox.Content.ToString())
{
Title = checkBox.Content.ToString()
};
break;
}
else
{ {
return; return;
} }
window = new PluginWindow(checkBox.Content.ToString());
break;
} }
if (!WindowNames.Contains(window.Title)) if (window is null)
{
return;
}
window.Title = checkBox.Content.ToString();
if (!WindowNames.Contains(window.Title) && checkBox.IsChecked == true)
{ {
_ = Task.Run(() => _ = Task.Run(() =>
{ {
Dispatcher.Invoke(() => Dispatcher.Invoke(() =>
{
if (window is PluginWindow pluginWindow)
{ {
Action onPluginLoaded = null; Action onPluginLoaded = null;
onPluginLoaded = () => onPluginLoaded = () =>
{ {
Dispatcher.Invoke(() => Dispatcher.Invoke(() =>
{ {
if (!optionsComboBox.Items.Contains(new Tuple<string, int>(checkBox.Content.ToString(), 0))) if (!optionsComboBox.Items.Contains(checkBox.Content.ToString()))
{ {
_ = optionsComboBox.Items.Add(new Tuple<string, int>(checkBox.Content.ToString(), 0)); _ = optionsComboBox.Items.Add(checkBox.Content.ToString());
} }
optionsComboBox.SelectedIndex = -1; optionsComboBox.SelectedIndex = -1;
optionsComboBox.SelectedIndex = optionsComboBox.Items.IndexOf(new Tuple<string, int>(checkBox.Content.ToString(), 0)); optionsComboBox.SelectedIndex = optionsComboBox.Items.IndexOf(checkBox.Content.ToString());
pluginWindow.PluginLoaded -= onPluginLoaded; window.PluginLoaded -= onPluginLoaded;
}); });
}; };
pluginWindow.OnExit += () => window.OnExit += () =>
{ {
checkBox.IsChecked = false; checkBox.IsChecked = false;
CheckBox_Click(checkBox, null); CheckBox_Click(checkBox, null);
}; };
pluginWindow.PluginLoaded += onPluginLoaded; window.PluginLoaded += onPluginLoaded;
}
else if (window is MusicVisualizerWindow musicVisualizerWindow)
{
optionsComboBox.SelectedIndex = optionsComboBox.Items.IndexOf(new Tuple<string, int>(checkBox.Content.ToString(), 0));
}
window.ShowInTaskbar = false; window.ShowInTaskbar = false;
window.Show(); window.Show();
window.ContentRendered += PluginWindow_ContentRendered; window.ContentRendered += DisplayWindow_ContentRendered;
window.Closing += DisplayWindow_Closing; window.Closing += DisplayWindow_Closing;
Windows.Add(window); Windows.Add(window);
WindowNames.Add(window.Title); WindowNames.Add(window.Title);
@@ -279,17 +270,25 @@ namespace DesktopMagic
{ {
int index = WindowNames.IndexOf(window.Title); int index = WindowNames.IndexOf(window.Title);
if (index >= 0)
{
//Not sure how to handle this
try
{
Windows[index].Close(); Windows[index].Close();
Windows.RemoveAt(index); Windows.RemoveAt(index);
WindowNames.RemoveAt(index); WindowNames.RemoveAt(index);
window.Close(); }
catch { }
}
} }
key.SetValue(checkBox.Name, checkBox.IsChecked.ToString()); key.SetValue(checkBox.Name, checkBox.IsChecked.ToString());
blockWindowsClosing = true; blockWindowsClosing = true;
SaveLayout(); SaveLayout();
} }
private void PluginWindow_ContentRendered(object sender, EventArgs e) private void DisplayWindow_ContentRendered(object sender, EventArgs e)
{ {
WindowPos.SendWpfWindowBack(sender as Window); WindowPos.SendWpfWindowBack(sender as Window);
WindowPos.SendWpfWindowBack(sender as Window); WindowPos.SendWpfWindowBack(sender as Window);
@@ -335,7 +334,7 @@ namespace DesktopMagic
#endregion Windows #endregion Windows
#region options #region Options
private void AmplifierLevelSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) private void AmplifierLevelSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{ {
@@ -345,25 +344,23 @@ namespace DesktopMagic
SaveLayout(); SaveLayout();
} }
private void MirrorPlugineCheckBox_Click(object sender, RoutedEventArgs e) private void MirrorModeCheckBox_Click(object sender, RoutedEventArgs e)
{ {
MirrorMode = (bool)mirrorPlugineCheckBox.IsChecked; MirrorMode = (bool)mirrorModeCheckBox.IsChecked;
key.SetValue("MirrorPlugine", mirrorPlugineCheckBox.IsChecked.ToString()); key.SetValue("MirrorMode", mirrorModeCheckBox.IsChecked.ToString());
SaveLayout(); SaveLayout();
} }
private void LinePlugineCheckBox_Click(object sender, RoutedEventArgs e) private void LineModeCheckBox_Click(object sender, RoutedEventArgs e)
{ {
LineMode = (bool)linePlugineCheckBox.IsChecked; LineMode = (bool)lineModeCheckBox.IsChecked;
key.SetValue("LinePlugine", linePlugineCheckBox.IsChecked.ToString()); key.SetValue("LineMode", lineModeCheckBox.IsChecked.ToString());
SaveLayout(); SaveLayout();
} }
private void MusicVisualizerColorTextBox_TextChanged(object sender, TextChangedEventArgs e) private void MusicVisualizerColorTextBox_TextChanged(object sender, TextChangedEventArgs e)
{ {
if (!string.IsNullOrWhiteSpace(musicVisualizerColorTextBox.Text) && musicVisualizerColorTextBox.Text != "Default") if (!string.IsNullOrWhiteSpace(musicVisualizerColorTextBox.Text) && musicVisualizerColorTextBox.Text != "Default")
{
try
{ {
if (musicVisualizerColorTextBox.Text.Length > 0) if (musicVisualizerColorTextBox.Text.Length > 0)
{ {
@@ -391,18 +388,16 @@ namespace DesktopMagic
} }
string hex = musicVisualizerColorTextBox.Text; string hex = musicVisualizerColorTextBox.Text;
hex = hex.Replace("#", "");
System.Drawing.Color systemColor = System.Drawing.Color.FromArgb((byte)int.Parse(hex.Substring(0, 2), System.Globalization.NumberStyles.HexNumber), (byte)int.Parse(hex.Substring(2, 2), System.Globalization.NumberStyles.HexNumber), (byte)int.Parse(hex.Substring(4, 2), System.Globalization.NumberStyles.HexNumber)); if (MultiColorConverter.TryConvertToSystemColor(hex, out System.Drawing.Color systemColor))
System.Drawing.Brush systemBrush = new System.Drawing.SolidBrush(systemColor); {
MusicVisualzerColor = systemColor;
MusicVisualzerColor = systemBrush;
musicVisualizerColorTextBox.Foreground = Brushes.Black; musicVisualizerColorTextBox.Foreground = Brushes.Black;
key.SetValue("MusicVisualizerColor", musicVisualizerColorTextBox.Text); key.SetValue("MusicVisualizerColor", musicVisualizerColorTextBox.Text);
SaveLayout(); SaveLayout();
} }
catch else
{ {
musicVisualizerColorTextBox.Foreground = Brushes.Red; musicVisualizerColorTextBox.Foreground = Brushes.Red;
} }
@@ -417,17 +412,17 @@ namespace DesktopMagic
private void FontComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) private void FontComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{ {
GlobalFont = fontComboBox.SelectedValue.ToString().Replace("System.Windows.Controls.ComboBoxItem: ", ""); Theme.Font = fontComboBox.SelectedValue.ToString().Replace("System.Windows.Controls.ComboBoxItem: ", "");
key.SetValue("Font", GlobalFont); key.SetValue("Font", Theme.Font);
SaveLayout(); SaveLayout();
} }
private void SpectrumPlugineComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) private void SpectrumModeComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{ {
SpectrumMode = spectrumPlugineComboBox.SelectedIndex; SpectrumMode = spectrumModeComboBox.SelectedIndex;
key.SetValue("SpectrumPlugine", spectrumPlugineComboBox.SelectedIndex); key.SetValue("SpectrumMode", spectrumModeComboBox.SelectedIndex);
mirrorPlugineCheckBox.IsEnabled = spectrumPlugineComboBox.SelectedIndex != 1; mirrorModeCheckBox.IsEnabled = spectrumModeComboBox.SelectedIndex != 1;
SaveLayout(); SaveLayout();
} }
@@ -448,222 +443,38 @@ namespace DesktopMagic
optionsPanel.Children.Clear(); optionsPanel.Children.Clear();
optionsPanel.UpdateLayout(); optionsPanel.UpdateLayout();
bool succ = PluginsSettings.TryGetValue(((Tuple<string, int>)optionsComboBox.SelectedItem).Item1.ToString(), out List<SettingElement> settingElements); bool success = PluginsSettings.TryGetValue(optionsComboBox.SelectedItem.ToString(), out List<SettingElement> settingElements);
if (!succ || settingElements?.Count == 0) if (!success || settingElements?.Count == 0)
{ {
_ = optionsPanel.Children.Add(new TextBlock() { Text = (string)FindResource("noOptions") }); _ = optionsPanel.Children.Add(new TextBlock() { Text = (string)FindResource("noOptions") });
return; return;
} }
SettingElementGenerator settingElementGenerator = new SettingElementGenerator(optionsComboBox);
foreach (SettingElement settingElement in settingElements) foreach (SettingElement settingElement in settingElements)
{ {
DockPanel stackPanel = new() DockPanel dockPanel = new()
{ {
LastChildFill = true, LastChildFill = true,
HorizontalAlignment = HorizontalAlignment.Stretch HorizontalAlignment = HorizontalAlignment.Stretch
}; };
_ = optionsPanel.Children.Add(stackPanel); _ = optionsPanel.Children.Add(dockPanel);
TextBlock label = new() TextBlock textBlock = new()
{ {
Text = settingElement.Name, Text = settingElement.Name,
Padding = new Thickness(0, 0, 3, 0), Padding = new Thickness(0, 0, 3, 0),
VerticalAlignment = VerticalAlignment.Center VerticalAlignment = VerticalAlignment.Center
}; };
_ = stackPanel.Children.Add(label); _ = dockPanel.Children.Add(textBlock);
stackPanel.UpdateLayout(); settingElementGenerator.Generate(settingElement, dockPanel, textBlock);
label.UpdateLayout();
if (settingElement.Element is DesktopMagicPluginAPI.Inputs.Label eLabel)
{
label.Text = eLabel.Value;
label.Margin = new Thickness(0, 5, 3, 0);
label.HorizontalAlignment = HorizontalAlignment.Stretch;
label.TextWrapping = TextWrapping.WrapWithOverflow;
if (eLabel.Bold)
{
label.FontWeight = FontWeights.Bold;
}
eLabel.OnValueChanged += () =>
{
Dispatcher.Invoke(() =>
{
label.Text = eLabel.Value;
});
};
}
else if (settingElement.Element is DesktopMagicPluginAPI.Inputs.Button eButton)
{
Button button = new()
{
Content = eButton.Value,
FontSize = 10,
Height = 20,
Margin = new Thickness(0, 10, 0, 10),
Padding = new Thickness(0),
VerticalAlignment = VerticalAlignment.Center,
HorizontalAlignment = HorizontalAlignment.Stretch
};
button.Click += (_s, _e) =>
{
try
{
eButton.Click();
}
catch (Exception ex)
{
DisplayException(ex.Message);
}
};
eButton.OnValueChanged += () =>
{
Dispatcher.Invoke(() =>
{
button.Content = eButton.Value;
});
};
_ = stackPanel.Children.Add(button);
}
else if (settingElement.Element is DesktopMagicPluginAPI.Inputs.CheckBox eCheckBox)
{
CheckBox checkBox = new()
{
IsChecked = eCheckBox.Value,
Style = (Style)FindResource("MaterialDesignDarkCheckBox"),
VerticalAlignment = VerticalAlignment.Center,
HorizontalAlignment = HorizontalAlignment.Stretch
};
checkBox.Click += (_s, _e) =>
{
try
{
eCheckBox.Value = checkBox.IsChecked.GetValueOrDefault();
}
catch (Exception ex)
{
DisplayException(ex.Message);
}
};
eCheckBox.OnValueChanged += () =>
{
Dispatcher.Invoke(() =>
{
checkBox.IsChecked = eCheckBox.Value;
});
};
_ = stackPanel.Children.Add(checkBox);
}
else if (settingElement.Element is DesktopMagicPluginAPI.Inputs.TextBox eTextBox)
{
TextBox textBox = new()
{
Text = eTextBox.Value,
TextWrapping = TextWrapping.Wrap,
VerticalAlignment = VerticalAlignment.Center,
HorizontalAlignment = HorizontalAlignment.Stretch
};
textBox.TextChanged += (_s, _e) =>
{
try
{
eTextBox.Value = textBox.Text;
}
catch (Exception ex)
{
DisplayException(ex.Message);
}
};
eTextBox.OnValueChanged += () =>
{
Dispatcher.Invoke(() =>
{
textBox.Text = eTextBox.Value;
});
};
_ = stackPanel.Children.Add(textBox);
}
else if (settingElement.Element is DesktopMagicPluginAPI.Inputs.IntegerUpDown eIntegerUpDown)
{
Xceed.Wpf.Toolkit.IntegerUpDown integerUpDown = new()
{
Value = eIntegerUpDown.Value,
Minimum = eIntegerUpDown.Minimum,
Maximum = eIntegerUpDown.Maximum,
VerticalAlignment = VerticalAlignment.Center,
HorizontalAlignment = HorizontalAlignment.Stretch
};
integerUpDown.ValueChanged += (_s, _e) =>
{
try
{
eIntegerUpDown.Value = integerUpDown.Value.GetValueOrDefault();
}
catch (Exception ex)
{
DisplayException(ex.Message);
}
};
eIntegerUpDown.OnValueChanged += () =>
{
Dispatcher.Invoke(() =>
{
integerUpDown.Value = eIntegerUpDown.Value;
});
};
_ = stackPanel.Children.Add(integerUpDown);
}
else if (settingElement.Element is DesktopMagicPluginAPI.Inputs.Slider eSlider)
{
Slider slider = new()
{
Value = eSlider.Value,
Minimum = eSlider.Minimum,
Maximum = eSlider.Maximum,
TickFrequency = 1,
IsSnapToTickEnabled = true,
VerticalAlignment = VerticalAlignment.Center,
HorizontalAlignment = HorizontalAlignment.Stretch
};
slider.ValueChanged += (_s, _e) =>
{
try
{
eSlider.Value = slider.Value;
}
catch (Exception ex)
{
DisplayException(ex.Message);
}
};
eSlider.OnValueChanged += () =>
{
Dispatcher.Invoke(() =>
{
slider.Value = eSlider.Value;
});
};
_ = stackPanel.Children.Add(slider);
}
} }
} }
} }
private void DisplayException(string message) #endregion Options
{
App.Logger.Log(message, "PluginInput");
_ = MessageBox.Show("File execution error:\n" + message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
int index = WindowNames.IndexOf(((Tuple<string, int>)optionsComboBox.SelectedItem).Item1.ToString());
PluginWindow window = Windows[index] as PluginWindow;
window?.Exit();
}
#endregion options
private void TextBlock_Loaded(object sender, RoutedEventArgs e) private void TextBlock_Loaded(object sender, RoutedEventArgs e)
{ {
@@ -677,7 +488,7 @@ namespace DesktopMagic
}; };
_ = fontComboBox.Items.Add(comboBoxItem); _ = fontComboBox.Items.Add(comboBoxItem);
if (ff.ToString() == GlobalFont) if (ff.ToString() == Theme.Font)
{ {
fontComboBox.SelectedIndex = index; fontComboBox.SelectedIndex = index;
} }
@@ -689,70 +500,79 @@ namespace DesktopMagic
} }
} }
#region color private void ChangePrimaryColorButton_Click(object sender, RoutedEventArgs e)
{
ColorDialog colorDialog = new ColorDialog("Set Primary Color", Theme.PrimaryColor);
if (colorDialog.ShowDialog() == true)
{
Theme.PrimaryBrush = colorDialog.ResultBrush;
Theme.PrimaryColor = colorDialog.ResultColor;
primaryColorRechtangle.Fill = colorDialog.ResultBrush;
private void ColorSliders_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) key.SetValue("PrimaryColor", MultiColorConverter.ConvertToHex(Theme.PrimaryColor));
{
colorHexTextBox.Text = "#" + ((int)redSlider.Value).ToString("X2") + ((int)greenSlider.Value).ToString("X2") + ((int)blueSlider.Value).ToString("X2");
colorHexTextBox.Select(colorHexTextBox.Text.Length, 0);
}
private void ColorHexTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
try
{
if (colorHexTextBox.Text.Length > 0)
{
if (colorHexTextBox.Text.ToCharArray()[0] != '#')
{
colorHexTextBox.Text = "#" + colorHexTextBox.Text.Replace("#", "");
}
}
else
{
colorHexTextBox.Text = "#";
colorHexTextBox.Select(colorHexTextBox.Text.Length, 0);
}
if (colorHexTextBox.SelectionStart == 0)
{
if (colorHexTextBox.Text.Length <= 2)
{
colorHexTextBox.Select(colorHexTextBox.Text.Length, 0);
}
else
{
colorHexTextBox.Select(1, 0);
}
}
string hex = colorHexTextBox.Text;
hex = hex.Replace("#", "");
Color color = Color.FromRgb((byte)int.Parse(hex.Substring(0, 2), System.Globalization.NumberStyles.HexNumber), (byte)int.Parse(hex.Substring(2, 2), System.Globalization.NumberStyles.HexNumber), (byte)int.Parse(hex.Substring(4, 2), System.Globalization.NumberStyles.HexNumber));
System.Drawing.Color systemColor = System.Drawing.Color.FromArgb((byte)int.Parse(hex.Substring(0, 2), System.Globalization.NumberStyles.HexNumber), (byte)int.Parse(hex.Substring(2, 2), System.Globalization.NumberStyles.HexNumber), (byte)int.Parse(hex.Substring(4, 2), System.Globalization.NumberStyles.HexNumber));
redSlider.Value = color.R;
greenSlider.Value = color.G;
blueSlider.Value = color.B;
Brush brush = new SolidColorBrush(color);
System.Drawing.Brush systemBrush = new System.Drawing.SolidBrush(systemColor);
GlobalColor = brush;
GlobalSystemColor = systemBrush;
colorRechtangle.Fill = brush;
colorHexTextBox.Foreground = Brushes.Black;
key.SetValue("Color", colorHexTextBox.Text);
SaveLayout(); SaveLayout();
} }
catch }
private void ChangeSecondaryColorButton_Click(object sender, RoutedEventArgs e)
{ {
colorHexTextBox.Foreground = Brushes.Red; ColorDialog colorDialog = new ColorDialog("Set Secondary Color", Theme.SecondaryColor);
if (colorDialog.ShowDialog() == true)
{
Theme.SecondaryBrush = colorDialog.ResultBrush;
Theme.SecondaryColor = colorDialog.ResultColor;
secondaryColorRechtangle.Fill = colorDialog.ResultBrush;
key.SetValue("SecondaryColor", MultiColorConverter.ConvertToHex(Theme.SecondaryColor));
SaveLayout();
} }
} }
#endregion color private void ChangeBackgroundColorButton_Click(object sender, RoutedEventArgs e)
{
ColorDialog colorDialog = new ColorDialog("Set Background Color", Theme.BackgroundColor);
if (colorDialog.ShowDialog() == true)
{
Theme.BackgroundBrush = colorDialog.ResultBrush;
Theme.BackgroundColor = colorDialog.ResultColor;
backgroundColorRechtangle.Fill = colorDialog.ResultBrush;
key.SetValue("BackgroundColor", MultiColorConverter.ConvertToHex(Theme.BackgroundColor));
SaveLayout();
}
}
private void CornerRadiusTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
bool sucess = int.TryParse(cornerRadiusTextBox.Text, out int cornerRadius);
if (sucess)
{
cornerRadiusTextBox.Foreground = Brushes.Black;
Theme.CornerRadius = cornerRadius;
key.SetValue("CornerRadius", cornerRadius);
SaveLayout();
}
else
{
cornerRadiusTextBox.Foreground = Brushes.Red;
}
}
private void MarginTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
bool sucess = int.TryParse(marginTextBox.Text, out int margin);
if (sucess)
{
marginTextBox.Foreground = Brushes.Black;
Theme.Margin = margin;
key.SetValue("Margin", margin);
SaveLayout();
}
else
{
marginTextBox.Foreground = Brushes.Red;
}
}
#region Layout #region Layout
@@ -782,7 +602,7 @@ namespace DesktopMagic
for (int i = 0; i < fontComboBox.Items.Count; i++) for (int i = 0; i < fontComboBox.Items.Count; i++)
{ {
ComboBoxItem comboBoxItem = (ComboBoxItem)fontComboBox.Items[i]; ComboBoxItem comboBoxItem = (ComboBoxItem)fontComboBox.Items[i];
if (comboBoxItem.FontFamily.ToString() == GlobalFont) if (comboBoxItem.FontFamily.ToString() == Theme.Font)
{ {
fontComboBox.SelectedIndex = i; fontComboBox.SelectedIndex = i;
} }
@@ -827,6 +647,11 @@ namespace DesktopMagic
private void SaveLayout() private void SaveLayout()
{ {
if (!loaded)
{
return;
}
_ = Task.Run(() => _ = Task.Run(() =>
{ {
lock (App.ApplicationDataPath) lock (App.ApplicationDataPath)
@@ -860,25 +685,52 @@ namespace DesktopMagic
string name = line[(line.LastIndexOf(";", StringComparison.InvariantCulture) + 1)..]; string name = line[(line.LastIndexOf(";", StringComparison.InvariantCulture) + 1)..];
_ = layoutsComboBox.Items.Add(name); _ = layoutsComboBox.Items.Add(name);
} }
layoutsComboBox.SelectedIndex = int.Parse(key.GetValue("SelectedLayout", "0").ToString()); layoutsComboBox.SelectedIndex = int.Parse(key.GetValue("SelectedLayout", "0").ToString(), CultureInfo.InvariantCulture);
} }
private void LoadLayout(bool minimize = true) private void LoadLayout(bool minimize = true)
{ {
GlobalFont = key.GetValue("Font", "Segoe UI").ToString(); Theme.Font = key.GetValue("Font", "Segoe UI").ToString();
spectrumPlugineComboBox.SelectedIndex = int.Parse(key.GetValue("SpectrumPlugine", "0").ToString()); spectrumModeComboBox.SelectedIndex = int.Parse(key.GetValue("SpectrumMode", "0").ToString(), CultureInfo.InvariantCulture);
amplifierLevelSlider.Value = int.Parse(key.GetValue("AmplifierLevel", "0").ToString()); amplifierLevelSlider.Value = int.Parse(key.GetValue("AmplifierLevel", "0").ToString(), CultureInfo.InvariantCulture);
mirrorPlugineCheckBox.IsChecked = bool.Parse(key.GetValue("MirrorPlugine", "false").ToString()); mirrorModeCheckBox.IsChecked = bool.Parse(key.GetValue("MirrorMode", "false").ToString());
linePlugineCheckBox.IsChecked = bool.Parse(key.GetValue("LinePlugine", "false").ToString()); lineModeCheckBox.IsChecked = bool.Parse(key.GetValue("LineMode", "false").ToString());
musicVisualizerColorTextBox.Text = key.GetValue("MusicVisualizerColor", "").ToString(); musicVisualizerColorTextBox.Text = key.GetValue("MusicVisualizerColor", "").ToString();
colorHexTextBox.Text = key.GetValue("Color", "#FFFFFF").ToString(); cornerRadiusTextBox.Text = key.GetValue("CornerRadius", "0").ToString();
marginTextBox.Text = key.GetValue("Margin", "0").ToString();
blockWindowsClosing = false; blockWindowsClosing = false;
string primaryColorHex = key.GetValue("PrimaryColor", "#FFFFFFFF").ToString();
string secondaryColorHex = key.GetValue("SecondaryColor", "#FFFFFFFF").ToString();
string backgroundColorHex = key.GetValue("BackgroundColor", "#00FFFFFF").ToString();
_ = MultiColorConverter.TryConvertToSystemColor(primaryColorHex, out System.Drawing.Color primarySystemColor);
_ = MultiColorConverter.TryConvertToMediaColor(primaryColorHex, out Color primaryMediaColor);
_ = MultiColorConverter.TryConvertToSystemColor(secondaryColorHex, out System.Drawing.Color secondarySystemColor);
_ = MultiColorConverter.TryConvertToMediaColor(secondaryColorHex, out Color secondaryMediaColor);
_ = MultiColorConverter.TryConvertToSystemColor(backgroundColorHex, out System.Drawing.Color backgroundSystemColor);
_ = MultiColorConverter.TryConvertToMediaColor(backgroundColorHex, out Color backgroundMediaColor);
Theme.PrimaryColor = primarySystemColor;
Theme.PrimaryBrush = new SolidColorBrush(primaryMediaColor);
Theme.SecondaryColor = secondarySystemColor;
Theme.SecondaryBrush = new SolidColorBrush(secondaryMediaColor);
Theme.BackgroundColor = backgroundSystemColor;
Theme.BackgroundBrush = new SolidColorBrush(backgroundMediaColor);
primaryColorRechtangle.Fill = Theme.PrimaryBrush;
secondaryColorRechtangle.Fill = Theme.SecondaryBrush;
backgroundColorRechtangle.Fill = Theme.BackgroundBrush;
MusicVisualizerColorTextBox_TextChanged(null, null); MusicVisualizerColorTextBox_TextChanged(null, null);
MirrorPlugineCheckBox_Click(null, null); MirrorModeCheckBox_Click(null, null);
LinePlugineCheckBox_Click(null, null); LineModeCheckBox_Click(null, null);
SpectrumPlugineComboBox_SelectionChanged(null, null); SpectrumModeComboBox_SelectionChanged(null, null);
AmplifierLevelSlider_ValueChanged(null, null); AmplifierLevelSlider_ValueChanged(null, null);
CornerRadiusTextBox_TextChanged(null, null);
MarginTextBox_TextChanged(null, null);
foreach (Window window in Windows) foreach (Window window in Windows)
{ {
@@ -890,6 +742,9 @@ namespace DesktopMagic
blockWindowsClosing = true; blockWindowsClosing = true;
Windows.Clear(); Windows.Clear();
WindowNames.Clear(); WindowNames.Clear();
optionsComboBox.Items.Clear();
_ = optionsComboBox.Items.Add((string)FindResource("musicVisualizer"));
IEnumerable<CheckBox> list = stackPanel.Children.OfType<CheckBox>(); IEnumerable<CheckBox> list = stackPanel.Children.OfType<CheckBox>();
bool showWindow = true; bool showWindow = true;
@@ -914,7 +769,7 @@ namespace DesktopMagic
catch (Exception ex) catch (Exception ex)
{ {
App.Logger.Log(ex.ToString(), "Main"); App.Logger.Log(ex.ToString(), "Main");
MessageBox.Show(ex.ToString()); _ = MessageBox.Show(ex.ToString());
} }
} }
} }
@@ -941,7 +796,7 @@ namespace DesktopMagic
private void UpdatePluginsButton_Click(object sender, RoutedEventArgs e) private void UpdatePluginsButton_Click(object sender, RoutedEventArgs e)
{ {
LoadPlugins(); LoadPlugins();
Task.Run(() => _ = Task.Run(() =>
{ {
foreach (Window window in Windows.ToArray()) foreach (Window window in Windows.ToArray())
{ {
@@ -973,27 +828,11 @@ namespace DesktopMagic
Visibility = Visibility.Visible; Visibility = Visibility.Visible;
SystemCommands.RestoreWindow(this); SystemCommands.RestoreWindow(this);
Topmost = true; Topmost = true;
Activate(); _ = Activate();
Topmost = false; Topmost = false;
} }
} }
private void SetLanguageDictionary()
{
ResourceDictionary dict = new ResourceDictionary();
string currentCulture = Thread.CurrentThread.CurrentUICulture.ToString();
if (currentCulture.Contains("de"))
{
dict.Source = new Uri("..\\Resources\\StringResources.de.xaml", UriKind.Relative);
}
else
{
dict.Source = new Uri("..\\Resources\\StringResources.en.xaml", UriKind.Relative);
}
Resources.MergedDictionaries.Add(dict);
}
private void GithubButton_Click(object sender, RoutedEventArgs e) private void GithubButton_Click(object sender, RoutedEventArgs e)
{ {
string uri = "https://github.com/Stone-Red-Code/DesktopMagic"; string uri = "https://github.com/Stone-Red-Code/DesktopMagic";
@@ -1011,5 +850,21 @@ namespace DesktopMagic
psi.FileName = uri; psi.FileName = uri;
_ = Process.Start(psi); _ = Process.Start(psi);
} }
private void SetLanguageDictionary()
{
ResourceDictionary dict = new ResourceDictionary();
string currentCulture = Thread.CurrentThread.CurrentUICulture.ToString();
if (currentCulture.Contains("de"))
{
dict.Source = new Uri("..\\Resources\\StringResources.de.xaml", UriKind.Relative);
}
else
{
dict.Source = new Uri("..\\Resources\\StringResources.en.xaml", UriKind.Relative);
}
Resources.MergedDictionaries.Add(dict);
}
} }
} }
@@ -1,24 +0,0 @@
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:System="clr-namespace:System;assembly=mscorlib" x:Class="DesktopMagic.MusicVisualizerWindow"
mc:Ignorable="d"
Title="MusicVisualizerWindow" Height="450" Width="800"
Background="Transparent"
WindowStyle="None"
AllowsTransparency="True"
LocationChanged="Window_LocationChanged"
SizeChanged="Window_SizeChanged"
x:Name="window">
<WindowChrome.WindowChrome>
<WindowChrome x:Name="tileBar" CaptionHeight="30" ResizeBorderThickness="{x:Static SystemParameters.WindowResizeBorderThickness}" />
</WindowChrome.WindowChrome>
<Grid x:Name="grid">
<Rectangle x:Name="panel" Fill="#4CBAFFEF" Stroke="White" Margin="0,0,0,0" Visibility="Collapsed" />
<Viewbox StretchDirection="Both" Stretch="Uniform">
<Image x:Name="image" HorizontalAlignment="Left" Height="759" Margin="0,0,0,0" VerticalAlignment="Top" Width="1747" RenderTransformOrigin="0.5,0.5" Stretch="Fill" />
</Viewbox>
</Grid>
</Window>
-29
View File
@@ -1,29 +0,0 @@
using DesktopMagicPluginAPI;
using System.Drawing;
namespace DesktopMagic
{
internal class PluginData : IPluginData
{
private readonly PluginWindow window;
public PluginData(PluginWindow win)
{
window = win;
}
public string Font => MainWindow.GlobalFont;
public Color Color => (MainWindow.GlobalSystemColor as SolidBrush).Color;
public Point WindowSize => new Point((int)window.ActualWidth, (int)window.ActualHeight);
public Point WindowPosition => new Point((int)window.Left, (int)window.Top);
public string PluginName => window.PluginName;
public string PluginPath => window.PluginFolderPath;
public void UpdateWindow() => window.UpdatePluginWindow();
}
}
+35
View File
@@ -0,0 +1,35 @@
using DesktopMagicPluginAPI;
using System.Drawing;
namespace DesktopMagic.Plugins
{
internal class PluginData : IPluginData
{
private readonly PluginWindow window;
public PluginData(PluginWindow window)
{
this.window = window;
}
public string Font => Theme.Font;
public Color Color => Theme.PrimaryColor;
public ITheme Theme { get; } = MainWindow.Theme;
public Size WindowSize => new Size((int)window.ActualWidth, (int)window.ActualHeight);
public Point WindowPosition => new Point((int)window.Left, (int)window.Top);
public string PluginName => window.PluginName;
public string PluginPath => window.PluginFolderPath;
public void UpdateWindow()
{
window.UpdatePluginWindow();
}
}
}
@@ -16,7 +16,12 @@
x:Name="window"> x:Name="window">
<Grid> <Grid>
<Rectangle x:Name="panel" Fill="#4CBAFFEF" Stroke="White" Margin="0,0,0,0" Visibility="Collapsed" /> <Rectangle x:Name="panel" Fill="#4CBAFFEF" Stroke="White" Margin="0,0,0,0" Visibility="Collapsed" />
<Viewbox StretchDirection="Both" Stretch="Uniform">
<Border x:Name="border"/>
<Viewbox x:Name="viewBox" StretchDirection="Both" Stretch="Uniform">
<Viewbox.Clip>
<RectangleGeometry x:Name="rectangleGeometry" RadiusX="{Binding ElementName=border, Path=CornerRadius.TopLeft}" RadiusY="{Binding ElementName=border, Path=CornerRadius.TopLeft}"/>
</Viewbox.Clip>
<Image x:Name="image" HorizontalAlignment="Left" RenderOptions.EdgeMode="Aliased" Margin="0,0,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.5,0.5" Stretch="Uniform" MouseDown="Window_MouseDown" MouseMove="Window_MouseMove" MouseWheel="Window_MouseWheel"/> <Image x:Name="image" HorizontalAlignment="Left" RenderOptions.EdgeMode="Aliased" Margin="0,0,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.5,0.5" Stretch="Uniform" MouseDown="Window_MouseDown" MouseMove="Window_MouseMove" MouseWheel="Window_MouseWheel"/>
</Viewbox> </Viewbox>
</Grid> </Grid>
@@ -1,4 +1,6 @@
using DesktopMagicPluginAPI; using DesktopMagic.Plugins;
using DesktopMagicPluginAPI;
using DesktopMagicPluginAPI.Drawing; using DesktopMagicPluginAPI.Drawing;
using DesktopMagicPluginAPI.Inputs; using DesktopMagicPluginAPI.Inputs;
@@ -20,10 +22,6 @@ using System.Windows.Media.Imaging;
namespace DesktopMagic namespace DesktopMagic
{ {
/// <summary>
/// Interaktionslogik für PluginWindow.xaml
/// </summary>
///
public partial class PluginWindow : Window public partial class PluginWindow : Window
{ {
private readonly RegistryKey key; private readonly RegistryKey key;
@@ -31,9 +29,10 @@ namespace DesktopMagic
private System.Timers.Timer valueTimer; private System.Timers.Timer valueTimer;
private Plugin pluginClassInstance; private Plugin pluginClassInstance;
public bool IsRunning { get; private set; } = true;
public string PluginName { get; private set; } public string PluginName { get; private set; }
public string PluginFolderPath { get; private set; } public string PluginFolderPath { get; private set; }
private bool stop = false;
public event Action PluginLoaded; public event Action PluginLoaded;
@@ -59,7 +58,7 @@ namespace DesktopMagic
System.Timers.Timer t = new System.Timers.Timer(); System.Timers.Timer t = new System.Timers.Timer();
t.Interval = 100; t.Interval = 100;
t.Elapsed += Elapsed; t.Elapsed += UpdateTimer_Elapsed;
t.Start(); t.Start();
PluginName = pluginName; PluginName = pluginName;
@@ -71,13 +70,18 @@ namespace DesktopMagic
Width = double.Parse(key.GetValue(pluginName + "WindowWidth", 500).ToString()); Width = double.Parse(key.GetValue(pluginName + "WindowWidth", 500).ToString());
} }
public PluginWindow(Plugin pluginClassInstance, string pluginName) : this(pluginName)
{
this.pluginClassInstance = pluginClassInstance;
}
protected override void OnSourceInitialized(EventArgs e) protected override void OnSourceInitialized(EventArgs e)
{ {
base.OnSourceInitialized(e); base.OnSourceInitialized(e);
//Set the window style to noactivate. //Set the window style to noactivate.
WindowInteropHelper helper = new(this); WindowInteropHelper helper = new(this);
WindowPos.SetWindowLong(helper.Handle, WindowPos.GWL_EXSTYLE, _ = WindowPos.SetWindowLong(helper.Handle, WindowPos.GWL_EXSTYLE,
WindowPos.GetWindowLong(helper.Handle, WindowPos.GWL_EXSTYLE) | WindowPos.WS_EX_NOACTIVATE); WindowPos.GetWindowLong(helper.Handle, WindowPos.GWL_EXSTYLE) | WindowPos.WS_EX_NOACTIVATE);
} }
@@ -95,7 +99,7 @@ namespace DesktopMagic
ValueTimer_Elapsed(valueTimer, null); ValueTimer_Elapsed(valueTimer, null);
} }
private void Elapsed(object sender, ElapsedEventArgs e) private void UpdateTimer_Elapsed(object sender, ElapsedEventArgs e)
{ {
Dispatcher.Invoke(() => Dispatcher.Invoke(() =>
{ {
@@ -113,14 +117,26 @@ namespace DesktopMagic
tileBar.CaptionHeight = 0; tileBar.CaptionHeight = 0;
ResizeMode = ResizeMode.NoResize; ResizeMode = ResizeMode.NoResize;
} }
if (stop)
if (!IsRunning)
{ {
((System.Timers.Timer)sender).Stop(); ((System.Timers.Timer)sender).Stop();
} }
else
{
viewBox.Margin = new Thickness(MainWindow.Theme.Margin);
border.Width = viewBox.ActualWidth + (MainWindow.Theme.Margin * 2);
border.Height = viewBox.ActualHeight + (MainWindow.Theme.Margin * 2);
rectangleGeometry.Rect = new Rect(-MainWindow.Theme.Margin, -MainWindow.Theme.Margin, border.ActualWidth, border.ActualHeight);
border.Background = MainWindow.Theme.BackgroundBrush;
border.CornerRadius = new CornerRadius(MainWindow.Theme.CornerRadius);
}
}); });
} }
private void LoadPlugin() private void LoadPlugin()
{
if (pluginClassInstance is null)
{ {
PluginFolderPath = $"{Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)}\\{App.AppName}\\Plugins\\{PluginName}"; PluginFolderPath = $"{Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)}\\{App.AppName}\\Plugins\\{PluginName}";
@@ -130,6 +146,7 @@ namespace DesktopMagic
Exit(); Exit();
return; return;
} }
}
try try
{ {
@@ -146,6 +163,9 @@ namespace DesktopMagic
} }
private void ExecuteSource() private void ExecuteSource()
{
object instance = pluginClassInstance;
if (instance is null)
{ {
byte[] assemblyBytes = File.ReadAllBytes($"{PluginFolderPath}\\{PluginName}.dll"); byte[] assemblyBytes = File.ReadAllBytes($"{PluginFolderPath}\\{PluginName}.dll");
Assembly dll = Assembly.Load(assemblyBytes); Assembly dll = Assembly.Load(assemblyBytes);
@@ -158,7 +178,8 @@ namespace DesktopMagic
return; return;
} }
object instance = Activator.CreateInstance(instanceType); instance = Activator.CreateInstance(instanceType);
}
if (instance is Plugin) if (instance is Plugin)
{ {
pluginClassInstance = instance as Plugin; pluginClassInstance = instance as Plugin;
@@ -198,10 +219,10 @@ namespace DesktopMagic
{ {
if (prop.GetValue(instance) is Element element) if (prop.GetValue(instance) is Element element)
{ {
object[] attrs = prop.GetCustomAttributes(true); object[] attributes = prop.GetCustomAttributes(true);
foreach (object attr in attrs) foreach (object attribute in attributes)
{ {
if (attr is ElementAttribute elementAttribute) if (attribute is ElementAttribute elementAttribute)
{ {
settingElements.Add(new SettingElement(element, elementAttribute.Name, elementAttribute.OrderIndex)); settingElements.Add(new SettingElement(element, elementAttribute.Name, elementAttribute.OrderIndex));
break; break;
@@ -222,7 +243,7 @@ namespace DesktopMagic
} }
catch (Exception ex) catch (Exception ex)
{ {
stop = true; IsRunning = false;
App.Logger.Log(ex.ToString(), "Plugin"); App.Logger.Log(ex.ToString(), "Plugin");
_ = MessageBox.Show("File execution error:\n" + ex, "Error", MessageBoxButton.OK, MessageBoxImage.Error); _ = MessageBox.Show("File execution error:\n" + ex, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
Exit(); Exit();
@@ -234,7 +255,7 @@ namespace DesktopMagic
{ {
try try
{ {
if (!stop) if (IsRunning)
{ {
Bitmap result = pluginClassInstance.Main(); Bitmap result = pluginClassInstance.Main();
@@ -268,20 +289,20 @@ namespace DesktopMagic
} }
catch (Exception ex) catch (Exception ex)
{ {
stop = true; IsRunning = false;
App.Logger.Log(ex.ToString(), "Plugin"); App.Logger.Log(ex.ToString(), "Plugin");
_ = MessageBox.Show("File execution error:\n" + ex, "Error", MessageBoxButton.OK, MessageBoxImage.Error); _ = MessageBox.Show("File execution error:\n" + ex, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
Exit(); Exit();
return; return;
} }
if (stop) if (!IsRunning)
{ {
valueTimer.Stop(); valueTimer.Stop();
} }
} }
private BitmapSource BitmapToImageSource(Bitmap bitmap) private static BitmapSource BitmapToImageSource(Bitmap bitmap)
{ {
BitmapData bitmapData = bitmap.LockBits( BitmapData bitmapData = bitmap.LockBits(
new Rectangle(0, 0, bitmap.Width, bitmap.Height), new Rectangle(0, 0, bitmap.Width, bitmap.Height),
@@ -290,7 +311,7 @@ namespace DesktopMagic
BitmapSource bitmapSource = BitmapSource.Create( BitmapSource bitmapSource = BitmapSource.Create(
bitmapData.Width, bitmapData.Height, bitmapData.Width, bitmapData.Height,
bitmap.HorizontalResolution, bitmap.VerticalResolution, bitmap.HorizontalResolution, bitmap.VerticalResolution,
System.Windows.Media.PixelFormats.Bgra32, null, PixelFormats.Bgra32, null,
bitmapData.Scan0, bitmapData.Stride * bitmapData.Height, bitmapData.Stride); bitmapData.Scan0, bitmapData.Stride * bitmapData.Height, bitmapData.Stride);
bitmap.UnlockBits(bitmapData); bitmap.UnlockBits(bitmapData);
@@ -299,13 +320,20 @@ namespace DesktopMagic
public void Exit() public void Exit()
{ {
stop = true; IsRunning = false;
Dispatcher.Invoke(() => Dispatcher.Invoke(() =>
{ {
OnExit?.Invoke(); OnExit?.Invoke();
}); });
} }
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
pluginClassInstance?.Stop();
IsRunning = false;
}
#region Window Events #region Window Events
private void Window_LocationChanged(object sender, EventArgs e) private void Window_LocationChanged(object sender, EventArgs e)
@@ -321,11 +349,6 @@ namespace DesktopMagic
tileBar.CaptionHeight = ActualHeight - 10; tileBar.CaptionHeight = ActualHeight - 10;
} }
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
stop = true;
}
private void Window_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e) private void Window_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{ {
ImageSource imageSource = image.Source; ImageSource imageSource = image.Source;
@@ -1,11 +1,6 @@
using DesktopMagicPluginAPI.Inputs; using DesktopMagicPluginAPI.Inputs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DesktopMagic namespace DesktopMagic.Plugins
{ {
internal class SettingElement internal class SettingElement
{ {
+21
View File
@@ -0,0 +1,21 @@
using DesktopMagicPluginAPI;
using System.Drawing;
namespace DesktopMagic.Plugins
{
internal class Theme : ITheme
{
public Color PrimaryColor { get; set; } = Color.White;
public Color SecondaryColor { get; set; } = Color.White;
public Color BackgroundColor { get; set; } = Color.Transparent;
public string Font { get; set; } = "Segoe UI";
public int CornerRadius { get; set; }
public int Margin { get; set; }
public System.Windows.Media.Brush PrimaryBrush { get; set; } = System.Windows.Media.Brushes.White;
public System.Windows.Media.Brush SecondaryBrush { get; set; } = System.Windows.Media.Brushes.White;
public System.Windows.Media.Brush BackgroundBrush { get; set; } = System.Windows.Media.Brushes.Transparent;
}
}
@@ -3,8 +3,8 @@
xmlns:col="clr-namespace:System.Collections;assembly=mscorlib" xmlns:col="clr-namespace:System.Collections;assembly=mscorlib"
xmlns:system="clr-namespace:System;assembly=mscorlib"> xmlns:system="clr-namespace:System;assembly=mscorlib">
<system:String x:Key="linePlugine">Linie</system:String> <system:String x:Key="lineMode">Linie</system:String>
<system:String x:Key="mirrorPlugine">Spiegeln</system:String> <system:String x:Key="mirrorMode">Spiegeln</system:String>
<system:String x:Key="updatePlugins">Plugins Neu Laden</system:String> <system:String x:Key="updatePlugins">Plugins Neu Laden</system:String>
<system:String x:Key="openPluginsFolder">Plugins Ordner Öffnen</system:String> <system:String x:Key="openPluginsFolder">Plugins Ordner Öffnen</system:String>
<system:String x:Key="downloadPlugins">Plugins Herunterladen</system:String> <system:String x:Key="downloadPlugins">Plugins Herunterladen</system:String>
@@ -3,8 +3,8 @@
xmlns:col="clr-namespace:System.Collections;assembly=mscorlib" xmlns:col="clr-namespace:System.Collections;assembly=mscorlib"
xmlns:system="clr-namespace:System;assembly=mscorlib"> xmlns:system="clr-namespace:System;assembly=mscorlib">
<system:String x:Key="linePlugine">Line</system:String> <system:String x:Key="lineMode">Line</system:String>
<system:String x:Key="mirrorPlugine">Mirror</system:String> <system:String x:Key="mirrorMode">Mirror</system:String>
<system:String x:Key="updatePlugins">Reload Plugins</system:String> <system:String x:Key="updatePlugins">Reload Plugins</system:String>
<system:String x:Key="openPluginsFolder">Open Plugins Folder</system:String> <system:String x:Key="openPluginsFolder">Open Plugins Folder</system:String>
<system:String x:Key="downloadPlugins">Download Plugins</system:String> <system:String x:Key="downloadPlugins">Download Plugins</system:String>
-23
View File
@@ -1,23 +0,0 @@
<Window x:Class="DesktopMagic.TimeWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="TimeWindow" Height="450" Width="800"
Background="Transparent"
WindowStyle="None"
AllowsTransparency="True"
LocationChanged="Window_LocationChanged"
SizeChanged="Window_SizeChanged"
x:Name="window">
<Grid>
<Rectangle x:Name="panel" Fill="#4CBAFFEF" Stroke="White" Margin="0,0,0,0" Visibility="Collapsed" />
<Viewbox StretchDirection="DownOnly" Stretch="Uniform">
<TextBlock x:Name="textBlock" FontSize="999" Foreground="White" Text=" " IsHitTestVisible="False" />
</Viewbox>
</Grid>
<WindowChrome.WindowChrome>
<WindowChrome x:Name="tileBar" CaptionHeight="30" ResizeBorderThickness="{x:Static SystemParameters.WindowResizeBorderThickness}" />
</WindowChrome.WindowChrome>
</Window>
-92
View File
@@ -1,92 +0,0 @@
using Microsoft.Win32;
using System;
using System.Timers;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Media;
namespace DesktopMagic
{
/// <summary>
/// Interaktionslogik für TimeWindow.xaml
/// </summary>
public partial class TimeWindow : Window
{
private RegistryKey key;
public TimeWindow()
{
InitializeComponent();
Window w = new Window();
w.Top = -100;
w.Left = -100;
w.Width = 0;
w.Height = 0;
w.WindowStyle = WindowStyle.ToolWindow;
w.ShowInTaskbar = false;
w.Show();
Owner = w;
w.Hide();
Timer t = new Timer();
t.Interval = 100;
t.Elapsed += T_Elapsed;
t.Start();
key = Registry.CurrentUser.CreateSubKey(@"Software\" + App.AppName);
Top = double.Parse(key.GetValue("TimeWindowTop", 100).ToString());
Left = double.Parse(key.GetValue("TimeWindowLeft", 100).ToString());
Height = double.Parse(key.GetValue("TimeWindowHeight", 200).ToString());
Width = double.Parse(key.GetValue("TimeWindowWidth", 500).ToString());
IsEnabled = false;
}
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
//Set the window style to noactivate.
WindowInteropHelper helper = new WindowInteropHelper(this);
WindowPos.SetWindowLong(helper.Handle, WindowPos.GWL_EXSTYLE,
WindowPos.GetWindowLong(helper.Handle, WindowPos.GWL_EXSTYLE) | WindowPos.WS_EX_NOACTIVATE);
}
private void T_Elapsed(object sender, ElapsedEventArgs e)
{
Dispatcher.Invoke(() =>
{
if (MainWindow.EditMode)
{
panel.Visibility = Visibility.Visible;
WindowPos.SetIsLocked(this, false);
}
else
{
panel.Visibility = Visibility.Collapsed;
WindowPos.SetIsLocked(this, true);
}
textBlock.FontFamily = new FontFamily(MainWindow.GlobalFont);
textBlock.Foreground = MainWindow.GlobalColor;
//textBlock.Text = DateTime.Now.ToString("hh:mm:ss tt");
textBlock.Text = DateTime.Now.ToString("HH:mm:ss");
});
}
private void Window_LocationChanged(object sender, EventArgs e)
{
key.SetValue("TimeWindowTop", Top);
key.SetValue("TimeWindowLeft", Left);
}
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
key.SetValue("TimeWindowHeight", Height);
key.SetValue("TimeWindowWidth", Width);
tileBar.CaptionHeight = ActualHeight - 10;
}
}
}
+7 -2
View File
@@ -1,11 +1,12 @@
using DesktopMagicPluginAPI; using DesktopMagicPluginAPI;
using DesktopMagicPluginAPI.Inputs; using DesktopMagicPluginAPI.Inputs;
using System;
using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Drawing.Imaging; using System.Drawing.Imaging;
using System.IO; using System.IO;
using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using System;
namespace DesktopMagicPlugin.Test namespace DesktopMagicPlugin.Test
{ {
@@ -71,12 +72,16 @@ namespace DesktopMagicPlugin.Test
public override Bitmap Main() public override Bitmap Main()
{ {
if (bitmaps.Count == 0) if (bitmaps.Count == 0)
{
return new Bitmap(1, 1); return new Bitmap(1, 1);
}
frameCount++; frameCount++;
if (frameCount >= bitmaps.Count) if (frameCount >= bitmaps.Count)
{
frameCount = 0; frameCount = 0;
}
return bitmaps[frameCount]; return bitmaps[frameCount];
} }
@@ -4,13 +4,13 @@
<TargetFramework>net5.0</TargetFramework> <TargetFramework>net5.0</TargetFramework>
<Company>Stone_Red</Company> <Company>Stone_Red</Company>
<Product>Stone_Red</Product> <Product>Stone_Red</Product>
<Version>0.0.0.4</Version> <Version>0.0.0.5</Version>
<RepositoryUrl>https://github.com/Stone-Red-Code/DesktopMagic</RepositoryUrl> <RepositoryUrl>https://github.com/Stone-Red-Code/DesktopMagic</RepositoryUrl>
<PackageLicenseFile>LICENSE</PackageLicenseFile> <PackageLicenseFile>LICENSE</PackageLicenseFile>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<AssemblyVersion>0.0.0.4</AssemblyVersion> <AssemblyVersion>0.0.0.5</AssemblyVersion>
<PackageProjectUrl></PackageProjectUrl> <PackageProjectUrl></PackageProjectUrl>
<FileVersion>0.0.0.4</FileVersion> <FileVersion>0.0.0.5</FileVersion>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
@@ -10,6 +10,10 @@
- [CheckBox](#T-DesktopMagicPluginAPI-Inputs-CheckBox 'DesktopMagicPluginAPI.Inputs.CheckBox') - [CheckBox](#T-DesktopMagicPluginAPI-Inputs-CheckBox 'DesktopMagicPluginAPI.Inputs.CheckBox')
- [#ctor(value)](#M-DesktopMagicPluginAPI-Inputs-CheckBox-#ctor-System-Boolean- 'DesktopMagicPluginAPI.Inputs.CheckBox.#ctor(System.Boolean)') - [#ctor(value)](#M-DesktopMagicPluginAPI-Inputs-CheckBox-#ctor-System-Boolean- 'DesktopMagicPluginAPI.Inputs.CheckBox.#ctor(System.Boolean)')
- [Value](#P-DesktopMagicPluginAPI-Inputs-CheckBox-Value 'DesktopMagicPluginAPI.Inputs.CheckBox.Value') - [Value](#P-DesktopMagicPluginAPI-Inputs-CheckBox-Value 'DesktopMagicPluginAPI.Inputs.CheckBox.Value')
- [ComboBox](#T-DesktopMagicPluginAPI-Inputs-ComboBox 'DesktopMagicPluginAPI.Inputs.ComboBox')
- [#ctor(items)](#M-DesktopMagicPluginAPI-Inputs-ComboBox-#ctor-System-String[]- 'DesktopMagicPluginAPI.Inputs.ComboBox.#ctor(System.String[])')
- [Items](#P-DesktopMagicPluginAPI-Inputs-ComboBox-Items 'DesktopMagicPluginAPI.Inputs.ComboBox.Items')
- [Value](#P-DesktopMagicPluginAPI-Inputs-ComboBox-Value 'DesktopMagicPluginAPI.Inputs.ComboBox.Value')
- [Element](#T-DesktopMagicPluginAPI-Inputs-Element 'DesktopMagicPluginAPI.Inputs.Element') - [Element](#T-DesktopMagicPluginAPI-Inputs-Element 'DesktopMagicPluginAPI.Inputs.Element')
- [ValueChanged()](#M-DesktopMagicPluginAPI-Inputs-Element-ValueChanged 'DesktopMagicPluginAPI.Inputs.Element.ValueChanged') - [ValueChanged()](#M-DesktopMagicPluginAPI-Inputs-Element-ValueChanged 'DesktopMagicPluginAPI.Inputs.Element.ValueChanged')
- [ElementAttribute](#T-DesktopMagicPluginAPI-Inputs-ElementAttribute 'DesktopMagicPluginAPI.Inputs.ElementAttribute') - [ElementAttribute](#T-DesktopMagicPluginAPI-Inputs-ElementAttribute 'DesktopMagicPluginAPI.Inputs.ElementAttribute')
@@ -23,14 +27,25 @@
- [DrawStringFixedWidth(graphics,s,font,brush,point,width)](#M-DesktopMagicPluginAPI-Drawing-GraphicsExtentions-DrawStringFixedWidth-System-Drawing-Graphics,System-String,System-Drawing-Font,System-Drawing-Brush,System-Drawing-PointF,System-Single- 'DesktopMagicPluginAPI.Drawing.GraphicsExtentions.DrawStringFixedWidth(System.Drawing.Graphics,System.String,System.Drawing.Font,System.Drawing.Brush,System.Drawing.PointF,System.Single)') - [DrawStringFixedWidth(graphics,s,font,brush,point,width)](#M-DesktopMagicPluginAPI-Drawing-GraphicsExtentions-DrawStringFixedWidth-System-Drawing-Graphics,System-String,System-Drawing-Font,System-Drawing-Brush,System-Drawing-PointF,System-Single- 'DesktopMagicPluginAPI.Drawing.GraphicsExtentions.DrawStringFixedWidth(System.Drawing.Graphics,System.String,System.Drawing.Font,System.Drawing.Brush,System.Drawing.PointF,System.Single)')
- [DrawStringMonospace(graphics,s,font,brush,x,y)](#M-DesktopMagicPluginAPI-Drawing-GraphicsExtentions-DrawStringMonospace-System-Drawing-Graphics,System-String,System-Drawing-Font,System-Drawing-Brush,System-Single,System-Single- 'DesktopMagicPluginAPI.Drawing.GraphicsExtentions.DrawStringMonospace(System.Drawing.Graphics,System.String,System.Drawing.Font,System.Drawing.Brush,System.Single,System.Single)') - [DrawStringMonospace(graphics,s,font,brush,x,y)](#M-DesktopMagicPluginAPI-Drawing-GraphicsExtentions-DrawStringMonospace-System-Drawing-Graphics,System-String,System-Drawing-Font,System-Drawing-Brush,System-Single,System-Single- 'DesktopMagicPluginAPI.Drawing.GraphicsExtentions.DrawStringMonospace(System.Drawing.Graphics,System.String,System.Drawing.Font,System.Drawing.Brush,System.Single,System.Single)')
- [DrawStringMonospace(graphics,s,font,brush,point)](#M-DesktopMagicPluginAPI-Drawing-GraphicsExtentions-DrawStringMonospace-System-Drawing-Graphics,System-String,System-Drawing-Font,System-Drawing-Brush,System-Drawing-PointF- 'DesktopMagicPluginAPI.Drawing.GraphicsExtentions.DrawStringMonospace(System.Drawing.Graphics,System.String,System.Drawing.Font,System.Drawing.Brush,System.Drawing.PointF)') - [DrawStringMonospace(graphics,s,font,brush,point)](#M-DesktopMagicPluginAPI-Drawing-GraphicsExtentions-DrawStringMonospace-System-Drawing-Graphics,System-String,System-Drawing-Font,System-Drawing-Brush,System-Drawing-PointF- 'DesktopMagicPluginAPI.Drawing.GraphicsExtentions.DrawStringMonospace(System.Drawing.Graphics,System.String,System.Drawing.Font,System.Drawing.Brush,System.Drawing.PointF)')
- [DrawStringNoLeftPadding(graphics,s,font,brush,x,y)](#M-DesktopMagicPluginAPI-Drawing-GraphicsExtentions-DrawStringNoLeftPadding-System-Drawing-Graphics,System-String,System-Drawing-Font,System-Drawing-Brush,System-Single,System-Single- 'DesktopMagicPluginAPI.Drawing.GraphicsExtentions.DrawStringNoLeftPadding(System.Drawing.Graphics,System.String,System.Drawing.Font,System.Drawing.Brush,System.Single,System.Single)')
- [DrawStringNoLeftPadding(graphics,s,font,brush,point)](#M-DesktopMagicPluginAPI-Drawing-GraphicsExtentions-DrawStringNoLeftPadding-System-Drawing-Graphics,System-String,System-Drawing-Font,System-Drawing-Brush,System-Drawing-PointF- 'DesktopMagicPluginAPI.Drawing.GraphicsExtentions.DrawStringNoLeftPadding(System.Drawing.Graphics,System.String,System.Drawing.Font,System.Drawing.Brush,System.Drawing.PointF)')
- [MeasureStringNoLeftPadding(graphics,text,font)](#M-DesktopMagicPluginAPI-Drawing-GraphicsExtentions-MeasureStringNoLeftPadding-System-Drawing-Graphics,System-String,System-Drawing-Font- 'DesktopMagicPluginAPI.Drawing.GraphicsExtentions.MeasureStringNoLeftPadding(System.Drawing.Graphics,System.String,System.Drawing.Font)')
- [IPluginData](#T-DesktopMagicPluginAPI-IPluginData 'DesktopMagicPluginAPI.IPluginData') - [IPluginData](#T-DesktopMagicPluginAPI-IPluginData 'DesktopMagicPluginAPI.IPluginData')
- [Color](#P-DesktopMagicPluginAPI-IPluginData-Color 'DesktopMagicPluginAPI.IPluginData.Color') - [Color](#P-DesktopMagicPluginAPI-IPluginData-Color 'DesktopMagicPluginAPI.IPluginData.Color')
- [Font](#P-DesktopMagicPluginAPI-IPluginData-Font 'DesktopMagicPluginAPI.IPluginData.Font') - [Font](#P-DesktopMagicPluginAPI-IPluginData-Font 'DesktopMagicPluginAPI.IPluginData.Font')
- [PluginName](#P-DesktopMagicPluginAPI-IPluginData-PluginName 'DesktopMagicPluginAPI.IPluginData.PluginName') - [PluginName](#P-DesktopMagicPluginAPI-IPluginData-PluginName 'DesktopMagicPluginAPI.IPluginData.PluginName')
- [PluginPath](#P-DesktopMagicPluginAPI-IPluginData-PluginPath 'DesktopMagicPluginAPI.IPluginData.PluginPath') - [PluginPath](#P-DesktopMagicPluginAPI-IPluginData-PluginPath 'DesktopMagicPluginAPI.IPluginData.PluginPath')
- [Theme](#P-DesktopMagicPluginAPI-IPluginData-Theme 'DesktopMagicPluginAPI.IPluginData.Theme')
- [WindowPosition](#P-DesktopMagicPluginAPI-IPluginData-WindowPosition 'DesktopMagicPluginAPI.IPluginData.WindowPosition') - [WindowPosition](#P-DesktopMagicPluginAPI-IPluginData-WindowPosition 'DesktopMagicPluginAPI.IPluginData.WindowPosition')
- [WindowSize](#P-DesktopMagicPluginAPI-IPluginData-WindowSize 'DesktopMagicPluginAPI.IPluginData.WindowSize') - [WindowSize](#P-DesktopMagicPluginAPI-IPluginData-WindowSize 'DesktopMagicPluginAPI.IPluginData.WindowSize')
- [UpdateWindow()](#M-DesktopMagicPluginAPI-IPluginData-UpdateWindow 'DesktopMagicPluginAPI.IPluginData.UpdateWindow') - [UpdateWindow()](#M-DesktopMagicPluginAPI-IPluginData-UpdateWindow 'DesktopMagicPluginAPI.IPluginData.UpdateWindow')
- [ITheme](#T-DesktopMagicPluginAPI-ITheme 'DesktopMagicPluginAPI.ITheme')
- [BackgroundColor](#P-DesktopMagicPluginAPI-ITheme-BackgroundColor 'DesktopMagicPluginAPI.ITheme.BackgroundColor')
- [CornerRadius](#P-DesktopMagicPluginAPI-ITheme-CornerRadius 'DesktopMagicPluginAPI.ITheme.CornerRadius')
- [Font](#P-DesktopMagicPluginAPI-ITheme-Font 'DesktopMagicPluginAPI.ITheme.Font')
- [Margin](#P-DesktopMagicPluginAPI-ITheme-Margin 'DesktopMagicPluginAPI.ITheme.Margin')
- [PrimaryColor](#P-DesktopMagicPluginAPI-ITheme-PrimaryColor 'DesktopMagicPluginAPI.ITheme.PrimaryColor')
- [SecondaryColor](#P-DesktopMagicPluginAPI-ITheme-SecondaryColor 'DesktopMagicPluginAPI.ITheme.SecondaryColor')
- [IntegerUpDown](#T-DesktopMagicPluginAPI-Inputs-IntegerUpDown 'DesktopMagicPluginAPI.Inputs.IntegerUpDown') - [IntegerUpDown](#T-DesktopMagicPluginAPI-Inputs-IntegerUpDown 'DesktopMagicPluginAPI.Inputs.IntegerUpDown')
- [#ctor(min,max,value)](#M-DesktopMagicPluginAPI-Inputs-IntegerUpDown-#ctor-System-Int32,System-Int32,System-Int32- 'DesktopMagicPluginAPI.Inputs.IntegerUpDown.#ctor(System.Int32,System.Int32,System.Int32)') - [#ctor(min,max,value)](#M-DesktopMagicPluginAPI-Inputs-IntegerUpDown-#ctor-System-Int32,System-Int32,System-Int32- 'DesktopMagicPluginAPI.Inputs.IntegerUpDown.#ctor(System.Int32,System.Int32,System.Int32)')
- [Maximum](#P-DesktopMagicPluginAPI-Inputs-IntegerUpDown-Maximum 'DesktopMagicPluginAPI.Inputs.IntegerUpDown.Maximum') - [Maximum](#P-DesktopMagicPluginAPI-Inputs-IntegerUpDown-Maximum 'DesktopMagicPluginAPI.Inputs.IntegerUpDown.Maximum')
@@ -51,8 +66,9 @@
- [Main()](#M-DesktopMagicPluginAPI-Plugin-Main 'DesktopMagicPluginAPI.Plugin.Main') - [Main()](#M-DesktopMagicPluginAPI-Plugin-Main 'DesktopMagicPluginAPI.Plugin.Main')
- [OnMouseClick(position,mouseButton)](#M-DesktopMagicPluginAPI-Plugin-OnMouseClick-System-Drawing-Point,DesktopMagicPluginAPI-Inputs-MouseButton- 'DesktopMagicPluginAPI.Plugin.OnMouseClick(System.Drawing.Point,DesktopMagicPluginAPI.Inputs.MouseButton)') - [OnMouseClick(position,mouseButton)](#M-DesktopMagicPluginAPI-Plugin-OnMouseClick-System-Drawing-Point,DesktopMagicPluginAPI-Inputs-MouseButton- 'DesktopMagicPluginAPI.Plugin.OnMouseClick(System.Drawing.Point,DesktopMagicPluginAPI.Inputs.MouseButton)')
- [OnMouseMove(position)](#M-DesktopMagicPluginAPI-Plugin-OnMouseMove-System-Drawing-Point- 'DesktopMagicPluginAPI.Plugin.OnMouseMove(System.Drawing.Point)') - [OnMouseMove(position)](#M-DesktopMagicPluginAPI-Plugin-OnMouseMove-System-Drawing-Point- 'DesktopMagicPluginAPI.Plugin.OnMouseMove(System.Drawing.Point)')
- [OnMouseWheel(position,Delta)](#M-DesktopMagicPluginAPI-Plugin-OnMouseWheel-System-Drawing-Point,System-Int32- 'DesktopMagicPluginAPI.Plugin.OnMouseWheel(System.Drawing.Point,System.Int32)') - [OnMouseWheel(position,delta)](#M-DesktopMagicPluginAPI-Plugin-OnMouseWheel-System-Drawing-Point,System-Int32- 'DesktopMagicPluginAPI.Plugin.OnMouseWheel(System.Drawing.Point,System.Int32)')
- [Start()](#M-DesktopMagicPluginAPI-Plugin-Start 'DesktopMagicPluginAPI.Plugin.Start') - [Start()](#M-DesktopMagicPluginAPI-Plugin-Start 'DesktopMagicPluginAPI.Plugin.Start')
- [Stop()](#M-DesktopMagicPluginAPI-Plugin-Stop 'DesktopMagicPluginAPI.Plugin.Stop')
- [RenderQuality](#T-DesktopMagicPluginAPI-Drawing-RenderQuality 'DesktopMagicPluginAPI.Drawing.RenderQuality') - [RenderQuality](#T-DesktopMagicPluginAPI-Drawing-RenderQuality 'DesktopMagicPluginAPI.Drawing.RenderQuality')
- [High](#F-DesktopMagicPluginAPI-Drawing-RenderQuality-High 'DesktopMagicPluginAPI.Drawing.RenderQuality.High') - [High](#F-DesktopMagicPluginAPI-Drawing-RenderQuality-High 'DesktopMagicPluginAPI.Drawing.RenderQuality.High')
- [Low](#F-DesktopMagicPluginAPI-Drawing-RenderQuality-Low 'DesktopMagicPluginAPI.Drawing.RenderQuality.Low') - [Low](#F-DesktopMagicPluginAPI-Drawing-RenderQuality-Low 'DesktopMagicPluginAPI.Drawing.RenderQuality.Low')
@@ -139,6 +155,48 @@ Initializes a new instance of the [CheckBox](#T-DesktopMagicPluginAPI-Inputs-Che
Gets or set a value indicating whether the [CheckBox](#T-DesktopMagicPluginAPI-Inputs-CheckBox 'DesktopMagicPluginAPI.Inputs.CheckBox') is in the checked state. Gets or set a value indicating whether the [CheckBox](#T-DesktopMagicPluginAPI-Inputs-CheckBox 'DesktopMagicPluginAPI.Inputs.CheckBox') is in the checked state.
<a name='T-DesktopMagicPluginAPI-Inputs-ComboBox'></a>
## ComboBox `type`
##### Namespace
DesktopMagicPluginAPI.Inputs
##### Summary
Represents a selection control with a drop-down list.
<a name='M-DesktopMagicPluginAPI-Inputs-ComboBox-#ctor-System-String[]-'></a>
### #ctor(items) `constructor`
##### Summary
Initializes a new instance of the [Label](#T-DesktopMagicPluginAPI-Inputs-Label 'DesktopMagicPluginAPI.Inputs.Label') class with the provided `items`.
##### Parameters
| Name | Type | Description |
| ---- | ---- | ----------- |
| items | [System.String[]](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.String[] 'System.String[]') | |
<a name='P-DesktopMagicPluginAPI-Inputs-ComboBox-Items'></a>
### Items `property`
##### Summary
Gets the collection used to generate the content of the [ComboBox](#T-DesktopMagicPluginAPI-Inputs-ComboBox 'DesktopMagicPluginAPI.Inputs.ComboBox').
<a name='P-DesktopMagicPluginAPI-Inputs-ComboBox-Value'></a>
### Value `property`
##### Summary
Gets the currently selected item associated with this [ComboBox](#T-DesktopMagicPluginAPI-Inputs-ComboBox 'DesktopMagicPluginAPI.Inputs.ComboBox').
##### Remarks
If you assign a value to this property, the displayed text in the user interface will not be changed.
<a name='T-DesktopMagicPluginAPI-Inputs-Element'></a> <a name='T-DesktopMagicPluginAPI-Inputs-Element'></a>
## Element `type` ## Element `type`
@@ -233,14 +291,14 @@ DesktopMagicPluginAPI.Drawing
##### Summary ##### Summary
Extentions for the [Graphics](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Graphics 'System.Drawing.Graphics') class. Extensions for the [Graphics](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Graphics 'System.Drawing.Graphics') class.
<a name='M-DesktopMagicPluginAPI-Drawing-GraphicsExtentions-DrawStringFixedWidth-System-Drawing-Graphics,System-String,System-Drawing-Font,System-Drawing-Brush,System-Single,System-Single,System-Single-'></a> <a name='M-DesktopMagicPluginAPI-Drawing-GraphicsExtentions-DrawStringFixedWidth-System-Drawing-Graphics,System-String,System-Drawing-Font,System-Drawing-Brush,System-Single,System-Single,System-Single-'></a>
### DrawStringFixedWidth(graphics,s,font,brush,x,y,width) `method` ### DrawStringFixedWidth(graphics,s,font,brush,x,y,width) `method`
##### Summary ##### Summary
Draws the specified text string at the specified location with the specified [Brush](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Brush 'System.Drawing.Brush') and [Font](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Font 'System.Drawing.Font') objects.
##### Parameters ##### Parameters
@@ -259,7 +317,7 @@ Draws the specified text string at the specified location with the specified [Br
##### Summary ##### Summary
Draws the specified text string at the specified location with the specified [Brush](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Brush 'System.Drawing.Brush') and [Font](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Font 'System.Drawing.Font') objects.
##### Parameters ##### Parameters
@@ -277,7 +335,7 @@ Draws the specified text string at the specified location with the specified [Br
##### Summary ##### Summary
Draws the specified text string at the specified location with the specified [Brush](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Brush 'System.Drawing.Brush') and [Font](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Font 'System.Drawing.Font') objects.
##### Parameters ##### Parameters
@@ -295,7 +353,7 @@ Draws the specified text string at the specified location with the specified [Br
##### Summary ##### Summary
Draws the specified text string at the specified location with the specified [Brush](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Brush 'System.Drawing.Brush') and [Font](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Font 'System.Drawing.Font') objects.
##### Parameters ##### Parameters
@@ -307,6 +365,60 @@ Draws the specified text string at the specified location with the specified [Br
| brush | [System.Drawing.Brush](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Brush 'System.Drawing.Brush') | [Brush](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Brush 'System.Drawing.Brush') that determines the color and texture of the drawn text. | | brush | [System.Drawing.Brush](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Brush 'System.Drawing.Brush') | [Brush](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Brush 'System.Drawing.Brush') that determines the color and texture of the drawn text. |
| point | [System.Drawing.PointF](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.PointF 'System.Drawing.PointF') | [PointF](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.PointF 'System.Drawing.PointF') structure that specifies the upper-left corner of the drawn text. | | point | [System.Drawing.PointF](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.PointF 'System.Drawing.PointF') | [PointF](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.PointF 'System.Drawing.PointF') structure that specifies the upper-left corner of the drawn text. |
<a name='M-DesktopMagicPluginAPI-Drawing-GraphicsExtentions-DrawStringNoLeftPadding-System-Drawing-Graphics,System-String,System-Drawing-Font,System-Drawing-Brush,System-Single,System-Single-'></a>
### DrawStringNoLeftPadding(graphics,s,font,brush,x,y) `method`
##### Summary
##### Parameters
| Name | Type | Description |
| ---- | ---- | ----------- |
| graphics | [System.Drawing.Graphics](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Graphics 'System.Drawing.Graphics') | Graphics object. |
| s | [System.String](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.String 'System.String') | String to draw. |
| font | [System.Drawing.Font](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Font 'System.Drawing.Font') | [Font](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Font 'System.Drawing.Font') that defines the text format of the string. |
| brush | [System.Drawing.Brush](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Brush 'System.Drawing.Brush') | [Brush](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Brush 'System.Drawing.Brush') that determines the color and texture of the drawn text. |
| x | [System.Single](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Single 'System.Single') | The x-coordinate of the upper-left corner of the drawn text. |
| y | [System.Single](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Single 'System.Single') | The y-coordinate of the upper-left corner of the drawn text. |
<a name='M-DesktopMagicPluginAPI-Drawing-GraphicsExtentions-DrawStringNoLeftPadding-System-Drawing-Graphics,System-String,System-Drawing-Font,System-Drawing-Brush,System-Drawing-PointF-'></a>
### DrawStringNoLeftPadding(graphics,s,font,brush,point) `method`
##### Summary
##### Parameters
| Name | Type | Description |
| ---- | ---- | ----------- |
| graphics | [System.Drawing.Graphics](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Graphics 'System.Drawing.Graphics') | Graphics object. |
| s | [System.String](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.String 'System.String') | String to draw. |
| font | [System.Drawing.Font](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Font 'System.Drawing.Font') | [Font](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Font 'System.Drawing.Font') that defines the text format of the string. |
| brush | [System.Drawing.Brush](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Brush 'System.Drawing.Brush') | [Brush](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Brush 'System.Drawing.Brush') that determines the color and texture of the drawn text. |
| point | [System.Drawing.PointF](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.PointF 'System.Drawing.PointF') | [PointF](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.PointF 'System.Drawing.PointF') structure that specifies the upper-left corner of the drawn text. |
<a name='M-DesktopMagicPluginAPI-Drawing-GraphicsExtentions-MeasureStringNoLeftPadding-System-Drawing-Graphics,System-String,System-Drawing-Font-'></a>
### MeasureStringNoLeftPadding(graphics,text,font) `method`
##### Summary
##### Returns
##### Parameters
| Name | Type | Description |
| ---- | ---- | ----------- |
| graphics | [System.Drawing.Graphics](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Graphics 'System.Drawing.Graphics') | Graphics object. |
| text | [System.String](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.String 'System.String') | String to measure. |
| font | [System.Drawing.Font](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Font 'System.Drawing.Font') | [Font](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Font 'System.Drawing.Font') that defines the text format of the string. |
<a name='T-DesktopMagicPluginAPI-IPluginData'></a> <a name='T-DesktopMagicPluginAPI-IPluginData'></a>
## IPluginData `type` ## IPluginData `type`
@@ -323,14 +435,14 @@ Defines properties and methods that provide information about the main applicati
##### Summary ##### Summary
Gets the color of the main application. Gets the current color of the current theme.
<a name='P-DesktopMagicPluginAPI-IPluginData-Font'></a> <a name='P-DesktopMagicPluginAPI-IPluginData-Font'></a>
### Font `property` ### Font `property`
##### Summary ##### Summary
Gets the font of the main application. Gets the current font of the current theme.
<a name='P-DesktopMagicPluginAPI-IPluginData-PluginName'></a> <a name='P-DesktopMagicPluginAPI-IPluginData-PluginName'></a>
### PluginName `property` ### PluginName `property`
@@ -346,6 +458,13 @@ Gets the name of the plugin.
Gets the path of the parent directory of the plugin. Gets the path of the parent directory of the plugin.
<a name='P-DesktopMagicPluginAPI-IPluginData-Theme'></a>
### Theme `property`
##### Summary
Gets the current theme setting of the main application.
<a name='P-DesktopMagicPluginAPI-IPluginData-WindowPosition'></a> <a name='P-DesktopMagicPluginAPI-IPluginData-WindowPosition'></a>
### WindowPosition `property` ### WindowPosition `property`
@@ -371,6 +490,59 @@ Updates the plugin window.
This method has no parameters. This method has no parameters.
<a name='T-DesktopMagicPluginAPI-ITheme'></a>
## ITheme `type`
##### Namespace
DesktopMagicPluginAPI
##### Summary
The theme settings of the main application.
<a name='P-DesktopMagicPluginAPI-ITheme-BackgroundColor'></a>
### BackgroundColor `property`
##### Summary
Gets the background color of the current theme.
<a name='P-DesktopMagicPluginAPI-ITheme-CornerRadius'></a>
### CornerRadius `property`
##### Summary
Gets the corner radius of the current theme.
<a name='P-DesktopMagicPluginAPI-ITheme-Font'></a>
### Font `property`
##### Summary
Gets the font of the current theme.
<a name='P-DesktopMagicPluginAPI-ITheme-Margin'></a>
### Margin `property`
##### Summary
Gets the corner radius of the current theme.
<a name='P-DesktopMagicPluginAPI-ITheme-PrimaryColor'></a>
### PrimaryColor `property`
##### Summary
Gets the primary color of the current theme.
<a name='P-DesktopMagicPluginAPI-ITheme-SecondaryColor'></a>
### SecondaryColor `property`
##### Summary
Gets the secondary color of the current theme.
<a name='T-DesktopMagicPluginAPI-Inputs-IntegerUpDown'></a> <a name='T-DesktopMagicPluginAPI-Inputs-IntegerUpDown'></a>
## IntegerUpDown `type` ## IntegerUpDown `type`
@@ -570,7 +742,7 @@ Occurs when the mouse pointer is moved over the control.
| position | [System.Drawing.Point](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Point 'System.Drawing.Point') | The x- and y-coordinates of the mouse pointer position relative to the plugin window. | | position | [System.Drawing.Point](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Point 'System.Drawing.Point') | The x- and y-coordinates of the mouse pointer position relative to the plugin window. |
<a name='M-DesktopMagicPluginAPI-Plugin-OnMouseWheel-System-Drawing-Point,System-Int32-'></a> <a name='M-DesktopMagicPluginAPI-Plugin-OnMouseWheel-System-Drawing-Point,System-Int32-'></a>
### OnMouseWheel(position,Delta) `method` ### OnMouseWheel(position,delta) `method`
##### Summary ##### Summary
@@ -581,14 +753,25 @@ Occurs when the user rotates the mouse wheel while the mouse pointer is over thi
| Name | Type | Description | | Name | Type | Description |
| ---- | ---- | ----------- | | ---- | ---- | ----------- |
| position | [System.Drawing.Point](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Point 'System.Drawing.Point') | The x- and y-coordinates of the mouse pointer position relative to the plugin window. | | position | [System.Drawing.Point](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Drawing.Point 'System.Drawing.Point') | The x- and y-coordinates of the mouse pointer position relative to the plugin window. |
| Delta | [System.Int32](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Int32 'System.Int32') | A value that indicates the amount that the mouse wheel has changed. | | delta | [System.Int32](http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k:System.Int32 'System.Int32') | A value that indicates the amount that the mouse wheel has changed. |
<a name='M-DesktopMagicPluginAPI-Plugin-Start'></a> <a name='M-DesktopMagicPluginAPI-Plugin-Start'></a>
### Start() `method` ### Start() `method`
##### Summary ##### Summary
Occurs once when the pugin gets activated. Occurs once when the plugin gets activated.
##### Parameters
This method has no parameters.
<a name='M-DesktopMagicPluginAPI-Plugin-Stop'></a>
### Stop() `method`
##### Summary
Occurs once when the plugin gets deactivated.
##### Parameters ##### Parameters
@@ -6,12 +6,12 @@
<members> <members>
<member name="T:DesktopMagicPluginAPI.Drawing.GraphicsExtentions"> <member name="T:DesktopMagicPluginAPI.Drawing.GraphicsExtentions">
<summary> <summary>
Extentions for the <see cref="T:System.Drawing.Graphics"/> class. Extensions for the <see cref="T:System.Drawing.Graphics"/> class.
</summary> </summary>
</member> </member>
<member name="M:DesktopMagicPluginAPI.Drawing.GraphicsExtentions.DrawStringMonospace(System.Drawing.Graphics,System.String,System.Drawing.Font,System.Drawing.Brush,System.Single,System.Single)"> <member name="M:DesktopMagicPluginAPI.Drawing.GraphicsExtentions.DrawStringMonospace(System.Drawing.Graphics,System.String,System.Drawing.Font,System.Drawing.Brush,System.Single,System.Single)">
<summary> <summary>
Draws the specified text string at the specified location with the specified <see cref="T:System.Drawing.Brush"/> and <see cref="T:System.Drawing.Font"/> objects. <inheritdoc cref="M:System.Drawing.Graphics.DrawString(System.String,System.Drawing.Font,System.Drawing.Brush,System.Single,System.Single)"/>
</summary> </summary>
<param name="graphics">Graphics object.</param> <param name="graphics">Graphics object.</param>
<param name="s">String to draw.</param> <param name="s">String to draw.</param>
@@ -22,7 +22,7 @@
</member> </member>
<member name="M:DesktopMagicPluginAPI.Drawing.GraphicsExtentions.DrawStringMonospace(System.Drawing.Graphics,System.String,System.Drawing.Font,System.Drawing.Brush,System.Drawing.PointF)"> <member name="M:DesktopMagicPluginAPI.Drawing.GraphicsExtentions.DrawStringMonospace(System.Drawing.Graphics,System.String,System.Drawing.Font,System.Drawing.Brush,System.Drawing.PointF)">
<summary> <summary>
Draws the specified text string at the specified location with the specified <see cref="T:System.Drawing.Brush"/> and <see cref="T:System.Drawing.Font"/> objects. <inheritdoc cref="M:System.Drawing.Graphics.DrawString(System.String,System.Drawing.Font,System.Drawing.Brush,System.Drawing.PointF)"/>
</summary> </summary>
<param name="graphics">Graphics object.</param> <param name="graphics">Graphics object.</param>
<param name="s">String to draw.</param> <param name="s">String to draw.</param>
@@ -32,7 +32,7 @@
</member> </member>
<member name="M:DesktopMagicPluginAPI.Drawing.GraphicsExtentions.DrawStringFixedWidth(System.Drawing.Graphics,System.String,System.Drawing.Font,System.Drawing.Brush,System.Single,System.Single,System.Single)"> <member name="M:DesktopMagicPluginAPI.Drawing.GraphicsExtentions.DrawStringFixedWidth(System.Drawing.Graphics,System.String,System.Drawing.Font,System.Drawing.Brush,System.Single,System.Single,System.Single)">
<summary> <summary>
Draws the specified text string at the specified location with the specified <see cref="T:System.Drawing.Brush"/> and <see cref="T:System.Drawing.Font"/> objects. <inheritdoc cref="M:System.Drawing.Graphics.DrawString(System.String,System.Drawing.Font,System.Drawing.Brush,System.Single,System.Single)"/>
</summary> </summary>
<param name="graphics">Graphics object.</param> <param name="graphics">Graphics object.</param>
<param name="s">String to draw.</param> <param name="s">String to draw.</param>
@@ -44,7 +44,7 @@
</member> </member>
<member name="M:DesktopMagicPluginAPI.Drawing.GraphicsExtentions.DrawStringFixedWidth(System.Drawing.Graphics,System.String,System.Drawing.Font,System.Drawing.Brush,System.Drawing.PointF,System.Single)"> <member name="M:DesktopMagicPluginAPI.Drawing.GraphicsExtentions.DrawStringFixedWidth(System.Drawing.Graphics,System.String,System.Drawing.Font,System.Drawing.Brush,System.Drawing.PointF,System.Single)">
<summary> <summary>
Draws the specified text string at the specified location with the specified <see cref="T:System.Drawing.Brush"/> and <see cref="T:System.Drawing.Font"/> objects. <inheritdoc cref="M:System.Drawing.Graphics.DrawString(System.String,System.Drawing.Font,System.Drawing.Brush,System.Drawing.PointF)"/>
</summary> </summary>
<param name="graphics">Graphics object.</param> <param name="graphics">Graphics object.</param>
<param name="s">String to draw.</param> <param name="s">String to draw.</param>
@@ -53,6 +53,36 @@
<param name="point"><see cref="T:System.Drawing.PointF"/> structure that specifies the upper-left corner of the drawn text.</param> <param name="point"><see cref="T:System.Drawing.PointF"/> structure that specifies the upper-left corner of the drawn text.</param>
<param name="width">The specified width.</param> <param name="width">The specified width.</param>
</member> </member>
<member name="M:DesktopMagicPluginAPI.Drawing.GraphicsExtentions.DrawStringNoLeftPadding(System.Drawing.Graphics,System.String,System.Drawing.Font,System.Drawing.Brush,System.Single,System.Single)">
<summary>
<inheritdoc cref="M:System.Drawing.Graphics.DrawString(System.String,System.Drawing.Font,System.Drawing.Brush,System.Single,System.Single)"/>
</summary>
<param name="graphics">Graphics object.</param>
<param name="s">String to draw.</param>
<param name="font"><see cref="T:System.Drawing.Font"/> that defines the text format of the string.</param>
<param name="brush"><see cref="T:System.Drawing.Brush"/> that determines the color and texture of the drawn text.</param>
<param name="x">The x-coordinate of the upper-left corner of the drawn text.</param>
<param name="y">The y-coordinate of the upper-left corner of the drawn text.</param>
</member>
<member name="M:DesktopMagicPluginAPI.Drawing.GraphicsExtentions.DrawStringNoLeftPadding(System.Drawing.Graphics,System.String,System.Drawing.Font,System.Drawing.Brush,System.Drawing.PointF)">
<summary>
<inheritdoc cref="M:System.Drawing.Graphics.DrawString(System.String,System.Drawing.Font,System.Drawing.Brush,System.Drawing.PointF)"/>
</summary>
<param name="graphics">Graphics object.</param>
<param name="s">String to draw.</param>
<param name="font"><see cref="T:System.Drawing.Font"/> that defines the text format of the string.</param>
<param name="brush"><see cref="T:System.Drawing.Brush"/> that determines the color and texture of the drawn text.</param>
<param name="point"><see cref="T:System.Drawing.PointF"/> structure that specifies the upper-left corner of the drawn text.</param>
</member>
<member name="M:DesktopMagicPluginAPI.Drawing.GraphicsExtentions.MeasureStringNoLeftPadding(System.Drawing.Graphics,System.String,System.Drawing.Font)">
<summary>
<inheritdoc cref="M:System.Drawing.Graphics.MeasureString(System.String,System.Drawing.Font)"/>
</summary>
<param name="graphics">Graphics object.</param>
<param name="text">String to measure.</param>
<param name="font"><see cref="T:System.Drawing.Font"/> that defines the text format of the string.</param>
<returns></returns>
</member>
<member name="T:DesktopMagicPluginAPI.Drawing.RenderQuality"> <member name="T:DesktopMagicPluginAPI.Drawing.RenderQuality">
<summary> <summary>
Specifies which render quality is used to display the bitmap images. Specifies which render quality is used to display the bitmap images.
@@ -115,6 +145,28 @@
</summary> </summary>
<param name="value">A value indicating whether the <see cref="T:DesktopMagicPluginAPI.Inputs.CheckBox"/> is in the checked state.</param> <param name="value">A value indicating whether the <see cref="T:DesktopMagicPluginAPI.Inputs.CheckBox"/> is in the checked state.</param>
</member> </member>
<member name="T:DesktopMagicPluginAPI.Inputs.ComboBox">
<summary>
Represents a selection control with a drop-down list.
</summary>
</member>
<member name="P:DesktopMagicPluginAPI.Inputs.ComboBox.Items">
<summary>
Gets the collection used to generate the content of the <see cref="T:DesktopMagicPluginAPI.Inputs.ComboBox"/>.
</summary>
</member>
<member name="P:DesktopMagicPluginAPI.Inputs.ComboBox.Value">
<summary>
Gets the currently selected item associated with this <see cref="T:DesktopMagicPluginAPI.Inputs.ComboBox"/>.
</summary>
<remarks>If you assign a value to this property, the displayed text in the user interface will not be changed.</remarks>
</member>
<member name="M:DesktopMagicPluginAPI.Inputs.ComboBox.#ctor(System.String[])">
<summary>
Initializes a new instance of the <see cref="T:DesktopMagicPluginAPI.Inputs.Label"/> class with the provided <paramref name="items"/>.
</summary>
<param name="items"></param>
</member>
<member name="T:DesktopMagicPluginAPI.Inputs.Element"> <member name="T:DesktopMagicPluginAPI.Inputs.Element">
<summary> <summary>
The element base class. The element base class.
@@ -283,12 +335,17 @@
</member> </member>
<member name="P:DesktopMagicPluginAPI.IPluginData.Font"> <member name="P:DesktopMagicPluginAPI.IPluginData.Font">
<summary> <summary>
Gets the font of the main application. Gets the current font of the current theme.
</summary> </summary>
</member> </member>
<member name="P:DesktopMagicPluginAPI.IPluginData.Color"> <member name="P:DesktopMagicPluginAPI.IPluginData.Color">
<summary> <summary>
Gets the color of the main application. Gets the current color of the current theme.
</summary>
</member>
<member name="P:DesktopMagicPluginAPI.IPluginData.Theme">
<summary>
Gets the current theme setting of the main application.
</summary> </summary>
</member> </member>
<member name="P:DesktopMagicPluginAPI.IPluginData.WindowSize"> <member name="P:DesktopMagicPluginAPI.IPluginData.WindowSize">
@@ -316,6 +373,41 @@
Updates the plugin window. Updates the plugin window.
</summary> </summary>
</member> </member>
<member name="T:DesktopMagicPluginAPI.ITheme">
<summary>
The theme settings of the main application.
</summary>
</member>
<member name="P:DesktopMagicPluginAPI.ITheme.PrimaryColor">
<summary>
Gets the primary color of the current theme.
</summary>
</member>
<member name="P:DesktopMagicPluginAPI.ITheme.SecondaryColor">
<summary>
Gets the secondary color of the current theme.
</summary>
</member>
<member name="P:DesktopMagicPluginAPI.ITheme.BackgroundColor">
<summary>
Gets the background color of the current theme.
</summary>
</member>
<member name="P:DesktopMagicPluginAPI.ITheme.Font">
<summary>
Gets the font of the current theme.
</summary>
</member>
<member name="P:DesktopMagicPluginAPI.ITheme.CornerRadius">
<summary>
Gets the corner radius of the current theme.
</summary>
</member>
<member name="P:DesktopMagicPluginAPI.ITheme.Margin">
<summary>
Gets the corner radius of the current theme.
</summary>
</member>
<member name="T:DesktopMagicPluginAPI.Plugin"> <member name="T:DesktopMagicPluginAPI.Plugin">
<summary> <summary>
The plugin class. The plugin class.
@@ -338,7 +430,12 @@
</member> </member>
<member name="M:DesktopMagicPluginAPI.Plugin.Start"> <member name="M:DesktopMagicPluginAPI.Plugin.Start">
<summary> <summary>
Occurs once when the pugin gets activated. Occurs once when the plugin gets activated.
</summary>
</member>
<member name="M:DesktopMagicPluginAPI.Plugin.Stop">
<summary>
Occurs once when the plugin gets deactivated.
</summary> </summary>
</member> </member>
<member name="M:DesktopMagicPluginAPI.Plugin.Main"> <member name="M:DesktopMagicPluginAPI.Plugin.Main">
@@ -365,7 +462,7 @@
Occurs when the user rotates the mouse wheel while the mouse pointer is over this element. Occurs when the user rotates the mouse wheel while the mouse pointer is over this element.
</summary> </summary>
<param name="position">The x- and y-coordinates of the mouse pointer position relative to the plugin window.</param> <param name="position">The x- and y-coordinates of the mouse pointer position relative to the plugin window.</param>
<param name="Delta">A value that indicates the amount that the mouse wheel has changed.</param> <param name="delta">A value that indicates the amount that the mouse wheel has changed.</param>
</member> </member>
</members> </members>
</doc> </doc>
@@ -5,14 +5,14 @@ using System.Drawing;
namespace DesktopMagicPluginAPI.Drawing namespace DesktopMagicPluginAPI.Drawing
{ {
/// <summary> /// <summary>
/// Extentions for the <see cref="Graphics"/> class. /// Extensions for the <see cref="Graphics"/> class.
/// </summary> /// </summary>
public static class GraphicsExtentions public static class GraphicsExtentions
{ {
private static readonly Dictionary<Font, int> fonts = new Dictionary<Font, int>(new FontComparer()); private static readonly Dictionary<Font, int> fonts = new Dictionary<Font, int>(new FontComparer());
/// <summary> /// <summary>
/// Draws the specified text string at the specified location with the specified <see cref="Brush"/> and <see cref="Font"/> objects. /// <inheritdoc cref="Graphics.DrawString(string?, Font, Brush, float, float)"/>
/// </summary> /// </summary>
/// <param name="graphics">Graphics object.</param> /// <param name="graphics">Graphics object.</param>
/// <param name="s">String to draw.</param> /// <param name="s">String to draw.</param>
@@ -22,7 +22,7 @@ namespace DesktopMagicPluginAPI.Drawing
/// <param name="y">The y-coordinate of the upper-left corner of the drawn text.</param> /// <param name="y">The y-coordinate of the upper-left corner of the drawn text.</param>
public static void DrawStringMonospace(this Graphics graphics, string s, Font font, Brush brush, float x, float y) public static void DrawStringMonospace(this Graphics graphics, string s, Font font, Brush brush, float x, float y)
{ {
int widest = GetWidestChar(font); int widest = graphics.GetWidestChar(font);
for (int i = 0; i < s.Length; i++) for (int i = 0; i < s.Length; i++)
{ {
@@ -33,7 +33,7 @@ namespace DesktopMagicPluginAPI.Drawing
} }
/// <summary> /// <summary>
/// Draws the specified text string at the specified location with the specified <see cref="Brush"/> and <see cref="Font"/> objects. /// <inheritdoc cref="Graphics.DrawString(string?, Font, Brush, PointF)"/>
/// </summary> /// </summary>
/// <param name="graphics">Graphics object.</param> /// <param name="graphics">Graphics object.</param>
/// <param name="s">String to draw.</param> /// <param name="s">String to draw.</param>
@@ -42,7 +42,7 @@ namespace DesktopMagicPluginAPI.Drawing
/// <param name="point"><see cref="PointF"/> structure that specifies the upper-left corner of the drawn text.</param> /// <param name="point"><see cref="PointF"/> structure that specifies the upper-left corner of the drawn text.</param>
public static void DrawStringMonospace(this Graphics graphics, string s, Font font, Brush brush, PointF point) public static void DrawStringMonospace(this Graphics graphics, string s, Font font, Brush brush, PointF point)
{ {
int widest = GetWidestChar(font); int widest = graphics.GetWidestChar(font);
for (int i = 0; i < s.Length; i++) for (int i = 0; i < s.Length; i++)
{ {
@@ -53,7 +53,7 @@ namespace DesktopMagicPluginAPI.Drawing
} }
/// <summary> /// <summary>
/// Draws the specified text string at the specified location with the specified <see cref="Brush"/> and <see cref="Font"/> objects. /// <inheritdoc cref="Graphics.DrawString(string?, Font, Brush, float, float)"/>
/// </summary> /// </summary>
/// <param name="graphics">Graphics object.</param> /// <param name="graphics">Graphics object.</param>
/// <param name="s">String to draw.</param> /// <param name="s">String to draw.</param>
@@ -73,7 +73,7 @@ namespace DesktopMagicPluginAPI.Drawing
} }
/// <summary> /// <summary>
/// Draws the specified text string at the specified location with the specified <see cref="Brush"/> and <see cref="Font"/> objects. /// <inheritdoc cref="Graphics.DrawString(string?, Font, Brush, PointF)"/>
/// </summary> /// </summary>
/// <param name="graphics">Graphics object.</param> /// <param name="graphics">Graphics object.</param>
/// <param name="s">String to draw.</param> /// <param name="s">String to draw.</param>
@@ -91,12 +91,76 @@ namespace DesktopMagicPluginAPI.Drawing
} }
} }
private static int GetWidestChar(Font font) /// <summary>
///<inheritdoc cref="Graphics.DrawString(string?, Font, Brush, float, float)"/>
/// </summary>
/// <param name="graphics">Graphics object.</param>
/// <param name="s">String to draw.</param>
/// <param name="font"><see cref="Font"/> that defines the text format of the string.</param>
/// <param name="brush"><see cref="Brush"/> that determines the color and texture of the drawn text.</param>
/// <param name="x">The x-coordinate of the upper-left corner of the drawn text.</param>
/// <param name="y">The y-coordinate of the upper-left corner of the drawn text.</param>
public static void DrawStringNoLeftPadding(this Graphics graphics, string s, Font font, Brush brush, float x, float y)
{
// measure left padding
StringFormat sf = new StringFormat(StringFormatFlags.NoClip);
sf.SetMeasurableCharacterRanges(new CharacterRange[] { new CharacterRange(0, 1) });
Region[] r = graphics.MeasureCharacterRanges(s, font, new RectangleF(0, 0, 1000, 100), sf);
float leftPadding = r[0].GetBounds(graphics).Left;
// draw string
sf = new StringFormat(StringFormatFlags.NoClip);
graphics.DrawString(s, font, brush, x - leftPadding, y, sf);
}
/// <summary>
/// <inheritdoc cref="Graphics.DrawString(string?, Font, Brush, PointF)"/>
/// </summary>
/// <param name="graphics">Graphics object.</param>
/// <param name="s">String to draw.</param>
/// <param name="font"><see cref="Font"/> that defines the text format of the string.</param>
/// <param name="brush"><see cref="Brush"/> that determines the color and texture of the drawn text.</param>
/// <param name="point"><see cref="PointF"/> structure that specifies the upper-left corner of the drawn text.</param>
public static void DrawStringNoLeftPadding(this Graphics graphics, string s, Font font, Brush brush, PointF point)
{
// measure left padding
StringFormat sf = new StringFormat(StringFormatFlags.NoClip);
sf.SetMeasurableCharacterRanges(new CharacterRange[] { new CharacterRange(0, 1) });
Region[] r = graphics.MeasureCharacterRanges(s, font, new RectangleF(0, 0, 1000, 100), sf);
float leftPadding = r[0].GetBounds(graphics).Left;
// draw string
sf = new StringFormat(StringFormatFlags.NoClip);
graphics.DrawString(s, font, brush, point.X - leftPadding, point.Y, sf);
}
/// <summary>
/// <inheritdoc cref="Graphics.MeasureString(string, Font)"/>
/// </summary>
/// <param name="graphics">Graphics object.</param>
/// <param name="text">String to measure.</param>
/// <param name="font"><see cref="Font"/> that defines the text format of the string.</param>
/// <returns></returns>
public static SizeF MeasureStringNoLeftPadding(this Graphics graphics, string text, Font font)
{
SizeF size = graphics.MeasureString(text, font, int.MaxValue);
StringFormat sf = new StringFormat(StringFormatFlags.NoClip);
sf.SetMeasurableCharacterRanges(new CharacterRange[] { new CharacterRange(0, 1) });
Region[] r = graphics.MeasureCharacterRanges(text, font, new RectangleF(0, 0, 1000, 100), sf);
float leftPadding = r[0].GetBounds(graphics).Left;
size.Width -= leftPadding / 1.5f;
return size;
}
private static int GetWidestChar(this Graphics graphics, Font font)
{ {
if (fonts.ContainsKey(font)) if (fonts.ContainsKey(font))
{
return fonts[font]; return fonts[font];
}
Graphics graphics = Graphics.FromImage(new Bitmap(1, 1));
float max = 0; float max = 0;
char maxx = ' '; char maxx = ' ';
for (int i = 0; i <= 255; i++) for (int i = 0; i <= 255; i++)
+12 -4
View File
@@ -1,4 +1,5 @@
using System.Drawing; using System;
using System.Drawing;
namespace DesktopMagicPluginAPI namespace DesktopMagicPluginAPI
{ {
@@ -8,19 +9,26 @@ namespace DesktopMagicPluginAPI
public interface IPluginData public interface IPluginData
{ {
/// <summary> /// <summary>
/// Gets the font of the main application. /// Gets the current font of the current theme.
/// </summary> /// </summary>
[Obsolete("Use the \"Theme\" property instead")]
string Font { get; } string Font { get; }
/// <summary> /// <summary>
/// Gets the color of the main application. /// Gets the current color of the current theme.
/// </summary> /// </summary>
[Obsolete("Use the \"Theme\" property instead")]
Color Color { get; } Color Color { get; }
/// <summary>
/// Gets the current theme setting of the main application.
/// </summary>
ITheme Theme { get; }
/// <summary> /// <summary>
/// Gets the window size of the plugin window. /// Gets the window size of the plugin window.
/// </summary> /// </summary>
Point WindowSize { get; } Size WindowSize { get; }
/// <summary> /// <summary>
/// Gets the window position of the plugin window. /// Gets the window position of the plugin window.
+40
View File
@@ -0,0 +1,40 @@
using System.Drawing;
namespace DesktopMagicPluginAPI
{
/// <summary>
/// The theme settings of the main application.
/// </summary>
public interface ITheme
{
/// <summary>
/// Gets the primary color of the current theme.
/// </summary>
Color PrimaryColor { get; }
/// <summary>
/// Gets the secondary color of the current theme.
/// </summary>
Color SecondaryColor { get; }
/// <summary>
/// Gets the background color of the current theme.
/// </summary>
Color BackgroundColor { get; }
/// <summary>
/// Gets the font of the current theme.
/// </summary>
string Font { get; }
/// <summary>
/// Gets the corner radius of the current theme.
/// </summary>
int CornerRadius { get; }
/// <summary>
/// Gets the corner radius of the current theme.
/// </summary>
int Margin { get; }
}
}
@@ -0,0 +1,46 @@
using System.Collections.ObjectModel;
namespace DesktopMagicPluginAPI.Inputs
{
/// <summary>
/// Represents a selection control with a drop-down list.
/// </summary>
public class ComboBox : Element
{
private string _value;
/// <summary>
/// Gets the collection used to generate the content of the <see cref="ComboBox"/>.
/// </summary>
public ObservableCollection<string> Items { get; } = new ObservableCollection<string>();
/// <summary>
/// Gets the currently selected item associated with this <see cref="ComboBox"/>.
/// </summary>
/// <remarks>If you assign a value to this property, the displayed text in the user interface will not be changed.</remarks>
public string Value
{
get => _value;
set
{
if (_value != value)
{
_value = value;
ValueChanged();
}
}
}
/// <summary>
/// Initializes a new instance of the <see cref="Label"/> class with the provided <paramref name="items"/>.
/// </summary>
/// <param name="items"></param>
public ComboBox(params string[] items)
{
foreach (string item in items)
{
Items.Add(item);
}
}
}
}
+11 -14
View File
@@ -19,17 +19,7 @@ namespace DesktopMagicPluginAPI
public IPluginData Application public IPluginData Application
{ {
get => application; get => application;
set set => application = application is null ? value : throw new InvalidOperationException($"You cannot set the value of the {nameof(Application)} property");
{
if (application is null)
{
application = value;
}
else
{
throw new InvalidOperationException($"You cannot set the value of the {nameof(Application)} property");
}
}
} }
/// <summary> /// <summary>
@@ -43,12 +33,19 @@ namespace DesktopMagicPluginAPI
public virtual RenderQuality RenderQuality { get; set; } = RenderQuality.High; public virtual RenderQuality RenderQuality { get; set; } = RenderQuality.High;
/// <summary> /// <summary>
/// Occurs once when the pugin gets activated. /// Occurs once when the plugin gets activated.
/// </summary> /// </summary>
public virtual void Start() public virtual void Start()
{ {
} }
/// <summary>
/// Occurs once when the plugin gets deactivated.
/// </summary>
public virtual void Stop()
{
}
/// <summary> /// <summary>
/// Occurs when the <see cref="UpdateInterval"/> elapses. /// Occurs when the <see cref="UpdateInterval"/> elapses.
/// </summary> /// </summary>
@@ -76,8 +73,8 @@ namespace DesktopMagicPluginAPI
/// Occurs when the user rotates the mouse wheel while the mouse pointer is over this element. /// Occurs when the user rotates the mouse wheel while the mouse pointer is over this element.
/// </summary> /// </summary>
/// <param name="position">The x- and y-coordinates of the mouse pointer position relative to the plugin window.</param> /// <param name="position">The x- and y-coordinates of the mouse pointer position relative to the plugin window.</param>
/// <param name="Delta">A value that indicates the amount that the mouse wheel has changed.</param> /// <param name="delta">A value that indicates the amount that the mouse wheel has changed.</param>
public virtual void OnMouseWheel(Point position, int Delta) public virtual void OnMouseWheel(Point position, int delta)
{ {
} }
} }
Binary file not shown.
+2 -2
View File
@@ -1,4 +1,4 @@
{ {
"Version":"0.0.2.3", "Version":"0.0.3.1",
"FileUrl":"http://github.com/Stone-Red-Code/DesktopMagic/blob/develop/update/DesktopMagic.zip?raw=true" "FileUrl":"http://github.com/Stone-Red-Code/DesktopMagic/blob/main/update/DesktopMagic.zip?raw=true"
} }