[DEV] continue transcoding
This commit is contained in:
parent
2e0a24f1c3
commit
4df776a15c
@ -1,330 +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/Gird.hpp>
|
|
||||||
#include <ewol/widget/Manager.hpp>
|
|
||||||
|
|
||||||
#include <etk/typeInfo.hpp>
|
|
||||||
ETK_DECLARE_TYPE(ewol::widget::Gird);
|
|
||||||
|
|
||||||
ewol::widget::Gird::Gird() :
|
|
||||||
this.sizeRow(0),
|
|
||||||
this.tmpWidget(null),
|
|
||||||
this.gavityButtom(true),
|
|
||||||
this.borderSize(0,0) {
|
|
||||||
addObjectType("ewol::widget::Gird");
|
|
||||||
requestUpdateSize();
|
|
||||||
}
|
|
||||||
|
|
||||||
ewol::widget::Gird::~Gird() {
|
|
||||||
Log.debug("[" + getId() + "]={" + getObjectType() + "} Gird : destroy");
|
|
||||||
subWidgetRemoveAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Gird::setBorderSize( Vector2i _newBorderSize) {
|
|
||||||
this.borderSize = _newBorderSize;
|
|
||||||
if (this.borderSize.x() < 0) {
|
|
||||||
Log.error("Try to set a border size <0 on x : " + this.borderSize.x() + " == > restore to 0");
|
|
||||||
this.borderSize.setX(0);
|
|
||||||
}
|
|
||||||
if (this.borderSize.y() < 0) {
|
|
||||||
Log.error("Try to set a border size <0 on y : " + this.borderSize.y() + " == > restore to 0");
|
|
||||||
this.borderSize.setY(0);
|
|
||||||
}
|
|
||||||
markToRedraw();
|
|
||||||
requestUpdateSize();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Gird::onChangeSize() {
|
|
||||||
//Log.debug("Update size");
|
|
||||||
this.size -= this.borderSize*2;
|
|
||||||
|
|
||||||
for (int iii=0; iii<this.subWidget.size(); iii++) {
|
|
||||||
if (this.subWidget[iii].widget != null) {
|
|
||||||
//calculate the origin :
|
|
||||||
Vector2f tmpOrigin = this.origin + this.borderSize;
|
|
||||||
if (false == this.gavityButtom) {
|
|
||||||
tmpOrigin += Vector2f(0, this.size.y()-this.borderSize.y());
|
|
||||||
}
|
|
||||||
|
|
||||||
int tmpSizeWidth = 0;
|
|
||||||
for (int jjj=0; jjj<this.subWidget[iii].col; jjj++ ){
|
|
||||||
tmpSizeWidth += abs(this.sizeCol[jjj]);
|
|
||||||
}
|
|
||||||
// adding Y origin :
|
|
||||||
int addingPos = 0;
|
|
||||||
if (true == this.gavityButtom) {
|
|
||||||
addingPos = (this.subWidget[iii].row)*this.uniformSizeRow;
|
|
||||||
} else {
|
|
||||||
addingPos = -(this.subWidget[iii].row+1)*this.uniformSizeRow;
|
|
||||||
}
|
|
||||||
tmpOrigin += Vector2f(tmpSizeWidth, addingPos);
|
|
||||||
|
|
||||||
Log.debug(" [" + iii + "] set subwidget origin=" +tmpOrigin + " size=" + Vector2i(abs(this.sizeCol[this.subWidget[iii].col]), this.uniformSizeRow) );
|
|
||||||
// set the origin :
|
|
||||||
this.subWidget[iii].widget.setOrigin(Vector2fClipInt32(tmpOrigin));
|
|
||||||
// all time set oll the space .
|
|
||||||
this.subWidget[iii].widget.setSize(Vector2fClipInt32(Vector2f(abs(this.sizeCol[this.subWidget[iii].col]), this.uniformSizeRow)));
|
|
||||||
this.subWidget[iii].widget.onChangeSize();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.size += this.borderSize*2;
|
|
||||||
Log.debug("Calculate size : " + this.size);
|
|
||||||
markToRedraw();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Gird::calculateMinMaxSize() {
|
|
||||||
for (int iii=0; iii<this.sizeCol.size(); iii++ ){
|
|
||||||
if (this.sizeCol[iii] <= 0) {
|
|
||||||
this.sizeCol[iii] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//Log.debug("Update minimum size");
|
|
||||||
this.minSize = propertyMinSize.getPixel();
|
|
||||||
this.maxSize = propertyMaxSize.getPixel();
|
|
||||||
this.uniformSizeRow = 0;
|
|
||||||
this.minSize += this.borderSize*2;
|
|
||||||
int lastLineID = 0;
|
|
||||||
for (int iii=0; iii<this.subWidget.size(); iii++) {
|
|
||||||
if (this.subWidget[iii].row > lastLineID) {
|
|
||||||
// change of line :
|
|
||||||
lastLineID = this.subWidget[iii].row;
|
|
||||||
}
|
|
||||||
if (this.subWidget[iii].widget != null) {
|
|
||||||
this.subWidget[iii].widget.calculateMinMaxSize();
|
|
||||||
Vector2f tmpSize = this.subWidget[iii].widget.getCalculateMinSize();
|
|
||||||
Log.debug(" [" + iii + "] subWidgetMinSize=" + tmpSize);
|
|
||||||
// for all we get the max size :
|
|
||||||
this.uniformSizeRow = etk::max((int)tmpSize.y(), this.uniformSizeRow);
|
|
||||||
// for the colomn size : We set the autamatic value in negative :
|
|
||||||
if (this.sizeCol[this.subWidget[iii].col] <= 0) {
|
|
||||||
this.sizeCol[this.subWidget[iii].col] = etk::min(this.sizeCol[this.subWidget[iii].col], (int)-tmpSize.x() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.sizeRow > 0) {
|
|
||||||
this.uniformSizeRow = this.sizeRow;
|
|
||||||
}
|
|
||||||
int tmpSizeWidth = 0;
|
|
||||||
for (int iii=0; iii<this.sizeCol.size(); iii++ ){
|
|
||||||
tmpSizeWidth += abs(this.sizeCol[iii]);
|
|
||||||
}
|
|
||||||
Log.debug(" tmpSizeWidth=" + tmpSizeWidth);
|
|
||||||
Log.debug(" this.uniformSizeRow=" + this.uniformSizeRow);
|
|
||||||
this.minSize += Vector2i(tmpSizeWidth, (lastLineID+1)*this.uniformSizeRow);
|
|
||||||
|
|
||||||
Log.debug("Calculate min size : " + this.minSize);
|
|
||||||
|
|
||||||
//Log.debug("Vert Result : expand="+ this.userExpand + " minSize="+ this.minSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Gird::setColNumber(int _colNumber) {
|
|
||||||
if ((long)this.sizeCol.size() > _colNumber) {
|
|
||||||
int errorControl = this.subWidget.size();
|
|
||||||
// remove subWidget :
|
|
||||||
for (long iii=this.subWidget.size(); iii >= 0; iii--) {
|
|
||||||
if (this.subWidget[iii].col > (_colNumber-1)) {
|
|
||||||
// out of bounds : must remove it ...
|
|
||||||
if (this.subWidget[iii].widget != null) {
|
|
||||||
this.subWidget[iii].widget.reset();
|
|
||||||
// no remove, this element is removed with the function onObjectRemove == > it does not exist anymore ...
|
|
||||||
if (errorControl == this.subWidget.size()) {
|
|
||||||
Log.critical("[" + getId() + "] The number of element might have been reduced ... == > it is not the case ==> the herited class must call the \"OnObjectRemove\" function...");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Log.warning("[" + getId() + "] Must not have null pointer on the subWidget list ...");
|
|
||||||
this.subWidget.erase(this.subWidget.begin()+iii);
|
|
||||||
}
|
|
||||||
errorControl = this.subWidget.size();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// just add the col size:
|
|
||||||
this.sizeCol.erase(this.sizeCol.end());
|
|
||||||
} else {
|
|
||||||
// just add the col size:
|
|
||||||
for (int iii=this.sizeCol.size()-1; iii<_colNumber-1 ; iii++) {
|
|
||||||
this.sizeCol.pushBack(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Gird::setColSize(int _colId, int _size) {
|
|
||||||
if ((long)this.sizeCol.size() > _colId) {
|
|
||||||
this.sizeCol[_colId] = _size;
|
|
||||||
} else {
|
|
||||||
Log.error("Can not set the Colomn size : " + _colId+1
|
|
||||||
+ " at " + _size + "px we have "
|
|
||||||
+ this.sizeCol.size() + " colomn");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Gird::setRowSize(int _size) {
|
|
||||||
this.sizeRow = _size;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ewol::widget::Gird::getColSize(int _colId) {
|
|
||||||
if ((long)this.sizeCol.size() > _colId) {
|
|
||||||
if (this.sizeCol[_colId] <= 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return this.sizeCol[_colId];
|
|
||||||
}
|
|
||||||
Log.error("Can not get the Colomn size : " + _colId+1 + " we have "+ this.sizeCol.size() + " colomn");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ewol::widget::Gird::getRowSize() {
|
|
||||||
return this.sizeRow;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Gird::subWidgetRemoveAll() {
|
|
||||||
int errorControl = this.subWidget.size();
|
|
||||||
this.subWidget.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ewol::widget::Gird::subWidgetAdd(int _colId, int _rowId, Widget _newWidget) {
|
|
||||||
if (_newWidget == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
GirdProperties prop;
|
|
||||||
prop.row = _rowId;
|
|
||||||
prop.col = _colId;
|
|
||||||
prop.widget = _newWidget;
|
|
||||||
|
|
||||||
// need to find the correct position :
|
|
||||||
for (int iii=0; iii<this.subWidget.size(); iii++) {
|
|
||||||
if (this.subWidget[iii].row < prop.row) {
|
|
||||||
continue;
|
|
||||||
} else if (this.subWidget[iii].row > prop.row) {
|
|
||||||
// find a new position;
|
|
||||||
this.subWidget.insert(this.subWidget.begin()+iii, prop);
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
if (this.subWidget[iii].col < prop.col) {
|
|
||||||
continue;
|
|
||||||
} else if (this.subWidget[iii].col > prop.col) {
|
|
||||||
// find a new position;
|
|
||||||
this.subWidget.insert(this.subWidget.begin()+iii, prop);
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
// The element already exist == > replace it ...
|
|
||||||
this.tmpWidget = this.subWidget[iii].widget;
|
|
||||||
this.subWidget[iii].widget = _newWidget;
|
|
||||||
if (this.tmpWidget != null) {
|
|
||||||
this.tmpWidget.reset();
|
|
||||||
if (this.tmpWidget != null) {
|
|
||||||
Log.critical("[" + getId() + "] Error while replacing a widget ... == > never call when free");
|
|
||||||
this.tmpWidget = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// not find == > just adding it ...
|
|
||||||
this.subWidget.pushBack(prop);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Gird::subWidgetRemove(Widget _newWidget) {
|
|
||||||
for (int iii=0; iii<this.subWidget.size(); iii++) {
|
|
||||||
if (_newWidget == this.subWidget[iii].widget) {
|
|
||||||
this.subWidget.erase(this.subWidget.begin()+iii);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Log.warning("[" + getId() + "] Can not remove unExistant widget");
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Gird::subWidgetRemove(int _colId, int _rowId) {
|
|
||||||
if ( _colId < 0
|
|
||||||
|| _rowId < 0) {
|
|
||||||
Log.warning("[" + getId() + "] try to remove widget with id < 0 col=" + _colId + " row=" + _rowId);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int errorControl = this.subWidget.size();
|
|
||||||
// try to find it ...
|
|
||||||
for (int iii=0; iii<this.subWidget.size(); iii++) {
|
|
||||||
if( this.subWidget[iii].row == _rowId
|
|
||||||
LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM this.subWidget[iii].col == _colId) {
|
|
||||||
this.subWidget.erase(this.subWidget.begin()+iii);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Log.warning("[" + getId() + "] Can not remove unExistant widget");
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Gird::subWidgetUnLink(Widget _newWidget) {
|
|
||||||
if (_newWidget == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (int iii=0; iii<this.subWidget.size(); iii++) {
|
|
||||||
if (_newWidget == this.subWidget[iii].widget) {
|
|
||||||
this.subWidget.erase(this.subWidget.begin()+iii);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Gird::subWidgetUnLink(int _colId, int _rowId) {
|
|
||||||
if ( _colId < 0
|
|
||||||
|| _rowId < 0) {
|
|
||||||
Log.warning("[" + getId() + "] try to Unlink widget with id < 0 col=" + _colId + " row=" + _rowId);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// try to find it ...
|
|
||||||
for (int iii=0; iii<this.subWidget.size(); iii++) {
|
|
||||||
if( this.subWidget[iii].row == _rowId
|
|
||||||
&& this.subWidget[iii].col == _colId) {
|
|
||||||
this.subWidget.erase(this.subWidget.begin()+iii);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Log.warning("[" + getId() + "] Can not unLink unExistant widget");
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Gird::systemDraw( ewol::DrawProperty _displayProp) {
|
|
||||||
Widget::systemDraw(_displayProp);
|
|
||||||
for (auto it : this.subWidget) {
|
|
||||||
if (it.widget != null) {
|
|
||||||
it.widget.systemDraw(_displayProp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Gird::onRegenerateDisplay() {
|
|
||||||
for (auto it : this.subWidget) {
|
|
||||||
if (it.widget != null) {
|
|
||||||
it.widget.onRegenerateDisplay();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget ewol::widget::Gird::getWidgetAtPos( Vector2f _pos) {
|
|
||||||
if (*propertyHide == true) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
// for all element in the sizer ...
|
|
||||||
for (auto it : this.subWidget) {
|
|
||||||
if (it.widget == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
Vector2f tmpSize = it.widget.getSize();
|
|
||||||
Vector2f tmpOrigin = it.widget.getOrigin();
|
|
||||||
if( (tmpOrigin.x() <= _pos.x() && tmpOrigin.x() + tmpSize.x() >= _pos.x())
|
|
||||||
&& (tmpOrigin.y() <= _pos.y() && tmpOrigin.y() + tmpSize.y() >= _pos.y()) ) {
|
|
||||||
Widget tmpWidget = it.widget.getWidgetAtPos(_pos);
|
|
||||||
if (tmpWidget != null) {
|
|
||||||
return tmpWidget;
|
|
||||||
}
|
|
||||||
// stop searching
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
@ -1,146 +1,420 @@
|
|||||||
/** @file
|
/*
|
||||||
* @author Edouard DUPIN
|
* @author Edouard DUPIN
|
||||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||||
* @license MPL v2.0 (see license file)
|
* @license MPL v2.0 (see license file)
|
||||||
*/
|
*/
|
||||||
#pragma once
|
package org.atriasoft.ewol.widget;
|
||||||
|
|
||||||
#include <etk/types.hpp>
|
import java.io.File;
|
||||||
#include <etk/Vector.hpp>
|
import java.io.IOException;
|
||||||
#include <ewol/debug.hpp>
|
import java.nio.file.DirectoryStream;
|
||||||
#include <ewol/widget/Widget.hpp>
|
import java.nio.file.Files;
|
||||||
#include <ewol/widget/Manager.hpp>
|
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;
|
||||||
|
|
||||||
namespace ewol {
|
import org.atriasoft.esignal.Signal;
|
||||||
namespace widget {
|
import org.atriasoft.etk.Color;
|
||||||
class Gird;
|
import org.atriasoft.etk.Uri;
|
||||||
using Gird = ememory::Ptr<ewol::widget::Gird>;
|
import org.atriasoft.etk.math.Vector2f;
|
||||||
using GirdWeak = ememory::WeakPtr<ewol::widget::Gird>;
|
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;
|
||||||
|
|
||||||
|
/**
|
||||||
* @ingroup ewolWidgetGroup
|
* @ingroup ewolWidgetGroup
|
||||||
*/
|
*/
|
||||||
class Gird :public Widget {
|
class Gird extends Widget {
|
||||||
private:
|
protected class GirdProperties {
|
||||||
class GirdProperties {
|
public Widget widget;
|
||||||
public:
|
public int row;
|
||||||
Widget widget;
|
public int col;
|
||||||
int row;
|
|
||||||
int col;
|
|
||||||
};
|
};
|
||||||
int this.sizeRow; //!< size of all lines (row) (if set (otherwise 0)) == > we have a only one size ==> multiple size will have no use ...
|
protected int sizeRow = 0; //!< size of all lines (row) (if set (otherwise 0)) == > we have a only one size ==> multiple size will have no use ...
|
||||||
int this.uniformSizeRow;
|
protected int uniformSizeRow = 0;
|
||||||
List<int> this.sizeCol; //!< size of all colomn (if set (otherwise 0))
|
protected List<int> sizeCol = new ArrayList<>(); //!< size of all colomn (if set (otherwise 0))
|
||||||
List<GirdProperties> this.subWidget; //!< all sub widget are contained in this element
|
protected List<GirdProperties> subWidget = new ArrayList<>(); //!< all sub widget are contained in this element
|
||||||
Widget this.tmpWidget; //!< use when replace a widget ...
|
protected Widget tmpWidget = null; //!< use when replace a widget ...
|
||||||
boolean this.gavityButtom;
|
protected boolean gavityButtom = true;
|
||||||
protected:
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*/
|
*/
|
||||||
Gird();
|
public Gird() {
|
||||||
public:
|
this.borderSize = _newBorderSize;
|
||||||
DECLARE_WIDGET_FACTORY(Gird, "Gird");
|
if (this.borderSize.x() < 0) {
|
||||||
/**
|
Log.error("Try to set a border size <0 on x : " + this.borderSize.x() + " == > restore to 0");
|
||||||
* Desstructor
|
this.borderSize.setX(0);
|
||||||
*/
|
}
|
||||||
~Gird();
|
if (this.borderSize.y() < 0) {
|
||||||
|
Log.error("Try to set a border size <0 on y : " + this.borderSize.y() + " == > restore to 0");
|
||||||
|
this.borderSize.setY(0);
|
||||||
|
}
|
||||||
|
markToRedraw();
|
||||||
|
requestUpdateSize();
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* set the number of colomn
|
* set the number of colomn
|
||||||
* @param colNumber Nuber of colomn
|
* @param colNumber Nuber of colomn
|
||||||
*/
|
*/
|
||||||
void setColNumber(int _colNumber);
|
public void setColNumber(int _colNumber) {
|
||||||
|
if ((long)this.sizeCol.size() > _colNumber) {
|
||||||
|
int errorControl = this.subWidget.size();
|
||||||
|
// remove subWidget :
|
||||||
|
for (long iii=this.subWidget.size(); iii >= 0; iii--) {
|
||||||
|
if (this.subWidget[iii].col > (_colNumber-1)) {
|
||||||
|
// out of bounds : must remove it ...
|
||||||
|
if (this.subWidget[iii].widget != null) {
|
||||||
|
this.subWidget[iii].widget.reset();
|
||||||
|
// no remove, this element is removed with the function onObjectRemove == > it does not exist anymore ...
|
||||||
|
if (errorControl == this.subWidget.size()) {
|
||||||
|
Log.critical("[" + getId() + "] The number of element might have been reduced ... == > it is not the case ==> the herited class must call the \"OnObjectRemove\" function...");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Log.warning("[" + getId() + "] Must not have null pointer on the subWidget list ...");
|
||||||
|
this.subWidget.erase(this.subWidget.begin()+iii);
|
||||||
|
}
|
||||||
|
errorControl = this.subWidget.size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// just add the col size:
|
||||||
|
this.sizeCol.erase(this.sizeCol.end());
|
||||||
|
} else {
|
||||||
|
// just add the col size:
|
||||||
|
for (int iii=this.sizeCol.size()-1; iii<_colNumber-1 ; iii++) {
|
||||||
|
this.sizeCol.pushBack(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* change a size view of a colomn.
|
* change a size view of a colomn.
|
||||||
* @param colId Id of the colomn [0..x].
|
* @param colId Id of the colomn [0..x].
|
||||||
* @param size size of the colomn.
|
* @param size size of the colomn.
|
||||||
*/
|
*/
|
||||||
void setColSize(int _colId, int _size);
|
public void setColSize(int _colId, int _size) {
|
||||||
|
if ((long)this.sizeCol.size() > _colId) {
|
||||||
|
this.sizeCol[_colId] = _size;
|
||||||
|
} else {
|
||||||
|
Log.error("Can not set the Colomn size : " + _colId+1
|
||||||
|
+ " at " + _size + "px we have "
|
||||||
|
+ this.sizeCol.size() + " colomn");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* change a size view of a line.
|
* change a size view of a line.
|
||||||
* @param size size of the line.
|
* @param size size of the line.
|
||||||
*/
|
*/
|
||||||
void setRowSize(int _size);
|
public void setRowSize(int _size){
|
||||||
|
this.sizeRow = _size;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* get the size view of a colomn.
|
* get the size view of a colomn.
|
||||||
* @param colId Id of the colomn [0..x].
|
* @param colId Id of the colomn [0..x].
|
||||||
* @return The size of the colomn.
|
* @return The size of the colomn.
|
||||||
*/
|
*/
|
||||||
int getColSize(int _colId);
|
public int getColSize(int _colId) {
|
||||||
|
if ((long)this.sizeCol.size() > _colId) {
|
||||||
|
if (this.sizeCol[_colId] <= 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return this.sizeCol[_colId];
|
||||||
|
}
|
||||||
|
Log.error("Can not get the Colomn size : " + _colId+1 + " we have "+ this.sizeCol.size() + " colomn");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* get the size view of the lines.
|
* get the size view of the lines.
|
||||||
* @return The size of the lines.
|
* @return The size of the lines.
|
||||||
*/
|
*/
|
||||||
int getRowSize();
|
public int getRowSize(){
|
||||||
|
return this.sizeRow;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* set the gravity of the widget on the Button (index 0 is on buttom)
|
* set the gravity of the widget on the Button (index 0 is on buttom)
|
||||||
*/
|
*/
|
||||||
void setGravityButtom() {
|
public void setGravityButtom() {
|
||||||
this.gavityButtom = true;
|
this.gavityButtom = true;
|
||||||
markToRedraw();
|
markToRedraw();
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* set the gravity of the widget on the Top (index 0 is on top)
|
* set the gravity of the widget on the Top (index 0 is on top)
|
||||||
*/
|
*/
|
||||||
void setGravityTop() {
|
public void setGravityTop() {
|
||||||
this.gavityButtom = false;
|
this.gavityButtom = false;
|
||||||
markToRedraw();
|
markToRedraw();
|
||||||
}
|
}
|
||||||
public:
|
|
||||||
/**
|
/**
|
||||||
* remove all sub element from the widget.
|
* remove all sub element from the widget.
|
||||||
*/
|
*/
|
||||||
void subWidgetRemoveAll();
|
public void subWidgetRemoveAll() {
|
||||||
|
int errorControl = this.subWidget.size();
|
||||||
|
this.subWidget.clear();
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* add at end position a Widget (note : This system use an inverted phylisophie (button to top, and left to right)
|
* add at end position a Widget (note : This system use an inverted phylisophie (button to top, and left to right)
|
||||||
* @param _colId Id of the colomn [0..x].
|
* @param _colId Id of the colomn [0..x].
|
||||||
* @param _rowId Id of the row [0..y].
|
* @param _rowId Id of the row [0..y].
|
||||||
* @param _newWidget the element pointer
|
* @param _newWidget the element pointer
|
||||||
*/
|
*/
|
||||||
void subWidgetAdd(int _colId, int _rowId, Widget _newWidget);
|
public void subWidgetAdd(int _colId, int _rowId, Widget _newWidget){
|
||||||
|
if (_newWidget == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
GirdProperties prop;
|
||||||
|
prop.row = _rowId;
|
||||||
|
prop.col = _colId;
|
||||||
|
prop.widget = _newWidget;
|
||||||
|
|
||||||
|
// need to find the correct position :
|
||||||
|
for (int iii=0; iii<this.subWidget.size(); iii++) {
|
||||||
|
if (this.subWidget[iii].row < prop.row) {
|
||||||
|
continue;
|
||||||
|
} else if (this.subWidget[iii].row > prop.row) {
|
||||||
|
// find a new position;
|
||||||
|
this.subWidget.insert(this.subWidget.begin()+iii, prop);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
if (this.subWidget[iii].col < prop.col) {
|
||||||
|
continue;
|
||||||
|
} else if (this.subWidget[iii].col > prop.col) {
|
||||||
|
// find a new position;
|
||||||
|
this.subWidget.insert(this.subWidget.begin()+iii, prop);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
// The element already exist == > replace it ...
|
||||||
|
this.tmpWidget = this.subWidget[iii].widget;
|
||||||
|
this.subWidget[iii].widget = _newWidget;
|
||||||
|
if (this.tmpWidget != null) {
|
||||||
|
this.tmpWidget.reset();
|
||||||
|
if (this.tmpWidget != null) {
|
||||||
|
Log.critical("[" + getId() + "] Error while replacing a widget ... == > never call when free");
|
||||||
|
this.tmpWidget = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// not find == > just adding it ...
|
||||||
|
this.subWidget.pushBack(prop);
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* remove definitly a widget from the system and this Gird.
|
* remove definitly a widget from the system and this Gird.
|
||||||
* @param _newWidget the element pointer.
|
* @param _newWidget the element pointer.
|
||||||
*/
|
*/
|
||||||
void subWidgetRemove(Widget _newWidget);
|
public void subWidgetRemove(Widget _newWidget){
|
||||||
|
for (int iii=0; iii<this.subWidget.size(); iii++) {
|
||||||
|
if (_newWidget == this.subWidget[iii].widget) {
|
||||||
|
this.subWidget.erase(this.subWidget.begin()+iii);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Log.warning("[" + getId() + "] Can not remove unExistant widget");
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* remove definitly a widget from the system and this Gird.
|
* remove definitly a widget from the system and this Gird.
|
||||||
* @param _colId Id of the colomn [0..x].
|
* @param _colId Id of the colomn [0..x].
|
||||||
* @param _rowId Id of the row [0..y].
|
* @param _rowId Id of the row [0..y].
|
||||||
*/
|
*/
|
||||||
void subWidgetRemove(int _colId, int _rowId);
|
public void subWidgetRemove(int _colId, int _rowId){
|
||||||
|
if ( _colId < 0
|
||||||
|
|| _rowId < 0) {
|
||||||
|
Log.warning("[" + getId() + "] try to remove widget with id < 0 col=" + _colId + " row=" + _rowId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int errorControl = this.subWidget.size();
|
||||||
|
// try to find it ...
|
||||||
|
for (int iii=0; iii<this.subWidget.size(); iii++) {
|
||||||
|
if( this.subWidget[iii].row == _rowId
|
||||||
|
&& this.subWidget[iii].col == _colId) {
|
||||||
|
this.subWidget.erase(this.subWidget.begin()+iii);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Log.warning("[" + getId() + "] Can not remove unExistant widget");
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Just unlick the specify widget, this function does not remove it from the system (if you can, do nt use it ...).
|
* Just unlick the specify widget, this function does not remove it from the system (if you can, do nt use it ...).
|
||||||
* @param _newWidget the element pointer.
|
* @param _newWidget the element pointer.
|
||||||
*/
|
*/
|
||||||
void subWidgetUnLink(Widget _newWidget);
|
public void subWidgetUnLink(Widget _newWidget) {
|
||||||
|
if (_newWidget == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (int iii=0; iii<this.subWidget.size(); iii++) {
|
||||||
|
if (_newWidget == this.subWidget[iii].widget) {
|
||||||
|
this.subWidget.erase(this.subWidget.begin()+iii);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Just unlick the specify widget, this function does not remove it from the system (if you can, do nt use it ...).
|
* Just unlick the specify widget, this function does not remove it from the system (if you can, do nt use it ...).
|
||||||
* @param _colId Id of the colomn [0..x].
|
* @param _colId Id of the colomn [0..x].
|
||||||
* @param _rowId Id of the row [0..y].
|
* @param _rowId Id of the row [0..y].
|
||||||
*/
|
*/
|
||||||
void subWidgetUnLink(int _colId, int _rowId);
|
public void subWidgetUnLink(int _colId, int _rowId){
|
||||||
private:
|
if ( _colId < 0
|
||||||
// TODO : property
|
|| _rowId < 0) {
|
||||||
Vector2i this.borderSize; //!< Border size needed for all the display
|
Log.warning("[" + getId() + "] try to Unlink widget with id < 0 col=" + _colId + " row=" + _rowId);
|
||||||
public:
|
return;
|
||||||
|
}
|
||||||
|
// try to find it ...
|
||||||
|
for (int iii=0; iii<this.subWidget.size(); iii++) {
|
||||||
|
if( this.subWidget[iii].row == _rowId
|
||||||
|
&& this.subWidget[iii].col == _colId) {
|
||||||
|
this.subWidget.erase(this.subWidget.begin()+iii);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Log.warning("[" + getId() + "] Can not unLink unExistant widget");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Vector2i borderSize; //!< Border size needed for all the display
|
||||||
/**
|
/**
|
||||||
* set the current border size of the current element:
|
* set the current border size of the current element:
|
||||||
* @param _newBorderSize The border size to set (0 if not used)
|
* @param _newBorderSize The border size to set (0 if not used)
|
||||||
*/
|
*/
|
||||||
void setBorderSize( Vector2i _newBorderSize);
|
public void setBorderSize( Vector2i _newBorderSize) {
|
||||||
|
borderSize = _newBorderSize;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* get the current border size of the current element:
|
* get the current border size of the current element:
|
||||||
* @return the border size (0 if not used)
|
* @return the border size (0 if not used)
|
||||||
*/
|
*/
|
||||||
Vector2i getBorderSize() {
|
public Vector2i getBorderSize() {
|
||||||
return this.borderSize;
|
return this.borderSize;
|
||||||
};
|
};
|
||||||
public:
|
public void systemDraw( ewol::DrawProperty _displayProp) {
|
||||||
void systemDraw( ewol::DrawProperty _displayProp) ;
|
Widget::systemDraw(_displayProp);
|
||||||
void onRegenerateDisplay() ;
|
for (auto it : this.subWidget) {
|
||||||
Widget getWidgetAtPos( Vector2f pos) ;
|
if (it.widget != null) {
|
||||||
void onChangeSize() ;
|
it.widget.systemDraw(_displayProp);
|
||||||
void calculateMinMaxSize() ;
|
}
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
};
|
public void onRegenerateDisplay() {
|
||||||
|
for (auto it : this.subWidget) {
|
||||||
|
if (it.widget != null) {
|
||||||
|
it.widget.onRegenerateDisplay();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public Widget getWidgetAtPos( Vector2f pos) {
|
||||||
|
if (*propertyHide == true) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// for all element in the sizer ...
|
||||||
|
for (auto it : this.subWidget) {
|
||||||
|
if (it.widget == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Vector2f tmpSize = it.widget.getSize();
|
||||||
|
Vector2f tmpOrigin = it.widget.getOrigin();
|
||||||
|
if( (tmpOrigin.x() <= _pos.x() && tmpOrigin.x() + tmpSize.x() >= _pos.x())
|
||||||
|
&& (tmpOrigin.y() <= _pos.y() && tmpOrigin.y() + tmpSize.y() >= _pos.y()) ) {
|
||||||
|
Widget tmpWidget = it.widget.getWidgetAtPos(_pos);
|
||||||
|
if (tmpWidget != null) {
|
||||||
|
return tmpWidget;
|
||||||
|
}
|
||||||
|
// stop searching
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
public void onChangeSize() {
|
||||||
|
//Log.debug("Update size");
|
||||||
|
this.size -= this.borderSize*2;
|
||||||
|
|
||||||
|
for (int iii=0; iii<this.subWidget.size(); iii++) {
|
||||||
|
if (this.subWidget[iii].widget != null) {
|
||||||
|
//calculate the origin :
|
||||||
|
Vector2f tmpOrigin = this.origin + this.borderSize;
|
||||||
|
if (false == this.gavityButtom) {
|
||||||
|
tmpOrigin += Vector2f(0, this.size.y()-this.borderSize.y());
|
||||||
|
}
|
||||||
|
|
||||||
|
int tmpSizeWidth = 0;
|
||||||
|
for (int jjj=0; jjj<this.subWidget[iii].col; jjj++ ){
|
||||||
|
tmpSizeWidth += abs(this.sizeCol[jjj]);
|
||||||
|
}
|
||||||
|
// adding Y origin :
|
||||||
|
int addingPos = 0;
|
||||||
|
if (true == this.gavityButtom) {
|
||||||
|
addingPos = (this.subWidget[iii].row)*this.uniformSizeRow;
|
||||||
|
} else {
|
||||||
|
addingPos = -(this.subWidget[iii].row+1)*this.uniformSizeRow;
|
||||||
|
}
|
||||||
|
tmpOrigin += Vector2f(tmpSizeWidth, addingPos);
|
||||||
|
|
||||||
|
Log.debug(" [" + iii + "] set subwidget origin=" +tmpOrigin + " size=" + Vector2i(abs(this.sizeCol[this.subWidget[iii].col]), this.uniformSizeRow) );
|
||||||
|
// set the origin :
|
||||||
|
this.subWidget[iii].widget.setOrigin(Vector2fClipInt32(tmpOrigin));
|
||||||
|
// all time set oll the space .
|
||||||
|
this.subWidget[iii].widget.setSize(Vector2fClipInt32(Vector2f(abs(this.sizeCol[this.subWidget[iii].col]), this.uniformSizeRow)));
|
||||||
|
this.subWidget[iii].widget.onChangeSize();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.size += this.borderSize*2;
|
||||||
|
Log.debug("Calculate size : " + this.size);
|
||||||
|
markToRedraw();
|
||||||
|
}
|
||||||
|
public void calculateMinMaxSize() {
|
||||||
|
for (int iii=0; iii<this.sizeCol.size(); iii++ ){
|
||||||
|
if (this.sizeCol[iii] <= 0) {
|
||||||
|
this.sizeCol[iii] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Log.debug("Update minimum size");
|
||||||
|
this.minSize = propertyMinSize.getPixel();
|
||||||
|
this.maxSize = propertyMaxSize.getPixel();
|
||||||
|
this.uniformSizeRow = 0;
|
||||||
|
this.minSize += this.borderSize*2;
|
||||||
|
int lastLineID = 0;
|
||||||
|
for (int iii=0; iii<this.subWidget.size(); iii++) {
|
||||||
|
if (this.subWidget[iii].row > lastLineID) {
|
||||||
|
// change of line :
|
||||||
|
lastLineID = this.subWidget[iii].row;
|
||||||
|
}
|
||||||
|
if (this.subWidget[iii].widget != null) {
|
||||||
|
this.subWidget[iii].widget.calculateMinMaxSize();
|
||||||
|
Vector2f tmpSize = this.subWidget[iii].widget.getCalculateMinSize();
|
||||||
|
Log.debug(" [" + iii + "] subWidgetMinSize=" + tmpSize);
|
||||||
|
// for all we get the max size :
|
||||||
|
this.uniformSizeRow = etk::max((int)tmpSize.y(), this.uniformSizeRow);
|
||||||
|
// for the colomn size : We set the autamatic value in negative :
|
||||||
|
if (this.sizeCol[this.subWidget[iii].col] <= 0) {
|
||||||
|
this.sizeCol[this.subWidget[iii].col] = etk::min(this.sizeCol[this.subWidget[iii].col], (int)-tmpSize.x() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.sizeRow > 0) {
|
||||||
|
this.uniformSizeRow = this.sizeRow;
|
||||||
|
}
|
||||||
|
int tmpSizeWidth = 0;
|
||||||
|
for (int iii=0; iii<this.sizeCol.size(); iii++ ){
|
||||||
|
tmpSizeWidth += abs(this.sizeCol[iii]);
|
||||||
|
}
|
||||||
|
Log.debug(" tmpSizeWidth=" + tmpSizeWidth);
|
||||||
|
Log.debug(" this.uniformSizeRow=" + this.uniformSizeRow);
|
||||||
|
this.minSize += Vector2i(tmpSizeWidth, (lastLineID+1)*this.uniformSizeRow);
|
||||||
|
|
||||||
|
Log.debug("Calculate min size : " + this.minSize);
|
||||||
|
|
||||||
|
//Log.debug("Vert Result : expand="+ this.userExpand + " minSize="+ this.minSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,190 +0,0 @@
|
|||||||
/** @file
|
|
||||||
* @author Edouard DUPIN
|
|
||||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
|
||||||
* @license MPL v2.0 (see license file)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <ewol/widget/Joystick.hpp>
|
|
||||||
#include <cmath>
|
|
||||||
|
|
||||||
#include <ewol/compositing/Image.hpp>
|
|
||||||
#include <ewol/widget/Manager.hpp>
|
|
||||||
#include <etk/typeInfo.hpp>
|
|
||||||
ETK_DECLARE_TYPE(ewol::widget::Joystick);
|
|
||||||
|
|
||||||
static boolean l_displayBackground(true);
|
|
||||||
static String l_background("");
|
|
||||||
static String l_foreground("");
|
|
||||||
static float l_ratio(1.0/7.0);
|
|
||||||
|
|
||||||
ewol::widget::Joystick::Joystick() :
|
|
||||||
signalEnable(this, "enable", ""),
|
|
||||||
signalDisable(this, "disable", ""),
|
|
||||||
signalMove(this, "move", "") {
|
|
||||||
addObjectType("ewol::widget::Joystick");
|
|
||||||
// by default the joy does not lock when free out
|
|
||||||
this.lock = false;
|
|
||||||
this.displayMode = modeNormal;
|
|
||||||
|
|
||||||
this.colorFg = etk::color::blue;
|
|
||||||
|
|
||||||
this.colorBg = etk::color::black;
|
|
||||||
this.colorBg.setA(0x3F);
|
|
||||||
|
|
||||||
this.displayPos.setValue(0,0);
|
|
||||||
this.distance = 0.0;
|
|
||||||
this.angle = -0.1;
|
|
||||||
|
|
||||||
// set the generic parameters:
|
|
||||||
this.displayBackground = l_displayBackground;
|
|
||||||
this.background = l_background;
|
|
||||||
this.foreground = l_foreground;
|
|
||||||
this.ratio = l_ratio;
|
|
||||||
propertyCanFocus.setDirectCheck(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
ewol::widget::Joystick::~Joystick() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Joystick::onRegenerateDisplay() {
|
|
||||||
if (needRedraw() == true) {
|
|
||||||
// clean the object list ...
|
|
||||||
|
|
||||||
/*
|
|
||||||
ewol::OObject2DColored * tmpOObjects = null;
|
|
||||||
ewol::OObject2DTextured * tmpOOtexBg = null;
|
|
||||||
ewol::OObject2DTextured * tmpOOtexFg = null;
|
|
||||||
// set background
|
|
||||||
if (true == this.displayBackground) {
|
|
||||||
if (this.background == "") {
|
|
||||||
tmpOObjects = ne w ewol::OObject2DColored;
|
|
||||||
tmpOObjects.setColor(this.colorBg);
|
|
||||||
tmpOObjects.Disc( this.size.x/2, this.size.y/2, this.size.x/2-1);
|
|
||||||
} else {
|
|
||||||
tmpOOtexBg = n ew ewol::OObject2DTextured(this.background, this.size.x, this.size.y);
|
|
||||||
tmpOOtexBg.rectangle(0, 0, this.size.x, this.size.y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// set cursor point
|
|
||||||
float sizeElement = this.size.x*this.ratio;
|
|
||||||
if (this.foreground == "") {
|
|
||||||
if (null == tmpOObjects) {
|
|
||||||
tmpOObjects = ne w ewol::OObject2DColored;
|
|
||||||
}
|
|
||||||
tmpOObjects.setColor(this.colorFg);
|
|
||||||
tmpOObjects.Disc( ((this.displayPos.x+1.0)/2.0)*(this.size.x-2*sizeElement) + sizeElement,
|
|
||||||
((this.displayPos.y+1.0)/2.0)*(this.size.y-2*sizeElement) + sizeElement, sizeElement);
|
|
||||||
} else {
|
|
||||||
tmpOOtexFg = ne w ewol::OObject2DTextured(this.foreground,sizeElement*2, sizeElement*2);
|
|
||||||
tmpOOtexFg.rectangle(((this.displayPos.x+1.0)/2.0)*(this.size.x-2*sizeElement),
|
|
||||||
((this.displayPos.y+1.0)/2.0)*(this.size.y-2*sizeElement), sizeElement*2, sizeElement*2);
|
|
||||||
}
|
|
||||||
// add all needed objects ...
|
|
||||||
if (null != tmpOObjects) {
|
|
||||||
addOObject(tmpOObjects);
|
|
||||||
}
|
|
||||||
if (null != tmpOOtexBg) {
|
|
||||||
addOObject(tmpOOtexBg);
|
|
||||||
}
|
|
||||||
if (null != tmpOOtexFg) {
|
|
||||||
addOObject(tmpOOtexFg);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Sine Function: sin(teta) = Opposite / Hypotenuse
|
|
||||||
Cosine Function: cos(teta) = Adjacent / Hypotenuse
|
|
||||||
Tangent Function: tan(teta) = Opposite / Adjacent
|
|
||||||
*/
|
|
||||||
boolean ewol::widget::Joystick::onEventInput( ewol::event::Input _event) {
|
|
||||||
/*
|
|
||||||
if (1 == IdInput) {
|
|
||||||
if( KeyStatus::down == typeEvent
|
|
||||||
|| KeyStatus::move == typeEvent) {
|
|
||||||
// get local relative position
|
|
||||||
Vector2f relativePos = relativePosition(pos);
|
|
||||||
float sizeElement = this.size.x*this.ratio;
|
|
||||||
// calculate the position of the cursor...
|
|
||||||
this.displayPos.x = (relativePos.x-sizeElement)/(this.size.x-sizeElement*2)*2.0 - 1.0;
|
|
||||||
this.displayPos.y = (relativePos.y-sizeElement)/(this.size.y-sizeElement*2)*2.0 - 1.0;
|
|
||||||
|
|
||||||
// distance :
|
|
||||||
this.distance = this.displayPos.y*this.displayPos.y + this.displayPos.x * this.displayPos.x;
|
|
||||||
this.distance = sqrt(this.distance);
|
|
||||||
// angle :
|
|
||||||
this.angle = atan(this.displayPos.y/this.displayPos.x);
|
|
||||||
if (this.displayPos.x < 0) {
|
|
||||||
this.angle += M_PI;
|
|
||||||
}
|
|
||||||
|
|
||||||
// clip if needed ...
|
|
||||||
if (this.distance > 1.0) {
|
|
||||||
this.distance = 1.0;
|
|
||||||
// regenerate n ew display position :
|
|
||||||
this.displayPos.x = cos(this.angle)*this.distance;
|
|
||||||
this.displayPos.y = sin(this.angle)*this.distance;
|
|
||||||
}
|
|
||||||
markToRedraw();
|
|
||||||
if(KeyStatus::down == typeEvent) {
|
|
||||||
signalEnable.emit();
|
|
||||||
} else {
|
|
||||||
String tmp = String("distance=") + String(this.distance) + String("angle=") + String(this.angle+M_PI/2);
|
|
||||||
signalMove.emit(this.angle+M_PI/2);
|
|
||||||
}
|
|
||||||
//teta += M_PI/2;
|
|
||||||
//Log.debug("TETA = " + (this.angle*180/M_PI) + " deg distance = " + this.distance);
|
|
||||||
return true;
|
|
||||||
} else if( KeyStatus::up == typeEvent) {
|
|
||||||
if( true == this.lock
|
|
||||||
LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM this.distance == 1) {
|
|
||||||
// nothing to do ...
|
|
||||||
} else {
|
|
||||||
this.displayPos.x = 0.0;
|
|
||||||
this.displayPos.y = 0.0;
|
|
||||||
this.angle = -0.1;
|
|
||||||
this.distance = 0;
|
|
||||||
}
|
|
||||||
markToRedraw();
|
|
||||||
signalDisable.emit();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ewol::widget::Joystick::ratio(float _newRatio) {
|
|
||||||
if (_newRatio > 1) {
|
|
||||||
_newRatio = 1;
|
|
||||||
}
|
|
||||||
this.ratio = _newRatio;
|
|
||||||
Log.info("Set default Joystick ratio at " + this.ratio);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ewol::widget::Joystick::background(String _imageNameInData, boolean _display) {
|
|
||||||
// TODO : check if it existed
|
|
||||||
this.background = _imageNameInData;
|
|
||||||
this.displayBackground = _display;
|
|
||||||
Log.info("Set default Joystick background at " + this.background + " display it=" + this.displayBackground);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ewol::widget::Joystick::foreground(String imageNameInData) {
|
|
||||||
// TODO : check if it existed
|
|
||||||
this.foreground = imageNameInData;
|
|
||||||
Log.info("Set default Joystick Foreground at " + this.foreground);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ewol::widget::Joystick::getProperty(float distance, float angle) {
|
|
||||||
distance = this.distance;
|
|
||||||
angle = this.angle+M_PI/2;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,90 +1,214 @@
|
|||||||
/** @file
|
package org.atriasoft.ewol.widget;
|
||||||
* @author Edouard DUPIN
|
|
||||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
|
||||||
* @license MPL v2.0 (see license file)
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <etk/types.hpp>
|
import org.atriasoft.esignal.Connection;
|
||||||
#include <etk/Color.hpp>
|
import org.atriasoft.esignal.Signal;
|
||||||
#include <ewol/debug.hpp>
|
import org.atriasoft.esignal.SignalEmpty;
|
||||||
#include <ewol/widget/Widget.hpp>
|
import org.atriasoft.etk.Color;
|
||||||
#include <esignal/Signal.hpp>
|
import org.atriasoft.etk.Uri;
|
||||||
|
import org.atriasoft.etk.math.Vector3b;
|
||||||
|
import org.atriasoft.etk.math.Vector3f;
|
||||||
|
import org.atriasoft.ewol.Gravity;
|
||||||
|
import org.atriasoft.ewol.Padding;
|
||||||
|
import org.atriasoft.ewol.annotation.EwolDescription;
|
||||||
|
import org.atriasoft.ewol.annotation.EwolSignal;
|
||||||
|
import org.atriasoft.ewol.compositing.GuiShape;
|
||||||
|
import org.atriasoft.ewol.compositing.GuiShapeMode;
|
||||||
|
import org.atriasoft.ewol.compositing.ShapeBox;
|
||||||
|
import org.atriasoft.ewol.event.EventEntry;
|
||||||
|
import org.atriasoft.ewol.event.EventInput;
|
||||||
|
import org.atriasoft.ewol.event.EventTime;
|
||||||
|
import org.atriasoft.ewol.internal.Log;
|
||||||
|
import org.atriasoft.ewol.object.EwolObject;
|
||||||
|
import org.atriasoft.exml.annotation.XmlAttribute;
|
||||||
|
import org.atriasoft.exml.annotation.XmlManaged;
|
||||||
|
import org.atriasoft.exml.annotation.XmlName;
|
||||||
|
import org.atriasoft.gale.key.KeyKeyboard;
|
||||||
|
import org.atriasoft.gale.key.KeyStatus;
|
||||||
|
|
||||||
// TODO : Rework ==> use property and shaper ...
|
/**
|
||||||
|
|
||||||
namespace ewol {
|
|
||||||
namespace widget {
|
|
||||||
class Joystick;
|
|
||||||
using Joystick = ememory::Ptr<ewol::widget::Joystick>;
|
|
||||||
using JoystickWeak = ememory::WeakPtr<ewol::widget::Joystick>;
|
|
||||||
/**
|
|
||||||
* @ingroup ewolWidgetGroup
|
* @ingroup ewolWidgetGroup
|
||||||
*/
|
*/
|
||||||
class Joystick :public Widget {
|
class Joystick extends Widget {
|
||||||
public:
|
private static boolean l_displayBackground(true);
|
||||||
|
private static String l_background("");
|
||||||
|
private static String l_foreground("");
|
||||||
|
private static float l_ratio(1.0/7.0);
|
||||||
// Event list of properties
|
// Event list of properties
|
||||||
esignal::Signal<> signalEnable;
|
@EwolSignal(name = "enable")
|
||||||
esignal::Signal<> signalDisable;
|
public SignalEmpty signalEnable = new SignalEmpty();
|
||||||
esignal::Signal<Vector2f> signalMove;
|
@EwolSignal(name = "disable")
|
||||||
public:
|
public SignalEmpty signalDisable = new SignalEmpty();
|
||||||
enum joystickMode {
|
@EwolSignal(name = "move")
|
||||||
|
public Signal<Vector2f> signalMove = new Signal<>();
|
||||||
|
public enum joystickMode {
|
||||||
modeNormal,
|
modeNormal,
|
||||||
modeArrow,
|
modeArrow,
|
||||||
};
|
};
|
||||||
private:
|
|
||||||
etk::Color<> this.colorFg; //!< Forground color
|
private Color colorFg = Color.BLUE.withA(0x3F); //!< Forground color
|
||||||
etk::Color<> this.colorBg; //!< Background color
|
private Color colorBg = Color.BLACK; //!< Background color
|
||||||
Vector2f this.displayPos; //!< direction of the cursor ...
|
private Vector2f displayPos = Vector2f.ZERO; //!< direction of the cursor ...
|
||||||
float this.distance; //!< dintance from the center
|
private float distance = 0.0f; //!< dintance from the center
|
||||||
float this.angle; //!< angle of the arraw (if < 0 : No arraw...) 0 is the TOP ...
|
private float angle = -0.1f; //!< angle of the arraw (if < 0 : No arraw...) 0 is the TOP ...
|
||||||
boolean this.lock; //!< flag to mark the lock when the cursor is free when we are outside the circle
|
private boolean lock = false; //!< flag to mark the lock when the cursor is free when we are outside the circle
|
||||||
enum joystickMode this.displayMode; //!< Type of fonctionnal mode of the joystick
|
private enum joystickMode displayMode = joystickMode.modeNormal; //!< Type of fonctionnal mode of the joystick
|
||||||
private:
|
|
||||||
// generic property of the joystick:
|
// generic property of the joystick:
|
||||||
boolean this.displayBackground;
|
private boolean displayBackground= l_displayBackground;
|
||||||
String this.background;
|
private String background = l_background;
|
||||||
String this.foreground;
|
private String foreground = l_foreground;
|
||||||
float this.ratio;
|
private float ratio = l_ratio;
|
||||||
protected:
|
public Joystick() {
|
||||||
Joystick();
|
|
||||||
public:
|
}
|
||||||
DECLARE_WIDGET_FACTORY(Joystick, "Joystick");
|
public void setLockMode(boolean _lockWhenOut) {
|
||||||
~Joystick();
|
|
||||||
public:
|
|
||||||
void setLockMode(boolean _lockWhenOut) {
|
|
||||||
this.lock = _lockWhenOut;
|
this.lock = _lockWhenOut;
|
||||||
};
|
};
|
||||||
void setDisplayMode(enum joystickMode _newMode) {
|
public void setDisplayMode(enum joystickMode _newMode) {
|
||||||
this.displayMode = _newMode;
|
this.displayMode = _newMode;
|
||||||
};
|
};
|
||||||
/**
|
/**
|
||||||
* set the ratio of the widget joystick
|
* set the ratio of the widget joystick
|
||||||
* @param _newRatio the new ratio that might be set
|
* @param _newRatio the new ratio that might be set
|
||||||
*/
|
*/
|
||||||
void ratio(float _newRatio);
|
public void ratio(float _newRatio) {
|
||||||
|
if (_newRatio > 1) {
|
||||||
|
_newRatio = 1;
|
||||||
|
}
|
||||||
|
this.ratio = _newRatio;
|
||||||
|
Log.info("Set default Joystick ratio at " + this.ratio);
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* set the Background of the widget joystick
|
* set the Background of the widget joystick
|
||||||
* @param _imageNameInData the new rbackground that might be set
|
* @param _imageNameInData the new rbackground that might be set
|
||||||
* @param _display
|
* @param _display
|
||||||
*/
|
*/
|
||||||
void background(String _imageNameInData, boolean _display=true);
|
public void background(String _imageNameInData, boolean _display=true) {
|
||||||
|
// TODO : check if it existed
|
||||||
|
this.background = _imageNameInData;
|
||||||
|
this.displayBackground = _display;
|
||||||
|
Log.info("Set default Joystick background at " + this.background + " display it=" + this.displayBackground);
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* set the Foreground of the widget joystick
|
* set the Foreground of the widget joystick
|
||||||
* @param _imageNameInData the new Foreground that might be set
|
* @param _imageNameInData the new Foreground that might be set
|
||||||
*/
|
*/
|
||||||
void foreground(String _imageNameInData);
|
public void foreground(String _imageNameInData) {
|
||||||
|
// TODO : check if it existed
|
||||||
|
this.foreground = imageNameInData;
|
||||||
|
Log.info("Set default Joystick Foreground at " + this.foreground);
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* get the property of the joystick
|
* get the property of the joystick
|
||||||
* @param _distance distance to the center
|
* @param _distance distance to the center
|
||||||
* @param _angle angle of the joy
|
* @param _angle angle of the joy
|
||||||
*/
|
*/
|
||||||
void getProperty(float _distance, float _angle);
|
public void getProperty(float _distance, float _angle) {
|
||||||
|
distance = this.distance;
|
||||||
|
angle = this.angle+M_PI/2;
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public void onRegenerateDisplay() {
|
||||||
void onRegenerateDisplay() ;
|
if (needRedraw() == true) {
|
||||||
boolean onEventInput( ewol::event::Input _event) ;
|
// clean the object list ...
|
||||||
};
|
|
||||||
};
|
/*
|
||||||
};
|
ewol::OObject2DColored * tmpOObjects = null;
|
||||||
|
ewol::OObject2DTextured * tmpOOtexBg = null;
|
||||||
|
ewol::OObject2DTextured * tmpOOtexFg = null;
|
||||||
|
// set background
|
||||||
|
if (true == this.displayBackground) {
|
||||||
|
if (this.background == "") {
|
||||||
|
tmpOObjects = ne w ewol::OObject2DColored;
|
||||||
|
tmpOObjects.setColor(this.colorBg);
|
||||||
|
tmpOObjects.Disc( this.size.x/2, this.size.y/2, this.size.x/2-1);
|
||||||
|
} else {
|
||||||
|
tmpOOtexBg = n ew ewol::OObject2DTextured(this.background, this.size.x, this.size.y);
|
||||||
|
tmpOOtexBg.rectangle(0, 0, this.size.x, this.size.y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// set cursor point
|
||||||
|
float sizeElement = this.size.x*this.ratio;
|
||||||
|
if (this.foreground == "") {
|
||||||
|
if (null == tmpOObjects) {
|
||||||
|
tmpOObjects = ne w ewol::OObject2DColored;
|
||||||
|
}
|
||||||
|
tmpOObjects.setColor(this.colorFg);
|
||||||
|
tmpOObjects.Disc( ((this.displayPos.x+1.0)/2.0)*(this.size.x-2*sizeElement) + sizeElement,
|
||||||
|
((this.displayPos.y+1.0)/2.0)*(this.size.y-2*sizeElement) + sizeElement, sizeElement);
|
||||||
|
} else {
|
||||||
|
tmpOOtexFg = ne w ewol::OObject2DTextured(this.foreground,sizeElement*2, sizeElement*2);
|
||||||
|
tmpOOtexFg.rectangle(((this.displayPos.x+1.0)/2.0)*(this.size.x-2*sizeElement),
|
||||||
|
((this.displayPos.y+1.0)/2.0)*(this.size.y-2*sizeElement), sizeElement*2, sizeElement*2);
|
||||||
|
}
|
||||||
|
// add all needed objects ...
|
||||||
|
if (null != tmpOObjects) {
|
||||||
|
addOObject(tmpOObjects);
|
||||||
|
}
|
||||||
|
if (null != tmpOOtexBg) {
|
||||||
|
addOObject(tmpOOtexBg);
|
||||||
|
}
|
||||||
|
if (null != tmpOOtexFg) {
|
||||||
|
addOObject(tmpOOtexFg);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public boolean onEventInput( ewol::event::Input _event) {
|
||||||
|
/*
|
||||||
|
if (1 == IdInput) {
|
||||||
|
if( KeyStatus::down == typeEvent
|
||||||
|
|| KeyStatus::move == typeEvent) {
|
||||||
|
// get local relative position
|
||||||
|
Vector2f relativePos = relativePosition(pos);
|
||||||
|
float sizeElement = this.size.x*this.ratio;
|
||||||
|
// calculate the position of the cursor...
|
||||||
|
this.displayPos.x = (relativePos.x-sizeElement)/(this.size.x-sizeElement*2)*2.0 - 1.0;
|
||||||
|
this.displayPos.y = (relativePos.y-sizeElement)/(this.size.y-sizeElement*2)*2.0 - 1.0;
|
||||||
|
|
||||||
|
// distance :
|
||||||
|
this.distance = this.displayPos.y*this.displayPos.y + this.displayPos.x * this.displayPos.x;
|
||||||
|
this.distance = sqrt(this.distance);
|
||||||
|
// angle :
|
||||||
|
this.angle = atan(this.displayPos.y/this.displayPos.x);
|
||||||
|
if (this.displayPos.x < 0) {
|
||||||
|
this.angle += M_PI;
|
||||||
|
}
|
||||||
|
|
||||||
|
// clip if needed ...
|
||||||
|
if (this.distance > 1.0) {
|
||||||
|
this.distance = 1.0;
|
||||||
|
// regenerate n ew display position :
|
||||||
|
this.displayPos.x = cos(this.angle)*this.distance;
|
||||||
|
this.displayPos.y = sin(this.angle)*this.distance;
|
||||||
|
}
|
||||||
|
markToRedraw();
|
||||||
|
if(KeyStatus::down == typeEvent) {
|
||||||
|
signalEnable.emit();
|
||||||
|
} else {
|
||||||
|
String tmp = String("distance=") + String(this.distance) + String("angle=") + String(this.angle+M_PI/2);
|
||||||
|
signalMove.emit(this.angle+M_PI/2);
|
||||||
|
}
|
||||||
|
//teta += M_PI/2;
|
||||||
|
//Log.debug("TETA = " + (this.angle*180/M_PI) + " deg distance = " + this.distance);
|
||||||
|
return true;
|
||||||
|
} else if( KeyStatus::up == typeEvent) {
|
||||||
|
if( true == this.lock
|
||||||
|
&& this.distance == 1) {
|
||||||
|
// nothing to do ...
|
||||||
|
} else {
|
||||||
|
this.displayPos.x = 0.0;
|
||||||
|
this.displayPos.y = 0.0;
|
||||||
|
this.angle = -0.1;
|
||||||
|
this.distance = 0;
|
||||||
|
}
|
||||||
|
markToRedraw();
|
||||||
|
signalDisable.emit();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -1,22 +0,0 @@
|
|||||||
package org.atriasoft.ewol.widget;
|
|
||||||
|
|
||||||
import org.atriasoft.etk.Dimension3f;
|
|
||||||
import org.atriasoft.etk.Distance;
|
|
||||||
import org.atriasoft.etk.math.Vector3b;
|
|
||||||
import org.atriasoft.etk.math.Vector3f;
|
|
||||||
|
|
||||||
import sample.atriasoft.ewol.BasicWindows;
|
|
||||||
|
|
||||||
public class MainWindows extends BasicWindows {
|
|
||||||
|
|
||||||
public MainWindows() {
|
|
||||||
setPropertyTitle("Simple Entry test");
|
|
||||||
|
|
||||||
final Entry simpleEntry = new Entry();
|
|
||||||
simpleEntry.setPropertyExpand(Vector3b.TRUE);
|
|
||||||
simpleEntry.setPropertyFill(Vector3b.TRUE_FALSE_FALSE);
|
|
||||||
simpleEntry.setPropertyMinSize(new Dimension3f(new Vector3f(200, 15, 10), Distance.PIXEL));
|
|
||||||
this.setTestWidget(simpleEntry);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,330 +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/Manager.hpp>
|
|
||||||
#include <ewol/widget/Menu.hpp>
|
|
||||||
#include <ewol/widget/Button.hpp>
|
|
||||||
#include <ewol/widget/ContextMenu.hpp>
|
|
||||||
#include <ewol/widget/Composer.hpp>
|
|
||||||
#include <ewol/widget/Label.hpp>
|
|
||||||
#include <ewol/widget/Windows.hpp>
|
|
||||||
#include <ewol/widget/Spacer.hpp>
|
|
||||||
#include <etk/typeInfo.hpp>
|
|
||||||
ETK_DECLARE_TYPE(ewol::widget::Menu);
|
|
||||||
|
|
||||||
ewol::widget::Menu::Menu() :
|
|
||||||
signalSelect(this, "select", "") {
|
|
||||||
addObjectType("ewol::widget::Menu");
|
|
||||||
this.staticObjectId = 666;
|
|
||||||
propertyLockExpand.setDirect(Vector2b(true,true));
|
|
||||||
}
|
|
||||||
|
|
||||||
ewol::widget::Menu::~Menu() {
|
|
||||||
clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Menu::subWidgetRemoveAll() {
|
|
||||||
clear();
|
|
||||||
ewol::widget::Sizer::subWidgetRemoveAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
int ewol::widget::Menu::subWidgetAdd(Widget _newWidget) {
|
|
||||||
Log.error("Not availlable");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Menu::subWidgetRemove(Widget _newWidget) {
|
|
||||||
Log.error("Not availlable");
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Menu::subWidgetUnLink(Widget _newWidget) {
|
|
||||||
Log.error("Not availlable");
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Menu::clear() {
|
|
||||||
this.listElement.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
int ewol::widget::Menu::addTitle( String _label,
|
|
||||||
String _image,
|
|
||||||
String _message) {
|
|
||||||
return add(-1, _label, _image, _message);
|
|
||||||
}
|
|
||||||
|
|
||||||
static char* eventButtonPressed = "menu-local-pressed";
|
|
||||||
|
|
||||||
int ewol::widget::Menu::get( String _label) {
|
|
||||||
for (auto it : this.listElement) {
|
|
||||||
if (it.this.label == _label) {
|
|
||||||
return it.this.localId;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ewol::widget::Menu::add(int _parent,
|
|
||||||
String _label,
|
|
||||||
String _image,
|
|
||||||
String _message) {
|
|
||||||
// try to find one already created:
|
|
||||||
int previous = get(_label);
|
|
||||||
if (previous != -1) {
|
|
||||||
return previous;
|
|
||||||
}
|
|
||||||
ewol::widget::MenuElement tmpObject;
|
|
||||||
tmpObject.this.localId = this.staticObjectId++;
|
|
||||||
tmpObject.this.parentId = _parent;
|
|
||||||
tmpObject.this.label = _label;
|
|
||||||
tmpObject.this.image = _image;
|
|
||||||
tmpObject.this.message = _message;
|
|
||||||
if (tmpObject.this.parentId == -1) {
|
|
||||||
ewol::widget::Button myButton = ewol::widget::Button::create();
|
|
||||||
if (myButton == null) {
|
|
||||||
Log.error("Allocation button error");
|
|
||||||
return tmpObject.this.localId;
|
|
||||||
}
|
|
||||||
if (tmpObject.this.image.size()!=0) {
|
|
||||||
String composeString ="<sizer mode='hori' expand='true,false' fill='true,true'>\n";
|
|
||||||
if (etk::end_with(tmpObject.this.image, ".edf") == true) {
|
|
||||||
composeString+=" <image src='" + tmpObject.this.image + "' size='8,8mm' distance-field='true'/>\n";
|
|
||||||
} else {
|
|
||||||
composeString+=" <image src='" + tmpObject.this.image + "' size='8,8mm'/>\n";
|
|
||||||
}
|
|
||||||
composeString+=" <label><left>" + tmpObject.this.label + "</left></label>\n";
|
|
||||||
composeString+="</sizer>\n";
|
|
||||||
myButton.setSubWidget(ewol::widget::composerGenerateString(composeString));
|
|
||||||
} else {
|
|
||||||
ewol::widget::Label label = ewol::widget::Label::create();
|
|
||||||
label.propertyValue.set("<left>" + tmpObject.this.label + "</left>");
|
|
||||||
myButton.setSubWidget(label);
|
|
||||||
}
|
|
||||||
// add it in the widget list
|
|
||||||
ewol::widget::Sizer::subWidgetAdd(myButton);
|
|
||||||
// keep the specific event ...
|
|
||||||
myButton.signalPressed.connect(sharedFromThis(), ewol::widget::Menu::onButtonPressed, ewol::widget::ButtonWeak(myButton));
|
|
||||||
tmpObject.this.widgetPointer = myButton;
|
|
||||||
}
|
|
||||||
this.listElement.pushBack(tmpObject);
|
|
||||||
return tmpObject.this.localId;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Menu::remove(int _id) {
|
|
||||||
Log.todo("NOT remove...");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int ewol::widget::Menu::addSpacer(int _parent) {
|
|
||||||
ewol::widget::MenuElement tmpObject;
|
|
||||||
tmpObject.this.localId = this.staticObjectId++;
|
|
||||||
tmpObject.this.parentId = _parent;
|
|
||||||
tmpObject.this.label = "";
|
|
||||||
tmpObject.this.image = "";
|
|
||||||
tmpObject.this.message = "";
|
|
||||||
if (tmpObject.this.parentId == -1) {
|
|
||||||
ewol::widget::Spacer mySpacer = ewol::widget::Spacer::create();
|
|
||||||
if (mySpacer == null) {
|
|
||||||
Log.error("Allocation spacer error");
|
|
||||||
return tmpObject.this.localId;
|
|
||||||
}
|
|
||||||
mySpacer.propertyExpand.set(Vector2b(true,true));
|
|
||||||
mySpacer.propertyFill.set(Vector2b(true,true));
|
|
||||||
mySpacer.propertyMinSize.set(gale::Dimension(Vector2f(2,0), gale::distance::pixel));
|
|
||||||
mySpacer.propertyMaxSize.set(gale::Dimension(Vector2f(2,10000), gale::distance::pixel));
|
|
||||||
mySpacer.propertyColor.set(etk::Color<>(0,0,0,0xFF));
|
|
||||||
// add it in the widget list
|
|
||||||
ewol::widget::Sizer::subWidgetAdd(mySpacer);
|
|
||||||
}
|
|
||||||
this.listElement.pushBack(tmpObject);
|
|
||||||
return tmpObject.this.localId;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Menu::onButtonPressed(ewol::widget::ButtonWeak _button) {
|
|
||||||
ewol::widget::Button caller = _button.lock();
|
|
||||||
if (caller == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (auto it : this.listElement) {
|
|
||||||
if (caller != it.this.widgetPointer.lock()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// 2 posible case (have a message or have a child ...
|
|
||||||
if (it.this.message.size() > 0) {
|
|
||||||
Log.debug("Menu == > generate Event");
|
|
||||||
// Send a multicast event ...
|
|
||||||
signalSelect.emit(it.this.message);
|
|
||||||
ewol::widget::ContextMenu tmpContext = this.widgetContextMenu.lock();
|
|
||||||
if (tmpContext != null) {
|
|
||||||
Log.debug("Mark the menu to remove ...");
|
|
||||||
tmpContext.destroy();
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Log.debug("Menu == > load Sub Menu");
|
|
||||||
boolean findChild = false;
|
|
||||||
for (auto it2 : this.listElement) {
|
|
||||||
if (it.this.localId == it2.this.parentId) {
|
|
||||||
findChild = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (false == findChild) {
|
|
||||||
Log.warning("Event on menu element with no child an no event... label=" + it.this.label);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// create a context menu:
|
|
||||||
ewol::widget::ContextMenu tmpContext = ewol::widget::ContextMenu::create();
|
|
||||||
this.widgetContextMenu = tmpContext;
|
|
||||||
if (tmpContext == null) {
|
|
||||||
Log.error("Allocation Error");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// get the button widget:
|
|
||||||
Vector2f newPosition;
|
|
||||||
Widget eventFromWidget = ememory::dynamicPointerCast<Widget>(caller);
|
|
||||||
if (eventFromWidget != null) {
|
|
||||||
Vector2f tmpOri = eventFromWidget.getOrigin();
|
|
||||||
Vector2f tmpSize = eventFromWidget.getSize();
|
|
||||||
// calculate the correct position
|
|
||||||
newPosition.setValue(tmpOri.x() + tmpSize.x()/2,
|
|
||||||
tmpOri.y() );
|
|
||||||
}
|
|
||||||
tmpContext.setPositionMark(ewol::widget::ContextMenu::markTop, newPosition);
|
|
||||||
ewol::widget::Sizer mySizer;
|
|
||||||
ewol::widget::Button myButton;
|
|
||||||
mySizer = ewol::widget::Sizer::create();
|
|
||||||
if (mySizer != null) {
|
|
||||||
mySizer.propertyMode.set(widget::Sizer::modeVert);
|
|
||||||
mySizer.propertyLockExpand.set(Vector2f(true,true));
|
|
||||||
mySizer.propertyFill.set(Vector2f(true,true));
|
|
||||||
// set it in the pop-up-system:
|
|
||||||
tmpContext.setSubWidget(mySizer);
|
|
||||||
boolean menuHaveImage = false;
|
|
||||||
for (auto it2 : this.listElement) {
|
|
||||||
if (it.this.localId != it2.this.parentId) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (it2.this.image.size()!=0) {
|
|
||||||
menuHaveImage = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (long iii=this.listElement.size()-1; iii>=0; --iii) {
|
|
||||||
if (it.this.localId != this.listElement[iii].this.parentId) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (this.listElement[iii].this.message == "" LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM this.listElement[iii].this.label == "") {
|
|
||||||
ewol::widget::Spacer mySpacer = ewol::widget::Spacer::create();
|
|
||||||
if (mySpacer == null) {
|
|
||||||
Log.error("Allocation spacer error");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
mySpacer.propertyExpand.set(Vector2b(true,true));
|
|
||||||
mySpacer.propertyFill.set(Vector2b(true,true));
|
|
||||||
mySpacer.propertyMinSize.set(gale::Dimension(Vector2f(0,2), gale::distance::pixel));
|
|
||||||
mySpacer.propertyMaxSize.set(gale::Dimension(Vector2f(10000,2), gale::distance::pixel));
|
|
||||||
mySpacer.propertyColor.set(etk::Color<>(0,0,0,0xFF));
|
|
||||||
// add it in the widget list
|
|
||||||
mySizer.subWidgetAdd(mySpacer);
|
|
||||||
} else {
|
|
||||||
myButton = ewol::widget::Button::create();
|
|
||||||
if (myButton == null) {
|
|
||||||
Log.error("Allocation Error");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
myButton.propertyExpand.set(Vector2b(true,true));
|
|
||||||
myButton.propertyFill.set(Vector2b(true,true));
|
|
||||||
// set callback
|
|
||||||
myButton.signalPressed.connect(sharedFromThis(), ewol::widget::Menu::onButtonPressed, ewol::widget::ButtonWeak(myButton));
|
|
||||||
// add it in the widget list
|
|
||||||
mySizer.subWidgetAdd(myButton);
|
|
||||||
if (this.listElement[iii].this.image.size() != 0) {
|
|
||||||
String composeString;
|
|
||||||
composeString+= " <sizer mode='hori' expand='true,false' fill='true,true' lock='true'>\n";
|
|
||||||
if (etk::end_with(this.listElement[iii].this.image, ".edf") == true) {
|
|
||||||
composeString+=" <image src='" + this.listElement[iii].this.image + "' size='8,8mm' distance-field='true'/>\n";
|
|
||||||
} else {
|
|
||||||
composeString+=" <image src='" + this.listElement[iii].this.image + "' size='8,8mm'/>\n";
|
|
||||||
}
|
|
||||||
composeString+=" <label exand='true,true' fill='true,true'><left>" + this.listElement[iii].this.label + "</left></label>\n";
|
|
||||||
composeString+=" </sizer>\n";
|
|
||||||
myButton.setSubWidget(ewol::widget::composerGenerateString(composeString));
|
|
||||||
} else {
|
|
||||||
if (menuHaveImage == true) {
|
|
||||||
myButton.setSubWidget(ewol::widget::composerGenerateString(
|
|
||||||
String() +
|
|
||||||
" <sizer mode='hori' expand='true,false' fill='true,true' lock='true'>\n"
|
|
||||||
" <spacer min-size='8,0mm'/>\n"
|
|
||||||
" <label exand='true,true' fill='true,true'><![CDATA[<left>" + this.listElement[iii].this.label + "</left>]]></label>\n"
|
|
||||||
" </sizer>\n")
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
ewol::widget::Label tmpLabel = widget::Label::create();
|
|
||||||
if (tmpLabel != null) {
|
|
||||||
tmpLabel.propertyValue.set(String("<left>") + this.listElement[iii].this.label + "</left>\n");
|
|
||||||
tmpLabel.propertyExpand.set(Vector2b(true,false));
|
|
||||||
tmpLabel.propertyFill.set(Vector2b(true,true));
|
|
||||||
myButton.setSubWidget(tmpLabel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.listElement[iii].this.widgetPointer = myButton;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ewol::widget::Windows currentWindows = getWindows();
|
|
||||||
if (currentWindows == null) {
|
|
||||||
Log.error("Can not get the curent Windows...");
|
|
||||||
} else {
|
|
||||||
currentWindows.popUpWidgetPush(tmpContext);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean ewol::widget::Menu::loadXML( exml::Element _node) {
|
|
||||||
if (_node.exist() == false) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// parse generic properties:
|
|
||||||
Widget::loadXML(_node);
|
|
||||||
// parse all the elements :
|
|
||||||
for ( auto nodeIt : _node.nodes) {
|
|
||||||
exml::Element pNode = nodeIt.toElement();
|
|
||||||
if (pNode.exist() == false) {
|
|
||||||
// trash here all that is not element
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
String widgetName = pNode.getValue();
|
|
||||||
Log.info("Get node : " + pNode);
|
|
||||||
if (widgetName == "elem") {
|
|
||||||
// <elem title="_T{Title of the button}" image="DATA:///List.svg" event="menu:exit">
|
|
||||||
int idMenu = addTitle(pNode.attributes["title"], pNode.attributes["image"], pNode.attributes["event"]);
|
|
||||||
for ( auto nodeIt2 : pNode.nodes) {
|
|
||||||
|
|
||||||
exml::Element pNode2 = nodeIt2.toElement();
|
|
||||||
if (pNode2.exist() == false) {
|
|
||||||
// trash here all that is not element
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
String widgetName2 = pNode2.getValue();
|
|
||||||
if (widgetName2 == "elem") {
|
|
||||||
// <elem title="_T{Title of the button}" image="DATA:///List.svg" event="menu:exit">
|
|
||||||
add(idMenu, pNode2.attributes["title"], pNode2.attributes["image"], pNode2.attributes["event"]);
|
|
||||||
} else if (widgetName2 == "separator") {
|
|
||||||
addSpacer(idMenu);
|
|
||||||
} else {
|
|
||||||
Log.error("[" + getId() + "] {" + getObjectType() + "} (l " + pNode2.getPos() + ") Unknown basic node='" + widgetName2 + "' not in : [elem,separator]" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (widgetName == "separator") {
|
|
||||||
addSpacer();
|
|
||||||
} else {
|
|
||||||
Log.error("[" + getId() + "] {" + getObjectType() + "} (l " + pNode.getPos() + ") Unknown basic node='" + widgetName + "' not in : [elem,separator]" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
@ -1,55 +1,350 @@
|
|||||||
|
package org.atriasoft.ewol.widget;
|
||||||
|
|
||||||
|
import org.atriasoft.esignal.Connection;
|
||||||
|
import org.atriasoft.esignal.Signal;
|
||||||
|
import org.atriasoft.esignal.SignalEmpty;
|
||||||
|
import org.atriasoft.etk.Uri;
|
||||||
|
import org.atriasoft.etk.math.Vector3b;
|
||||||
|
import org.atriasoft.etk.math.Vector3f;
|
||||||
|
import org.atriasoft.ewol.Gravity;
|
||||||
|
import org.atriasoft.ewol.Padding;
|
||||||
|
import org.atriasoft.ewol.annotation.EwolDescription;
|
||||||
|
import org.atriasoft.ewol.annotation.EwolSignal;
|
||||||
|
import org.atriasoft.ewol.compositing.GuiShape;
|
||||||
|
import org.atriasoft.ewol.compositing.GuiShapeMode;
|
||||||
|
import org.atriasoft.ewol.compositing.ShapeBox;
|
||||||
|
import org.atriasoft.ewol.event.EventEntry;
|
||||||
|
import org.atriasoft.ewol.event.EventInput;
|
||||||
|
import org.atriasoft.ewol.event.EventTime;
|
||||||
|
import org.atriasoft.ewol.internal.Log;
|
||||||
|
import org.atriasoft.ewol.object.EwolObject;
|
||||||
|
import org.atriasoft.exml.annotation.XmlAttribute;
|
||||||
|
import org.atriasoft.exml.annotation.XmlManaged;
|
||||||
|
import org.atriasoft.exml.annotation.XmlName;
|
||||||
|
import org.atriasoft.gale.key.KeyKeyboard;
|
||||||
|
import org.atriasoft.gale.key.KeyStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ingroup ewolWidgetGroup
|
* @ingroup ewolWidgetGroup
|
||||||
*/
|
*/
|
||||||
class Menu:public ewol::widget::Sizer
|
public class Menu extends Sizer
|
||||||
{
|
{
|
||||||
public:
|
public class MenuElement {
|
||||||
esignal::Signal<String> signalSelect; // event on a menu button or ...
|
public MenuElement() { };
|
||||||
protected:
|
public int localId;
|
||||||
Menu();
|
public int parentId;
|
||||||
public:
|
public WeakReference<Widget> widgetPointer;
|
||||||
DECLARE_WIDGET_FACTORY(Menu, "Menu");
|
public String label;
|
||||||
~Menu();
|
public String image;
|
||||||
private:
|
public String message;
|
||||||
|
};
|
||||||
|
@EwolSignal(name = "select", description = "menu is selected")
|
||||||
|
public Signal<String> signalSelect; // event on a menu button or ...
|
||||||
|
public Menu() {
|
||||||
|
propertyLockExpand = Vector2b(true,true);
|
||||||
|
}
|
||||||
|
private void subWidgetRemoveAll(){
|
||||||
|
clear();
|
||||||
|
ewol::widget::Sizer::subWidgetRemoveAll();
|
||||||
|
}
|
||||||
|
private int subWidgetAdd(Widget _newWidget){
|
||||||
|
Log.error("Not availlable");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
void subWidgetRemoveAll();
|
private void subWidgetRemove(Widget _newWidget){
|
||||||
|
Log.error("Not availlable");
|
||||||
|
}
|
||||||
|
|
||||||
int subWidgetAdd(Widget _newWidget);
|
private void subWidgetUnLink(Widget _newWidget){
|
||||||
|
Log.error("Not availlable");
|
||||||
|
}
|
||||||
|
protected static final String eventButtonPressed = "menu-local-pressed";
|
||||||
|
private boolean loadXML( exml::Element _node) ;
|
||||||
|
private List<MenuElement> listElement;
|
||||||
|
private int staticObjectId = 666; // unique ID for every element of the menu ...
|
||||||
|
// TODO: set it as week
|
||||||
|
|
||||||
void subWidgetRemove(Widget _newWidget);
|
private ContextMenu widgetContextMenu;
|
||||||
|
private int get(String _label) {
|
||||||
|
for (auto it : this.listElement) {
|
||||||
|
if (it.this.label == _label) {
|
||||||
|
return it.this.localId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
void subWidgetUnLink(Widget _newWidget);
|
public void clear(){
|
||||||
|
this.listElement.clear();
|
||||||
|
}
|
||||||
|
|
||||||
boolean loadXML( exml::Element _node) ;
|
public int addTitle( final String _label, final String _image="", String _message = ""){
|
||||||
private:
|
return add(-1, _label, _image, _message);
|
||||||
List<ewol::widget::MenuElement> this.listElement;
|
}
|
||||||
int this.staticObjectId; // unique ID for every element of the menu ...
|
|
||||||
ewol::widget::ContextMenuWeak this.widgetContextMenu;
|
|
||||||
|
|
||||||
int get(String _label);
|
public int add(final int _parent, final String _label, final String _image="", String _message = "") {
|
||||||
|
// try to find one already created:
|
||||||
|
int previous = get(_label);
|
||||||
|
if (previous != -1) {
|
||||||
|
return previous;
|
||||||
|
}
|
||||||
|
ewol::widget::MenuElement tmpObject;
|
||||||
|
tmpObject.this.localId = this.staticObjectId++;
|
||||||
|
tmpObject.this.parentId = _parent;
|
||||||
|
tmpObject.this.label = _label;
|
||||||
|
tmpObject.this.image = _image;
|
||||||
|
tmpObject.this.message = _message;
|
||||||
|
if (tmpObject.this.parentId == -1) {
|
||||||
|
ewol::widget::Button myButton = ewol::widget::Button::create();
|
||||||
|
if (myButton == null) {
|
||||||
|
Log.error("Allocation button error");
|
||||||
|
return tmpObject.this.localId;
|
||||||
|
}
|
||||||
|
if (tmpObject.this.image.size()!=0) {
|
||||||
|
String composeString ="<sizer mode='HORIZONTAL' expand='true,false' fill='true,true'>\n";
|
||||||
|
if (etk::end_with(tmpObject.this.image, ".edf") == true) {
|
||||||
|
composeString+=" <image src='" + tmpObject.this.image + "' size='8,8mm' distance-field='true'/>\n";
|
||||||
|
} else {
|
||||||
|
composeString+=" <image src='" + tmpObject.this.image + "' size='8,8mm'/>\n";
|
||||||
|
}
|
||||||
|
composeString+=" <label><left>" + tmpObject.this.label + "</left></label>\n";
|
||||||
|
composeString+="</sizer>\n";
|
||||||
|
myButton.setSubWidget(ewol::widget::composerGenerateString(composeString));
|
||||||
|
} else {
|
||||||
|
ewol::widget::Label label = ewol::widget::Label::create();
|
||||||
|
label.propertyValue.set("<left>" + tmpObject.this.label + "</left>");
|
||||||
|
myButton.setSubWidget(label);
|
||||||
|
}
|
||||||
|
// add it in the widget list
|
||||||
|
ewol::widget::Sizer::subWidgetAdd(myButton);
|
||||||
|
// keep the specific event ...
|
||||||
|
myButton.signalPressed.connect(sharedFromThis(), ewol::widget::Menu::onButtonPressed, ewol::widget::ButtonWeak(myButton));
|
||||||
|
tmpObject.this.widgetPointer = myButton;
|
||||||
|
}
|
||||||
|
this.listElement.pushBack(tmpObject);
|
||||||
|
return tmpObject.this.localId;
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
|
||||||
void clear();
|
|
||||||
|
|
||||||
int addTitle( final String _label, final String _image="", String _message = "");
|
public int addSpacer(final int _parent=-1){
|
||||||
|
ewol::widget::MenuElement tmpObject;
|
||||||
|
tmpObject.this.localId = this.staticObjectId++;
|
||||||
|
tmpObject.this.parentId = _parent;
|
||||||
|
tmpObject.this.label = "";
|
||||||
|
tmpObject.this.image = "";
|
||||||
|
tmpObject.this.message = "";
|
||||||
|
if (tmpObject.this.parentId == -1) {
|
||||||
|
ewol::widget::Spacer mySpacer = ewol::widget::Spacer::create();
|
||||||
|
if (mySpacer == null) {
|
||||||
|
Log.error("Allocation spacer error");
|
||||||
|
return tmpObject.this.localId;
|
||||||
|
}
|
||||||
|
mySpacer.propertyExpand.set(Vector2b(true,true));
|
||||||
|
mySpacer.propertyFill.set(Vector2b(true,true));
|
||||||
|
mySpacer.propertyMinSize.set(gale::Dimension(Vector2f(2,0), gale::distance::pixel));
|
||||||
|
mySpacer.propertyMaxSize.set(gale::Dimension(Vector2f(2,10000), gale::distance::pixel));
|
||||||
|
mySpacer.propertyColor.set(etk::Color<>(0,0,0,0xFF));
|
||||||
|
// add it in the widget list
|
||||||
|
ewol::widget::Sizer::subWidgetAdd(mySpacer);
|
||||||
|
}
|
||||||
|
this.listElement.pushBack(tmpObject);
|
||||||
|
return tmpObject.this.localId;
|
||||||
|
}
|
||||||
|
|
||||||
int add(final int _parent, final String _label, final String _image="", String _message = "");
|
public void remove(int _id){
|
||||||
|
Log.todo("NOT remove...");
|
||||||
|
}
|
||||||
|
|
||||||
int addSpacer(final int _parent=-1);
|
|
||||||
|
|
||||||
void remove(int _id);
|
|
||||||
|
|
||||||
private:
|
private void onButtonPressed(ewol::widget::ButtonWeak _button){
|
||||||
void onButtonPressed(ewol::widget::ButtonWeak _button);
|
ewol::widget::Button caller = _button.lock();
|
||||||
|
if (caller == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (auto it : this.listElement) {
|
||||||
|
if (caller != it.this.widgetPointer.lock()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// 2 posible case (have a message or have a child ...
|
||||||
|
if (it.this.message.size() > 0) {
|
||||||
|
Log.debug("Menu == > generate Event");
|
||||||
|
// Send a multicast event ...
|
||||||
|
signalSelect.emit(it.this.message);
|
||||||
|
ewol::widget::ContextMenu tmpContext = this.widgetContextMenu.lock();
|
||||||
|
if (tmpContext != null) {
|
||||||
|
Log.debug("Mark the menu to remove ...");
|
||||||
|
tmpContext.destroy();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Log.debug("Menu == > load Sub Menu");
|
||||||
|
boolean findChild = false;
|
||||||
|
for (auto it2 : this.listElement) {
|
||||||
|
if (it.this.localId == it2.this.parentId) {
|
||||||
|
findChild = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (false == findChild) {
|
||||||
|
Log.warning("Event on menu element with no child an no event... label=" + it.this.label);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// create a context menu:
|
||||||
|
ewol::widget::ContextMenu tmpContext = ewol::widget::ContextMenu::create();
|
||||||
|
this.widgetContextMenu = tmpContext;
|
||||||
|
if (tmpContext == null) {
|
||||||
|
Log.error("Allocation Error");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// get the button widget:
|
||||||
|
Vector2f newPosition;
|
||||||
|
Widget eventFromWidget = ememory::dynamicPointerCast<Widget>(caller);
|
||||||
|
if (eventFromWidget != null) {
|
||||||
|
Vector2f tmpOri = eventFromWidget.getOrigin();
|
||||||
|
Vector2f tmpSize = eventFromWidget.getSize();
|
||||||
|
// calculate the correct position
|
||||||
|
newPosition.setValue(tmpOri.x() + tmpSize.x()/2,
|
||||||
|
tmpOri.y() );
|
||||||
|
}
|
||||||
|
tmpContext.setPositionMark(ewol::widget::ContextMenu::markTop, newPosition);
|
||||||
|
ewol::widget::Sizer mySizer;
|
||||||
|
ewol::widget::Button myButton;
|
||||||
|
mySizer = ewol::widget::Sizer::create();
|
||||||
|
if (mySizer != null) {
|
||||||
|
mySizer.propertyMode.set(widget::Sizer::modeVert);
|
||||||
|
mySizer.propertyLockExpand.set(Vector2f(true,true));
|
||||||
|
mySizer.propertyFill.set(Vector2f(true,true));
|
||||||
|
// set it in the pop-up-system:
|
||||||
|
tmpContext.setSubWidget(mySizer);
|
||||||
|
boolean menuHaveImage = false;
|
||||||
|
for (auto it2 : this.listElement) {
|
||||||
|
if (it.this.localId != it2.this.parentId) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (it2.this.image.size()!=0) {
|
||||||
|
menuHaveImage = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (long iii=this.listElement.size()-1; iii>=0; --iii) {
|
||||||
|
if (it.this.localId != this.listElement[iii].this.parentId) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (this.listElement[iii].this.message == "" LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM this.listElement[iii].this.label == "") {
|
||||||
|
ewol::widget::Spacer mySpacer = ewol::widget::Spacer::create();
|
||||||
|
if (mySpacer == null) {
|
||||||
|
Log.error("Allocation spacer error");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
mySpacer.propertyExpand.set(Vector2b(true,true));
|
||||||
|
mySpacer.propertyFill.set(Vector2b(true,true));
|
||||||
|
mySpacer.propertyMinSize.set(gale::Dimension(Vector2f(0,2), gale::distance::pixel));
|
||||||
|
mySpacer.propertyMaxSize.set(gale::Dimension(Vector2f(10000,2), gale::distance::pixel));
|
||||||
|
mySpacer.propertyColor.set(etk::Color<>(0,0,0,0xFF));
|
||||||
|
// add it in the widget list
|
||||||
|
mySizer.subWidgetAdd(mySpacer);
|
||||||
|
} else {
|
||||||
|
myButton = ewol::widget::Button::create();
|
||||||
|
if (myButton == null) {
|
||||||
|
Log.error("Allocation Error");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
myButton.propertyExpand.set(Vector2b(true,true));
|
||||||
|
myButton.propertyFill.set(Vector2b(true,true));
|
||||||
|
// set callback
|
||||||
|
myButton.signalPressed.connect(sharedFromThis(), ewol::widget::Menu::onButtonPressed, ewol::widget::ButtonWeak(myButton));
|
||||||
|
// add it in the widget list
|
||||||
|
mySizer.subWidgetAdd(myButton);
|
||||||
|
if (this.listElement[iii].this.image.size() != 0) {
|
||||||
|
String composeString;
|
||||||
|
composeString+= " <sizer mode='hori' expand='true,false' fill='true,true' lock='true'>\n";
|
||||||
|
if (etk::end_with(this.listElement[iii].this.image, ".edf") == true) {
|
||||||
|
composeString+=" <image src='" + this.listElement[iii].this.image + "' size='8,8mm' distance-field='true'/>\n";
|
||||||
|
} else {
|
||||||
|
composeString+=" <image src='" + this.listElement[iii].this.image + "' size='8,8mm'/>\n";
|
||||||
|
}
|
||||||
|
composeString+=" <label exand='true,true' fill='true,true'><left>" + this.listElement[iii].this.label + "</left></label>\n";
|
||||||
|
composeString+=" </sizer>\n";
|
||||||
|
myButton.setSubWidget(ewol::widget::composerGenerateString(composeString));
|
||||||
|
} else {
|
||||||
|
if (menuHaveImage == true) {
|
||||||
|
myButton.setSubWidget(ewol::widget::composerGenerateString(
|
||||||
|
String() +
|
||||||
|
" <sizer mode='hori' expand='true,false' fill='true,true' lock='true'>\n"
|
||||||
|
" <spacer min-size='8,0mm'/>\n"
|
||||||
|
" <label exand='true,true' fill='true,true'><![CDATA[<left>" + this.listElement[iii].this.label + "</left>]]></label>\n"
|
||||||
|
" </sizer>\n")
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
ewol::widget::Label tmpLabel = widget::Label::create();
|
||||||
|
if (tmpLabel != null) {
|
||||||
|
tmpLabel.propertyValue.set(String("<left>") + this.listElement[iii].this.label + "</left>\n");
|
||||||
|
tmpLabel.propertyExpand.set(Vector2b(true,false));
|
||||||
|
tmpLabel.propertyFill.set(Vector2b(true,true));
|
||||||
|
myButton.setSubWidget(tmpLabel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.listElement[iii].this.widgetPointer = myButton;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ewol::widget::Windows currentWindows = getWindows();
|
||||||
|
if (currentWindows == null) {
|
||||||
|
Log.error("Can not get the curent Windows...");
|
||||||
|
} else {
|
||||||
|
currentWindows.popUpWidgetPush(tmpContext);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
boolean ewol::widget::Menu::loadXML( exml::Element _node) {
|
||||||
|
if (_node.exist() == false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// parse generic properties:
|
||||||
|
Widget::loadXML(_node);
|
||||||
|
// parse all the elements :
|
||||||
|
for ( auto nodeIt : _node.nodes) {
|
||||||
|
exml::Element pNode = nodeIt.toElement();
|
||||||
|
if (pNode.exist() == false) {
|
||||||
|
// trash here all that is not element
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String widgetName = pNode.getValue();
|
||||||
|
Log.info("Get node : " + pNode);
|
||||||
|
if (widgetName == "elem") {
|
||||||
|
// <elem title="_T{Title of the button}" image="DATA:///List.svg" event="menu:exit">
|
||||||
|
int idMenu = addTitle(pNode.attributes["title"], pNode.attributes["image"], pNode.attributes["event"]);
|
||||||
|
for ( auto nodeIt2 : pNode.nodes) {
|
||||||
|
|
||||||
|
exml::Element pNode2 = nodeIt2.toElement();
|
||||||
|
if (pNode2.exist() == false) {
|
||||||
|
// trash here all that is not element
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String widgetName2 = pNode2.getValue();
|
||||||
|
if (widgetName2 == "elem") {
|
||||||
|
// <elem title="_T{Title of the button}" image="DATA:///List.svg" event="menu:exit">
|
||||||
|
add(idMenu, pNode2.attributes["title"], pNode2.attributes["image"], pNode2.attributes["event"]);
|
||||||
|
} else if (widgetName2 == "separator") {
|
||||||
|
addSpacer(idMenu);
|
||||||
|
} else {
|
||||||
|
Log.error("[" + getId() + "] {" + getObjectType() + "} (l " + pNode2.getPos() + ") Unknown basic node='" + widgetName2 + "' not in : [elem,separator]" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (widgetName == "separator") {
|
||||||
|
addSpacer();
|
||||||
|
} else {
|
||||||
|
Log.error("[" + getId() + "] {" + getObjectType() + "} (l " + pNode.getPos() + ") Unknown basic node='" + widgetName + "' not in : [elem,separator]" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
*/
|
||||||
};
|
};
|
||||||
|
|
||||||
;
|
|
||||||
|
|
||||||
/** @file
|
|
||||||
* @author Edouard DUPIN
|
|
||||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
|
||||||
* @license MPL v2.0 (see license file)
|
|
||||||
*/
|
|
||||||
class MenuElement {
|
|
||||||
public MenuElement() { };int this.localId;int this.parentId;WeakReference<Widget>this.widgetPointer;String this.label;String this.image;String this.message;
|
|
||||||
}
|
|
@ -1,205 +0,0 @@
|
|||||||
/** @file
|
|
||||||
* @author Edouard DUPIN
|
|
||||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
|
||||||
* @license MPL v2.0 (see license file)
|
|
||||||
*/
|
|
||||||
#include <ewol/debug.hpp>
|
|
||||||
#include <ewol/ewol.hpp>
|
|
||||||
#include <ewol/widget/Select.hpp>
|
|
||||||
#include <ewol/widget/ContextMenu.hpp>
|
|
||||||
#include <ewol/widget/Label.hpp>
|
|
||||||
#include <ewol/widget/Windows.hpp>
|
|
||||||
|
|
||||||
#include <etk/typeInfo.hpp>
|
|
||||||
ETK_DECLARE_TYPE(ewol::widget::Select);
|
|
||||||
|
|
||||||
ewol::widget::Select::Element::Element(int _value, String _name, boolean _selected):
|
|
||||||
this.value(_value),
|
|
||||||
this.name(_name),
|
|
||||||
this.selected(_selected) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
ewol::widget::Select::Select() :
|
|
||||||
signalValue(this, "value", "Select value change"),
|
|
||||||
propertyValue(this, "value",
|
|
||||||
-1,
|
|
||||||
"Value of the Select",
|
|
||||||
ewol::widget::Select::onChangePropertyValue) {
|
|
||||||
addObjectType("ewol::widget::Select");
|
|
||||||
// the basic parameter:
|
|
||||||
propertyShape.setDirectCheck(etk::Uri("THEME_GUI:///Select.json?lib=ewol"));
|
|
||||||
propertySpinMode.setDirect(ewol::widget::spinPosition_noneRight);
|
|
||||||
propertySpinMode.changeDefault(ewol::widget::spinPosition_noneRight);
|
|
||||||
propertySpinMode.rename("none-none", "none");
|
|
||||||
propertySpinMode.rename("none-right", "right");
|
|
||||||
propertySpinMode.rename("left-none", "left");
|
|
||||||
propertySpinMode.remove("left-right");
|
|
||||||
propertySpinMode.remove("left-left");
|
|
||||||
propertySpinMode.remove("right-right");
|
|
||||||
}
|
|
||||||
|
|
||||||
ewol::widget::Select::~Select() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Select::onChangePropertyValue() {
|
|
||||||
markToRedraw();
|
|
||||||
if (this.widgetEntry == null) {
|
|
||||||
Log.error("Can not acces at entry ...");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (auto it : this.listElement) {
|
|
||||||
if (it.this.value == propertyValue.get()) {
|
|
||||||
if (it.this.selected == false) {
|
|
||||||
it.this.selected = true;
|
|
||||||
this.widgetEntry.propertyValue.set(it.this.name);
|
|
||||||
signalValue.emit(propertyValue.get());
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
it.this.selected = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Select::optionSelectDefault() {
|
|
||||||
if (this.widgetEntry == null) {
|
|
||||||
Log.error("Can not acces at entry ...");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (auto it : this.listElement) {
|
|
||||||
if (it.this.selected == true) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (this.listElement.size() == 0) {
|
|
||||||
this.widgetEntry.propertyValue.set("");
|
|
||||||
}
|
|
||||||
this.widgetEntry.propertyValue.set(this.listElement[0].this.name);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Select::optionRemove(int _value) {
|
|
||||||
for (auto it=this.listElement.begin(); it != this.listElement.end(); ++it) {
|
|
||||||
if (_value == it.this.value) {
|
|
||||||
Log.debug("remove element: " + _value);
|
|
||||||
this.listElement.erase(it);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
optionSelectDefault();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Select::optionClear() {
|
|
||||||
this.listElement.clear();
|
|
||||||
optionSelectDefault();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Select::optionAdd(int _value, String _data) {
|
|
||||||
for (auto it : this.listElement) {
|
|
||||||
if (_value == it.this.value) {
|
|
||||||
Log.debug("replace element: " + _value + " with: '" + _data + "'");
|
|
||||||
it.this.name = _data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.listElement.pushBack(ewol::widget::Select::Element(_value, _data, false));
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean ewol::widget::Select::loadXML( exml::Element _node) {
|
|
||||||
if (_node.exist() == false) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// parse generic properties:
|
|
||||||
ewol::widget::SpinBase::loadXML(_node);
|
|
||||||
// remove previous element:
|
|
||||||
//subWidgetRemove();
|
|
||||||
// parse all the elements:
|
|
||||||
for( auto it : _node.nodes) {
|
|
||||||
exml::Element pNode = it.toElement();
|
|
||||||
if (pNode.exist() == false) {
|
|
||||||
// trash here all that is not element
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (pNode.getValue() != "option") {
|
|
||||||
Log.error("(l " + pNode.getPos() + ") Unknown basic node='" + pNode.getValue() + "' not in : [option]" );
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
String valId = pNode.attributes["id"];
|
|
||||||
String valIsSelected = pNode.attributes["select"];
|
|
||||||
String valText = pNode.getText();
|
|
||||||
int id = etk::string_to_int(valId);
|
|
||||||
boolean select = etk::string_to_bool(valIsSelected);
|
|
||||||
optionAdd(id, valText);
|
|
||||||
if (select == true) {
|
|
||||||
propertyValue.set(id);
|
|
||||||
}
|
|
||||||
Log.warning("Add option : id='" + valId + "' select='" + valIsSelected + "' text='" + valText + "'");
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Select::updateGui() {
|
|
||||||
ewol::widget::SpinBase::updateGui();
|
|
||||||
|
|
||||||
if ( this.widgetEntry != null
|
|
||||||
LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM this.connectionEntry.isConnected() == false) {
|
|
||||||
|
|
||||||
}
|
|
||||||
if ( this.widgetButtonUp != null
|
|
||||||
LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM this.connectionButton.isConnected() == false) {
|
|
||||||
this.connectionButton = this.widgetButtonUp.signalPressed.connect(this, ewol::widget::Select::onCallbackOpenMenu);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Select::onCallbackLabelPressed(int _value) {
|
|
||||||
Log.verbose("User select:" + _value);
|
|
||||||
propertyValue.set(_value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Select::onCallbackOpenMenu() {
|
|
||||||
// create a context menu:
|
|
||||||
ewol::widget::ContextMenu tmpContext = ewol::widget::ContextMenu::create();
|
|
||||||
if (tmpContext == null) {
|
|
||||||
Log.error("Allocation Error");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// auto-select mark position:
|
|
||||||
tmpContext.setPositionMarkAuto(this.origin, this.size);
|
|
||||||
ewol::widget::Sizer mySizer;
|
|
||||||
mySizer = ewol::widget::Sizer::create();
|
|
||||||
if (mySizer == null) {
|
|
||||||
Log.error("Allocation Error or sizer");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
mySizer.propertyMode.set(widget::Sizer::modeVert);
|
|
||||||
mySizer.propertyLockExpand.set(Vector2f(true,true));
|
|
||||||
mySizer.propertyFill.set(Vector2f(true,true));
|
|
||||||
// set it in the pop-up-system:
|
|
||||||
tmpContext.setSubWidget(mySizer);
|
|
||||||
for (auto it : this.listElement) {
|
|
||||||
ewol::widget::Label myLabel = ewol::widget::Label::create();
|
|
||||||
if (myLabel == null) {
|
|
||||||
Log.error("Allocation Error");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (it.this.selected == true) {
|
|
||||||
myLabel.propertyValue.set(String("<b>") + it.this.name + "</b>");
|
|
||||||
} else {
|
|
||||||
myLabel.propertyValue.set(it.this.name);
|
|
||||||
}
|
|
||||||
myLabel.propertyExpand.set(Vector2b(true,true));
|
|
||||||
myLabel.propertyFill.set(Vector2b(true,true));
|
|
||||||
// set callback
|
|
||||||
myLabel.signalPressed.connect(sharedFromThis(), ewol::widget::Select::onCallbackLabelPressed, it.this.value);
|
|
||||||
myLabel.signalPressed.connect(tmpContext, ewol::widget::ContextMenu::destroy);
|
|
||||||
// add it in the widget list
|
|
||||||
mySizer.subWidgetAddStart(myLabel);
|
|
||||||
}
|
|
||||||
ewol::widget::Windows currentWindows = getWindows();
|
|
||||||
if (currentWindows == null) {
|
|
||||||
Log.error("Can not get the curent Windows...");
|
|
||||||
} else {
|
|
||||||
currentWindows.popUpWidgetPush(tmpContext);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,16 +1,60 @@
|
|||||||
|
package org.atriasoft.ewol.widget;
|
||||||
|
|
||||||
|
import org.atriasoft.esignal.Connection;
|
||||||
|
import org.atriasoft.esignal.Signal;
|
||||||
|
import org.atriasoft.esignal.SignalEmpty;
|
||||||
|
import org.atriasoft.etk.Uri;
|
||||||
|
import org.atriasoft.etk.math.Vector3b;
|
||||||
|
import org.atriasoft.etk.math.Vector3f;
|
||||||
|
import org.atriasoft.ewol.Gravity;
|
||||||
|
import org.atriasoft.ewol.Padding;
|
||||||
|
import org.atriasoft.ewol.annotation.EwolDescription;
|
||||||
|
import org.atriasoft.ewol.annotation.EwolSignal;
|
||||||
|
import org.atriasoft.ewol.compositing.GuiShape;
|
||||||
|
import org.atriasoft.ewol.compositing.GuiShapeMode;
|
||||||
|
import org.atriasoft.ewol.compositing.ShapeBox;
|
||||||
|
import org.atriasoft.ewol.event.EventEntry;
|
||||||
|
import org.atriasoft.ewol.event.EventInput;
|
||||||
|
import org.atriasoft.ewol.event.EventTime;
|
||||||
|
import org.atriasoft.ewol.internal.Log;
|
||||||
|
import org.atriasoft.ewol.object.EwolObject;
|
||||||
|
import org.atriasoft.exml.annotation.XmlAttribute;
|
||||||
|
import org.atriasoft.exml.annotation.XmlManaged;
|
||||||
|
import org.atriasoft.exml.annotation.XmlName;
|
||||||
|
import org.atriasoft.gale.key.KeyKeyboard;
|
||||||
|
import org.atriasoft.gale.key.KeyStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* a composed Select is a Select with an inside composed with the specify XML element
|
* a composed Select is a Select with an inside composed with the specify XML element
|
||||||
* ==> this permit to generate standard element simple
|
* ==> this permit to generate standard element simple
|
||||||
*/
|
*/
|
||||||
class Select extends SpinBase {
|
class Select extends SpinBase {
|
||||||
|
@EwolSignal(name = "value", description = "Select value change")
|
||||||
public Signal<int> signalValue = new Signal<int>();
|
public Signal<int> signalValue = new Signal<int>();
|
||||||
protected int propertyValue; //!< Current state of the Select.
|
/*
|
||||||
|
propertyValue(this, "value",
|
||||||
|
"Value of the Select",
|
||||||
|
ewol::widget::Select::onChangePropertyValue) {
|
||||||
|
*/
|
||||||
|
protected int propertyValue = -1; //!< Current state of the Select.
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
* @param _shaperName Shaper file properties
|
* @param _shaperName Shaper file properties
|
||||||
*/
|
*/
|
||||||
public Select();
|
public Select() {
|
||||||
|
setPropertyShape( new Uri("THEME","/shape/Select.json", "ewol"));
|
||||||
|
|
||||||
|
propertySpinMode = SpinPosition.noneRight);
|
||||||
|
/*
|
||||||
|
propertySpinMode.changeDefault(ewol::widget::spinPosition_noneRight);
|
||||||
|
propertySpinMode.rename("none-none", "none");
|
||||||
|
propertySpinMode.rename("none-right", "right");
|
||||||
|
propertySpinMode.rename("left-none", "left");
|
||||||
|
propertySpinMode.remove("left-right");
|
||||||
|
propertySpinMode.remove("left-left");
|
||||||
|
propertySpinMode.remove("right-right");
|
||||||
|
*/
|
||||||
|
}
|
||||||
protected class Element {
|
protected class Element {
|
||||||
public:
|
public:
|
||||||
int value;
|
int value;
|
||||||
@ -19,18 +63,168 @@ class Select extends SpinBase {
|
|||||||
public:
|
public:
|
||||||
// TODO: Remove this: due to the fact my List is not full implemented
|
// TODO: Remove this: due to the fact my List is not full implemented
|
||||||
Element() {}
|
Element() {}
|
||||||
Element(int _value, String _name, boolean _selected=false);
|
Element(int _value, String _name, boolean _selected=false) {
|
||||||
|
this.value = _value;
|
||||||
|
this.name = _name;
|
||||||
|
this.selected = _selected;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
protected List<ewol::widget::Select::Element> this.listElement;
|
protected List<ewol::widget::Select::Element> this.listElement;
|
||||||
public void optionSelectDefault();
|
public void optionSelectDefault(){
|
||||||
public void optionRemove(int _value);
|
if (this.widgetEntry == null) {
|
||||||
public void optionClear();
|
Log.error("Can not acces at entry ...");
|
||||||
public void optionAdd(int _value, String _name);
|
return;
|
||||||
protected boolean loadXML( exml::Element _node) ;
|
}
|
||||||
protected void updateGui() ;
|
for (auto it : this.listElement) {
|
||||||
protected void onCallbackOpenMenu();
|
if (it.this.selected == true) {
|
||||||
protected void onCallbackLabelPressed(int _value);
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this.listElement.size() == 0) {
|
||||||
|
this.widgetEntry.propertyValue.set("");
|
||||||
|
}
|
||||||
|
this.widgetEntry.propertyValue.set(this.listElement[0].this.name);
|
||||||
|
}
|
||||||
|
public void optionRemove(int _value){
|
||||||
|
for (auto it=this.listElement.begin(); it != this.listElement.end(); ++it) {
|
||||||
|
if (_value == it.this.value) {
|
||||||
|
Log.debug("remove element: " + _value);
|
||||||
|
this.listElement.erase(it);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
optionSelectDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void optionClear() {
|
||||||
|
this.listElement.clear();
|
||||||
|
optionSelectDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void optionAdd(int _value, String _name) {
|
||||||
|
for (auto it : this.listElement) {
|
||||||
|
if (_value == it.this.value) {
|
||||||
|
Log.debug("replace element: " + _value + " with: '" + _data + "'");
|
||||||
|
it.this.name = _data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.listElement.pushBack(ewol::widget::Select::Element(_value, _data, false));
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
protected boolean loadXML( exml::Element _node){
|
||||||
|
if (_node.exist() == false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// parse generic properties:
|
||||||
|
ewol::widget::SpinBase::loadXML(_node);
|
||||||
|
// remove previous element:
|
||||||
|
//subWidgetRemove();
|
||||||
|
// parse all the elements:
|
||||||
|
for( auto it : _node.nodes) {
|
||||||
|
exml::Element pNode = it.toElement();
|
||||||
|
if (pNode.exist() == false) {
|
||||||
|
// trash here all that is not element
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (pNode.getValue() != "option") {
|
||||||
|
Log.error("(l " + pNode.getPos() + ") Unknown basic node='" + pNode.getValue() + "' not in : [option]" );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String valId = pNode.attributes["id"];
|
||||||
|
String valIsSelected = pNode.attributes["select"];
|
||||||
|
String valText = pNode.getText();
|
||||||
|
int id = etk::string_to_int(valId);
|
||||||
|
boolean select = etk::string_to_bool(valIsSelected);
|
||||||
|
optionAdd(id, valText);
|
||||||
|
if (select == true) {
|
||||||
|
propertyValue.set(id);
|
||||||
|
}
|
||||||
|
Log.warning("Add option : id='" + valId + "' select='" + valIsSelected + "' text='" + valText + "'");
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
protected void updateGui() {
|
||||||
|
ewol::widget::SpinBase::updateGui();
|
||||||
|
|
||||||
|
if ( this.widgetEntry != null
|
||||||
|
&& this.connectionEntry.isConnected() == false) {
|
||||||
|
|
||||||
|
}
|
||||||
|
if ( this.widgetButtonUp != null
|
||||||
|
&& this.connectionButton.isConnected() == false) {
|
||||||
|
this.connectionButton = this.widgetButtonUp.signalPressed.connect(this, ewol::widget::Select::onCallbackOpenMenu);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
protected void onCallbackOpenMenu() {
|
||||||
|
// create a context menu:
|
||||||
|
ewol::widget::ContextMenu tmpContext = ewol::widget::ContextMenu::create();
|
||||||
|
if (tmpContext == null) {
|
||||||
|
Log.error("Allocation Error");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// auto-select mark position:
|
||||||
|
tmpContext.setPositionMarkAuto(this.origin, this.size);
|
||||||
|
ewol::widget::Sizer mySizer;
|
||||||
|
mySizer = ewol::widget::Sizer::create();
|
||||||
|
if (mySizer == null) {
|
||||||
|
Log.error("Allocation Error or sizer");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mySizer.propertyMode.set(widget::Sizer::modeVert);
|
||||||
|
mySizer.propertyLockExpand.set(Vector2f(true,true));
|
||||||
|
mySizer.propertyFill.set(Vector2f(true,true));
|
||||||
|
// set it in the pop-up-system:
|
||||||
|
tmpContext.setSubWidget(mySizer);
|
||||||
|
for (auto it : this.listElement) {
|
||||||
|
ewol::widget::Label myLabel = ewol::widget::Label::create();
|
||||||
|
if (myLabel == null) {
|
||||||
|
Log.error("Allocation Error");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (it.this.selected == true) {
|
||||||
|
myLabel.propertyValue.set(String("<b>") + it.this.name + "</b>");
|
||||||
|
} else {
|
||||||
|
myLabel.propertyValue.set(it.this.name);
|
||||||
|
}
|
||||||
|
myLabel.propertyExpand.set(Vector2b(true,true));
|
||||||
|
myLabel.propertyFill.set(Vector2b(true,true));
|
||||||
|
// set callback
|
||||||
|
myLabel.signalPressed.connect(sharedFromThis(), ewol::widget::Select::onCallbackLabelPressed, it.this.value);
|
||||||
|
myLabel.signalPressed.connect(tmpContext, ewol::widget::ContextMenu::destroy);
|
||||||
|
// add it in the widget list
|
||||||
|
mySizer.subWidgetAddStart(myLabel);
|
||||||
|
}
|
||||||
|
ewol::widget::Windows currentWindows = getWindows();
|
||||||
|
if (currentWindows == null) {
|
||||||
|
Log.error("Can not get the curent Windows...");
|
||||||
|
} else {
|
||||||
|
currentWindows.popUpWidgetPush(tmpContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
protected void onCallbackLabelPressed(int _value){
|
||||||
|
Log.verbose("User select:" + _value);
|
||||||
|
propertyValue.set(_value);
|
||||||
|
}
|
||||||
protected esignal::Connection connectionEntry = null;
|
protected esignal::Connection connectionEntry = null;
|
||||||
protected esignal::Connection connectionButton = null;
|
protected esignal::Connection connectionButton = null;
|
||||||
protected void onChangePropertyValue();
|
protected void onChangePropertyValue(){
|
||||||
|
markToRedraw();
|
||||||
|
if (this.widgetEntry == null) {
|
||||||
|
Log.error("Can not acces at entry ...");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (auto it : this.listElement) {
|
||||||
|
if (it.this.value == propertyValue.get()) {
|
||||||
|
if (it.this.selected == false) {
|
||||||
|
it.this.selected = true;
|
||||||
|
this.widgetEntry.propertyValue.set(it.this.name);
|
||||||
|
signalValue.emit(propertyValue.get());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
it.this.selected = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@ namespace ewol {
|
|||||||
DECLARE_WIDGET_FACTORY(Slider, "Slider");
|
DECLARE_WIDGET_FACTORY(Slider, "Slider");
|
||||||
~Slider();
|
~Slider();
|
||||||
public:
|
public:
|
||||||
// TODO : Rewoek the color in the theme ...
|
// TODO : Rework the color in the theme ...
|
||||||
void setColor(etk::Color<> _newColor) {
|
void setColor(etk::Color<> _newColor) {
|
||||||
this.textColorFg = _newColor;
|
this.textColorFg = _newColor;
|
||||||
};
|
};
|
||||||
|
@ -1,106 +0,0 @@
|
|||||||
/** @file
|
|
||||||
* @author Edouard DUPIN
|
|
||||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
|
||||||
* @license MPL v2.0 (see license file)
|
|
||||||
*/
|
|
||||||
#include <ewol/debug.hpp>
|
|
||||||
#include <ewol/ewol.hpp>
|
|
||||||
#include <ewol/widget/Spin.hpp>
|
|
||||||
#include <ewol/widget/ContextMenu.hpp>
|
|
||||||
#include <ewol/widget/Label.hpp>
|
|
||||||
#include <ewol/widget/Windows.hpp>
|
|
||||||
#include <etk/typeInfo.hpp>
|
|
||||||
ETK_DECLARE_TYPE(ewol::widget::Spin);
|
|
||||||
|
|
||||||
ewol::widget::Spin::Spin() :
|
|
||||||
signalValue(this, "value",
|
|
||||||
"Spin value change"),
|
|
||||||
signalValueDouble(this, "valueDouble",
|
|
||||||
"Spin value change value in 'double'"),
|
|
||||||
propertyValue(this, "value",
|
|
||||||
0,
|
|
||||||
"Value of the Spin",
|
|
||||||
ewol::widget::Spin::onChangePropertyValue),
|
|
||||||
propertyMin(this, "min",
|
|
||||||
-9999999999,
|
|
||||||
"Minimum value of the spin",
|
|
||||||
ewol::widget::Spin::onChangePropertyMin),
|
|
||||||
propertyMax(this, "max",
|
|
||||||
9999999999,
|
|
||||||
"Maximum value of the spin",
|
|
||||||
ewol::widget::Spin::onChangePropertyMax),
|
|
||||||
propertyIncrement(this, "increment",
|
|
||||||
1,
|
|
||||||
"Increment value at each button event or keybord event",
|
|
||||||
ewol::widget::Spin::onChangePropertyIncrement),
|
|
||||||
propertyMantis(this, "mantis",
|
|
||||||
0,
|
|
||||||
"fix-point mantis",
|
|
||||||
ewol::widget::Spin::onChangePropertyMantis) {
|
|
||||||
addObjectType("ewol::widget::Spin");
|
|
||||||
propertyShape.setDirectCheck(etk::Uri("THEME_GUI:///Spin.json?lib=ewol"));
|
|
||||||
}
|
|
||||||
|
|
||||||
ewol::widget::Spin::~Spin() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Spin::onChangePropertyValue() {
|
|
||||||
markToRedraw();
|
|
||||||
if (this.widgetEntry == null) {
|
|
||||||
Log.error("Can not acces at entry ...");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
checkValue(*propertyValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Spin::onChangePropertyMin() {
|
|
||||||
checkValue(*propertyValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Spin::onChangePropertyMax() {
|
|
||||||
checkValue(*propertyValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Spin::onChangePropertyIncrement() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Spin::onChangePropertyMantis() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Spin::updateGui() {
|
|
||||||
Log.warning("updateGui [START]");
|
|
||||||
ewol::widget::SpinBase::updateGui();
|
|
||||||
|
|
||||||
if ( this.widgetEntry != null
|
|
||||||
&& this.connectionEntry.isConnected() == false) {
|
|
||||||
|
|
||||||
}
|
|
||||||
if ( this.widgetButtonUp != null
|
|
||||||
&& this.connectionButtonUp.isConnected() == false) {
|
|
||||||
this.connectionButtonUp = this.widgetButtonUp.signalPressed.connect(this, ewol::widget::Spin::onCallbackUp);
|
|
||||||
}
|
|
||||||
if ( this.widgetButtonDown != null
|
|
||||||
&& this.connectionButtonDown.isConnected() == false) {
|
|
||||||
this.connectionButtonDown = this.widgetButtonDown.signalPressed.connect(this, ewol::widget::Spin::onCallbackDown);
|
|
||||||
}
|
|
||||||
Log.warning("updateGui [STOP]");
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Spin::checkValue(long _value) {
|
|
||||||
_value = etk::avg(propertyMin.get(), _value, propertyMax.get());
|
|
||||||
propertyValue.setDirect(_value);
|
|
||||||
this.widgetEntry.propertyValue.set(etk::toString(_value));
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Spin::onCallbackUp() {
|
|
||||||
long value = propertyValue.get() + propertyIncrement.get();
|
|
||||||
checkValue(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Spin::onCallbackDown() {
|
|
||||||
long value = propertyValue.get() - propertyIncrement.get();
|
|
||||||
checkValue(value);
|
|
||||||
}
|
|
@ -1,46 +0,0 @@
|
|||||||
|
|
||||||
/**
|
|
||||||
* a composed Spin is a Spin with an inside composed with the specify XML element
|
|
||||||
* ==> this permit to generate standard element simple
|
|
||||||
*/
|
|
||||||
class Spin : public ewol::widget::SpinBase {
|
|
||||||
public:
|
|
||||||
// Event list of properties
|
|
||||||
esignal::Signal<long> signalValue;
|
|
||||||
esignal::Signal<double> signalValueDouble;
|
|
||||||
public:
|
|
||||||
eproperty::Value<long> propertyValue; //!< Current value of the Spin.
|
|
||||||
eproperty::Value<long> propertyMin; //!< Minimum value
|
|
||||||
eproperty::Value<long> propertyMax; //!< Maximum value
|
|
||||||
eproperty::Value<long> propertyIncrement; //!< Increment value
|
|
||||||
eproperty::Value<int8_t> propertyMantis; //!< number of value under '.' value
|
|
||||||
protected:
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
* @param _mode mode to display the spin
|
|
||||||
* @param _shaperName Shaper file properties
|
|
||||||
*/
|
|
||||||
Spin();
|
|
||||||
public:
|
|
||||||
DECLARE_WIDGET_FACTORY(Spin, "Spin");
|
|
||||||
/**
|
|
||||||
* Destructor
|
|
||||||
*/
|
|
||||||
~Spin();
|
|
||||||
protected:
|
|
||||||
void checkValue(long _value);
|
|
||||||
void updateGui();
|
|
||||||
protected:
|
|
||||||
void onCallbackUp();
|
|
||||||
void onCallbackDown();
|
|
||||||
protected:
|
|
||||||
esignal::Connection this.connectionEntry;
|
|
||||||
esignal::Connection this.connectionButtonUp;
|
|
||||||
esignal::Connection this.connectionButtonDown;
|
|
||||||
protected:
|
|
||||||
void onChangePropertyValue();
|
|
||||||
void onChangePropertyMin();
|
|
||||||
void onChangePropertyMax();
|
|
||||||
void onChangePropertyIncrement();
|
|
||||||
void onChangePropertyMantis();
|
|
||||||
}
|
|
@ -176,9 +176,9 @@ boolean ewol::widget::TreeView::onItemEvent( ewol::event::Input _event, Vector2
|
|||||||
+ " in " + posStart
|
+ " in " + posStart
|
||||||
+ " . " + (posStart+Vector2f(propertyIconTreeViewSize.get(),propertyIconTreeViewSize.get())));
|
+ " . " + (posStart+Vector2f(propertyIconTreeViewSize.get(),propertyIconTreeViewSize.get())));
|
||||||
if ( _mousePosition.x() >= posStart.x()
|
if ( _mousePosition.x() >= posStart.x()
|
||||||
LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM _mousePosition.x() <= posStart.x()+propertyIconTreeViewSize.get()
|
&& _mousePosition.x() <= posStart.x()+propertyIconTreeViewSize.get()
|
||||||
LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM this.listSizeY[_pos.y()] - _mousePosition.y() >= posStart.y()
|
&& this.listSizeY[_pos.y()] - _mousePosition.y() >= posStart.y()
|
||||||
LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM this.listSizeY[_pos.y()] - _mousePosition.y() <= propertyIconTreeViewSize.get() ) {
|
&& this.listSizeY[_pos.y()] - _mousePosition.y() <= propertyIconTreeViewSize.get() ) {
|
||||||
onItemExpandEvent(_pos);
|
onItemExpandEvent(_pos);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1,153 +0,0 @@
|
|||||||
/** @file
|
|
||||||
* @author Edouard DUPIN
|
|
||||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
|
||||||
* @license MPL v2.0 (see license file)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <ewol/widget/meta/ColorChooser.hpp>
|
|
||||||
#include <ewol/widget/Sizer.hpp>
|
|
||||||
#include <ewol/widget/List.hpp>
|
|
||||||
#include <ewol/widget/Spacer.hpp>
|
|
||||||
#include <ewol/widget/Manager.hpp>
|
|
||||||
//#include <etk/Vector.hpp>
|
|
||||||
#include <etk/Vector.hpp>
|
|
||||||
#include <etk/typeInfo.hpp>
|
|
||||||
ETK_DECLARE_TYPE(ewol::widget::ColorChooser);
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
// file browsing ...
|
|
||||||
#include <dirent.h>
|
|
||||||
}
|
|
||||||
|
|
||||||
ewol::widget::ColorChooser::ColorChooser() :
|
|
||||||
signalChange(this, "change", ""),
|
|
||||||
propertyValue(this, "value",
|
|
||||||
etk::color::white,
|
|
||||||
"color to select",
|
|
||||||
ewol::widget::ColorChooser::onChangePropertyValue) {
|
|
||||||
addObjectType("ewol::widget::ColorChooser");
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::ColorChooser::init() {
|
|
||||||
ewol::widget::Sizer::init();
|
|
||||||
propertyMode.set(ewol::widget::Sizer::modeVert);
|
|
||||||
propertyLockExpand.set(Vector2b(true,true));
|
|
||||||
this.widgetColorBar = ewol::widget::ColorBar::create();
|
|
||||||
this.widgetColorBar.signalChange.connect(sharedFromThis(), ewol::widget::ColorChooser::onCallbackColorChange);
|
|
||||||
this.widgetColorBar.propertyFill.set(Vector2b(true,true));
|
|
||||||
subWidgetAdd(this.widgetColorBar);
|
|
||||||
|
|
||||||
etk::Color<> sliderColor;
|
|
||||||
sliderColor = etk::color::black;
|
|
||||||
|
|
||||||
this.widgetRed = ewol::widget::Slider::create();
|
|
||||||
this.widgetRed.signalChange.connect(sharedFromThis(), ewol::widget::ColorChooser::onCallbackColorChangeRed);
|
|
||||||
this.widgetRed.propertyExpand.set(Vector2b(true,false));
|
|
||||||
this.widgetRed.propertyFill.set(Vector2b(true,false));
|
|
||||||
this.widgetRed.propertyMinimum.set(0);
|
|
||||||
this.widgetRed.propertyMaximum.set(255);
|
|
||||||
sliderColor = etk::Color<>(0xFF, 0x00, 0x00, 0xFF);
|
|
||||||
this.widgetRed.setColor(sliderColor);
|
|
||||||
subWidgetAdd(this.widgetRed);
|
|
||||||
this.widgetGreen = ewol::widget::Slider::create();
|
|
||||||
this.widgetGreen.signalChange.connect(sharedFromThis(), ewol::widget::ColorChooser::onCallbackColorChangeGreen);
|
|
||||||
this.widgetGreen.propertyExpand.set(Vector2b(true,false));
|
|
||||||
this.widgetGreen.propertyFill.set(Vector2b(true,false));
|
|
||||||
this.widgetGreen.propertyMinimum.set(0);
|
|
||||||
this.widgetGreen.propertyMaximum.set(255);
|
|
||||||
sliderColor = etk::Color<>(0x00, 0xFF, 0x00, 0xFF);
|
|
||||||
this.widgetGreen.setColor(sliderColor);
|
|
||||||
subWidgetAdd(this.widgetGreen);
|
|
||||||
this.widgetBlue = ewol::widget::Slider::create();
|
|
||||||
this.widgetBlue.signalChange.connect(sharedFromThis(), ewol::widget::ColorChooser::onCallbackColorChangeBlue);
|
|
||||||
this.widgetBlue.propertyExpand.set(Vector2b(true,false));
|
|
||||||
this.widgetBlue.propertyFill.set(Vector2b(true,false));
|
|
||||||
this.widgetBlue.propertyMinimum.set(0);
|
|
||||||
this.widgetBlue.propertyMaximum.set(255);
|
|
||||||
sliderColor = etk::Color<>(0x00, 0x00, 0xFF, 0xFF);
|
|
||||||
this.widgetBlue.setColor(sliderColor);
|
|
||||||
subWidgetAdd(this.widgetBlue);
|
|
||||||
this.widgetAlpha = ewol::widget::Slider::create();
|
|
||||||
this.widgetAlpha.signalChange.connect(sharedFromThis(), ewol::widget::ColorChooser::onCallbackColorChangeAlpha);
|
|
||||||
this.widgetAlpha.propertyExpand.set(Vector2b(true,false));
|
|
||||||
this.widgetAlpha.propertyFill.set(Vector2b(true,false));
|
|
||||||
this.widgetAlpha.propertyMinimum.set(0);
|
|
||||||
this.widgetAlpha.propertyMaximum.set(255);
|
|
||||||
subWidgetAdd(this.widgetAlpha);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ewol::widget::ColorChooser::~ColorChooser() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ewol::widget::ColorChooser::onChangePropertyValue() {
|
|
||||||
if (this.widgetRed != null) {
|
|
||||||
this.widgetRed.propertyValue.set(propertyValue.r());
|
|
||||||
}
|
|
||||||
if (this.widgetGreen != null) {
|
|
||||||
this.widgetGreen.propertyValue.set(propertyValue.g());
|
|
||||||
}
|
|
||||||
if (this.widgetBlue != null) {
|
|
||||||
this.widgetBlue.propertyValue.set(propertyValue.b());
|
|
||||||
}
|
|
||||||
if (this.widgetAlpha != null) {
|
|
||||||
this.widgetAlpha.propertyValue.set(propertyValue.a());
|
|
||||||
}
|
|
||||||
if (this.widgetColorBar != null) {
|
|
||||||
this.widgetColorBar.propertyValue.set(propertyValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::ColorChooser::onCallbackColorChangeRed( float _newColor) {
|
|
||||||
propertyValue.getDirect().setR(_newColor);
|
|
||||||
if (this.widgetColorBar != null) {
|
|
||||||
this.widgetColorBar.propertyValue.set(propertyValue);
|
|
||||||
}
|
|
||||||
signalChange.emit(propertyValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::ColorChooser::onCallbackColorChangeGreen( float _newColor) {
|
|
||||||
propertyValue.getDirect().setG(_newColor);
|
|
||||||
if (this.widgetColorBar != null) {
|
|
||||||
this.widgetColorBar.propertyValue.set(propertyValue);
|
|
||||||
}
|
|
||||||
signalChange.emit(propertyValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::ColorChooser::onCallbackColorChangeBlue( float _newColor) {
|
|
||||||
propertyValue.getDirect().setB(_newColor);
|
|
||||||
if (this.widgetColorBar != null) {
|
|
||||||
this.widgetColorBar.propertyValue.set(propertyValue);
|
|
||||||
}
|
|
||||||
signalChange.emit(propertyValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::ColorChooser::onCallbackColorChangeAlpha( float _newColor) {
|
|
||||||
propertyValue.getDirect().setA(_newColor);
|
|
||||||
if (this.widgetColorBar != null) {
|
|
||||||
this.widgetColorBar.propertyValue.set(propertyValue);
|
|
||||||
}
|
|
||||||
signalChange.emit(propertyValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::ColorChooser::onCallbackColorChange( etk::Color<> _newColor) {
|
|
||||||
// == > colorBar has change ...
|
|
||||||
int tmpAlpha = propertyValue.a();
|
|
||||||
propertyValue.getDirect() = _newColor;
|
|
||||||
propertyValue.getDirect().setA(tmpAlpha);
|
|
||||||
if (this.widgetRed != null) {
|
|
||||||
this.widgetRed.propertyValue.set(propertyValue.r());
|
|
||||||
}
|
|
||||||
if (this.widgetGreen != null) {
|
|
||||||
this.widgetGreen.propertyValue.set(propertyValue.g());
|
|
||||||
}
|
|
||||||
if (this.widgetBlue != null) {
|
|
||||||
this.widgetBlue.propertyValue.set(propertyValue.b());
|
|
||||||
}
|
|
||||||
if (this.widgetAlpha != null) {
|
|
||||||
this.widgetAlpha.propertyValue.set(propertyValue.a());
|
|
||||||
}
|
|
||||||
signalChange.emit(propertyValue);
|
|
||||||
}
|
|
@ -1,53 +1,164 @@
|
|||||||
/** @file
|
package org.atriasoft.ewol.widget;
|
||||||
* @author Edouard DUPIN
|
|
||||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
|
||||||
* @license MPL v2.0 (see license file)
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <etk/types.hpp>
|
|
||||||
#include <ewol/debug.hpp>
|
|
||||||
#include <ewol/widget/PopUp.hpp>
|
|
||||||
#include <ewol/widget/Button.hpp>
|
|
||||||
#include <ewol/widget/Entry.hpp>
|
|
||||||
#include <ewol/widget/Label.hpp>
|
|
||||||
#include <ewol/widget/Sizer.hpp>
|
|
||||||
#include <ewol/widget/ColorBar.hpp>
|
|
||||||
#include <ewol/widget/Slider.hpp>
|
|
||||||
#include <esignal/Signal.hpp>
|
|
||||||
|
|
||||||
namespace ewol {
|
import org.atriasoft.etk.Color;
|
||||||
namespace widget {
|
import org.atriasoft.etk.Uri;
|
||||||
class ColorChooser;
|
import org.atriasoft.etk.math.FMath;
|
||||||
using ColorChooser = ememory::Ptr<ewol::widget::ColorChooser>;
|
import org.atriasoft.etk.math.Matrix4f;
|
||||||
using ColorChooserWeak = ememory::WeakPtr<ewol::widget::ColorChooser>;
|
import org.atriasoft.etk.math.Vector2f;
|
||||||
/**
|
import org.atriasoft.etk.math.Vector3f;
|
||||||
|
import org.atriasoft.ewol.DrawProperty;
|
||||||
|
import org.atriasoft.ewol.HighSpeedMode;
|
||||||
|
import org.atriasoft.ewol.Padding;
|
||||||
|
import org.atriasoft.ewol.annotation.EwolDescription;
|
||||||
|
import org.atriasoft.ewol.compositing.GuiShape;
|
||||||
|
import org.atriasoft.ewol.event.EventInput;
|
||||||
|
import org.atriasoft.ewol.internal.Log;
|
||||||
|
import org.atriasoft.exml.annotation.XmlAttribute;
|
||||||
|
import org.atriasoft.exml.annotation.XmlManaged;
|
||||||
|
import org.atriasoft.exml.annotation.XmlName;
|
||||||
|
import org.atriasoft.gale.backend3d.OpenGL;
|
||||||
|
import org.atriasoft.gale.key.KeyStatus;
|
||||||
|
import org.atriasoft.gale.key.KeyType;
|
||||||
|
|
||||||
|
/**
|
||||||
* @ingroup ewolWidgetGroup
|
* @ingroup ewolWidgetGroup
|
||||||
*/
|
*/
|
||||||
class ColorChooser : public ewol::widget::Sizer {
|
class ColorChooser entends Sizer {
|
||||||
public: // signals
|
@EwolSignal(name = "change", description = "Update new color")
|
||||||
esignal::Signal<etk::Color<>> signalChange;
|
public Signal<Color> signalChange;
|
||||||
public:
|
|
||||||
eproperty::Value<etk::Color<>> propertyValue;
|
protected Color propertyValue = Color.WHITE;
|
||||||
protected:
|
@XmlManaged
|
||||||
ColorChooser();
|
@XmlAttribute
|
||||||
void init() ;
|
@XmlName(value = "value")
|
||||||
public:
|
@EwolDescription(value = "color to select")
|
||||||
DECLARE_WIDGET_FACTORY(ColorChooser, "ColorChooser");
|
public Color getPropertyValue() {
|
||||||
~ColorChooser();
|
return propertyValue;
|
||||||
private:
|
}
|
||||||
ewol::widget::ColorBar this.widgetColorBar;
|
public void setPropertyValue(Color propertyValue) {
|
||||||
ewol::widget::Slider this.widgetRed;
|
if (this.propertyValue.equals(propertyValue)) {
|
||||||
ewol::widget::Slider this.widgetGreen;
|
return;
|
||||||
ewol::widget::Slider this.widgetBlue;
|
}
|
||||||
ewol::widget::Slider this.widgetAlpha;
|
this.propertyValue = propertyValue;
|
||||||
void onCallbackColorChangeRed( float _newColor);
|
onChangePropertyValue();
|
||||||
void onCallbackColorChangeGreen( float _newColor);
|
}
|
||||||
void onCallbackColorChangeBlue( float _newColor);
|
|
||||||
void onCallbackColorChangeAlpha( float _newColor);
|
|
||||||
void onCallbackColorChange( etk::Color<> _newColor);
|
protected ColorChooser() {
|
||||||
protected:
|
{
|
||||||
void onChangePropertyValue();
|
ewol::widget::Sizer::init();
|
||||||
};
|
propertyMode.set(ewol::widget::Sizer::modeVert);
|
||||||
};
|
propertyLockExpand.set(Vector2b(true,true));
|
||||||
};
|
this.widgetColorBar = ewol::widget::ColorBar::create();
|
||||||
|
this.widgetColorBar.signalChange.connect(sharedFromThis(), ewol::widget::ColorChooser::onCallbackColorChange);
|
||||||
|
this.widgetColorBar.propertyFill.set(Vector2b(true,true));
|
||||||
|
subWidgetAdd(this.widgetColorBar);
|
||||||
|
|
||||||
|
etk::Color<> sliderColor;
|
||||||
|
sliderColor = etk::color::black;
|
||||||
|
|
||||||
|
this.widgetRed = ewol::widget::Slider::create();
|
||||||
|
this.widgetRed.signalChange.connect(sharedFromThis(), ewol::widget::ColorChooser::onCallbackColorChangeRed);
|
||||||
|
this.widgetRed.propertyExpand.set(Vector2b(true,false));
|
||||||
|
this.widgetRed.propertyFill.set(Vector2b(true,false));
|
||||||
|
this.widgetRed.propertyMinimum.set(0);
|
||||||
|
this.widgetRed.propertyMaximum.set(255);
|
||||||
|
sliderColor = etk::Color<>(0xFF, 0x00, 0x00, 0xFF);
|
||||||
|
this.widgetRed.setColor(sliderColor);
|
||||||
|
subWidgetAdd(this.widgetRed);
|
||||||
|
this.widgetGreen = ewol::widget::Slider::create();
|
||||||
|
this.widgetGreen.signalChange.connect(sharedFromThis(), ewol::widget::ColorChooser::onCallbackColorChangeGreen);
|
||||||
|
this.widgetGreen.propertyExpand.set(Vector2b(true,false));
|
||||||
|
this.widgetGreen.propertyFill.set(Vector2b(true,false));
|
||||||
|
this.widgetGreen.propertyMinimum.set(0);
|
||||||
|
this.widgetGreen.propertyMaximum.set(255);
|
||||||
|
sliderColor = etk::Color<>(0x00, 0xFF, 0x00, 0xFF);
|
||||||
|
this.widgetGreen.setColor(sliderColor);
|
||||||
|
subWidgetAdd(this.widgetGreen);
|
||||||
|
this.widgetBlue = ewol::widget::Slider::create();
|
||||||
|
this.widgetBlue.signalChange.connect(sharedFromThis(), ewol::widget::ColorChooser::onCallbackColorChangeBlue);
|
||||||
|
this.widgetBlue.propertyExpand.set(Vector2b(true,false));
|
||||||
|
this.widgetBlue.propertyFill.set(Vector2b(true,false));
|
||||||
|
this.widgetBlue.propertyMinimum.set(0);
|
||||||
|
this.widgetBlue.propertyMaximum.set(255);
|
||||||
|
sliderColor = etk::Color<>(0x00, 0x00, 0xFF, 0xFF);
|
||||||
|
this.widgetBlue.setColor(sliderColor);
|
||||||
|
subWidgetAdd(this.widgetBlue);
|
||||||
|
this.widgetAlpha = ewol::widget::Slider::create();
|
||||||
|
this.widgetAlpha.signalChange.connect(sharedFromThis(), ewol::widget::ColorChooser::onCallbackColorChangeAlpha);
|
||||||
|
this.widgetAlpha.propertyExpand.set(Vector2b(true,false));
|
||||||
|
this.widgetAlpha.propertyFill.set(Vector2b(true,false));
|
||||||
|
this.widgetAlpha.propertyMinimum.set(0);
|
||||||
|
this.widgetAlpha.propertyMaximum.set(255);
|
||||||
|
subWidgetAdd(this.widgetAlpha);
|
||||||
|
}
|
||||||
|
protected ColorBar widgetColorBar;
|
||||||
|
protected Slider widgetRed;
|
||||||
|
protected Slider widgetGreen;
|
||||||
|
protected Slider widgetBlue;
|
||||||
|
protected Slider widgetAlpha;
|
||||||
|
protected static void onCallbackColorChangeRed(ColorChooser self, float _newColor){
|
||||||
|
propertyValue.getDirect().setR(_newColor);
|
||||||
|
if (this.widgetColorBar != null) {
|
||||||
|
this.widgetColorBar.propertyValue.set(propertyValue);
|
||||||
|
}
|
||||||
|
signalChange.emit(propertyValue);
|
||||||
|
}
|
||||||
|
protected static void onCallbackColorChangeGreen(ColorChooser self, float _newColor){
|
||||||
|
propertyValue.getDirect().setG(_newColor);
|
||||||
|
if (this.widgetColorBar != null) {
|
||||||
|
this.widgetColorBar.propertyValue.set(propertyValue);
|
||||||
|
}
|
||||||
|
signalChange.emit(propertyValue);
|
||||||
|
}
|
||||||
|
protected static void onCallbackColorChangeBlue(ColorChooser self, float _newColor){
|
||||||
|
propertyValue.getDirect().setB(_newColor);
|
||||||
|
if (this.widgetColorBar != null) {
|
||||||
|
this.widgetColorBar.propertyValue.set(propertyValue);
|
||||||
|
}
|
||||||
|
signalChange.emit(propertyValue);
|
||||||
|
}
|
||||||
|
protected static void onCallbackColorChangeAlpha(ColorChooser self, float _newColor){
|
||||||
|
propertyValue.getDirect().setA(_newColor);
|
||||||
|
if (this.widgetColorBar != null) {
|
||||||
|
this.widgetColorBar.propertyValue.set(propertyValue);
|
||||||
|
}
|
||||||
|
signalChange.emit(propertyValue);
|
||||||
|
}
|
||||||
|
protected static void onCallbackColorChange(ColorChooser self, etk::Color<> _newColor){
|
||||||
|
// == > colorBar has change ...
|
||||||
|
int tmpAlpha = propertyValue.a();
|
||||||
|
propertyValue.getDirect() = _newColor;
|
||||||
|
propertyValue.getDirect().setA(tmpAlpha);
|
||||||
|
if (this.widgetRed != null) {
|
||||||
|
this.widgetRed.propertyValue.set(propertyValue.r());
|
||||||
|
}
|
||||||
|
if (this.widgetGreen != null) {
|
||||||
|
this.widgetGreen.propertyValue.set(propertyValue.g());
|
||||||
|
}
|
||||||
|
if (this.widgetBlue != null) {
|
||||||
|
this.widgetBlue.propertyValue.set(propertyValue.b());
|
||||||
|
}
|
||||||
|
if (this.widgetAlpha != null) {
|
||||||
|
this.widgetAlpha.propertyValue.set(propertyValue.a());
|
||||||
|
}
|
||||||
|
signalChange.emit(propertyValue);
|
||||||
|
}
|
||||||
|
protected void onChangePropertyValue(){
|
||||||
|
if (this.widgetRed != null) {
|
||||||
|
this.widgetRed.propertyValue.set(propertyValue.r());
|
||||||
|
}
|
||||||
|
if (this.widgetGreen != null) {
|
||||||
|
this.widgetGreen.propertyValue.set(propertyValue.g());
|
||||||
|
}
|
||||||
|
if (this.widgetBlue != null) {
|
||||||
|
this.widgetBlue.propertyValue.set(propertyValue.b());
|
||||||
|
}
|
||||||
|
if (this.widgetAlpha != null) {
|
||||||
|
this.widgetAlpha.propertyValue.set(propertyValue.a());
|
||||||
|
}
|
||||||
|
if (this.widgetColorBar != null) {
|
||||||
|
this.widgetColorBar.propertyValue.set(propertyValue);
|
||||||
|
}
|
||||||
|
}
|
@ -1,152 +0,0 @@
|
|||||||
/** @file
|
|
||||||
* @author Edouard DUPIN
|
|
||||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
|
||||||
* @license MPL v2.0 (see license file)
|
|
||||||
*/
|
|
||||||
#include <etk/types.hpp>
|
|
||||||
#include <ewol/debug.hpp>
|
|
||||||
#include <ewol/widget/meta/SpinBase.hpp>
|
|
||||||
#include <ewol/widget/Label.hpp>
|
|
||||||
#include <ewol/widget/Composer.hpp>
|
|
||||||
|
|
||||||
#include <etk/typeInfo.hpp>
|
|
||||||
ETK_DECLARE_TYPE(ewol::widget::SpinBase);
|
|
||||||
ETK_DECLARE_TYPE(enum ewol::widget::spinPosition);
|
|
||||||
|
|
||||||
ewol::widget::SpinBase::SpinBase() :
|
|
||||||
propertyShape(this, "shape",
|
|
||||||
"",
|
|
||||||
"shape for the display",
|
|
||||||
ewol::widget::SpinBase::onChangePropertyShape),
|
|
||||||
propertySpinMode(this, "spin-mode",
|
|
||||||
ewol::widget::spinPosition_RightRight,
|
|
||||||
"The display spin mode",
|
|
||||||
ewol::widget::SpinBase::onChangePropertySpinMode),
|
|
||||||
this.confIdEntryShaper(-1),
|
|
||||||
this.confIdUpShaper(-1),
|
|
||||||
this.confIdDownShaper(-1),
|
|
||||||
this.confIdUpData(-1),
|
|
||||||
this.confIdDownData(-1) {
|
|
||||||
|
|
||||||
addObjectType("ewol::widget::SpinBase");
|
|
||||||
propertySpinMode.add(ewol::widget::spinPosition_noneNone, "none-none");
|
|
||||||
propertySpinMode.add(ewol::widget::spinPosition_noneRight, "none-right");
|
|
||||||
propertySpinMode.add(ewol::widget::spinPosition_leftNone, "left-none");
|
|
||||||
propertySpinMode.add(ewol::widget::spinPosition_leftRight, "left-right");
|
|
||||||
propertySpinMode.add(ewol::widget::spinPosition_leftLeft, "left-left");
|
|
||||||
propertySpinMode.add(ewol::widget::spinPosition_RightRight, "right-right");
|
|
||||||
propertyLockExpand.setDirectCheck(Vector2b(true,true));
|
|
||||||
propertyGravity.setDirectCheck(gravity_center);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::SpinBase::init() {
|
|
||||||
ewol::widget::Sizer::init();
|
|
||||||
propertyShape.notifyChange();
|
|
||||||
updateGui();
|
|
||||||
}
|
|
||||||
|
|
||||||
ewol::widget::SpinBase::~SpinBase() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::SpinBase::onChangePropertySpinMode() {
|
|
||||||
updateGui();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::SpinBase::onChangePropertyShape() {
|
|
||||||
this.config = ewol::resource::ConfigFile::create(propertyShape);
|
|
||||||
if (this.config != null) {
|
|
||||||
this.confIdEntryShaper = this.config.request("entry-shaper");
|
|
||||||
this.confIdUpShaper = this.config.request("up-shaper");
|
|
||||||
this.confIdDownShaper = this.config.request("down-shaper");
|
|
||||||
this.confIdUpData = this.config.request("up-data");
|
|
||||||
this.confIdDownData = this.config.request("down-data");
|
|
||||||
}
|
|
||||||
markToRedraw();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ewol::widget::SpinBase::updateGui() {
|
|
||||||
subWidgetRemoveAll();
|
|
||||||
markToRedraw();
|
|
||||||
requestUpdateSize();
|
|
||||||
if (this.widgetEntry == null) {
|
|
||||||
String shaper;
|
|
||||||
if (this.config != null) {
|
|
||||||
shaper = this.config.getString(this.confIdEntryShaper);
|
|
||||||
Log.verbose("shaper entry : " + shaper);
|
|
||||||
}
|
|
||||||
this.widgetEntry = ewol::widget::Entry::create("shape", shaper);
|
|
||||||
if (this.widgetEntry != null) {
|
|
||||||
this.widgetEntry.propertyExpand.set(Vector2b(true,false));
|
|
||||||
this.widgetEntry.propertyFill.set(Vector2b(true,true));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (this.widgetButtonDown == null) {
|
|
||||||
String shaper;
|
|
||||||
if (this.config != null) {
|
|
||||||
shaper = this.config.getString(this.confIdDownShaper);
|
|
||||||
Log.verbose("shaper button DOWN : " + shaper);
|
|
||||||
}
|
|
||||||
this.widgetButtonDown = ewol::widget::Button::create("shape", shaper);
|
|
||||||
if (this.widgetButtonDown != null) {
|
|
||||||
this.widgetButtonDown.propertyExpand.set(Vector2b(false,false));
|
|
||||||
this.widgetButtonDown.propertyFill.set(Vector2b(true,true));
|
|
||||||
String data = this.config.getString(this.confIdDownData);
|
|
||||||
Widget widget = ewol::widget::composerGenerateString(data);
|
|
||||||
this.widgetButtonDown.setSubWidget(widget);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (this.widgetButtonUp == null) {
|
|
||||||
String shaper;
|
|
||||||
if (this.config != null) {
|
|
||||||
shaper = this.config.getString(this.confIdUpShaper);
|
|
||||||
Log.verbose("shaper button UP : " + shaper);
|
|
||||||
}
|
|
||||||
this.widgetButtonUp = ewol::widget::Button::create("shape", shaper);
|
|
||||||
if (this.widgetButtonUp != null) {
|
|
||||||
this.widgetButtonUp.propertyExpand.set(Vector2b(false,false));
|
|
||||||
this.widgetButtonUp.propertyFill.set(Vector2b(true,true));
|
|
||||||
String data = this.config.getString(this.confIdUpData);
|
|
||||||
Widget widget = ewol::widget::composerGenerateString(data);
|
|
||||||
this.widgetButtonUp.setSubWidget(widget);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch (propertySpinMode) {
|
|
||||||
case ewol::widget::spinPosition_noneNone:
|
|
||||||
subWidgetAdd(this.widgetEntry);
|
|
||||||
break;
|
|
||||||
case ewol::widget::spinPosition_noneRight:
|
|
||||||
subWidgetAdd(this.widgetEntry);
|
|
||||||
subWidgetAdd(this.widgetButtonUp);
|
|
||||||
break;
|
|
||||||
case ewol::widget::spinPosition_leftNone:
|
|
||||||
subWidgetAdd(this.widgetButtonDown);
|
|
||||||
subWidgetAdd(this.widgetEntry);
|
|
||||||
break;
|
|
||||||
case ewol::widget::spinPosition_leftRight:
|
|
||||||
subWidgetAdd(this.widgetButtonDown);
|
|
||||||
subWidgetAdd(this.widgetEntry);
|
|
||||||
subWidgetAdd(this.widgetButtonUp);
|
|
||||||
break;
|
|
||||||
case ewol::widget::spinPosition_leftLeft:
|
|
||||||
subWidgetAdd(this.widgetButtonDown);
|
|
||||||
subWidgetAdd(this.widgetButtonUp);
|
|
||||||
subWidgetAdd(this.widgetEntry);
|
|
||||||
break;
|
|
||||||
case ewol::widget::spinPosition_RightRight:
|
|
||||||
subWidgetAdd(this.widgetEntry);
|
|
||||||
subWidgetAdd(this.widgetButtonDown);
|
|
||||||
subWidgetAdd(this.widgetButtonUp);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean ewol::widget::SpinBase::loadXML( exml::Element _node) {
|
|
||||||
if (_node.exist() == false) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// parse generic properties: (we not parse the sizer property, it remove all subwidget)
|
|
||||||
return Widget::loadXML(_node);
|
|
||||||
}
|
|
@ -1,102 +0,0 @@
|
|||||||
/** @file
|
|
||||||
* @author Edouard DUPIN
|
|
||||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
|
||||||
* @license MPL v2.0 (see license file)
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <etk/types.hpp>
|
|
||||||
#include <ewol/debug.hpp>
|
|
||||||
#include <ewol/widget/ContainerN.hpp>
|
|
||||||
#include <ewol/widget/Manager.hpp>
|
|
||||||
#include <etk/Color.hpp>
|
|
||||||
#include <ewol/compositing/Drawing.hpp>
|
|
||||||
#include <ewol/widget/Entry.hpp>
|
|
||||||
#include <ewol/widget/Button.hpp>
|
|
||||||
#include <ewol/widget/Sizer.hpp>
|
|
||||||
|
|
||||||
namespace ewol {
|
|
||||||
namespace widget {
|
|
||||||
enum spinPosition {
|
|
||||||
/** show like:
|
|
||||||
* *------------------------*
|
|
||||||
* | |
|
|
||||||
* *------------------------*
|
|
||||||
*/
|
|
||||||
spinPosition_noneNone,
|
|
||||||
/** show like:
|
|
||||||
* *--------------------*---*
|
|
||||||
* | | |
|
|
||||||
* *--------------------*---*
|
|
||||||
*/
|
|
||||||
spinPosition_noneRight,
|
|
||||||
/** show like:
|
|
||||||
* *---*--------------------*
|
|
||||||
* | | |
|
|
||||||
* *---*--------------------*
|
|
||||||
*/
|
|
||||||
spinPosition_leftNone,
|
|
||||||
/** show like:
|
|
||||||
* *---*----------------*---*
|
|
||||||
* | | | |
|
|
||||||
* *---*----------------*---*
|
|
||||||
*/
|
|
||||||
spinPosition_leftRight,
|
|
||||||
/** show like:
|
|
||||||
* *---*---*----------------*
|
|
||||||
* | | | |
|
|
||||||
* *---*---*----------------*
|
|
||||||
*/
|
|
||||||
spinPosition_leftLeft,
|
|
||||||
/** show like:
|
|
||||||
* *----------------*---*---*
|
|
||||||
* | | | |
|
|
||||||
* *----------------*---*---*
|
|
||||||
*/
|
|
||||||
spinPosition_RightRight
|
|
||||||
};
|
|
||||||
class SpinBase;
|
|
||||||
using SpinBase = ememory::Ptr<ewol::widget::SpinBase>;
|
|
||||||
using SpinBaseWeak = ememory::WeakPtr<ewol::widget::SpinBase>;
|
|
||||||
/**
|
|
||||||
* @ingroup ewolWidgetGroup
|
|
||||||
*/
|
|
||||||
class SpinBase : public ewol::widget::Sizer {
|
|
||||||
public: // properties list:
|
|
||||||
eproperty::Value<etk::Uri> propertyShape; //!< Shape of the widget
|
|
||||||
eproperty::List<enum ewol::widget::spinPosition> propertySpinMode; //!< How to display the spin base
|
|
||||||
public:
|
|
||||||
UN_DECLARE_FACTORY(SpinBase);
|
|
||||||
protected:
|
|
||||||
ememory::Ptr<ewol::resource::ConfigFile> this.config;
|
|
||||||
int this.confIdEntryShaper;
|
|
||||||
int this.confIdUpShaper;
|
|
||||||
int this.confIdDownShaper;
|
|
||||||
int this.confIdUpData;
|
|
||||||
int this.confIdDownData;
|
|
||||||
protected:
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
* @param _mode The mode to display the elements
|
|
||||||
*/
|
|
||||||
SpinBase();
|
|
||||||
void init() ;
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* Destructor
|
|
||||||
*/
|
|
||||||
~SpinBase();
|
|
||||||
protected:
|
|
||||||
ewol::widget::Entry this.widgetEntry;
|
|
||||||
ewol::widget::Button this.widgetButtonDown;
|
|
||||||
ewol::widget::Button this.widgetButtonUp;
|
|
||||||
void updateGui();
|
|
||||||
public:
|
|
||||||
boolean loadXML( exml::Element _node) ;
|
|
||||||
protected:
|
|
||||||
void onChangePropertySpinMode();
|
|
||||||
void onChangePropertyShape();
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,20 +1,5 @@
|
|||||||
/** @file
|
|
||||||
* @author Edouard DUPIN
|
|
||||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
|
||||||
* @license MPL v2.0 (see license file)
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <ewol/widget/PopUp.hpp>
|
/**
|
||||||
#include <ewol/widget/Label.hpp>
|
|
||||||
#include <ewol/widget/Button.hpp>
|
|
||||||
#include <ewol/widget/Sizer.hpp>
|
|
||||||
namespace ewol {
|
|
||||||
namespace widget {
|
|
||||||
class StdPopUp;
|
|
||||||
using StdPopUp = ememory::Ptr<ewol::widget::StdPopUp>;
|
|
||||||
using StdPopUpWeak = ememory::WeakPtr<ewol::widget::StdPopUp>;
|
|
||||||
/**
|
|
||||||
* The std pop up widget is a siple message widget to notify user of some simple things, like:
|
* The std pop up widget is a siple message widget to notify user of some simple things, like:
|
||||||
*
|
*
|
||||||
* [pre]
|
* [pre]
|
||||||
@ -38,22 +23,15 @@ namespace ewol {
|
|||||||
* +---------------------------------------------+
|
* +---------------------------------------------+
|
||||||
* [/pre]
|
* [/pre]
|
||||||
*/
|
*/
|
||||||
class StdPopUp : public ewol::widget::PopUp {
|
class StdPopUp : public ewol::widget::PopUp {
|
||||||
public: // properties:
|
public: // properties:
|
||||||
eproperty::Value<String> propertyTitle; //!< Title of the pop-up
|
String propertyTitle; //!< Title of the pop-up
|
||||||
eproperty::Value<String> propertyComment; //!< comment in the pop-up (can be decorated text)
|
String propertyComment; //!< comment in the pop-up (can be decorated text)
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
* std-pop-up ructor.
|
* std-pop-up ructor.
|
||||||
*/
|
*/
|
||||||
StdPopUp();
|
StdPopUp();
|
||||||
void init();
|
|
||||||
public:
|
|
||||||
DECLARE_WIDGET_FACTORY(StdPopUp, "StdPopUp");
|
|
||||||
/**
|
|
||||||
* std-pop-up destructor.
|
|
||||||
*/
|
|
||||||
~StdPopUp();
|
|
||||||
protected:
|
protected:
|
||||||
ewol::widget::Label this.title; //!< Title Label widget
|
ewol::widget::Label this.title; //!< Title Label widget
|
||||||
/**
|
/**
|
||||||
@ -66,16 +44,14 @@ namespace ewol {
|
|||||||
*/
|
*/
|
||||||
void onChangePropertyComment();
|
void onChangePropertyComment();
|
||||||
protected:
|
protected:
|
||||||
ewol::widget::Sizer this.subBar; //!< subwidget bar containing all the button.
|
ewol::widget::Sizer subBar; //!< subwidget bar containing all the button.
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* Add a buttom button.
|
* Add a buttom button.
|
||||||
* @param _text Decorated text to diplay in button.
|
* @param _text Decorated text to diplay in button.
|
||||||
*/
|
*/
|
||||||
ewol::widget::Button addButton( String _text, boolean _autoExit=false);
|
Button addButton( String _text, boolean _autoExit=false);
|
||||||
public:
|
public:
|
||||||
void onCallBackButtonExit();
|
void onCallBackButtonExit();
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
<PopUp>
|
<PopUp>
|
||||||
<Sizer mode="VERTICAL" lock="true" fill="true" expand="true">
|
<Sizer mode="VERTICAL" lock="true" fill="true" expand="true">
|
||||||
<Label name="[{ID}]file-shooser:title-label">_T{Title}</Label>
|
<Label name="[{ID}]file-chooser:title-label">_T{Title}</Label>
|
||||||
<Sizer mode="HORIZONTAL">
|
<Sizer mode="HORIZONTAL">
|
||||||
<Image name="[{ID}]file-shooser:img-folder" src="THEME:Folder.svg?lib=ewol" expand="false" size="45,45px"/>
|
<Image name="[{ID}]file-chooser: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"/>
|
<Entry name="[{ID}]file-chooser: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"/>
|
<Image name="[{ID}]file-chooser:img-home" src="THEME:Home.svg?lib=ewol" expand="false" size="45,45px"/>
|
||||||
</Sizer>
|
</Sizer>
|
||||||
<Sizer mode="HORIZONTAL">
|
<Sizer mode="HORIZONTAL">
|
||||||
<Image name="[{ID}]file-shooser:img-file" src="THEME:File.svg?lib=ewol" expand="false" size="45,45px"/>
|
<Image name="[{ID}]file-chooser: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"/>
|
<Entry name="[{ID}]file-chooser:entry-file" expand="true,false" fill="true,false"/>
|
||||||
</Sizer>
|
</Sizer>
|
||||||
<Sizer mode="HORIZONTAL">
|
<Sizer mode="HORIZONTAL">
|
||||||
<Spacer min-size="2,2mm"/>
|
<Spacer min-size="2,2mm"/>
|
||||||
<ListFileSystem name="[{ID}]file-shooser:list-folder"
|
<ListFileSystem name="[{ID}]file-chooser:list-folder"
|
||||||
min-size="20,0%"
|
min-size="20,0%"
|
||||||
expand="false,true"
|
expand="false,true"
|
||||||
fill="true"
|
fill="true"
|
||||||
@ -20,7 +20,7 @@
|
|||||||
show-file="false"
|
show-file="false"
|
||||||
show-folder="true"/>
|
show-folder="true"/>
|
||||||
<Spacer min-size="2,2mm"/>
|
<Spacer min-size="2,2mm"/>
|
||||||
<ListFileSystem name="[{ID}]file-shooser:list-files"
|
<ListFileSystem name="[{ID}]file-chooser:list-files"
|
||||||
expand="true,true"
|
expand="true,true"
|
||||||
fill="true"
|
fill="true"
|
||||||
show-hidden="false"
|
show-hidden="false"
|
||||||
@ -29,18 +29,18 @@
|
|||||||
<Spacer min-size="2,2mm"/>
|
<Spacer min-size="2,2mm"/>
|
||||||
</Sizer>
|
</Sizer>
|
||||||
<Sizer mode="HORIZONTAL">
|
<Sizer mode="HORIZONTAL">
|
||||||
<CheckBox name="[{ID}]file-shooser:show-hiden-file">_T{ShowHiddenFiles}</CheckBox>
|
<CheckBox name="[{ID}]file-chooser:show-hiden-file">_T{ShowHiddenFiles}</CheckBox>
|
||||||
<Spacer expand="true,false"/>
|
<Spacer expand="true,false"/>
|
||||||
<Button name="[{ID}]file-shooser:button-validate">
|
<Button name="[{ID}]file-chooser:button-validate">
|
||||||
<Sizer mode="HORIZONTAL">
|
<Sizer mode="HORIZONTAL">
|
||||||
<Image src="THEME:Load.svg?lib=ewol" fill="true" size="45,45px"/>
|
<Image src="THEME:Load.svg?lib=ewol" fill="true" size="45,45px"/>
|
||||||
<Label name="[{ID}]file-shooser:validate-label">_T{Validate}</Label>
|
<Label name="[{ID}]file-chooser:validate-label">_T{Validate}</Label>
|
||||||
</Sizer >
|
</Sizer >
|
||||||
</Button >
|
</Button >
|
||||||
<Button name="[{ID}]file-shooser:button-cancel">
|
<Button name="[{ID}]file-chooser:button-cancel">
|
||||||
<Sizer mode="HORIZONTAL">
|
<Sizer mode="HORIZONTAL">
|
||||||
<Image src="THEME:Remove.svg?lib=ewol" fill="true" size="45,45px"/>
|
<Image src="THEME:Remove.svg?lib=ewol" fill="true" size="45,45px"/>
|
||||||
<Label name="[{ID}]file-shooser:cancel-label">_T{Cancel}</Label>
|
<Label name="[{ID}]file-chooser:cancel-label">_T{Cancel}</Label>
|
||||||
</Sizer>
|
</Sizer>
|
||||||
</Button >
|
</Button >
|
||||||
</Sizer >
|
</Sizer >
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
entry-shaper:"THEME_GUI:///SpinEntry.json?lib=ewol",
|
"entry-shaper":"THEME:shape/SpinEntry.json?lib=ewol",
|
||||||
up-shaper:"THEME_GUI:///SpinUp.json?lib=ewol",
|
"up-shaper":"THEME:shape/SpinUp.json?lib=ewol",
|
||||||
up-data:"<label>+</label>",
|
"up-data":"<Label>+</Label>",
|
||||||
down-shaper:"THEME_GUI:///SpinDown.json?lib=ewol",
|
"down-shaper":"THEME:shape/SpinDown.json?lib=ewol",
|
||||||
down-data:"<label>-</label>",
|
"down-data":"<Label>-</Label>",
|
||||||
}
|
}
|
@ -1,23 +1,20 @@
|
|||||||
{
|
{
|
||||||
mode:2,
|
"padding-out-left":,
|
||||||
display-outside:false,
|
"padding-out-right":0,
|
||||||
|
"padding-out-top":2,
|
||||||
|
"padding-out-buttom":2,
|
||||||
|
|
||||||
padding-out-left:0,
|
"padding-in-left":2,
|
||||||
padding-out-right:0,
|
"padding-in-right":0,
|
||||||
padding-out-top:1,
|
"padding-in-top":2,
|
||||||
padding-out-buttom:1,
|
"padding-in-buttom":2,
|
||||||
|
|
||||||
border-left:1,
|
"program-vert":"THEME:shape/aaRenderShape.vert?lib=ewol",
|
||||||
border-right:0,
|
"program-frag":"THEME:shape/aaRenderShape.frag?lib=ewol",
|
||||||
border-top:1,
|
|
||||||
border-buttom:1,
|
|
||||||
|
|
||||||
padding-in-left:1,
|
"object-file":"THEME:shape/Button.emf?lib=ewol",
|
||||||
padding-in-right:1,
|
|
||||||
padding-in-top:1,
|
|
||||||
padding-in-buttom:1,
|
|
||||||
|
|
||||||
change-time:356,
|
"palette":"THEME:shape/palette_gui.json?lib=ewol",
|
||||||
program:"THEME_GUI:///Button.prog?lib=ewol",
|
|
||||||
color:"THEME_COLOR:///Button.json?lib=ewol"
|
"change-time":200
|
||||||
}
|
}
|
@ -1,23 +1,20 @@
|
|||||||
{
|
{
|
||||||
mode:2,
|
"padding-out-left":0,
|
||||||
display-outside:false,
|
"padding-out-right":0,
|
||||||
|
"padding-out-top":2,
|
||||||
|
"padding-out-buttom":2,
|
||||||
|
|
||||||
padding-out-left:0,
|
"padding-in-left":2,
|
||||||
padding-out-right:0,
|
"padding-in-right":0,
|
||||||
padding-out-top:1,
|
"padding-in-top":2,
|
||||||
padding-out-buttom:1,
|
"padding-in-buttom":2,
|
||||||
|
|
||||||
border-left:1,
|
"program-vert":"THEME:shape/aaRenderShape.vert?lib=ewol",
|
||||||
border-right:0,
|
"program-frag":"THEME:shape/aaRenderShape.frag?lib=ewol",
|
||||||
border-top:1,
|
|
||||||
border-buttom:1,
|
|
||||||
|
|
||||||
padding-in-left:2,
|
"object-file":"THEME:shape/Entry.emf?lib=ewol",
|
||||||
padding-in-right:2,
|
|
||||||
padding-in-top:1,
|
|
||||||
padding-in-buttom:1,
|
|
||||||
|
|
||||||
change-time:356,
|
"palette":"THEME:shape/palette_gui.json?lib=ewol",
|
||||||
program:"THEME_GUI:///Entry.prog?lib=ewol",
|
|
||||||
color:"THEME_COLOR:///Entry.json?lib=ewol"
|
"change-time":200
|
||||||
}
|
}
|
||||||
|
@ -1,23 +1,20 @@
|
|||||||
{
|
{
|
||||||
mode:2,
|
"padding-out-left":0,
|
||||||
display-outside:false,
|
"padding-out-right":0,
|
||||||
|
"padding-out-top":2,
|
||||||
|
"padding-out-buttom":2,
|
||||||
|
|
||||||
padding-out-left:0,
|
"padding-in-left":2,
|
||||||
padding-out-right:0,
|
"padding-in-right":2,
|
||||||
padding-out-top:1,
|
"padding-in-top":2,
|
||||||
padding-out-buttom:1,
|
"padding-in-buttom":2,
|
||||||
|
|
||||||
border-left:1,
|
"program-vert":"THEME:shape/aaRenderShape.vert?lib=ewol",
|
||||||
border-right:1,
|
"program-frag":"THEME:shape/aaRenderShape.frag?lib=ewol",
|
||||||
border-top:1,
|
|
||||||
border-buttom:1,
|
|
||||||
|
|
||||||
padding-in-left:1,
|
"object-file":"THEME:shape/Button.emf?lib=ewol",
|
||||||
padding-in-right:1,
|
|
||||||
padding-in-top:1,
|
|
||||||
padding-in-buttom:1,
|
|
||||||
|
|
||||||
change-time:356,
|
"palette":"THEME:shape/palette_gui.json?lib=ewol",
|
||||||
program:"THEME_GUI:///Button.prog?lib=ewol",
|
|
||||||
color:"THEME_COLOR:///Button.json?lib=ewol"
|
"change-time":200
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,7 @@ public class MainWindows extends BasicWindows {
|
|||||||
public MainWindows() {
|
public MainWindows() {
|
||||||
setPropertyTitle("Simple Button test");
|
setPropertyTitle("Simple Button test");
|
||||||
//final Widget data = Composer.composerGenerateString("<Composer><Label>hello, how are you</Label></Composer>");
|
//final Widget data = Composer.composerGenerateString("<Composer><Label>hello, how are you</Label></Composer>");
|
||||||
final Widget data = Composer.composerGenerateString("<FileChooser/>");
|
final Widget data = Composer.composerGenerateString("<Spin/>");
|
||||||
/*
|
/*
|
||||||
final Widget data = Composer.composerGenerateString("<Button toggle='true' fill='true,false,false' expand='true'>" + "<Label>hello, how are you</Label>"
|
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>");
|
+ "<Label>You <br/>Click - Me <b>!?<!--kjlkjlkjlkj-->d</b></Label>" + "</Button>");
|
||||||
|
@ -58,7 +58,7 @@ public class GuiShape extends Compositing {
|
|||||||
|
|
||||||
private ResourcePaletteFile palette;
|
private ResourcePaletteFile palette;
|
||||||
private ResourceTexture2 texture;
|
private ResourceTexture2 texture;
|
||||||
private ResourceMesh[] mesh = new ResourceMesh[2];
|
private final ResourceMesh[] mesh = new ResourceMesh[2];
|
||||||
private Padding sizeObject = Padding.ZERO;
|
private Padding sizeObject = Padding.ZERO;
|
||||||
private int stateActivate = -1; //!< Activate state of the element
|
private int stateActivate = -1; //!< Activate state of the element
|
||||||
private GuiShapeMode stateNew = GuiShapeMode.NORMAL; //!< destination state
|
private GuiShapeMode stateNew = GuiShapeMode.NORMAL; //!< destination state
|
||||||
@ -120,7 +120,7 @@ public class GuiShape extends Compositing {
|
|||||||
draw(null, disableDepthTest);
|
draw(null, disableDepthTest);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void draw(final boolean disableDepthTest, int idMesh) {
|
public void draw(final boolean disableDepthTest, final int idMesh) {
|
||||||
draw(null, disableDepthTest, idMesh);
|
draw(null, disableDepthTest, idMesh);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,7 +128,7 @@ public class GuiShape extends Compositing {
|
|||||||
this.draw(secondaryTexture, disableDepthTest, 0);
|
this.draw(secondaryTexture, disableDepthTest, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void draw(final ResourceTexture2 secondaryTexture, final boolean disableDepthTest, int idMesh) {
|
public void draw(final ResourceTexture2 secondaryTexture, final boolean disableDepthTest, final int idMesh) {
|
||||||
if (this.config == null) {
|
if (this.config == null) {
|
||||||
// this is a normal case ... the user can choice to have no config basic file ...
|
// this is a normal case ... the user can choice to have no config basic file ...
|
||||||
return;
|
return;
|
||||||
@ -149,19 +149,19 @@ public class GuiShape extends Compositing {
|
|||||||
}
|
}
|
||||||
OpenGL.enable(Flag.flag_depthTest);
|
OpenGL.enable(Flag.flag_depthTest);
|
||||||
// set Matrix : translation/positionMatrix
|
// set Matrix : translation/positionMatrix
|
||||||
Matrix4f projMatrix = OpenGL.getMatrix();
|
final Matrix4f projMatrix = OpenGL.getMatrix();
|
||||||
Matrix4f camMatrix = OpenGL.getCameraMatrix();
|
final Matrix4f camMatrix = OpenGL.getCameraMatrix();
|
||||||
Matrix4f tmpMatrix = this.matrixApply.multiply(this.transform);
|
final Matrix4f tmpMatrix = this.matrixApply.multiply(this.transform);
|
||||||
this.oGLprogram.use();
|
this.oGLprogram.use();
|
||||||
this.mesh[idMesh].bindForRendering();
|
this.mesh[idMesh].bindForRendering();
|
||||||
this.oGLprogram.uniformMatrix(this.oGLMatrixProjection, projMatrix);
|
this.oGLprogram.uniformMatrix(this.oGLMatrixProjection, projMatrix);
|
||||||
this.oGLprogram.uniformMatrix(this.oGLMatrixTransformation, tmpMatrix);
|
this.oGLprogram.uniformMatrix(this.oGLMatrixTransformation, tmpMatrix);
|
||||||
this.oGLprogram.uniformMatrix(this.oGLMatrixView, camMatrix);
|
this.oGLprogram.uniformMatrix(this.oGLMatrixView, camMatrix);
|
||||||
|
|
||||||
Set<String> layers = this.mesh[idMesh].getLayers();
|
final Set<String> layers = this.mesh[idMesh].getLayers();
|
||||||
Log.verbose("get layers:" + layers);
|
Log.verbose("get layers:" + layers);
|
||||||
// Texture:
|
// Texture:
|
||||||
float imageDelta = (float) 1 / ResourcePaletteFile.getHeight();
|
final float imageDelta = (float) 1 / ResourcePaletteFile.getHeight();
|
||||||
float basicValue = this.stateOld.getValue() / ResourcePaletteFile.getHeight();
|
float basicValue = this.stateOld.getValue() / ResourcePaletteFile.getHeight();
|
||||||
if (this.stateOld != this.stateNew) {
|
if (this.stateOld != this.stateNew) {
|
||||||
if (this.stateOld == GuiShapeMode.NORMAL) {
|
if (this.stateOld == GuiShapeMode.NORMAL) {
|
||||||
@ -314,8 +314,8 @@ public class GuiShape extends Compositing {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void loadPalette() {
|
protected void loadPalette() {
|
||||||
String paletteFile = this.config.getString(this.confIdPaletteFile);
|
final String paletteFile = this.config.getString(this.confIdPaletteFile);
|
||||||
Uri paletteFileInterface = Uri.valueOf(paletteFile);
|
final Uri paletteFileInterface = Uri.valueOf(paletteFile);
|
||||||
this.palette = ResourcePaletteFile.create(paletteFileInterface);
|
this.palette = ResourcePaletteFile.create(paletteFileInterface);
|
||||||
this.texture = ResourceTexture2.createNamed("TEXTURE_OF_PALETTE:" + paletteFile);
|
this.texture = ResourceTexture2.createNamed("TEXTURE_OF_PALETTE:" + paletteFile);
|
||||||
if (this.texture == null) {
|
if (this.texture == null) {
|
||||||
@ -344,8 +344,8 @@ public class GuiShape extends Compositing {
|
|||||||
Log.debug("no Shaper set for loading resources ...");
|
Log.debug("no Shaper set for loading resources ...");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
String basicShaderFileVert = this.config.getString(this.confProgramFileVert);
|
final String basicShaderFileVert = this.config.getString(this.confProgramFileVert);
|
||||||
String basicShaderFileFrag = this.config.getString(this.confProgramFileFrag);
|
final String basicShaderFileFrag = this.config.getString(this.confProgramFileFrag);
|
||||||
if (!basicShaderFileVert.isEmpty() && !basicShaderFileFrag.isEmpty()) {
|
if (!basicShaderFileVert.isEmpty() && !basicShaderFileFrag.isEmpty()) {
|
||||||
this.oGLprogram = ResourceProgram.create(Uri.valueOf(basicShaderFileVert), Uri.valueOf(basicShaderFileFrag));
|
this.oGLprogram = ResourceProgram.create(Uri.valueOf(basicShaderFileVert), Uri.valueOf(basicShaderFileFrag));
|
||||||
if (this.oGLprogram != null) {
|
if (this.oGLprogram != null) {
|
||||||
@ -367,10 +367,10 @@ public class GuiShape extends Compositing {
|
|||||||
Log.debug("no Shaper set for loading resources ...");
|
Log.debug("no Shaper set for loading resources ...");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
String objectFile = this.config.getString(this.confObjectFile);
|
final String objectFile = this.config.getString(this.confObjectFile);
|
||||||
if (!objectFile.isEmpty()) {
|
if (!objectFile.isEmpty()) {
|
||||||
this.mesh[0] = ResourceMesh.create(Uri.valueOf(objectFile));
|
this.mesh[0] = ResourceMesh.create(Uri.valueOf(objectFile));
|
||||||
List<Vector3f> verticesToModify = this.mesh[0].getGeneratedPosition();
|
final List<Vector3f> verticesToModify = this.mesh[0].getGeneratedPosition();
|
||||||
float top = 0;
|
float top = 0;
|
||||||
float bottom = 0;
|
float bottom = 0;
|
||||||
float left = 0;
|
float left = 0;
|
||||||
@ -392,10 +392,10 @@ public class GuiShape extends Compositing {
|
|||||||
}
|
}
|
||||||
this.sizeObject = new Padding(Math.abs(left), Math.abs(top), Math.abs(right), Math.abs(bottom));
|
this.sizeObject = new Padding(Math.abs(left), Math.abs(top), Math.abs(right), Math.abs(bottom));
|
||||||
}
|
}
|
||||||
String objectFile2 = this.config.getString(this.confObjectFile2);
|
final String objectFile2 = this.config.getString(this.confObjectFile2);
|
||||||
if (!objectFile2.isEmpty()) {
|
if (!objectFile2.isEmpty()) {
|
||||||
this.mesh[1] = ResourceMesh.create(Uri.valueOf(objectFile2));
|
this.mesh[1] = ResourceMesh.create(Uri.valueOf(objectFile2));
|
||||||
List<Vector3f> verticesToModify = this.mesh[1].getGeneratedPosition();
|
final List<Vector3f> verticesToModify = this.mesh[1].getGeneratedPosition();
|
||||||
float top = 0;
|
float top = 0;
|
||||||
float bottom = 0;
|
float bottom = 0;
|
||||||
float left = 0;
|
float left = 0;
|
||||||
@ -444,7 +444,7 @@ public class GuiShape extends Compositing {
|
|||||||
// check if no new state requested:
|
// check if no new state requested:
|
||||||
if (this.nextStatusRequested != GuiShapeMode.NONE && this.stateTransition < 0.5) {
|
if (this.nextStatusRequested != GuiShapeMode.NONE && this.stateTransition < 0.5) {
|
||||||
// invert sources with destination
|
// invert sources with destination
|
||||||
GuiShapeMode tmppp = this.stateOld;
|
final GuiShapeMode tmppp = this.stateOld;
|
||||||
this.stateOld = this.stateNew;
|
this.stateOld = this.stateNew;
|
||||||
this.stateNew = tmppp;
|
this.stateNew = tmppp;
|
||||||
this.stateTransition = 1.0f - this.stateTransition;
|
this.stateTransition = 1.0f - this.stateTransition;
|
||||||
@ -474,7 +474,7 @@ public class GuiShape extends Compositing {
|
|||||||
|
|
||||||
// @previous
|
// @previous
|
||||||
public void setShape(final Vector2f origin, final Vector2f size) {
|
public void setShape(final Vector2f origin, final Vector2f size) {
|
||||||
Padding tmp = getPadding();
|
final Padding tmp = getPadding();
|
||||||
setShape(origin, size, origin.add(tmp.left(), tmp.bottom()), size.less(tmp.x(), tmp.y()));
|
setShape(origin, size, origin.add(tmp.left(), tmp.bottom()), size.less(tmp.x(), tmp.y()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -522,7 +522,7 @@ public class GuiShape extends Compositing {
|
|||||||
*/
|
*/
|
||||||
public void setShape(final Vector2f origin, final Vector2f size, final Vector2f insidePos, final Vector2f insideSize) {
|
public void setShape(final Vector2f origin, final Vector2f size, final Vector2f insidePos, final Vector2f insideSize) {
|
||||||
//Log.error("Set shape property : origin=" + origin + " size=" + size + " in-pos=" + insidePos + " in-size=" + insideSize);
|
//Log.error("Set shape property : origin=" + origin + " size=" + size + " in-pos=" + insidePos + " in-size=" + insideSize);
|
||||||
Vector2f halfSize = insideSize.multiply(0.5f);
|
final Vector2f halfSize = insideSize.multiply(0.5f);
|
||||||
this.offsetScaleOutside = new Vector3f(halfSize.x(), halfSize.y(), 1.0f);
|
this.offsetScaleOutside = new Vector3f(halfSize.x(), halfSize.y(), 1.0f);
|
||||||
this.offsetScaleInside = new Vector3f(halfSize.x() + this.sizeObject.x() * 0.25f, halfSize.y() + this.sizeObject.y() * 0.25f, 1.0f);
|
this.offsetScaleInside = new Vector3f(halfSize.x() + this.sizeObject.x() * 0.25f, halfSize.y() + this.sizeObject.y() * 0.25f, 1.0f);
|
||||||
/*
|
/*
|
||||||
@ -549,12 +549,12 @@ public class GuiShape extends Compositing {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
public void setShape(final Vector3f origin, final Vector3f size) {
|
public void setShape(final Vector3f origin, final Vector3f size) {
|
||||||
Padding tmp = getPadding();
|
final Padding tmp = getPadding();
|
||||||
setShape(origin, size, origin.add(tmp.left(), tmp.bottom(), 0), size.less(tmp.x(), tmp.y(), 0));
|
setShape(origin, size, origin.add(tmp.left(), tmp.bottom(), 0), size.less(tmp.x(), tmp.y(), 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setShape(final Vector3f origin, final Vector3f size, final Vector3f insidePos, final Vector3f insideSize) {
|
public void setShape(final Vector3f origin, final Vector3f size, final Vector3f insidePos, final Vector3f insideSize) {
|
||||||
Vector3f halfSize = insideSize.multiply(0.5f);
|
final Vector3f halfSize = insideSize.multiply(0.5f);
|
||||||
this.offsetScaleOutside = halfSize;
|
this.offsetScaleOutside = halfSize;
|
||||||
this.offsetScaleInside = halfSize.add(this.sizeObject.x() * 0.25f, this.sizeObject.y() * 0.25f, 0);
|
this.offsetScaleInside = halfSize.add(this.sizeObject.x() * 0.25f, this.sizeObject.y() * 0.25f, 0);
|
||||||
/*
|
/*
|
||||||
@ -579,6 +579,9 @@ public class GuiShape extends Compositing {
|
|||||||
clear();
|
clear();
|
||||||
unLoadProgram();
|
unLoadProgram();
|
||||||
this.uri = uri;
|
this.uri = uri;
|
||||||
|
loadConfigFile();
|
||||||
|
loadUpdateObjectSize();
|
||||||
|
loadPalette();
|
||||||
loadProgram();
|
loadProgram();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,14 +32,13 @@ public class ResourceConfigFile extends Resource {
|
|||||||
* @param name Name of the configuration file.
|
* @param name Name of the configuration file.
|
||||||
* @return pointer on the resource or null if an error occurred.
|
* @return pointer on the resource or null if an error occurred.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("preview")
|
|
||||||
public static ResourceConfigFile create(final Uri name) {
|
public static ResourceConfigFile create(final Uri name) {
|
||||||
Resource resource2 = null;
|
Resource resource2 = null;
|
||||||
if (name != null && !name.isEmpty()) {
|
if (name != null && !name.isEmpty()) {
|
||||||
resource2 = Resource.getManager().localKeep(name);
|
resource2 = Resource.getManager().localKeep(name);
|
||||||
}
|
}
|
||||||
if (resource2 != null) {
|
if (resource2 != null) {
|
||||||
if (resource2 instanceof ResourceConfigFile tmpp) {
|
if (resource2 instanceof final ResourceConfigFile tmpp) {
|
||||||
resource2.keep();
|
resource2.keep();
|
||||||
return tmpp;
|
return tmpp;
|
||||||
}
|
}
|
||||||
@ -110,7 +109,7 @@ public class ResourceConfigFile extends Resource {
|
|||||||
@Override
|
@Override
|
||||||
public synchronized void reload() {
|
public synchronized void reload() {
|
||||||
// reset all parameters
|
// reset all parameters
|
||||||
for (ListElementConfig listElementConfig : this.list) {
|
for (final ListElementConfig listElementConfig : this.list) {
|
||||||
listElementConfig.node = null;
|
listElementConfig.node = null;
|
||||||
}
|
}
|
||||||
JsonObject out;
|
JsonObject out;
|
||||||
|
@ -335,6 +335,9 @@ public class Button extends ContainerToggle {
|
|||||||
this.signalClick.emit();
|
this.signalClick.emit();
|
||||||
if (this.propertyToggleMode) {
|
if (this.propertyToggleMode) {
|
||||||
this.setPropertyValue(!this.propertyValue);
|
this.setPropertyValue(!this.propertyValue);
|
||||||
|
} else {
|
||||||
|
this.setPropertyValue(!this.propertyValue);
|
||||||
|
this.setPropertyValue(!this.propertyValue);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -157,6 +157,11 @@ public class ContainerToggle extends Widget {
|
|||||||
onChangeSize();
|
onChangeSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@XmlManaged(value = false)
|
||||||
|
public void setSubWidget(final Widget newWidget) {
|
||||||
|
setSubWidget(newWidget, 0);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* set the subWidget node widget.
|
* set the subWidget node widget.
|
||||||
* @param newWidget The widget to add.
|
* @param newWidget The widget to add.
|
||||||
|
199
src/org/atriasoft/ewol/widget/Spin.java
Normal file
199
src/org/atriasoft/ewol/widget/Spin.java
Normal file
@ -0,0 +1,199 @@
|
|||||||
|
package org.atriasoft.ewol.widget;
|
||||||
|
|
||||||
|
import org.atriasoft.esignal.Connection;
|
||||||
|
import org.atriasoft.esignal.Signal;
|
||||||
|
import org.atriasoft.etk.Uri;
|
||||||
|
import org.atriasoft.etk.math.FMath;
|
||||||
|
import org.atriasoft.ewol.annotation.EwolDescription;
|
||||||
|
import org.atriasoft.ewol.annotation.EwolSignal;
|
||||||
|
import org.atriasoft.ewol.internal.Log;
|
||||||
|
import org.atriasoft.ewol.widget.meta.SpinBase;
|
||||||
|
import org.atriasoft.exml.annotation.XmlAttribute;
|
||||||
|
import org.atriasoft.exml.annotation.XmlManaged;
|
||||||
|
import org.atriasoft.exml.annotation.XmlName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* a composed Spin is a Spin with an inside composed with the specify XML element
|
||||||
|
* ==> this permit to generate standard element simple
|
||||||
|
*/
|
||||||
|
public class Spin extends SpinBase {
|
||||||
|
// Event list of properties
|
||||||
|
@EwolSignal(name = "value", description = "Spin updated value (depend of the mantis)")
|
||||||
|
public Signal<Long> signalValue = new Signal<>();
|
||||||
|
@EwolSignal(name = "valueDouble", description = "Spin value change value in 'double' (application of the mantis)")
|
||||||
|
public Signal<Double> signalValueDouble = new Signal<>();
|
||||||
|
protected long propertyValue = 0; //!< Current value of the Spin.
|
||||||
|
protected long propertyMin = Long.MIN_VALUE; //!< Minimum value
|
||||||
|
protected long propertyMax = Long.MAX_VALUE; //!< Maximum value
|
||||||
|
protected long propertyIncrement = 1; //!< Increment value
|
||||||
|
protected int propertyMantis = 0; //!< number of value under '.' value
|
||||||
|
// connection to the elements interface.
|
||||||
|
protected Connection connectionEntry = new Connection();
|
||||||
|
protected Connection connectionButtonUp = new Connection();
|
||||||
|
protected Connection connectionButtonDown = new Connection();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* @param _mode mode to display the spin
|
||||||
|
* @param _shaperName Shaper file properties
|
||||||
|
*/
|
||||||
|
public Spin() {
|
||||||
|
super(new Uri("THEME", "shape/Spin.json", "ewol"));
|
||||||
|
connectGui();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void checkValue(long value) {
|
||||||
|
value = FMath.clamp(this.propertyMin, value, this.propertyMax);
|
||||||
|
this.propertyValue = value;
|
||||||
|
// TODO: manage the mantis ...
|
||||||
|
this.widgetEntry.setPropertyValue(Long.toString(value));
|
||||||
|
this.signalValue.emit(this.propertyValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void connectGui() {
|
||||||
|
Log.warning("updateGui [START]");
|
||||||
|
super.updateGui();
|
||||||
|
|
||||||
|
if (this.widgetEntry != null && !this.connectionEntry.isConnected()) {
|
||||||
|
this.connectionEntry = this.widgetEntry.signalModify.connect(this, Spin::onCallbackModify);
|
||||||
|
// TODO: set a regExp Filter
|
||||||
|
}
|
||||||
|
if (this.widgetButtonUp != null && !this.connectionButtonUp.isConnected()) {
|
||||||
|
this.connectionButtonUp = this.widgetButtonUp.signalValue.connect(this, Spin::onCallbackUp);
|
||||||
|
}
|
||||||
|
if (this.widgetButtonDown != null && !this.connectionButtonDown.isConnected()) {
|
||||||
|
this.connectionButtonDown = this.widgetButtonDown.signalValue.connect(this, Spin::onCallbackDown);
|
||||||
|
}
|
||||||
|
checkValue(this.propertyValue);
|
||||||
|
Log.warning("updateGui [STOP]");
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlManaged
|
||||||
|
@XmlAttribute
|
||||||
|
@XmlName(value = "increment")
|
||||||
|
@EwolDescription(value = "Increment value at each button event or keybord event")
|
||||||
|
public long getPropertyIncrement() {
|
||||||
|
return this.propertyIncrement;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlManaged
|
||||||
|
@XmlAttribute
|
||||||
|
@XmlName(value = "mantis")
|
||||||
|
@EwolDescription(value = "fix-point mantis element (number of digit under the .)")
|
||||||
|
public int getPropertyMantis() {
|
||||||
|
return this.propertyMantis;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlManaged
|
||||||
|
@XmlAttribute
|
||||||
|
@XmlName(value = "max")
|
||||||
|
@EwolDescription(value = "Maximum value of the spin (depend on mantis)")
|
||||||
|
public long getPropertyMax() {
|
||||||
|
return this.propertyMax;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlManaged
|
||||||
|
@XmlAttribute
|
||||||
|
@XmlName(value = "min")
|
||||||
|
@EwolDescription(value = "Minimum value of the spin (depend on mantis)")
|
||||||
|
public long getPropertyMin() {
|
||||||
|
return this.propertyMin;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlManaged
|
||||||
|
@XmlAttribute
|
||||||
|
@XmlName(value = "value")
|
||||||
|
@EwolDescription(value = "Value of the Spin")
|
||||||
|
public long getPropertyValue() {
|
||||||
|
return this.propertyValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onCallbackDown(final Boolean value) {
|
||||||
|
if (value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final long data = this.propertyValue - this.propertyIncrement;
|
||||||
|
checkValue(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onCallbackModify(final String value) {
|
||||||
|
if (value.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final long value1 = Long.valueOf(value);
|
||||||
|
checkValue(value1);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onCallbackUp(final Boolean value) {
|
||||||
|
if (value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final long data = this.propertyValue + this.propertyIncrement;
|
||||||
|
checkValue(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onChangePropertyIncrement() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onChangePropertyMantis() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onChangePropertyMax() {
|
||||||
|
checkValue(this.propertyValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onChangePropertyMin() {
|
||||||
|
checkValue(this.propertyValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onChangePropertyValue() {
|
||||||
|
markToRedraw();
|
||||||
|
if (this.widgetEntry == null) {
|
||||||
|
Log.error("Can not acces at entry ...");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
checkValue(this.propertyValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPropertyIncrement(final long propertyIncrement) {
|
||||||
|
if (this.propertyIncrement == propertyIncrement) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.propertyIncrement = propertyIncrement;
|
||||||
|
onChangePropertyIncrement();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPropertyMantis(final int propertyMantis) {
|
||||||
|
if (this.propertyMantis == propertyMantis) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.propertyMantis = propertyMantis;
|
||||||
|
onChangePropertyMantis();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPropertyMax(final long propertyMax) {
|
||||||
|
if (this.propertyMax == propertyMax) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.propertyMax = propertyMax;
|
||||||
|
onChangePropertyMax();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPropertyMin(final long propertyMin) {
|
||||||
|
if (this.propertyMin == propertyMin) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.propertyMin = propertyMin;
|
||||||
|
onChangePropertyMin();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPropertyValue(final long propertyValue) {
|
||||||
|
if (this.propertyValue == propertyValue) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.propertyValue = propertyValue;
|
||||||
|
onChangePropertyValue();
|
||||||
|
}
|
||||||
|
}
|
@ -20,6 +20,7 @@ public class WidgetXmlFactory implements InterfaceXmlFactoryAccess {
|
|||||||
listWidgetAvaillable.put("ListFileSystem", ListFileSystem.class);
|
listWidgetAvaillable.put("ListFileSystem", ListFileSystem.class);
|
||||||
listWidgetAvaillable.put("PopUp", PopUp.class);
|
listWidgetAvaillable.put("PopUp", PopUp.class);
|
||||||
listWidgetAvaillable.put("FileChooser", FileChooser.class);
|
listWidgetAvaillable.put("FileChooser", FileChooser.class);
|
||||||
|
listWidgetAvaillable.put("Spin", Spin.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -91,7 +91,7 @@ public class FileChooser extends Composer {
|
|||||||
// == > change the file name.get(.get(
|
// == > change the file name.get(.get(
|
||||||
self.propertyFile = value;
|
self.propertyFile = value;
|
||||||
// update the selected file in the list :
|
// update the selected file in the list :
|
||||||
if (self.getSubObjectNamed("[" + Long.toString(self.getId()) + "]file-shooser:list-files") instanceof final ListFileSystem tmp) {
|
if (self.getSubObjectNamed("[" + Long.toString(self.getId()) + "]file-chooser:list-files") instanceof final ListFileSystem tmp) {
|
||||||
tmp.setPropertyFile(new File(self.propertyFile));
|
tmp.setPropertyFile(new File(self.propertyFile));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -102,10 +102,10 @@ public class FileChooser extends Composer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected static void onCallbackHidenFileChangeChangeValue(final FileChooser self, final Boolean value) {
|
protected static void onCallbackHidenFileChangeChangeValue(final FileChooser self, final Boolean value) {
|
||||||
if (self.getSubObjectNamed("[" + Long.toString(self.getId()) + "]file-shooser:list-files") instanceof final ListFileSystem tmp) {
|
if (self.getSubObjectNamed("[" + Long.toString(self.getId()) + "]file-chooser:list-files") instanceof final ListFileSystem tmp) {
|
||||||
tmp.setPropertyShowHidden(value);
|
tmp.setPropertyShowHidden(value);
|
||||||
}
|
}
|
||||||
if (self.getSubObjectNamed("[" + Long.toString(self.getId()) + "]file-shooser:list-folder") instanceof final ListFileSystem tmp) {
|
if (self.getSubObjectNamed("[" + Long.toString(self.getId()) + "]file-chooser:list-folder") instanceof final ListFileSystem tmp) {
|
||||||
tmp.setPropertyShowHidden(value);
|
tmp.setPropertyShowHidden(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -182,30 +182,30 @@ public class FileChooser extends Composer {
|
|||||||
onChangePropertyLabelValidate();
|
onChangePropertyLabelValidate();
|
||||||
onChangePropertyLabelCancel();
|
onChangePropertyLabelCancel();
|
||||||
|
|
||||||
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:show-hiden-file") instanceof final CheckBox tmp) {
|
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-chooser:show-hiden-file") instanceof final CheckBox tmp) {
|
||||||
tmp.signalValue.connectAuto(this, FileChooser::onCallbackHidenFileChangeChangeValue);
|
tmp.signalValue.connectAuto(this, FileChooser::onCallbackHidenFileChangeChangeValue);
|
||||||
}
|
}
|
||||||
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:button-validate") instanceof final Button tmp) {
|
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-chooser:button-validate") instanceof final Button tmp) {
|
||||||
tmp.signalValue.connectAuto(this, FileChooser::onCallbackListValidate);
|
tmp.signalValue.connectAuto(this, FileChooser::onCallbackListValidate);
|
||||||
}
|
}
|
||||||
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:button-cancel") instanceof final Button tmp) {
|
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-chooser:button-cancel") instanceof final Button tmp) {
|
||||||
tmp.signalValue.connectAuto(this, FileChooser::onCallbackButtonCancelPressed);
|
tmp.signalValue.connectAuto(this, FileChooser::onCallbackButtonCancelPressed);
|
||||||
}
|
}
|
||||||
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:list-folder") instanceof final ListFileSystem tmp) {
|
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-chooser:list-folder") instanceof final ListFileSystem tmp) {
|
||||||
tmp.signalFolderValidate.connectAuto(this, FileChooser::onCallbackListFolderSelectChange);
|
tmp.signalFolderValidate.connectAuto(this, FileChooser::onCallbackListFolderSelectChange);
|
||||||
}
|
}
|
||||||
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:list-files") instanceof final ListFileSystem tmp) {
|
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-chooser:list-files") instanceof final ListFileSystem tmp) {
|
||||||
tmp.signalFileSelect.connectAuto(this, FileChooser::onCallbackListFileSelectChange);
|
tmp.signalFileSelect.connectAuto(this, FileChooser::onCallbackListFileSelectChange);
|
||||||
tmp.signalFileValidate.connectAuto(this, FileChooser::onCallbackListFileValidate);
|
tmp.signalFileValidate.connectAuto(this, FileChooser::onCallbackListFileValidate);
|
||||||
}
|
}
|
||||||
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:entry-file") instanceof final Entry tmp) {
|
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-chooser:entry-file") instanceof final Entry tmp) {
|
||||||
tmp.signalModify.connectAuto(this, FileChooser::onCallbackEntryFileChangeValue);
|
tmp.signalModify.connectAuto(this, FileChooser::onCallbackEntryFileChangeValue);
|
||||||
tmp.signalEnter.connectAuto(this, FileChooser::onCallbackEntryFileChangeValidate);
|
tmp.signalEnter.connectAuto(this, FileChooser::onCallbackEntryFileChangeValidate);
|
||||||
}
|
}
|
||||||
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:entry-folder") instanceof final Entry tmp) {
|
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-chooser:entry-folder") instanceof final Entry tmp) {
|
||||||
tmp.signalModify.connectAuto(this, FileChooser::onCallbackEntryFolderChangeValue);
|
tmp.signalModify.connectAuto(this, FileChooser::onCallbackEntryFolderChangeValue);
|
||||||
}
|
}
|
||||||
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:img-home") instanceof final ImageDisplay tmp) {
|
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-chooser:img-home") instanceof final ImageDisplay tmp) {
|
||||||
tmp.signalPressed.connectAuto(this, FileChooser::onCallbackHomePressed);
|
tmp.signalPressed.connectAuto(this, FileChooser::onCallbackHomePressed);
|
||||||
}
|
}
|
||||||
// set the default Folder properties:
|
// set the default Folder properties:
|
||||||
@ -235,25 +235,25 @@ public class FileChooser extends Composer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void onChangePropertyFile() {
|
protected void onChangePropertyFile() {
|
||||||
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:entry-file") instanceof final ListFileSystem tmp) {
|
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-chooser:entry-file") instanceof final ListFileSystem tmp) {
|
||||||
tmp.setPropertyFile(new File(this.propertyFile));
|
tmp.setPropertyFile(new File(this.propertyFile));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void onChangePropertyLabelCancel() {
|
protected void onChangePropertyLabelCancel() {
|
||||||
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:cancel-label") instanceof final Label tmp) {
|
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-chooser:cancel-label") instanceof final Label tmp) {
|
||||||
tmp.setPropertyValue(this.propertyLabelCancel);
|
tmp.setPropertyValue(this.propertyLabelCancel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void onChangePropertyLabelTitle() {
|
protected void onChangePropertyLabelTitle() {
|
||||||
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:title-label") instanceof final Label tmp) {
|
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-chooser:title-label") instanceof final Label tmp) {
|
||||||
tmp.setPropertyValue(this.propertyLabelTitle);
|
tmp.setPropertyValue(this.propertyLabelTitle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void onChangePropertyLabelValidate() {
|
protected void onChangePropertyLabelValidate() {
|
||||||
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:validate-label") instanceof final Label tmp) {
|
if (this.getSubObjectNamed("[" + Long.toString(getId()) + "]file-chooser:validate-label") instanceof final Label tmp) {
|
||||||
tmp.setPropertyValue(this.propertyLabelValidate);
|
tmp.setPropertyValue(this.propertyLabelValidate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -266,7 +266,7 @@ public class FileChooser extends Composer {
|
|||||||
@Override
|
@Override
|
||||||
public void onGetFocus() {
|
public void onGetFocus() {
|
||||||
// transfert focus on a specific widget...
|
// transfert focus on a specific widget...
|
||||||
if (getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:entry-folder") instanceof final Entry tmp) {
|
if (getSubObjectNamed("[" + Long.toString(getId()) + "]file-chooser:entry-folder") instanceof final Entry tmp) {
|
||||||
tmp.keepFocus();
|
tmp.keepFocus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -331,13 +331,13 @@ public class FileChooser extends Composer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void updateCurrentFolder() {
|
private void updateCurrentFolder() {
|
||||||
if (getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:list-files") instanceof final ListFileSystem tmp) {
|
if (getSubObjectNamed("[" + Long.toString(getId()) + "]file-chooser:list-files") instanceof final ListFileSystem tmp) {
|
||||||
tmp.setPropertyPath(this.propertyPath);
|
tmp.setPropertyPath(this.propertyPath);
|
||||||
}
|
}
|
||||||
if (getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:list-folder") instanceof final ListFileSystem tmp) {
|
if (getSubObjectNamed("[" + Long.toString(getId()) + "]file-chooser:list-folder") instanceof final ListFileSystem tmp) {
|
||||||
tmp.setPropertyPath(this.propertyPath);
|
tmp.setPropertyPath(this.propertyPath);
|
||||||
}
|
}
|
||||||
if (getSubObjectNamed("[" + Long.toString(getId()) + "]file-shooser:entry-folder") instanceof final Entry tmp) {
|
if (getSubObjectNamed("[" + Long.toString(getId()) + "]file-chooser:entry-folder") instanceof final Entry tmp) {
|
||||||
tmp.setPropertyValue(this.propertyPath);
|
tmp.setPropertyValue(this.propertyPath);
|
||||||
}
|
}
|
||||||
markToRedraw();
|
markToRedraw();
|
||||||
|
182
src/org/atriasoft/ewol/widget/meta/SpinBase.java
Normal file
182
src/org/atriasoft/ewol/widget/meta/SpinBase.java
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
package org.atriasoft.ewol.widget.meta;
|
||||||
|
|
||||||
|
import org.atriasoft.etk.Uri;
|
||||||
|
import org.atriasoft.etk.math.Vector3b;
|
||||||
|
import org.atriasoft.ewol.Gravity;
|
||||||
|
import org.atriasoft.ewol.annotation.EwolDescription;
|
||||||
|
import org.atriasoft.ewol.internal.Log;
|
||||||
|
import org.atriasoft.ewol.resource.ResourceConfigFile;
|
||||||
|
import org.atriasoft.ewol.widget.Button;
|
||||||
|
import org.atriasoft.ewol.widget.Composer;
|
||||||
|
import org.atriasoft.ewol.widget.Entry;
|
||||||
|
import org.atriasoft.ewol.widget.Sizer;
|
||||||
|
import org.atriasoft.ewol.widget.Widget;
|
||||||
|
import org.atriasoft.ewol.widget.model.SpinPosition;
|
||||||
|
import org.atriasoft.exml.annotation.XmlAttribute;
|
||||||
|
import org.atriasoft.exml.annotation.XmlManaged;
|
||||||
|
import org.atriasoft.exml.annotation.XmlName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup ewolWidgetGroup
|
||||||
|
*/
|
||||||
|
public class SpinBase extends Sizer {
|
||||||
|
// properties list:
|
||||||
|
private Uri propertyShape; //!< Shape of the widget
|
||||||
|
private SpinPosition propertySpinMode = SpinPosition.RIGHT_RIGHT; //!< How to display the spin base
|
||||||
|
protected ResourceConfigFile config;
|
||||||
|
protected int confIdEntryShaper = -1;
|
||||||
|
protected int confIdUpShaper = -1;
|
||||||
|
protected int confIdDownShaper = -1;
|
||||||
|
protected int confIdUpData = -1;
|
||||||
|
protected int confIdDownData = -1;
|
||||||
|
|
||||||
|
protected Entry widgetEntry = null;
|
||||||
|
|
||||||
|
protected Button widgetButtonDown = null;
|
||||||
|
|
||||||
|
protected Button widgetButtonUp = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
|
protected SpinBase(final Uri shape) {
|
||||||
|
setPropertyShape(shape);
|
||||||
|
/*
|
||||||
|
propertySpinMode.add(ewol::widget::spinPosition_noneNone, "none-none");
|
||||||
|
propertySpinMode.add(ewol::widget::spinPosition_noneRight, "none-right");
|
||||||
|
propertySpinMode.add(ewol::widget::spinPosition_leftNone, "left-none");
|
||||||
|
propertySpinMode.add(ewol::widget::spinPosition_leftRight, "left-right");
|
||||||
|
propertySpinMode.add(ewol::widget::spinPosition_leftLeft, "left-left");
|
||||||
|
propertySpinMode.add(ewol::widget::spinPosition_RightRight, "right-right");
|
||||||
|
*/
|
||||||
|
setPropertyGravity(Gravity.CENTER);
|
||||||
|
updateGui();
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlManaged
|
||||||
|
@XmlAttribute
|
||||||
|
@XmlName(value = "shape")
|
||||||
|
@EwolDescription(value = "shape for the display")
|
||||||
|
public Uri getPropertyShape() {
|
||||||
|
return this.propertyShape;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlManaged
|
||||||
|
@XmlAttribute
|
||||||
|
@XmlName(value = "spin-mode")
|
||||||
|
@EwolDescription(value = "The display spin mode")
|
||||||
|
public SpinPosition getPropertySpinMode() {
|
||||||
|
return this.propertySpinMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onChangePropertyShape() {
|
||||||
|
this.config = ResourceConfigFile.create(this.propertyShape);
|
||||||
|
if (this.config != null) {
|
||||||
|
this.confIdEntryShaper = this.config.request("entry-shaper");
|
||||||
|
this.confIdUpShaper = this.config.request("up-shaper");
|
||||||
|
this.confIdDownShaper = this.config.request("down-shaper");
|
||||||
|
this.confIdUpData = this.config.request("up-data");
|
||||||
|
this.confIdDownData = this.config.request("down-data");
|
||||||
|
}
|
||||||
|
markToRedraw();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onChangePropertySpinMode() {
|
||||||
|
updateGui();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPropertyShape(final Uri propertyShape) {
|
||||||
|
if (this.propertyShape != null && this.propertyShape.equals(propertyShape)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.propertyShape = propertyShape;
|
||||||
|
onChangePropertyShape();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPropertySpinMode(final SpinPosition propertySpinMode) {
|
||||||
|
if (this.propertySpinMode == propertySpinMode) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.propertySpinMode = propertySpinMode;
|
||||||
|
onChangePropertySpinMode();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void updateGui() {
|
||||||
|
subWidgetRemoveAll();
|
||||||
|
markToRedraw();
|
||||||
|
requestUpdateSize();
|
||||||
|
if (this.widgetEntry == null) {
|
||||||
|
this.widgetEntry = new Entry();
|
||||||
|
if (this.config != null) {
|
||||||
|
final String shaper = this.config.getString(this.confIdEntryShaper);
|
||||||
|
Log.verbose("shaper entry : " + shaper);
|
||||||
|
if (!shaper.isEmpty()) {
|
||||||
|
this.widgetEntry.setPropertyConfig(Uri.valueOf(shaper));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.widgetEntry.setPropertyExpand(new Vector3b(true, false, false));
|
||||||
|
this.widgetEntry.setPropertyFill(Vector3b.TRUE);
|
||||||
|
}
|
||||||
|
if (this.widgetButtonDown == null) {
|
||||||
|
this.widgetButtonDown = new Button();
|
||||||
|
if (this.config != null) {
|
||||||
|
final String shaper = this.config.getString(this.confIdDownShaper);
|
||||||
|
Log.verbose("shaper button DOWN : " + shaper);
|
||||||
|
if (!shaper.isEmpty()) {
|
||||||
|
this.widgetButtonDown.setPropertyConfig(Uri.valueOf(shaper));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.widgetButtonDown.setPropertyExpand(new Vector3b(false, false, false));
|
||||||
|
this.widgetButtonDown.setPropertyFill(Vector3b.TRUE);
|
||||||
|
final String data = this.config.getString(this.confIdDownData);
|
||||||
|
final Widget widget = Composer.composerGenerateString(data);
|
||||||
|
this.widgetButtonDown.setSubWidget(widget, 0);
|
||||||
|
}
|
||||||
|
if (this.widgetButtonUp == null) {
|
||||||
|
this.widgetButtonUp = new Button();
|
||||||
|
if (this.config != null) {
|
||||||
|
final String shaper = this.config.getString(this.confIdUpShaper);
|
||||||
|
Log.verbose("shaper button UP : " + shaper);
|
||||||
|
if (!shaper.isEmpty()) {
|
||||||
|
this.widgetButtonUp.setPropertyConfig(Uri.valueOf(shaper));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.widgetButtonUp.setPropertyExpand(new Vector3b(false, false, false));
|
||||||
|
this.widgetButtonUp.setPropertyFill(Vector3b.TRUE);
|
||||||
|
final String data = this.config.getString(this.confIdUpData);
|
||||||
|
final Widget widget = Composer.composerGenerateString(data);
|
||||||
|
this.widgetButtonUp.setSubWidget(widget);
|
||||||
|
}
|
||||||
|
switch (this.propertySpinMode) {
|
||||||
|
case NONE_NONE:
|
||||||
|
subWidgetAdd(this.widgetEntry);
|
||||||
|
break;
|
||||||
|
case NONE_RIGHT:
|
||||||
|
subWidgetAdd(this.widgetEntry);
|
||||||
|
subWidgetAdd(this.widgetButtonUp);
|
||||||
|
break;
|
||||||
|
case LEFT_NONE:
|
||||||
|
subWidgetAdd(this.widgetButtonDown);
|
||||||
|
subWidgetAdd(this.widgetEntry);
|
||||||
|
break;
|
||||||
|
case LEFT_RIGHT:
|
||||||
|
subWidgetAdd(this.widgetButtonDown);
|
||||||
|
subWidgetAdd(this.widgetEntry);
|
||||||
|
subWidgetAdd(this.widgetButtonUp);
|
||||||
|
break;
|
||||||
|
case LEFT_LEFT:
|
||||||
|
subWidgetAdd(this.widgetButtonDown);
|
||||||
|
subWidgetAdd(this.widgetButtonUp);
|
||||||
|
subWidgetAdd(this.widgetEntry);
|
||||||
|
break;
|
||||||
|
case RIGHT_RIGHT:
|
||||||
|
subWidgetAdd(this.widgetEntry);
|
||||||
|
subWidgetAdd(this.widgetButtonDown);
|
||||||
|
subWidgetAdd(this.widgetButtonUp);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
40
src/org/atriasoft/ewol/widget/model/SpinPosition.java
Normal file
40
src/org/atriasoft/ewol/widget/model/SpinPosition.java
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
package org.atriasoft.ewol.widget.model;
|
||||||
|
|
||||||
|
public enum SpinPosition {
|
||||||
|
/** show like:
|
||||||
|
* +------------------------+
|
||||||
|
* | |
|
||||||
|
* +------------------------+
|
||||||
|
*/
|
||||||
|
NONE_NONE,
|
||||||
|
/** show like:
|
||||||
|
* +--------------------+---+
|
||||||
|
* | | |
|
||||||
|
* +--------------------+---+
|
||||||
|
*/
|
||||||
|
NONE_RIGHT,
|
||||||
|
/** show like:
|
||||||
|
* +---+--------------------+
|
||||||
|
* | | |
|
||||||
|
* +---+--------------------+
|
||||||
|
*/
|
||||||
|
LEFT_NONE,
|
||||||
|
/** show like:
|
||||||
|
* +---+----------------+---+
|
||||||
|
* | | | |
|
||||||
|
* +---+----------------+---+
|
||||||
|
*/
|
||||||
|
LEFT_RIGHT,
|
||||||
|
/** show like:
|
||||||
|
* +---+---+----------------+
|
||||||
|
* | | | |
|
||||||
|
* +---+---+----------------+
|
||||||
|
*/
|
||||||
|
LEFT_LEFT,
|
||||||
|
/** show like:
|
||||||
|
* +----------------+---+---+
|
||||||
|
* | | | |
|
||||||
|
* +----------------+---+---+
|
||||||
|
*/
|
||||||
|
RIGHT_RIGHT,
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user