diff options
Diffstat (limited to 'src/gui/widgets')
-rw-r--r-- | src/gui/widgets/layout.cpp | 65 | ||||
-rw-r--r-- | src/gui/widgets/layout.h | 172 | ||||
-rw-r--r-- | src/gui/widgets/layoutcell.cpp | 131 | ||||
-rw-r--r-- | src/gui/widgets/layoutcell.h | 196 |
4 files changed, 330 insertions, 234 deletions
diff --git a/src/gui/widgets/layout.cpp b/src/gui/widgets/layout.cpp index d2f09864b..eb61bd4d5 100644 --- a/src/gui/widgets/layout.cpp +++ b/src/gui/widgets/layout.cpp @@ -32,71 +32,6 @@ #include "debug.h" -LayoutCell::~LayoutCell() -{ - if (mType == ARRAY) - delete2(mArray) -} - -LayoutArray &LayoutCell::getArray() -{ - assert(mType != WIDGET); - if (mType == ARRAY) - return *mArray; - - mArray = new LayoutArray; - mType = ARRAY; - mExtent[0] = 1; - mExtent[1] = 1; - mHPadding = 0; - mVPadding = 0; - mAlign[0] = FILL; - mAlign[1] = FILL; - return *mArray; -} - -void LayoutCell::reflow(int nx, int ny, int nw, int nh) -{ - if (mType == NONE) - return; - - nx += mHPadding; - ny += mVPadding; - nw -= 2 * mHPadding; - nh -= 2 * mVPadding; - if (mType == ARRAY) - mArray->reflow(nx, ny, nw, nh); - else - mWidget->setDimension(Rect(nx, ny, nw, nh)); -} - -void LayoutCell::computeSizes() -{ - if (mType != ARRAY) - return; - - std::vector <std::vector <LayoutCell *> >::const_iterator - i = mArray->mCells.begin(); - const std::vector <std::vector <LayoutCell *> >::const_iterator - i_end = mArray->mCells.end(); - while (i != i_end) - { - std::vector <LayoutCell *>::const_iterator j = i->begin(); - while (j != i->end()) - { - LayoutCell *const cell = *j; - if (cell && cell->mType == ARRAY) - cell->computeSizes(); - - ++j; - } - ++i; - } - - mSize[0] = mArray->getSize(0); - mSize[1] = mArray->getSize(1); -} - LayoutArray::LayoutArray(): mCells(), mSpacing(4) diff --git a/src/gui/widgets/layout.h b/src/gui/widgets/layout.h index bf41e1c8e..c41c6570f 100644 --- a/src/gui/widgets/layout.h +++ b/src/gui/widgets/layout.h @@ -23,12 +23,13 @@ #ifndef GUI_WIDGETS_LAYOUT_H #define GUI_WIDGETS_LAYOUT_H -#include "localconsts.h" +#include "gui/widgets/layoutcell.h" #include <vector> +#include "localconsts.h" + class BasicContainer2; -class LayoutCell; class Widget; /** @@ -121,173 +122,6 @@ class LayoutArray final }; /** - * This class describes the formatting of a widget in the cell of a layout - * table. Horizontally, a widget can either fill the width of the cell (minus - * the cell padding), or it can retain its size and be flushed left, or flush - * right, or centered in the cell. The process is similar for the vertical - * alignment, except that top is represented by LEFT and bottom by RIGHT. - */ -class LayoutCell -{ - friend class Layout; - friend class LayoutArray; - - public: - enum Alignment - { - LEFT = 0, - RIGHT, - CENTER, - FILL - }; - - virtual ~LayoutCell(); - - /** - * Sets the padding around the cell content. - */ - LayoutCell &setPadding(int p) - { mHPadding = p; mVPadding = p; return *this; } - - /** - * Sets the vertical padding around the cell content. - */ - LayoutCell &setVPadding(int p) - { mVPadding = p; return *this; } - - /** - * Sets the horisontal padding around the cell content. - */ - LayoutCell &setHPadding(int p) - { mHPadding = p; return *this; } - - /** - * Sets the horizontal alignment of the cell content. - */ - LayoutCell &setHAlign(const Alignment a) - { mAlign[0] = a; return *this; } - - /** - * Sets the vertical alignment of the cell content. - */ - LayoutCell &setVAlign(const Alignment a) - { mAlign[1] = a; return *this; } - - /** - * @see LayoutArray::at - */ - LayoutCell &at(const int x, const int y) A_WARN_UNUSED - { return getArray().at(x, y); } - - /** - * @see LayoutArray::place - */ - LayoutCell &place(Widget *wg, - const int x, const int y, - const int w = 1, const int h = 1) - { return getArray().place(wg, x, y, w, h); } - - /** - * @see LayoutArray::matchColWidth - */ - void matchColWidth(const int n1, const int n2) - { getArray().matchColWidth(n1, n2); } - - /** - * @see LayoutArray::setColWidth - */ - void setColWidth(const int n, const int w) - { getArray().setColWidth(n, w); } - - /** - * @see LayoutArray::setRowHeight - */ - void setRowHeight(const int n, const int h) - { getArray().setRowHeight(n, h); } - - /** - * @see LayoutArray::extend. - */ - void extend(const int x, const int y, - const int w, const int h) - { getArray().extend(x, y, w, h); } - - /** - * Sets the minimum widths and heights of this cell and of all the - * inner cells. - */ - void computeSizes(); - - void setType(int t) - { mType = t; } - - int getWidth() const A_WARN_UNUSED - { return mExtent[0]; } - - int getHeight() const A_WARN_UNUSED - { return mExtent[1]; } - - void setWidth(const int w) - { mExtent[0] = w; } - - void setHeight(const int h) - { mExtent[1] = h; } - - enum - { - NONE = 0, - WIDGET, - ARRAY - }; - - private: - LayoutCell(): - mWidget(nullptr), - mHPadding(0), - mVPadding(0), - mType(NONE) - { - mExtent[0] = 0; - mExtent[1] = 0; - mAlign[0] = LEFT; - mAlign[1] = LEFT; - mNbFill[0] = 0; - mNbFill[1] = 0; - mSize[0] = 0; - mSize[1] = 0; - } - - // Copy not allowed, as the cell may own an array. - explicit LayoutCell(LayoutCell const &); - LayoutCell &operator=(LayoutCell const &); - - union - { - Widget *mWidget; - LayoutArray *mArray; - }; - - /** - * Returns the embedded array. Creates it if the cell does not contain - * anything yet. Aborts if it contains a widget. - */ - LayoutArray &getArray(); - - /** - * @see LayoutArray::reflow - */ - void reflow(int nx, int ny, int nw, int nh); - - int mSize[2]; - int mHPadding; - int mVPadding; - int mExtent[2]; - Alignment mAlign[2]; - int mNbFill[2]; - int mType; -}; - -/** * This class is an helper for setting the position of widgets. They are * positioned along the cells of some rectangular tables. The layout may either * be a single table or a tree of nested tables. diff --git a/src/gui/widgets/layoutcell.cpp b/src/gui/widgets/layoutcell.cpp new file mode 100644 index 000000000..58ba6976e --- /dev/null +++ b/src/gui/widgets/layoutcell.cpp @@ -0,0 +1,131 @@ +/* + * The ManaPlus Client + * Copyright (C) 2007-2009 The Mana World Development Team + * Copyright (C) 2009-2010 The Mana Developers + * Copyright (C) 2011-2014 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "gui/widgets/layoutcell.h" + +#include "gui/widgets/layout.h" +#include "gui/widgets/widget.h" + +#include "utils/delete2.h" + +#include "debug.h" + +static LayoutArray tempArray; + +LayoutCell::~LayoutCell() +{ + if (mType == ARRAY) + delete2(mArray) +} + +LayoutArray &LayoutCell::getArray() +{ + if (mType == WIDGET) + return tempArray; + if (mType == ARRAY) + return *mArray; + + mArray = new LayoutArray; + mType = ARRAY; + mExtent[0] = 1; + mExtent[1] = 1; + mHPadding = 0; + mVPadding = 0; + mAlign[0] = FILL; + mAlign[1] = FILL; + return *mArray; +} + +void LayoutCell::reflow(int nx, int ny, int nw, int nh) +{ + if (mType == NONE) + return; + + nx += mHPadding; + ny += mVPadding; + nw -= 2 * mHPadding; + nh -= 2 * mVPadding; + if (mType == ARRAY) + mArray->reflow(nx, ny, nw, nh); + else + mWidget->setDimension(Rect(nx, ny, nw, nh)); +} + +void LayoutCell::computeSizes() +{ + if (mType != ARRAY) + return; + + std::vector <std::vector <LayoutCell *> >::const_iterator + i = mArray->mCells.begin(); + const std::vector <std::vector <LayoutCell *> >::const_iterator + i_end = mArray->mCells.end(); + while (i != i_end) + { + std::vector <LayoutCell *>::const_iterator j = i->begin(); + while (j != i->end()) + { + LayoutCell *const cell = *j; + if (cell && cell->mType == ARRAY) + cell->computeSizes(); + + ++j; + } + ++i; + } + + mSize[0] = mArray->getSize(0); + mSize[1] = mArray->getSize(1); +} + +LayoutCell &LayoutCell::at(const int x, const int y) +{ + return getArray().at(x, y); +} + +LayoutCell &LayoutCell::place(Widget *wg, + const int x, const int y, + const int w, const int h) +{ + return getArray().place(wg, x, y, w, h); +} + +void LayoutCell::matchColWidth(const int n1, const int n2) +{ + getArray().matchColWidth(n1, n2); +} + +void LayoutCell::setColWidth(const int n, const int w) +{ + getArray().setColWidth(n, w); +} + +void LayoutCell::setRowHeight(const int n, const int h) +{ + getArray().setRowHeight(n, h); +} + +void LayoutCell::extend(const int x, const int y, + const int w, const int h) +{ + getArray().extend(x, y, w, h); +} diff --git a/src/gui/widgets/layoutcell.h b/src/gui/widgets/layoutcell.h new file mode 100644 index 000000000..f262ebb05 --- /dev/null +++ b/src/gui/widgets/layoutcell.h @@ -0,0 +1,196 @@ +/* + * The ManaPlus Client + * Copyright (C) 2007-2009 The Mana World Development Team + * Copyright (C) 2009-2010 The Mana Developers + * Copyright (C) 2011-2014 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef GUI_WIDGETS_LAYOUTCELL_H +#define GUI_WIDGETS_LAYOUTCELL_H + +#include "localconsts.h" + +#include <vector> + +class BasicContainer2; +class LayoutArray; +class LayoutCell; +class Widget; + +/** + * This class describes the formatting of a widget in the cell of a layout + * table. Horizontally, a widget can either fill the width of the cell (minus + * the cell padding), or it can retain its size and be flushed left, or flush + * right, or centered in the cell. The process is similar for the vertical + * alignment, except that top is represented by LEFT and bottom by RIGHT. + */ +class LayoutCell +{ + friend class Layout; + friend class LayoutArray; + + public: + enum Alignment + { + LEFT = 0, + RIGHT, + CENTER, + FILL + }; + + virtual ~LayoutCell(); + + /** + * Sets the padding around the cell content. + */ + LayoutCell &setPadding(int p) + { mHPadding = p; mVPadding = p; return *this; } + + /** + * Sets the vertical padding around the cell content. + */ + LayoutCell &setVPadding(int p) + { mVPadding = p; return *this; } + + /** + * Sets the horisontal padding around the cell content. + */ + LayoutCell &setHPadding(int p) + { mHPadding = p; return *this; } + + /** + * Sets the horizontal alignment of the cell content. + */ + LayoutCell &setHAlign(const Alignment a) + { mAlign[0] = a; return *this; } + + /** + * Sets the vertical alignment of the cell content. + */ + LayoutCell &setVAlign(const Alignment a) + { mAlign[1] = a; return *this; } + + /** + * @see LayoutArray::at + */ + LayoutCell &at(const int x, const int y) A_WARN_UNUSED; + + /** + * @see LayoutArray::place + */ + LayoutCell &place(Widget *wg, + const int x, const int y, + const int w = 1, const int h = 1); + + /** + * @see LayoutArray::matchColWidth + */ + void matchColWidth(const int n1, const int n2); + + /** + * @see LayoutArray::setColWidth + */ + void setColWidth(const int n, const int w); + + /** + * @see LayoutArray::setRowHeight + */ + void setRowHeight(const int n, const int h); + + /** + * @see LayoutArray::extend. + */ + void extend(const int x, const int y, + const int w, const int h); + + /** + * Sets the minimum widths and heights of this cell and of all the + * inner cells. + */ + void computeSizes(); + + void setType(int t) + { mType = t; } + + int getWidth() const A_WARN_UNUSED + { return mExtent[0]; } + + int getHeight() const A_WARN_UNUSED + { return mExtent[1]; } + + void setWidth(const int w) + { mExtent[0] = w; } + + void setHeight(const int h) + { mExtent[1] = h; } + + enum + { + NONE = 0, + WIDGET, + ARRAY + }; + + private: + LayoutCell(): + mWidget(nullptr), + mHPadding(0), + mVPadding(0), + mType(NONE) + { + mExtent[0] = 0; + mExtent[1] = 0; + mAlign[0] = LEFT; + mAlign[1] = LEFT; + mNbFill[0] = 0; + mNbFill[1] = 0; + mSize[0] = 0; + mSize[1] = 0; + } + + // Copy not allowed, as the cell may own an array. + explicit LayoutCell(LayoutCell const &); + LayoutCell &operator=(LayoutCell const &); + + union + { + Widget *mWidget; + LayoutArray *mArray; + }; + + /** + * Returns the embedded array. Creates it if the cell does not contain + * anything yet. Aborts if it contains a widget. + */ + LayoutArray &getArray(); + + /** + * @see LayoutArray::reflow + */ + void reflow(int nx, int ny, int nw, int nh); + + int mSize[2]; + int mHPadding; + int mVPadding; + int mExtent[2]; + Alignment mAlign[2]; + int mNbFill[2]; + int mType; +}; + +#endif // GUI_WIDGETS_LAYOUTCELL_H |