348 lines
21 KiB
XML
348 lines
21 KiB
XML
<Window x:Class="FritzTV.MainWindow"
|
||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||
xmlns:vlc="clr-namespace:LibVLCSharp.WPF;assembly=LibVLCSharp.WPF"
|
||
Title="HomeStream"
|
||
Height="720" Width="1280"
|
||
Background="#1A1A1A"
|
||
WindowStartupLocation="CenterScreen">
|
||
|
||
<Window.Resources>
|
||
<Style x:Key="SidebarButton" TargetType="Button">
|
||
<Setter Property="Background" Value="Transparent"/>
|
||
<Setter Property="Foreground" Value="#DDD"/>
|
||
<Setter Property="BorderThickness" Value="0"/>
|
||
<Setter Property="Padding" Value="16,10"/>
|
||
<Setter Property="HorizontalContentAlignment" Value="Left"/>
|
||
<Setter Property="FontSize" Value="14"/>
|
||
<Setter Property="Cursor" Value="Hand"/>
|
||
<Setter Property="Template">
|
||
<Setter.Value>
|
||
<ControlTemplate TargetType="Button">
|
||
<Border x:Name="bd" Background="{TemplateBinding Background}"
|
||
Padding="{TemplateBinding Padding}">
|
||
<ContentPresenter VerticalAlignment="Center"/>
|
||
</Border>
|
||
<ControlTemplate.Triggers>
|
||
<Trigger Property="IsMouseOver" Value="True">
|
||
<Setter TargetName="bd" Property="Background" Value="#2A2A2A"/>
|
||
</Trigger>
|
||
</ControlTemplate.Triggers>
|
||
</ControlTemplate>
|
||
</Setter.Value>
|
||
</Setter>
|
||
</Style>
|
||
|
||
<!-- Dunkle Scrollbars (sonst sind die Standard-WPF-Scrollbars hellgrau) -->
|
||
<Style TargetType="ScrollBar">
|
||
<Setter Property="Background" Value="#0E0E0E"/>
|
||
<Setter Property="BorderThickness" Value="0"/>
|
||
<Setter Property="Width" Value="10"/>
|
||
<Setter Property="Template">
|
||
<Setter.Value>
|
||
<ControlTemplate TargetType="ScrollBar">
|
||
<Grid Background="{TemplateBinding Background}">
|
||
<Track Name="PART_Track" IsDirectionReversed="true">
|
||
<Track.Thumb>
|
||
<Thumb>
|
||
<Thumb.Template>
|
||
<ControlTemplate TargetType="Thumb">
|
||
<Border x:Name="thumbBd"
|
||
Background="#3A3A3A"
|
||
CornerRadius="3"
|
||
Margin="2"/>
|
||
<ControlTemplate.Triggers>
|
||
<Trigger Property="IsMouseOver" Value="True">
|
||
<Setter TargetName="thumbBd" Property="Background" Value="#555"/>
|
||
</Trigger>
|
||
</ControlTemplate.Triggers>
|
||
</ControlTemplate>
|
||
</Thumb.Template>
|
||
</Thumb>
|
||
</Track.Thumb>
|
||
<Track.IncreaseRepeatButton>
|
||
<RepeatButton Background="Transparent" BorderThickness="0"
|
||
Command="ScrollBar.PageDownCommand"
|
||
IsTabStop="False"/>
|
||
</Track.IncreaseRepeatButton>
|
||
<Track.DecreaseRepeatButton>
|
||
<RepeatButton Background="Transparent" BorderThickness="0"
|
||
Command="ScrollBar.PageUpCommand"
|
||
IsTabStop="False"/>
|
||
</Track.DecreaseRepeatButton>
|
||
</Track>
|
||
</Grid>
|
||
</ControlTemplate>
|
||
</Setter.Value>
|
||
</Setter>
|
||
<Style.Triggers>
|
||
<Trigger Property="Orientation" Value="Horizontal">
|
||
<Setter Property="Width" Value="Auto"/>
|
||
<Setter Property="Height" Value="10"/>
|
||
</Trigger>
|
||
</Style.Triggers>
|
||
</Style>
|
||
|
||
<Style x:Key="ChannelItem" TargetType="ListBoxItem">
|
||
<Setter Property="Background" Value="Transparent"/>
|
||
<Setter Property="Foreground" Value="#DDD"/>
|
||
<Setter Property="Padding" Value="12,8"/>
|
||
<Setter Property="BorderThickness" Value="0"/>
|
||
<Setter Property="Template">
|
||
<Setter.Value>
|
||
<ControlTemplate TargetType="ListBoxItem">
|
||
<Border x:Name="bd" Background="{TemplateBinding Background}"
|
||
Padding="{TemplateBinding Padding}">
|
||
<ContentPresenter/>
|
||
</Border>
|
||
<ControlTemplate.Triggers>
|
||
<Trigger Property="IsMouseOver" Value="True">
|
||
<Setter TargetName="bd" Property="Background" Value="#2A2A2A"/>
|
||
</Trigger>
|
||
<Trigger Property="IsSelected" Value="True">
|
||
<Setter TargetName="bd" Property="Background" Value="#0078D4"/>
|
||
<Setter Property="Foreground" Value="White"/>
|
||
</Trigger>
|
||
</ControlTemplate.Triggers>
|
||
</ControlTemplate>
|
||
</Setter.Value>
|
||
</Setter>
|
||
</Style>
|
||
</Window.Resources>
|
||
|
||
<Grid>
|
||
<Grid.ColumnDefinitions>
|
||
<ColumnDefinition x:Name="SidebarColumn" Width="180"/>
|
||
<ColumnDefinition x:Name="ChannelsColumn" Width="280"/>
|
||
<ColumnDefinition Width="*"/>
|
||
</Grid.ColumnDefinitions>
|
||
|
||
<!-- Burger-Toggle: außerhalb der VideoView (sichtbar wenn Spalten eingeklappt + KEIN Sender läuft).
|
||
Wenn ein Sender läuft greift der Overlay-Burger innerhalb VideoView (HWND-Airspace). -->
|
||
<!-- (kein eigener Button hier mehr — BtnSidebarToggleOverlay reicht) -->
|
||
|
||
<!-- Sidebar: Kategorien -->
|
||
<Border Grid.Column="0" Background="#161616" BorderBrush="#0A0A0A" BorderThickness="0,0,1,0">
|
||
<DockPanel>
|
||
<Grid DockPanel.Dock="Top">
|
||
<TextBlock Text="HomeStream"
|
||
Foreground="White" FontSize="20" FontWeight="Bold"
|
||
Padding="16,20,16,16"/>
|
||
<Button x:Name="BtnCollapseSidebar"
|
||
HorizontalAlignment="Right" VerticalAlignment="Top"
|
||
Width="28" Height="28" Margin="0,16,8,0"
|
||
Background="Transparent" Foreground="#888" BorderThickness="0"
|
||
Content="❮" FontSize="14" Cursor="Hand"
|
||
Click="BtnCollapseSidebar_Click"
|
||
ToolTip="Kategorien einklappen"/>
|
||
</Grid>
|
||
<StackPanel DockPanel.Dock="Top">
|
||
<Button x:Name="BtnAll" Content="📺 Alle Sender" Style="{StaticResource SidebarButton}" Click="BtnCategory_Click" Tag="all"/>
|
||
<Button x:Name="BtnTv" Content="🎬 TV" Style="{StaticResource SidebarButton}" Click="BtnCategory_Click" Tag="tv"/>
|
||
<Button x:Name="BtnRadio" Content="📡 Radio" Style="{StaticResource SidebarButton}" Click="BtnCategory_Click" Tag="radio"/>
|
||
<Separator Margin="8" Background="#333"/>
|
||
<Button x:Name="BtnFav" Content="⭐ Favoriten" Style="{StaticResource SidebarButton}" Click="BtnCategory_Click" Tag="fav"/>
|
||
<Separator Margin="8" Background="#333"/>
|
||
<Button x:Name="BtnEpgGrid" Content="📅 Programm" Style="{StaticResource SidebarButton}" Click="BtnEpgGrid_Click"
|
||
ToolTip="Programmübersicht aller Sender"/>
|
||
</StackPanel>
|
||
|
||
<StackPanel DockPanel.Dock="Bottom" Margin="16,0,16,16">
|
||
<Button x:Name="BtnSettings" Content="⚙ Einstellungen" Style="{StaticResource SidebarButton}" Click="BtnSettings_Click"/>
|
||
<Button x:Name="BtnAbout" Content="ℹ Über" Style="{StaticResource SidebarButton}" Click="BtnAbout_Click"/>
|
||
<TextBlock x:Name="TxtFritzBox" Foreground="#666" FontSize="11" Margin="16,8,0,0"/>
|
||
</StackPanel>
|
||
</DockPanel>
|
||
</Border>
|
||
|
||
<!-- Kanal-Liste -->
|
||
<Border Grid.Column="1" Background="#1A1A1A" BorderBrush="#0A0A0A" BorderThickness="0,0,1,0">
|
||
<DockPanel>
|
||
<Grid DockPanel.Dock="Top">
|
||
<TextBox x:Name="TxtSearch"
|
||
Margin="12,12,40,4" Padding="8,8,28,8" FontSize="13"
|
||
Background="#2A2A2A" Foreground="White" BorderBrush="#444"
|
||
TextChanged="TxtSearch_TextChanged"
|
||
Tag="Suchen…"/>
|
||
<Button x:Name="BtnClearSearch" Content="✕" FontSize="11"
|
||
HorizontalAlignment="Right" VerticalAlignment="Center"
|
||
Width="22" Height="22" Margin="0,4,46,0"
|
||
Background="Transparent" Foreground="#888" BorderThickness="0"
|
||
Cursor="Hand" Visibility="Collapsed"
|
||
Click="BtnClearSearch_Click"
|
||
ToolTip="Suche zurücksetzen"/>
|
||
<Button x:Name="BtnCollapseList"
|
||
HorizontalAlignment="Right" VerticalAlignment="Top"
|
||
Width="28" Height="28" Margin="0,12,8,0"
|
||
Background="Transparent" Foreground="#888" BorderThickness="0"
|
||
Content="❮" FontSize="14" Cursor="Hand"
|
||
Click="BtnCollapseList_Click"
|
||
ToolTip="Senderliste einklappen"/>
|
||
</Grid>
|
||
<TextBlock x:Name="TxtStatus" DockPanel.Dock="Bottom"
|
||
Foreground="#666" FontSize="11" Padding="12,8"/>
|
||
<ListBox x:Name="LstChannels"
|
||
Background="Transparent" BorderThickness="0"
|
||
ItemContainerStyle="{StaticResource ChannelItem}"
|
||
SelectionChanged="LstChannels_SelectionChanged"
|
||
ScrollViewer.HorizontalScrollBarVisibility="Disabled">
|
||
<ListBox.ItemTemplate>
|
||
<DataTemplate>
|
||
<Grid>
|
||
<Grid.ColumnDefinitions>
|
||
<ColumnDefinition Width="40"/>
|
||
<ColumnDefinition Width="*"/>
|
||
<ColumnDefinition Width="Auto"/>
|
||
</Grid.ColumnDefinitions>
|
||
<Image Grid.Column="0" Source="{Binding LogoPath}"
|
||
Width="32" Height="24" Stretch="Uniform"
|
||
VerticalAlignment="Center" HorizontalAlignment="Left"
|
||
RenderOptions.BitmapScalingMode="HighQuality"/>
|
||
<TextBlock Grid.Column="1" Text="{Binding Name}" FontSize="14" FontWeight="SemiBold"
|
||
VerticalAlignment="Center" Margin="6,0,0,0"/>
|
||
<TextBlock Grid.Column="2" VerticalAlignment="Center"
|
||
Text="⭐" FontSize="14"
|
||
Visibility="{Binding IsFavorite, Converter={StaticResource BoolToVis}}"/>
|
||
</Grid>
|
||
</DataTemplate>
|
||
</ListBox.ItemTemplate>
|
||
</ListBox>
|
||
</DockPanel>
|
||
</Border>
|
||
|
||
<!-- Player + EPG -->
|
||
<Grid Grid.Column="2" Background="#000">
|
||
<Grid.RowDefinitions>
|
||
<RowDefinition Height="*"/>
|
||
<RowDefinition Height="Auto"/>
|
||
</Grid.RowDefinitions>
|
||
|
||
<!-- VideoView -->
|
||
<Grid Grid.Row="0">
|
||
<vlc:VideoView x:Name="VideoView" Background="Black">
|
||
<Border x:Name="VideoOverlay"
|
||
Background="#01000000"
|
||
PreviewMouseLeftButtonDown="VideoClickCatcher_DoubleClick">
|
||
<Grid>
|
||
<Button x:Name="BtnSidebarToggleOverlay"
|
||
HorizontalAlignment="Left" VerticalAlignment="Top"
|
||
Width="36" Height="36" Margin="8"
|
||
Background="#80000000" Foreground="White" BorderThickness="0"
|
||
Content="☰" FontSize="16" Cursor="Hand"
|
||
Visibility="Collapsed"
|
||
Panel.ZIndex="1000"
|
||
Click="BtnSidebarToggle_Click"
|
||
ToolTip="Seitenleiste wieder einblenden (Strg+B)"/>
|
||
|
||
<!-- Radio-Cover bei Audio-Streams — INNERHALB VideoView damit es die native HWND überdeckt -->
|
||
<Border x:Name="RadioCover" Visibility="Collapsed"
|
||
Background="#1A1A1A">
|
||
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
|
||
<Image x:Name="RadioLogo" Width="200" Height="200" Stretch="Uniform"
|
||
RenderOptions.BitmapScalingMode="HighQuality"/>
|
||
<TextBlock x:Name="RadioFallbackIcon" Text="📻"
|
||
FontSize="120" Foreground="#444"
|
||
HorizontalAlignment="Center"
|
||
Visibility="Collapsed"/>
|
||
<TextBlock x:Name="TxtRadioName"
|
||
FontSize="24" FontWeight="Bold" Foreground="White"
|
||
HorizontalAlignment="Center" Margin="0,24,0,0"/>
|
||
<TextBlock x:Name="TxtRadioText"
|
||
FontSize="16" Foreground="#0078D4" FontWeight="SemiBold"
|
||
HorizontalAlignment="Center" Margin="24,12,24,0"
|
||
TextWrapping="Wrap" TextAlignment="Center"
|
||
MaxWidth="600"/>
|
||
</StackPanel>
|
||
</Border>
|
||
|
||
<!-- EPG-Overlay (Joyn-Style): liegt INNERHALB der VideoView damit Klicks ber HWND funktionieren -->
|
||
<Border x:Name="EpgOverlay" Visibility="Collapsed"
|
||
Background="#D8000000">
|
||
<DockPanel>
|
||
<!-- Header: Programm + Datum/Zeit + Schließen -->
|
||
<Grid DockPanel.Dock="Top" Background="#0A0A0A" Height="60">
|
||
<Grid.ColumnDefinitions>
|
||
<ColumnDefinition Width="Auto"/>
|
||
<ColumnDefinition Width="*"/>
|
||
<ColumnDefinition Width="Auto"/>
|
||
</Grid.ColumnDefinitions>
|
||
<TextBlock Grid.Column="0" Text="Programm"
|
||
Foreground="White" FontSize="24" FontWeight="Bold"
|
||
VerticalAlignment="Center" Margin="24,0"/>
|
||
<StackPanel Grid.Column="2" Orientation="Horizontal" VerticalAlignment="Center" Margin="0,0,16,0">
|
||
<TextBlock x:Name="TxtEpgDate" Foreground="#CCC" FontSize="14" VerticalAlignment="Center" Margin="0,0,16,0"/>
|
||
<TextBlock x:Name="TxtEpgTime" Foreground="White" FontSize="18" FontWeight="SemiBold" VerticalAlignment="Center" Margin="0,0,16,0"/>
|
||
<Button x:Name="BtnCloseEpg" Content="✕" FontSize="18"
|
||
Width="40" Height="40"
|
||
Background="Transparent" Foreground="White" BorderThickness="0"
|
||
Cursor="Hand"
|
||
Click="BtnCloseEpg_Click"
|
||
ToolTip="Schließen (Esc)"/>
|
||
</StackPanel>
|
||
</Grid>
|
||
|
||
<!-- Status-Zeile (Lade EPG… etc.) -->
|
||
<TextBlock x:Name="TxtEpgOverlayStatus" DockPanel.Dock="Bottom"
|
||
Foreground="#888" FontSize="11" Padding="24,8"
|
||
Background="#0A0A0A"/>
|
||
|
||
<!-- Scrollbares EPG-Grid (Canvas) -->
|
||
<ScrollViewer x:Name="EpgScrollViewer"
|
||
HorizontalScrollBarVisibility="Auto"
|
||
VerticalScrollBarVisibility="Auto"
|
||
Background="#0A0A0A">
|
||
<Canvas x:Name="EpgCanvas"/>
|
||
</ScrollViewer>
|
||
</DockPanel>
|
||
</Border>
|
||
</Grid>
|
||
</Border>
|
||
</vlc:VideoView>
|
||
<TextBlock x:Name="TxtNoChannel"
|
||
Text="Wähle einen Sender aus der Liste"
|
||
Foreground="#666" FontSize="18"
|
||
HorizontalAlignment="Center" VerticalAlignment="Center"
|
||
IsHitTestVisible="False"/>
|
||
</Grid>
|
||
|
||
<!-- Bottom Bar: EPG + Controls -->
|
||
<Border x:Name="BottomBar" Grid.Row="1" Background="#161616" BorderBrush="#0A0A0A" BorderThickness="0,1,0,0">
|
||
<DockPanel>
|
||
<!-- Hauptzeile mit Sender + Controls -->
|
||
<Grid Margin="16,12">
|
||
<Grid.ColumnDefinitions>
|
||
<ColumnDefinition Width="*"/>
|
||
<ColumnDefinition Width="Auto"/>
|
||
</Grid.ColumnDefinitions>
|
||
|
||
<StackPanel Grid.Column="0">
|
||
<TextBlock x:Name="TxtCurrentChannel"
|
||
Foreground="White" FontSize="18" FontWeight="Bold"/>
|
||
<TextBlock x:Name="TxtEpgNow"
|
||
Foreground="#DDD" FontSize="12" Margin="0,4,0,0"
|
||
TextWrapping="Wrap"/>
|
||
<TextBlock x:Name="TxtEpgNext"
|
||
Foreground="#888" FontSize="11" Margin="0,2,0,0"
|
||
TextWrapping="Wrap"/>
|
||
</StackPanel>
|
||
|
||
<StackPanel Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center">
|
||
<Button x:Name="BtnFavToggle" Content="☆" FontSize="20" Width="40" Height="40"
|
||
Background="Transparent" Foreground="White" BorderThickness="0"
|
||
Click="BtnFavToggle_Click" Cursor="Hand" ToolTip="Favorit"/>
|
||
<Button x:Name="BtnMute" Content="🔊" FontSize="16" Width="40" Height="40"
|
||
Background="Transparent" Foreground="White" BorderThickness="0"
|
||
Click="BtnMute_Click" Cursor="Hand" ToolTip="Stumm"/>
|
||
<Slider x:Name="SldVolume" Width="100" Minimum="0" Maximum="100" Value="80"
|
||
VerticalAlignment="Center" Margin="8,0"
|
||
ValueChanged="SldVolume_ValueChanged"/>
|
||
<Button x:Name="BtnFullscreen" Content="⛶" FontSize="16" Width="40" Height="40"
|
||
Background="Transparent" Foreground="White" BorderThickness="0"
|
||
Click="BtnFullscreen_Click" Cursor="Hand" ToolTip="Vollbild (F11)"/>
|
||
</StackPanel>
|
||
</Grid>
|
||
</DockPanel>
|
||
</Border>
|
||
</Grid>
|
||
</Grid>
|
||
</Window>
|