2021-08-08 15:12:36 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.ComponentModel;
|
|
|
|
|
using System.Windows;
|
|
|
|
|
using System.Windows.Controls;
|
|
|
|
|
using System.Windows.Threading;
|
2021-08-13 23:20:38 +00:00
|
|
|
|
using System.Windows.Interop;
|
2021-08-27 17:49:57 +00:00
|
|
|
|
using System.Windows.Input;
|
2021-08-08 15:12:36 +00:00
|
|
|
|
|
|
|
|
|
namespace unison
|
|
|
|
|
{
|
2021-08-19 20:00:25 +00:00
|
|
|
|
public partial class MainWindow : Window, INotifyPropertyChanged
|
2021-08-08 15:12:36 +00:00
|
|
|
|
{
|
2021-08-27 16:45:53 +00:00
|
|
|
|
public readonly Settings SettingsWindow = new Settings();
|
2021-08-08 15:12:36 +00:00
|
|
|
|
|
2021-08-19 20:00:25 +00:00
|
|
|
|
private MPDHandler mpd;
|
2021-08-13 23:20:38 +00:00
|
|
|
|
|
2021-08-14 00:28:21 +00:00
|
|
|
|
Thickness SelectedThickness;
|
|
|
|
|
Thickness BaseThickness;
|
|
|
|
|
|
2021-08-08 15:12:36 +00:00
|
|
|
|
public MainWindow()
|
|
|
|
|
{
|
2021-08-13 23:20:38 +00:00
|
|
|
|
InitHwnd();
|
2021-08-08 15:12:36 +00:00
|
|
|
|
InitializeComponent();
|
2021-08-13 23:20:38 +00:00
|
|
|
|
|
|
|
|
|
WindowState = WindowState.Minimized;
|
|
|
|
|
|
2021-08-16 00:13:47 +00:00
|
|
|
|
mpd = (MPDHandler)Application.Current.Properties["mpd"];
|
|
|
|
|
|
2021-08-08 15:12:36 +00:00
|
|
|
|
DispatcherTimer timer = new DispatcherTimer();
|
2021-08-19 20:00:25 +00:00
|
|
|
|
timer.Interval = TimeSpan.FromSeconds(0.5);
|
2021-08-13 23:20:38 +00:00
|
|
|
|
timer.Tick += Timer_Tick;
|
2021-08-08 15:12:36 +00:00
|
|
|
|
timer.Start();
|
2021-08-14 00:28:21 +00:00
|
|
|
|
|
|
|
|
|
SelectedThickness.Left = SelectedThickness.Right = SelectedThickness.Top = 0.0f;
|
|
|
|
|
SelectedThickness.Bottom = 2.0f;
|
|
|
|
|
BaseThickness.Left = BaseThickness.Right = BaseThickness.Top = BaseThickness.Bottom = 0.0f;
|
2021-08-08 15:12:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-08-13 23:20:38 +00:00
|
|
|
|
private void Timer_Tick(object sender, EventArgs e)
|
2021-08-08 15:12:36 +00:00
|
|
|
|
{
|
2021-08-16 00:13:47 +00:00
|
|
|
|
UpdateInterface();
|
2021-08-08 15:12:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-08-14 00:28:21 +00:00
|
|
|
|
public void UpdateButton(ref Border border, bool b)
|
2021-08-08 15:12:36 +00:00
|
|
|
|
{
|
|
|
|
|
if (b)
|
2021-08-14 00:28:21 +00:00
|
|
|
|
border.BorderThickness = SelectedThickness;
|
2021-08-08 15:12:36 +00:00
|
|
|
|
else
|
2021-08-14 00:28:21 +00:00
|
|
|
|
border.BorderThickness = BaseThickness;
|
2021-08-08 15:12:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-08-28 22:32:41 +00:00
|
|
|
|
public string FormatSeconds(int time)
|
|
|
|
|
{
|
|
|
|
|
TimeSpan timespan = TimeSpan.FromSeconds(time);
|
|
|
|
|
return timespan.ToString(@"mm\:ss");
|
|
|
|
|
}
|
2021-08-08 15:12:36 +00:00
|
|
|
|
public string FormatSeconds(double time)
|
|
|
|
|
{
|
2021-08-13 23:20:38 +00:00
|
|
|
|
TimeSpan timespan = TimeSpan.FromSeconds(time);
|
2021-08-08 15:12:36 +00:00
|
|
|
|
return timespan.ToString(@"mm\:ss");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void UpdateInterface()
|
|
|
|
|
{
|
2021-08-28 22:32:41 +00:00
|
|
|
|
if (mpd.GetCurrentSong() == null || mpd.GetStatus() == null)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
SongTitle.Text = mpd.GetCurrentSong().Title;
|
|
|
|
|
SongTitle.ToolTip = mpd.GetCurrentSong().Path;
|
|
|
|
|
SongArtist.Text = mpd.GetCurrentSong().Artist;
|
|
|
|
|
SongAlbum.Text = mpd.GetCurrentSong().Album;
|
|
|
|
|
if (mpd.GetCurrentSong().Date != null)
|
|
|
|
|
SongAlbum.Text += $" ({ mpd.GetCurrentSong().Date})";
|
|
|
|
|
Bitrate.Text = mpd.GetCurrentSong().Path.Substring(mpd.GetCurrentSong().Path.LastIndexOf(".") + 1) + " – ";
|
|
|
|
|
Bitrate.Text += mpd.GetStatus().Bitrate + "kbps";
|
|
|
|
|
|
|
|
|
|
CurrentTime.Text = FormatSeconds(mpd._currentTime);
|
|
|
|
|
EndTime.Text = FormatSeconds(mpd.GetCurrentSong().Time);
|
|
|
|
|
|
|
|
|
|
TimeSlider.Value = mpd._currentTime / mpd.GetCurrentSong().Time * 100;
|
2021-08-08 15:12:36 +00:00
|
|
|
|
|
2021-08-16 00:13:47 +00:00
|
|
|
|
if (VolumeSlider.Value != mpd._currentVolume)
|
2021-08-08 15:12:36 +00:00
|
|
|
|
{
|
2021-08-16 00:13:47 +00:00
|
|
|
|
VolumeSlider.Value = mpd._currentVolume;
|
|
|
|
|
VolumeSlider.ToolTip = mpd._currentVolume;
|
2021-08-08 15:12:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-08-16 00:13:47 +00:00
|
|
|
|
if (mpd.IsPlaying())
|
2021-08-19 21:03:50 +00:00
|
|
|
|
PlayPause.Text = "\xedb4";
|
2021-08-16 00:13:47 +00:00
|
|
|
|
else
|
2021-08-19 21:03:50 +00:00
|
|
|
|
PlayPause.Text = "\xedb5";
|
2021-08-08 15:12:36 +00:00
|
|
|
|
|
2021-08-16 00:13:47 +00:00
|
|
|
|
Connection.Text = (mpd._connected ? "✔️" : "❌") + $"{Properties.Settings.Default.mpd_host}:{Properties.Settings.Default.mpd_port}";
|
2021-08-08 15:12:36 +00:00
|
|
|
|
|
2021-08-16 00:13:47 +00:00
|
|
|
|
UpdateButton(ref BorderRandom, mpd._currentRandom);
|
|
|
|
|
UpdateButton(ref BorderRepeat, mpd._currentRepeat);
|
|
|
|
|
UpdateButton(ref BorderSingle, mpd._currentSingle);
|
|
|
|
|
UpdateButton(ref BorderConsume, mpd._currentConsume);
|
2021-08-19 20:00:25 +00:00
|
|
|
|
|
2021-08-28 22:32:41 +00:00
|
|
|
|
if (mpd.GetCover() == null)
|
2021-08-19 20:00:25 +00:00
|
|
|
|
{
|
2021-08-28 22:32:41 +00:00
|
|
|
|
NoCover.Visibility = Visibility.Visible;
|
|
|
|
|
Cover.Visibility = Visibility.Collapsed;
|
2021-08-19 20:00:25 +00:00
|
|
|
|
}
|
2021-08-28 22:32:41 +00:00
|
|
|
|
else if (Cover.Source != mpd.GetCover())
|
|
|
|
|
{
|
|
|
|
|
Cover.Source = mpd.GetCover();
|
|
|
|
|
Cover.Visibility = Visibility.Visible;
|
|
|
|
|
NoCover.Visibility = Visibility.Collapsed;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SnapcastHandler snapcast = (SnapcastHandler)Application.Current.Properties["snapcast"];
|
|
|
|
|
if (snapcast.Started)
|
|
|
|
|
SnapcastText.Text = "Stop Snapcast";
|
|
|
|
|
else
|
|
|
|
|
SnapcastText.Text = "Start Snapcast";
|
2021-08-08 15:12:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-08-16 00:13:47 +00:00
|
|
|
|
public void Pause_Clicked(object sender, RoutedEventArgs e) => mpd.PlayPause();
|
|
|
|
|
public void Previous_Clicked(object sender, RoutedEventArgs e) => mpd.Prev();
|
|
|
|
|
public void Next_Clicked(object sender, RoutedEventArgs e) => mpd.Next();
|
2021-08-19 20:00:25 +00:00
|
|
|
|
|
2021-08-16 00:13:47 +00:00
|
|
|
|
public void Random_Clicked(object sender, RoutedEventArgs e) => mpd.Random();
|
|
|
|
|
public void Repeat_Clicked(object sender, RoutedEventArgs e) => mpd.Repeat();
|
|
|
|
|
public void Single_Clicked(object sender, RoutedEventArgs e) => mpd.Single();
|
|
|
|
|
public void Consume_Clicked(object sender, RoutedEventArgs e) => mpd.Consume();
|
|
|
|
|
public void ChangeVolume(int value) => mpd.SetVolume(value);
|
2021-08-08 22:51:06 +00:00
|
|
|
|
|
2021-08-13 23:20:38 +00:00
|
|
|
|
public void Snapcast_Clicked(object sender, RoutedEventArgs e)
|
2021-08-08 15:12:36 +00:00
|
|
|
|
{
|
2021-08-13 23:20:38 +00:00
|
|
|
|
SnapcastHandler snapcast = (SnapcastHandler)Application.Current.Properties["snapcast"];
|
|
|
|
|
if (!snapcast.Started)
|
2021-08-14 23:18:23 +00:00
|
|
|
|
snapcast.Start();
|
2021-08-13 23:20:38 +00:00
|
|
|
|
else
|
|
|
|
|
snapcast.Stop();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Settings_Clicked(object sender, RoutedEventArgs e)
|
|
|
|
|
{
|
2021-08-14 23:29:16 +00:00
|
|
|
|
SettingsWindow.Show();
|
|
|
|
|
SettingsWindow.Activate();
|
|
|
|
|
|
2021-08-14 00:28:21 +00:00
|
|
|
|
if (SettingsWindow.WindowState == WindowState.Minimized)
|
2021-08-13 23:20:38 +00:00
|
|
|
|
SettingsWindow.WindowState = WindowState.Normal;
|
2021-08-08 15:12:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void Window_Closing(object sender, CancelEventArgs e)
|
|
|
|
|
{
|
2021-08-13 23:20:38 +00:00
|
|
|
|
e.Cancel = true;
|
|
|
|
|
WindowState = WindowState.Minimized;
|
|
|
|
|
Hide();
|
2021-08-08 15:12:36 +00:00
|
|
|
|
}
|
2021-08-08 22:51:06 +00:00
|
|
|
|
|
2021-08-27 17:49:57 +00:00
|
|
|
|
private void TimeSlider_DragCompleted(object sender, MouseButtonEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
Slider slider = (Slider)sender;
|
|
|
|
|
|
|
|
|
|
double SongPercentage = slider.Value;
|
2021-08-28 22:32:41 +00:00
|
|
|
|
double SongTime = mpd._totalTime;
|
2021-08-27 17:49:57 +00:00
|
|
|
|
double SeekTime = SongPercentage / 100 * SongTime;
|
|
|
|
|
|
2021-08-28 22:32:41 +00:00
|
|
|
|
mpd.SetTime(SeekTime);
|
2021-08-27 17:49:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void VolumeSlider_DragCompleted(object sender, MouseButtonEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
Slider slider = (Slider)sender;
|
|
|
|
|
mpd.SetVolume((int)slider.Value);
|
|
|
|
|
slider.ToolTip = mpd._currentVolume;
|
|
|
|
|
}
|
|
|
|
|
|
2021-08-08 22:51:06 +00:00
|
|
|
|
protected override void OnSourceInitialized(EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
base.OnSourceInitialized(e);
|
2021-08-13 23:20:38 +00:00
|
|
|
|
HotkeyHandler hk = (HotkeyHandler)Application.Current.Properties["hotkeys"];
|
|
|
|
|
hk.Activate(this);
|
2021-08-08 22:51:06 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-08-13 23:20:38 +00:00
|
|
|
|
public void InitHwnd()
|
2021-08-08 22:51:06 +00:00
|
|
|
|
{
|
2021-08-13 23:20:38 +00:00
|
|
|
|
WindowInteropHelper helper = new(this);
|
|
|
|
|
helper.EnsureHandle();
|
2021-08-08 22:51:06 +00:00
|
|
|
|
}
|
2021-08-19 20:00:25 +00:00
|
|
|
|
|
|
|
|
|
public event PropertyChangedEventHandler PropertyChanged;
|
|
|
|
|
|
|
|
|
|
protected virtual void OnPropertyChanged(string propertyName)
|
|
|
|
|
{
|
|
|
|
|
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
|
|
|
|
}
|
2021-08-08 15:12:36 +00:00
|
|
|
|
}
|
|
|
|
|
}
|