[DEV] add basic folder list inspection add amny other upgrade
This commit is contained in:
parent
a8003d993b
commit
f8f872f5aa
6
.project
6
.project
@ -6,6 +6,11 @@
|
||||
<project>atriasoft-ewol</project>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.python.pydev.PyDevBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
@ -20,6 +25,7 @@
|
||||
<natures>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
<nature>net.sf.eclipsecs.core.CheckstyleNature</nature>
|
||||
<nature>org.python.pydev.pythonNature</nature>
|
||||
</natures>
|
||||
<filteredResources>
|
||||
<filter>
|
||||
|
@ -7,7 +7,8 @@ import bpy
|
||||
|
||||
list_elem = [
|
||||
"Entry",
|
||||
"CheckBox"
|
||||
"CheckBox",
|
||||
"ScrollBar"
|
||||
]
|
||||
|
||||
for elem in list_elem:
|
||||
|
@ -1,162 +0,0 @@
|
||||
/** @file
|
||||
* @author Edouard DUPIN
|
||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||
* @license MPL v2.0 (see license file)
|
||||
*/
|
||||
|
||||
|
||||
#include <ewol/ewol.hpp>
|
||||
#include <ewol/widget/Composer.hpp>
|
||||
#include <etk/uri/uri.hpp>
|
||||
#include <ewol/widget/Manager.hpp>
|
||||
#include <ewol/context/Context.hpp>
|
||||
#include <etk/typeInfo.hpp>
|
||||
ETK_DECLARE_TYPE(ewol::widget::Composer);
|
||||
|
||||
ewol::widget::Composer::Composer() :
|
||||
propertyRemoveIfUnderRemove(this, "remove-if-under-remove", true, "Demand the remove iof the widget if the subObject demand a remove"),
|
||||
propertySubFile(this, "sub-file", "", "compose with a subXML file", ewol::widget::Composer::onChangePropertySubFile) {
|
||||
addObjectType("ewol::widget::Composer");
|
||||
// nothing to do ...
|
||||
}
|
||||
|
||||
Widget ewol::widget::composerGenerateFile( etk::Uri _uri, ulong _id) {
|
||||
String tmpData;
|
||||
if (etk::uri::readAll(_uri, tmpData) == false) {
|
||||
Log.error("Can not read the file: " + _uri);
|
||||
return null;
|
||||
}
|
||||
return ewol::widget::composerGenerateString(tmpData, _id);
|
||||
}
|
||||
|
||||
Widget ewol::widget::composerGenerateString( String _data, ulong _id) {
|
||||
ewol::widget::Manager widgetManager = ewol::getContext().getWidgetManager();
|
||||
if (_data == "") {
|
||||
return null;
|
||||
}
|
||||
exml::Document doc;
|
||||
String tmpData = _data;
|
||||
// replace all elements:
|
||||
if (_id != 0) {
|
||||
tmpData.replace("{ID}", etk::toString(_id));
|
||||
}
|
||||
if (doc.parse(tmpData) == false) {
|
||||
Log.error(" can not load file XML string...");
|
||||
return null;
|
||||
}
|
||||
exml::Element root = doc.toElement();
|
||||
if (root.nodes.size() == 0) {
|
||||
Log.error(" (l ?) No node in the XML file/string.");
|
||||
return null;
|
||||
}
|
||||
if (root.nodes.size() > 1) {
|
||||
Log.warning(" (l ?) More than 1 node in the XML file/string. (JUST parse the first)");
|
||||
}
|
||||
exml::Element pNode = root.nodes[0].toElement();
|
||||
if (pNode.exist() == false) {
|
||||
Log.error(" (l ?) No node in the XML file/string. {2}");
|
||||
return null;
|
||||
}
|
||||
String widgetName = pNode.getValue();
|
||||
if (widgetManager.exist(widgetName) == false) {
|
||||
Log.error("(l " + pNode.getPos() + ") Unknown basic node='" + widgetName + "' not in : [" + widgetManager.list() + "]" );
|
||||
return null;
|
||||
}
|
||||
Log.debug("try to create subwidget : '" + widgetName + "'");
|
||||
Widget tmpWidget = widgetManager.create(widgetName);
|
||||
if (tmpWidget == null) {
|
||||
EWOL_ERROR ("(l " + pNode.getPos() + ") Can not create the widget : '" + widgetName + "'");
|
||||
return null;
|
||||
}
|
||||
if (tmpWidget.loadXML(pNode) == false) {
|
||||
EWOL_ERROR ("(l " + pNode.getPos() + ") can not load widget properties : '" + widgetName + "'");
|
||||
}
|
||||
return tmpWidget;
|
||||
}
|
||||
|
||||
ewol::widget::Composer::~Composer() {
|
||||
|
||||
}
|
||||
|
||||
boolean ewol::widget::Composer::loadFromFile( etk::Uri _uri, ulong _id) {
|
||||
String tmpData;
|
||||
if (etk::uri::readAll(_uri, tmpData) == false) {
|
||||
Log.error("Can not read the file: " + _uri);
|
||||
return false;
|
||||
}
|
||||
return loadFromString(tmpData, _id);
|
||||
}
|
||||
|
||||
boolean ewol::widget::Composer::loadFromString( String _composerXmlString, ulong _id) {
|
||||
exml::Document doc;
|
||||
String tmpData = _composerXmlString;
|
||||
// replace all elements:
|
||||
if (_id != 0) {
|
||||
tmpData.replace("{ID}", etk::toString(_id));
|
||||
}
|
||||
if (doc.parse(tmpData) == false) {
|
||||
Log.error(" can not load file XML string...");
|
||||
return false;
|
||||
}
|
||||
exml::Element root = doc.nodes["composer"];
|
||||
if (root.exist() == false) {
|
||||
// Maybe a multiple node XML for internal config:
|
||||
root = doc.toElement();
|
||||
if (root.exist() == false) {
|
||||
Log.error("[" + getId() + "] {" + getObjectType() + "} (l ?) main node not find: 'composer' ...");
|
||||
return false;
|
||||
}
|
||||
if (root.nodes.size() == 0) {
|
||||
Log.error("[" + getId() + "] {" + getObjectType() + "} (l ?) no node in the Container XML element.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// call upper class to parse his elements ...
|
||||
ewol::widget::Container::loadXML(root);
|
||||
if (this.subWidget == null) {
|
||||
Log.warning("Load data from composer and have no under Widget after loading");
|
||||
if (_composerXmlString.size() != 0) {
|
||||
Log.error("Error Loading XML data : " + _composerXmlString);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
requestUpdateSize();
|
||||
return true;
|
||||
}
|
||||
|
||||
void ewol::widget::Composer::requestDestroyFromChild( EwolObject _child) {
|
||||
ewol::widget::Container::requestDestroyFromChild(_child);
|
||||
if (*propertyRemoveIfUnderRemove == true) {
|
||||
Log.debug("Child widget remove ==> auto-remove");
|
||||
autoDestroy();
|
||||
}
|
||||
}
|
||||
|
||||
void ewol::widget::Composer::onChangePropertySubFile() {
|
||||
Log.info("Load compositing form external file : " + propertySubFile);
|
||||
if (*propertySubFile == "") {
|
||||
// remove all elements:
|
||||
subWidgetRemove();
|
||||
return;
|
||||
}
|
||||
if (loadFromFile(*propertySubFile, getId()) == false) {
|
||||
Log.error("Can not load Player GUI from file ... " + propertySubFile);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
boolean ewol::widget::Composer::loadXML( exml::Element _node) {
|
||||
//Log.verbose("[" + getId() + "] t=" + getObjectType() + " Load XML (start)");
|
||||
if (_node.exist() == false) {
|
||||
return false;
|
||||
}
|
||||
// parse generic properties:
|
||||
Widget::loadXML(_node);
|
||||
// parse all the elements:
|
||||
if (_node.nodes.size() != 0) {
|
||||
Log.error("a composer Node Can not have Sub-element in XML ==> must be done in an external file and load it with attribute: 'sub-file'");
|
||||
}
|
||||
//drawWidgetTree();
|
||||
//Log.verbose("[" + getId() + "] t=" + getObjectType() + " Load XML (stop)");
|
||||
return true;
|
||||
}
|
@ -1,332 +0,0 @@
|
||||
/** @file
|
||||
* @author Edouard DUPIN
|
||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||
* @license MPL v2.0 (see license file)
|
||||
*/
|
||||
|
||||
#include <ewol/widget/List.hpp>
|
||||
|
||||
#include <ewol/compositing/Drawing.hpp>
|
||||
#include <ewol/compositing/Text.hpp>
|
||||
#include <ewol/widget/Manager.hpp>
|
||||
|
||||
#include <etk/typeInfo.hpp>
|
||||
ETK_DECLARE_TYPE(ewol::widget::List);
|
||||
|
||||
ewol::widget::List::List() {
|
||||
addObjectType("ewol::widget::List");
|
||||
this.paddingSizeX = 2;
|
||||
#ifdef __TARGET_OS__Android
|
||||
this.paddingSizeY = 10;
|
||||
#else
|
||||
this.paddingSizeY = 2;
|
||||
#endif
|
||||
this.nbVisibleRaw = 0;
|
||||
propertyCanFocus.setDirectCheck(true);
|
||||
this.limitScrolling = Vector2f(1, 0.5);
|
||||
}
|
||||
|
||||
|
||||
void ewol::widget::List::init() {
|
||||
ewol::widget::WidgetScrolled::init();
|
||||
addComposeElemnent("drawing", ememory::make<ewol::compositing::Drawing>());
|
||||
addComposeElemnent("text", ememory::make<ewol::compositing::Text>());
|
||||
}
|
||||
|
||||
|
||||
ewol::widget::List::~List() {
|
||||
}
|
||||
|
||||
void ewol::widget::List::addComposeElemnent( String _name, ememory::Ptr<ewol::Compositing> _element) {
|
||||
this.compositingElements.set(_name, _element);
|
||||
this.listOObject.pushBack(_element);
|
||||
}
|
||||
|
||||
void ewol::widget::List::clearComposeElemnent() {
|
||||
for (auto it: this.compositingElements) {
|
||||
it.second.clear();
|
||||
}
|
||||
}
|
||||
|
||||
void ewol::widget::List::removeComposeElemnent() {
|
||||
this.compositingElements.clear();
|
||||
}
|
||||
|
||||
ememory::Ptr<ewol::Compositing> ewol::widget::List::getComposeElemnent( String _name) {
|
||||
return this.compositingElements[_name];
|
||||
}
|
||||
/*
|
||||
void ewol::widget::List::setRawVisible(int _id) {
|
||||
Log.debug("Set Raw visible : " + _id);
|
||||
if (_id<0) {
|
||||
return;
|
||||
}
|
||||
if (_id == this.displayStartRaw) {
|
||||
// nothing to do ...
|
||||
return;
|
||||
}
|
||||
if (_id < this.displayStartRaw) {
|
||||
this.displayStartRaw = _id-2;
|
||||
} else {
|
||||
if (this.displayStartRaw + this.nbVisibleRaw < _id) {
|
||||
this.displayStartRaw = _id - this.nbVisibleRaw + 2;
|
||||
}
|
||||
}
|
||||
Vector2i matrixSize = getMatrixSize();
|
||||
if (this.displayStartRaw > matrixSize.y()) {
|
||||
this.displayStartRaw = matrixSize.y()-2;
|
||||
}
|
||||
if (this.displayStartRaw<0) {
|
||||
this.displayStartRaw = 0;
|
||||
}
|
||||
Log.debug("Set start raw : " + this.displayStartRaw);
|
||||
markToRedraw();
|
||||
}
|
||||
*/
|
||||
|
||||
void ewol::widget::List::calculateMinMaxSize() {
|
||||
/*int fontId = getDefaultFontId();
|
||||
int minWidth = ewol::getWidth(fontId, this.label);
|
||||
int minHeight = ewol::getHeight(fontId);
|
||||
this.minSize.x = 3+minWidth;
|
||||
this.minSize.y = 3+minHeight;
|
||||
*/
|
||||
this.minSize.setValue(200, 150);
|
||||
}
|
||||
|
||||
void ewol::widget::List::onDraw() {
|
||||
for (int iii=0; iii<this.listOObject.size(); iii++) {
|
||||
if (this.listOObject[iii] != null) {
|
||||
this.listOObject[iii].draw();
|
||||
}
|
||||
}
|
||||
WidgetScrolled::onDraw();
|
||||
}
|
||||
|
||||
void ewol::widget::List::onRegenerateDisplay() {
|
||||
if (needRedraw() == true) {
|
||||
// clean the object list ...
|
||||
clearComposeElemnent();
|
||||
// -------------------------------------------------------
|
||||
// -- Calculate the size of each element
|
||||
// -------------------------------------------------------
|
||||
Vector2i matrixSize = getMatrixSize();
|
||||
this.listSizeX.clear();
|
||||
this.listSizeX.resize(matrixSize.x(), 0);
|
||||
this.listSizeY.clear();
|
||||
this.listSizeY.resize(matrixSize.y(), 0);
|
||||
for (int_t yyy=0; yyy<matrixSize.y(); ++yyy) {
|
||||
for (int_t xxx=0; xxx<matrixSize.x(); ++xxx) {
|
||||
Vector2i pos(xxx, yyy);
|
||||
Vector2f elementSize = calculateElementSize(pos);
|
||||
if (elementSize.x() > this.listSizeX[xxx]) {
|
||||
this.listSizeX[xxx] = elementSize.x();
|
||||
}
|
||||
if (elementSize.y() > this.listSizeY[yyy]) {
|
||||
this.listSizeY[yyy] = elementSize.y();
|
||||
}
|
||||
}
|
||||
}
|
||||
// -------------------------------------------------------
|
||||
// -- Fill property applyence
|
||||
// -------------------------------------------------------
|
||||
if (propertyFill.x() == true) {
|
||||
int fullSize = 0;
|
||||
for (auto size: this.listSizeX) {
|
||||
fullSize += size;
|
||||
}
|
||||
if (fullSize < this.size.x() ) {
|
||||
// need to expand all elements:
|
||||
int residualAdd = (this.size.x() - fullSize) / matrixSize.x();
|
||||
if (residualAdd != 0) {
|
||||
for (auto size: this.listSizeX) {
|
||||
size += residualAdd;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
if (propertyFill.y() == true) {
|
||||
int fullSize = 0;
|
||||
for (auto size: this.listSizeY) {
|
||||
fullSize += size;
|
||||
}
|
||||
if (fullSize < this.size.y() ) {
|
||||
// need to expand all elements:
|
||||
int residualAdd = (this.size.y() - fullSize) / matrixSize.y();
|
||||
if (residualAdd != 0) {
|
||||
for (auto size: this.listSizeY) {
|
||||
size += residualAdd;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
// -------------------------------------------------------
|
||||
// -- Calculate the start position size of each element
|
||||
// -------------------------------------------------------
|
||||
List<int> listStartPosX;
|
||||
List<int> listStartPosY;
|
||||
int lastPositionX = 0;
|
||||
for (auto size: this.listSizeX) {
|
||||
listStartPosX.pushBack(lastPositionX);
|
||||
lastPositionX += size;
|
||||
}
|
||||
int lastPositionY = 0;
|
||||
for (auto size: this.listSizeY) {
|
||||
lastPositionY += size;
|
||||
listStartPosY.pushBack(lastPositionY);
|
||||
}
|
||||
// -------------------------------------------------------
|
||||
// -- Update the scroolBar
|
||||
// -------------------------------------------------------
|
||||
this.maxSize = Vector2i(lastPositionX, lastPositionY);
|
||||
// -------------------------------------------------------
|
||||
// -- Clean the background
|
||||
// -------------------------------------------------------
|
||||
drawBackground();
|
||||
// -------------------------------------------------------
|
||||
// -- Draw each element
|
||||
// -------------------------------------------------------
|
||||
for (int_t yyy=0; yyy<matrixSize.y(); ++yyy) {
|
||||
float startYposition = this.size.y() + this.originScrooled.y() - listStartPosY[yyy];
|
||||
if (startYposition + this.listSizeY[yyy] < 0) {
|
||||
// ==> element out of range ==> nothing to display
|
||||
break;
|
||||
}
|
||||
if (startYposition > this.size.y()) {
|
||||
// ==> element out of range ==> nothing to display
|
||||
continue;
|
||||
}
|
||||
for (int_t xxx=0; xxx<matrixSize.x(); ++xxx) {
|
||||
float startXposition = -this.originScrooled.x() + listStartPosX[xxx];
|
||||
//Log.error("display start: " + startXposition);
|
||||
if (startXposition + this.listSizeX[xxx] < 0) {
|
||||
// ==> element out of range ==> nothing to display
|
||||
continue;
|
||||
}
|
||||
if (startXposition > this.size.x()) {
|
||||
// ==> element out of range ==> nothing to display
|
||||
break;
|
||||
}
|
||||
drawElement(Vector2i(xxx, yyy),
|
||||
Vector2f(startXposition, startYposition),
|
||||
Vector2f(this.listSizeX[xxx], this.listSizeY[yyy]));
|
||||
}
|
||||
}
|
||||
// -------------------------------------------------------
|
||||
// -- Draw Scrooling widget
|
||||
// -------------------------------------------------------
|
||||
WidgetScrolled::onRegenerateDisplay();
|
||||
}
|
||||
}
|
||||
|
||||
Vector2i ewol::widget::List::getMatrixSize() {
|
||||
return Vector2i(1,0);
|
||||
}
|
||||
|
||||
Vector2f ewol::widget::List::calculateElementSize( Vector2i _pos) {
|
||||
auto tmpText = ememory::staticPointerCast<ewol::compositing::Text>(getComposeElemnent("text"));
|
||||
String myTextToWrite = getData(ListRole::Text, _pos).getSafeString();
|
||||
Vector3f textSize = tmpText.calculateSize(myTextToWrite);
|
||||
Vector2i count = getMatrixSize();
|
||||
return Vector2f(textSize.x(),
|
||||
textSize.y() + this.paddingSizeY*3
|
||||
);
|
||||
}
|
||||
|
||||
void ewol::widget::List::drawBackground() {
|
||||
auto BGOObjects = ememory::staticPointerCast<ewol::compositing::Drawing>(getComposeElemnent("drawing"));
|
||||
if (BGOObjects != null) {
|
||||
etk::Color<> basicBG = getBasicBG();
|
||||
BGOObjects.setColor(basicBG);
|
||||
BGOObjects.setPos(Vector3f(0, 0, 0) );
|
||||
BGOObjects.rectangleWidth(this.size);
|
||||
}
|
||||
}
|
||||
|
||||
void ewol::widget::List::drawElement( Vector2i _pos, Vector2f _start, Vector2f _size) {
|
||||
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();
|
||||
auto BGOObjects = ememory::staticPointerCast<ewol::compositing::Drawing>(getComposeElemnent("drawing"));
|
||||
if (BGOObjects != null) {
|
||||
BGOObjects.setColor(bg);
|
||||
BGOObjects.setPos(Vector3f(_start.x(), _start.y(), 0) );
|
||||
BGOObjects.rectangleWidth(_size);
|
||||
}
|
||||
}
|
||||
if (myTextToWrite != "") {
|
||||
auto tmpText = ememory::staticPointerCast<ewol::compositing::Text>(getComposeElemnent("text"));
|
||||
if (tmpText != null) {
|
||||
int displayPositionY = _start.y() + this.paddingSizeY;
|
||||
tmpText.setColor(fg);
|
||||
tmpText.setPos(Vector3f(_start.x() + this.paddingSizeX, displayPositionY, 0) );
|
||||
tmpText.print(myTextToWrite);;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
boolean ewol::widget::List::onEventInput( ewol::event::Input _event) {
|
||||
Vector2f relativePos = relativePosition(_event.getPos());
|
||||
if (WidgetScrolled::onEventInput(_event) == true) {
|
||||
keepFocus();
|
||||
// nothing to do ... done on upper widet ...
|
||||
return true;
|
||||
}
|
||||
if (this.listSizeY.size() == 0) {
|
||||
return false;
|
||||
}
|
||||
relativePos = Vector2f(relativePos.x(),this.size.y() - relativePos.y()) + this.originScrooled;
|
||||
// Find the colomn and the row
|
||||
Vector2i pos{0,0};
|
||||
float_t offsetY = 0;
|
||||
for (int iii=0; iii<this.listSizeY.size()-1; iii++) {
|
||||
int previous = offsetY;
|
||||
offsetY += this.listSizeY[iii];
|
||||
if ( relativePos.y() < offsetY
|
||||
&& relativePos.y() >= previous ) {
|
||||
pos.setY(iii);
|
||||
offsetY = previous;
|
||||
break;
|
||||
}
|
||||
if ( iii == this.listSizeY.size()-2
|
||||
&& relativePos.y() >= offsetY ) {
|
||||
pos.setY(iii+1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
float_t offsetX = 0;
|
||||
for (int iii=0; iii<this.listSizeX.size()-1; iii++) {
|
||||
int previous = offsetX;
|
||||
offsetX += this.listSizeX[iii];
|
||||
if ( relativePos.x() < offsetX
|
||||
&& relativePos.x() >= previous ) {
|
||||
pos.setX(iii);
|
||||
offsetX = previous;
|
||||
break;
|
||||
}
|
||||
if ( iii == this.listSizeX.size()-2
|
||||
&& relativePos.x() >= offsetX ) {
|
||||
pos.setX(iii+1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
Vector2f posInternalMouse = relativePos - Vector2f(offsetX, offsetY);
|
||||
boolean isUsed = onItemEvent(_event, pos, posInternalMouse);
|
||||
if (isUsed == true) {
|
||||
// TODO : this generate bugs ... I did not understand why ..
|
||||
//WidgetManager::focusKeep(this);
|
||||
}
|
||||
return isUsed;
|
||||
}
|
||||
|
||||
void ewol::widget::List::onGetFocus() {
|
||||
Log.debug("Ewol::List get focus");
|
||||
}
|
||||
|
||||
void ewol::widget::List::onLostFocus() {
|
||||
Log.debug("Ewol::List Lost focus");
|
||||
}
|
@ -1,94 +0,0 @@
|
||||
|
||||
enum ListRole {
|
||||
Text = 11234, // string
|
||||
IsSelected, // bool
|
||||
IsExpand, // bool
|
||||
Icon, // string
|
||||
ChildCount, // uint_t
|
||||
HaveChild, // bool
|
||||
ParentId, // uint_t
|
||||
BgColor, // color
|
||||
FgColor, // color
|
||||
DistanceToRoot, // uint_t
|
||||
// Every other role must be set here:
|
||||
EndOfEwolRole
|
||||
};
|
||||
class List extends WidgetScrolled {
|
||||
public List();
|
||||
public void calculateMinMaxSize() ;
|
||||
// drawing capabilities ....
|
||||
protected List<ememory::Ptr<ewol::Compositing>> listOObject; //!< generic element to display...
|
||||
protected List<Integer> listSizeX; //!< size of every colomns
|
||||
protected List<Integer> listSizeY; //!< size of every rows
|
||||
protected etk::Map<String, ememory::Ptr<ewol::Compositing>> compositingElements;
|
||||
protected void addComposeElemnent( String _name, ememory::Ptr<ewol::Compositing> _element);
|
||||
protected void clearComposeElemnent();
|
||||
protected void removeComposeElemnent();
|
||||
protected ememory::Ptr<ewol::Compositing> getComposeElemnent( String _name);
|
||||
public void clearOObjectList();
|
||||
// list properties ...
|
||||
protected int paddingSizeX;
|
||||
protected int paddingSizeY;
|
||||
protected int displayStartRaw; //!< Current starting diaplayed raw
|
||||
protected int displayCurrentNbLine; //!< Number of line in the display
|
||||
protected int nbVisibleRaw; // set the number of visible raw (calculate don display)
|
||||
// function call to display the list :
|
||||
protected etk::Color<> getBasicBG() {
|
||||
return etk::Color<>(0xFF, 0xFF, 0xFF, 0xFF);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the number of colomn and row availlable in the list
|
||||
* @return Number of colomn and row
|
||||
*/
|
||||
protected Vector2i getMatrixSize() ;
|
||||
|
||||
protected fluorine::Variant getData(int _role, Vector2i _pos) {
|
||||
switch (_role) {
|
||||
case ListRole::Text:
|
||||
return "";
|
||||
case ListRole::FgColor:
|
||||
return etk::Color<>(0x00, 0x00, 0x00, 0xFF);
|
||||
case ListRole::BgColor:
|
||||
if (_pos.y() % 2 == 0) {
|
||||
return etk::Color<>(0xFF, 0xFF, 0xFF, 0xFF);
|
||||
}
|
||||
return etk::Color<>(0x7F, 0x7F, 0x7F, 0xFF);
|
||||
}
|
||||
return fluorine::Variant();
|
||||
};
|
||||
/**
|
||||
* Calculate an element size to extimate the render size.
|
||||
* @note Does not generate the with the same size.
|
||||
* @param _pos Position of colomn and Raw of the element.
|
||||
* @return The estimate size of the element.
|
||||
*/
|
||||
protected Vector2f calculateElementSize( Vector2i _pos);
|
||||
/**
|
||||
* Draw an element in the specific size and position.
|
||||
* @param _pos Position of colomn and Raw of the element.
|
||||
* @param _start Start display position.
|
||||
* @param _size Render raw size
|
||||
* @return The estimate size of the element.
|
||||
*/
|
||||
protected void drawElement( Vector2i _pos, Vector2f _start, Vector2f _size);
|
||||
/**
|
||||
* Draw the background
|
||||
*/
|
||||
protected void drawBackground();
|
||||
|
||||
protected boolean onItemEvent( ewol::event::Input _event, Vector2i _pos, Vector2f _mousePosition) {
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* set a raw visible in the main display
|
||||
* @param _id Id of the raw that might be visible.
|
||||
*/
|
||||
//void setRawVisible(int _id);
|
||||
protected void onGetFocus() ;
|
||||
protected void onLostFocus() ;
|
||||
protected void onDraw() ;
|
||||
public void onRegenerateDisplay() ;
|
||||
public boolean onEventInput( ewol::event::Input _event) ;
|
||||
}
|
||||
|
@ -1,256 +0,0 @@
|
||||
/** @file
|
||||
* @author Edouard DUPIN
|
||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||
* @license MPL v2.0 (see license file)
|
||||
*/
|
||||
|
||||
#include <ewol/widget/ListFileSystem.hpp>
|
||||
#include <etk/tool.hpp>
|
||||
#include <etk/path/fileSystem.hpp>
|
||||
#include <etk/algorithm.hpp>
|
||||
#include <etk/typeInfo.hpp>
|
||||
ETK_DECLARE_TYPE(ewol::widget::ListFileSystem);
|
||||
|
||||
ewol::widget::ListFileSystem::ListFileSystem() :
|
||||
signalFileSelect(this, "file-select", ""),
|
||||
signalFileValidate(this, "file-validate", ""),
|
||||
signalFolderSelect(this, "folder-select", ""),
|
||||
signalFolderValidate(this, "folder-validate", ""),
|
||||
propertyPath(this, "path",
|
||||
etk::Path("/"),
|
||||
"Path to display",
|
||||
ewol::widget::ListFileSystem::onChangePropertyPath),
|
||||
propertyFile(this, "select",
|
||||
etk::Path(),
|
||||
"selection af a specific file",
|
||||
ewol::widget::ListFileSystem::onChangePropertyFile),
|
||||
propertyShowFile(this, "show-file",
|
||||
true,
|
||||
"display files",
|
||||
ewol::widget::ListFileSystem::onChangePropertyShowFile),
|
||||
propertyShowFolder(this, "show-folder",
|
||||
true,
|
||||
"display folders",
|
||||
ewol::widget::ListFileSystem::onChangePropertyShowFolder),
|
||||
propertyShowHidden(this, "show-hidden",
|
||||
true,
|
||||
"Show the hidden element (file, folder, ...)",
|
||||
ewol::widget::ListFileSystem::onChangePropertyShowHidden),
|
||||
propertyFilter(this, "filter",
|
||||
"",
|
||||
"regex to filter files ...",
|
||||
ewol::widget::ListFileSystem::onChangePropertyFilter),
|
||||
this.selectedLine(-1) {
|
||||
addObjectType("ewol::widget::ListFileSystem");
|
||||
#if defined(__TARGET_OS__Windows)
|
||||
propertyPath.setDirectCheck("c:/");
|
||||
#endif
|
||||
this.colorProperty = ewol::resource::ColorFile::create("THEME_COLOR:///ListFileSystem.json?lib=ewol");
|
||||
if (this.colorProperty != null) {
|
||||
this.colorIdText = this.colorProperty.request("text");
|
||||
this.colorIdBackground1 = this.colorProperty.request("background1");
|
||||
this.colorIdBackground2 = this.colorProperty.request("background2");
|
||||
this.colorIdBackgroundSelected = this.colorProperty.request("selected");
|
||||
}
|
||||
setMouseLimit(2);
|
||||
}
|
||||
|
||||
ewol::widget::ListFileSystem::~ListFileSystem() {
|
||||
clearList();
|
||||
}
|
||||
|
||||
void ewol::widget::ListFileSystem::clearList() {
|
||||
this.list.clear();
|
||||
}
|
||||
|
||||
etk::Color<> ewol::widget::ListFileSystem::getBasicBG() {
|
||||
return this.colorProperty.get(this.colorIdBackground1);
|
||||
}
|
||||
|
||||
static boolean localSort( etk::Path _left, etk::Path _right) {
|
||||
return _left.getString().toUpper() <= _right.getString().toUpper();
|
||||
}
|
||||
|
||||
void ewol::widget::ListFileSystem::regenerateView() {
|
||||
clearList();
|
||||
this.selectedLine = -1;
|
||||
this.list.clear();
|
||||
this.originScrooled.setValue(0,0);
|
||||
uint flags = 0;
|
||||
if (*propertyShowHidden == true) {
|
||||
flags |= etk::path::LIST_HIDDEN;
|
||||
}
|
||||
if (*propertyShowFolder == true) {
|
||||
flags |= etk::path::LIST_FOLDER;
|
||||
}
|
||||
if (*propertyShowFile == true) {
|
||||
flags |= etk::path::LIST_FILE;
|
||||
}
|
||||
this.list = etk::path::list(*propertyPath, flags);
|
||||
Log.error("Lsit of element: " + this.list.size() );
|
||||
// Sort the list:
|
||||
etk::algorithm::quickSort(this.list, localSort);
|
||||
// request a redraw ...
|
||||
markToRedraw();
|
||||
}
|
||||
|
||||
etk::Path ewol::widget::ListFileSystem::getSelect() {
|
||||
String tmpVal = "";
|
||||
if (this.selectedLine >= 0) {
|
||||
tmpVal = this.list[this.selectedLine].getFileName();
|
||||
}
|
||||
return tmpVal;
|
||||
}
|
||||
|
||||
// select the specific file
|
||||
void ewol::widget::ListFileSystem::setSelect( etk::Path _data) {
|
||||
// remove selected line
|
||||
this.selectedLine = -1;
|
||||
// search the coresponding file :
|
||||
for (int iii=0; iii<this.list.size(); ++iii) {
|
||||
if (this.list[iii] == _data) {
|
||||
// we find the line :
|
||||
this.selectedLine = iii;
|
||||
break;
|
||||
}
|
||||
}
|
||||
markToRedraw();
|
||||
}
|
||||
|
||||
Vector2i ewol::widget::ListFileSystem::getMatrixSize() {
|
||||
int offset = 0;
|
||||
if (*propertyShowFolder == true) {
|
||||
if (propertyPath.get() == "/") {
|
||||
offset = 1;
|
||||
} else {
|
||||
offset = 2;
|
||||
}
|
||||
}
|
||||
return Vector2i(1, this.list.size() + offset);
|
||||
}
|
||||
|
||||
fluorine::Variant ewol::widget::ListFileSystem::getData(int _role, Vector2i _pos) {
|
||||
switch (_role) {
|
||||
case ListRole::Text:
|
||||
{
|
||||
int offset = 0;
|
||||
if (*propertyShowFolder == true) {
|
||||
if (*propertyPath == "/") {
|
||||
offset = 1;
|
||||
} else {
|
||||
offset = 2;
|
||||
}
|
||||
if (_pos.y() == 0) {
|
||||
return ".";
|
||||
} else if ( _pos.y() == 1
|
||||
LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM propertyPath.get() != "/") {
|
||||
return "..";
|
||||
}
|
||||
}
|
||||
if( _pos.y()-offset >= 0
|
||||
LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM _pos.y()-offset < (int)this.list.size()) {
|
||||
Log.verbose("get filename for : '" + this.list[_pos.y()-offset] + ":'" + this.list[_pos.y()-offset].getFileName() + "'");
|
||||
return this.list[_pos.y()-offset].getFileName();
|
||||
}
|
||||
}
|
||||
return "+<ERROR>>>";
|
||||
case ListRole::FgColor:
|
||||
return this.colorProperty.get(this.colorIdText);
|
||||
case ListRole::BgColor:
|
||||
if (this.selectedLine == _pos.y()) {
|
||||
return this.colorProperty.get(this.colorIdBackgroundSelected);
|
||||
}
|
||||
if (_pos.y() % 2) {
|
||||
return this.colorProperty.get(this.colorIdBackground1);
|
||||
}
|
||||
return this.colorProperty.get(this.colorIdBackground2);
|
||||
}
|
||||
return fluorine::Variant();
|
||||
}
|
||||
|
||||
boolean ewol::widget::ListFileSystem::onItemEvent( ewol::event::Input _event,
|
||||
Vector2i _pos,
|
||||
Vector2f _mousePosition) {
|
||||
int offset = 0;
|
||||
if (*propertyShowFolder == true) {
|
||||
if (*propertyPath == "/") {
|
||||
offset = 1;
|
||||
} else {
|
||||
offset = 2;
|
||||
}
|
||||
}
|
||||
if ( _event.getStatus() == KeyStatus::pressSingle
|
||||
|| _event.getStatus() == KeyStatus::pressDouble) {
|
||||
Log.verbose("Event on List : IdInput=" + _event.getId() + " _pos=" + _pos );
|
||||
if (1 == _event.getId()) {
|
||||
if (_pos.y() > (int)this.list.size()+offset ) {
|
||||
this.selectedLine = -1;
|
||||
} else {
|
||||
this.selectedLine = _pos.y();
|
||||
}
|
||||
if( *propertyShowFolder == true
|
||||
LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM this.selectedLine == 0) {
|
||||
// "." folder
|
||||
if (_event.getStatus() == KeyStatus::pressSingle) {
|
||||
signalFolderSelect.emit(*propertyPath);
|
||||
} else {
|
||||
signalFolderValidate.emit(*propertyPath);
|
||||
}
|
||||
} else if ( *propertyShowFolder == true
|
||||
LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM this.selectedLine == 1) {
|
||||
// ".." folder
|
||||
if (_event.getStatus() == KeyStatus::pressSingle) {
|
||||
signalFolderSelect.emit(propertyPath.getParent());
|
||||
} else {
|
||||
signalFolderValidate.emit(propertyPath.getParent());
|
||||
}
|
||||
} else if( this.selectedLine-offset >= 0
|
||||
LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM this.selectedLine-offset < (int)this.list.size() ) {
|
||||
// generate event extern:
|
||||
if(etk::path::isDirectory(this.list[this.selectedLine-offset])) {
|
||||
if (_event.getStatus() == KeyStatus::pressSingle) {
|
||||
signalFolderSelect.emit(this.list[this.selectedLine-offset]);
|
||||
} else {
|
||||
signalFolderValidate.emit(this.list[this.selectedLine-offset]);
|
||||
}
|
||||
} else {
|
||||
if (_event.getStatus() == KeyStatus::pressSingle) {
|
||||
signalFileSelect.emit(this.list[this.selectedLine-offset]);
|
||||
} else {
|
||||
signalFileValidate.emit(this.list[this.selectedLine-offset]);
|
||||
}
|
||||
}
|
||||
}
|
||||
// need to regenerate the display of the list :
|
||||
markToRedraw();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void ewol::widget::ListFileSystem::onChangePropertyPath() {
|
||||
Log.warning("Change Path: " + *propertyPath + " selected File=" + *propertyFile);;
|
||||
regenerateView();
|
||||
}
|
||||
|
||||
void ewol::widget::ListFileSystem::onChangePropertyFile() {
|
||||
setSelect(propertyFile);
|
||||
}
|
||||
|
||||
void ewol::widget::ListFileSystem::onChangePropertyShowFile() {
|
||||
regenerateView();
|
||||
}
|
||||
|
||||
void ewol::widget::ListFileSystem::onChangePropertyShowFolder() {
|
||||
regenerateView();
|
||||
}
|
||||
|
||||
void ewol::widget::ListFileSystem::onChangePropertyShowHidden() {
|
||||
regenerateView();
|
||||
}
|
||||
|
||||
void ewol::widget::ListFileSystem::onChangePropertyFilter() {
|
||||
regenerateView();
|
||||
}
|
||||
|
@ -1,83 +0,0 @@
|
||||
/** @file
|
||||
* @author Edouard DUPIN
|
||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||
* @license MPL v2.0 (see license file)
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <ewol/widget/List.hpp>
|
||||
#include <ewol/resource/ColorFile.hpp>
|
||||
#include <esignal/Signal.hpp>
|
||||
|
||||
namespace ewol {
|
||||
namespace widget {
|
||||
class ListFileSystem;
|
||||
using ListFileSystem = ememory::Ptr<ewol::widget::ListFileSystem>;
|
||||
using ListFileSystemWeak = ememory::WeakPtr<ewol::widget::ListFileSystem>;
|
||||
/**
|
||||
* Generic display folder class. This widget display the content of a single folder :
|
||||
*/
|
||||
class ListFileSystem : public ewol::widget::List {
|
||||
public: // signals
|
||||
esignal::Signal<etk::Path> signalFileSelect; //!< @event "file-select" Generated when a file is selected.
|
||||
esignal::Signal<etk::Path> signalFileValidate; //!< @event "file-validate" Generate when the user validate (return) or double click on the element
|
||||
esignal::Signal<etk::Path> signalFolderSelect;
|
||||
esignal::Signal<etk::Path> signalFolderValidate;
|
||||
public: // properties
|
||||
eproperty::Value<etk::Path> propertyPath; //!< Current folder that display point on.
|
||||
eproperty::Value<etk::Path> propertyFile; //!< current selected file
|
||||
eproperty::Value<bool> propertyShowFile; //!< Show files elements
|
||||
eproperty::Value<bool> propertyShowFolder; //!< Display the folders elements
|
||||
eproperty::Value<bool> propertyShowHidden; //!< Display hidden elements
|
||||
eproperty::Value<String> propertyFilter; //!< Regular expression to filter the view (for temporary file:".*(~|.bck|.pyc)\e")
|
||||
protected:
|
||||
ListFileSystem();
|
||||
public:
|
||||
DECLARE_WIDGET_FACTORY(ListFileSystem, "ListFileSystem");
|
||||
~ListFileSystem();
|
||||
protected:
|
||||
ememory::Ptr<ewol::resource::ColorFile> this.colorProperty; //!< theme color property.
|
||||
int this.colorIdText; //!< Color of the text.
|
||||
int this.colorIdBackground1; //!< Color of the Background.
|
||||
int this.colorIdBackground2; //!< Color of the Background 2.
|
||||
int this.colorIdBackgroundSelected; //!< Color of line selected.
|
||||
protected:
|
||||
etk::Color<> getBasicBG() ;
|
||||
Vector2i getMatrixSize() ;
|
||||
fluorine::Variant getData(int _role, Vector2i _pos) ;
|
||||
boolean onItemEvent( ewol::event::Input _event, Vector2i _pos, Vector2f _mousePosition) ;
|
||||
protected:
|
||||
List<etk::Path> this.list; //!< List of all element in the path. (they are filtered)
|
||||
/**
|
||||
* Clean the list of element.
|
||||
*/
|
||||
void clearList();
|
||||
/**
|
||||
* Regenerate the content of the view. this is actually not automation on the system update.
|
||||
*/
|
||||
void regenerateView();
|
||||
protected:
|
||||
int this.selectedLine; //!< Current Line ID that is selected
|
||||
public:
|
||||
/**
|
||||
* Select a specific file in the path
|
||||
* @param _data File to selested.
|
||||
*/
|
||||
void setSelect( etk::Path _data);
|
||||
/**
|
||||
* Get the current selected file/folder/... in the list
|
||||
* @return the String of the element selected.
|
||||
*/
|
||||
etk::Path getSelect() ;
|
||||
protected:
|
||||
void onChangePropertyPath();
|
||||
void onChangePropertyFile();
|
||||
void onChangePropertyShowFile();
|
||||
void onChangePropertyShowFolder();
|
||||
void onChangePropertyShowHidden();
|
||||
void onChangePropertyFilter();
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -1,19 +1,4 @@
|
||||
/** @file
|
||||
* @author Edouard DUPIN
|
||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||
* @license MPL v2.0 (see license file)
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <etk/Vector.hpp>
|
||||
#include <etk/types.hpp>
|
||||
#include <ewol/widget/meta/SpinBase.hpp>
|
||||
|
||||
namespace ewol {
|
||||
namespace widget {
|
||||
class Spin;
|
||||
using Spin = ememory::Ptr<ewol::widget::Spin>;
|
||||
using SpinWeak = ememory::WeakPtr<ewol::widget::Spin>;
|
||||
/**
|
||||
* a composed Spin is a Spin with an inside composed with the specify XML element
|
||||
* ==> this permit to generate standard element simple
|
||||
@ -58,6 +43,4 @@ namespace ewol {
|
||||
void onChangePropertyMax();
|
||||
void onChangePropertyIncrement();
|
||||
void onChangePropertyMantis();
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
@ -1,50 +1,48 @@
|
||||
<popup>
|
||||
<sizer mode="vert" lock="true" fill="true" expand="true">
|
||||
<sizer mode="hori">
|
||||
<checkbox name="[{ID}]file-shooser:show-hiden-file">
|
||||
<label>_T{ShowHiddenFiles}</label>
|
||||
</checkbox>
|
||||
<spacer expand="true,false"/>
|
||||
<button name="[{ID}]file-shooser:button-validate">
|
||||
<sizer mode="hori">
|
||||
<image src="THEME_GUI:///Load.svg?lib=ewol" fill="true" size="7,7mm"/>
|
||||
<label name="[{ID}]file-shooser:validate-label">_T{Validate}</label>
|
||||
</sizer>
|
||||
</button>
|
||||
<button name="[{ID}]file-shooser:button-cancel">
|
||||
<sizer mode="hori">
|
||||
<image src="THEME_GUI:///Remove.svg?lib=ewol" fill="true" size="7,7mm"/>
|
||||
<label name="[{ID}]file-shooser:cancel-label">_T{Cancel}</label>
|
||||
</sizer>
|
||||
</button>
|
||||
</sizer>
|
||||
<sizer mode="hori">
|
||||
<spacer min-size="2,2mm"/>
|
||||
<Composer>
|
||||
<Sizer mode="VERTICAL" lock="true" fill="true" expand="true">
|
||||
<Label name="[{ID}]file-shooser:title-label">_T{Title}</Label>
|
||||
<Sizer mode="HORIZONTAL">
|
||||
<Image name="[{ID}]file-shooser:img-folder" src="THEME:Folder.svg?lib=ewol" expand="false" size="45,45px"/>
|
||||
<Entry name="[{ID}]file-shooser:entry-folder" expand="true,false" fill="true,false"/>
|
||||
<Image name="[{ID}]file-shooser:img-home" src="THEME:Home.svg?lib=ewol" expand="false" size="45,45px"/>
|
||||
</Sizer>
|
||||
<Sizer mode="HORIZONTAL">
|
||||
<Image name="[{ID}]file-shooser:img-file" src="THEME:File.svg?lib=ewol" expand="false" size="45,45px"/>
|
||||
<Entry name="[{ID}]file-shooser:entry-file" expand="true,false" fill="true,false"/>
|
||||
</Sizer>
|
||||
<Sizer mode="HORIZONTAL">
|
||||
<Spacer min-size="2,2mm"/>
|
||||
<ListFileSystem name="[{ID}]file-shooser:list-folder"
|
||||
min-size="20,0%"
|
||||
expand="false,true"
|
||||
fill="true"
|
||||
show-hidden="false"
|
||||
show-file="false"
|
||||
show-folder="true"
|
||||
show-temporary="false"/>
|
||||
<spacer min-size="2,2mm"/>
|
||||
show-folder="true"/>
|
||||
<Spacer min-size="2,2mm"/>
|
||||
<ListFileSystem name="[{ID}]file-shooser:list-files"
|
||||
expand="true,true"
|
||||
fill="true"
|
||||
show-hidden="false"
|
||||
show-file="true"
|
||||
show-folder="false"
|
||||
show-temporary="false"/>
|
||||
<spacer min-size="2,2mm"/>
|
||||
</sizer>
|
||||
<sizer mode="hori">
|
||||
<image name="[{ID}]file-shooser:img-file" src="THEME_GUI:///File.svg?lib=ewol" expand="false" size="8,8mm"/>
|
||||
<entry name="[{ID}]file-shooser:entry-file" expand="true,false" fill="true,false"/>
|
||||
</sizer>
|
||||
<sizer mode="hori">
|
||||
<image name="[{ID}]file-shooser:img-folder" src="THEME_GUI:///Folder.svg?lib=ewol" expand="false" size="8,8mm"/>
|
||||
<entry name="[{ID}]file-shooser:entry-folder" expand="true,false" fill="true,false"/>
|
||||
<image name="[{ID}]file-shooser:img-home" src="THEME_GUI:///Home.svg?lib=ewol" expand="false" size="8,8mm"/>
|
||||
</sizer>
|
||||
<label name="[{ID}]file-shooser:title-label">_T{Title}</label>
|
||||
</sizer>
|
||||
</popup>
|
||||
show-folder="false"/>
|
||||
<Spacer min-size="2,2mm"/>
|
||||
</Sizer>
|
||||
<Sizer mode="HORIZONTAL">
|
||||
<CheckBox name="[{ID}]file-shooser:show-hiden-file">_T{ShowHiddenFiles}</CheckBox>
|
||||
<Spacer expand="true,false"/>
|
||||
<Button name="[{ID}]file-shooser:button-validate">
|
||||
<Sizer mode="HORIZONTAL">
|
||||
<Image src="THEME:Load.svg?lib=ewol" fill="true" size="45,45px"/>
|
||||
<Label name="[{ID}]file-shooser:validate-label">_T{Validate}</Label>
|
||||
</Sizer >
|
||||
</Button >
|
||||
<Button name="[{ID}]file-shooser:button-cancel">
|
||||
<Sizer mode="HORIZONTAL">
|
||||
<Image src="THEME:Remove.svg?lib=ewol" fill="true" size="45,45px"/>
|
||||
<Label name="[{ID}]file-shooser:cancel-label">_T{Cancel}</Label>
|
||||
</Sizer>
|
||||
</Button >
|
||||
</Sizer >
|
||||
</Sizer>
|
||||
</Composer>
|
59
resources/resources/ewol/theme/shape/ScrollBar.emf
Normal file
59
resources/resources/ewol/theme/shape/ScrollBar.emf
Normal file
@ -0,0 +1,59 @@
|
||||
EMF(STRING)
|
||||
# Blender v3.1.2 EMF File: 'ScrollBar.blend'
|
||||
Mesh:ScrollBar_Cube
|
||||
Vertex:24
|
||||
0.999633 0.939126 0.692412|0.999633 -1.060139 0.692306|-0.999632 0.939126 0.692412|-0.999633 -1.060139 0.692306|0.612843 1.917809 -0.016061|1.978234 0.460425 -0.016089|1.978234 -0.581316 -0.016244|0.612843 -2.038658 -0.016272|1.978234 0.460402 0.387109|0.612843 1.917744 0.387137|1.490144 1.429646 0.539397|0.612843 -2.038723 0.386926|1.978234 -0.581340 0.386954|1.490132 -1.550629 0.539242|-1.978234 0.460425 -0.016089|-0.612843 1.917809 -0.016061|-0.612843 -2.038658 -0.016272|-1.978234 -0.581316 -0.016244|-0.612843 1.917744 0.387137|-1.978234 0.460402 0.387109|-1.490144 1.429646 0.539397|-1.978234 -0.581340 0.386954|-0.612843 -2.038723 0.386926|-1.490132 -1.550629 0.539242|
|
||||
UV-mapping:
|
||||
0.074219 0.944092|0.120606 0.943115|0.115281 0.993733|0.113157 0.949323|0.078476 0.953015|0.086126 0.983938|0.111696 0.944402|0.078245 0.948093|0.086991 0.991581|0.080720 0.975385|0.080974 0.959440|0.101935 0.962117|0.090904 0.956084|0.091524 0.958446|0.099259 0.991963|0.112358 0.970195|0.112313 0.968453|0.135323 0.928695|0.121095 0.968324|0.080520 0.995525|0.074219 0.986621|0.074219 0.970034|0.080326 0.968432|0.107967 0.984841|0.112540 0.967208|0.075778 0.969678|0.101857 0.966301|0.091271 0.973167|0.160017 0.949517|0.148891 0.991157|0.149273 0.949899|0.160391 0.947013|0.147828 0.992006|0.147360 0.946251|0.147234 0.948141|0.172935 0.987744|0.142967 0.985035|0.169571 0.949093|0.140506 0.992060|0.141409 0.949093|0.137534 0.984544|0.132842 0.945463|0.162384 0.992768|0.174912 0.947924|0.178598 0.993618|0.173214 0.991100|0.160398 0.991157|0.173590 0.945432|0.170474 0.990254|0.142456 0.948632|0.131613 0.991157|0.171985 0.949093|0.174065 0.974453|0.175519 0.961875|0.171541 0.947863|0.140670 0.947863|0.142179 0.988266|0.135923 0.961795|0.136685 0.974302|0.167802 0.988435|
|
||||
Normal(face):44
|
||||
-0.297799 -0.000051 0.954629|0.297888 -0.000051 0.954601|0.000000 -0.297895 0.954599|0.000000 0.297793 0.954631|0.324683 0.304215 -0.895564|0.324748 -0.304232 -0.895534|-0.324684 0.304215 -0.895563|-0.324748 -0.304232 -0.895534|-0.297814 -0.000018 0.954624|-0.297928 -0.000142 0.954588|-0.297873 -0.000018 0.954605|0.297873 -0.000018 0.954605|0.297759 -0.000142 0.954641|0.297814 -0.000018 0.954624|0.000000 -1.000000 -0.000160|0.000000 1.000000 0.000161|-1.000000 0.000000 0.000000|1.000000 -0.000000 -0.000000|-0.729754 -0.683710 -0.000039|0.729764 0.683700 0.000110|-0.729754 0.683710 0.000040|0.729764 -0.683700 -0.000110|-0.729764 -0.683700 -0.000109|0.729754 0.683710 0.000040|-0.729764 0.683700 0.000110|0.729754 -0.683710 -0.000039|0.000000 -0.000053 1.000000|0.000000 0.000019 -1.000000|0.000000 0.000149 -1.000000|
|
||||
Face:44
|
||||
palette:gui_border_1
|
||||
3/0/0 2/1/0 19/2/0| 0/3/1 1/4/1 12/5/1| 1/6/2 3/7/2 22/8/2| 2/9/3 0/10/3 9/11/3| 8/12/4 9/11/4 10/13/4| 11/14/5 12/15/5 13/16/5| 18/17/6 19/2/6 20/18/6| 21/19/7 22/20/7 23/21/7| 2/1/8 20/18/8 19/2/8| 19/2/9 21/19/9 3/0/9| 21/19/10 23/21/10 3/0/10| 1/4/11 13/22/11 12/5/11| 12/5/12 8/23/12 0/3/12| 8/23/13 10/24/13 0/3/13| 3/7/2 23/25/2 22/8/2| 22/8/2 11/14/2 1/6/2| 11/14/2 13/16/2 1/6/2| 0/10/3 10/13/3 9/11/3| 9/11/3 18/26/3 2/9/3| 18/26/3 20/27/3 2/9/3|
|
||||
palette:gui_border_2
|
||||
7/28/14 22/29/14 16/30/14| 15/31/15 9/32/15 4/33/15| 21/34/16 14/35/16 17/36/16| 5/37/17 12/38/17 6/39/17| 16/40/18 21/34/18 17/36/18| 9/32/19 5/41/19 4/33/19| 18/42/20 14/43/20 19/44/20| 7/28/21 12/45/21 11/46/21| 7/28/14 11/46/14 22/29/14| 15/31/15 18/42/15 9/32/15| 21/34/16 19/47/16 14/35/16| 5/37/17 8/48/17 12/38/17| 16/40/22 22/49/22 21/34/22| 9/32/23 8/50/23 5/41/23| 18/42/24 15/31/24 14/43/24| 7/28/25 6/51/25 12/45/25|
|
||||
palette:gui_center
|
||||
1/6/26 2/9/26 3/7/26| 1/6/26 0/3/26 2/9/26|
|
||||
palette:gui_back
|
||||
15/52/27 4/53/27 5/54/27| 5/54/28 6/55/28 17/56/28| 6/55/27 7/57/27 17/56/27| 7/57/27 16/58/27 17/56/27| 17/56/28 14/59/28 5/54/28| 14/59/27 15/52/27 5/54/27|
|
||||
|
||||
# Just for information:
|
||||
Palettes:gui_back
|
||||
Ns 225.000000
|
||||
Ka 1.000000 1.000000 1.000000
|
||||
Kd 0.800000 0.000000 0.005632
|
||||
Ks 0.500000 0.500000 0.500000
|
||||
Ke 0.000000 0.000000 0.000000
|
||||
vNi 1.450000
|
||||
d 1.000000
|
||||
illum 2
|
||||
# Just for information:
|
||||
Palettes:gui_border_1
|
||||
Ns 225.000000
|
||||
Ka 1.000000 1.000000 1.000000
|
||||
Kd 0.000000 0.002615 0.800000
|
||||
Ks 0.500000 0.500000 0.500000
|
||||
Ke 0.000000 0.000000 0.000000
|
||||
vNi 1.450000
|
||||
d 1.000000
|
||||
illum 2
|
||||
# Just for information:
|
||||
Palettes:gui_border_2
|
||||
Ns 225.000000
|
||||
Ka 1.000000 1.000000 1.000000
|
||||
Kd 0.000000 0.800000 0.170495
|
||||
Ks 0.500000 0.500000 0.500000
|
||||
Ke 0.000000 0.000000 0.000000
|
||||
vNi 1.450000
|
||||
d 1.000000
|
||||
illum 2
|
||||
# Just for information:
|
||||
Palettes:gui_center
|
||||
Ns 225.000000
|
||||
Ka 1.000000 1.000000 1.000000
|
||||
Kd 0.438544 0.438544 0.438544
|
||||
Ks 0.500000 0.500000 0.500000
|
||||
Ke 0.000000 0.000000 0.000000
|
||||
vNi 1.450000
|
||||
d 1.000000
|
||||
illum 2
|
@ -1,23 +1,24 @@
|
||||
{
|
||||
mode:2,
|
||||
display-outside:true,
|
||||
# padding "outside" the object in pixel ==> prevent bad display
|
||||
"padding-out-left":0,
|
||||
"padding-out-right":1,
|
||||
"padding-out-top":1,
|
||||
"padding-out-buttom":1,
|
||||
|
||||
padding-out-left:1,
|
||||
padding-out-right:1,
|
||||
padding-out-top:1,
|
||||
padding-out-buttom:1,
|
||||
# padding "inside" the object in pixel ==> prevent bad display
|
||||
"padding-in-left":1,
|
||||
"padding-in-right":1,
|
||||
"padding-in-top":1,
|
||||
"padding-in-buttom":1,
|
||||
|
||||
border-left:1,
|
||||
border-right:1,
|
||||
border-top:1,
|
||||
border-buttom:1,
|
||||
# render program:
|
||||
"program-vert":"THEME:shape/aaRenderShape.vert?lib=ewol",
|
||||
"program-frag":"THEME:shape/aaRenderShape.frag?lib=ewol",
|
||||
|
||||
padding-in-left:3,
|
||||
padding-in-right:3,
|
||||
padding-in-top:3,
|
||||
padding-in-buttom:3,
|
||||
# Object to render (with modification)
|
||||
"object-file":"THEME:shape/ScrollBar.emf?lib=ewol",
|
||||
|
||||
change-time:200,
|
||||
program:"THEME_GUI:///WidgetScrolled.prog?lib=ewol",
|
||||
color:"THEME_COLOR:///WidgetScrolled.json?lib=ewol"
|
||||
"palette":"THEME:shape/palette_gui.json?lib=ewol",
|
||||
|
||||
"change-time":0
|
||||
}
|
@ -87,12 +87,12 @@ public class BasicWindows extends Windows {
|
||||
//! [ewol_sample_HW_windows_title]
|
||||
setPropertyTitle("No title set !!! for this test");
|
||||
|
||||
final Sizer sizerVertMain = new Sizer(DisplayMode.modeVert);
|
||||
final Sizer sizerVertMain = new Sizer(DisplayMode.VERTICAL);
|
||||
sizerVertMain.setPropertyExpand(Vector3b.TRUE);
|
||||
sizerVertMain.setPropertyFill(Vector3b.TRUE);
|
||||
setSubWidget(sizerVertMain);
|
||||
|
||||
this.sizerMenuHori = new Sizer(DisplayMode.modeHori);
|
||||
this.sizerMenuHori = new Sizer(DisplayMode.HORIZONTAL);
|
||||
this.sizerMenuHori.setPropertyExpand(Vector3b.TRUE_FALSE_FALSE);
|
||||
this.sizerMenuHori.setPropertyLockExpand(Vector3b.TRUE);
|
||||
this.sizerMenuHori.setPropertyFill(Vector3b.TRUE);
|
||||
@ -109,7 +109,7 @@ public class BasicWindows extends Windows {
|
||||
sizerVertMain.subWidgetAdd(simpleSpacer);
|
||||
}
|
||||
|
||||
this.sizerTestAreaHori = new Sizer(DisplayMode.modeHori);
|
||||
this.sizerTestAreaHori = new Sizer(DisplayMode.HORIZONTAL);
|
||||
this.sizerTestAreaHori.setPropertyExpand(Vector3b.TRUE_FALSE_FALSE);
|
||||
this.sizerTestAreaHori.setPropertyExpandIfFree(Vector3b.TRUE);
|
||||
this.sizerTestAreaHori.setPropertyFill(Vector3b.TRUE_FALSE_FALSE);
|
||||
|
@ -16,17 +16,17 @@ public class MainWindows extends Windows {
|
||||
//! [ewol_sample_HW_windows_title]
|
||||
setPropertyTitle("Simple sample test");
|
||||
//EwolObject.getContext().getFontDefault().setName("FreeSans");
|
||||
Sizer sizerMain = new Sizer(DisplayMode.modeVert);
|
||||
Sizer sizerMain = new Sizer(DisplayMode.VERTICAL);
|
||||
sizerMain.setPropertyExpand(Vector3b.TRUE);
|
||||
sizerMain.setPropertyFill(Vector3b.TRUE);
|
||||
setSubWidget(sizerMain);
|
||||
|
||||
Sizer sizerHori1 = new Sizer(DisplayMode.modeHori);
|
||||
Sizer sizerHori1 = new Sizer(DisplayMode.HORIZONTAL);
|
||||
sizerHori1.setPropertyExpand(Vector3b.TRUE);
|
||||
sizerHori1.setPropertyFill(Vector3b.TRUE);
|
||||
sizerMain.subWidgetAdd(sizerHori1);
|
||||
|
||||
Sizer sizerHori2 = new Sizer(DisplayMode.modeHori);
|
||||
Sizer sizerHori2 = new Sizer(DisplayMode.HORIZONTAL);
|
||||
sizerHori2.setPropertyExpand(Vector3b.TRUE);
|
||||
sizerHori2.setPropertyFill(Vector3b.TRUE);
|
||||
sizerMain.subWidgetAdd(sizerHori2);
|
||||
|
@ -1,5 +1,6 @@
|
||||
package sample.atriasoft.ewol.sampleButton;
|
||||
|
||||
import org.atriasoft.etk.Uri;
|
||||
import org.atriasoft.ewol.widget.Composer;
|
||||
import org.atriasoft.ewol.widget.Widget;
|
||||
|
||||
@ -11,9 +12,14 @@ public class MainWindows extends BasicWindows {
|
||||
setPropertyTitle("Simple Button test");
|
||||
//final Widget data = Composer.composerGenerateString("<Composer><Label>hello, how are you</Label></Composer>");
|
||||
//final Widget data = Composer.composerGenerateString("<Composer><Button><Label gravity=\"center\">hello, how are you</Label></Button></Composer>");
|
||||
final Widget data = Composer.composerGenerateString("<Composer><Button toggle='true' fill='true,false,false' expand='true'>" + "<Label>hello, how are you</Label>"
|
||||
+ "<Label>You <br/>Click - Me <b>!!!</b></Label>" + "</Button></Composer>");
|
||||
/*
|
||||
final Widget data = Composer.composerGenerateString("<Button toggle='true' fill='true,false,false' expand='true'>" + "<Label>hello, how are you</Label>"
|
||||
+ "<Label>You <br/>Click - Me <b>!?<!--kjlkjlkjlkj-->d</b></Label>" + "</Button>");
|
||||
*/
|
||||
|
||||
final Widget data = Composer.composerGenerateFile(new Uri("DATA", "ewol-gui-file-chooser.xml", "ewol"));
|
||||
this.setTestWidget(data);
|
||||
|
||||
/*
|
||||
final Button simpleButton = Button
|
||||
.createLabelButton("1 - My <font color=\"red\">button <i>internal</i></font> <br/>2 - <b>label</b><br/>3 - an other text ...<br/>4 - and an other line to be sure ...");
|
||||
@ -21,6 +27,12 @@ public class MainWindows extends BasicWindows {
|
||||
simpleButton.setPropertyFill(Vector3b.FALSE);
|
||||
this.setTestWidget(simpleButton);
|
||||
*/
|
||||
|
||||
/*
|
||||
final ListFileSystem widget = new ListFileSystem();
|
||||
widget.setPropertyPath("/home/heero");
|
||||
widget.setPropertyExpand(Vector3b.TRUE);
|
||||
widget.setPropertyFill(Vector3b.FALSE);
|
||||
this.setTestWidget(widget);
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
@ -26,4 +26,5 @@ open module org.atriasoft.ewol {
|
||||
requires transitive io.scenarium.logger;
|
||||
requires org.atriasoft.loader3d;
|
||||
requires org.atriasoft.egami;
|
||||
requires java.base;
|
||||
}
|
||||
|
@ -106,8 +106,8 @@ public class ETranslate {
|
||||
ETranslate.loadTranslation();
|
||||
Log.verbose("Request translate: '" + instance + "'");
|
||||
// find all iterance of 'T{' ... '}'
|
||||
final String out = Pattern.compile("T\\{.*\\}").matcher(instance).replaceAll(mr -> {
|
||||
final String data = mr.group();
|
||||
final String out = Pattern.compile("_T\\{(.*)\\}").matcher(instance).replaceAll(mr -> {
|
||||
final String data = mr.group(1);
|
||||
Log.info("translate : '" + data + "'");
|
||||
final String itTranslate = ETranslate.globalTranslate.get(data);
|
||||
if (itTranslate == null) {
|
||||
|
@ -301,6 +301,8 @@ public class EwolContext extends GaleApplication {
|
||||
|
||||
@Override
|
||||
public void onPointer(final KeySpecial special, final KeyType type, final int pointerID, final Vector2f pos, final KeyStatus state) {
|
||||
// TODO: WTF !!!
|
||||
this.input.setLastKeyboardSpecial(special);
|
||||
switch (state) {
|
||||
case move:
|
||||
// Log.debug("Receive MSG : THREAD_INPUT_MOTION");
|
||||
|
@ -126,7 +126,6 @@ public class Button extends ContainerToggle {
|
||||
onChangePropertyShaper();
|
||||
// can not support multiple click...
|
||||
setMouseLimit(1);
|
||||
this.shape = new GuiShape(this.propertyConfig);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -10,6 +10,7 @@ import org.atriasoft.ewol.widget.Sizer.DisplayMode;
|
||||
import org.atriasoft.exml.annotation.XmlAttribute;
|
||||
import org.atriasoft.exml.annotation.XmlManaged;
|
||||
import org.atriasoft.exml.annotation.XmlName;
|
||||
import org.atriasoft.exml.annotation.XmlText;
|
||||
|
||||
public class CheckBox extends Container {
|
||||
|
||||
@ -50,7 +51,7 @@ public class CheckBox extends Container {
|
||||
}
|
||||
|
||||
public CheckBox(final String basicLabel) {
|
||||
final Sizer subs = new Sizer(DisplayMode.modeHori);
|
||||
final Sizer subs = new Sizer(DisplayMode.HORIZONTAL);
|
||||
subs.setPropertyLockExpand(Vector3b.TRUE);
|
||||
subs.setPropertyGravity(Gravity.CENTER);
|
||||
setSubWidget(subs);
|
||||
@ -74,7 +75,7 @@ public class CheckBox extends Container {
|
||||
}
|
||||
|
||||
@XmlManaged
|
||||
@XmlAttribute
|
||||
@XmlText
|
||||
@XmlName(value = "label")
|
||||
@EwolDescription(value = "value of the label")
|
||||
public String getPropertyLabel() {
|
||||
|
@ -19,7 +19,6 @@ import org.atriasoft.exml.annotation.XmlAttribute;
|
||||
import org.atriasoft.exml.annotation.XmlManaged;
|
||||
import org.atriasoft.exml.annotation.XmlName;
|
||||
import org.atriasoft.exml.exception.ExmlException;
|
||||
import org.atriasoft.exml.model.XmlElement;
|
||||
import org.atriasoft.gale.context.ClipboardList;
|
||||
import org.atriasoft.gale.context.Cursor;
|
||||
import org.atriasoft.gale.key.KeyKeyboard;
|
||||
@ -34,80 +33,44 @@ public class Composer extends Container {
|
||||
}
|
||||
|
||||
public static Widget composerGenerateFile(final Uri uri, final long id) {
|
||||
|
||||
final byte[] elemData = Uri.getAllData(uri);
|
||||
if (elemData == null) {
|
||||
Log.error("Can not read the Stream : " + uri);
|
||||
return null;
|
||||
}
|
||||
final String dataToParse = new String(elemData);
|
||||
return composerGenerateString(dataToParse, id);
|
||||
/*
|
||||
String tmpData;
|
||||
if (etk::uri::readAll(_uri, tmpData) == false) {
|
||||
Log.error("Can not read the file: " + _uri);
|
||||
return null;
|
||||
final Widget tmp = composerGenerateString(dataToParse, id);
|
||||
if (tmp == null) {
|
||||
Log.error("Faiul to Load data: {}", uri);
|
||||
}
|
||||
return ewol::widget::composerGenerateString(tmpData, _id);
|
||||
*/
|
||||
return tmp;
|
||||
}
|
||||
|
||||
public static Widget composerGenerateString(final String data) {
|
||||
return composerGenerateString(data, 0);
|
||||
}
|
||||
|
||||
public static Widget composerGenerateString(final String data, final long id) {
|
||||
Widget[] result = null;
|
||||
public static Widget composerGenerateString(String data, final long id) {
|
||||
boolean requestComposer = true;
|
||||
if (!data.startsWith("<Composer>")) {
|
||||
data = "<Composer>\n" + data + "\n</Composer>";
|
||||
requestComposer = false;
|
||||
}
|
||||
data = data.replace("{ID}", Long.toString(id));
|
||||
Composer[] result = null;
|
||||
try {
|
||||
result = Exml.parse(data, Composer.class, "Composer");//new WidgetXmlFactory());
|
||||
} catch (final ExmlException ex) {
|
||||
Log.error("Fail to load Data !!! {}", ex.toString());
|
||||
ex.printStackTrace();
|
||||
}
|
||||
return result[0];
|
||||
/*
|
||||
ewol::widget::Manager widgetManager = ewol::getContext().getWidgetManager();
|
||||
if (_data == "") {
|
||||
if (result == null) {
|
||||
return null;
|
||||
}
|
||||
exml::Document doc;
|
||||
String tmpData = _data;
|
||||
// replace all elements:
|
||||
if (_id != 0) {
|
||||
tmpData.replace("{ID}", etk::toString(_id));
|
||||
if (requestComposer) {
|
||||
return result[0];
|
||||
}
|
||||
if (doc.parse(tmpData) == false) {
|
||||
Log.error(" can not load file XML string...");
|
||||
return null;
|
||||
}
|
||||
exml::Element root = doc.toElement();
|
||||
if (root.nodes.size() == 0) {
|
||||
Log.error(" (l ?) No node in the XML file/string.");
|
||||
return null;
|
||||
}
|
||||
if (root.nodes.size() > 1) {
|
||||
Log.warning(" (l ?) More than 1 node in the XML file/string. (JUST parse the first)");
|
||||
}
|
||||
exml::Element pNode = root.nodes[0].toElement();
|
||||
if (pNode.exist() == false) {
|
||||
Log.error(" (l ?) No node in the XML file/string. {2}");
|
||||
return null;
|
||||
}
|
||||
String widgetName = pNode.getValue();
|
||||
if (widgetManager.exist(widgetName) == false) {
|
||||
Log.error("(l " + pNode.getPos() + ") Unknown basic node='" + widgetName + "' not in : [" + widgetManager.list() + "]" );
|
||||
return null;
|
||||
}
|
||||
Log.debug("try to create subwidget : '" + widgetName + "'");
|
||||
Widget tmpWidget = widgetManager.create(widgetName);
|
||||
if (tmpWidget == null) {
|
||||
EWOL_ERROR ("(l " + pNode.getPos() + ") Can not create the widget : '" + widgetName + "'");
|
||||
return null;
|
||||
}
|
||||
if (tmpWidget.loadXML(pNode) == false) {
|
||||
EWOL_ERROR ("(l " + pNode.getPos() + ") can not load widget properties : '" + widgetName + "'");
|
||||
}
|
||||
return tmpWidget;
|
||||
*/
|
||||
return result[0].getSubWidget();
|
||||
}
|
||||
|
||||
protected boolean propertyRemoveIfUnderRemove; //!< Remove the composer if sub element request a remove
|
||||
@ -406,26 +369,26 @@ public class Composer extends Container {
|
||||
}
|
||||
|
||||
/**
|
||||
* load a composition with a file
|
||||
* @param _uri Name of the file
|
||||
* @param _id Unique ID that is used in replacing the balise "{ID}" inside the File (do nothing if == 0)
|
||||
* @return true == > all done OK
|
||||
* @return false == > some error occured
|
||||
*/
|
||||
* load a composition with a file
|
||||
* @param _uri Name of the file
|
||||
* @param _id Unique ID that is used in replacing the balise "{ID}" inside the File (do nothing if == 0)
|
||||
* @return true == > all done OK
|
||||
* @return false == > some error occured
|
||||
*/
|
||||
public boolean loadFromFile(final Uri uri) {
|
||||
return loadFromFile(uri, 0);
|
||||
}
|
||||
|
||||
public boolean loadFromFile(final Uri uri, final long id) {
|
||||
/*
|
||||
String tmpData;
|
||||
if (etk::uri::readAll(_uri, tmpData) == false) {
|
||||
Log.error("Can not read the file: " + _uri);
|
||||
final Widget data = composerGenerateFile(uri, this.getId());
|
||||
// check parse is well done.
|
||||
if (data == null) {
|
||||
return false;
|
||||
}
|
||||
return loadFromString(tmpData, _id);
|
||||
*/
|
||||
return false;
|
||||
// keep the real Data (remove subComposer
|
||||
if (data instanceof final Composer tmp) {
|
||||
setSubWidget(tmp.getSubWidget());
|
||||
} else {
|
||||
setSubWidget(data);
|
||||
}
|
||||
// T O D O: Change this with a throw.a..a
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -435,62 +398,19 @@ public class Composer extends Container {
|
||||
* @return true == > all done OK
|
||||
* @return false == > some error occured
|
||||
*/
|
||||
public boolean loadFromString(final String composerXmlString, final long id) {
|
||||
return false;
|
||||
/*
|
||||
XmlElement doc;
|
||||
String tmpData = _composerXmlString;
|
||||
// replace all elements:
|
||||
if (_id != 0) {
|
||||
tmpData.replace("{ID}", Long.toString(_id));
|
||||
}
|
||||
if (doc.parse(tmpData) == false) {
|
||||
Log.error(" can not load file XML string...");
|
||||
public boolean loadFromString(final String composerXmlString) {
|
||||
final Widget data = composerGenerateString(composerXmlString, this.getId());
|
||||
// check parse is well done.
|
||||
if (data == null) {
|
||||
return false;
|
||||
}
|
||||
XmlElement root = doc.nodes["composer"];
|
||||
if (root.exist() == false) {
|
||||
// Maybe a multiple node XML for internal config:
|
||||
root = doc.toElement();
|
||||
if (root.exist() == false) {
|
||||
Log.error("[" + getId() + "] {" + getObjectType() + "} (l ?) main node not find: 'composer' ...");
|
||||
return false;
|
||||
}
|
||||
if (root.nodes.size() == 0) {
|
||||
Log.error("[" + getId() + "] {" + getObjectType() + "} (l ?) no node in the Container XML element.");
|
||||
return false;
|
||||
}
|
||||
// keep the real Data (remove subComposer
|
||||
if (data instanceof final Composer tmp) {
|
||||
setSubWidget(tmp.getSubWidget());
|
||||
} else {
|
||||
setSubWidget(data);
|
||||
}
|
||||
// call upper class to parse his elements ...
|
||||
super.loadXML(root);
|
||||
if (this.subWidget == null) {
|
||||
Log.warning("Load data from composer and have no under Widget after loading");
|
||||
if (_composerXmlString.size() != 0) {
|
||||
Log.error("Error Loading XML data : " + _composerXmlString);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
requestUpdateSize();
|
||||
return true;
|
||||
*/
|
||||
}
|
||||
|
||||
public boolean loadXML(final XmlElement node) {
|
||||
/*
|
||||
//Log.verbose("[" + getId() + "] t=" + getObjectType() + " Load XML (start)");
|
||||
if (_node != null) {
|
||||
return false;
|
||||
}
|
||||
// parse generic properties:
|
||||
super.loadXML(_node);
|
||||
// parse all the elements:
|
||||
if (_node.nodes.size() != 0) {
|
||||
Log.error("a composer Node Can not have Sub-element in XML ==> must be done in an external file and load it with attribute: 'sub-file'");
|
||||
}
|
||||
//drawWidgetTree();
|
||||
//Log.verbose("[" + getId() + "] t=" + getObjectType() + " Load XML (stop)");
|
||||
*
|
||||
*/
|
||||
// T O D O: Change this with a throw.a..a
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -511,7 +431,7 @@ public class Composer extends Container {
|
||||
subWidgetRemove();
|
||||
return;
|
||||
}
|
||||
if (!loadFromFile(this.propertySubFile, getId())) {
|
||||
if (!loadFromFile(this.propertySubFile)) {
|
||||
Log.error("Can not load Player GUI from file ... " + this.propertySubFile);
|
||||
}
|
||||
}
|
||||
|
@ -212,7 +212,7 @@ public class Label extends Widget {
|
||||
|
||||
@XmlManaged
|
||||
@XmlText
|
||||
@XmlName(value = "ZZZZZZZZZ-ploppppppp")
|
||||
@XmlName(value = "value")
|
||||
@EwolDescription(value = "Displayed value string")
|
||||
public void setPropertyValue(final String propertyValue) {
|
||||
if (this.propertyValue.equals(propertyValue)) {
|
||||
|
368
src/org/atriasoft/ewol/widget/ListFileSystem.java
Normal file
368
src/org/atriasoft/ewol/widget/ListFileSystem.java
Normal file
@ -0,0 +1,368 @@
|
||||
/*
|
||||
* @author Edouard DUPIN
|
||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||
* @license MPL v2.0 (see license file)
|
||||
*/
|
||||
package org.atriasoft.ewol.widget;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.DirectoryStream;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
|
||||
import org.atriasoft.esignal.Signal;
|
||||
import org.atriasoft.etk.Color;
|
||||
import org.atriasoft.etk.Uri;
|
||||
import org.atriasoft.etk.math.Vector2f;
|
||||
import org.atriasoft.etk.math.Vector2i;
|
||||
import org.atriasoft.etk.math.Vector3f;
|
||||
import org.atriasoft.etk.math.Vector3i;
|
||||
import org.atriasoft.ewol.annotation.EwolDescription;
|
||||
import org.atriasoft.ewol.annotation.EwolSignal;
|
||||
import org.atriasoft.ewol.event.EventInput;
|
||||
import org.atriasoft.ewol.internal.Log;
|
||||
import org.atriasoft.ewol.resource.ResourceColorFile;
|
||||
import org.atriasoft.ewol.widget.model.ListRole;
|
||||
import org.atriasoft.exml.annotation.XmlAttribute;
|
||||
import org.atriasoft.exml.annotation.XmlManaged;
|
||||
import org.atriasoft.exml.annotation.XmlName;
|
||||
import org.atriasoft.gale.key.KeyStatus;
|
||||
|
||||
/**
|
||||
* Generic display folder class. This widget display the content of a single folder :
|
||||
*/
|
||||
public class ListFileSystem extends WidgetList {
|
||||
@EwolSignal(name = "file-select")
|
||||
@EwolDescription(value = "A file has been selected in the List")
|
||||
public Signal<String> signalFileSelect = new Signal<>(); //!< @event "file-select" Generated when a file is selected.
|
||||
|
||||
@EwolSignal(name = "file-validate")
|
||||
@EwolDescription(value = "A file has been validated on the list (double clicked or return pressed)")
|
||||
public Signal<String> signalFileValidate = new Signal<>(); //!< @event "file-validate" Generate when the user validate (return) or double click on the element
|
||||
|
||||
@EwolSignal(name = "folder-select")
|
||||
@EwolDescription(value = "A folder has been selected in the List")
|
||||
public Signal<String> signalFolderSelect = new Signal<>();
|
||||
|
||||
@EwolSignal(name = "folder-validate")
|
||||
@EwolDescription(value = "A folder has been validated on the list (double clicked or return pressed)")
|
||||
public Signal<String> signalFolderValidate = new Signal<>();
|
||||
protected String propertyPath = "/"; //!< Current folder that display point on.
|
||||
protected File propertyFile = null; //!< current selected file
|
||||
protected boolean propertyShowFile = true; //!< Show files elements
|
||||
protected boolean propertyShowFolder = true; //!< Display the folders elements
|
||||
protected boolean propertyShowHidden = true; //!< Display hidden elements
|
||||
protected String propertyFilter = "^.*$"; //!< Regular expression to filter the view (for temporary file:".*(~|.bck|.pyc)\e")
|
||||
|
||||
protected ResourceColorFile colorProperty; //!< theme color property.
|
||||
protected int colorIdText = -1; //!< Color of the text.
|
||||
protected int colorIdBackground1 = -1; //!< Color of the Background.
|
||||
protected int colorIdBackground2 = -1; //!< Color of the Background 2.
|
||||
protected int colorIdBackgroundSelected = -1; //!< Color of line selected.
|
||||
protected List<File> list = new ArrayList<>(); //!< List of all element in the File. (they are filtered)
|
||||
protected int selectedLine; //!< Current Line ID that is selected
|
||||
|
||||
public ListFileSystem() {
|
||||
|
||||
this.colorProperty = new ResourceColorFile(new Uri("THEME", "/color/ListFileSystem.json", "ewol"));
|
||||
if (this.colorProperty != null) {
|
||||
this.colorIdText = this.colorProperty.request("text");
|
||||
this.colorIdBackground1 = this.colorProperty.request("background1");
|
||||
this.colorIdBackground2 = this.colorProperty.request("background2");
|
||||
this.colorIdBackgroundSelected = this.colorProperty.request("selected");
|
||||
}
|
||||
setMouseLimit(2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clean the list of element.
|
||||
*/
|
||||
protected void clearList() {
|
||||
this.list.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Color getBasicBG() {
|
||||
return this.colorProperty.get(this.colorIdBackground1);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Object getData(final ListRole role, final Vector2i pos) {
|
||||
switch (role) {
|
||||
case Text: {
|
||||
int offset = 0;
|
||||
if (this.propertyShowFolder) {
|
||||
if (this.propertyPath.equals("/")) {
|
||||
offset = 1;
|
||||
} else {
|
||||
offset = 2;
|
||||
}
|
||||
if (pos.y() == 0) {
|
||||
return ".";
|
||||
} else if (pos.y() == 1 && !this.propertyPath.equals("/")) {
|
||||
return "..";
|
||||
}
|
||||
}
|
||||
if (pos.y() - offset >= 0 && pos.y() - offset < this.list.size()) {
|
||||
Log.verbose("get filename for : {}:'{}'", this.list.get(pos.y() - offset), this.list.get(pos.y() - offset).getName());
|
||||
return this.list.get(pos.y() - offset).getName();
|
||||
}
|
||||
}
|
||||
return "+<ERROR>>>";
|
||||
case FgColor:
|
||||
return this.colorProperty.get(this.colorIdText);
|
||||
case BgColor:
|
||||
if (this.selectedLine == pos.y()) {
|
||||
return this.colorProperty.get(this.colorIdBackgroundSelected);
|
||||
}
|
||||
if (pos.y() % 2 == 0) {
|
||||
return this.colorProperty.get(this.colorIdBackground1);
|
||||
}
|
||||
return this.colorProperty.get(this.colorIdBackground2);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Vector2i getMatrixSize() {
|
||||
int offset = 0;
|
||||
if (this.propertyShowFolder) {
|
||||
if (this.propertyPath.equals("/")) {
|
||||
offset = 1;
|
||||
} else {
|
||||
offset = 2;
|
||||
}
|
||||
}
|
||||
return new Vector2i(1, this.list.size() + offset);
|
||||
}
|
||||
|
||||
@XmlManaged
|
||||
@XmlAttribute
|
||||
@XmlName(value = "select")
|
||||
@EwolDescription(value = "selection af a specific file")
|
||||
public File getPropertyFile() {
|
||||
return this.propertyFile;
|
||||
}
|
||||
|
||||
@XmlManaged
|
||||
@XmlAttribute
|
||||
@XmlName(value = "filter")
|
||||
@EwolDescription(value = "regex to filter files ...")
|
||||
public String getPropertyFilter() {
|
||||
return this.propertyFilter;
|
||||
}
|
||||
|
||||
@XmlManaged
|
||||
@XmlAttribute
|
||||
@XmlName(value = "Path")
|
||||
@EwolDescription(value = "Path to display")
|
||||
public String getPropertyPath() {
|
||||
return this.propertyPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current selected file/folder/... in the list
|
||||
* @return the String of the element selected.
|
||||
*/
|
||||
public File getSelect() {
|
||||
if (this.selectedLine >= 0) {
|
||||
return this.list.get(this.selectedLine);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@XmlManaged
|
||||
@XmlAttribute
|
||||
@XmlName(value = "show-file")
|
||||
@EwolDescription(value = "Display files")
|
||||
public boolean isPropertyShowFile() {
|
||||
return this.propertyShowFile;
|
||||
}
|
||||
|
||||
@XmlManaged
|
||||
@XmlAttribute
|
||||
@XmlName(value = "show-folder")
|
||||
@EwolDescription(value = "display folders")
|
||||
public boolean isPropertyShowFolder() {
|
||||
return this.propertyShowFolder;
|
||||
}
|
||||
|
||||
@XmlManaged
|
||||
@XmlAttribute
|
||||
@XmlName(value = "show-hidden")
|
||||
@EwolDescription(value = "Show the hidden element (file, folder, ...)")
|
||||
public boolean isPropertyShowHidden() {
|
||||
return this.propertyShowHidden;
|
||||
}
|
||||
|
||||
public List<File> listSelectedFiles(final String dir, final boolean showFiles, final boolean showFolder, final boolean showHidden) throws IOException {
|
||||
final List<File> fileList = new ArrayList<>();
|
||||
try (DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get(dir))) {
|
||||
for (final Path path : stream) {
|
||||
if (Files.isHidden(path) && !showHidden) {
|
||||
continue;
|
||||
}
|
||||
if (Files.isDirectory(path) && showFolder) {
|
||||
Log.error("Add Directory '{}'", path);
|
||||
fileList.add(new File(path.toString()));
|
||||
}
|
||||
if (!Files.isDirectory(path) && showFiles) {
|
||||
Log.error("Add File '{}'", path);
|
||||
fileList.add(new File(path.toString()));
|
||||
}
|
||||
}
|
||||
}
|
||||
return fileList;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onItemEvent(final EventInput event, final Vector3i pos, final Vector3f mousePosition) {
|
||||
int offset = 0;
|
||||
if (this.propertyShowFolder) {
|
||||
if (this.propertyPath.equals("/")) {
|
||||
offset = 1;
|
||||
} else {
|
||||
offset = 2;
|
||||
}
|
||||
}
|
||||
if (event.status() == KeyStatus.pressSingle || event.status() == KeyStatus.pressDouble) {
|
||||
Log.verbose("Event on List : IdInput=" + event.inputId() + " _pos=" + pos);
|
||||
if (1 == event.inputId()) {
|
||||
if (pos.y() > this.list.size() + offset) {
|
||||
this.selectedLine = -1;
|
||||
} else {
|
||||
this.selectedLine = pos.y();
|
||||
}
|
||||
if (this.propertyShowFolder && this.selectedLine == 0) {
|
||||
// "." folder
|
||||
if (event.status() == KeyStatus.pressSingle) {
|
||||
this.signalFolderSelect.emit(this.propertyPath);
|
||||
} else {
|
||||
this.signalFolderValidate.emit(this.propertyPath);
|
||||
}
|
||||
} else if (this.propertyShowFolder && this.selectedLine == 1) {
|
||||
// ".." folder
|
||||
if (event.status() == KeyStatus.pressSingle) {
|
||||
this.signalFolderSelect.emit(new File(this.propertyPath).getParent());
|
||||
} else {
|
||||
this.signalFolderValidate.emit(new File(this.propertyPath).getParent());
|
||||
}
|
||||
} else if (this.selectedLine - offset >= 0 && this.selectedLine - offset < this.list.size()) {
|
||||
// generate event extern:
|
||||
if (this.list.get(this.selectedLine - offset).isDirectory()) {
|
||||
if (event.status() == KeyStatus.pressSingle) {
|
||||
this.signalFolderSelect.emit(this.list.get(this.selectedLine - offset).getPath());
|
||||
} else {
|
||||
this.signalFolderValidate.emit(this.list.get(this.selectedLine - offset).getPath());
|
||||
}
|
||||
} else {
|
||||
if (event.status() == KeyStatus.pressSingle) {
|
||||
this.signalFileSelect.emit(this.list.get(this.selectedLine - offset).getPath());
|
||||
} else {
|
||||
this.signalFileValidate.emit(this.list.get(this.selectedLine - offset).getPath());
|
||||
}
|
||||
}
|
||||
}
|
||||
// need to regenerate the display of the list :
|
||||
markToRedraw();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Regenerate the content of the view. this is actually not automation on the system update.
|
||||
*/
|
||||
protected void regenerateView() {
|
||||
clearList();
|
||||
this.selectedLine = -1;
|
||||
this.list.clear();
|
||||
this.originScrooled = new Vector2f(0, 0);
|
||||
final int flags = 0;
|
||||
try {
|
||||
this.list = listSelectedFiles(this.propertyPath, this.propertyShowFile, this.propertyShowFolder, this.propertyShowHidden);
|
||||
} catch (final IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
this.list = new ArrayList<>();
|
||||
}
|
||||
Collections.sort(this.list, Comparator.comparing(File::getName));//.reversed());
|
||||
// request a redraw ...
|
||||
markToRedraw();
|
||||
}
|
||||
|
||||
public void setPropertyFile(final File propertyFile) {
|
||||
if (this.propertyFile.equals(propertyFile)) {
|
||||
return;
|
||||
}
|
||||
this.propertyFile = propertyFile;
|
||||
regenerateView();
|
||||
}
|
||||
|
||||
public void setPropertyFilter(final String propertyFilter) {
|
||||
if (!this.propertyFilter.equals(propertyFilter)) {
|
||||
return;
|
||||
}
|
||||
this.propertyFilter = propertyFilter;
|
||||
regenerateView();
|
||||
}
|
||||
|
||||
public void setPropertyPath(final String propertyPath) {
|
||||
if (this.propertyPath.equals(propertyPath)) {
|
||||
return;
|
||||
}
|
||||
this.propertyPath = propertyPath;
|
||||
regenerateView();
|
||||
}
|
||||
|
||||
public void setPropertyShowFile(final boolean propertyShowFile) {
|
||||
if (this.propertyShowFile == propertyShowFile) {
|
||||
return;
|
||||
}
|
||||
this.propertyShowFile = propertyShowFile;
|
||||
regenerateView();
|
||||
}
|
||||
|
||||
public void setPropertyShowFolder(final boolean propertyShowFolder) {
|
||||
if (this.propertyShowFolder == propertyShowFolder) {
|
||||
return;
|
||||
}
|
||||
this.propertyShowFolder = propertyShowFolder;
|
||||
regenerateView();
|
||||
}
|
||||
|
||||
public void setPropertyShowHidden(final boolean propertyShowHidden) {
|
||||
if (this.propertyShowHidden == propertyShowHidden) {
|
||||
return;
|
||||
}
|
||||
this.propertyShowHidden = propertyShowHidden;
|
||||
regenerateView();
|
||||
}
|
||||
|
||||
/**
|
||||
* Select a specific file in the File
|
||||
* @param data File to selected.
|
||||
*/
|
||||
public void setSelect(final File data) {
|
||||
// remove selected line
|
||||
this.selectedLine = -1;
|
||||
// search the coresponding file :
|
||||
for (int iii = 0; iii < this.list.size(); ++iii) {
|
||||
if (this.list.get(iii).equals(data)) {
|
||||
// we find the line :
|
||||
this.selectedLine = iii;
|
||||
break;
|
||||
}
|
||||
}
|
||||
markToRedraw();
|
||||
}
|
||||
}
|
@ -14,18 +14,20 @@ import org.atriasoft.ewol.annotation.EwolDescription;
|
||||
import org.atriasoft.ewol.annotation.EwolObjectProperty;
|
||||
import org.atriasoft.ewol.internal.Log;
|
||||
import org.atriasoft.exml.annotation.XmlAttribute;
|
||||
import org.atriasoft.exml.annotation.XmlCaseSensitive;
|
||||
import org.atriasoft.exml.annotation.XmlManaged;
|
||||
import org.atriasoft.exml.annotation.XmlName;
|
||||
|
||||
public class Sizer extends ContainerN {
|
||||
@XmlCaseSensitive(value = false)
|
||||
public enum DisplayMode {
|
||||
modeHori, //!< Vertical mode
|
||||
modeVert; //!< Horizontal mode
|
||||
HORIZONTAL, //!< Horizontal mode
|
||||
VERTICAL; //!< Vertical mode
|
||||
}
|
||||
|
||||
protected Dimension3f propertyBorderSize = Dimension3f.ZERO; //!< Border size needed for all the display
|
||||
|
||||
protected DisplayMode propertyMode = DisplayMode.modeHori; //!< Methode to display the widget list (vert/hory ...)
|
||||
protected DisplayMode propertyMode = DisplayMode.HORIZONTAL; //!< Methode to display the widget list (vert/hory ...)
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
@ -63,7 +65,7 @@ public class Sizer extends ContainerN {
|
||||
final Vector3f tmpSize = it.getCalculateMinSize();
|
||||
Log.verbose("[" + getId() + "] NewMinSize=" + tmpSize);
|
||||
Log.verbose("[" + getId() + "] {" + getClass().getCanonicalName() + "} Get minSize=" + tmpSize);
|
||||
if (this.propertyMode == DisplayMode.modeVert) {
|
||||
if (this.propertyMode == DisplayMode.VERTICAL) {
|
||||
this.minSize = this.minSize.withY(this.minSize.y() + tmpSize.y());
|
||||
if (tmpSize.x() > this.minSize.x()) {
|
||||
this.minSize = this.minSize.withX(tmpSize.x());
|
||||
@ -111,7 +113,7 @@ public class Sizer extends ContainerN {
|
||||
continue;
|
||||
}
|
||||
final Vector3f tmpSize = it.getCalculateMinSize();
|
||||
if (this.propertyMode == DisplayMode.modeVert) {
|
||||
if (this.propertyMode == DisplayMode.VERTICAL) {
|
||||
minSize = new Vector3f(Math.max(minSize.x(), tmpSize.x()), minSize.y() + tmpSize.y(), Math.max(minSize.z(), tmpSize.z()));
|
||||
} else {
|
||||
minSize = new Vector3f(minSize.x() + tmpSize.x(), Math.max(minSize.y(), tmpSize.y()), Math.max(minSize.z(), tmpSize.z()));
|
||||
@ -122,7 +124,7 @@ public class Sizer extends ContainerN {
|
||||
// -2- Calculate the size to add at every elements...
|
||||
float deltaExpandSize = 0.0f;
|
||||
if (!nbWidgetExpand.isEqual(Vector3i.ZERO)) {
|
||||
if (this.propertyMode == DisplayMode.modeVert) {
|
||||
if (this.propertyMode == DisplayMode.VERTICAL) {
|
||||
deltaExpandSize = (localWidgetSize.y() - minSize.y()) / (nbWidgetExpand.y());
|
||||
} else {
|
||||
deltaExpandSize = (localWidgetSize.x() - minSize.x()) / (nbWidgetExpand.x());
|
||||
@ -143,7 +145,7 @@ public class Sizer extends ContainerN {
|
||||
float residualNext = 0.0f;
|
||||
// get the number of element that need to devide...
|
||||
int countCalculation = nbWidgetExpand.x();
|
||||
if (this.propertyMode == DisplayMode.modeVert) {
|
||||
if (this.propertyMode == DisplayMode.VERTICAL) {
|
||||
countCalculation = nbWidgetExpand.y();
|
||||
}
|
||||
// -4.1- Update every subWidget size
|
||||
@ -158,7 +160,7 @@ public class Sizer extends ContainerN {
|
||||
Vector3f tmpSizeMin = it.getSize();
|
||||
final Vector3f tmpSizeMax = it.getCalculateMaxSize();
|
||||
// Now update his size his size in X and the current sizer size in Y:
|
||||
if (this.propertyMode == DisplayMode.modeVert) {
|
||||
if (this.propertyMode == DisplayMode.VERTICAL) {
|
||||
if (it.canExpand().y() || (it == lastWidget && it.canExpandIfFree().y())) {
|
||||
float sizeExpand = tmpSizeMin.y() + deltaExpandSize;
|
||||
if (sizeExpand > tmpSizeMax.y()) {
|
||||
@ -190,7 +192,7 @@ public class Sizer extends ContainerN {
|
||||
if (countCalculation <= 0) {
|
||||
break;
|
||||
}
|
||||
if (this.propertyMode == DisplayMode.modeVert) {
|
||||
if (this.propertyMode == DisplayMode.VERTICAL) {
|
||||
deltaExpandSize = residualNext / (countCalculation);
|
||||
} else {
|
||||
deltaExpandSize = residualNext / (countCalculation);
|
||||
@ -206,7 +208,7 @@ public class Sizer extends ContainerN {
|
||||
continue;
|
||||
}
|
||||
// Now update his size, his size in X and the current sizer size in Y:
|
||||
if (this.propertyMode == DisplayMode.modeVert) {
|
||||
if (this.propertyMode == DisplayMode.VERTICAL) {
|
||||
if (!it.canExpand().x() && !it.canExpandIfFree().x()) {
|
||||
continue;
|
||||
}
|
||||
@ -236,7 +238,7 @@ public class Sizer extends ContainerN {
|
||||
continue;
|
||||
}
|
||||
final Vector3f size = it.getSize();
|
||||
if (this.propertyMode == DisplayMode.modeVert) {
|
||||
if (this.propertyMode == DisplayMode.VERTICAL) {
|
||||
underSize = new Vector3f(Math.max(underSize.x(), size.x()), underSize.y() + size.y(), Math.max(underSize.z(), size.z()));
|
||||
} else {
|
||||
underSize = new Vector3f(underSize.x() + size.x(), Math.max(underSize.y(), size.y()), Math.max(underSize.z(), size.z()));
|
||||
@ -253,13 +255,13 @@ public class Sizer extends ContainerN {
|
||||
}
|
||||
Vector3f origin;
|
||||
final Vector3f size = it.getSize();
|
||||
if (this.propertyMode == DisplayMode.modeVert) {
|
||||
if (this.propertyMode == DisplayMode.VERTICAL) {
|
||||
origin = Vector3f.clipInt(tmpOrigin.add(this.offset).add(this.propertyGravity.gravityGenerateDelta(new Vector3f(underSize.x() - size.x(), 0.0f, 0.0f))));
|
||||
} else {
|
||||
origin = Vector3f.clipInt(tmpOrigin.add(this.offset).add(this.propertyGravity.gravityGenerateDelta(new Vector3f(0.0f, underSize.y() - size.y(), 0.0f))));
|
||||
}
|
||||
it.setOrigin(origin);
|
||||
if (this.propertyMode == DisplayMode.modeVert) {
|
||||
if (this.propertyMode == DisplayMode.VERTICAL) {
|
||||
tmpOrigin = tmpOrigin.withY(tmpOrigin.y() + size.y());
|
||||
} else {
|
||||
tmpOrigin = tmpOrigin.withX(tmpOrigin.x() + size.x());
|
||||
|
398
src/org/atriasoft/ewol/widget/WidgetList.java
Normal file
398
src/org/atriasoft/ewol/widget/WidgetList.java
Normal file
@ -0,0 +1,398 @@
|
||||
/*
|
||||
* @author Edouard DUPIN
|
||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||
* @license MPL v2.0 (see license file)
|
||||
*/
|
||||
package org.atriasoft.ewol.widget;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.atriasoft.etk.Color;
|
||||
import org.atriasoft.etk.math.Vector2f;
|
||||
import org.atriasoft.etk.math.Vector2i;
|
||||
import org.atriasoft.etk.math.Vector3f;
|
||||
import org.atriasoft.etk.math.Vector3i;
|
||||
import org.atriasoft.ewol.compositing.Compositing;
|
||||
import org.atriasoft.ewol.compositing.CompositingDrawing;
|
||||
import org.atriasoft.ewol.compositing.CompositingText;
|
||||
import org.atriasoft.ewol.event.EventInput;
|
||||
import org.atriasoft.ewol.internal.Log;
|
||||
import org.atriasoft.ewol.widget.model.ListRole;
|
||||
|
||||
class WidgetList extends WidgetScrolled {
|
||||
// drawing capabilities ....
|
||||
protected List<Compositing> listOObject = new ArrayList<>(); //!< generic element to display...
|
||||
|
||||
protected List<Integer> listSizeX = new ArrayList<>(); //!< size of every colomns
|
||||
|
||||
protected List<Integer> listSizeY = new ArrayList<>(); //!< size of every rows
|
||||
protected Map<String, Compositing> compositingElements = new HashMap<>();
|
||||
// list properties ...
|
||||
protected int paddingSizeX = 0;
|
||||
protected int paddingSizeY = 0;
|
||||
|
||||
protected int displayStartRaw = 0; //!< Current starting diaplayed raw
|
||||
|
||||
protected int displayCurrentNbLine = 0; //!< Number of line in the display
|
||||
|
||||
protected int nbVisibleRaw = 0; // set the number of visible raw (calculate don display)
|
||||
// function call to display the list :
|
||||
|
||||
public WidgetList() {
|
||||
this.paddingSizeX = 2;
|
||||
this.paddingSizeY = 2;
|
||||
this.nbVisibleRaw = 0;
|
||||
this.propertyCanFocus = true;
|
||||
this.limitScrolling = new Vector2f(1.0f, 0.5f);
|
||||
addComposeElemnent("drawing", new CompositingDrawing());
|
||||
addComposeElemnent("text", new CompositingText());
|
||||
}
|
||||
|
||||
protected void addComposeElemnent(final String name, final Compositing element) {
|
||||
this.compositingElements.put(name, element);
|
||||
//this.listOObject.add(element);
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate an element size to estimate the render size.
|
||||
* @note Does not generate the with the same size.
|
||||
* @param pos Position of column and Raw of the element.
|
||||
* @return The estimate size of the element.
|
||||
*/
|
||||
protected Vector2f calculateElementSize(final Vector2i pos) {
|
||||
if (getComposeElemnent("text") instanceof final CompositingText tmpText) {
|
||||
if (getData(ListRole.Text, pos) instanceof final String myTextToWrite) {
|
||||
final Vector3f textSize = tmpText.calculateSize(myTextToWrite);
|
||||
//final Vector2i count = getMatrixSize();
|
||||
return new Vector2f(textSize.x(), textSize.y() + this.paddingSizeY * 3);
|
||||
}
|
||||
}
|
||||
return Vector2f.ZERO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void calculateMinMaxSize() {
|
||||
/*int fontId = getDefaultFontId();
|
||||
int minWidth = ewol::getWidth(fontId, this.label);
|
||||
int minHeight = ewol::getHeight(fontId);
|
||||
this.minSize.x = 3+minWidth;
|
||||
this.minSize.y = 3+minHeight;
|
||||
*/
|
||||
this.minSize = new Vector3f(200, 150, 10);
|
||||
}
|
||||
|
||||
protected void clearComposeElemnent() {
|
||||
for (final Entry<String, Compositing> it : this.compositingElements.entrySet()) {
|
||||
//it.setValue(null);
|
||||
it.getValue().clear();
|
||||
}
|
||||
}
|
||||
|
||||
public void clearOObjectList() {
|
||||
//this.listOObject.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Draw the background
|
||||
*/
|
||||
protected void drawBackground() {
|
||||
if (getComposeElemnent("drawing") instanceof final CompositingDrawing BGOObjects) {
|
||||
final Color basicBG = getBasicBG();
|
||||
BGOObjects.setColor(basicBG);
|
||||
BGOObjects.setPos(Vector3f.ZERO);
|
||||
BGOObjects.rectangleWidth(new Vector2f(this.size.x(), this.size.y()));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Draw an element in the specific size and position.
|
||||
* @param pos Position of colomn and Raw of the element.
|
||||
* @param start Start display position.
|
||||
* @param size Render raw size
|
||||
* @return The estimate size of the element.
|
||||
*/
|
||||
protected void drawElement(final Vector2i pos, final Vector2f start, final Vector2f size) {
|
||||
if (getData(ListRole.Text, pos) instanceof final String myTextToWrite) {
|
||||
if (getData(ListRole.BgColor, pos) instanceof final Color bg) {
|
||||
if (getComposeElemnent("drawing") instanceof final CompositingDrawing BGOObjects) {
|
||||
BGOObjects.setColor(bg);
|
||||
BGOObjects.setPos(new Vector3f(start.x(), start.y(), 0));
|
||||
BGOObjects.rectangleWidth(size);
|
||||
}
|
||||
}
|
||||
if (!myTextToWrite.isEmpty()) {
|
||||
if (getData(ListRole.FgColor, pos) instanceof final Color fg) {
|
||||
if (getComposeElemnent("text") instanceof final CompositingText tmpText) {
|
||||
final int displayPositionY = (int) (start.y() + this.paddingSizeY);
|
||||
tmpText.setColor(fg);
|
||||
tmpText.setPos(new Vector3f(start.x() + this.paddingSizeX, displayPositionY, 0));
|
||||
tmpText.print(myTextToWrite);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void flushElements() {
|
||||
for (final Entry<String, Compositing> it : this.compositingElements.entrySet()) {
|
||||
it.getValue().flush();
|
||||
}
|
||||
for (final Compositing elem : this.listOObject) {
|
||||
if (elem != null) {
|
||||
elem.flush();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected Color getBasicBG() {
|
||||
return new Color(0xFF, 0xFF, 0xFF, 0xFF);
|
||||
}
|
||||
|
||||
protected Compositing getComposeElemnent(final String name) {
|
||||
return this.compositingElements.get(name);
|
||||
}
|
||||
|
||||
protected Object getData(final ListRole role, final Vector2i pos) {
|
||||
switch (role) {
|
||||
case Text:
|
||||
return "";
|
||||
case FgColor:
|
||||
return new Color(0x00, 0x00, 0x00, 0xFF);
|
||||
case BgColor:
|
||||
if (pos.y() % 2 == 0) {
|
||||
return new Color(0xFF, 0xFF, 0xFF, 0xFF);
|
||||
}
|
||||
return new Color(0x7F, 0x7F, 0x7F, 0xFF);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the number of colomn and row availlable in the list
|
||||
* @return Number of colomn and row
|
||||
*/
|
||||
protected Vector2i getMatrixSize() {
|
||||
return new Vector2i(1, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDraw() {
|
||||
for (final Entry<String, Compositing> it : this.compositingElements.entrySet()) {
|
||||
it.getValue().draw();
|
||||
}
|
||||
for (final Compositing elem : this.listOObject) {
|
||||
if (elem != null) {
|
||||
elem.draw();
|
||||
}
|
||||
}
|
||||
super.onDraw();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onEventInput(final EventInput event) {
|
||||
Vector3f relativePos = relativePosition(new Vector3f(event.pos().x(), event.pos().y(), 0));
|
||||
if (super.onEventInput(event)) {
|
||||
keepFocus();
|
||||
// nothing to do ... done on upper widget ...
|
||||
return true;
|
||||
}
|
||||
if (this.listSizeY.size() == 0) {
|
||||
return false;
|
||||
}
|
||||
relativePos = new Vector3f(relativePos.x() + this.originScrooled.x(), this.size.y() - relativePos.y() + this.originScrooled.y(), 0);
|
||||
// Find the colomn and the row
|
||||
Vector3i pos = Vector3i.ZERO;
|
||||
float offsetY = 0;
|
||||
for (int iii = 0; iii < this.listSizeY.size() - 1; iii++) {
|
||||
final int previous = (int) offsetY;
|
||||
offsetY += this.listSizeY.get(iii);
|
||||
if (relativePos.y() < offsetY && relativePos.y() >= previous) {
|
||||
pos = pos.withY(iii);
|
||||
offsetY = previous;
|
||||
break;
|
||||
}
|
||||
if (iii == this.listSizeY.size() - 2 && relativePos.y() >= offsetY) {
|
||||
pos = pos.withY(iii + 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
float offsetX = 0;
|
||||
for (int iii = 0; iii < this.listSizeX.size() - 1; iii++) {
|
||||
final int previous = (int) offsetX;
|
||||
offsetX += this.listSizeX.get(iii);
|
||||
if (relativePos.x() < offsetX && relativePos.x() >= previous) {
|
||||
pos = pos.withX(iii);
|
||||
offsetX = previous;
|
||||
break;
|
||||
}
|
||||
if (iii == this.listSizeX.size() - 2 && relativePos.x() >= offsetX) {
|
||||
pos = pos.withX(iii + 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
final Vector3f posInternalMouse = relativePos.less(offsetX, offsetY, 0);
|
||||
final boolean isUsed = onItemEvent(event, pos, posInternalMouse);
|
||||
if (isUsed) {
|
||||
// TODO : this generate bugs ... I did not understand why ..
|
||||
//WidgetManager::focusKeep(this);
|
||||
}
|
||||
return isUsed;
|
||||
}
|
||||
|
||||
/**
|
||||
* set a raw visible in the main display
|
||||
* @param _id Id of the raw that might be visible.
|
||||
*/
|
||||
//void setRawVisible(int _id);
|
||||
@Override
|
||||
protected void onGetFocus() {
|
||||
Log.debug("WidgetList get focus");
|
||||
}
|
||||
|
||||
protected boolean onItemEvent(final EventInput event, final Vector3i pos, final Vector3f mousePosition) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onLostFocus() {
|
||||
Log.debug("WidgetList Lost focus");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRegenerateDisplay() {
|
||||
if (!needRedraw()) {
|
||||
return;
|
||||
}
|
||||
// clean the object list ...
|
||||
clearComposeElemnent();
|
||||
// -------------------------------------------------------
|
||||
// -- Calculate the size of each element
|
||||
// -------------------------------------------------------
|
||||
final Vector2i matrixSize = getMatrixSize();
|
||||
// set the correct number of element in the List
|
||||
this.listSizeX.clear();
|
||||
for (int iii = 0; iii < matrixSize.x(); iii++) {
|
||||
this.listSizeX.add(0);
|
||||
}
|
||||
// set the correct number of element in the List
|
||||
this.listSizeY.clear();
|
||||
for (int iii = 0; iii < matrixSize.y(); iii++) {
|
||||
this.listSizeY.add(0);
|
||||
}
|
||||
// set real values
|
||||
for (int yyy = 0; yyy < matrixSize.y(); ++yyy) {
|
||||
for (int xxx = 0; xxx < matrixSize.x(); ++xxx) {
|
||||
final Vector2i pos = new Vector2i(xxx, yyy);
|
||||
final Vector2f elementSize = calculateElementSize(pos);
|
||||
if (elementSize.x() > this.listSizeX.get(xxx)) {
|
||||
this.listSizeX.set(xxx, (int) elementSize.x());
|
||||
}
|
||||
if (elementSize.y() > this.listSizeY.get(yyy)) {
|
||||
this.listSizeY.set(yyy, (int) elementSize.y());
|
||||
}
|
||||
}
|
||||
}
|
||||
// -------------------------------------------------------
|
||||
// -- Fill property appliance
|
||||
// -------------------------------------------------------
|
||||
if (this.propertyFill.x()) {
|
||||
int fullSize = 0;
|
||||
for (final int size : this.listSizeX) {
|
||||
fullSize += size;
|
||||
}
|
||||
if (fullSize < this.size.x()) {
|
||||
// need to expand all elements:
|
||||
final int residualAdd = (int) ((this.size.x() - fullSize) / matrixSize.x());
|
||||
if (residualAdd != 0) {
|
||||
for (int iii = 0; iii < this.listSizeX.size(); iii++) {
|
||||
this.listSizeX.set(iii, this.listSizeX.get(iii) + residualAdd);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
if (propertyFill.y() == true) {
|
||||
int fullSize = 0;
|
||||
for (auto size: this.listSizeY) {
|
||||
fullSize += size;
|
||||
}
|
||||
if (fullSize < this.size.y() ) {
|
||||
// need to expand all elements:
|
||||
int residualAdd = (this.size.y() - fullSize) / matrixSize.y();
|
||||
if (residualAdd != 0) {
|
||||
for (auto size: this.listSizeY) {
|
||||
size += residualAdd;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
// -------------------------------------------------------
|
||||
// -- Calculate the start position size of each element
|
||||
// -------------------------------------------------------
|
||||
final List<Integer> listStartPosX = new ArrayList<>();
|
||||
final List<Integer> listStartPosY = new ArrayList<>();
|
||||
int lastPositionX = 0;
|
||||
for (final Integer size : this.listSizeX) {
|
||||
listStartPosX.add(lastPositionX);
|
||||
lastPositionX += size;
|
||||
}
|
||||
int lastPositionY = 0;
|
||||
for (final Integer size : this.listSizeY) {
|
||||
lastPositionY += size;
|
||||
listStartPosY.add(lastPositionY);
|
||||
}
|
||||
// -------------------------------------------------------
|
||||
// -- Update the scroolBar
|
||||
// -------------------------------------------------------
|
||||
this.maxSize = new Vector2f(lastPositionX, lastPositionY);
|
||||
// -------------------------------------------------------
|
||||
// -- Clean the background
|
||||
// -------------------------------------------------------
|
||||
drawBackground();
|
||||
// -------------------------------------------------------
|
||||
// -- Draw each element
|
||||
// -------------------------------------------------------
|
||||
for (int yyy = 0; yyy < matrixSize.y(); ++yyy) {
|
||||
final float startYposition = this.size.y() + this.originScrooled.y() - listStartPosY.get(yyy);
|
||||
if (startYposition + this.listSizeY.get(yyy) < 0) {
|
||||
// ==> element out of range ==> nothing to display
|
||||
break;
|
||||
}
|
||||
if (startYposition > this.size.y()) {
|
||||
// ==> element out of range ==> nothing to display
|
||||
continue;
|
||||
}
|
||||
for (int xxx = 0; xxx < matrixSize.x(); ++xxx) {
|
||||
final float startXposition = -this.originScrooled.x() + listStartPosX.get(xxx);
|
||||
//Log.error("display start: " + startXposition);
|
||||
if (startXposition + this.listSizeX.get(xxx) < 0) {
|
||||
// ==> element out of range ==> nothing to display
|
||||
continue;
|
||||
}
|
||||
if (startXposition > this.size.x()) {
|
||||
// ==> element out of range ==> nothing to display
|
||||
break;
|
||||
}
|
||||
drawElement(new Vector2i(xxx, yyy), new Vector2f(startXposition, startYposition), new Vector2f(this.listSizeX.get(xxx), this.listSizeY.get(yyy)));
|
||||
}
|
||||
}
|
||||
// -------------------------------------------------------
|
||||
// -- Draw Scrolling widget
|
||||
// -------------------------------------------------------
|
||||
super.onRegenerateDisplay();
|
||||
// flush all compositing drawing
|
||||
flushElements();
|
||||
}
|
||||
|
||||
protected void removeComposeElemnent() {
|
||||
this.compositingElements.clear();
|
||||
}
|
||||
|
||||
}
|
@ -30,18 +30,12 @@ class WidgetScrolled extends Widget {
|
||||
}
|
||||
|
||||
public static final int CALCULATE_SIMULTANEOUS_FINGER = 5;
|
||||
protected Uri propertyShapeVert = new Uri("THEME_GUI", "WidgetScrolled.json", "ewol"); //!< Vertical shaper name
|
||||
|
||||
protected Uri propertyShapeHori = new Uri("THEME_GUI", "WidgetScrolled.json", "ewol"); //!< Horizontal shaper name
|
||||
|
||||
private GuiShape shaperH; //!< Compositing theme Horizontal.
|
||||
|
||||
private GuiShape shaperV; //!< Compositing theme Vertical.
|
||||
|
||||
protected Uri propertyShapeVert = new Uri("THEME", "shape/WidgetScrolled.json", "ewol"); //!< Vertical shaper name
|
||||
protected Uri propertyShapeHori = new Uri("THEME", "shape/WidgetScrolled.json", "ewol"); //!< Horizontal shaper name
|
||||
private GuiShape shaperH = null; //!< Compositing theme Horizontal.
|
||||
private GuiShape shaperV = null; //!< Compositing theme Vertical.
|
||||
protected Vector2f originScrooled = Vector2f.ZERO; //!< pixel distance from the origin of the display (Bottum left)
|
||||
|
||||
protected Vector2f maxSize; //!< Maximum size of the Widget ==> to display scrollbar
|
||||
|
||||
protected Vector2f limitScrolling = Vector2f.ZERO; //!< Mimit scrolling represent the propertion of the minimel scrolling activate (0.2 ==> 20% migt all time be visible)
|
||||
// Mouse section :
|
||||
private ScrollingMode scroollingMode = ScrollingMode.scroolModeNormal; //!< mode of management of the scrooling
|
||||
@ -57,7 +51,7 @@ class WidgetScrolled extends Widget {
|
||||
private final Vector2f[] fingerMoveStartPos = new Vector2f[CALCULATE_SIMULTANEOUS_FINGER];
|
||||
|
||||
/**
|
||||
* Scroll Widget main ructor to be herited from an other widget (this is not a stand-alone widget)
|
||||
* Scroll Widget main constructor to be inherited from an other widget (this is not a stand-alone widget)
|
||||
* @param _shaperName Shaper name if the scrolled widget.
|
||||
*/
|
||||
public WidgetScrolled() {
|
||||
@ -91,12 +85,20 @@ class WidgetScrolled extends Widget {
|
||||
}
|
||||
|
||||
protected void onChangePropertyShapeHori() {
|
||||
this.shaperH.setSource(this.propertyShapeHori);
|
||||
if (this.shaperH == null) {
|
||||
this.shaperH = new GuiShape(this.propertyShapeHori);
|
||||
} else {
|
||||
this.shaperH.setSource(this.propertyShapeHori);
|
||||
}
|
||||
markToRedraw();
|
||||
}
|
||||
|
||||
protected void onChangePropertyShapeVert() {
|
||||
this.shaperV.setSource(this.propertyShapeVert);
|
||||
if (this.shaperV == null) {
|
||||
this.shaperV = new GuiShape(this.propertyShapeVert);
|
||||
} else {
|
||||
this.shaperV.setSource(this.propertyShapeVert);
|
||||
}
|
||||
markToRedraw();
|
||||
}
|
||||
|
||||
|
@ -8,12 +8,15 @@ import org.atriasoft.exml.annotation.XmlFactory.InterfaceXmlFactoryAccess;
|
||||
public class WidgetXmlFactory implements InterfaceXmlFactoryAccess {
|
||||
private static Map<String, Class<?>> listWidgetAvaillable = new HashMap<>();
|
||||
static {
|
||||
listWidgetAvaillable.put("Button", Button.class);
|
||||
listWidgetAvaillable.put("Sizer", Sizer.class);
|
||||
listWidgetAvaillable.put("Spacer", Spacer.class);
|
||||
listWidgetAvaillable.put("Label", Label.class);
|
||||
listWidgetAvaillable.put("CheckBox", CheckBox.class);
|
||||
listWidgetAvaillable.put("Tick", Tick.class);
|
||||
listWidgetAvaillable.put("Entry", Entry.class);
|
||||
listWidgetAvaillable.put("Image", ImageDisplay.class);
|
||||
listWidgetAvaillable.put("Button", Button.class);
|
||||
listWidgetAvaillable.put("Tick", Tick.class);
|
||||
listWidgetAvaillable.put("CheckBox", CheckBox.class);
|
||||
listWidgetAvaillable.put("ListFileSystem", ListFileSystem.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
14
src/org/atriasoft/ewol/widget/model/ListRole.java
Normal file
14
src/org/atriasoft/ewol/widget/model/ListRole.java
Normal file
@ -0,0 +1,14 @@
|
||||
package org.atriasoft.ewol.widget.model;
|
||||
|
||||
public enum ListRole {
|
||||
Text, // string
|
||||
IsSelected, // bool
|
||||
IsExpand, // bool
|
||||
Icon, // string
|
||||
ChildCount, // uint_t
|
||||
HaveChild, // bool
|
||||
ParentId, // uint_t
|
||||
BgColor, // color
|
||||
FgColor, // color
|
||||
DistanceToRoot, // uint_t
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user