Exemple #1
0
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++;
}
Exemple #2
0
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);
    }
}
Exemple #5
0
	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();
    }
Exemple #6
0
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);
}
Exemple #7
0
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();
}
Exemple #9
0
 void ScrollArea::drawBackground(Graphics *graphics)
 {
     if (isOpaque())
     {
         graphics->setColor(getBackgroundColor());
         graphics->fillRectangle(getChildrenArea());
     }
 }
Exemple #10
0
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;
    }
}
Exemple #11
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);
    }
}
Exemple #12
0
void Windowiki::setHeight(int height)
{
    gcn::Window::setHeight(height);

    if (mGrip)
    {
        mGrip->setY(getHeight() - mGrip->getHeight() - getChildrenArea().y);
    }
}
Exemple #13
0
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);
    }
}
Exemple #14
0
void Windowiki::setWidth(int width)
{
    gcn::Window::setWidth(width);

    if (mGrip)
    {
        mGrip->setX(getWidth() - mGrip->getWidth() - getChildrenArea().x);
    }
}
Exemple #15
0
    Widget *ScrollArea::getWidgetAt(int x, int y)
    {
        if (getChildrenArea().isPointInRect(x, y))
        {
            return getContent();
        }

        return NULL;
    }
Exemple #16
0
void Window::redraw()
{
    if (mLayout)
    {
        const gcn::Rectangle area = getChildrenArea();
        int w = area.width;
        int h = area.height;
        mLayout->reflow(w, h);
    }
}
Exemple #17
0
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);
}
Exemple #18
0
    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);
}
Exemple #20
0
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));
}
Exemple #22
0
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();
}
Exemple #23
0
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);
    }
}
Exemple #24
0
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);
    }
}
Exemple #25
0
    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;
    }
Exemple #26
0
    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);
    }
Exemple #27
0
    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);
    }
Exemple #28
0
    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;
    }
Exemple #29
0
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;
}