--- /dev/null
+namespace Fitness.Controls
+{
+ public interface INavigationStack
+ {
+ /// <summary>
+ /// Pushes page on navigation stack
+ /// </summary>
+ void Push(Page page);
+
+ /// <summary>
+ /// Pops top page from navigation stack
+ /// </summary>
+ void Pop();
+ }
+}
--- /dev/null
+using System.Collections.Generic;
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+using Tizen.NUI.Components;
+
+namespace Fitness.Controls
+{
+ /// <summary>
+ /// Implements stack-based navigation
+ /// </summary>
+ public class NavigationStack : Control, INavigationStack
+ {
+ private Stack<Page> pages = new Stack<Page>();
+
+ public NavigationStack()
+ : base()
+ {
+ WidthResizePolicy = ResizePolicyType.FillToParent;
+ HeightResizePolicy = ResizePolicyType.FillToParent;
+ }
+
+ public List<Page> Pages { get => new List<Page>(pages); }
+
+ public void Push(Page page)
+ {
+ Add(page);
+ pages.Push(page);
+ }
+
+ public void Pop()
+ {
+ if (pages.TryPeek(out Page last))
+ {
+ Remove(last);
+ pages.Pop();
+ }
+ }
+ }
+}
--- /dev/null
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+using Tizen.NUI.Components;
+
+namespace Fitness.Controls
+{
+ /// <summary>
+ /// Base class for full-screen page navigation
+ /// </summary>
+ public class Page : Control
+ {
+ public Page()
+ : base()
+ {
+ WidthResizePolicy = ResizePolicyType.FillToParent;
+ HeightResizePolicy = ResizePolicyType.FillToParent;
+ }
+ }
+}
using System;
using Fitness.Services;
-using Fitness.Views;
using Tizen.NUI;
using Tizen.NUI.BaseComponents;
public void Initialize()
{
- Window.Instance.GetDefaultLayer().Add(new MainView());
+ NavigationService.Instance.NavigateToMainView();
}
protected override void OnCreate()
--- /dev/null
+using Fitness.Controls;
+using Fitness.Views;
+using Tizen.NUI;
+
+namespace Fitness.Services
+{
+ public sealed class NavigationService
+ {
+ private static NavigationService instance;
+ private NavigationStack navigation;
+
+ private NavigationService()
+ {
+ navigation = new NavigationStack();
+ Window.Instance.GetDefaultLayer().Add(navigation);
+ }
+
+ public static NavigationService Instance
+ {
+ get
+ {
+ if (instance == null)
+ {
+ instance = new NavigationService();
+ }
+
+ return instance;
+ }
+ }
+
+ public void NavigateToMainView()
+ {
+ navigation.Push(new MainView());
+ }
+
+ public void NavigateToExercisingView()
+ {
+ navigation.Push(new ExercisingView());
+ }
+
+ public void NavigateToExercisePreviewView()
+ {
+ navigation.Push(new ExercisePreviewView());
+ }
+
+ public void NavigateToScanningView()
+ {
+ navigation.Push(new ScanningView());
+ }
+
+ public void NavigateToLoadingView()
+ {
+ navigation.Push(new LoadingView());
+ }
+ }
+}
using System;
using System.Collections.ObjectModel;
+using System.Windows.Input;
using Fitness.Models;
+using Fitness.Services;
using Tizen.Applications;
+using Tizen.NUI.Binding;
namespace Fitness.ViewModels
{
ThumbnailUrl = Application.Current.DirectoryInfo.Resource + "media/video-0002.jpeg",
},
});
+
+ WatchPreview = new Command(() => { NavigationService.Instance.NavigateToExercisePreviewView(); });
+ StartWorkout = new Command(() => { NavigationService.Instance.NavigateToExercisingView(); });
}
/// <summary>
/// List of all available workouts
/// </summary>
public ObservableCollection<Workout> Workouts { get; private set; }
+
+ /// <summary>
+ /// Watch selected workout preview
+ /// </summary>
+ public ICommand WatchPreview { get; private set; }
+
+ /// <summary>
+ /// Start selected workout.
+ /// </summary>
+ public ICommand StartWorkout { get; private set; }
}
}
+using Fitness.Controls;
using Tizen.NUI.BaseComponents;
namespace Fitness.Views
{
- public partial class ExercisePreviewView : View
+ public partial class ExercisePreviewView : Page
{
public ExercisePreviewView()
{
+using Fitness.Controls;
using Tizen.NUI.BaseComponents;
namespace Fitness.Views
{
- public partial class ExercisingView : View
+ public partial class ExercisingView : Page
{
public ExercisingView()
{
+using Fitness.Controls;
using Tizen.NUI.BaseComponents;
namespace Fitness.Views
{
- public partial class LoadingView : View
+ public partial class LoadingView : Page
{
public LoadingView()
{
+using Fitness.Controls;
using Tizen.NUI;
using Tizen.NUI.BaseComponents;
namespace Fitness.Views
{
- public partial class MainView : View
+ public partial class MainView : Fitness.Controls.Page
{
public MainView()
{
+using Fitness.Controls;
using Tizen.NUI.BaseComponents;
namespace Fitness.Views
{
- public partial class ScanningView : View
+ public partial class ScanningView : Page
{
public ScanningView()
{
<?xml version="1.0" encoding="UTF-8" ?>
-<View x:Class="Fitness.Views.ExercisePreviewView"
+<ctrl:Page x:Class="Fitness.Views.ExercisePreviewView"
xmlns="http://tizen.org/Tizen.NUI/2018/XAML"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
- HeightResizePolicy="FillToParent" WidthResizePolicy="FillToParent" BackgroundColor="#EEEFF1" ParentOrigin="Center" PivotPoint="Center" PositionUsesPivotPoint="true">
-</View>
+ xmlns:ctrl="clr-namespace:Fitness.Controls"
+ HeightResizePolicy="FillToParent" WidthResizePolicy="FillToParent" BackgroundColor="Red" ParentOrigin="Center" PivotPoint="Center" PositionUsesPivotPoint="true">
+</ctrl:Page>
<?xml version="1.0" encoding="UTF-8" ?>
-<View x:Class="Fitness.Views.ExercisingView"
+<ctrl:Page x:Class="Fitness.Views.ExercisingView"
xmlns="http://tizen.org/Tizen.NUI/2018/XAML"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
- HeightResizePolicy="FillToParent" WidthResizePolicy="FillToParent" BackgroundColor="#EEEFF1" ParentOrigin="Center" PivotPoint="Center" PositionUsesPivotPoint="true">
-</View>
+ xmlns:ctrl="clr-namespace:Fitness.Controls"
+ HeightResizePolicy="FillToParent" WidthResizePolicy="FillToParent" BackgroundColor="Red" ParentOrigin="Center" PivotPoint="Center" PositionUsesPivotPoint="true">
+</ctrl:Page>
<?xml version="1.0" encoding="UTF-8" ?>
-<View x:Class="Fitness.Views.LoadingView"
+<ctrl:Page x:Class="Fitness.Views.LoadingView"
xmlns="http://tizen.org/Tizen.NUI/2018/XAML"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+ xmlns:ctrl="clr-namespace:Fitness.Controls"
HeightResizePolicy="FillToParent" WidthResizePolicy="FillToParent" BackgroundColor="#EEEFF1" ParentOrigin="Center" PivotPoint="Center" PositionUsesPivotPoint="true">
-</View>
+</ctrl:Page>
<?xml version="1.0" encoding="UTF-8" ?>
-<View x:Class="Fitness.Views.MainView"
+<ctrl:Page x:Class="Fitness.Views.MainView"
xmlns="http://tizen.org/Tizen.NUI/2018/XAML"
xmlns:vm="clr-namespace:Fitness.ViewModels;"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:views="clr-namespace:Fitness.Views"
+ xmlns:ctrl="clr-namespace:Fitness.Controls"
xmlns:c="clr-namespace:Tizen.NUI.Components;assembly=Tizen.NUI.Components"
HeightResizePolicy="FillToParent" WidthResizePolicy="FillToParent" BackgroundColor="#EEEFF1" ParentOrigin="Center" PivotPoint="Center" PositionUsesPivotPoint="true" Padding="{views:ExtentsInUnits Top=26}">
- <View.BindingContext>
- <vm:MainViewModel/>
- </View.BindingContext>
<View.Layout>
<LinearLayout LinearOrientation="Vertical" LinearAlignment="Top"/>
</View.Layout>
+ <View.BindingContext>
+ <vm:MainViewModel x:Name="mainViewModel"/>
+ </View.BindingContext>
<View Margin="{views:ExtentsInUnits Start=16,End=16}" Weight="1.0" WidthResizePolicy="FillToParent">
<View.Layout>
<LinearLayout LinearOrientation="Horizontal" LinearAlignment="End"/>
<View.Layout>
<LinearLayout LinearOrientation="Vertical" LinearAlignment="Center"/>
</View.Layout>
- <c:Button PositionUsesPivotPoint="true" ParentOrigin="0.5,0.5" PivotPoint="0.5,0.5" Text="Let's try"/>
- <c:Button PositionUsesPivotPoint="true" ParentOrigin="0.5,0.5" PivotPoint="0.5,0.5" Text="Watch Preview"/>
+ <c:Button BindingContext="{x:Reference mainViewModel}" PositionUsesPivotPoint="true" ParentOrigin="0.5,0.5" PivotPoint="0.5,0.5" Text="Let's try" Command="{Binding StartWorkout}"/>
+ <c:Button BindingContext="{x:Reference mainViewModel}" PositionUsesPivotPoint="true" ParentOrigin="0.5,0.5" PivotPoint="0.5,0.5" Text="Watch Preview" Command="{Binding WatchPreview}"/>
</View>
</View>
<TextLabel BackgroundColor="Cyan" Size="{views:SizeInUnits Width=107}" Margin="{views:ExtentsInUnits Start=8}" HeightResizePolicy="FillToParent" />
</View>
<TextLabel BackgroundColor="Green" Size="{views:SizeInUnits Height=44}" Margin="{views:ExtentsInUnits Top=10, Bottom=10}" WidthResizePolicy="FillToParent"/>
-</View>
+</ctrl:Page>
<?xml version="1.0" encoding="UTF-8" ?>
-<View x:Class="Fitness.Views.ScanningView"
+<ctrl:Page x:Class="Fitness.Views.ScanningView"
xmlns="http://tizen.org/Tizen.NUI/2018/XAML"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+ xmlns:ctrl="clr-namespace:Fitness.Controls"
HeightResizePolicy="FillToParent" WidthResizePolicy="FillToParent" BackgroundColor="#EEEFF1" ParentOrigin="Center" PivotPoint="Center" PositionUsesPivotPoint="true">
-</View>
+</ctrl:Page>