-
Notifications
You must be signed in to change notification settings - Fork 3.4k
/
ButtonsViewModel.cs
184 lines (153 loc) · 6.69 KB
/
ButtonsViewModel.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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
using MaterialDesignColors.WpfExample.Domain;
using System;
using System.ComponentModel;
using System.Windows.Input;
using System.Windows.Threading;
namespace MaterialDesignColors.WpfExample
{
public class ButtonsViewModel : INotifyPropertyChanged
{
private bool _showDismissButton;
private double _dismissButtonProgress;
private string _demoRestartCountdownText;
private int _orClickMeCount;
public ButtonsViewModel()
{
var autoStartingActionCountdownStart = DateTime.Now;
var demoRestartCountdownComplete = DateTime.Now;
var dismissRequested = false;
DismissCommand = new AnotherCommandImplementation(_ => dismissRequested = true);
ShowDismissButton = true;
#region DISMISS button demo control
//just some demo code for the DISMISS button...it's up to you to set
//up the progress on the button as it would be with a progress bar.
//and then hide the button, do whatever action you want to do
new DispatcherTimer(
TimeSpan.FromMilliseconds(100),
DispatcherPriority.Normal,
new EventHandler((o, e) =>
{
if (dismissRequested)
{
ShowDismissButton = false;
dismissRequested = false;
demoRestartCountdownComplete = DateTime.Now.AddSeconds(3);
DismissButtonProgress = 0;
}
if (ShowDismissButton)
{
var totalDuration = autoStartingActionCountdownStart.AddSeconds(5).Ticks - autoStartingActionCountdownStart.Ticks;
var currentDuration = DateTime.Now.Ticks - autoStartingActionCountdownStart.Ticks;
var autoCountdownPercentComplete = 100.0 / totalDuration * currentDuration;
DismissButtonProgress = autoCountdownPercentComplete;
if (DismissButtonProgress >= 100)
{
demoRestartCountdownComplete = DateTime.Now.AddSeconds(3);
ShowDismissButton = false;
UpdateDemoRestartCountdownText(demoRestartCountdownComplete, out _);
}
}
else
{
UpdateDemoRestartCountdownText(demoRestartCountdownComplete, out bool isComplete);
if (isComplete)
{
autoStartingActionCountdownStart = DateTime.Now;
ShowDismissButton = true;
}
}
}), Dispatcher.CurrentDispatcher);
#endregion
IncrementOrClickMeCountCommand = new AnotherCommandImplementation(_ => OrClickMeCount += 1);
OrClickMeCount = 0;
//just some demo code for the SAVE button
SaveCommand = new AnotherCommandImplementation(_ =>
{
if (IsSaveComplete == true)
{
IsSaveComplete = false;
return;
}
if (SaveProgress != 0) return;
var started = DateTime.Now;
IsSaving = true;
new DispatcherTimer(
TimeSpan.FromMilliseconds(50),
DispatcherPriority.Normal,
new EventHandler((o, e) =>
{
var totalDuration = started.AddSeconds(3).Ticks - started.Ticks;
var currentProgress = DateTime.Now.Ticks - started.Ticks;
var currentProgressPercent = 100.0 / totalDuration * currentProgress;
SaveProgress = currentProgressPercent;
if (SaveProgress >= 100)
{
IsSaveComplete = true;
IsSaving = false;
SaveProgress = 0;
((DispatcherTimer)o).Stop();
}
}), Dispatcher.CurrentDispatcher);
});
}
#region Dismiss button demo
public ICommand DismissCommand { get; }
public bool ShowDismissButton
{
get { return _showDismissButton; }
set { this.MutateVerbose(ref _showDismissButton, value, RaisePropertyChanged()); }
}
public double DismissButtonProgress
{
get { return _dismissButtonProgress; }
set { this.MutateVerbose(ref _dismissButtonProgress, value, RaisePropertyChanged()); }
}
public string DemoRestartCountdownText
{
get { return _demoRestartCountdownText; }
private set { this.MutateVerbose(ref _demoRestartCountdownText, value, RaisePropertyChanged()); }
}
private void UpdateDemoRestartCountdownText(DateTime endTime, out bool isComplete)
{
var span = endTime - DateTime.Now;
var seconds = Math.Round(span.TotalSeconds < 0 ? 0 : span.TotalSeconds);
DemoRestartCountdownText = "Demo in " + seconds;
isComplete = seconds == 0;
}
#endregion
#region OrClickMe Demo
public int OrClickMeCount
{
get { return _orClickMeCount; }
private set { this.MutateVerbose(ref _orClickMeCount, value, RaisePropertyChanged()); }
}
public ICommand IncrementOrClickMeCountCommand { get; }
#endregion
#region floating Save button demo
public ICommand SaveCommand { get; }
private bool _isSaving;
public bool IsSaving
{
get { return _isSaving; }
private set { this.MutateVerbose(ref _isSaving, value, RaisePropertyChanged()); }
}
private bool _isSaveComplete;
public bool IsSaveComplete
{
get { return _isSaveComplete; }
private set { this.MutateVerbose(ref _isSaveComplete, value, RaisePropertyChanged()); }
}
private double _saveProgress;
public double SaveProgress
{
get { return _saveProgress; }
private set { this.MutateVerbose(ref _saveProgress, value, RaisePropertyChanged()); }
}
#endregion
public event PropertyChangedEventHandler PropertyChanged;
private Action<PropertyChangedEventArgs> RaisePropertyChanged()
{
return args => PropertyChanged?.Invoke(this, args);
}
}
}