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();
 }
Esempio n. 2
0
 /// <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;
    }
Esempio n. 4
0
 void LoadSingleView(UIViewType type, ViewWithData data)
 {
     Stop();
     Control = uiProvider.GetView(type, data);
 }
Esempio n. 5
0
 public IView GetView(UIViewType which, ViewWithData data = null) => theRealProvider.GetView(which, data);
Esempio n. 6
0
        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();
 }
Esempio n. 8
0
        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
Esempio n. 9
0
    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;
    }
Esempio n. 10
0
 public NavStep(LoadDirection direction, UIViewType viewtype)
 {
     Direction = direction;
     ViewType  = viewtype;
 }
Esempio n. 11
0
 void LoadView(UIViewType type)
 {
     LoadView(UIControllerFlow.None, type: type);
 }
Esempio n. 12
0
        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]);
            }
        }
Esempio n. 13
0
 void LoadView(UIViewType type)
 {
     LoadView(UIControllerFlow.None, type: type);
 }
Esempio n. 14
0
        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]);
            }
        }
Esempio n. 15
0
 static bool IsViewType(CustomAttributeData attributeData, UIViewType viewType)
 {
     Debug.Assert(attributeData.NamedArguments != null);
     return(attributeData.AttributeType == typeof(ExportViewAttribute) &&
            (UIViewType)attributeData.NamedArguments[0].TypedValue.Value == viewType);
 }
Esempio n. 16
0
 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 NavStep(LoadDirection direction, UIViewType viewtype)
 {
     Direction = direction;
     ViewType = viewtype;
 }
 public static bool IsViewType(this UserControl c, UIViewType type)
 {
     return c.GetType().GetCustomAttributesData().Any(attr => IsViewType(attr, type));
 }
Esempio n. 20
0
 /// <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;
 }
Esempio n. 22
0
 /// <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)));
 }
Esempio n. 23
0
 private void Start()
 {
     UIType = UIViewType.Basic;
 }
Esempio n. 24
0
 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);
        }
Esempio n. 26
0
        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)
 {
 }