From: Jean-Philippe Bruyère Date: Wed, 7 Mar 2018 14:06:30 +0000 (+0100) Subject: Height and Width of GO major change for stacking, docker improvement and simplification X-Git-Tag: v0.9.5-beta~153^2~19 X-Git-Url: https://git.osiis.dedyn.io/?a=commitdiff_plain;h=6f303fb67fcc7843ed564c676d12e86b034cfe0a;p=jp%2Fcrow.git Height and Width of GO major change for stacking, docker improvement and simplification --- diff --git a/Tests/Interfaces/Experimental/testDock.crow b/Tests/Interfaces/Experimental/testDock.crow index 3f1aaa3d..742c1e07 100644 --- a/Tests/Interfaces/Experimental/testDock.crow +++ b/Tests/Interfaces/Experimental/testDock.crow @@ -1,14 +1,18 @@  - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/src/ExtensionsMethods.cs b/src/ExtensionsMethods.cs index dfb90f0e..d7448874 100644 --- a/src/ExtensionsMethods.cs +++ b/src/ExtensionsMethods.cs @@ -109,6 +109,27 @@ namespace Crow public static Orientation GetOrientation(this Alignment a){ return (a==Alignment.Left) ||(a==Alignment.Right) ? Orientation.Horizontal : Orientation.Vertical; } + public static Alignment GetOpposite(this Alignment a){ + switch (a) { + case Alignment.Left: + return Alignment.Right; + case Alignment.Right: + return Alignment.Left; + case Alignment.Top: + return Alignment.Bottom; + case Alignment.Bottom: + return Alignment.Top; + case Alignment.TopLeft: + return Alignment.BottomRight; + case Alignment.TopRight: + return Alignment.BottomLeft; + case Alignment.BottomLeft: + return Alignment.TopRight; + case Alignment.BottomRight: + return Alignment.TopLeft; + } + return Alignment.Center; + } public static void Raise(this EventHandler handler, object sender, EventArgs e) { if(handler != null) diff --git a/src/GraphicObjects/DockStack.cs b/src/GraphicObjects/DockStack.cs index c06be42a..bfd3ac9a 100644 --- a/src/GraphicObjects/DockStack.cs +++ b/src/GraphicObjects/DockStack.cs @@ -29,17 +29,9 @@ using Crow.IML; namespace Crow { public class DockStack : GenericStack - { - int dockingDiv = 6; - GraphicObject subStack = null; - + { Docker rootDock { get { return LogicalParent as Docker; }} - public GraphicObject SubStack { - get { return subStack;} - set{ subStack=value; } - } - #region CTor public DockStack () {} public DockStack (Interface iface) : base (iface) {} @@ -77,40 +69,93 @@ namespace Crow } return Slot.ContainsOrIsEqual(m); } + +// public override void OnLayoutChanges (LayoutingType layoutType) +// { +// base.OnLayoutChanges (layoutType); +// +// if ((layoutType & LayoutingType.Sizing) > 0) +// computeRects(); +// } + + Rectangle rIn = default(Rectangle); + double dockThresh = 0.2; + GraphicObject focusedChild; + internal GraphicObject stretchedChild; + + void getFocusedChild (Point lm) { + Rectangle cb = ClientRectangle; + + childrenRWLock.EnterReadLock (); + foreach (GraphicObject c in Children) { + Rectangle bounds = c.Slot + cb.Position; + if (!bounds.ContainsOrIsEqual (lm)) + continue; + rIn = bounds; + focusedChild = c; + break; + } + childrenRWLock.ExitReadLock (); + } + public override void onMouseMove (object sender, MouseMoveEventArgs e) { if (IsDropTarget) { DockWindow dw = IFace.DragAndDropOperation.DragSource as DockWindow; if (dw.IsDocked) { - if (!dw.CheckUndock (e.Position)) { + //if (!dw.CheckUndock (e.Position)) { base.onMouseMove (sender, e); return; - } + //} } - Point lm = ScreenPointToLocal (e.Position); - - Rectangle r = ClientRectangle; - int vTreshold = r.Height / dockingDiv; - int hTreshold = r.Width / dockingDiv; Alignment curDockPos = dw.DockingPosition; + dw.DockingPosition = Alignment.Undefined; + + Rectangle cb = ClientRectangle; + Point lm = ScreenPointToLocal (e.Position); - if (lm.X < hTreshold) - dw.DockingPosition = Alignment.Left; - else if (lm.X > r.Right - hTreshold) - dw.DockingPosition = Alignment.Right; - else if (lm.Y < vTreshold) - dw.DockingPosition = Alignment.Top; - else if (lm.Y > r.Bottom - vTreshold) - dw.DockingPosition = Alignment.Bottom; - else if (this.Children.Contains (rootDock.CenterDockedObj) && !(rootDock.CenterDockedObj is DockWindow)) { - r.Inflate (-r.Width / 3, -r.Height / 3); - if (r.ContainsOrIsEqual (lm)) + if (Children.Count == 0) { + Rectangle r = cb; + r.Inflate (r.Width / -5, r.Height / -5); + if (r.ContainsOrIsEqual(lm)) dw.DockingPosition = Alignment.Center; - else - dw.DockingPosition = Alignment.Undefined; - } else - dw.DockingPosition = Alignment.Undefined; + } else { + rIn = cb; + + if (Orientation == Orientation.Horizontal || Children.Count == 1) { + if (lm.Y > cb.Top + cb.Height / 3 && lm.Y < cb.Bottom - cb.Height / 3) { + if (lm.X < cb.Left + cb.Width / 3) + dw.DockingPosition = Alignment.Left; + else if (lm.X > cb.Right - cb.Width / 3) + dw.DockingPosition = Alignment.Right; + } else { + getFocusedChild (lm); + if (focusedChild != null) { + if (lm.Y < rIn.Top + rIn.Height / 3) + dw.DockingPosition = Alignment.Top; + else if (lm.Y > rIn.Bottom - rIn.Height / 3) + dw.DockingPosition = Alignment.Bottom; + } + } + } + if (Orientation == Orientation.Vertical || Children.Count == 1) { + if (lm.X > cb.Left + cb.Width / 3 && lm.X < cb.Right - cb.Width / 3) { + if (lm.Y < cb.Top + cb.Height / 3) + dw.DockingPosition = Alignment.Top; + else if (lm.Y > cb.Bottom - cb.Height / 3) + dw.DockingPosition = Alignment.Bottom; + } else { + getFocusedChild (lm); + if (focusedChild != null) { + if (lm.X < rIn.Left + rIn.Width / 3) + dw.DockingPosition = Alignment.Left; + else if (lm.X > rIn.Right - rIn.Width / 3) + dw.DockingPosition = Alignment.Right; + } + } + } + } if (curDockPos != dw.DockingPosition) RegisterForGraphicUpdate (); @@ -160,32 +205,28 @@ namespace Crow DockWindow dw = IFace.DragAndDropOperation.DragSource as DockWindow; if (!dw.IsDocked) { - - Rectangle r; - - if ((dw.DockingPosition.GetOrientation () == Orientation || SubStack == null)&&dw.DockingPosition != Alignment.Center) { - r = ClientRectangle; - Console.WriteLine ("Same rect substack=" + SubStack); - }else { - r = subStack.ClientRectangle + subStack.Slot.Position + ClientRectangle.TopLeft; - Console.WriteLine ("sub rect"); - } - + Rectangle cb = ClientRectangle; + double minDim = Math.Min (cb.Width, cb.Height); + + Rectangle r = rIn; + if (Children.Count <= 1 || dw.DockingPosition.GetOrientation()==Orientation ) + r = cb; + switch (dw.DockingPosition) { case Alignment.Top: - gr.Rectangle (r.Left, r.Top, r.Width, r.Height / dockingDiv); + gr.Rectangle (r.Left, r.Top, r.Width, r.Height * dockThresh); break; case Alignment.Bottom: - gr.Rectangle (r.Left, r.Bottom - r.Height / dockingDiv, r.Width, r.Height / dockingDiv); + gr.Rectangle (r.Left, r.Bottom - r.Height * dockThresh, r.Width, r.Height * dockThresh); break; case Alignment.Left: - gr.Rectangle (r.Left, r.Top, r.Width / dockingDiv, r.Height); + gr.Rectangle (r.Left, r.Top, r.Width * dockThresh, r.Height); break; case Alignment.Right: - gr.Rectangle (r.Right - r.Width / dockingDiv, r.Top, r.Width / dockingDiv, r.Height); + gr.Rectangle (r.Right - r.Width * dockThresh, r.Top, r.Width * dockThresh, r.Height); break; case Alignment.Center: - r.Inflate (-Math.Min (r.Width, r.Height) / dockingDiv); + r.Inflate ((int)Math.Ceiling (Math.Min (r.Width, r.Height) * -0.05)); gr.Rectangle (r); break; } @@ -197,77 +238,37 @@ namespace Crow } gr.Restore (); } - - public void Undock (DockWindow dw){ - int idx = Children.IndexOf(dw); - - RemoveChild(dw); - - if (rootDock.CenterDockedObj == dw) { - rootDock.CenterDockedObj = new GraphicObject (IFace) { IsEnabled = false }; - InsertChild (idx, rootDock.CenterDockedObj); - SubStack = rootDock.CenterDockedObj; - }else if (dw.DockingPosition == Alignment.Left || dw.DockingPosition == Alignment.Top) - RemoveChild (idx); - else - RemoveChild (idx - 1); - - if (Children.Count > 1) - return; - - DockStack dsp = Parent as DockStack; - if (dsp == null) - return; - - RemoveChild (0); - idx = dsp.Children.IndexOf (this); - dsp.RemoveChild (this); - dsp.InsertChild (idx, SubStack); - dsp.SubStack = SubStack; - return; - } - public void Dock(DockWindow dw){ - Rectangle r = ClientRectangle; - - int vTreshold = r.Height / dockingDiv; - int hTreshold = r.Width / dockingDiv; - + + public void Dock(DockWindow dw){ DockStack activeStack = this; - Console.WriteLine ("******* Dockingtack {0}", this.Name); + if (Children.Count == 1) { - activeStack = this; Orientation = dw.DockingPosition.GetOrientation (); - }else if (dw.DockingPosition.GetOrientation() != Orientation) { - activeStack = new DockStack (IFace); - int ci = Children.IndexOf (rootDock.CenterDockedObj); - if (ci <0 ){ - DockStack dsp = Parent as DockStack; - if (dsp != null) { - int idx = dsp.Children.IndexOf (this); - dsp.RemoveChild (this); - dsp.SubStack = activeStack; - dsp.InsertChild (idx, activeStack); - activeStack.SubStack = this; - activeStack.AddChild (this); - } else { - Docker dk = Parent as Docker; - dk.RemoveChild (this); - dk.InsertChild (0, activeStack); - dk.SubStack = activeStack; - activeStack.AddChild (this); - activeStack.SubStack = this; - } - }else{ - int i = Children.IndexOf (SubStack); - RemoveChild (SubStack); - activeStack.SubStack = SubStack; - SubStack = activeStack; - InsertChild(i, activeStack); - activeStack.AddChild (activeStack.SubStack); + if (Children [0] is DockWindow) { + (Children [0] as DockWindow).DockingPosition = dw.DockingPosition.GetOpposite (); } + } else if (Children.Count > 0 && dw.DockingPosition.GetOrientation () != Orientation) { + activeStack = new DockStack (IFace); activeStack.Orientation = dw.DockingPosition.GetOrientation (); + activeStack.Width = focusedChild.Width; + activeStack.Height = focusedChild.Height; + int idx = Children.IndexOf (focusedChild); + RemoveChild (focusedChild); + focusedChild.Height = Measure.Stretched; + focusedChild.Width = Measure.Stretched; + InsertChild (idx, activeStack); + activeStack.AddChild (focusedChild); + activeStack.stretchedChild = focusedChild; + if (focusedChild is DockWindow) + (focusedChild as DockWindow).DockingPosition = dw.DockingPosition.GetOpposite (); + focusedChild = null; } - Console.WriteLine ("Docking {0} in {1}", dw.Name, activeStack.Name); + + Rectangle r = ClientRectangle; + int vTreshold = (int)(r.Height * dockThresh); + int hTreshold = (int)(r.Width * dockThresh); + + Console.WriteLine ("Docking {0} as {2} in {1}", dw.Name, activeStack.Name, dw.DockingPosition); switch (dw.DockingPosition) { case Alignment.Top: dw.Height = vTreshold; @@ -294,15 +295,63 @@ namespace Crow activeStack.AddChild (dw); break; case Alignment.Center: - dw.Width = dw.Height = Measure.Stretched; - int i = activeStack.Children.IndexOf (rootDock.CenterDockedObj); - activeStack.DeleteChild (i); - activeStack.InsertChild (i, dw); - activeStack.SubStack = dw; - rootDock.CenterDockedObj= dw; + dw.Width = dw.Height = Measure.Stretched; + AddChild (dw); + stretchedChild = dw; break; } } + public void Undock (DockWindow dw){ + int idx = Children.IndexOf(dw); + + RemoveChild(dw); + + if (Children.Count == 0) + return; + + if (dw.DockingPosition == Alignment.Left || dw.DockingPosition == Alignment.Top) { + RemoveChild (idx); + if (stretchedChild == dw) { + stretchedChild = Children [idx]; + stretchedChild.Width = stretchedChild.Height = Measure.Stretched; + } + } else { + RemoveChild (idx - 1); + if (stretchedChild == dw) { + stretchedChild = Children [idx-2]; + stretchedChild.Width = stretchedChild.Height = Measure.Stretched; + } + } + + if (Children.Count == 1) { + DockStack dsp = Parent as DockStack; + if (dsp == null) { + Children [0].Width = Children [0].Height = Measure.Stretched; + return; + } + //remove level and move remaining obj to level above + GraphicObject g = Children [0]; + RemoveChild (g); + idx = dsp.Children.IndexOf (this); + dsp.RemoveChild (this); + dsp.InsertChild (idx, g); + g.Width = this.Width; + g.Height = this.Height; + if (dsp.stretchedChild == this) + dsp.stretchedChild = g; + dsp.checkAlignments (); + } else + checkAlignments (); + } + + internal void checkAlignments () { + DockWindow dw = Children[0] as DockWindow; + if (dw != null) + dw.DockingPosition = (Orientation == Orientation.Horizontal ? Alignment.Left : Alignment.Top); + dw = Children[Children.Count - 1] as DockWindow; + if (dw != null) + dw.DockingPosition = (Orientation == Orientation.Horizontal ? Alignment.Right : Alignment.Bottom); + } } } diff --git a/src/GraphicObjects/DockWindow.cs b/src/GraphicObjects/DockWindow.cs index f333f6c4..34290a2e 100644 --- a/src/GraphicObjects/DockWindow.cs +++ b/src/GraphicObjects/DockWindow.cs @@ -39,7 +39,6 @@ namespace Crow bool isDocked = false; Alignment docking = Alignment.Undefined; - Point lastMousePos; //last known mouse pos in this control Point undockingMousePosOrig; //mouse pos when docking was donne, use for undocking on mouse move Rectangle savedSlot; //last undocked slot recalled when view is undocked bool wasResizable; @@ -89,13 +88,14 @@ namespace Crow public override void onMouseMove (object sender, MouseMoveEventArgs e) { - lastMousePos = e.Position; +// if (this.HasFocus && e.Mouse.IsButtonDown (MouseButton.Left) && IsDocked) { +// if (Math.Abs (e.Position.X - undockingMousePosOrig.X) > 10 || +// Math.Abs (e.Position.X - undockingMousePosOrig.X) > 10) +// Undock (); +// } - if (this.HasFocus && e.Mouse.IsButtonDown (MouseButton.Left) && IsDocked) { - if (Math.Abs (e.Position.X - undockingMousePosOrig.X) > 10 || - Math.Abs (e.Position.X - undockingMousePosOrig.X) > 10) - Undock (); - } + if (this.HasFocus && e.Mouse.IsButtonDown (MouseButton.Left) && IsDocked) + CheckUndock (e.Position); base.onMouseMove (sender, e); } @@ -107,6 +107,8 @@ namespace Crow undockingMousePosOrig = e.Position; } public bool CheckUndock (Point mousePos) { + if (DockingPosition == Alignment.Center) + return false; if (Math.Abs (mousePos.X - undockingMousePosOrig.X) < undockThreshold || Math.Abs (mousePos.X - undockingMousePosOrig.X) < undockThreshold) return false; @@ -143,10 +145,8 @@ namespace Crow Resizable = wasResizable; } } + void dock (DockStack target){ - if (RootDock.CenterDockedObj is DockWindow && DockingPosition == Alignment.Center) - return; - lock (IFace.UpdateMutex) { IsDocked = true; //undockingMousePosOrig = lastMousePos; @@ -156,17 +156,23 @@ namespace Crow LastSlots = LastPaintedSlot = Slot = default(Rectangle); Left = Top = 0; - RootDock.RemoveChild (this); + Group g = Parent as Group; + g.RemoveChild (this); target.Dock (this); } } + protected override void close () { if (isDocked) Undock (); base.close (); } + + public string ExportWinConfigs () { + return string.Format ("{0};{1};{2}", this.Name, DockingPosition, savedSlot); + } } } diff --git a/src/GraphicObjects/Docker.cs b/src/GraphicObjects/Docker.cs index 6c55e34e..1aa4fa37 100644 --- a/src/GraphicObjects/Docker.cs +++ b/src/GraphicObjects/Docker.cs @@ -44,8 +44,6 @@ namespace Crow int dockingThreshold; - public DockStack SubStack = null; - public GraphicObject CenterDockedObj = null; [XmlAttributeAttribute][DefaultValue(10)] public virtual int DockingThreshold { @@ -58,42 +56,29 @@ namespace Crow } } - protected override void onInitialized (object sender, EventArgs e) - { - base.onInitialized (sender, e); - CenterDockedObj = new GraphicObject (IFace) { IsEnabled = false }; - } - public override void AddChild (GraphicObject g) { base.AddChild (g); g.LogicalParent = this; } - public override void RemoveChild (GraphicObject child) - { -// lock (IFace.UpdateMutex) { -// RegisterClip (ScreenCoordinates (LastPaintedSlot)); -// } - base.RemoveChild (child); - } public override void onMouseMove (object sender, MouseMoveEventArgs e) { if (IFace.DragAndDropOperation?.DragSource as DockWindow != null) { DockWindow dw = IFace.DragAndDropOperation.DragSource as DockWindow; - if (!dw.IsDocked) - dw.MoveAndResize (e.XDelta, e.YDelta); - if (SubStack == null) { - DockStack ds = new DockStack (IFace); - SubStack = ds; - InsertChild (0, SubStack); - ds.LogicalParent = this; - ds.AddChild (CenterDockedObj); - ds.SubStack = CenterDockedObj; + if (!dw.IsDocked) { + Rectangle r = dw.ScreenCoordinates (dw.Slot); + Point p = ScreenPointToLocal (e.Position); + dw.Left = p.X - r.Width / 2; + dw.Top = p.Y - r.Height / 2; } } base.onMouseMove (sender, e); } + + public string ExportWinConfigs () { + return ""; + } } } diff --git a/src/GraphicObjects/GenericStack.cs b/src/GraphicObjects/GenericStack.cs index f23b0bba..587f86dc 100644 --- a/src/GraphicObjects/GenericStack.cs +++ b/src/GraphicObjects/GenericStack.cs @@ -230,7 +230,7 @@ namespace Crow { base.RemoveChild (child); if (child == stretchedGO) { - stretchedGO.LastSlots = default(Rectangle); + //stretchedGO.LastSlots = default(Rectangle); stretchedGO = null; RegisterForLayouting (LayoutingType.Sizing); return; diff --git a/src/GraphicObjects/GraphicObject.cs b/src/GraphicObjects/GraphicObject.cs index 1e35f5b8..911ea7bd 100644 --- a/src/GraphicObjects/GraphicObject.cs +++ b/src/GraphicObjects/GraphicObject.cs @@ -604,23 +604,24 @@ namespace Crow if (value < MinimumSize.Width || (value > MaximumSize.Width && MaximumSize.Width > 0)) return; } - Measure lastWP = WidthPolicy; + Measure old = width; width = value; NotifyValueChanged ("Width", width); - if (WidthPolicy != lastWP) { - NotifyValueChanged ("WidthPolicy", WidthPolicy); + if (width == Measure.Stretched || old == Measure.Stretched) { + //NotifyValueChanged ("WidthPolicy", width.Policy); //contentSize in Stacks are only update on childLayoutChange, and the single stretched //child of the stack is not counted in contentSize, so when changing size policy of a child //we should adapt contentSize //TODO:check case when child become stretched, and another stretched item already exists. - if (parent is GenericStack) {//TODO:check if I should test Group instead - if ((parent as GenericStack).Orientation == Orientation.Horizontal) { - if (lastWP == Measure.Fit) - (parent as GenericStack).contentSize.Width -= this.LastSlots.Width; + GenericStack gs = Parent as GenericStack; + if (gs != null){ //TODO:check if I should test Group instead + if (gs.Orientation == Orientation.Horizontal) { + if (width == Measure.Stretched) + gs.contentSize.Width -= this.LastSlots.Width; else - (parent as GenericStack).contentSize.Width += this.LastSlots.Width; + gs.contentSize.Width += this.LastSlots.Width; } - } + } } this.RegisterForLayouting (LayoutingType.Width); @@ -644,17 +645,18 @@ namespace Crow if (value < MinimumSize.Height || (value > MaximumSize.Height && MaximumSize.Height > 0)) return; } - Measure lastHP = HeightPolicy; + Measure old = height; height = value; NotifyValueChanged ("Height", height); - if (HeightPolicy != lastHP) { - NotifyValueChanged ("HeightPolicy", HeightPolicy); - if (parent is GenericStack) { - if ((parent as GenericStack).Orientation == Orientation.Vertical) { - if (lastHP == Measure.Fit) - (parent as GenericStack).contentSize.Height -= this.LastSlots.Height; + if (height == Measure.Stretched || old == Measure.Stretched) { + //NotifyValueChanged ("HeightPolicy", HeightPolicy); + GenericStack gs = Parent as GenericStack; + if (gs != null){ //TODO:check if I should test Group instead + if (gs.Orientation == Orientation.Vertical) { + if (height == Measure.Stretched) + gs.contentSize.Height -= this.LastSlots.Height; else - (parent as GenericStack).contentSize.Height += this.LastSlots.Height; + gs.contentSize.Height += this.LastSlots.Height; } } } @@ -663,13 +665,13 @@ namespace Crow } } /// - /// Used for binding on dimensions, this property will never hold fixed size, but instead only + /// Was Used for binding on dimensions, this property will never hold fixed size, but instead only /// Fit or Stretched, **with inherited state implementation, it is not longer used in binding** /// [XmlIgnore]public virtual Measure WidthPolicy { get { return Width.IsFit ? Measure.Fit : Measure.Stretched; } } /// - /// Used for binding on dimensions, this property will never hold fixed size, but instead only + /// Was Used for binding on dimensions, this property will never hold fixed size, but instead only /// Fit or Stretched, **with inherited state implementation, it is not longer used in binding** /// [XmlIgnore]public virtual Measure HeightPolicy { get { diff --git a/src/GraphicObjects/TabItem.cs b/src/GraphicObjects/TabItem.cs index b2814393..584c180e 100644 --- a/src/GraphicObjects/TabItem.cs +++ b/src/GraphicObjects/TabItem.cs @@ -227,7 +227,6 @@ namespace Crow tv.AddChild (this); } #region Mouse Handling - public bool HoldCursor = false; public override bool PointIsIn (ref Point m) { if (!base.PointIsIn (ref m)) @@ -238,15 +237,9 @@ namespace Crow else return this.isSelected; } - public override void onMouseDown (object sender, MouseButtonEventArgs e) - { - base.onMouseDown (sender, e); - HoldCursor = true; - } public override void onMouseUp (object sender, MouseButtonEventArgs e) { base.onMouseUp (sender, e); - HoldCursor = false; tview.UpdateLayout (LayoutingType.ArrangeChildren); } public override void onMouseMove (object sender, MouseMoveEventArgs e) @@ -256,7 +249,7 @@ namespace Crow if (Parent == null) return; - if (!(HasFocus && HoldCursor)) + if (!IsDragged) return; TabView tv = Parent as TabView; diff --git a/src/GraphicObjects/TabView.cs b/src/GraphicObjects/TabView.cs index 49d8729d..304e820d 100644 --- a/src/GraphicObjects/TabView.cs +++ b/src/GraphicObjects/TabView.cs @@ -215,7 +215,7 @@ namespace Crow else adjustedTab = -1; - Console.WriteLine ("tabspace: {0} tw:{1}", tabSpace, tabWidth); + //Console.WriteLine ("tabspace: {0} tw:{1}", tabSpace, tabWidth); childrenRWLock.EnterReadLock(); TabItem[] tabItms = Children.Cast().OrderBy (t=>t.ViewIndex).ToArray(); @@ -227,7 +227,7 @@ namespace Crow continue; tabItms [i].NotifyValueChanged ("TabHeight", tabHeight); tabItms [i].NotifyValueChanged ("TabWidth", TabWidth); - if (!tabItms [i].HoldCursor) { + if (!tabItms [i].IsDragged) { tabItms [i].TabOffset = curOffset; //Console.WriteLine ("offset: {0}=>{1}", tabItms [i].Name, tabItms [i].TabOffset); }