Compare commits
15 Commits
shuffle
...
interface-
Author | SHA1 | Date | |
---|---|---|---|
31252cea0e | |||
e76cf3cd2a | |||
c785965041 | |||
b95edde7df | |||
5a8a5baa33 | |||
a3e09c2407 | |||
38a7856a0f | |||
e80f06d8bf | |||
18143d0311 | |||
049b861689 | |||
7d71d90538 | |||
8c9e1cd91c | |||
cef9f8d68c | |||
60f3442d38 | |||
b559ea01ab |
84
App.config
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<configuration>
|
||||||
|
<configSections>
|
||||||
|
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
|
||||||
|
<section name="unison.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
|
||||||
|
</sectionGroup>
|
||||||
|
</configSections>
|
||||||
|
<userSettings>
|
||||||
|
<unison.Properties.Settings>
|
||||||
|
<setting name="mpd_host" serializeAs="String">
|
||||||
|
<value>192.168.0.1</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="mpd_port" serializeAs="String">
|
||||||
|
<value>6600</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="mpd_password" serializeAs="String">
|
||||||
|
<value />
|
||||||
|
</setting>
|
||||||
|
<setting name="snapcast_startup" serializeAs="String">
|
||||||
|
<value>False</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="snapcast_window" serializeAs="String">
|
||||||
|
<value>False</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="snapcast_path" serializeAs="String">
|
||||||
|
<value>snapclient_0.26.0-1_win64</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="snapcast_port" serializeAs="String">
|
||||||
|
<value>1704</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="volume_offset" serializeAs="String">
|
||||||
|
<value>5</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="nextTrack_mod" serializeAs="String">
|
||||||
|
<value>2</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="nextTrack_vk" serializeAs="String">
|
||||||
|
<value>176</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="previousTrack_mod" serializeAs="String">
|
||||||
|
<value>2</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="previousTrack_vk" serializeAs="String">
|
||||||
|
<value>177</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="playPause_mod" serializeAs="String">
|
||||||
|
<value>2</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="playPause_vk" serializeAs="String">
|
||||||
|
<value>179</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="volumeUp_mod" serializeAs="String">
|
||||||
|
<value>2</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="volumeUp_vk" serializeAs="String">
|
||||||
|
<value>175</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="volumeDown_mod" serializeAs="String">
|
||||||
|
<value>2</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="volumeDown_vk" serializeAs="String">
|
||||||
|
<value>174</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="volumeMute_mod" serializeAs="String">
|
||||||
|
<value>2</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="volumeMute_vk" serializeAs="String">
|
||||||
|
<value>173</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="showWindow_mod" serializeAs="String">
|
||||||
|
<value>3</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="showWindow_vk" serializeAs="String">
|
||||||
|
<value>13</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="MainWindowTop" serializeAs="String">
|
||||||
|
<value>100</value>
|
||||||
|
</setting>
|
||||||
|
<setting name="MainWindowLeft" serializeAs="String">
|
||||||
|
<value>100</value>
|
||||||
|
</setting>
|
||||||
|
</unison.Properties.Settings>
|
||||||
|
</userSettings>
|
||||||
|
</configuration>
|
249
App.xaml
@ -11,6 +11,43 @@
|
|||||||
<ResourceDictionary Source="Resources/Resources.xaml" />
|
<ResourceDictionary Source="Resources/Resources.xaml" />
|
||||||
</ResourceDictionary.MergedDictionaries>
|
</ResourceDictionary.MergedDictionaries>
|
||||||
|
|
||||||
|
<Style TargetType="Button" x:Key="ButtonStyle">
|
||||||
|
<Setter Property="OverridesDefaultStyle" Value="True" />
|
||||||
|
|
||||||
|
<Setter Property="Margin" Value="1" />
|
||||||
|
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
|
||||||
|
|
||||||
|
<Setter Property="Background" Value="{x:Null}" />
|
||||||
|
<Setter Property="BorderBrush" Value="{x:Null}" />
|
||||||
|
<Setter Property="BorderThickness" Value="0" />
|
||||||
|
|
||||||
|
<Setter Property="Template">
|
||||||
|
<Setter.Value>
|
||||||
|
<ControlTemplate TargetType="Button">
|
||||||
|
<Grid Background="{TemplateBinding Background}">
|
||||||
|
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
|
||||||
|
<Border BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" CornerRadius="{TemplateBinding Border.CornerRadius}" />
|
||||||
|
</Grid>
|
||||||
|
</ControlTemplate>
|
||||||
|
</Setter.Value>
|
||||||
|
</Setter>
|
||||||
|
|
||||||
|
<Style.Triggers>
|
||||||
|
<Trigger Property="IsEnabled" Value="False">
|
||||||
|
<Setter Property="Background" Value="{x:Null}" />
|
||||||
|
<Setter Property="BorderBrush" Value="{x:Null}" />
|
||||||
|
<Setter Property="Foreground" Value="#FFABABAB" />
|
||||||
|
</Trigger>
|
||||||
|
|
||||||
|
<Trigger Property="IsMouseOver" Value="True">
|
||||||
|
<Setter Property="Background" Value="LightGray" />
|
||||||
|
<Setter Property="BorderBrush" Value="SlateGray" />
|
||||||
|
<Setter Property="BorderThickness" Value="1" />
|
||||||
|
<Setter Property="Border.CornerRadius" Value="2" />
|
||||||
|
</Trigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
|
||||||
<Style x:Key="RepeatButtonTransparent" TargetType="{x:Type RepeatButton}">
|
<Style x:Key="RepeatButtonTransparent" TargetType="{x:Type RepeatButton}">
|
||||||
<Setter Property="OverridesDefaultStyle" Value="true"/>
|
<Setter Property="OverridesDefaultStyle" Value="true"/>
|
||||||
<Setter Property="Background" Value="Transparent"/>
|
<Setter Property="Background" Value="Transparent"/>
|
||||||
@ -145,113 +182,113 @@
|
|||||||
</ControlTemplate.Triggers>
|
</ControlTemplate.Triggers>
|
||||||
</ControlTemplate>
|
</ControlTemplate>
|
||||||
<ControlTemplate x:Key="SliderThumbVerticalDefault" TargetType="{x:Type Thumb}">
|
<ControlTemplate x:Key="SliderThumbVerticalDefault" TargetType="{x:Type Thumb}">
|
||||||
<Grid HorizontalAlignment="Center" UseLayoutRounding="True" VerticalAlignment="Center">
|
<Grid HorizontalAlignment="Center" UseLayoutRounding="True" VerticalAlignment="Center">
|
||||||
<Path x:Name="grip" Data="M0.5,0.5 L18.5,0.5 18.5,11.5 0.5,11.5z" Fill="{StaticResource SliderThumb.Static.Background}" Stretch="Fill" Stroke="{StaticResource SliderThumb.Static.Border}"/>
|
<Path x:Name="grip" Data="M0.5,0.5 L18.5,0.5 18.5,11.5 0.5,11.5z" Fill="{StaticResource SliderThumb.Static.Background}" Stretch="Fill" Stroke="{StaticResource SliderThumb.Static.Border}"/>
|
||||||
|
</Grid>
|
||||||
|
<ControlTemplate.Triggers>
|
||||||
|
<Trigger Property="IsMouseOver" Value="true">
|
||||||
|
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Background}"/>
|
||||||
|
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Border}"/>
|
||||||
|
</Trigger>
|
||||||
|
<Trigger Property="IsDragging" Value="true">
|
||||||
|
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Background}"/>
|
||||||
|
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Border}"/>
|
||||||
|
</Trigger>
|
||||||
|
<Trigger Property="IsEnabled" Value="false">
|
||||||
|
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Background}"/>
|
||||||
|
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Border}"/>
|
||||||
|
</Trigger>
|
||||||
|
</ControlTemplate.Triggers>
|
||||||
|
</ControlTemplate>
|
||||||
|
<ControlTemplate x:Key="SliderThumbVerticalLeft" TargetType="{x:Type Thumb}">
|
||||||
|
<Grid HorizontalAlignment="Center" UseLayoutRounding="True" VerticalAlignment="Center">
|
||||||
|
<Path x:Name="grip" Data="M 6,11 C6,11 0,5.5 0,5.5 0,5.5 6,0 6,0 6,0 18,0 18,0 18,0 18,11 18,11 18,11 6,11 6,11 z" Fill="{StaticResource SliderThumb.Static.Background}" Stretch="Fill" Stroke="{StaticResource SliderThumb.Static.Border}"/>
|
||||||
|
</Grid>
|
||||||
|
<ControlTemplate.Triggers>
|
||||||
|
<Trigger Property="IsMouseOver" Value="true">
|
||||||
|
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Background}"/>
|
||||||
|
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Border}"/>
|
||||||
|
</Trigger>
|
||||||
|
<Trigger Property="IsDragging" Value="true">
|
||||||
|
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Background}"/>
|
||||||
|
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Border}"/>
|
||||||
|
</Trigger>
|
||||||
|
<Trigger Property="IsEnabled" Value="false">
|
||||||
|
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Background}"/>
|
||||||
|
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Border}"/>
|
||||||
|
</Trigger>
|
||||||
|
</ControlTemplate.Triggers>
|
||||||
|
</ControlTemplate>
|
||||||
|
<ControlTemplate x:Key="SliderThumbVerticalRight" TargetType="{x:Type Thumb}">
|
||||||
|
<Grid HorizontalAlignment="Center" UseLayoutRounding="True" VerticalAlignment="Center">
|
||||||
|
<Path x:Name="grip" Data="M 12,11 C12,11 18,5.5 18,5.5 18,5.5 12,0 12,0 12,0 0,0 0,0 0,0 0,11 0,11 0,11 12,11 12,11 z" Fill="{StaticResource SliderThumb.Static.Background}" Stretch="Fill" Stroke="{StaticResource SliderThumb.Static.Border}"/>
|
||||||
|
</Grid>
|
||||||
|
<ControlTemplate.Triggers>
|
||||||
|
<Trigger Property="IsMouseOver" Value="true">
|
||||||
|
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Background}"/>
|
||||||
|
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Border}"/>
|
||||||
|
</Trigger>
|
||||||
|
<Trigger Property="IsDragging" Value="true">
|
||||||
|
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Background}"/>
|
||||||
|
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Border}"/>
|
||||||
|
</Trigger>
|
||||||
|
<Trigger Property="IsEnabled" Value="false">
|
||||||
|
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Background}"/>
|
||||||
|
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Border}"/>
|
||||||
|
</Trigger>
|
||||||
|
</ControlTemplate.Triggers>
|
||||||
|
</ControlTemplate>
|
||||||
|
<ControlTemplate x:Key="SliderVertical" TargetType="{x:Type Slider}">
|
||||||
|
<Border x:Name="border" Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" SnapsToDevicePixels="True">
|
||||||
|
<Grid>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
<ColumnDefinition MinWidth="{TemplateBinding MinWidth}" Width="Auto"/>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<TickBar x:Name="TopTick" Grid.Column="0" Fill="{TemplateBinding Foreground}" Margin="0,0,2,0" Placement="Left" Visibility="Collapsed" Width="4"/>
|
||||||
|
<TickBar x:Name="BottomTick" Grid.Column="2" Fill="{TemplateBinding Foreground}" Margin="2,0,0,0" Placement="Right" Visibility="Collapsed" Width="4"/>
|
||||||
|
<Border x:Name="TrackBackground" Background="{StaticResource SliderThumb.Track.Background}" BorderThickness="1" BorderBrush="{StaticResource SliderThumb.Track.Border}" Grid.Column="1" HorizontalAlignment="center" Margin="0,5" Width="4.0">
|
||||||
|
<Canvas Margin="-1,-6">
|
||||||
|
<Rectangle x:Name="PART_SelectionRange" Fill="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" Visibility="Hidden" Width="4.0"/>
|
||||||
|
</Canvas>
|
||||||
|
</Border>
|
||||||
|
<Track x:Name="PART_Track" Grid.Column="1">
|
||||||
|
<Track.DecreaseRepeatButton>
|
||||||
|
<RepeatButton Command="{x:Static Slider.DecreaseLarge}" Style="{StaticResource RepeatButtonTransparent}"/>
|
||||||
|
</Track.DecreaseRepeatButton>
|
||||||
|
<Track.IncreaseRepeatButton>
|
||||||
|
<RepeatButton Command="{x:Static Slider.IncreaseLarge}" Style="{StaticResource RepeatButtonTransparent}"/>
|
||||||
|
</Track.IncreaseRepeatButton>
|
||||||
|
<Track.Thumb>
|
||||||
|
<Thumb x:Name="Thumb" Focusable="False" Height="11" OverridesDefaultStyle="True" Template="{StaticResource SliderThumbVerticalDefault}" VerticalAlignment="Top" Width="18"/>
|
||||||
|
</Track.Thumb>
|
||||||
|
</Track>
|
||||||
</Grid>
|
</Grid>
|
||||||
<ControlTemplate.Triggers>
|
</Border>
|
||||||
<Trigger Property="IsMouseOver" Value="true">
|
<ControlTemplate.Triggers>
|
||||||
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Background}"/>
|
<Trigger Property="TickPlacement" Value="TopLeft">
|
||||||
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Border}"/>
|
<Setter Property="Visibility" TargetName="TopTick" Value="Visible"/>
|
||||||
</Trigger>
|
<Setter Property="Template" TargetName="Thumb" Value="{StaticResource SliderThumbVerticalLeft}"/>
|
||||||
<Trigger Property="IsDragging" Value="true">
|
<Setter Property="Margin" TargetName="TrackBackground" Value="2,5,0,5"/>
|
||||||
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Background}"/>
|
</Trigger>
|
||||||
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Border}"/>
|
<Trigger Property="TickPlacement" Value="BottomRight">
|
||||||
</Trigger>
|
<Setter Property="Visibility" TargetName="BottomTick" Value="Visible"/>
|
||||||
<Trigger Property="IsEnabled" Value="false">
|
<Setter Property="Template" TargetName="Thumb" Value="{StaticResource SliderThumbVerticalRight}"/>
|
||||||
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Background}"/>
|
<Setter Property="Margin" TargetName="TrackBackground" Value="0,5,2,5"/>
|
||||||
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Border}"/>
|
</Trigger>
|
||||||
</Trigger>
|
<Trigger Property="TickPlacement" Value="Both">
|
||||||
</ControlTemplate.Triggers>
|
<Setter Property="Visibility" TargetName="TopTick" Value="Visible"/>
|
||||||
</ControlTemplate>
|
<Setter Property="Visibility" TargetName="BottomTick" Value="Visible"/>
|
||||||
<ControlTemplate x:Key="SliderThumbVerticalLeft" TargetType="{x:Type Thumb}">
|
</Trigger>
|
||||||
<Grid HorizontalAlignment="Center" UseLayoutRounding="True" VerticalAlignment="Center">
|
<Trigger Property="IsSelectionRangeEnabled" Value="true">
|
||||||
<Path x:Name="grip" Data="M 6,11 C6,11 0,5.5 0,5.5 0,5.5 6,0 6,0 6,0 18,0 18,0 18,0 18,11 18,11 18,11 6,11 6,11 z" Fill="{StaticResource SliderThumb.Static.Background}" Stretch="Fill" Stroke="{StaticResource SliderThumb.Static.Border}"/>
|
<Setter Property="Visibility" TargetName="PART_SelectionRange" Value="Visible"/>
|
||||||
</Grid>
|
</Trigger>
|
||||||
<ControlTemplate.Triggers>
|
<Trigger Property="IsKeyboardFocused" Value="true">
|
||||||
<Trigger Property="IsMouseOver" Value="true">
|
<Setter Property="Foreground" TargetName="Thumb" Value="Blue"/>
|
||||||
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Background}"/>
|
</Trigger>
|
||||||
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Border}"/>
|
</ControlTemplate.Triggers>
|
||||||
</Trigger>
|
</ControlTemplate>
|
||||||
<Trigger Property="IsDragging" Value="true">
|
|
||||||
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Background}"/>
|
|
||||||
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Border}"/>
|
|
||||||
</Trigger>
|
|
||||||
<Trigger Property="IsEnabled" Value="false">
|
|
||||||
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Background}"/>
|
|
||||||
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Border}"/>
|
|
||||||
</Trigger>
|
|
||||||
</ControlTemplate.Triggers>
|
|
||||||
</ControlTemplate>
|
|
||||||
<ControlTemplate x:Key="SliderThumbVerticalRight" TargetType="{x:Type Thumb}">
|
|
||||||
<Grid HorizontalAlignment="Center" UseLayoutRounding="True" VerticalAlignment="Center">
|
|
||||||
<Path x:Name="grip" Data="M 12,11 C12,11 18,5.5 18,5.5 18,5.5 12,0 12,0 12,0 0,0 0,0 0,0 0,11 0,11 0,11 12,11 12,11 z" Fill="{StaticResource SliderThumb.Static.Background}" Stretch="Fill" Stroke="{StaticResource SliderThumb.Static.Border}"/>
|
|
||||||
</Grid>
|
|
||||||
<ControlTemplate.Triggers>
|
|
||||||
<Trigger Property="IsMouseOver" Value="true">
|
|
||||||
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Background}"/>
|
|
||||||
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Border}"/>
|
|
||||||
</Trigger>
|
|
||||||
<Trigger Property="IsDragging" Value="true">
|
|
||||||
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Background}"/>
|
|
||||||
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Border}"/>
|
|
||||||
</Trigger>
|
|
||||||
<Trigger Property="IsEnabled" Value="false">
|
|
||||||
<Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Background}"/>
|
|
||||||
<Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Border}"/>
|
|
||||||
</Trigger>
|
|
||||||
</ControlTemplate.Triggers>
|
|
||||||
</ControlTemplate>
|
|
||||||
<ControlTemplate x:Key="SliderVertical" TargetType="{x:Type Slider}">
|
|
||||||
<Border x:Name="border" Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" SnapsToDevicePixels="True">
|
|
||||||
<Grid>
|
|
||||||
<Grid.ColumnDefinitions>
|
|
||||||
<ColumnDefinition Width="Auto"/>
|
|
||||||
<ColumnDefinition MinWidth="{TemplateBinding MinWidth}" Width="Auto"/>
|
|
||||||
<ColumnDefinition Width="Auto"/>
|
|
||||||
</Grid.ColumnDefinitions>
|
|
||||||
<TickBar x:Name="TopTick" Grid.Column="0" Fill="{TemplateBinding Foreground}" Margin="0,0,2,0" Placement="Left" Visibility="Collapsed" Width="4"/>
|
|
||||||
<TickBar x:Name="BottomTick" Grid.Column="2" Fill="{TemplateBinding Foreground}" Margin="2,0,0,0" Placement="Right" Visibility="Collapsed" Width="4"/>
|
|
||||||
<Border x:Name="TrackBackground" Background="{StaticResource SliderThumb.Track.Background}" BorderThickness="1" BorderBrush="{StaticResource SliderThumb.Track.Border}" Grid.Column="1" HorizontalAlignment="center" Margin="0,5" Width="4.0">
|
|
||||||
<Canvas Margin="-1,-6">
|
|
||||||
<Rectangle x:Name="PART_SelectionRange" Fill="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" Visibility="Hidden" Width="4.0"/>
|
|
||||||
</Canvas>
|
|
||||||
</Border>
|
|
||||||
<Track x:Name="PART_Track" Grid.Column="1">
|
|
||||||
<Track.DecreaseRepeatButton>
|
|
||||||
<RepeatButton Command="{x:Static Slider.DecreaseLarge}" Style="{StaticResource RepeatButtonTransparent}"/>
|
|
||||||
</Track.DecreaseRepeatButton>
|
|
||||||
<Track.IncreaseRepeatButton>
|
|
||||||
<RepeatButton Command="{x:Static Slider.IncreaseLarge}" Style="{StaticResource RepeatButtonTransparent}"/>
|
|
||||||
</Track.IncreaseRepeatButton>
|
|
||||||
<Track.Thumb>
|
|
||||||
<Thumb x:Name="Thumb" Focusable="False" Height="11" OverridesDefaultStyle="True" Template="{StaticResource SliderThumbVerticalDefault}" VerticalAlignment="Top" Width="18"/>
|
|
||||||
</Track.Thumb>
|
|
||||||
</Track>
|
|
||||||
</Grid>
|
|
||||||
</Border>
|
|
||||||
<ControlTemplate.Triggers>
|
|
||||||
<Trigger Property="TickPlacement" Value="TopLeft">
|
|
||||||
<Setter Property="Visibility" TargetName="TopTick" Value="Visible"/>
|
|
||||||
<Setter Property="Template" TargetName="Thumb" Value="{StaticResource SliderThumbVerticalLeft}"/>
|
|
||||||
<Setter Property="Margin" TargetName="TrackBackground" Value="2,5,0,5"/>
|
|
||||||
</Trigger>
|
|
||||||
<Trigger Property="TickPlacement" Value="BottomRight">
|
|
||||||
<Setter Property="Visibility" TargetName="BottomTick" Value="Visible"/>
|
|
||||||
<Setter Property="Template" TargetName="Thumb" Value="{StaticResource SliderThumbVerticalRight}"/>
|
|
||||||
<Setter Property="Margin" TargetName="TrackBackground" Value="0,5,2,5"/>
|
|
||||||
</Trigger>
|
|
||||||
<Trigger Property="TickPlacement" Value="Both">
|
|
||||||
<Setter Property="Visibility" TargetName="TopTick" Value="Visible"/>
|
|
||||||
<Setter Property="Visibility" TargetName="BottomTick" Value="Visible"/>
|
|
||||||
</Trigger>
|
|
||||||
<Trigger Property="IsSelectionRangeEnabled" Value="true">
|
|
||||||
<Setter Property="Visibility" TargetName="PART_SelectionRange" Value="Visible"/>
|
|
||||||
</Trigger>
|
|
||||||
<Trigger Property="IsKeyboardFocused" Value="true">
|
|
||||||
<Setter Property="Foreground" TargetName="Thumb" Value="Blue"/>
|
|
||||||
</Trigger>
|
|
||||||
</ControlTemplate.Triggers>
|
|
||||||
</ControlTemplate>
|
|
||||||
<Style x:Key="SliderTime" TargetType="{x:Type Slider}">
|
<Style x:Key="SliderTime" TargetType="{x:Type Slider}">
|
||||||
<Setter Property="Stylus.IsPressAndHoldEnabled" Value="false"/>
|
<Setter Property="Stylus.IsPressAndHoldEnabled" Value="false"/>
|
||||||
<Setter Property="Background" Value="Transparent"/>
|
<Setter Property="Background" Value="Transparent"/>
|
||||||
|
@ -15,11 +15,12 @@ namespace unison
|
|||||||
|
|
||||||
protected override void OnStartup(StartupEventArgs e)
|
protected override void OnStartup(StartupEventArgs e)
|
||||||
{
|
{
|
||||||
|
unison.Resources.Resources.Culture = System.Globalization.CultureInfo.CurrentCulture;
|
||||||
|
|
||||||
//debug language
|
//debug language
|
||||||
//unison.Resources.Resources.Culture = System.Globalization.CultureInfo.GetCultureInfo("fr-FR");
|
//unison.Resources.Resources.Culture = System.Globalization.CultureInfo.GetCultureInfo("fr-FR");
|
||||||
//unison.Resources.Resources.Culture = System.Globalization.CultureInfo.GetCultureInfo("es-ES");
|
//unison.Resources.Resources.Culture = System.Globalization.CultureInfo.GetCultureInfo("es-ES");
|
||||||
|
|
||||||
|
|
||||||
base.OnStartup(e);
|
base.OnStartup(e);
|
||||||
|
|
||||||
_mpd = new MPDHandler();
|
_mpd = new MPDHandler();
|
||||||
|
@ -49,12 +49,12 @@ namespace unison
|
|||||||
private MpdStatus _currentStatus;
|
private MpdStatus _currentStatus;
|
||||||
private IMpdFile _currentSong;
|
private IMpdFile _currentSong;
|
||||||
private BitmapImage _cover;
|
private BitmapImage _cover;
|
||||||
public Statistics _stats;
|
private readonly Statistics _stats;
|
||||||
private readonly System.Timers.Timer _elapsedTimer;
|
private readonly System.Timers.Timer _elapsedTimer;
|
||||||
private DispatcherTimer _retryTimer;
|
private readonly DispatcherTimer _retryTimer;
|
||||||
|
|
||||||
bool _isUpdatingStatus = false;
|
private bool _isUpdatingStatus = false;
|
||||||
bool _isUpdatingSong = false;
|
private bool _isUpdatingSong = false;
|
||||||
|
|
||||||
public IPAddress _ipAddress;
|
public IPAddress _ipAddress;
|
||||||
|
|
||||||
@ -70,6 +70,8 @@ namespace unison
|
|||||||
public CancellationTokenSource _cancelCommand;
|
public CancellationTokenSource _cancelCommand;
|
||||||
private CancellationTokenSource _cancelConnect;
|
private CancellationTokenSource _cancelConnect;
|
||||||
|
|
||||||
|
private bool UpdateStarted = false;
|
||||||
|
|
||||||
public MPDHandler()
|
public MPDHandler()
|
||||||
{
|
{
|
||||||
Startup(null, null);
|
Startup(null, null);
|
||||||
@ -154,7 +156,7 @@ namespace unison
|
|||||||
if (_commandConnection == null || !IsConnected())
|
if (_commandConnection == null || !IsConnected())
|
||||||
{
|
{
|
||||||
Trace.WriteLine("[SafelySendCommandAsync] no command connection");
|
Trace.WriteLine("[SafelySendCommandAsync] no command connection");
|
||||||
return default(T);
|
return default;
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
@ -176,7 +178,7 @@ namespace unison
|
|||||||
Trace.WriteLine($"Sending {command.GetType().Name} failed: {e.Message}");
|
Trace.WriteLine($"Sending {command.GetType().Name} failed: {e.Message}");
|
||||||
}
|
}
|
||||||
|
|
||||||
return default(T);
|
return default;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async void Startup(object sender, EventArgs e)
|
public async void Startup(object sender, EventArgs e)
|
||||||
@ -338,12 +340,15 @@ namespace unison
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (subsystems.Contains("player") || subsystems.Contains("mixer") || subsystems.Contains("output") || subsystems.Contains("options"))
|
if (subsystems.Contains("player") || subsystems.Contains("mixer") || subsystems.Contains("output") || subsystems.Contains("options") || subsystems.Contains("update"))
|
||||||
{
|
{
|
||||||
await UpdateStatusAsync();
|
await UpdateStatusAsync();
|
||||||
|
|
||||||
if (subsystems.Contains("player"))
|
if (subsystems.Contains("player"))
|
||||||
await UpdateSongAsync();
|
await UpdateSongAsync();
|
||||||
|
|
||||||
|
if (subsystems.Contains("update"))
|
||||||
|
UpdateDatabaseSync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
@ -353,6 +358,30 @@ namespace unison
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void UpdateDatabaseSync()
|
||||||
|
{
|
||||||
|
if (!UpdateStarted)
|
||||||
|
{
|
||||||
|
Application.Current.Dispatcher.Invoke(() =>
|
||||||
|
{
|
||||||
|
MainWindow MainWin = (MainWindow)Application.Current.MainWindow;
|
||||||
|
MainWin.GetSettings().MPDDatabaseUpdate_Start();
|
||||||
|
});
|
||||||
|
|
||||||
|
UpdateStarted = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Application.Current.Dispatcher.Invoke(() =>
|
||||||
|
{
|
||||||
|
MainWindow MainWin = (MainWindow)Application.Current.MainWindow;
|
||||||
|
MainWin.GetSettings().MPDDatabaseUpdate_Stop();
|
||||||
|
MainWin.UpdateStats();
|
||||||
|
});
|
||||||
|
UpdateStarted = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private async Task UpdateStatusAsync()
|
private async Task UpdateStatusAsync()
|
||||||
{
|
{
|
||||||
if (_connection == null || _isUpdatingStatus)
|
if (_connection == null || _isUpdatingStatus)
|
||||||
@ -407,6 +436,8 @@ namespace unison
|
|||||||
}
|
}
|
||||||
|
|
||||||
_isUpdatingSong = false;
|
_isUpdatingSong = false;
|
||||||
|
|
||||||
|
Trace.WriteLine("Updated song");
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void GetAlbumCover(string path, CancellationToken token)
|
private async void GetAlbumCover(string path, CancellationToken token)
|
||||||
@ -536,13 +567,13 @@ namespace unison
|
|||||||
|
|
||||||
public void Prev()
|
public void Prev()
|
||||||
{
|
{
|
||||||
if (CanPrevNext)
|
if (CanPrevNext && !_isUpdatingSong)
|
||||||
SendCommand(new PreviousCommand());
|
SendCommand(new PreviousCommand());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Next()
|
public void Next()
|
||||||
{
|
{
|
||||||
if (CanPrevNext)
|
if (CanPrevNext && !_isUpdatingSong)
|
||||||
SendCommand(new NextCommand());
|
SendCommand(new NextCommand());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -608,7 +639,36 @@ namespace unison
|
|||||||
{
|
{
|
||||||
if (_Playlist == null)
|
if (_Playlist == null)
|
||||||
return 0;
|
return 0;
|
||||||
return _Playlist.ToArray().Count();
|
return _Playlist.ToArray().Length;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateDB() => SendCommand(new UpdateCommand());
|
||||||
|
|
||||||
|
private static string FormatTime(TimeSpan time)
|
||||||
|
{
|
||||||
|
string FormattedTime = "";
|
||||||
|
|
||||||
|
if (time.Days == 1)
|
||||||
|
FormattedTime += $"{time.Days} {Resources.Resources.Day}, ";
|
||||||
|
else if (time.Days > 1)
|
||||||
|
FormattedTime += $"{time.Days} {Resources.Resources.Days}, ";
|
||||||
|
|
||||||
|
if (time.Hours == 1)
|
||||||
|
FormattedTime += $"{time.Hours} {Resources.Resources.Hour}, ";
|
||||||
|
else
|
||||||
|
FormattedTime += $"{time.Hours} {Resources.Resources.Hours}, ";
|
||||||
|
|
||||||
|
if (time.Minutes == 1)
|
||||||
|
FormattedTime += $"{time.Minutes} {Resources.Resources.Minute}, ";
|
||||||
|
else
|
||||||
|
FormattedTime += $"{time.Minutes} {Resources.Resources.Minutes}, ";
|
||||||
|
|
||||||
|
if (time.Seconds == 1)
|
||||||
|
FormattedTime += $"{time.Seconds} {Resources.Resources.Second}";
|
||||||
|
else
|
||||||
|
FormattedTime += $"{time.Seconds} {Resources.Resources.Seconds}";
|
||||||
|
|
||||||
|
return FormattedTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async void QueryStats()
|
public async void QueryStats()
|
||||||
@ -621,16 +681,13 @@ namespace unison
|
|||||||
_stats.Albums = int.Parse(Response["albums"]);
|
_stats.Albums = int.Parse(Response["albums"]);
|
||||||
_stats.Artists = int.Parse(Response["artists"]);
|
_stats.Artists = int.Parse(Response["artists"]);
|
||||||
|
|
||||||
TimeSpan time;
|
_stats.Uptime = FormatTime(TimeSpan.FromSeconds(int.Parse(Response["uptime"])));
|
||||||
time = TimeSpan.FromSeconds(int.Parse(Response["uptime"]));
|
_stats.TotalPlaytime = FormatTime(TimeSpan.FromSeconds(int.Parse(Response["db_playtime"])));
|
||||||
_stats.Uptime = time.ToString(@"dd\:hh\:mm\:ss");
|
_stats.TotalTimePlayed = FormatTime(TimeSpan.FromSeconds(int.Parse(Response["playtime"])));
|
||||||
time = TimeSpan.FromSeconds(int.Parse(Response["db_playtime"]));
|
|
||||||
_stats.TotalPlaytime = time.ToString(@"dd\:hh\:mm\:ss");
|
|
||||||
time = TimeSpan.FromSeconds(int.Parse(Response["playtime"]));
|
|
||||||
_stats.TotalTimePlayed = time.ToString(@"dd\:hh\:mm\:ss");
|
|
||||||
|
|
||||||
DateTime date = new DateTime(1970, 1, 1).AddSeconds(int.Parse(Response["db_update"])).ToLocalTime();
|
DateTime date = new DateTime(1970, 1, 1).AddSeconds(int.Parse(Response["db_update"])).ToLocalTime();
|
||||||
_stats.DatabaseUpdate = date.ToString("dd/MM/yyyy @ HH:mm");
|
string dayOfWeek = Resources.Resources.Culture.DateTimeFormat.GetDayName(date.DayOfWeek);
|
||||||
|
_stats.DatabaseUpdate = dayOfWeek + " " + date.ToString("dd/MM/yyyy @ HH:mm");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -17,8 +17,8 @@ namespace unison
|
|||||||
class ShuffleHandler
|
class ShuffleHandler
|
||||||
{
|
{
|
||||||
private readonly MPDHandler _mpd;
|
private readonly MPDHandler _mpd;
|
||||||
public int AddedSongs = 0;
|
|
||||||
|
|
||||||
|
public int AddedSongs = 0;
|
||||||
public List<string> SongList { get; }
|
public List<string> SongList { get; }
|
||||||
|
|
||||||
public ShuffleHandler()
|
public ShuffleHandler()
|
||||||
@ -81,6 +81,7 @@ namespace unison
|
|||||||
AddedSongs++;
|
AddedSongs++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
commandList.Add(new PlayCommand(0));
|
||||||
await _mpd.SafelySendCommandAsync(commandList);
|
await _mpd.SafelySendCommandAsync(commandList);
|
||||||
}
|
}
|
||||||
// more available songs than requested =>
|
// more available songs than requested =>
|
||||||
@ -101,6 +102,7 @@ namespace unison
|
|||||||
AddedSongs++;
|
AddedSongs++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
commandList.Add(new PlayCommand(0));
|
||||||
await _mpd.SafelySendCommandAsync(commandList);
|
await _mpd.SafelySendCommandAsync(commandList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ namespace unison
|
|||||||
public class SnapcastHandler
|
public class SnapcastHandler
|
||||||
{
|
{
|
||||||
private readonly Process _snapcast = new();
|
private readonly Process _snapcast = new();
|
||||||
|
|
||||||
public bool HasStarted { get; private set; }
|
public bool HasStarted { get; private set; }
|
||||||
|
|
||||||
public void OnConnectionChanged(object sender, EventArgs e)
|
public void OnConnectionChanged(object sender, EventArgs e)
|
||||||
@ -30,7 +31,7 @@ namespace unison
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateInterface()
|
public static void UpdateInterface()
|
||||||
{
|
{
|
||||||
TaskbarIcon Systray = (TaskbarIcon)Application.Current.Properties["systray"];
|
TaskbarIcon Systray = (TaskbarIcon)Application.Current.Properties["systray"];
|
||||||
SystrayViewModel DataContext = Systray.DataContext as SystrayViewModel;
|
SystrayViewModel DataContext = Systray.DataContext as SystrayViewModel;
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
using System.Diagnostics;
|
using System.Windows;
|
||||||
using System.Windows;
|
|
||||||
using AutoUpdaterDotNET;
|
using AutoUpdaterDotNET;
|
||||||
|
|
||||||
namespace unison.Handlers
|
namespace unison.Handlers
|
||||||
@ -9,10 +8,10 @@ namespace unison.Handlers
|
|||||||
readonly string xmlFile = "https://raw.githubusercontent.com/ZetaKebab/unison/main/Installer/unison.xml";
|
readonly string xmlFile = "https://raw.githubusercontent.com/ZetaKebab/unison/main/Installer/unison.xml";
|
||||||
|
|
||||||
private bool _UpdateAvailable = false;
|
private bool _UpdateAvailable = false;
|
||||||
public bool UpdateAvailable() => _UpdateAvailable;
|
|
||||||
|
|
||||||
private bool _RequestedCheck = false;
|
private bool _RequestedCheck = false;
|
||||||
|
|
||||||
|
public bool UpdateAvailable() => _UpdateAvailable;
|
||||||
|
|
||||||
public UpdateHandler()
|
public UpdateHandler()
|
||||||
{
|
{
|
||||||
AutoUpdater.CheckForUpdateEvent += AutoUpdaterOnCheckForUpdateEvent;
|
AutoUpdater.CheckForUpdateEvent += AutoUpdaterOnCheckForUpdateEvent;
|
||||||
@ -25,7 +24,7 @@ namespace unison.Handlers
|
|||||||
AutoUpdater.Start(xmlFile);
|
AutoUpdater.Start(xmlFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
private string CutVersionNumber(string number)
|
private static string CutVersionNumber(string number)
|
||||||
{
|
{
|
||||||
return number.Substring(0, number.LastIndexOf("."));
|
return number.Substring(0, number.LastIndexOf("."));
|
||||||
}
|
}
|
||||||
|
26
Properties/Settings.Designer.cs
generated
@ -12,7 +12,7 @@ namespace unison.Properties {
|
|||||||
|
|
||||||
|
|
||||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.10.0.0")]
|
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.4.0.0")]
|
||||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
||||||
|
|
||||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||||
@ -286,5 +286,29 @@ namespace unison.Properties {
|
|||||||
this["showWindow_vk"] = value;
|
this["showWindow_vk"] = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("100")]
|
||||||
|
public double MainWindowTop {
|
||||||
|
get {
|
||||||
|
return ((double)(this["MainWindowTop"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["MainWindowTop"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("100")]
|
||||||
|
public double MainWindowLeft {
|
||||||
|
get {
|
||||||
|
return ((double)(this["MainWindowLeft"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["MainWindowLeft"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -68,5 +68,11 @@
|
|||||||
<Setting Name="showWindow_vk" Type="System.UInt32" Scope="User">
|
<Setting Name="showWindow_vk" Type="System.UInt32" Scope="User">
|
||||||
<Value Profile="(Default)">13</Value>
|
<Value Profile="(Default)">13</Value>
|
||||||
</Setting>
|
</Setting>
|
||||||
|
<Setting Name="MainWindowTop" Type="System.Double" Scope="User">
|
||||||
|
<Value Profile="(Default)">100</Value>
|
||||||
|
</Setting>
|
||||||
|
<Setting Name="MainWindowLeft" Type="System.Double" Scope="User">
|
||||||
|
<Value Profile="(Default)">100</Value>
|
||||||
|
</Setting>
|
||||||
</Settings>
|
</Settings>
|
||||||
</SettingsFile>
|
</SettingsFile>
|
25
README.md
@ -1,6 +1,6 @@
|
|||||||
# unison
|
# unison
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
**unison** is a very simple [Music Player Daemon (MPD)](https://www.musicpd.org/) daemon client with the following goals:
|
**unison** is a very simple [Music Player Daemon (MPD)](https://www.musicpd.org/) daemon client with the following goals:
|
||||||
|
|
||||||
@ -15,25 +15,13 @@
|
|||||||
|
|
||||||
By default, unison works as a daemon in the taskbar system tray. You can display the main window when needed at any time with a shortcut.
|
By default, unison works as a daemon in the taskbar system tray. You can display the main window when needed at any time with a shortcut.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### Shortcuts
|
### Shortcuts
|
||||||
|
|
||||||
You can control your music at anytime with the shortcuts. They are usable system-wide, even if the window is not visible. They are of course fully rebindable.
|
You can control your music at anytime with the shortcuts. They are usable system-wide, even if the window is not visible. They are of course fully rebindable.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### Shuffle panel
|
|
||||||
|
|
||||||
One of unison's main feature is a complete shuffle system based on criterias, aka a smart playlist.
|
|
||||||
|
|
||||||
You have two options:
|
|
||||||
* **Add to queue** allows you to add a defined number of songs to the queue.
|
|
||||||
* **Continuous shuffle** allows you, as long as the program is running, to automatically add songs to the queue.
|
|
||||||
|
|
||||||
Each of these options work with filters, but if none are selected, it is based on the entire library.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### Snapcast
|
### Snapcast
|
||||||
|
|
||||||
@ -43,13 +31,12 @@ Embedding a Snapcast client allows to listen to music on multiple devices. For e
|
|||||||
|
|
||||||
Through [Radio-Browser](https://www.radio-browser.info), a community database, you can play radio streams directly from unison. There are more than 28,000 stations recorded on this service, so it is a nice way to discover new music and cultures.
|
Through [Radio-Browser](https://www.radio-browser.info), a community database, you can play radio streams directly from unison. There are more than 28,000 stations recorded on this service, so it is a nice way to discover new music and cultures.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Planned features
|
## Planned features
|
||||||
|
|
||||||
* Playlist, queue and library management
|
* A complete shuffle system based on set criteria, aka a smart playlist.
|
||||||
* More options for the shuffle panel
|
* Playlist, queue and library management. I use other software to do it, but I will implement them at some point.
|
||||||
* Dark mode
|
|
||||||
|
|
||||||
## Translations
|
## Translations
|
||||||
|
|
||||||
|
369
Resources/Resources.Designer.cs
generated
@ -60,6 +60,33 @@ namespace unison.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Database.
|
||||||
|
/// </summary>
|
||||||
|
public static string Database {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Database", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to day.
|
||||||
|
/// </summary>
|
||||||
|
public static string Day {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Day", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to days.
|
||||||
|
/// </summary>
|
||||||
|
public static string Days {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Days", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Exit.
|
/// Looks up a localized string similar to Exit.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -69,6 +96,123 @@ namespace unison.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Album.
|
||||||
|
/// </summary>
|
||||||
|
public static string FilterType_Album {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("FilterType_Album", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Artist.
|
||||||
|
/// </summary>
|
||||||
|
public static string FilterType_Artist {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("FilterType_Artist", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Directory.
|
||||||
|
/// </summary>
|
||||||
|
public static string FilterType_Directory {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("FilterType_Directory", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Genre.
|
||||||
|
/// </summary>
|
||||||
|
public static string FilterType_Genre {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("FilterType_Genre", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Song.
|
||||||
|
/// </summary>
|
||||||
|
public static string FilterType_Song {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("FilterType_Song", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Year.
|
||||||
|
/// </summary>
|
||||||
|
public static string FilterType_Year {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("FilterType_Year", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to hour.
|
||||||
|
/// </summary>
|
||||||
|
public static string Hour {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Hour", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to hours.
|
||||||
|
/// </summary>
|
||||||
|
public static string Hours {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Hours", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to minute.
|
||||||
|
/// </summary>
|
||||||
|
public static string Minute {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Minute", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to minutes.
|
||||||
|
/// </summary>
|
||||||
|
public static string Minutes {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Minutes", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to contains.
|
||||||
|
/// </summary>
|
||||||
|
public static string Operator_Contains {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Operator_Contains", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to is.
|
||||||
|
/// </summary>
|
||||||
|
public static string Operator_Is {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Operator_Is", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to is not.
|
||||||
|
/// </summary>
|
||||||
|
public static string Operator_IsNot {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Operator_IsNot", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Country.
|
/// Looks up a localized string similar to Country.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -150,6 +294,24 @@ namespace unison.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to second.
|
||||||
|
/// </summary>
|
||||||
|
public static string Second {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Second", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to seconds.
|
||||||
|
/// </summary>
|
||||||
|
public static string Seconds {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Seconds", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Settings.
|
/// Looks up a localized string similar to Settings.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -348,6 +510,51 @@ namespace unison.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to The shuffle window allows to add random songs to your queue. Both options take into account the filter..
|
||||||
|
/// </summary>
|
||||||
|
public static string Settings_Shuffle1 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Settings_Shuffle1", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to If the filter is empty, the entire music library is taken into account..
|
||||||
|
/// </summary>
|
||||||
|
public static string Settings_Shuffle2 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Settings_Shuffle2", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to The filter is queried each time you use the Add to queue or Continuous shuffle options..
|
||||||
|
/// </summary>
|
||||||
|
public static string Settings_Shuffle3 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Settings_Shuffle3", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Add a fixed number of songs to the queue. For technical reasons, it is limited to 100 random songs without a filter, and to 1000 songs with a filter..
|
||||||
|
/// </summary>
|
||||||
|
public static string Settings_Shuffle4 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Settings_Shuffle4", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to By enabling this option, unison will automatically add songs to the queue so you never run out of songs to listen to..
|
||||||
|
/// </summary>
|
||||||
|
public static string Settings_Shuffle5 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Settings_Shuffle5", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to You can change to your own locally installed version of the Snapcast client with an.
|
/// Looks up a localized string similar to You can change to your own locally installed version of the Snapcast client with an.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -438,6 +645,15 @@ namespace unison.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Update database.
|
||||||
|
/// </summary>
|
||||||
|
public static string Settings_UpdateDatabase {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Settings_UpdateDatabase", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Version:.
|
/// Looks up a localized string similar to Version:.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -492,6 +708,132 @@ namespace unison.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Shuffle.
|
||||||
|
/// </summary>
|
||||||
|
public static string Shuffle {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Shuffle", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Adding.
|
||||||
|
/// </summary>
|
||||||
|
public static string Shuffle_ButtonMessage1 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Shuffle_ButtonMessage1", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to songs....
|
||||||
|
/// </summary>
|
||||||
|
public static string Shuffle_ButtonMessage2 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Shuffle_ButtonMessage2", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to done!.
|
||||||
|
/// </summary>
|
||||||
|
public static string Shuffle_ButtonMessage3 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Shuffle_ButtonMessage3", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Continuous shuffle.
|
||||||
|
/// </summary>
|
||||||
|
public static string Shuffle_Continuous {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Shuffle_Continuous", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Enable continuous shuffle.
|
||||||
|
/// </summary>
|
||||||
|
public static string Shuffle_ContinuousEnable {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Shuffle_ContinuousEnable", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Filter.
|
||||||
|
/// </summary>
|
||||||
|
public static string Shuffle_Filter {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Shuffle_Filter", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Query filter.
|
||||||
|
/// </summary>
|
||||||
|
public static string Shuffle_FilterQuery {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Shuffle_FilterQuery", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Reset.
|
||||||
|
/// </summary>
|
||||||
|
public static string Shuffle_FilterReset {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Shuffle_FilterReset", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Number of songs in filter:.
|
||||||
|
/// </summary>
|
||||||
|
public static string Shuffle_FilterSongNumber {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Shuffle_FilterSongNumber", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Querying filter....
|
||||||
|
/// </summary>
|
||||||
|
public static string Shuffle_Querying1 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Shuffle_Querying1", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to done!.
|
||||||
|
/// </summary>
|
||||||
|
public static string Shuffle_Querying2 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Shuffle_Querying2", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Add to queue.
|
||||||
|
/// </summary>
|
||||||
|
public static string Shuffle_Queue {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Shuffle_Queue", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Songs to add.
|
||||||
|
/// </summary>
|
||||||
|
public static string Shuffle_QueueSongs {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Shuffle_QueueSongs", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Snapcast error.
|
/// Looks up a localized string similar to Snapcast error.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -537,15 +879,6 @@ namespace unison.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Stats.
|
|
||||||
/// </summary>
|
|
||||||
public static string Stats {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("Stats", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Albums:.
|
/// Looks up a localized string similar to Albums:.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -600,6 +933,24 @@ namespace unison.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Updating database....
|
||||||
|
/// </summary>
|
||||||
|
public static string Stats_UpdateDBMessage1 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Stats_UpdateDBMessage1", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to done!.
|
||||||
|
/// </summary>
|
||||||
|
public static string Stats_UpdateDBMessage2 {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Stats_UpdateDBMessage2", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to MPD uptime:.
|
/// Looks up a localized string similar to MPD uptime:.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -117,9 +117,57 @@
|
|||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
|
<data name="Database" xml:space="preserve">
|
||||||
|
<value>Base de datos</value>
|
||||||
|
</data>
|
||||||
|
<data name="Day" xml:space="preserve">
|
||||||
|
<value>día</value>
|
||||||
|
</data>
|
||||||
|
<data name="Days" xml:space="preserve">
|
||||||
|
<value>días</value>
|
||||||
|
</data>
|
||||||
<data name="Exit" xml:space="preserve">
|
<data name="Exit" xml:space="preserve">
|
||||||
<value>Salir</value>
|
<value>Salir</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="FilterType_Album" xml:space="preserve">
|
||||||
|
<value>Album</value>
|
||||||
|
</data>
|
||||||
|
<data name="FilterType_Artist" xml:space="preserve">
|
||||||
|
<value>Artista</value>
|
||||||
|
</data>
|
||||||
|
<data name="FilterType_Directory" xml:space="preserve">
|
||||||
|
<value>Directorio</value>
|
||||||
|
</data>
|
||||||
|
<data name="FilterType_Genre" xml:space="preserve">
|
||||||
|
<value>Género</value>
|
||||||
|
</data>
|
||||||
|
<data name="FilterType_Song" xml:space="preserve">
|
||||||
|
<value>Canción</value>
|
||||||
|
</data>
|
||||||
|
<data name="FilterType_Year" xml:space="preserve">
|
||||||
|
<value>Año</value>
|
||||||
|
</data>
|
||||||
|
<data name="Hour" xml:space="preserve">
|
||||||
|
<value>hora</value>
|
||||||
|
</data>
|
||||||
|
<data name="Hours" xml:space="preserve">
|
||||||
|
<value>horas</value>
|
||||||
|
</data>
|
||||||
|
<data name="Minute" xml:space="preserve">
|
||||||
|
<value>minuto</value>
|
||||||
|
</data>
|
||||||
|
<data name="Minutes" xml:space="preserve">
|
||||||
|
<value>minutos</value>
|
||||||
|
</data>
|
||||||
|
<data name="Operator_Contains" xml:space="preserve">
|
||||||
|
<value>contiene</value>
|
||||||
|
</data>
|
||||||
|
<data name="Operator_Is" xml:space="preserve">
|
||||||
|
<value>es</value>
|
||||||
|
</data>
|
||||||
|
<data name="Operator_IsNot" xml:space="preserve">
|
||||||
|
<value>no es</value>
|
||||||
|
</data>
|
||||||
<data name="Radios" xml:space="preserve">
|
<data name="Radios" xml:space="preserve">
|
||||||
<value>Radios</value>
|
<value>Radios</value>
|
||||||
</data>
|
</data>
|
||||||
@ -147,6 +195,12 @@
|
|||||||
<data name="Radio_Tags" xml:space="preserve">
|
<data name="Radio_Tags" xml:space="preserve">
|
||||||
<value>Tags</value>
|
<value>Tags</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Second" xml:space="preserve">
|
||||||
|
<value>segundo</value>
|
||||||
|
</data>
|
||||||
|
<data name="Seconds" xml:space="preserve">
|
||||||
|
<value>segundos</value>
|
||||||
|
</data>
|
||||||
<data name="Settings" xml:space="preserve">
|
<data name="Settings" xml:space="preserve">
|
||||||
<value>Ajustes</value>
|
<value>Ajustes</value>
|
||||||
</data>
|
</data>
|
||||||
@ -213,6 +267,21 @@
|
|||||||
<data name="Settings_ShowWindow" xml:space="preserve">
|
<data name="Settings_ShowWindow" xml:space="preserve">
|
||||||
<value>Mostrar ventana</value>
|
<value>Mostrar ventana</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Settings_Shuffle1" xml:space="preserve">
|
||||||
|
<value>La ventana Aleatorio permite agregar canciones aleatorias a la fila. La dos opciones tienen en cuenta el filtro.</value>
|
||||||
|
</data>
|
||||||
|
<data name="Settings_Shuffle2" xml:space="preserve">
|
||||||
|
<value>Si el filtro es vacío, la integralidad de la biblioteca musical se tiene en cuenta.</value>
|
||||||
|
</data>
|
||||||
|
<data name="Settings_Shuffle3" xml:space="preserve">
|
||||||
|
<value>El filtro es buscado cada vez que las opciones Agregar a la fila o Aleatorio continuo son usadas.</value>
|
||||||
|
</data>
|
||||||
|
<data name="Settings_Shuffle4" xml:space="preserve">
|
||||||
|
<value>Agrega un número dado de canciones a la fila. For razones tecnicas, es opción es limitada a 100 canciones aleatorias sin filtro, y a 1000 canciones con filtro.</value>
|
||||||
|
</data>
|
||||||
|
<data name="Settings_Shuffle5" xml:space="preserve">
|
||||||
|
<value>Activando esa opción, unison va a agregar automaticamente canciones a la fila para nunca llegar al cabo de canciones a escuchar.</value>
|
||||||
|
</data>
|
||||||
<data name="Settings_SnapcastInfo1" xml:space="preserve">
|
<data name="Settings_SnapcastInfo1" xml:space="preserve">
|
||||||
<value>Puede cambiar a su propia versión instalada localmente del cliente Snapcast con una ruta</value>
|
<value>Puede cambiar a su propia versión instalada localmente del cliente Snapcast con una ruta</value>
|
||||||
</data>
|
</data>
|
||||||
@ -243,6 +312,9 @@
|
|||||||
<data name="Settings_SourceCode2" xml:space="preserve">
|
<data name="Settings_SourceCode2" xml:space="preserve">
|
||||||
<value>aquí</value>
|
<value>aquí</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Settings_UpdateDatabase" xml:space="preserve">
|
||||||
|
<value>Actualizar base de datos</value>
|
||||||
|
</data>
|
||||||
<data name="Settings_Version" xml:space="preserve">
|
<data name="Settings_Version" xml:space="preserve">
|
||||||
<value>Versión:</value>
|
<value>Versión:</value>
|
||||||
</data>
|
</data>
|
||||||
@ -261,6 +333,48 @@
|
|||||||
<data name="ShowWindow" xml:space="preserve">
|
<data name="ShowWindow" xml:space="preserve">
|
||||||
<value>Mostrar ventana</value>
|
<value>Mostrar ventana</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Shuffle" xml:space="preserve">
|
||||||
|
<value>Aleatorio</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_ButtonMessage1" xml:space="preserve">
|
||||||
|
<value>Agregando</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_ButtonMessage2" xml:space="preserve">
|
||||||
|
<value>canciones...</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_ButtonMessage3" xml:space="preserve">
|
||||||
|
<value>¡terminado!</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_Continuous" xml:space="preserve">
|
||||||
|
<value>Aleatorio continuo</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_ContinuousEnable" xml:space="preserve">
|
||||||
|
<value>Empezar aleatorio continuo</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_Filter" xml:space="preserve">
|
||||||
|
<value>Filtro</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_FilterQuery" xml:space="preserve">
|
||||||
|
<value>Búsqueda de filtro</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_FilterReset" xml:space="preserve">
|
||||||
|
<value>Reinicializar</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_FilterSongNumber" xml:space="preserve">
|
||||||
|
<value>Canciones en el filtro:</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_Querying1" xml:space="preserve">
|
||||||
|
<value>Búsqueda de filtro...</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_Querying2" xml:space="preserve">
|
||||||
|
<value>¡terminado!</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_Queue" xml:space="preserve">
|
||||||
|
<value>Agregar a la fila</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_QueueSongs" xml:space="preserve">
|
||||||
|
<value>Canciones para agregar</value>
|
||||||
|
</data>
|
||||||
<data name="Snapcast_Popup1" xml:space="preserve">
|
<data name="Snapcast_Popup1" xml:space="preserve">
|
||||||
<value>Error Snapcast</value>
|
<value>Error Snapcast</value>
|
||||||
</data>
|
</data>
|
||||||
@ -276,9 +390,6 @@
|
|||||||
<data name="StartSnapcast" xml:space="preserve">
|
<data name="StartSnapcast" xml:space="preserve">
|
||||||
<value>Iniciar Snapcast</value>
|
<value>Iniciar Snapcast</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Stats" xml:space="preserve">
|
|
||||||
<value>Estadísticas</value>
|
|
||||||
</data>
|
|
||||||
<data name="Stats_Albums" xml:space="preserve">
|
<data name="Stats_Albums" xml:space="preserve">
|
||||||
<value>Álbumes:</value>
|
<value>Álbumes:</value>
|
||||||
</data>
|
</data>
|
||||||
@ -297,6 +408,12 @@
|
|||||||
<data name="Stats_TotalTimePlayed" xml:space="preserve">
|
<data name="Stats_TotalTimePlayed" xml:space="preserve">
|
||||||
<value>Tiempo total jugado:</value>
|
<value>Tiempo total jugado:</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Stats_UpdateDBMessage1" xml:space="preserve">
|
||||||
|
<value>Actualizando base de datos...</value>
|
||||||
|
</data>
|
||||||
|
<data name="Stats_UpdateDBMessage2" xml:space="preserve">
|
||||||
|
<value> ¡terminado!</value>
|
||||||
|
</data>
|
||||||
<data name="Stats_Uptime" xml:space="preserve">
|
<data name="Stats_Uptime" xml:space="preserve">
|
||||||
<value>Tiempo de actividad de MPD:</value>
|
<value>Tiempo de actividad de MPD:</value>
|
||||||
</data>
|
</data>
|
||||||
|
@ -117,9 +117,57 @@
|
|||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
|
<data name="Database" xml:space="preserve">
|
||||||
|
<value>Base de donnée</value>
|
||||||
|
</data>
|
||||||
|
<data name="Day" xml:space="preserve">
|
||||||
|
<value>jour</value>
|
||||||
|
</data>
|
||||||
|
<data name="Days" xml:space="preserve">
|
||||||
|
<value>jours</value>
|
||||||
|
</data>
|
||||||
<data name="Exit" xml:space="preserve">
|
<data name="Exit" xml:space="preserve">
|
||||||
<value>Quitter</value>
|
<value>Quitter</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="FilterType_Album" xml:space="preserve">
|
||||||
|
<value>Album</value>
|
||||||
|
</data>
|
||||||
|
<data name="FilterType_Artist" xml:space="preserve">
|
||||||
|
<value>Artiste</value>
|
||||||
|
</data>
|
||||||
|
<data name="FilterType_Directory" xml:space="preserve">
|
||||||
|
<value>Dossier</value>
|
||||||
|
</data>
|
||||||
|
<data name="FilterType_Genre" xml:space="preserve">
|
||||||
|
<value>Genre</value>
|
||||||
|
</data>
|
||||||
|
<data name="FilterType_Song" xml:space="preserve">
|
||||||
|
<value>Chanson</value>
|
||||||
|
</data>
|
||||||
|
<data name="FilterType_Year" xml:space="preserve">
|
||||||
|
<value>Année</value>
|
||||||
|
</data>
|
||||||
|
<data name="Hour" xml:space="preserve">
|
||||||
|
<value>heure</value>
|
||||||
|
</data>
|
||||||
|
<data name="Hours" xml:space="preserve">
|
||||||
|
<value>heures</value>
|
||||||
|
</data>
|
||||||
|
<data name="Minute" xml:space="preserve">
|
||||||
|
<value>minute</value>
|
||||||
|
</data>
|
||||||
|
<data name="Minutes" xml:space="preserve">
|
||||||
|
<value>minutes</value>
|
||||||
|
</data>
|
||||||
|
<data name="Operator_Contains" xml:space="preserve">
|
||||||
|
<value>contient</value>
|
||||||
|
</data>
|
||||||
|
<data name="Operator_Is" xml:space="preserve">
|
||||||
|
<value>est</value>
|
||||||
|
</data>
|
||||||
|
<data name="Operator_IsNot" xml:space="preserve">
|
||||||
|
<value>n'est pas</value>
|
||||||
|
</data>
|
||||||
<data name="Radios" xml:space="preserve">
|
<data name="Radios" xml:space="preserve">
|
||||||
<value>Radios</value>
|
<value>Radios</value>
|
||||||
</data>
|
</data>
|
||||||
@ -147,6 +195,12 @@
|
|||||||
<data name="Radio_Tags" xml:space="preserve">
|
<data name="Radio_Tags" xml:space="preserve">
|
||||||
<value>Tags</value>
|
<value>Tags</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Second" xml:space="preserve">
|
||||||
|
<value>seconde</value>
|
||||||
|
</data>
|
||||||
|
<data name="Seconds" xml:space="preserve">
|
||||||
|
<value>secondes</value>
|
||||||
|
</data>
|
||||||
<data name="Settings" xml:space="preserve">
|
<data name="Settings" xml:space="preserve">
|
||||||
<value>Configuration</value>
|
<value>Configuration</value>
|
||||||
</data>
|
</data>
|
||||||
@ -213,6 +267,21 @@
|
|||||||
<data name="Settings_ShowWindow" xml:space="preserve">
|
<data name="Settings_ShowWindow" xml:space="preserve">
|
||||||
<value>Afficher la fenêtre</value>
|
<value>Afficher la fenêtre</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Settings_Shuffle1" xml:space="preserve">
|
||||||
|
<value>La fenêtre aléatoire permet d'ajouter des chansons aléatoires à la file. Les deux options prennent en compte le filtre.</value>
|
||||||
|
</data>
|
||||||
|
<data name="Settings_Shuffle2" xml:space="preserve">
|
||||||
|
<value>Si le filtre est vide, l'intégralité de la bibliothèque est prise en compte.</value>
|
||||||
|
</data>
|
||||||
|
<data name="Settings_Shuffle3" xml:space="preserve">
|
||||||
|
<value>Le filtre est recherché à chaque fois que les options Ajouter à la file ou Aléatoire continu sont utilisées.</value>
|
||||||
|
</data>
|
||||||
|
<data name="Settings_Shuffle4" xml:space="preserve">
|
||||||
|
<value>Ajoute un nombre fixe de chansons à la file. Pour des raisons techniques, cette option est limitée à 100 chansons aléatoires sans filtre, et à 1000 chansons avec filtre.</value>
|
||||||
|
</data>
|
||||||
|
<data name="Settings_Shuffle5" xml:space="preserve">
|
||||||
|
<value>En activant cette option, unison va ajouter automatiquement des chansons à la file pour ne jamais arriver à cours de chansons à écouter.</value>
|
||||||
|
</data>
|
||||||
<data name="Settings_SnapcastInfo1" xml:space="preserve">
|
<data name="Settings_SnapcastInfo1" xml:space="preserve">
|
||||||
<value>Il est possible de mettre votre version localement installé de Snapcast avec un </value>
|
<value>Il est possible de mettre votre version localement installé de Snapcast avec un </value>
|
||||||
</data>
|
</data>
|
||||||
@ -243,6 +312,9 @@
|
|||||||
<data name="Settings_SourceCode2" xml:space="preserve">
|
<data name="Settings_SourceCode2" xml:space="preserve">
|
||||||
<value>ici</value>
|
<value>ici</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Settings_UpdateDatabase" xml:space="preserve">
|
||||||
|
<value>Mettre à jour la base de donnée</value>
|
||||||
|
</data>
|
||||||
<data name="Settings_Version" xml:space="preserve">
|
<data name="Settings_Version" xml:space="preserve">
|
||||||
<value>Version :</value>
|
<value>Version :</value>
|
||||||
</data>
|
</data>
|
||||||
@ -261,6 +333,48 @@
|
|||||||
<data name="ShowWindow" xml:space="preserve">
|
<data name="ShowWindow" xml:space="preserve">
|
||||||
<value>Montrer la fenêtre</value>
|
<value>Montrer la fenêtre</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Shuffle" xml:space="preserve">
|
||||||
|
<value>Aléatoire</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_ButtonMessage1" xml:space="preserve">
|
||||||
|
<value>Ajout de</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_ButtonMessage2" xml:space="preserve">
|
||||||
|
<value>chansons...</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_ButtonMessage3" xml:space="preserve">
|
||||||
|
<value>fini !</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_Continuous" xml:space="preserve">
|
||||||
|
<value>Aléatoire continu</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_ContinuousEnable" xml:space="preserve">
|
||||||
|
<value>Activer le mode aléatoire continu</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_Filter" xml:space="preserve">
|
||||||
|
<value>Filtre</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_FilterQuery" xml:space="preserve">
|
||||||
|
<value>Recherche du filtre</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_FilterReset" xml:space="preserve">
|
||||||
|
<value>Réinitialiser</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_FilterSongNumber" xml:space="preserve">
|
||||||
|
<value>Nombre de chansons dans le filtre :</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_Querying1" xml:space="preserve">
|
||||||
|
<value>Recherche du filtre...</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_Querying2" xml:space="preserve">
|
||||||
|
<value>fini !</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_Queue" xml:space="preserve">
|
||||||
|
<value>Ajouter à la file</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_QueueSongs" xml:space="preserve">
|
||||||
|
<value>Chansons à ajouter</value>
|
||||||
|
</data>
|
||||||
<data name="Snapcast_Popup1" xml:space="preserve">
|
<data name="Snapcast_Popup1" xml:space="preserve">
|
||||||
<value>Erreur Snapcast</value>
|
<value>Erreur Snapcast</value>
|
||||||
</data>
|
</data>
|
||||||
@ -276,9 +390,6 @@
|
|||||||
<data name="StartSnapcast" xml:space="preserve">
|
<data name="StartSnapcast" xml:space="preserve">
|
||||||
<value>Démarrer Snapcast</value>
|
<value>Démarrer Snapcast</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Stats" xml:space="preserve">
|
|
||||||
<value>Stats</value>
|
|
||||||
</data>
|
|
||||||
<data name="Stats_Albums" xml:space="preserve">
|
<data name="Stats_Albums" xml:space="preserve">
|
||||||
<value>Albums :</value>
|
<value>Albums :</value>
|
||||||
</data>
|
</data>
|
||||||
@ -297,6 +408,12 @@
|
|||||||
<data name="Stats_TotalTimePlayed" xml:space="preserve">
|
<data name="Stats_TotalTimePlayed" xml:space="preserve">
|
||||||
<value>Temps d'écoute écoulé :</value>
|
<value>Temps d'écoute écoulé :</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Stats_UpdateDBMessage1" xml:space="preserve">
|
||||||
|
<value>Mise à jour de la base de donnée...</value>
|
||||||
|
</data>
|
||||||
|
<data name="Stats_UpdateDBMessage2" xml:space="preserve">
|
||||||
|
<value> fini !</value>
|
||||||
|
</data>
|
||||||
<data name="Stats_Uptime" xml:space="preserve">
|
<data name="Stats_Uptime" xml:space="preserve">
|
||||||
<value>MPD lancé depuis :</value>
|
<value>MPD lancé depuis :</value>
|
||||||
</data>
|
</data>
|
||||||
|
@ -117,9 +117,57 @@
|
|||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
|
<data name="Database" xml:space="preserve">
|
||||||
|
<value>Database</value>
|
||||||
|
</data>
|
||||||
|
<data name="Day" xml:space="preserve">
|
||||||
|
<value>day</value>
|
||||||
|
</data>
|
||||||
|
<data name="Days" xml:space="preserve">
|
||||||
|
<value>days</value>
|
||||||
|
</data>
|
||||||
<data name="Exit" xml:space="preserve">
|
<data name="Exit" xml:space="preserve">
|
||||||
<value>Exit</value>
|
<value>Exit</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="FilterType_Album" xml:space="preserve">
|
||||||
|
<value>Album</value>
|
||||||
|
</data>
|
||||||
|
<data name="FilterType_Artist" xml:space="preserve">
|
||||||
|
<value>Artist</value>
|
||||||
|
</data>
|
||||||
|
<data name="FilterType_Directory" xml:space="preserve">
|
||||||
|
<value>Directory</value>
|
||||||
|
</data>
|
||||||
|
<data name="FilterType_Genre" xml:space="preserve">
|
||||||
|
<value>Genre</value>
|
||||||
|
</data>
|
||||||
|
<data name="FilterType_Song" xml:space="preserve">
|
||||||
|
<value>Song</value>
|
||||||
|
</data>
|
||||||
|
<data name="FilterType_Year" xml:space="preserve">
|
||||||
|
<value>Year</value>
|
||||||
|
</data>
|
||||||
|
<data name="Hour" xml:space="preserve">
|
||||||
|
<value>hour</value>
|
||||||
|
</data>
|
||||||
|
<data name="Hours" xml:space="preserve">
|
||||||
|
<value>hours</value>
|
||||||
|
</data>
|
||||||
|
<data name="Minute" xml:space="preserve">
|
||||||
|
<value>minute</value>
|
||||||
|
</data>
|
||||||
|
<data name="Minutes" xml:space="preserve">
|
||||||
|
<value>minutes</value>
|
||||||
|
</data>
|
||||||
|
<data name="Operator_Contains" xml:space="preserve">
|
||||||
|
<value>contains</value>
|
||||||
|
</data>
|
||||||
|
<data name="Operator_Is" xml:space="preserve">
|
||||||
|
<value>is</value>
|
||||||
|
</data>
|
||||||
|
<data name="Operator_IsNot" xml:space="preserve">
|
||||||
|
<value>is not</value>
|
||||||
|
</data>
|
||||||
<data name="Radios" xml:space="preserve">
|
<data name="Radios" xml:space="preserve">
|
||||||
<value>Radios</value>
|
<value>Radios</value>
|
||||||
</data>
|
</data>
|
||||||
@ -147,6 +195,12 @@
|
|||||||
<data name="Radio_Tags" xml:space="preserve">
|
<data name="Radio_Tags" xml:space="preserve">
|
||||||
<value>Tags</value>
|
<value>Tags</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Second" xml:space="preserve">
|
||||||
|
<value>second</value>
|
||||||
|
</data>
|
||||||
|
<data name="Seconds" xml:space="preserve">
|
||||||
|
<value>seconds</value>
|
||||||
|
</data>
|
||||||
<data name="Settings" xml:space="preserve">
|
<data name="Settings" xml:space="preserve">
|
||||||
<value>Settings</value>
|
<value>Settings</value>
|
||||||
</data>
|
</data>
|
||||||
@ -213,6 +267,21 @@
|
|||||||
<data name="Settings_ShowWindow" xml:space="preserve">
|
<data name="Settings_ShowWindow" xml:space="preserve">
|
||||||
<value>Show window</value>
|
<value>Show window</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Settings_Shuffle1" xml:space="preserve">
|
||||||
|
<value>The shuffle window allows to add random songs to your queue. Both options take into account the filter.</value>
|
||||||
|
</data>
|
||||||
|
<data name="Settings_Shuffle2" xml:space="preserve">
|
||||||
|
<value>If the filter is empty, the entire music library is taken into account.</value>
|
||||||
|
</data>
|
||||||
|
<data name="Settings_Shuffle3" xml:space="preserve">
|
||||||
|
<value>The filter is queried each time you use the Add to queue or Continuous shuffle options.</value>
|
||||||
|
</data>
|
||||||
|
<data name="Settings_Shuffle4" xml:space="preserve">
|
||||||
|
<value>Add a fixed number of songs to the queue. For technical reasons, it is limited to 100 random songs without a filter, and to 1000 songs with a filter.</value>
|
||||||
|
</data>
|
||||||
|
<data name="Settings_Shuffle5" xml:space="preserve">
|
||||||
|
<value>By enabling this option, unison will automatically add songs to the queue so you never run out of songs to listen to.</value>
|
||||||
|
</data>
|
||||||
<data name="Settings_SnapcastInfo1" xml:space="preserve">
|
<data name="Settings_SnapcastInfo1" xml:space="preserve">
|
||||||
<value>You can change to your own locally installed version of the Snapcast client with an</value>
|
<value>You can change to your own locally installed version of the Snapcast client with an</value>
|
||||||
</data>
|
</data>
|
||||||
@ -243,6 +312,9 @@
|
|||||||
<data name="Settings_SourceCode2" xml:space="preserve">
|
<data name="Settings_SourceCode2" xml:space="preserve">
|
||||||
<value>here</value>
|
<value>here</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Settings_UpdateDatabase" xml:space="preserve">
|
||||||
|
<value>Update database</value>
|
||||||
|
</data>
|
||||||
<data name="Settings_Version" xml:space="preserve">
|
<data name="Settings_Version" xml:space="preserve">
|
||||||
<value>Version:</value>
|
<value>Version:</value>
|
||||||
</data>
|
</data>
|
||||||
@ -261,6 +333,48 @@
|
|||||||
<data name="ShowWindow" xml:space="preserve">
|
<data name="ShowWindow" xml:space="preserve">
|
||||||
<value>Show window</value>
|
<value>Show window</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Shuffle" xml:space="preserve">
|
||||||
|
<value>Shuffle</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_ButtonMessage1" xml:space="preserve">
|
||||||
|
<value>Adding</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_ButtonMessage2" xml:space="preserve">
|
||||||
|
<value>songs...</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_ButtonMessage3" xml:space="preserve">
|
||||||
|
<value>done!</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_Continuous" xml:space="preserve">
|
||||||
|
<value>Continuous shuffle</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_ContinuousEnable" xml:space="preserve">
|
||||||
|
<value>Enable continuous shuffle</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_Filter" xml:space="preserve">
|
||||||
|
<value>Filter</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_FilterQuery" xml:space="preserve">
|
||||||
|
<value>Query filter</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_FilterReset" xml:space="preserve">
|
||||||
|
<value>Reset</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_FilterSongNumber" xml:space="preserve">
|
||||||
|
<value>Number of songs in filter:</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_Querying1" xml:space="preserve">
|
||||||
|
<value>Querying filter...</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_Querying2" xml:space="preserve">
|
||||||
|
<value>done!</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_Queue" xml:space="preserve">
|
||||||
|
<value>Add to queue</value>
|
||||||
|
</data>
|
||||||
|
<data name="Shuffle_QueueSongs" xml:space="preserve">
|
||||||
|
<value>Songs to add</value>
|
||||||
|
</data>
|
||||||
<data name="Snapcast_Popup1" xml:space="preserve">
|
<data name="Snapcast_Popup1" xml:space="preserve">
|
||||||
<value>Snapcast error</value>
|
<value>Snapcast error</value>
|
||||||
</data>
|
</data>
|
||||||
@ -276,9 +390,6 @@
|
|||||||
<data name="StartSnapcast" xml:space="preserve">
|
<data name="StartSnapcast" xml:space="preserve">
|
||||||
<value>Start Snapcast</value>
|
<value>Start Snapcast</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Stats" xml:space="preserve">
|
|
||||||
<value>Stats</value>
|
|
||||||
</data>
|
|
||||||
<data name="Stats_Albums" xml:space="preserve">
|
<data name="Stats_Albums" xml:space="preserve">
|
||||||
<value>Albums:</value>
|
<value>Albums:</value>
|
||||||
</data>
|
</data>
|
||||||
@ -297,6 +408,12 @@
|
|||||||
<data name="Stats_TotalTimePlayed" xml:space="preserve">
|
<data name="Stats_TotalTimePlayed" xml:space="preserve">
|
||||||
<value>Total time played:</value>
|
<value>Total time played:</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Stats_UpdateDBMessage1" xml:space="preserve">
|
||||||
|
<value>Updating database...</value>
|
||||||
|
</data>
|
||||||
|
<data name="Stats_UpdateDBMessage2" xml:space="preserve">
|
||||||
|
<value>done!</value>
|
||||||
|
</data>
|
||||||
<data name="Stats_Uptime" xml:space="preserve">
|
<data name="Stats_Uptime" xml:space="preserve">
|
||||||
<value>MPD uptime:</value>
|
<value>MPD uptime:</value>
|
||||||
</data>
|
</data>
|
||||||
|
Before Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 9.5 KiB |
Before Width: | Height: | Size: 34 KiB |
BIN
Screenshots/screen1.png
Normal file
After Width: | Height: | Size: 48 KiB |
BIN
Screenshots/screen2.png
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
Screenshots/screen3.png
Normal file
After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
@ -6,7 +6,7 @@
|
|||||||
xmlns:emoji="clr-namespace:Emoji.Wpf;assembly=Emoji.Wpf"
|
xmlns:emoji="clr-namespace:Emoji.Wpf;assembly=Emoji.Wpf"
|
||||||
xmlns:properties="clr-namespace:unison.Resources"
|
xmlns:properties="clr-namespace:unison.Resources"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
Title="unison" Closing="Window_Closing" Icon="/Resources/icon-full.ico" ResizeMode="CanMinimize" SizeToContent="WidthAndHeight">
|
Title="unison" Closing="Window_Closing" LocationChanged="Window_LocationChanged" Icon="/Resources/icon-full.ico" ResizeMode="CanMinimize" SizeToContent="WidthAndHeight">
|
||||||
|
|
||||||
<Window.Resources>
|
<Window.Resources>
|
||||||
<Style TargetType="Border" x:Key="UnselectedButton">
|
<Style TargetType="Border" x:Key="UnselectedButton">
|
||||||
@ -17,7 +17,7 @@
|
|||||||
</Style>
|
</Style>
|
||||||
</Window.Resources>
|
</Window.Resources>
|
||||||
|
|
||||||
<Grid Background="{DynamicResource {x:Static SystemColors.ControlLightLightBrushKey}}" MinHeight="270" MinWidth="650">
|
<Grid Background="{DynamicResource {x:Static SystemColors.ControlLightLightBrushKey}}" MinHeight="270" MinWidth="700">
|
||||||
<Grid x:Name="TopLayout" Margin="10,0,10,0" VerticalAlignment="Stretch" Width="Auto" Height="Auto">
|
<Grid x:Name="TopLayout" Margin="10,0,10,0" VerticalAlignment="Stretch" Width="Auto" Height="Auto">
|
||||||
<Grid x:Name="Display" HorizontalAlignment="Stretch" VerticalAlignment="Top" Margin="225,0,0,0" Height="Auto" Width="Auto">
|
<Grid x:Name="Display" HorizontalAlignment="Stretch" VerticalAlignment="Top" Margin="225,0,0,0" Height="Auto" Width="Auto">
|
||||||
<GroupBox Height="220" VerticalAlignment="Center">
|
<GroupBox Height="220" VerticalAlignment="Center">
|
||||||
@ -50,43 +50,43 @@
|
|||||||
</Grid>
|
</Grid>
|
||||||
<!-- https://docs.microsoft.com/en-us/windows/apps/design/style/segoe-ui-symbol-font -->
|
<!-- https://docs.microsoft.com/en-us/windows/apps/design/style/segoe-ui-symbol-font -->
|
||||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0,8,0,0">
|
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0,8,0,0">
|
||||||
<Button x:Name="PreviousTrack" Click="Previous_Clicked" Background="{x:Null}" BorderBrush="{x:Null}" HorizontalAlignment="Left" FocusVisualStyle="{x:Null}">
|
<Button x:Name="PreviousTrack" Click="Previous_Clicked" Style="{StaticResource ButtonStyle}" HorizontalAlignment="Left">
|
||||||
<TextBlock FontSize="25" FontFamily="Segoe MDL2 Assets" Text=""/>
|
<TextBlock FontSize="25" FontFamily="Segoe MDL2 Assets" Text="" Padding="2" />
|
||||||
</Button>
|
</Button>
|
||||||
<Button x:Name="PauseButton" Click="Pause_Clicked" Background="{x:Null}" BorderBrush="{x:Null}" Margin="10,0,10,0" FocusVisualStyle="{x:Null}">
|
<Button x:Name="PauseButton" Click="Pause_Clicked" Style="{StaticResource ButtonStyle}" HorizontalAlignment="Center" Margin="10,0,10,0">
|
||||||
<TextBlock x:Name="PlayPause" FontSize="25" FontFamily="Segoe MDL2 Assets" Text=""/>
|
<TextBlock x:Name="PlayPause" FontSize="25" FontFamily="Segoe MDL2 Assets" Text="" Padding="2"/>
|
||||||
</Button>
|
</Button>
|
||||||
<Button x:Name="NextTrack" Click="Next_Clicked" FontSize="18" Background="{x:Null}" BorderBrush="{x:Null}" HorizontalAlignment="Right" FocusVisualStyle="{x:Null}">
|
<Button x:Name="NextTrack" Click="Next_Clicked" Style="{StaticResource ButtonStyle}" HorizontalAlignment="Right">
|
||||||
<TextBlock FontSize="25" FontFamily="Segoe MDL2 Assets" Text=""/>
|
<TextBlock FontSize="25" FontFamily="Segoe MDL2 Assets" Text="" Padding="2"/>
|
||||||
</Button>
|
</Button>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<Grid VerticalAlignment="Stretch" Margin="0,18,0,0">
|
<Grid VerticalAlignment="Stretch" Margin="0,14,0,0">
|
||||||
<StackPanel Orientation="Horizontal" VerticalAlignment="Top" HorizontalAlignment="Center" Margin="10,2,10,0">
|
<StackPanel Orientation="Horizontal" VerticalAlignment="Top" HorizontalAlignment="Center" Margin="10,4,10,0">
|
||||||
<TextBlock FontFamily="Segoe MDL2 Assets" Text="" TextWrapping="Wrap" HorizontalAlignment="Left" VerticalAlignment="Center" FontSize="16"/>
|
<TextBlock FontFamily="Segoe MDL2 Assets" Text="" TextWrapping="Wrap" HorizontalAlignment="Left" VerticalAlignment="Center" FontSize="16"/>
|
||||||
<Slider x:Name="VolumeSlider" Maximum="100" Value="50" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" VerticalAlignment="Center" HorizontalAlignment="Center" MinWidth="180" FlowDirection="LeftToRight" PreviewMouseUp="VolumeSlider_DragCompleted" FocusVisualStyle="{x:Null}"/>
|
<Slider x:Name="VolumeSlider" Maximum="100" Value="50" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" VerticalAlignment="Center" HorizontalAlignment="Center" MinWidth="180" FlowDirection="LeftToRight" PreviewMouseUp="VolumeSlider_DragCompleted" FocusVisualStyle="{x:Null}"/>
|
||||||
<TextBlock FontFamily="Segoe MDL2 Assets" Text="" TextWrapping="Wrap" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="7.5,0,0,0" FontSize="16"/>
|
<TextBlock FontFamily="Segoe MDL2 Assets" Text="" TextWrapping="Wrap" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="7.5,0,0,0" FontSize="16"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<StackPanel HorizontalAlignment="Left" Orientation="Horizontal" VerticalAlignment="Bottom" MinHeight="27">
|
<StackPanel HorizontalAlignment="Left" Orientation="Horizontal" VerticalAlignment="Bottom" MinHeight="30">
|
||||||
<Border x:Name="BorderRandom" Style="{StaticResource UnselectedButton}" BorderBrush="Black" HorizontalAlignment="Stretch" VerticalAlignment="Top" SnapsToDevicePixels="True">
|
<Border x:Name="BorderRandom" Style="{StaticResource UnselectedButton}" BorderBrush="Black" HorizontalAlignment="Stretch" VerticalAlignment="Top" SnapsToDevicePixels="True">
|
||||||
<Button x:Name="Random" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Background="{x:Null}" BorderBrush="{x:Null}" Click="Random_Clicked" FocusVisualStyle="{x:Null}">
|
<Button x:Name="Random" Click="Random_Clicked" Style="{StaticResource ButtonStyle}" VerticalContentAlignment="Center" HorizontalContentAlignment="Center">
|
||||||
<TextBlock FontSize="18" FontFamily="Segoe MDL2 Assets" Text="" Margin="0" Padding="0, 0, 0, 2"/>
|
<TextBlock FontSize="18" FontFamily="Segoe MDL2 Assets" Text="" Margin="0" Padding="3, 3, 3, 3"/>
|
||||||
</Button>
|
</Button>
|
||||||
</Border>
|
</Border>
|
||||||
<Border x:Name="BorderRepeat" Style="{StaticResource UnselectedButton}" BorderBrush="Black" VerticalAlignment="Top" Margin="10,0,0,0">
|
<Border x:Name="BorderRepeat" Style="{StaticResource UnselectedButton}" BorderBrush="Black" VerticalAlignment="Top" Margin="10,0,0,0">
|
||||||
<Button x:Name="Repeat" Background="{x:Null}" FontSize="18" BorderBrush="{x:Null}" Click="Repeat_Clicked" FocusVisualStyle="{x:Null}">
|
<Button x:Name="Repeat" Click="Repeat_Clicked" Style="{StaticResource ButtonStyle}" VerticalContentAlignment="Center" HorizontalContentAlignment="Center">
|
||||||
<TextBlock FontSize="18" FontFamily="Segoe MDL2 Assets" Text="" Padding="0, 0, 0, 2"/>
|
<TextBlock FontSize="18" FontFamily="Segoe MDL2 Assets" Text="" Padding="3, 3, 3, 3"/>
|
||||||
</Button>
|
</Button>
|
||||||
</Border>
|
</Border>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<StackPanel HorizontalAlignment="Right" Orientation="Horizontal" VerticalAlignment="Bottom" MinHeight="27">
|
<StackPanel HorizontalAlignment="Right" Orientation="Horizontal" VerticalAlignment="Bottom" MinHeight="30">
|
||||||
<Border x:Name="BorderSingle" Style="{StaticResource UnselectedButton}" BorderBrush="Black" HorizontalAlignment="Stretch" VerticalAlignment="Top" SnapsToDevicePixels="True" Margin="0,0,10,0">
|
<Border x:Name="BorderSingle" Style="{StaticResource UnselectedButton}" BorderBrush="Black" HorizontalAlignment="Stretch" VerticalAlignment="Top" SnapsToDevicePixels="True" Margin="0,0,10,0">
|
||||||
<Button x:Name="Single" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" BorderBrush="{x:Null}" Background="{x:Null}" Click="Single_Clicked" FocusVisualStyle="{x:Null}">
|
<Button x:Name="Single" Click="Single_Clicked" Style="{StaticResource ButtonStyle}" VerticalContentAlignment="Center" HorizontalContentAlignment="Center">
|
||||||
<TextBlock FontSize="18" FontFamily="Segoe MDL2 Assets" Text="" Margin="0" Padding="0, 0, 0, 2"/>
|
<TextBlock FontSize="18" FontFamily="Segoe MDL2 Assets" Text="" Margin="0" Padding="3, 3, 3, 3"/>
|
||||||
</Button>
|
</Button>
|
||||||
</Border>
|
</Border>
|
||||||
<Border x:Name="BorderConsume" Style="{StaticResource UnselectedButton}" BorderBrush="Black" HorizontalAlignment="Stretch" VerticalAlignment="Top" SnapsToDevicePixels="True">
|
<Border x:Name="BorderConsume" Style="{StaticResource UnselectedButton}" BorderBrush="Black" HorizontalAlignment="Stretch" VerticalAlignment="Top" SnapsToDevicePixels="True">
|
||||||
<Button x:Name="Consume" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" BorderBrush="{x:Null}" Background="{x:Null}" Click="Consume_Clicked" FocusVisualStyle="{x:Null}">
|
<Button x:Name="Consume" Click="Consume_Clicked" Style="{StaticResource ButtonStyle}" VerticalContentAlignment="Center" HorizontalContentAlignment="Center">
|
||||||
<TextBlock FontSize="18" FontFamily="Segoe MDL2 Assets" Text="" Margin="0" Padding="0, 0, 0, 2"/>
|
<TextBlock FontSize="18" FontFamily="Segoe MDL2 Assets" Text="" Margin="0" Padding="3, 3, 3, 3"/>
|
||||||
</Button>
|
</Button>
|
||||||
</Border>
|
</Border>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
@ -115,7 +115,7 @@
|
|||||||
<Button x:Name="Shuffle" Padding="5, 2" Click="Shuffle_Clicked" Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" FocusVisualStyle="{x:Null}" Margin="0,0,10,0">
|
<Button x:Name="Shuffle" Padding="5, 2" Click="Shuffle_Clicked" Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" FocusVisualStyle="{x:Null}" Margin="0,0,10,0">
|
||||||
<StackPanel Orientation="Horizontal">
|
<StackPanel Orientation="Horizontal">
|
||||||
<emoji:TextBlock Text="🔁" Padding="0,0,0,2"/>
|
<emoji:TextBlock Text="🔁" Padding="0,0,0,2"/>
|
||||||
<TextBlock Text="Shuffle" Margin="5, 0, 0, 0"/>
|
<TextBlock Text="{x:Static properties:Resources.Shuffle}" Margin="5, 0, 0, 0"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
|
@ -7,6 +7,8 @@ using System.Windows.Interop;
|
|||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using System.Windows.Controls.Primitives;
|
using System.Windows.Controls.Primitives;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using System.Data;
|
||||||
|
using MpcNET.Commands.Playback;
|
||||||
|
|
||||||
namespace unison
|
namespace unison
|
||||||
{
|
{
|
||||||
@ -18,12 +20,16 @@ namespace unison
|
|||||||
private readonly DispatcherTimer _timer;
|
private readonly DispatcherTimer _timer;
|
||||||
private readonly MPDHandler _mpd;
|
private readonly MPDHandler _mpd;
|
||||||
|
|
||||||
|
public Settings GetSettings() => _settingsWin;
|
||||||
|
|
||||||
public MainWindow()
|
public MainWindow()
|
||||||
{
|
{
|
||||||
InitHwnd();
|
InitHwnd();
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
DefaultState(true);
|
DefaultState(true);
|
||||||
WindowState = WindowState.Minimized;
|
WindowState = WindowState.Minimized;
|
||||||
|
Top = Properties.Settings.Default.MainWindowTop;
|
||||||
|
Left = Properties.Settings.Default.MainWindowLeft;
|
||||||
|
|
||||||
_settingsWin = new Settings();
|
_settingsWin = new Settings();
|
||||||
_radiosWin = new Radios();
|
_radiosWin = new Radios();
|
||||||
@ -45,12 +51,17 @@ namespace unison
|
|||||||
TimeSlider.Value = _mpd.GetCurrentTime() / _mpd.GetCurrentSong().Time * 100;
|
TimeSlider.Value = _mpd.GetCurrentTime() / _mpd.GetCurrentSong().Time * 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void UpdateStats()
|
||||||
|
{
|
||||||
|
_mpd.QueryStats();
|
||||||
|
_settingsWin.UpdateStats();
|
||||||
|
}
|
||||||
|
|
||||||
public void OnConnectionChanged(object sender, EventArgs e)
|
public void OnConnectionChanged(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (_mpd.IsConnected())
|
if (_mpd.IsConnected())
|
||||||
{
|
{
|
||||||
_mpd.QueryStats();
|
UpdateStats();
|
||||||
_settingsWin.UpdateStats();
|
|
||||||
|
|
||||||
ConnectionOkIcon.Visibility = Visibility.Visible;
|
ConnectionOkIcon.Visibility = Visibility.Visible;
|
||||||
ConnectionFailIcon.Visibility = Visibility.Collapsed;
|
ConnectionFailIcon.Visibility = Visibility.Collapsed;
|
||||||
@ -126,6 +137,10 @@ namespace unison
|
|||||||
|
|
||||||
if (_shuffleWin.GetContinuous())
|
if (_shuffleWin.GetContinuous())
|
||||||
{
|
{
|
||||||
|
// force consume: there's no other way to be sure
|
||||||
|
// that we don't get to the end of the queue with nothing to play
|
||||||
|
_mpd.SendCommand(new ConsumeCommand(true));
|
||||||
|
|
||||||
_mpd.CanPrevNext = false;
|
_mpd.CanPrevNext = false;
|
||||||
await _shuffleWin.HandleContinuous();
|
await _shuffleWin.HandleContinuous();
|
||||||
_mpd.CanPrevNext = true;
|
_mpd.CanPrevNext = true;
|
||||||
@ -216,12 +231,12 @@ namespace unison
|
|||||||
border.Style = b ? (Style)Resources["SelectedButton"] : (Style)Resources["UnselectedButton"];
|
border.Style = b ? (Style)Resources["SelectedButton"] : (Style)Resources["UnselectedButton"];
|
||||||
}
|
}
|
||||||
|
|
||||||
public string FormatSeconds(int time)
|
public static string FormatSeconds(int time)
|
||||||
{
|
{
|
||||||
TimeSpan timespan = TimeSpan.FromSeconds(time);
|
TimeSpan timespan = TimeSpan.FromSeconds(time);
|
||||||
return timespan.ToString(@"mm\:ss");
|
return timespan.ToString(@"mm\:ss");
|
||||||
}
|
}
|
||||||
public string FormatSeconds(double time)
|
public static string FormatSeconds(double time)
|
||||||
{
|
{
|
||||||
TimeSpan timespan = TimeSpan.FromSeconds(time);
|
TimeSpan timespan = TimeSpan.FromSeconds(time);
|
||||||
return timespan.ToString(@"mm\:ss");
|
return timespan.ToString(@"mm\:ss");
|
||||||
@ -328,5 +343,12 @@ namespace unison
|
|||||||
WindowState = WindowState.Minimized;
|
WindowState = WindowState.Minimized;
|
||||||
Hide();
|
Hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Window_LocationChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
Properties.Settings.Default.MainWindowTop = Top;
|
||||||
|
Properties.Settings.Default.MainWindowLeft = Left;
|
||||||
|
Properties.Settings.Default.Save();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -15,7 +15,7 @@ namespace unison
|
|||||||
public partial class Radios : Window
|
public partial class Radios : Window
|
||||||
{
|
{
|
||||||
private MPDHandler _mpd;
|
private MPDHandler _mpd;
|
||||||
RadioHandler _radio;
|
private RadioHandler _radio;
|
||||||
|
|
||||||
public bool IsConnected() => _radio.IsConnected();
|
public bool IsConnected() => _radio.IsConnected();
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
</x:Array>
|
</x:Array>
|
||||||
</Window.Resources>
|
</Window.Resources>
|
||||||
|
|
||||||
<Grid>
|
<Grid MinWidth="390">
|
||||||
<StackPanel Orientation="Vertical">
|
<StackPanel Orientation="Vertical">
|
||||||
<TabControl Margin="10">
|
<TabControl Margin="10">
|
||||||
<TabItem Header="MPD">
|
<TabItem Header="MPD">
|
||||||
@ -33,18 +33,18 @@
|
|||||||
<StackPanel>
|
<StackPanel>
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<TextBlock Text="{x:Static properties:Resources.Settings_Host}" TextWrapping="Wrap" Margin="5,0,0,0"/>
|
<TextBlock Text="{x:Static properties:Resources.Settings_Host}" TextWrapping="Wrap" Margin="5,0,0,0"/>
|
||||||
<TextBox x:Name="MpdHost" KeyDown="ConnectHandler" TextChanged="MpdConnectTextBox" TextWrapping="Wrap" Width="250" Margin="10,2,0,0"/>
|
<TextBox x:Name="MpdHost" KeyDown="ConnectHandler" TextChanged="MpdConnectTextBox" TextWrapping="Wrap" Margin="10,2,0,0"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
<StackPanel Margin="0,5,0,0">
|
<StackPanel Margin="0,5,0,0">
|
||||||
<TextBlock Text="{x:Static properties:Resources.Settings_Port}" TextWrapping="Wrap" Margin="5,0,0,0"/>
|
<TextBlock Text="{x:Static properties:Resources.Settings_Port}" TextWrapping="Wrap" Margin="5,0,0,0"/>
|
||||||
<TextBox x:Name="MpdPort" KeyDown="ConnectHandler" PreviewTextInput="NumberValidationTextBox" MaxLength="5" TextWrapping="Wrap" Width="250" Margin="10,2,0,0"/>
|
<TextBox x:Name="MpdPort" KeyDown="ConnectHandler" PreviewTextInput="NumberValidationTextBox" MaxLength="5" TextWrapping="Wrap" Margin="10,2,0,0"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
<StackPanel Margin="0,5,0,0">
|
<StackPanel Margin="0,5,0,0">
|
||||||
<TextBlock Text="{x:Static properties:Resources.Settings_Password}" TextWrapping="Wrap" Margin="5,0,0,0"/>
|
<TextBlock Text="{x:Static properties:Resources.Settings_Password}" TextWrapping="Wrap" Margin="5,0,0,0"/>
|
||||||
<PasswordBox x:Name="MpdPassword" KeyDown="ConnectHandler" Width="250" Margin="10,2,0,0"/>
|
<PasswordBox x:Name="MpdPassword" KeyDown="ConnectHandler" Margin="10,2,0,0"/>
|
||||||
<TextBlock Text="{x:Static properties:Resources.Settings_ConnectionPasswordInfo}" TextWrapping="Wrap" Margin="10,5,0,0" MaxWidth="250" HorizontalAlignment="Left"/>
|
<TextBlock Text="{x:Static properties:Resources.Settings_ConnectionPasswordInfo}" TextWrapping="Wrap" Margin="10,5,0,0" MaxWidth="390"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
<TextBlock TextWrapping="Wrap" Margin="5,10,0,0">
|
<TextBlock TextWrapping="Wrap" Margin="5,10,0,0">
|
||||||
@ -52,7 +52,7 @@
|
|||||||
<Run x:Name="ConnectionStatus" Text="{x:Static properties:Resources.Settings_ConnectionStatusOffline}"/>
|
<Run x:Name="ConnectionStatus" Text="{x:Static properties:Resources.Settings_ConnectionStatusOffline}"/>
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
|
|
||||||
<Button x:Name="ConnectButton" Content="{x:Static properties:Resources.Settings_ConnectButton}" Margin="0,10,0,0" Width="120" Click="MPDConnect_Clicked"/>
|
<Button x:Name="ConnectButton" Content="{x:Static properties:Resources.Settings_ConnectButton}" Margin="0,10,0,0" Width="120" Click="MPDConnect_Clicked" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Grid>
|
</Grid>
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
@ -182,13 +182,13 @@
|
|||||||
<TextBlock Text="{x:Static properties:Resources.Settings_SnapcastWindow}" TextWrapping="Wrap"/>
|
<TextBlock Text="{x:Static properties:Resources.Settings_SnapcastWindow}" TextWrapping="Wrap"/>
|
||||||
</CheckBox>
|
</CheckBox>
|
||||||
<TextBlock Text="{x:Static properties:Resources.Settings_SnapcastPort}" TextWrapping="Wrap" Margin="5,5,0,0"/>
|
<TextBlock Text="{x:Static properties:Resources.Settings_SnapcastPort}" TextWrapping="Wrap" Margin="5,5,0,0"/>
|
||||||
<TextBox x:Name="SnapcastPort" MaxLength="5" PreviewTextInput="NumberValidationTextBox" TextWrapping="Wrap" Width="250" Margin="10,2,5,0" HorizontalAlignment="Left"/>
|
<TextBox x:Name="SnapcastPort" MaxLength="5" PreviewTextInput="NumberValidationTextBox" TextWrapping="Wrap" Margin="10,2,5,0"/>
|
||||||
<TextBlock Text="{x:Static properties:Resources.Settings_SnapcastPath}" TextWrapping="Wrap" Margin="5,5,0,0"/>
|
<TextBlock Text="{x:Static properties:Resources.Settings_SnapcastPath}" TextWrapping="Wrap" Margin="5,5,0,0"/>
|
||||||
<TextBox x:Name="SnapcastPath" TextWrapping="Wrap" Width="250" Margin="10,2,5,0" HorizontalAlignment="Left"/>
|
<TextBox x:Name="SnapcastPath" TextWrapping="Wrap" Margin="10,2,5,0"/>
|
||||||
<TextBlock TextWrapping="Wrap" Margin="5,5,0,0" TextAlignment="Left" Width="250">
|
<TextBlock TextWrapping="Wrap" Margin="5,5,0,0" TextAlignment="Left" Width="390">
|
||||||
<Run Text="{x:Static properties:Resources.Settings_SnapcastInfo1}" /><Run Text="{x:Static properties:Resources.Settings_SnapcastInfo2}" FontStyle="Italic" FontWeight="DemiBold" /><Run Text="{x:Static properties:Resources.Settings_SnapcastInfo3}" />
|
<Run Text="{x:Static properties:Resources.Settings_SnapcastInfo1}" /><Run Text="{x:Static properties:Resources.Settings_SnapcastInfo2}" FontStyle="Italic" FontWeight="DemiBold" /><Run Text="{x:Static properties:Resources.Settings_SnapcastInfo3}" />
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
<Button Content="{x:Static properties:Resources.Settings_SnapcastResetButton}" Margin="0,10,0,0" Width="120" Click="SnapcastReset_Clicked"/>
|
<Button Content="{x:Static properties:Resources.Settings_SnapcastResetButton}" Width="120" Click="SnapcastReset_Clicked" Margin="0,5,0,0" BorderThickness="1,1,1,1"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Grid>
|
</Grid>
|
||||||
@ -196,27 +196,28 @@
|
|||||||
</DockPanel>
|
</DockPanel>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
|
||||||
<TabItem Header="Shuffle">
|
<TabItem Header="{x:Static properties:Resources.Shuffle}">
|
||||||
<DockPanel Margin="8">
|
<DockPanel Margin="8">
|
||||||
<GroupBox DockPanel.Dock="Top" Padding="0,4,0,0">
|
<GroupBox DockPanel.Dock="Top" Padding="0,4,0,0">
|
||||||
<GroupBox.Header>
|
<GroupBox.Header>
|
||||||
<TextBlock>
|
<TextBlock>
|
||||||
<emoji:EmojiInline Text="🔁 "/>
|
<emoji:EmojiInline Text="🔁 "/>
|
||||||
<Run Text="Shuffle"></Run>
|
<Run Text="{x:Static properties:Resources.Shuffle}"></Run>
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
</GroupBox.Header>
|
</GroupBox.Header>
|
||||||
<Grid MaxWidth="500">
|
<Grid MaxWidth="500">
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<TextBlock TextWrapping="Wrap">
|
<TextBlock TextWrapping="Wrap">
|
||||||
<Run>The shuffle window allows to add random songs to your queue. Both options take into account the filter.</Run>
|
<Run Text="{x:Static properties:Resources.Settings_Shuffle1}"></Run>
|
||||||
<Run>If the filter is empty, the entire music library is taken into account.</Run><LineBreak/><LineBreak/>
|
<Run Text="{x:Static properties:Resources.Settings_Shuffle2}"></Run><LineBreak/>
|
||||||
|
<Run Text="{x:Static properties:Resources.Settings_Shuffle3}"></Run><LineBreak/><LineBreak/>
|
||||||
|
|
||||||
<Run FontWeight="Bold">Add to queue</Run><LineBreak/>
|
<Run FontWeight="Bold" Text="{x:Static properties:Resources.Shuffle_Queue}"></Run><LineBreak/>
|
||||||
<Run>Add a fixed number of songs to the queue. It can take a long time to add more than 100 songs, so the option is limited to 1000 songs.</Run>
|
<Run Text="{x:Static properties:Resources.Settings_Shuffle4}"></Run>
|
||||||
<LineBreak/><LineBreak/>
|
<LineBreak/><LineBreak/>
|
||||||
|
|
||||||
<Run FontWeight="Bold">Continuous shuffle</Run><LineBreak/>
|
<Run FontWeight="Bold" Text="{x:Static properties:Resources.Shuffle_Continuous}"></Run><LineBreak/>
|
||||||
<Run>By enabling this option, unison will automatically add songs to the queue so you never run out of songs to listen to.</Run>
|
<Run Text="{x:Static properties:Resources.Settings_Shuffle5}"></Run>
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Grid>
|
</Grid>
|
||||||
@ -224,17 +225,19 @@
|
|||||||
</DockPanel>
|
</DockPanel>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
|
||||||
<TabItem Header="{x:Static properties:Resources.Stats}">
|
<TabItem Header="{x:Static properties:Resources.Database}" Height="20" VerticalAlignment="Bottom">
|
||||||
<DockPanel Margin="8">
|
<DockPanel Margin="8">
|
||||||
<GroupBox DockPanel.Dock="Top" Padding="0,4,0,0">
|
<GroupBox DockPanel.Dock="Top" Padding="0,4,0,0">
|
||||||
<GroupBox.Header>
|
<GroupBox.Header>
|
||||||
<TextBlock>
|
<TextBlock>
|
||||||
<emoji:EmojiInline Text="📊"/>
|
<emoji:EmojiInline Text="📊"/>
|
||||||
<Run Text="{x:Static properties:Resources.Stats}"/>
|
<Run Text="{x:Static properties:Resources.Database}"/>
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
</GroupBox.Header>
|
</GroupBox.Header>
|
||||||
<Grid VerticalAlignment="Top">
|
<StackPanel>
|
||||||
<TextBlock>
|
|
||||||
|
<Grid VerticalAlignment="Top">
|
||||||
|
<TextBlock>
|
||||||
<Run Text="{x:Static properties:Resources.Stats_Songs}"/><Run Text=" "/><Run x:Name="StatSong"/><LineBreak/>
|
<Run Text="{x:Static properties:Resources.Stats_Songs}"/><Run Text=" "/><Run x:Name="StatSong"/><LineBreak/>
|
||||||
<Run Text="{x:Static properties:Resources.Stats_Albums}"/><Run Text=" "/><Run x:Name="StatAlbum"/><LineBreak/>
|
<Run Text="{x:Static properties:Resources.Stats_Albums}"/><Run Text=" "/><Run x:Name="StatAlbum"/><LineBreak/>
|
||||||
<Run Text="{x:Static properties:Resources.Stats_Artists}"/><Run Text=" "/><Run x:Name="StatArtist"/><LineBreak/>
|
<Run Text="{x:Static properties:Resources.Stats_Artists}"/><Run Text=" "/><Run x:Name="StatArtist"/><LineBreak/>
|
||||||
@ -242,8 +245,15 @@
|
|||||||
<Run Text="{x:Static properties:Resources.Stats_Uptime}"/><Run Text=" "/><Run x:Name="StatUptime"/><LineBreak/>
|
<Run Text="{x:Static properties:Resources.Stats_Uptime}"/><Run Text=" "/><Run x:Name="StatUptime"/><LineBreak/>
|
||||||
<Run Text="{x:Static properties:Resources.Stats_TotalTimePlayed}"/><Run Text=" "/><Run x:Name="StatTotalTimePlayed"/><LineBreak/>
|
<Run Text="{x:Static properties:Resources.Stats_TotalTimePlayed}"/><Run Text=" "/><Run x:Name="StatTotalTimePlayed"/><LineBreak/>
|
||||||
<Run Text="{x:Static properties:Resources.Stats_LastDatabaseUpdate}"/><Run Text=" "/><Run x:Name="StatDatabaseUpdate"/>
|
<Run Text="{x:Static properties:Resources.Stats_LastDatabaseUpdate}"/><Run Text=" "/><Run x:Name="StatDatabaseUpdate"/>
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
|
<StackPanel Orientation="Horizontal" Margin="0,10,0,0">
|
||||||
|
<Button x:Name="UpdateDatabaseButton" Content="{x:Static properties:Resources.Settings_UpdateDatabase}" Click="MPDDatabaseUpdate_Clicked" MinWidth="120" Padding="3,1,3,1" FocusVisualStyle="{x:Null}"/>
|
||||||
|
<TextBlock x:Name="UpdateDBMessage" Text="{x:Static properties:Resources.Stats_UpdateDBMessage1}" Margin="15,3,0,0" FontStyle="Italic" Visibility="Collapsed" />
|
||||||
|
<TextBlock x:Name="UpdateDBMessage2" Text="{x:Static properties:Resources.Stats_UpdateDBMessage2}" Margin="3,3,0,0" FontStyle="Italic" Visibility="Collapsed" />
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
</DockPanel>
|
</DockPanel>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using System.ComponentModel;
|
using System;
|
||||||
|
using System.ComponentModel;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
@ -11,6 +12,7 @@ using System.Windows.Controls;
|
|||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using System.Windows.Interop;
|
using System.Windows.Interop;
|
||||||
using System.Windows.Navigation;
|
using System.Windows.Navigation;
|
||||||
|
using System.Windows.Threading;
|
||||||
using unison.Handlers;
|
using unison.Handlers;
|
||||||
|
|
||||||
namespace unison
|
namespace unison
|
||||||
@ -37,8 +39,7 @@ namespace unison
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
HotkeyHandler _hotkeys = (HotkeyHandler)Application.Current.Properties["hotkeys"];
|
readonly HotkeyHandler _hotkeys = (HotkeyHandler)Application.Current.Properties["hotkeys"];
|
||||||
|
|
||||||
|
|
||||||
public Settings()
|
public Settings()
|
||||||
{
|
{
|
||||||
@ -74,11 +75,13 @@ namespace unison
|
|||||||
{
|
{
|
||||||
ConnectionStatus.Text = $"{unison.Resources.Resources.Settings_ConnectionStatusConnected} {mpd.GetVersion()}.";
|
ConnectionStatus.Text = $"{unison.Resources.Resources.Settings_ConnectionStatusConnected} {mpd.GetVersion()}.";
|
||||||
ConnectButton.IsEnabled = false;
|
ConnectButton.IsEnabled = false;
|
||||||
|
UpdateDatabaseButton.IsEnabled = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ConnectionStatus.Text = unison.Resources.Resources.Settings_ConnectionStatusOffline;
|
ConnectionStatus.Text = unison.Resources.Resources.Settings_ConnectionStatusOffline;
|
||||||
ConnectButton.IsEnabled = true;
|
ConnectButton.IsEnabled = true;
|
||||||
|
UpdateDatabaseButton.IsEnabled = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,7 +105,7 @@ namespace unison
|
|||||||
|
|
||||||
private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
|
private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
|
||||||
{
|
{
|
||||||
ProcessStartInfo psi = new(e.Uri.AbsoluteUri);
|
ProcessStartInfo psi = new ProcessStartInfo(e.Uri.AbsoluteUri);
|
||||||
psi.UseShellExecute = true;
|
psi.UseShellExecute = true;
|
||||||
Process.Start(psi);
|
Process.Start(psi);
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
@ -146,6 +149,37 @@ namespace unison
|
|||||||
MPDConnect_Clicked(null, null);
|
MPDConnect_Clicked(null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void MPDDatabaseUpdate_Clicked(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
MPDHandler mpd = (MPDHandler)Application.Current.Properties["mpd"];
|
||||||
|
if (mpd.IsConnected())
|
||||||
|
mpd.UpdateDB();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void TimedText(TextBlock textBlock, int time)
|
||||||
|
{
|
||||||
|
DispatcherTimer Timer = new DispatcherTimer();
|
||||||
|
Timer.Interval = TimeSpan.FromSeconds(time);
|
||||||
|
Timer.Tick += (sender, args) =>
|
||||||
|
{
|
||||||
|
Timer.Stop();
|
||||||
|
textBlock.Visibility = Visibility.Collapsed;
|
||||||
|
};
|
||||||
|
Timer.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void MPDDatabaseUpdate_Start()
|
||||||
|
{
|
||||||
|
UpdateDBMessage.Visibility = Visibility.Visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void MPDDatabaseUpdate_Stop()
|
||||||
|
{
|
||||||
|
UpdateDBMessage2.Visibility = Visibility.Visible;
|
||||||
|
TimedText(UpdateDBMessage, 2);
|
||||||
|
TimedText(UpdateDBMessage2, 2);
|
||||||
|
}
|
||||||
|
|
||||||
private void CheckUpdates(object sender, RoutedEventArgs e)
|
private void CheckUpdates(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
UpdateHandler updater = (UpdateHandler)Application.Current.Properties["updater"];
|
UpdateHandler updater = (UpdateHandler)Application.Current.Properties["updater"];
|
||||||
@ -348,7 +382,7 @@ namespace unison
|
|||||||
HotkeyChanged();
|
HotkeyChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
private HotkeyHandler.VK GetVirtualKey(Key key)
|
private static HotkeyHandler.VK GetVirtualKey(Key key)
|
||||||
{
|
{
|
||||||
foreach (object value in System.Enum.GetValues(typeof(HotkeyHandler.VK)))
|
foreach (object value in System.Enum.GetValues(typeof(HotkeyHandler.VK)))
|
||||||
{
|
{
|
||||||
@ -358,7 +392,7 @@ namespace unison
|
|||||||
return HotkeyHandler.VK.None;
|
return HotkeyHandler.VK.None;
|
||||||
}
|
}
|
||||||
|
|
||||||
private HotkeyHandler.MOD GetMOD(string str)
|
private static HotkeyHandler.MOD GetMOD(string str)
|
||||||
{
|
{
|
||||||
foreach (object value in System.Enum.GetValues(typeof(HotkeyHandler.MOD)))
|
foreach (object value in System.Enum.GetValues(typeof(HotkeyHandler.MOD)))
|
||||||
{
|
{
|
||||||
@ -390,12 +424,12 @@ namespace unison
|
|||||||
InitializeShortcuts();
|
InitializeShortcuts();
|
||||||
}
|
}
|
||||||
|
|
||||||
private uint GetMod(StackPanel stackPanel)
|
private static uint GetMod(StackPanel stackPanel)
|
||||||
{
|
{
|
||||||
return (uint)(GetMOD(stackPanel.Children.OfType<ComboBox>().First().SelectedItem.ToString()) | GetMOD(stackPanel.Children.OfType<ComboBox>().Last().SelectedItem.ToString()));
|
return (uint)(GetMOD(stackPanel.Children.OfType<ComboBox>().First().SelectedItem.ToString()) | GetMOD(stackPanel.Children.OfType<ComboBox>().Last().SelectedItem.ToString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private uint GetVk(StackPanel stackPanel)
|
private static uint GetVk(StackPanel stackPanel)
|
||||||
{
|
{
|
||||||
Button button = stackPanel.Children.OfType<Button>().First();
|
Button button = stackPanel.Children.OfType<Button>().First();
|
||||||
TextBlock textBlock = (TextBlock)button.Content;
|
TextBlock textBlock = (TextBlock)button.Content;
|
||||||
|
@ -4,30 +4,30 @@
|
|||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:emoji="clr-namespace:Emoji.Wpf;assembly=Emoji.Wpf"
|
xmlns:emoji="clr-namespace:Emoji.Wpf;assembly=Emoji.Wpf"
|
||||||
xmlns:local="clr-namespace:unison" xmlns:sys="clr-namespace:System;assembly=System.Runtime"
|
xmlns:properties="clr-namespace:unison.Resources" xmlns:sys="clr-namespace:System;assembly=System.Runtime"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
Title="Shuffle" Closing="Window_Closing" SizeToContent="WidthAndHeight" ResizeMode="NoResize">
|
Title="Shuffle" Closing="Window_Closing" SizeToContent="WidthAndHeight" ResizeMode="NoResize">
|
||||||
|
|
||||||
<Window.Resources>
|
<Window.Resources>
|
||||||
<x:Array x:Key="FilterType" Type="sys:String">
|
<x:Array x:Key="FilterType" Type="sys:String">
|
||||||
<sys:String>Song</sys:String>
|
<x:Static Member="properties:Resources.FilterType_Song"/>
|
||||||
<sys:String>Artist</sys:String>
|
<x:Static Member="properties:Resources.FilterType_Artist"/>
|
||||||
<sys:String>Album</sys:String>
|
<x:Static Member="properties:Resources.FilterType_Album"/>
|
||||||
<sys:String>Year</sys:String>
|
<x:Static Member="properties:Resources.FilterType_Year"/>
|
||||||
<sys:String>Genre</sys:String>
|
<x:Static Member="properties:Resources.FilterType_Genre"/>
|
||||||
<sys:String>Directory</sys:String>
|
<x:Static Member="properties:Resources.FilterType_Directory"/>
|
||||||
</x:Array>
|
</x:Array>
|
||||||
<x:Array x:Key="OperatorTypeA" Type="sys:String">
|
<x:Array x:Key="OperatorTypeA" Type="sys:String">
|
||||||
<sys:String>contains</sys:String>
|
<x:Static Member="properties:Resources.Operator_Contains"/>
|
||||||
<sys:String>is</sys:String>
|
<x:Static Member="properties:Resources.Operator_Is"/>
|
||||||
<sys:String>is not</sys:String>
|
<x:Static Member="properties:Resources.Operator_IsNot"/>
|
||||||
</x:Array>
|
</x:Array>
|
||||||
<x:Array x:Key="OperatorTypeB" Type="sys:String">
|
<x:Array x:Key="OperatorTypeB" Type="sys:String">
|
||||||
<sys:String>is</sys:String>
|
<x:Static Member="properties:Resources.Operator_Is"/>
|
||||||
<sys:String>is not</sys:String>
|
<x:Static Member="properties:Resources.Operator_IsNot"/>
|
||||||
</x:Array>
|
</x:Array>
|
||||||
<x:Array x:Key="OperatorTypeC" Type="sys:String">
|
<x:Array x:Key="OperatorTypeC" Type="sys:String">
|
||||||
<sys:String>is</sys:String>
|
<x:Static Member="properties:Resources.Operator_Is"/>
|
||||||
</x:Array>
|
</x:Array>
|
||||||
|
|
||||||
<DataTemplate x:Key="FilterPanel">
|
<DataTemplate x:Key="FilterPanel">
|
||||||
@ -49,7 +49,7 @@
|
|||||||
<GroupBox.Header>
|
<GroupBox.Header>
|
||||||
<TextBlock>
|
<TextBlock>
|
||||||
<emoji:EmojiInline Text="🔡"/>
|
<emoji:EmojiInline Text="🔡"/>
|
||||||
<Run Text="Filter"/>
|
<Run Text="{x:Static properties:Resources.Shuffle_Filter}"/>
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
</GroupBox.Header>
|
</GroupBox.Header>
|
||||||
<StackPanel Orientation="Vertical" Margin="5,0,5,0">
|
<StackPanel Orientation="Vertical" Margin="5,0,5,0">
|
||||||
@ -60,15 +60,16 @@
|
|||||||
|
|
||||||
<StackPanel x:Name="SongFilterPanel" Margin="0,10,0,0">
|
<StackPanel x:Name="SongFilterPanel" Margin="0,10,0,0">
|
||||||
<TextBlock>
|
<TextBlock>
|
||||||
<Run Text="Number of songs in filter: "/><Run x:Name="SongFilterNumber" FontWeight="Bold"/>
|
<Run Text="{x:Static properties:Resources.Shuffle_FilterSongNumber}"/><Run Text=" "/><Run x:Name="SongFilterNumber" FontWeight="Bold"/>
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
<StackPanel Margin="0,5,0,0">
|
<StackPanel Margin="0,5,0,0">
|
||||||
<StackPanel Orientation="Horizontal" Margin="0,5,0,5">
|
<StackPanel Orientation="Horizontal" Margin="0,5,0,5">
|
||||||
<Button Content="Query filter" Click="UpdateFilter_Clicked" Padding="5, 2" VerticalAlignment="Bottom" HorizontalAlignment="Left" FocusVisualStyle="{x:Null}" Margin="0,0,10,0"/>
|
<Button Content="{x:Static properties:Resources.Shuffle_FilterQuery}" Click="UpdateFilter_Clicked" Padding="5, 2" VerticalAlignment="Bottom" HorizontalAlignment="Left" FocusVisualStyle="{x:Null}" Margin="0,0,10,0"/>
|
||||||
<Button Content="Reset" Click="Reset_Clicked" Padding="5, 2" VerticalAlignment="Bottom" HorizontalAlignment="Left" FocusVisualStyle="{x:Null}"/>
|
<Button Content="{x:Static properties:Resources.Shuffle_FilterReset}" Click="Reset_Clicked" Padding="5, 2" VerticalAlignment="Bottom" HorizontalAlignment="Left" FocusVisualStyle="{x:Null}"/>
|
||||||
<TextBlock x:Name="QueryFilterText" Text="Querying filter..." Margin="15,3,0,0" FontStyle="Italic" Visibility="Collapsed" />
|
<TextBlock x:Name="QueryFilterText" Text="{x:Static properties:Resources.Shuffle_Querying1}" Margin="15,3,0,0" FontStyle="Italic" Visibility="Collapsed" />
|
||||||
|
<TextBlock x:Name="QueryFilterText2" Text="{x:Static properties:Resources.Shuffle_Querying2}" Margin="3,3,0,0" FontStyle="Italic" Visibility="Collapsed" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
@ -76,37 +77,38 @@
|
|||||||
|
|
||||||
|
|
||||||
<StackPanel Orientation="Horizontal" Margin="0,5,0,0">
|
<StackPanel Orientation="Horizontal" Margin="0,5,0,0">
|
||||||
<GroupBox DockPanel.Dock="Right" Padding="0,4,0,0" Width="248">
|
<GroupBox DockPanel.Dock="Right" Padding="0,4,0,0" Width="300">
|
||||||
<GroupBox.Header>
|
<GroupBox.Header>
|
||||||
<TextBlock>
|
<TextBlock>
|
||||||
<emoji:EmojiInline Text="➕"/>
|
<emoji:EmojiInline Text="➕"/>
|
||||||
<Run Text="Add to queue"/>
|
<Run Text="{x:Static properties:Resources.Shuffle_Queue}"/>
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
</GroupBox.Header>
|
</GroupBox.Header>
|
||||||
<StackPanel Orientation="Vertical" Margin="5,5,5,0">
|
<StackPanel Orientation="Vertical" Margin="5,5,5,0">
|
||||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
|
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
|
||||||
<TextBlock Text="Songs to add" Margin="0,0,5,5"/>
|
<TextBlock Text="{x:Static properties:Resources.Shuffle_QueueSongs}" Margin="0,0,5,5"/>
|
||||||
<TextBox x:Name="SongNumber" KeyUp="AddToQueueHandler" PreviewTextInput="QueueValidationTextBox" MaxLength="4" Text="15" Width="35" HorizontalAlignment="Left" VerticalAlignment="Top"/>
|
<TextBox x:Name="SongNumber" KeyUp="AddToQueueHandler" PreviewTextInput="QueueValidationTextBox" MaxLength="4" Text="15" Width="35" HorizontalAlignment="Left" VerticalAlignment="Top"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<StackPanel Orientation="Horizontal" Margin="0,5,0,0">
|
<StackPanel Orientation="Horizontal" Margin="0,5,0,0">
|
||||||
<Button Content="Add to queue" Click="AddToQueue_Clicked" Padding="5, 2" HorizontalAlignment="Left" FocusVisualStyle="{x:Null}"/>
|
<Button Content="{x:Static properties:Resources.Shuffle_Queue}" Click="AddToQueue_Clicked" Padding="5, 2" HorizontalAlignment="Left" FocusVisualStyle="{x:Null}"/>
|
||||||
<TextBlock x:Name="SearchStatus" Margin="15,3,0,0" FontStyle="Italic" Visibility="Collapsed">
|
<TextBlock x:Name="SearchStatus" Margin="15,3,0,0" FontStyle="Italic" Visibility="Collapsed">
|
||||||
<Run Text="Adding "/><Run x:Name="NumberAddedSongs"/><Run Text=" songs..."/>
|
<Run Text="{x:Static properties:Resources.Shuffle_ButtonMessage1}"/><Run Text=" "/><Run x:Name="NumberAddedSongs"/><Run Text=" "/><Run Text="{x:Static properties:Resources.Shuffle_ButtonMessage2}"/>
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
|
<TextBlock x:Name="SearchStatus2" Text="{x:Static properties:Resources.Shuffle_ButtonMessage3}" Margin="3,3,0,0" FontStyle="Italic" Visibility="Collapsed"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
|
|
||||||
<GroupBox DockPanel.Dock="Left" Padding="0,4,0,0" Width="248" Margin="0,0,5,0">
|
<GroupBox DockPanel.Dock="Left" Padding="0,4,0,0" Width="260" Margin="0,0,5,0">
|
||||||
<GroupBox.Header>
|
<GroupBox.Header>
|
||||||
<TextBlock>
|
<TextBlock>
|
||||||
<emoji:EmojiInline Text="♾️"/>
|
<emoji:EmojiInline Text="♾️"/>
|
||||||
<Run Text="Continuous shuffle"/>
|
<Run Text="{x:Static properties:Resources.Shuffle_Continuous}"/>
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
</GroupBox.Header>
|
</GroupBox.Header>
|
||||||
<StackPanel Orientation="Horizontal" Margin="5,7,5,0">
|
<StackPanel Orientation="Horizontal" Margin="5,7,5,0">
|
||||||
<CheckBox x:Name="ContinuousShuffle" Checked="ContinuousShuffle_Checked" Unchecked="ContinuousShuffle_Checked" FocusVisualStyle="{x:Null}" VerticalAlignment="Top">
|
<CheckBox x:Name="ContinuousShuffle" Checked="ContinuousShuffle_Checked" Unchecked="ContinuousShuffle_Checked" FocusVisualStyle="{x:Null}" VerticalAlignment="Top">
|
||||||
<TextBlock Text="Enable continuous shuffle" TextWrapping="Wrap"/>
|
<TextBlock Text="{x:Static properties:Resources.Shuffle_ContinuousEnable}" TextWrapping="Wrap"/>
|
||||||
</CheckBox>
|
</CheckBox>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</GroupBox>
|
</GroupBox>
|
||||||
|
@ -47,7 +47,7 @@ namespace unison
|
|||||||
ListFolder(_mpd._cancelCommand.Token);
|
ListFolder(_mpd._cancelCommand.Token);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async void ListGenre(CancellationToken token)
|
private async void ListGenre(CancellationToken token)
|
||||||
{
|
{
|
||||||
if (GenreList.Count != 0)
|
if (GenreList.Count != 0)
|
||||||
return;
|
return;
|
||||||
@ -64,7 +64,7 @@ namespace unison
|
|||||||
GenreList.Add(genre);
|
GenreList.Add(genre);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async void ListFolder(CancellationToken token)
|
private async void ListFolder(CancellationToken token)
|
||||||
{
|
{
|
||||||
if (FolderList.Count != 0)
|
if (FolderList.Count != 0)
|
||||||
return;
|
return;
|
||||||
@ -83,7 +83,7 @@ namespace unison
|
|||||||
|
|
||||||
private bool IsFilterEmpty()
|
private bool IsFilterEmpty()
|
||||||
{
|
{
|
||||||
if (Filters.Count() == 0)
|
if (Filters.Count == 0)
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -124,28 +124,28 @@ namespace unison
|
|||||||
_shuffle.SongList.Clear();
|
_shuffle.SongList.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
private ITag FilterEquivalence_Type(string value)
|
private static ITag FilterEquivalence_Type(string value)
|
||||||
{
|
{
|
||||||
if (value == "Song")
|
if (value == unison.Resources.Resources.FilterType_Song)
|
||||||
return MpdTags.Title;
|
return MpdTags.Title;
|
||||||
else if (value == "Artist")
|
else if (value == unison.Resources.Resources.FilterType_Artist)
|
||||||
return MpdTags.Artist;
|
return MpdTags.Artist;
|
||||||
else if (value == "Album")
|
else if (value == unison.Resources.Resources.FilterType_Album)
|
||||||
return MpdTags.Album;
|
return MpdTags.Album;
|
||||||
else if (value == "Year")
|
else if (value == unison.Resources.Resources.FilterType_Year)
|
||||||
return MpdTags.Date;
|
return MpdTags.Date;
|
||||||
else if (value == "Genre")
|
else if (value == unison.Resources.Resources.FilterType_Genre)
|
||||||
return MpdTags.Genre;
|
return MpdTags.Genre;
|
||||||
return MpdTags.Title;
|
return MpdTags.Title;
|
||||||
}
|
}
|
||||||
|
|
||||||
private FilterOperator FilterEquivalence_Operator(string value)
|
private static FilterOperator FilterEquivalence_Operator(string value)
|
||||||
{
|
{
|
||||||
if (value == "contains")
|
if (value == unison.Resources.Resources.Operator_Contains)
|
||||||
return FilterOperator.Contains;
|
return FilterOperator.Contains;
|
||||||
else if (value == "is")
|
else if (value == unison.Resources.Resources.Operator_Is)
|
||||||
return FilterOperator.Equal;
|
return FilterOperator.Equal;
|
||||||
else if (value == "is not")
|
else if (value == unison.Resources.Resources.Operator_IsNot)
|
||||||
return FilterOperator.Different;
|
return FilterOperator.Different;
|
||||||
return FilterOperator.Equal;
|
return FilterOperator.Equal;
|
||||||
}
|
}
|
||||||
@ -180,9 +180,9 @@ namespace unison
|
|||||||
private void FilterType_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
private void FilterType_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||||
{
|
{
|
||||||
string item = e.AddedItems[0].ToString();
|
string item = e.AddedItems[0].ToString();
|
||||||
if (item == "Genre")
|
if (item == unison.Resources.Resources.FilterType_Genre)
|
||||||
FilterType_Change(sender, "OperatorTypeB", GenreList);
|
FilterType_Change(sender, "OperatorTypeB", GenreList);
|
||||||
else if (item == "Directory")
|
else if (item == unison.Resources.Resources.FilterType_Directory)
|
||||||
FilterType_Change(sender, "OperatorTypeC", FolderList);
|
FilterType_Change(sender, "OperatorTypeC", FolderList);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -217,10 +217,14 @@ namespace unison
|
|||||||
{
|
{
|
||||||
QueryFilterText.Visibility = Visibility.Visible;
|
QueryFilterText.Visibility = Visibility.Visible;
|
||||||
await UpdateFilter();
|
await UpdateFilter();
|
||||||
|
|
||||||
|
QueryFilterText2.Visibility = Visibility.Visible;
|
||||||
|
|
||||||
TimedText(QueryFilterText, 1);
|
TimedText(QueryFilterText, 1);
|
||||||
|
TimedText(QueryFilterText2, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void TimedText(TextBlock textBlock, int time)
|
private static void TimedText(TextBlock textBlock, int time)
|
||||||
{
|
{
|
||||||
DispatcherTimer Timer = new DispatcherTimer();
|
DispatcherTimer Timer = new DispatcherTimer();
|
||||||
Timer.Interval = TimeSpan.FromSeconds(time);
|
Timer.Interval = TimeSpan.FromSeconds(time);
|
||||||
@ -254,7 +258,7 @@ namespace unison
|
|||||||
{
|
{
|
||||||
if (child.Name == "FilterType")
|
if (child.Name == "FilterType")
|
||||||
{
|
{
|
||||||
if (child.SelectedItem.ToString() == "Directory")
|
if (child.SelectedItem.ToString() == unison.Resources.Resources.FilterType_Directory)
|
||||||
isDir = true;
|
isDir = true;
|
||||||
else
|
else
|
||||||
tag = FilterEquivalence_Type(child.SelectedItem.ToString());
|
tag = FilterEquivalence_Type(child.SelectedItem.ToString());
|
||||||
@ -330,18 +334,16 @@ namespace unison
|
|||||||
await UpdateFilter();
|
await UpdateFilter();
|
||||||
QueueValidationNumber();
|
QueueValidationNumber();
|
||||||
|
|
||||||
// TODO
|
|
||||||
// Added => Adding songs...
|
|
||||||
// to
|
|
||||||
// Added X songs! (display for 5 seconds)
|
|
||||||
|
|
||||||
NumberAddedSongs.Text = SongNumber.Text;
|
NumberAddedSongs.Text = SongNumber.Text;
|
||||||
SearchStatus.Visibility = Visibility.Visible;
|
SearchStatus.Visibility = Visibility.Visible;
|
||||||
|
|
||||||
int Num = int.Parse(SongNumber.Text);
|
int Num = int.Parse(SongNumber.Text);
|
||||||
await AddToQueue_Internal(Num);
|
await AddToQueue_Internal(Num);
|
||||||
|
|
||||||
|
SearchStatus2.Visibility = Visibility.Visible;
|
||||||
|
|
||||||
TimedText(SearchStatus, 2);
|
TimedText(SearchStatus, 2);
|
||||||
|
TimedText(SearchStatus2, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task AddToQueue_Internal(int Num)
|
private async Task AddToQueue_Internal(int Num)
|
||||||
@ -384,8 +386,9 @@ namespace unison
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
int PlaylistLength = _mpd.GetStatus().PlaylistLength;
|
int PlaylistLength = _mpd.GetStatus().PlaylistLength;
|
||||||
int Num = 10 - PlaylistLength;
|
int Num = 50 - PlaylistLength;
|
||||||
if (Num < 1)
|
|
||||||
|
if (PlaylistLength > 25)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
await UpdateFilter();
|
await UpdateFilter();
|
||||||
|
@ -32,7 +32,7 @@ namespace unison
|
|||||||
CanExecuteFunc = () => true
|
CanExecuteFunc = () => true
|
||||||
};
|
};
|
||||||
|
|
||||||
public string SnapcastText
|
public static string SnapcastText
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
@ -59,7 +59,7 @@ namespace unison
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ICommand Radios
|
public static ICommand Radios
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
@ -71,7 +71,7 @@ namespace unison
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ICommand Shuffle
|
public static ICommand Shuffle
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
@ -83,7 +83,7 @@ namespace unison
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ICommand Settings
|
public static ICommand Settings
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<ApplicationIcon>Resources\icon-full.ico</ApplicationIcon>
|
<ApplicationIcon>Resources\icon-full.ico</ApplicationIcon>
|
||||||
<Win32Resource></Win32Resource>
|
<Win32Resource></Win32Resource>
|
||||||
<StartupObject>unison.App</StartupObject>
|
<StartupObject>unison.App</StartupObject>
|
||||||
<Version>1.4</Version>
|
<Version>1.3.1</Version>
|
||||||
<Company />
|
<Company />
|
||||||
<Authors>Théo Marchal</Authors>
|
<Authors>Théo Marchal</Authors>
|
||||||
<PackageLicenseFile>LICENSE</PackageLicenseFile>
|
<PackageLicenseFile>LICENSE</PackageLicenseFile>
|
||||||
@ -53,7 +53,7 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Autoupdater.NET.Official" Version="1.7.6" />
|
<PackageReference Include="Autoupdater.NET.Official" Version="1.7.6" />
|
||||||
<PackageReference Include="Emoji.Wpf" Version="0.3.3" />
|
<PackageReference Include="Emoji.Wpf" Version="0.3.4" />
|
||||||
<PackageReference Include="Hardcodet.NotifyIcon.Wpf" Version="1.1.0" />
|
<PackageReference Include="Hardcodet.NotifyIcon.Wpf" Version="1.1.0" />
|
||||||
<PackageReference Include="RadioBrowser" Version="0.6.1" />
|
<PackageReference Include="RadioBrowser" Version="0.6.1" />
|
||||||
<PackageReference Include="MpcNET" Version="1.4.0" />
|
<PackageReference Include="MpcNET" Version="1.4.0" />
|
||||||
|