diff --git a/ewol/widget/List.hpp b/ewol/widget/List.hpp index 4d2b8988..d3e4b3c7 100644 --- a/ewol/widget/List.hpp +++ b/ewol/widget/List.hpp @@ -28,6 +28,7 @@ namespace ewol { ParentId, // uint_t BgColor, // color FgColor, // color + DistanceToRoot, // uint_t // Every other role must be set here: EndOfEwolRole }; @@ -41,9 +42,8 @@ namespace ewol { public: virtual ~List(); void calculateMinMaxSize() override; - void setLabel(etk::String _newLabel); // drawing capabilities .... - private: + protected: etk::Vector m_listOObject; //!< generic element to display... etk::Vector m_listSizeX; //!< size of every colomns etk::Vector m_listSizeY; //!< size of every rows @@ -51,7 +51,7 @@ namespace ewol { void addOObject(ewol::Compositing* _newObject, int32_t _pos=-1); void clearOObjectList(); // list properties ... - private: + protected: int32_t m_paddingSizeX; int32_t m_paddingSizeY; int32_t m_displayStartRaw; //!< Current starting diaplayed raw diff --git a/ewol/widget/TreeView.cpp b/ewol/widget/TreeView.cpp new file mode 100644 index 00000000..90089e45 --- /dev/null +++ b/ewol/widget/TreeView.cpp @@ -0,0 +1,106 @@ +/** @file + * @author Edouard DUPIN + * @copyright 2011, Edouard DUPIN, all right reserved + * @license MPL v2.0 (see license file) + */ + +#include + +#include +#include +#include +#include + +#include +ETK_DECLARE_TYPE(ewol::widget::TreeView); + +ewol::widget::TreeView::TreeView(): + ewol::widget::List(), + propertyOffsetTreeView(this, "offsetTreeView", + 30, + "Offset indentation for each node", + &ewol::widget::TreeView::onChangePropertyOffsetTreeView), + propertyIconTreeViewSize(this, "iconTreeViewSize", + 30, + "Size of the icon for treeView", + &ewol::widget::TreeView::onChangePropertyOffsetTreeView) { + addObjectType("ewol::widget::TreeView"); +} + +ewol::widget::TreeView::~TreeView() { + +} + +vec2 ewol::widget::TreeView::calculateElementSize(const ivec2& _pos) { + ewol::compositing::Text tmpText; + etk::String myTextToWrite = getData(ListRole::Text, _pos).getSafeString(); + float_t treeOffset = 0; + if (_pos.x() == 0) { + treeOffset += getData(ListRole::DistanceToRoot, _pos).getSafeNumber() * propertyOffsetTreeView.get(); + } + etk::String iconName; + float_t iconSize = 0; + if (_pos.x() == 0) { + iconName = getData(ListRole::Icon, _pos).getSafeString(); + if (iconName != "") { + iconSize += propertyIconTreeViewSize.get(); + } + } + vec3 textSize = tmpText.calculateSize(myTextToWrite); + ivec2 count = getMatrixSize(); + return vec2(textSize.x() + treeOffset + iconSize, + etk::max(textSize.y(), iconSize) + m_paddingSizeY*3 + ); +} + +void ewol::widget::TreeView::drawElement(const ivec2& _pos, const vec2& _start, const vec2& _size) { + vec2 posStart = _start; + etk::String iconName; + if (_pos.x() == 0) { + auto value = getData(ListRole::DistanceToRoot, _pos); + if (value.isNumber() == true) { + posStart.setX(posStart.x() + value.getSafeNumber() * propertyOffsetTreeView.get()); + } + iconName = getData(ListRole::Icon, _pos).getSafeString(); + } + + etk::String myTextToWrite = getData(ListRole::Text, _pos).getSafeString(); + etk::Color<> fg = getData(ListRole::FgColor, _pos).getSafeColor(); + auto backgroundVariant = getData(ListRole::BgColor, _pos); + if (backgroundVariant.isColor() == true) { + etk::Color<> bg = backgroundVariant.getColor(); + ewol::compositing::Drawing * BGOObjects = ETK_NEW(ewol::compositing::Drawing); + if (BGOObjects != null) { + addOObject(BGOObjects); + BGOObjects->setColor(bg); + BGOObjects->setPos(_start); + BGOObjects->rectangleWidth(_size); + } + } + posStart += vec2(m_paddingSizeX, m_paddingSizeY); + if (iconName != "") { + ewol::compositing::Image * tmpImage = ETK_NEW(ewol::compositing::Image, iconName); + if (tmpImage != null) { + addOObject(tmpImage); + tmpImage->setColor(fg); + tmpImage->setPos(posStart); + tmpImage->print(vec2(propertyIconTreeViewSize.get(), propertyIconTreeViewSize.get())); + } + // move right + posStart.setX(posStart.x() + propertyIconTreeViewSize.get()); + } + if (myTextToWrite != "") { + ewol::compositing::Text * tmpText = ETK_NEW(ewol::compositing::Text); + if (tmpText != null) { + addOObject(tmpText); + tmpText->setColor(fg); + tmpText->setPos(posStart); + tmpText->print(myTextToWrite);; + } + } +} + +void ewol::widget::TreeView::onChangePropertyOffsetTreeView() { + markToRedraw(); +} + diff --git a/ewol/widget/TreeView.hpp b/ewol/widget/TreeView.hpp new file mode 100644 index 00000000..6285df01 --- /dev/null +++ b/ewol/widget/TreeView.hpp @@ -0,0 +1,54 @@ +/** @file + * @author Edouard DUPIN + * @copyright 2011, Edouard DUPIN, all right reserved + * @license MPL v2.0 (see license file) + */ +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace ewol { + namespace widget { + class TreeView; + using TreeViewShared = ememory::SharedPtr; + using TreeViewWeak = ememory::WeakPtr; + + /** + * @ingroup ewolWidgetGroup + */ + class TreeView : public ewol::widget::List { + public: // signals + public: // properties + eproperty::Value propertyOffsetTreeView; //!< indentation betwwen every new element. + eproperty::Value propertyIconTreeViewSize; //!< Size of the icon. + protected: + TreeView(); + public: + virtual ~TreeView(); + protected: + /** + * @brief Calculate an element size to extimate the render size. + * @note Does not generate the with the same size. + * @param[in] _pos Position of colomn and Raw of the element. + * @return The estimate size of the element. + */ + vec2 calculateElementSize(const ivec2& _pos) override; + /** + * @brief Draw an element in the specific size and position. + * @param[in] _pos Position of colomn and Raw of the element. + * @param[in] _start Start display position. + * @param[in] _size Render raw size + * @return The estimate size of the element. + */ + void drawElement(const ivec2& _pos, const vec2& _start, const vec2& _size) override; + protected: + virtual void onChangePropertyOffsetTreeView(); + }; + }; +}; + diff --git a/lutin_ewol.py b/lutin_ewol.py index 21361b37..83b40694 100644 --- a/lutin_ewol.py +++ b/lutin_ewol.py @@ -171,6 +171,7 @@ def configure(target, my_module): 'ewol/widget/Windows.cpp', 'ewol/widget/WSlider.cpp', 'ewol/widget/Spin.cpp', + 'ewol/widget/TreeView.cpp', ]) my_module.add_header_file([ 'ewol/widget/Menu.hpp', @@ -210,7 +211,8 @@ def configure(target, my_module): 'ewol/widget/Image.hpp', 'ewol/widget/List.hpp', 'ewol/widget/Select.hpp', - 'ewol/widget/Spin.hpp' + 'ewol/widget/Spin.hpp', + 'ewol/widget/TreeView.hpp', ]) # tools: diff --git a/sample/treeView/appl/widget/BasicTree.cpp b/sample/treeView/appl/widget/BasicTree.cpp index 0c55d571..0335fcde 100644 --- a/sample/treeView/appl/widget/BasicTree.cpp +++ b/sample/treeView/appl/widget/BasicTree.cpp @@ -14,8 +14,6 @@ ETK_DECLARE_TYPE(appl::widget::BasicTree); appl::widget::BasicTree::BasicTree() { addObjectType("appl::widget::BasicTree"); setMouseLimit(1); - - m_tree = NodeElement::create("root"); for (size_t iii=0; iii<10; ++iii) { auto elem_iii = NodeElement::create("elem_" + etk::toString(iii)); @@ -33,18 +31,39 @@ appl::widget::BasicTree::~BasicTree() { } etk::Color<> appl::widget::BasicTree::getBasicBG() { - return etk::Color<>(0,0,0xFF,0xFF); + return etk::Color<>(0xAF,0xAF,0xAF,0xFF); } ivec2 appl::widget::BasicTree::getMatrixSize() const { - return ivec2(3, 10); + return ivec2(4, m_flatTree.size()); } fluorine::Variant appl::widget::BasicTree::getData(int32_t _role, const ivec2& _pos) { + auto elem = m_flatTree[_pos.y()]; + etk::String value = elem->getData(); switch (_role) { case ewol::widget::ListRole::Text: + if (_pos.x() == 0) { + return value; + } + if (_pos.x() == 1) { + //return etk::toString(countToRoot); + } return "value: " + etk::toString(_pos); + case ewol::widget::ListRole::DistanceToRoot: + return uint_t(elem->countToRoot()); + case ewol::widget::ListRole::Icon: + if (elem->countToRoot() == 0) { + return "{ewol}THEME:GUI:Home.svg"; + } + if (elem->countToRoot() == 1) { + return "{ewol}THEME:GUI:Folder.svg"; + } + if (elem->countToRoot() == 2) { + return "{ewol}THEME:GUI:File.svg"; + } + return ""; case ewol::widget::ListRole::FgColor: return etk::Color<>(0,0,0,0xFF); case ewol::widget::ListRole::BgColor: diff --git a/sample/treeView/appl/widget/BasicTree.hpp b/sample/treeView/appl/widget/BasicTree.hpp index 0d84aec6..7e27ff52 100644 --- a/sample/treeView/appl/widget/BasicTree.hpp +++ b/sample/treeView/appl/widget/BasicTree.hpp @@ -5,7 +5,7 @@ */ #pragma once -#include +#include #include #include #include @@ -19,7 +19,7 @@ namespace appl { /** * @brief Generic display folder class. This widget display the content of a single folder : */ - class BasicTree : public ewol::widget::List { + class BasicTree : public ewol::widget::TreeView { protected: BasicTree(); public: