/************************************************************************* Handler for mouse button down events *************************************************************************/ void FrameWindow::onMouseButtonDown(MouseEventArgs& e) { // default processing (this is now essential as it controls event firing). Window::onMouseButtonDown(e); if (e.button == LeftButton) { if (isSizingEnabled()) { // get position of mouse as co-ordinates local to this window. Point localPos(CoordConverter::screenToWindow(*this, e.position)); // if the mouse is on the sizing border if (getSizingBorderAtPoint(localPos) != SizingNone) { // ensure all inputs come to us for now if (captureInput()) { // setup the 'dragging' state variables d_beingSized = true; d_dragPoint = localPos; e.handled = true; } } } } }
/************************************************************************* Set the appropriate mouse cursor for the given window-relative pixel point. *************************************************************************/ void FrameWindow::setCursorForPoint(const Point& pt) const { switch(getSizingBorderAtPoint(pt)) { case SizingTop: case SizingBottom: MouseCursor::getSingleton().setImage(d_nsSizingCursor); break; case SizingLeft: case SizingRight: MouseCursor::getSingleton().setImage(d_ewSizingCursor); break; case SizingTopLeft: case SizingBottomRight: MouseCursor::getSingleton().setImage(d_nwseSizingCursor); break; case SizingTopRight: case SizingBottomLeft: MouseCursor::getSingleton().setImage(d_neswSizingCursor); break; default: MouseCursor::getSingleton().setImage(getMouseCursor()); break; } }
/************************************************************************* Set the appropriate mouse cursor for the given window-relative pixel point. *************************************************************************/ void FrameWindow::setCursorForPoint(const Vector2f& pt) const { switch(getSizingBorderAtPoint(pt)) { case SizingTop: case SizingBottom: getGUIContext(). getMouseCursor().setImage(d_nsSizingCursor); break; case SizingLeft: case SizingRight: getGUIContext(). getMouseCursor().setImage(d_ewSizingCursor); break; case SizingTopLeft: case SizingBottomRight: getGUIContext(). getMouseCursor().setImage(d_nwseSizingCursor); break; case SizingTopRight: case SizingBottomLeft: getGUIContext(). getMouseCursor().setImage(d_neswSizingCursor); break; default: getGUIContext(). getMouseCursor().setImage(getMouseCursor()); break; } }
/************************************************************************* Handler for mouse move events *************************************************************************/ void FrameWindow::onMouseMove(MouseEventArgs& e) { // default processing (this is now essential as it controls event firing). Window::onMouseMove(e); // if we are not the window containing the mouse, do NOT change the cursor if (getGUIContext().getWindowContainingMouse() != this) { return; } if (isSizingEnabled()) { Vector2f localMousePos(CoordConverter::screenToWindow(*this, e.position)); if (d_beingSized) { SizingLocation dragEdge = getSizingBorderAtPoint(d_dragPoint); // calculate sizing deltas... float deltaX = localMousePos.d_x - d_dragPoint.d_x; float deltaY = localMousePos.d_y - d_dragPoint.d_y; URect new_area(d_area); bool top_left_sizing = false; // size left or right edges if (isLeftSizingLocation(dragEdge)) { top_left_sizing |= moveLeftEdge(deltaX, new_area); } else if (isRightSizingLocation(dragEdge)) { top_left_sizing |= moveRightEdge(deltaX, new_area); } // size top or bottom edges if (isTopSizingLocation(dragEdge)) { top_left_sizing |= moveTopEdge(deltaY, new_area); } else if (isBottomSizingLocation(dragEdge)) { top_left_sizing |= moveBottomEdge(deltaY, new_area); } setArea_impl(new_area.d_min, new_area.getSize(), top_left_sizing); } else { setCursorForPoint(localMousePos); } } // mark event as handled ++e.handled; }
/************************************************************************* Handler for mouse move events *************************************************************************/ void FrameWindow::onMouseMove(MouseEventArgs& e) { // default processing (this is now essential as it controls event firing). Window::onMouseMove(e); // if we are not the window containing the mouse, do NOT change the cursor if (System::getSingleton().getWindowContainingMouse() != this) { return; } if (isSizingEnabled()) { Point localMousePos(CoordConverter::screenToWindow(*this, e.position)); if (d_beingSized) { SizingLocation dragEdge = getSizingBorderAtPoint(d_dragPoint); // calculate sizing deltas... float deltaX = localMousePos.d_x - d_dragPoint.d_x; float deltaY = localMousePos.d_y - d_dragPoint.d_y; // size left or right edges if (isLeftSizingLocation(dragEdge)) { moveLeftEdge(deltaX); } else if (isRightSizingLocation(dragEdge)) { moveRightEdge(deltaX); } // size top or bottom edges if (isTopSizingLocation(dragEdge)) { moveTopEdge(deltaY); } else if (isBottomSizingLocation(dragEdge)) { moveBottomEdge(deltaY); } } else { setCursorForPoint(localMousePos); } } // mark event as handled e.handled = true; }