Skip to content

Commit 47d7202

Browse files
committed
moden UI
1 parent 8f4e0ff commit 47d7202

14 files changed

Lines changed: 626 additions & 597 deletions

LibVideo/App.xaml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
1-
<Application x:Class="LibVideo.App"
1+
<Application x:Class="LibVideo.App"
22
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
33
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
44
xmlns:local="clr-namespace:LibVideo"
5+
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
56
StartupUri="MainWindow.xaml">
67
<Application.Resources>
7-
8+
<ResourceDictionary>
9+
<ResourceDictionary.MergedDictionaries>
10+
<materialDesign:BundledTheme BaseTheme="Light" PrimaryColor="DeepPurple" SecondaryColor="Teal" />
11+
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
12+
</ResourceDictionary.MergedDictionaries>
13+
</ResourceDictionary>
814
</Application.Resources>
915
</Application>

LibVideo/Data/DatabaseManager.cs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using LiteDB;
4+
using LibVideo.Models;
5+
6+
namespace LibVideo.Data
7+
{
8+
public class DatabaseManager
9+
{
10+
private readonly string dbPath;
11+
12+
public DatabaseManager(string path = "libvideo_db.db")
13+
{
14+
dbPath = path;
15+
}
16+
17+
public void InsertOrUpdateItems(IEnumerable<VideoItem> items)
18+
{
19+
using (var db = new LiteDatabase(dbPath))
20+
{
21+
var col = db.GetCollection<VideoItem>("videos");
22+
col.EnsureIndex(x => x.FullName, true);
23+
24+
var existingFiles = new HashSet<string>(col.FindAll().Select(v => v.FullName));
25+
var newItems = items.Where(i => !existingFiles.Contains(i.FullName)).ToList();
26+
27+
if (newItems.Count > 0)
28+
{
29+
col.InsertBulk(newItems);
30+
}
31+
}
32+
}
33+
34+
public List<VideoItem> GetAllItems()
35+
{
36+
using (var db = new LiteDatabase(dbPath))
37+
{
38+
var col = db.GetCollection<VideoItem>("videos");
39+
return col.FindAll().ToList();
40+
}
41+
}
42+
43+
public void ClearItems()
44+
{
45+
using (var db = new LiteDatabase(dbPath))
46+
{
47+
db.DropCollection("videos");
48+
}
49+
}
50+
51+
public void RemoveDirectoryItems(string directoryPath)
52+
{
53+
using (var db = new LiteDatabase(dbPath))
54+
{
55+
var col = db.GetCollection<VideoItem>("videos");
56+
var itemsToDelete = col.Find(x => x.FullName.StartsWith(directoryPath)).Select(x => x.Id).ToList();
57+
foreach (var id in itemsToDelete)
58+
{
59+
col.Delete(id);
60+
}
61+
}
62+
}
63+
}
64+
}

LibVideo/LibVideo2.csproj

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<?xml version="1.0" encoding="utf-8"?>
1+
<?xml version="1.0" encoding="utf-8"?>
22
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
33
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
44
<PropertyGroup>
@@ -76,12 +76,13 @@
7676
<SignAssembly>false</SignAssembly>
7777
</PropertyGroup>
7878
<ItemGroup>
79-
<Reference Include="Microsoft.WindowsAPICodePack, Version=1.1.0.0, Culture=neutral, processorArchitecture=MSIL">
80-
<HintPath>..\packages\WindowsAPICodePack-Core.1.1.1\lib\Microsoft.WindowsAPICodePack.dll</HintPath>
81-
</Reference>
82-
<Reference Include="Microsoft.WindowsAPICodePack.Shell, Version=1.1.0.0, Culture=neutral, processorArchitecture=MSIL">
83-
<HintPath>..\packages\WindowsAPICodePack-Shell.1.1.1\lib\Microsoft.WindowsAPICodePack.Shell.dll</HintPath>
84-
</Reference>
79+
<PackageReference Include="WindowsAPICodePack-Core" Version="1.1.1" />
80+
<PackageReference Include="WindowsAPICodePack-Shell" Version="1.1.1" />
81+
<PackageReference Include="LiteDB" Version="5.0.21" />
82+
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" />
83+
<PackageReference Include="MaterialDesignThemes" Version="4.9.0" />
84+
</ItemGroup>
85+
<ItemGroup>
8586
<Reference Include="System" />
8687
<Reference Include="System.Data" />
8788
<Reference Include="System.Drawing" />
@@ -107,6 +108,10 @@
107108
<Generator>MSBuild:Compile</Generator>
108109
<SubType>Designer</SubType>
109110
</Page>
111+
<Page Include="SettingsWindow.xaml">
112+
<Generator>MSBuild:Compile</Generator>
113+
<SubType>Designer</SubType>
114+
</Page>
110115
<Compile Include="App.xaml.cs">
111116
<DependentUpon>App.xaml</DependentUpon>
112117
<SubType>Code</SubType>
@@ -115,6 +120,13 @@
115120
<DependentUpon>MainWindow.xaml</DependentUpon>
116121
<SubType>Code</SubType>
117122
</Compile>
123+
<Compile Include="SettingsWindow.xaml.cs">
124+
<DependentUpon>SettingsWindow.xaml</DependentUpon>
125+
<SubType>Code</SubType>
126+
</Compile>
127+
<Compile Include="Models\VideoItem.cs" />
128+
<Compile Include="ViewModels\MainViewModel.cs" />
129+
<Compile Include="Data\DatabaseManager.cs" />
118130
</ItemGroup>
119131
<ItemGroup>
120132
<Compile Include="Properties\AssemblyInfo.cs">
@@ -136,7 +148,6 @@
136148
<SubType>Designer</SubType>
137149
</EmbeddedResource>
138150
<None Include="LibVideo_TemporaryKey.pfx" />
139-
<None Include="packages.config" />
140151
<None Include="Properties\Settings.settings">
141152
<Generator>SettingsSingleFileGenerator</Generator>
142153
<LastGenOutput>Settings.Designer.cs</LastGenOutput>

LibVideo/MainWindow.xaml

Lines changed: 80 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -4,68 +4,102 @@
44
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
55
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
66
xmlns:local="clr-namespace:LibVideo"
7+
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
78
mc:Ignorable="d"
8-
Title="我家视频" Height="527.371" Width="800"
9-
WindowState="Normal" ResizeMode="NoResize" >
10-
9+
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
10+
TextElement.FontWeight="Regular"
11+
TextElement.FontSize="13"
12+
TextOptions.TextFormattingMode="Ideal"
13+
TextOptions.TextRenderingMode="Auto"
14+
Background="{DynamicResource MaterialDesignPaper}"
15+
Title="我家视频" Height="600" Width="1000"
16+
WindowState="Normal" WindowStartupLocation="CenterScreen">
17+
18+
<Window.DataContext>
19+
<localViewModels:MainViewModel xmlns:localViewModels="clr-namespace:LibVideo.ViewModels"/>
20+
</Window.DataContext>
1121

22+
<Window.Resources>
23+
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
24+
</Window.Resources>
1225

1326
<Grid>
14-
<ListBox x:Name="dirListUI" HorizontalAlignment="Left" Height="113" Margin="630,10,0,0" VerticalAlignment="Top" Width="147" Panel.ZIndex="1" />
15-
<Button Content="添加视频目录" HorizontalAlignment="Left" Height="27" Margin="630,128,0,0" VerticalAlignment="Top" Width="70" Click="dirButton_Click" IsEnabled="True" IsHitTestVisible="True" Panel.ZIndex="1" Background="LightBlue"/>
16-
<Button x:Name="btnDeleteDir" Content="删除选中" HorizontalAlignment="Left" Height="27" Margin="705,128,0,0" VerticalAlignment="Top" Width="70" Click="btnDeleteDir_Click" Background="#FFFF9999" Panel.ZIndex="1"/>
17-
27+
<Grid.RowDefinitions>
28+
<RowDefinition Height="Auto" />
29+
<RowDefinition Height="*" />
30+
<RowDefinition Height="Auto" />
31+
</Grid.RowDefinitions>
1832

19-
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
20-
<DataGrid x:Name="outputGrid" Height="402" Margin="10,43,0,0" Width="611"
21-
AutoGenerateColumns="False" SelectionMode="Single" SelectionUnit="Cell" IsReadOnly="true" HorizontalAlignment="Left">
22-
<DataGrid.Columns>
23-
<DataGridTextColumn Header="编号" Binding="{Binding Id}" />
24-
<DataGridTextColumn Header="视频" Binding="{Binding FullName}">
25-
<DataGridTextColumn.ElementStyle>
26-
<Style TargetType="TextBlock">
27-
<Setter Property="ToolTip" Value="{Binding FullName}" />
28-
</Style>
29-
</DataGridTextColumn.ElementStyle>
30-
</DataGridTextColumn>
31-
</DataGrid.Columns>
33+
<!-- Top Header -->
34+
<Grid Grid.Row="0" Margin="16,10,16,10">
35+
<Grid.ColumnDefinitions>
36+
<ColumnDefinition Width="*" />
37+
<ColumnDefinition Width="Auto" />
38+
</Grid.ColumnDefinitions>
3239

33-
<DataGrid.Resources>
34-
<Style TargetType="DataGridRow">
35-
<EventSetter Event="MouseDoubleClick" Handler="Row_DoubleClick"/>
36-
</Style>
37-
</DataGrid.Resources>
40+
<StackPanel Orientation="Horizontal" Grid.Column="0">
41+
<ComboBox x:Name="keywords" Style="{StaticResource MaterialDesignFloatingHintComboBox}" materialDesign:HintAssist.Hint="搜索视频文件..." materialDesign:TextFieldAssist.HasClearButton="True" ItemsSource="{Binding SearchHistory}" Text="{Binding SearchKeyword, UpdateSourceTrigger=PropertyChanged}" IsEditable="True" Height="45" Width="300" VerticalAlignment="Center" Margin="0,0,10,0">
42+
<ComboBox.InputBindings>
43+
<KeyBinding Key="Enter" Command="{Binding CommitSearchCommand}"/>
44+
</ComboBox.InputBindings>
45+
</ComboBox>
46+
<Button x:Name="btnPrevSearch" Style="{StaticResource MaterialDesignFloatingActionMiniButton}" Command="{Binding PrevSearchCommand}" Height="30" Width="30" ToolTip="上一个搜索" VerticalAlignment="Center" Margin="0,0,10,0">
47+
<materialDesign:PackIcon Kind="ChevronLeft" />
48+
</Button>
49+
<Button x:Name="btnNextSearch" Style="{StaticResource MaterialDesignFloatingActionMiniButton}" Command="{Binding NextSearchCommand}" Height="30" Width="30" ToolTip="下一个搜索" VerticalAlignment="Center" Margin="0,0,10,0">
50+
<materialDesign:PackIcon Kind="ChevronRight" />
51+
</Button>
52+
</StackPanel>
3853

39-
<DataGrid.ContextMenu>
40-
<ContextMenu>
41-
<MenuItem Header="播放" Click="PlayOrOpenItem" />
42-
<MenuItem Header="打开文件夹" Click="OpenContainingFolder" />
43-
</ContextMenu>
44-
</DataGrid.ContextMenu>
45-
</DataGrid>
54+
<Button Grid.Column="1" x:Name="btnSettings" Style="{StaticResource MaterialDesignFloatingActionMiniButton}" Click="btnSettings_Click" Height="40" Width="40" ToolTip="管理视频目录" VerticalAlignment="Center">
55+
<materialDesign:PackIcon Kind="Settings" Height="24" Width="24" />
56+
</Button>
57+
</Grid>
4658

47-
</ScrollViewer>
59+
<!-- Main DataGrid -->
60+
<DataGrid Grid.Row="1" x:Name="outputGrid" Style="{StaticResource MaterialDesignDataGrid}" ItemsSource="{Binding VideoItems}" Margin="16,0,16,0" AutoGenerateColumns="False" SelectionMode="Single" SelectionUnit="FullRow" IsReadOnly="true" VirtualizingPanel.IsVirtualizing="True">
61+
<DataGrid.CellStyle>
62+
<Style TargetType="DataGridCell" BasedOn="{StaticResource MaterialDesignDataGridCell}">
63+
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
64+
<Setter Property="BorderThickness" Value="0" />
65+
</Style>
66+
</DataGrid.CellStyle>
67+
<DataGrid.RowStyle>
68+
<Style TargetType="DataGridRow" BasedOn="{StaticResource MaterialDesignDataGridRow}">
69+
<EventSetter Event="MouseDoubleClick" Handler="Row_DoubleClick" />
70+
</Style>
71+
</DataGrid.RowStyle>
72+
<DataGrid.Columns>
73+
<DataGridTextColumn Header="编号" Binding="{Binding Id}" />
74+
<DataGridTextColumn Header="录入日期" Binding="{Binding CreationTime, StringFormat=\{0:yyyy-MM-dd HH:mm\}}" />
75+
<DataGridTextColumn Header="路径" Binding="{Binding FolderName}" Width="*" />
76+
<DataGridTextColumn Header="文件名" Binding="{Binding FileName}" Width="*" />
77+
</DataGrid.Columns>
4878

49-
<ComboBox x:Name="keywords" IsEditable="True" HorizontalAlignment="Left" Height="28" Margin="190,10,0,0" VerticalAlignment="Top" Width="221" TextBoxBase.TextChanged="keywords_TextChanged" KeyDown="keywords_KeyDown" Panel.ZIndex="1"/>
50-
<Button x:Name="btnPrevSearch" Content="&lt;" HorizontalAlignment="Left" Height="28" Margin="415,10,0,0" VerticalAlignment="Top" Width="25" Click="btnPrevSearch_Click" ToolTip="上一个搜索" Panel.ZIndex="1"/>
51-
<Button x:Name="btnNextSearch" Content="&gt;" HorizontalAlignment="Left" Height="28" Margin="445,10,0,0" VerticalAlignment="Top" Width="25" Click="btnNextSearch_Click" ToolTip="下一个搜索" Panel.ZIndex="1"/>
52-
<Image Grid.Column="2" HorizontalAlignment="Left" Height="26" Margin="62.667,297,0,0" VerticalAlignment="Top" Width="113"/>
53-
<Label Content="搜索:" HorizontalAlignment="Left" Height="37" Margin="143,10,0,0" VerticalAlignment="Top" Width="63"/>
79+
<DataGrid.ContextMenu>
80+
<ContextMenu>
81+
<MenuItem Header="播放" Click="PlayOrOpenItem" />
82+
<MenuItem Header="打开文件夹" Click="OpenContainingFolder" />
83+
</ContextMenu>
84+
</DataGrid.ContextMenu>
85+
</DataGrid>
5486

55-
<!-- 状态栏 -->
56-
<StatusBar VerticalAlignment="Bottom">
87+
<!-- Status Bar -->
88+
<StatusBar Grid.Row="2" Margin="0,5,0,0">
5789
<StatusBarItem>
58-
<TextBlock x:Name="totalItemsText"/>
90+
<TextBlock x:Name="totalItemsText" Text="{Binding TotalItemsText}"/>
5991
</StatusBarItem>
6092
<StatusBarItem>
61-
<TextBlock x:Name="itemsAddedLast24HoursText"/>
93+
<TextBlock x:Name="itemsAddedLast24HoursText" Text="{Binding ItemsAddedLast24HoursText}"/>
6294
</StatusBarItem>
6395
</StatusBar>
64-
96+
6597
<!-- Loading Overlay -->
66-
<Grid x:Name="LoadingOverlay" Background="#99000000" Panel.ZIndex="100" Visibility="Collapsed">
67-
<TextBlock Text="正在加载文件,请稍候..." Foreground="White" FontSize="20" HorizontalAlignment="Center" VerticalAlignment="Center"/>
98+
<Grid Grid.RowSpan="3" x:Name="LoadingOverlay" Background="#99000000" Panel.ZIndex="100" Visibility="{Binding IsLoading, Converter={StaticResource BooleanToVisibilityConverter}}">
99+
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
100+
<ProgressBar Style="{StaticResource MaterialDesignCircularProgressBar}" Value="0" IsIndeterminate="True" Width="50" Height="50" Margin="0,0,0,16" Foreground="White" />
101+
<TextBlock Text="正在加载文件,请稍候..." Foreground="White" FontSize="20"/>
102+
</StackPanel>
68103
</Grid>
69104
</Grid>
70-
71105
</Window>

0 commit comments

Comments
 (0)