Fix Issues [TNEXT-3687] 08/151908/1
authorHeonjae.Jang <Heonjae.Jang@samsung.com>
Fri, 22 Sep 2017 08:54:12 +0000 (17:54 +0900)
committerHeonjae.Jang <Heonjae.Jang@samsung.com>
Fri, 22 Sep 2017 08:54:12 +0000 (17:54 +0900)
Change-Id: Ia13e7563ec2332b359808636ae0c1fef31df5d5c
Signed-off-by: Heonjae.Jang <Heonjae.Jang@samsung.com>
TVMediaHub/TVMediaHub.Tizen/ViewModels/MusicTabViewModel.cs
TVMediaHub/TVMediaHub.Tizen/Views/MusicGroup.xaml.cs
TVMediaHub/TVMediaHub.Tizen/Views/MusicTab.xaml.cs

index a953a38..230d29f 100755 (executable)
@@ -20,6 +20,7 @@ using System.Collections.ObjectModel;
 using System.ComponentModel;
 using System.IO;
 using System.Threading;
+using System.Threading.Tasks;
 using System.Windows.Input;
 using TVMediaHub.Tizen.DataModels;
 using TVMediaHub.Tizen.Models;
@@ -220,6 +221,7 @@ namespace TVMediaHub.Tizen.ViewModels
 
             foreach (var group in templist)
             {
+                await Task.Delay(1);
                 MusicList.Add(group);
                 foreach(var item in group.Contents)
                 {
index 5da3d7b..b71f2f3 100755 (executable)
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 
+using System;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.Windows.Input;
@@ -79,6 +80,10 @@ namespace TVMediaHub.Tizen.Views
         /// right side items for focus chain
         /// </summary>
         public List<Button> RightFocusList { get; protected set; }
+        /// <summary>
+        /// @TODO:Comment
+        /// </summary>
+        public List<KeyValuePair<double, Button>> BottomFocusList { get; protected set; }
 
         /// <summary>
         /// A delegate will be executed when the context popup item selected
@@ -98,6 +103,8 @@ namespace TVMediaHub.Tizen.Views
         /// </summary>
         private MusicItem focusedItem;
 
+        public EventHandler<GroupItemFocusEventArgs> GroupItemFocused;
+
         /// <summary>
         /// A constructor
         /// </summary>
@@ -117,6 +124,7 @@ namespace TVMediaHub.Tizen.Views
             ChildrenFocusList = new List<Button>();
             LeftFocusList = new List<Button>();
             RightFocusList = new List<Button>();
+            BottomFocusList = new List<KeyValuePair<double, Button>>();
             MusicItemList = new List<MusicItem>();
             GroupTitle.TextColor = Color.FromRgba(255, 255, 255, 31);
             GroupTitle.FontFamily = "BreezSans";
@@ -164,10 +172,12 @@ namespace TVMediaHub.Tizen.Views
                 foreach (var item in ItemsSource)
                 {
                     var itemView = new MusicItem();
+                    ChildrenFocusList.Add(itemView.GetFocusArea());
                     itemView.BindingContext = item;
                     MusicItemList.Add(itemView);
                     itemView.OnFocusedEventHandler += (se, ev) =>
                     {
+                        GroupItemFocused?.Invoke(itemView, new GroupItemFocusEventArgs(X + itemView.X));
                         GroupContentArea.RaiseChild(itemView);
                         focusedItem = itemView;
                     };
@@ -185,7 +195,6 @@ namespace TVMediaHub.Tizen.Views
                     };
 
                     GroupContentArea.Children.Add(itemView, index / 4, index % 4);
-                    ChildrenFocusList.Add(itemView.GetFocusArea());
                     index++;
                 }
 
@@ -261,8 +270,8 @@ namespace TVMediaHub.Tizen.Views
                 else
                 {
                     target.On<Xamarin.Forms.PlatformConfiguration.Tizen>().SetNextFocusDownView(target);
-                    //var targetX = column * SizeUtils.GetWidthSize(322);
-                    //BottomFocusList.Add(new KeyValuePair<double, Button>(targetX, target));
+                    var targetX = column * SizeUtils.GetWidthSize(580);
+                    BottomFocusList.Add(new KeyValuePair<double, Button>(targetX, target));
                 }
             }
         }
index 6136520..1e7bf59 100755 (executable)
@@ -28,6 +28,7 @@ using TVMediaHub.Tizen.ViewModels;
 using Xamarin.Forms;
 using Xamarin.Forms.PlatformConfiguration.TizenSpecific;
 using static TVMediaHub.Tizen.Views.MusicItem;
+using TizenVisualElement = Xamarin.Forms.PlatformConfiguration.TizenSpecific.VisualElement;
 
 namespace TVMediaHub.Tizen.Views
 {
@@ -195,6 +196,11 @@ namespace TVMediaHub.Tizen.Views
         }
 
         /// <summary>
+        /// A list of bottom buttons
+        /// </summary>
+        private List<KeyValuePair<double, Button>> BottomButtonList;
+
+        /// <summary>
         /// A constructor
         /// Initializes the size of the items that are used in Music tab
         /// </summary>
@@ -205,10 +211,84 @@ namespace TVMediaHub.Tizen.Views
             InitializeSize();
             InitializeFonts();
             InitializeFooter();
-
+            InitializeData();
+            PropertyChanged += MusicTabPropertyChanged;
             ItemsSource.CollectionChanged += ItemsSourceCollectionChanged;
         }
 
+        private void InitializeData()
+        {
+            BottomButtonList = new List<KeyValuePair<double, Button>>();
+        }
+
+        private void MusicTabPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
+        {
+            if (e.PropertyName.Equals("ImageTabStatus"))
+            {
+                SetFooterFocusChain(MusicTabScrollView.ScrollX);
+            }
+        }
+
+        private void SetFooterFocusChain(double scrollX)
+        {
+            FooterNormal.SetFocusChain();
+            FooterDelete.SetFocusChain();
+
+            var Padding = SizeUtils.GetWidthSize(60);
+            var ItemWidth = SizeUtils.GetWidthSize(580);
+
+            var FocusableBoundFrom = scrollX;
+            var FocusableBoundTo = scrollX + MusicTabScrollView.Width - ItemWidth;
+
+            var list = BottomButtonList.FindAll((pair) =>
+            {
+                return (pair.Key >= FocusableBoundFrom && pair.Key <= FocusableBoundTo);
+            });
+
+            if (MusicTabStatus == TabStatus.Delete)
+            {
+                TizenVisualElement.SetNextFocusDownView(MusicPlayer.GetFocusArea(), FooterDelete.GetSelectAllButton());
+                TizenVisualElement.SetNextFocusUpView(FooterDelete.GetSelectAllButton(), MusicPlayer.GetFocusArea());
+            }
+            else
+            {
+                TizenVisualElement.SetNextFocusDownView(MusicPlayer.GetFocusArea(), FooterNormal.DropdownSource);
+                TizenVisualElement.SetNextFocusUpView(FooterNormal.DropdownSource, MusicPlayer.GetFocusArea());
+            }
+
+            for (var buttonIndex = 0; buttonIndex < list.Count; buttonIndex++)
+            {
+                var btn = list[buttonIndex].Value;
+
+                if (buttonIndex == list.Count - 1)
+                {
+                    if (MusicTabStatus == TabStatus.Delete)
+                    {
+                        TizenVisualElement.SetNextFocusDownView(btn, FooterDelete.GetCancelButton());
+                        TizenVisualElement.SetNextFocusUpView(FooterDelete.GetCancelButton(), btn);
+                    }
+                    else
+                    {
+                        TizenVisualElement.SetNextFocusDownView(btn, FooterNormal.ButtonOption);
+                        TizenVisualElement.SetNextFocusUpView(FooterNormal.ButtonOption, btn);
+                    }
+                }
+                else
+                {
+                    if (MusicTabStatus == TabStatus.Delete)
+                    {
+                        TizenVisualElement.SetNextFocusDownView(btn, FooterDelete.GetOkButton());
+                        TizenVisualElement.SetNextFocusUpView(FooterDelete.GetOkButton(), btn);
+                    }
+                    else
+                    {
+                        TizenVisualElement.SetNextFocusDownView(btn, FooterNormal.DropdownSort);
+                        TizenVisualElement.SetNextFocusUpView(FooterNormal.DropdownSort, btn);
+                    }
+                }
+            }
+        }
+
         /// <summary>
         /// A method for initializing the size of the items that are used in Music tab
         /// </summary>
@@ -296,17 +376,44 @@ namespace TVMediaHub.Tizen.Views
                     FooterNormal.IsFooterEnabled = true;
                 }
 
+                var groupItem = e.NewItems[0];
                 MusicGroup groupView = new MusicGroup();
+                groupView.PropertyChanged += (se, ev) =>
+                {
+                    if (ev.PropertyName.Equals("ItemsSource"))
+                    {
+                        if (groupView.X >= 0)
+                        {
+                            groupView.BottomFocusList.ForEach((item) =>
+                            {
+                                var key = groupView.X + item.Key;
+                                BottomButtonList.Add(new KeyValuePair<double, Button>(key, item.Value));
+                            });
+
+                            SetFooterFocusChain(0);
+                        }
+                    }
+                };
 
-                var groupItem = e.NewItems[0];
-                MusicContentView.Children.Add(groupView);
-                groupView.BindingContext = groupItem;
                 groupView.SetClickCommand(OnClickCommand);
                 groupView.ContextPopupItemSelectedHandler += (info, item) =>
                 {
                     ShowPopup(info, item);
                 };
 
+                groupView.GetTitleFocusArea().Focused += (se, ev) =>
+                {
+                    ScrollToTarget(groupView.X, SizeUtils.GetWidthSize(580), SizeUtils.GetWidthSize(100));
+                };
+
+                groupView.GroupItemFocused += (se, ev) =>
+                {
+                    ScrollToTarget(ev.PositionX, SizeUtils.GetWidthSize(580), SizeUtils.GetWidthSize(100));
+                };
+
+                MusicContentView.Children.Add(groupView);
+                groupView.BindingContext = groupItem;
+
                 if (MusicContentView.Children.Count > 1)
                 {
                     var leftGroup = MusicContentView.Children[MusicContentView.Children.Count - 2] as MusicGroup;
@@ -370,7 +477,6 @@ namespace TVMediaHub.Tizen.Views
                     FooterNormal.IsFooterEnabled = false;
                 }
             }
-
         }
 
         /// <summary>
@@ -382,9 +488,9 @@ namespace TVMediaHub.Tizen.Views
         {
             string storageName = e.SelectedItem as string;
 
-            // BottomButtonList.Clear();
+            BottomButtonList.Clear();
             ChangeSourceCommand?.Execute(storageName);
-            // FocusChain(ImageTabScrollView.ScrollX);
+            SetFooterFocusChain(MusicTabScrollView.ScrollX);
         }
 
         /// <summary>
@@ -394,7 +500,9 @@ namespace TVMediaHub.Tizen.Views
         /// <param name="e">A SelectedItemChanged event's argument</param>
         private void OnSortOptionChanged(object sender, SelectedItemChangedEventArgs e)
         {
+            BottomButtonList.Clear();
             ChangeSortOptionCommand?.Execute(e.SelectedItem);
+            SetFooterFocusChain(MusicTabScrollView.ScrollX);
         }
 
         /// <summary>
@@ -410,6 +518,7 @@ namespace TVMediaHub.Tizen.Views
                 ChangeTabStatusCommand?.Execute("");
                 FooterNormal.IsVisible = false;
                 FooterDelete.IsVisible = true;
+                SetFooterFocusChain(MusicTabScrollView.ScrollX);
             }
             else if (label.Equals("detail info"))
             {
@@ -427,6 +536,7 @@ namespace TVMediaHub.Tizen.Views
             ChangeTabStatusCommand?.Execute("");
             FooterNormal.IsVisible = true;
             FooterDelete.IsVisible = false;
+            SetFooterFocusChain(MusicTabScrollView.ScrollX);
         }
 
         /// <summary>
@@ -474,6 +584,7 @@ namespace TVMediaHub.Tizen.Views
             ChangeTabStatusCommand?.Execute("");
             FooterNormal.IsVisible = true;
             FooterDelete.IsVisible = false;
+            SetFooterFocusChain(MusicTabScrollView.ScrollX);
         }
 
         /// <summary>
@@ -558,5 +669,38 @@ namespace TVMediaHub.Tizen.Views
             }
 
         }
+
+        /// <summary>
+        /// Moves the scroller to the given target
+        /// </summary>
+        /// <param name="targetX">The given target</param>
+        /// <param name="targetWidth">The width of the given target</param>
+        /// <param name="padding">The padding of the given target</param>
+        private void ScrollToTarget(double targetX, int targetWidth, int padding)
+        {
+            var ScrollX = MusicTabScrollView.ScrollX;
+
+            var ScrollBoundFrom = targetX - (MusicTabScrollView.Width - targetWidth - padding);
+            ScrollBoundFrom = ScrollBoundFrom > 0 ? ScrollBoundFrom : 0;
+            var ScrollBoundTo = targetX - padding;
+            ScrollBoundTo = ScrollBoundTo > 0 ? ScrollBoundTo : 0;
+            DbgPort.D("TEST");
+            // Is Focusable.
+            if (ScrollX >= ScrollBoundFrom && ScrollX <= ScrollBoundTo)
+            {
+                return;
+            }
+
+            if (Math.Abs(ScrollX - ScrollBoundFrom) > Math.Abs(ScrollX - ScrollBoundTo))
+            {
+                Device.BeginInvokeOnMainThread(() => MusicTabScrollView.ScrollToAsync(ScrollBoundTo, 0, true));
+                SetFooterFocusChain(ScrollBoundTo);
+            }
+            else
+            {
+                Device.BeginInvokeOnMainThread(() => MusicTabScrollView.ScrollToAsync(ScrollBoundFrom, 0, true));
+                SetFooterFocusChain(ScrollBoundFrom);
+            }
+        }
     }
 }
\ No newline at end of file