[DEV] display correct of the Entry widget (controleur is bad)
This commit is contained in:
parent
866d7035a1
commit
1319741a96
49
.classpath
49
.classpath
@ -23,27 +23,7 @@
|
|||||||
<attribute name="test" value="true"/>
|
<attribute name="test" value="true"/>
|
||||||
</attributes>
|
</attributes>
|
||||||
</classpathentry>
|
</classpathentry>
|
||||||
<classpathentry combineaccessrules="false" exported="true" kind="src" path="/atriasoft-esvg">
|
<classpathentry combineaccessrules="false" kind="src" path="/atriasoft-io-gami">
|
||||||
<attributes>
|
|
||||||
<attribute name="module" value="true"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry combineaccessrules="false" exported="true" kind="src" path="/atriasoft-exml">
|
|
||||||
<attributes>
|
|
||||||
<attribute name="module" value="true"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry combineaccessrules="false" exported="true" kind="src" path="/atriasoft-gale">
|
|
||||||
<attributes>
|
|
||||||
<attribute name="module" value="true"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry combineaccessrules="false" exported="true" kind="src" path="/scenarium-logger">
|
|
||||||
<attributes>
|
|
||||||
<attribute name="module" value="true"/>
|
|
||||||
</attributes>
|
|
||||||
</classpathentry>
|
|
||||||
<classpathentry combineaccessrules="false" exported="true" kind="src" path="/atriasoft-etk">
|
|
||||||
<attributes>
|
<attributes>
|
||||||
<attribute name="module" value="true"/>
|
<attribute name="module" value="true"/>
|
||||||
</attributes>
|
</attributes>
|
||||||
@ -53,7 +33,32 @@
|
|||||||
<attribute name="module" value="true"/>
|
<attribute name="module" value="true"/>
|
||||||
</attributes>
|
</attributes>
|
||||||
</classpathentry>
|
</classpathentry>
|
||||||
<classpathentry combineaccessrules="false" kind="src" path="/atriasoft-io-gami">
|
<classpathentry combineaccessrules="false" exported="true" kind="src" path="/atriasoft-etk">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="module" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry combineaccessrules="false" exported="true" kind="src" path="/scenarium-logger">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="module" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry combineaccessrules="false" exported="true" kind="src" path="/atriasoft-gale">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="module" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry combineaccessrules="false" exported="true" kind="src" path="/atriasoft-exml">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="module" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry combineaccessrules="false" exported="true" kind="src" path="/atriasoft-esvg">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="module" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry combineaccessrules="false" kind="src" path="/loader3d">
|
||||||
<attributes>
|
<attributes>
|
||||||
<attribute name="module" value="true"/>
|
<attribute name="module" value="true"/>
|
||||||
</attributes>
|
</attributes>
|
||||||
|
@ -1,612 +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/widget/Entry.hpp>
|
|
||||||
#include <ewol/widget/Manager.hpp>
|
|
||||||
#include <ewol/ewol.hpp>
|
|
||||||
#include <ewol/context/Context.hpp>
|
|
||||||
#include <ewol/Padding.hpp>
|
|
||||||
#include <etk/typeInfo.hpp>
|
|
||||||
ETK_DECLARE_TYPE(ewol::widget::Entry);
|
|
||||||
|
|
||||||
// DEFINE for the shader display system :
|
|
||||||
#define STATUS_NORMAL (0)
|
|
||||||
#define STATUS_HOVER (1)
|
|
||||||
#define STATUS_SELECTED (2)
|
|
||||||
|
|
||||||
ewol::widget::Entry::Entry() :
|
|
||||||
signalClick(this, "click", "the user Click on the Entry box"),
|
|
||||||
signalEnter(this, "enter", "The cursor enter inside the button"),
|
|
||||||
signalModify(this, "modify", "Entry box value change"),
|
|
||||||
propertyPassword(this, "password",
|
|
||||||
false,
|
|
||||||
"Not display content in password mode",
|
|
||||||
ewol::widget::Entry::onChangePropertyPassword),
|
|
||||||
propertyShape(this, "shape",
|
|
||||||
etk::Uri("THEME_GUI:///Entry.json?lib=ewol"),
|
|
||||||
"Shaper to display the background",
|
|
||||||
ewol::widget::Entry::onChangePropertyShaper),
|
|
||||||
propertyValue(this, "value",
|
|
||||||
"",
|
|
||||||
"Value display in the entry (decorated text)",
|
|
||||||
ewol::widget::Entry::onChangePropertyValue),
|
|
||||||
propertyMaxCharacter(this, "max",
|
|
||||||
0x7FFFFFFF, 0, 0x7FFFFFFF,
|
|
||||||
"Maximum char that can be set on the Entry",
|
|
||||||
ewol::widget::Entry::onChangePropertyMaxCharacter),
|
|
||||||
propertyRegex(this, "regex",
|
|
||||||
".*",
|
|
||||||
"Control what it is write with a regular expression",
|
|
||||||
ewol::widget::Entry::onChangePropertyRegex),
|
|
||||||
propertyTextWhenNothing(this, "empty-text",
|
|
||||||
"",
|
|
||||||
"Text when nothing is written",
|
|
||||||
ewol::widget::Entry::onChangePropertyTextWhenNothing),
|
|
||||||
this.needUpdateTextPos(true),
|
|
||||||
this.displayStartPosition(0),
|
|
||||||
this.displayCursor(false),
|
|
||||||
this.displayCursorPos(0),
|
|
||||||
this.displayCursorPosSelection(0) {
|
|
||||||
addObjectType("ewol::widget::Entry");
|
|
||||||
propertyCanFocus.setDirectCheck(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Entry::init() {
|
|
||||||
Widget::init();
|
|
||||||
propertyShape.notifyChange();
|
|
||||||
|
|
||||||
this.regex.compile(propertyRegex.get());
|
|
||||||
if (this.regex.getStatus() == false) {
|
|
||||||
Log.error("can not parse regex for : " + propertyRegex);
|
|
||||||
}
|
|
||||||
markToRedraw();
|
|
||||||
|
|
||||||
shortCutAdd("ctrl+w", "clean");
|
|
||||||
shortCutAdd("ctrl+x", "cut");
|
|
||||||
shortCutAdd("ctrl+c", "copy");
|
|
||||||
shortCutAdd("ctrl+v", "paste");
|
|
||||||
shortCutAdd("ctrl+a", "select:all");
|
|
||||||
shortCutAdd("ctrl+shift+a", "select:none");
|
|
||||||
signalShortcut.connect(sharedFromThis(), ewol::widget::Entry::onCallbackShortCut);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ewol::widget::Entry::~Entry() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Entry::onCallbackShortCut( String _value) {
|
|
||||||
if (_value == "clean") {
|
|
||||||
onCallbackEntryClean();
|
|
||||||
} else if (_value == "cut") {
|
|
||||||
onCallbackCut();
|
|
||||||
} else if (_value == "copy") {
|
|
||||||
onCallbackCopy();
|
|
||||||
} else if (_value == "paste") {
|
|
||||||
Log.warning("Request past ...");
|
|
||||||
onCallbackPaste();
|
|
||||||
} else if (_value == "select:all") {
|
|
||||||
onCallbackSelect(true);
|
|
||||||
} else if (_value == "select:none") {
|
|
||||||
onCallbackSelect(false);
|
|
||||||
} else {
|
|
||||||
Log.warning("Unknow event from ShortCut : " + _value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Entry::calculateMinMaxSize() {
|
|
||||||
// call main class
|
|
||||||
Widget::calculateMinMaxSize();
|
|
||||||
// get generic padding
|
|
||||||
ewol::Padding padding = this.shaper.getPadding();
|
|
||||||
int minHeight = this.text.calculateSize(Character('A')).y();
|
|
||||||
Vector2f minimumSizeBase(20, minHeight);
|
|
||||||
// add padding :
|
|
||||||
minimumSizeBase += Vector2f(padding.x(), padding.y());
|
|
||||||
this.minSize.setMax(minimumSizeBase);
|
|
||||||
// verify the min max of the min size ...
|
|
||||||
checkMinSize();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ewol::widget::Entry::onDraw() {
|
|
||||||
this.shaper.draw();
|
|
||||||
this.text.draw();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ewol::widget::Entry::onRegenerateDisplay() {
|
|
||||||
if (needRedraw() == true) {
|
|
||||||
this.shaper.clear();
|
|
||||||
this.text.clear();
|
|
||||||
if (this.colorIdTextFg >= 0) {
|
|
||||||
this.text.setDefaultColorFg(this.shaper.getColor(this.colorIdTextFg));
|
|
||||||
this.text.setDefaultColorBg(this.shaper.getColor(this.colorIdTextBg));
|
|
||||||
this.text.setCursorColor(this.shaper.getColor(this.colorIdCursor));
|
|
||||||
this.text.setSelectionColor(this.shaper.getColor(this.colorIdSelection));
|
|
||||||
}
|
|
||||||
updateTextPosition();
|
|
||||||
ewol::Padding padding = this.shaper.getPadding();
|
|
||||||
|
|
||||||
Vector2f tmpSizeShaper = this.minSize;
|
|
||||||
if (propertyFill.x() == true) {
|
|
||||||
tmpSizeShaper.setX(this.size.x());
|
|
||||||
}
|
|
||||||
if (propertyFill.y() == true) {
|
|
||||||
tmpSizeShaper.setY(this.size.y());
|
|
||||||
}
|
|
||||||
|
|
||||||
Vector2f tmpOriginShaper = (this.size - tmpSizeShaper) / 2.0f;
|
|
||||||
Vector2f tmpSizeText = tmpSizeShaper - Vector2f(padding.x(), padding.y());
|
|
||||||
Vector2f tmpOriginText = (this.size - tmpSizeText) / 2.0f;
|
|
||||||
// sometimes, the user define an height bigger than the real size needed == > in this case we need to center the text in the shaper ...
|
|
||||||
int minHeight = this.text.calculateSize(Character('A')).y();
|
|
||||||
if (tmpSizeText.y() > minHeight) {
|
|
||||||
tmpOriginText += Vector2f(0,(tmpSizeText.y()-minHeight)/2.0f);
|
|
||||||
}
|
|
||||||
// fix all the position in the int class:
|
|
||||||
tmpSizeShaper = Vector2fClipInt32(tmpSizeShaper);
|
|
||||||
tmpOriginShaper = Vector2fClipInt32(tmpOriginShaper);
|
|
||||||
tmpSizeText = Vector2fClipInt32(tmpSizeText);
|
|
||||||
tmpOriginText = Vector2fClipInt32(tmpOriginText);
|
|
||||||
|
|
||||||
this.text.reset();
|
|
||||||
this.text.setClippingWidth(tmpOriginText, tmpSizeText);
|
|
||||||
this.text.setPos(tmpOriginText+Vector2f(this.displayStartPosition,0));
|
|
||||||
if (this.displayCursorPosSelection != this.displayCursorPos) {
|
|
||||||
this.text.setCursorSelection(this.displayCursorPos, this.displayCursorPosSelection);
|
|
||||||
} else {
|
|
||||||
this.text.setCursorPos(this.displayCursorPos);
|
|
||||||
}
|
|
||||||
etk::UString valueToDisplay = etk::toUString(*propertyValue);
|
|
||||||
if (*propertyPassword == true) {
|
|
||||||
for (auto it: valueToDisplay) {
|
|
||||||
it = '*';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (valueToDisplay.size() != 0) {
|
|
||||||
this.text.print(valueToDisplay);
|
|
||||||
} else {
|
|
||||||
if (propertyTextWhenNothing.size() != 0) {
|
|
||||||
this.text.printDecorated(propertyTextWhenNothing);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.text.setClippingMode(false);
|
|
||||||
|
|
||||||
this.shaper.setShape(tmpOriginShaper, tmpSizeShaper, tmpOriginText, tmpSizeText);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ewol::widget::Entry::updateCursorPosition( Vector2f _pos, boolean _selection) {
|
|
||||||
ewol::Padding padding = this.shaper.getPadding();
|
|
||||||
|
|
||||||
Vector2f relPos = relativePosition(_pos);
|
|
||||||
relPos.setX(relPos.x()-this.displayStartPosition - padding.xLeft());
|
|
||||||
// try to find the new cursor position :
|
|
||||||
String tmpDisplay = String(propertyValue, 0, this.displayStartPosition);
|
|
||||||
int displayHidenSize = this.text.calculateSize(tmpDisplay).x();
|
|
||||||
//Log.debug("hidenSize : " + displayHidenSize);
|
|
||||||
int newCursorPosition = -1;
|
|
||||||
int tmpTextOriginX = padding.xLeft();
|
|
||||||
for (int iii=0; iii<propertyValue.size(); iii++) {
|
|
||||||
tmpDisplay = String(propertyValue, 0, iii);
|
|
||||||
int tmpWidth = this.text.calculateSize(tmpDisplay).x() - displayHidenSize;
|
|
||||||
if (tmpWidth >= relPos.x()-tmpTextOriginX) {
|
|
||||||
newCursorPosition = iii;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (newCursorPosition == -1) {
|
|
||||||
newCursorPosition = propertyValue.size();
|
|
||||||
}
|
|
||||||
if (_selection == false) {
|
|
||||||
this.displayCursorPos = newCursorPosition;
|
|
||||||
this.displayCursorPosSelection = this.displayCursorPos;
|
|
||||||
markToRedraw();
|
|
||||||
} else {
|
|
||||||
if (this.displayCursorPos == this.displayCursorPosSelection) {
|
|
||||||
this.displayCursorPosSelection = this.displayCursorPos;
|
|
||||||
}
|
|
||||||
this.displayCursorPos = newCursorPosition;
|
|
||||||
markToRedraw();
|
|
||||||
}
|
|
||||||
markToUpdateTextPosition();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ewol::widget::Entry::removeSelected() {
|
|
||||||
if (this.displayCursorPosSelection == this.displayCursorPos) {
|
|
||||||
// nothing to cut ...
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int pos1 = this.displayCursorPosSelection;
|
|
||||||
int pos2 = this.displayCursorPos;
|
|
||||||
if(this.displayCursorPosSelection>this.displayCursorPos) {
|
|
||||||
pos2 = this.displayCursorPosSelection;
|
|
||||||
pos1 = this.displayCursorPos;
|
|
||||||
}
|
|
||||||
// remove data ...
|
|
||||||
this.displayCursorPos = pos1;
|
|
||||||
this.displayCursorPosSelection = pos1;
|
|
||||||
propertyValue.getDirect().erase(pos1, pos2-pos1);
|
|
||||||
markToRedraw();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ewol::widget::Entry::copySelectionToClipBoard(enum gale::context::clipBoard::clipboardListe _clipboardID) {
|
|
||||||
if (this.displayCursorPosSelection == this.displayCursorPos) {
|
|
||||||
// nothing to cut ...
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int pos1 = this.displayCursorPosSelection;
|
|
||||||
int pos2 = this.displayCursorPos;
|
|
||||||
if(this.displayCursorPosSelection>this.displayCursorPos) {
|
|
||||||
pos2 = this.displayCursorPosSelection;
|
|
||||||
pos1 = this.displayCursorPos;
|
|
||||||
}
|
|
||||||
// Copy
|
|
||||||
String tmpData = String(propertyValue, pos1, pos2);
|
|
||||||
gale::context::clipBoard::set(_clipboardID, tmpData);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
boolean ewol::widget::Entry::onEventInput( ewol::event::Input _event) {
|
|
||||||
Log.warning("Event on Input ... " + _event);
|
|
||||||
if (_event.getId() == 1) {
|
|
||||||
if (KeyStatus::pressSingle == _event.getStatus()) {
|
|
||||||
keepFocus();
|
|
||||||
signalClick.emit();
|
|
||||||
//nothing to do ...
|
|
||||||
return true;
|
|
||||||
} else if (KeyStatus::pressDouble == _event.getStatus()) {
|
|
||||||
keepFocus();
|
|
||||||
// select word
|
|
||||||
this.displayCursorPosSelection = this.displayCursorPos-1;
|
|
||||||
// search forward
|
|
||||||
for (int iii=this.displayCursorPos; iii <= propertyValue.size(); iii++) {
|
|
||||||
if(iii == propertyValue.size()) {
|
|
||||||
this.displayCursorPos = iii;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(!( ( propertyValue.get()[iii] >= 'a'
|
|
||||||
LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM propertyValue.get()[iii] <= 'z')
|
|
||||||
|| ( propertyValue.get()[iii] >= 'A'
|
|
||||||
LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM propertyValue.get()[iii] <= 'Z')
|
|
||||||
|| ( propertyValue.get()[iii] >= '0'
|
|
||||||
LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM propertyValue.get()[iii] <= '9')
|
|
||||||
|| propertyValue.get()[iii] == '_'
|
|
||||||
|| propertyValue.get()[iii] == '-'
|
|
||||||
) ) {
|
|
||||||
this.displayCursorPos = iii;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// search backward
|
|
||||||
for (long iii=this.displayCursorPosSelection; iii >= -1; iii--) {
|
|
||||||
if(iii == -1) {
|
|
||||||
this.displayCursorPosSelection = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(!( ( propertyValue.get()[iii] >= 'a'
|
|
||||||
LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM propertyValue.get()[iii] <= 'z')
|
|
||||||
|| ( propertyValue.get()[iii] >= 'A'
|
|
||||||
LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM propertyValue.get()[iii] <= 'Z')
|
|
||||||
|| ( propertyValue.get()[iii] >= '0'
|
|
||||||
LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM propertyValue.get()[iii] <= '9')
|
|
||||||
|| propertyValue.get()[iii] == '_'
|
|
||||||
|| propertyValue.get()[iii] == '-'
|
|
||||||
) ) {
|
|
||||||
this.displayCursorPosSelection = iii+1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Copy to clipboard Middle ...
|
|
||||||
copySelectionToClipBoard(gale::context::clipBoard::clipboardSelection);
|
|
||||||
markToRedraw();
|
|
||||||
} else if (KeyStatus::pressTriple == _event.getStatus()) {
|
|
||||||
keepFocus();
|
|
||||||
this.displayCursorPosSelection = 0;
|
|
||||||
this.displayCursorPos = propertyValue.size();
|
|
||||||
} else if (KeyStatus::down == _event.getStatus()) {
|
|
||||||
keepFocus();
|
|
||||||
updateCursorPosition(_event.getPos());
|
|
||||||
markToRedraw();
|
|
||||||
} else if (KeyStatus::move == _event.getStatus()) {
|
|
||||||
keepFocus();
|
|
||||||
updateCursorPosition(_event.getPos(), true);
|
|
||||||
markToRedraw();
|
|
||||||
} else if (KeyStatus::up == _event.getStatus()) {
|
|
||||||
keepFocus();
|
|
||||||
updateCursorPosition(_event.getPos(), true);
|
|
||||||
// Copy to clipboard Middle ...
|
|
||||||
copySelectionToClipBoard(gale::context::clipBoard::clipboardSelection);
|
|
||||||
markToRedraw();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if( KeyType::mouse == _event.getType()
|
|
||||||
LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM _event.getId() == 2) {
|
|
||||||
if( _event.getStatus() == KeyStatus::down
|
|
||||||
|| _event.getStatus() == KeyStatus::move
|
|
||||||
|| _event.getStatus() == KeyStatus::up) {
|
|
||||||
keepFocus();
|
|
||||||
// updatethe cursor position :
|
|
||||||
updateCursorPosition(_event.getPos());
|
|
||||||
}
|
|
||||||
// Paste current selection only when up button
|
|
||||||
if (_event.getStatus() == KeyStatus::up) {
|
|
||||||
keepFocus();
|
|
||||||
// middle button => past data...
|
|
||||||
gale::context::clipBoard::request(gale::context::clipBoard::clipboardSelection);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
boolean ewol::widget::Entry::onEventEntry( ewol::event::Entry _event) {
|
|
||||||
Log.warning("Event on Entry ... " + _event);
|
|
||||||
if (_event.getType() == KeyKeyboard::character) {
|
|
||||||
if(_event.getStatus() == KeyStatus::down) {
|
|
||||||
// remove curent selected data ...
|
|
||||||
removeSelected();
|
|
||||||
if( _event.getChar() == '\n'
|
|
||||||
|| _event.getChar() == '\r') {
|
|
||||||
signalEnter.emit(propertyValue);
|
|
||||||
return true;
|
|
||||||
} else if (_event.getChar() == 0x7F) {
|
|
||||||
// SUPPR :
|
|
||||||
if (propertyValue.size() > 0 LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM this.displayCursorPos < (long)propertyValue.size()) {
|
|
||||||
propertyValue.getDirect().erase(this.displayCursorPos, 1);
|
|
||||||
this.displayCursorPos = etk::max(this.displayCursorPos, 0);
|
|
||||||
this.displayCursorPosSelection = this.displayCursorPos;
|
|
||||||
}
|
|
||||||
} else if (_event.getChar() == 0x08) {
|
|
||||||
// DEL :
|
|
||||||
if (propertyValue.size() > 0 LOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOMLOM this.displayCursorPos != 0) {
|
|
||||||
propertyValue.getDirect().erase(this.displayCursorPos-1, 1);
|
|
||||||
this.displayCursorPos--;
|
|
||||||
this.displayCursorPos = etk::max(this.displayCursorPos, 0);
|
|
||||||
this.displayCursorPosSelection = this.displayCursorPos;
|
|
||||||
}
|
|
||||||
} else if(_event.getChar() >= 20) {
|
|
||||||
Log.error("get data: '" + _event.getChar() + "' = '" + u32char::convertToUtf8(_event.getChar()) + "'");
|
|
||||||
if ((long)propertyValue.size() > propertyMaxCharacter) {
|
|
||||||
Log.info("Reject data for entry : '" + _event.getChar() + "'");
|
|
||||||
} else {
|
|
||||||
String newData = propertyValue;
|
|
||||||
String inputData = u32char::convertToUtf8(_event.getChar());
|
|
||||||
newData.insert(newData.begin()+this.displayCursorPos, inputData);
|
|
||||||
setInternalValue(newData);
|
|
||||||
if (propertyValue.get() == newData) {
|
|
||||||
this.displayCursorPos += inputData.size();
|
|
||||||
this.displayCursorPosSelection = this.displayCursorPos;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
signalModify.emit(propertyValue);
|
|
||||||
markToRedraw();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
if(_event.getStatus() == KeyStatus::down) {
|
|
||||||
switch (_event.getType()) {
|
|
||||||
case KeyKeyboard::left:
|
|
||||||
this.displayCursorPos--;
|
|
||||||
break;
|
|
||||||
case KeyKeyboard::right:
|
|
||||||
this.displayCursorPos++;
|
|
||||||
break;
|
|
||||||
case KeyKeyboard::start:
|
|
||||||
this.displayCursorPos = 0;
|
|
||||||
break;
|
|
||||||
case KeyKeyboard::end:
|
|
||||||
this.displayCursorPos = propertyValue.size();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
this.displayCursorPos = etk::avg(0, this.displayCursorPos, (int)propertyValue.size());
|
|
||||||
this.displayCursorPosSelection = this.displayCursorPos;
|
|
||||||
markToRedraw();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Entry::setInternalValue( String _newData) {
|
|
||||||
String previous = propertyValue;
|
|
||||||
// check the RegExp :
|
|
||||||
if (_newData.size()>0) {
|
|
||||||
/*
|
|
||||||
if (this.regex.parse(_newData, 0, _newData.size()) == false) {
|
|
||||||
Log.info("The input data does not match with the regExp '" + _newData + "' Regex='" + propertyRegex + "'" );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (this.regex.start() != 0) {
|
|
||||||
Log.info("The input data does not match with the regExp '" + _newData + "' Regex='" + propertyRegex + "' (start position error)" );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (this.regex.stop() != _newData.size()) {
|
|
||||||
Log.info("The input data does not match with the regExp '" + _newData + "' Regex='" + propertyRegex + "' (stop position error)" );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
propertyValue.setDirect(_newData);
|
|
||||||
markToRedraw();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Entry::onEventClipboard(enum gale::context::clipBoard::clipboardListe _clipboardID) {
|
|
||||||
// remove curent selected data ...
|
|
||||||
removeSelected();
|
|
||||||
// get current selection / Copy :
|
|
||||||
String tmpData = get(_clipboardID);
|
|
||||||
// add it on the current display :
|
|
||||||
if (tmpData.size() != 0) {
|
|
||||||
String newData = propertyValue;
|
|
||||||
newData.insert(this.displayCursorPos, tmpData[0]);
|
|
||||||
setInternalValue(newData);
|
|
||||||
if (propertyValue.get() == newData) {
|
|
||||||
if (propertyValue.size() == tmpData.size()) {
|
|
||||||
this.displayCursorPos = tmpData.size();
|
|
||||||
} else {
|
|
||||||
this.displayCursorPos += tmpData.size();
|
|
||||||
}
|
|
||||||
this.displayCursorPosSelection = this.displayCursorPos;
|
|
||||||
markToRedraw();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
signalModify.emit(propertyValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Entry::onCallbackEntryClean() {
|
|
||||||
propertyValue.setDirect("");
|
|
||||||
this.displayStartPosition = 0;
|
|
||||||
this.displayCursorPos = 0;
|
|
||||||
this.displayCursorPosSelection = this.displayCursorPos;
|
|
||||||
markToRedraw();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Entry::onCallbackCut() {
|
|
||||||
copySelectionToClipBoard(gale::context::clipBoard::clipboardStd);
|
|
||||||
removeSelected();
|
|
||||||
signalModify.emit(propertyValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Entry::onCallbackCopy() {
|
|
||||||
copySelectionToClipBoard(gale::context::clipBoard::clipboardStd);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Entry::onCallbackPaste() {
|
|
||||||
gale::context::clipBoard::request(gale::context::clipBoard::clipboardStd);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Entry::onCallbackSelect(boolean _all) {
|
|
||||||
if(_all == true) {
|
|
||||||
this.displayCursorPosSelection = 0;
|
|
||||||
this.displayCursorPos = propertyValue.size();
|
|
||||||
} else {
|
|
||||||
this.displayCursorPosSelection = this.displayCursorPos;
|
|
||||||
}
|
|
||||||
markToRedraw();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Entry::markToUpdateTextPosition() {
|
|
||||||
this.needUpdateTextPos = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Entry::updateTextPosition() {
|
|
||||||
if (this.needUpdateTextPos == false) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ewol::Padding padding = this.shaper.getPadding();
|
|
||||||
|
|
||||||
int tmpSizeX = this.minSize.x();
|
|
||||||
if (propertyFill.x() == true) {
|
|
||||||
tmpSizeX = this.size.x();
|
|
||||||
}
|
|
||||||
int tmpUserSize = tmpSizeX - padding.x();
|
|
||||||
int totalWidth = this.text.calculateSize(propertyValue).x();
|
|
||||||
// Check if the data inside the display can be contain in the entry box
|
|
||||||
if (totalWidth < tmpUserSize) {
|
|
||||||
// all can be display :
|
|
||||||
this.displayStartPosition = 0;
|
|
||||||
} else {
|
|
||||||
// all can not be set :
|
|
||||||
String tmpDisplay = String(propertyValue, 0, this.displayCursorPos);
|
|
||||||
int pixelCursorPos = this.text.calculateSize(tmpDisplay).x();
|
|
||||||
// check if the Cussor is visible at 10px nearest the border :
|
|
||||||
int tmp1 = pixelCursorPos+this.displayStartPosition;
|
|
||||||
Log.debug("cursorPos=" + pixelCursorPos + "px maxSize=" + tmpUserSize + "px tmp1=" + tmp1);
|
|
||||||
if (tmp1<10) {
|
|
||||||
// set the cursor on le left
|
|
||||||
this.displayStartPosition = etk::min(-pixelCursorPos+10, 0);
|
|
||||||
} else if (tmp1>tmpUserSize-10) {
|
|
||||||
// set the cursor of the Right
|
|
||||||
this.displayStartPosition = etk::min(-pixelCursorPos + tmpUserSize - 10, 0);
|
|
||||||
}
|
|
||||||
// else : the cursor is inside the display
|
|
||||||
//this.displayStartPosition = -totalWidth + tmpUserSize;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Entry::onGetFocus() {
|
|
||||||
this.displayCursor = true;
|
|
||||||
changeStatusIn(STATUS_SELECTED);
|
|
||||||
showKeyboard();
|
|
||||||
markToRedraw();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Entry::onLostFocus() {
|
|
||||||
this.displayCursor = false;
|
|
||||||
changeStatusIn(STATUS_NORMAL);
|
|
||||||
hideKeyboard();
|
|
||||||
markToRedraw();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Entry::changeStatusIn(int _newStatusId) {
|
|
||||||
if (this.shaper.changeStatusIn(_newStatusId) == true) {
|
|
||||||
this.PCH = getObjectManager().periodicCall.connect(this, ewol::widget::Entry::periodicCall);
|
|
||||||
markToRedraw();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Entry::periodicCall( ewol::event::Time _event) {
|
|
||||||
if (this.shaper.periodicCall(_event) == false) {
|
|
||||||
this.PCH.disconnect();
|
|
||||||
}
|
|
||||||
markToRedraw();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Entry::onChangePropertyPassword() {
|
|
||||||
markToRedraw();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Entry::onChangePropertyShaper() {
|
|
||||||
this.shaper.setSource(propertyShape.get());
|
|
||||||
this.colorIdTextFg = this.shaper.requestColor("text-foreground");
|
|
||||||
this.colorIdTextBg = this.shaper.requestColor("text-background");
|
|
||||||
this.colorIdCursor = this.shaper.requestColor("text-cursor");
|
|
||||||
this.colorIdSelection = this.shaper.requestColor("text-selection");
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Entry::onChangePropertyValue() {
|
|
||||||
String newData = propertyValue.get();
|
|
||||||
if ((long)newData.size() > propertyMaxCharacter) {
|
|
||||||
newData = String(newData, 0, propertyMaxCharacter);
|
|
||||||
Log.debug("Limit entry set of data... " + String(newData, propertyMaxCharacter));
|
|
||||||
}
|
|
||||||
// set the value with the check of the RegExp ...
|
|
||||||
setInternalValue(newData);
|
|
||||||
if (newData == propertyValue.get()) {
|
|
||||||
this.displayCursorPos = propertyValue.size();
|
|
||||||
this.displayCursorPosSelection = this.displayCursorPos;
|
|
||||||
Log.verbose("Set : '" + newData + "'");
|
|
||||||
}
|
|
||||||
markToRedraw();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Entry::onChangePropertyMaxCharacter() {
|
|
||||||
// TODO : check nomber of char in the data
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Entry::onChangePropertyRegex() {
|
|
||||||
this.regex.compile(propertyRegex.get());
|
|
||||||
if (this.regex.getStatus() == false) {
|
|
||||||
Log.error("can not parse regex for : " + propertyRegex);
|
|
||||||
}
|
|
||||||
markToRedraw();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ewol::widget::Entry::onChangePropertyTextWhenNothing() {
|
|
||||||
markToRedraw();
|
|
||||||
}
|
|
||||||
|
|
@ -1,141 +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 <etk/RegEx.hpp>
|
|
||||||
#include <ewol/debug.hpp>
|
|
||||||
#include <ewol/compositing/Text.hpp>
|
|
||||||
#include <ewol/compositing/Drawing.hpp>
|
|
||||||
#include <ewol/compositing/Shaper.hpp>
|
|
||||||
#include <ewol/widget/Widget.hpp>
|
|
||||||
#include <etk/Color.hpp>
|
|
||||||
#include <ewol/widget/Manager.hpp>
|
|
||||||
#include <esignal/Signal.hpp>
|
|
||||||
|
|
||||||
namespace ewol {
|
|
||||||
namespace widget {
|
|
||||||
class Entry;
|
|
||||||
using Entry = ememory::Ptr<ewol::widget::Entry>;
|
|
||||||
using EntryWeak = ememory::WeakPtr<ewol::widget::Entry>;
|
|
||||||
/**
|
|
||||||
* @ingroup ewolWidgetGroup
|
|
||||||
* Entry box display :
|
|
||||||
*
|
|
||||||
* ~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
* ----------------------------------------------
|
|
||||||
* | Editable Text |
|
|
||||||
* ----------------------------------------------
|
|
||||||
* ~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
*/
|
|
||||||
class Entry : public Widget {
|
|
||||||
public: // Event list
|
|
||||||
esignal::Signal<> signalClick; //!< bang on click the entry box
|
|
||||||
esignal::Signal<String> signalEnter; //!< Enter key is pressed
|
|
||||||
esignal::Signal<String> signalModify; //!< data change
|
|
||||||
public: // propertie list
|
|
||||||
eproperty::Value<bool> propertyPassword; //!< Disable display of the content of the entry
|
|
||||||
eproperty::Value<etk::Uri> propertyShape;
|
|
||||||
eproperty::Value<String> propertyValue; //!< string that must be displayed
|
|
||||||
eproperty::Range<int> propertyMaxCharacter; //!< number max of xharacter in the list
|
|
||||||
eproperty::Value<String> propertyRegex; //!< regular expression value
|
|
||||||
eproperty::Value<String> propertyTextWhenNothing; //!< Text to display when nothing in in the entry (decorated text...)
|
|
||||||
private:
|
|
||||||
ewol::compositing::Shaper this.shaper;
|
|
||||||
int this.colorIdTextFg; //!< color property of the text foreground
|
|
||||||
int this.colorIdTextBg; //!< color property of the text background
|
|
||||||
int this.colorIdCursor; //!< color property of the text cursor
|
|
||||||
int this.colorIdSelection; //!< color property of the text selection
|
|
||||||
ewol::compositing::Text this.text; //!< text display this.text
|
|
||||||
protected:
|
|
||||||
/**
|
|
||||||
* Contuctor
|
|
||||||
* @param _newData The USting that might be set in the Entry box (no event generation!!)
|
|
||||||
*/
|
|
||||||
Entry();
|
|
||||||
void init() ;
|
|
||||||
public:
|
|
||||||
DECLARE_WIDGET_FACTORY(Entry, "Entry");
|
|
||||||
/**
|
|
||||||
* Destuctor
|
|
||||||
*/
|
|
||||||
~Entry();
|
|
||||||
protected:
|
|
||||||
/**
|
|
||||||
* internal check the value with RegExp checking
|
|
||||||
* @param _newData The new string to display
|
|
||||||
*/
|
|
||||||
void setInternalValue( String _newData);
|
|
||||||
private:
|
|
||||||
etk::RegEx<String> this.regex; //!< regular expression to check content
|
|
||||||
private:
|
|
||||||
boolean this.needUpdateTextPos; //!< text position can have change
|
|
||||||
int this.displayStartPosition; //!< ofset in pixel of the display of the UString
|
|
||||||
boolean this.displayCursor; //!< Cursor must be display only when the widget has the focus
|
|
||||||
int this.displayCursorPos; //!< Cursor position in number of Char
|
|
||||||
int this.displayCursorPosSelection; //!< Selection position end (can be befor or after cursor and == this.displayCursorPos chan no selection availlable
|
|
||||||
protected:
|
|
||||||
/**
|
|
||||||
* informe the system thet the text change and the start position change
|
|
||||||
*/
|
|
||||||
void markToUpdateTextPosition();
|
|
||||||
/**
|
|
||||||
* update the display position start == > depending of the position of the Cursor and the size of the Data inside
|
|
||||||
* @change this.displayStartPosition < == updated
|
|
||||||
*/
|
|
||||||
void updateTextPosition();
|
|
||||||
/**
|
|
||||||
* change the cursor position with the curent position requested on the display
|
|
||||||
* @param _pos Absolute position of the event
|
|
||||||
* @note The display is automaticly requested when change apear.
|
|
||||||
*/
|
|
||||||
void updateCursorPosition( Vector2f _pos, boolean _Selection=false);
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* Copy the selected data on the specify clipboard
|
|
||||||
* @param _clipboardID Selected clipboard
|
|
||||||
*/
|
|
||||||
void copySelectionToClipBoard(enum gale::context::clipBoard::clipboardListe _clipboardID);
|
|
||||||
/**
|
|
||||||
* remove the selected area
|
|
||||||
* @note This request a regeneration of the display
|
|
||||||
*/
|
|
||||||
void removeSelected();
|
|
||||||
public:
|
|
||||||
void onRegenerateDisplay() ;
|
|
||||||
boolean onEventInput( ewol::event::Input _event) ;
|
|
||||||
boolean onEventEntry( ewol::event::Entry _event) ;
|
|
||||||
void onEventClipboard(enum gale::context::clipBoard::clipboardListe _clipboardID) ;
|
|
||||||
void calculateMinMaxSize() ;
|
|
||||||
protected:
|
|
||||||
void onDraw() ;
|
|
||||||
void onGetFocus() ;
|
|
||||||
void onLostFocus() ;
|
|
||||||
void changeStatusIn(int _newStatusId);
|
|
||||||
protected:
|
|
||||||
esignal::Connection this.PCH; //!< Periodic call handle to remove it when needed
|
|
||||||
/**
|
|
||||||
* Periodic call to update grapgic display
|
|
||||||
* @param _event Time generic event
|
|
||||||
*/
|
|
||||||
void periodicCall( ewol::event::Time _event);
|
|
||||||
private: // callback functions
|
|
||||||
void onCallbackShortCut( String _value);
|
|
||||||
void onCallbackEntryClean();
|
|
||||||
void onCallbackCut();
|
|
||||||
void onCallbackCopy();
|
|
||||||
void onCallbackPaste();
|
|
||||||
void onCallbackSelect(boolean _all);
|
|
||||||
protected:
|
|
||||||
void onChangePropertyPassword();
|
|
||||||
void onChangePropertyShaper();
|
|
||||||
void onChangePropertyValue();
|
|
||||||
void onChangePropertyMaxCharacter();
|
|
||||||
void onChangePropertyRegex();
|
|
||||||
void onChangePropertyTextWhenNothing();
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
@ -8,15 +8,13 @@ precision mediump int;
|
|||||||
// Input :
|
// Input :
|
||||||
layout (location = 0) in vec3 in_position;
|
layout (location = 0) in vec3 in_position;
|
||||||
layout (location = 3) in vec4 in_colors;
|
layout (location = 3) in vec4 in_colors;
|
||||||
uniform mat4 in_MatrixTransformation;
|
uniform mat4 in_matrixTransformation;
|
||||||
uniform mat4 in_MatrixPosition;
|
uniform mat4 in_matrixProjection;
|
||||||
|
uniform mat4 in_matrixView;
|
||||||
// output :
|
// output :
|
||||||
varying vec4 io_color;
|
varying vec4 io_color;
|
||||||
|
|
||||||
void main(void) {
|
void main(void) {
|
||||||
gl_Position = in_MatrixTransformation * in_MatrixPosition * vec4(in_position, 1.0);
|
gl_Position = in_matrixProjection * in_matrixView * in_matrixTransformation * vec4(in_position, 1.0);
|
||||||
gl_Position = in_MatrixTransformation * vec4(in_position, 1.0);
|
|
||||||
//gl_Position = vec4(in_position, 1.0);
|
|
||||||
io_color = in_colors;
|
io_color = in_colors;
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,9 @@ precision mediump int;
|
|||||||
layout (location = 0) in vec3 in_position;
|
layout (location = 0) in vec3 in_position;
|
||||||
layout (location = 1) in vec2 in_textureCoords;
|
layout (location = 1) in vec2 in_textureCoords;
|
||||||
layout (location = 3) in vec4 in_colors;
|
layout (location = 3) in vec4 in_colors;
|
||||||
uniform mat4 in_MatrixTransformation;
|
uniform mat4 in_matrixTransformation;
|
||||||
|
uniform mat4 in_matrixProjection;
|
||||||
|
uniform mat4 in_matrixView;
|
||||||
|
|
||||||
// output :
|
// output :
|
||||||
varying vec4 io_color;
|
varying vec4 io_color;
|
||||||
@ -26,8 +28,7 @@ void main(void) {
|
|||||||
*/
|
*/
|
||||||
varying vec4 io_patern;
|
varying vec4 io_patern;
|
||||||
void main(void) {
|
void main(void) {
|
||||||
gl_Position = in_MatrixTransformation * vec4(in_position, 1.0);
|
gl_Position = in_matrixProjection * in_matrixView * in_matrixTransformation * vec4(in_position, 1.0);
|
||||||
//gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * vec4(in_coord2d, 0.0, 1.0);
|
|
||||||
// set output color :
|
// set output color :
|
||||||
io_color = in_colors;
|
io_color = in_colors;
|
||||||
if (in_textureCoords.x<1.0) {
|
if (in_textureCoords.x<1.0) {
|
||||||
|
@ -1,7 +1,4 @@
|
|||||||
{
|
{
|
||||||
mode:2,
|
|
||||||
display-outside:false,
|
|
||||||
|
|
||||||
padding-out-left:1,
|
padding-out-left:1,
|
||||||
padding-out-right:1,
|
padding-out-right:1,
|
||||||
padding-out-top:1,
|
padding-out-top:1,
|
||||||
@ -17,7 +14,6 @@
|
|||||||
padding-in-top:1,
|
padding-in-top:1,
|
||||||
padding-in-buttom:1,
|
padding-in-buttom:1,
|
||||||
|
|
||||||
change-time:356,
|
object-file:"THEME:///Button.obj?lib=ewol",
|
||||||
program:"THEME_GUI:///Button.prog?lib=ewol",
|
object-size:"1,1,1"
|
||||||
color:"THEME_COLOR:///Button.json?lib=ewol"
|
|
||||||
}
|
}
|
||||||
|
BIN
resources/resources/ewol/theme/shape/Entry.blend
Normal file
BIN
resources/resources/ewol/theme/shape/Entry.blend
Normal file
Binary file not shown.
BIN
resources/resources/ewol/theme/shape/Entry.blend1
Normal file
BIN
resources/resources/ewol/theme/shape/Entry.blend1
Normal file
Binary file not shown.
2
resources/resources/ewol/theme/shape/Entry.emf
Normal file
2
resources/resources/ewol/theme/shape/Entry.emf
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
EMF(STRING)
|
||||||
|
# Blender v2.92.0 EMF File: 'Entry.blend'
|
@ -1,27 +0,0 @@
|
|||||||
#ifdef GL_ES
|
|
||||||
precision mediump float;
|
|
||||||
precision mediump int;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
uniform vec4 EW_background;
|
|
||||||
uniform vec4 EW_border;
|
|
||||||
|
|
||||||
|
|
||||||
// transmit from the vertex shader
|
|
||||||
varying vec2 v_position; // interpolated position ...
|
|
||||||
varying vec2 v_propPos;
|
|
||||||
varying vec4 v_colorTansition;
|
|
||||||
|
|
||||||
void main(void) {
|
|
||||||
// prevent origin moving ...
|
|
||||||
gl_FragColor = vec4(v_propPos.y, v_propPos.x, 1.0, 1.0);
|
|
||||||
if( v_propPos.x == 1.0
|
|
||||||
&& v_propPos.y == 1.0) {
|
|
||||||
gl_FragColor = v_colorTansition;
|
|
||||||
} else if ( v_propPos.x == 0.0
|
|
||||||
|| v_propPos.y == 0.0) {
|
|
||||||
gl_FragColor = EW_background;
|
|
||||||
} else {
|
|
||||||
gl_FragColor = EW_border;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,23 +1,25 @@
|
|||||||
{
|
{
|
||||||
mode:2,
|
# padding "outside" the object in pixel ==> prevent bad display
|
||||||
display-outside:false,
|
|
||||||
|
|
||||||
padding-out-left:2,
|
padding-out-left:2,
|
||||||
padding-out-right:2,
|
padding-out-right:2,
|
||||||
padding-out-top:2,
|
padding-out-top:2,
|
||||||
padding-out-buttom:2,
|
padding-out-buttom:2,
|
||||||
|
|
||||||
border-left:1,
|
# padding "inside" the object in piuxel ==> prevent bad display
|
||||||
border-right:1,
|
|
||||||
border-top:1,
|
|
||||||
border-buttom:1,
|
|
||||||
|
|
||||||
padding-in-left:2,
|
padding-in-left:2,
|
||||||
padding-in-right:2,
|
padding-in-right:2,
|
||||||
padding-in-top:2,
|
padding-in-top:2,
|
||||||
padding-in-buttom:2,
|
padding-in-buttom:2,
|
||||||
|
|
||||||
change-time:356,
|
# render program:
|
||||||
program:"THEME_GUI:///Entry.prog?lib=ewol",
|
program-vert:"THEME:shape/aaRenderShape.vert?lib=ewol",
|
||||||
color:"THEME_COLOR:///Entry.json?lib=ewol"
|
program-frag:"THEME:shape/aaRenderShape.frag?lib=ewol",
|
||||||
|
|
||||||
|
# Object to render (with modification)
|
||||||
|
object-file:"THEME:shape/Entry.obj?lib=ewol",
|
||||||
|
|
||||||
|
# Theme Image (pallete)
|
||||||
|
image-palette:"THEME:shape/GuiPaletteColor.png?lib=ewol",
|
||||||
|
# read mode: 'nearest', 'linear'
|
||||||
|
image-palette-load-mode: "nearest",
|
||||||
}
|
}
|
||||||
|
24
resources/resources/ewol/theme/shape/Entry.mtl
Normal file
24
resources/resources/ewol/theme/shape/Entry.mtl
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# Blender MTL File: 'Entry.blend'
|
||||||
|
# Material Count: 2
|
||||||
|
|
||||||
|
newmtl TextArea
|
||||||
|
Ns 225.000000
|
||||||
|
Ka 1.000000 1.000000 1.000000
|
||||||
|
Kd 0.800000 0.800000 0.800000
|
||||||
|
Ks 0.500000 0.500000 0.500000
|
||||||
|
Ke 0.000000 0.000000 0.000000
|
||||||
|
Ni 1.450000
|
||||||
|
d 1.000000
|
||||||
|
illum 2
|
||||||
|
map_Kd empty_area.png
|
||||||
|
|
||||||
|
newmtl center
|
||||||
|
Ns 225.000000
|
||||||
|
Ka 1.000000 1.000000 1.000000
|
||||||
|
Kd 0.800000 0.800000 0.800000
|
||||||
|
Ks 0.500000 0.500000 0.500000
|
||||||
|
Ke 0.000000 0.000000 0.000000
|
||||||
|
Ni 1.450000
|
||||||
|
d 1.000000
|
||||||
|
illum 2
|
||||||
|
map_Kd GuiPaletteColor.png
|
99
resources/resources/ewol/theme/shape/Entry.obj
Normal file
99
resources/resources/ewol/theme/shape/Entry.obj
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
# Blender v2.92.0 OBJ File: 'Entry.blend'
|
||||||
|
# www.blender.org
|
||||||
|
mtllib Entry.mtl
|
||||||
|
o Cube
|
||||||
|
v 20.042355 20.042355 -7.751226
|
||||||
|
v 20.042355 -20.042355 -7.751226
|
||||||
|
v 20.042355 20.042355 4.633502
|
||||||
|
v 20.042355 -20.042355 4.633502
|
||||||
|
v -20.042355 20.042355 -7.751226
|
||||||
|
v -20.042355 -20.042355 -7.751226
|
||||||
|
v -20.042355 20.042355 4.633502
|
||||||
|
v -20.042355 -20.042355 4.633502
|
||||||
|
v 10.127714 10.127714 7.726907
|
||||||
|
v 10.127714 -10.127714 7.726907
|
||||||
|
v -10.127714 10.127714 7.726907
|
||||||
|
v -10.127714 -10.127714 7.726907
|
||||||
|
v -10.127714 -10.127714 9.146553
|
||||||
|
v -10.127714 10.127714 9.146553
|
||||||
|
v 10.127714 10.127714 9.146553
|
||||||
|
v 10.127714 -10.127714 9.146553
|
||||||
|
vt 0.174907 0.947863
|
||||||
|
vt 0.131613 0.991157
|
||||||
|
vt 0.132843 0.945402
|
||||||
|
vt 0.074219 0.995849
|
||||||
|
vt 0.120606 0.943115
|
||||||
|
vt 0.121582 0.993408
|
||||||
|
vt 0.178368 0.944941
|
||||||
|
vt 0.137534 0.984544
|
||||||
|
vt 0.142456 0.948632
|
||||||
|
vt 0.171985 0.949093
|
||||||
|
vt 0.136074 0.991157
|
||||||
|
vt 0.137304 0.950323
|
||||||
|
vt 0.174677 0.949093
|
||||||
|
vt 0.135074 0.992387
|
||||||
|
vt 0.136304 0.949093
|
||||||
|
vt 0.112927 0.992387
|
||||||
|
vt 0.078245 0.948093
|
||||||
|
vt 0.073324 0.991157
|
||||||
|
vt 0.101769 0.970961
|
||||||
|
vt 0.080974 0.959440
|
||||||
|
vt 0.102023 0.957458
|
||||||
|
vt 0.111927 0.985005
|
||||||
|
vt 0.078476 0.953015
|
||||||
|
vt 0.082167 0.983774
|
||||||
|
vt 0.137534 0.988235
|
||||||
|
vt 0.177138 0.947863
|
||||||
|
vt 0.135074 0.947862
|
||||||
|
vt 0.013265 0.951784
|
||||||
|
vt 0.051868 0.992387
|
||||||
|
vt 0.013034 0.993618
|
||||||
|
vt 0.178598 0.993618
|
||||||
|
vt 0.074219 0.944092
|
||||||
|
vt 0.178368 0.988235
|
||||||
|
vt 0.173216 0.991157
|
||||||
|
vt 0.175907 0.989926
|
||||||
|
vt 0.111696 0.944402
|
||||||
|
vt 0.080720 0.975385
|
||||||
|
vt 0.113157 0.949323
|
||||||
|
vt 0.172446 0.988465
|
||||||
|
vt 0.054098 0.951784
|
||||||
|
vt 0.000100 0.000100
|
||||||
|
vt 0.999900 0.999900
|
||||||
|
vt 0.000100 0.999900
|
||||||
|
vt 0.999900 0.000100
|
||||||
|
vn 0.0000 1.0000 0.0000
|
||||||
|
vn -0.2978 0.0000 0.9546
|
||||||
|
vn -1.0000 0.0000 0.0000
|
||||||
|
vn 0.0000 -1.0000 0.0000
|
||||||
|
vn 1.0000 0.0000 0.0000
|
||||||
|
vn 0.0000 -0.2978 0.9546
|
||||||
|
vn 0.0000 0.2978 0.9546
|
||||||
|
vn 0.2978 0.0000 0.9546
|
||||||
|
vn 0.0000 0.0000 -1.0000
|
||||||
|
vn 0.0000 0.0000 1.0000
|
||||||
|
usemtl center
|
||||||
|
s off
|
||||||
|
f 5/1/1 3/2/1 1/3/1
|
||||||
|
f 8/4/2 11/5/2 7/6/2
|
||||||
|
f 7/7/3 6/8/3 8/9/3
|
||||||
|
f 2/10/4 8/11/4 6/12/4
|
||||||
|
f 1/13/5 4/14/5 2/15/5
|
||||||
|
f 4/16/6 12/17/6 8/18/6
|
||||||
|
f 7/19/7 9/20/7 3/21/7
|
||||||
|
f 3/22/8 10/23/8 4/24/8
|
||||||
|
f 6/25/9 1/26/9 2/27/9
|
||||||
|
f 10/28/10 11/29/10 12/30/10
|
||||||
|
f 5/1/1 7/31/1 3/2/1
|
||||||
|
f 8/4/2 12/32/2 11/5/2
|
||||||
|
f 7/7/3 5/33/3 6/8/3
|
||||||
|
f 2/10/4 4/34/4 8/11/4
|
||||||
|
f 1/13/5 3/35/5 4/14/5
|
||||||
|
f 4/16/6 10/36/6 12/17/6
|
||||||
|
f 7/19/7 11/37/7 9/20/7
|
||||||
|
f 3/22/8 9/38/8 10/23/8
|
||||||
|
f 6/25/9 5/39/9 1/26/9
|
||||||
|
f 10/28/10 9/40/10 11/29/10
|
||||||
|
usemtl TextArea
|
||||||
|
f 15/41/10 13/42/10 16/43/10
|
||||||
|
f 15/41/10 14/44/10 13/42/10
|
@ -1,50 +0,0 @@
|
|||||||
#ifdef GL_ES
|
|
||||||
precision mediump float;
|
|
||||||
precision mediump int;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct widgetStateProperty {
|
|
||||||
int stateOld;
|
|
||||||
int stateNew;
|
|
||||||
float transition;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Input :
|
|
||||||
attribute vec2 EW_coord2d;
|
|
||||||
attribute vec2 EW_widgetPropertyPos;
|
|
||||||
uniform mat4 EW_MatrixTransformation;
|
|
||||||
uniform widgetStateProperty EW_status;
|
|
||||||
uniform vec4 EW_foreground;
|
|
||||||
uniform vec4 EW_foregroundSelected;
|
|
||||||
uniform vec4 EW_foregroundHover;
|
|
||||||
|
|
||||||
// output :
|
|
||||||
varying vec2 v_position; // This will be passed into the fragment shader.
|
|
||||||
varying vec2 v_propPos;
|
|
||||||
varying vec4 v_colorTansition;
|
|
||||||
|
|
||||||
void main(void) {
|
|
||||||
|
|
||||||
gl_Position = EW_MatrixTransformation * vec4(EW_coord2d, 0.0, 1.0);
|
|
||||||
// transmit position of the curent element (intermolated ...)
|
|
||||||
v_position = EW_coord2d;
|
|
||||||
v_propPos = EW_widgetPropertyPos;
|
|
||||||
|
|
||||||
|
|
||||||
vec4 colorOld = EW_foreground;
|
|
||||||
if(EW_status.stateOld==1) {
|
|
||||||
colorOld = EW_foregroundSelected;
|
|
||||||
} else if(EW_status.stateOld==2) {
|
|
||||||
colorOld = EW_foregroundHover;
|
|
||||||
}
|
|
||||||
vec4 colorNew = EW_foreground;
|
|
||||||
if(EW_status.stateNew==1) {
|
|
||||||
colorNew = EW_foregroundSelected;
|
|
||||||
} else if(EW_status.stateNew==2) {
|
|
||||||
colorNew = EW_foregroundHover;
|
|
||||||
}
|
|
||||||
|
|
||||||
// note : int() is needed for the OpenGL ES platform
|
|
||||||
v_colorTansition = colorOld*(1.0-EW_status.transition)
|
|
||||||
+ colorNew*EW_status.transition;
|
|
||||||
}
|
|
BIN
resources/resources/ewol/theme/shape/GuiPaletteColor.png
Normal file
BIN
resources/resources/ewol/theme/shape/GuiPaletteColor.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.6 KiB |
17
resources/resources/ewol/theme/shape/aaRenderShape.frag
Normal file
17
resources/resources/ewol/theme/shape/aaRenderShape.frag
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#version 400 core
|
||||||
|
|
||||||
|
#ifdef GL_ES
|
||||||
|
precision mediump float;
|
||||||
|
precision mediump int;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
in vec2 io_textureCoords;
|
||||||
|
|
||||||
|
uniform sampler2D in_textureBase;
|
||||||
|
|
||||||
|
// output:
|
||||||
|
out vec4 out_Color;
|
||||||
|
|
||||||
|
void main(void) {
|
||||||
|
out_Color = texture(in_textureBase, io_textureCoords);
|
||||||
|
}
|
22
resources/resources/ewol/theme/shape/aaRenderShape.vert
Normal file
22
resources/resources/ewol/theme/shape/aaRenderShape.vert
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#version 400 core
|
||||||
|
|
||||||
|
#ifdef GL_ES
|
||||||
|
precision mediump float;
|
||||||
|
precision mediump int;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Input:
|
||||||
|
layout (location = 0) in vec3 in_position;
|
||||||
|
layout (location = 1) in vec2 in_textureCoords;
|
||||||
|
|
||||||
|
uniform mat4 in_matrixTransformation;
|
||||||
|
uniform mat4 in_matrixProjection;
|
||||||
|
uniform mat4 in_matrixView;
|
||||||
|
|
||||||
|
// output:
|
||||||
|
out vec2 io_textureCoords;
|
||||||
|
|
||||||
|
void main(void) {
|
||||||
|
gl_Position = in_matrixProjection * in_matrixView * in_matrixTransformation * vec4(in_position, 1.0);
|
||||||
|
io_textureCoords = in_textureCoords;
|
||||||
|
}
|
BIN
resources/resources/ewol/theme/shape/empty_area.png
Normal file
BIN
resources/resources/ewol/theme/shape/empty_area.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 280 KiB |
BIN
resources/resources/ewol/theme/shape/pot.blend
Normal file
BIN
resources/resources/ewol/theme/shape/pot.blend
Normal file
Binary file not shown.
BIN
resources/resources/ewol/theme/shape/pot.blend1
Normal file
BIN
resources/resources/ewol/theme/shape/pot.blend1
Normal file
Binary file not shown.
80
samples/src/sample/atriasoft/ewol/ComplexWindiows1/Appl.java
Normal file
80
samples/src/sample/atriasoft/ewol/ComplexWindiows1/Appl.java
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
package sample.atriasoft.ewol.ComplexWindiows1;
|
||||||
|
|
||||||
|
import org.atriasoft.etk.Configs;
|
||||||
|
import org.atriasoft.etk.math.Vector2f;
|
||||||
|
import org.atriasoft.ewol.context.EwolApplication;
|
||||||
|
import org.atriasoft.ewol.context.EwolContext;
|
||||||
|
|
||||||
|
public class Appl implements EwolApplication {
|
||||||
|
|
||||||
|
//! [ewol_sample_HW_main_application]
|
||||||
|
private void localCreate(final EwolContext context) {
|
||||||
|
//! [ewol_sample_HW_main_parse_arguments]
|
||||||
|
// parse all the argument of the application
|
||||||
|
for (int iii = 0; iii < context.getCmd().size(); iii++) {
|
||||||
|
String tmpppp = context.getCmd().get(iii);
|
||||||
|
if (tmpppp == "-h" || tmpppp == "--help") {
|
||||||
|
Log.print(" -h/--help display this help");
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//! [ewol_sample_HW_main_parse_arguments]
|
||||||
|
//! [ewol_sample_HW_main_set_windows_size]
|
||||||
|
// TODO : Remove this: Move if in the windows properties
|
||||||
|
context.setSize(new Vector2f(800, 600));
|
||||||
|
//! [ewol_sample_HW_main_set_windows_size]
|
||||||
|
//! [ewol_sample_HW_main_set_font_property]
|
||||||
|
// select font preference of der with a basic application size
|
||||||
|
Configs.getConfigFonts().set("FreeSherif", 12);
|
||||||
|
//! [ewol_sample_HW_main_set_font_property]
|
||||||
|
//! [ewol_sample_HW_main_set_windows]
|
||||||
|
// Create the windows
|
||||||
|
MainWindows basicWindows = new MainWindows();
|
||||||
|
// configure the ewol context to use the new windows
|
||||||
|
context.setWindows(basicWindows);
|
||||||
|
//! [ewol_sample_HW_main_set_windows]
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(final EwolContext context) {
|
||||||
|
Log.info("Application onCreate: [BEGIN]");
|
||||||
|
localCreate(context);
|
||||||
|
Log.info("Application onCreate: [ END ]");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy(final EwolContext context) {
|
||||||
|
Log.info("Application onDestroy: [BEGIN]");
|
||||||
|
|
||||||
|
Log.info("Application onDestroy: [ END ]");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPause(final EwolContext context) {
|
||||||
|
Log.info("Application onPause: [BEGIN]");
|
||||||
|
|
||||||
|
Log.info("Application onPause: [ END ]");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume(final EwolContext context) {
|
||||||
|
Log.info("Application onResume: [BEGIN]");
|
||||||
|
|
||||||
|
Log.info("Application onResume: [ END ]");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStart(final EwolContext context) {
|
||||||
|
Log.info("Application onStart: [BEGIN]");
|
||||||
|
|
||||||
|
Log.info("Application onStart: [ END ]");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStop(final EwolContext context) {
|
||||||
|
Log.info("Application onStop: [BEGIN]");
|
||||||
|
|
||||||
|
Log.info("Application onStop: [ END ]");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
package sample.atriasoft.ewol.ComplexWindiows1;
|
||||||
|
|
||||||
|
import org.atriasoft.etk.Uri;
|
||||||
|
import org.atriasoft.ewol.Ewol;
|
||||||
|
|
||||||
|
public class ComplexeWindows1Main {
|
||||||
|
public static void main(final String[] args) {
|
||||||
|
Ewol.init();
|
||||||
|
//Uri.addLibrary("ne", MainCollisionTest.class, "testDataLoxelEngine/");
|
||||||
|
Uri.setApplication(ComplexeWindows1Main.class);
|
||||||
|
Ewol.run(new Appl(), args);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ComplexeWindows1Main() {}
|
||||||
|
}
|
39
samples/src/sample/atriasoft/ewol/ComplexWindiows1/Log.java
Normal file
39
samples/src/sample/atriasoft/ewol/ComplexWindiows1/Log.java
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
package sample.atriasoft.ewol.ComplexWindiows1;
|
||||||
|
|
||||||
|
public class Log {
|
||||||
|
private static final String LIBNAME = "LoxelEngine";
|
||||||
|
|
||||||
|
public static void critical(final String data) {
|
||||||
|
System.out.println("[C] " + Log.LIBNAME + " | " + data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void debug(final String data) {
|
||||||
|
System.out.println("[D] " + Log.LIBNAME + " | " + data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void error(final String data) {
|
||||||
|
System.out.println("[E] " + Log.LIBNAME + " | " + data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void info(final String data) {
|
||||||
|
System.out.println("[I] " + Log.LIBNAME + " | " + data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void print(final String data) {
|
||||||
|
System.out.println(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void todo(final String data) {
|
||||||
|
System.out.println("[TODO] " + Log.LIBNAME + " | " + data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void verbose(final String data) {
|
||||||
|
System.out.println("[V] " + Log.LIBNAME + " | " + data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void warning(final String data) {
|
||||||
|
System.out.println("[W] " + Log.LIBNAME + " | " + data);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Log() {}
|
||||||
|
}
|
@ -0,0 +1,71 @@
|
|||||||
|
package sample.atriasoft.ewol.ComplexWindiows1;
|
||||||
|
|
||||||
|
import org.atriasoft.etk.Color;
|
||||||
|
import org.atriasoft.etk.Dimension;
|
||||||
|
import org.atriasoft.etk.Distance;
|
||||||
|
import org.atriasoft.etk.math.Vector2b;
|
||||||
|
import org.atriasoft.etk.math.Vector2f;
|
||||||
|
import org.atriasoft.ewol.widget.Sizer;
|
||||||
|
import org.atriasoft.ewol.widget.Sizer.DisplayMode;
|
||||||
|
import org.atriasoft.ewol.widget.Spacer;
|
||||||
|
import org.atriasoft.ewol.widget.Windows;
|
||||||
|
|
||||||
|
public class MainWindows extends Windows {
|
||||||
|
|
||||||
|
public MainWindows() {
|
||||||
|
//! [ewol_sample_HW_windows_title]
|
||||||
|
setPropertyTitle("Simple sample test");
|
||||||
|
//EwolObject.getContext().getFontDefault().setName("FreeSans");
|
||||||
|
Sizer sizerMain = new Sizer(DisplayMode.modeVert);
|
||||||
|
sizerMain.setPropertyExpand(new Vector2b(true, true));
|
||||||
|
sizerMain.setPropertyFill(new Vector2b(true, true));
|
||||||
|
setSubWidget(sizerMain);
|
||||||
|
|
||||||
|
Sizer sizerHori1 = new Sizer(DisplayMode.modeHori);
|
||||||
|
sizerHori1.setPropertyExpand(new Vector2b(true, true));
|
||||||
|
sizerHori1.setPropertyFill(new Vector2b(true, true));
|
||||||
|
sizerMain.subWidgetAdd(sizerHori1);
|
||||||
|
|
||||||
|
Sizer sizerHori2 = new Sizer(DisplayMode.modeHori);
|
||||||
|
sizerHori2.setPropertyExpand(new Vector2b(true, true));
|
||||||
|
sizerHori2.setPropertyFill(new Vector2b(true, true));
|
||||||
|
sizerMain.subWidgetAdd(sizerHori2);
|
||||||
|
|
||||||
|
{
|
||||||
|
Spacer simpleSpacer = new Spacer();
|
||||||
|
simpleSpacer.setPropertyMinSize(new Dimension(new Vector2f(100, 100), Distance.PIXEL));
|
||||||
|
simpleSpacer.setPropertyColor(Color.ALICE_BLUE);
|
||||||
|
simpleSpacer.setPropertyExpand(new Vector2b(true, true));
|
||||||
|
simpleSpacer.setPropertyFill(new Vector2b(true, true));
|
||||||
|
sizerHori1.subWidgetAdd(simpleSpacer);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
Spacer simpleSpacer = new Spacer();
|
||||||
|
simpleSpacer.setPropertyColor(Color.DARK_GREEN);
|
||||||
|
simpleSpacer.setPropertyExpand(new Vector2b(true, true));
|
||||||
|
simpleSpacer.setPropertyFill(new Vector2b(true, true));
|
||||||
|
sizerHori1.subWidgetAdd(simpleSpacer);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
Spacer simpleSpacer = new Spacer();
|
||||||
|
simpleSpacer.setPropertyColor(Color.CHOCOLATE);
|
||||||
|
simpleSpacer.setPropertyExpand(new Vector2b(true, true));
|
||||||
|
simpleSpacer.setPropertyFill(new Vector2b(true, true));
|
||||||
|
sizerHori1.subWidgetAdd(simpleSpacer);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
Spacer simpleSpacer = new Spacer();
|
||||||
|
simpleSpacer.setPropertyColor(Color.GREEN_YELLOW);
|
||||||
|
simpleSpacer.setPropertyExpand(new Vector2b(true, true));
|
||||||
|
simpleSpacer.setPropertyFill(new Vector2b(true, true));
|
||||||
|
sizerHori2.subWidgetAdd(simpleSpacer);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
Spacer simpleSpacer = new Spacer();
|
||||||
|
simpleSpacer.setPropertyColor(Color.PINK);
|
||||||
|
simpleSpacer.setPropertyExpand(new Vector2b(true, true));
|
||||||
|
simpleSpacer.setPropertyFill(new Vector2b(true, true));
|
||||||
|
sizerHori2.subWidgetAdd(simpleSpacer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
80
samples/src/sample/atriasoft/ewol/sampleEntry/Appl.java
Normal file
80
samples/src/sample/atriasoft/ewol/sampleEntry/Appl.java
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
package sample.atriasoft.ewol.sampleEntry;
|
||||||
|
|
||||||
|
import org.atriasoft.etk.Configs;
|
||||||
|
import org.atriasoft.etk.math.Vector2f;
|
||||||
|
import org.atriasoft.ewol.context.EwolApplication;
|
||||||
|
import org.atriasoft.ewol.context.EwolContext;
|
||||||
|
|
||||||
|
public class Appl implements EwolApplication {
|
||||||
|
|
||||||
|
//! [ewol_sample_HW_main_application]
|
||||||
|
private void localCreate(final EwolContext context) {
|
||||||
|
//! [ewol_sample_HW_main_parse_arguments]
|
||||||
|
// parse all the argument of the application
|
||||||
|
for (int iii = 0; iii < context.getCmd().size(); iii++) {
|
||||||
|
String tmpppp = context.getCmd().get(iii);
|
||||||
|
if (tmpppp == "-h" || tmpppp == "--help") {
|
||||||
|
Log.print(" -h/--help display this help");
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//! [ewol_sample_HW_main_parse_arguments]
|
||||||
|
//! [ewol_sample_HW_main_set_windows_size]
|
||||||
|
// TODO : Remove this: Move if in the windows properties
|
||||||
|
context.setSize(new Vector2f(800, 600));
|
||||||
|
//! [ewol_sample_HW_main_set_windows_size]
|
||||||
|
//! [ewol_sample_HW_main_set_font_property]
|
||||||
|
// select font preference of der with a basic application size
|
||||||
|
Configs.getConfigFonts().set("FreeSherif", 48);
|
||||||
|
//! [ewol_sample_HW_main_set_font_property]
|
||||||
|
//! [ewol_sample_HW_main_set_windows]
|
||||||
|
// Create the windows
|
||||||
|
MainWindows basicWindows = new MainWindows();
|
||||||
|
// configure the ewol context to use the new windows
|
||||||
|
context.setWindows(basicWindows);
|
||||||
|
//! [ewol_sample_HW_main_set_windows]
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(final EwolContext context) {
|
||||||
|
Log.info("Application onCreate: [BEGIN]");
|
||||||
|
localCreate(context);
|
||||||
|
Log.info("Application onCreate: [ END ]");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy(final EwolContext context) {
|
||||||
|
Log.info("Application onDestroy: [BEGIN]");
|
||||||
|
|
||||||
|
Log.info("Application onDestroy: [ END ]");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPause(final EwolContext context) {
|
||||||
|
Log.info("Application onPause: [BEGIN]");
|
||||||
|
|
||||||
|
Log.info("Application onPause: [ END ]");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume(final EwolContext context) {
|
||||||
|
Log.info("Application onResume: [BEGIN]");
|
||||||
|
|
||||||
|
Log.info("Application onResume: [ END ]");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStart(final EwolContext context) {
|
||||||
|
Log.info("Application onStart: [BEGIN]");
|
||||||
|
|
||||||
|
Log.info("Application onStart: [ END ]");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStop(final EwolContext context) {
|
||||||
|
Log.info("Application onStop: [BEGIN]");
|
||||||
|
|
||||||
|
Log.info("Application onStop: [ END ]");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
39
samples/src/sample/atriasoft/ewol/sampleEntry/Log.java
Normal file
39
samples/src/sample/atriasoft/ewol/sampleEntry/Log.java
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
package sample.atriasoft.ewol.sampleEntry;
|
||||||
|
|
||||||
|
public class Log {
|
||||||
|
private static final String LIBNAME = "sampleEntry";
|
||||||
|
|
||||||
|
public static void critical(final String data) {
|
||||||
|
System.out.println("[C] " + Log.LIBNAME + " | " + data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void debug(final String data) {
|
||||||
|
System.out.println("[D] " + Log.LIBNAME + " | " + data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void error(final String data) {
|
||||||
|
System.out.println("[E] " + Log.LIBNAME + " | " + data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void info(final String data) {
|
||||||
|
System.out.println("[I] " + Log.LIBNAME + " | " + data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void print(final String data) {
|
||||||
|
System.out.println(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void todo(final String data) {
|
||||||
|
System.out.println("[TODO] " + Log.LIBNAME + " | " + data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void verbose(final String data) {
|
||||||
|
System.out.println("[V] " + Log.LIBNAME + " | " + data);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void warning(final String data) {
|
||||||
|
System.out.println("[W] " + Log.LIBNAME + " | " + data);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Log() {}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package sample.atriasoft.ewol.sampleEntry;
|
||||||
|
|
||||||
|
import org.atriasoft.etk.math.Vector2b;
|
||||||
|
import org.atriasoft.ewol.widget.Entry;
|
||||||
|
import org.atriasoft.ewol.widget.Windows;
|
||||||
|
|
||||||
|
public class MainWindows extends Windows {
|
||||||
|
|
||||||
|
public MainWindows() {
|
||||||
|
setPropertyTitle("Simple sample test");
|
||||||
|
//EwolObject.getContext().getFontDefault().setName("FreeSans");
|
||||||
|
Entry simpleEntry = new Entry();
|
||||||
|
simpleEntry.setPropertyExpand(new Vector2b(true, true));
|
||||||
|
simpleEntry.setPropertyFill(new Vector2b(true, false));
|
||||||
|
setSubWidget(simpleEntry);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
package sample.atriasoft.ewol.sampleEntry;
|
||||||
|
|
||||||
|
import org.atriasoft.etk.Uri;
|
||||||
|
import org.atriasoft.ewol.Ewol;
|
||||||
|
|
||||||
|
public class SampleEntryMain {
|
||||||
|
public static void main(final String[] args) {
|
||||||
|
Ewol.init();
|
||||||
|
//Uri.addLibrary("ne", MainCollisionTest.class, "testDataLoxelEngine/");
|
||||||
|
Uri.setApplication(MainWindows.class);
|
||||||
|
Ewol.run(new Appl(), args);
|
||||||
|
}
|
||||||
|
|
||||||
|
private SampleEntryMain() {}
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
package sample.atriasoft.ewol.simpleWindowsWithImage;
|
package sample.atriasoft.ewol.simpleWindowsWithImage;
|
||||||
|
|
||||||
|
import org.atriasoft.etk.Configs;
|
||||||
import org.atriasoft.etk.math.Vector2f;
|
import org.atriasoft.etk.math.Vector2f;
|
||||||
import org.atriasoft.ewol.context.EwolApplication;
|
import org.atriasoft.ewol.context.EwolApplication;
|
||||||
import org.atriasoft.ewol.context.EwolContext;
|
import org.atriasoft.ewol.context.EwolContext;
|
||||||
@ -24,7 +25,7 @@ public class Appl implements EwolApplication {
|
|||||||
//! [ewol_sample_HW_main_set_windows_size]
|
//! [ewol_sample_HW_main_set_windows_size]
|
||||||
//! [ewol_sample_HW_main_set_font_property]
|
//! [ewol_sample_HW_main_set_font_property]
|
||||||
// select font preference of der with a basic application size
|
// select font preference of der with a basic application size
|
||||||
context.getFontDefault().set("FreeSherif", 12);
|
Configs.getConfigFonts().set("FreeSherif", 12);
|
||||||
//! [ewol_sample_HW_main_set_font_property]
|
//! [ewol_sample_HW_main_set_font_property]
|
||||||
//! [ewol_sample_HW_main_set_windows]
|
//! [ewol_sample_HW_main_set_windows]
|
||||||
// Create the windows
|
// Create the windows
|
||||||
|
@ -26,4 +26,6 @@ open module org.atriasoft.ewol {
|
|||||||
requires transitive org.atriasoft.exml;
|
requires transitive org.atriasoft.exml;
|
||||||
requires transitive org.atriasoft.ejson;
|
requires transitive org.atriasoft.ejson;
|
||||||
requires transitive io.scenarium.logger;
|
requires transitive io.scenarium.logger;
|
||||||
|
requires org.atriasoft.loader3d;
|
||||||
|
requires org.atriasoft.egami;
|
||||||
}
|
}
|
||||||
|
@ -2,4 +2,9 @@ package org.atriasoft.esignal;
|
|||||||
|
|
||||||
public class Connection {
|
public class Connection {
|
||||||
|
|
||||||
|
public void disconnect() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -7,8 +7,8 @@ import java.util.List;
|
|||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
class ConnectedElement<T> {
|
class ConnectedElement<T> {
|
||||||
private final WeakReference<Object> reference;
|
|
||||||
private final Consumer<T> consumer;
|
private final Consumer<T> consumer;
|
||||||
|
private final WeakReference<Object> reference;
|
||||||
|
|
||||||
public ConnectedElement(final WeakReference<Object> reference, final Consumer<T> consumer) {
|
public ConnectedElement(final WeakReference<Object> reference, final Consumer<T> consumer) {
|
||||||
this.reference = reference;
|
this.reference = reference;
|
||||||
|
@ -8,30 +8,41 @@ package org.atriasoft.ewol;
|
|||||||
/**
|
/**
|
||||||
* @breif Simple class to abstarct the padding porperty.
|
* @breif Simple class to abstarct the padding porperty.
|
||||||
*/
|
*/
|
||||||
public class Padding {
|
@SuppressWarnings("preview")
|
||||||
private float xLeft;
|
public record Padding(
|
||||||
private float xRight;
|
float left,
|
||||||
private float yBottom; // !< this represent the 4 padding value Left top right buttom (like css)
|
float top,
|
||||||
private float yTop;
|
float right,
|
||||||
|
float bottom // !< this represent the 4 padding value Left top right buttom (like css)
|
||||||
|
) {
|
||||||
|
|
||||||
|
public static final Padding ZERO = new Padding(0, 0, 0, 0);
|
||||||
|
|
||||||
public Padding() {
|
public Padding() {
|
||||||
setValue();
|
this(0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Padding(final float xLeft) {
|
public Padding(final float left) {
|
||||||
setValue(xLeft);
|
this(left, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Padding(final float xLeft, final float yt) {
|
public Padding(final float left, final float top) {
|
||||||
setValue(xLeft, yt);
|
this(left, top, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Padding(final float xLeft, final float yt, final float xr) {
|
public Padding(final float left, final float top, final float right) {
|
||||||
setValue(xLeft, yt, xr);
|
this(left, top, right, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Padding(final float xLeft, final float yt, final float xr, final float yb) {
|
public Padding(final float left, final float top, final float right, final float bottom) {
|
||||||
setValue(xLeft, yt, xr, yb);
|
this.left = left;
|
||||||
|
this.top = top;
|
||||||
|
this.right = right;
|
||||||
|
this.bottom = bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Padding(final double left, final double top, final double right, final double bottom) {
|
||||||
|
this((float) left, (float) top, (float) right, (float) bottom);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -39,95 +50,36 @@ public class Padding {
|
|||||||
* @param v The vector to add to this one
|
* @param v The vector to add to this one
|
||||||
*/
|
*/
|
||||||
public Padding add(final Padding v) {
|
public Padding add(final Padding v) {
|
||||||
this.xLeft += v.xLeft;
|
return new Padding(this.left + v.left, this.top + v.top, this.right + v.right, this.bottom + v.bottom);
|
||||||
this.yTop += v.yTop;
|
|
||||||
this.xRight += v.xRight;
|
|
||||||
this.yBottom += v.yBottom;
|
|
||||||
return this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ! @previous
|
public Padding withLeft(final float left) {
|
||||||
public Padding addNew(final Padding v) {
|
return new Padding(left, this.top, this.right, this.bottom);
|
||||||
return new Padding(this.xLeft + v.xLeft, this.yTop + v.yTop, this.xRight + v.xRight, this.yBottom + v.yBottom);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setValue() {
|
public Padding withRight(final float right) {
|
||||||
this.xLeft = 0;
|
return new Padding(this.left, this.top, right, this.bottom);
|
||||||
this.yTop = 0;
|
|
||||||
this.xRight = 0;
|
|
||||||
this.yBottom = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setValue(final float xLeft) {
|
public Padding withButtom(final float bottom) {
|
||||||
this.xLeft = xLeft;
|
return new Padding(this.left, this.top, this.right, bottom);
|
||||||
this.yTop = 0;
|
|
||||||
this.xRight = 0;
|
|
||||||
this.yBottom = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setValue(final float xLeft, final float yt) {
|
public Padding withTop(final float top) {
|
||||||
this.xLeft = xLeft;
|
return new Padding(this.left, top, this.right, this.bottom);
|
||||||
this.yTop = yt;
|
|
||||||
this.xRight = 0;
|
|
||||||
this.yBottom = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setValue(final float xLeft, final float yt, final float xr) {
|
|
||||||
this.xLeft = xLeft;
|
|
||||||
this.yTop = yt;
|
|
||||||
this.xRight = xr;
|
|
||||||
this.yBottom = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setValue(final float xLeft, final float yt, final float xr, final float yb) {
|
|
||||||
this.xLeft = xLeft;
|
|
||||||
this.yTop = yt;
|
|
||||||
this.xRight = xr;
|
|
||||||
this.yBottom = yb;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setXLeft(final float val) {
|
|
||||||
this.xLeft = val;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setXRight(final float val) {
|
|
||||||
this.xRight = val;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setYButtom(final float val) {
|
|
||||||
this.yBottom = val;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setYTop(final float val) {
|
|
||||||
this.yTop = val;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "{" + xLeft() + "," + yTop() + "," + xRight() + "," + yButtom() + "}";
|
return "{" + left() + "," + top() + "," + right() + "," + bottom() + "}";
|
||||||
}
|
}
|
||||||
|
|
||||||
public float x() {
|
public float x() {
|
||||||
return this.xLeft + this.xRight;
|
return this.left + this.right;
|
||||||
}
|
|
||||||
|
|
||||||
public float xLeft() {
|
|
||||||
return this.xLeft;
|
|
||||||
}
|
|
||||||
|
|
||||||
public float xRight() {
|
|
||||||
return this.xRight;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public float y() {
|
public float y() {
|
||||||
return this.yTop + this.yBottom;
|
return this.top + this.bottom;
|
||||||
}
|
}
|
||||||
|
|
||||||
public float yButtom() {
|
|
||||||
return this.yBottom;
|
|
||||||
}
|
|
||||||
|
|
||||||
public float yTop() {
|
|
||||||
return this.yTop;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package org.atriasoft.ewol.annotation;
|
package org.atriasoft.ewol.annotation;
|
||||||
|
|
||||||
public @interface EwolSignal {
|
public @interface EwolSignal {
|
||||||
String[] name();
|
String description() default "";
|
||||||
|
|
||||||
|
String[] name();
|
||||||
}
|
}
|
||||||
|
@ -28,8 +28,11 @@ public class CompositingDrawing extends Compositing {
|
|||||||
private Vector3f clippingPosStop = new Vector3f(0, 0, 0); // !< Clipping stop position
|
private Vector3f clippingPosStop = new Vector3f(0, 0, 0); // !< Clipping stop position
|
||||||
private Color color = Color.BLACK; // !< The text foreground color
|
private Color color = Color.BLACK; // !< The text foreground color
|
||||||
private Color colorBg = Color.NONE; // !< The text background color
|
private Color colorBg = Color.NONE; // !< The text background color
|
||||||
private int oGLMatrix = -1; // !< openGL id on the element (transformation matrix)
|
//private int oGLMatrix = -1; // !< openGL id on the element (transformation matrix)
|
||||||
private int oGLMatrixPosition = -1; // !< position matrix
|
//private int oGLMatrixPosition = -1; // !< position matrix
|
||||||
|
private int oGLMatrixProjection = -1; //!< openGL id on the element (Projection matrix)
|
||||||
|
private int oGLMatrixTransformation = -1; //!< openGL id on the element (transformation matrix)
|
||||||
|
private int oGLMatrixView = -1; //!< openGL id on the element (view matrix)
|
||||||
private ResourceProgram oGLprogram; // !< pointer on the opengl display program
|
private ResourceProgram oGLprogram; // !< pointer on the opengl display program
|
||||||
private final List<Color> outColors = new ArrayList<>();
|
private final List<Color> outColors = new ArrayList<>();
|
||||||
private final List<Vector3f> outTriangles = new ArrayList<>();
|
private final List<Vector3f> outTriangles = new ArrayList<>();
|
||||||
@ -185,11 +188,13 @@ public class CompositingDrawing extends Compositing {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// set Matrix : translation/positionMatrix
|
// set Matrix : translation/positionMatrix
|
||||||
final Matrix4f tmpMatrix = OpenGL.getMatrix().multiply(this.matrixApply);
|
Matrix4f projMatrix = OpenGL.getMatrix();
|
||||||
|
Matrix4f camMatrix = OpenGL.getCameraMatrix();
|
||||||
this.oGLprogram.use();
|
this.oGLprogram.use();
|
||||||
this.vbo.bindForRendering();
|
this.vbo.bindForRendering();
|
||||||
this.oGLprogram.uniformMatrix(this.oGLMatrix, tmpMatrix);
|
this.oGLprogram.uniformMatrix(this.oGLMatrixProjection, projMatrix);
|
||||||
this.oGLprogram.uniformMatrix(this.oGLMatrixPosition, Matrix4f.IDENTITY);
|
this.oGLprogram.uniformMatrix(this.oGLMatrixTransformation, this.matrixApply);
|
||||||
|
this.oGLprogram.uniformMatrix(this.oGLMatrixView, camMatrix);
|
||||||
// Request the draw of the elements:
|
// Request the draw of the elements:
|
||||||
this.vbo.renderArrays(OpenGL.RenderMode.triangle);
|
this.vbo.renderArrays(OpenGL.RenderMode.triangle);
|
||||||
this.vbo.unBindForRendering();
|
this.vbo.unBindForRendering();
|
||||||
@ -257,18 +262,34 @@ public class CompositingDrawing extends Compositing {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void lineRel(final Vector2f vect) {
|
|
||||||
lineRel(new Vector3f(vect.x(), vect.y(), 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Relative drawing a line (spacial vector)
|
* Relative drawing a line (spacial vector)
|
||||||
* @param vect Vector of the curent line.
|
* @param vect Vector of the curent line.
|
||||||
*/
|
*/
|
||||||
|
public void lineRel(final float xxx, final float yyy) {
|
||||||
|
lineTo(this.position.add(new Vector3f(xxx, yyy, 0)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void lineRel(final float xxx, final float yyy, final float zzz) {
|
||||||
|
lineTo(this.position.add(new Vector3f(xxx, yyy, zzz)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void lineRel(final Vector2f vect) {
|
||||||
|
lineRel(new Vector3f(vect.x(), vect.y(), 0));
|
||||||
|
}
|
||||||
|
|
||||||
public void lineRel(final Vector3f vect) {
|
public void lineRel(final Vector3f vect) {
|
||||||
lineTo(this.position.add(vect));
|
lineTo(this.position.add(vect));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void lineTo(final float xxx, final float yyy) {
|
||||||
|
lineTo(new Vector3f(xxx, yyy, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void lineTo(final float xxx, final float yyy, final float zzz) {
|
||||||
|
lineTo(new Vector3f(xxx, yyy, zzz));
|
||||||
|
}
|
||||||
|
|
||||||
public void lineTo(final Vector2f dest) {
|
public void lineTo(final Vector2f dest) {
|
||||||
lineTo(new Vector3f(dest.x(), dest.y(), 0));
|
lineTo(new Vector3f(dest.x(), dest.y(), 0));
|
||||||
}
|
}
|
||||||
@ -323,11 +344,20 @@ public class CompositingDrawing extends Compositing {
|
|||||||
if (this.oGLprogram != null) {
|
if (this.oGLprogram != null) {
|
||||||
//this.oGLPosition = this.oGLprogram.getAttribute("in_coord3d");
|
//this.oGLPosition = this.oGLprogram.getAttribute("in_coord3d");
|
||||||
//this.oGLColor = this.oGLprogram.getAttribute("in_color");
|
//this.oGLColor = this.oGLprogram.getAttribute("in_color");
|
||||||
this.oGLMatrix = this.oGLprogram.getUniform("in_MatrixTransformation");
|
this.oGLMatrixTransformation = this.oGLprogram.getUniform("in_matrixTransformation");
|
||||||
this.oGLMatrixPosition = this.oGLprogram.getUniform("in_MatrixPosition");
|
this.oGLMatrixProjection = this.oGLprogram.getUniform("in_matrixProjection");
|
||||||
|
this.oGLMatrixView = this.oGLprogram.getUniform("in_matrixView");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void rectangle(final float xxx, final float yyy) {
|
||||||
|
rectangle(new Vector3f(xxx, yyy, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void rectangle(final float xxx, final float yyy, final float zzz) {
|
||||||
|
rectangle(new Vector3f(xxx, yyy, zzz));
|
||||||
|
}
|
||||||
|
|
||||||
public void rectangle(final Vector2f dest) {
|
public void rectangle(final Vector2f dest) {
|
||||||
rectangle(new Vector3f(dest.x(), dest.y(), 0));
|
rectangle(new Vector3f(dest.x(), dest.y(), 0));
|
||||||
}
|
}
|
||||||
@ -384,6 +414,14 @@ public class CompositingDrawing extends Compositing {
|
|||||||
setPoint(new Vector3f(dxA, dyD, 0));
|
setPoint(new Vector3f(dxA, dyD, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void rectangleWidth(final float xxx, final float yyy) {
|
||||||
|
rectangleWidth(new Vector3f(xxx, yyy, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void rectangleWidth(final float xxx, final float yyy, final float zzz) {
|
||||||
|
rectangleWidth(new Vector3f(xxx, yyy, zzz));
|
||||||
|
}
|
||||||
|
|
||||||
public void rectangleWidth(final Vector2f size) {
|
public void rectangleWidth(final Vector2f size) {
|
||||||
rectangleWidth(new Vector3f(size.x(), size.y(), 0));
|
rectangleWidth(new Vector3f(size.x(), size.y(), 0));
|
||||||
}
|
}
|
||||||
@ -472,26 +510,42 @@ public class CompositingDrawing extends Compositing {
|
|||||||
this.vbo.flush();
|
this.vbo.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setPos(final float xxx, final float yyy) {
|
||||||
|
setPos(new Vector3f(xxx, yyy, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPos(final float xxx, final float yyy, final float zzz) {
|
||||||
|
setPos(new Vector3f(xxx, yyy, zzz));
|
||||||
|
}
|
||||||
|
|
||||||
public void setPos(final Vector2f pos) {
|
public void setPos(final Vector2f pos) {
|
||||||
setPos(new Vector3f(pos.x(), pos.y(), 0));
|
setPos(new Vector3f(pos.x(), pos.y(), 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* set position for the next text writen
|
* set position for the next text written
|
||||||
* @param pos Position of the text (in 3D)
|
* @param pos Position of the text (in 3D)
|
||||||
*/
|
*/
|
||||||
public void setPos(final Vector3f pos) {
|
public void setPos(final Vector3f pos) {
|
||||||
this.position = pos;
|
this.position = pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRelPos(final Vector2f pos) {
|
public void setRelPos(final float xxx, final float yyy) {
|
||||||
setRelPos(new Vector3f(pos.x(), pos.y(), 0));
|
this.position = this.position.add(xxx, yyy, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* set relative position for the next text writen
|
* set relative position for the next text writen
|
||||||
* @param pos ofset apply of the text (in 3D)
|
* @param pos ofset apply of the text (in 3D)
|
||||||
*/
|
*/
|
||||||
|
public void setRelPos(final float xxx, final float yyy, final float zzz) {
|
||||||
|
this.position = this.position.add(xxx, yyy, zzz);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRelPos(final Vector2f pos) {
|
||||||
|
setRelPos(new Vector3f(pos.x(), pos.y(), 0));
|
||||||
|
}
|
||||||
|
|
||||||
public void setRelPos(final Vector3f pos) {
|
public void setRelPos(final Vector3f pos) {
|
||||||
this.position = this.position.add(pos);
|
this.position = this.position.add(pos);
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.atriasoft.ewol.compositing;
|
package org.atriasoft.ewol.compositing;
|
||||||
|
|
||||||
import org.atriasoft.egami.Image;
|
import org.atriasoft.egami.ImageByteRGBA;
|
||||||
import org.atriasoft.etk.Color;
|
import org.atriasoft.etk.Color;
|
||||||
import org.atriasoft.etk.Uri;
|
import org.atriasoft.etk.Uri;
|
||||||
import org.atriasoft.etk.math.FMath;
|
import org.atriasoft.etk.math.FMath;
|
||||||
@ -403,7 +403,7 @@ public class CompositingImage extends Compositing {
|
|||||||
this.position = this.position.add(pos);
|
this.position = this.position.add(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSource(final Image image) {
|
public void setSource(final ImageByteRGBA image) {
|
||||||
clear();
|
clear();
|
||||||
this.filename = null;
|
this.filename = null;
|
||||||
this.requestSize = image.getSize();
|
this.requestSize = image.getSize();
|
||||||
|
@ -10,11 +10,11 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.atriasoft.etk.Color;
|
import org.atriasoft.etk.Color;
|
||||||
|
import org.atriasoft.etk.Configs;
|
||||||
import org.atriasoft.etk.Uri;
|
import org.atriasoft.etk.Uri;
|
||||||
import org.atriasoft.etk.math.Matrix4f;
|
import org.atriasoft.etk.math.Matrix4f;
|
||||||
import org.atriasoft.etk.math.Vector2f;
|
import org.atriasoft.etk.math.Vector2f;
|
||||||
import org.atriasoft.etk.math.Vector3f;
|
import org.atriasoft.etk.math.Vector3f;
|
||||||
import org.atriasoft.ewol.Ewol;
|
|
||||||
import org.atriasoft.ewol.internal.Log;
|
import org.atriasoft.ewol.internal.Log;
|
||||||
import org.atriasoft.ewol.resource.ResourceTexturedFont;
|
import org.atriasoft.ewol.resource.ResourceTexturedFont;
|
||||||
import org.atriasoft.ewol.resource.font.FontMode;
|
import org.atriasoft.ewol.resource.font.FontMode;
|
||||||
@ -100,10 +100,13 @@ public class CompositingText extends TextBase {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// set Matrix : translation/positionMatrix
|
// set Matrix : translation/positionMatrix
|
||||||
final Matrix4f tmpMatrix = OpenGL.getMatrix().multiply(this.matrixApply);
|
final Matrix4f projMatrix = OpenGL.getMatrix();
|
||||||
|
final Matrix4f camMatrix = OpenGL.getCameraMatrix();
|
||||||
this.oGLprogram.use();
|
this.oGLprogram.use();
|
||||||
this.vbo.bindForRendering();
|
this.vbo.bindForRendering();
|
||||||
this.oGLprogram.uniformMatrix(this.oGLMatrix, tmpMatrix);
|
this.oGLprogram.uniformMatrix(this.oGLMatrixProjection, projMatrix);
|
||||||
|
this.oGLprogram.uniformMatrix(this.oGLMatrixTransformation, this.matrixApply);
|
||||||
|
this.oGLprogram.uniformMatrix(this.oGLMatrixView, camMatrix);
|
||||||
// Texture :
|
// Texture :
|
||||||
this.oGLprogram.setTexture0(this.oGLtexID, this.font.getRendererId());
|
this.oGLprogram.setTexture0(this.oGLtexID, this.font.getRendererId());
|
||||||
this.oGLprogram.uniformInt(this.oGLtextWidth, this.font.getOpenGlSize().x());
|
this.oGLprogram.uniformInt(this.oGLtextWidth, this.font.getOpenGlSize().x());
|
||||||
@ -136,10 +139,11 @@ public class CompositingText extends TextBase {
|
|||||||
// set Matrix : translation/positionMatrix
|
// set Matrix : translation/positionMatrix
|
||||||
final Matrix4f projMatrix = OpenGL.getMatrix();
|
final Matrix4f projMatrix = OpenGL.getMatrix();
|
||||||
final Matrix4f camMatrix = OpenGL.getCameraMatrix();
|
final Matrix4f camMatrix = OpenGL.getCameraMatrix();
|
||||||
final Matrix4f tmpMatrix = projMatrix.multiply(camMatrix).multiply(transformationMatrix);
|
|
||||||
this.oGLprogram.use();
|
this.oGLprogram.use();
|
||||||
this.vbo.bindForRendering();
|
this.vbo.bindForRendering();
|
||||||
this.oGLprogram.uniformMatrix(this.oGLMatrix, tmpMatrix);
|
this.oGLprogram.uniformMatrix(this.oGLMatrixProjection, projMatrix);
|
||||||
|
this.oGLprogram.uniformMatrix(this.oGLMatrixTransformation, transformationMatrix);
|
||||||
|
this.oGLprogram.uniformMatrix(this.oGLMatrixView, camMatrix);
|
||||||
// Texture:
|
// Texture:
|
||||||
this.oGLprogram.setTexture0(this.oGLtexID, this.font.getRendererId());
|
this.oGLprogram.setTexture0(this.oGLtexID, this.font.getRendererId());
|
||||||
this.oGLprogram.uniformInt(this.oGLtextWidth, this.font.getOpenGlSize().x());
|
this.oGLprogram.uniformInt(this.oGLtextWidth, this.font.getOpenGlSize().x());
|
||||||
@ -219,9 +223,9 @@ public class CompositingText extends TextBase {
|
|||||||
/*
|
/*
|
||||||
* Bitmap position xA xB yC *------* | | | | yD *------*
|
* Bitmap position xA xB yC *------* | | | | yD *------*
|
||||||
*/
|
*/
|
||||||
float dxA = this.position.x() /*+ myGlyphProperty.bearing.x()*/ + kerningOffset;
|
float dxA = this.position.x() + myGlyphProperty.getTextureRenderOffset().x() + kerningOffset;
|
||||||
float dxB = dxA + myGlyphProperty.sizeTexture.x();
|
float dxB = dxA + myGlyphProperty.sizeTexture.x();
|
||||||
float dyC = this.position.y() /*+ myGlyphProperty.bearing.y()*/ + fontHeigh - fontSize;
|
float dyC = this.position.y() + myGlyphProperty.getTextureRenderOffset().y() + fontHeigh - fontSize;
|
||||||
float dyD = dyC - myGlyphProperty.sizeTexture.y();
|
float dyD = dyC - myGlyphProperty.sizeTexture.y();
|
||||||
|
|
||||||
float tuA = myGlyphProperty.texturePosStart.x();
|
float tuA = myGlyphProperty.texturePosStart.x();
|
||||||
@ -346,12 +350,12 @@ public class CompositingText extends TextBase {
|
|||||||
// remove old one
|
// remove old one
|
||||||
final ResourceTexturedFont previousFont = this.font;
|
final ResourceTexturedFont previousFont = this.font;
|
||||||
if (fontSize <= 0) {
|
if (fontSize <= 0) {
|
||||||
fontSize = Ewol.getContext().getFontDefault().getSize();
|
fontSize = Configs.getConfigFonts().getSize();
|
||||||
}
|
}
|
||||||
if (fontName.isEmpty()) {
|
if (fontName.isEmpty()) {
|
||||||
fontName = Ewol.getContext().getFontDefault().getName();
|
fontName = Configs.getConfigFonts().getName();
|
||||||
}
|
}
|
||||||
Uri fontUri = Ewol.getContext().getFontDefault().getFontUri(fontName).clone();
|
Uri fontUri = Configs.getConfigFonts().getFontUri(fontName).clone();
|
||||||
fontUri.setproperty("size", Integer.toString(fontSize));
|
fontUri.setproperty("size", Integer.toString(fontSize));
|
||||||
Log.verbose("plop : " + fontName + " size=" + fontSize + " result :" + fontName);
|
Log.verbose("plop : " + fontName + " size=" + fontSize + " result :" + fontName);
|
||||||
// link to new one
|
// link to new one
|
||||||
|
440
src/org/atriasoft/ewol/compositing/GuiShape.java
Normal file
440
src/org/atriasoft/ewol/compositing/GuiShape.java
Normal file
@ -0,0 +1,440 @@
|
|||||||
|
package org.atriasoft.ewol.compositing;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.atriasoft.etk.Uri;
|
||||||
|
import org.atriasoft.etk.math.Matrix4f;
|
||||||
|
import org.atriasoft.etk.math.Vector2f;
|
||||||
|
import org.atriasoft.etk.math.Vector2i;
|
||||||
|
import org.atriasoft.etk.math.Vector3f;
|
||||||
|
import org.atriasoft.ewol.Padding;
|
||||||
|
import org.atriasoft.ewol.event.EventTime;
|
||||||
|
import org.atriasoft.ewol.internal.Log;
|
||||||
|
import org.atriasoft.ewol.resource.ResourceConfigFile;
|
||||||
|
import org.atriasoft.ewol.resource.ResourceTextureFile;
|
||||||
|
import org.atriasoft.ewol.resource.TextureFilter;
|
||||||
|
import org.atriasoft.gale.backend3d.OpenGL;
|
||||||
|
import org.atriasoft.gale.backend3d.OpenGL.Flag;
|
||||||
|
import org.atriasoft.gale.resource.ResourceProgram;
|
||||||
|
import org.atriasoft.loader3d.resources.ResourceStaticMeshObjBynamic;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief the Shaper system is a basic theme configuration for every widget, it corresponds at a background display described by a pool of files
|
||||||
|
*/
|
||||||
|
// TODO : load image
|
||||||
|
// TODO : Abstaraction between states (call by name and the system greate IDs
|
||||||
|
public class GuiShape extends Compositing {
|
||||||
|
private static final int SHAPER_POS_BOTTOM = 3;
|
||||||
|
private static final int SHAPER_POS_LEFT = 0;
|
||||||
|
private static final int SHAPER_POS_RIGHT = 2;
|
||||||
|
private static final int SHAPER_POS_TOP = 1;
|
||||||
|
private int confIdChangeTime = -1; //!< ConfigFile padding transition time property
|
||||||
|
private int confIdImagePaletteFile = -1; //!< Palette of the display
|
||||||
|
private int confIdImagePaletteMode = -1; //!< Mode to load the image file ... 'nearest', 'linear'
|
||||||
|
private final int[] confIdPaddingIn = new int[4]; //!< Padding in property : X-left X-right Y-top Y-buttom
|
||||||
|
private final int[] confIdPaddingOut = new int[4]; //!< Padding out property : X-left X-right Y-top Y-buttom
|
||||||
|
// External theme config:
|
||||||
|
private ResourceConfigFile config = null; //!< pointer on the config file resources
|
||||||
|
|
||||||
|
private int confObjectFile = -1; //!< Config Id of the object file to display
|
||||||
|
private int confProgramFileFrag = -1; //!< ConfigFile opengGl program Name
|
||||||
|
private int confProgramFileVert = -1; //!< ConfigFile opengGl program Name
|
||||||
|
private final List<Vector2i> listAssiciatedId = new ArrayList<>(); //!< Correlation ID between ColorProperty (Y) and OpenGL Program (X)
|
||||||
|
// internal needed data :
|
||||||
|
private int nextStatusRequested = -1; //!< when status is changing, this represent the next step of it
|
||||||
|
private int oGLMatrixProjection = -1; //!< openGL id on the element (Projection matrix)
|
||||||
|
private int oGLMatrixTransformation = -1; //!< openGL id on the element (transformation matrix)
|
||||||
|
private int oGLMatrixView = -1; //!< openGL id on the element (view matrix)
|
||||||
|
// openGL shaders programs:
|
||||||
|
private ResourceProgram oGLprogram = null; //!< pointer on the opengl display program
|
||||||
|
private int oGLtexID = -1; //!< openGL id on the element (texture image)
|
||||||
|
// For the Image :
|
||||||
|
private ResourceTextureFile resourceTexture = null; //!< texture resources (for the image)
|
||||||
|
private ResourceStaticMeshObjBynamic shape = null;
|
||||||
|
private Padding sizeObject = Padding.ZERO;
|
||||||
|
private int stateActivate = -1; //!< Activate state of the element
|
||||||
|
private final int stateNew = -1; //!< destination state
|
||||||
|
private final int stateOld = -1; //!< previous state
|
||||||
|
private final float stateTransition = 0; //!< working state between 2 states
|
||||||
|
private Matrix4f transform = Matrix4f.IDENTITY;
|
||||||
|
private Uri uri; //!< Name of the configuration of the shaper.
|
||||||
|
private float[] verticesToModify = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief generic constructor
|
||||||
|
* @param _uri URI of the file that might be loaded
|
||||||
|
*/
|
||||||
|
public GuiShape(final Uri uri) {
|
||||||
|
this.uri = uri;
|
||||||
|
for (int iii = 0; iii < 4; ++iii) {
|
||||||
|
this.confIdPaddingOut[iii] = -1;
|
||||||
|
this.confIdPaddingIn[iii] = -1;
|
||||||
|
}
|
||||||
|
loadProgram();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief change the current status in an other
|
||||||
|
* @param _newStatusId the next new status requested
|
||||||
|
* @return true The widget must call this fuction periodicly (and redraw itself)
|
||||||
|
* @return false No need to request the periodic call.
|
||||||
|
*/
|
||||||
|
public boolean changeStatusIn(final int newStatusId) {
|
||||||
|
if (newStatusId != this.stateNew) {
|
||||||
|
this.nextStatusRequested = newStatusId;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (this.nextStatusRequested != -1 || this.stateNew != this.stateOld) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief clear alll tre registered element in the current element
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void clear() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief draw All the refistered text in the current element on openGL
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void draw(final boolean disableDepthTest) {
|
||||||
|
if (this.config == null) {
|
||||||
|
// this is a normal case ... the user can choice to have no config basic file ...
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (this.oGLprogram == null) {
|
||||||
|
Log.error("No shader ...");
|
||||||
|
}
|
||||||
|
OpenGL.enable(Flag.flag_depthTest);
|
||||||
|
// set Matrix : translation/positionMatrix
|
||||||
|
Matrix4f projMatrix = OpenGL.getMatrix();
|
||||||
|
Matrix4f camMatrix = OpenGL.getCameraMatrix();
|
||||||
|
Matrix4f tmpMatrix = this.matrixApply.multiply(this.transform);
|
||||||
|
this.oGLprogram.use();
|
||||||
|
this.shape.bindForRendering();
|
||||||
|
this.oGLprogram.uniformMatrix(this.oGLMatrixProjection, projMatrix);
|
||||||
|
this.oGLprogram.uniformMatrix(this.oGLMatrixTransformation, tmpMatrix);
|
||||||
|
this.oGLprogram.uniformMatrix(this.oGLMatrixView, camMatrix);
|
||||||
|
// Texture:
|
||||||
|
this.oGLprogram.setTexture0(this.oGLtexID, this.resourceTexture.getRendererId());
|
||||||
|
// Request the draw of the elements:
|
||||||
|
this.shape.render();
|
||||||
|
|
||||||
|
this.shape.unBindForRendering();
|
||||||
|
this.oGLprogram.unUse();
|
||||||
|
OpenGL.disable(Flag.flag_depthTest);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void flush() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief get the padding declared by the user in the config file
|
||||||
|
* @return the padding property
|
||||||
|
*/
|
||||||
|
public Padding getBorder() {
|
||||||
|
return this.sizeObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief get the current displayed status of the shaper
|
||||||
|
* @return The Status Id
|
||||||
|
*/
|
||||||
|
public int getCurrentDisplayedStatus() {
|
||||||
|
return this.stateNew;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief get the next displayed status of the shaper
|
||||||
|
* @return The next status Id (-1 if no status in next)
|
||||||
|
*/
|
||||||
|
public int getNextDisplayedStatus() {
|
||||||
|
return this.nextStatusRequested;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief get the padding declared by the user in the config file
|
||||||
|
* @return the padding property
|
||||||
|
*/
|
||||||
|
public Padding getPadding() {
|
||||||
|
return getPaddingOut().add(getBorder()).add(getPaddingIn());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Padding getPaddingIn() {
|
||||||
|
Padding out = Padding.ZERO;
|
||||||
|
if (this.config != null) {
|
||||||
|
out = new Padding(this.config.getNumber(this.confIdPaddingIn[GuiShape.SHAPER_POS_LEFT]), this.config.getNumber(this.confIdPaddingIn[GuiShape.SHAPER_POS_TOP]),
|
||||||
|
this.config.getNumber(this.confIdPaddingIn[GuiShape.SHAPER_POS_RIGHT]), this.config.getNumber(this.confIdPaddingIn[GuiShape.SHAPER_POS_BOTTOM]));
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Padding getPaddingOut() {
|
||||||
|
Padding out = Padding.ZERO;
|
||||||
|
if (this.config != null) {
|
||||||
|
out = new Padding(this.config.getNumber(this.confIdPaddingOut[GuiShape.SHAPER_POS_LEFT]), this.config.getNumber(this.confIdPaddingOut[GuiShape.SHAPER_POS_TOP]),
|
||||||
|
this.config.getNumber(this.confIdPaddingOut[GuiShape.SHAPER_POS_RIGHT]), this.config.getNumber(this.confIdPaddingOut[GuiShape.SHAPER_POS_BOTTOM]));
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief get the shaper file Source
|
||||||
|
* @return the shapper file name
|
||||||
|
*/
|
||||||
|
public Uri getSource() {
|
||||||
|
return this.uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief get the current trasion status
|
||||||
|
* @return value of the transition status (0.0f when no activity)
|
||||||
|
*/
|
||||||
|
public float getTransitionStatus() {
|
||||||
|
return this.stateTransition;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sometimes the user declare an image but not allocate the ressources all the time, this is to know it ..
|
||||||
|
* @return the validity od the resources.
|
||||||
|
*/
|
||||||
|
public boolean hasSources() {
|
||||||
|
return this.oGLprogram != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief load the openGL program and get all the ID needed
|
||||||
|
*/
|
||||||
|
private void loadProgram() {
|
||||||
|
if (this.uri.isEmpty()) {
|
||||||
|
Log.debug("no Shaper set for loading resources ...");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.config = ResourceConfigFile.create(this.uri);
|
||||||
|
if (this.config != null) {
|
||||||
|
this.confIdPaddingOut[GuiShape.SHAPER_POS_LEFT] = this.config.request("padding-out-left");
|
||||||
|
this.confIdPaddingOut[GuiShape.SHAPER_POS_RIGHT] = this.config.request("padding-out-right");
|
||||||
|
this.confIdPaddingOut[GuiShape.SHAPER_POS_TOP] = this.config.request("padding-out-top");
|
||||||
|
this.confIdPaddingOut[GuiShape.SHAPER_POS_BOTTOM] = this.config.request("padding-out-buttom");
|
||||||
|
this.confIdPaddingIn[GuiShape.SHAPER_POS_LEFT] = this.config.request("padding-in-left");
|
||||||
|
this.confIdPaddingIn[GuiShape.SHAPER_POS_RIGHT] = this.config.request("padding-in-right");
|
||||||
|
this.confIdPaddingIn[GuiShape.SHAPER_POS_TOP] = this.config.request("padding-in-top");
|
||||||
|
this.confIdPaddingIn[GuiShape.SHAPER_POS_BOTTOM] = this.config.request("padding-in-buttom");
|
||||||
|
this.confIdChangeTime = this.config.request("change-time");
|
||||||
|
this.confProgramFileVert = this.config.request("program-vert");
|
||||||
|
this.confProgramFileFrag = this.config.request("program-frag");
|
||||||
|
this.confObjectFile = this.config.request("object-file");
|
||||||
|
this.confIdImagePaletteFile = this.config.request("image-palette");
|
||||||
|
this.confIdImagePaletteMode = this.config.request("image-palette-load-mode");
|
||||||
|
}
|
||||||
|
String objectFile = this.config.getString(this.confObjectFile);
|
||||||
|
if (!objectFile.isEmpty()) {
|
||||||
|
this.shape = ResourceStaticMeshObjBynamic.create(Uri.valueOf(objectFile));
|
||||||
|
this.verticesToModify = this.shape.getVertices();
|
||||||
|
float top = 0;
|
||||||
|
float bottom = 0;
|
||||||
|
float left = 0;
|
||||||
|
float right = 0;
|
||||||
|
float back = 0;
|
||||||
|
float font = 0;
|
||||||
|
// estimate size of border:
|
||||||
|
for (int iii = 0; iii < this.verticesToModify.length - 2; iii += 3) {
|
||||||
|
left = Math.min(left, this.verticesToModify[iii]);
|
||||||
|
right = Math.max(right, this.verticesToModify[iii]);
|
||||||
|
top = Math.min(top, this.verticesToModify[iii + 1]);
|
||||||
|
bottom = Math.max(bottom, this.verticesToModify[iii + 1]);
|
||||||
|
back = Math.min(back, this.verticesToModify[iii + 2]);
|
||||||
|
font = Math.max(font, this.verticesToModify[iii + 2]);
|
||||||
|
}
|
||||||
|
this.sizeObject = new Padding(Math.abs(left), Math.abs(top), Math.abs(right), Math.abs(bottom));
|
||||||
|
}
|
||||||
|
String paletteMode = this.config.getString(this.confIdImagePaletteMode, "linear");
|
||||||
|
String paletteFile = this.config.getString(this.confIdImagePaletteFile);
|
||||||
|
if (!paletteFile.isEmpty()) {
|
||||||
|
this.resourceTexture = ResourceTextureFile.create(Uri.valueOf(paletteFile));
|
||||||
|
if (paletteMode.equals("nearest")) {
|
||||||
|
this.resourceTexture.setFilterMode(TextureFilter.NEAREST);
|
||||||
|
} else {
|
||||||
|
this.resourceTexture.setFilterMode(TextureFilter.LINEAR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String basicShaderFileVert = this.config.getString(this.confProgramFileVert);
|
||||||
|
String basicShaderFileFrag = this.config.getString(this.confProgramFileFrag);
|
||||||
|
if (!basicShaderFileVert.isEmpty() && !basicShaderFileFrag.isEmpty()) {
|
||||||
|
this.oGLprogram = ResourceProgram.create(Uri.valueOf(basicShaderFileVert), Uri.valueOf(basicShaderFileFrag));
|
||||||
|
if (this.oGLprogram != null) {
|
||||||
|
this.oGLMatrixTransformation = this.oGLprogram.getUniform("in_matrixTransformation");
|
||||||
|
this.oGLMatrixProjection = this.oGLprogram.getUniform("in_matrixProjection");
|
||||||
|
this.oGLMatrixView = this.oGLprogram.getUniform("in_matrixView");
|
||||||
|
// for the texture ID :
|
||||||
|
this.oGLtexID = this.oGLprogram.getUniform("in_textureBase");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Same as the widfget periodic call (this is for change display)
|
||||||
|
* @param event The current time of the call.
|
||||||
|
* @return true The widget must call this fuction periodicly (and redraw itself)
|
||||||
|
* @return false No need to request the periodic call.
|
||||||
|
*/
|
||||||
|
public boolean periodicCall(final EventTime event) {
|
||||||
|
Log.verbose("call=" + event + "state transition=" + this.stateTransition + " speedTime=" + this.config.getNumber(this.confIdChangeTime));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set activate state of the element
|
||||||
|
* @param _status New activate status
|
||||||
|
*/
|
||||||
|
public void setActivateState(final int status) {
|
||||||
|
this.stateActivate = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
// @previous
|
||||||
|
public void setShape(final Vector2f origin, final Vector2f size) {
|
||||||
|
Padding tmp = getPadding();
|
||||||
|
setShape(origin, size, origin.add(tmp.left(), tmp.bottom()), size.less(tmp.x(), tmp.y()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief set the shape property:
|
||||||
|
*
|
||||||
|
* ********************************************************************************
|
||||||
|
* * _size *
|
||||||
|
* * *
|
||||||
|
* * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * *
|
||||||
|
* * *
|
||||||
|
* * | | *
|
||||||
|
* * *************************************************** *
|
||||||
|
* * | * * | *
|
||||||
|
* * * * *
|
||||||
|
* * | * * - - - - - - - - - - - - - - - - - - * * | *
|
||||||
|
* * * _insideSize * *
|
||||||
|
* * | * | | * | *
|
||||||
|
* * * * *
|
||||||
|
* * | * | | * | *
|
||||||
|
* * * * *
|
||||||
|
* * | * | | * | *
|
||||||
|
* * * * *
|
||||||
|
* * | * | | * | *
|
||||||
|
* * * * *
|
||||||
|
* * | * | | * | *
|
||||||
|
* * * * *
|
||||||
|
* * | * | | * | *
|
||||||
|
* * * _insidePos * *
|
||||||
|
* * | * * - - - - - - - - - - - - - - - - - - * * | *
|
||||||
|
* * * * *
|
||||||
|
* * | *************************************************** | *
|
||||||
|
* * *
|
||||||
|
* * | | *
|
||||||
|
* * *
|
||||||
|
* * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * *
|
||||||
|
* * *
|
||||||
|
* * *
|
||||||
|
* ********************************************************************************
|
||||||
|
* _origin
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param center Center of the object
|
||||||
|
* @param size Size of the display
|
||||||
|
*/
|
||||||
|
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);
|
||||||
|
Vector2f halfSize = insideSize.multiply(0.5f);
|
||||||
|
float[] newVertices = Arrays.copyOf(this.verticesToModify, this.verticesToModify.length);
|
||||||
|
for (int iii = 0; iii < newVertices.length - 2; iii += 3) {
|
||||||
|
if (newVertices[iii] <= 0.0f) {
|
||||||
|
newVertices[iii] -= halfSize.x();
|
||||||
|
} else {
|
||||||
|
newVertices[iii] += halfSize.x();
|
||||||
|
}
|
||||||
|
if (newVertices[iii + 1] <= 0.0f) {
|
||||||
|
newVertices[iii + 1] -= halfSize.y();
|
||||||
|
} else {
|
||||||
|
newVertices[iii + 1] += halfSize.y();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.transform = Matrix4f.createMatrixTranslate(new Vector3f(origin.x() + size.x() * 0.5f, origin.y() + size.y() * 0.5f, 0.0f));
|
||||||
|
this.shape.setVertices(newVertices);
|
||||||
|
this.shape.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setShape(final Vector3f origin, final Vector3f size) {
|
||||||
|
Padding tmp = getPadding();
|
||||||
|
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) {
|
||||||
|
Vector3f halfSize = insideSize.multiply(0.5f);
|
||||||
|
float[] newVertices = Arrays.copyOf(this.verticesToModify, this.verticesToModify.length);
|
||||||
|
for (int iii = 0; iii < newVertices.length - 2; iii += 3) {
|
||||||
|
if (newVertices[iii] <= 0.0f) {
|
||||||
|
newVertices[iii] -= halfSize.x();
|
||||||
|
} else {
|
||||||
|
newVertices[iii] += halfSize.x();
|
||||||
|
}
|
||||||
|
if (newVertices[iii + 1] <= 0.0f) {
|
||||||
|
newVertices[iii + 1] -= halfSize.y();
|
||||||
|
} else {
|
||||||
|
newVertices[iii + 1] += halfSize.y();
|
||||||
|
}
|
||||||
|
if (newVertices[iii + 2] <= 0.0f) {
|
||||||
|
newVertices[iii + 2] -= halfSize.z();
|
||||||
|
} else {
|
||||||
|
newVertices[iii + 2] += halfSize.z();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.transform = Matrix4f.createMatrixTranslate(new Vector3f(origin.x() + size.x() * 0.5f, origin.y() + size.y() * 0.5f, origin.z() + size.z() * 0.5f));
|
||||||
|
this.shape.setVertices(newVertices);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief change the shaper Source
|
||||||
|
* @param _uri New file of the shaper
|
||||||
|
*/
|
||||||
|
public void setSource(final Uri uri) {
|
||||||
|
clear();
|
||||||
|
unLoadProgram();
|
||||||
|
this.uri = uri;
|
||||||
|
loadProgram();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Change the current state
|
||||||
|
* @param _newState Current state of the configuration
|
||||||
|
* @return true Need redraw.
|
||||||
|
* @return false No need redraw.
|
||||||
|
*/
|
||||||
|
public boolean setState(final int newState) {
|
||||||
|
if (this.stateActivate == newState) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
this.stateActivate = newState;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Un-Load the openGL program and get all the ID needed
|
||||||
|
*/
|
||||||
|
|
||||||
|
private void unLoadProgram() {
|
||||||
|
this.oGLprogram = null;
|
||||||
|
this.resourceTexture = null;
|
||||||
|
this.config = null;
|
||||||
|
for (int iii = 0; iii < 4; ++iii) {
|
||||||
|
this.confIdPaddingOut[iii] = -1;
|
||||||
|
this.confIdPaddingIn[iii] = -1;
|
||||||
|
}
|
||||||
|
this.confIdChangeTime = -1;
|
||||||
|
this.listAssiciatedId.clear();
|
||||||
|
}
|
||||||
|
}
|
445
src/org/atriasoft/ewol/compositing/Shaper.cpp
Normal file
445
src/org/atriasoft/ewol/compositing/Shaper.cpp
Normal file
@ -0,0 +1,445 @@
|
|||||||
|
/** @file
|
||||||
|
* @author Edouard DUPIN
|
||||||
|
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||||
|
* @license MPL v2.0 (see license file)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <etk/uri/uri.hpp>
|
||||||
|
#include <ewol/debug.hpp>
|
||||||
|
#include <ewol/compositing/Shaper.hpp>
|
||||||
|
#include <etk/typeInfo.hpp>
|
||||||
|
ETK_DECLARE_TYPE(ewol::compositing::Shaper);
|
||||||
|
|
||||||
|
// VBO table property:
|
||||||
|
const int32_t ewol::compositing::Shaper::m_vboIdCoord(0);
|
||||||
|
const int32_t ewol::compositing::Shaper::m_vboIdPos(1);
|
||||||
|
#define NB_VBO (2)
|
||||||
|
|
||||||
|
ewol::compositing::Shaper::Shaper(const etk::Uri& _uri) :
|
||||||
|
m_uri(_uri),
|
||||||
|
m_config(null),
|
||||||
|
m_confIdMode(-1),
|
||||||
|
m_confIdDisplayOutside(-1),
|
||||||
|
m_confIdChangeTime(-1),
|
||||||
|
m_confProgramFile(-1),
|
||||||
|
m_confColorFile(-1),
|
||||||
|
m_confImageFile(-1),
|
||||||
|
m_GLprogram(null),
|
||||||
|
m_GLPosition(-1),
|
||||||
|
m_GLMatrix(-1),
|
||||||
|
m_GLStateActivate(-1),
|
||||||
|
m_GLStateOld(-1),
|
||||||
|
m_GLStateNew(-1),
|
||||||
|
m_GLStateTransition(-1),
|
||||||
|
m_resourceTexture(null),
|
||||||
|
m_nextStatusRequested(-1),
|
||||||
|
m_propertyOrigin(0,0),
|
||||||
|
m_propertySize(0,0),
|
||||||
|
m_propertyInsidePosition(0,0),
|
||||||
|
m_propertyInsideSize(0,0),
|
||||||
|
m_stateActivate(0),
|
||||||
|
m_stateOld(0),
|
||||||
|
m_stateNew(0),
|
||||||
|
m_stateTransition(1.0),
|
||||||
|
m_nbVertexToDisplay(0) {
|
||||||
|
for (size_t iii=0; iii<shaperPosCount; ++iii) {
|
||||||
|
m_confIdPaddingOut[iii] = -1;
|
||||||
|
m_confIdBorder[iii] = -1;
|
||||||
|
m_confIdPaddingIn[iii] = -1;
|
||||||
|
}
|
||||||
|
// Create the VBO:
|
||||||
|
m_VBO = gale::resource::VirtualBufferObject::create(NB_VBO);
|
||||||
|
if (m_VBO == null) {
|
||||||
|
EWOL_ERROR("can not instanciate VBO ...");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// TO facilitate some debugs we add a name of the VBO:
|
||||||
|
m_VBO->setName("[VBO] of ewol::compositing::Shaper");
|
||||||
|
loadProgram();
|
||||||
|
}
|
||||||
|
|
||||||
|
ewol::compositing::Shaper::~Shaper() {
|
||||||
|
unLoadProgram();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ewol::compositing::Shaper::unLoadProgram()
|
||||||
|
|
||||||
|
void ewol::compositing::Shaper::loadProgram()
|
||||||
|
|
||||||
|
void ewol::compositing::Shaper::draw(bool _disableDepthTest)
|
||||||
|
void ewol::compositing::Shaper::clear()
|
||||||
|
|
||||||
|
bool ewol::compositing::Shaper::setState(int32_t _newState)
|
||||||
|
|
||||||
|
bool ewol::compositing::Shaper::changeStatusIn(int32_t _newStatusId)
|
||||||
|
|
||||||
|
bool ewol::compositing::Shaper::periodicCall(const ewol::event::Time& _event)
|
||||||
|
|
||||||
|
//Create Line:
|
||||||
|
void ewol::compositing::Shaper::addVertexLine(float _yTop,
|
||||||
|
float _yButtom,
|
||||||
|
float _x1,
|
||||||
|
float _x2,
|
||||||
|
float _x3,
|
||||||
|
float _x4,
|
||||||
|
float _x5,
|
||||||
|
float _x6,
|
||||||
|
float _x7,
|
||||||
|
float _x8,
|
||||||
|
float _yValTop,
|
||||||
|
float _yValButtom,
|
||||||
|
const float* _table,
|
||||||
|
bool _displayOutside) {
|
||||||
|
if (m_nbVertexToDisplay != 0) {
|
||||||
|
// change line ...
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdCoord,
|
||||||
|
m_VBO->getOnBufferVec2(m_vboIdCoord, m_nbVertexToDisplay-1));
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdPos,
|
||||||
|
m_VBO->getOnBufferVec2(m_vboIdPos, m_nbVertexToDisplay-1));
|
||||||
|
|
||||||
|
m_nbVertexToDisplay++;
|
||||||
|
if (_displayOutside == true) {
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdCoord, vec2(_x1, _yButtom));
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdPos, vec2(_table[0],_yValButtom));
|
||||||
|
m_nbVertexToDisplay++;
|
||||||
|
} else {
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdCoord, vec2(_x2, _yButtom));
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdPos, vec2(_table[1],_yValButtom));
|
||||||
|
m_nbVertexToDisplay++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_displayOutside == true) {
|
||||||
|
// A
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdCoord, vec2(_x1, _yButtom));
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdPos, vec2(_table[0],_yValButtom));
|
||||||
|
m_nbVertexToDisplay++;
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdCoord, vec2(_x1, _yTop));
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdPos, vec2(_table[0],_yValTop));
|
||||||
|
m_nbVertexToDisplay++;
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdCoord, vec2(_x2, _yButtom));
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdPos, vec2(_table[1],_yValButtom));
|
||||||
|
m_nbVertexToDisplay++;
|
||||||
|
// B
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdCoord, vec2(_x2, _yTop));
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdPos, vec2(_table[1],_yValTop));
|
||||||
|
m_nbVertexToDisplay++;
|
||||||
|
|
||||||
|
// C
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdCoord, vec2(_x3, _yButtom));
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdPos, vec2(_table[2],_yValButtom));
|
||||||
|
m_nbVertexToDisplay++;
|
||||||
|
} else {
|
||||||
|
// C
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdCoord, vec2(_x2, _yButtom));
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdPos, vec2(_table[1],_yValButtom));
|
||||||
|
m_nbVertexToDisplay++;
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdCoord, vec2(_x2, _yTop));
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdPos, vec2(_table[1],_yValTop));
|
||||||
|
m_nbVertexToDisplay++;
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdCoord, vec2(_x3, _yButtom));
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdPos, vec2(_table[2],_yValButtom));
|
||||||
|
m_nbVertexToDisplay++;
|
||||||
|
}
|
||||||
|
// D
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdCoord, vec2(_x3, _yTop));
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdPos, vec2(_table[2],_yValTop));
|
||||||
|
m_nbVertexToDisplay++;
|
||||||
|
|
||||||
|
// E
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdCoord, vec2(_x4, _yButtom));
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdPos, vec2(_table[3],_yValButtom));
|
||||||
|
m_nbVertexToDisplay++;
|
||||||
|
// F
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdCoord, vec2(_x4, _yTop));
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdPos, vec2(_table[3],_yValTop));
|
||||||
|
m_nbVertexToDisplay++;
|
||||||
|
|
||||||
|
// G
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdCoord, vec2(_x5, _yButtom));
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdPos, vec2(_table[4],_yValButtom));
|
||||||
|
m_nbVertexToDisplay++;
|
||||||
|
// H
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdCoord, vec2(_x5, _yTop));
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdPos, vec2(_table[4],_yValTop));
|
||||||
|
m_nbVertexToDisplay++;
|
||||||
|
|
||||||
|
// I
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdCoord, vec2(_x6, _yButtom));
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdPos, vec2(_table[5],_yValButtom));
|
||||||
|
m_nbVertexToDisplay++;
|
||||||
|
// J
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdCoord, vec2(_x6, _yTop));
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdPos, vec2(_table[5],_yValTop));
|
||||||
|
m_nbVertexToDisplay++;
|
||||||
|
|
||||||
|
// K
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdCoord, vec2(_x7, _yButtom));
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdPos, vec2(_table[6],_yValButtom));
|
||||||
|
m_nbVertexToDisplay++;
|
||||||
|
// L
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdCoord, vec2(_x7, _yTop));
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdPos, vec2(_table[6],_yValTop));
|
||||||
|
m_nbVertexToDisplay++;
|
||||||
|
|
||||||
|
if (_displayOutside == true) {
|
||||||
|
// M
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdCoord, vec2(_x8, _yButtom));
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdPos, vec2(_table[7],_yValButtom));
|
||||||
|
m_nbVertexToDisplay++;
|
||||||
|
// N
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdCoord, vec2(_x8, _yTop));
|
||||||
|
m_VBO->pushOnBuffer(m_vboIdPos, vec2(_table[7],_yValTop));
|
||||||
|
m_nbVertexToDisplay++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const float modeDisplay[][8] = {
|
||||||
|
/* !! 0 !!
|
||||||
|
* / *******
|
||||||
|
* / ****** /
|
||||||
|
* ****** /
|
||||||
|
*/
|
||||||
|
{ 0.0f, 0.0f, 0.5f, 0.5f, 0.5f, 0.5f, 1.0f, 1.0f },
|
||||||
|
/* !! 1 !!
|
||||||
|
* ****** \
|
||||||
|
* \ ****** \
|
||||||
|
* \ *******
|
||||||
|
*/
|
||||||
|
{ 1.0f, 1.0f, 0.5f, 0.5f, 0.5f, 0.5f, 0.0f, 0.0f },
|
||||||
|
/* !! 2 !!
|
||||||
|
* / ****** \
|
||||||
|
* ****** / \ *******
|
||||||
|
*/
|
||||||
|
{ 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f },
|
||||||
|
/* !! 3 !!
|
||||||
|
* ****** \ / *******
|
||||||
|
* \ ****** /
|
||||||
|
*/
|
||||||
|
{ 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f },
|
||||||
|
/* !! 4 !!
|
||||||
|
* / *******
|
||||||
|
* / ****** /
|
||||||
|
* ****** /
|
||||||
|
*/
|
||||||
|
{ -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f },
|
||||||
|
/* !! 5 !!
|
||||||
|
* ****** \
|
||||||
|
* \ ****** \
|
||||||
|
* \ *******
|
||||||
|
*/
|
||||||
|
{ 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, -1.0f },
|
||||||
|
/* !! 6 !!
|
||||||
|
* / ****** \
|
||||||
|
* ****** / \ *******
|
||||||
|
*/
|
||||||
|
{ -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, -1.0f },
|
||||||
|
/* !! 7 !!
|
||||||
|
* ****** \ / *******
|
||||||
|
* \ ****** /
|
||||||
|
*/
|
||||||
|
{ 1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f }
|
||||||
|
};
|
||||||
|
|
||||||
|
void ewol::compositing::Shaper::setShape(const vec2& _origin, const vec2& _size, const vec2& _insidePos, const vec2& _insideSize) {
|
||||||
|
m_VBO->clear();
|
||||||
|
ewol::Padding borderTmp = getBorder();
|
||||||
|
ewol::Padding paddingIn = getPaddingIn();
|
||||||
|
ewol::Padding paddingOut = getPaddingOut();
|
||||||
|
ewol::Padding padding = paddingIn + borderTmp + paddingOut;
|
||||||
|
ewol::Padding enveloppe(_origin.x(),
|
||||||
|
_origin.y() + _size.y(),
|
||||||
|
_origin.x() + _size.x(),
|
||||||
|
_origin.y());
|
||||||
|
#if 0
|
||||||
|
ewol::Padding inside(_insidePos.x(),
|
||||||
|
_insidePos.y() + _insideSize.y(),
|
||||||
|
_insidePos.x() + _insideSize.x(),
|
||||||
|
_insidePos.y());
|
||||||
|
ewol::Padding insideBorder(inside.xLeft() - paddingIn.xLeft(),
|
||||||
|
inside.yTop() + paddingIn.yTop(),
|
||||||
|
inside.xRight() + paddingIn.xRight(),
|
||||||
|
inside.yButtom() - paddingIn.yButtom());
|
||||||
|
ewol::Padding border(insideBorder.xLeft() - borderTmp.xLeft(),
|
||||||
|
insideBorder.yTop() + borderTmp.yTop(),
|
||||||
|
insideBorder.xRight() + borderTmp.xRight(),
|
||||||
|
insideBorder.yButtom() - borderTmp.yButtom());
|
||||||
|
#else
|
||||||
|
ewol::Padding border(_insidePos.x() - padding.xLeft() + paddingOut.xLeft(),
|
||||||
|
_insidePos.y() + _insideSize.y() + padding.yTop() - paddingOut.yTop(),
|
||||||
|
_insidePos.x() + _insideSize.x() + padding.xRight() - paddingOut.xRight(),
|
||||||
|
_insidePos.y() - padding.yButtom() + paddingOut.yButtom());
|
||||||
|
ewol::Padding insideBorder(border.xLeft() + borderTmp.xLeft(),
|
||||||
|
border.yTop() - borderTmp.yTop(),
|
||||||
|
border.xRight() - borderTmp.xRight(),
|
||||||
|
border.yButtom() + borderTmp.yButtom());
|
||||||
|
ewol::Padding inside(insideBorder.xLeft() + etk::max(0.0f, paddingIn.xLeft()),
|
||||||
|
insideBorder.yTop() - etk::max(0.0f, paddingIn.yTop()),
|
||||||
|
insideBorder.xRight() - etk::max(0.0f, paddingIn.xRight()),
|
||||||
|
insideBorder.yButtom() + etk::max(0.0f, paddingIn.yButtom()));
|
||||||
|
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
EWOL_ERROR(" enveloppe = " << enveloppe);
|
||||||
|
EWOL_ERROR(" border = " << border);
|
||||||
|
EWOL_ERROR(" inside = " << inside);
|
||||||
|
*/
|
||||||
|
int32_t mode = 0;
|
||||||
|
bool displayOutside = false;
|
||||||
|
if (m_config != null) {
|
||||||
|
mode = m_config->getNumber(m_confIdMode);
|
||||||
|
displayOutside = m_config->getBoolean(m_confIdDisplayOutside);
|
||||||
|
}
|
||||||
|
m_nbVertexToDisplay = 0;
|
||||||
|
if (displayOutside == true) {
|
||||||
|
addVertexLine(enveloppe.yTop(), border.yTop(),
|
||||||
|
enveloppe.xLeft(),
|
||||||
|
border.xLeft(),
|
||||||
|
insideBorder.xLeft(),
|
||||||
|
inside.xLeft(),
|
||||||
|
inside.xRight(),
|
||||||
|
insideBorder.xRight(),
|
||||||
|
border.xRight(),
|
||||||
|
enveloppe.xRight(),
|
||||||
|
modeDisplay[mode][7], modeDisplay[mode][6],
|
||||||
|
modeDisplay[mode],
|
||||||
|
displayOutside);
|
||||||
|
}
|
||||||
|
addVertexLine(border.yTop(), insideBorder.yTop(),
|
||||||
|
enveloppe.xLeft(),
|
||||||
|
border.xLeft(),
|
||||||
|
insideBorder.xLeft(),
|
||||||
|
inside.xLeft(),
|
||||||
|
inside.xRight(),
|
||||||
|
insideBorder.xRight(),
|
||||||
|
border.xRight(),
|
||||||
|
enveloppe.xRight(),
|
||||||
|
modeDisplay[mode][6], modeDisplay[mode][5],
|
||||||
|
modeDisplay[mode],
|
||||||
|
displayOutside);
|
||||||
|
addVertexLine(insideBorder.yTop(), inside.yTop(),
|
||||||
|
enveloppe.xLeft(),
|
||||||
|
border.xLeft(),
|
||||||
|
insideBorder.xLeft(),
|
||||||
|
inside.xLeft(),
|
||||||
|
inside.xRight(),
|
||||||
|
insideBorder.xRight(),
|
||||||
|
border.xRight(),
|
||||||
|
enveloppe.xRight(),
|
||||||
|
modeDisplay[mode][5], modeDisplay[mode][4],
|
||||||
|
modeDisplay[mode],
|
||||||
|
displayOutside);
|
||||||
|
addVertexLine(inside.yTop(), inside.yButtom(),
|
||||||
|
enveloppe.xLeft(),
|
||||||
|
border.xLeft(),
|
||||||
|
insideBorder.xLeft(),
|
||||||
|
inside.xLeft(),
|
||||||
|
inside.xRight(),
|
||||||
|
insideBorder.xRight(),
|
||||||
|
border.xRight(),
|
||||||
|
enveloppe.xRight(),
|
||||||
|
modeDisplay[mode][4], modeDisplay[mode][3],
|
||||||
|
modeDisplay[mode],
|
||||||
|
displayOutside);
|
||||||
|
addVertexLine(inside.yButtom(), insideBorder.yButtom(),
|
||||||
|
enveloppe.xLeft(),
|
||||||
|
border.xLeft(),
|
||||||
|
insideBorder.xLeft(),
|
||||||
|
inside.xLeft(),
|
||||||
|
inside.xRight(),
|
||||||
|
insideBorder.xRight(),
|
||||||
|
border.xRight(),
|
||||||
|
enveloppe.xRight(),
|
||||||
|
modeDisplay[mode][3], modeDisplay[mode][2],
|
||||||
|
modeDisplay[mode],
|
||||||
|
displayOutside);
|
||||||
|
addVertexLine(insideBorder.yButtom(), border.yButtom(),
|
||||||
|
enveloppe.xLeft(),
|
||||||
|
border.xLeft(),
|
||||||
|
insideBorder.xLeft(),
|
||||||
|
inside.xLeft(),
|
||||||
|
inside.xRight(),
|
||||||
|
insideBorder.xRight(),
|
||||||
|
border.xRight(),
|
||||||
|
enveloppe.xRight(),
|
||||||
|
modeDisplay[mode][2], modeDisplay[mode][1],
|
||||||
|
modeDisplay[mode],
|
||||||
|
displayOutside);
|
||||||
|
if (displayOutside == true) {
|
||||||
|
addVertexLine(border.yButtom(), enveloppe.yButtom(),
|
||||||
|
enveloppe.xLeft(),
|
||||||
|
border.xLeft(),
|
||||||
|
insideBorder.xLeft(),
|
||||||
|
inside.xLeft(),
|
||||||
|
inside.xRight(),
|
||||||
|
insideBorder.xRight(),
|
||||||
|
border.xRight(),
|
||||||
|
enveloppe.xRight(),
|
||||||
|
modeDisplay[mode][1], modeDisplay[mode][0],
|
||||||
|
modeDisplay[mode],
|
||||||
|
displayOutside);
|
||||||
|
}
|
||||||
|
m_VBO->flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
ewol::Padding ewol::compositing::Shaper::getPadding()
|
||||||
|
|
||||||
|
ewol::Padding ewol::compositing::Shaper::getPaddingIn()
|
||||||
|
|
||||||
|
ewol::Padding ewol::compositing::Shaper::getPaddingOut()
|
||||||
|
|
||||||
|
ewol::Padding ewol::compositing::Shaper::getBorder()
|
||||||
|
|
||||||
|
void ewol::compositing::Shaper::setSource(const etk::Uri& _uri)
|
||||||
|
|
||||||
|
bool ewol::compositing::Shaper::hasSources()
|
||||||
|
|
||||||
|
const etk::Color<float>& ewol::compositing::Shaper::getColor(int32_t _id) {
|
||||||
|
static const etk::Color<float> errorValue(0,0,0,0);
|
||||||
|
if (m_colorProperty == null) {
|
||||||
|
EWOL_WARNING("null of m_colorProperty ==> return #0000 for id " << _id);
|
||||||
|
return errorValue;
|
||||||
|
}
|
||||||
|
return m_colorProperty->get(_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ewol::compositing::Shaper::requestColor(const etk::String& _name) {
|
||||||
|
if (m_colorProperty == null) {
|
||||||
|
EWOL_WARNING("null of m_colorProperty ==> return -1 for name " << _name);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return m_colorProperty->request(_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ewol::compositing::Shaper::requestConfig(const etk::String& _name) {
|
||||||
|
if (m_config == null) {
|
||||||
|
EWOL_WARNING("null of m_config ==> return -1 for name " << _name);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return m_config->request(_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
double ewol::compositing::Shaper::getConfigNumber(int32_t _id) {
|
||||||
|
if ( _id == -1
|
||||||
|
|| m_config == null) {
|
||||||
|
EWOL_WARNING("null of m_config ==> return 0.0 for id " << _id);
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
return m_config->getNumber(_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
namespace etk {
|
||||||
|
template<> etk::String toString<ewol::compositing::Shaper>(const ewol::compositing::Shaper& _obj) {
|
||||||
|
return _obj.getSource().get();
|
||||||
|
}
|
||||||
|
template<> etk::UString toUString<ewol::compositing::Shaper>(const ewol::compositing::Shaper& _obj) {
|
||||||
|
return etk::toUString(etk::toString(_obj));
|
||||||
|
}
|
||||||
|
template<> bool from_string<ewol::compositing::Shaper>(ewol::compositing::Shaper& _variableRet, const etk::String& _value) {
|
||||||
|
_variableRet.setSource(_value);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
template<> bool from_string<ewol::compositing::Shaper>(ewol::compositing::Shaper& _variableRet, const etk::UString& _value) {
|
||||||
|
return from_string(_variableRet, etk::toString(_value));
|
||||||
|
}
|
||||||
|
};
|
@ -51,7 +51,9 @@ public abstract class TextBase extends Compositing {
|
|||||||
protected FontMode mode = FontMode.REGULAR; // !< font display property : Regular/Bold/Italic/BoldItalic
|
protected FontMode mode = FontMode.REGULAR; // !< font display property : Regular/Bold/Italic/BoldItalic
|
||||||
protected int nbCharDisplayed; // !< prevent some error in calculation size.
|
protected int nbCharDisplayed; // !< prevent some error in calculation size.
|
||||||
protected boolean needDisplay; // !< This just need the display and not the size rendering.
|
protected boolean needDisplay; // !< This just need the display and not the size rendering.
|
||||||
protected int oGLMatrix = -1; // !< openGL id on the element (transformation matrix)
|
protected int oGLMatrixProjection = -1; //!< openGL id on the element (Projection matrix)
|
||||||
|
protected int oGLMatrixTransformation = -1; //!< openGL id on the element (transformation matrix)
|
||||||
|
protected int oGLMatrixView = -1; //!< openGL id on the element (view matrix)
|
||||||
protected ResourceProgram oGLprogram; // !< pointer on the opengl display program
|
protected ResourceProgram oGLprogram; // !< pointer on the opengl display program
|
||||||
protected int oGLtexID = -1; // !< openGL id on the element (texture ID)
|
protected int oGLtexID = -1; // !< openGL id on the element (texture ID)
|
||||||
protected int oGLtextHeight = -1; // !< openGL Id on the texture height
|
protected int oGLtextHeight = -1; // !< openGL Id on the texture height
|
||||||
@ -370,7 +372,9 @@ public abstract class TextBase extends Compositing {
|
|||||||
ResourceProgram old = this.oGLprogram;
|
ResourceProgram old = this.oGLprogram;
|
||||||
this.oGLprogram = ResourceProgram.create(vertexShader, fragmentShader);
|
this.oGLprogram = ResourceProgram.create(vertexShader, fragmentShader);
|
||||||
if (this.oGLprogram != null) {
|
if (this.oGLprogram != null) {
|
||||||
this.oGLMatrix = this.oGLprogram.getUniform("in_MatrixTransformation");
|
this.oGLMatrixTransformation = this.oGLprogram.getUniform("in_matrixTransformation");
|
||||||
|
this.oGLMatrixProjection = this.oGLprogram.getUniform("in_matrixProjection");
|
||||||
|
this.oGLMatrixView = this.oGLprogram.getUniform("in_matrixView");
|
||||||
this.oGLtexID = this.oGLprogram.getUniform("in_texID");
|
this.oGLtexID = this.oGLprogram.getUniform("in_texID");
|
||||||
this.oGLtextWidth = this.oGLprogram.getUniform("in_texWidth");
|
this.oGLtextWidth = this.oGLprogram.getUniform("in_texWidth");
|
||||||
this.oGLtextHeight = this.oGLprogram.getUniform("in_texHeight");
|
this.oGLtextHeight = this.oGLprogram.getUniform("in_texHeight");
|
||||||
@ -1037,7 +1041,7 @@ public abstract class TextBase extends Compositing {
|
|||||||
public void setPos(final Vector3f pos) {
|
public void setPos(final Vector3f pos) {
|
||||||
// check min max for display area
|
// check min max for display area
|
||||||
if (this.nbCharDisplayed != 0) {
|
if (this.nbCharDisplayed != 0) {
|
||||||
Log.verbose("update size 1 " + this.sizeDisplayStart + " " + this.sizeDisplayStop);
|
//Log.verbose("update size 1 " + this.sizeDisplayStart + " " + this.sizeDisplayStop);
|
||||||
this.sizeDisplayStop = Vector3f.max(this.position, this.sizeDisplayStop);
|
this.sizeDisplayStop = Vector3f.max(this.position, this.sizeDisplayStop);
|
||||||
this.sizeDisplayStart = Vector3f.min(this.position, this.sizeDisplayStart);
|
this.sizeDisplayStart = Vector3f.min(this.position, this.sizeDisplayStart);
|
||||||
}
|
}
|
||||||
@ -1049,12 +1053,12 @@ public abstract class TextBase extends Compositing {
|
|||||||
if (this.nbCharDisplayed == 0) {
|
if (this.nbCharDisplayed == 0) {
|
||||||
this.sizeDisplayStart = this.position;
|
this.sizeDisplayStart = this.position;
|
||||||
this.sizeDisplayStop = this.position.withY(this.sizeDisplayStop.y() + getHeight());
|
this.sizeDisplayStop = this.position.withY(this.sizeDisplayStop.y() + getHeight());
|
||||||
Log.verbose("update size 0 " + this.sizeDisplayStart + " " + this.sizeDisplayStop);
|
//Log.verbose("update size 0 " + this.sizeDisplayStart + " " + this.sizeDisplayStop);
|
||||||
} else {
|
} else {
|
||||||
Log.verbose("update size 3 " + this.sizeDisplayStart + " " + this.sizeDisplayStop);
|
//Log.verbose("update size 3 " + this.sizeDisplayStart + " " + this.sizeDisplayStop);
|
||||||
this.sizeDisplayStop = Vector3f.max(this.position, this.sizeDisplayStop);
|
this.sizeDisplayStop = Vector3f.max(this.position, this.sizeDisplayStop);
|
||||||
this.sizeDisplayStart = Vector3f.min(this.position, this.sizeDisplayStart);
|
this.sizeDisplayStart = Vector3f.min(this.position, this.sizeDisplayStart);
|
||||||
Log.verbose("update size 4 " + this.sizeDisplayStart + " " + this.sizeDisplayStop);
|
//Log.verbose("update size 4 " + this.sizeDisplayStart + " " + this.sizeDisplayStop);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,82 +0,0 @@
|
|||||||
package org.atriasoft.ewol.context;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.atriasoft.etk.Uri;
|
|
||||||
import org.atriasoft.ewol.internal.Log;
|
|
||||||
|
|
||||||
/** @file
|
|
||||||
* @author Edouard DUPIN
|
|
||||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
|
||||||
* @license MPL v2.0 (see license file)
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class ConfigFont {
|
|
||||||
private final Map<String, Uri> fonts = new HashMap<>();
|
|
||||||
private String name = "FreeSherif";
|
|
||||||
private int size = 12;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*/
|
|
||||||
public ConfigFont() {
|
|
||||||
// add default Esvg fonts:
|
|
||||||
this.fonts.put("FreeSherif", new Uri("FONTS", "FreeSherif.svg", "esvg"));
|
|
||||||
this.fonts.put("FreeSans", new Uri("FONTS", "FreeSans.svg", "esvg"));
|
|
||||||
this.fonts.put("FreeMono", new Uri("FONTS", "FreeMono.svg", "esvg"));
|
|
||||||
}
|
|
||||||
|
|
||||||
public Uri getFontUri(final String fontName) {
|
|
||||||
Uri out = this.fonts.get(fontName);
|
|
||||||
if (out == null) {
|
|
||||||
Log.warning(" try to get unexistant font : " + fontName);
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* get the current default font name
|
|
||||||
* @return a reference on the font name string
|
|
||||||
*/
|
|
||||||
public String getName() {
|
|
||||||
return this.name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* get the default font size.
|
|
||||||
* @return the font size.
|
|
||||||
*/
|
|
||||||
public int getSize() {
|
|
||||||
return this.size;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* set the defaut font for all the widgets and basics display.
|
|
||||||
* @param fontName The font name requested (not case sensitive) ex "Arial" or multiple separate by ';' ex : "Arial;Helvetica".
|
|
||||||
* @param size The default size of the font default=10.
|
|
||||||
*/
|
|
||||||
public void set(final String fontName, final int size) {
|
|
||||||
this.name = fontName;
|
|
||||||
this.size = size;
|
|
||||||
Log.debug("Set default Font : '" + this.name + "' size=" + this.size);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the current default font name
|
|
||||||
* @param fontName The font name requested (not case sensitive) ex "Arial" or multiple separate by ';' ex : "Arial;Helvetica".
|
|
||||||
*/
|
|
||||||
public void setName(final String fontName) {
|
|
||||||
this.name = fontName;
|
|
||||||
Log.debug("Set default Font : '" + this.name + "' size=" + this.size + " (change name only)");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the default font size.
|
|
||||||
* @param size new font size.
|
|
||||||
*/
|
|
||||||
public void setSize(final int size) {
|
|
||||||
this.size = size;
|
|
||||||
Log.debug("Set default Font : '" + this.name + "' size=" + this.size + " (change size only)");
|
|
||||||
}
|
|
||||||
}
|
|
@ -45,8 +45,6 @@ public class EwolContext extends GaleApplication {
|
|||||||
|
|
||||||
private EwolApplication application; // !< Application handle
|
private EwolApplication application; // !< Application handle
|
||||||
|
|
||||||
private final ConfigFont configFont = new ConfigFont(); // !< global font configuration
|
|
||||||
|
|
||||||
private final int initStepId = 0;
|
private final int initStepId = 0;
|
||||||
|
|
||||||
private final int initTotalStep = 0;
|
private final int initTotalStep = 0;
|
||||||
@ -93,10 +91,6 @@ public class EwolContext extends GaleApplication {
|
|||||||
return this.objectManager;
|
return this.objectManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ConfigFont getFontDefault() {
|
|
||||||
return this.configFont;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ResourceManager getResourcesManager() {
|
public ResourceManager getResourcesManager() {
|
||||||
return Gale.getContext().getResourcesManager();
|
return Gale.getContext().getResourcesManager();
|
||||||
}
|
}
|
||||||
@ -225,7 +219,7 @@ public class EwolContext extends GaleApplication {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onKeyboard(final KeySpecial special, final KeyKeyboard type, final Character value, final KeyStatus state) {
|
public void onKeyboard(final KeySpecial special, final KeyKeyboard type, final Character value, final KeyStatus state) {
|
||||||
Log.verbose("event {" + special + "} " + type + " " + value + " " + state);
|
Log.verbose("event {" + special + "} " + type + " '" + value + "' " + state);
|
||||||
// store the keyboard special key status for mouse event...
|
// store the keyboard special key status for mouse event...
|
||||||
this.input.setLastKeyboardSpecial(special);
|
this.input.setLastKeyboardSpecial(special);
|
||||||
if (this.windowsCurrent == null) {
|
if (this.windowsCurrent == null) {
|
||||||
@ -262,9 +256,9 @@ public class EwolContext extends GaleApplication {
|
|||||||
} else { // THREADKEYBORADMOVE
|
} else { // THREADKEYBORADMOVE
|
||||||
final EntrySystem tmpEntryEvent;
|
final EntrySystem tmpEntryEvent;
|
||||||
if (isDown) {
|
if (isDown) {
|
||||||
tmpEntryEvent = new EntrySystem(KeyKeyboard.CHARACTER, KeyStatus.down, special, null);
|
tmpEntryEvent = new EntrySystem(type, KeyStatus.down, special, null);
|
||||||
} else {
|
} else {
|
||||||
tmpEntryEvent = new EntrySystem(KeyKeyboard.CHARACTER, KeyStatus.up, special, null);
|
tmpEntryEvent = new EntrySystem(type, KeyStatus.up, special, null);
|
||||||
}
|
}
|
||||||
tmpWidget.systemEventEntry(tmpEntryEvent);
|
tmpWidget.systemEventEntry(tmpEntryEvent);
|
||||||
}
|
}
|
||||||
@ -301,7 +295,8 @@ public class EwolContext extends GaleApplication {
|
|||||||
this.objectManager.timeCall(time);
|
this.objectManager.timeCall(time);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onPointer(final KeyType type, final int pointerID, final Vector2f pos, final KeyStatus state) {
|
@Override
|
||||||
|
public void onPointer(final KeySpecial special, final KeyType type, final int pointerID, final Vector2f pos, final KeyStatus state) {
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case move:
|
case move:
|
||||||
// Log.debug("Receive MSG : THREAD_INPUT_MOTION");
|
// Log.debug("Receive MSG : THREAD_INPUT_MOTION");
|
||||||
@ -332,7 +327,7 @@ public class EwolContext extends GaleApplication {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Redraw all needed elements
|
// Redraw all needed elements
|
||||||
window.onRegenerateDisplay();
|
window.systemRegenerateDisplay();
|
||||||
if (this.widgetManager.isDrawingNeeded()) {
|
if (this.widgetManager.isDrawingNeeded()) {
|
||||||
markDrawingIsNeeded();
|
markDrawingIsNeeded();
|
||||||
}
|
}
|
||||||
|
@ -170,13 +170,13 @@ class InputManager {
|
|||||||
// this event is all time on the good widget ... and manage the enter and leave ...
|
// this event is all time on the good widget ... and manage the enter and leave ...
|
||||||
// NOTE : the "layer widget" force us to get the widget at the specific position all the time :
|
// NOTE : the "layer widget" force us to get the widget at the specific position all the time :
|
||||||
Widget tmpWidget = null;
|
Widget tmpWidget = null;
|
||||||
if (this.grabWidget.get() != null) {
|
if (this.grabWidget != null && this.grabWidget.get() != null) {
|
||||||
// grab all events ...
|
// grab all events ...
|
||||||
tmpWidget = this.grabWidget.get();
|
tmpWidget = this.grabWidget.get();
|
||||||
} else if (tmpWindows != null) {
|
} else if (tmpWindows != null) {
|
||||||
tmpWidget = tmpWindows.getWidgetAtPos(pos);
|
tmpWidget = tmpWindows.getWidgetAtPos(pos);
|
||||||
}
|
}
|
||||||
if (tmpWidget != eventTable[pointerID].curentWidgetEvent.get()
|
if (eventTable[pointerID].curentWidgetEvent != null && tmpWidget != eventTable[pointerID].curentWidgetEvent.get()
|
||||||
|| (eventTable[pointerID].isInside && (eventTable[pointerID].origin.x() > pos.x() || eventTable[pointerID].origin.y() > pos.y()
|
|| (eventTable[pointerID].isInside && (eventTable[pointerID].origin.x() > pos.x() || eventTable[pointerID].origin.y() > pos.y()
|
||||||
|| (eventTable[pointerID].origin.x() + eventTable[pointerID].size.x()) < pos.x() || (eventTable[pointerID].origin.y() + eventTable[pointerID].size.y()) < pos.y()))) {
|
|| (eventTable[pointerID].origin.x() + eventTable[pointerID].size.x()) < pos.x() || (eventTable[pointerID].origin.y() + eventTable[pointerID].size.y()) < pos.y()))) {
|
||||||
eventTable[pointerID].isInside = false;
|
eventTable[pointerID].isInside = false;
|
||||||
@ -301,7 +301,7 @@ class InputManager {
|
|||||||
eventTable[pointerID].lastTimeEvent = currentTime;
|
eventTable[pointerID].lastTimeEvent = currentTime;
|
||||||
// set the element inside ...
|
// set the element inside ...
|
||||||
eventTable[pointerID].isInside = true;
|
eventTable[pointerID].isInside = true;
|
||||||
Widget tmpWidget = this.grabWidget.get();
|
Widget tmpWidget = this.grabWidget == null ? null : this.grabWidget.get();
|
||||||
// get destination widget :
|
// get destination widget :
|
||||||
if (tmpWindows != null) {
|
if (tmpWindows != null) {
|
||||||
if (tmpWidget != null && type == KeyType.mouse) {
|
if (tmpWidget != null && type == KeyType.mouse) {
|
||||||
@ -368,7 +368,7 @@ class InputManager {
|
|||||||
nbClickMax = 5;
|
nbClickMax = 5;
|
||||||
}
|
}
|
||||||
// in grab mode the single to quinte event are not generated ....
|
// in grab mode the single to quinte event are not generated ....
|
||||||
if ((this.grabWidget.get() == null || type != KeyType.mouse) && eventTable[pointerID].nbClickEvent < nbClickMax) {
|
if ((this.grabWidget == null || this.grabWidget.get() == null || type != KeyType.mouse) && eventTable[pointerID].nbClickEvent < nbClickMax) {
|
||||||
// generate event SINGLE :
|
// generate event SINGLE :
|
||||||
eventTable[pointerID].nbClickEvent++;
|
eventTable[pointerID].nbClickEvent++;
|
||||||
//Log.debug("GUI : Input ID=" + pointerID + " == >" + eventTable[pointerID].destinationInputId + " [" + eventTable[pointerID].nbClickEvent + "] " + pos);
|
//Log.debug("GUI : Input ID=" + pointerID + " == >" + eventTable[pointerID].destinationInputId + " [" + eventTable[pointerID].nbClickEvent + "] " + pos);
|
||||||
|
@ -4,6 +4,7 @@ import org.atriasoft.gale.key.KeyKeyboard;
|
|||||||
import org.atriasoft.gale.key.KeySpecial;
|
import org.atriasoft.gale.key.KeySpecial;
|
||||||
import org.atriasoft.gale.key.KeyStatus;
|
import org.atriasoft.gale.key.KeyStatus;
|
||||||
|
|
||||||
|
@SuppressWarnings("preview")
|
||||||
public record EntrySystem(
|
public record EntrySystem(
|
||||||
EventEntry event) {
|
EventEntry event) {
|
||||||
public EntrySystem(final EventEntry event) {
|
public EntrySystem(final EventEntry event) {
|
||||||
|
@ -32,30 +32,35 @@ 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.
|
||||||
*/
|
*/
|
||||||
public static ResourceConfigFile keep(final String name) {
|
@SuppressWarnings("preview")
|
||||||
|
public static ResourceConfigFile create(final Uri name) {
|
||||||
Resource resource2 = null;
|
Resource resource2 = null;
|
||||||
if (!name.isEmpty() && !name.contentEquals("---")) {
|
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) {
|
if (resource2 instanceof ResourceConfigFile tmpp) {
|
||||||
resource2.keep();
|
resource2.keep();
|
||||||
return (ResourceConfigFile) resource2;
|
return tmpp;
|
||||||
}
|
}
|
||||||
Log.critical("Request resource file : '" + name + "' With the wrong type (dynamic cast error)");
|
Log.critical("Request resource file : '" + name + "' With the wrong type (dynamic cast error)");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
final ResourceConfigFile resource = new ResourceConfigFile(Uri.valueOf(name));
|
final ResourceConfigFile resource = new ResourceConfigFile(name);
|
||||||
Resource.getManager().localAdd(resource);
|
Resource.getManager().localAdd(resource);
|
||||||
return resource;
|
return resource;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static ResourceConfigFile keep(final String name) {
|
||||||
|
return ResourceConfigFile.create(Uri.valueOf(name));
|
||||||
|
}
|
||||||
|
|
||||||
// List of all color in the file
|
// List of all color in the file
|
||||||
private final List<ListElementConfig> list = new ArrayList<>();
|
private final List<ListElementConfig> list = new ArrayList<>();
|
||||||
|
|
||||||
protected ResourceConfigFile(final Uri uri) {
|
protected ResourceConfigFile(final Uri uri) {
|
||||||
super(uri.get());
|
super(uri.toString());
|
||||||
Log.debug("SFP : load '" + uri + "'");
|
Log.debug("SFP : load '" + uri + "'");
|
||||||
reload();
|
reload();
|
||||||
|
|
||||||
@ -67,7 +72,7 @@ public class ResourceConfigFile extends Resource {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean getBoolean(final int id) {
|
public boolean getBoolean(final int id) {
|
||||||
if (id < 0 || this.list.get(id).node == null || !this.list.get(id).node.isJsonBoolean()) {
|
if (id < 0 || this.list.get(id).node == null || !this.list.get(id).node.isJsonBoolean()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -81,9 +86,13 @@ public class ResourceConfigFile extends Resource {
|
|||||||
return this.list.get(id).node.toJsonNumber().getValue();
|
return this.list.get(id).node.toJsonNumber().getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
String getString(final int id) {
|
public String getString(final int id) {
|
||||||
|
return getString(id, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getString(final int id, final String defaultValue) {
|
||||||
if (id < 0 || this.list.get(id).node == null || !this.list.get(id).node.isJsonString()) {
|
if (id < 0 || this.list.get(id).node == null || !this.list.get(id).node.isJsonString()) {
|
||||||
return "";
|
return defaultValue;
|
||||||
}
|
}
|
||||||
return this.list.get(id).node.toJsonString().getValue();
|
return this.list.get(id).node.toJsonString().getValue();
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,8 @@
|
|||||||
*/
|
*/
|
||||||
package org.atriasoft.ewol.resource;
|
package org.atriasoft.ewol.resource;
|
||||||
|
|
||||||
import org.atriasoft.egami.Image;
|
import org.atriasoft.egami.ImageByte;
|
||||||
import org.atriasoft.egami.ImageMono;
|
import org.atriasoft.egami.ImageByteMono;
|
||||||
import org.atriasoft.esvg.EsvgFont;
|
import org.atriasoft.esvg.EsvgFont;
|
||||||
import org.atriasoft.esvg.font.Glyph;
|
import org.atriasoft.esvg.font.Glyph;
|
||||||
import org.atriasoft.esvg.render.Weight;
|
import org.atriasoft.esvg.render.Weight;
|
||||||
@ -63,7 +63,7 @@ public class ResourceFontSvg extends Resource {
|
|||||||
Log.info(" number of glyph = " + this.font.getNumGlyphs());
|
Log.info(" number of glyph = " + this.font.getNumGlyphs());
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized boolean drawGlyph(final Image imageOut, final int fontSize, final Vector2i glyphPosition, final GlyphProperty property, final int posInImage) {
|
public synchronized boolean drawGlyph(final ImageByte imageOut, final int fontSize, final Vector2i glyphPosition, final GlyphProperty property, final int posInImage) {
|
||||||
Weight weight = this.font.render(property.glyph.getUnicodeValue(), fontSize);
|
Weight weight = this.font.render(property.glyph.getUnicodeValue(), fontSize);
|
||||||
if (weight == null) {
|
if (weight == null) {
|
||||||
return false;
|
return false;
|
||||||
@ -75,16 +75,16 @@ public class ResourceFontSvg extends Resource {
|
|||||||
switch (posInImage) {
|
switch (posInImage) {
|
||||||
default:
|
default:
|
||||||
case 0:
|
case 0:
|
||||||
imageOut.setA(glyphPosition.x() + xxx, glyphPosition.y() + yyy, valueColor);
|
imageOut.setAFloat(glyphPosition.x() + xxx, glyphPosition.y() + yyy, valueColor);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
imageOut.setR(glyphPosition.x() + xxx, glyphPosition.y() + yyy, valueColor);
|
imageOut.setRFloat(glyphPosition.x() + xxx, glyphPosition.y() + yyy, valueColor);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
imageOut.setG(glyphPosition.x() + xxx, glyphPosition.y() + yyy, valueColor);
|
imageOut.setGFloat(glyphPosition.x() + xxx, glyphPosition.y() + yyy, valueColor);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
imageOut.setB(glyphPosition.x() + xxx, glyphPosition.y() + yyy, valueColor);
|
imageOut.setBFloat(glyphPosition.x() + xxx, glyphPosition.y() + yyy, valueColor);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -92,7 +92,7 @@ public class ResourceFontSvg extends Resource {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized boolean drawGlyph(final ImageMono imageOut, final int fontSize, final GlyphProperty property, final int borderSize) {
|
public synchronized boolean drawGlyph(final ImageByteMono imageOut, final int fontSize, final GlyphProperty property, final int borderSize) {
|
||||||
Weight weight = this.font.render(property.glyph.getUnicodeValue(), fontSize);
|
Weight weight = this.font.render(property.glyph.getUnicodeValue(), fontSize);
|
||||||
for (int jjj = 0; jjj < weight.getHeight(); jjj++) {
|
for (int jjj = 0; jjj < weight.getHeight(); jjj++) {
|
||||||
for (int iii = 0; iii < weight.getWidth(); iii++) {
|
for (int iii = 0; iii < weight.getWidth(); iii++) {
|
||||||
|
@ -6,7 +6,8 @@
|
|||||||
package org.atriasoft.ewol.resource;
|
package org.atriasoft.ewol.resource;
|
||||||
|
|
||||||
import org.atriasoft.echrono.Steady;
|
import org.atriasoft.echrono.Steady;
|
||||||
import org.atriasoft.egami.Image;
|
import org.atriasoft.egami.ImageByte;
|
||||||
|
import org.atriasoft.egami.ImageByteRGBA;
|
||||||
import org.atriasoft.etk.Uri;
|
import org.atriasoft.etk.Uri;
|
||||||
import org.atriasoft.etk.math.Vector2i;
|
import org.atriasoft.etk.math.Vector2i;
|
||||||
import org.atriasoft.ewol.internal.Log;
|
import org.atriasoft.ewol.internal.Log;
|
||||||
@ -42,11 +43,11 @@ public class ResourceTexture2 extends Resource {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// openGl Context properties :
|
// openGl Context properties :
|
||||||
protected Image data = new Image(32, 32);
|
protected ImageByte data = new ImageByteRGBA(32, 32);
|
||||||
// !< Color space of the image.
|
// !< Color space of the image.
|
||||||
private final TextureColorMode dataColorSpace = TextureColorMode.rgba;
|
private final TextureColorMode dataColorSpace = TextureColorMode.rgba;
|
||||||
// Filter apply at the image when rendering it
|
// Filter apply at the image when rendering it
|
||||||
protected TextureFilter filter = TextureFilter.linear;
|
protected TextureFilter filter = TextureFilter.LINEAR;
|
||||||
// ! Last loaded size in the system openGL
|
// ! Last loaded size in the system openGL
|
||||||
protected Vector2i lastSize = new Vector2i(1, 1);
|
protected Vector2i lastSize = new Vector2i(1, 1);
|
||||||
protected int lastSizeObject = 0;
|
protected int lastSizeObject = 0;
|
||||||
@ -105,7 +106,7 @@ public class ResourceTexture2 extends Resource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get the reference on this image to draw something on it ...
|
// Get the reference on this image to draw something on it ...
|
||||||
public Image get() {
|
public ImageByte get() {
|
||||||
return this.data;
|
return this.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -143,7 +144,7 @@ public class ResourceTexture2 extends Resource {
|
|||||||
* @note It will resize in square2 if needed by the system.
|
* @note It will resize in square2 if needed by the system.
|
||||||
* @param image Image to set.
|
* @param image Image to set.
|
||||||
*/
|
*/
|
||||||
public synchronized void set(final Image image) {
|
public synchronized void set(final ImageByte image) {
|
||||||
Log.debug("Set a new image in a texture:");
|
Log.debug("Set a new image in a texture:");
|
||||||
Log.debug(" size=" + image.getSize());
|
Log.debug(" size=" + image.getSize());
|
||||||
this.data = image;
|
this.data = image;
|
||||||
@ -197,7 +198,7 @@ public class ResourceTexture2 extends Resource {
|
|||||||
* TODO : use unlockable synchronized ... if (lock.tryLock() == false) { //Lock
|
* TODO : use unlockable synchronized ... if (lock.tryLock() == false) { //Lock
|
||||||
* error ==> try later ... return false; }
|
* error ==> try later ... return false; }
|
||||||
*/
|
*/
|
||||||
final int typeObject = OpenGL.GL_RGBA;
|
final int typeObject = this.data.hasAlpha() ? OpenGL.GL_RGBA : OpenGL.GL_RGB;
|
||||||
final int sizeObject = OpenGL.GL_UNSIGNED_BYTE;
|
final int sizeObject = OpenGL.GL_UNSIGNED_BYTE;
|
||||||
if (this.loaded) {
|
if (this.loaded) {
|
||||||
if (this.lastTypeObject != typeObject || this.lastSizeObject != sizeObject || !this.lastSize.equals(this.data.getSize())) {
|
if (this.lastTypeObject != typeObject || this.lastSizeObject != sizeObject || !this.lastSize.equals(this.data.getSize())) {
|
||||||
@ -217,7 +218,7 @@ public class ResourceTexture2 extends Resource {
|
|||||||
Log.debug("TEXTURE: update [" + getId() + "]=" + this.data.getSize() + "=>" + this.data.getGPUSize() + " OGlId=" + this.texId + " type=" + this.data.getClass().getCanonicalName());
|
Log.debug("TEXTURE: update [" + getId() + "]=" + this.data.getSize() + "=>" + this.data.getGPUSize() + " OGlId=" + this.texId + " type=" + this.data.getClass().getCanonicalName());
|
||||||
}
|
}
|
||||||
// in all case we set the texture properties :
|
// in all case we set the texture properties :
|
||||||
// TODO : check error ???
|
// TODO check error ???
|
||||||
OpenGL.bindTexture2D(this.texId);
|
OpenGL.bindTexture2D(this.texId);
|
||||||
|
|
||||||
if (!this.loaded) {
|
if (!this.loaded) {
|
||||||
@ -226,7 +227,7 @@ public class ResourceTexture2 extends Resource {
|
|||||||
} else {
|
} else {
|
||||||
OpenGL.setTexture2DWrapRepeat();
|
OpenGL.setTexture2DWrapRepeat();
|
||||||
}
|
}
|
||||||
if (this.filter == TextureFilter.linear) {
|
if (this.filter == TextureFilter.LINEAR) {
|
||||||
OpenGL.setTexture2DFilterLinear();
|
OpenGL.setTexture2DFilterLinear();
|
||||||
} else {
|
} else {
|
||||||
OpenGL.setTexture2DFilterNearest();
|
OpenGL.setTexture2DFilterNearest();
|
||||||
@ -235,26 +236,7 @@ public class ResourceTexture2 extends Resource {
|
|||||||
// glPixelStorei(GLUNPACKALIGNMENT,1);
|
// glPixelStorei(GLUNPACKALIGNMENT,1);
|
||||||
final Steady toc1 = Steady.now();
|
final Steady toc1 = Steady.now();
|
||||||
Log.verbose(" BIND ==> " + toc1.less(tic));
|
Log.verbose(" BIND ==> " + toc1.less(tic));
|
||||||
// egami::store(this.data, String("~/texture") + etk::toString(getId()) +
|
// egami::store(this.data, String("~/texture") + etk::toString(getId()) + ".bmp");
|
||||||
// ".bmp");
|
|
||||||
/*
|
|
||||||
* if (false) { // On some embended target, the texture size must be square of
|
|
||||||
* 2: if (this.loaded == false) { // 1: Create the square 2 texture: final int
|
|
||||||
* bufferSize = this.data.getGPUSize().x() * this.data.getGPUSize().y() * 8;
|
|
||||||
* static List<float> tmpData; if (tmpData.size() < bufferSize) {
|
|
||||||
* tmpData.resize(bufferSize, 0.0f); } Log.debug(" CREATE texture ==> " +
|
|
||||||
* this.data.getGPUSize()); // 2 create a new empty texture:
|
|
||||||
* OpenGL.glTexImage2D(GLTEXTURE2D, // Target 0, // Level typeObject, //
|
|
||||||
* Format internal this.data.getGPUSize().x(), this.data.getGPUSize().y(), 0, //
|
|
||||||
* Border typeObject, // format sizeObject, // type tmpData[0] );
|
|
||||||
*
|
|
||||||
* } //3 Flush all time the data: Steady tic1 = Steady.now();
|
|
||||||
* glTexSubImage2D(GLTEXTURE2D, // Target 0, // Level 0, // x offset 0, // y
|
|
||||||
* offset this.data.getWidth(), this.data.getHeight(), typeObject, // format
|
|
||||||
* sizeObject, // type (void*)((char*)this.data.getTextureDataPointer()) );
|
|
||||||
* Steady toc2 = Steady.now(); Log.info(" updateContext [STOP] ==> " +
|
|
||||||
* toc2.less(tic1)); } else
|
|
||||||
*/
|
|
||||||
if (!this.loaded) {
|
if (!this.loaded) {
|
||||||
OpenGL.glTexImage2D(0, // Level
|
OpenGL.glTexImage2D(0, // Level
|
||||||
typeObject, // Format internal
|
typeObject, // Format internal
|
||||||
@ -278,7 +260,3 @@ public class ResourceTexture2 extends Resource {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum TextureFilter {
|
|
||||||
linear, nearest
|
|
||||||
}
|
|
||||||
|
@ -5,13 +5,13 @@
|
|||||||
*/
|
*/
|
||||||
package org.atriasoft.ewol.resource;
|
package org.atriasoft.ewol.resource;
|
||||||
|
|
||||||
import org.atriasoft.egami.Egami;
|
import org.atriasoft.egami.ImageByte;
|
||||||
import org.atriasoft.egami.Image;
|
|
||||||
import org.atriasoft.etk.Uri;
|
import org.atriasoft.etk.Uri;
|
||||||
import org.atriasoft.etk.math.Vector2i;
|
import org.atriasoft.etk.math.Vector2i;
|
||||||
import org.atriasoft.ewol.internal.Log;
|
import org.atriasoft.ewol.internal.Log;
|
||||||
import org.atriasoft.ewol.internal.Tools;
|
import org.atriasoft.ewol.internal.Tools;
|
||||||
import org.atriasoft.gale.resource.Resource;
|
import org.atriasoft.gale.resource.Resource;
|
||||||
|
import org.atriasoft.iogami.IOgami;
|
||||||
|
|
||||||
// TODO : Change tis file name ...
|
// TODO : Change tis file name ...
|
||||||
|
|
||||||
@ -82,13 +82,16 @@ public class ResourceTextureFile extends ResourceTexture2 {
|
|||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ResourceTextureFile() {
|
protected ResourceTextureFile() {}
|
||||||
}
|
|
||||||
|
|
||||||
protected ResourceTextureFile(final String genName, final Uri uri, final Vector2i size) {
|
protected ResourceTextureFile(final String genName, final Uri uri, final Vector2i size) {
|
||||||
super(genName);
|
super(genName);
|
||||||
Log.debug("create a new resource::Image : genName=" + genName + " uri=" + uri + " size=" + size);
|
Log.debug("create a new resource::Image : genName=" + genName + " uri=" + uri + " size=" + size);
|
||||||
final Image tmp = Egami.load(uri, size);
|
final ImageByte tmp = IOgami.load(uri, size);
|
||||||
|
if (tmp == null) {
|
||||||
|
Log.error("Can not load the file : " + uri);
|
||||||
|
return;
|
||||||
|
}
|
||||||
set(tmp);
|
set(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
5
src/org/atriasoft/ewol/resource/TextureFilter.java
Normal file
5
src/org/atriasoft/ewol/resource/TextureFilter.java
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package org.atriasoft.ewol.resource;
|
||||||
|
|
||||||
|
public enum TextureFilter {
|
||||||
|
LINEAR, NEAREST
|
||||||
|
}
|
@ -51,13 +51,15 @@ public class GlyphProperty {
|
|||||||
public Vector2i sizeTexture = new Vector2i(10, 10); //!< size of the element to display
|
public Vector2i sizeTexture = new Vector2i(10, 10); //!< size of the element to display
|
||||||
public Vector2f texturePosSize = Vector2f.ZERO; //!< Texture normalized size (SIZE)
|
public Vector2f texturePosSize = Vector2f.ZERO; //!< Texture normalized size (SIZE)
|
||||||
public Vector2f texturePosStart = Vector2f.ZERO; //!< Texture normalized position (START)
|
public Vector2f texturePosStart = Vector2f.ZERO; //!< Texture normalized position (START)
|
||||||
|
public Vector2f textureRenderOffset = Vector2f.ZERO; //!< Offset to apply on the rendering to display glyph at the good position (correct position when render texture is bigger than the glyph size
|
||||||
|
|
||||||
public GlyphProperty(final EsvgFont font, final Glyph glyph, final int fontSize) {
|
public GlyphProperty(final EsvgFont font, final Glyph glyph, final int fontSize) {
|
||||||
this.glyph = glyph;
|
this.glyph = glyph;
|
||||||
this.charcode = this.glyph.getUnicodeValue();
|
this.charcode = this.glyph.getUnicodeValue();
|
||||||
this.fontSize = fontSize;
|
this.fontSize = fontSize;
|
||||||
this.sizeTexture = font.calculateWidthRendering(glyph.getUnicodeValue(), fontSize);
|
this.sizeTexture = font.calculateWidthRendering(glyph.getUnicodeValue(), fontSize);
|
||||||
this.scaleFactor = font.calculateSclaeFactor(fontSize);
|
this.scaleFactor = font.calculateSclaleFactor(fontSize);
|
||||||
|
this.textureRenderOffset = font.calculateRenderOffset(fontSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
public GlyphProperty(final EsvgFont font, final int charcode, final int fontSize) {
|
public GlyphProperty(final EsvgFont font, final int charcode, final int fontSize) {
|
||||||
@ -83,6 +85,10 @@ public class GlyphProperty {
|
|||||||
return this.glyph.getHorizAdvX() * this.scaleFactor;
|
return this.glyph.getHorizAdvX() * this.scaleFactor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Vector2f getTextureRenderOffset() {
|
||||||
|
return this.textureRenderOffset;
|
||||||
|
}
|
||||||
|
|
||||||
public int getUnicodeValue() {
|
public int getUnicodeValue() {
|
||||||
return this.charcode;
|
return this.charcode;
|
||||||
}
|
}
|
||||||
|
@ -24,8 +24,7 @@ public class Container extends Widget {
|
|||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*/
|
*/
|
||||||
public Container() {
|
public Container() {}
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void calculateMinMaxSize() {
|
public void calculateMinMaxSize() {
|
||||||
@ -145,7 +144,7 @@ public class Container extends Widget {
|
|||||||
@Override
|
@Override
|
||||||
public void onRegenerateDisplay() {
|
public void onRegenerateDisplay() {
|
||||||
if (this.subWidget != null) {
|
if (this.subWidget != null) {
|
||||||
this.subWidget.onRegenerateDisplay();
|
this.subWidget.systemRegenerateDisplay();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -205,7 +205,7 @@ public class ContainerN extends Widget {
|
|||||||
public void onRegenerateDisplay() {
|
public void onRegenerateDisplay() {
|
||||||
for (Widget it : this.subWidget) {
|
for (Widget it : this.subWidget) {
|
||||||
if (it != null) {
|
if (it != null) {
|
||||||
it.onRegenerateDisplay();
|
it.systemRegenerateDisplay();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
761
src/org/atriasoft/ewol/widget/Entry.java
Normal file
761
src/org/atriasoft/ewol/widget/Entry.java
Normal file
@ -0,0 +1,761 @@
|
|||||||
|
package org.atriasoft.ewol.widget;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
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.FMath;
|
||||||
|
import org.atriasoft.etk.math.Vector2f;
|
||||||
|
import org.atriasoft.ewol.Padding;
|
||||||
|
import org.atriasoft.ewol.annotation.EwolDescription;
|
||||||
|
import org.atriasoft.ewol.annotation.EwolSignal;
|
||||||
|
import org.atriasoft.ewol.compositing.CompositingText;
|
||||||
|
import org.atriasoft.ewol.compositing.GuiShape;
|
||||||
|
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.exml.annotation.XmlManaged;
|
||||||
|
import org.atriasoft.exml.annotation.XmlName;
|
||||||
|
import org.atriasoft.exml.annotation.XmlProperty;
|
||||||
|
import org.atriasoft.gale.context.ClipBoard;
|
||||||
|
import org.atriasoft.gale.context.ClipboardList;
|
||||||
|
import org.atriasoft.gale.key.KeyKeyboard;
|
||||||
|
import org.atriasoft.gale.key.KeyStatus;
|
||||||
|
import org.atriasoft.gale.key.KeyType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup ewolWidgetGroup
|
||||||
|
* Entry box display :
|
||||||
|
*
|
||||||
|
* ~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
* ----------------------------------------------
|
||||||
|
* | Editable Text |
|
||||||
|
* ----------------------------------------------
|
||||||
|
* ~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
*/
|
||||||
|
public class Entry extends Widget {
|
||||||
|
//private int colorIdCursor; //!< color property of the text cursor
|
||||||
|
//private int colorIdSelection; //!< color property of the text selection
|
||||||
|
//private int colorIdTextBg; //!< color property of the text background
|
||||||
|
|
||||||
|
private int colorIdTextFg; //!< color property of the text foreground
|
||||||
|
|
||||||
|
private boolean displayCursor = false; //!< Cursor must be display only when the widget has the focus
|
||||||
|
|
||||||
|
private int displayCursorPos = 2; //!< Cursor position in number of Char
|
||||||
|
|
||||||
|
private int displayCursorPosSelection = 2; //!< Selection position end (can be befor or after cursor and == this.displayCursorPos chan no selection availlable
|
||||||
|
private int displayStartPosition = 0; //!< offset in pixel of the display of the UString
|
||||||
|
private boolean needUpdateTextPos = true; //!< text position can have change
|
||||||
|
protected Connection periodicConnectionHanble; //!< Periodic call handle to remove it when needed
|
||||||
|
@XmlManaged
|
||||||
|
@XmlProperty
|
||||||
|
@XmlName(value = "config")
|
||||||
|
@EwolDescription(value = "configuration of the widget")
|
||||||
|
private Uri propertyConfig = new Uri("THEME", "shape/Entry.json", "ewol");
|
||||||
|
@XmlManaged
|
||||||
|
@XmlProperty
|
||||||
|
@XmlName(value = "max")
|
||||||
|
@EwolDescription(value = "Maximum char that can be set on the Entry")
|
||||||
|
private int propertyMaxCharacter = Integer.MAX_VALUE; //!< number max of Character in the list
|
||||||
|
@XmlManaged
|
||||||
|
@XmlProperty
|
||||||
|
@XmlName(value = "password")
|
||||||
|
@EwolDescription(value = "Not display content in password mode")
|
||||||
|
private boolean propertyPassword = false; //!< Disable display of the content of the entry
|
||||||
|
/// regular expression value
|
||||||
|
@XmlManaged
|
||||||
|
@XmlProperty
|
||||||
|
@XmlName(value = "regex")
|
||||||
|
@EwolDescription(value = "Control what it is write with a regular expression")
|
||||||
|
private String propertyRegex = ".*";
|
||||||
|
/// Text to display when nothing in in the entry (decorated text...)
|
||||||
|
@XmlManaged
|
||||||
|
@XmlProperty
|
||||||
|
@XmlName(value = "empty-text")
|
||||||
|
@EwolDescription(value = "Text when nothing is written")
|
||||||
|
private String propertyTextWhenNothing = null;
|
||||||
|
|
||||||
|
@XmlManaged
|
||||||
|
@XmlProperty
|
||||||
|
@XmlName(value = "value")
|
||||||
|
@EwolDescription(value = "Value display in the entry (decorated text)")
|
||||||
|
private String propertyValue = "Test Text..."; //!< string that must be displayed
|
||||||
|
|
||||||
|
private Pattern regex = null; //!< regular expression to check content
|
||||||
|
|
||||||
|
private GuiShape shape;
|
||||||
|
//.create()
|
||||||
|
@EwolSignal(name = "click", description = "the user Click on the Entry box")
|
||||||
|
public SignalEmpty signalClick = new SignalEmpty(); //!< bang on click the entry box
|
||||||
|
@EwolSignal(name = "enter", description = "The cursor enter inside the button")
|
||||||
|
public Signal<String> signalEnter = new Signal<>(); //!< Enter key is pressed
|
||||||
|
@EwolSignal(name = "modify", description = "Entry box value change")
|
||||||
|
public Signal<String> signalModify = new Signal<>(); //!< data change
|
||||||
|
private final CompositingText text = new CompositingText(); //!< text display this.text
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contuctor
|
||||||
|
* @param _newData The USting that might be set in the Entry box (no event generation!!)
|
||||||
|
*/
|
||||||
|
public Entry() {
|
||||||
|
this.propertyCanFocus = true;
|
||||||
|
onChangePropertyShaper();
|
||||||
|
|
||||||
|
this.regex = Pattern.compile(this.propertyRegex);
|
||||||
|
if (this.regex == null) {
|
||||||
|
Log.error("can not parse regex for : " + this.propertyRegex);
|
||||||
|
}
|
||||||
|
markToRedraw();
|
||||||
|
shortCutAdd("ctrl+w", "clean");
|
||||||
|
shortCutAdd("ctrl+x", "cut");
|
||||||
|
shortCutAdd("ctrl+c", "copy");
|
||||||
|
shortCutAdd("ctrl+v", "paste");
|
||||||
|
shortCutAdd("ctrl+a", "select:all");
|
||||||
|
shortCutAdd("ctrl+shift+a", "select:none");
|
||||||
|
this.shape = new GuiShape(this.propertyConfig);
|
||||||
|
//TODO this.signalShortcut.connect(this, Entry::onCallbackShortCut);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void calculateMinMaxSize() {
|
||||||
|
// call main class
|
||||||
|
super.calculateMinMaxSize();
|
||||||
|
// get generic padding
|
||||||
|
Padding padding = Padding.ZERO;
|
||||||
|
if (this.shape != null) {
|
||||||
|
padding = this.shape.getPadding();
|
||||||
|
}
|
||||||
|
int minHeight = (int) this.text.getHeight();//calculateSize('A').y();
|
||||||
|
|
||||||
|
Vector2f minimumSizeBase = new Vector2f(20, minHeight);
|
||||||
|
// add padding :
|
||||||
|
minimumSizeBase = minimumSizeBase.add(padding.x(), padding.y());
|
||||||
|
this.minSize = Vector2f.max(this.minSize, minimumSizeBase);
|
||||||
|
// verify the min max of the min size ...
|
||||||
|
checkMinSize();
|
||||||
|
Log.error("min size = " + this.minSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void changeStatusIn(final int newStatusId) {
|
||||||
|
/*
|
||||||
|
if (this.shaper.changeStatusIn(_newStatusId)) {
|
||||||
|
this.periodicConnectionHanble = EwolObject.getObjectManager().periodicCall.connect(this, ewol::widget::Entry::periodicCall);
|
||||||
|
markToRedraw();
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copy the selected data on the specify clipboard
|
||||||
|
* @param clipboardID Selected clipboard
|
||||||
|
*/
|
||||||
|
public void copySelectionToClipBoard(final ClipboardList clipboardID) {
|
||||||
|
if (this.displayCursorPosSelection == this.displayCursorPos) {
|
||||||
|
// nothing to cut ...
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int pos1 = this.displayCursorPosSelection;
|
||||||
|
int pos2 = this.displayCursorPos;
|
||||||
|
if (this.displayCursorPosSelection > this.displayCursorPos) {
|
||||||
|
pos2 = this.displayCursorPosSelection;
|
||||||
|
pos1 = this.displayCursorPos;
|
||||||
|
}
|
||||||
|
// Copy
|
||||||
|
String tmpData = this.propertyValue.substring(pos1, pos2);
|
||||||
|
ClipBoard.set(clipboardID, tmpData);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Uri getPropertyConfig() {
|
||||||
|
return this.propertyConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPropertyMaxCharacter() {
|
||||||
|
return this.propertyMaxCharacter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPropertyRegex() {
|
||||||
|
return this.propertyRegex;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPropertyTextWhenNothing() {
|
||||||
|
return this.propertyTextWhenNothing;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPropertyValue() {
|
||||||
|
return this.propertyValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isPropertyPassword() {
|
||||||
|
return this.propertyPassword;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* informe the system thet the text change and the start position change
|
||||||
|
*/
|
||||||
|
protected void markToUpdateTextPosition() {
|
||||||
|
this.needUpdateTextPos = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onCallbackCopy() {
|
||||||
|
copySelectionToClipBoard(ClipboardList.CLIPBOARD_STD);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onCallbackCut() {
|
||||||
|
copySelectionToClipBoard(ClipboardList.CLIPBOARD_STD);
|
||||||
|
removeSelected();
|
||||||
|
this.signalModify.emit(this.propertyValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onCallbackEntryClean() {
|
||||||
|
this.propertyValue = "";
|
||||||
|
this.displayStartPosition = 0;
|
||||||
|
this.displayCursorPos = 0;
|
||||||
|
this.displayCursorPosSelection = this.displayCursorPos;
|
||||||
|
markToRedraw();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onCallbackPaste() {
|
||||||
|
ClipBoard.request(ClipboardList.CLIPBOARD_STD);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onCallbackSelect(final boolean all) {
|
||||||
|
if (all) {
|
||||||
|
this.displayCursorPosSelection = 0;
|
||||||
|
this.displayCursorPos = this.propertyValue.length();
|
||||||
|
} else {
|
||||||
|
this.displayCursorPosSelection = this.displayCursorPos;
|
||||||
|
}
|
||||||
|
markToRedraw();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onCallbackShortCut(final String value) {
|
||||||
|
if (value.equals("clean")) {
|
||||||
|
onCallbackEntryClean();
|
||||||
|
} else if (value.equals("cut")) {
|
||||||
|
onCallbackCut();
|
||||||
|
} else if (value.equals("copy")) {
|
||||||
|
onCallbackCopy();
|
||||||
|
} else if (value.equals("paste")) {
|
||||||
|
Log.warning("Request past ...");
|
||||||
|
onCallbackPaste();
|
||||||
|
} else if (value.equals("select:all")) {
|
||||||
|
onCallbackSelect(true);
|
||||||
|
} else if (value.equals("select:none")) {
|
||||||
|
onCallbackSelect(false);
|
||||||
|
} else {
|
||||||
|
Log.warning("Unknow event from ShortCut : " + value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onChangePropertyMaxCharacter() {
|
||||||
|
// TODO : check number of char in the data
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onChangePropertyPassword() {
|
||||||
|
markToRedraw();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onChangePropertyRegex() {
|
||||||
|
this.regex = Pattern.compile(this.propertyRegex);
|
||||||
|
if (this.regex != null) {
|
||||||
|
Log.error("can not parse regex for : " + this.propertyRegex);
|
||||||
|
}
|
||||||
|
markToRedraw();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onChangePropertyShaper() {
|
||||||
|
if (this.shape == null) {
|
||||||
|
this.shape = new GuiShape(this.propertyConfig);
|
||||||
|
} else {
|
||||||
|
this.shape.setSource(this.propertyConfig);
|
||||||
|
}
|
||||||
|
// this.colorIdTextFg = this.shape.requestColor("text-foreground");
|
||||||
|
// this.colorIdTextBg = this.shape.requestColor("text-background");
|
||||||
|
// this.colorIdCursor = this.shape.requestColor("text-cursor");
|
||||||
|
// this.colorIdSelection = this.shape.requestColor("text-selection");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onChangePropertyTextWhenNothing() {
|
||||||
|
markToRedraw();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onChangePropertyValue() {
|
||||||
|
String newData = this.propertyValue;
|
||||||
|
if ((long) newData.length() > this.propertyMaxCharacter) {
|
||||||
|
newData = newData.substring(0, this.propertyMaxCharacter);
|
||||||
|
Log.debug("Limit entry set of data... " + newData);
|
||||||
|
}
|
||||||
|
// set the value with the check of the RegExp ...
|
||||||
|
setInternalValue(newData);
|
||||||
|
if (newData == this.propertyValue) {
|
||||||
|
this.displayCursorPos = this.propertyValue.length();
|
||||||
|
this.displayCursorPosSelection = this.displayCursorPos;
|
||||||
|
Log.verbose("Set : '" + newData + "'");
|
||||||
|
}
|
||||||
|
markToRedraw();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDraw() {
|
||||||
|
if (this.shape != null) {
|
||||||
|
this.shape.draw();
|
||||||
|
}
|
||||||
|
this.text.draw();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEventClipboard(final ClipboardList clipboardID) {
|
||||||
|
// remove curent selected data ...
|
||||||
|
removeSelected();
|
||||||
|
// get current selection / Copy :
|
||||||
|
String tmpData = ClipBoard.get(clipboardID);
|
||||||
|
// add it on the current display:
|
||||||
|
if (tmpData.length() != 0) {
|
||||||
|
StringBuilder newData = new StringBuilder(this.propertyValue);
|
||||||
|
newData.insert(this.displayCursorPos, tmpData.charAt(0));
|
||||||
|
setInternalValue(newData.toString());
|
||||||
|
if (this.propertyValue.equals(newData.toString())) {
|
||||||
|
if (this.propertyValue.length() == tmpData.length()) {
|
||||||
|
this.displayCursorPos = tmpData.length();
|
||||||
|
} else {
|
||||||
|
this.displayCursorPos += tmpData.length();
|
||||||
|
}
|
||||||
|
this.displayCursorPosSelection = this.displayCursorPos;
|
||||||
|
markToRedraw();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.signalModify.emit(this.propertyValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onEventEntry(final EventEntry event) {
|
||||||
|
Log.warning("Event on Entry ... " + event);
|
||||||
|
if (event.type() == KeyKeyboard.CHARACTER) {
|
||||||
|
if (event.status() == KeyStatus.down) {
|
||||||
|
// remove current selected data ...
|
||||||
|
removeSelected();
|
||||||
|
if (event.getChar() == '\n' || event.getChar() == '\r') {
|
||||||
|
this.signalEnter.emit(this.propertyValue);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (event.getChar() == 0x7F) {
|
||||||
|
// SUPPR :
|
||||||
|
if (this.propertyValue.length() > 0 && this.displayCursorPos < (long) this.propertyValue.length()) {
|
||||||
|
StringBuilder newData = new StringBuilder(this.propertyValue);
|
||||||
|
newData.deleteCharAt(this.displayCursorPos);
|
||||||
|
this.propertyValue = newData.toString();
|
||||||
|
this.displayCursorPos = Math.max(this.displayCursorPos, 0);
|
||||||
|
this.displayCursorPosSelection = this.displayCursorPos;
|
||||||
|
}
|
||||||
|
} else if (event.getChar() == 0x08) {
|
||||||
|
// DEL :
|
||||||
|
if (this.propertyValue.length() > 0 && this.displayCursorPos != 0) {
|
||||||
|
StringBuilder newData = new StringBuilder(this.propertyValue);
|
||||||
|
newData.deleteCharAt(this.displayCursorPos - 1);
|
||||||
|
this.propertyValue = newData.toString();
|
||||||
|
this.displayCursorPos--;
|
||||||
|
this.displayCursorPos = Math.max(this.displayCursorPos, 0);
|
||||||
|
this.displayCursorPosSelection = this.displayCursorPos;
|
||||||
|
}
|
||||||
|
} else if (event.getChar() >= 20) {
|
||||||
|
Log.error("get data: '" + event.getChar() + "' = '" + event.getChar() + "'");
|
||||||
|
if ((long) this.propertyValue.length() > this.propertyMaxCharacter) {
|
||||||
|
Log.info("Reject data for entry : '" + event.getChar() + "'");
|
||||||
|
} else {
|
||||||
|
StringBuilder newData = new StringBuilder(this.propertyValue);
|
||||||
|
newData.insert(this.displayCursorPos, event.getChar());
|
||||||
|
setInternalValue(newData.toString());
|
||||||
|
if (this.propertyValue.equals(newData)) {
|
||||||
|
this.displayCursorPos += 1;//inputData.length();
|
||||||
|
this.displayCursorPosSelection = this.displayCursorPos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.signalModify.emit(this.propertyValue);
|
||||||
|
markToRedraw();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (event.status() == KeyStatus.down) {
|
||||||
|
switch (event.type()) {
|
||||||
|
case LEFT:
|
||||||
|
this.displayCursorPos--;
|
||||||
|
break;
|
||||||
|
case RIGHT:
|
||||||
|
this.displayCursorPos++;
|
||||||
|
break;
|
||||||
|
case START:
|
||||||
|
this.displayCursorPos = 0;
|
||||||
|
break;
|
||||||
|
case END:
|
||||||
|
this.displayCursorPos = this.propertyValue.length();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
this.displayCursorPos = FMath.avg(0, this.displayCursorPos, this.propertyValue.length());
|
||||||
|
this.displayCursorPosSelection = this.displayCursorPos;
|
||||||
|
markToRedraw();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onEventInput(final EventInput event) {
|
||||||
|
Log.warning("Event on Input ... " + event);
|
||||||
|
if (event.inputId() == 1) {
|
||||||
|
if (KeyStatus.pressSingle == event.status()) {
|
||||||
|
keepFocus();
|
||||||
|
this.signalClick.emit();
|
||||||
|
//nothing to do ...
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (KeyStatus.pressDouble == event.status()) {
|
||||||
|
keepFocus();
|
||||||
|
// select word
|
||||||
|
this.displayCursorPosSelection = this.displayCursorPos - 1;
|
||||||
|
// search forward
|
||||||
|
for (int iii = this.displayCursorPos; iii <= this.propertyValue.length(); iii++) {
|
||||||
|
if (iii == this.propertyValue.length()) {
|
||||||
|
this.displayCursorPos = iii;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!((this.propertyValue.charAt(iii) >= 'a' && this.propertyValue.charAt(iii) <= 'z') || (this.propertyValue.charAt(iii) >= 'A' && this.propertyValue.charAt(iii) <= 'Z')
|
||||||
|
|| (this.propertyValue.charAt(iii) >= '0' && this.propertyValue.charAt(iii) <= '9') || this.propertyValue.charAt(iii) == '_' || this.propertyValue.charAt(iii) == '-')) {
|
||||||
|
this.displayCursorPos = iii;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// search backward
|
||||||
|
for (int iii = this.displayCursorPosSelection; iii >= -1; iii--) {
|
||||||
|
if (iii == -1) {
|
||||||
|
this.displayCursorPosSelection = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!((this.propertyValue.charAt(iii) >= 'a' && this.propertyValue.charAt(iii) <= 'z') || (this.propertyValue.charAt(iii) >= 'A' && this.propertyValue.charAt(iii) <= 'Z')
|
||||||
|
|| (this.propertyValue.charAt(iii) >= '0' && this.propertyValue.charAt(iii) <= '9') || this.propertyValue.charAt(iii) == '_' || this.propertyValue.charAt(iii) == '-')) {
|
||||||
|
this.displayCursorPosSelection = iii + 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Copy to clipboard Middle ...
|
||||||
|
copySelectionToClipBoard(ClipboardList.CLIPBOARD_SELECTION);
|
||||||
|
markToRedraw();
|
||||||
|
} else if (KeyStatus.pressTriple == event.status()) {
|
||||||
|
keepFocus();
|
||||||
|
this.displayCursorPosSelection = 0;
|
||||||
|
this.displayCursorPos = this.propertyValue.length();
|
||||||
|
} else if (KeyStatus.down == event.status()) {
|
||||||
|
keepFocus();
|
||||||
|
updateCursorPosition(event.pos());
|
||||||
|
markToRedraw();
|
||||||
|
} else if (KeyStatus.move == event.status()) {
|
||||||
|
keepFocus();
|
||||||
|
updateCursorPosition(event.pos(), true);
|
||||||
|
markToRedraw();
|
||||||
|
} else if (KeyStatus.up == event.status()) {
|
||||||
|
keepFocus();
|
||||||
|
updateCursorPosition(event.pos(), true);
|
||||||
|
// Copy to clipboard Middle ...
|
||||||
|
copySelectionToClipBoard(ClipboardList.CLIPBOARD_SELECTION);
|
||||||
|
markToRedraw();
|
||||||
|
}
|
||||||
|
} else if (KeyType.mouse == event.type() && event.inputId() == 2) {
|
||||||
|
if (event.status() == KeyStatus.down || event.status() == KeyStatus.move || event.status() == KeyStatus.up) {
|
||||||
|
keepFocus();
|
||||||
|
// updatethe cursor position :
|
||||||
|
updateCursorPosition(event.pos());
|
||||||
|
}
|
||||||
|
// Paste current selection only when up button
|
||||||
|
if (event.status() == KeyStatus.up) {
|
||||||
|
keepFocus();
|
||||||
|
// middle button => past data...
|
||||||
|
ClipBoard.request(ClipboardList.CLIPBOARD_SELECTION);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onGetFocus() {
|
||||||
|
this.displayCursor = true;
|
||||||
|
//changeStatusIn(STATUS_SELECTED);
|
||||||
|
showKeyboard();
|
||||||
|
markToRedraw();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onLostFocus() {
|
||||||
|
this.displayCursor = false;
|
||||||
|
//changeStatusIn(STATUS_NORMAL);
|
||||||
|
hideKeyboard();
|
||||||
|
markToRedraw();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRegenerateDisplay() {
|
||||||
|
if (!needRedraw()) {
|
||||||
|
//return;
|
||||||
|
}
|
||||||
|
//Log.verbose("Regenerate Display ==> is needed: '" + this.propertyValue + "'");
|
||||||
|
this.shape.clear();
|
||||||
|
this.text.clear();
|
||||||
|
if (this.colorIdTextFg >= 0) {
|
||||||
|
//this.text.setDefaultColorFg(this.shape.getColor(this.colorIdTextFg));
|
||||||
|
//this.text.setDefaultColorBg(this.shape.getColor(this.colorIdTextBg));
|
||||||
|
//this.text.setCursorColor(this.shape.getColor(this.colorIdCursor));
|
||||||
|
//this.text.setSelectionColor(this.shape.getColor(this.colorIdSelection));
|
||||||
|
}
|
||||||
|
updateTextPosition();
|
||||||
|
Padding padding = this.shape.getPadding();
|
||||||
|
|
||||||
|
Vector2f tmpSizeShaper = this.minSize;
|
||||||
|
if (this.propertyFill.x()) {
|
||||||
|
tmpSizeShaper = tmpSizeShaper.withX(this.size.x());
|
||||||
|
}
|
||||||
|
if (this.propertyFill.y()) {
|
||||||
|
tmpSizeShaper = tmpSizeShaper.withY(this.size.y());
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector2f tmpOriginShaper = this.size.less(tmpSizeShaper).multiply(0.5f);
|
||||||
|
Vector2f tmpSizeText = tmpSizeShaper.less(padding.x(), padding.y());
|
||||||
|
Vector2f tmpOriginText = this.size.less(tmpSizeText).multiply(0.5f);
|
||||||
|
// sometimes, the user define an height bigger than the real size needed == > in this case we need to center the text in the shaper ...
|
||||||
|
int minHeight = (int) this.text.getHeight();
|
||||||
|
if (tmpSizeText.y() > minHeight) {
|
||||||
|
tmpOriginText = tmpOriginText.add(0, (tmpSizeText.y() - minHeight) * 0.5f);
|
||||||
|
}
|
||||||
|
// fix all the position in the int class:
|
||||||
|
tmpSizeShaper = Vector2f.clipInt(tmpSizeShaper);
|
||||||
|
tmpOriginShaper = Vector2f.clipInt(tmpOriginShaper);
|
||||||
|
tmpSizeText = Vector2f.clipInt(tmpSizeText);
|
||||||
|
tmpOriginText = Vector2f.clipInt(tmpOriginText);
|
||||||
|
|
||||||
|
this.text.reset();
|
||||||
|
this.text.setClippingWidth(tmpOriginText, tmpSizeText);
|
||||||
|
this.text.setPos(tmpOriginText.add(this.displayStartPosition, 0));
|
||||||
|
if (this.displayCursorPosSelection != this.displayCursorPos) {
|
||||||
|
this.text.setCursorSelection(this.displayCursorPos, this.displayCursorPosSelection);
|
||||||
|
} else {
|
||||||
|
this.text.setCursorPos(this.displayCursorPos);
|
||||||
|
}
|
||||||
|
char[] valueToDisplay = this.propertyValue.toCharArray();
|
||||||
|
if (this.propertyPassword) {
|
||||||
|
Arrays.fill(valueToDisplay, '*');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (valueToDisplay.length != 0) {
|
||||||
|
this.text.print(new String(valueToDisplay));
|
||||||
|
} else if (this.propertyTextWhenNothing != null) {
|
||||||
|
this.text.printDecorated(this.propertyTextWhenNothing);
|
||||||
|
}
|
||||||
|
this.text.setClippingMode(false);
|
||||||
|
|
||||||
|
this.shape.setShape(tmpOriginShaper, tmpSizeShaper, tmpOriginText, tmpSizeText);
|
||||||
|
this.text.flush();
|
||||||
|
this.shape.flush();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Periodic call to update grapgic display
|
||||||
|
* @param _event Time generic event
|
||||||
|
*/
|
||||||
|
protected void periodicCall(final EventTime event) {
|
||||||
|
if (!this.shape.periodicCall(event)) {
|
||||||
|
this.periodicConnectionHanble.disconnect();
|
||||||
|
}
|
||||||
|
markToRedraw();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* remove the selected area
|
||||||
|
* @note This request a regeneration of the display
|
||||||
|
*/
|
||||||
|
public void removeSelected() {
|
||||||
|
if (this.displayCursorPosSelection == this.displayCursorPos) {
|
||||||
|
// nothing to cut ...
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int pos1 = this.displayCursorPosSelection;
|
||||||
|
int pos2 = this.displayCursorPos;
|
||||||
|
if (this.displayCursorPosSelection > this.displayCursorPos) {
|
||||||
|
pos2 = this.displayCursorPosSelection;
|
||||||
|
pos1 = this.displayCursorPos;
|
||||||
|
}
|
||||||
|
// remove data ...
|
||||||
|
this.displayCursorPos = pos1;
|
||||||
|
this.displayCursorPosSelection = pos1;
|
||||||
|
StringBuilder tmp = new StringBuilder(this.propertyValue);
|
||||||
|
tmp.delete(pos1, pos2 - pos1);
|
||||||
|
this.propertyValue = tmp.toString();
|
||||||
|
markToRedraw();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* internal check the value with RegExp checking
|
||||||
|
* @param newData The new string to display
|
||||||
|
*/
|
||||||
|
protected void setInternalValue(final String newData) {
|
||||||
|
String previous = this.propertyValue;
|
||||||
|
// check the RegExp :
|
||||||
|
if (newData.length() > 0) {
|
||||||
|
/*
|
||||||
|
if (this.regex.parse(_newData, 0, _newData.size()) == false) {
|
||||||
|
Log.info("The input data does not match with the regExp '" + _newData + "' Regex='" + propertyRegex + "'" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (this.regex.start() != 0) {
|
||||||
|
Log.info("The input data does not match with the regExp '" + _newData + "' Regex='" + propertyRegex + "' (start position error)" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (this.regex.stop() != _newData.size()) {
|
||||||
|
Log.info("The input data does not match with the regExp '" + _newData + "' Regex='" + propertyRegex + "' (stop position error)" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
this.propertyValue = newData;
|
||||||
|
markToRedraw();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPropertyConfig(final Uri propertyConfig) {
|
||||||
|
if (this.propertyConfig.equals(propertyConfig)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.propertyConfig = propertyConfig;
|
||||||
|
onChangePropertyShaper();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPropertyMaxCharacter(final int propertyMaxCharacter) {
|
||||||
|
if (this.propertyMaxCharacter == propertyMaxCharacter) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.propertyMaxCharacter = propertyMaxCharacter;
|
||||||
|
onChangePropertyMaxCharacter();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPropertyPassword(final boolean propertyPassword) {
|
||||||
|
if (this.propertyPassword == propertyPassword) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.propertyPassword = propertyPassword;
|
||||||
|
onChangePropertyPassword();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPropertyRegex(final String propertyRegex) {
|
||||||
|
if (this.propertyRegex.equals(propertyRegex)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.propertyRegex = propertyRegex;
|
||||||
|
onChangePropertyRegex();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPropertyTextWhenNothing(final String propertyTextWhenNothing) {
|
||||||
|
if (this.propertyTextWhenNothing.equals(propertyTextWhenNothing)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.propertyTextWhenNothing = propertyTextWhenNothing;
|
||||||
|
onChangePropertyTextWhenNothing();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPropertyValue(final String propertyValue) {
|
||||||
|
if (this.propertyValue.equals(propertyValue)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.propertyValue = propertyValue;
|
||||||
|
onChangePropertyValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* change the cursor position with the curent position requested on the display
|
||||||
|
* @param pos Absolute position of the event
|
||||||
|
* @note The display is automaticly requested when change apear.
|
||||||
|
*/
|
||||||
|
protected void updateCursorPosition(final Vector2f pos) {
|
||||||
|
updateCursorPosition(pos, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void updateCursorPosition(final Vector2f pos, final boolean selection/*=false*/) {
|
||||||
|
Padding padding = this.shape.getPadding();
|
||||||
|
|
||||||
|
Vector2f relPos = relativePosition(pos);
|
||||||
|
relPos = relPos.withX(relPos.x() - this.displayStartPosition - padding.left());
|
||||||
|
// try to find the new cursor position :
|
||||||
|
String tmpDisplay = this.propertyValue.substring(0, this.displayStartPosition);
|
||||||
|
int displayHidenSize = (int) this.text.calculateSize(tmpDisplay).x();
|
||||||
|
//Log.debug("hidenSize : " + displayHidenSize);
|
||||||
|
int newCursorPosition = -1;
|
||||||
|
int tmpTextOriginX = (int) padding.left();
|
||||||
|
for (int iii = 0; iii < this.propertyValue.length(); iii++) {
|
||||||
|
tmpDisplay = this.propertyValue.substring(0, iii);
|
||||||
|
int tmpWidth = (int) (this.text.calculateSize(tmpDisplay).x() - displayHidenSize);
|
||||||
|
if (tmpWidth >= relPos.x() - tmpTextOriginX) {
|
||||||
|
newCursorPosition = iii;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (newCursorPosition == -1) {
|
||||||
|
newCursorPosition = this.propertyValue.length();
|
||||||
|
}
|
||||||
|
if (!selection) {
|
||||||
|
this.displayCursorPos = newCursorPosition;
|
||||||
|
this.displayCursorPosSelection = this.displayCursorPos;
|
||||||
|
markToRedraw();
|
||||||
|
} else {
|
||||||
|
if (this.displayCursorPos == this.displayCursorPosSelection) {
|
||||||
|
this.displayCursorPosSelection = this.displayCursorPos;
|
||||||
|
}
|
||||||
|
this.displayCursorPos = newCursorPosition;
|
||||||
|
markToRedraw();
|
||||||
|
}
|
||||||
|
markToUpdateTextPosition();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* update the display position start == > depending of the position of the Cursor and the size of the Data inside
|
||||||
|
* @change this.displayStartPosition < == updated
|
||||||
|
*/
|
||||||
|
protected void updateTextPosition() {
|
||||||
|
if (!this.needUpdateTextPos) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Padding padding = this.shape.getPadding();
|
||||||
|
|
||||||
|
int tmpSizeX = (int) this.minSize.x();
|
||||||
|
if (this.propertyFill.x()) {
|
||||||
|
tmpSizeX = (int) this.size.x();
|
||||||
|
}
|
||||||
|
int tmpUserSize = (int) (tmpSizeX - padding.x());
|
||||||
|
int totalWidth = (int) this.text.calculateSize(this.propertyValue).x();
|
||||||
|
// Check if the data inside the display can be contain in the entry box
|
||||||
|
if (totalWidth < tmpUserSize) {
|
||||||
|
// all can be display :
|
||||||
|
this.displayStartPosition = 0;
|
||||||
|
} else {
|
||||||
|
// all can not be set :
|
||||||
|
String tmpDisplay = this.propertyValue.substring(0, this.displayCursorPos);
|
||||||
|
int pixelCursorPos = (int) this.text.calculateSize(tmpDisplay).x();
|
||||||
|
// check if the Cussor is visible at 10px nearest the border :
|
||||||
|
int tmp1 = pixelCursorPos + this.displayStartPosition;
|
||||||
|
Log.debug("cursorPos=" + pixelCursorPos + "px maxSize=" + tmpUserSize + "px tmp1=" + tmp1);
|
||||||
|
if (tmp1 < 10) {
|
||||||
|
// set the cursor on le left
|
||||||
|
this.displayStartPosition = Math.min(-pixelCursorPos + 10, 0);
|
||||||
|
} else if (tmp1 > tmpUserSize - 10) {
|
||||||
|
// set the cursor of the Right
|
||||||
|
this.displayStartPosition = Math.min(-pixelCursorPos + tmpUserSize - 10, 0);
|
||||||
|
}
|
||||||
|
// else : the cursor is inside the display
|
||||||
|
//this.displayStartPosition = -totalWidth + tmpUserSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -5,7 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.atriasoft.ewol.widget;
|
package org.atriasoft.ewol.widget;
|
||||||
|
|
||||||
import org.atriasoft.egami.Image;
|
import org.atriasoft.egami.ImageByteRGBA;
|
||||||
import org.atriasoft.esignal.SignalEmpty;
|
import org.atriasoft.esignal.SignalEmpty;
|
||||||
import org.atriasoft.etk.Dimension;
|
import org.atriasoft.etk.Dimension;
|
||||||
import org.atriasoft.etk.Uri;
|
import org.atriasoft.etk.Uri;
|
||||||
@ -280,7 +280,7 @@ public class ImageDisplay extends Widget {
|
|||||||
* Set an image with direct elements
|
* Set an image with direct elements
|
||||||
* @param image Image to set in the display
|
* @param image Image to set in the display
|
||||||
*/
|
*/
|
||||||
public void setCustumSource(final Image image) {
|
public void setCustumSource(final ImageByteRGBA image) {
|
||||||
// TODO : Better interfacing of all element internal ==> this is a temporary prototype
|
// TODO : Better interfacing of all element internal ==> this is a temporary prototype
|
||||||
this.compositing.setSource(image);
|
this.compositing.setSource(image);
|
||||||
markToRedraw();
|
markToRedraw();
|
||||||
|
@ -137,7 +137,7 @@ public class Label extends Widget {
|
|||||||
@Override
|
@Override
|
||||||
public void onRegenerateDisplay() {
|
public void onRegenerateDisplay() {
|
||||||
if (!needRedraw()) {
|
if (!needRedraw()) {
|
||||||
return;
|
//return;
|
||||||
}
|
}
|
||||||
this.text.clear();
|
this.text.clear();
|
||||||
int paddingSize = 2;
|
int paddingSize = 2;
|
||||||
@ -155,7 +155,7 @@ public class Label extends Widget {
|
|||||||
|
|
||||||
Vector2i localSize = new Vector2i((int) this.minSize.x(), (int) this.minSize.y());
|
Vector2i localSize = new Vector2i((int) this.minSize.x(), (int) this.minSize.y());
|
||||||
|
|
||||||
// no change for the text orogin :
|
// no change for the text origin :
|
||||||
Vector3f tmpTextOrigin = new Vector3f((this.size.x() - this.minSize.x()) / 2.0f, (this.size.y() - this.minSize.y()) / 2.0f, 0);
|
Vector3f tmpTextOrigin = new Vector3f((this.size.x() - this.minSize.x()) / 2.0f, (this.size.y() - this.minSize.y()) / 2.0f, 0);
|
||||||
|
|
||||||
if (this.propertyFill.x()) {
|
if (this.propertyFill.x()) {
|
||||||
|
@ -45,7 +45,6 @@ public class Spacer extends Widget {
|
|||||||
@Override
|
@Override
|
||||||
public void onDraw() {
|
public void onDraw() {
|
||||||
this.draw.draw();
|
this.draw.draw();
|
||||||
this.draw.flush();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -10,6 +10,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.atriasoft.esignal.Signal;
|
import org.atriasoft.esignal.Signal;
|
||||||
|
import org.atriasoft.etk.Color;
|
||||||
import org.atriasoft.etk.Dimension;
|
import org.atriasoft.etk.Dimension;
|
||||||
import org.atriasoft.etk.Distance;
|
import org.atriasoft.etk.Distance;
|
||||||
import org.atriasoft.etk.math.FMath;
|
import org.atriasoft.etk.math.FMath;
|
||||||
@ -22,6 +23,7 @@ import org.atriasoft.ewol.DrawProperty;
|
|||||||
import org.atriasoft.ewol.Gravity;
|
import org.atriasoft.ewol.Gravity;
|
||||||
import org.atriasoft.ewol.annotation.EwolDescription;
|
import org.atriasoft.ewol.annotation.EwolDescription;
|
||||||
import org.atriasoft.ewol.annotation.EwolSignal;
|
import org.atriasoft.ewol.annotation.EwolSignal;
|
||||||
|
import org.atriasoft.ewol.compositing.CompositingDrawing;
|
||||||
import org.atriasoft.ewol.event.EntrySystem;
|
import org.atriasoft.ewol.event.EntrySystem;
|
||||||
import org.atriasoft.ewol.event.EventEntry;
|
import org.atriasoft.ewol.event.EventEntry;
|
||||||
import org.atriasoft.ewol.event.EventInput;
|
import org.atriasoft.ewol.event.EventInput;
|
||||||
@ -55,9 +57,10 @@ public class Widget extends EwolObject {
|
|||||||
// -- keyboard event properties Area
|
// -- keyboard event properties Area
|
||||||
// ----------------------------------------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------------------------------------
|
||||||
private boolean allowRepeatKeyboardEvent = true; //!< This remove the repeating keybord event due to the ant pressing key.
|
private boolean allowRepeatKeyboardEvent = true; //!< This remove the repeating keybord event due to the ant pressing key.
|
||||||
|
|
||||||
private Cursor cursorDisplay = Cursor.arrow;
|
private Cursor cursorDisplay = Cursor.arrow;
|
||||||
|
|
||||||
|
private final CompositingDrawing drawDebugBorder = new CompositingDrawing(); //!< Compositing drawing element
|
||||||
|
|
||||||
// grab cursor mode
|
// grab cursor mode
|
||||||
private boolean grabCursor = false;
|
private boolean grabCursor = false;
|
||||||
|
|
||||||
@ -484,7 +487,7 @@ public class Widget extends EwolObject {
|
|||||||
*/
|
*/
|
||||||
public boolean onEventShortCut(final KeySpecial special, Character unicodeValue, final KeyKeyboard kbMove, final boolean isDown) {
|
public boolean onEventShortCut(final KeySpecial special, Character unicodeValue, final KeyKeyboard kbMove, final boolean isDown) {
|
||||||
unicodeValue = Character.toLowerCase(unicodeValue);
|
unicodeValue = Character.toLowerCase(unicodeValue);
|
||||||
Log.verbose("check shortcut...." + special + " " + unicodeValue + " " + kbMove + " " + (isDown ? "DOWN" : "UP") + " nb shortcut:" + this.localShortcut.size());
|
//Log.verbose("check shortcut...." + special + " " + unicodeValue + " " + kbMove + " " + (isDown ? "DOWN" : "UP") + " nb shortcut:" + this.localShortcut.size());
|
||||||
// Remove the up event of the shortcut...
|
// Remove the up event of the shortcut...
|
||||||
if (!isDown) {
|
if (!isDown) {
|
||||||
for (int iii = this.localShortcut.size() - 1; iii >= 0; iii--) {
|
for (int iii = this.localShortcut.size() - 1; iii >= 0; iii--) {
|
||||||
@ -527,10 +530,7 @@ public class Widget extends EwolObject {
|
|||||||
*/
|
*/
|
||||||
protected void onLostFocus() {}
|
protected void onLostFocus() {}
|
||||||
|
|
||||||
/**
|
protected void onRegenerateDisplay() {}
|
||||||
* Event generated when a redraw is needed
|
|
||||||
*/
|
|
||||||
public void onRegenerateDisplay() {}
|
|
||||||
|
|
||||||
protected void onUpdateMinMaxSize() {
|
protected void onUpdateMinMaxSize() {
|
||||||
final Vector2f pixelMin = this.propertyMinSize.getPixel();
|
final Vector2f pixelMin = this.propertyMinSize.getPixel();
|
||||||
@ -927,12 +927,15 @@ public class Widget extends EwolObject {
|
|||||||
// Scale if needed (feature not validate)
|
// Scale if needed (feature not validate)
|
||||||
final Matrix4f tmpScale = Matrix4f.createMatrixScale(this.zoom, this.zoom, 1.0f);
|
final Matrix4f tmpScale = Matrix4f.createMatrixScale(this.zoom, this.zoom, 1.0f);
|
||||||
// create orthogonal projection for GUI ==> simple to manage staking
|
// create orthogonal projection for GUI ==> simple to manage staking
|
||||||
Matrix4f tmpProjection = Matrix4f.createMatrixOrtho(-tmpSize.size().x() / 2, tmpSize.size().x() / 2, -tmpSize.size().y() / 2, tmpSize.size().y() / 2, -50, 50);
|
Matrix4f tmpProjection = Matrix4f.createMatrixOrtho(-tmpSize.size().x() / 2, tmpSize.size().x() / 2, -tmpSize.size().y() / 2, tmpSize.size().y() / 2, -500, 500);
|
||||||
Matrix4f tmpMat = tmpProjection.multiply(tmpScale).multiply(tmpTranslate);
|
//Matrix4f tmpMat = tmpProjection.multiply(tmpScale).multiply(tmpTranslate);
|
||||||
|
|
||||||
OpenGL.push();
|
OpenGL.push();
|
||||||
// set internal matrix system :
|
// set internal matrix system :
|
||||||
OpenGL.setMatrix(tmpMat);
|
//OpenGL.setMatrix(tmpMat);
|
||||||
|
OpenGL.setMatrix(tmpProjection);
|
||||||
|
OpenGL.setCameraMatrix(tmpScale.multiply(tmpTranslate));
|
||||||
|
this.drawDebugBorder.draw();
|
||||||
//long startTime = ewol::getTime();
|
//long startTime = ewol::getTime();
|
||||||
onDraw();
|
onDraw();
|
||||||
OpenGL.pop();
|
OpenGL.pop();
|
||||||
@ -961,15 +964,43 @@ public class Widget extends EwolObject {
|
|||||||
* @return false the event is not used
|
* @return false the event is not used
|
||||||
*/
|
*/
|
||||||
public boolean systemEventInput(final InputSystem event) {
|
public boolean systemEventInput(final InputSystem event) {
|
||||||
final Widget up = (Widget) this.parent.get();
|
if (this.parent != null) {
|
||||||
if (up != null) {
|
final Widget up = (Widget) this.parent.get();
|
||||||
if (up.systemEventInput(event)) {
|
if (up != null) {
|
||||||
return true;
|
if (up.systemEventInput(event)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return onEventInput(event.event());
|
return onEventInput(event.event());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event generated when a redraw is needed
|
||||||
|
*/
|
||||||
|
public void systemRegenerateDisplay() {
|
||||||
|
if (this.drawDebugBorder != null) {
|
||||||
|
this.drawDebugBorder.clear();
|
||||||
|
this.drawDebugBorder.setColor(Color.RED);
|
||||||
|
this.drawDebugBorder.setPos(1, 1);
|
||||||
|
this.drawDebugBorder.setThickness(1);
|
||||||
|
this.drawDebugBorder.lineRel(this.size.x() - 2, 0); // TODO PB with the thickness when draw rectangle ...
|
||||||
|
this.drawDebugBorder.setPos(this.size.x() - 1, 1);
|
||||||
|
this.drawDebugBorder.lineRel(0, this.size.y() - 2);
|
||||||
|
this.drawDebugBorder.setPos(this.size.x() - 1, this.size.y() - 1);
|
||||||
|
this.drawDebugBorder.lineRel(-this.size.x() - 2, 0);
|
||||||
|
this.drawDebugBorder.setPos(1, this.size.y() - 1);
|
||||||
|
this.drawDebugBorder.lineRel(0, -this.size.y() - 2);
|
||||||
|
/*
|
||||||
|
this.drawDebugBorder.setColor(Color.BLUE);
|
||||||
|
this.drawDebugBorder.setPos(3, 3);
|
||||||
|
this.drawDebugBorder.rectangleWidth(new Vector3f(this.size.x() - 6, this.size.y() - 6, 0));
|
||||||
|
*/
|
||||||
|
this.drawDebugBorder.flush();
|
||||||
|
}
|
||||||
|
onRegenerateDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Un-Grab the cursor (default mode cursor offset)
|
* Un-Grab the cursor (default mode cursor offset)
|
||||||
*/
|
*/
|
||||||
|
@ -157,11 +157,11 @@ public class Windows extends Widget {
|
|||||||
@Override
|
@Override
|
||||||
public void onRegenerateDisplay() {
|
public void onRegenerateDisplay() {
|
||||||
if (this.subWidget != null) {
|
if (this.subWidget != null) {
|
||||||
this.subWidget.onRegenerateDisplay();
|
this.subWidget.systemRegenerateDisplay();
|
||||||
}
|
}
|
||||||
for (Widget it : this.popUpWidgetList) {
|
for (Widget it : this.popUpWidgetList) {
|
||||||
if (it != null) {
|
if (it != null) {
|
||||||
it.onRegenerateDisplay();
|
it.systemRegenerateDisplay();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user