void gcn::Panel::add(gcn::Widget *widget) { // width of current widget exceeds remaining space, go down 1 row int dimx = _nextx + _spacingX + widget->getDimension().width; if(dimx > getChildrenArea().width || (_slotsx > 0 && _usedx >= _slotsx)) { _usedx = 0; _nextx = _spacingX; _usedy++; _nexty += (_maxheight + _spacingY); _maxheight = 0; } // height of current widget exceeds remaining space, whoops int dimy = _nexty + _spacingY + widget->getDimension().height; if(dimy > getChildrenArea().height && _slotsy >= 0 && _usedy >= _slotsy) { throw GCN_EXCEPTION("height exceeded, can't add more widgets"); } widget->setPosition(_nextx, _nexty); Container::add(widget); _maxheight = std::max(_maxheight, widget->getDimension().height); _nextx += (_spacingX + widget->getDimension().width); _usedx++; }
void Window::refreshLayout() { if (!mLayout) return; int width = getChildrenArea().width; int height = getChildrenArea().height; mLayout->reflow(width, height); }
void Windowiki::setDimension(const gcn::Rectangle &dimension) { gcn::Window::setDimension(dimension); if (mGrip) { mGrip->setX(getWidth() - mGrip->getWidth() - getChildrenArea().x); mGrip->setY(getHeight() - mGrip->getHeight() - getChildrenArea().y); } }
void BasicContainer::showWidgetPart(Widget* widget, Rectangle area) { Rectangle widgetArea = getChildrenArea(); area.x += widget->getX(); area.y += widget->getY(); if (area.x + area.width > widgetArea.width) { widget->setX(widget->getX() - area.x - area.width + widgetArea.width); } if (area.y + area.height > widgetArea.height) { widget->setY(widget->getY() - area.y - area.height + widgetArea.height); } if (area.x < 0) { widget->setX(widget->getX() - area.x); } if (area.y < 0) { widget->setY(widget->getY() - area.y); } }
void BasicContainer::DrawChildren( GraphicsPtr graphics ) { graphics->pushClipArea(getChildrenArea()); WidgetListIterator iter; for (iter = mWidgets.begin(); iter != mWidgets.end(); iter++) { if ((*iter)->IsVisible()) { // If the widget has a frame, // draw it before drawing the widget if ((*iter)->GetFrameSize() > 0) { Rectangle rec = (*iter)->GetDimension(); rec.x -= (*iter)->GetFrameSize(); rec.y -= (*iter)->GetFrameSize(); rec.width += 2 * (*iter)->GetFrameSize(); rec.height += 2 * (*iter)->GetFrameSize(); graphics->pushClipArea(rec); (*iter)->DrawFrame(graphics); graphics->popClipArea(); } graphics->pushClipArea((*iter)->GetDimension()); (*iter)->Draw(graphics); graphics->popClipArea(); } } graphics->popClipArea(); }
EquipmentWindow::EquipmentWindow(Equipment *equipment): Window(_("Equipment")), mEquipBox(0), mSelected(-1), mEquipment(equipment), mBoxesNumber(0) { mItemPopup = new ItemPopup; setupWindow->registerWindowForReset(this); // Control that shows the Player PlayerBox *playerBox = new PlayerBox; playerBox->setDimension(gcn::Rectangle(50, 80, 74, 123)); playerBox->setPlayer(local_player); setWindowName("Equipment"); setCloseButton(true); setSaveVisible(true); setDefaultSize(180, 300, ImageRect::CENTER); loadWindowState(); mUnequip = new Button(_("Unequip"), "unequip", this); const gcn::Rectangle &area = getChildrenArea(); mUnequip->setPosition(area.width - mUnequip->getWidth() - 5, area.height - mUnequip->getHeight() - 5); mUnequip->setEnabled(false); add(playerBox); add(mUnequip); }
int Window::getResizeHandles(gcn::MouseEvent &event) { int resizeHandles = 0; const int y = event.getY(); if (mGrip && y > (int) mTitleBarHeight) { const int x = event.getX(); if (!getChildrenArea().isPointInRect(x, y) && event.getSource() == this) { resizeHandles |= (x > getWidth() - resizeBorderWidth) ? RIGHT : (x < resizeBorderWidth) ? LEFT : 0; resizeHandles |= (y > getHeight() - resizeBorderWidth) ? BOTTOM : (y < resizeBorderWidth) ? TOP : 0; } if (event.getSource() == mGrip) { mDragOffsetX = x; mDragOffsetY = y; resizeHandles |= BOTTOM | RIGHT; } } return resizeHandles; }
void BasicContainer::drawChildren(Graphics* graphics) { graphics->pushClipArea(getChildrenArea()); WidgetListIterator iter; for (iter = mWidgets.begin(); iter != mWidgets.end(); iter++) { if ((*iter)->isVisible()) { if ((*iter)->getFrameSize() > 0) { Rectangle rec = (*iter)->getDimension(); rec.x -= (*iter)->getFrameSize(); rec.y -= (*iter)->getFrameSize(); rec.width += 2 * (*iter)->getFrameSize(); rec.height += 2 * (*iter)->getFrameSize(); graphics->pushClipArea(rec); (*iter)->drawFrame(graphics); graphics->popClipArea(); } graphics->pushClipArea((*iter)->getDimension()); (*iter)->draw(graphics); graphics->popClipArea(); } } graphics->popClipArea(); }
void ScrollArea::drawBackground(Graphics *graphics) { if (isOpaque()) { graphics->setColor(getBackgroundColor()); graphics->fillRectangle(getChildrenArea()); } }
void Windowiki::setResizable(bool r) { mResizable = r; if (mResizable) { mGrip = new ResizeGrip(); mGrip->setX(getWidth() - mGrip->getWidth() - getChildrenArea().x); mGrip->setY(getHeight() - mGrip->getHeight() - getChildrenArea().y); gcn::Window::add(mGrip); } else { delete mGrip; mGrip = 0; } }
void ScrollArea::logic() { if (!isVisible()) return; gcn::ScrollArea::logic(); gcn::Widget *content = getContent(); // When no scrollbar in a certain direction, adapt content size to match // the content dimension exactly. if (content) { if (getHorizontalScrollPolicy() == gcn::ScrollArea::SHOW_NEVER) { content->setWidth(getChildrenArea().width - 2 * content->getFrameSize()); } if (getVerticalScrollPolicy() == gcn::ScrollArea::SHOW_NEVER) { content->setHeight(getChildrenArea().height - 2 * content->getFrameSize()); } } if (mUpButtonPressed) { setVerticalScrollAmount(getVerticalScrollAmount() - mUpButtonScrollAmount); } else if (mDownButtonPressed) { setVerticalScrollAmount(getVerticalScrollAmount() + mDownButtonScrollAmount); } else if (mLeftButtonPressed) { setHorizontalScrollAmount(getHorizontalScrollAmount() - mLeftButtonScrollAmount); } else if (mRightButtonPressed) { setHorizontalScrollAmount(getHorizontalScrollAmount() + mRightButtonScrollAmount); } }
void Windowiki::setHeight(int height) { gcn::Window::setHeight(height); if (mGrip) { mGrip->setY(getHeight() - mGrip->getHeight() - getChildrenArea().y); } }
void Window::setResizable(bool r) { if ((bool) mGrip == r) return; if (r) { mGrip = new ResizeGrip(); mGrip->setX(getWidth() - mGrip->getWidth() - getChildrenArea().x); mGrip->setY(getHeight() - mGrip->getHeight() - getChildrenArea().y); add(mGrip); } else { remove(mGrip); destroy(mGrip); } }
void Windowiki::setWidth(int width) { gcn::Window::setWidth(width); if (mGrip) { mGrip->setX(getWidth() - mGrip->getWidth() - getChildrenArea().x); } }
Widget *ScrollArea::getWidgetAt(int x, int y) { if (getChildrenArea().isPointInRect(x, y)) { return getContent(); } return NULL; }
void Window::redraw() { if (mLayout) { const gcn::Rectangle area = getChildrenArea(); int w = area.width; int h = area.height; mLayout->reflow(w, h); } }
void gcn::Panel::draw(Graphics* graphics) { if(IsCovered()) return; // draw self, background if(getBackgroundColor().a) // draw background only if not completely transparent { graphics->setColor(getBackgroundColor()); graphics->fillRectangle(getChildrenArea()); } if(getForegroundColor().a) // draw foreground only if not completely transparent { graphics->setColor(getForegroundColor()); graphics->drawRectangle(getChildrenArea()); } drawChildren(graphics); }
void ScrollArea::mouseWheelMovedDown(MouseEvent& mouseEvent) { if (mouseEvent.isConsumed()) { return; } setVerticalScrollAmount(getVerticalScrollAmount() + getChildrenArea().height / 8); mouseEvent.consume(); }
void EquipmentWindow::widgetResized(const gcn::Event &event) { Window::widgetResized(event); const gcn::Rectangle &area = getChildrenArea(); const int padding = 2 * getPadding(); mInvenScroll->setDimension(gcn::Rectangle(175, 20, area.width - 190, area.height - 80)); mEquipButton->setPosition((area.width - mEquipButton->getWidth() - padding), area.height - mEquipButton->getHeight() - padding); }
void Windowiki::mousePressed(gcn::MouseEvent &event) { // Let Guichan move window to top and figure out title bar drag gcn::Window::mousePressed(event); const int x = event.getX(); const int y = event.getY(); mMouseResize = 0; // Activate resizing handles as appropriate if (event.getSource() == this && isResizable() && event.getButton() == gcn::MouseEvent::LEFT && !getChildrenArea().isPointInRect(x, y)) { mMouseResize |= (x > getWidth() - resizeBorderWidthiki) ? RIGHT : (x < resizeBorderWidthiki) ? LEFT : 0; mMouseResize |= (y > getHeight() - resizeBorderWidthiki) ? BOTTOM : (y < resizeBorderWidthiki) ? TOP : 0; } else if (event.getSource() == mGrip) { mDragOffsetX = x + mGrip->getX(); mDragOffsetY = y + mGrip->getY(); mMouseResize |= BOTTOM | RIGHT; mIsMoving = false; } if (event.getButton() == gcn::MouseEvent::LEFT) { const int x = event.getX(); const int y = event.getY(); // Handle close button if (mCloseButton) { gcn::Rectangle closeButtonRect( getWidth() - closeImage->getWidth() - getPadding(), getPadding(), closeImage->getWidth(), closeImage->getHeight()); if (closeButtonRect.isPointInRect(x, y)) { setVisible(false); } } // Handle window resizing } }
EquipmentWindow::EquipmentWindow(Equipment *equipment, Being *being, bool foring): Window(_("Equipment"), false, nullptr, "equipment.xml"), mEquipment(equipment), mSelected(-1), mForing(foring), mImageSet(nullptr) { mBeing = being; mItemPopup = new ItemPopup; if (setupWindow) setupWindow->registerWindowForReset(this); // Control that shows the Player mPlayerBox = new PlayerBox; mPlayerBox->setDimension(gcn::Rectangle(50, 80, 74, 168)); mPlayerBox->setPlayer(being); if (foring) setWindowName("Being equipment"); else setWindowName("Equipment"); setCloseButton(true); setSaveVisible(true); setStickyButtonLock(true); setDefaultSize(180, 345, ImageRect::CENTER); mBoxes.reserve(BOX_COUNT); for (int f = 0; f < BOX_COUNT; f ++) mBoxes.push_back(nullptr); fillBoxes(); loadWindowState(); mUnequip = new Button(_("Unequip"), "unequip", this); const gcn::Rectangle &area = getChildrenArea(); mUnequip->setPosition(area.width - mUnequip->getWidth() - 5, area.height - mUnequip->getHeight() - 5); mUnequip->setEnabled(false); add(mPlayerBox); add(mUnequip); mHighlightColor = Theme::getThemeColor(Theme::HIGHLIGHT); mBorderColor = Theme::getThemeColor(Theme::BORDER); setForegroundColor(Theme::getThemeColor(Theme::TEXT)); }
void Window::widgetResized(const gcn::Event &event) { const gcn::Rectangle area = getChildrenArea(); if (mGrip) mGrip->setPosition(getWidth() - mGrip->getWidth() - area.x, getHeight() - mGrip->getHeight() - area.y); if (mClose) mClose->setPosition(getWidth() - getPadding() - mClose->getWidth(), getPadding()); refreshLayout(); }
void Window::widgetResized(const gcn::Event &event) { const gcn::Rectangle area = getChildrenArea(); if (mGrip) mGrip->setPosition(getWidth() - mGrip->getWidth() - area.x, getHeight() - mGrip->getHeight() - area.y); if (mLayout) { int w = area.width; int h = area.height; mLayout->reflow(w, h); } }
void Windowiki::loadWindowState() { const std::string &name = mWindowName; setPosition((int) config.getValue(name + "WinX", getX()), (int) config.getValue(name + "WinY", getY())); if (mResizable) { setSize((int) config.getValue(name + "WinWidth", getWidth()), (int) config.getValue(name + "WinHeight", getHeight())); const gcn::Rectangle area = getChildrenArea(); mChrome->setSize(area.width, area.height); } }
int ScrollArea::getHorizontalMaxScroll() { checkPolicies(); if (getContent() == NULL) { return 0; } int value = getContent()->getWidth() - getChildrenArea().width + 2 * getContent()->getFrameSize(); if (value < 0) { return 0; } return value; }
Rectangle ScrollArea::getHorizontalMarkerDimension() { if (!mHBarVisible) { return Rectangle(0, 0, 0, 0); } int length, pos; Rectangle barDim = getHorizontalBarDimension(); if (getContent() && getContent()->getWidth() != 0) { length = (barDim.width * getChildrenArea().width) / getContent()->getWidth(); } else { length = barDim.width; } if (length < mScrollbarWidth) { length = mScrollbarWidth; } if (length > barDim.width) { length = barDim.width; } if (getHorizontalMaxScroll() != 0) { pos = ((barDim.width - length) * getHorizontalScrollAmount()) / getHorizontalMaxScroll(); } else { pos = 0; } return Rectangle(barDim.x + pos, barDim.y, length, mScrollbarWidth); }
Rectangle ScrollArea::getVerticalMarkerDimension() { if (!mVBarVisible) { return Rectangle(0, 0, 0, 0); } int length, pos; Rectangle barDim = getVerticalBarDimension(); if (getContent() && getContent()->getHeight() != 0) { length = (barDim.height * getChildrenArea().height) / getContent()->getHeight(); } else { length = barDim.height; } if (length < mScrollbarWidth) { length = mScrollbarWidth; } if (length > barDim.height) { length = barDim.height; } if (getVerticalMaxScroll() != 0) { pos = ((barDim.height - length) * getVerticalScrollAmount()) / getVerticalMaxScroll(); } else { pos = 0; } return Rectangle(barDim.x, barDim.y + pos, mScrollbarWidth, length); }
int ScrollArea::getVerticalMaxScroll() { checkPolicies(); if (getContent() == NULL) { return 0; } int value; value = getContent()->getHeight() - getChildrenArea().height + 2 * getContent()->getFrameSize(); if (value < 0) { return 0; } return value; }
void Window::widgetShown(const gcn::Event& event) { mVisible = true; requestMoveToTop(); requestFocus(); int widgetX, widgetY; getAbsolutePosition(widgetX, widgetY); widgetX = gui->getMouseX() - widgetX; widgetY = gui->getMouseY() - widgetY; if (getChildrenArea().isPointInRect(widgetX, widgetY)) { gcn::MouseEvent mouseEvent(this, false, false, false, false, gcn::MouseEvent::MOVED, 0, widgetX, widgetY, 0); mouseMoved(mouseEvent); } }
Widget *BasicContainer::getWidgetAt(int x, int y) { Rectangle r = getChildrenArea(); if (!r.isPointInRect(x, y)) { return NULL; } x -= r.x; y -= r.y; WidgetListReverseIterator it; for (it = mWidgets.rbegin(); it != mWidgets.rend(); it++) { if ((*it)->isVisible() && (*it)->getDimension().isPointInRect(x, y)) { return (*it); } } return NULL; }