[DEV] add treeView fist element Draw

This commit is contained in:
Edouard DUPIN 2018-08-20 22:46:06 +02:00
parent ba31625447
commit 0b2e9d4129
6 changed files with 191 additions and 10 deletions

View File

@ -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<ewol::Compositing*> m_listOObject; //!< generic element to display...
etk::Vector<int32_t> m_listSizeX; //!< size of every colomns
etk::Vector<int32_t> 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

106
ewol/widget/TreeView.cpp Normal file
View File

@ -0,0 +1,106 @@
/** @file
* @author Edouard DUPIN
* @copyright 2011, Edouard DUPIN, all right reserved
* @license MPL v2.0 (see license file)
*/
#include <ewol/widget/TreeView.hpp>
#include <ewol/compositing/Drawing.hpp>
#include <ewol/compositing/Text.hpp>
#include <ewol/compositing/Image.hpp>
#include <ewol/widget/Manager.hpp>
#include <etk/typeInfo.hpp>
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();
}

54
ewol/widget/TreeView.hpp Normal file
View File

@ -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 <etk/types.hpp>
#include <etk/Color.hpp>
#include <ewol/debug.hpp>
#include <ewol/widget/List.hpp>
#include <ewol/compositing/Compositing.hpp>
#include <fluorine/Variant.hpp>
namespace ewol {
namespace widget {
class TreeView;
using TreeViewShared = ememory::SharedPtr<ewol::widget::TreeView>;
using TreeViewWeak = ememory::WeakPtr<ewol::widget::TreeView>;
/**
* @ingroup ewolWidgetGroup
*/
class TreeView : public ewol::widget::List {
public: // signals
public: // properties
eproperty::Value<float> propertyOffsetTreeView; //!< indentation betwwen every new element.
eproperty::Value<float> 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();
};
};
};

View File

@ -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:

View File

@ -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:

View File

@ -5,7 +5,7 @@
*/
#pragma once
#include <ewol/widget/List.hpp>
#include <ewol/widget/TreeView.hpp>
#include <etk/os/FSNode.hpp>
#include <ewol/resource/ColorFile.hpp>
#include <esignal/Signal.hpp>
@ -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: