-
Notifications
You must be signed in to change notification settings - Fork 0
/
MainViewModel.cs
169 lines (126 loc) · 5.48 KB
/
MainViewModel.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
using System.Collections.Immutable;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Windows.Input;
using DoenaSoft.AbstractionLayer.Commands;
using DoenaSoft.AbstractionLayer.IOServices;
using DoenaSoft.AbstractionLayer.UIServices;
using DoenaSoft.FolderSize.Model;
using DoenaSoft.FolderSize.ViewModel.Injection;
namespace DoenaSoft.FolderSize.ViewModel
{
public sealed class MainViewModel : INotifyPropertyChanged
{
private readonly IIOServices _ioServices;
private readonly IUIServices _uiServices;
private CancellationTokenSource _calcCancellationTokenSource;
private readonly RootPathItem _nothingComboBoxItem;
private readonly RootPathItem _selectFolderComboBoxItem;
public static string Title => $"Folder Size {Assembly.GetEntryAssembly().GetName().Version}";
public IEnumerable<RootPathItem> RootPathComboBoxItems { get; }
private RootPathItem _selectedRootPathComboBoxItem;
public RootPathItem SelectedRootPathComboBoxItem
{
get
{
Debug.WriteLine($"getting {_selectedRootPathComboBoxItem?.DisplayName ?? "null"}");
return _selectedRootPathComboBoxItem;
}
set
{
Debug.WriteLine($"setting {value?.DisplayName ?? "null"}");
if (_selectedRootPathComboBoxItem != value)
{
Debug.WriteLine($"overwriting {_selectedRootPathComboBoxItem?.DisplayName ?? "null"}");
_selectedRootPathComboBoxItem = value;
this.OnPropertyChanged();
}
}
}
private readonly ICommand _rootPathComboBoxItemSelectionChangedCommand;
public ICommand RootPathComboBoxItemSelectionChangedCommand
=> _rootPathComboBoxItemSelectionChangedCommand;
public ObservableCollection<NodeViewModel> RootNodes { get; }
public event EventHandler CloseRequested;
public event PropertyChangedEventHandler PropertyChanged;
public MainViewModel()
{
_ioServices = IoC.Resolve<IIOServices>();
_uiServices = IoC.Resolve<IUIServices>();
_nothingComboBoxItem = new("Nothing", RootPathItemType.Nothing);
_selectFolderComboBoxItem = new("Please select folder", RootPathItemType.SelectFolder);
var rootPathComboBoxItems = new List<RootPathItem>()
{
_nothingComboBoxItem,
_selectFolderComboBoxItem,
};
var drives = _ioServices.GetDriveInfos(System.IO.DriveType.Fixed);
foreach (var drive in drives)
{
rootPathComboBoxItems.Add(new($"{drive.DriveLetter} [ {drive.VolumeLabel} ]", RootPathItemType.Drive, drive));
}
this.RootPathComboBoxItems = rootPathComboBoxItems.ToImmutableList();
_selectedRootPathComboBoxItem = _nothingComboBoxItem;
this.RootNodes = new();
_rootPathComboBoxItemSelectionChangedCommand = new ParameterizedRelayCommand(this.CreateNodes);
}
private void CreateNodes(object param)
{
if (this.SelectedRootPathComboBoxItem == null
|| this.SelectedRootPathComboBoxItem == _nothingComboBoxItem)
{
return;
}
_calcCancellationTokenSource?.Cancel();
_calcCancellationTokenSource?.Dispose();
_calcCancellationTokenSource = null;
this.RootNodes.Clear();
switch (this.SelectedRootPathComboBoxItem.Type)
{
case RootPathItemType.SelectFolder:
{
this.CreateRootFolderFromSelectedFolder();
this.SelectedRootPathComboBoxItem = _nothingComboBoxItem;
return;
}
case RootPathItemType.Drive:
{
this.CreateRootFolderFromSelectedDrive(this.SelectedRootPathComboBoxItem.Drive);
return;
}
default:
{
throw new NotImplementedException();
}
}
}
private void CreateRootFolderFromSelectedFolder()
{
if (_uiServices.ShowFolderBrowserDialog(new()
{
Description = "Select a folder",
RootFolder = Environment.SpecialFolder.MyComputer,
ShowNewFolderButton = false,
}, out var rootFolder))
{
this.SetRootFolder(rootFolder);
}
}
private void CreateRootFolderFromSelectedDrive(IDriveInfo drive)
{
this.SetRootFolder(drive.RootFolderName);
}
private void SetRootFolder(string rootFolder)
{
var modelNode = IoC.Resolve<IFolderSizeModelBuilder>().BuildFolderNode(_ioServices.GetFolderInfo(rootFolder));
_calcCancellationTokenSource = new();
var viewModelNode = new NodeViewModel(modelNode, null, _calcCancellationTokenSource.Token);
this.RootNodes.Add(viewModelNode);
}
private void OnPropertyChanged([CallerMemberName] string propertyName = "")
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}