From e26dd68b5e3104deb553bfbfd414c3502f4f85bb Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Mon, 11 Apr 2022 00:47:19 +0200 Subject: [PATCH] [DEV] update rendering of the Text in GUI (button, text entry) --- .../sample/atriasoft/ewol/BasicWindows.java | 129 +++++++++++------- .../ewol/sampleButton/MainWindows.java | 5 +- .../atriasoft/ewol/sampleEntry/Appl.java | 6 +- .../ewol/compositing/CompositingText.java | 20 ++- .../atriasoft/ewol/compositing/TextBase.java | 55 ++++---- .../atriasoft/ewol/context/EwolContext.java | 6 + .../ewol/resource/ResourceFontSvg.java | 14 +- .../ewol/resource/ResourceTexturedFont.java | 7 +- src/org/atriasoft/ewol/widget/Button.java | 3 + src/org/atriasoft/ewol/widget/Container.java | 12 +- src/org/atriasoft/ewol/widget/ContainerN.java | 48 +++---- .../ewol/widget/ContainerToggle.java | 38 ++++-- src/org/atriasoft/ewol/widget/Entry.java | 111 +++++++-------- src/org/atriasoft/ewol/widget/Label.java | 13 +- src/org/atriasoft/ewol/widget/Sizer.java | 40 +++--- 15 files changed, 290 insertions(+), 217 deletions(-) diff --git a/samples/src/sample/atriasoft/ewol/BasicWindows.java b/samples/src/sample/atriasoft/ewol/BasicWindows.java index a4c9cb0..b02fcfe 100644 --- a/samples/src/sample/atriasoft/ewol/BasicWindows.java +++ b/samples/src/sample/atriasoft/ewol/BasicWindows.java @@ -6,7 +6,11 @@ import org.atriasoft.etk.Distance; import org.atriasoft.etk.math.Vector3b; import org.atriasoft.etk.math.Vector3f; import org.atriasoft.ewol.Gravity; +import org.atriasoft.ewol.GravityDepth; +import org.atriasoft.ewol.GravityHorizontal; +import org.atriasoft.ewol.GravityVertical; import org.atriasoft.ewol.widget.Button; +import org.atriasoft.ewol.widget.Label; import org.atriasoft.ewol.widget.Sizer; import org.atriasoft.ewol.widget.Sizer.DisplayMode; import org.atriasoft.ewol.widget.Spacer; @@ -14,46 +18,58 @@ import org.atriasoft.ewol.widget.Widget; import org.atriasoft.ewol.widget.Windows; public class BasicWindows extends Windows { + private static final String LABEL_GRAVITY = "gravity
"; + public static void eventButtonChangeGravity(final BasicWindows self) { Gravity state = self.testWidget.getPropertyGravity(); // TODO: I change the gravity model to integrate the 3rd rank... - /*state = switch (state) { - case BUTTOM -> Gravity.BOTTOM_LEFT; - case BUTTOM_LEFT -> Gravity.BOTTOM_RIGHT; - case BUTTOM_RIGHT -> Gravity.CENTER; - case CENTER -> Gravity.LEFT; - case LEFT -> Gravity.RIGHT; - case RIGHT -> Gravity.TOP; - case TOP -> Gravity.TOP_LEFT; - case TOP_LEFT -> Gravity.TOP_RIGHT; - case TOP_RIGHT -> Gravity.BOTTOM; - }; - */ + if (state.x() == GravityHorizontal.LEFT && state.y() == GravityVertical.BOTTOM) { + state = new Gravity(GravityHorizontal.CENTER, GravityVertical.BOTTOM, GravityDepth.CENTER); + } else if (state.x() == GravityHorizontal.CENTER && state.y() == GravityVertical.BOTTOM) { + state = new Gravity(GravityHorizontal.RIGHT, GravityVertical.BOTTOM, GravityDepth.CENTER); + } else if (state.x() == GravityHorizontal.RIGHT && state.y() == GravityVertical.BOTTOM) { + state = new Gravity(GravityHorizontal.LEFT, GravityVertical.CENTER, GravityDepth.CENTER); + + } else if (state.x() == GravityHorizontal.LEFT && state.y() == GravityVertical.CENTER) { + state = new Gravity(GravityHorizontal.CENTER, GravityVertical.CENTER, GravityDepth.CENTER); + } else if (state.x() == GravityHorizontal.CENTER && state.y() == GravityVertical.CENTER) { + state = new Gravity(GravityHorizontal.RIGHT, GravityVertical.CENTER, GravityDepth.CENTER); + } else if (state.x() == GravityHorizontal.RIGHT && state.y() == GravityVertical.CENTER) { + state = new Gravity(GravityHorizontal.LEFT, GravityVertical.TOP, GravityDepth.CENTER); + + } else if (state.x() == GravityHorizontal.LEFT && state.y() == GravityVertical.TOP) { + state = new Gravity(GravityHorizontal.CENTER, GravityVertical.TOP, GravityDepth.CENTER); + } else if (state.x() == GravityHorizontal.CENTER && state.y() == GravityVertical.TOP) { + state = new Gravity(GravityHorizontal.RIGHT, GravityVertical.TOP, GravityDepth.CENTER); + } else if (state.x() == GravityHorizontal.RIGHT && state.y() == GravityVertical.TOP) { + state = new Gravity(GravityHorizontal.LEFT, GravityVertical.BOTTOM, GravityDepth.CENTER); + } + final Label gravLabel = (Label) (self.buttonGravity.getSubWidgets()[0]); + gravLabel.setPropertyValue(LABEL_GRAVITY + state.toString()); self.testWidget.setPropertyGravity(state); - //self.buttonGravity.setPropertyValue("gravity: " + state); } - public static void eventButtonExpandX(final BasicWindows self) { - Vector3b state = self.testWidget.getPropertyExpand(); - self.testWidget.setPropertyExpand(state.withX(!state.x())); + public static void eventButtonExpandX(final BasicWindows self, final Boolean value) { + final Vector3b state = self.testWidget.getPropertyExpand(); + self.testWidget.setPropertyExpand(state.withX(value)); //self.buttonExpandX.setPropertyValue(state.x() ? "expand X" : "un-expand X"); } - public static void eventButtonExpandY(final BasicWindows self) { - Vector3b state = self.testWidget.getPropertyExpand(); - self.testWidget.setPropertyExpand(state.withY(!state.y())); + public static void eventButtonExpandY(final BasicWindows self, final Boolean value) { + final Vector3b state = self.testWidget.getPropertyExpand(); + self.testWidget.setPropertyExpand(state.withY(value)); //self.buttonExpandY.setPropertyValue(state.y() ? "expand Y" : "un-expand Y"); } - public static void eventButtonFillX(final BasicWindows self) { - Vector3b state = self.testWidget.getPropertyFill(); - self.testWidget.setPropertyFill(state.withX(!state.x())); + public static void eventButtonFillX(final BasicWindows self, final Boolean value) { + final Vector3b state = self.testWidget.getPropertyFill(); + self.testWidget.setPropertyFill(state.withX(value)); //self.buttonFillX.setPropertyValue(state.x() ? "fill X" : "un-fill X"); } - public static void eventButtonFillY(final BasicWindows self) { - Vector3b state = self.testWidget.getPropertyFill(); - self.testWidget.setPropertyFill(state.withY(!state.y())); + public static void eventButtonFillY(final BasicWindows self, final Boolean value) { + final Vector3b state = self.testWidget.getPropertyFill(); + self.testWidget.setPropertyFill(state.withY(value)); //self.buttonFillY.setPropertyValue(state.y() ? "fill Y" : "un-fill Y"); } @@ -65,12 +81,13 @@ public class BasicWindows extends Windows { Button buttonGravity; Sizer sizerTestAreaHori; Sizer sizerMenuHori; + Gravity basicGravity = Gravity.BOTTOM_LEFT; public BasicWindows() { //! [ewol_sample_HW_windows_title] setPropertyTitle("No title set !!! for this test"); - Sizer sizerVertMain = new Sizer(DisplayMode.modeVert); + final Sizer sizerVertMain = new Sizer(DisplayMode.modeVert); sizerVertMain.setPropertyExpand(Vector3b.TRUE); sizerVertMain.setPropertyFill(Vector3b.TRUE); setSubWidget(sizerVertMain); @@ -82,7 +99,7 @@ public class BasicWindows extends Windows { sizerVertMain.subWidgetAdd(this.sizerMenuHori); { - Spacer simpleSpacer = new Spacer(); + final Spacer simpleSpacer = new Spacer(); simpleSpacer.setPropertyMinSize(new Dimension3f(Vector3f.VALUE_128, Distance.PIXEL)); simpleSpacer.setPropertyColor(Color.ALICE_BLUE); simpleSpacer.setPropertyExpand(Vector3b.TRUE_FALSE_FALSE); @@ -99,7 +116,7 @@ public class BasicWindows extends Windows { sizerVertMain.subWidgetAdd(this.sizerTestAreaHori); { - Spacer simpleSpacer = new Spacer(); + final Spacer simpleSpacer = new Spacer(); simpleSpacer.setPropertyColor(Color.DARK_GREEN); simpleSpacer.setPropertyExpand(Vector3b.TRUE_FALSE_FALSE); simpleSpacer.setPropertyExpandIfFree(Vector3b.TRUE); @@ -109,7 +126,7 @@ public class BasicWindows extends Windows { } { - Spacer simpleSpacer = new Spacer(); + final Spacer simpleSpacer = new Spacer(); simpleSpacer.setPropertyColor(Color.PINK); simpleSpacer.setPropertyExpand(Vector3b.TRUE); simpleSpacer.setPropertyFill(Vector3b.TRUE); @@ -117,55 +134,62 @@ public class BasicWindows extends Windows { this.sizerMenuHori.subWidgetAdd(simpleSpacer); } { - this.buttonExpandX = Button.createToggleLabelButton("un-expand X", "expand X"); - this.buttonExpandX.setPropertyExpand(Vector3b.FALSE); + this.buttonExpandX = Button.createToggleLabelButton("Expand X", "Un-expand X"); + this.buttonExpandX.setPropertyExpand(Vector3b.FALSE_TRUE_FALSE); this.buttonExpandX.setPropertyFill(Vector3b.FALSE); this.buttonExpandX.setPropertyMinSize(new Dimension3f(Vector3f.VALUE_16, Distance.PIXEL)); + this.buttonExpandX.setPropertyGravity(Gravity.CENTER); this.sizerMenuHori.subWidgetAdd(this.buttonExpandX); - this.buttonExpandX.signalClick.connectAuto(this, BasicWindows::eventButtonExpandX); + this.buttonExpandX.signalValue.connectAuto(this, BasicWindows::eventButtonExpandX); } { - this.buttonExpandY = Button.createToggleLabelButton("un-expand Y", "expand Y"); - this.buttonExpandY.setPropertyExpand(Vector3b.FALSE); + this.buttonExpandY = Button.createToggleLabelButton("Expand Y", "Un-expand Y"); + this.buttonExpandY.setPropertyExpand(Vector3b.FALSE_TRUE_FALSE); this.buttonExpandY.setPropertyFill(Vector3b.FALSE); this.buttonExpandY.setPropertyMinSize(new Dimension3f(Vector3f.VALUE_16, Distance.PIXEL)); + this.buttonExpandY.setPropertyGravity(Gravity.CENTER); this.sizerMenuHori.subWidgetAdd(this.buttonExpandY); - this.buttonExpandY.signalClick.connectAuto(this, BasicWindows::eventButtonExpandY); + this.buttonExpandY.signalValue.connectAuto(this, BasicWindows::eventButtonExpandY); } { - this.buttonFillX = Button.createToggleLabelButton("un-fill X", "fill X"); - this.buttonFillX.setPropertyExpand(Vector3b.FALSE); + this.buttonFillX = Button.createToggleLabelButton("Fill X", "Un-fill X"); + this.buttonFillX.setPropertyExpand(Vector3b.FALSE_TRUE_FALSE); this.buttonFillX.setPropertyFill(Vector3b.FALSE); this.buttonFillX.setPropertyMinSize(new Dimension3f(Vector3f.VALUE_16, Distance.PIXEL)); + this.buttonFillX.setPropertyGravity(Gravity.CENTER); this.sizerMenuHori.subWidgetAdd(this.buttonFillX); - this.buttonFillX.signalClick.connectAuto(this, BasicWindows::eventButtonFillX); + this.buttonFillX.signalValue.connectAuto(this, BasicWindows::eventButtonFillX); } { - this.buttonFillY = Button.createToggleLabelButton("un-fill Y", "fill Y"); - this.buttonFillY.setPropertyExpand(Vector3b.FALSE); + this.buttonFillY = Button.createToggleLabelButton("Fill Y", "Un-fill Y"); + this.buttonFillY.setPropertyExpand(Vector3b.FALSE_TRUE_FALSE); this.buttonFillY.setPropertyFill(Vector3b.FALSE); this.buttonFillY.setPropertyMinSize(new Dimension3f(Vector3f.VALUE_16, Distance.PIXEL)); + this.buttonFillY.setPropertyGravity(Gravity.CENTER); this.sizerMenuHori.subWidgetAdd(this.buttonFillY); - this.buttonFillY.signalClick.connectAuto(this, BasicWindows::eventButtonFillY); + this.buttonFillY.signalValue.connectAuto(this, BasicWindows::eventButtonFillY); } { - this.buttonGravity = Button.createLabelButton("gravity"); - this.buttonGravity.setPropertyExpand(Vector3b.FALSE); + this.buttonGravity = Button.createLabelButton("Gravity"); + this.buttonGravity.setPropertyExpand(Vector3b.FALSE_TRUE_FALSE); this.buttonGravity.setPropertyFill(Vector3b.FALSE); this.buttonGravity.setPropertyMinSize(new Dimension3f(Vector3f.VALUE_16, Distance.PIXEL)); + this.buttonGravity.setPropertyGravity(Gravity.CENTER); this.sizerMenuHori.subWidgetAdd(this.buttonGravity); this.buttonGravity.signalClick.connectAuto(this, BasicWindows::eventButtonChangeGravity); + final Label gravLabel = (Label) (this.buttonGravity.getSubWidgets()[0]); + gravLabel.setPropertyValue(LABEL_GRAVITY + Gravity.BOTTOM_LEFT); } } - public void addButton(Widget widget) { + public void addButton(final Widget widget) { this.sizerMenuHori.subWidgetAdd(widget); } - public void setTestWidget(Widget widget) { + public void setTestWidget(final Widget widget) { this.sizerTestAreaHori.subWidgetRemoveAll(); { - Spacer simpleSpacer = new Spacer(); + final Spacer simpleSpacer = new Spacer(); simpleSpacer.setPropertyColor(Color.CHOCOLATE); simpleSpacer.setPropertyExpand(Vector3b.FALSE); simpleSpacer.setPropertyExpandIfFree(Vector3b.TRUE); @@ -176,7 +200,7 @@ public class BasicWindows extends Windows { this.testWidget = widget; this.sizerTestAreaHori.subWidgetAdd(this.testWidget); { - Spacer simpleSpacer = new Spacer(); + final Spacer simpleSpacer = new Spacer(); simpleSpacer.setPropertyColor(Color.GREEN_YELLOW); simpleSpacer.setPropertyExpand(Vector3b.FALSE); simpleSpacer.setPropertyExpandIfFree(Vector3b.TRUE); @@ -184,5 +208,16 @@ public class BasicWindows extends Windows { simpleSpacer.setPropertyMinSize(new Dimension3f(Vector3f.VALUE_16, Distance.PIXEL)); this.sizerTestAreaHori.subWidgetAdd(simpleSpacer); } + // update properties... + final Vector3b stateExpand = this.testWidget.getPropertyExpand(); + this.buttonExpandX.setPropertyValue(stateExpand.x()); + this.buttonExpandY.setPropertyValue(stateExpand.y()); + final Vector3b stateFill = this.testWidget.getPropertyFill(); + this.buttonFillX.setPropertyValue(stateFill.x()); + this.buttonFillY.setPropertyValue(stateFill.y()); + + final Gravity gravity = this.testWidget.getPropertyGravity(); + final Label gravLabel = (Label) (this.buttonGravity.getSubWidgets()[0]); + gravLabel.setPropertyValue(LABEL_GRAVITY + gravity.toString()); } } \ No newline at end of file diff --git a/samples/src/sample/atriasoft/ewol/sampleButton/MainWindows.java b/samples/src/sample/atriasoft/ewol/sampleButton/MainWindows.java index ea646de..1e9809e 100644 --- a/samples/src/sample/atriasoft/ewol/sampleButton/MainWindows.java +++ b/samples/src/sample/atriasoft/ewol/sampleButton/MainWindows.java @@ -9,9 +9,10 @@ public class MainWindows extends BasicWindows { public MainWindows() { setPropertyTitle("Simple Button test"); - Button simpleButton = Button.createLabelButton("My button internal label"); + final Button simpleButton = Button + .createLabelButton("1 - My button internal
2 - label
3 - an other text ...
4 - and an other line to be sure ..."); simpleButton.setPropertyExpand(Vector3b.TRUE); - simpleButton.setPropertyFill(Vector3b.TRUE); + simpleButton.setPropertyFill(Vector3b.FALSE); this.setTestWidget(simpleButton); } } diff --git a/samples/src/sample/atriasoft/ewol/sampleEntry/Appl.java b/samples/src/sample/atriasoft/ewol/sampleEntry/Appl.java index 2188603..d6a171e 100644 --- a/samples/src/sample/atriasoft/ewol/sampleEntry/Appl.java +++ b/samples/src/sample/atriasoft/ewol/sampleEntry/Appl.java @@ -14,7 +14,7 @@ public class Appl implements EwolApplication { //! [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); + final String tmpppp = context.getCmd().get(iii); if (tmpppp == "-h" || tmpppp == "--help") { Log.print(" -h/--help display this help"); System.exit(0); @@ -27,11 +27,11 @@ public class Appl implements EwolApplication { //! [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); + 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(); + final MainWindows basicWindows = new MainWindows(); // configure the ewol context to use the new windows context.setWindows(basicWindows); //! [ewol_sample_HW_main_set_windows] diff --git a/src/org/atriasoft/ewol/compositing/CompositingText.java b/src/org/atriasoft/ewol/compositing/CompositingText.java index e1d0296..155b0f9 100644 --- a/src/org/atriasoft/ewol/compositing/CompositingText.java +++ b/src/org/atriasoft/ewol/compositing/CompositingText.java @@ -26,7 +26,8 @@ public class CompositingText extends TextBase { protected ResourceTexturedFont font; // !< Font resources protected List pointPositions = new ArrayList<>(); protected float size; - + // the forceClimp is to generate a forcing of the rendering in small font, this permit to have a correct view of the font, otherwise it will be transparent. + protected final boolean forceClimp = true; protected List texturePositions = new ArrayList<>(); protected String currentFontName = ""; @@ -52,7 +53,7 @@ public class CompositingText extends TextBase { @Override public Vector3f calculateSizeChar(final Character charcode) { - final float renderRatio = (float) this.currentFontSize / (float) this.currentFontSizeRequired; + final float renderRatio = (float) this.currentFontSizeRequired / (float) this.currentFontSizeRequired; // get a pointer on the glyph property : final GlyphProperty myGlyphProperty = getGlyphPointer(charcode); final int fontHeigh = (int) getHeight(); @@ -191,7 +192,7 @@ public class CompositingText extends TextBase { Log.warning("no font..."); return 10.0f; } - final float renderRatio = (float) this.currentFontSize / (float) this.currentFontSizeRequired; + final float renderRatio = (float) this.currentFontSizeRequired / (float) this.currentFontSizeRequired; return this.font.getHeight(this.mode) * renderRatio; } @@ -201,12 +202,13 @@ public class CompositingText extends TextBase { Log.warning("no font..."); return 1.0f; } - final float renderRatio = (float) this.currentFontSize / (float) this.currentFontSizeRequired; + final float renderRatio = (float) this.currentFontSizeRequired / (float) this.currentFontSizeRequired; return this.font.getFontSize() * renderRatio; } @Override public void printChar(final Character charcode) { + //Log.error("Request printChar : '{}' @pos={}", charcode, this.position); // get a pointer on the glyph property : final GlyphProperty myGlyphProperty = getGlyphPointer(charcode); if (myGlyphProperty == null) { @@ -214,7 +216,7 @@ public class CompositingText extends TextBase { return; } // sometime we do net require the correct size to the glyph renderer (due to the fact SVG render is not clear on lower size...) - final float renderRatio = (float) this.currentFontSize / (float) this.currentFontSizeRequired; + final float renderRatio = (float) this.currentFontSizeRequired / (float) this.currentFontSizeRequired; final int fontSize = (int) (getSize() * renderRatio); final int fontHeigh = (int) (getHeight() * renderRatio); @@ -351,7 +353,6 @@ public class CompositingText extends TextBase { // stop=" + this.sizeDisplayStop + " pos=" + this.position); // Register the previous character this.previousCharcode = charcode; - this.vbo.flush(); } @Override @@ -373,7 +374,9 @@ public class CompositingText extends TextBase { // if size in under 25, we request upper size: int sizeRequest = 25; - if (fontSize > 25) { + if (this.forceClimp) { + sizeRequest = fontSize; + } else if (fontSize > 25) { sizeRequest = fontSize; } if (inputFontName.equals(this.currentFontName) && this.currentFontSizeRequired == sizeRequest) { @@ -386,6 +389,9 @@ public class CompositingText extends TextBase { fontUri.setProperty("size", Integer.toString(sizeRequest)); Log.verbose("plop : " + fontName + " size=" + sizeRequest + " result :" + fontName); // link to new one + if (this.forceClimp) { + fontUri.setProperty("FORCE_CLIMP", "true"); + } this.font = ResourceTexturedFont.create(fontUri); if (this.font == null) { Log.error("Can not get font resource"); diff --git a/src/org/atriasoft/ewol/compositing/TextBase.java b/src/org/atriasoft/ewol/compositing/TextBase.java index 3cc57d2..6c569e6 100644 --- a/src/org/atriasoft/ewol/compositing/TextBase.java +++ b/src/org/atriasoft/ewol/compositing/TextBase.java @@ -22,7 +22,6 @@ import org.atriasoft.exml.Exml; import org.atriasoft.exml.exception.ExmlAttributeDoesNotExist; import org.atriasoft.exml.exception.ExmlBuilderException; import org.atriasoft.exml.exception.ExmlException; -import org.atriasoft.exml.exception.ExmlNodeDoesNotExist; import org.atriasoft.exml.exception.ExmlParserErrorMulti; import org.atriasoft.exml.model.XmlElement; import org.atriasoft.exml.model.XmlNode; @@ -50,24 +49,24 @@ public abstract class TextBase extends Compositing { public TextDecoration htmlDecoTmp = new TextDecoration(); // !< current decoration protected boolean kerning = true; // !< Kerning enable or disable on the next elements displayed protected FontMode mode = FontMode.REGULAR; // !< font display property : Regular/Bold/Italic/BoldItalic - protected int nbCharDisplayed; // !< prevent some error in calculation size. - protected boolean needDisplay; // !< This just need the display and not the size rendering. + protected int nbCharDisplayed = 0; // !< prevent some error in calculation size. + protected boolean needDisplay = true; // !< This just need the display and not the size rendering. 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 = null; // !< pointer on the opengl display program protected int oGLtexID = -1; // !< openGL id on the element (texture ID) protected int oGLtextHeight = -1; // !< openGL Id on the texture height protected int oGLtextWidth = -1; // !< openGL Id on the texture width protected Vector3f position = Vector3f.ZERO; // !< The current position to draw - protected Character previousCharcode; // !< we remember the previous charcode to perform the kerning. @ref Kerning + protected Character previousCharcode = '\0'; // !< we remember the previous charcode to perform the kerning. @ref Kerning protected int selectionStartPos = -100; // !< start position of the Selection (if == this.cursorPos ==> no protected Vector3f sizeDisplayStart = Vector3f.ZERO; // !< The start windows of the display. protected Vector3f sizeDisplayStop = Vector3f.ZERO; // !< The end windows of the display. protected float startTextPos = 0; // !< start position of the Alignment (when \n the text return at this // position) protected float stopTextPos = 0; // !< end of the alignment (when a string is too height it cut at the word - protected ResourceVirtualArrayObject vbo; + protected ResourceVirtualArrayObject vbo = null; protected CompositingDrawing vectorialDraw = new CompositingDrawing(); /** @@ -130,10 +129,10 @@ public abstract class TextBase extends Compositing { return Vector3f.ZERO; } - String tmpData = "\n"; - tmpData += text; - tmpData += "\n\n"; - return calculateSizeHTML(tmpData); + final StringBuilder tmpData = new StringBuilder("\n"); + tmpData.append(text); + tmpData.append("\n\n"); + return calculateSizeHTML(tmpData.toString()); } /** @@ -151,8 +150,9 @@ public abstract class TextBase extends Compositing { setPos(Vector3f.ZERO); // same as print without the end display ... printHTML(text); - // Log.debug(" 1 Start pos=" + this.sizeDisplayStart); - // Log.debug(" 1 Stop pos=" + this.sizeDisplayStop); + //Log.error(" ]]]] position={}", this.position); + //Log.error(" ]]]] sizeDisplayStart={}", this.sizeDisplayStart); + //Log.error(" ]]]] sizeDisplayStop={}", this.sizeDisplayStop); // get the last elements this.sizeDisplayStop = Vector3f.max(this.position, this.sizeDisplayStop); @@ -340,6 +340,7 @@ public abstract class TextBase extends Compositing { * @param data The cuurent data to add. */ public void htmlAddData(final String data) { + //Log.error("Add data '{}' @pos=", data, this.position); if (this.htmlCurrentLine.length() > 0 && this.htmlCurrentLine.charAt(this.htmlCurrentLine.length() - 1) != (char) Character.SPACE_SEPARATOR) { this.htmlCurrentLine += (char) Character.SPACE_SEPARATOR; if (this.htmlDecoration.size() > 0) { @@ -498,6 +499,8 @@ public abstract class TextBase extends Compositing { } else { Log.error("node not suported type: " + elem.getType() + " val='" + elem.getValue() + "'"); } + + //Log.error("Add data elems... @pos=", this.position); } } @@ -521,8 +524,7 @@ public abstract class TextBase extends Compositing { Color tmpFg = this.color; Color tmpBg = this.colorBg; if (this.alignment == AlignMode.DISABLE) { - // Log.debug(" 1 print in not alligned mode : start=" + this.sizeDisplayStart + - // " stop=" + this.sizeDisplayStop + " pos=" + this.position); + // Log.debug(" 1 print in not aligned mode : start=" + this.sizeDisplayStart + " stop=" + this.sizeDisplayStop + " pos=" + this.position); // display the cursor if needed (if it is at the start position...) if (this.needDisplay) { if (0 == this.cursorPos) { @@ -533,7 +535,7 @@ public abstract class TextBase extends Compositing { } // note this is faster when nothing is requested ... for (int iii = 0; iii < text.length(); iii++) { - // check if ve have decoration + // check if we have decoration if (iii < decoration.size()) { tmpFg = decoration.get(iii).colorFG(); tmpBg = decoration.get(iii).colorBG(); @@ -569,10 +571,10 @@ public abstract class TextBase extends Compositing { } } } - // Log.debug(" 2 print in not alligned mode : start=" + this.sizeDisplayStart + + // Log.debug(" 2 print in not aligned mode : start=" + this.sizeDisplayStart + // " stop=" + this.sizeDisplayStop + " pos=" + this.position); } else { - // Log.debug(" 3 print in not alligned mode : start=" + this.sizeDisplayStart + + // Log.debug(" 3 print in not aligned mode : start=" + this.sizeDisplayStart + // " stop=" + this.sizeDisplayStop + " pos=" + this.position); // special start case at the right of the endpoint : if (this.stopTextPos < this.position.x()) { @@ -580,9 +582,9 @@ public abstract class TextBase extends Compositing { } final float basicSpaceWidth = calculateSize(' ').x(); int currentId = 0; - final Dynamic stop = new Dynamic(0); - final Dynamic space = new Dynamic(0); - final Dynamic freeSpace = new Dynamic(0); + final Dynamic stop = new Dynamic<>(0); + final Dynamic space = new Dynamic<>(0); + final Dynamic freeSpace = new Dynamic<>(0); while (currentId < (long) text.length()) { final boolean needNoJustify = extrapolateLastId(text, currentId, stop, space, freeSpace); float interpolation = basicSpaceWidth; @@ -743,11 +745,11 @@ public abstract class TextBase extends Compositing { * @TODO : implementation not done .... */ public void printDecorated(final String text) { - String tmpData = "\n\n"; - tmpData += text; - tmpData += "\n\n\n"; + final StringBuilder tmpData = new StringBuilder("\n\n"); + tmpData.append(text); + tmpData.append("\n\n\n"); // Log.debug("plop : " + tmpData); - printHTML(tmpData); + printHTML(tmpData.toString()); } /** @@ -803,10 +805,7 @@ public abstract class TextBase extends Compositing { } catch (final ExmlBuilderException e) { Log.error("Can not generate XML data in printHTML:" + e.getMessage()); e.printStackTrace(); - } catch (final ExmlNodeDoesNotExist e) { - Log.error("Error in finding node from XML data in printHTML:" + e.getMessage()); - e.printStackTrace(); - } catch (ExmlException e) { + } catch (final ExmlException e) { Log.error("Error in finding node from XML data in printHTML:" + e.getMessage()); e.printStackTrace(); } diff --git a/src/org/atriasoft/ewol/context/EwolContext.java b/src/org/atriasoft/ewol/context/EwolContext.java index 8801118..8a30e2a 100644 --- a/src/org/atriasoft/ewol/context/EwolContext.java +++ b/src/org/atriasoft/ewol/context/EwolContext.java @@ -74,6 +74,12 @@ public class EwolContext extends GaleApplication { final Vector2f size = getSize(); this.windowsCurrent.setSize(new Vector3f((int) size.x(), (int) size.y(), 0)); this.windowsCurrent.onChangeSize(); + /// Gale.getContext().aaaaaaaaaaaaaa(); + } + + public void forceRedrawAllAsync() { + Log.warning("force redraw ALL (ASYNC):"); + GaleContext.getContext().requestUpdateSize(); } public EwolApplication getApplication() { diff --git a/src/org/atriasoft/ewol/resource/ResourceFontSvg.java b/src/org/atriasoft/ewol/resource/ResourceFontSvg.java index 4a63746..2f33391 100644 --- a/src/org/atriasoft/ewol/resource/ResourceFontSvg.java +++ b/src/org/atriasoft/ewol/resource/ResourceFontSvg.java @@ -11,6 +11,7 @@ import org.atriasoft.esvg.EsvgFont; import org.atriasoft.esvg.font.Glyph; import org.atriasoft.esvg.render.Weight; import org.atriasoft.etk.Uri; +import org.atriasoft.etk.math.FMath; import org.atriasoft.etk.math.Vector2f; import org.atriasoft.etk.math.Vector2i; import org.atriasoft.ewol.internal.Log; @@ -62,14 +63,23 @@ public class ResourceFontSvg extends Resource { Log.info(" number of glyph = " + this.font.getNumGlyphs()); } - public synchronized boolean drawGlyph(final ImageByte imageOut, final int fontSize, final Vector2i glyphPosition, final GlyphProperty property, final int posInImage) { + public boolean drawGlyph(final ImageByte imageOut, final int fontSize, final Vector2i glyphPosition, final GlyphProperty property, final int posInImage) { + return drawGlyph(imageOut, fontSize, glyphPosition, property, posInImage, false); + } + + // the forceClimp is to generate a forcing of the rendering in small font, this permit to have a correct view of the font, otherwise it will be transparent. + public synchronized boolean drawGlyph(final ImageByte imageOut, final int fontSize, final Vector2i glyphPosition, final GlyphProperty property, final int posInImage, final boolean forceClimp) { final Weight weight = this.font.render(property.glyph.getUnicodeValue(), fontSize); if (weight == null) { return false; } for (int yyy = 0; yyy < weight.getHeight(); yyy++) { for (int xxx = 0; xxx < weight.getWidth(); xxx++) { - final float valueColor = weight.get(xxx, weight.getHeight() - 1 - yyy); + float valueColor = weight.get(xxx, weight.getHeight() - 1 - yyy); + if (forceClimp) { + valueColor = FMath.avg(-0.5f, ((valueColor - 0.2f) * 7.0f), 0.5f) + 0.5f; + //valueColor = FMath.avg(-0.5f, (valueColor * 20.0f), 0.5f) + 0.5f; + } // set only alpha : switch (posInImage) { default: diff --git a/src/org/atriasoft/ewol/resource/ResourceTexturedFont.java b/src/org/atriasoft/ewol/resource/ResourceTexturedFont.java index ddbd04c..5c49aa2 100644 --- a/src/org/atriasoft/ewol/resource/ResourceTexturedFont.java +++ b/src/org/atriasoft/ewol/resource/ResourceTexturedFont.java @@ -53,13 +53,13 @@ public class ResourceTexturedFont extends ResourceTexture2 { public Vector2i[] lastGlyphPos = new Vector2i[4]; public int[] lastRawHeigh = new int[4]; public List[] listElement = new ArrayList[4]; - + private boolean forceClimp = false; private final FontMode[] modeWraping = new FontMode[4]; // !< This is a wrapping mode to prevent the fact that no private int size = 10; protected ResourceTexturedFont(final Uri fontBaseUri) { super("__TEXTURED_FONT__>>" + fontBaseUri.toString()); - + this.forceClimp = "true".equals(fontBaseUri.getProperty("FORCE_CLIMP")); Log.debug("Load font : '" + fontBaseUri + "'"); this.font[0] = null; @@ -222,8 +222,9 @@ public class ResourceTexturedFont extends ResourceTexture2 { this.listElement[iii].add(tmpchar); } if (hasChange) { + Log.error("All gliph added ====> request a redraw of all the GUI"); flush(); - Ewol.getContext().forceRedrawAll(); + Ewol.getContext().forceRedrawAllAsync(); //IOgami.storePNG(new Uri("file", "fileFont.png"), this.data); // ==> for debug test only ... } return hasChange; diff --git a/src/org/atriasoft/ewol/widget/Button.java b/src/org/atriasoft/ewol/widget/Button.java index 1e2ef3d..68f5600 100644 --- a/src/org/atriasoft/ewol/widget/Button.java +++ b/src/org/atriasoft/ewol/widget/Button.java @@ -139,6 +139,7 @@ public class Button extends ContainerToggle { padding = this.shape.getPadding(); } calculateMinMaxSizePadded(padding); + Log.verbose("[{}] Result min size : {}", getId(), this.minSize); } protected void changeStatusIn(final GuiShapeMode newStatusId) { @@ -246,6 +247,7 @@ public class Button extends ContainerToggle { void onChangePropertyToggleMode() { this.propertyValue = !this.propertyValue; + this.signalValue.emit(this.propertyValue); if (!this.propertyToggleMode) { this.idWidgetDisplayed = 0; } else { @@ -443,6 +445,7 @@ public class Button extends ContainerToggle { return; } this.propertyValue = propertyValue; + this.signalValue.emit(this.propertyValue); onChangePropertyValue(); } diff --git a/src/org/atriasoft/ewol/widget/Container.java b/src/org/atriasoft/ewol/widget/Container.java index 7f970a5..5a1e976 100644 --- a/src/org/atriasoft/ewol/widget/Container.java +++ b/src/org/atriasoft/ewol/widget/Container.java @@ -30,10 +30,10 @@ public class Container extends Widget { // call sub classes if (this.subWidget != null) { this.subWidget.calculateMinMaxSize(); - Vector3f min = this.subWidget.getCalculateMinSize(); + final Vector3f min = this.subWidget.getCalculateMinSize(); this.minSize = Vector3f.max(this.minSize, min); } - //Log.error("[" + getId() + "] Result min size : " + this.minSize); + Log.warning("[{}] Result min size : {}", getId(), this.minSize); } @Override @@ -47,7 +47,7 @@ public class Container extends Widget { @Override public EwolObject getSubObjectNamed(final String objectName) { - EwolObject tmpObject = super.getSubObjectNamed(objectName); + final EwolObject tmpObject = super.getSubObjectNamed(objectName); if (tmpObject != null) { return tmpObject; } @@ -130,8 +130,8 @@ public class Container extends Widget { return; } Vector3f origin = this.origin.add(this.offset); - Vector3f minSize = this.subWidget.getCalculateMinSize(); - Vector3b expand = this.subWidget.getPropertyExpand(); + final Vector3f minSize = this.subWidget.getCalculateMinSize(); + final Vector3b expand = this.subWidget.getPropertyExpand(); origin = origin.add(this.propertyGravity.gravityGenerateDelta(minSize.less(this.size))); this.subWidget.setOrigin(origin); this.subWidget.setSize(this.size); @@ -235,7 +235,7 @@ public class Container extends Widget { } super.systemDraw(displayProp); if (this.subWidget != null) { - DrawProperty prop = displayProp.withLimit(this.origin, this.size); + final DrawProperty prop = displayProp.withLimit(this.origin, this.size); //Log.info("Draw : [" + propertyName + "] t=" + getObjectType() + " o=" + this.origin + " s=" + this.size); this.subWidget.systemDraw(prop); } else { diff --git a/src/org/atriasoft/ewol/widget/ContainerN.java b/src/org/atriasoft/ewol/widget/ContainerN.java index d4c7a0a..1876837 100644 --- a/src/org/atriasoft/ewol/widget/ContainerN.java +++ b/src/org/atriasoft/ewol/widget/ContainerN.java @@ -42,21 +42,21 @@ public class ContainerN extends Widget { this.minSize = Vector3f.ZERO; this.maxSize = Vector3f.MAX_VALUE; //Log.error("[" + getId() + "] {" + getObjectType() + "} set min size : " + this.minSize); - for (Widget it : this.subWidget) { + for (final Widget it : this.subWidget) { if (it != null) { it.calculateMinMaxSize(); - Vector3b subExpendProp = it.canExpand(); + final Vector3b subExpendProp = it.canExpand(); if (subExpendProp.x()) { this.subExpend = this.subExpend.withX(true); } if (subExpendProp.y()) { this.subExpend = this.subExpend.withX(true); } - Vector3f tmpSize = it.getCalculateMinSize(); + final Vector3f tmpSize = it.getCalculateMinSize(); this.minSize = Vector3f.max(tmpSize, this.minSize); } } - //Log.error("[" + getId() + "] {" + getObjectType() + "} Result min size : " + this.minSize); + Log.warning("[{}] Result min size : {}", getId(), this.minSize); } // herited function @@ -81,7 +81,7 @@ public class ContainerN extends Widget { public void drawWidgetTree(int level) { super.drawWidgetTree(level); level++; - for (Widget it : this.subWidget) { + for (final Widget it : this.subWidget) { if (it != null) { it.drawWidgetTree(level); } @@ -102,7 +102,7 @@ public class ContainerN extends Widget { if (tmpObject != null) { return tmpObject; } - for (Widget it : this.subWidget) { + for (final Widget it : this.subWidget) { if (it != null) { tmpObject = it.getSubObjectNamed(objectName); if (tmpObject != null) { @@ -126,12 +126,12 @@ public class ContainerN extends Widget { return null; } // for all element in the sizer ... - for (Widget it : this.subWidget) { + for (final Widget it : this.subWidget) { if (it != null) { - Vector3f tmpSize = it.getSize(); - Vector3f tmpOrigin = it.getOrigin(); + final Vector3f tmpSize = it.getSize(); + final Vector3f tmpOrigin = it.getOrigin(); if ((tmpOrigin.x() <= pos.x() && tmpOrigin.x() + tmpSize.x() >= pos.x()) && (tmpOrigin.y() <= pos.y() && tmpOrigin.y() + tmpSize.y() >= pos.y())) { - Widget tmpWidget = it.getWidgetAtPos(pos); + final Widget tmpWidget = it.getWidgetAtPos(pos); if (tmpWidget != null) { return tmpWidget; } @@ -145,7 +145,7 @@ public class ContainerN extends Widget { @Override public void onChangeSize() { - for (Widget it : this.subWidget) { + for (final Widget it : this.subWidget) { if (it == null) { continue; } @@ -157,7 +157,7 @@ public class ContainerN extends Widget { @Override public void onRegenerateDisplay() { - for (Widget it : this.subWidget) { + for (final Widget it : this.subWidget) { if (it != null) { it.systemRegenerateDisplay(); } @@ -168,7 +168,7 @@ public class ContainerN extends Widget { public void requestDestroyFromChild(final EwolObject child) { ListIterator it = this.subWidget.listIterator(); while (it.hasNext()) { - Widget elem = it.next(); + final Widget elem = it.next(); if (elem != child) { continue; } @@ -201,11 +201,11 @@ public class ContainerN extends Widget { requestUpdateSize(); } - public void setSubWidgets(List listData) { + public void setSubWidgets(final List listData) { // Clean all previous widget this.subWidgetRemoveAll(); // add separately all widgets - for (Widget elem : listData) { + for (final Widget elem : listData) { if (elem == null) { continue; } @@ -276,11 +276,11 @@ public class ContainerN extends Widget { if (newWidget == null) { return; } - int errorControl = this.subWidget.size(); + final int errorControl = this.subWidget.size(); - ListIterator it = this.subWidget.listIterator(); + final ListIterator it = this.subWidget.listIterator(); while (it.hasNext()) { - Widget elem = it.next(); + final Widget elem = it.next(); if (newWidget == elem) { elem.removeParent(); it.remove(); @@ -317,9 +317,9 @@ public class ContainerN extends Widget { */ public void subWidgetReplace(final Widget oldWidget, final Widget newWidget) { boolean haveChange = false; - ListIterator it = this.subWidget.listIterator(); + final ListIterator it = this.subWidget.listIterator(); while (it.hasNext()) { - Widget elem = it.next(); + final Widget elem = it.next(); if (elem != oldWidget) { continue; } @@ -346,9 +346,9 @@ public class ContainerN extends Widget { if (newWidget == null) { return; } - ListIterator it = this.subWidget.listIterator(); + final ListIterator it = this.subWidget.listIterator(); while (it.hasNext()) { - Widget elem = it.next(); + final Widget elem = it.next(); if (newWidget == elem) { elem.removeParent(); it.remove(); @@ -369,9 +369,9 @@ public class ContainerN extends Widget { // subwidget draw DrawProperty prop = displayProp; prop = prop.withLimit(this.origin, this.size); - ListIterator it = this.subWidget.listIterator(this.subWidget.size()); + final ListIterator it = this.subWidget.listIterator(this.subWidget.size()); while (it.hasPrevious()) { - Widget elem = it.previous(); + final Widget elem = it.previous(); if (elem != null) { //Log.info(" ***** : [" + (*it).propertyName + "] t=" + (*it).getObjectType() + " o=" + (*it).this.origin + " s=" + (*it).this.size); elem.systemDraw(prop); diff --git a/src/org/atriasoft/ewol/widget/ContainerToggle.java b/src/org/atriasoft/ewol/widget/ContainerToggle.java index 79c61f0..029757f 100644 --- a/src/org/atriasoft/ewol/widget/ContainerToggle.java +++ b/src/org/atriasoft/ewol/widget/ContainerToggle.java @@ -8,8 +8,11 @@ package org.atriasoft.ewol.widget; import org.atriasoft.etk.math.Vector3f; import org.atriasoft.ewol.DrawProperty; import org.atriasoft.ewol.Padding; +import org.atriasoft.ewol.annotation.EwolDescription; import org.atriasoft.ewol.internal.Log; import org.atriasoft.ewol.object.EwolObject; +import org.atriasoft.exml.annotation.XmlFactory; +import org.atriasoft.exml.annotation.XmlManaged; /* * @ingroup ewolWidgetGroup @@ -87,7 +90,8 @@ public class ContainerToggle extends Widget { this.minSize = this.minSize.add(padding.x(), padding.y(), padding.z()); // verify the min max of the min size ... checkMinSize(); - markToRedraw(); + //markToRedraw(); + Log.verbose("[{}] Result min size : {}", getId(), this.minSize); } @Override @@ -120,32 +124,42 @@ public class ContainerToggle extends Widget { return null; } + @XmlManaged + @XmlFactory(value = WidgetXmlFactory.class) + @EwolDescription(value = "Request the widget Expand size while free space is detected (does not generate expand in upper widget)") + public Widget[] getSubWidgets() { + return this.subWidget; + } + public Padding onChangeSizePadded(final Padding padding) { super.onChangeSize(); final Vector3f localAvaillable = this.size.less(padding.x(), padding.y(), padding.z()); // Checking the filling properties == > for the subElements: - Vector3f subElementSize = this.minSize; + Vector3f subElementSize = this.minSize.less(padding.x(), padding.y(), padding.z()); if (this.propertyFill.x()) { - subElementSize = subElementSize.withX(this.size.x()); + subElementSize = subElementSize.withX(this.size.x() - padding.x()); } if (this.propertyFill.y()) { - subElementSize = subElementSize.withY(this.size.y()); + subElementSize = subElementSize.withY(this.size.y() - padding.y()); } - final Vector3f delta = this.propertyGravity.gravityGenerateDelta(this.size.less(subElementSize)); - final Vector3f origin = delta.add(padding.left(), padding.bottom(), padding.back()); - subElementSize = subElementSize.less(padding.x(), padding.y(), padding.z()); + if (this.propertyFill.z()) { + subElementSize = subElementSize.withZ(this.size.z() - padding.z()); + } + final Vector3f delta = this.propertyGravity.gravityGenerateDelta(this.size.less(subElementSize.add(padding.x(), padding.y(), padding.z()))); + final Vector3f deltaPadded = delta.add(padding.left(), padding.bottom(), padding.back()); + //subElementSize = subElementSize.less(padding.x(), padding.y(), padding.z()); for (int iii = 0; iii < 2; ++iii) { if (this.subWidget[iii] != null) { - Vector3f origin2 = origin.add(this.offset); - final Vector3f minSize = this.subWidget[iii].getCalculateMinSize(); + //final Vector3f origin2 = this.origin.add(this.offset); + //final Vector3f minSize = this.subWidget[iii].getCalculateMinSize(); //Vector2b expand = this.subWidget[iii].propertyExpand.get(); - origin2 = origin2.add(this.propertyGravity.gravityGenerateDelta(minSize.less(localAvaillable))); - this.subWidget[iii].setOrigin(this.origin.add(origin)); + //origin2 = origin2.add(this.propertyGravity.gravityGenerateDelta(minSize.less(localAvaillable))); + this.subWidget[iii].setOrigin(this.origin.add(deltaPadded)); this.subWidget[iii].setSize(subElementSize); this.subWidget[iii].onChangeSize(); } } - final Vector3f selectableAreaPos = origin.less(padding.left(), padding.bottom(), padding.back()); + final Vector3f selectableAreaPos = this.origin.add(delta);//.less(padding.left(), padding.bottom(), padding.back()); final Vector3f selectableAreaEndPos = this.size.less(selectableAreaPos.add(subElementSize.add(padding.x(), padding.y(), padding.z()))); markToRedraw(); return new Padding(selectableAreaPos.x(), selectableAreaEndPos.y(), selectableAreaEndPos.x(), selectableAreaPos.y()); diff --git a/src/org/atriasoft/ewol/widget/Entry.java b/src/org/atriasoft/ewol/widget/Entry.java index df0f518..75bf61c 100644 --- a/src/org/atriasoft/ewol/widget/Entry.java +++ b/src/org/atriasoft/ewol/widget/Entry.java @@ -6,15 +6,13 @@ import java.util.regex.Pattern; import org.atriasoft.esignal.Connection; import org.atriasoft.esignal.Signal; import org.atriasoft.esignal.SignalEmpty; -import org.atriasoft.etk.Color; import org.atriasoft.etk.Uri; import org.atriasoft.etk.math.FMath; -import org.atriasoft.etk.math.Vector2f; import org.atriasoft.etk.math.Vector3f; import org.atriasoft.ewol.Padding; import org.atriasoft.ewol.annotation.EwolDescription; import org.atriasoft.ewol.annotation.EwolSignal; -import org.atriasoft.ewol.compositing.CompositingGraphicContext; +import org.atriasoft.ewol.compositing.CompositingText; import org.atriasoft.ewol.compositing.GuiShape; import org.atriasoft.ewol.compositing.GuiShapeMode; import org.atriasoft.ewol.event.EventEntry; @@ -67,7 +65,7 @@ public class Entry extends Widget { /// offset in pixel of the display of the UString private int displayCursorPositionPixel = 0; /// text display this.text - private final CompositingGraphicContext gc = new CompositingGraphicContext(); + private final CompositingText text = new CompositingText(); /// text position can have change private boolean needUpdateTextPos = true; /// Periodic call handle to remove it when needed @@ -130,7 +128,7 @@ public class Entry extends Widget { if (this.shape != null) { padding = this.shape.getPadding(); } - int minHeight = this.gc.getTextHeight();//calculateSize('A').y(); + final int minHeight = (int) this.text.getHeight();//calculateSize('A').y(); Vector3f minimumSizeBase = new Vector3f(20, minHeight, 10); // add padding : @@ -167,7 +165,7 @@ public class Entry extends Widget { pos1 = this.displayCursorPos; } // Copy - String tmpData = this.propertyValue.substring(pos1, pos2); + final String tmpData = this.propertyValue.substring(pos1, pos2); ClipBoard.set(clipboardID, tmpData); } @@ -304,8 +302,9 @@ public class Entry extends Widget { @Override protected void onDraw() { if (this.shape != null) { - this.shape.draw(this.gc.getResourceTexture(), true); + this.shape.draw(true); } + this.text.draw(); } @Override @@ -313,10 +312,10 @@ public class Entry extends Widget { // remove curent selected data ... removeSelected(); // get current selection / Copy : - String tmpData = ClipBoard.get(clipboardID); + final String tmpData = ClipBoard.get(clipboardID); // add it on the current display: if (tmpData.length() != 0) { - StringBuilder newData = new StringBuilder(this.propertyValue); + final StringBuilder newData = new StringBuilder(this.propertyValue); newData.insert(this.displayCursorPos, tmpData.charAt(0)); setInternalValue(newData.toString()); if (this.propertyValue.equals(newData.toString())) { @@ -346,7 +345,7 @@ public class Entry extends Widget { if (event.getChar() == 0x7F) { // SUPPR : if (this.propertyValue.length() > 0 && this.displayCursorPos < (long) this.propertyValue.length()) { - StringBuilder newData = new StringBuilder(this.propertyValue); + final StringBuilder newData = new StringBuilder(this.propertyValue); newData.deleteCharAt(this.displayCursorPos); this.propertyValue = newData.toString(); this.displayCursorPos = Math.max(this.displayCursorPos, 0); @@ -355,7 +354,7 @@ public class Entry extends Widget { } else if (event.getChar() == 0x08) { // DEL : if (this.propertyValue.length() > 0 && this.displayCursorPos != 0) { - StringBuilder newData = new StringBuilder(this.propertyValue); + final StringBuilder newData = new StringBuilder(this.propertyValue); newData.deleteCharAt(this.displayCursorPos - 1); this.propertyValue = newData.toString(); this.displayCursorPos--; @@ -367,9 +366,9 @@ public class Entry extends Widget { if ((long) this.propertyValue.length() > this.propertyMaxCharacter) { Log.info("Reject data for entry : '" + event.getChar() + "'"); } else { - StringBuilder newData = new StringBuilder(this.propertyValue); + final StringBuilder newData = new StringBuilder(this.propertyValue); newData.insert(this.displayCursorPos, event.getChar()); - String newDataGenerated = newData.toString(); + final String newDataGenerated = newData.toString(); setInternalValue(newDataGenerated); if (this.propertyValue.equals(newDataGenerated)) { this.displayCursorPos += 1;//inputData.length(); @@ -410,8 +409,8 @@ public class Entry extends Widget { @Override public boolean onEventInput(final EventInput event) { - Vector3f absolutePosition = new Vector3f(event.pos().x(), event.pos().y(), 0); - Vector3f relPos = relativePosition(absolutePosition); + final Vector3f absolutePosition = new Vector3f(event.pos().x(), event.pos().y(), 0); + final Vector3f relPos = relativePosition(absolutePosition); Log.verbose("Event on Input ... " + event + " relPos = " + relPos); if (event.inputId() == 0) { if (!isFocused()) { @@ -523,7 +522,7 @@ public class Entry extends Widget { } //Log.verbose("Regenerate Display ==> is needed: '" + this.propertyValue + "'"); this.shape.clear(); - this.gc.clear(); + this.text.clear(); if (this.colorIdTextFg >= 0) { //this.text.setDefaultColorFg(this.shape.getColor(this.colorIdTextFg)); //this.text.setDefaultColorBg(this.shape.getColor(this.colorIdTextBg)); @@ -531,7 +530,7 @@ public class Entry extends Widget { //this.text.setSelectionColor(this.shape.getColor(this.colorIdSelection)); } updateTextPosition(); - Padding padding = this.shape.getPadding(); + final Padding padding = this.shape.getPadding(); Vector3f tmpSizeShaper = this.minSize; if (this.propertyFill.x()) { @@ -540,57 +539,51 @@ public class Entry extends Widget { if (this.propertyFill.y()) { tmpSizeShaper = tmpSizeShaper.withY(this.size.y()); } + if (this.propertyFill.z()) { + tmpSizeShaper = tmpSizeShaper.withZ(this.size.z()); + } Vector3f tmpOriginShaper = this.size.less(tmpSizeShaper).multiply(0.5f); Vector3f tmpSizeText = tmpSizeShaper.less(padding.x(), padding.y(), padding.z()); - //Vector3f tmpOriginText = this.size.less(tmpSizeText).multiply(0.5f); - Vector3f tmpOriginText = new Vector3f(0, this.gc.getTextSize(), 0); + Vector3f tmpOriginText = this.size.less(tmpSizeText).multiply(0.5f); + //Vector3f tmpOriginText = new Vector3f(0, this.text.getSize(), 0); // 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.gc.getTextHeight(); + + final int minHeight = (int) this.text.getHeight(); if (tmpSizeText.y() > minHeight) { - tmpOriginText = tmpOriginText.add(0, (tmpSizeText.y() - minHeight) * 0.5f); + tmpOriginText = tmpOriginText.add(0, (tmpSizeText.y() - minHeight) * 0.5f, 0); } - */ // fix all the position in the int class: tmpSizeShaper = Vector3f.clipInt(tmpSizeShaper); tmpOriginShaper = Vector3f.clipInt(tmpOriginShaper); tmpSizeText = Vector3f.clipInt(tmpSizeText); tmpOriginText = Vector3f.clipInt(tmpOriginText); - this.gc.clear(); - this.gc.setSize((int) tmpSizeText.x(), (int) tmpSizeText.y()); - - // if (this.displayCursorPosSelection != this.displayCursorPos) { - // - // //this.text.setCursorSelection(this.displayCursorPos, this.displayCursorPosSelection); - // } else { - // this.text.setCursorPos(this.displayCursorPos); - // } - this.gc.setColorFill(Color.RED); - this.gc.setColorStroke(Color.GREEN); - this.gc.setStrokeWidth(5); - //this.gc.rectangleRounded(new Vector3f(20, 2), new Vector3f(55, 70), new Vector3f(15, 15)); - this.gc.line(new Vector2f(this.displayCursorPositionPixel, 2), new Vector2f(this.displayCursorPositionPixel, this.gc.getTextHeight() - 4)); - - this.gc.setColorFill(Color.BLACK); - this.gc.setColorStroke(Color.NONE); - this.gc.setStrokeWidth(1); - char[] valueToDisplay = this.propertyValue.toCharArray(); + this.text.clear(); + //this.text.setSize((int) tmpSizeText.x(), (int) tmpSizeText.y()); + this.text.setClippingWidth(tmpOriginText, tmpSizeText); + this.text.setPos(tmpOriginText.add(this.displayStartPosition, 0, 0)); + if (this.displayCursorPosSelection != this.displayCursorPos) { + this.text.setCursorSelection(this.displayCursorPos, this.displayCursorPosSelection); + } else { + this.text.setCursorPos(this.displayCursorPos); + } + final char[] valueToDisplay = this.propertyValue.toCharArray(); if (this.propertyPassword) { Arrays.fill(valueToDisplay, '*'); } - Vector2f plop = new Vector2f(tmpOriginText.x() + this.displayStartPosition, tmpOriginText.y()); + //final Vector2f plop = new Vector2f(tmpOriginText.x() + this.displayStartPosition, tmpOriginText.y()); if (valueToDisplay.length != 0) { - this.gc.text(plop, new String(valueToDisplay)); + this.text.print(new String(valueToDisplay)); } else if (this.propertyTextWhenNothing != null) { - this.gc.text(plop, this.propertyTextWhenNothing); + this.text.printDecorated(this.propertyTextWhenNothing); } + this.text.setClippingMode(false); this.overPositionStart = tmpOriginShaper; this.overPositionStop = tmpOriginShaper.add(tmpSizeShaper); this.shape.setShape(tmpOriginShaper, tmpSizeShaper, tmpOriginText, tmpSizeText); - this.gc.flush(); + this.text.flush(); this.shape.flush(); } @@ -613,7 +606,7 @@ public class Entry extends Widget { // remove data ... this.displayCursorPos = pos1; this.displayCursorPosSelection = pos1; - StringBuilder tmp = new StringBuilder(this.propertyValue); + final StringBuilder tmp = new StringBuilder(this.propertyValue); if (pos1 < pos2) { tmp.delete(pos1, pos2); } else if (pos1 > pos2) { @@ -628,7 +621,7 @@ public class Entry extends Widget { * @param newData The new string to display */ protected void setInternalValue(final String newData) { - String previous = this.propertyValue; + final String previous = this.propertyValue; // check the RegExp : if (newData.length() > 0) { /* @@ -732,7 +725,7 @@ public class Entry extends Widget { } protected void updateCursorPosition(final Vector3f pos, final boolean selection/*=false*/) { - Padding padding = this.shape.getPadding(); + final Padding padding = this.shape.getPadding(); Vector3f relPos = relativePosition(pos); relPos = relPos.withX(relPos.x() - this.displayStartPosition - padding.left()); @@ -745,13 +738,13 @@ public class Entry extends Widget { this.displayStartPosition = 0; } String tmpDisplay = this.propertyValue.substring(0, this.displayStartPosition); - int displayHidenSize = this.gc.calculateTextSize(tmpDisplay).x(); + final int displayHidenSize = (int) this.text.calculateSize(tmpDisplay).x(); //Log.debug("hidenSize : " + displayHidenSize); int newCursorPosition = -1; - int tmpTextOriginX = (int) padding.left(); + final int tmpTextOriginX = (int) padding.left(); for (int iii = 0; iii < this.propertyValue.length(); iii++) { tmpDisplay = this.propertyValue.substring(0, iii); - int tmpWidth = this.gc.calculateTextSize(tmpDisplay).x() - displayHidenSize; + final int tmpWidth = (int) (this.text.calculateSize(tmpDisplay).x() - displayHidenSize); if (tmpWidth >= relPos.x() - tmpTextOriginX) { newCursorPosition = iii; break; @@ -782,27 +775,27 @@ public class Entry extends Widget { if (!this.needUpdateTextPos) { return; } - Padding padding = this.shape.getPadding(); + final 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 = this.gc.calculateTextSize(this.propertyValue).x(); + final int tmpUserSize = (int) (tmpSizeX - padding.x()); + final int totalWidth = (int) this.text.calculateSize(this.propertyValue).x(); // all can not be set : - String tmpDisplay = this.propertyValue.substring(0, this.displayCursorPos); - this.displayCursorPositionPixel = this.gc.calculateTextSize(tmpDisplay).x(); + final String tmpDisplay = this.propertyValue.substring(0, this.displayCursorPos); + this.displayCursorPositionPixel = (int) this.text.calculateSize(tmpDisplay).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 { // check if the Cursor is visible at 10px nearest the border : - int tmp1 = this.displayCursorPositionPixel + this.displayStartPosition; + final int tmp1 = this.displayCursorPositionPixel + this.displayStartPosition; Log.debug("cursorPos=" + this.displayCursorPositionPixel + "px maxSize=" + tmpUserSize + "px tmp1=" + tmp1); if (tmp1 < 10) { - // set the cursor on le left + // set the cursor on the left this.displayStartPosition = Math.min(-this.displayCursorPositionPixel + 10, 0); } else if (tmp1 > tmpUserSize - 10) { // set the cursor of the Right diff --git a/src/org/atriasoft/ewol/widget/Label.java b/src/org/atriasoft/ewol/widget/Label.java index 20f3c9f..fd71e6e 100644 --- a/src/org/atriasoft/ewol/widget/Label.java +++ b/src/org/atriasoft/ewol/widget/Label.java @@ -53,21 +53,25 @@ public class Label extends Widget { @Override public void calculateMinMaxSize() { + Log.verbose("calculateMinMaxSize !!! data = '{}'", this.value); final Vector3f tmpMax = this.propertyMaxSize.getPixel(); final Vector3f tmpMin = this.propertyMinSize.getPixel(); //EWOL_DEBUG("[" + getId() + "] {" + getObjectType() + "} tmpMax : " + tmpMax); if (tmpMax.x() <= 999999) { this.textCompose.setTextAlignment(0, tmpMax.x() - 4, AlignMode.LEFT); //EWOL_DEBUG("[" + getId() + "] {" + getObjectType() + "} force Alignment "); + } else { + this.textCompose.setTextAlignment(0, 0, AlignMode.LEFT); } Vector3f minSize = this.textCompose.calculateSizeDecorated(this.value); + this.textCompose.flush(); minSize = minSize.add(2, 2, 0); //EWOL_DEBUG("[" + getId() + "] {" + getObjectType() + "} minSize : " + minSize); this.minSize = new Vector3f(FMath.avg(tmpMin.x(), 4 + minSize.x(), tmpMax.x()), // FMath.avg(tmpMin.y(), 4 + minSize.y(), tmpMax.y()), // 10); - Log.verbose("[{}] Result min size : {} < {} < {}", getId(), tmpMin, this.minSize, tmpMax); + Log.verbose("[{}] Result min size : {}", getId(), this.minSize); } public int getPropertyFontSize() { @@ -135,7 +139,8 @@ public class Label extends Widget { tmpTextOrigin = tmpTextOrigin.add(paddingSize, paddingSize, 0); localSize = localSize.less(2 * paddingSize, 2 * paddingSize, 0); - tmpTextOrigin = tmpTextOrigin.withY(tmpTextOrigin.y() + (this.minSize.y() - 2 * paddingSize) - minSize.y()); + //tmpTextOrigin = tmpTextOrigin.withY(tmpTextOrigin.y() + (this.minSize.y() - 2 * paddingSize) - minSize.y()); + tmpTextOrigin = tmpTextOrigin.withY(tmpTextOrigin.y() + this.minSize.y() / 2 - this.textCompose.getHeight());// - this.minSize.y() - paddingSize); tmpTextOrigin = tmpTextOrigin.withX(tmpTextOrigin.x() - curentTextSize.x() * 0.5f); final Vector3f textPos = new Vector3f(tmpTextOrigin.x(), tmpTextOrigin.y(), 0); @@ -153,9 +158,9 @@ public class Label extends Widget { this.textCompose.setDefaultColorBg(this.colorProperty.get(this.colorDefaultBgText)); } this.textCompose.setPos(tmpTextOrigin); - Log.error("[{}] '{}' display at pos={}, size={}", getId(), this.value, tmpTextOrigin, this.size); + Log.verbose("[{}] '{}' display at pos={}, size={}", getId(), this.value, tmpTextOrigin, this.size); this.textCompose.setTextAlignment(tmpTextOrigin.x(), tmpTextOrigin.x() + localSize.x(), AlignMode.LEFT); - this.textCompose.setClipping(drawClippingPos, drawClippingSize); + //this.textCompose.setClipping(drawClippingPos, drawClippingSize); this.textCompose.printDecorated(this.value); this.textCompose.flush(); } diff --git a/src/org/atriasoft/ewol/widget/Sizer.java b/src/org/atriasoft/ewol/widget/Sizer.java index d880b4a..3d39d3c 100644 --- a/src/org/atriasoft/ewol/widget/Sizer.java +++ b/src/org/atriasoft/ewol/widget/Sizer.java @@ -47,9 +47,9 @@ public class Sizer extends ContainerN { Log.verbose("[" + getId() + "] update minimum size"); this.subExpend = Vector3b.FALSE; this.minSize = this.propertyMinSize.getPixel(); - Vector3f tmpBorderSize = this.propertyBorderSize.getPixel(); + final Vector3f tmpBorderSize = this.propertyBorderSize.getPixel(); Log.verbose("[" + getId() + "] {" + getClass().getCanonicalName() + "} set min size : " + this.minSize); - for (Widget it : this.subWidget) { + for (final Widget it : this.subWidget) { if (it == null) { continue; } @@ -60,7 +60,7 @@ public class Sizer extends ContainerN { if (it.canExpand().y()) { this.subExpend = this.subExpend.withY(true); } - Vector3f tmpSize = it.getCalculateMinSize(); + final Vector3f tmpSize = it.getCalculateMinSize(); Log.verbose("[" + getId() + "] NewMinSize=" + tmpSize); Log.verbose("[" + getId() + "] {" + getClass().getCanonicalName() + "} Get minSize=" + tmpSize); if (this.propertyMode == DisplayMode.modeVert) { @@ -76,7 +76,7 @@ public class Sizer extends ContainerN { } } this.minSize = this.minSize.add(tmpBorderSize.multiply(2)); - //Log.error("[" + getId() + "] {" + getObjectType() + "} Result min size : " + this.minSize); + Log.verbose("[{}] Result min size : {}", getId(), this.minSize); } @XmlManaged @@ -100,23 +100,23 @@ public class Sizer extends ContainerN { @Override public void onChangeSize() { super.onChangeSize(); - Vector3f tmpBorderSize = this.propertyBorderSize.getPixel(); + final Vector3f tmpBorderSize = this.propertyBorderSize.getPixel(); Log.verbose("[" + getId() + "] update size : " + this.size + " nbElement : " + this.subWidget.size() + " borderSize=" + tmpBorderSize + " from border=" + this.propertyBorderSize); - Vector3f localWidgetSize = this.size.less(tmpBorderSize.multiply(2.0f)); + final Vector3f localWidgetSize = this.size.less(tmpBorderSize.multiply(2.0f)); // -1- calculate min-size and expand requested: Vector3f minSize = Vector3f.ZERO; Vector3i nbWidgetExpand = Vector3i.ZERO; - for (Widget it : this.subWidget) { + for (final Widget it : this.subWidget) { if (it == null) { continue; } - Vector3f tmpSize = it.getCalculateMinSize(); + final Vector3f tmpSize = it.getCalculateMinSize(); if (this.propertyMode == DisplayMode.modeVert) { minSize = new Vector3f(Math.max(minSize.x(), tmpSize.x()), minSize.y() + tmpSize.y(), Math.max(minSize.z(), tmpSize.z())); } else { minSize = new Vector3f(minSize.x() + tmpSize.x(), Math.max(minSize.y(), tmpSize.y()), Math.max(minSize.z(), tmpSize.z())); } - Vector3b expand = it.canExpand(); + final Vector3b expand = it.canExpand(); nbWidgetExpand = nbWidgetExpand.add(expand.x() ? 1 : 0, expand.y() ? 1 : 0, 0); } // -2- Calculate the size to add at every elements... @@ -132,7 +132,7 @@ public class Sizer extends ContainerN { } } // -3- Configure all at the min size ... - for (Widget it : this.subWidget) { + for (final Widget it : this.subWidget) { if (it == null) { continue; } @@ -151,12 +151,12 @@ public class Sizer extends ContainerN { if (!this.subWidget.isEmpty()) { lastWidget = this.subWidget.get(this.subWidget.size() - 1); } - for (Widget it : this.subWidget) { + for (final Widget it : this.subWidget) { if (it == null) { continue; } Vector3f tmpSizeMin = it.getSize(); - Vector3f tmpSizeMax = it.getCalculateMaxSize(); + final Vector3f tmpSizeMax = it.getCalculateMaxSize(); // Now update his size his size in X and the current sizer size in Y: if (this.propertyMode == DisplayMode.modeVert) { if (it.canExpand().y() || (it == lastWidget && it.canExpandIfFree().y())) { @@ -201,7 +201,7 @@ public class Sizer extends ContainerN { } } // -5- Update the expand in the second size if vert ==> X and if hori ==> Y - for (Widget it : this.subWidget) { + for (final Widget it : this.subWidget) { if (it == null) { continue; } @@ -223,7 +223,7 @@ public class Sizer extends ContainerN { } } // -6- Force size at the entire number: - for (Widget it : this.subWidget) { + for (final Widget it : this.subWidget) { if (it == null) { continue; } @@ -231,28 +231,28 @@ public class Sizer extends ContainerN { } // -7- get under Size Vector3f underSize = Vector3f.ZERO; - for (Widget it : this.subWidget) { + for (final Widget it : this.subWidget) { if (it == null) { continue; } - Vector3f size = it.getSize(); + final Vector3f size = it.getSize(); if (this.propertyMode == DisplayMode.modeVert) { underSize = new Vector3f(Math.max(underSize.x(), size.x()), underSize.y() + size.y(), Math.max(underSize.z(), size.z())); } else { underSize = new Vector3f(underSize.x() + size.x(), Math.max(underSize.y(), size.y()), Math.max(underSize.z(), size.z())); } } - Vector3f deltas = localWidgetSize.less(underSize); + final Vector3f deltas = localWidgetSize.less(underSize); // -8- Calculate the local origin, depending of the gravity: Vector3f tmpOrigin = this.origin.add(tmpBorderSize).add(this.propertyGravity.gravityGenerateDelta(deltas)); // -9- Set sub widget origin: - for (Widget it : this.subWidget) { + for (final Widget it : this.subWidget) { if (it == null) { continue; } Vector3f origin; - Vector3f size = it.getSize(); + final Vector3f size = it.getSize(); if (this.propertyMode == DisplayMode.modeVert) { origin = Vector3f.clipInt(tmpOrigin.add(this.offset).add(this.propertyGravity.gravityGenerateDelta(new Vector3f(underSize.x() - size.x(), 0.0f, 0.0f)))); } else { @@ -266,7 +266,7 @@ public class Sizer extends ContainerN { } } // -10- Update all subSize at every element: - for (Widget it : this.subWidget) { + for (final Widget it : this.subWidget) { if (it == null) { continue; }