Skip to content

Commit 5706e3b

Browse files
committed
Chore: Refactoring / improve view
1 parent 2e738c2 commit 5706e3b

File tree

7 files changed

+114
-49
lines changed

7 files changed

+114
-49
lines changed

Source/NETworkManager/ViewModels/ARPTableViewModel.cs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
using System.Collections.Generic;
1313
using System.Collections.ObjectModel;
1414
using System.ComponentModel;
15-
using System.Diagnostics;
1615
using System.Linq;
1716
using System.Threading.Tasks;
1817
using System.Windows;
@@ -54,7 +53,7 @@ public ARPTableViewModel(IDialogCoordinator instance)
5453
};
5554

5655
// Get ARP table
57-
Refresh().ConfigureAwait(false);
56+
Refresh(true).ConfigureAwait(false);
5857

5958
// Auto refresh
6059
_autoRefreshTimer.Tick += AutoRefreshTimer_Tick;
@@ -71,6 +70,7 @@ public ARPTableViewModel(IDialogCoordinator instance)
7170
#endregion
7271

7372
#region Variables
73+
7474
private static readonly ILog Log = LogManager.GetLogger(typeof(ARPTableViewModel));
7575

7676
private readonly IDialogCoordinator _dialogCoordinator;
@@ -427,16 +427,25 @@ await _dialogCoordinator.ShowMessageAsync(this, Strings.Error,
427427

428428
#region Methods
429429

430-
private async Task Refresh()
430+
private async Task Refresh(bool init = false)
431431
{
432432
IsRefreshing = true;
433433

434-
await Task.Delay(GlobalStaticConfiguration.ApplicationUIRefreshInterval);
434+
if (init == false)
435+
{
436+
StatusMessage = "Refreshing...";
437+
IsStatusMessageDisplayed = true;
438+
439+
await Task.Delay(GlobalStaticConfiguration.ApplicationUIRefreshInterval);
440+
}
435441

436442
Results.Clear();
437443

438444
(await ARP.GetTableAsync()).ForEach(Results.Add);
439445

446+
StatusMessage = "Reloaded at " + DateTime.Now.ToShortTimeString();
447+
IsStatusMessageDisplayed = true;
448+
440449
IsRefreshing = false;
441450
}
442451

Source/NETworkManager/ViewModels/ConnectionsViewModel.cs

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,12 @@ public ConnectionsViewModel(IDialogCoordinator instance)
3939
IPAddressHelper.CompareIPAddresses(x.LocalIPAddress, y.LocalIPAddress));
4040

4141
ResultsView.Filter = o =>
42-
{
42+
{
4343
if (string.IsNullOrEmpty(Search))
44-
return true;
45-
44+
return true;
45+
4646
if (o is not ConnectionInfo info)
47-
return false;
47+
return false;
4848

4949
// Search by local/remote IP Address, local/remote Port, Protocol and State
5050
return info.LocalIPAddress.ToString().IndexOf(Search, StringComparison.OrdinalIgnoreCase) > -1 ||
@@ -61,7 +61,7 @@ public ConnectionsViewModel(IDialogCoordinator instance)
6161
};
6262

6363
// Get connections
64-
Refresh().ConfigureAwait(false);
64+
Refresh(true).ConfigureAwait(false);
6565

6666
// Auto refresh
6767
_autoRefreshTimer.Tick += AutoRefreshTimer_Tick;
@@ -94,8 +94,9 @@ private async void AutoRefreshTimer_Tick(object sender, EventArgs e)
9494
#endregion
9595

9696
#region Variables
97+
9798
private static readonly ILog Log = LogManager.GetLogger(typeof(ConnectionsViewModel));
98-
99+
99100
private readonly IDialogCoordinator _dialogCoordinator;
100101

101102
private readonly bool _isLoading;
@@ -276,9 +277,9 @@ public string StatusMessage
276277

277278
private bool Refresh_CanExecute(object parameter)
278279
{
279-
return Application.Current.MainWindow != null &&
280+
return Application.Current.MainWindow != null &&
280281
!((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen &&
281-
!ConfigurationManager.Current.IsChildWindowOpen &&
282+
!ConfigurationManager.Current.IsChildWindowOpen &&
282283
!IsRefreshing &&
283284
!AutoRefreshEnabled;
284285
}
@@ -314,7 +315,7 @@ private async Task ExportAction()
314315
catch (Exception ex)
315316
{
316317
Log.Error("Error while exporting data as " + instance.FileType, ex);
317-
318+
318319
var settings = AppearanceManager.MetroDialog;
319320
settings.AffirmativeButtonText = Strings.OK;
320321

@@ -343,16 +344,25 @@ await _dialogCoordinator.ShowMessageAsync(this, Strings.Error,
343344

344345
#region Methods
345346

346-
private async Task Refresh()
347+
private async Task Refresh(bool init = false)
347348
{
348349
IsRefreshing = true;
349350

350-
await Task.Delay(GlobalStaticConfiguration.ApplicationUIRefreshInterval);
351-
351+
if (init == false)
352+
{
353+
StatusMessage = "Refreshing...";
354+
IsStatusMessageDisplayed = true;
355+
356+
await Task.Delay(GlobalStaticConfiguration.ApplicationUIRefreshInterval);
357+
}
358+
352359
Results.Clear();
353-
360+
354361
(await Connection.GetActiveTcpConnectionsAsync()).ForEach(Results.Add);
355362

363+
StatusMessage = "Reloaded at " + DateTime.Now.ToShortTimeString();
364+
IsStatusMessageDisplayed = true;
365+
356366
IsRefreshing = false;
357367
}
358368

Source/NETworkManager/ViewModels/HostsFileEditorViewModel.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,8 @@ private bool Refresh_CanExecute(object parameter)
195195
{
196196
return Application.Current.MainWindow != null &&
197197
!((MetroWindow)Application.Current.MainWindow).IsAnyDialogOpen &&
198-
!ConfigurationManager.Current.IsChildWindowOpen;
198+
!ConfigurationManager.Current.IsChildWindowOpen &&
199+
!IsRefreshing;
199200
}
200201

201202
private async Task RefreshAction()
@@ -346,7 +347,7 @@ private async Task Refresh(bool init = false)
346347
StatusMessage = "Failed to reload hosts file: " + ex.Message;
347348

348349
if (i < 3)
349-
StatusMessage += Environment.NewLine + "Retrying in 2.5 seconds...";
350+
StatusMessage += Environment.NewLine + $"Retrying in {GlobalStaticConfiguration.ApplicationUIRefreshInterval / 1000} seconds...";
350351

351352
IsStatusMessageDisplayed = true;
352353

Source/NETworkManager/ViewModels/ListenersViewModel.cs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ public ListenersViewModel(IDialogCoordinator instance)
4040
ResultsView.Filter = o =>
4141
{
4242
if (string.IsNullOrEmpty(Search))
43-
return true;
44-
43+
return true;
44+
4545
if (o is not ListenerInfo info)
4646
return false;
4747

@@ -52,7 +52,7 @@ public ListenersViewModel(IDialogCoordinator instance)
5252
};
5353

5454
// Get listeners
55-
Refresh().ConfigureAwait(false);
55+
Refresh(true).ConfigureAwait(false);
5656

5757
// Auto refresh
5858
_autoRefreshTimer.Tick += AutoRefreshTimer_Tick;
@@ -85,8 +85,9 @@ private async void AutoRefreshTimer_Tick(object sender, EventArgs e)
8585
#endregion
8686

8787
#region Variables
88+
8889
private static readonly ILog Log = LogManager.GetLogger(typeof(ListenersViewModel));
89-
90+
9091
private readonly IDialogCoordinator _dialogCoordinator;
9192

9293
private readonly bool _isLoading;
@@ -304,7 +305,7 @@ private async Task ExportAction()
304305
catch (Exception ex)
305306
{
306307
Log.Error("Error while exporting data as " + instance.FileType, ex);
307-
308+
308309
var settings = AppearanceManager.MetroDialog;
309310
settings.AffirmativeButtonText = Strings.OK;
310311

@@ -332,16 +333,25 @@ await _dialogCoordinator.ShowMessageAsync(this, Strings.Error,
332333

333334
#region Methods
334335

335-
private async Task Refresh()
336+
private async Task Refresh(bool init = false)
336337
{
337338
IsRefreshing = true;
338339

339-
await Task.Delay(GlobalStaticConfiguration.ApplicationUIRefreshInterval);
340-
340+
if (init == false)
341+
{
342+
StatusMessage = "Refreshing...";
343+
IsStatusMessageDisplayed = true;
344+
345+
await Task.Delay(GlobalStaticConfiguration.ApplicationUIRefreshInterval);
346+
}
347+
341348
Results.Clear();
342-
349+
343350
(await Listener.GetAllActiveListenersAsync()).ForEach(Results.Add);
344351

352+
StatusMessage = "Reloaded at " + DateTime.Now.ToShortTimeString();
353+
IsStatusMessageDisplayed = true;
354+
345355
IsRefreshing = false;
346356
}
347357

Source/NETworkManager/Views/ARPTableView.xaml

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
xmlns:viewModels="clr-namespace:NETworkManager.ViewModels"
1010
xmlns:network="clr-namespace:NETworkManager.Models.Network;assembly=NETworkManager.Models"
1111
xmlns:utilities="clr-namespace:NETworkManager.Utilities;assembly=NETworkManager.Utilities"
12+
xmlns:networkManager="clr-namespace:NETworkManager"
1213
xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization"
1314
xmlns:controls="clr-namespace:NETworkManager.Controls;assembly=NETworkManager.Controls"
1415
xmlns:wpfHelper="clr-namespace:NETworkManager.Utilities.WPF;assembly=NETworkManager.Utilities.WPF"
@@ -32,6 +33,7 @@
3233
<RowDefinition Height="Auto" />
3334
<RowDefinition Height="10" />
3435
<RowDefinition Height="*" />
36+
<RowDefinition Height="10" />
3537
<RowDefinition Height="Auto" />
3638
<RowDefinition Height="10" />
3739
<RowDefinition Height="Auto" />
@@ -176,11 +178,21 @@
176178
MinWidth="100" />
177179
</controls:MultiSelectDataGrid.Columns>
178180
</controls:MultiSelectDataGrid>
179-
<TextBlock Grid.Column="0" Grid.Row="3" Foreground="{DynamicResource MahApps.Brushes.Accent}"
180-
Text="{Binding StatusMessage}"
181-
Visibility="{Binding IsStatusMessageDisplayed, Converter={StaticResource BooleanToVisibilityCollapsedConverter}}"
182-
Style="{DynamicResource StatusMessageTextBlock}" Margin="0,10,0,0" />
183-
<Grid Grid.Column="0" Grid.Row="5">
181+
<WrapPanel Grid.Column="0" Grid.Row="4" Orientation="Horizontal"
182+
VerticalAlignment="Center"
183+
HorizontalAlignment="Left">
184+
<networkManager:LoadingIndicator IsActive="True"
185+
Style="{DynamicResource ResourceKey=LoadingIndicatorPulseStyle}"
186+
Visibility="{Binding Path=IsRefreshing, Converter={StaticResource ResourceKey=BooleanToVisibilityCollapsedConverter}}"
187+
Width="24" Height="24"
188+
SpeedRatio="1" Margin="0,0,10,0" />
189+
<TextBlock Foreground="{DynamicResource MahApps.Brushes.Accent}"
190+
Text="{Binding StatusMessage}"
191+
VerticalAlignment="Center"
192+
Visibility="{Binding IsStatusMessageDisplayed, Converter={StaticResource BooleanToVisibilityCollapsedConverter}}"
193+
Style="{DynamicResource StatusMessageTextBlock}" />
194+
</WrapPanel>
195+
<Grid Grid.Column="0" Grid.Row="6">
184196
<Grid.ColumnDefinitions>
185197
<ColumnDefinition Width="Auto" />
186198
<ColumnDefinition Width="10" />

Source/NETworkManager/Views/ConnectionsView.xaml

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
xmlns:converters="clr-namespace:NETworkManager.Converters;assembly=NETworkManager.Converters"
77
xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks"
88
xmlns:dialogs="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro"
9-
xmlns:mahAppsControls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
9+
xmlns:networkManager="clr-namespace:NETworkManager"
1010
xmlns:viewModels="clr-namespace:NETworkManager.ViewModels"
1111
xmlns:network="clr-namespace:NETworkManager.Models.Network;assembly=NETworkManager.Models"
1212
xmlns:utilities="clr-namespace:NETworkManager.Utilities;assembly=NETworkManager.Utilities"
@@ -30,18 +30,19 @@
3030
<RowDefinition Height="Auto" />
3131
<RowDefinition Height="10" />
3232
<RowDefinition Height="*" />
33+
<RowDefinition Height="10" />
3334
<RowDefinition Height="Auto" />
3435
</Grid.RowDefinitions>
35-
<StackPanel Grid.Column="0" Grid.Row="0"
36+
<StackPanel Grid.Column="0" Grid.Row="0"
3637
Orientation="Horizontal"
3738
VerticalAlignment="Center"
3839
HorizontalAlignment="Right">
3940
<CheckBox IsChecked="{Binding AutoRefreshEnabled}"
40-
Content="{x:Static localization:Strings.AutomaticallyUpdateEvery}"
41+
Content="{x:Static localization:Strings.AutomaticallyUpdateEvery}"
4142
Margin="0,0,10,0" />
42-
<ComboBox ItemsSource="{Binding AutoRefreshTimes}"
43+
<ComboBox ItemsSource="{Binding AutoRefreshTimes}"
4344
SelectedItem="{Binding SelectedAutoRefreshTime}"
44-
MinWidth="150"
45+
MinWidth="150"
4546
Margin="0,0,10,0">
4647
<ComboBox.ItemTemplate>
4748
<DataTemplate DataType="utilities:AutoRefreshTimeInfo">
@@ -205,10 +206,20 @@
205206
SortMemberPath="ProcessPath" MinWidth="150" />
206207
</DataGrid.Columns>
207208
</controls:MultiSelectDataGrid>
208-
<TextBlock Grid.Row="3" Foreground="{DynamicResource MahApps.Brushes.Accent}"
209-
Text="{Binding StatusMessage}"
210-
Visibility="{Binding IsStatusMessageDisplayed, Converter={StaticResource BooleanToVisibilityCollapsedConverter}}"
211-
Style="{DynamicResource StatusMessageTextBlock}" Margin="0,10,0,0" />
209+
<WrapPanel Grid.Column="0" Grid.Row="4" Orientation="Horizontal"
210+
VerticalAlignment="Center"
211+
HorizontalAlignment="Left">
212+
<networkManager:LoadingIndicator IsActive="True"
213+
Style="{DynamicResource ResourceKey=LoadingIndicatorPulseStyle}"
214+
Visibility="{Binding Path=IsRefreshing, Converter={StaticResource ResourceKey=BooleanToVisibilityCollapsedConverter}}"
215+
Width="24" Height="24"
216+
SpeedRatio="1" Margin="0,0,10,0" />
217+
<TextBlock Foreground="{DynamicResource MahApps.Brushes.Accent}"
218+
Text="{Binding StatusMessage}"
219+
VerticalAlignment="Center"
220+
Visibility="{Binding IsStatusMessageDisplayed, Converter={StaticResource BooleanToVisibilityCollapsedConverter}}"
221+
Style="{DynamicResource StatusMessageTextBlock}" />
222+
</WrapPanel>
212223
</Grid>
213224
</TabItem>
214225
</TabControl>

Source/NETworkManager/Views/ListenersView.xaml

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
xmlns:localization="clr-namespace:NETworkManager.Localization.Resources;assembly=NETworkManager.Localization"
1313
xmlns:controls="clr-namespace:NETworkManager.Controls;assembly=NETworkManager.Controls"
1414
xmlns:wpfHelper="clr-namespace:NETworkManager.Utilities.WPF;assembly=NETworkManager.Utilities.WPF"
15+
xmlns:networkManager="clr-namespace:NETworkManager"
1516
dialog:DialogParticipation.Register="{Binding}"
1617
mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:ListenersViewModel}">
1718
<UserControl.InputBindings>
@@ -28,18 +29,19 @@
2829
<RowDefinition Height="Auto" />
2930
<RowDefinition Height="10" />
3031
<RowDefinition Height="*" />
32+
<RowDefinition Height="10" />
3133
<RowDefinition Height="Auto" />
3234
</Grid.RowDefinitions>
3335
<StackPanel Grid.Column="0" Grid.Row="0"
3436
Orientation="Horizontal"
3537
VerticalAlignment="Center"
3638
HorizontalAlignment="Right">
3739
<CheckBox IsChecked="{Binding AutoRefreshEnabled}"
38-
Content="{x:Static localization:Strings.AutomaticallyUpdateEvery}"
40+
Content="{x:Static localization:Strings.AutomaticallyUpdateEvery}"
3941
Margin="0,0,10,0" />
40-
<ComboBox ItemsSource="{Binding AutoRefreshTimes}"
42+
<ComboBox ItemsSource="{Binding AutoRefreshTimes}"
4143
SelectedItem="{Binding SelectedAutoRefreshTime}"
42-
MinWidth="150"
44+
MinWidth="150"
4345
Margin="0,0,10,0">
4446
<ComboBox.ItemTemplate>
4547
<DataTemplate DataType="utilities:AutoRefreshTimeInfo">
@@ -154,10 +156,20 @@
154156
SortMemberPath="Port" MinWidth="100" />
155157
</controls:MultiSelectDataGrid.Columns>
156158
</controls:MultiSelectDataGrid>
157-
<TextBlock Grid.Row="3" Foreground="{DynamicResource MahApps.Brushes.Accent}"
158-
Text="{Binding StatusMessage}"
159-
Visibility="{Binding IsStatusMessageDisplayed, Converter={StaticResource BooleanToVisibilityCollapsedConverter}}"
160-
Style="{DynamicResource StatusMessageTextBlock}" Margin="0,10,0,0" />
159+
<WrapPanel Grid.Column="0" Grid.Row="4" Orientation="Horizontal"
160+
VerticalAlignment="Center"
161+
HorizontalAlignment="Left">
162+
<networkManager:LoadingIndicator IsActive="True"
163+
Style="{DynamicResource ResourceKey=LoadingIndicatorPulseStyle}"
164+
Visibility="{Binding Path=IsRefreshing, Converter={StaticResource ResourceKey=BooleanToVisibilityCollapsedConverter}}"
165+
Width="24" Height="24"
166+
SpeedRatio="1" Margin="0,0,10,0" />
167+
<TextBlock Foreground="{DynamicResource MahApps.Brushes.Accent}"
168+
Text="{Binding StatusMessage}"
169+
VerticalAlignment="Center"
170+
Visibility="{Binding IsStatusMessageDisplayed, Converter={StaticResource BooleanToVisibilityCollapsedConverter}}"
171+
Style="{DynamicResource StatusMessageTextBlock}" />
172+
</WrapPanel>
161173
</Grid>
162174
</TabItem>
163175
</TabControl>

0 commit comments

Comments
 (0)