diff options
author | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2014-03-04 12:59:32 +0000 |
---|---|---|
committer | andreas <andreas@daaaf23c-2e50-4459-9457-1e69db5a47bf> | 2014-03-04 12:59:32 +0000 |
commit | c543117ff43c63a053ea786ed606398ac4687494 (patch) | |
tree | bf13926dff41782831fbf5fc37c274f09f7a0360 /src/gui/framework |
added source code
git-svn-id: file:///var/local/svn/basicwriter@12 daaaf23c-2e50-4459-9457-1e69db5a47bf
Diffstat (limited to 'src/gui/framework')
-rw-r--r-- | src/gui/framework/TileTreeNode.cpp | 115 | ||||
-rw-r--r-- | src/gui/framework/TileTreeNode.hpp | 74 |
2 files changed, 189 insertions, 0 deletions
diff --git a/src/gui/framework/TileTreeNode.cpp b/src/gui/framework/TileTreeNode.cpp new file mode 100644 index 0000000..58abf65 --- /dev/null +++ b/src/gui/framework/TileTreeNode.cpp @@ -0,0 +1,115 @@ +/* + BasicWriter + Copyright (C) 2014 Benjamin Paaßen, Andreas Stöckel + + 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 3 of the License, or + (at your option) 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 "TileTreeNode.hpp" + +namespace TiledUI { + +TileTreeNode::TileTreeNode() : + parent(nullptr); +{ + // Do nothing here +} + +TileTreeNode::TileTreeNode(TileTreeNode *parent) : + TileTreeNode() +{ + setParent(parent); +} + +TileTreeNode::~TileTreeNode() +{ + // Free the memory for all children + for (auto &c : children) { + delete c; + } +} + +void TileTreeNode::setParent(TileTreeNode *newParent) +{ + // Automatically remove this child from the old parent + if (parent) { + parent->removeChild(this); + } + + // Add this element to the new parent + if (newParent) { + newParent->addChild(this); + } + + // The current parent is the new parent + parent = newParent; +} + +bool TileTreeNode::removeChild(GridTreeNode *node, bool recursive) +{ + // Iterate of the current container and remove the given node + const int idx = indexOf(node); + if (indexOf(node) >= 0) { + children.erase(children.begin() + idx); + return true; + } + + // Descend into the tree if the recursive flag is set to true and the node + // was not yet found + if (recursive) { + for (auto &c : children) { + if (c.removeChild(node, true)) { + return true; + } + } + } + + return false; +} + +void TileTreeNode::addChild(TileTreeNode *child, int idx) +{ + // Make sure the given child is only inserted once into the tree + removeChild(child, true); + + // Insert the child at the given position, or at the end if idx < 0 + if (idx < 0) { + children.push_back(child); + } else { + children.insert(children.begin() + idx, child); + } +} + +int TileTreeNode::indexOf(TileTreeNode *child) +{ + int i = 0; + for (auto it = children.begin(); it != children.end(); it++, i++) { + if (*it == node) { + return i; + } + } + return -1; +} + +void TileTreeNode::parentWidget() +{ + if (parent) + { + return parent->parentWidget(); + } + return nullptr; +} + +} + diff --git a/src/gui/framework/TileTreeNode.hpp b/src/gui/framework/TileTreeNode.hpp new file mode 100644 index 0000000..07586e1 --- /dev/null +++ b/src/gui/framework/TileTreeNode.hpp @@ -0,0 +1,74 @@ +/* + BasicWriter + Copyright (C) 2014 Benjamin Paaßen, Andreas Stöckel + + 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 3 of the License, or + (at your option) 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 _TILE_TREE_NODE_HPP_ +#define _TILE_TREE_NODE_HPP_ + +#include <QSize> +#include <QRect> + +#include <list> + +namespace TiledUI { + +class TileTreeNode { + +private: + TileTreeNode *parent; + std::list<TileTreeNode*> children; + +protected: + + void setParent(TileTreeNode *newParent); + + bool removeChild(TileTreeNode *child, bool recursive = false); + + void addChild(TileTreeNode *child, int idx = -1); + + int indexOf(TileTreeNode *child); + + virtual (); + +public: + + TileTreeNode(); + + TileTreeNode(TileTreeNode *parent); + + ~TileTreeNode(); + + virtual QSize minimumSize() const = 0; + + virtual QSize maximumSize() const = 0; + + virtual QRect geometry() const = 0; + + void resize(QSize size); + + void resize(int width, int height); + + virtual QWidget* parentWidget(); + + virtual void + +}; + +} + +#endif /* _TILE_TREE_NODE_HPP_ */ + |