From: Lukasz Stanislawski Date: Wed, 28 Oct 2020 14:29:41 +0000 (+0100) Subject: MainView UI partial implementation X-Git-Tag: accepted/tizen/unified/20210915.100113~151 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3dd2f58f5df0f5bc10344699b648dd3fee8b6dd3;p=profile%2Fiot%2Fapps%2Fdotnet%2Ffitness.git MainView UI partial implementation --- diff --git a/Fitness/Models/Workout.cs b/Fitness/Models/Workout.cs deleted file mode 100644 index 4cfa015..0000000 --- a/Fitness/Models/Workout.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; - -namespace Fitness.Models -{ - /// - /// Workout's information. - /// - public class Workout - { - /// - /// Workout title - /// - public string Title { get; set; } - - /// - /// Full workout description - /// - public string Description { get; set; } - - /// - /// Duration of the workout - /// - public TimeSpan Duration { get; set; } - - /// - /// Predefined difficulty level of workout - /// - public DifficultyLevel Difficulty { get; set; } - - /// - /// True if workout is added is user's favourite - /// - public bool Favourite { get; set; } - - /// - /// Url to thumbnail of the workout - /// - public string ThumbnailUrl { get; set; } - - /// - /// Url to workout video - /// - public string VideoUrl { get; set; } - } -} diff --git a/Fitness/ViewModels/ExercisingViewModel.cs b/Fitness/ViewModels/ExercisingViewModel.cs new file mode 100644 index 0000000..68a5507 --- /dev/null +++ b/Fitness/ViewModels/ExercisingViewModel.cs @@ -0,0 +1,54 @@ +using System; +using System.Windows.Input; +using Fitness.Models; +using Fitness.Services; + +namespace Fitness.ViewModels +{ + public class ExercisingViewModel : BaseViewModel + { + public ExercisingViewModel() + { + } + + /// + /// Current score + /// + public int Score { get; private set; } + + /// + /// Repetitions made in current Workout + /// + public int Repetitions { get; private set; } + + /// + /// Time left in current body pose to accept repetition. + /// + public TimeSpan Hold { get; private set; } + + /// + /// TimeLeft in workout + /// + public TimeSpan TimeLeft { get; private set; } + + /// + /// Current workout state + /// + public WorkoutState State { get; private set; } + + /// + /// Pause workout + /// + public ICommand Pause { get; private set; } + + /// + /// Url to video with workout + /// + public string WorkoutVideoUrl { get; private set; } + + /// + /// Url to preview from device camera + /// + public string PreviewVideoUrl { get; private set; } + } +} diff --git a/Fitness/ViewModels/MainViewModel.cs b/Fitness/ViewModels/MainViewModel.cs index 6fc03c7..a0c9ff5 100644 --- a/Fitness/ViewModels/MainViewModel.cs +++ b/Fitness/ViewModels/MainViewModel.cs @@ -1,5 +1,5 @@ using System; -using System.Collections.ObjectModel; +using System.Collections.Generic; using System.Windows.Input; using Fitness.Models; using Fitness.Services; @@ -10,23 +10,25 @@ namespace Fitness.ViewModels { public class MainViewModel : BaseViewModel { + private WorkoutViewModel selectedWorkout; + public MainViewModel() { - Workouts = new ObservableCollection(new[] + Workouts = new List(new[] { - new Workout + new WorkoutViewModel { - Title = "JOGA Workout 0000", - Description = "This is a description of JOGA workout 0000", + Title = "JOGA Workout 0", + Description = "1. Lie down on your back, keep your knees bent and your back and feet flat on the mat.\n2. Slowly lift your torso and situp.\n3. Return to the starting position by rolling down one vertebrae at a time.\n4. Repeat the exercise until set is complete.", Difficulty = DifficultyLevel.Easy, Duration = new TimeSpan(0, 4, 30), - Favourite = false, + Favourite = true, VideoUrl = Application.Current.DirectoryInfo.Resource + "media/JOGA-0000.avi", ThumbnailUrl = Application.Current.DirectoryInfo.Resource + "media/JOGA-0000.jpeg", }, - new Workout + new WorkoutViewModel { - Title = "JOGA Workout 0001", + Title = "JOGA Workout 1", Description = "This is a description of JOGA workout 0001", Difficulty = DifficultyLevel.Easy, Duration = new TimeSpan(0, 4, 30), @@ -34,9 +36,9 @@ namespace Fitness.ViewModels VideoUrl = Application.Current.DirectoryInfo.Resource + "media/JOGA-0001.avi", ThumbnailUrl = Application.Current.DirectoryInfo.Resource + "media/JOGA-0001.jpeg", }, - new Workout + new WorkoutViewModel { - Title = "JOGA Workout 0002", + Title = "JOGA Workout 2", Description = "This is a description of JOGA workout 0002", Difficulty = DifficultyLevel.Medium, Duration = new TimeSpan(0, 4, 30), @@ -44,9 +46,9 @@ namespace Fitness.ViewModels VideoUrl = Application.Current.DirectoryInfo.Resource + "media/JOGA-0002.avi", ThumbnailUrl = Application.Current.DirectoryInfo.Resource + "media/JOGA-0002.jpeg", }, - new Workout + new WorkoutViewModel { - Title = "JOGA Workout 0003", + Title = "JOGA Workout 3", Description = "This is a description of JOGA workout 0003", Difficulty = DifficultyLevel.Medium, Duration = new TimeSpan(0, 4, 30), @@ -54,9 +56,9 @@ namespace Fitness.ViewModels VideoUrl = Application.Current.DirectoryInfo.Resource + "media/JOGA-0003.avi", ThumbnailUrl = Application.Current.DirectoryInfo.Resource + "media/JOGA-0003.jpeg", }, - new Workout + new WorkoutViewModel { - Title = "Sukces Workout 0003", + Title = "Sukces Workout 0", Description = "This is a description of Sukces workout 0003", Difficulty = DifficultyLevel.Hard, Duration = new TimeSpan(0, 4, 30), @@ -64,9 +66,9 @@ namespace Fitness.ViewModels VideoUrl = Application.Current.DirectoryInfo.Resource + "media/sukces-0000.avi", ThumbnailUrl = Application.Current.DirectoryInfo.Resource + "media/sukces-0000.jpeg", }, - new Workout + new WorkoutViewModel { - Title = "Sukces Workout 0001", + Title = "Sukces Workout 1", Description = "This is a description of Sukces workout 0001", Difficulty = DifficultyLevel.Medium, Duration = new TimeSpan(0, 4, 30), @@ -74,9 +76,9 @@ namespace Fitness.ViewModels VideoUrl = Application.Current.DirectoryInfo.Resource + "media/sukces-0001.avi", ThumbnailUrl = Application.Current.DirectoryInfo.Resource + "media/sukces-0001.jpeg", }, - new Workout + new WorkoutViewModel { - Title = "Sukces Workout 0002", + Title = "Sukces Workout 2", Description = "This is a description of Sukces workout 0002", Difficulty = DifficultyLevel.Medium, Duration = new TimeSpan(0, 4, 30), @@ -84,9 +86,9 @@ namespace Fitness.ViewModels VideoUrl = Application.Current.DirectoryInfo.Resource + "media/sukces-0002.avi", ThumbnailUrl = Application.Current.DirectoryInfo.Resource + "media/sukces-0002.jpeg", }, - new Workout + new WorkoutViewModel { - Title = "Sukces Workout 0003", + Title = "Sukces Workout 3", Description = "This is a description of Sukces workout 0003", Difficulty = DifficultyLevel.Easy, Duration = new TimeSpan(0, 4, 30), @@ -94,9 +96,9 @@ namespace Fitness.ViewModels VideoUrl = Application.Current.DirectoryInfo.Resource + "media/sukces-0003.avi", ThumbnailUrl = Application.Current.DirectoryInfo.Resource + "media/sukces-0003.jpeg", }, - new Workout + new WorkoutViewModel { - Title = "Sukces Workout 0004", + Title = "Sukces Workout 4", Description = "This is a description of Sukces workout 0004", Difficulty = DifficultyLevel.Easy, Duration = new TimeSpan(0, 4, 30), @@ -104,9 +106,9 @@ namespace Fitness.ViewModels VideoUrl = Application.Current.DirectoryInfo.Resource + "media/sukces-0004.avi", ThumbnailUrl = Application.Current.DirectoryInfo.Resource + "media/sukces-0004.jpeg", }, - new Workout + new WorkoutViewModel { - Title = "Video workout 0000", + Title = "Video workout 0", Description = "This is a description of workout 0000", Difficulty = DifficultyLevel.Easy, Duration = new TimeSpan(0, 4, 30), @@ -114,9 +116,9 @@ namespace Fitness.ViewModels VideoUrl = Application.Current.DirectoryInfo.Resource + "media/video-0000.avi", ThumbnailUrl = Application.Current.DirectoryInfo.Resource + "media/video-0000.jpeg", }, - new Workout + new WorkoutViewModel { - Title = "Video workout 0001", + Title = "Video workout 1", Description = "This is a description of workout 0001", Difficulty = DifficultyLevel.Easy, Duration = new TimeSpan(0, 4, 30), @@ -124,9 +126,9 @@ namespace Fitness.ViewModels VideoUrl = Application.Current.DirectoryInfo.Resource + "media/video-0001.avi", ThumbnailUrl = Application.Current.DirectoryInfo.Resource + "media/video-0001.jpeg", }, - new Workout + new WorkoutViewModel { - Title = "Video workout 0002", + Title = "Video workout 2", Description = "This is a description of workout 0002", Difficulty = DifficultyLevel.Medium, Duration = new TimeSpan(0, 4, 30), @@ -138,15 +140,32 @@ namespace Fitness.ViewModels WatchPreview = new Command(() => { NavigationService.Instance.NavigateToExercisePreviewView(); }); StartWorkout = new Command(() => { NavigationService.Instance.NavigateToExercisingView(); }); + SelectedWorkout = Workouts[0] as WorkoutViewModel; } /// /// List of all available workouts /// - public ObservableCollection Workouts { get; private set; } + public List Workouts { get; private set; } + + /// + /// Currently selected workout + /// + public WorkoutViewModel SelectedWorkout + { + get => selectedWorkout; + set + { + if (value != selectedWorkout) + { + selectedWorkout = value; + RaisePropertyChanged(); + } + } + } /// - /// Watch selected workout preview + /// Stop workout /// public ICommand WatchPreview { get; private set; } diff --git a/Fitness/ViewModels/WorkoutViewModel.cs b/Fitness/ViewModels/WorkoutViewModel.cs index 42f3f32..5b8c9c9 100644 --- a/Fitness/ViewModels/WorkoutViewModel.cs +++ b/Fitness/ViewModels/WorkoutViewModel.cs @@ -1,9 +1,13 @@ using System; using System.Windows.Input; using Fitness.Models; +using Fitness.ViewModels; -namespace Fitness.ViewModels +namespace Fitness.Models { + /// + /// WorkoutViewModel's information. + /// public class WorkoutViewModel : BaseViewModel { /// @@ -12,29 +16,29 @@ namespace Fitness.ViewModels public int Score { get; private set; } /// - /// Repetitions made in current Workout + /// WorkoutViewModel title /// - public int Repetitions { get; private set; } + public string Title { get; set; } /// - /// Time left in current body pose to accept repetition. + /// Full workout description /// - public TimeSpan Hold { get; private set; } + public string Description { get; set; } /// - /// TimeLeft in workout + /// Duration of the workout /// - public TimeSpan TimeLeft { get; private set; } + public TimeSpan Duration { get; set; } /// - /// Current workout state + /// Predefined difficulty level of workout /// - public WorkoutState State { get; private set; } + public DifficultyLevel Difficulty { get; set; } /// - /// Pause workout + /// True if workout is added is user's favourite /// - public ICommand Pause { get; private set; } + public bool Favourite { get; set; } /// /// Stop workout @@ -49,11 +53,11 @@ namespace Fitness.ViewModels /// /// Url to video with workout /// - public string WorkoutVideoUrl { get; private set; } + public string ThumbnailUrl { get; set; } /// - /// Url to preview from device camera + /// Url to workout video /// - public string PreviewVideoUrl { get; private set; } + public string VideoUrl { get; set; } } } diff --git a/Fitness/Views/Converters/DifficultyLevelToIconConverter.cs b/Fitness/Views/Converters/DifficultyLevelToIconConverter.cs new file mode 100644 index 0000000..4d7dad8 --- /dev/null +++ b/Fitness/Views/Converters/DifficultyLevelToIconConverter.cs @@ -0,0 +1,30 @@ +using System; +using Fitness.Models; +using Tizen.NUI; +using Tizen.NUI.Binding; + +namespace Fitness.Views.Converters +{ + public class DifficultyLevelToIconConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + switch ((DifficultyLevel)value) + { + case DifficultyLevel.Easy: + return NUIApplication.Current.DirectoryInfo.Resource + "/layout/images/lvl_easy.png"; + case DifficultyLevel.Medium: + return NUIApplication.Current.DirectoryInfo.Resource + "/layout/images/lvl_medium.png"; + case DifficultyLevel.Hard: + return NUIApplication.Current.DirectoryInfo.Resource + "/layout/images/lvl_hard.png"; + default: + return null; + } + } + + public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + throw new NotSupportedException(); + } + } +} diff --git a/Fitness/Views/Converters/FavouriteToIconConverter.cs b/Fitness/Views/Converters/FavouriteToIconConverter.cs new file mode 100644 index 0000000..0707078 --- /dev/null +++ b/Fitness/Views/Converters/FavouriteToIconConverter.cs @@ -0,0 +1,26 @@ +using System; +using Tizen.NUI; +using Tizen.NUI.Binding; + +namespace Fitness.Views.Converters +{ + public class FavouriteToIconConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + if ((bool)value) + { + return NUIApplication.Current.DirectoryInfo.Resource + "/layout/images/icon_fav_full.png"; + } + else + { + return NUIApplication.Current.DirectoryInfo.Resource + "/layout/images/icon_fav_empty.png"; + } + } + + public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + throw new NotSupportedException(); + } + } +} diff --git a/Fitness/res/layout/MainView.xaml b/Fitness/res/layout/MainView.xaml index 6018a36..db1db0b 100644 --- a/Fitness/res/layout/MainView.xaml +++ b/Fitness/res/layout/MainView.xaml @@ -5,29 +5,55 @@ 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" + xmlns:nui="clr-namespace:Tizen.NUI.Components;assembly=Tizen.NUI.Components" + xmlns:converters="clr-namespace:Fitness.Views.Converters" HeightResizePolicy="FillToParent" WidthResizePolicy="FillToParent" BackgroundColor="#EEEFF1" ParentOrigin="Center" PivotPoint="Center" PositionUsesPivotPoint="true" Padding="{views:ExtentsInUnits Top=26}"> + + + + + + + + - - - - + - - - + + + + + + + + + - + - - + + + + + + + + + + + + + + + + - - + + diff --git a/Fitness/res/layout/images/icon_fav_empty.png b/Fitness/res/layout/images/icon_fav_empty.png new file mode 100644 index 0000000..b2fefa8 Binary files /dev/null and b/Fitness/res/layout/images/icon_fav_empty.png differ diff --git a/Fitness/res/layout/images/icon_fav_full.png b/Fitness/res/layout/images/icon_fav_full.png new file mode 100644 index 0000000..13ae142 Binary files /dev/null and b/Fitness/res/layout/images/icon_fav_full.png differ diff --git a/Fitness/res/layout/images/icon_time.png b/Fitness/res/layout/images/icon_time.png new file mode 100644 index 0000000..7d95648 Binary files /dev/null and b/Fitness/res/layout/images/icon_time.png differ diff --git a/Fitness/res/layout/images/lvl_easy.png b/Fitness/res/layout/images/lvl_easy.png new file mode 100644 index 0000000..c019e0a Binary files /dev/null and b/Fitness/res/layout/images/lvl_easy.png differ diff --git a/Fitness/res/layout/images/lvl_hard.png b/Fitness/res/layout/images/lvl_hard.png new file mode 100644 index 0000000..ad89b25 Binary files /dev/null and b/Fitness/res/layout/images/lvl_hard.png differ diff --git a/Fitness/res/layout/images/lvl_medium.png b/Fitness/res/layout/images/lvl_medium.png new file mode 100644 index 0000000..5f4fa9a Binary files /dev/null and b/Fitness/res/layout/images/lvl_medium.png differ