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); } }
void DockWindow::Undock(DockCont &c) { if (!c.IsFloating() && !c.IsHidden()) { if (c.IsAutoHide()) { for (int i = 0; i < 4; i++) { int ix = hideframe[i].FindCtrl(c); if (ix >= 0) { hideframe[i].RemoveCtrl(ix); hideframe[i].RefreshFrame(); break; } } } else { int dock = GetDockAlign(c); if (dock >= 0 && dock < 4) { Ctrl *p = &c; while (p && p->GetParent() != &dockpane[dock]) p = p->GetParent(); ASSERT(p); bool v = !IsTB(dock); c.SyncUserSize(v, !v); } Undock0(c); } c.StateNotDocked(); } }
/* * Container management */ DockCont * DockWindow::CreateContainer() { DockCont *dc = &conts.Add(); dc->StateNotDocked(this); SyncContainer(*dc); return dc; }
void DockWindow::Unfloat(DockCont &c) { if (c.IsFloating()) { c.SyncUserSize(true, true); if (c.IsOpen() || c.IsPopUp()) c.Close(); c.StateNotDocked(); } }