public ExportLifetimeContext<IViewModel> GetViewModel(UIViewType viewType) { Debug.Assert(ViewModelFactory != null, "Attempted to obtain a view model before we imported the ViewModelFactory"); var f = ViewModelFactory.FirstOrDefault(x => x.Metadata.ViewType == viewType); Debug.Assert(f != null, string.Format(CultureInfo.InvariantCulture, "Could not locate view model for {0}.", viewType)); return f.CreateExport(); }
/// <param name="type">The UIViewType</param> /// <param name="v">The IView</param> /// <param name="vm">The IViewModel. Might be null because the 2fa view shares the same viewmodel as the login dialog, so it's /// set manually in the view outside of this</param> public UIPair(UIViewType type, ExportLifetimeContext<IView> v, [AllowNull]ExportLifetimeContext<IViewModel> vm) { viewType = type; view = v; viewModel = vm; handlers = new CompositeDisposable(); }
public GitHubPaneViewModelTests() { var repositoryHosts = Substitutes.RepositoryHosts; repositoryHosts.IsLoggedInToAnyHost.Returns(true); var teamExplorerServiceHolder = Substitute.For<ITeamExplorerServiceHolder>(); var activeRepo = Substitute.For<ILocalRepositoryModel>(); activeRepo.CloneUrl.Returns(new UriString("https://github.com/foo/foo")); teamExplorerServiceHolder .When(x => x.Subscribe(Arg.Any<object>(), Arg.Any<Action<ILocalRepositoryModel>>())) .Do(x => { var invokeAction = x.Arg<Action<ILocalRepositoryModel>>(); invokeAction(activeRepo); }); var connectionManager = Substitutes.ConnectionManager; var connection = Substitutes.Connection; var connectionHostAddress = HostAddress.Create(activeRepo.CloneUrl.ToString()); connection.HostAddress.Returns(connectionHostAddress); connectionManager.Connections.Returns(new ObservableCollection<IConnection>(new[] { connection })); connection.Login().Returns(Observable.Return(connection)); var host = Substitute.For<IRepositoryHost>(); host.IsLoggedIn.Returns(true); repositoryHosts.LookupHost(connectionHostAddress).Returns(host); serviceProvider = Substitutes.GetFullyMockedServiceProvider(); menuCommandService = new FakeMenuCommandService(); serviceProvider.GetService(typeof(IMenuCommandService)).Returns(menuCommandService); var uiProvider = serviceProvider as IUIProvider; uiProvider.TryGetService(typeof(IUIProvider)).Returns(serviceProvider); uiController = Substitute.For<IUIController>(); uiController.CurrentFlow.Returns(UIControllerFlow.PullRequests); uiController.SelectedFlow.Returns(UIControllerFlow.PullRequests); uiController .When(x => x.Jump(Arg.Any<ViewWithData>())) .Do(x => lastUiControllerJump = x.Arg<ViewWithData>().ViewType); var exportFactoryProvider = Substitutes.ExportFactoryProvider; uiProvider.TryGetService(typeof(IExportFactoryProvider)).Returns(exportFactoryProvider); exportFactoryProvider.UIControllerFactory.Returns(new ExportFactory<IUIController>( () => Tuple.Create<IUIController, Action>(uiController, () => { }))); viewModel = new GitHubPaneViewModel( Substitute.For<ISimpleApiClientFactory>(), teamExplorerServiceHolder, connectionManager, repositoryHosts, Substitute.For<INotificationDispatcher>()); viewModel.ActiveRepo = activeRepo; }
void LoadSingleView(UIViewType type, ViewWithData data) { Stop(); Control = uiProvider.GetView(type, data); }
public IView GetView(UIViewType which, ViewWithData data = null) => theRealProvider.GetView(which, data);
void SetupView(UIViewType viewType, IView view) { if (viewType == UIViewType.Login) { // we're setting up the login dialog, we need to setup the 2fa as // well to continue the flow if it's needed, since the // authenticationresult callback won't happen until // everything is done var dvm = factory.GetViewModel(UIViewType.TwoFactor); disposables.Add(dvm); var twofa = dvm.Value; twofa.WhenAny(x => x.IsShowing, x => x.Value) .Where(x => x) .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(_ => Fire(Trigger.Next)); view.Done .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(_ => Fire(Trigger.Finish)); } else if (viewType != UIViewType.TwoFactor) { view.Done .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(_ => Fire(Trigger.Next)); } view.Cancel.Subscribe(_ => Stop()); }
public ExportLifetimeContext<IView> GetView(UIViewType viewType) { var f = ViewFactory.FirstOrDefault(x => x.Metadata.ViewType == viewType); Debug.Assert(f != null, string.Format(CultureInfo.InvariantCulture, "Could not locate view for {0}.", viewType)); return f.CreateExport(); }
void RunView(UIViewType viewType, ViewWithData arg = null) { if (requestedTarget?.ViewType == viewType || (requestedTarget?.ViewType == UIViewType.None && requestedTarget?.MainFlow == CurrentFlow)) { arg = requestedTarget; } if (arg == null) { arg = new ViewWithData { ActiveFlow = activeFlow, MainFlow = selectedFlow, ViewType = viewType } } ; bool firstTime = CreateViewAndViewModel(viewType, arg); var view = GetObjectsForFlow(activeFlow)[viewType].View; transition.OnNext(new LoadData { Flow = activeFlow, View = view, Data = arg }); // controller might have been stopped in the OnNext above if (IsStopped) { return; } // if it's not the first time we've shown this view, no need // to set it up if (!firstTime) { return; } SetupView(viewType, view); } void SetupView(UIViewType viewType, IView view) { var list = GetObjectsForFlow(activeFlow); var pair = list[viewType]; // 2FA is set up when login is set up, so nothing to do if (viewType == UIViewType.TwoFactor) { return; } // we're setting up the login dialog, we need to setup the 2fa as // well to continue the flow if it's needed, since the // authenticationresult callback won't happen until // everything is done if (viewType == UIViewType.Login) { var pair2fa = list[UIViewType.TwoFactor]; pair2fa.AddHandler(pair2fa.ViewModel.WhenAny(x => x.IsShowing, x => x.Value) .Where(x => x) .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(_ => Fire(Trigger.Next))); pair2fa.AddHandler(pair2fa.View.Cancel .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(_ => Fire(uiStateMachine.CanFire(Trigger.Cancel) ? Trigger.Cancel : Trigger.Finish))); pair.AddHandler(view.Done .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(_ => Fire(Trigger.Finish))); } else { pair.AddHandler(view.Done .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(_ => Fire(uiStateMachine.CanFire(Trigger.Next) ? Trigger.Next : Trigger.Finish))); } pair.AddHandler(view.Cancel .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(_ => Fire(uiStateMachine.CanFire(Trigger.Cancel) ? Trigger.Cancel : Trigger.Finish))); } /// <summary> /// Creates View/ViewModel instances for the specified <paramref name="viewType"/> if they /// haven't been created yet in the current flow /// </summary> /// <param name="viewType"></param> /// <returns>true if the View/ViewModel didn't exist and had to be created</returns> bool CreateViewAndViewModel(UIViewType viewType, ViewWithData data = null) { var list = GetObjectsForFlow(activeFlow); if (viewType == UIViewType.Login) { if (!list.ContainsKey(viewType)) { var d = factory.CreateViewAndViewModel(UIViewType.TwoFactor); list.Add(UIViewType.TwoFactor, d); } } // 2fa view/viewmodel is created when login is created 'cause login needs the 2fa viewmodel // so the only thing we want to do is connect the viewmodel to the view when it's showing else if (viewType == UIViewType.TwoFactor) { var d = list[viewType]; if (d.View.ViewModel == null) { d.ViewModel.Initialize(data); d.View.DataContext = d.ViewModel; } } IUIPair pair = null; var firstTime = !list.TryGetValue(viewType, out pair); if (firstTime) { pair = factory.CreateViewAndViewModel(viewType); } pair.ViewModel.Initialize(data); if (firstTime) { pair.View.DataContext = pair.ViewModel; list.Add(viewType, pair); } return(firstTime); } /// <summary> /// Returns the view/viewmodel pair for a given flow /// </summary> Dictionary <UIViewType, IUIPair> GetObjectsForFlow(UIControllerFlow flow) { Dictionary <UIViewType, IUIPair> list; if (!uiObjects.TryGetValue(flow, out list)) { list = new Dictionary <UIViewType, IUIPair>(); uiObjects.Add(flow, list); } return(list); } void Fire(Trigger next, ViewWithData arg = null) { Debug.WriteLine("Firing {0} from {1} ({2})", next, uiStateMachine.State, GetHashCode()); if (triggers.ContainsKey(next)) { uiStateMachine.Fire(triggers[next], arg); } else { uiStateMachine.Fire(next); } } UIViewType Go(Trigger trigger) { return(Go(trigger, activeFlow)); } UIViewType Go(Trigger trigger, UIControllerFlow flow) { var m = machines[flow]; Debug.WriteLine("Firing {0} from {1} for flow {2} ({3})", trigger, m.State, flow, GetHashCode()); m.Fire(trigger); return(m.State); } void Reset() { if (connectionAdded != null) { connectionManager.Connections.CollectionChanged -= connectionAdded; } connectionAdded = null; var tr = transition; var cmp = completion; transition = null; completion = null; disposables.Clear(); tr?.Dispose(); cmp?.Dispose(); stopping = false; connection = null; } bool disposed; // To detect redundant calls
public GitHubPaneViewModelTests() { var repositoryHosts = Substitutes.RepositoryHosts; repositoryHosts.IsLoggedInToAnyHost.Returns(true); var teamExplorerServiceHolder = Substitute.For <ITeamExplorerServiceHolder>(); var activeRepo = Substitute.For <ILocalRepositoryModel>(); activeRepo.CloneUrl.Returns(new UriString("https://github.com/foo/foo")); teamExplorerServiceHolder .When(x => x.Subscribe(Arg.Any <object>(), Arg.Any <Action <ILocalRepositoryModel> >())) .Do(x => { var invokeAction = x.Arg <Action <ILocalRepositoryModel> >(); invokeAction(activeRepo); }); var connectionManager = Substitutes.ConnectionManager; var connection = Substitutes.Connection; var connectionHostAddress = HostAddress.Create(activeRepo.CloneUrl.ToString()); connection.HostAddress.Returns(connectionHostAddress); connectionManager.Connections.Returns(new ObservableCollection <IConnection>(new[] { connection })); connection.Login().Returns(Observable.Return(connection)); var host = Substitute.For <IRepositoryHost>(); host.IsLoggedIn.Returns(true); repositoryHosts.LookupHost(connectionHostAddress).Returns(host); serviceProvider = Substitutes.GetFullyMockedServiceProvider(); menuCommandService = new FakeMenuCommandService(); serviceProvider.GetService(typeof(IMenuCommandService)).Returns(menuCommandService); var uiProvider = serviceProvider as IUIProvider; uiProvider.TryGetService(typeof(IUIProvider)).Returns(serviceProvider); uiController = Substitute.For <IUIController>(); uiController.CurrentFlow.Returns(UIControllerFlow.PullRequests); uiController.SelectedFlow.Returns(UIControllerFlow.PullRequests); uiController .When(x => x.Jump(Arg.Any <ViewWithData>())) .Do(x => lastUiControllerJump = x.Arg <ViewWithData>().ViewType); var exportFactoryProvider = Substitutes.ExportFactoryProvider; uiProvider.TryGetService(typeof(IExportFactoryProvider)).Returns(exportFactoryProvider); exportFactoryProvider.UIControllerFactory.Returns(new ExportFactory <IUIController>( () => Tuple.Create <IUIController, Action>(uiController, () => { }))); viewModel = new GitHubPaneViewModel( Substitute.For <ISimpleApiClientFactory>(), teamExplorerServiceHolder, connectionManager, repositoryHosts, Substitute.For <INotificationDispatcher>()); viewModel.ActiveRepo = activeRepo; }
public NavStep(LoadDirection direction, UIViewType viewtype) { Direction = direction; ViewType = viewtype; }
void LoadView(UIViewType type) { LoadView(UIControllerFlow.None, type: type); }
void LoadView(UIControllerFlow flow, IConnection connection = null, ViewWithData data = null, UIViewType type = UIViewType.None) { // if we're loading a single view or a different flow, we need to stop the current controller var restart = flow == UIControllerFlow.None || uiController?.SelectedFlow != flow; if (restart) Stop(); // if there's no selected flow, then just load a view directly if (flow == UIControllerFlow.None) { var factory = ServiceProvider.GetExportedValue<IUIFactory>(); var c = factory.CreateViewAndViewModel(type); c.View.DataContext = c.ViewModel; Control = c.View; } // it's a new flow! else if (restart) { StartFlow(flow, connection, data); } // navigate to a requested view within the currently running uiController else { uiController.Jump(data ?? navStack[currentNavItem]); } }
void LoadView(UIControllerFlow flow, IConnection connection = null, ViewWithData data = null, UIViewType type = UIViewType.None) { // if we're loading a single view or a different flow, we need to stop the current controller var restart = flow == UIControllerFlow.None || uiController?.SelectedFlow != flow; if (restart) { Stop(); } // if there's no selected flow, then just load a view directly if (flow == UIControllerFlow.None) { var factory = ServiceProvider.GetExportedValue <IUIFactory>(); var c = factory.CreateViewAndViewModel(type); c.View.DataContext = c.ViewModel; Control = c.View; } // it's a new flow! else if (restart) { StartFlow(flow, connection, data); } // navigate to a requested view within the currently running uiController else { uiController.Jump(data ?? navStack[currentNavItem]); } }
static bool IsViewType(CustomAttributeData attributeData, UIViewType viewType) { Debug.Assert(attributeData.NamedArguments != null); return(attributeData.AttributeType == typeof(ExportViewAttribute) && (UIViewType)attributeData.NamedArguments[0].TypedValue.Value == viewType); }
public static bool IsViewType(this IView c, UIViewType type) { return(c.GetType().GetCustomAttributesData().Any(attr => IsViewType(attr, type))); }
public virtual void CloseAndOpenNextView(UIViewType nextViewType) { m_NextViewType = nextViewType; this.Close(); }
public static bool IsViewType(this UserControl c, UIViewType type) { return c.GetType().GetCustomAttributesData().Any(attr => IsViewType(attr, type)); }
/// <summary> /// Creates View/ViewModel instances for the specified <paramref name="viewType"/> if they /// haven't been created yet in the current flow /// </summary> /// <param name="viewType"></param> /// <returns>true if the View/ViewModel didn't exist and had to be created</returns> public IUIPair CreateViewAndViewModel(UIViewType viewType) { return new UIPair(viewType, factory.GetView(viewType), factory.GetViewModel(viewType)); }
private static bool IsViewType(CustomAttributeData attributeData, UIViewType viewType) { Debug.Assert(attributeData.NamedArguments != null); return attributeData.AttributeType == typeof(ExportViewAttribute) && (UIViewType)attributeData.NamedArguments[0].TypedValue.Value == viewType; }
/// <summary> /// Creates View/ViewModel instances for the specified <paramref name="viewType"/> if they /// haven't been created yet in the current flow /// </summary> /// <param name="viewType"></param> /// <returns>true if the View/ViewModel didn't exist and had to be created</returns> public IUIPair CreateViewAndViewModel(UIViewType viewType) { return(new UIPair(viewType, factory.GetView(viewType), factory.GetViewModel(viewType))); }
private void Start() { UIType = UIViewType.Basic; }
void RunView(UIViewType viewType) { var view = CreateViewAndViewModel(viewType); transition.OnNext(view as UserControl); SetupView(viewType, view); }
/// <summary> /// 打开窗口 /// </summary> /// <param name="type">窗口类型</param> /// <returns></returns> public GameObject OpenWindow(UIViewType type) { GameObject go = null; //如果窗口不存在 if (!dicWindow.ContainsKey(type) || dicWindow[type] == null) { //UI窗口注意命名格式 必须是pan+UIWindowType枚举类型 go = ResourcesMrg.Instance.Load(ResourcesMrg.ResourceType.UIWindow, string.Format("pan{0}", type), true); if (go == null) { return(null); } UIWindowViewBase window = go.GetComponent <UIWindowViewBase>(); if (window == null) { return(null); } if (!dicWindow.ContainsKey(type)) { dicWindow.Add(type, window); } else { dicWindow[type] = window; } window.ViewType = type; Transform parent = null; switch (window.ContainerType) { case UIWinndowContainerType.Center: parent = UISceneCtrl.Instance.CurrentUIScene.ContainerCenter; break; case UIWinndowContainerType.BL: parent = UISceneCtrl.Instance.CurrentUIScene.ContainerCenter; break; case UIWinndowContainerType.BR: parent = UISceneCtrl.Instance.CurrentUIScene.ContainerCenter; break; case UIWinndowContainerType.TL: parent = UISceneCtrl.Instance.CurrentUIScene.ContainerCenter; break; case UIWinndowContainerType.TR: parent = UISceneCtrl.Instance.CurrentUIScene.ContainerCenter; break; } go.transform.SetParent(parent); go.transform.localPosition = Vector3.zero; go.transform.localScale = Vector3.one; go.GetComponent <RectTransform>().sizeDelta = Vector2.zero; go.SetActive(false); ShowWindowAni(window, true); } else { go = dicWindow[type].gameObject; } //设置UI层级管理 LayerMgr.Instance.SetUILayerDepth(go); return(go); }
IView CreateViewAndViewModel(UIViewType viewType) { IViewModel viewModel; if (viewType == UIViewType.TwoFactor) { viewModel = lazyTwoFactorChallengeHandler.Value.CurrentViewModel; } else { var dvm = factory.GetViewModel(viewType); disposables.Add(dvm); viewModel = dvm.Value; } var dv = factory.GetView(viewType); disposables.Add(dv); var view = dv.Value; view.ViewModel = viewModel; return view; }
public void OpenView(UIViewType type) { }