Skip to content

Commit fe81b51

Browse files
committed
Add BackupAndRestore
1 parent 90ba804 commit fe81b51

File tree

6 files changed

+313
-8
lines changed

6 files changed

+313
-8
lines changed
Lines changed: 231 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,231 @@
1+
<UserControl
2+
x:Class="v2rayN.Desktop.Views.BackupAndRestoreView"
3+
xmlns="https://github.com/avaloniaui"
4+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
6+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
7+
xmlns:resx="clr-namespace:ServiceLib.Resx;assembly=ServiceLib"
8+
xmlns:vms="clr-namespace:ServiceLib.ViewModels;assembly=ServiceLib"
9+
d:DesignHeight="450"
10+
d:DesignWidth="800"
11+
x:DataType="vms:BackupAndRestoreViewModel"
12+
mc:Ignorable="d">
13+
14+
<DockPanel Margin="16">
15+
<DockPanel Classes="Margin8" DockPanel.Dock="Bottom">
16+
<TextBlock
17+
Name="txtMsg"
18+
HorizontalAlignment="Left"
19+
Classes="Margin8" />
20+
</DockPanel>
21+
22+
<StackPanel>
23+
<Border
24+
Margin="0"
25+
VerticalAlignment="Center"
26+
Theme="{StaticResource CardBorder}">
27+
28+
<Grid Classes="Margin8">
29+
<Grid.RowDefinitions>
30+
<RowDefinition Height="Auto" />
31+
<RowDefinition Height="Auto" />
32+
<RowDefinition Height="Auto" />
33+
<RowDefinition Height="Auto" />
34+
</Grid.RowDefinitions>
35+
<Grid.ColumnDefinitions>
36+
<ColumnDefinition Width="300" />
37+
<ColumnDefinition Width="200" />
38+
</Grid.ColumnDefinitions>
39+
<TextBlock
40+
Grid.Row="0"
41+
Grid.Column="0"
42+
Classes="Margin8"
43+
Text="{x:Static resx:ResUI.menuLocalBackupAndRestore}" />
44+
45+
<TextBlock
46+
Grid.Row="1"
47+
Grid.Column="0"
48+
VerticalAlignment="Center"
49+
Classes="Margin8"
50+
Text="{x:Static resx:ResUI.menuLocalBackup}" />
51+
<Button
52+
Name="menuLocalBackup"
53+
Grid.Row="1"
54+
Grid.Column="1"
55+
VerticalAlignment="Center"
56+
Classes="Margin8"
57+
Content="{x:Static resx:ResUI.menuLocalBackup}" />
58+
59+
<Separator Grid.Row="2" Grid.ColumnSpan="2" />
60+
61+
<TextBlock
62+
Grid.Row="3"
63+
Grid.Column="0"
64+
VerticalAlignment="Center"
65+
Classes="Margin8"
66+
Text="{x:Static resx:ResUI.menuLocalRestore}" />
67+
<Button
68+
Name="menuLocalRestore"
69+
Grid.Row="3"
70+
Grid.Column="1"
71+
VerticalAlignment="Center"
72+
Classes="Margin8"
73+
Content="{x:Static resx:ResUI.menuLocalRestore}" />
74+
</Grid>
75+
</Border>
76+
<Border
77+
Margin="0"
78+
VerticalAlignment="Center"
79+
Theme="{StaticResource CardBorder}">
80+
<Grid Classes="Margin8">
81+
<Grid.RowDefinitions>
82+
<RowDefinition Height="Auto" />
83+
<RowDefinition Height="Auto" />
84+
<RowDefinition Height="Auto" />
85+
<RowDefinition Height="Auto" />
86+
<RowDefinition Height="Auto" />
87+
</Grid.RowDefinitions>
88+
<Grid.ColumnDefinitions>
89+
<ColumnDefinition Width="300" />
90+
<ColumnDefinition Width="200" />
91+
</Grid.ColumnDefinitions>
92+
<StackPanel Orientation="Horizontal">
93+
<TextBlock
94+
Grid.Row="0"
95+
Grid.Column="0"
96+
Classes="Margin8"
97+
Text="{x:Static resx:ResUI.menuRemoteBackupAndRestore}" />
98+
99+
<Button
100+
Width="30"
101+
Height="30"
102+
Margin="10,0"
103+
Theme="{DynamicResource BorderlessButton}">
104+
<Button.Content>
105+
<PathIcon
106+
Width="20"
107+
Height="20"
108+
Data="M511.9,276.3c43.8,0 79.2,-35.5 79.2,-79.2 0,-43.8 -35.5,-79.2 -79.2,-79.2 -43.8,0 -79.2,35.5 -79.2,79.2 0,43.8 35.5,79.2 79.2,79.2zM511.9,434.8c-43.8,0 -79.2,35.5 -79.2,79.2 0,43.8 35.5,79.2 79.2,79.2 43.8,0 79.2,-35.5 79.2,-79.2 0,-43.8 -35.5,-79.2 -79.2,-79.2zM511.9,751.8c-43.8,0 -79.2,35.4 -79.2,79.2 0,43.8 35.5,79.2 79.2,79.2 43.8,0 79.2,-35.5 79.2,-79.2 0,-43.8 -35.5,-79.2 -79.2,-79.2z"
109+
Foreground="{DynamicResource ButtonDefaultTertiaryForeground}" />
110+
</Button.Content>
111+
<Button.Flyout>
112+
<Flyout>
113+
<StackPanel>
114+
<Grid>
115+
<Grid.RowDefinitions>
116+
<RowDefinition Height="Auto" />
117+
<RowDefinition Height="Auto" />
118+
<RowDefinition Height="Auto" />
119+
<RowDefinition Height="Auto" />
120+
<RowDefinition Height="Auto" />
121+
</Grid.RowDefinitions>
122+
<Grid.ColumnDefinitions>
123+
<ColumnDefinition Width="Auto" />
124+
<ColumnDefinition Width="300" />
125+
</Grid.ColumnDefinitions>
126+
<TextBlock
127+
Grid.Row="0"
128+
Grid.Column="0"
129+
VerticalAlignment="Center"
130+
Classes="Margin8"
131+
Text="{x:Static resx:ResUI.LvWebDavUrl}" />
132+
133+
<TextBox
134+
x:Name="txtWebDavUrl"
135+
Grid.Row="0"
136+
Grid.Column="1"
137+
VerticalAlignment="Center"
138+
Classes="Margin8"
139+
TextWrapping="Wrap" />
140+
141+
<TextBlock
142+
Grid.Row="1"
143+
Grid.Column="0"
144+
VerticalAlignment="Center"
145+
Classes="Margin8"
146+
Text="{x:Static resx:ResUI.LvWebDavUserName}" />
147+
148+
<TextBox
149+
x:Name="txtWebDavUserName"
150+
Grid.Row="1"
151+
Grid.Column="1"
152+
VerticalAlignment="Center"
153+
Classes="Margin8" />
154+
155+
<TextBlock
156+
Grid.Row="2"
157+
Grid.Column="0"
158+
VerticalAlignment="Center"
159+
Classes="Margin8"
160+
Text="{x:Static resx:ResUI.LvWebDavPassword}" />
161+
162+
<TextBox
163+
x:Name="txtWebDavPassword"
164+
Grid.Row="2"
165+
Grid.Column="1"
166+
VerticalAlignment="Center"
167+
Classes="Margin8" />
168+
169+
<TextBlock
170+
Grid.Row="3"
171+
Grid.Column="0"
172+
VerticalAlignment="Center"
173+
Classes="Margin8"
174+
Text="{x:Static resx:ResUI.LvWebDavDirName}" />
175+
176+
<TextBox
177+
x:Name="txtWebDavDirName"
178+
Grid.Row="3"
179+
Grid.Column="1"
180+
VerticalAlignment="Center"
181+
Classes="Margin8" />
182+
183+
<Button
184+
x:Name="menuWebDavCheck"
185+
Grid.Row="4"
186+
Grid.Column="1"
187+
HorizontalAlignment="Right"
188+
VerticalAlignment="Center"
189+
Classes="Margin8"
190+
Content="{x:Static resx:ResUI.LvWebDavCheck}" />
191+
</Grid>
192+
</StackPanel>
193+
</Flyout>
194+
</Button.Flyout>
195+
</Button>
196+
197+
</StackPanel>
198+
199+
<TextBlock
200+
Grid.Row="1"
201+
Grid.Column="0"
202+
VerticalAlignment="Center"
203+
Classes="Margin8"
204+
Text="{x:Static resx:ResUI.menuRemoteBackup}" />
205+
<Button
206+
Name="menuRemoteBackup"
207+
Grid.Row="1"
208+
Grid.Column="1"
209+
VerticalAlignment="Center"
210+
Classes="Margin8"
211+
Content="{x:Static resx:ResUI.menuRemoteBackup}" />
212+
213+
<Separator Grid.Row="2" Grid.ColumnSpan="3" />
214+
<TextBlock
215+
Grid.Row="3"
216+
Grid.Column="0"
217+
VerticalAlignment="Center"
218+
Classes="Margin8"
219+
Text="{x:Static resx:ResUI.menuRemoteRestore}" />
220+
<Button
221+
Name="menuRemoteRestore"
222+
Grid.Row="3"
223+
Grid.Column="1"
224+
VerticalAlignment="Center"
225+
Classes="Margin8"
226+
Content="{x:Static resx:ResUI.menuRemoteRestore}" />
227+
</Grid>
228+
</Border>
229+
</StackPanel>
230+
</DockPanel>
231+
</UserControl>
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
using Avalonia.Controls;
2+
using Avalonia.Interactivity;
3+
using Avalonia.ReactiveUI;
4+
using ReactiveUI;
5+
using Splat;
6+
using System.Reactive.Disposables;
7+
using v2rayN.Desktop.Common;
8+
9+
namespace v2rayN.Desktop.Views
10+
{
11+
public partial class BackupAndRestoreView : ReactiveUserControl<BackupAndRestoreViewModel>
12+
{
13+
private NoticeHandler? _noticeHandler;
14+
private Window _window;
15+
16+
public BackupAndRestoreView(Window window)
17+
{
18+
_window = window;
19+
20+
InitializeComponent();
21+
menuLocalBackup.Click += MenuLocalBackup_Click;
22+
menuLocalRestore.Click += MenuLocalRestore_Click;
23+
24+
ViewModel = new BackupAndRestoreViewModel(UpdateViewHandler);
25+
26+
_noticeHandler = Locator.Current.GetService<NoticeHandler>();
27+
this.WhenActivated(disposables =>
28+
{
29+
this.Bind(ViewModel, vm => vm.OperationMsg, v => v.txtMsg.Text).DisposeWith(disposables);
30+
31+
this.Bind(ViewModel, vm => vm.SelectedSource.url, v => v.txtWebDavUrl.Text).DisposeWith(disposables);
32+
this.Bind(ViewModel, vm => vm.SelectedSource.userName, v => v.txtWebDavUserName.Text).DisposeWith(disposables);
33+
this.Bind(ViewModel, vm => vm.SelectedSource.password, v => v.txtWebDavPassword.Text).DisposeWith(disposables);
34+
this.Bind(ViewModel, vm => vm.SelectedSource.dirName, v => v.txtWebDavDirName.Text).DisposeWith(disposables);
35+
36+
this.BindCommand(ViewModel, vm => vm.WebDavCheckCmd, v => v.menuWebDavCheck).DisposeWith(disposables);
37+
38+
this.BindCommand(ViewModel, vm => vm.RemoteBackupCmd, v => v.menuRemoteBackup).DisposeWith(disposables);
39+
this.BindCommand(ViewModel, vm => vm.RemoteRestoreCmd, v => v.menuRemoteRestore).DisposeWith(disposables);
40+
});
41+
}
42+
43+
private async void MenuLocalBackup_Click(object? sender, RoutedEventArgs e)
44+
{
45+
var fileName = await UI.SaveFileDialog(_window, "Zip|*.zip");
46+
if (fileName.IsNullOrEmpty())
47+
{
48+
return;
49+
}
50+
51+
ViewModel?.LocalBackup(fileName);
52+
}
53+
54+
private async void MenuLocalRestore_Click(object? sender, RoutedEventArgs e)
55+
{
56+
var fileName = await UI.OpenFileDialog(_window, null);
57+
if (fileName.IsNullOrEmpty())
58+
{
59+
return;
60+
}
61+
62+
ViewModel?.LocalRestore(fileName);
63+
}
64+
65+
private async Task<bool> UpdateViewHandler(EViewAction action, object? obj)
66+
{
67+
return await Task.FromResult(true);
68+
}
69+
}
70+
}

v2rayN/v2rayN.Desktop/Views/MainWindow.axaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
<MenuItem x:Name="menuSettingsSetUWP" Header="{x:Static resx:ResUI.TbSettingsSetUWP}" />
7979
<MenuItem x:Name="menuClearServerStatistics" Header="{x:Static resx:ResUI.menuClearServerStatistics}" />
8080
<Separator />
81+
<MenuItem x:Name="menuBackupAndRestore" Header="{x:Static resx:ResUI.menuBackupAndRestore}" />
8182
<MenuItem x:Name="menuOpenTheFileLocation" Header="{x:Static resx:ResUI.menuOpenTheFileLocation}" />
8283
</MenuItem>
8384

v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Avalonia.Interactivity;
77
using Avalonia.ReactiveUI;
88
using Avalonia.Threading;
9+
using DialogHostAvalonia;
910
using ReactiveUI;
1011
using Splat;
1112
using System.ComponentModel;
@@ -19,6 +20,7 @@ public partial class MainWindow : ReactiveWindow<MainWindowViewModel>
1920
{
2021
private static Config _config;
2122
private WindowNotificationManager? _manager;
23+
private BackupAndRestoreView? _backupAndRestoreView;
2224

2325
public MainWindow()
2426
{
@@ -34,6 +36,7 @@ public MainWindow()
3436
menuSettingsSetUWP.Click += menuSettingsSetUWP_Click;
3537
menuPromotion.Click += menuPromotion_Click;
3638
menuClose.Click += menuClose_Click;
39+
menuBackupAndRestore.Click += MenuBackupAndRestore_Click;
3740

3841
var IsAdministrator = true;//WindowsUtils.IsAdministrator();
3942
MessageBus.Current.Listen<string>(Global.CommandSendSnackMsg).Subscribe(x => DelegateSnackMsg(x));
@@ -365,6 +368,12 @@ public async Task ScanScreenTaskAsync()
365368
//ViewModel?.ScanScreenTaskAsync(result);
366369
}
367370

371+
private void MenuBackupAndRestore_Click(object sender, RoutedEventArgs e)
372+
{
373+
_backupAndRestoreView ??= new BackupAndRestoreView(this);
374+
DialogHost.Show(_backupAndRestoreView);
375+
}
376+
368377
#endregion Event
369378

370379
#region UI

v2rayN/v2rayN.Desktop/v2rayN.Desktop.csproj

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
<EmbeddedResource Include="v2rayN.ico">
4141
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
4242
</EmbeddedResource>
43-
</ItemGroup>
44-
43+
</ItemGroup>
4544

4645
</Project>

v2rayN/v2rayN/Views/BackupAndRestoreView.xaml.cs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,7 @@ public BackupAndRestoreView()
3232
this.BindCommand(ViewModel, vm => vm.RemoteBackupCmd, v => v.menuRemoteBackup).DisposeWith(disposables);
3333
this.BindCommand(ViewModel, vm => vm.RemoteRestoreCmd, v => v.menuRemoteRestore).DisposeWith(disposables);
3434
});
35-
}
36-
37-
private void MenuRemoteRestore_Click(object sender, RoutedEventArgs e)
38-
{
39-
throw new NotImplementedException();
40-
}
35+
}
4136

4237
private void MenuLocalBackup_Click(object sender, RoutedEventArgs e)
4338
{

0 commit comments

Comments
 (0)