void ListItem::onResize(ResizeEvent& ev) { setBoundsQuietly(ev.getBounds()); Rect crect = getChildrenBounds(); UI_FOREACH_WIDGET(getChildren(), it) (*it)->setBounds(crect); }
void ListBox::onResize(ResizeEvent& ev) { setBoundsQuietly(ev.getBounds()); Rect cpos = getChildrenBounds(); UI_FOREACH_WIDGET(getChildren(), it) { Widget* child = *it; cpos.h = child->getPreferredSize().h; child->setBounds(cpos); cpos.y += child->getBounds().h + this->childSpacing(); }
void Menu::onResize(ResizeEvent& ev) { setBoundsQuietly(ev.getBounds()); Rect cpos = getChildrenBounds(); bool isBar = (getParent()->type == kMenuBarWidget); UI_FOREACH_WIDGET(getChildren(), it) { Widget* child = *it; Size reqSize = child->getPreferredSize(); if (isBar) cpos.w = reqSize.w; else cpos.h = reqSize.h; child->setBounds(cpos); if (isBar) cpos.x += cpos.w; else cpos.y += cpos.h; }
void Window::onHitTest(HitTestEvent& ev) { HitTest ht = HitTestNowhere; if (!m_isMoveable) { ev.setHit(ht); return; } int x = ev.getPoint().x; int y = ev.getPoint().y; gfx::Rect pos = getBounds(); gfx::Rect cpos = getChildrenBounds(); // Move if ((hasText()) && (((x >= cpos.x) && (x < cpos.x2()) && (y >= pos.y+this->border_width.b) && (y < cpos.y)))) { ht = HitTestCaption; } // Resize else if (m_isSizeable) { if ((x >= pos.x) && (x < cpos.x)) { if ((y >= pos.y) && (y < cpos.y)) ht = HitTestBorderNW; else if ((y > cpos.y2()-1) && (y <= pos.y2()-1)) ht = HitTestBorderSW; else ht = HitTestBorderW; } else if ((y >= pos.y) && (y < cpos.y)) { if ((x >= pos.x) && (x < cpos.x)) ht = HitTestBorderNW; else if ((x > cpos.x2()-1) && (x <= pos.x2()-1)) ht = HitTestBorderNE; else ht = HitTestBorderN; } else if ((x > cpos.x2()-1) && (x <= pos.x2()-1)) { if ((y >= pos.y) && (y < cpos.y)) ht = HitTestBorderNE; else if ((y > cpos.y2()-1) && (y <= pos.y2()-1)) ht = HitTestBorderSE; else ht = HitTestBorderE; } else if ((y > cpos.y2()-1) && (y <= pos.y2()-1)) { if ((x >= pos.x) && (x < cpos.x)) ht = HitTestBorderSW; else if ((x > cpos.x2()-1) && (x <= pos.x2()-1)) ht = HitTestBorderSE; else ht = HitTestBorderS; } } else { // Client area ht = HitTestClient; } ev.setHit(ht); }
void Window::onHitTest(HitTestEvent& ev) { HitTest ht = HitTestNowhere; // If this window is not movable or we are not completely visible. if (!m_isMoveable || // TODO check why this is necessary, there should be a bug in // the manager where we are receiving mouse events and are not // the top most window. getManager()->pick(ev.getPoint()) != this) { ev.setHit(ht); return; } int x = ev.getPoint().x; int y = ev.getPoint().y; gfx::Rect pos = getBounds(); gfx::Rect cpos = getChildrenBounds(); // Move if ((hasText()) && (((x >= cpos.x) && (x < cpos.x2()) && (y >= pos.y+this->border_width.b) && (y < cpos.y)))) { ht = HitTestCaption; } // Resize else if (m_isSizeable) { if ((x >= pos.x) && (x < cpos.x)) { if ((y >= pos.y) && (y < cpos.y)) ht = HitTestBorderNW; else if ((y > cpos.y2()-1) && (y <= pos.y2()-1)) ht = HitTestBorderSW; else ht = HitTestBorderW; } else if ((y >= pos.y) && (y < cpos.y)) { if ((x >= pos.x) && (x < cpos.x)) ht = HitTestBorderNW; else if ((x > cpos.x2()-1) && (x <= pos.x2()-1)) ht = HitTestBorderNE; else ht = HitTestBorderN; } else if ((x > cpos.x2()-1) && (x <= pos.x2()-1)) { if ((y >= pos.y) && (y < cpos.y)) ht = HitTestBorderNE; else if ((y > cpos.y2()-1) && (y <= pos.y2()-1)) ht = HitTestBorderSE; else ht = HitTestBorderE; } else if ((y > cpos.y2()-1) && (y <= pos.y2()-1)) { if ((x >= pos.x) && (x < cpos.x)) ht = HitTestBorderSW; else if ((x > cpos.x2()-1) && (x <= pos.x2()-1)) ht = HitTestBorderSE; else ht = HitTestBorderS; } } else { // Client area ht = HitTestClient; } ev.setHit(ht); }
bool Slider::onProcessMessage(Message* msg) { switch (msg->type()) { case kFocusEnterMessage: case kFocusLeaveMessage: if (isEnabled()) invalidate(); break; case kMouseDownMessage: if (!isEnabled() || isReadOnly()) return true; setSelected(true); captureMouse(); { gfx::Point mousePos = static_cast<MouseMessage*>(msg)->position(); slider_press_x = mousePos.x; slider_press_value = m_value; slider_press_left = static_cast<MouseMessage*>(msg)->left(); } setupSliderCursor(); // Fall through case kMouseMoveMessage: if (hasCapture()) { int value, accuracy, range; gfx::Rect rc = getChildrenBounds(); gfx::Point mousePos = static_cast<MouseMessage*>(msg)->position(); range = m_max - m_min + 1; // With left click if (slider_press_left) { value = m_min + range * (mousePos.x - rc.x) / rc.w; } // With right click else { accuracy = MID(1, rc.w / range, rc.w); value = slider_press_value + (mousePos.x - slider_press_x) / accuracy; } value = MID(m_min, value, m_max); if (m_value != value) { setValue(value); onChange(); } return true; } break; case kMouseUpMessage: if (hasCapture()) { setSelected(false); releaseMouse(); setupSliderCursor(); onSliderReleased(); } break; case kMouseEnterMessage: case kMouseLeaveMessage: // TODO theme stuff if (isEnabled()) invalidate(); break; case kKeyDownMessage: if (hasFocus() && !isReadOnly()) { int min = m_min; int max = m_max; int value = m_value; switch (static_cast<KeyMessage*>(msg)->scancode()) { case kKeyLeft: value = MAX(value-1, min); break; case kKeyRight: value = MIN(value+1, max); break; case kKeyPageDown: value = MAX(value-(max-min+1)/4, min); break; case kKeyPageUp: value = MIN(value+(max-min+1)/4, max); break; case kKeyHome: value = min; break; case kKeyEnd: value = max; break; default: goto not_used; } if (m_value != value) { setValue(value); onChange(); } return true; } break; case kMouseWheelMessage: if (isEnabled() && !isReadOnly()) { int value = m_value + static_cast<MouseMessage*>(msg)->wheelDelta().x - static_cast<MouseMessage*>(msg)->wheelDelta().y; value = MID(m_min, value, m_max); if (m_value != value) { this->setValue(value); onChange(); } return true; } break; case kSetCursorMessage: setupSliderCursor(); return true; } not_used:; return Widget::onProcessMessage(msg); }