]> O.S.I.I.S - jp/crow.git/commitdiff
moving tabs
authorjpbruyere <jp.bruyere@hotmail.com>
Mon, 15 Feb 2016 23:08:12 +0000 (00:08 +0100)
committerjpbruyere <jp.bruyere@hotmail.com>
Mon, 15 Feb 2016 23:08:12 +0000 (00:08 +0100)
Tests/Interfaces/testTabView.crow
src/GraphicObjects/TabItem.cs

index f298f529b18f21ba5950227024c4832ed0a3ed69..bad154530b73e2151f0e3e96ee6937a11c8c421e 100644 (file)
@@ -2,7 +2,7 @@
 <HorizontalStack Fit="true">
        <TabView CacheEnabled="false" Width="200" Height="200" Orientation="Horizontal" Spacing="20" Margin="0">
                <TabItem Name="TabItem1" Caption="tab item 1" Width="0" Height="0" Margin="0" Background="Gray"
-                       MouseEnter="{Background=Red}"
+                       MouseEnter="{Background=Red}" Focusable="true"
                        MouseLeave="{Background=Gray}">
                        <VerticalStack Fit="true">
                                <CheckBox/>
index a8845f28569cfe48674ffaf10f73ac05669e0475..a166319a5c490e8f37911d08c7a9f48a739282de 100644 (file)
@@ -67,12 +67,18 @@ namespace Crow
                #endregion
 
                #region GraphicObject overrides
-               [XmlAttributeAttribute()][DefaultValue(false)]
+               [XmlAttributeAttribute()][DefaultValue(true)]
                public override bool Focusable
                {
                        get { return base.Focusable; }
                        set { base.Focusable = value; }
                }
+               //prevent caching, because drawing order is different depending on selected tab
+               [XmlAttributeAttribute()][DefaultValue(false)]
+               public override bool CacheEnabled {
+                       get {return false;}
+                       set { }
+               }
                #endregion
 
                [XmlAttributeAttribute()][DefaultValue(0)]
@@ -83,6 +89,9 @@ namespace Crow
                                        return;
                                tabOffset = value;
                                NotifyValueChanged ("TabOffset", tabOffset);
+
+                               RegisterForLayouting (LayoutingType.X);
+                               registerForGraphicUpdate ();
                        }
                }
                [XmlAttributeAttribute()][DefaultValue("TabItem")]
@@ -134,6 +143,8 @@ namespace Crow
                        base.onDraw (gr);
                        gr.Restore ();
                }
+
+               #region Mouse Handling
                public override bool MouseIsIn (Point m)
                {
                        if (!Visible)
@@ -146,6 +157,58 @@ namespace Crow
                        return _contentContainer.ScreenCoordinates (_contentContainer.Slot).ContainsOrIsEqual (m)
                                || mouseIsInTitle;
                }
+               bool holdCursor = false;
+               public override void onMouseDown (object sender, OpenTK.Input.MouseButtonEventArgs e)
+               {
+                       base.onMouseDown (sender, e);
+                       holdCursor = true;
+               }
+               public override void onMouseUp (object sender, OpenTK.Input.MouseButtonEventArgs e)
+               {
+                       base.onMouseUp (sender, e);
+                       holdCursor = false;
+                       (Parent as TabView).UpdateLayout (LayoutingType.ArrangeChildren);
+               }
+               public override void onMouseMove (object sender, OpenTK.Input.MouseMoveEventArgs e)
+               {
+                       base.onMouseMove (sender, e);
+
+                       if (!(HasFocus&&holdCursor))
+                               return;
+                       TabView tv = Parent as TabView;
+                       TabItem previous = null, next = null;
+                       int tmp = TabOffset + e.XDelta;
+                       Debug.WriteLine (tmp);
+                       if (tmp < tv.Spacing)
+                               TabOffset = tv.Spacing;
+                       else if (tmp > Parent.getSlot ().Width - TabTitle.Slot.Width - tv.Spacing)
+                               TabOffset = Parent.getSlot ().Width - TabTitle.Slot.Width - tv.Spacing;
+                       else{
+                               int idx = tv.Children.IndexOf (this);
+                               if (idx > 0 && e.XDelta < 0) {
+                                       previous = tv.Children [idx - 1] as TabItem;
+
+                                       if (tmp < previous.TabOffset + previous.TabTitle.Slot.Width / 2) {
+                                               tv.Children.RemoveAt (idx);
+                                               tv.Children.Insert (idx - 1, this);
+                                               tv.SelectedTab = idx - 1;
+                                               tv.UpdateLayout (LayoutingType.ArrangeChildren);
+                                       }
+
+                               }else if (idx < tv.Children.Count - 1 && e.XDelta > 0) {
+                                       next = tv.Children [idx + 1] as TabItem;
+                                       if (tmp > next.TabOffset - next.TabTitle.Slot.Width / 2){
+                                               tv.Children.RemoveAt (idx);
+                                               tv.Children.Insert (idx + 1, this);
+                                               tv.SelectedTab = idx + 1;
+                                               tv.UpdateLayout (LayoutingType.ArrangeChildren);
+                                       }
+                               }
+                               TabOffset = tmp;
+                       }
+               }
+               #endregion
+
        }
 }