diff --git a/src/TED/TED.DrawModes/OneTimeDrawMode.cs b/src/TED/TED.DrawModes/OneTimeDrawMode.cs index fff28bd..6c56a6d 100644 --- a/src/TED/TED.DrawModes/OneTimeDrawMode.cs +++ b/src/TED/TED.DrawModes/OneTimeDrawMode.cs @@ -50,8 +50,18 @@ namespace TED.DrawModes var scaledWorkingAreaWidth = primaryAreaRect.X / scaleX; var scaledWorkingAreaHeight = primaryAreaRect.Y / scaleY; - // Calculate the maximum width of all lines - var maxWidth = graphics.MeasureString(Options.Lines.Max(l => l), font).Width; + var maxWidth = 0f; + if(Options.FixedWidth > 0) + { + // Use the fixed width. + maxWidth = Options.FixedWidth; + } + else + { + // Calculate the maximum width based on the longest line. + maxWidth = Options.Lines.Select(line => new SizeF(graphics.MeasureString(line, font).Width, 0)) + .Max(size => size.Width); + } // Calculate the positions of the text and the image var textX = scaledWorkingAreaWidth + Screen.PrimaryScreen.WorkingArea.Width - maxWidth - Options.PaddingHorizontal; @@ -80,8 +90,12 @@ namespace TED.DrawModes { var line = Options.Lines[i]; + var format = new StringFormat() { Alignment = Options.TextAlignment }; + var lineHeight = graphics.MeasureString(line, font).Height; + var textRect = new RectangleF(textX, textY, maxWidth, lineHeight); + // Draw the line - graphics.DrawString(line, font, new SolidBrush(textColor), new PointF(textX, textY)); + graphics.DrawString(line, font, new SolidBrush(textColor), textRect, format); // Move the text cursor down to the next line textY += graphics.MeasureString(line, font).Height; diff --git a/src/TED/TED.Program/Options.cs b/src/TED/TED.Program/Options.cs index 38ff6ca..0db5b75 100644 --- a/src/TED/TED.Program/Options.cs +++ b/src/TED/TED.Program/Options.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Drawing; using TED.Utils; namespace TED.Program @@ -17,6 +18,8 @@ namespace TED.Program internal readonly string LightImagePath; internal readonly string DarkImagePath; internal readonly List Lines; + internal int FixedWidth; + internal StringAlignment TextAlignment; internal readonly bool Debug; internal readonly bool AdaptiveImageMode; @@ -37,6 +40,8 @@ namespace TED.Program Tokenizer.ReplaceTokens("DEVICE NAME: @machineName"), Tokenizer.ReplaceTokens("OS: @os"), }, + -1, + StringAlignment.Near, false); return _default; @@ -49,7 +54,7 @@ namespace TED.Program internal Options(int paddingHorizontal, int paddingVertical, int lineSpacing, int fontSize, string fontName, string imagePath, string lightImagePath, - string darkImagePath, List lines, + string darkImagePath, List lines, int fixedWidth, StringAlignment textAlignment, bool debug) { PaddingHorizontal = paddingHorizontal; @@ -62,6 +67,8 @@ namespace TED.Program DarkImagePath = darkImagePath; Lines = lines; Debug = debug; + FixedWidth = fixedWidth; + TextAlignment = textAlignment; AdaptiveImageMode = !string.IsNullOrEmpty(LightImagePath) && !string.IsNullOrEmpty(DarkImagePath); } diff --git a/src/TED/TED.Program/Program.cs b/src/TED/TED.Program/Program.cs index 7d71d09..8e16e8e 100644 --- a/src/TED/TED.Program/Program.cs +++ b/src/TED/TED.Program/Program.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Drawing; using System.IO; using System.Linq; using System.Net.Http; @@ -36,6 +37,7 @@ namespace TED.Program var imagePath = GetArgument(args, new string[] { "-image", "-i" }, Options.Default.ImagePath); var darkImagePath = GetArgument(args, new string[] { "-darkimage", "-di" }, Options.Default.DarkImagePath); var lightImagePath = GetArgument(args, new string[] { "-lightimage", "-li" }, Options.Default.LightImagePath); + var alignment = GetArgument(args, new string[] { "-align", "-a" }, "left"); var lines = Options.Default.Lines; if (!bool.TryParse(GetArgument(args, new string[] { "-debug", "-d" }, Options.Default.Debug.ToString()), out bool debug)) @@ -63,6 +65,28 @@ namespace TED.Program paddingVertical = Options.Default.PaddingVertical; } + if (!int.TryParse(GetArgument(args, new string[] { "-width", "-w" }, Options.Default.FixedWidth.ToString()), out int fixedWidth)) + { + fixedWidth = Options.Default.FixedWidth; + } + + var alignmentOption = StringAlignment.Near; + switch(alignment.ToLower()) + { + case "left": + alignmentOption = StringAlignment.Near; + break; + case "center": + alignmentOption = StringAlignment.Center; + break; + case "right": + alignmentOption = StringAlignment.Far; + break; + default: + alignmentOption = StringAlignment.Near; + break; + } + if (args.Any(arg => arg.Contains("-line"))) { lines.Clear(); @@ -99,6 +123,8 @@ namespace TED.Program lightImagePath, darkImagePath, lines, + fixedWidth, + alignmentOption, debug ); }