From 18ad5c1440f6dc87dce469db09a32d537102f1a7 Mon Sep 17 00:00:00 2001 From: minster586 <43217359+minster586@users.noreply.github.com> Date: Mon, 8 Sep 2025 16:38:29 -0400 Subject: [PATCH] Added Dark mode --- RadioDJViewer/Main.Designer.cs | 82 ++- RadioDJViewer/Main.cs | 208 ++++++- RadioDJViewer/ProfileStorage.cs | 4 + RadioDJViewer/Properties/AssemblyInfo.cs | 4 +- .../Properties/Resources.Designer.cs | 20 + RadioDJViewer/Properties/Resources.resx | 6 + RadioDJViewer/RadioDJViewer.csproj | 4 +- RadioDJViewer/Resources/MdiWeatherNight.png | Bin 0 -> 27354 bytes RadioDJViewer/Resources/MdiWeatherSunny.png | Bin 0 -> 24912 bytes .../radiodj-restapi-template.Designer.cs | 506 +++++++++++------- RadioDJViewer/radiodj-restapi-template.cs | 50 +- 11 files changed, 643 insertions(+), 241 deletions(-) create mode 100644 RadioDJViewer/Resources/MdiWeatherNight.png create mode 100644 RadioDJViewer/Resources/MdiWeatherSunny.png diff --git a/RadioDJViewer/Main.Designer.cs b/RadioDJViewer/Main.Designer.cs index 9fbc819..febc804 100644 --- a/RadioDJViewer/Main.Designer.cs +++ b/RadioDJViewer/Main.Designer.cs @@ -37,9 +37,11 @@ this.menuStrip2 = new System.Windows.Forms.MenuStrip(); this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.restAPISettingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.loggingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.onToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.offToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.pictureBox1 = new System.Windows.Forms.PictureBox(); this.groupBox1 = new System.Windows.Forms.GroupBox(); this.label6 = new System.Windows.Forms.Label(); this.label5 = new System.Windows.Forms.Label(); @@ -49,10 +51,12 @@ this.label1 = new System.Windows.Forms.Label(); this.button1 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); + this.uicolor = new System.Windows.Forms.Button(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); this.statusStrip1.SuspendLayout(); this.menuStrip2.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); this.groupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); this.SuspendLayout(); // // statusStrip1 @@ -113,6 +117,7 @@ // this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.restAPISettingToolStripMenuItem, + this.loggingToolStripMenuItem, this.exitToolStripMenuItem}); this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); @@ -121,14 +126,36 @@ // restAPISettingToolStripMenuItem // this.restAPISettingToolStripMenuItem.Name = "restAPISettingToolStripMenuItem"; - this.restAPISettingToolStripMenuItem.Size = new System.Drawing.Size(111, 22); + this.restAPISettingToolStripMenuItem.Size = new System.Drawing.Size(118, 22); this.restAPISettingToolStripMenuItem.Text = "Setting"; this.restAPISettingToolStripMenuItem.Click += new System.EventHandler(this.restAPISettingToolStripMenuItem_Click); // + // loggingToolStripMenuItem + // + this.loggingToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.onToolStripMenuItem, + this.offToolStripMenuItem}); + this.loggingToolStripMenuItem.Enabled = false; + this.loggingToolStripMenuItem.Name = "loggingToolStripMenuItem"; + this.loggingToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.loggingToolStripMenuItem.Text = "Logging"; + // + // onToolStripMenuItem + // + this.onToolStripMenuItem.Name = "onToolStripMenuItem"; + this.onToolStripMenuItem.Size = new System.Drawing.Size(91, 22); + this.onToolStripMenuItem.Text = "On"; + // + // offToolStripMenuItem + // + this.offToolStripMenuItem.Name = "offToolStripMenuItem"; + this.offToolStripMenuItem.Size = new System.Drawing.Size(91, 22); + this.offToolStripMenuItem.Text = "Off"; + // // exitToolStripMenuItem // this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; - this.exitToolStripMenuItem.Size = new System.Drawing.Size(111, 22); + this.exitToolStripMenuItem.Size = new System.Drawing.Size(118, 22); this.exitToolStripMenuItem.Text = "Exit"; this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); // @@ -139,14 +166,6 @@ this.aboutToolStripMenuItem.Text = "About"; this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click); // - // pictureBox1 - // - this.pictureBox1.Location = new System.Drawing.Point(13, 37); - this.pictureBox1.Name = "pictureBox1"; - this.pictureBox1.Size = new System.Drawing.Size(180, 173); - this.pictureBox1.TabIndex = 3; - this.pictureBox1.TabStop = false; - // // groupBox1 // this.groupBox1.Controls.Add(this.label6); @@ -165,28 +184,25 @@ // // label6 // - this.label6.AutoSize = true; - this.label6.Location = new System.Drawing.Point(170, 130); + this.label6.Location = new System.Drawing.Point(99, 129); this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(65, 16); + this.label6.Size = new System.Drawing.Size(266, 17); this.label6.TabIndex = 5; this.label6.Text = "No album"; // // label5 // - this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(170, 83); + this.label5.Location = new System.Drawing.Point(99, 83); this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(56, 16); + this.label5.Size = new System.Drawing.Size(266, 17); this.label5.TabIndex = 4; this.label5.Text = "No artist"; // // label4 // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(170, 39); + this.label4.Location = new System.Drawing.Point(99, 39); this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(48, 16); + this.label4.Size = new System.Drawing.Size(266, 16); this.label4.TabIndex = 3; this.label4.Text = "No title"; // @@ -240,11 +256,29 @@ this.button2.UseVisualStyleBackColor = true; this.button2.Click += new System.EventHandler(this.button2_Click); // + // uicolor + // + this.uicolor.Image = global::RadioDJViewer.Properties.Resources.MdiWeatherNight; + this.uicolor.Location = new System.Drawing.Point(13, 234); + this.uicolor.Name = "uicolor"; + this.uicolor.Size = new System.Drawing.Size(28, 23); + this.uicolor.TabIndex = 7; + this.uicolor.UseVisualStyleBackColor = true; + // + // pictureBox1 + // + this.pictureBox1.Location = new System.Drawing.Point(13, 37); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(180, 173); + this.pictureBox1.TabIndex = 3; + this.pictureBox1.TabStop = false; + // // Main // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(612, 293); + this.Controls.Add(this.uicolor); this.Controls.Add(this.button2); this.Controls.Add(this.button1); this.Controls.Add(this.groupBox1); @@ -258,9 +292,9 @@ this.statusStrip1.PerformLayout(); this.menuStrip2.ResumeLayout(false); this.menuStrip2.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); this.groupBox1.ResumeLayout(false); this.groupBox1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -288,6 +322,10 @@ private System.Windows.Forms.Label label1; private System.Windows.Forms.Button button1; private System.Windows.Forms.Button button2; + private System.Windows.Forms.ToolStripMenuItem loggingToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem onToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem offToolStripMenuItem; + private System.Windows.Forms.Button uicolor; } } diff --git a/RadioDJViewer/Main.cs b/RadioDJViewer/Main.cs index cbe83d0..9feb41a 100644 --- a/RadioDJViewer/Main.cs +++ b/RadioDJViewer/Main.cs @@ -38,27 +38,41 @@ namespace RadioDJViewer private string marqueeTextArtist = ""; private string marqueeTextAlbum = ""; + private Timer pauseTimerTitle; + private Timer pauseTimerArtist; + private Timer pauseTimerAlbum; + + private int marqueeScrollSpeed = 100; // Default to Medium + private int marqueePauseTime = 6000; // Default to 6 seconds + private string marqueeSeparator = " | "; // Default separator + private bool loggingEnabled = false; + private string logFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "RadioDJViewer.log"); + + private bool isDarkMode = false; // New field for dark mode + public Main() { InitializeComponent(); - EnsureDefaultImageExists(); UpdateStatusBar(); - // Auto-load profiles if profiles.json exists - AutoLoadProfiles(); // Set up timer for polling API every 3 seconds apiTimer = new System.Windows.Forms.Timer(); apiTimer.Interval = 3000; // 3 seconds apiTimer.Tick += ApiTimer_Tick; // Marquee timers for each label marqueeTimerTitle = new System.Windows.Forms.Timer(); - marqueeTimerTitle.Interval = 100; // Adjust speed as needed + marqueeTimerTitle.Interval = marqueeScrollSpeed; marqueeTimerTitle.Tick += MarqueeTimerTitle_Tick; marqueeTimerArtist = new System.Windows.Forms.Timer(); - marqueeTimerArtist.Interval = 100; // Adjust speed as needed + marqueeTimerArtist.Interval = marqueeScrollSpeed; marqueeTimerArtist.Tick += MarqueeTimerArtist_Tick; marqueeTimerAlbum = new System.Windows.Forms.Timer(); - marqueeTimerAlbum.Interval = 100; // Adjust speed as needed + marqueeTimerAlbum.Interval = marqueeScrollSpeed; marqueeTimerAlbum.Tick += MarqueeTimerAlbum_Tick; + // Wire up dark mode button + this.uicolor.Click += Uicolor_Click; + UpdateTheme(); + // Auto-load profiles if profiles.json exists + AutoLoadProfiles(); } private void EnsureDefaultImageExists() @@ -74,15 +88,67 @@ namespace RadioDJViewer } } + public void SetMarqueeScrollSpeed(string speed) + { + switch (speed) + { + case "Very Slow": marqueeScrollSpeed = 300; break; + case "Slow": marqueeScrollSpeed = 200; break; + case "Medium": marqueeScrollSpeed = 100; break; + case "Fast": marqueeScrollSpeed = 60; break; + case "Very Fast": marqueeScrollSpeed = 30; break; + default: marqueeScrollSpeed = 100; break; + } + marqueeTimerTitle.Interval = marqueeScrollSpeed; + marqueeTimerArtist.Interval = marqueeScrollSpeed; + marqueeTimerAlbum.Interval = marqueeScrollSpeed; + } + + public void SetMarqueePauseTime(int seconds) + { + marqueePauseTime = seconds * 1000; + } + + public void SetMarqueeSeparator(string separator) + { + marqueeSeparator = separator; + } + + private void LogMessage(string message) + { + if (!loggingEnabled) return; + try + { + File.AppendAllText(logFilePath, $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {message}\r\n"); + } + catch { } + } + private void MarqueeTimerTitle_Tick(object sender, EventArgs e) { int visibleChars = 30; // Adjust for label width if (marqueeTextTitle.Length > visibleChars) { - string scrollText = marqueeTextTitle + " |"; + string separator = string.IsNullOrEmpty(marqueeSeparator) ? "" : marqueeSeparator; + string scrollText = marqueeTextTitle + separator; + string repeatedScrollText = scrollText + scrollText; marqueeOffsetTitle = (marqueeOffsetTitle + 1) % scrollText.Length; - string display = scrollText.Substring(marqueeOffsetTitle) + " " + scrollText.Substring(0, marqueeOffsetTitle); - label4.Text = display.Substring(0, Math.Min(visibleChars, display.Length)); + label4.Text = repeatedScrollText.Substring(marqueeOffsetTitle, visibleChars); + LogMessage($"MarqueeTitle: separator='{separator}', scrollText='{scrollText}', offset={marqueeOffsetTitle}"); + if (marqueeOffsetTitle == 0) + { + marqueeTimerTitle.Stop(); + if (pauseTimerTitle == null) + { + pauseTimerTitle = new Timer(); + pauseTimerTitle.Tick += (s, args) => { + pauseTimerTitle.Stop(); + marqueeTimerTitle.Start(); + }; + } + pauseTimerTitle.Interval = marqueePauseTime; + pauseTimerTitle.Start(); + } } else { @@ -92,13 +158,29 @@ namespace RadioDJViewer private void MarqueeTimerArtist_Tick(object sender, EventArgs e) { - int visibleChars = 30; // Adjust for label width + int visibleChars = 30; if (marqueeTextArtist.Length > visibleChars) { - string scrollText = marqueeTextArtist + " |"; + string separator = string.IsNullOrEmpty(marqueeSeparator) ? "" : marqueeSeparator; + string scrollText = marqueeTextArtist + separator; + string repeatedScrollText = scrollText + scrollText; marqueeOffsetArtist = (marqueeOffsetArtist + 1) % scrollText.Length; - string display = scrollText.Substring(marqueeOffsetArtist) + " " + scrollText.Substring(0, marqueeOffsetArtist); - label5.Text = display.Substring(0, Math.Min(visibleChars, display.Length)); + label5.Text = repeatedScrollText.Substring(marqueeOffsetArtist, visibleChars); + LogMessage($"MarqueeArtist: separator='{separator}', scrollText='{scrollText}', offset={marqueeOffsetArtist}"); + if (marqueeOffsetArtist == 0) + { + marqueeTimerArtist.Stop(); + if (pauseTimerArtist == null) + { + pauseTimerArtist = new Timer(); + pauseTimerArtist.Tick += (s, args) => { + pauseTimerArtist.Stop(); + marqueeTimerArtist.Start(); + }; + } + pauseTimerArtist.Interval = marqueePauseTime; + pauseTimerArtist.Start(); + } } else { @@ -108,13 +190,29 @@ namespace RadioDJViewer private void MarqueeTimerAlbum_Tick(object sender, EventArgs e) { - int visibleChars = 30; // Adjust for label width + int visibleChars = 30; if (marqueeTextAlbum.Length > visibleChars) { - string scrollText = marqueeTextAlbum + " |"; + string separator = string.IsNullOrEmpty(marqueeSeparator) ? "" : marqueeSeparator; + string scrollText = marqueeTextAlbum + separator; + string repeatedScrollText = scrollText + scrollText; marqueeOffsetAlbum = (marqueeOffsetAlbum + 1) % scrollText.Length; - string display = scrollText.Substring(marqueeOffsetAlbum) + " " + scrollText.Substring(0, marqueeOffsetAlbum); - label6.Text = display.Substring(0, Math.Min(visibleChars, display.Length)); + label6.Text = repeatedScrollText.Substring(marqueeOffsetAlbum, visibleChars); + LogMessage($"MarqueeAlbum: separator='{separator}', scrollText='{scrollText}', offset={marqueeOffsetAlbum}"); + if (marqueeOffsetAlbum == 0) + { + marqueeTimerAlbum.Stop(); + if (pauseTimerAlbum == null) + { + pauseTimerAlbum = new Timer(); + pauseTimerAlbum.Tick += (s, args) => { + pauseTimerAlbum.Stop(); + marqueeTimerAlbum.Start(); + }; + } + pauseTimerAlbum.Interval = marqueePauseTime; + pauseTimerAlbum.Start(); + } } else { @@ -208,8 +306,6 @@ namespace RadioDJViewer return; } string url = loadedProfile.UrlFormat; - // Debug: Show the URL before and after replacement - string debugBefore = url; if (!string.IsNullOrWhiteSpace(url)) { url = url.Replace("{ip}", loadedProfile.IP ?? "") @@ -223,8 +319,6 @@ namespace RadioDJViewer UpdateStatusBar(); return; } - string debugAfter = url; - MessageBox.Show($"Connecting to: {debugAfter}\n(Original: {debugBefore})", "Debug", MessageBoxButtons.OK, MessageBoxIcon.Information); try { var client = new System.Net.Http.HttpClient(); @@ -398,12 +492,16 @@ namespace RadioDJViewer { // Open settings/profile dialog var settingsForm = new Form1(); + settingsForm.ApplyTheme(isDarkMode); // Pass current color mode settingsForm.ShowDialog(); } private void aboutToolStripMenuItem_Click(object sender, EventArgs e) { - string version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(); + var assembly = System.Reflection.Assembly.GetExecutingAssembly(); + var versionAttr = assembly.GetCustomAttributes(typeof(System.Reflection.AssemblyFileVersionAttribute), false) + .OfType().FirstOrDefault(); + string version = versionAttr != null ? versionAttr.Version : assembly.GetName().Version.ToString(); string message = $"RadioDJViewer\nVersion: {version}\nGitHub: https://git.smartcraft.me/minster586/RadioDJViewer"; MessageBox.Show(message, "About RadioDJViewer", MessageBoxButtons.OK, MessageBoxIcon.Information); } @@ -426,8 +524,74 @@ namespace RadioDJViewer outputFolderPath = profile.OutputFolder; mainImagesFolderPath = profile.MainImagesFolder; // Update new field loadedProfile = profile; // Store loaded profile for REST API connection + // Update polling rate when profile is loaded + int pollingRate = loadedProfile?.PollingRateSeconds > 0 ? loadedProfile.PollingRateSeconds : 3; + apiTimer.Interval = pollingRate * 1000; + SetMarqueeScrollSpeed(profile.MarqueeScrollSpeed ?? "Medium"); + SetMarqueePauseTime(profile.MarqueePauseTime > 0 ? profile.MarqueePauseTime : 6); + SetMarqueeSeparator(profile.MarqueeSeparator ?? " | "); UpdateStatusBar(); // You can add more logic to update other fields if needed } + + private void Uicolor_Click(object sender, EventArgs e) + { + isDarkMode = !isDarkMode; + UpdateTheme(); + } + + private Bitmap InvertIcon(Bitmap original) + { + Bitmap inverted = new Bitmap(original.Width, original.Height); + for (int y = 0; y < original.Height; y++) + { + for (int x = 0; x < original.Width; x++) + { + Color pixel = original.GetPixel(x, y); + Color inv = Color.FromArgb(pixel.A, 255 - pixel.R, 255 - pixel.G, 255 - pixel.B); + inverted.SetPixel(x, y, inv); + } + } + return inverted; + } + + private void UpdateTheme() + { + // Set icon + Bitmap icon = isDarkMode ? Properties.Resources.MdiWeatherSunny : Properties.Resources.MdiWeatherNight; + // Invert sun icon for visibility in dark mode + if (isDarkMode && icon != null) + { + icon = InvertIcon(icon); + } + // Resize icon to fit button and center it + if (icon != null) + { + int btnW = uicolor.Width; + int btnH = uicolor.Height; + var resizedIcon = new Bitmap(icon, btnW - 8, btnH - 8); // Padding for centering + uicolor.Image = resizedIcon; + uicolor.ImageAlign = ContentAlignment.MiddleCenter; + } + // Set colors + Color backColor = isDarkMode ? Color.FromArgb(32, 32, 32) : SystemColors.Control; + Color foreColor = isDarkMode ? Color.White : SystemColors.ControlText; + this.BackColor = backColor; + this.ForeColor = foreColor; + foreach (Control c in this.Controls) + { + ApplyThemeRecursive(c, backColor, foreColor); + } + } + + private void ApplyThemeRecursive(Control control, Color backColor, Color foreColor) + { + control.BackColor = backColor; + control.ForeColor = foreColor; + foreach (Control child in control.Controls) + { + ApplyThemeRecursive(child, backColor, foreColor); + } + } } } diff --git a/RadioDJViewer/ProfileStorage.cs b/RadioDJViewer/ProfileStorage.cs index 1cd8ec5..7540234 100644 --- a/RadioDJViewer/ProfileStorage.cs +++ b/RadioDJViewer/ProfileStorage.cs @@ -16,6 +16,10 @@ namespace RadioDJViewer public string OutputFolder { get; set; } public string OutputImageName { get; set; } public string UrlFormat { get; set; } + public int PollingRateSeconds { get; set; } // Add polling rate property + public string MarqueeScrollSpeed { get; set; } // "Very Slow", etc. + public int MarqueePauseTime { get; set; } // in seconds + public string MarqueeSeparator { get; set; } // e.g. " | " } public static class ProfileStorage diff --git a/RadioDJViewer/Properties/AssemblyInfo.cs b/RadioDJViewer/Properties/AssemblyInfo.cs index 51bb6ee..39815c2 100644 --- a/RadioDJViewer/Properties/AssemblyInfo.cs +++ b/RadioDJViewer/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ using System.Runtime.InteropServices; // Build Number // Revision // -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyVersion("1.1.0")] +[assembly: AssemblyFileVersion("1.1.0")] diff --git a/RadioDJViewer/Properties/Resources.Designer.cs b/RadioDJViewer/Properties/Resources.Designer.cs index f66a41e..913995f 100644 --- a/RadioDJViewer/Properties/Resources.Designer.cs +++ b/RadioDJViewer/Properties/Resources.Designer.cs @@ -80,6 +80,26 @@ namespace RadioDJViewer.Properties { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap MdiWeatherNight { + get { + object obj = ResourceManager.GetObject("MdiWeatherNight", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap MdiWeatherSunny { + get { + object obj = ResourceManager.GetObject("MdiWeatherSunny", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/RadioDJViewer/Properties/Resources.resx b/RadioDJViewer/Properties/Resources.resx index b3f5f6c..ebb77c3 100644 --- a/RadioDJViewer/Properties/Resources.resx +++ b/RadioDJViewer/Properties/Resources.resx @@ -124,6 +124,12 @@ ..\Resources\green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\MdiWeatherNight.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\MdiWeatherSunny.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\red.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/RadioDJViewer/RadioDJViewer.csproj b/RadioDJViewer/RadioDJViewer.csproj index 88de877..8e79114 100644 --- a/RadioDJViewer/RadioDJViewer.csproj +++ b/RadioDJViewer/RadioDJViewer.csproj @@ -12,7 +12,7 @@ 512 true true - icon.ico + icon.ico AnyCPU @@ -109,6 +109,8 @@ + + \ No newline at end of file diff --git a/RadioDJViewer/Resources/MdiWeatherNight.png b/RadioDJViewer/Resources/MdiWeatherNight.png new file mode 100644 index 0000000000000000000000000000000000000000..0134ba408790ece5f7be124e3659ce471e86f4e4 GIT binary patch literal 27354 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 literal 0 HcmV?d00001 diff --git a/RadioDJViewer/Resources/MdiWeatherSunny.png b/RadioDJViewer/Resources/MdiWeatherSunny.png new file mode 100644 index 0000000000000000000000000000000000000000..8a77f7126740075b80882cbe76e5cee7d013074a GIT binary patch literal 24912 zcmY&<1ymJl_xGH`k(N}tySp2e4y8M!yIWcj3F&U7q@=r!AT4!JI;BLq8@}P*_x{)V z)|$m|X7*FNp8eaipNLnga*xqT&;bB=tRVkF9RQ%~I#d)>0=^8x9)Xe12OxW+eIxb{mU0OPkiHp(1DBoW zi>;f}DSHcA3-zTP$K{@--b%mpo$JfLe*JnEM0&>y!RPwtvWW>s3f?H4$I1*wOOrx} z$|=Q19H&LYd*34kqph^sJdk}*TE73C;WTuP;{sHnJUD)-hKLmBErW>6| z!Nh3A45rYBYYYd10zB4gFyjArlG*U0dn`ae&u0*(oJR)@Y^^Vttzv(Q=K{QXT{v4< zjdr1!9M-htG#vUXy+Osa>>LYdKpfPemCL|&O6#k9Y4N#26wri#v?rYy5AzO*L~C*_ zuNqu%ia`qA6(hM@r>$QZY}{su3lApkJ91G;Dnkl>LA7eFaTos=hyKpk3R{_q6_QJr z@_V6q3<6iBxiex5IeMOi^~XQ-FECJ+2G4+%3MrItU6W)A1G-2Vg4`kXXcw@00TE{# zC-Cjea%6ZES`ZxA9e~o(f z=$Q0)xj>=Ss`vPSqKU<8NbqR+R@t=h1HYvJsKl*xS%C~OApyX~GjaUygupqegA9#J zC_3i(hwEG+pHbNadLeK#0b{d |8l^}uq+U$fl*2r^_6jqP{|0_PDiwt}+bxj63- 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 z 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 KRNpCMLjMmCT2Q+H literal 0 HcmV?d00001 diff --git a/RadioDJViewer/radiodj-restapi-template.Designer.cs b/RadioDJViewer/radiodj-restapi-template.Designer.cs index 0f72d1e..53ccade 100644 --- a/RadioDJViewer/radiodj-restapi-template.Designer.cs +++ b/RadioDJViewer/radiodj-restapi-template.Designer.cs @@ -34,30 +34,40 @@ this.label1 = new System.Windows.Forms.Label(); this.button1 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.label6 = new System.Windows.Forms.Label(); - this.button6 = new System.Windows.Forms.Button(); - this.button5 = new System.Windows.Forms.Button(); - this.textBox6 = new System.Windows.Forms.TextBox(); - this.label11 = new System.Windows.Forms.Label(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.textBox3 = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.textBox4 = new System.Windows.Forms.TextBox(); + this.button3 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); this.groupBox3 = new System.Windows.Forms.GroupBox(); this.buttonSelectOutputFolder = new System.Windows.Forms.Button(); this.labelOutputFolderPath = new System.Windows.Forms.Label(); this.textBox5 = new System.Windows.Forms.TextBox(); this.label10 = new System.Windows.Forms.Label(); - this.button4 = new System.Windows.Forms.Button(); - this.button3 = new System.Windows.Forms.Button(); - this.textBox4 = new System.Windows.Forms.TextBox(); - this.label5 = new System.Windows.Forms.Label(); - this.textBox3 = new System.Windows.Forms.TextBox(); - this.label4 = new System.Windows.Forms.Label(); - this.textBox2 = new System.Windows.Forms.TextBox(); - this.label3 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.label11 = new System.Windows.Forms.Label(); + this.textBox6 = new System.Windows.Forms.TextBox(); + this.button5 = new System.Windows.Forms.Button(); + this.button6 = new System.Windows.Forms.Button(); + this.label6 = new System.Windows.Forms.Label(); + this.label7 = new System.Windows.Forms.Label(); + this.textBox7 = new System.Windows.Forms.TextBox(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.comboBoxScrollSpeed = new System.Windows.Forms.ComboBox(); + this.textBoxPauseTime = new System.Windows.Forms.TextBox(); + this.separatingcharacterformatbox = new System.Windows.Forms.TextBox(); + this.textBox9 = new System.Windows.Forms.TextBox(); + this.label9 = new System.Windows.Forms.Label(); + this.label8 = new System.Windows.Forms.Label(); + this.label12 = new System.Windows.Forms.Label(); + this.label13 = new System.Windows.Forms.Label(); this.groupBox1.SuspendLayout(); - this.groupBox2.SuspendLayout(); this.groupBox3.SuspendLayout(); + this.groupBox2.SuspendLayout(); this.SuspendLayout(); // // groupBox1 @@ -89,7 +99,7 @@ // // button1 // - this.button1.Location = new System.Drawing.Point(12, 569); + this.button1.Location = new System.Drawing.Point(35, 584); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(157, 23); this.button1.TabIndex = 1; @@ -98,20 +108,218 @@ // // button2 // - this.button2.Location = new System.Drawing.Point(259, 569); + this.button2.Location = new System.Drawing.Point(357, 584); this.button2.Name = "button2"; this.button2.Size = new System.Drawing.Size(157, 23); this.button2.TabIndex = 2; this.button2.Text = "Cancel"; this.button2.UseVisualStyleBackColor = true; // + // comboBox1 + // + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Location = new System.Drawing.Point(120, 27); + this.comboBox1.Name = "comboBox1"; + this.comboBox1.Size = new System.Drawing.Size(290, 21); + this.comboBox1.TabIndex = 0; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(20, 30); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(41, 13); + this.label2.TabIndex = 1; + this.label2.Text = "Profiles"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(20, 100); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(57, 13); + this.label3.TabIndex = 2; + this.label3.Text = "IP address"; + // + // textBox2 + // + this.textBox2.Location = new System.Drawing.Point(120, 97); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(290, 20); + this.textBox2.TabIndex = 3; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(20, 135); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(26, 13); + this.label4.TabIndex = 4; + this.label4.Text = "Port"; + // + // textBox3 + // + this.textBox3.Location = new System.Drawing.Point(120, 132); + this.textBox3.Name = "textBox3"; + this.textBox3.Size = new System.Drawing.Size(290, 20); + this.textBox3.TabIndex = 5; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(20, 170); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(53, 13); + this.label5.TabIndex = 6; + this.label5.Text = "Password"; + // + // textBox4 + // + this.textBox4.Location = new System.Drawing.Point(120, 167); + this.textBox4.Name = "textBox4"; + this.textBox4.Size = new System.Drawing.Size(290, 20); + this.textBox4.TabIndex = 7; + // + // button3 + // + this.button3.Location = new System.Drawing.Point(60, 419); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(120, 30); + this.button3.TabIndex = 8; + this.button3.Text = "Save Profile"; + this.button3.UseVisualStyleBackColor = true; + // + // button4 + // + this.button4.Location = new System.Drawing.Point(216, 419); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(120, 30); + this.button4.TabIndex = 9; + this.button4.Text = "Remove Profile"; + this.button4.UseVisualStyleBackColor = true; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.buttonSelectOutputFolder); + this.groupBox3.Controls.Add(this.labelOutputFolderPath); + this.groupBox3.Controls.Add(this.textBox5); + this.groupBox3.Controls.Add(this.label10); + this.groupBox3.Location = new System.Drawing.Point(20, 298); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(482, 115); + this.groupBox3.TabIndex = 12; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Output Setting"; + // + // buttonSelectOutputFolder + // + this.buttonSelectOutputFolder.Location = new System.Drawing.Point(20, 36); + this.buttonSelectOutputFolder.Name = "buttonSelectOutputFolder"; + this.buttonSelectOutputFolder.Size = new System.Drawing.Size(140, 23); + this.buttonSelectOutputFolder.TabIndex = 17; + this.buttonSelectOutputFolder.Text = "Select Output Folder"; + this.buttonSelectOutputFolder.UseVisualStyleBackColor = true; + // + // labelOutputFolderPath + // + this.labelOutputFolderPath.AutoSize = true; + this.labelOutputFolderPath.Location = new System.Drawing.Point(166, 41); + this.labelOutputFolderPath.Name = "labelOutputFolderPath"; + this.labelOutputFolderPath.Size = new System.Drawing.Size(93, 13); + this.labelOutputFolderPath.TabIndex = 16; + this.labelOutputFolderPath.Text = "No folder selected"; + // + // textBox5 + // + this.textBox5.Location = new System.Drawing.Point(149, 80); + this.textBox5.Name = "textBox5"; + this.textBox5.Size = new System.Drawing.Size(247, 20); + this.textBox5.TabIndex = 16; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Location = new System.Drawing.Point(17, 83); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(126, 13); + this.label10.TabIndex = 15; + this.label10.Text = "Output Image save name"; + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Location = new System.Drawing.Point(20, 65); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(67, 13); + this.label11.TabIndex = 14; + this.label11.Text = "Profile Name"; + // + // textBox6 + // + this.textBox6.Location = new System.Drawing.Point(120, 62); + this.textBox6.Name = "textBox6"; + this.textBox6.Size = new System.Drawing.Size(290, 20); + this.textBox6.TabIndex = 15; + // + // button5 + // + this.button5.Location = new System.Drawing.Point(382, 419); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(120, 30); + this.button5.TabIndex = 16; + this.button5.Text = "Load Profile"; + this.button5.UseVisualStyleBackColor = true; + // + // button6 + // + this.button6.Location = new System.Drawing.Point(23, 269); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(140, 23); + this.button6.TabIndex = 18; + this.button6.Text = "Select Main Image Folder"; + this.button6.UseVisualStyleBackColor = true; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(169, 274); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(93, 13); + this.label6.TabIndex = 19; + this.label6.Text = "No folder selected"; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(20, 211); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(124, 13); + this.label7.TabIndex = 20; + this.label7.Text = "Polling Rate (in seconds)"; + // + // textBox7 + // + this.textBox7.Location = new System.Drawing.Point(150, 208); + this.textBox7.Name = "textBox7"; + this.textBox7.Size = new System.Drawing.Size(63, 20); + this.textBox7.TabIndex = 21; + // // groupBox2 // + this.groupBox2.Controls.Add(this.label13); + this.groupBox2.Controls.Add(this.comboBoxScrollSpeed); + this.groupBox2.Controls.Add(this.textBoxPauseTime); + this.groupBox2.Controls.Add(this.separatingcharacterformatbox); + this.groupBox2.Controls.Add(this.textBox6); + this.groupBox2.Controls.Add(this.label11); + this.groupBox2.Controls.Add(this.textBox9); + this.groupBox2.Controls.Add(this.label9); + this.groupBox2.Controls.Add(this.label8); + this.groupBox2.Controls.Add(this.textBox7); + this.groupBox2.Controls.Add(this.label7); this.groupBox2.Controls.Add(this.label6); this.groupBox2.Controls.Add(this.button6); this.groupBox2.Controls.Add(this.button5); - this.groupBox2.Controls.Add(this.textBox6); - this.groupBox2.Controls.Add(this.label11); this.groupBox2.Controls.Add(this.groupBox3); this.groupBox2.Controls.Add(this.button4); this.groupBox2.Controls.Add(this.button3); @@ -130,184 +338,84 @@ this.groupBox2.TabStop = false; this.groupBox2.Text = "Profiles"; // - // label6 + // comboBoxScrollSpeed // - this.label6.AutoSize = true; - this.label6.Location = new System.Drawing.Point(177, 207); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(93, 13); - this.label6.TabIndex = 19; - this.label6.Text = "No folder selected"; + this.comboBoxScrollSpeed.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxScrollSpeed.FormattingEnabled = true; + this.comboBoxScrollSpeed.Items.AddRange(new object[] { + "Very Slow", + "Slow", + "Medium", + "Fast", + "Very Fast"}); + this.comboBoxScrollSpeed.Location = new System.Drawing.Point(382, 207); + this.comboBoxScrollSpeed.Name = "comboBoxScrollSpeed"; + this.comboBoxScrollSpeed.Size = new System.Drawing.Size(97, 21); + this.comboBoxScrollSpeed.TabIndex = 29; // - // button6 + // textBoxPauseTime // - this.button6.Location = new System.Drawing.Point(23, 202); - this.button6.Name = "button6"; - this.button6.Size = new System.Drawing.Size(140, 23); - this.button6.TabIndex = 18; - this.button6.Text = "Select Main Image Folder"; - this.button6.UseVisualStyleBackColor = true; + this.textBoxPauseTime.Location = new System.Drawing.Point(382, 237); + this.textBoxPauseTime.Name = "textBoxPauseTime"; + this.textBoxPauseTime.Size = new System.Drawing.Size(97, 20); + this.textBoxPauseTime.TabIndex = 30; // - // button5 + // separatingcharacterformatbox // - this.button5.Location = new System.Drawing.Point(322, 419); - this.button5.Name = "button5"; - this.button5.Size = new System.Drawing.Size(120, 30); - this.button5.TabIndex = 16; - this.button5.Text = "Load Profile"; - this.button5.UseVisualStyleBackColor = true; + this.separatingcharacterformatbox.Location = new System.Drawing.Point(164, 237); + this.separatingcharacterformatbox.Name = "separatingcharacterformatbox"; + this.separatingcharacterformatbox.Size = new System.Drawing.Size(49, 20); + this.separatingcharacterformatbox.TabIndex = 31; // - // textBox6 + // textBox9 // - this.textBox6.Location = new System.Drawing.Point(120, 62); - this.textBox6.Name = "textBox6"; - this.textBox6.Size = new System.Drawing.Size(290, 20); - this.textBox6.TabIndex = 15; + this.textBox9.Location = new System.Drawing.Point(382, 237); + this.textBox9.Name = "textBox9"; + this.textBox9.Size = new System.Drawing.Size(97, 20); + this.textBox9.TabIndex = 25; // - // label11 + // label9 // - this.label11.AutoSize = true; - this.label11.Location = new System.Drawing.Point(20, 65); - this.label11.Name = "label11"; - this.label11.Size = new System.Drawing.Size(67, 13); - this.label11.TabIndex = 14; - this.label11.Text = "Profile Name"; + this.label9.AutoSize = true; + this.label9.Location = new System.Drawing.Point(239, 240); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(119, 13); + this.label9.TabIndex = 24; + this.label9.Text = "Pause time (in seconds)"; // - // groupBox3 + // label8 // - this.groupBox3.Controls.Add(this.buttonSelectOutputFolder); - this.groupBox3.Controls.Add(this.labelOutputFolderPath); - this.groupBox3.Controls.Add(this.textBox5); - this.groupBox3.Controls.Add(this.label10); - this.groupBox3.Location = new System.Drawing.Point(20, 258); - this.groupBox3.Name = "groupBox3"; - this.groupBox3.Size = new System.Drawing.Size(482, 135); - this.groupBox3.TabIndex = 12; - this.groupBox3.TabStop = false; - this.groupBox3.Text = "Output Setting"; + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(239, 211); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(127, 13); + this.label8.TabIndex = 22; + this.label8.Text = "Scroll Speed (in Main UI)"; + this.label8.Click += new System.EventHandler(this.label8_Click); // - // buttonSelectOutputFolder + // label12 // - this.buttonSelectOutputFolder.Location = new System.Drawing.Point(20, 36); - this.buttonSelectOutputFolder.Name = "buttonSelectOutputFolder"; - this.buttonSelectOutputFolder.Size = new System.Drawing.Size(140, 23); - this.buttonSelectOutputFolder.TabIndex = 17; - this.buttonSelectOutputFolder.Text = "Select Output Folder"; - this.buttonSelectOutputFolder.UseVisualStyleBackColor = true; + this.label12.AutoSize = true; + this.label12.Location = new System.Drawing.Point(20, 240); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(138, 13); + this.label12.TabIndex = 27; + this.label12.Text = "Separating character format"; // - // labelOutputFolderPath + // label13 // - this.labelOutputFolderPath.AutoSize = true; - this.labelOutputFolderPath.Location = new System.Drawing.Point(187, 46); - this.labelOutputFolderPath.Name = "labelOutputFolderPath"; - this.labelOutputFolderPath.Size = new System.Drawing.Size(93, 13); - this.labelOutputFolderPath.TabIndex = 16; - this.labelOutputFolderPath.Text = "No folder selected"; - // - // textBox5 - // - this.textBox5.Location = new System.Drawing.Point(72, 87); - this.textBox5.Name = "textBox5"; - this.textBox5.Size = new System.Drawing.Size(350, 20); - this.textBox5.TabIndex = 16; - // - // label10 - // - this.label10.AutoSize = true; - this.label10.Location = new System.Drawing.Point(157, 71); - this.label10.Name = "label10"; - this.label10.Size = new System.Drawing.Size(181, 13); - this.label10.TabIndex = 15; - this.label10.Text = "Output Image save name and loction"; - // - // button4 - // - this.button4.Location = new System.Drawing.Point(180, 419); - this.button4.Name = "button4"; - this.button4.Size = new System.Drawing.Size(120, 30); - this.button4.TabIndex = 9; - this.button4.Text = "Remove Profile"; - this.button4.UseVisualStyleBackColor = true; - // - // button3 - // - this.button3.Location = new System.Drawing.Point(40, 419); - this.button3.Name = "button3"; - this.button3.Size = new System.Drawing.Size(120, 30); - this.button3.TabIndex = 8; - this.button3.Text = "Save Profile"; - this.button3.UseVisualStyleBackColor = true; - // - // textBox4 - // - this.textBox4.Location = new System.Drawing.Point(120, 167); - this.textBox4.Name = "textBox4"; - this.textBox4.Size = new System.Drawing.Size(290, 20); - this.textBox4.TabIndex = 7; - // - // label5 - // - this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(20, 170); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(53, 13); - this.label5.TabIndex = 6; - this.label5.Text = "Password"; - // - // textBox3 - // - this.textBox3.Location = new System.Drawing.Point(120, 132); - this.textBox3.Name = "textBox3"; - this.textBox3.Size = new System.Drawing.Size(290, 20); - this.textBox3.TabIndex = 5; - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(20, 135); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(26, 13); - this.label4.TabIndex = 4; - this.label4.Text = "Port"; - // - // textBox2 - // - this.textBox2.Location = new System.Drawing.Point(120, 97); - this.textBox2.Name = "textBox2"; - this.textBox2.Size = new System.Drawing.Size(290, 20); - this.textBox2.TabIndex = 3; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(20, 100); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(57, 13); - this.label3.TabIndex = 2; - this.label3.Text = "IP address"; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(20, 30); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(41, 13); - this.label2.TabIndex = 1; - this.label2.Text = "Profiles"; - // - // comboBox1 - // - this.comboBox1.FormattingEnabled = true; - this.comboBox1.Location = new System.Drawing.Point(120, 27); - this.comboBox1.Name = "comboBox1"; - this.comboBox1.Size = new System.Drawing.Size(290, 21); - this.comboBox1.TabIndex = 0; + this.label13.AutoSize = true; + this.label13.Location = new System.Drawing.Point(20, 240); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(142, 13); + this.label13.TabIndex = 32; + this.label13.Text = "Separating Character Format"; // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(543, 604); + this.ClientSize = new System.Drawing.Size(543, 619); this.Controls.Add(this.groupBox2); this.Controls.Add(this.button2); this.Controls.Add(this.button1); @@ -317,10 +425,10 @@ this.Text = "Settings"; this.groupBox1.ResumeLayout(false); this.groupBox1.PerformLayout(); - this.groupBox2.ResumeLayout(false); - this.groupBox2.PerformLayout(); this.groupBox3.ResumeLayout(false); this.groupBox3.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); this.ResumeLayout(false); } @@ -332,26 +440,38 @@ private System.Windows.Forms.Label label1; private System.Windows.Forms.Button button1; private System.Windows.Forms.Button button2; - private System.Windows.Forms.GroupBox groupBox2; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.Label label2; private System.Windows.Forms.ComboBox comboBox1; - private System.Windows.Forms.Button button4; - private System.Windows.Forms.Button button3; - private System.Windows.Forms.TextBox textBox4; - private System.Windows.Forms.Label label5; - private System.Windows.Forms.TextBox textBox3; - private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox textBox3; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox textBox4; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button4; private System.Windows.Forms.GroupBox groupBox3; private System.Windows.Forms.Button buttonSelectOutputFolder; private System.Windows.Forms.Label labelOutputFolderPath; private System.Windows.Forms.TextBox textBox5; private System.Windows.Forms.Label label10; - private System.Windows.Forms.Button button5; - private System.Windows.Forms.TextBox textBox6; private System.Windows.Forms.Label label11; - private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox textBox6; + private System.Windows.Forms.Button button5; private System.Windows.Forms.Button button6; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.TextBox textBox7; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.TextBox textBox9; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.ComboBox comboBox2; + private System.Windows.Forms.TextBox textBox8; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.ComboBox comboBoxScrollSpeed; + private System.Windows.Forms.TextBox textBoxPauseTime; + private System.Windows.Forms.TextBox separatingcharacterformatbox; + private System.Windows.Forms.Label label13; } } \ No newline at end of file diff --git a/RadioDJViewer/radiodj-restapi-template.cs b/RadioDJViewer/radiodj-restapi-template.cs index 493f7dc..c14478b 100644 --- a/RadioDJViewer/radiodj-restapi-template.cs +++ b/RadioDJViewer/radiodj-restapi-template.cs @@ -19,6 +19,16 @@ namespace RadioDJViewer public Form1() { InitializeComponent(); + textBox4.UseSystemPasswordChar = true; // Obscure password field + comboBoxScrollSpeed.Items.Clear(); + comboBoxScrollSpeed.Items.AddRange(new object[] { + "Very Slow", + "Slow", + "Medium", + "Fast", + "Very Fast" + }); + comboBoxScrollSpeed.SelectedItem = "Medium"; this.buttonSelectOutputFolder.Click += ButtonSelectOutputFolder_Click; this.button6.Click += ButtonSelectMainImagesFolder_Click; this.button3.Click += button3_Click; @@ -64,6 +74,11 @@ namespace RadioDJViewer label6.Text = mainImagesFolderPath; textBox5.Text = profile.OutputImageName; textBox1.Text = profile.UrlFormat; + // Default polling rate to 3 if missing or zero + textBox7.Text = (profile.PollingRateSeconds > 0 ? profile.PollingRateSeconds : 3).ToString(); + comboBoxScrollSpeed.SelectedItem = profile.MarqueeScrollSpeed ?? "Medium"; + textBoxPauseTime.Text = profile.MarqueePauseTime > 0 ? profile.MarqueePauseTime.ToString() : "6"; + separatingcharacterformatbox.Text = profile.MarqueeSeparator ?? " | "; } } } @@ -100,6 +115,8 @@ namespace RadioDJViewer MessageBox.Show("Profile name is required.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } + int pollingRate = 3; + int.TryParse(textBox7.Text, out pollingRate); var profile = new Profile { Name = textBox6.Text, @@ -109,7 +126,11 @@ namespace RadioDJViewer OutputFolder = outputFolderPath, MainImagesFolder = mainImagesFolderPath, OutputImageName = textBox5.Text, - UrlFormat = textBox1.Text + UrlFormat = textBox1.Text, + PollingRateSeconds = pollingRate, + MarqueeScrollSpeed = comboBoxScrollSpeed.SelectedItem?.ToString() ?? "Medium", + MarqueePauseTime = int.TryParse(textBoxPauseTime.Text, out int pt) ? pt : 6, + MarqueeSeparator = separatingcharacterformatbox.Text }; ProfileStorage.SaveProfile(profile); // Refresh profile list @@ -171,5 +192,32 @@ namespace RadioDJViewer // Cancel (bottom Cancel button) - close the settings window without saving this.Close(); } + + private void label8_Click(object sender, EventArgs e) + { + + } + + public void ApplyTheme(bool darkMode) + { + Color backColor = darkMode ? Color.FromArgb(32, 32, 32) : SystemColors.Control; + Color foreColor = darkMode ? Color.White : SystemColors.ControlText; + this.BackColor = backColor; + this.ForeColor = foreColor; + foreach (Control c in this.Controls) + { + ApplyThemeRecursive(c, backColor, foreColor); + } + } + + private void ApplyThemeRecursive(Control control, Color backColor, Color foreColor) + { + control.BackColor = backColor; + control.ForeColor = foreColor; + foreach (Control child in control.Controls) + { + ApplyThemeRecursive(child, backColor, foreColor); + } + } } }