/
githubmirror
/
shadowsocks-windows
Обзор
Документация
Войти
/
githubmirror
/
shadowsocks-windows
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
v4
shadowsocks-csharp/ViewModels/OnlineConfigViewModel.cs
115 строк
5 KB
database64128
🎂 ForwardProxyView + HotkeysView + OnlineConfigView + VersionUpdatePromptView
17 окт 2020, 20:13
Не верифицирован
17 окт 2020, 20:13
d376002
Код
Авторство
О чём код?
using ReactiveUI; using ReactiveUI.Fody.Helpers; using ReactiveUI.Validation.Extensions; using ReactiveUI.Validation.Helpers; using Shadowsocks.Controller; using Shadowsocks.Localization; using Shadowsocks.Model; using Shadowsocks.View; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Reactive; using System.Reactive.Linq; using System.Text; using System.Windows; namespace Shadowsocks.ViewModels { public class OnlineConfigViewModel : ReactiveValidationObject { public OnlineConfigViewModel() { _config = Program.MainController.GetCurrentConfiguration(); _controller = Program.MainController; _menuViewController = Program.MenuController; Sources = new ObservableCollection<string>(_config.onlineConfigSource); SelectedSource = ""; Address = ""; // TODO in v5: if http:// show warning as materialDesign:HintAssist.HelperText AddressRule = this.ValidationRule( viewModel => viewModel.Address, address => address.StartsWith("http://"), "Warning: getting online configuration from plain HTTP sources is NOT secure!"); var canUpdateCopyRemove = this.WhenAnyValue( x => x.SelectedSource, selectedSource => !string.IsNullOrWhiteSpace(selectedSource)); var canUpdateAll = this.WhenAnyValue( x => x.Sources.Count, count => count > 0); var canAdd = this.WhenAnyValue( x => x.Address, address => Uri.IsWellFormedUriString(address, UriKind.Absolute) && (address.StartsWith("https://") || address.StartsWith("http://"))); Update = ReactiveCommand.CreateFromTask(() => _controller.UpdateOnlineConfig(SelectedSource), canUpdateCopyRemove); UpdateAll = ReactiveCommand.CreateFromTask(_controller.UpdateAllOnlineConfig, canUpdateAll); CopyLink = ReactiveCommand.Create(() => Clipboard.SetText(SelectedSource), canUpdateCopyRemove); Remove = ReactiveCommand.Create(() => { bool result; var urlToRemove = SelectedSource; // save it here because SelectedSource is lost once we remove the selection do { result = Sources.Remove(urlToRemove); } while (result); _controller.RemoveOnlineConfig(urlToRemove); }, canUpdateCopyRemove); Add = ReactiveCommand.Create(() => { Sources.Add(Address); SelectedSource = Address; _controller.SaveOnlineConfigSource(Sources.ToList()); Address = ""; }, canAdd); // TODO in v5: use MaterialDesignThemes snackbar messages this.WhenAnyObservable(x => x.Update) .Subscribe(x => { if (x) MessageBox.Show(LocalizationProvider.GetLocalizedValue<string>("sip008UpdateSuccess")); else MessageBox.Show(LocalizationProvider.GetLocalizedValue<string>("sip008UpdateFailure")); }); this.WhenAnyObservable(x => x.UpdateAll) .Subscribe(x => { if (x.Count == 0) MessageBox.Show(LocalizationProvider.GetLocalizedValue<string>("sip008UpdateAllSuccess")); else { var stringBuilder = new StringBuilder(LocalizationProvider.GetLocalizedValue<string>("sip008UpdateAllFailure")); foreach (var url in x) stringBuilder.AppendLine(url); MessageBox.Show(stringBuilder.ToString()); } }); } private readonly Configuration _config; private readonly ShadowsocksController _controller; private readonly MenuViewController _menuViewController; public ValidationHelper AddressRule { get; } public ReactiveCommand<Unit, bool> Update { get; } public ReactiveCommand<Unit, List<string>> UpdateAll { get; } public ReactiveCommand<Unit, Unit> CopyLink { get; } public ReactiveCommand<Unit, Unit> Remove { get; } public ReactiveCommand<Unit, Unit> Add { get; } [Reactive] public ObservableCollection<string> Sources { get; private set; } [Reactive] public string SelectedSource { get; set; } [Reactive] public string Address { get; set; } } }