void DropGrid::PopUpGrid::PopUp(Ctrl *owner, const Rect &r) { Close(); SetRect(r); Ctrl::PopUp(owner, true, true, GUI_DropShadows()); SetFocus(); }
void MenuBar::PopUp(Ctrl *owner, Point p, Size rsz) { bool szcx = true; bool szcy = true; bool szx = false; bool szy = false; if(parentmenu) { if(parentmenu->IsChild()) szcx = false; else szcy = false; WhenHelp = parentmenu->WhenHelp; } Rect r = GetWorkArea(p); restorefocus = GetFocusCtrl(); LLOG("PopUp " << UPP::Name(this) << " set restorefocus:" << UPP::Name(restorefocus)); DistributeAccessKeys(); frame.Set(style->popupframe); if(GUI_GlobalStyle() >= GUISTYLE_XP) SetFrame(frame); else SetFrame(OutsetFrame()); pane.SubMenu(); Size sz = pane.Repos(false, r.Height()); pane.RightPos(0, sz.cx).BottomPos(0, sz.cy); Size sz0 = sz; sz = AddFrameSize(sz); if(p.y + sz.cy > r.bottom) { if(p.y - r.top > r.bottom - p.y) { int y0; if (parentmenu && parentmenu->GetActiveSubmenu() && parentmenu->submenuitem) y0 = parentmenu->submenuitem->GetScreenRect().BottomRight().y + 2 + rsz.cy; else y0 = p.y + rsz.cy; szy = szcy; sz = pane.Repos(false, y0 - max(y0 - sz.cy, r.top) - (sz.cy - sz0.cy)); pane.RightPos(0, sz.cx).TopPos(0, sz.cy); sz = AddFrameSize(sz); p.y = y0 - sz.cy; } else { sz = pane.Repos(false, r.bottom - p.y - (sz.cy - sz0.cy)); pane.RightPos(0, sz.cx).BottomPos(0, sz.cy); sz = AddFrameSize(sz); } } if(p.x + sz.cx > r.right) { p.x = max(p.x + rsz.cx - sz.cx, r.left); szx = szcx; pane.LeftPos(0, sz.cx); } bool eff = parentmenu == NULL || parentmenu->doeffect; if(eff && GUI_PopUpEffect() == GUIEFFECT_SLIDE) SetRect(szx ? p.x + sz.cx : p.x, szy ? p.y + sz.cy : p.y, parentmenu ? sz.cx : 1, 1); else SetRect(p.x, p.y, sz.cx, sz.cy); #ifdef PLATFORM_WIN32 DWORD dummy; CloseHandle(CreateThread(NULL, 0, PlaySoundThread, NULL, 0, &dummy)); #endif doeffect = true; Ctrl::PopUp(owner, true, true, GUI_DropShadows(), !owner); GuiPlatformAfterMenuPopUp(); if(eff) Animate(*this, p.x, p.y, sz.cx, sz.cy); }