Add InsertAfter method in Naviframe
authorSeungkeun Lee <sngn.lee@samsung.com>
Wed, 21 Sep 2016 02:19:41 +0000 (11:19 +0900)
committerSeungkeun Lee <sngn.lee@samsung.com>
Wed, 21 Sep 2016 02:36:24 +0000 (11:36 +0900)
 - It is need to Forms to implement Push without animation

Change-Id: I6bf64e57efa589889366d69042acf41ee56790e6

src/ElmSharp/ElmSharp/Naviframe.cs
src/ElmSharp/Interop/Interop.Elementary.Naviframe.cs
test/ElmSharp.Test/ElmSharp.Test.csproj
test/ElmSharp.Test/ElmSharpTest.Net45.csproj
test/ElmSharp.Test/TC/NaviframeTest2.cs [new file with mode: 0644]

index 1604f0a..c71fd81 100644 (file)
@@ -17,6 +17,15 @@ namespace ElmSharp
             _transitionFinished.On += (s, e) => AnimationFinished?.Invoke(this, EventArgs.Empty);
         }
 
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <remarks>
+        /// It is always called when NaviItem was removed.
+        /// (even if removed by NaviItem.Delete())
+        /// This event will be invoked in progress of Pop/Delete operation. 
+        /// After called Popped event, Pop/Delete method will be returned
+        /// </remarks>
         public event EventHandler<NaviframeEventArgs> Popped;
         public event EventHandler AnimationFinished;
         public IReadOnlyList<NaviItem> NavigationStack
@@ -57,11 +66,7 @@ namespace ElmSharp
             IntPtr item = Interop.Elementary.elm_naviframe_item_push(Handle, title, IntPtr.Zero, IntPtr.Zero, content.Handle, null);
             NaviItem naviItem = NaviItem.FromNativeHandle(item, content);
             _itemStack.Add(naviItem);
-            naviItem.Popped += (s, e) =>
-            {
-                _itemStack.Remove(naviItem);
-                Popped?.Invoke(this, new NaviframeEventArgs() { Content = naviItem.Content });
-            };
+            naviItem.Popped += ItemPoppedHandler;
             return naviItem;
         }
 
@@ -75,11 +80,21 @@ namespace ElmSharp
             NaviItem naviItem = NaviItem.FromNativeHandle(item, content);
             int idx = _itemStack.IndexOf(before);
             _itemStack.Insert(idx, naviItem);
-            naviItem.Popped += (s, e) =>
-            {
-                _itemStack.Remove(naviItem);
-                Popped?.Invoke(this, new NaviframeEventArgs() { Content = naviItem.Content });
-            };
+            naviItem.Popped += ItemPoppedHandler;
+            return naviItem;
+        }
+
+        public NaviItem InsertAfter(NaviItem after, EvasObject content)
+        {
+            return InsertAfter(after, content, "");
+        }
+        public NaviItem InsertAfter(NaviItem after, EvasObject content, string title)
+        {
+            IntPtr item = Interop.Elementary.elm_naviframe_item_insert_after(Handle, after, title, IntPtr.Zero, IntPtr.Zero, content, null);
+            NaviItem naviItem = NaviItem.FromNativeHandle(item, content);
+            int idx = _itemStack.IndexOf(after);
+            _itemStack.Insert(idx + 1, naviItem);
+            naviItem.Popped += ItemPoppedHandler;
             return naviItem;
         }
 
@@ -92,5 +107,14 @@ namespace ElmSharp
         {
             return Interop.Elementary.elm_naviframe_add(parent.Handle);
         }
+
+        void ItemPoppedHandler(object sender, EventArgs e)
+        {
+            NaviItem item = sender as NaviItem;
+            if (item == null)
+                return;
+            _itemStack.Remove(item);
+            Popped?.Invoke(this, new NaviframeEventArgs() { Content = item.Content });
+        }
     }
 }
index c22fcb4..adfe618 100644 (file)
@@ -50,6 +50,9 @@ internal static partial class Interop
         internal static extern IntPtr elm_naviframe_item_insert_before(IntPtr naviframe, IntPtr before, string title, IntPtr prev, IntPtr next, IntPtr content, string style);
 
         [DllImport(Libraries.Elementary)]
+        internal static extern IntPtr elm_naviframe_item_insert_after(IntPtr naviframe, IntPtr after, string title, IntPtr prev, IntPtr next, IntPtr content, string style);
+
+        [DllImport(Libraries.Elementary)]
         internal static extern IntPtr elm_naviframe_top_item_get(IntPtr naviframe);
 
         [DllImport(Libraries.Elementary)]
index 1c23408..8899c50 100644 (file)
@@ -64,6 +64,7 @@
     <Compile Include="TC\LabelTest1.cs" />\r
     <Compile Include="TC\ListTest1.cs" />\r
     <Compile Include="TC\NaviframeTest1.cs" />\r
+    <Compile Include="TC\NaviframeTest2.cs" />\r
     <Compile Include="TC\PanelTest1.cs" />\r
     <Compile Include="TC\PanelTest2.cs" />\r
     <Compile Include="TC\PanesTest1.cs" />\r
index f30834a..bb68b0d 100644 (file)
@@ -66,6 +66,7 @@
     <Compile Include="TC\LabelTest1.cs" />\r
     <Compile Include="TC\ListTest1.cs" />\r
     <Compile Include="TC\NaviframeTest1.cs" />\r
+    <Compile Include="TC\NaviframeTest2.cs" />\r
     <Compile Include="TC\PanelTest1.cs" />\r
     <Compile Include="TC\PanelTest2.cs" />\r
     <Compile Include="TC\PanesTest1.cs" />\r
diff --git a/test/ElmSharp.Test/TC/NaviframeTest2.cs b/test/ElmSharp.Test/TC/NaviframeTest2.cs
new file mode 100644 (file)
index 0000000..53fe87b
--- /dev/null
@@ -0,0 +1,123 @@
+using System;
+using System.Linq;
+
+namespace ElmSharp.Test
+{
+    public class NaviframeTest2 : TestCaseBase
+    {
+        public override string TestName => "NaviframeTest2";
+        public override string TestDescription => "Naviframe test";
+
+        Naviframe _navi;
+        int _sequence = 0;
+
+        public override void Run(Window window)
+        {
+            Conformant conformant = new Conformant(window);
+            conformant.Show();
+
+            Naviframe navi = new Naviframe(window)
+            {
+                PreserveContentOnPop = true,
+                DefaultBackButtonEnabled = true
+            };
+            _navi = navi;
+
+            navi.Popped += (s, e) =>
+            {
+                Console.WriteLine("----- Naviframe was popped {0:x} ", (int)(IntPtr)e.Content);
+            };
+
+            navi.Push(CreatePage(window), "0 Page");
+            navi.Show();
+            conformant.SetContent(navi);
+        }
+
+        EvasObject CreatePage(Window parent)
+        {
+            Box box = new Box(parent);
+            box.Show();
+
+            Label label = new Label(parent) {
+                Text = string.Format("{0} Page", _sequence++),
+                WeightX = 1,
+                AlignmentX = -1,
+            };
+            Button push = new Button(parent) {
+                Text = "Push",
+                WeightX = 1,
+                AlignmentX = -1,
+            };
+            Button pop = new Button(parent) {
+                Text = "pop",
+                WeightX = 1,
+                AlignmentX = -1,
+            };
+            Button insertBeforeTop = new Button(parent) {
+                Text = "insertBeforeTop",
+                WeightX = 1,
+                AlignmentX = -1,
+            };
+            Button insertAfterTop = new Button(parent) {
+                Text = "insertAfterTop",
+                WeightX = 1,
+                AlignmentX = -1,
+            };
+
+            Button removeTop = new Button(parent)
+            {
+                Text = "removeTop",
+                WeightX = 1,
+                AlignmentX = -1,
+            };
+
+            label.Show();
+            push.Show();
+            pop.Show();
+            insertBeforeTop.Show();
+            insertAfterTop.Show();
+            removeTop.Show();
+
+            push.Clicked += (s, e) =>
+            {
+                _navi.Push(CreatePage(parent), string.Format("{0} Page", _sequence-1));
+            };
+
+            pop.Clicked += (s, e) =>
+            {
+                var item = _navi.NavigationStack.LastOrDefault();
+                int nativePointer = (int)(IntPtr)(item.Content);
+                Console.WriteLine("----- Before Call _navi.Pop() {0:x} ", nativePointer);
+                _navi.Pop();
+                Console.WriteLine("----- After Call _navi.Pop() {0:x} ", nativePointer);
+            };
+
+            insertBeforeTop.Clicked += (s, e) =>
+            {
+                _navi.InsertBefore(_navi.NavigationStack.LastOrDefault(), CreatePage(parent), string.Format("{0} Page", _sequence - 1));
+            };
+
+            insertAfterTop.Clicked += (s, e) =>
+            {
+                _navi.InsertAfter(_navi.NavigationStack.LastOrDefault(), CreatePage(parent), string.Format("{0} Page", _sequence - 1));
+            };
+            removeTop.Clicked += (s, e) =>
+            {
+                var item = _navi.NavigationStack.LastOrDefault();
+                int nativePointer = (int)(IntPtr)(item.Content);
+                Console.WriteLine("----- Before Call NaviItem.Delete() {0:x} ", nativePointer);
+                item.Delete();
+                Console.WriteLine("----- After Call NaviItem.Delete() {0:x} ", nativePointer);
+            };
+            
+            box.PackEnd(label);
+            box.PackEnd(push);
+            box.PackEnd(pop);
+            box.PackEnd(insertBeforeTop);
+            box.PackEnd(insertAfterTop);
+            box.PackEnd(removeTop);
+
+            return box;
+        }
+    }
+}