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(); } }
int DockWindow::GetDockAlign(const Ctrl &c) const { Ctrl *p = c.GetParent(); while (p && p->GetParent() != this) p = p->GetParent(); for (int i = 0; i < 4; i++) if (dockpane[i].GetParent() == p) return i; return DOCK_NONE; }
void DockCont::AddRemoveButton(Ctrl &c, bool state) { if (state && !c.GetParent()) Add(c); else if (!state) c.Remove(); }
void DockCont::Handle::Paint(Draw& w) { if (IsShown() && dc) { const DockableCtrl::Style &s = dc->GetStyle(); Rect r = GetSize(); const Rect &m = s.handle_margins; Point p; if (s.handle_vert) p = Point(r.left-1 + m.left, r.bottom - m.bottom); else p = Point(r.left + m.left, r.top + m.top); ChPaint(w, r, s.handle[focus]); Image img = dc->GetIcon(); if (!img.IsEmpty()) { if (s.handle_vert) { int isz = r.GetWidth(); p.y -= isz; isz -= (m.left + m.right); ChPaint(w, max(p.x+m.left, r.left), p.y, isz, isz, img); p.y -= 2; } else { int isz = r.GetHeight(); isz -= (m.top + m.bottom); ChPaint(w, p.x, max(p.y, r.top), isz, isz, img); p.x += isz + 2; } } if (!s.title_font.IsNull()) { Ctrl *c = GetLastChild(); while (c && !c->IsShown() && c->GetParent()) c = c->GetNext(); if (s.handle_vert) r.top = c ? c->GetRect().bottom + m.top : m.top; else r.right = c ? c->GetRect().left + m.right : m.right; w.Clip(r); WString text = IsNull(dc->GetGroup()) ? dc->GetTitle() : (WString)Format("%s (%s)", dc->GetTitle(), dc->GetGroup()); w.DrawText(p.x, p.y, s.handle_vert ? 900 : 0, text, s.title_font, s.title_ink[focus]); w.End(); } } }
void PerformDescription() { Ctrl *top = Ctrl::GetActiveWindow(); if(!top) return; Vector<Image> vi; vi.Add(CtrlImg::HelpCursor0()); vi.Add(CtrlImg::HelpCursor1()); if(PointLoop(*top, vi, 300)) { Point p = GetMousePos(); Ctrl *ctrl = Ctrl::GetVisibleChild(top, p - top->GetRect().TopLeft(), true); while(ctrl) { String desc = ctrl->GetDescription(); if(!IsEmpty(desc)) { static QTFPopUp qtf; qtf.SetQTF(desc); qtf.PopUp(top); return; } ctrl = ctrl->GetParent(); } } }
/* * Docking/Undocking helpers */ void DockWindow::Undock0(Ctrl &c, bool do_animatehl, int fsz, bool ishighlight) { int al = GetDockAlign(c); Ctrl *p = c.GetParent(); if (p != &dockpane[al]) { c.Remove(); if (p) { p->Layout(); p->RefreshLayout(); } } else { if (dockpane[al].GetFirstChild() == dockpane[al].GetLastChild()) fsz = 0; dockpane[al].Undock(c, do_animatehl, ishighlight); // TODO: fix nasty hack if (fsz >= 0) { do_animatehl ? StartFrameAnimate(al, fsz) : dockframe[al].SetSize(fsz); if (!do_animatehl && fsz == 0) dockframe[al].Hide(); } } }
//same as above but it does it for a specific Ctrl already Ctrl::LogPos LogPosPopUp::MakeLogPos(Ctrl::LogPos p, const Ctrl& c) { if(!c.GetParent()) return p; //reconvert to logpos using new align return MakeLogPos(p, c.GetPos(), c.GetParent()->GetSize()); }