bool WidgetList::Update(const Point2i& mousePosition, const Point2i& lastMousePosition) { Rectanglei clip; Rectanglei wlr = GetClip(clip); if (!wlr.GetSizeX() || !wlr.GetSizeY()) return false; // Redraw the background bool updated = false; if (need_redrawing) RedrawBackground(wlr); for (std::list<Widget*>::const_iterator w=widget_list.begin(); w != widget_list.end(); w++) { Rectanglei r((*w)->GetPosition(), (*w)->GetSize()); r.Clip(wlr); if (r.GetSizeX() && r.GetSizeY()) { SwapWindowClip(r); updated |= (*w)->Update(mousePosition, lastMousePosition); SwapWindowClip(r); } } if (updated) RedrawForeground(); // Restore initial clip rectangle UnsetClip(clip); need_redrawing = false; return updated; }
void MultiTabs::Update(const Point2i &mousePosition, const Point2i &lastMousePosition) { Rectanglei header(position.x, position.y, next_tab_bt->GetPositionX() + next_tab_bt->GetSizeX() - position.x, prev_tab_bt->GetSizeY()); if (need_redrawing) { Widget::Update(mousePosition, lastMousePosition); } else if ((header.Contains(mousePosition) && mousePosition != lastMousePosition) || (header.Contains(lastMousePosition) && !header.Contains(mousePosition))) { RedrawBackground(header); DrawHeader(mousePosition); RedrawForeground(); } if (!tabs.empty()) tabs[current_tab].box->Update(mousePosition, lastMousePosition); need_redrawing = false; }