void Stack::AddChild( WidgetPtr child ) { int x = 0; int y = 0; if (mWidgets.size() > 0) { WidgetPtr last = mWidgets.back(); if (mOrientation == OrientationVertical) { y = last->GetY() + last->GetHeight() + mSpacing; } else { x = last->GetX() + last->GetWidth() + mSpacing; } } child->SetPosition(x, y); BasicContainer::Add(child); if (mOrientation == OrientationVertical) { SetSize(std::max(GetWidth(), child->GetWidth()), y + child->GetHeight()); } else { SetSize(x + child->GetWidth(), std::max(GetHeight(), child->GetHeight())); } }
void Stack::RebuildLayout() { int x = 0; int y = 0; int w = 0; int h = 0; for (WidgetListIterator it = mWidgets.begin(); it != mWidgets.end(); ++it) { WidgetPtr child = *it; child->SetPosition(x, y); if (mOrientation == OrientationVertical) { y = y + child->GetHeight() + mSpacing; } else { x = x + child->GetWidth() + mSpacing; } w = std::max(child->GetWidth(), w); h = std::max(child->GetHeight(), h); } w = std::max(w, x - mSpacing); SetSize(w, std::max(h, y - mSpacing)); }
void Gui::handleMouseMoved(const MouseInput& mouseInput) { // Check if the mouse leaves the application window. if (!mWidgetWithMouseQueue.empty() && (mouseInput.getX() < 0 || mouseInput.getY() < 0 || !mTop->GetDimension().isPointInRect(mouseInput.getX(), mouseInput.getY())) ) { // Distribute an event to all widgets in the "widget with mouse" queue. while (!mWidgetWithMouseQueue.empty()) { WidgetPtr widget = mWidgetWithMouseQueue.front(); if (Widget::widgetExists(widget)) { distributeMouseEvent(widget, MouseEvent::EXITED, mouseInput.getButton(), mouseInput.getX(), mouseInput.getY(), true, true); } mWidgetWithMouseQueue.pop_front(); } return; } // Check if there is a need to send mouse exited events by // traversing the "widget with mouse" queue. bool widgetWithMouseQueueCheckDone = mWidgetWithMouseQueue.empty(); while (!widgetWithMouseQueueCheckDone) { unsigned int iterations = 0; std::deque<WidgetPtr>::iterator iter; for (iter = mWidgetWithMouseQueue.begin(); iter != mWidgetWithMouseQueue.end(); iter++) { WidgetPtr widget = *iter; // If a widget in the "widget with mouse queue" doesn't // exists anymore it should be removed from the queue. if (!Widget::widgetExists(widget)) { mWidgetWithMouseQueue.erase(iter); break; } else { int x, y; widget->getAbsolutePosition(x, y); if (x > mouseInput.getX() || y > mouseInput.getY() || x + widget->GetWidth() <= mouseInput.getX() || y + widget->GetHeight() <= mouseInput.getY() || !widget->IsVisible()) { distributeMouseEvent(widget, MouseEvent::EXITED, mouseInput.getButton(), mouseInput.getX(), mouseInput.getY(), true, true); mClickCount = 1; mLastMousePressTimeStamp = 0; mWidgetWithMouseQueue.erase(iter); break; } } iterations++; } widgetWithMouseQueueCheckDone = iterations == mWidgetWithMouseQueue.size(); } // Check all widgets below the mouse to see if they are // present in the "widget with mouse" queue. If a widget // is not then it should be added and an entered event should // be sent to it. WidgetPtr parent = GetMouseEventSource(mouseInput.getX(), mouseInput.getY()); WidgetPtr widget = parent; // If a widget has modal mouse input focus then it will // always be returned from getMouseEventSource, but we only wan't to send // mouse entered events if the mouse has actually entered the widget with // modal mouse input focus, hence we need to check if that's the case. If // it's not we should simply ignore to send any mouse entered events. if (mFocusHandler->GetModalMouseInputFocused() && widget == mFocusHandler->GetModalMouseInputFocused() && Widget::widgetExists(widget)) { int x, y; widget->getAbsolutePosition(x, y); if (x > mouseInput.getX() || y > mouseInput.getY() || x + widget->GetWidth() <= mouseInput.getX() || y + widget->GetHeight() <= mouseInput.getY()) { parent.reset(); } } while (parent) { parent = widget->GetParent(); // Check if the widget is present in the "widget with mouse" queue. bool widgetIsPresentInQueue = false; std::deque<WidgetPtr>::iterator iter; for (iter = mWidgetWithMouseQueue.begin(); iter != mWidgetWithMouseQueue.end(); iter++) { if (*iter == widget) { widgetIsPresentInQueue = true; break; } } // Widget is not present, send an entered event and add // it to the "widget with mouse" queue. if (!widgetIsPresentInQueue && Widget::widgetExists(widget)) { distributeMouseEvent(widget, MouseEvent::ENTERED, mouseInput.getButton(), mouseInput.getX(), mouseInput.getY(), true, true); mWidgetWithMouseQueue.push_front(widget); } WidgetPtr swap = widget; widget = parent; parent = (WidgetPtr)swap->GetParent(); } if (mFocusHandler->GetDraggedWidget()) { distributeMouseEvent(mFocusHandler->GetDraggedWidget(), MouseEvent::DRAGGED, mLastMouseDragButton, mouseInput.getX(), mouseInput.getY()); } else { WidgetPtr sourceWidget = GetMouseEventSource(mouseInput.getX(), mouseInput.getY()); distributeMouseEvent(sourceWidget, MouseEvent::MOVED, mouseInput.getButton(), mouseInput.getX(), mouseInput.getY()); } }