unison/Views/MainWindow.xaml.cs

192 lines
6.7 KiB
C#
Raw Normal View History

using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Threading;
using System.Windows.Interop;
2021-08-27 17:49:57 +00:00
using System.Windows.Input;
namespace unison
{
public partial class MainWindow : Window, INotifyPropertyChanged
{
public readonly Settings SettingsWindow = new Settings();
private MPDHandler mpd;
Thickness SelectedThickness;
Thickness BaseThickness;
public MainWindow()
{
InitHwnd();
InitializeComponent();
WindowState = WindowState.Minimized;
2021-08-16 00:13:47 +00:00
mpd = (MPDHandler)Application.Current.Properties["mpd"];
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(0.5);
timer.Tick += Timer_Tick;
timer.Start();
SelectedThickness.Left = SelectedThickness.Right = SelectedThickness.Top = 0.0f;
SelectedThickness.Bottom = 2.0f;
BaseThickness.Left = BaseThickness.Right = BaseThickness.Top = BaseThickness.Bottom = 0.0f;
}
private void Timer_Tick(object sender, EventArgs e)
{
2021-08-16 00:13:47 +00:00
UpdateInterface();
}
public void UpdateButton(ref Border border, bool b)
{
if (b)
border.BorderThickness = SelectedThickness;
else
border.BorderThickness = BaseThickness;
}
public string FormatSeconds(int time)
{
TimeSpan timespan = TimeSpan.FromSeconds(time);
return timespan.ToString(@"mm\:ss");
}
public string FormatSeconds(double time)
{
TimeSpan timespan = TimeSpan.FromSeconds(time);
return timespan.ToString(@"mm\:ss");
}
public void UpdateInterface()
{
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-16 00:13:47 +00:00
if (VolumeSlider.Value != mpd._currentVolume)
{
2021-08-16 00:13:47 +00:00
VolumeSlider.Value = mpd._currentVolume;
VolumeSlider.ToolTip = mpd._currentVolume;
}
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-16 00:13:47 +00:00
Connection.Text = (mpd._connected ? "✔️" : "❌") + $"{Properties.Settings.Default.mpd_host}:{Properties.Settings.Default.mpd_port}";
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);
if (mpd.GetCover() == null)
{
NoCover.Visibility = Visibility.Visible;
Cover.Visibility = Visibility.Collapsed;
}
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-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-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
public void Snapcast_Clicked(object sender, RoutedEventArgs e)
{
SnapcastHandler snapcast = (SnapcastHandler)Application.Current.Properties["snapcast"];
if (!snapcast.Started)
2021-08-14 23:18:23 +00:00
snapcast.Start();
else
snapcast.Stop();
}
public void Settings_Clicked(object sender, RoutedEventArgs e)
{
SettingsWindow.Show();
SettingsWindow.Activate();
if (SettingsWindow.WindowState == WindowState.Minimized)
SettingsWindow.WindowState = WindowState.Normal;
}
private void Window_Closing(object sender, CancelEventArgs e)
{
e.Cancel = true;
WindowState = WindowState.Minimized;
Hide();
}
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;
double SongTime = mpd._totalTime;
2021-08-27 17:49:57 +00:00
double SeekTime = SongPercentage / 100 * SongTime;
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);
HotkeyHandler hk = (HotkeyHandler)Application.Current.Properties["hotkeys"];
hk.Activate(this);
2021-08-08 22:51:06 +00:00
}
public void InitHwnd()
2021-08-08 22:51:06 +00:00
{
WindowInteropHelper helper = new(this);
helper.EnsureHandle();
2021-08-08 22:51:06 +00:00
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}