using System;
+using System.Collections.Generic;
+using System.Linq;
using System.Windows.Input;
using Fitness.Models;
using Fitness.Services;
{
public class ExercisePreviewViewModel : BaseViewModel
{
+ private List<WorkoutViewModel> workouts;
+ private WorkoutViewModel currentWorkout;
+
public ExercisePreviewViewModel()
{
Skip = new Command(() => { NavigationService.Instance.NavigateToLoadingView(); });
+ PreviousWorkout = new Command(GoPrevious);
+ NextWorkout = new Command(GoNext);
- CurrentWorkout = new WorkoutViewModel
+ workouts = new List<WorkoutViewModel>(new[]
{
+ new WorkoutViewModel
+ {
+ 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 = true,
+ VideoUrl = Application.Current.DirectoryInfo.Resource + "media/JOGA-0000.avi",
+ ThumbnailUrl = Application.Current.DirectoryInfo.Resource + "media/JOGA-0000.jpeg",
+ },
+ new WorkoutViewModel
+ {
+ Title = "JOGA Workout 1",
+ Description = "This is a description of JOGA workout 0001",
+ Difficulty = DifficultyLevel.Easy,
+ Duration = new TimeSpan(0, 4, 30),
+ Favourite = false,
+ VideoUrl = Application.Current.DirectoryInfo.Resource + "media/JOGA-0001.avi",
+ ThumbnailUrl = Application.Current.DirectoryInfo.Resource + "media/JOGA-0001.jpeg",
+ },
+ new WorkoutViewModel
+ {
+ Title = "JOGA Workout 2",
+ Description = "This is a description of JOGA workout 0002",
+ Difficulty = DifficultyLevel.Medium,
+ Duration = new TimeSpan(0, 4, 30),
+ Favourite = false,
+ VideoUrl = Application.Current.DirectoryInfo.Resource + "media/JOGA-0002.avi",
+ ThumbnailUrl = Application.Current.DirectoryInfo.Resource + "media/JOGA-0002.jpeg",
+ },
+ new WorkoutViewModel
+ {
+ Title = "JOGA Workout 3",
+ Description = "This is a description of JOGA workout 0003",
+ Difficulty = DifficultyLevel.Medium,
+ Duration = new TimeSpan(0, 4, 30),
+ Favourite = false,
+ VideoUrl = Application.Current.DirectoryInfo.Resource + "media/JOGA-0003.avi",
+ ThumbnailUrl = Application.Current.DirectoryInfo.Resource + "media/JOGA-0003.jpeg",
+ },
+ new WorkoutViewModel
+ {
Title = "Sukces Workout 0",
Description = "This is a description of Sukces workout 0003",
Difficulty = DifficultyLevel.Hard,
Favourite = false,
VideoUrl = Application.Current.DirectoryInfo.Resource + "media/sukces-0000.avi",
ThumbnailUrl = Application.Current.DirectoryInfo.Resource + "media/sukces-0000.jpeg",
- };
+ },
+ new WorkoutViewModel
+ {
+ Title = "Sukces Workout 1",
+ 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.Medium,
+ Duration = new TimeSpan(0, 4, 30),
+ Favourite = false,
+ VideoUrl = Application.Current.DirectoryInfo.Resource + "media/sukces-0001.avi",
+ ThumbnailUrl = Application.Current.DirectoryInfo.Resource + "media/sukces-0001.jpeg",
+ },
+ new WorkoutViewModel
+ {
+ Title = "Sukces Workout 2",
+ Description = "This is a description of Sukces workout 0002",
+ Difficulty = DifficultyLevel.Medium,
+ Duration = new TimeSpan(0, 4, 30),
+ Favourite = false,
+ VideoUrl = Application.Current.DirectoryInfo.Resource + "media/sukces-0002.avi",
+ ThumbnailUrl = Application.Current.DirectoryInfo.Resource + "media/sukces-0002.jpeg",
+ },
+ new WorkoutViewModel
+ {
+ Title = "Sukces Workout 3",
+ Description = "This is a description of Sukces workout 0003",
+ Difficulty = DifficultyLevel.Easy,
+ Duration = new TimeSpan(0, 4, 30),
+ Favourite = false,
+ VideoUrl = Application.Current.DirectoryInfo.Resource + "media/sukces-0003.avi",
+ ThumbnailUrl = Application.Current.DirectoryInfo.Resource + "media/sukces-0003.jpeg",
+ },
+ new WorkoutViewModel
+ {
+ Title = "Sukces Workout 4",
+ Description = "This is a description of Sukces workout 0004",
+ Difficulty = DifficultyLevel.Easy,
+ Duration = new TimeSpan(0, 4, 30),
+ Favourite = true,
+ VideoUrl = Application.Current.DirectoryInfo.Resource + "media/sukces-0004.avi",
+ ThumbnailUrl = Application.Current.DirectoryInfo.Resource + "media/sukces-0004.jpeg",
+ },
+ new WorkoutViewModel
+ {
+ Title = "Video workout 0",
+ Description = "This is a description of workout 0000",
+ Difficulty = DifficultyLevel.Easy,
+ Duration = new TimeSpan(0, 4, 30),
+ Favourite = false,
+ VideoUrl = Application.Current.DirectoryInfo.Resource + "media/video-0000.avi",
+ ThumbnailUrl = Application.Current.DirectoryInfo.Resource + "media/video-0000.jpeg",
+ },
+ new WorkoutViewModel
+ {
+ Title = "Video workout 1",
+ Description = "This is a description of workout 0001",
+ Difficulty = DifficultyLevel.Easy,
+ Duration = new TimeSpan(0, 4, 30),
+ Favourite = false,
+ VideoUrl = Application.Current.DirectoryInfo.Resource + "media/video-0001.avi",
+ ThumbnailUrl = Application.Current.DirectoryInfo.Resource + "media/video-0001.jpeg",
+ },
+ new WorkoutViewModel
+ {
+ Title = "Video workout 2",
+ Description = "This is a description of workout 0002",
+ Difficulty = DifficultyLevel.Medium,
+ Duration = new TimeSpan(0, 4, 30),
+ Favourite = true,
+ VideoUrl = Application.Current.DirectoryInfo.Resource + "media/video-0002.avi",
+ ThumbnailUrl = Application.Current.DirectoryInfo.Resource + "media/video-0002.jpeg",
+ },
+ });
+
+ CurrentWorkout = workouts.ElementAt(4);
}
/// <summary>
/// Review movement
/// </summary>
- public WorkoutViewModel CurrentWorkout { get; private set; }
+ public WorkoutViewModel CurrentWorkout
+ {
+ get => currentWorkout;
+ private set
+ {
+ if (value != currentWorkout)
+ {
+ currentWorkout = value;
+ RaisePropertyChanged();
+ }
+ }
+ }
/// <summary>
/// Review movement
/// next workout
/// </summary>
public ICommand NextWorkout { get; private set; }
+
+ private void GoNext()
+ {
+ MoveBy(1);
+ }
+
+ private void GoPrevious()
+ {
+ MoveBy(-1);
+ }
+
+ private void MoveBy(int offset)
+ {
+ int idx = workouts.IndexOf(CurrentWorkout) + offset;
+ if (idx >= 0 && idx < workouts.Count)
+ {
+ CurrentWorkout = workouts[idx];
+ }
+ }
}
}
new WorkoutViewModel
{
Title = "Sukces Workout 1",
- Description = "This is a description of Sukces workout 0001",
+ 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.Medium,
Duration = new TimeSpan(0, 4, 30),
Favourite = false,
},
});
- SelectedWorkout = Workouts.First();
+ SelectedWorkout = Workouts.ElementAt(5);
WatchPreview = new Command(() => { NavigationService.Instance.NavigateToExercisePreviewView(); });
StartWorkout = new Command(() => { NavigationService.Instance.NavigateToScanningView(); });
+using System;
using Fitness.Controls;
using Fitness.Services;
+using Tizen.NUI;
using Tizen.NUI.BaseComponents;
namespace Fitness.Views
{
- public partial class ExercisePreviewView : Page
+ public partial class ExercisePreviewView : Fitness.Controls.Page
{
public ExercisePreviewView()
{
InitializeComponent();
ApplyControlStyles();
+ InitializeCallbacks();
+ }
+ private void InitializeCallbacks()
+ {
this.VisibilityChanged += PageVisibilityChanged;
// start playing as first VisibilityChanged event is missing
{
this.player.Play();
}
+
+ this.reviewButton.Clicked += ReplyVideo;
+ this.nextButton.Clicked += ReplyVideo;
+ this.previousButton.Clicked += ReplyVideo;
}
private void ApplyControlStyles()
{
this.skipButton.ApplyStyle(Styles.Buttons.Regular);
- this.reviewButton.ApplyStyle(Styles.Buttons.Regular);
+ this.reviewButton.ApplyStyle(Styles.Buttons.RegularRepeat);
+ this.previousButton.ApplyStyle(Styles.Buttons.Previous);
+ this.nextButton.ApplyStyle(Styles.Buttons.Next);
}
private void PageVisibilityChanged(object senter, VisibilityChangedEventArgs args)
this.player.Stop();
}
}
+
+ private void ReplyVideo(object sender, EventArgs args)
+ {
+ this.player.Stop();
+ this.player.Play();
+ }
}
}
{
BackgroundImage = new Selector<string>
{
- Normal = NUIApplication.Current.DirectoryInfo.Resource + "styles/button/02_butt_2_empty_action.png",
- Pressed = NUIApplication.Current.DirectoryInfo.Resource + "styles/button/02_butt_2_empty_pressed.png",
- Disabled = NUIApplication.Current.DirectoryInfo.Resource + "styles/button/02_butt_2_empty_disabled.png",
+ Normal = NUIApplication.Current.DirectoryInfo.Resource + "styles/button/button_regular.png",
+ Pressed = NUIApplication.Current.DirectoryInfo.Resource + "styles/button/button_pressed.png",
+ Disabled = NUIApplication.Current.DirectoryInfo.Resource + "styles/button/button_disabled.png",
},
Text = new TextLabelStyle
{
- PointSize = new Selector<float?>
- {
- Normal = 22.0f,
- Pressed = 24.0f,
- },
+ PixelSize = 32.0f,
EnableMarkup = true,
TextColor = new Selector<Color>
{
{
BackgroundImage = new Selector<string>
{
- Normal = NUIApplication.Current.DirectoryInfo.Resource + "styles/button/02_CTA_empty_active.png",
- Pressed = NUIApplication.Current.DirectoryInfo.Resource + "styles/button/02_CTA_empty_selected.png",
- Disabled = NUIApplication.Current.DirectoryInfo.Resource + "styles/button/02_CTA_empty_disabled.png",
+ Normal = NUIApplication.Current.DirectoryInfo.Resource + "styles/button/button_inverse.png",
+ Pressed = NUIApplication.Current.DirectoryInfo.Resource + "styles/button/button_pressed.png",
+ Disabled = NUIApplication.Current.DirectoryInfo.Resource + "styles/button/button_disabled.png",
},
Text = new TextLabelStyle
{
- PointSize = new Selector<float?>
+ PixelSize = 32.0f,
+ TextColor = Color.White,
+ FontFamily = GetNavigationFont(),
+ },
+ };
+
+ public static ButtonStyle Previous => new ButtonStyle
+ {
+ BackgroundColor = Color.Transparent,
+ Text = new TextLabelStyle
+ {
+ PixelSize = 24.0f,
+ TextColor = Color.Black,
+ FontFamily = GetNavigationFont(),
+ },
+ Icon = new ImageViewStyle
+ {
+ ResourceUrl = new Selector<string>
{
- Normal = 22.0f,
- Pressed = 24.0f,
+ Normal = NUIApplication.Current.DirectoryInfo.Resource + "styles/button/12_icon_back_arrow_active.png",
+ Pressed = NUIApplication.Current.DirectoryInfo.Resource + "styles/button/12_icon_back_arrow_active.png",
+ Disabled = NUIApplication.Current.DirectoryInfo.Resource + "styles/button/12_icon_back_arrow_active.png",
+ },
+ },
+ IconRelativeOrientation = Button.IconOrientation.Left,
+ };
+
+ public static ButtonStyle Next => new ButtonStyle
+ {
+ BackgroundColor = Color.Transparent,
+ Text = new TextLabelStyle
+ {
+ PixelSize = 24.0f,
+ TextColor = Color.Black,
+ FontFamily = GetNavigationFont(),
+ },
+ Icon = new ImageViewStyle
+ {
+ ResourceUrl = new Selector<string>
+ {
+ Normal = NUIApplication.Current.DirectoryInfo.Resource + "styles/button/12_icon_back_arrow_active_reverse.png",
+ Pressed = NUIApplication.Current.DirectoryInfo.Resource + "styles/button/12_icon_back_arrow_active_reverse.png",
+ Disabled = NUIApplication.Current.DirectoryInfo.Resource + "styles/button/12_icon_back_arrow_active_reverse.png",
+ },
+ },
+ IconRelativeOrientation = Button.IconOrientation.Right,
+ };
+
+ public static ButtonStyle RegularRepeat => new ButtonStyle
+ {
+ BackgroundImage = new Selector<string>
+ {
+ Normal = NUIApplication.Current.DirectoryInfo.Resource + "styles/button/button_regular.png",
+ Pressed = NUIApplication.Current.DirectoryInfo.Resource + "styles/button/button_pressed.png",
+ Disabled = NUIApplication.Current.DirectoryInfo.Resource + "styles/button/button_disabled.png",
+ },
+ Text = new TextLabelStyle
+ {
+ PixelSize = 32.0f,
+ EnableMarkup = true,
+ TextColor = new Selector<Color>
+ {
+ Normal = new Color(0.0f, 20.0f / 255.0f, 71 / 255.0f, 1.0f),
+ Pressed = new Color(41.0f / 255.0f, 91.0f / 255.0f, 178 / 255.0f, 1.0f),
},
- TextColor = Color.White,
FontFamily = GetNavigationFont(),
+ HorizontalAlignment = HorizontalAlignment.Begin,
+ },
+ Icon = new ImageViewStyle
+ {
+ ResourceUrl = new Selector<string>
+ {
+ Normal = NUIApplication.Current.DirectoryInfo.Resource + "styles/button/icon-feather-repeat.png",
+ Pressed = NUIApplication.Current.DirectoryInfo.Resource + "styles/button/icon-feather-repeat.png",
+ Disabled = NUIApplication.Current.DirectoryInfo.Resource + "styles/button/icon-feather-repeat.png",
+ },
},
+ IconPadding = new Extents(276, 0, 0, 0),
+ TextPadding = new Extents(23, 0, 0, 0),
+ IconRelativeOrientation = Button.IconOrientation.Left,
};
private static Selector<string> GetNavigationFont()
</ctrl:Page.BindingContext>
<VideoView BindingContext="{Binding Source={x:Reference context}, Path=CurrentWorkout}" HeightResizePolicy="FillToParent" WidthResizePolicy="FillToParent" ResourceUrl="{Binding VideoUrl}" x:Name="player" Looping="true"/>
<View HeightResizePolicy="FillToParent" WidthResizePolicy="FillToParent">
- <View.Layout>
- <LinearLayout LinearOrientation="Vertical" LinearAlignment="Begin"/>
- </View.Layout>
- <View WidthResizePolicy="FillToParent" BackgroundColor="Blue" Size="{views:SizeInUnits Height=40}" Opacity="0.1"/>
+ <View.Layout>
+ <LinearLayout LinearOrientation="Vertical" LinearAlignment="CenterVertical"/>
+ </View.Layout>
+ <!-- Bar -->
+ <View WidthResizePolicy="FillToParent" Size="{views:SizeInUnits Height=40}" Margin="{views:ExtentsInUnits Start=16}">
+ <View.Layout>
+ <LinearLayout LinearOrientation="Horizontal" LinearAlignment="CenterVertical"/>
+ </View.Layout>
+ <nui:Button BindingContext="{x:Reference context}" Size="{views:SizeInUnits Width=50,Height=20}" Text="previous" x:Name="previousButton" Command="{Binding PreviousWorkout}"/>
+ <TextLabel BindingContext="{Binding Source={x:Reference context}, Path=CurrentWorkout}" Size="{views:SizeInUnits Width=328,Height=20}" HeightResizePolicy="FillToParent" Text="{Binding Title}" Margin="{views:ExtentsInUnits Start=10}" VerticalAlignment="Center" HorizontalAlignment="Center" PixelSize="32"/>
+ <nui:Button BindingContext="{x:Reference context}" Size="{views:SizeInUnits Width=50,Height=20}" Text="next" x:Name="nextButton" Margin="{views:ExtentsInUnits Start=10}" Command="{Binding NextWorkout}"/>
+ </View>
+ <!-- Bar End -->
<View WidthResizePolicy="FillToParent" Weight="1.0">
<ImageView PositionUsesPivotPoint="true" PivotPoint="1.0,0.0" ParentOrigin="1.0,0.0" ResourceUrl="*Resource*/media/camera-preview.png"/>
</View>
Size="{views:SizeInUnits Width=82,Height=44}">
<View Size="{views:SizeInUnits Width=78,Height=44}" >
<ImageView x:Name="image" HeightResizePolicy="FillToParent" WidthResizePolicy="FillToParent" ResourceUrl="{Binding ThumbnailUrl}"/>
- <TextLabel x:Name="label" PositionUsesPivotPoint="true" PivotPoint="0.0,1.0" ParentOrigin="0.0,1.0" PointSize="24" Text="{Binding Title}"/>
+ <TextLabel x:Name="label" PositionUsesPivotPoint="true" PivotPoint="0.0,1.0" ParentOrigin="0.0,1.0" PixelSize="24" Text="{Binding Title}"/>
<ImageView x:Name="favourite" Size="30,30" PositionUsesPivotPoint="true" PivotPoint="1.0,0.0" ParentOrigin="1.0,0.0" ResourceUrl="{Binding Favourite, Converter={StaticResource favouriteToIconConverter}}"/>
</View>
</nui:RecycleItem>
<AbsoluteLayout/>
</ctrl:Page.Layout>
<ImageView PositionUsesPivotPoint="true" ParentOrigin="Center" PivotPoint="Center" HeightResizePolicy="SizeRelativeToParent" WidthForHeight="true" SizeModeFactor="0.0,0.8,1.0" ResourceUrl="*Resource*/layout/images/circle.svg" x:Name="image" Opacity="0.48"/>
- <TextLabel Text="{Binding Text}" PointSize="60" WidthResizePolicy="FillToParent" HeightResizePolicy="FillToParent" PositionUsesPivotPoint="true" PivotPoint="Center" ParentOrigin="Center" VerticalAlignment="Center" HorizontalAlignment="Center" TextColor="#000C2B"/>
+ <TextLabel Text="{Binding Text}" PixelSize="420" WidthResizePolicy="FillToParent" HeightResizePolicy="FillToParent" PositionUsesPivotPoint="true" PivotPoint="Center" ParentOrigin="Center" VerticalAlignment="Center" HorizontalAlignment="Center" TextColor="#000C2B"/>
</ctrl:Page>
<View.Layout>
<LinearLayout LinearOrientation="Horizontal" LinearAlignment="Begin"/>
</View.Layout>
- <TextLabel BindingContext="{Binding Source={x:Reference context}, Path=SelectedWorkout}" Text="{Binding Path=Title}" PointSize="40" VerticalAlignment="Center" TextColor="#000C2B"/>
+ <TextLabel BindingContext="{Binding Source={x:Reference context}, Path=SelectedWorkout}" Text="{Binding Path=Title}" PixelSize="40" VerticalAlignment="Center" TextColor="#000C2B"/>
<ImageView BindingContext="{Binding Source={x:Reference context}, Path=SelectedWorkout}" Size="36,48" Margin="30,30,0,0" ResourceUrl="{Binding Difficulty, Converter={StaticResource difficultyLevelConverter}}"/>
</View>
<View>
<LinearLayout LinearOrientation="Horizontal" LinearAlignment="Begin"/>
</View.Layout>
<ImageView Size="28,28" ResourceUrl="*Resource*/layout/images/icon_time.png"/>
- <TextLabel BindingContext="{Binding Source={x:Reference context}, Path=SelectedWorkout}" Text="{Binding Duration,StringFormat=\{0:h\\:mm\\:ss\}}" PointSize="28" Margin="8,0,0,0" VerticalAlignment="Center" TextColor="#000C2B"/>
+ <TextLabel BindingContext="{Binding Source={x:Reference context}, Path=SelectedWorkout}" Text="{Binding Duration,StringFormat=\{0:h\\:mm\\:ss\}}" PixelSize="28" Margin="8,0,0,0" VerticalAlignment="Center" TextColor="#000C2B"/>
</View>
- <TextLabel BindingContext="{Binding Source={x:Reference context}, Path=SelectedWorkout}" Size="{views:SizeInUnits Width=107}" Text="{Binding Description}" PointSize="28" LineWrapMode="Word" Weight="1.0" VerticalAlignment="Bottom" Ellipsis="false" MultiLine="true" TextColor="#000C2B" EnableAutoScroll="true"/>
+ <TextLabel BindingContext="{Binding Source={x:Reference context}, Path=SelectedWorkout}" Size="{views:SizeInUnits Width=107}" Text="{Binding Description}" PixelSize="28" LineWrapMode="Word" Weight="1.0" VerticalAlignment="Bottom" Ellipsis="false" MultiLine="true" TextColor="#000C2B" EnableAutoScroll="true"/>
</View>
<ImageView PositionUsesPivotPoint="true" PivotPoint="1.0,0.0" ParentOrigin="1.0, 0.0" Size="30,30" BindingContext="{Binding Source={x:Reference context}, Path=SelectedWorkout}" ResourceUrl="{Binding Favourite, Converter={StaticResource favouriteToIconConverter}}"/>
</View>