Auto Scrolling
authorHeonjae Jang <heonjae.jang@samsung.com>
Wed, 15 Mar 2017 07:44:53 +0000 (16:44 +0900)
committerChulSeung Kim <charles0.kim@samsung.com>
Thu, 8 Jun 2017 09:34:46 +0000 (18:34 +0900)
1. Add OnFocusCommand in AppItemCell
2. Add ScrollToIndex in AppListView

Change-Id: I9f76289febb1a21a58403ca1d54df4a753b5ce80

TVApps/TVApps/Controls/AppItemCell.xaml.cs
TVApps/TVApps/Controls/AppListView.xaml
TVApps/TVApps/Controls/AppListView.xaml.cs
TVApps/TVApps/Views/MainPage.xaml.cs

index 29ef59a6da65cf295feb5148a1dcfe85617d8acd..1d8cd43bbfe7526eb89531f26f6c7f7628afd756 100755 (executable)
@@ -27,13 +27,10 @@ namespace TVApps.Controls
     /// hahaha
     /// </summary>
     public partial class AppItemCell : ViewCell
-    {
-        public static readonly BindableProperty OnClickedCommandProperty = BindableProperty.Create("OnClickedCommand", typeof(ICommand), typeof(AppItemCell), default(ICommand));
-        public ICommand OnClickedCommand
-        {
-            get { return (ICommand)GetValue(OnClickedCommandProperty); }
-            set { SetValue(OnClickedCommandProperty, value); }
-        }
+    {        
+        public ICommand OnClickedCommand { get; set; }
+
+        public ICommand OnFocusedCommand { get; set; }
 
         public static readonly BindableProperty IsPinnedProperty = BindableProperty.Create("IsPinned", typeof(bool), typeof(AppItemCell), default(bool));
         public bool IsPinned
@@ -104,11 +101,12 @@ namespace TVApps.Controls
 
         private void OnClicked(object sender, EventArgs e)
         {
-            OnClickedCommand.Execute("");
+            OnClickedCommand?.Execute("");
         }
 
         private void OnFocused(object sender, EventArgs e)
         {
+            OnFocusedCommand?.Execute("");
             ButtonImage.ScaleTo(1.32, 300);
             ButtonImage.TranslateTo(0.0, 2.0, 300);
             TextArea.TranslateTo(0.0, 26.0, 300);
index 67a36cbe451965e38b7e518bae682725218cb93c..82ad28e547396ca23ee5c34bfb2437acbfbc83bd 100755 (executable)
@@ -8,7 +8,7 @@
             Orientation="Horizontal">
     <Grid x:Name="AppListGrid"
           HorizontalOptions="Start"
-          Padding="58,0,0,0">
+          Padding="58,0,58,0">
         <Grid.RowDefinitions>
             <RowDefinition Height="133*" />
             <RowDefinition Height="8*" />
index bf92647fbea82df6e3f67ae623e8c67a4df0c507..24bcef88aacb72b6994d29365a197720cc591a56 100644 (file)
@@ -23,6 +23,8 @@ using System.ComponentModel;
 using LibTVRefCommmonPortable.DataModels;
 using LibTVRefCommmonPortable.Utils;
 using System.Collections.Generic;
+using System;
+using System.Threading.Tasks;
 
 namespace TVApps.Controls
 {
@@ -72,6 +74,9 @@ namespace TVApps.Controls
                 return;
             }
 
+            // For Test Code
+            //for (var test = 0; test < 4; test++)
+            //{
             foreach (var item in ItemsSource)
             {
                 var viewCell = ItemTemplate.CreateContent() as AppItemCell;
@@ -82,6 +87,11 @@ namespace TVApps.Controls
                 {
                     item.DoAction();
                 });
+                var index = AppCount / 2;
+                viewCell.OnFocusedCommand = new Command(() =>
+                {
+                    ScrollToIndex(index);
+                });
                 if (AppCount % 2 == 0)
                 {
                     AppUpperList.Children.Add(viewCell.View);
@@ -93,11 +103,41 @@ namespace TVApps.Controls
 
                 AppCount = AppCount + 1;
             }
+            //}
+
+            InitializeFocus();
+        }
 
-            FocusInitialize();
+        private async void ScrollToIndex(int index)
+        {
+            var StartX = AppUpperList.Children[index].X;
+            var LowerBound = StartX - 16 - 57 - (256 * 6) + 58;
+            LowerBound = LowerBound > 0 ? LowerBound : 0;
+            var UpperBound = StartX - 16 - 57 + 58;
+            UpperBound = UpperBound > 0 ? UpperBound : 0;
+
+            // Is Focusable.
+            if (ScrollX >= LowerBound && ScrollX <= UpperBound)
+            {
+                return;
+            }
+
+            var Ldiff = Math.Abs(ScrollX - LowerBound);
+            var Rdiff = Math.Abs(ScrollX - UpperBound);
+
+            if (Ldiff > Rdiff)
+            {
+                await Task.Delay(1);
+                await ScrollToAsync(UpperBound, 0, true);
+            }
+            else
+            {
+                await Task.Delay(1);
+                await ScrollToAsync(LowerBound, 0, true);
+            }
         }
 
-        public void FocusInitialize()
+        public void InitializeFocus()
         {
             if (AppUpperList.Children.Count > 0)
             {
index bb68cfb76aab5fd0631a6fef5df83a33286c6a96..245257074e79216e17a5fdddc42715e087eb06bc 100644 (file)
@@ -66,7 +66,7 @@ namespace TVApps.Views
                     break;
             }
 
-            AppList.FocusInitialize();
+            AppList.InitializeFocus();
         }
 
         private void MainPage_PropertyChanged(object sender, PropertyChangedEventArgs e)