public WalletManagerViewModel(NavigationStateViewModel navigationState, WalletManager walletManager, UiConfig uiConfig)
        {
            Model             = walletManager;
            _walletDictionary = new Dictionary <Wallet, WalletViewModelBase>();
            _items            = new ObservableCollection <WalletViewModelBase>();
            _navigationState  = navigationState;

            Observable
            .FromEventPattern <WalletState>(walletManager, nameof(WalletManager.WalletStateChanged))
            .ObserveOn(RxApp.MainThreadScheduler)
            .Subscribe(
                x =>
            {
                var wallet = x.Sender as Wallet;

                if (wallet is { } && _walletDictionary.ContainsKey(wallet))
                {
                    if (wallet.State == WalletState.Stopping)
                    {
                        RemoveWallet(_walletDictionary[wallet]);
                    }
                    else if (_walletDictionary[wallet] is ClosedWalletViewModel cwvm && wallet.State == WalletState.Started)
                    {
                        OpenClosedWallet(walletManager, uiConfig, cwvm);
                    }
                }

                AnyWalletStarted = Items.OfType <WalletViewModelBase>().Any(x => x.WalletState == WalletState.Started);
            });
Пример #2
0
        public MainViewModel(Global global)
        {
            _global = global;

            _dialogScreen = new DialogScreenViewModel();

            var navigationState = new NavigationStateViewModel(() => this, () => _dialogScreen, () => this);

            Network = global.Network;

            _currentDialog = null;

            _isMainContentEnabled  = true;
            _isDialogScreenEnabled = true;

            _statusBar = new StatusBarViewModel(global.DataDir, global.Network, global.Config, global.HostedServices, global.BitcoinStore.SmartHeaderChain, global.Synchronizer, global.LegalDocuments);

            var walletManager = new WalletManagerViewModel(navigationState, global.WalletManager, global.UiConfig);

            var addWalletPage = new AddWalletPageViewModel(navigationState, global.LegalDocuments, global.WalletManager, global.BitcoinStore, global.Network);

            _navBar = new NavBarViewModel(navigationState, Router, walletManager, addWalletPage);

            this.WhenAnyValue(x => x.DialogScreen !.IsDialogOpen)
            .ObserveOn(RxApp.MainThreadScheduler)
            .Subscribe(x => IsMainContentEnabled = !x);

            this.WhenAnyValue(x => x.CurrentDialog !.IsDialogOpen)
            .ObserveOn(RxApp.MainThreadScheduler)
            .Subscribe(x => IsDialogScreenEnabled = !x);
        }
Пример #3
0
        protected RoutableViewModel(NavigationStateViewModel navigationState, NavigationTarget navigationTarget)
        {
            NavigationState = navigationState;

            NavigationTarget = navigationTarget;

            BackCommand = ReactiveCommand.Create(() => GoBack());

            CancelCommand = ReactiveCommand.Create(() => ClearNavigation());
        }
 public HomeViewModel(NavigationStateViewModel navigationState, WalletManagerViewModel walletManager) : base(navigationState, "Home", "Home")
 {
     _items = new ObservableCollection <RoutableViewModel>
     {
         new WalletExplorerViewModel(navigationState, walletManager),
         walletManager,
         new TransactionBroadcasterViewModel(navigationState),
         new SettingsViewModel(navigationState),
         new HelpViewModel(navigationState)
     };
 }
Пример #5
0
        public HomePageViewModel(NavigationStateViewModel navigationState, WalletManagerViewModel walletManager, AddWalletPageViewModel addWalletPage) : base(navigationState, NavigationTarget.HomeScreen)
        {
            Title = "Home";

            var list = new SourceList <NavBarItemViewModel>();

            list.Add(addWalletPage);

            walletManager.Items.ToObservableChangeSet()
            .Cast(x => x as NavBarItemViewModel)
            .Sort(SortExpressionComparer <NavBarItemViewModel> .Ascending(i => i.Title))
            .Merge(list.Connect())
            .ObserveOn(RxApp.MainThreadScheduler)
            .Bind(out _items)
            .AsObservableList();

            OpenWalletsFolderCommand = ReactiveCommand.Create(() => IoHelpers.OpenFolderInFileExplorer(walletManager.Model.WalletDirectories.WalletsDir));
        }
Пример #6
0
        public AddWalletPageViewModel(NavigationStateViewModel navigationState, WalletManager walletManager,
                                      BitcoinStore store, Network network) : base(navigationState, NavigationTarget.DialogScreen)
        {
            Title = "Add Wallet";

            this.WhenAnyValue(x => x.WalletName)
            .Select(x => !string.IsNullOrWhiteSpace(x))
            .Subscribe(x => OptionsEnabled = x && !Validations.Any);

            RecoverWalletCommand = ReactiveCommand.CreateFromTask(async() =>
            {
                NavigateTo(new RecoverWalletViewModel(navigationState, WalletName, network, walletManager), NavigationTarget.DialogScreen);
            });

            CreateWalletCommand = ReactiveCommand.CreateFromTask(
                async() =>
            {
                var enterPassword = new EnterPasswordViewModel(
                    navigationState,
                    NavigationTarget.DialogScreen,
                    "Type the password of the wallet and click Continue.");

                NavigateTo(enterPassword, NavigationTarget.DialogScreen);

                var result = await enterPassword.GetDialogResultAsync();

                if (result is { } password)
                {
                    var(km, mnemonic) = await Task.Run(
                        () =>
                    {
                        var walletGenerator = new WalletGenerator(
                            walletManager.WalletDirectories.WalletsDir,
                            network)
                        {
                            TipHeight = store.SmartHeaderChain.TipHeight
                        };
                        return(walletGenerator.GenerateWallet(WalletName, password));
                    });

                    NavigateTo(new RecoveryWordsViewModel(navigationState, km, mnemonic, walletManager), NavigationTarget.DialogScreen, true);
                }
        public MainViewModel()
        {
            var navigationState = new NavigationStateViewModel();

            _dialog        = new DialogViewModel();
            _walletManager = new WalletManagerViewModel(navigationState, "Add Wallet");

            var helpViewModel           = new HelpViewModel(navigationState);
            var walletExplorerViewModel = new WalletExplorerViewModel(navigationState, _walletManager);
            var settingsViewModel       = new SettingsViewModel(navigationState);

            HomeCommand = ReactiveCommand.Create(() => navigationState.Screen().Router.NavigateAndReset.Execute(walletExplorerViewModel));

#if !USE_DIALOG
            HelpCommand = ReactiveCommand.Create(() => navigationState.Screen().Router.Navigate.Execute(helpViewModel));
#else
            HelpCommand = ReactiveCommand.Create(() => navigationState.Dialog().Router.Navigate.Execute(helpViewModel));
#endif

#if !USE_DIALOG
            AddWalletCommand = ReactiveCommand.Create(() => navigationState.Screen().Router.Navigate.Execute(walletManager));
#else
            AddWalletCommand = ReactiveCommand.Create(() => navigationState.Dialog().Router.Navigate.Execute(_walletManager));
#endif

#if !USE_DIALOG
            SettingsCommand = ReactiveCommand.Create(() => navigationState.Screen().Router.Navigate.Execute(settingsViewModel));
#else
            SettingsCommand = ReactiveCommand.Create(() => navigationState.Dialog().Router.Navigate.Execute(settingsViewModel));
#endif
            _walletManager.Home = walletExplorerViewModel;

            navigationState.Screen     = () => this;
            navigationState.Dialog     = () => _dialog;
            navigationState.NextView   = () => walletExplorerViewModel;
            navigationState.CancelView = () => walletExplorerViewModel;

            Router.NavigateAndReset.Execute(walletExplorerViewModel);

            // Router.NavigateAndReset.Execute(new HomeViewModel(this));
        }
Пример #8
0
        public SettingsPageViewModel(NavigationStateViewModel navigationState) : base(navigationState, NavigationTarget.HomeScreen)
        {
            Title = "Settings";

            BackCommand = ReactiveCommand.Create(() => ClearNavigation());

            NextCommand = ReactiveCommand.Create(() => NavigateTo(new SettingsPageViewModel(navigationState), NavigationTarget.HomeScreen));

            OpenDialogCommand = ReactiveCommand.CreateFromTask(async() => await ConfirmSetting.Handle("Please confirm the setting:").ToTask());

            OpenDialogScreenCommand = ReactiveCommand.Create(() => NavigateTo(new SettingsPageViewModel(navigationState), NavigationTarget.DialogScreen));

            ConfirmSetting = new Interaction <string, bool>();

            ConfirmSetting.RegisterHandler(
                async interaction =>
            {
                var x      = new TestDialogViewModel(navigationState, NavigationTarget.DialogHost, interaction.Input);
                var result = await x.ShowDialogAsync(navigationState.DialogHost());
                interaction.SetOutput(result);
            });

            ChangeThemeCommand = ReactiveCommand.Create(() =>
            {
                var currentTheme = Application.Current.Styles.Select(x => (StyleInclude)x).FirstOrDefault(x => x.Source is { } && x.Source.AbsolutePath.Contains("Themes"));

                if (currentTheme?.Source is { } src)
                {
                    var themeIndex = Application.Current.Styles.IndexOf(currentTheme);

                    var newTheme = new StyleInclude(new Uri("avares://WalletWasabi.Fluent/App.xaml"))
                    {
                        Source = new Uri($"avares://WalletWasabi.Fluent/Styles/Themes/{(src.AbsolutePath.Contains("Light") ? "BaseDark" : "BaseLight")}.xaml")
                    };

                    Application.Current.Styles[themeIndex] = newTheme;
                }
            });
 public RoutableViewModel(NavigationStateViewModel navigationState, string urlPathSegment, string title)
 {
     _navigationState = navigationState;
     UrlPathSegment   = urlPathSegment;
     _title           = title;
 }
Пример #10
0
 internal ClosedHardwareWalletViewModel(NavigationStateViewModel navigationState, WalletManager walletManager, Wallet wallet) : base(navigationState, walletManager, wallet)
 {
 }