void DockWindow::ContainerDragEnd(DockCont &dc) { KillTimeCallback(TIMEID_ANIMATE_DELAY); if (!dc.IsFloating()) return; HighlightCtrl &hl = GetHighlightCtrl(); Ctrl *p = hl.GetParent(); int align = DOCK_NONE; if (p) for (int i = 0; i < 4; i++) if (p == &dockpane[i]) align = i; if (animatewnd && (p || align != DOCK_NONE)) { FloatAnimate(dc, hl.GetScreenRect()); } if (align != DOCK_NONE) { Unfloat(dc); dc.StateDocked(*this); dockpane[align].Swap(hl, dc); } else if (DockCont *target = dynamic_cast<DockCont *>(p)) { StopHighlight(false); bool nest = (GetMouseFlags() & NestedToggleKey()) ? !IsNestedTabs() : IsNestedTabs(); DockContainerAsTab(*target, dc, nest && dc.GetCount() > 1); } else StopHighlight(false); if (dc.GetParent()) dc.SetFocus(); }
void DockWindow::ContainerDragStart(DockCont &dc) { if (!dc.IsFloating()) { // Reposition if not under the mouse Rect r = dc.GetScreenRect(); Point pt = GetMousePos(); Point tl = r.TopLeft(); bool move = false; if (r.left > pt.x || r.right < pt.x) { tl.x += pt.x - r.left - r.Width()/2; move = true; } if (r.top < pt.y) { tl.y += pt.y - r.top + DOCKCONT_WND_OFFSET; move = true; } // Note: Due to different bugfix, at this point a dragged tab will have docked state but // no parent and should not be animatehld dc.SyncUserSize(true, true); if (IsAnimatedHighlight() && dc.IsDocked() && dc.GetParent()) { Undock0(dc, true); dc.StateNotDocked(); } FloatContainer(dc, move ? tl : Null); dc.StartMouseDrag(pt); } }