Ejemplo n.º 1
0
 public TransitionEvent(
     [NotNull] object sender,
     [CanBeNull] IStoryboardPageContext context = null)
 {
     Sender  = sender ?? throw new ArgumentNullException(nameof(sender));
     Context = context;
 }
Ejemplo n.º 2
0
 public TransitionRequest(
     Guid destinationPageId,
     [CanBeNull] IStoryboardPageContext destinationPageContext)
 {
     DestinationPageId      = destinationPageId;
     DestinationPageContext = destinationPageContext;
 }
        public void CreateStartPages(Dictionary <Guid, IStoryboardPageContext> startPageContexts = null)
        {
            if (IsStartPagesCreated)
            {
                throw new InvalidOperationException("Start pages have been alread created");
            }

            Invoker.Invoke(() =>
            {
                foreach (var storyboard in Storyboards)
                {
                    var startPageInfo =
                        RegisteredPages.Keys.FirstOrDefault(x => x.IsStartPage && x.StoryboardId == storyboard.Key);
                    if (startPageInfo == null)
                    {
                        throw new InvalidOperationException(
                            $"Start page for storyboard {storyboard.Key} not registered");
                    }

                    var view = CreatePageView(startPageInfo);
                    storyboard.Value.ActivePage = view;
                    StartPagesOpenningStat[startPageInfo.PageUniqueId] = false;
                    IStoryboardPageContext context = null;
                    startPageContexts?.TryGetValue(startPageInfo.PageId, out context);
                    StartPageContexts[startPageInfo.PageUniqueId] = context;
                    PageContexts[startPageInfo.PageUniqueId]      = context;
                }

                IsStartPagesCreated = true;
            });
        }
        protected virtual async Task <TransitionResult> HandleViewModelTransitionsAsync(
            object sender,
            PageTransitionTrigger trigger,
            IStoryboardPageContext context = null)
        {
            var tcs = new TaskCompletionSource <TransitionResult>();
            await Invoker.InvokeAsync(async() =>
            {
                try
                {
                    if (!(sender is IStoryboardPageViewModel viewModel))
                    {
                        throw new InvalidOperationException("Incorrect request of transition");
                    }

                    // todo is it correct? different behaviour of transition
                    var removingResult = await RemoveOpennedPageAsync()
                                         .ConfigureAwait(true);
                    if (removingResult == null)
                    {
                        tcs.SetResult(TransitionResult.Unavailable);
                        return;
                    }

                    if (removingResult.Item2 != TransitionResult.Completed)
                    {
                        tcs.SetResult(removingResult.Item2);
                        return;
                    }

                    var storyboard = Storyboards.Values.FirstOrDefault(x => x.StoryboardId == viewModel.StoryboardId);
                    if (storyboard == null)
                    {
                        throw new InvalidOperationException("Storyboard not found");
                    }

                    var destinationPageId = storyboard.GetDestinationPage(viewModel.PageId, trigger);
                    var result            = await GoToPageAsync(destinationPageId, storyboard.StoryboardId, context)
                                            .ConfigureAwait(true);

                    tcs.SetResult(result);
                }
                catch (Exception e)
                {
                    ExceptionOccured?.Invoke(this, e);
                    tcs.SetResult(TransitionResult.Failed);
                }
            }).ConfigureAwait(false);

            return(await tcs.Task.ConfigureAwait(false));
        }
        public virtual async Task <TransitionResult> GoToPageAsync(
            Guid pageId,
            Guid?storyboardId = null,
            IStoryboardPageContext pageContext = null)
        {
            var tcs = new TaskCompletionSource <TransitionResult>();
            await Invoker.InvokeAsync(async() =>
            {
                try
                {
                    var storyBoard = storyboardId.HasValue
                        ? Storyboards.FirstOrDefault(x => x.Key == storyboardId.Value).Value
                        : ActiveStoryboard;

                    //first try to find desired page in current storyboard, then look up at all registered pages
                    var pageInfo = storyBoard != null
                        ? RegisteredPages.Keys.FirstOrDefault(x =>
                                                              x.PageId == pageId && x.StoryboardId == storyBoard.StoryboardId)
                        : RegisteredPages.Keys.FirstOrDefault(x => x.PageId == pageId);
                    if (pageInfo == null)
                    {
                        pageInfo = RegisteredPages.Keys.FirstOrDefault(x => x.PageId == pageId);
                        if (pageInfo == null)
                        {
                            throw new InvalidOperationException("Page not found");
                        }
                    }

                    var result = await OpenPageAsync(pageInfo, pageContext)
                                 .ConfigureAwait(true);
                    tcs.SetResult(result);
                }
                catch (Exception e)
                {
                    ExceptionOccured?.Invoke(this, e);
                    tcs.SetResult(TransitionResult.Failed);
                }
            }).ConfigureAwait(false);

            return(await tcs.Task
                   .ConfigureAwait(false));
        }
Ejemplo n.º 6
0
 public Task ReturnAsync(IStoryboardPageContext context)
 {
     return(Task.CompletedTask);
 }
        protected virtual async Task <TransitionResult> OpenPageAsync(
            [NotNull] InnerStoryboardPageInfo pageInfo,
            [CanBeNull] IStoryboardPageContext pageContext = null,
            bool addToJournal = true)
        {
            if (!Storyboards.ContainsKey(pageInfo.StoryboardId))
            {
                throw new InvalidOperationException($"Storyboard {pageInfo.StoryboardId} does not registered");
            }

            var tcs = new TaskCompletionSource <TransitionResult>();
            await Invoker.InvokeAsync(async() =>
            {
                try
                {
                    var storyboard = Storyboards[pageInfo.StoryboardId];

                    if (ActiveStoryboard?.ActivePage != null)
                    {
                        var previousPage = ActiveStoryboard.ActivePage;
                        var viewModel    = previousPage.ViewModel;

                        var canLeave = await viewModel.CanLeaveAsync().ConfigureAwait(true);
                        if (!canLeave)
                        {
                            tcs.SetResult(TransitionResult.CanceledByUser);
                            return;
                        }

                        await viewModel.LeaveAsync().ConfigureAwait(true);
                    }

                    var storyboardsWasChanged = ActiveStoryboard == null ||
                                                ActiveStoryboard.StoryboardId != storyboard.StoryboardId;
                    ActiveInnerStoryboardPageInfo = pageInfo;
                    ActiveStoryboard = storyboard;

                    if (storyboardsWasChanged)
                    {
                        ActiveStoryboardChanged?.Invoke(this, pageInfo.StoryboardId);
                    }

                    if (CachedPages.ContainsKey(pageInfo.PageUniqueId))
                    {
                        var page = CachedPages[pageInfo.PageUniqueId];

                        storyboard.ActivePage = page;
                        PageContexts.TryGetValue(pageInfo.PageUniqueId, out var restoredPageContext);

                        StartPagesOpenningStat.TryGetValue(pageInfo.PageUniqueId, out var wasPageOpenned);
                        if (wasPageOpenned)
                        {
                            await page.ViewModel.ReturnAsync(pageContext ?? restoredPageContext).ConfigureAwait(true);
                        }
                        else
                        {
                            await page.ViewModel.OpenAsync(pageContext ?? restoredPageContext).ConfigureAwait(true);
                            StartPagesOpenningStat[pageInfo.PageUniqueId] = true;
                        }
                    }
                    else
                    {
                        var view = CreatePageView(pageInfo);
                        storyboard.ActivePage = view;

                        await view.ViewModel.OpenAsync(pageContext).ConfigureAwait(true);
                        PageContexts[pageInfo.PageUniqueId] = pageContext;
                    }

                    if (addToJournal)
                    {
                        Journal.AddLast(pageInfo);
                    }

                    tcs.SetResult(TransitionResult.Completed);
                    CanBackChanged?.Invoke(this, EventArgs.Empty);
                }
                catch (Exception e)
                {
                    ExceptionOccured?.Invoke(this, e);
                    tcs.SetResult(TransitionResult.Failed);
                }
            }).ConfigureAwait(false);

            return(await tcs.Task.ConfigureAwait(false));
        }