7 Commits
5 changed files with 435 additions and 565 deletions
+91 -84
View File
@@ -43,11 +43,14 @@
this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.groupBox1 = new System.Windows.Forms.GroupBox(); this.groupBox1 = new System.Windows.Forms.GroupBox();
this.time_data_label = new System.Windows.Forms.Label();
this.label9 = new System.Windows.Forms.Label();
this.time_label = new System.Windows.Forms.Label();
this.label8 = new System.Windows.Forms.Label(); this.label8 = new System.Windows.Forms.Label();
this.label7 = new System.Windows.Forms.Label(); this.label7 = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label(); this.album_data = new System.Windows.Forms.Label();
this.label5 = new System.Windows.Forms.Label(); this.artist_data = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label(); this.title_data = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label(); this.label3 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label();
@@ -58,9 +61,6 @@
this.profile_drop_box = new System.Windows.Forms.ComboBox(); this.profile_drop_box = new System.Windows.Forms.ComboBox();
this.profile_label = new System.Windows.Forms.Label(); this.profile_label = new System.Windows.Forms.Label();
this.load_profile_button = new System.Windows.Forms.Button(); this.load_profile_button = new System.Windows.Forms.Button();
this.time_label = new System.Windows.Forms.Label();
this.label9 = new System.Windows.Forms.Label();
this.time_data_label = new System.Windows.Forms.Label();
this.statusStrip1.SuspendLayout(); this.statusStrip1.SuspendLayout();
this.menuStrip2.SuspendLayout(); this.menuStrip2.SuspendLayout();
this.groupBox1.SuspendLayout(); this.groupBox1.SuspendLayout();
@@ -74,9 +74,9 @@
this.toolStripStatusLabel2, this.toolStripStatusLabel2,
this.toolStripStatusLabel4, this.toolStripStatusLabel4,
this.toolStripStatusLabel3}); this.toolStripStatusLabel3});
this.statusStrip1.Location = new System.Drawing.Point(0, 362); this.statusStrip1.Location = new System.Drawing.Point(0, 309);
this.statusStrip1.Name = "statusStrip1"; this.statusStrip1.Name = "statusStrip1";
this.statusStrip1.Size = new System.Drawing.Size(612, 26); this.statusStrip1.Size = new System.Drawing.Size(780, 26);
this.statusStrip1.TabIndex = 0; this.statusStrip1.TabIndex = 0;
this.statusStrip1.Text = "statusStrip1"; this.statusStrip1.Text = "statusStrip1";
// //
@@ -99,7 +99,7 @@
// //
this.toolStripStatusLabel4.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.toolStripStatusLabel4.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.toolStripStatusLabel4.Name = "toolStripStatusLabel4"; this.toolStripStatusLabel4.Name = "toolStripStatusLabel4";
this.toolStripStatusLabel4.Size = new System.Drawing.Size(260, 21); this.toolStripStatusLabel4.Size = new System.Drawing.Size(344, 21);
this.toolStripStatusLabel4.Spring = true; this.toolStripStatusLabel4.Spring = true;
this.toolStripStatusLabel4.Text = "Profile:"; this.toolStripStatusLabel4.Text = "Profile:";
this.toolStripStatusLabel4.Click += new System.EventHandler(this.toolStripStatusLabel4_Click); this.toolStripStatusLabel4.Click += new System.EventHandler(this.toolStripStatusLabel4_Click);
@@ -107,7 +107,7 @@
// toolStripStatusLabel3 // toolStripStatusLabel3
// //
this.toolStripStatusLabel3.Name = "toolStripStatusLabel3"; this.toolStripStatusLabel3.Name = "toolStripStatusLabel3";
this.toolStripStatusLabel3.Size = new System.Drawing.Size(260, 21); this.toolStripStatusLabel3.Size = new System.Drawing.Size(344, 21);
this.toolStripStatusLabel3.Spring = true; this.toolStripStatusLabel3.Spring = true;
this.toolStripStatusLabel3.Text = "Song Changed Updateing"; this.toolStripStatusLabel3.Text = "Song Changed Updateing";
this.toolStripStatusLabel3.TextAlign = System.Drawing.ContentAlignment.MiddleRight; this.toolStripStatusLabel3.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
@@ -119,7 +119,7 @@
this.aboutToolStripMenuItem}); this.aboutToolStripMenuItem});
this.menuStrip2.Location = new System.Drawing.Point(0, 0); this.menuStrip2.Location = new System.Drawing.Point(0, 0);
this.menuStrip2.Name = "menuStrip2"; this.menuStrip2.Name = "menuStrip2";
this.menuStrip2.Size = new System.Drawing.Size(612, 25); this.menuStrip2.Size = new System.Drawing.Size(780, 25);
this.menuStrip2.TabIndex = 2; this.menuStrip2.TabIndex = 2;
this.menuStrip2.Text = "menuStrip2"; this.menuStrip2.Text = "menuStrip2";
// //
@@ -183,28 +183,59 @@
this.groupBox1.Controls.Add(this.time_label); this.groupBox1.Controls.Add(this.time_label);
this.groupBox1.Controls.Add(this.label8); this.groupBox1.Controls.Add(this.label8);
this.groupBox1.Controls.Add(this.label7); this.groupBox1.Controls.Add(this.label7);
this.groupBox1.Controls.Add(this.label6); this.groupBox1.Controls.Add(this.album_data);
this.groupBox1.Controls.Add(this.label5); this.groupBox1.Controls.Add(this.artist_data);
this.groupBox1.Controls.Add(this.label4); this.groupBox1.Controls.Add(this.title_data);
this.groupBox1.Controls.Add(this.label3); this.groupBox1.Controls.Add(this.label3);
this.groupBox1.Controls.Add(this.label2); this.groupBox1.Controls.Add(this.label2);
this.groupBox1.Controls.Add(this.label1); this.groupBox1.Controls.Add(this.label1);
this.groupBox1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.groupBox1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.groupBox1.Location = new System.Drawing.Point(199, 37); this.groupBox1.Location = new System.Drawing.Point(199, 37);
this.groupBox1.Name = "groupBox1"; this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(390, 205); this.groupBox1.Size = new System.Drawing.Size(569, 205);
this.groupBox1.TabIndex = 4; this.groupBox1.TabIndex = 4;
this.groupBox1.TabStop = false; this.groupBox1.TabStop = false;
this.groupBox1.Text = "Song Info"; this.groupBox1.Text = "Song Info";
// //
// time_data_label
//
this.time_data_label.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.time_data_label.Location = new System.Drawing.Point(101, 159);
this.time_data_label.Name = "time_data_label";
this.time_data_label.Size = new System.Drawing.Size(437, 21);
this.time_data_label.TabIndex = 10;
this.time_data_label.Text = "No Data";
this.time_data_label.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// label9
//
this.label9.AutoSize = true;
this.label9.Location = new System.Drawing.Point(17, 144);
this.label9.Name = "label9";
this.label9.Size = new System.Drawing.Size(539, 16);
this.label9.TabIndex = 9;
this.label9.Text = "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――";
this.label9.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
//
// time_label
//
this.time_label.AutoSize = true;
this.time_label.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Underline))), System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.time_label.Location = new System.Drawing.Point(20, 157);
this.time_label.Name = "time_label";
this.time_label.Size = new System.Drawing.Size(63, 24);
this.time_label.TabIndex = 8;
this.time_label.Text = "Time:";
this.time_label.Click += new System.EventHandler(this.label9_Click);
//
// label8 // label8
// //
this.label8.AutoSize = true; this.label8.AutoSize = true;
this.label8.Location = new System.Drawing.Point(20, 103); this.label8.Location = new System.Drawing.Point(20, 103);
this.label8.Name = "label8"; this.label8.Name = "label8";
this.label8.Size = new System.Drawing.Size(357, 16); this.label8.Size = new System.Drawing.Size(539, 16);
this.label8.TabIndex = 7; this.label8.TabIndex = 7;
this.label8.Text = "――――――――――――――――――――――――――――――――――――――――――――――――――"; this.label8.Text = "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――";
this.label8.TextAlign = System.Drawing.ContentAlignment.BottomCenter; this.label8.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
// //
// label7 // label7
@@ -212,39 +243,46 @@
this.label7.AutoSize = true; this.label7.AutoSize = true;
this.label7.Location = new System.Drawing.Point(19, 61); this.label7.Location = new System.Drawing.Point(19, 61);
this.label7.Name = "label7"; this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(357, 16); this.label7.Size = new System.Drawing.Size(539, 16);
this.label7.TabIndex = 6; this.label7.TabIndex = 6;
this.label7.Text = "――――――――――――――――――――――――――――――――――――――――――――――――――"; this.label7.Text = "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――";
this.label7.Click += new System.EventHandler(this.label7_Click_1);
// //
// label6 // album_data
// //
this.label6.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.album_data.AutoEllipsis = true;
this.label6.Location = new System.Drawing.Point(99, 121); this.album_data.AutoSize = false;
this.label6.Name = "label6"; this.album_data.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label6.Size = new System.Drawing.Size(266, 17); this.album_data.Location = new System.Drawing.Point(100, 119);
this.label6.TabIndex = 5; this.album_data.Name = "album_data";
this.label6.Text = "No album"; this.album_data.Size = new System.Drawing.Size(443, 19);
this.label6.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; this.album_data.TabIndex = 5;
this.album_data.Text = "No album";
this.album_data.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
// //
// label5 // artist_data
// //
this.label5.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.artist_data.AutoEllipsis = true;
this.label5.Location = new System.Drawing.Point(99, 76); this.artist_data.AutoSize = false;
this.label5.Name = "label5"; this.artist_data.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label5.Size = new System.Drawing.Size(266, 17); this.artist_data.Location = new System.Drawing.Point(99, 76);
this.label5.TabIndex = 4; this.artist_data.Name = "artist_data";
this.label5.Text = "No artist"; this.artist_data.Size = new System.Drawing.Size(433, 23);
this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; this.artist_data.TabIndex = 4;
this.artist_data.Text = "No artist";
this.artist_data.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
// //
// label4 // title_data
// //
this.label4.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.title_data.AutoEllipsis = true;
this.label4.Location = new System.Drawing.Point(99, 33); this.title_data.AutoSize = false;
this.label4.Name = "label4"; this.title_data.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label4.Size = new System.Drawing.Size(266, 16); this.title_data.Location = new System.Drawing.Point(97, 33);
this.label4.TabIndex = 3; this.title_data.Name = "title_data";
this.label4.Text = "No title"; this.title_data.Size = new System.Drawing.Size(443, 20);
this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; this.title_data.TabIndex = 3;
this.title_data.Text = "No title";
this.title_data.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
// //
// label3 // label3
// //
@@ -278,7 +316,7 @@
// //
// button1 // button1
// //
this.button1.Location = new System.Drawing.Point(62, 281); this.button1.Location = new System.Drawing.Point(425, 254);
this.button1.Name = "button1"; this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(99, 42); this.button1.Size = new System.Drawing.Size(99, 42);
this.button1.TabIndex = 5; this.button1.TabIndex = 5;
@@ -288,7 +326,7 @@
// //
// button2 // button2
// //
this.button2.Location = new System.Drawing.Point(180, 281); this.button2.Location = new System.Drawing.Point(577, 253);
this.button2.Name = "button2"; this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(99, 42); this.button2.Size = new System.Drawing.Size(99, 42);
this.button2.TabIndex = 6; this.button2.TabIndex = 6;
@@ -299,7 +337,7 @@
// uicolor // uicolor
// //
this.uicolor.Image = global::RadioDJViewer.Properties.Resources.MdiWeatherNight; this.uicolor.Image = global::RadioDJViewer.Properties.Resources.MdiWeatherNight;
this.uicolor.Location = new System.Drawing.Point(572, 327); this.uicolor.Location = new System.Drawing.Point(740, 262);
this.uicolor.Name = "uicolor"; this.uicolor.Name = "uicolor";
this.uicolor.Size = new System.Drawing.Size(28, 23); this.uicolor.Size = new System.Drawing.Size(28, 23);
this.uicolor.TabIndex = 7; this.uicolor.TabIndex = 7;
@@ -316,7 +354,7 @@
// profile_drop_box // profile_drop_box
// //
this.profile_drop_box.FormattingEnabled = true; this.profile_drop_box.FormattingEnabled = true;
this.profile_drop_box.Location = new System.Drawing.Point(62, 329); this.profile_drop_box.Location = new System.Drawing.Point(62, 268);
this.profile_drop_box.Name = "profile_drop_box"; this.profile_drop_box.Name = "profile_drop_box";
this.profile_drop_box.Size = new System.Drawing.Size(217, 21); this.profile_drop_box.Size = new System.Drawing.Size(217, 21);
this.profile_drop_box.TabIndex = 8; this.profile_drop_box.TabIndex = 8;
@@ -324,7 +362,7 @@
// profile_label // profile_label
// //
this.profile_label.AutoSize = true; this.profile_label.AutoSize = true;
this.profile_label.Location = new System.Drawing.Point(12, 332); this.profile_label.Location = new System.Drawing.Point(12, 272);
this.profile_label.Name = "profile_label"; this.profile_label.Name = "profile_label";
this.profile_label.Size = new System.Drawing.Size(44, 13); this.profile_label.Size = new System.Drawing.Size(44, 13);
this.profile_label.TabIndex = 9; this.profile_label.TabIndex = 9;
@@ -333,49 +371,18 @@
// //
// load_profile_button // load_profile_button
// //
this.load_profile_button.Location = new System.Drawing.Point(285, 327); this.load_profile_button.Location = new System.Drawing.Point(292, 267);
this.load_profile_button.Name = "load_profile_button"; this.load_profile_button.Name = "load_profile_button";
this.load_profile_button.Size = new System.Drawing.Size(75, 23); this.load_profile_button.Size = new System.Drawing.Size(75, 23);
this.load_profile_button.TabIndex = 10; this.load_profile_button.TabIndex = 10;
this.load_profile_button.Text = "Load Profile"; this.load_profile_button.Text = "Load Profile";
this.load_profile_button.UseVisualStyleBackColor = true; this.load_profile_button.UseVisualStyleBackColor = true;
// //
// time_label
//
this.time_label.AutoSize = true;
this.time_label.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Underline))), System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.time_label.Location = new System.Drawing.Point(20, 157);
this.time_label.Name = "time_label";
this.time_label.Size = new System.Drawing.Size(63, 24);
this.time_label.TabIndex = 8;
this.time_label.Text = "Time:";
this.time_label.Click += new System.EventHandler(this.label9_Click);
//
// label9
//
this.label9.AutoSize = true;
this.label9.Location = new System.Drawing.Point(17, 144);
this.label9.Name = "label9";
this.label9.Size = new System.Drawing.Size(357, 16);
this.label9.TabIndex = 9;
this.label9.Text = "――――――――――――――――――――――――――――――――――――――――――――――――――";
this.label9.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
//
// time_data_label
//
this.time_data_label.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.time_data_label.Location = new System.Drawing.Point(97, 160);
this.time_data_label.Name = "time_data_label";
this.time_data_label.Size = new System.Drawing.Size(266, 17);
this.time_data_label.TabIndex = 10;
this.time_data_label.Text = "No Data";
this.time_data_label.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// Main // Main
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(612, 388); this.ClientSize = new System.Drawing.Size(780, 335);
this.Controls.Add(this.load_profile_button); this.Controls.Add(this.load_profile_button);
this.Controls.Add(this.profile_label); this.Controls.Add(this.profile_label);
this.Controls.Add(this.profile_drop_box); this.Controls.Add(this.profile_drop_box);
@@ -415,9 +422,9 @@
private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem;
private System.Windows.Forms.PictureBox pictureBox1; private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.GroupBox groupBox1; private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.Label label6; private System.Windows.Forms.Label album_data;
private System.Windows.Forms.Label label5; private System.Windows.Forms.Label artist_data;
private System.Windows.Forms.Label label4; private System.Windows.Forms.Label title_data;
private System.Windows.Forms.Label label3; private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1; private System.Windows.Forms.Label label1;
+315 -355
View File
@@ -25,6 +25,8 @@ namespace RadioDJViewer
{ {
private string _currentTrackKey = string.Empty; private string _currentTrackKey = string.Empty;
private string _playbackTrackKey = string.Empty; private string _playbackTrackKey = string.Empty;
private string _previousToastTitle = string.Empty;
private string _previousToastArtist = string.Empty;
private double _playbackElapsedSeconds = 0; private double _playbackElapsedSeconds = 0;
private double _playbackDurationSeconds = 0; private double _playbackDurationSeconds = 0;
private bool _playbackPaused = true; private bool _playbackPaused = true;
@@ -32,10 +34,13 @@ namespace RadioDJViewer
private string selectedFolderPath = string.Empty; private string selectedFolderPath = string.Empty;
private string outputFolderPath = string.Empty; private string outputFolderPath = string.Empty;
private bool isConnected = false; private bool isConnected = false;
private bool _isDisconnecting = false;
private CancellationTokenSource _connectionCts = new CancellationTokenSource();
private string currentProfile = "Default"; private string currentProfile = "Default";
private string currentSongImagePath = string.Empty; // Path to the current song image private string currentSongImagePath = string.Empty; // Path to the current song image
private string defaultImagePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "default.jpg"); private string defaultImagePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "default.jpg");
private string mainImagesFolderPath = string.Empty; // New field for main images folder path private string mainImagesFolderPath = string.Empty; // New field for main images folder path
private string _lastToastImagePath = string.Empty;
private Profile loadedProfile = null; // Field to store the loaded profile private Profile loadedProfile = null; // Field to store the loaded profile
private WidgetServer widgetServer = null; // Local widget HTTP server private WidgetServer widgetServer = null; // Local widget HTTP server
private bool widgetRunning = false; private bool widgetRunning = false;
@@ -46,23 +51,6 @@ namespace RadioDJViewer
private System.Windows.Forms.Timer playbackTimer; private System.Windows.Forms.Timer playbackTimer;
private string lastApiXml = null; private string lastApiXml = null;
private System.Windows.Forms.Timer marqueeTimerTitle;
private System.Windows.Forms.Timer marqueeTimerArtist;
private System.Windows.Forms.Timer marqueeTimerAlbum;
private int marqueeOffsetTitle = 0;
private int marqueeOffsetArtist = 0;
private int marqueeOffsetAlbum = 0;
private string marqueeTextTitle = "";
private string marqueeTextArtist = "";
private string marqueeTextAlbum = "";
private System.Windows.Forms.Timer pauseTimerTitle;
private System.Windows.Forms.Timer pauseTimerArtist;
private System.Windows.Forms.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 bool loggingEnabled = false;
private string logFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "RadioDJViewer.log"); private string logFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "RadioDJViewer.log");
@@ -79,23 +67,24 @@ namespace RadioDJViewer
playbackTimer = new System.Windows.Forms.Timer(); playbackTimer = new System.Windows.Forms.Timer();
playbackTimer.Interval = 250; playbackTimer.Interval = 250;
playbackTimer.Tick += PlaybackTimer_Tick; playbackTimer.Tick += PlaybackTimer_Tick;
// Marquee timers for each label
marqueeTimerTitle = new System.Windows.Forms.Timer();
marqueeTimerTitle.Interval = marqueeScrollSpeed;
marqueeTimerTitle.Tick += MarqueeTimerTitle_Tick;
marqueeTimerArtist = new System.Windows.Forms.Timer();
marqueeTimerArtist.Interval = marqueeScrollSpeed;
marqueeTimerArtist.Tick += MarqueeTimerArtist_Tick;
marqueeTimerAlbum = new System.Windows.Forms.Timer();
marqueeTimerAlbum.Interval = marqueeScrollSpeed;
marqueeTimerAlbum.Tick += MarqueeTimerAlbum_Tick;
// Wire up dark mode button // Wire up dark mode button
this.uicolor.Click += Uicolor_Click; this.uicolor.Click += Uicolor_Click;
this.load_profile_button.Click += load_profile_button_Click; this.load_profile_button.Click += load_profile_button_Click;
PopulateProfileDropBox(); PopulateProfileDropBox();
UpdateTheme(); UpdateTheme();
// Auto-load profiles if profiles.json exists }
AutoLoadProfiles();
public void SetSongMetadataLabels(string title, string artist, string album)
{
if (InvokeRequired)
{
BeginInvoke((Action)(() => SetSongMetadataLabels(title, artist, album)));
return;
}
title_data.Text = title;
artist_data.Text = artist;
album_data.Text = album;
} }
private void EnsureDefaultImageExists() private void EnsureDefaultImageExists()
@@ -111,32 +100,6 @@ 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) private void LogMessage(string message)
{ {
if (!loggingEnabled) return; if (!loggingEnabled) return;
@@ -147,121 +110,6 @@ namespace RadioDJViewer
catch { } catch { }
} }
private int GetVisibleChars(Label label)
{
// Use the label's actual width and font to estimate visible characters
using (Graphics g = label.CreateGraphics())
{
// Use the full label width for measurement
SizeF size = g.MeasureString("W", label.Font);
int chars = (int)(label.Width / size.Width);
// If the label is single-line, ensure we use the full width
return Math.Max(chars, 1);
}
}
private void SetLabelTextFull(Label label, string text)
{
// Always set the full text, and let marquee logic handle scrolling
label.Text = text;
}
private void MarqueeTimerTitle_Tick(object sender, EventArgs e)
{
int visibleChars = GetVisibleChars(label4);
if (marqueeTextTitle.Length > visibleChars)
{
string separator = string.IsNullOrEmpty(marqueeSeparator) ? "" : marqueeSeparator;
string scrollText = marqueeTextTitle + separator;
string repeatedScrollText = scrollText + scrollText;
marqueeOffsetTitle = (marqueeOffsetTitle + 1) % scrollText.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 System.Windows.Forms.Timer();
pauseTimerTitle.Tick += (s, args) => {
pauseTimerTitle.Stop();
marqueeTimerTitle.Start();
};
}
pauseTimerTitle.Interval = marqueePauseTime;
pauseTimerTitle.Start();
}
}
else
{
SetLabelTextFull(label4, marqueeTextTitle);
}
}
private void MarqueeTimerArtist_Tick(object sender, EventArgs e)
{
int visibleChars = GetVisibleChars(label5);
if (marqueeTextArtist.Length > visibleChars)
{
string separator = string.IsNullOrEmpty(marqueeSeparator) ? "" : marqueeSeparator;
string scrollText = marqueeTextArtist + separator;
string repeatedScrollText = scrollText + scrollText;
marqueeOffsetArtist = (marqueeOffsetArtist + 1) % scrollText.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 System.Windows.Forms.Timer();
pauseTimerArtist.Tick += (s, args) => {
pauseTimerArtist.Stop();
marqueeTimerArtist.Start();
};
}
pauseTimerArtist.Interval = marqueePauseTime;
pauseTimerArtist.Start();
}
}
else
{
SetLabelTextFull(label5, marqueeTextArtist);
}
}
private void MarqueeTimerAlbum_Tick(object sender, EventArgs e)
{
int visibleChars = GetVisibleChars(label6);
if (marqueeTextAlbum.Length > visibleChars)
{
string separator = string.IsNullOrEmpty(marqueeSeparator) ? "" : marqueeSeparator;
string scrollText = marqueeTextAlbum + separator;
string repeatedScrollText = scrollText + scrollText;
marqueeOffsetAlbum = (marqueeOffsetAlbum + 1) % scrollText.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 System.Windows.Forms.Timer();
pauseTimerAlbum.Tick += (s, args) => {
pauseTimerAlbum.Stop();
marqueeTimerAlbum.Start();
};
}
pauseTimerAlbum.Interval = marqueePauseTime;
pauseTimerAlbum.Start();
}
}
else
{
SetLabelTextFull(label6, marqueeTextAlbum);
}
}
private void ApiTimer_Tick(object sender, EventArgs e) private void ApiTimer_Tick(object sender, EventArgs e)
{ {
if (isConnected) if (isConnected)
@@ -272,7 +120,7 @@ namespace RadioDJViewer
private async Task PollRestApi() private async Task PollRestApi()
{ {
if (loadedProfile == null) return; if (loadedProfile == null || _isDisconnecting || _connectionCts.IsCancellationRequested) return;
string url = loadedProfile.UrlFormat; string url = loadedProfile.UrlFormat;
if (!string.IsNullOrWhiteSpace(url)) if (!string.IsNullOrWhiteSpace(url))
{ {
@@ -286,68 +134,26 @@ namespace RadioDJViewer
} }
try try
{ {
var client = new System.Net.Http.HttpClient(); using (var client = new System.Net.Http.HttpClient())
var response = await client.GetAsync(url);
if (response.IsSuccessStatusCode)
{ {
var xml = await response.Content.ReadAsStringAsync(); var response = await client.GetAsync(url);
lastApiXml = xml; if (_isDisconnecting || _connectionCts.IsCancellationRequested || !isConnected)
ParseAndDisplaySongInfo(xml); return;
try
if (response.IsSuccessStatusCode)
{ {
var newKey = $"{marqueeTextArtist}|{marqueeTextTitle}"; var xml = await response.Content.ReadAsStringAsync();
if (!string.Equals(newKey, _currentTrackKey, StringComparison.Ordinal)) if (_isDisconnecting || _connectionCts.IsCancellationRequested || !isConnected)
{ return;
_currentTrackKey = newKey;
ShowTemporaryStatus("Song Change Detected", 2000); lastApiXml = xml;
bool toastEnabled = IsToastEnabledForActiveProfile(); ParseAndDisplaySongInfo(xml);
#if DEBUG
System.Diagnostics.Debug.WriteLine($"[Toast] Track changed. Enabled={toastEnabled}, Profile={loadedProfile?.Name ?? "(null)"}");
#endif
if (toastEnabled)
{
try
{
string outputImagePath = GetProfileOutputImagePath();
#if DEBUG
System.Diagnostics.Debug.WriteLine($"[Toast] Trigger with title='{marqueeTextTitle}', artist='{marqueeTextArtist}', imagePath='{outputImagePath}'");
#endif
ShowTrackChangeToast(marqueeTextTitle, marqueeTextArtist, outputImagePath);
}
catch (Exception ex)
{
#if DEBUG
System.Diagnostics.Debug.WriteLine($"[Toast] Trigger error: {ex}");
MessageBox.Show($"Toast trigger failed: {ex.Message}", "Toast Debug", MessageBoxButtons.OK, MessageBoxIcon.Warning);
#endif
}
}
}
} }
catch { }
} }
} }
catch { } catch { }
} }
private void AutoLoadProfiles()
{
string profilesPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "profiles.json");
if (File.Exists(profilesPath))
{
var profileNames = ProfileStorage.GetProfileNames();
if (profileNames.Count > 0)
{
// Optionally, load the first profile by default
var profile = ProfileStorage.LoadProfile(profileNames[0]);
if (profile != null)
{
LoadProfile(profile);
}
}
}
}
private async void button1_Click(object sender, EventArgs e) private async void button1_Click(object sender, EventArgs e)
{ {
// Show connecting message // Show connecting message
@@ -364,7 +170,9 @@ namespace RadioDJViewer
private void button2_Click(object sender, EventArgs e) private void button2_Click(object sender, EventArgs e)
{ {
// Disconnect // Disconnect
_isDisconnecting = true;
isConnected = false; isConnected = false;
try { _connectionCts.Cancel(); } catch { }
apiTimer.Stop(); apiTimer.Stop();
playbackTimer.Stop(); playbackTimer.Stop();
_playbackElapsedSeconds = 0; _playbackElapsedSeconds = 0;
@@ -386,6 +194,8 @@ namespace RadioDJViewer
catch { } catch { }
ClearStatusMessage(); ClearStatusMessage();
UpdateStatusBar(); UpdateStatusBar();
_isDisconnecting = false;
_connectionCts = new CancellationTokenSource();
} }
private async Task ConnectToRestApi() private async Task ConnectToRestApi()
@@ -414,27 +224,37 @@ namespace RadioDJViewer
} }
try try
{ {
var client = new System.Net.Http.HttpClient(); _isDisconnecting = false;
var response = await client.GetAsync(url); _connectionCts = new CancellationTokenSource();
if (response.IsSuccessStatusCode) using (var client = new System.Net.Http.HttpClient())
{ {
var xml = await response.Content.ReadAsStringAsync(); var response = await client.GetAsync(url);
ParseAndDisplaySongInfo(xml); if (_isDisconnecting || _connectionCts.IsCancellationRequested)
try return;
if (response.IsSuccessStatusCode)
{ {
_currentTrackKey = $"{marqueeTextArtist}|{marqueeTextTitle}"; var xml = await response.Content.ReadAsStringAsync();
if (_isDisconnecting || _connectionCts.IsCancellationRequested)
return;
ParseAndDisplaySongInfo(xml);
try
{
_currentTrackKey = $"{_previousToastArtist}|{_previousToastTitle}";
}
catch { }
isConnected = true;
// Clear the 'Connecting...' persistent message and show connected
ClearStatusMessage();
UpdateStatusBar();
// Start web server immediately after API connection if profile requests it
StartWidgetServerIfEnabled();
}
else
{
isConnected = false;
} }
catch { }
isConnected = true;
// Clear the 'Connecting...' persistent message and show connected
ClearStatusMessage();
UpdateStatusBar();
// Start web server immediately after API connection if profile requests it
StartWidgetServerIfEnabled();
}
else
{
isConnected = false;
} }
} }
catch (Exception ex) catch (Exception ex)
@@ -445,7 +265,6 @@ namespace RadioDJViewer
UpdateStatusBar(); UpdateStatusBar();
} }
// Call this method after parsing song info, assuming image path is available from profile or API
private void UpdateCurrentSongImage(string imageName) private void UpdateCurrentSongImage(string imageName)
{ {
string imagePath = string.Empty; string imagePath = string.Empty;
@@ -465,18 +284,16 @@ namespace RadioDJViewer
} }
if (useFallback) if (useFallback)
{ {
// Use fallback PNG from resources
var fallbackImg = Properties.Resources.fallback; var fallbackImg = Properties.Resources.fallback;
if (fallbackImg != null) if (fallbackImg != null)
{ {
var resized = new Bitmap(fallbackImg, pictureBox1.Size); var resized = new Bitmap(fallbackImg, pictureBox1.Size);
pictureBox1.Image = resized; pictureBox1.Image = resized;
currentSongImagePath = defaultImagePath; currentSongImagePath = defaultImagePath;
// Save fallback image to output folder as PNG
if (!string.IsNullOrEmpty(outputFolderPath) && !string.IsNullOrEmpty(outputImageName)) if (!string.IsNullOrEmpty(outputFolderPath) && !string.IsNullOrEmpty(outputImageName))
{ {
string destPath = Path.Combine(outputFolderPath, Path.ChangeExtension(outputImageName, ".png")); string destPath = Path.Combine(outputFolderPath, Path.ChangeExtension(outputImageName, ".png"));
resized.Save(destPath, System.Drawing.Imaging.ImageFormat.Png); SaveImageAsPng(resized, destPath);
} }
} }
else else
@@ -493,17 +310,15 @@ namespace RadioDJViewer
var resized = new Bitmap(img, pictureBox1.Size); var resized = new Bitmap(img, pictureBox1.Size);
pictureBox1.Image = resized; pictureBox1.Image = resized;
currentSongImagePath = imagePath; currentSongImagePath = imagePath;
// Save to output folder as PNG
if (!string.IsNullOrEmpty(outputFolderPath) && !string.IsNullOrEmpty(outputImageName)) if (!string.IsNullOrEmpty(outputFolderPath) && !string.IsNullOrEmpty(outputImageName))
{ {
string destPath = Path.Combine(outputFolderPath, Path.ChangeExtension(outputImageName, ".png")); string destPath = Path.Combine(outputFolderPath, Path.ChangeExtension(outputImageName, ".png"));
resized.Save(destPath, System.Drawing.Imaging.ImageFormat.Png); SaveImageAsPng(resized, destPath);
} }
} }
} }
catch catch
{ {
// If loading image fails, fallback
var fallbackImg = Properties.Resources.fallback; var fallbackImg = Properties.Resources.fallback;
if (fallbackImg != null) if (fallbackImg != null)
{ {
@@ -513,7 +328,7 @@ namespace RadioDJViewer
if (!string.IsNullOrEmpty(outputFolderPath) && !string.IsNullOrEmpty(outputImageName)) if (!string.IsNullOrEmpty(outputFolderPath) && !string.IsNullOrEmpty(outputImageName))
{ {
string destPath = Path.Combine(outputFolderPath, Path.ChangeExtension(outputImageName, ".png")); string destPath = Path.Combine(outputFolderPath, Path.ChangeExtension(outputImageName, ".png"));
resized.Save(destPath, System.Drawing.Imaging.ImageFormat.Png); SaveImageAsPng(resized, destPath);
} }
} }
else else
@@ -524,21 +339,129 @@ namespace RadioDJViewer
} }
} }
private void StartMarqueeTimers() private void SaveImageAsPng(Image image, string destinationPath)
{ {
marqueeOffsetTitle = 0; if (image == null || string.IsNullOrWhiteSpace(destinationPath))
marqueeOffsetArtist = 0; return;
marqueeOffsetAlbum = 0;
marqueeTimerTitle.Start(); string directory = Path.GetDirectoryName(destinationPath);
marqueeTimerArtist.Start(); if (!string.IsNullOrWhiteSpace(directory))
marqueeTimerAlbum.Start(); Directory.CreateDirectory(directory);
string tempPath = destinationPath + ".tmp";
using (var fileStream = new FileStream(tempPath, FileMode.Create, FileAccess.Write, FileShare.Read))
{
image.Save(fileStream, System.Drawing.Imaging.ImageFormat.Png);
fileStream.Flush(true);
}
if (File.Exists(destinationPath))
File.Delete(destinationPath);
File.Move(tempPath, destinationPath);
} }
private void StopMarqueeTimers() private string BuildToastImagePath()
{ {
marqueeTimerTitle.Stop(); try
marqueeTimerArtist.Stop(); {
marqueeTimerAlbum.Stop(); string sourcePath = currentSongImagePath;
if (string.IsNullOrWhiteSpace(sourcePath) || !File.Exists(sourcePath))
sourcePath = GetProfileOutputImagePath();
if (string.IsNullOrWhiteSpace(sourcePath) || !File.Exists(sourcePath))
return string.Empty;
string toastDirectory = Path.Combine(Path.GetTempPath(), "RadioDJViewer", "ToastImages");
Directory.CreateDirectory(toastDirectory);
string toastPath = Path.Combine(toastDirectory, $"Album-Art-Hero-{DateTime.UtcNow.Ticks}.png");
using (var sourceStream = new FileStream(sourcePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (var memoryStream = new MemoryStream())
{
sourceStream.CopyTo(memoryStream);
memoryStream.Position = 0;
using (var sourceImage = Image.FromStream(memoryStream))
using (var heroImage = CreateToastHeroCanvas(sourceImage))
using (var fileStream = new FileStream(toastPath, FileMode.Create, FileAccess.Write, FileShare.Read))
{
heroImage.Save(fileStream, System.Drawing.Imaging.ImageFormat.Png);
fileStream.Flush(true);
}
}
if (!string.IsNullOrWhiteSpace(_lastToastImagePath) && !string.Equals(_lastToastImagePath, toastPath, StringComparison.OrdinalIgnoreCase))
{
try
{
if (File.Exists(_lastToastImagePath))
File.Delete(_lastToastImagePath);
}
catch { }
}
_lastToastImagePath = toastPath;
#if DEBUG
System.Diagnostics.Debug.WriteLine($"[Toast] Prepared 16:9 hero image '{toastPath}' from '{sourcePath}'");
#endif
return toastPath;
}
catch (Exception ex)
{
#if DEBUG
System.Diagnostics.Debug.WriteLine($"[Toast] Failed to prepare toast image: {ex}");
#endif
return string.Empty;
}
}
private Bitmap CreateToastHeroCanvas(Image sourceImage)
{
const double targetAspectRatio = 16d / 9d;
int sourceWidth = Math.Max(sourceImage.Width, 1);
int sourceHeight = Math.Max(sourceImage.Height, 1);
double sourceAspectRatio = (double)sourceWidth / sourceHeight;
if (sourceWidth >= sourceHeight && Math.Abs(sourceAspectRatio - targetAspectRatio) < 0.01d)
return new Bitmap(sourceImage);
int canvasWidth;
int canvasHeight;
if (sourceAspectRatio < targetAspectRatio)
{
canvasHeight = sourceHeight;
canvasWidth = (int)Math.Ceiling(canvasHeight * targetAspectRatio);
}
else
{
canvasWidth = sourceWidth;
canvasHeight = (int)Math.Ceiling(canvasWidth / targetAspectRatio);
}
canvasWidth = Math.Max(canvasWidth, sourceWidth);
canvasHeight = Math.Max(canvasHeight, sourceHeight);
var heroCanvas = new Bitmap(canvasWidth, canvasHeight, PixelFormat.Format32bppArgb);
using (var graphics = Graphics.FromImage(heroCanvas))
{
graphics.Clear(Color.Black);
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphics.SmoothingMode = SmoothingMode.HighQuality;
int x = (canvasWidth - sourceWidth) / 2;
int y = (canvasHeight - sourceHeight) / 2;
graphics.DrawImage(sourceImage, new Rectangle(x, y, sourceWidth, sourceHeight));
}
#if DEBUG
System.Diagnostics.Debug.WriteLine($"[Toast] Hero canvas created: source={sourceWidth}x{sourceHeight}, canvas={canvasWidth}x{canvasHeight}");
#endif
return heroCanvas;
} }
private void PlaybackTimer_Tick(object sender, EventArgs e) private void PlaybackTimer_Tick(object sender, EventArgs e)
@@ -621,6 +544,9 @@ namespace RadioDJViewer
{ {
try try
{ {
if (_isDisconnecting || _connectionCts.IsCancellationRequested || IsDisposed)
return;
var doc = new XmlDocument(); var doc = new XmlDocument();
doc.LoadXml(xml); doc.LoadXml(xml);
// Parse title, artist, album from XML (case-insensitive) // Parse title, artist, album from XML (case-insensitive)
@@ -632,26 +558,29 @@ namespace RadioDJViewer
string elapsed = doc.SelectSingleNode("//*[translate(local-name(), 'ELAPSED', 'elapsed')='elapsed']")?.InnerText; string elapsed = doc.SelectSingleNode("//*[translate(local-name(), 'ELAPSED', 'elapsed')='elapsed']")?.InnerText;
string duration = doc.SelectSingleNode("//*[translate(local-name(), 'DURATION', 'duration')='duration']")?.InnerText; string duration = doc.SelectSingleNode("//*[translate(local-name(), 'DURATION', 'duration')='duration']")?.InnerText;
marqueeTextTitle = !string.IsNullOrWhiteSpace(title) ? title : "No title"; string titleText = !string.IsNullOrWhiteSpace(title) ? title : "No title";
marqueeTextArtist = !string.IsNullOrWhiteSpace(artist) ? artist : "No artist"; string artistText = !string.IsNullOrWhiteSpace(artist) ? artist : "No artist";
marqueeTextAlbum = !string.IsNullOrWhiteSpace(album) ? album : "No album"; string albumText = !string.IsNullOrWhiteSpace(album) ? album : "No album";
StartMarqueeTimers(); bool trackChanged = !string.Equals(titleText, _previousToastTitle, StringComparison.OrdinalIgnoreCase)
|| !string.Equals(artistText, _previousToastArtist, StringComparison.OrdinalIgnoreCase);
UpdatePlaybackState($"{marqueeTextArtist}|{marqueeTextTitle}", elapsed, duration); SetSongMetadataLabels(titleText, artistText, albumText);
UpdatePlaybackState($"{artistText}|{titleText}", elapsed, duration);
// Write to output files // Write to output files
if (!string.IsNullOrEmpty(outputFolderPath)) if (!string.IsNullOrEmpty(outputFolderPath))
{ {
File.WriteAllText(Path.Combine(outputFolderPath, "title.txt"), marqueeTextTitle); File.WriteAllText(Path.Combine(outputFolderPath, "title.txt"), titleText);
File.WriteAllText(Path.Combine(outputFolderPath, "artist.txt"), marqueeTextArtist); File.WriteAllText(Path.Combine(outputFolderPath, "artist.txt"), artistText);
File.WriteAllText(Path.Combine(outputFolderPath, "album.txt"), marqueeTextAlbum); File.WriteAllText(Path.Combine(outputFolderPath, "album.txt"), albumText);
} }
// Update in-memory cache for widget server // Update in-memory cache for widget server
try try
{ {
WidgetServer.CachedArtist = marqueeTextArtist ?? string.Empty; WidgetServer.CachedArtist = artistText ?? string.Empty;
WidgetServer.CachedTitle = marqueeTextTitle ?? string.Empty; WidgetServer.CachedTitle = titleText ?? string.Empty;
byte[] imgBytes = null; byte[] imgBytes = null;
// Prefer album art from main images folder // Prefer album art from main images folder
@@ -700,13 +629,25 @@ namespace RadioDJViewer
{ {
UpdateCurrentSongImage(null); UpdateCurrentSongImage(null);
} }
if (trackChanged)
{
#if DEBUG
System.Diagnostics.Debug.WriteLine($"[Toast] Track change detected. newTitle='{titleText}', newArtist='{artistText}'");
#endif
HandleToastForTrackChange(titleText, artistText);
_previousToastTitle = titleText;
_previousToastArtist = artistText;
}
} }
catch catch
{ {
marqueeTextTitle = "No title"; if (_isDisconnecting || _connectionCts.IsCancellationRequested || IsDisposed)
marqueeTextArtist = "No artist"; return;
marqueeTextAlbum = "No album";
StartMarqueeTimers(); SetSongMetadataLabels("No title", "No artist", "No album");
_previousToastTitle = "No title";
_previousToastArtist = "No artist";
playbackTimer.Stop(); playbackTimer.Stop();
_playbackElapsedSeconds = 0; _playbackElapsedSeconds = 0;
_playbackDurationSeconds = 0; _playbackDurationSeconds = 0;
@@ -802,7 +743,7 @@ namespace RadioDJViewer
if (widgetServer == null) if (widgetServer == null)
{ {
int port = loadedProfile.WebServerPort > 0 ? loadedProfile.WebServerPort : 8080; int port = loadedProfile.WebServerPort > 0 ? loadedProfile.WebServerPort : 8080;
widgetServer = new WidgetServer(port, () => marqueeTextArtist, () => marqueeTextTitle, () => this.currentSongImagePath ?? this.defaultImagePath); widgetServer = new WidgetServer(port, () => _previousToastArtist, () => _previousToastTitle, () => this.currentSongImagePath ?? this.defaultImagePath);
} }
widgetServer.Start(); widgetServer.Start();
widgetRunning = true; widgetRunning = true;
@@ -827,9 +768,7 @@ namespace RadioDJViewer
private void aboutToolStripMenuItem_Click(object sender, EventArgs e) private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
{ {
var assembly = System.Reflection.Assembly.GetExecutingAssembly(); var assembly = System.Reflection.Assembly.GetExecutingAssembly();
var versionAttr = assembly.GetCustomAttributes(typeof(System.Reflection.AssemblyFileVersionAttribute), false) string version = assembly.GetName().Version.ToString();
.OfType<System.Reflection.AssemblyFileVersionAttribute>().FirstOrDefault();
string version = versionAttr != null ? versionAttr.Version : assembly.GetName().Version.ToString();
string message = $"RadioDJViewer\nVersion: {version}\nGitHub: https://git.smartcraft.me/minster586/RadioDJViewer"; string message = $"RadioDJViewer\nVersion: {version}\nGitHub: https://git.smartcraft.me/minster586/RadioDJViewer";
MessageBox.Show(message, "About RadioDJViewer", MessageBoxButtons.OK, MessageBoxIcon.Information); MessageBox.Show(message, "About RadioDJViewer", MessageBoxButtons.OK, MessageBoxIcon.Information);
} }
@@ -852,19 +791,41 @@ namespace RadioDJViewer
loadedProfile = profile; loadedProfile = profile;
int pollingRate = profile.PollingRateSeconds > 0 ? profile.PollingRateSeconds : 3; int pollingRate = profile.PollingRateSeconds > 0 ? profile.PollingRateSeconds : 3;
apiTimer.Interval = pollingRate * 1000; apiTimer.Interval = pollingRate * 1000;
SetMarqueeScrollSpeed(profile.MarqueeScrollSpeed ?? "Medium");
SetMarqueePauseTime(profile.MarqueePauseTime > 0 ? profile.MarqueePauseTime : 6);
SetMarqueeSeparator(profile.MarqueeSeparator ?? " | ");
if (pauseTimerTitle != null) pauseTimerTitle.Interval = marqueePauseTime;
if (pauseTimerArtist != null) pauseTimerArtist.Interval = marqueePauseTime;
if (pauseTimerAlbum != null) pauseTimerAlbum.Interval = marqueePauseTime;
marqueeTimerTitle.Interval = marqueeScrollSpeed;
marqueeTimerArtist.Interval = marqueeScrollSpeed;
marqueeTimerAlbum.Interval = marqueeScrollSpeed;
WidgetServer.CachedClockVisibility = profile.ClockVisibilityEnabled; WidgetServer.CachedClockVisibility = profile.ClockVisibilityEnabled;
UpdateStatusBar(); UpdateStatusBar();
} }
private void PopulateProfileDropBox()
{
profile_drop_box.Items.Clear();
var profileNames = ProfileStorage.GetProfileNames();
profile_drop_box.Items.AddRange(profileNames.ToArray());
string currentProfile = GetCurrentProfileName();
if (!string.IsNullOrEmpty(currentProfile) && profileNames.Contains(currentProfile))
profile_drop_box.SelectedItem = currentProfile;
else if (profile_drop_box.Items.Count > 0)
profile_drop_box.SelectedIndex = 0;
}
private void load_profile_button_Click(object sender, EventArgs e)
{
if (profile_drop_box.SelectedItem != null)
{
var profile = ProfileStorage.LoadProfile(profile_drop_box.SelectedItem.ToString());
if (profile != null)
{
LoadProfile(profile);
UpdateStatusBar();
MessageBox.Show($"Profile '{profile.Name}' loaded.", "Profile Loaded", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
public string GetCurrentProfileName()
{
return currentProfile;
}
private void Uicolor_Click(object sender, EventArgs e) private void Uicolor_Click(object sender, EventArgs e)
{ {
isDarkMode = !isDarkMode; isDarkMode = !isDarkMode;
@@ -921,80 +882,21 @@ namespace RadioDJViewer
} }
} }
private void label7_Click(object sender, EventArgs e)
{
}
private void label9_Click(object sender, EventArgs e)
{
}
public string GetCurrentProfileName()
{
return currentProfile;
}
private void PopulateProfileDropBox()
{
profile_drop_box.Items.Clear();
var profileNames = ProfileStorage.GetProfileNames();
profile_drop_box.Items.AddRange(profileNames.ToArray());
string currentProfile = GetCurrentProfileName();
if (!string.IsNullOrEmpty(currentProfile) && profileNames.Contains(currentProfile))
profile_drop_box.SelectedItem = currentProfile;
else if (profile_drop_box.Items.Count > 0)
profile_drop_box.SelectedIndex = 0;
}
private void load_profile_button_Click(object sender, EventArgs e)
{
if (profile_drop_box.SelectedItem != null)
{
var profile = ProfileStorage.LoadProfile(profile_drop_box.SelectedItem.ToString());
if (profile != null)
{
LoadProfile(profile);
UpdateStatusBar();
MessageBox.Show($"Profile '{profile.Name}' loaded.", "Profile Loaded", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
private string FormatTimeDisplay(string elapsedSeconds, string durationSeconds)
{
double elapsed;
double duration;
if (!TryParseSeconds(elapsedSeconds, out elapsed) || !TryParseSeconds(durationSeconds, out duration))
{
return "No Data";
}
return FormatTimeDisplay(elapsed, duration);
}
private string FormatTimeDisplay(double elapsed, double duration) private string FormatTimeDisplay(double elapsed, double duration)
{ {
// If duration is zero or negative, show "No Data"
if (duration <= 0) if (duration <= 0)
{ {
return "No Data"; return "No Data";
} }
// Clamp elapsed to [0, duration]
if (elapsed < 0) if (elapsed < 0)
elapsed = 0; elapsed = 0;
if (elapsed > duration) if (elapsed > duration)
elapsed = duration; elapsed = duration;
// Convert to integers (seconds only)
int elapsedInt = (int)elapsed; int elapsedInt = (int)elapsed;
int durationInt = (int)duration; int durationInt = (int)duration;
return $"{FormatSeconds(elapsedInt)} / {FormatSeconds(durationInt)}";
// Convert seconds to MM:SS format
string elapsedFormatted = FormatSeconds(elapsedInt);
string durationFormatted = FormatSeconds(durationInt);
return $"{elapsedFormatted} / {durationFormatted}";
} }
private string FormatSeconds(int seconds) private string FormatSeconds(int seconds)
@@ -1009,6 +911,30 @@ namespace RadioDJViewer
return loadedProfile != null && loadedProfile.ToastNotificationsEnabled; return loadedProfile != null && loadedProfile.ToastNotificationsEnabled;
} }
private static string NormalizeTrackMetadata(string value)
{
return string.IsNullOrWhiteSpace(value) ? string.Empty : value.Trim();
}
private static bool HasValidTrackMetadata(string title, string artist)
{
return IsValidToastValue(title) && IsValidToastValue(artist);
}
private static bool IsValidToastValue(string value)
{
if (string.IsNullOrWhiteSpace(value))
return false;
string normalized = value.Trim();
return !normalized.Equals("No Title", StringComparison.OrdinalIgnoreCase)
&& !normalized.Equals("No Artist", StringComparison.OrdinalIgnoreCase)
&& !normalized.Equals("Unknown", StringComparison.OrdinalIgnoreCase)
&& !normalized.Equals("No title", StringComparison.OrdinalIgnoreCase)
&& !normalized.Equals("No artist", StringComparison.OrdinalIgnoreCase)
&& !normalized.Equals("unknown", StringComparison.OrdinalIgnoreCase);
}
private string GetProfileOutputImagePath() private string GetProfileOutputImagePath()
{ {
if (string.IsNullOrWhiteSpace(outputFolderPath) || string.IsNullOrWhiteSpace(loadedProfile?.OutputImageName)) if (string.IsNullOrWhiteSpace(outputFolderPath) || string.IsNullOrWhiteSpace(loadedProfile?.OutputImageName))
@@ -1017,8 +943,7 @@ namespace RadioDJViewer
try try
{ {
string imageName = Path.ChangeExtension(loadedProfile.OutputImageName, ".png"); string imageName = Path.ChangeExtension(loadedProfile.OutputImageName, ".png");
string fullPath = Path.GetFullPath(Path.Combine(outputFolderPath, imageName)); return Path.GetFullPath(Path.Combine(outputFolderPath, imageName));
return fullPath;
} }
catch catch
{ {
@@ -1028,22 +953,57 @@ namespace RadioDJViewer
private void ShowTrackChangeToast(string title, string artist, string outputImagePath) private void ShowTrackChangeToast(string title, string artist, string outputImagePath)
{ {
if (IsDisposed || _isDisconnecting || !isConnected)
return;
string safeTitle = string.IsNullOrWhiteSpace(title) ? "No title" : title; string safeTitle = string.IsNullOrWhiteSpace(title) ? "No title" : title;
string safeArtist = string.IsNullOrWhiteSpace(artist) ? "No artist" : artist; string safeArtist = string.IsNullOrWhiteSpace(artist) ? "No artist" : artist;
DateTime now = DateTime.Now; DateTime now = DateTime.Now;
string attribution = $"Date: {now:MM/dd/yyyy} | Time: {now:hh:mm tt}"; string attribution = $"Date: {now:MM/dd/yyyy} | Time: {now:hh:mm tt}";
string toastImagePath = BuildToastImagePath();
ToastNotificationService.ShowTrackChangeToast(safeTitle, safeArtist, attribution, string.IsNullOrWhiteSpace(toastImagePath) ? outputImagePath : toastImagePath);
}
private void HandleToastForTrackChange(string title, string artist)
{
if (IsDisposed || _isDisconnecting || !isConnected)
return;
string normalizedTitle = NormalizeTrackMetadata(title);
string normalizedArtist = NormalizeTrackMetadata(artist);
if (!IsToastEnabledForActiveProfile())
return;
if (!HasValidTrackMetadata(normalizedTitle, normalizedArtist))
return;
try try
{ {
ToastNotificationService.ShowTrackChangeToast(safeTitle, safeArtist, attribution, outputImagePath); string outputImagePath = GetProfileOutputImagePath();
System.Diagnostics.Debug.WriteLine($"[Toast] Firing toast. title='{normalizedTitle}', artist='{normalizedArtist}', imagePath='{outputImagePath}'");
ShowTrackChangeToast(normalizedTitle, normalizedArtist, outputImagePath);
} }
catch (Exception ex) catch (Exception ex)
{ {
#if DEBUG #if DEBUG
System.Diagnostics.Debug.WriteLine($"[Toast] ShowTrackChangeToast failed: {ex}"); System.Diagnostics.Debug.WriteLine($"[Toast] Trigger error: {ex}");
MessageBox.Show($"Toast display failed: {ex.Message}", "Toast Debug", MessageBoxButtons.OK, MessageBoxIcon.Warning); MessageBox.Show($"Toast trigger failed: {ex.Message}", "Toast Debug", MessageBoxButtons.OK, MessageBoxIcon.Warning);
#endif #endif
} }
} }
private void label9_Click(object sender, EventArgs e)
{
}
private void label7_Click(object sender, EventArgs e)
{
}
private void label7_Click_1(object sender, EventArgs e)
{
}
} }
internal static class ToastNotificationService internal static class ToastNotificationService
@@ -1177,7 +1137,7 @@ namespace RadioDJViewer
string safeImage = SecurityElement.Escape(imageUri); string safeImage = SecurityElement.Escape(imageUri);
string imageNode = string.IsNullOrWhiteSpace(safeImage) string imageNode = string.IsNullOrWhiteSpace(safeImage)
? string.Empty ? string.Empty
: $"<image placement='appLogoOverride' hint-crop='none' src='{safeImage}'/>"; : $"<image placement='hero' src='{safeImage}' hint-crop='none'/>";
#if DEBUG #if DEBUG
System.Diagnostics.Debug.WriteLine($"[Toast] Image URI used: '{imageUri}'"); System.Diagnostics.Debug.WriteLine($"[Toast] Image URI used: '{imageUri}'");
+2 -2
View File
@@ -29,5 +29,5 @@ using System.Runtime.InteropServices;
// Build Number // Build Number
// Revision // Revision
// //
[assembly: AssemblyVersion("1.14.0")] [assembly: AssemblyVersion("1.14.5")]
[assembly: AssemblyFileVersion("1.14.0")] [assembly: AssemblyFileVersion("1.14.5")]
+22 -107
View File
@@ -54,7 +54,7 @@
this.button6 = new System.Windows.Forms.Button(); this.button6 = new System.Windows.Forms.Button();
this.label6 = new System.Windows.Forms.Label(); this.label6 = new System.Windows.Forms.Label();
this.label7 = new System.Windows.Forms.Label(); this.label7 = new System.Windows.Forms.Label();
this.textBox7 = new System.Windows.Forms.TextBox(); this.polling_rate_textbox = new System.Windows.Forms.TextBox();
this.groupBox2 = new System.Windows.Forms.GroupBox(); this.groupBox2 = new System.Windows.Forms.GroupBox();
this.toast_box_group_box = new System.Windows.Forms.GroupBox(); this.toast_box_group_box = new System.Windows.Forms.GroupBox();
this.toast_check_box_enable = new System.Windows.Forms.CheckBox(); this.toast_check_box_enable = new System.Windows.Forms.CheckBox();
@@ -66,13 +66,6 @@
this.web_server_port_label = new System.Windows.Forms.Label(); this.web_server_port_label = new System.Windows.Forms.Label();
this.web_server_label = new System.Windows.Forms.Label(); this.web_server_label = new System.Windows.Forms.Label();
this.web_server_checkbox = new System.Windows.Forms.CheckBox(); this.web_server_checkbox = new System.Windows.Forms.CheckBox();
this.label13 = new System.Windows.Forms.Label();
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.label12 = new System.Windows.Forms.Label();
this.groupBox1.SuspendLayout(); this.groupBox1.SuspendLayout();
this.groupBox3.SuspendLayout(); this.groupBox3.SuspendLayout();
@@ -110,7 +103,7 @@
// //
// ok_button_master // ok_button_master
// //
this.ok_button_master.Location = new System.Drawing.Point(54, 729); this.ok_button_master.Location = new System.Drawing.Point(54, 684);
this.ok_button_master.Name = "ok_button_master"; this.ok_button_master.Name = "ok_button_master";
this.ok_button_master.Size = new System.Drawing.Size(157, 23); this.ok_button_master.Size = new System.Drawing.Size(157, 23);
this.ok_button_master.TabIndex = 1; this.ok_button_master.TabIndex = 1;
@@ -119,7 +112,7 @@
// //
// button2 // button2
// //
this.button2.Location = new System.Drawing.Point(302, 729); this.button2.Location = new System.Drawing.Point(301, 684);
this.button2.Name = "button2"; this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(157, 23); this.button2.Size = new System.Drawing.Size(157, 23);
this.button2.TabIndex = 2; this.button2.TabIndex = 2;
@@ -193,7 +186,7 @@
// //
// button3 // button3
// //
this.button3.Location = new System.Drawing.Point(71, 535); this.button3.Location = new System.Drawing.Point(66, 537);
this.button3.Name = "button3"; this.button3.Name = "button3";
this.button3.Size = new System.Drawing.Size(120, 30); this.button3.Size = new System.Drawing.Size(120, 30);
this.button3.TabIndex = 8; this.button3.TabIndex = 8;
@@ -202,7 +195,7 @@
// //
// button4 // button4
// //
this.button4.Location = new System.Drawing.Point(316, 535); this.button4.Location = new System.Drawing.Point(279, 537);
this.button4.Name = "button4"; this.button4.Name = "button4";
this.button4.Size = new System.Drawing.Size(120, 30); this.button4.Size = new System.Drawing.Size(120, 30);
this.button4.TabIndex = 9; this.button4.TabIndex = 9;
@@ -215,9 +208,9 @@
this.groupBox3.Controls.Add(this.labelOutputFolderPath); this.groupBox3.Controls.Add(this.labelOutputFolderPath);
this.groupBox3.Controls.Add(this.textBox5); this.groupBox3.Controls.Add(this.textBox5);
this.groupBox3.Controls.Add(this.label10); this.groupBox3.Controls.Add(this.label10);
this.groupBox3.Location = new System.Drawing.Point(22, 413); this.groupBox3.Location = new System.Drawing.Point(26, 368);
this.groupBox3.Name = "groupBox3"; this.groupBox3.Name = "groupBox3";
this.groupBox3.Size = new System.Drawing.Size(482, 115); this.groupBox3.Size = new System.Drawing.Size(476, 115);
this.groupBox3.TabIndex = 12; this.groupBox3.TabIndex = 12;
this.groupBox3.TabStop = false; this.groupBox3.TabStop = false;
this.groupBox3.Text = "Output Setting"; this.groupBox3.Text = "Output Setting";
@@ -274,17 +267,17 @@
// //
// button6 // button6
// //
this.button6.Location = new System.Drawing.Point(23, 269); this.button6.Location = new System.Drawing.Point(91, 234);
this.button6.Name = "button6"; this.button6.Name = "button6";
this.button6.Size = new System.Drawing.Size(140, 23); this.button6.Size = new System.Drawing.Size(140, 23);
this.button6.TabIndex = 18; this.button6.TabIndex = 18;
this.button6.Text = "Select Main Image Folder"; this.button6.Text = "Main Image Folder";
this.button6.UseVisualStyleBackColor = true; this.button6.UseVisualStyleBackColor = true;
// //
// label6 // label6
// //
this.label6.AutoSize = true; this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(169, 274); this.label6.Location = new System.Drawing.Point(306, 239);
this.label6.Name = "label6"; this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(93, 13); this.label6.Size = new System.Drawing.Size(93, 13);
this.label6.TabIndex = 19; this.label6.TabIndex = 19;
@@ -299,27 +292,20 @@
this.label7.TabIndex = 20; this.label7.TabIndex = 20;
this.label7.Text = "Polling Rate (in seconds)"; this.label7.Text = "Polling Rate (in seconds)";
// //
// textBox7 // polling_rate_textbox
// //
this.textBox7.Location = new System.Drawing.Point(150, 208); this.polling_rate_textbox.Location = new System.Drawing.Point(150, 208);
this.textBox7.Name = "textBox7"; this.polling_rate_textbox.Name = "polling_rate_textbox";
this.textBox7.Size = new System.Drawing.Size(63, 20); this.polling_rate_textbox.Size = new System.Drawing.Size(49, 20);
this.textBox7.TabIndex = 21; this.polling_rate_textbox.TabIndex = 21;
// //
// groupBox2 // groupBox2
// //
this.groupBox2.Controls.Add(this.toast_box_group_box); this.groupBox2.Controls.Add(this.toast_box_group_box);
this.groupBox2.Controls.Add(this.web_server_settings_groupbox); this.groupBox2.Controls.Add(this.web_server_settings_groupbox);
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.textBox6);
this.groupBox2.Controls.Add(this.label11); this.groupBox2.Controls.Add(this.label11);
this.groupBox2.Controls.Add(this.textBox9); this.groupBox2.Controls.Add(this.polling_rate_textbox);
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.label7);
this.groupBox2.Controls.Add(this.label6); this.groupBox2.Controls.Add(this.label6);
this.groupBox2.Controls.Add(this.button6); this.groupBox2.Controls.Add(this.button6);
@@ -336,7 +322,7 @@
this.groupBox2.Controls.Add(this.comboBox1); this.groupBox2.Controls.Add(this.comboBox1);
this.groupBox2.Location = new System.Drawing.Point(12, 100); this.groupBox2.Location = new System.Drawing.Point(12, 100);
this.groupBox2.Name = "groupBox2"; this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(519, 623); this.groupBox2.Size = new System.Drawing.Size(519, 578);
this.groupBox2.TabIndex = 3; this.groupBox2.TabIndex = 3;
this.groupBox2.TabStop = false; this.groupBox2.TabStop = false;
this.groupBox2.Text = "Profiles"; this.groupBox2.Text = "Profiles";
@@ -345,7 +331,7 @@
// //
this.toast_box_group_box.Controls.Add(this.toast_check_box_enable); this.toast_box_group_box.Controls.Add(this.toast_check_box_enable);
this.toast_box_group_box.Controls.Add(this.toast_label); this.toast_box_group_box.Controls.Add(this.toast_label);
this.toast_box_group_box.Location = new System.Drawing.Point(133, 575); this.toast_box_group_box.Location = new System.Drawing.Point(120, 489);
this.toast_box_group_box.Name = "toast_box_group_box"; this.toast_box_group_box.Name = "toast_box_group_box";
this.toast_box_group_box.Size = new System.Drawing.Size(248, 42); this.toast_box_group_box.Size = new System.Drawing.Size(248, 42);
this.toast_box_group_box.TabIndex = 4; this.toast_box_group_box.TabIndex = 4;
@@ -379,9 +365,9 @@
this.web_server_settings_groupbox.Controls.Add(this.web_server_port_label); this.web_server_settings_groupbox.Controls.Add(this.web_server_port_label);
this.web_server_settings_groupbox.Controls.Add(this.web_server_label); this.web_server_settings_groupbox.Controls.Add(this.web_server_label);
this.web_server_settings_groupbox.Controls.Add(this.web_server_checkbox); this.web_server_settings_groupbox.Controls.Add(this.web_server_checkbox);
this.web_server_settings_groupbox.Location = new System.Drawing.Point(31, 308); this.web_server_settings_groupbox.Location = new System.Drawing.Point(26, 263);
this.web_server_settings_groupbox.Name = "web_server_settings_groupbox"; this.web_server_settings_groupbox.Name = "web_server_settings_groupbox";
this.web_server_settings_groupbox.Size = new System.Drawing.Size(471, 99); this.web_server_settings_groupbox.Size = new System.Drawing.Size(476, 99);
this.web_server_settings_groupbox.TabIndex = 35; this.web_server_settings_groupbox.TabIndex = 35;
this.web_server_settings_groupbox.TabStop = false; this.web_server_settings_groupbox.TabStop = false;
this.web_server_settings_groupbox.Text = "Web Server Settings"; this.web_server_settings_groupbox.Text = "Web Server Settings";
@@ -440,70 +426,6 @@
this.web_server_checkbox.Text = "Enabled"; this.web_server_checkbox.Text = "Enabled";
this.web_server_checkbox.UseVisualStyleBackColor = true; this.web_server_checkbox.UseVisualStyleBackColor = true;
// //
// label13
//
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";
//
// comboBoxScrollSpeed
//
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;
//
// textBoxPauseTime
//
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;
//
// separatingcharacterformatbox
//
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;
//
// textBox9
//
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;
//
// label9
//
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)";
//
// label8
//
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);
//
// label12 // label12
// //
this.label12.AutoSize = true; this.label12.AutoSize = true;
@@ -517,7 +439,7 @@
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(553, 764); this.ClientSize = new System.Drawing.Size(542, 716);
this.Controls.Add(this.groupBox2); this.Controls.Add(this.groupBox2);
this.Controls.Add(this.button2); this.Controls.Add(this.button2);
this.Controls.Add(this.ok_button_master); this.Controls.Add(this.ok_button_master);
@@ -566,18 +488,11 @@
private System.Windows.Forms.Button button6; private System.Windows.Forms.Button button6;
private System.Windows.Forms.Label label6; private System.Windows.Forms.Label label6;
private System.Windows.Forms.Label label7; private System.Windows.Forms.Label label7;
private System.Windows.Forms.TextBox textBox7; private System.Windows.Forms.TextBox polling_rate_textbox;
private System.Windows.Forms.GroupBox groupBox2; 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.ComboBox comboBox2;
private System.Windows.Forms.TextBox textBox8; private System.Windows.Forms.TextBox textBox8;
private System.Windows.Forms.Label label12; 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;
private System.Windows.Forms.GroupBox web_server_settings_groupbox; private System.Windows.Forms.GroupBox web_server_settings_groupbox;
private System.Windows.Forms.Label web_server_label; private System.Windows.Forms.Label web_server_label;
private System.Windows.Forms.CheckBox web_server_checkbox; private System.Windows.Forms.CheckBox web_server_checkbox;
+5 -17
View File
@@ -20,15 +20,6 @@ namespace RadioDJViewer
{ {
InitializeComponent(); InitializeComponent();
textBox4.UseSystemPasswordChar = true; // Obscure password field 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.buttonSelectOutputFolder.Click += ButtonSelectOutputFolder_Click;
this.button6.Click += ButtonSelectMainImagesFolder_Click; this.button6.Click += ButtonSelectMainImagesFolder_Click;
this.button3.Click += button3_Click; this.button3.Click += button3_Click;
@@ -74,10 +65,7 @@ namespace RadioDJViewer
textBox5.Text = profile.OutputImageName; textBox5.Text = profile.OutputImageName;
textBox1.Text = profile.UrlFormat; textBox1.Text = profile.UrlFormat;
// Default polling rate to 3 if missing or zero // Default polling rate to 3 if missing or zero
textBox7.Text = (profile.PollingRateSeconds > 0 ? profile.PollingRateSeconds : 3).ToString(); polling_rate_textbox.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 ?? " | ";
// Web server settings // Web server settings
try try
{ {
@@ -125,7 +113,7 @@ namespace RadioDJViewer
return; return;
} }
int pollingRate = 3; int pollingRate = 3;
int.TryParse(textBox7.Text, out pollingRate); int.TryParse(polling_rate_textbox.Text, out pollingRate);
var profile = new Profile var profile = new Profile
{ {
Name = textBox6.Text, Name = textBox6.Text,
@@ -137,9 +125,9 @@ namespace RadioDJViewer
OutputImageName = textBox5.Text, OutputImageName = textBox5.Text,
UrlFormat = textBox1.Text, UrlFormat = textBox1.Text,
PollingRateSeconds = pollingRate, PollingRateSeconds = pollingRate,
MarqueeScrollSpeed = comboBoxScrollSpeed.SelectedItem?.ToString() ?? "Medium", MarqueeScrollSpeed = "Medium",
MarqueePauseTime = int.TryParse(textBoxPauseTime.Text, out int pt) ? pt : 6, MarqueePauseTime = 6,
MarqueeSeparator = separatingcharacterformatbox.Text, MarqueeSeparator = " | ",
// Web server settings // Web server settings
WebServerEnabled = web_server_checkbox.Checked, WebServerEnabled = web_server_checkbox.Checked,
WebServerPort = int.TryParse(web_server_port_textbox.Text, out int wp) ? wp : 8080, WebServerPort = int.TryParse(web_server_port_textbox.Text, out int wp) ? wp : 8080,