From 9472ddc46b7740b8f9f8d8c58fbbdc6b63783b16 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Thu, 26 Jun 2025 00:19:23 +0200 Subject: [PATCH] [FEAT] continue integration of SVG... --- .../ewol/compositing/CompositingSVG.java | 51 ++ .../atriasoft/ewol/compositing/GuiShape.java | 700 ------------------ src/main/org/atriasoft/ewol/widget/Box.java | 45 +- .../ewol/widget/ContainerWithShape.java | 179 ----- src/main/org/atriasoft/ewol/widget/Entry.java | 201 ++--- src/main/org/atriasoft/ewol/widget/PopUp.java | 25 +- .../org/atriasoft/ewol/widget/Scroll.java | 54 +- .../org/atriasoft/ewol/widget/Slider.java | 50 +- .../atriasoft/ewol/widget/WidgetScrolled.java | 72 +- 9 files changed, 269 insertions(+), 1108 deletions(-) delete mode 100644 src/main/org/atriasoft/ewol/compositing/GuiShape.java delete mode 100644 src/main/org/atriasoft/ewol/widget/ContainerWithShape.java diff --git a/src/main/org/atriasoft/ewol/compositing/CompositingSVG.java b/src/main/org/atriasoft/ewol/compositing/CompositingSVG.java index f54b319..a7b2a4c 100644 --- a/src/main/org/atriasoft/ewol/compositing/CompositingSVG.java +++ b/src/main/org/atriasoft/ewol/compositing/CompositingSVG.java @@ -422,4 +422,55 @@ public class CompositingSVG extends Compositing { this.requestSize = size; } + public void setRectangleAsSource(final int sizeX, final int sizeY, final Color color) { + setSource(""" + + + """.formatted( // + sizeX, sizeY, // + 0, 0, // + sizeX, sizeY, // + color.toStringSharp() // + ), new Vector2i(sizeX, sizeY)); + } + + public void setRectangleBorderAsSource( + final int sizeX, + final int sizeY, + final Color color, + final int borderSize, + final int borderRadius, + final Color borderColor) { + + final int paddingCompensateBorder = Math.round(borderSize * 0.5f); + setSource(""" + + + """.formatted( // + sizeX, sizeY, // + paddingCompensateBorder, paddingCompensateBorder, // + sizeX - 2 * paddingCompensateBorder, sizeY - 2 * paddingCompensateBorder, // + borderRadius, // + borderRadius, // + color.toStringSharp(), // + borderColor.toStringSharp(), // + borderSize // + ), new Vector2i(sizeX, sizeY)); + } } diff --git a/src/main/org/atriasoft/ewol/compositing/GuiShape.java b/src/main/org/atriasoft/ewol/compositing/GuiShape.java deleted file mode 100644 index 299026f..0000000 --- a/src/main/org/atriasoft/ewol/compositing/GuiShape.java +++ /dev/null @@ -1,700 +0,0 @@ -package org.atriasoft.ewol.compositing; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - -import org.atriasoft.egami.ImageByte; -import org.atriasoft.etk.Uri; -import org.atriasoft.etk.math.FMath; -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.resource.ResourceConfigFile; -import org.atriasoft.gale.backend3d.OpenGL; -import org.atriasoft.gale.backend3d.OpenGL.Flag; -import org.atriasoft.gale.resource.ResourceProgram; -import org.atriasoft.gale.resource.ResourceTexture2; -import org.atriasoft.loader3d.resources.ResourceMesh; -import org.atriasoft.loader3d.resources.ResourcePaletteFile; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @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 Logger LOGGER = LoggerFactory.getLogger(GuiShape.class); - - private class SpecificValues { - public Matrix4f transform = Matrix4f.IDENTITY; - public Vector3f offsetScaleInside = Vector3f.ZERO; - public Vector3f offsetScaleOutside = Vector3f.ZERO; - public ResourceMesh mesh = null; - } - - 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 confIdPaletteFile = -1; //!< Palette of the display - 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 configuration: - private ResourceConfigFile config = null; //!< pointer on the config file resources - private int confObjectFile = -1; //!< Config Id of the object file to display - private int confObjectFile2 = -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 listAssiciatedId = new ArrayList<>(); //!< Correlation ID between ColorProperty (Y) and OpenGL Program (X) - // internal needed data : - private GuiShapeMode nextStatusRequested = GuiShapeMode.NONE; //!< 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) - private int oGLPaletteOffset = -1; //!< openGL id on the element (offset for the palet rendering) - private int oGLOffsetScaleInside = -1; - private int oGLOffsetScaleOutside = -1; - - // openGL shaders programs: - private ResourceProgram oGLprogram = null; //!< pointer on the opengl display program - // For the Image : - private ResourcePaletteFile palette; - private ResourceTexture2 texture; - private Padding sizeObject = Padding.ZERO; - private int stateActivate = -1; //!< Activate state of the element - private GuiShapeMode stateNew = GuiShapeMode.NORMAL; //!< destination state - private GuiShapeMode stateOld = GuiShapeMode.NORMAL; //!< previous state - - private Uri uri; //!< Name of the configuration of the shaper. - private final SpecificValues[] valueSpecific = new SpecificValues[2]; - - // dynamic change: - private float stateTransition = 0; //!< working state between 2 states - - /** - * @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; - } - // Load data from the configuration file: - loadConfigFile(); - loadUpdateObjectSize(); - loadPalette(); - 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 GuiShapeMode newStatusId) { - if (newStatusId != this.stateNew) { - this.nextStatusRequested = newStatusId; - return true; - } - if (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 registered text in the current element on openGL - */ - @Override - public void draw(final boolean disableDepthTest) { - draw(null, disableDepthTest); - } - - public void draw(final boolean disableDepthTest, final int idMesh) { - draw(null, disableDepthTest, idMesh); - } - - public void draw(final ResourceTexture2 secondaryTexture, final boolean disableDepthTest) { - this.draw(secondaryTexture, disableDepthTest, 0); - } - - public void draw(final ResourceTexture2 secondaryTexture, final boolean disableDepthTest, final int idMesh) { - if (this.config == null) { - // this is a normal case ... the user can choice to have no config basic file ... - return; - } - if (idMesh == 0 && this.valueSpecific[0] == null) { - LOGGER.error("No Object (0) to display ..."); - return; - } else if (idMesh == 1 && this.valueSpecific[1] == null) { - LOGGER.error("No Object (1) to display ..."); - return; - } else if (idMesh < 0 && idMesh > 1) { - LOGGER.error("No Object (" + idMesh + ") to display [0..1]"); - System.exit(-1); - return; - } - if (this.oGLprogram == null) { - LOGGER.error("No shader ..."); - return; - } - OpenGL.enable(Flag.flag_depthTest); - // set Matrix : translation/positionMatrix - final Matrix4f projMatrix = OpenGL.getMatrix(); - final Matrix4f camMatrix = OpenGL.getCameraMatrix(); - final Matrix4f tmpMatrix = this.matrixApply.multiply(this.valueSpecific[idMesh].transform); - this.oGLprogram.use(); - this.valueSpecific[idMesh].mesh.bindForRendering(); - this.oGLprogram.uniformMatrix(this.oGLMatrixProjection, projMatrix); - this.oGLprogram.uniformMatrix(this.oGLMatrixTransformation, tmpMatrix); - this.oGLprogram.uniformMatrix(this.oGLMatrixView, camMatrix); - - final Set layers = this.valueSpecific[idMesh].mesh.getLayers(); - LOGGER.trace("get layers:" + layers); - // Texture: - final float imageDelta = (float) 1 / ResourcePaletteFile.getHeight(); - float basicValue = this.stateOld.getValue() / ResourcePaletteFile.getHeight(); - if (this.stateOld != this.stateNew) { - if (this.stateOld == GuiShapeMode.NORMAL) { - if (this.stateNew == GuiShapeMode.OVER) { - basicValue += imageDelta * this.stateTransition; - } else if (this.stateNew == GuiShapeMode.SELECT) { - basicValue += imageDelta * 3.0f - imageDelta * this.stateTransition; - } - } else if (this.stateOld == GuiShapeMode.OVER) { - if (this.stateNew == GuiShapeMode.NORMAL) { - basicValue -= imageDelta * this.stateTransition; - } else if (this.stateNew == GuiShapeMode.SELECT) { - basicValue += imageDelta * this.stateTransition; - } - } else if (this.stateOld == GuiShapeMode.SELECT) { - if (this.stateNew == GuiShapeMode.NORMAL) { - basicValue += imageDelta * this.stateTransition; - } else if (this.stateNew == GuiShapeMode.OVER) { - basicValue -= imageDelta * this.stateTransition; - } - } - } - LOGGER.trace( - "colorDelta = " + basicValue + " old = " + this.stateOld + "(" + this.stateOld.getValue() * imageDelta - + ") new = " + this.stateNew + "(" + this.stateNew.getValue() * imageDelta + ")"); - this.oGLprogram.uniformFloat(this.oGLPaletteOffset, basicValue); - - //LOGGER.trace("plop: " + this.offsetScaleOutside); - //LOGGER.trace("plop: " + this.offsetScaleInside); - this.oGLprogram.uniformVector(this.oGLOffsetScaleInside, this.valueSpecific[idMesh].offsetScaleInside); - this.oGLprogram.uniformVector(this.oGLOffsetScaleOutside, this.valueSpecific[idMesh].offsetScaleOutside); - - this.texture.bindForRendering(0); - this.valueSpecific[idMesh].mesh.render("palette"); - if (secondaryTexture != null) { - this.oGLprogram.uniformFloat(this.oGLPaletteOffset, 0); - secondaryTexture.bindForRendering(0); - this.valueSpecific[idMesh].mesh.render("gui_dynamic_1"); - - } - // Request the draw of the elements: - this.valueSpecific[idMesh].mesh.render(); - - this.valueSpecific[idMesh].mesh.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 GuiShapeMode 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 GuiShapeMode 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 transition 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; - } - - private void loadConfigFile() { - if (this.uri.isEmpty()) { - LOGGER.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.confObjectFile2 = this.config.request("object-file-2"); - this.confIdPaletteFile = this.config.request("palette"); - } - } - - protected void loadPalette() { - final String paletteFile = this.config.getString(this.confIdPaletteFile); - final Uri paletteFileInterface = Uri.valueOf(paletteFile); - this.palette = ResourcePaletteFile.create(paletteFileInterface); - this.texture = ResourceTexture2.createNamed("TEXTURE_OF_PALETTE:" + paletteFile); - if (this.texture == null) { - LOGGER.error("can not instanciate Texture ..."); - } - // element already called - loadPaletteUpdate(); - // for next update (realTime reload) - this.palette.onUpdate(() -> { - loadPaletteUpdate(); - }); - } - - protected void loadPaletteUpdate() { - LOGGER.warn("update palet environnement"); - final ImageByte img = this.palette.getImageByte(); - //IOgami.storePNG(new Uri("/home/heero/000000000aaaaplopppp.png"), img); - this.texture.set(img); - } - - /** - * load the openGL program and get all the ID needed - */ - private void loadProgram() { - if (this.config == null) { - LOGGER.debug("no Shaper set for loading resources ..."); - return; - } - final String basicShaderFileVert = this.config.getString(this.confProgramFileVert); - final 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"); - this.oGLPaletteOffset = this.oGLprogram.getUniform("in_offsetPalette"); - this.oGLOffsetScaleInside = this.oGLprogram.getUniform("in_offsetScaleInside"); - this.oGLOffsetScaleOutside = this.oGLprogram.getUniform("in_offsetScaleOutside"); - } - } - } - - /** - * load the openGL program and get all the ID needed - */ - private void loadUpdateObjectSize() { - if (this.config == null) { - LOGGER.debug("no Shaper set for loading resources ..."); - return; - } - final String objectFile = this.config.getString(this.confObjectFile); - if (!objectFile.isEmpty()) { - final int idMesh = 0; - this.valueSpecific[idMesh] = new SpecificValues(); - this.valueSpecific[idMesh].mesh = ResourceMesh.create(Uri.valueOf(objectFile)); - final List verticesToModify = this.valueSpecific[idMesh].mesh.getGeneratedPosition(); - float top = 0; - float bottom = 0; - float left = 0; - float right = 0; - float back = 0; - float font = 0; - // estimate size of border: - if (verticesToModify == null) { - LOGGER.error("Element is null : verticesToModify 1"); - System.exit(-1); - return; - } - for (final Vector3f element : verticesToModify) { - left = Math.min(left, element.x()); - right = Math.max(right, element.x()); - top = Math.min(top, element.y()); - bottom = Math.max(bottom, element.y()); - back = Math.min(back, element.z()); - font = Math.max(font, element.z()); - } - this.sizeObject = new Padding(Math.abs(left), Math.abs(top), Math.abs(right), Math.abs(bottom)); - } else { - final int idMesh = 0; - this.valueSpecific[idMesh] = null; - } - final String objectFile2 = this.config.getString(this.confObjectFile2); - if (!objectFile2.isEmpty()) { - final int idMesh = 1; - this.valueSpecific[idMesh] = new SpecificValues(); - this.valueSpecific[idMesh].mesh = ResourceMesh.create(Uri.valueOf(objectFile2)); - final List verticesToModify = this.valueSpecific[idMesh].mesh.getGeneratedPosition(); - float top = 0; - float bottom = 0; - float left = 0; - float right = 0; - float back = 0; - float font = 0; - // estimate size of border: - if (verticesToModify == null) { - LOGGER.error("Element is null : verticesToModify 2"); - System.exit(-1); - return; - } - for (final Vector3f element : verticesToModify) { - left = Math.min(left, element.x()); - right = Math.max(right, element.x()); - top = Math.min(top, element.y()); - bottom = Math.max(bottom, element.y()); - back = Math.min(back, element.z()); - font = Math.max(font, element.z()); - } - } else { - final int idMesh = 1; - this.valueSpecific[idMesh] = null; - } - } - - /** - * @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) { - LOGGER.trace("call=" + event.getTimeDeltaCallSecond() + "s state transition=" + this.stateTransition - + " speedTime=" + this.config.getNumber(this.confIdChangeTime)); - // start : - if (this.stateTransition >= 1.0) { - this.stateOld = this.stateNew; - if ((this.nextStatusRequested == GuiShapeMode.NONE) || (this.nextStatusRequested == this.stateOld)) { - this.nextStatusRequested = GuiShapeMode.NONE; - // disable periodic call ... - return false; - } - this.stateNew = this.nextStatusRequested; - this.nextStatusRequested = GuiShapeMode.NONE; - this.stateTransition = 0.0f; - LOGGER.trace(" ##### START ##### "); - return true; - } - if (this.stateTransition < 1.0) { - // check if no new state requested: - if (this.nextStatusRequested != GuiShapeMode.NONE && this.stateTransition < 0.5) { - // invert sources with destination - final GuiShapeMode tmppp = this.stateOld; - this.stateOld = this.stateNew; - this.stateNew = tmppp; - this.stateTransition = 1.0f - this.stateTransition; - if (this.nextStatusRequested == this.stateNew) { - this.nextStatusRequested = GuiShapeMode.NONE; - } - } - float timeRelativity = 0.0f; - if (this.config != null) { - timeRelativity = (float) (this.config.getNumber(this.confIdChangeTime) / 1000.0f); - } - this.stateTransition += event.getTimeDeltaCallSecond() / timeRelativity; - //stateTransition += _event.getDeltaCall(); - this.stateTransition = FMath.avg(0.0f, this.stateTransition, 1.0f); - LOGGER.trace("relative=" + timeRelativity + " Transition : " + this.stateTransition); - } - return true; - } - - /** - * @brief Set activate state of the element - * @param _status New activate status - */ - public void setActivateState(final int status) { - this.stateActivate = status; - } - - public void setShape(final int idMesh, final Vector3f origin, final Vector3f size) { - final Padding tmp = getPadding(); - setShape(idMesh, origin, size, origin.add(tmp.left(), tmp.bottom(), 0), size.less(tmp.x(), tmp.y(), 0)); - } - - public void setShape( - final int idMesh, - final Vector3f origin, - final Vector3f size, - final Vector3f insidePos, - final Vector3f insideSize) { - final Vector3f halfSize = insideSize.multiply(0.5f); - this.valueSpecific[idMesh].offsetScaleOutside = halfSize; - this.valueSpecific[idMesh].offsetScaleInside = halfSize.add(this.sizeObject.x() * 0.25f, - this.sizeObject.y() * 0.25f, 0); - /* - List verticesToModify = this.mesh.getGeneratedPosition(); - float[] newVertices = new float[verticesToModify.size()*3]; - for (int iii=0; iii - - """.formatted( // - this.renderSize.x(), this.renderSize.y(), // - paddingCompensateBorder, paddingCompensateBorder, // - this.renderSize.x() - 2 * paddingCompensateBorder, - this.renderSize.y() - 2 * paddingCompensateBorder, // - (int) this.propertyBorderRadius.size(), // - (int) this.propertyBorderRadius.size(), // - this.propertyColor.toStringSharp(), // - this.propertyBorderColor.toStringSharp(), // - borderSize // - ), // - this.renderSize); + this.compositing.setRectangleBorderAsSource(this.renderSize.x(), this.renderSize.y(), this.propertyColor, + borderSize, (int) this.propertyBorderRadius.size(), this.propertyBorderColor); } else { - this.compositing.setSource(""" - - - """.formatted( // - this.renderSize.x(), this.renderSize.y(), // - paddingCompensateBorder, paddingCompensateBorder, // - this.renderSize.x() - 2 * paddingCompensateBorder, - this.renderSize.y() - 2 * paddingCompensateBorder, // - this.propertyColor.toStringSharp() // - ), // - this.renderSize); + this.compositing.setRectangleAsSource(this.renderSize.x(), this.renderSize.y(), this.propertyColor); } this.compositing.setPos(this.renderOrigin); // For events: diff --git a/src/main/org/atriasoft/ewol/widget/ContainerWithShape.java b/src/main/org/atriasoft/ewol/widget/ContainerWithShape.java deleted file mode 100644 index 768ed98..0000000 --- a/src/main/org/atriasoft/ewol/widget/ContainerWithShape.java +++ /dev/null @@ -1,179 +0,0 @@ -/** @file - * @author Edouard DUPIN - * @copyright 2011, Edouard DUPIN, all right reserved - * @license MPL v2.0 (see license file) - */ -package org.atriasoft.ewol.widget; - -import org.atriasoft.aknot.annotation.AknotAttribute; -import org.atriasoft.aknot.annotation.AknotDescription; -import org.atriasoft.aknot.annotation.AknotManaged; -import org.atriasoft.aknot.annotation.AknotName; -import org.atriasoft.etk.Uri; -import org.atriasoft.etk.math.Vector3f; -import org.atriasoft.ewol.DrawProperty; -import org.atriasoft.ewol.Padding; -import org.atriasoft.ewol.compositing.GuiShape; -import org.atriasoft.ewol.compositing.ShapeBox; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Simple Container that have a Shape (not directly instantiate!!!!) - */ -public class ContainerWithShape extends Container { - private static final Logger LOGGER = LoggerFactory.getLogger(ContainerWithShape.class); - // properties - public Uri propertyShape = null; //!< Compositing theme. - - protected GuiShape shape; //!< Compositing theme. - protected ShapeBox shapeProperty = ShapeBox.ZERO; - - /** - * Constructor - * @param propertyShape shape file properties - */ - public ContainerWithShape(final Uri propertyShape) { - this.propertyShape = propertyShape; - onChangePropertyShape(); - } - - @Override - public void calculateMinMaxSize() { - // call main class - calculateMinMaxSizeWidget(); - // call sub classes - if (this.subWidget != null) { - this.subWidget.calculateMinMaxSize(); - final Vector3f min = this.subWidget.getCalculateMinSize(); - final Padding padding = this.shape.getPadding(); - this.minSize = Vector3f.max(this.minSize, min.add(padding.x(), padding.y(), padding.z())); - } - LOGGER.warn("[{}] Result min size : {}", getId(), this.minSize); - } - - @AknotManaged - @AknotAttribute - @AknotName(value = "shape") - @AknotDescription(value = "The uri one the shape for the Pop-up") - public Uri getPropertyShape() { - return this.propertyShape; - } - - @Override - public Widget getWidgetAtPos(final Vector3f pos) { - final Widget val = super.getWidgetAtPos(pos); - if (val != null) { - return val; - } - return this; - } - - protected void onChangePropertyShape() { - if (this.shape == null) { - this.shape = new GuiShape(this.propertyShape); - } else { - this.shape.setSource(this.propertyShape); - } - markToRedraw(); - requestUpdateSize(); - } - - @Override - public void onChangeSize() { - markToRedraw(); - if (this.subWidget == null) { - return; - } - final Padding padding = this.shape.getPadding(); - Vector3f subWidgetSize = this.subWidget.getCalculateMinSize(); - if (this.subWidget.canExpand().x() && this.propertyFill.x()) { - subWidgetSize = subWidgetSize.withX(this.size.x()); - } else { - subWidgetSize = subWidgetSize.withX(this.minSize.x()); - } - if (this.subWidget.canExpand().y() && this.propertyFill.y()) { - subWidgetSize = subWidgetSize.withY(this.size.y()); - } else { - subWidgetSize = subWidgetSize.withY(this.minSize.y()); - } - if (this.subWidget.canExpand().z() && this.propertyFill.z()) { - subWidgetSize = subWidgetSize.withZ(this.size.z()); - } else { - subWidgetSize = subWidgetSize.withZ(this.minSize.z()); - } - subWidgetSize = subWidgetSize.less(padding.x(), padding.y(), padding.z()); - subWidgetSize = subWidgetSize.clipInteger(); - - // set config to the Sub-widget - Vector3f subWidgetOrigin = this.origin.add(this.size.less(subWidgetSize).multiply(0.5f)); - subWidgetOrigin = subWidgetOrigin.clipInteger(); - - this.subWidget.setOrigin(subWidgetOrigin); - this.subWidget.setSize(subWidgetSize); - this.subWidget.onChangeSize(); - } - - @Override - protected void onDraw() { - this.shape.draw(); - } - - @Override - public void onRegenerateDisplay() { - if (needRedraw()) { - this.shape.clear(); - final Padding padding = this.shape.getPadding(); - final Vector3f tmpSize = Vector3f.ZERO; - Vector3f tmpSizeShaper = this.minSize; - Vector3f tmpOriginShaper = this.propertyGravity.gravityGenerateDelta(this.size.less(this.minSize)); - if (this.propertyFill.x()) { - tmpSizeShaper = tmpSizeShaper.withX(this.size.x()); - tmpOriginShaper = tmpOriginShaper.withX(0.0f); - } - if (this.propertyFill.y()) { - tmpSizeShaper = tmpSizeShaper.withY(this.size.y()); - tmpOriginShaper = tmpOriginShaper.withY(0.0f); - } - if (this.propertyFill.z()) { - tmpSizeShaper = tmpSizeShaper.withZ(this.size.y()); - tmpOriginShaper = tmpOriginShaper.withZ(0.0f); - } - // not sure this is needed... - tmpSizeShaper = tmpSizeShaper.clipInteger(); - tmpOriginShaper = tmpOriginShaper.clipInteger(); - - this.shapeProperty = new ShapeBox(tmpOriginShaper, tmpSizeShaper, padding); - this.shape.setShape(tmpOriginShaper, tmpSizeShaper); - } - // SubWidget generation ... - if (this.subWidget != null) { - this.subWidget.onRegenerateDisplay(); - } - } - - public void setPropertyShape(final Uri propertyShape) { - if (this.propertyShape.equals(propertyShape)) { - return; - } - this.propertyShape = propertyShape; - onChangePropertyShape(); - } - - @Override - public void systemDraw(final DrawProperty displayProp) { - if (this.propertyHide) { - // widget is hidden ... - return; - } - systemDrawWidget(displayProp); - if (this.subWidget == null) { - return; - } - if (true) { //this.shape.getNextDisplayedStatus() == GuiShapeMode.NONE && this.shape.getTransitionStatus() >= 1.0) { - final DrawProperty prop = displayProp.withLimit(this.origin, this.size); - this.subWidget.systemDraw(prop); - } - } - -} diff --git a/src/main/org/atriasoft/ewol/widget/Entry.java b/src/main/org/atriasoft/ewol/widget/Entry.java index 2dd0464..3a4aaf0 100644 --- a/src/main/org/atriasoft/ewol/widget/Entry.java +++ b/src/main/org/atriasoft/ewol/widget/Entry.java @@ -13,15 +13,16 @@ 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.etk.math.Vector2i; import org.atriasoft.etk.math.Vector3f; import org.atriasoft.ewol.Padding; +import org.atriasoft.ewol.compositing.CompositingSVG; import org.atriasoft.ewol.compositing.CompositingText; -import org.atriasoft.ewol.compositing.GuiShape; import org.atriasoft.ewol.compositing.GuiShapeMode; import org.atriasoft.ewol.event.EventEntry; import org.atriasoft.ewol.event.EventInput; import org.atriasoft.ewol.event.EventTime; -import org.atriasoft.ewol.object.EwolObject; import org.atriasoft.gale.context.ClipBoard; import org.atriasoft.gale.context.ClipboardList; import org.atriasoft.gale.key.KeyKeyboard; @@ -42,19 +43,19 @@ import org.slf4j.LoggerFactory; */ public class Entry extends Widget { private static final Logger LOGGER = LoggerFactory.getLogger(Entry.class); - + /** * Periodic call to update grapgic display * @param _event Time generic event */ protected static void periodicCall(final Entry self, final EventTime event) { LOGGER.trace("Periodic call on Entry(" + event + ")"); - if (!self.shape.periodicCall(event)) { - self.periodicConnectionHanble.close(); - } + // if (!self.shape.periodicCall(event)) { + // self.periodicConnectionHanble.close(); + // } self.markToRedraw(); } - + /// color property of the text foreground private int colorIdTextFg; /// Cursor must be display only when the widget has the focus @@ -69,6 +70,7 @@ public class Entry extends Widget { private int displayCursorPositionPixel = 0; /// text display this.text private final CompositingText text = new CompositingText(); + protected CompositingSVG compositing = new CompositingSVG(); /// text position can have change private boolean needUpdateTextPos = true; /// Periodic call handle to remove it when needed @@ -76,16 +78,16 @@ public class Entry extends Widget { private Uri propertyConfig = new Uri("THEME", "shape/Entry.json", "ewol"); private int propertyMaxCharacter = Integer.MAX_VALUE; //!< number max of Character in the list private boolean propertyPassword = false; //!< Disable display of the content of the entry - + /// regular expression value private String propertyRegex = ".*"; - + /// Text to display when nothing in in the entry (decorated text...) private String propertyTextWhenNothing = null; - + private String propertyValue = "Test Text..."; //!< string that must be displayed private Pattern regex = null; //!< regular expression to check content - private GuiShape shape; + //.create() @AknotSignal @AknotName(value = "click") @@ -95,24 +97,24 @@ public class Entry extends Widget { @AknotName(value = "enter") @AknotDescription("The cursor enter inside the button") public Signal signalEnter = new Signal<>(); //!< Enter key is pressed - + @AknotSignal @AknotName(value = "modify") @AknotDescription("Entry box value change") public Signal signalModify = new Signal<>(); //!< data change // element over: Vector3f overPositionStart = Vector3f.ZERO; - + Vector3f overPositionStop = Vector3f.ZERO; - + /** * Constructor * @param _newData The USting that might be set in the Entry box (no event generation!!) */ public Entry() { this.propertyCanFocus = true; - onChangePropertyShaper(); - + //onChangePropertyShaper(); + this.regex = Pattern.compile(this.propertyRegex); if (this.regex == null) { LOGGER.error("can not parse regex for : " + this.propertyRegex); @@ -124,21 +126,17 @@ public class Entry extends Widget { 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(); - } + final Padding padding = Padding.ZERO; final int minHeight = (int) this.text.getHeight();//calculateSize('A').y(); - + Vector3f minimumSizeBase = new Vector3f(20, minHeight, 10); // add padding : minimumSizeBase = minimumSizeBase.add(padding.x(), padding.y(), padding.z()); @@ -147,18 +145,18 @@ public class Entry extends Widget { checkMinSize(); //LOGGER.trace("min size = " + this.minSize); } - + protected void changeStatusIn(final GuiShapeMode newStatusId) { - if (this.shape.changeStatusIn(newStatusId)) { - if (!this.periodicConnectionHanble.isConnected()) { - //LOGGER.trace("REQUEST: connection on operiodic call"); - this.periodicConnectionHanble = EwolObject.getObjectManager().periodicCall.connect(this, - Entry::periodicCall); - } - markToRedraw(); - } + // if (this.shape.changeStatusIn(newStatusId)) { + // if (!this.periodicConnectionHanble.isConnected()) { + // //LOGGER.trace("REQUEST: connection on operiodic call"); + // this.periodicConnectionHanble = EwolObject.getObjectManager().periodicCall.connect(this, + // Entry::periodicCall); + // } + // markToRedraw(); + // } } - + /** * Copy the selected data on the specify clipboard * @param clipboardID Selected clipboard @@ -178,48 +176,48 @@ public class Entry extends Widget { final 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; @@ -227,11 +225,11 @@ public class Entry extends Widget { this.displayCursorPosSelection = this.displayCursorPos; markToRedraw(); } - + private void onCallbackPaste() { ClipBoard.request(ClipboardList.CLIPBOARD_STD); } - + private void onCallbackSelect(final boolean all) { if (all) { this.displayCursorPosSelection = 0; @@ -241,7 +239,7 @@ public class Entry extends Widget { } markToRedraw(); } - + private void onCallbackShortCut(final String value) { if (value.equals("clean")) { onCallbackEntryClean(); @@ -260,15 +258,15 @@ public class Entry extends Widget { LOGGER.warn("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) { @@ -276,23 +274,11 @@ public class Entry extends Widget { } 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) { @@ -308,15 +294,15 @@ public class Entry extends Widget { } markToRedraw(); } - + @Override protected void onDraw() { - if (this.shape != null) { - this.shape.draw(true); + if (this.compositing != null) { + this.compositing.draw(true); } this.text.draw(); } - + @Override public void onEventClipboard(final ClipboardList clipboardID) { // remove curent selected data ... @@ -340,7 +326,7 @@ public class Entry extends Widget { } this.signalModify.emit(this.propertyValue); } - + @Override public boolean onEventEntry(final EventEntry event) { LOGGER.trace("Event on Entry ... " + event); @@ -416,7 +402,7 @@ public class Entry extends Widget { } return false; } - + @Override public boolean onEventInput(final EventInput event) { final Vector3f absolutePosition = new Vector3f(event.pos().x(), event.pos().y(), 0); @@ -519,7 +505,7 @@ public class Entry extends Widget { } return false; } - + @Override protected void onGetFocus() { this.displayCursor = true; @@ -527,7 +513,7 @@ public class Entry extends Widget { showKeyboard(); markToRedraw(); } - + @Override protected void onLostFocus() { this.displayCursor = false; @@ -535,14 +521,14 @@ public class Entry extends Widget { hideKeyboard(); markToRedraw(); } - + @Override public void onRegenerateDisplay() { if (!needRedraw()) { //return; } //LOGGER.trace("Regenerate Display ==> is needed: '" + this.propertyValue + "'"); - this.shape.clear(); + this.compositing.clear(); this.text.clear(); if (this.colorIdTextFg >= 0) { //this.text.setDefaultColorFg(this.shape.getColor(this.colorIdTextFg)); @@ -551,8 +537,8 @@ public class Entry extends Widget { //this.text.setSelectionColor(this.shape.getColor(this.colorIdSelection)); } updateTextPosition(); - final Padding padding = this.shape.getPadding(); - + final Padding padding = Padding.ZERO; + Vector3f tmpSizeShaper = this.minSize; Vector3f delta = this.propertyGravity.gravityGenerateDelta(this.size.less(this.minSize)); if (this.propertyFill.x()) { @@ -573,7 +559,7 @@ public class Entry extends Widget { Vector3f tmpOriginText = tmpOriginShaper.add(padding.bottom(), padding.left(), padding.back()); //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 ... - + final int minHeight = (int) this.text.getHeight(); if (tmpSizeText.y() > minHeight) { tmpOriginText = tmpOriginText.add(0, (tmpSizeText.y() - minHeight) * 0.5f, 0); @@ -583,7 +569,7 @@ public class Entry extends Widget { tmpOriginShaper = Vector3f.clipInt(tmpOriginShaper); tmpSizeText = Vector3f.clipInt(tmpSizeText); tmpOriginText = Vector3f.clipInt(tmpOriginText); - + this.text.clear(); //this.text.setSize((int) tmpSizeText.x(), (int) tmpSizeText.y()); this.text.setClippingWidth(tmpOriginText, tmpSizeText); @@ -597,7 +583,7 @@ public class Entry extends Widget { if (this.propertyPassword) { Arrays.fill(valueToDisplay, '*'); } - + //final Vector2f plop = new Vector2f(tmpOriginText.x() + this.displayStartPosition, tmpOriginText.y()); if (valueToDisplay.length != 0) { this.text.print(new String(valueToDisplay)); @@ -607,12 +593,29 @@ public class Entry extends Widget { this.text.setClippingMode(false); this.overPositionStart = tmpOriginShaper; this.overPositionStop = tmpOriginShaper.add(tmpSizeShaper); - this.shape.setShape(tmpOriginShaper, tmpSizeShaper, tmpOriginText, tmpSizeText); + //this.shape.setShape(tmpOriginShaper, tmpSizeShaper, tmpOriginText, tmpSizeText); + this.compositing.setSource(""" + + + """.formatted( // + (int) tmpSizeShaper.x(), (int) tmpSizeShaper.y(), // + tmpSizeShaper.x() - 0.5, tmpSizeShaper.y() - 0.5// + ), new Vector2i((int) tmpSizeShaper.x(), (int) tmpSizeShaper.y())); + this.compositing.setPos(tmpOriginShaper); + this.compositing.print(new Vector2f(tmpSizeShaper.x(), tmpSizeShaper.y())); this.text.flush(); - this.shape.flush(); - + this.compositing.flush(); + } - + /** * remove the selected area * @note This request a regeneration of the display @@ -640,7 +643,7 @@ public class Entry extends Widget { this.propertyValue = tmp.toString(); markToRedraw(); } - + /** * internal check the value with RegExp checking * @param newData The new string to display @@ -667,7 +670,7 @@ public class Entry extends Widget { this.propertyValue = newData; markToRedraw(); } - + @AknotManaged @AknotAttribute @AknotName(value = "config") @@ -677,9 +680,9 @@ public class Entry extends Widget { return; } this.propertyConfig = propertyConfig; - onChangePropertyShaper(); + //onChangePropertyShaper(); } - + @AknotManaged @AknotAttribute @AknotName(value = "max") @@ -691,7 +694,7 @@ public class Entry extends Widget { this.propertyMaxCharacter = propertyMaxCharacter; onChangePropertyMaxCharacter(); } - + @AknotManaged @AknotAttribute @AknotName(value = "password") @@ -703,7 +706,7 @@ public class Entry extends Widget { this.propertyPassword = propertyPassword; onChangePropertyPassword(); } - + @AknotManaged @AknotAttribute @AknotName(value = "regex") @@ -715,7 +718,7 @@ public class Entry extends Widget { this.propertyRegex = propertyRegex; onChangePropertyRegex(); } - + @AknotManaged @AknotAttribute @AknotName(value = "empty-text") @@ -727,7 +730,7 @@ public class Entry extends Widget { this.propertyTextWhenNothing = propertyTextWhenNothing; onChangePropertyTextWhenNothing(); } - + @AknotManaged @AknotAttribute @AknotName(value = "value") @@ -739,7 +742,7 @@ public class Entry extends Widget { this.propertyValue = propertyValue; onChangePropertyValue(); } - + /** * change the cursor position with the curent position requested on the display * @param pos Absolute position of the event @@ -748,13 +751,13 @@ public class Entry extends Widget { protected void updateCursorPosition(final Vector3f pos) { updateCursorPosition(pos, false); } - + protected void updateCursorPosition(final Vector3f pos, final boolean selection/*=false*/) { - final Padding padding = this.shape.getPadding(); - + final Padding padding = Padding.ZERO; + final Vector3f relPos = relativePosition(pos).less(this.overPositionStart); // reject when outside ... - + // try to find the new cursor position : if (this.displayStartPosition > this.propertyValue.length()) { this.displayStartPosition = this.propertyValue.length(); @@ -792,7 +795,7 @@ public class Entry extends Widget { } markToUpdateTextPosition(); } - + /** * update the display position start == > depending of the position of the Cursor and the size of the Data inside * @change this.displayStartPosition < == updated @@ -801,8 +804,8 @@ public class Entry extends Widget { if (!this.needUpdateTextPos) { return; } - final Padding padding = this.shape.getPadding(); - + final Padding padding = Padding.ZERO; + int tmpSizeX = (int) this.minSize.x(); if (this.propertyFill.x()) { tmpSizeX = (int) this.size.x(); @@ -832,5 +835,5 @@ public class Entry extends Widget { //this.displayStartPosition = -totalWidth + tmpUserSize; } } - + } diff --git a/src/main/org/atriasoft/ewol/widget/PopUp.java b/src/main/org/atriasoft/ewol/widget/PopUp.java index 83883d2..8260d7a 100644 --- a/src/main/org/atriasoft/ewol/widget/PopUp.java +++ b/src/main/org/atriasoft/ewol/widget/PopUp.java @@ -11,7 +11,6 @@ import org.atriasoft.aknot.annotation.AknotManaged; import org.atriasoft.aknot.annotation.AknotName; import org.atriasoft.etk.Dimension3f; import org.atriasoft.etk.Distance; -import org.atriasoft.etk.Uri; import org.atriasoft.etk.math.Vector3b; import org.atriasoft.etk.math.Vector3f; import org.atriasoft.ewol.event.EventInput; @@ -20,19 +19,19 @@ import org.atriasoft.gale.key.KeyStatus; /** * Pop-up Display a sub element in a field inside the whole size (id set in pup-up windows) */ -public class PopUp extends ContainerWithShape { +public class PopUp extends Box { // properties public boolean propertyCloseOutEvent = false; //!< ratio progression of a sliding - + /** * Constructor */ public PopUp() { - super(new Uri("THEME", "shape/PopUp.json", "ewol")); + //super(new Uri("THEME", "shape/PopUp.json", "ewol")); this.propertyMinSize = new Dimension3f(new Vector3f(80, 80, 20), Distance.POURCENT); this.propertyExpand = Vector3b.FALSE; } - + @AknotManaged @AknotAttribute @AknotName(value = "out-click-remove") @@ -40,7 +39,7 @@ public class PopUp extends ContainerWithShape { public boolean isPropertyCloseOutEvent() { return this.propertyCloseOutEvent; } - + @Override public boolean onEventInput(final EventInput event) { if (this.propertyCloseOutEvent) { @@ -52,20 +51,20 @@ public class PopUp extends ContainerWithShape { if (event.status() == KeyStatus.move) { return false; } - + final Vector3f pos = relativePosition(new Vector3f(event.pos().x(), event.pos().y(), 0)); - if (!this.shapeProperty.isInside(pos)) { - autoDestroy(); - return true; - } + // if (!this.shapeProperty.isInside(pos)) { + // autoDestroy(); + // return true; + // } return false; } - + public void setPropertyCloseOutEvent(final boolean propertyCloseOutEvent) { if (this.propertyCloseOutEvent == propertyCloseOutEvent) { return; } this.propertyCloseOutEvent = propertyCloseOutEvent; } - + } diff --git a/src/main/org/atriasoft/ewol/widget/Scroll.java b/src/main/org/atriasoft/ewol/widget/Scroll.java index e177481..2f46de7 100644 --- a/src/main/org/atriasoft/ewol/widget/Scroll.java +++ b/src/main/org/atriasoft/ewol/widget/Scroll.java @@ -9,6 +9,7 @@ import org.atriasoft.aknot.annotation.AknotAttribute; import org.atriasoft.aknot.annotation.AknotDescription; import org.atriasoft.aknot.annotation.AknotManaged; import org.atriasoft.aknot.annotation.AknotName; +import org.atriasoft.etk.Color; import org.atriasoft.etk.Uri; import org.atriasoft.etk.math.FMath; import org.atriasoft.etk.math.Vector2f; @@ -18,7 +19,7 @@ import org.atriasoft.ewol.DrawProperty; import org.atriasoft.ewol.GravityVertical; import org.atriasoft.ewol.HighSpeedMode; import org.atriasoft.ewol.Padding; -import org.atriasoft.ewol.compositing.GuiShape; +import org.atriasoft.ewol.compositing.CompositingSVG; import org.atriasoft.ewol.event.EventInput; import org.atriasoft.gale.key.KeyStatus; import org.atriasoft.gale.key.KeyType; @@ -36,9 +37,8 @@ class Scroll extends Container { protected boolean propertyHover = true; //!< Horizontal shaper name - protected GuiShape shaperH; //!< Compositing theme Horizontal. - - protected GuiShape shaperV; //!< Compositing theme Vertical. + protected CompositingSVG compositingH = new CompositingSVG(); + protected CompositingSVG compositingV = new CompositingSVG(); protected float pixelScrolling = 20; protected Vector3f highSpeedStartPos = Vector3f.ZERO; protected HighSpeedMode highSpeedMode = HighSpeedMode.speedModeDisable; @@ -46,18 +46,6 @@ class Scroll extends Container { protected KeyType highSpeedType = KeyType.unknow; public Scroll() { - /* - // Remove gravity property: (only keep top/buttom) - propertyGravity.remove("center"); - propertyGravity.remove("top-left"); - //propertyGravity.remove("top"); - propertyGravity.remove("top-right"); - propertyGravity.remove("right"); - propertyGravity.remove("buttom-right"); - //propertyGravity.remove("buttom"); - propertyGravity.remove("buttom-left"); - propertyGravity.remove("left"); - */ onChangePropertyShapeVert(); onChangePropertyShapeHori(); } @@ -118,12 +106,12 @@ class Scroll extends Container { } protected void onChangePropertyShapeHori() { - this.shaperH.setSource(this.propertyShapeHori); + //TODO: this.shaperH.setSource(this.propertyShapeHori); markToRedraw(); } protected void onChangePropertyShapeVert() { - this.shaperV.setSource(this.propertyShapeVert); + //TODO: this.shaperV.setSource(this.propertyShapeVert); markToRedraw(); } @@ -171,8 +159,8 @@ class Scroll extends Container { @Override protected void onDraw() { - this.shaperH.draw(); - this.shaperV.draw(); + this.compositingH.draw(); + this.compositingV.draw(); } @Override @@ -428,10 +416,10 @@ class Scroll extends Container { return; } // clear all previous display - this.shaperH.clear(); - this.shaperV.clear(); - final Padding paddingVert = this.shaperV.getPadding(); - final Padding paddingHori = this.shaperH.getPadding(); + this.compositingH.clear(); + this.compositingV.clear(); + final Padding paddingVert = new Padding(2, 2, 2, 2); // this.compositingV.getPadding(); + final Padding paddingHori = new Padding(2, 2, 2, 2); // this.compositingH.getPadding(); Vector3f scrollOffset = Vector3f.ZERO; Vector3f scrollSize = Vector3f.ZERO; if (this.subWidget != null) { @@ -444,10 +432,19 @@ class Scroll extends Container { float originScrollBar = scrollOffset.y() / (scrollSize.y() - this.size.y() * this.propertyLimit.y()); originScrollBar = FMath.avg(0.0f, originScrollBar, 1.0f); originScrollBar *= (this.size.y() - lenScrollBar); + + final Vector2f renderOrigin = new Vector2f(this.size.x() - paddingVert.x(), 0); + final Vector2f renderSize = new Vector2f(paddingVert.x(), this.size.y()); + this.compositingV.setRectangleAsSource((int) renderSize.x(), (int) renderSize.y(), Color.GREEN); + this.compositingV.setPos(renderOrigin); + this.compositingV.print(renderSize); + this.compositingV.flush(); + /* this.shaperV.setShape(new Vector2f(this.size.x() - paddingVert.x(), 0), new Vector2f(paddingVert.x(), this.size.y()), new Vector2f(this.size.x() - paddingVert.right(), this.size.y() - originScrollBar - lenScrollBar), new Vector2f(0, lenScrollBar)); + */ } if (this.size.x() < scrollSize.x() || scrollOffset.x() != 0) { float lenScrollBar = (this.size.x() - paddingHori.left()) * (this.size.x() - paddingVert.x()) @@ -456,8 +453,17 @@ class Scroll extends Container { float originScrollBar = scrollOffset.x() / (scrollSize.x() - this.size.x() * this.propertyLimit.x()); originScrollBar = FMath.avg(0.0f, originScrollBar, 1.0f); originScrollBar *= (this.size.x() - paddingHori.right() - lenScrollBar); + + final Vector2f renderOrigin = Vector2f.ZERO; + final Vector2f renderSize = new Vector2f(this.size.x() - paddingVert.x(), paddingHori.y()); + this.compositingH.setRectangleAsSource((int) renderSize.x(), (int) renderSize.y(), Color.GREEN); + this.compositingH.setPos(renderOrigin); + this.compositingH.print(renderSize); + this.compositingH.flush(); + /* this.shaperH.setShape(Vector2f.ZERO, new Vector2f(this.size.x() - paddingVert.x(), paddingHori.y()), new Vector2f(originScrollBar, paddingHori.bottom()), new Vector2f(lenScrollBar, 0)); + */ } } diff --git a/src/main/org/atriasoft/ewol/widget/Slider.java b/src/main/org/atriasoft/ewol/widget/Slider.java index f7de4c7..314cb43 100644 --- a/src/main/org/atriasoft/ewol/widget/Slider.java +++ b/src/main/org/atriasoft/ewol/widget/Slider.java @@ -9,11 +9,12 @@ import org.atriasoft.esignal.Signal; 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.etk.math.Vector3i; import org.atriasoft.ewol.Padding; import org.atriasoft.ewol.compositing.CompositingDrawing; -import org.atriasoft.ewol.compositing.GuiShape; +import org.atriasoft.ewol.compositing.CompositingSVG; import org.atriasoft.ewol.event.EventInput; import org.atriasoft.gale.key.KeyStatus; import org.slf4j.Logger; @@ -34,8 +35,7 @@ public class Slider extends Widget { private Uri propertyConfig = new Uri("THEME", "shape/Slider.json", "ewol"); private Float propertyValue = 0.0f; //!< string that must be displayed - private GuiShape shape = null; - private final GuiShape shapeTop = null; + protected CompositingSVG compositing = new CompositingSVG(); @AknotSignal @AknotName("value") @AknotDescription("Tick value change") @@ -43,8 +43,10 @@ public class Slider extends Widget { // element over: Vector3f overPositionStart = Vector3f.ZERO; Vector3f overPositionStop = Vector3f.ZERO; + Vector3f overPositionSize = Vector3f.ZERO; Vector3f overCursorPositionStart = Vector3f.ZERO; Vector3f overCursorPositionStop = Vector3f.ZERO; + Vector3f overCursorPositionSize = Vector3f.ZERO; //@AknotAutoGenerateProperty("minimum", "configuration of the widget") private Float propertyMinimum = 0.0f; @@ -72,10 +74,7 @@ public class Slider extends Widget { // call main class super.calculateMinMaxSize(); // get generic padding - Padding padding = Padding.ZERO; - if (this.shape != null) { - padding = this.shape.getPadding(); - } + final Padding padding = Padding.ZERO; final Vector3i minHeight = Vector3i.VALUE_16; Vector3f minimumSizeBase = new Vector3f(minHeight.x(), minHeight.y(), minHeight.z()); @@ -134,22 +133,16 @@ public class Slider extends Widget { } protected void onChangePropertyShaper() { - if (this.shape == null) { - this.shape = new GuiShape(this.propertyConfig); - } else { - this.shape.setSource(this.propertyConfig); - } + // if (this.shape == null) { + // this.shape = new GuiShape(this.propertyConfig); + // } else { + // this.shape.setSource(this.propertyConfig); + // } } @Override public void onDraw() { - if (this.shape != null) { - // draw background - this.shape.draw(true, 0); - // draw slider - this.shape.draw(true, 1); - } - + this.compositing.draw(); } @Override @@ -218,7 +211,7 @@ public class Slider extends Widget { //return; } //LOGGER.trace("Regenerate Display ==> is needed: '" + this.propertyValue + "'"); - this.shape.clear(); + this.compositing.clear(); //this.gc.clear(); /* if (this.colorIdTextFg >= 0) { @@ -228,7 +221,7 @@ public class Slider extends Widget { //this.text.setSelectionColor(this.shape.getColor(this.colorIdSelection)); } */ - final Padding padding = this.shape.getPadding(); + final Padding padding = Padding.ZERO;//this.shape.getPadding(); { // Manage external shape: Vector3f tmpSizeShaper = this.minSize; @@ -254,8 +247,9 @@ public class Slider extends Widget { tmpOriginInside = Vector3f.clipInt(tmpOriginInside); this.overPositionStart = tmpOriginShaper; + this.overPositionSize = tmpSizeShaper; this.overPositionStop = tmpOriginShaper.add(tmpSizeShaper); - this.shape.setShape(0, tmpOriginShaper, tmpSizeShaper, tmpOriginInside, tmpSizeInside); + //this.shape.setShape(0, tmpOriginShaper, tmpSizeShaper, tmpOriginInside, tmpSizeInside); } { // Manage cursor: @@ -283,11 +277,19 @@ public class Slider extends Widget { tmpOriginInside = Vector3f.clipInt(tmpOriginInside); this.overCursorPositionStart = tmpOriginShaper; + this.overCursorPositionSize = tmpSizeShaper; this.overCursorPositionStop = tmpOriginShaper.add(tmpSizeShaper); - this.shape.setShape(1, tmpOriginShaper, tmpSizeShaper, tmpOriginInside, tmpSizeInside); + //this.shape.setShape(1, tmpOriginShaper, tmpSizeShaper, tmpOriginInside, tmpSizeInside); } + this.compositing.setRectangleAsSource((int) this.overPositionSize.x(), (int) this.overPositionSize.y(), + Color.GREEN); + // TODO: Refaire le design de cet affichage... + this.compositing.setPos(this.overPositionStart); + this.compositing.print(new Vector2f(this.overPositionSize.x(), this.overPositionSize.y())); + this.compositing.flush(); + //this.gc.flush(); - this.shape.flush(); + this.compositing.flush(); } diff --git a/src/main/org/atriasoft/ewol/widget/WidgetScrolled.java b/src/main/org/atriasoft/ewol/widget/WidgetScrolled.java index 3963509..63c3f36 100644 --- a/src/main/org/atriasoft/ewol/widget/WidgetScrolled.java +++ b/src/main/org/atriasoft/ewol/widget/WidgetScrolled.java @@ -4,6 +4,7 @@ import org.atriasoft.aknot.annotation.AknotAttribute; import org.atriasoft.aknot.annotation.AknotDescription; import org.atriasoft.aknot.annotation.AknotManaged; import org.atriasoft.aknot.annotation.AknotName; +import org.atriasoft.etk.Color; import org.atriasoft.etk.Uri; import org.atriasoft.etk.math.FMath; import org.atriasoft.etk.math.Matrix4f; @@ -12,7 +13,7 @@ import org.atriasoft.etk.math.Vector3f; import org.atriasoft.ewol.DrawProperty; import org.atriasoft.ewol.HighSpeedMode; import org.atriasoft.ewol.Padding; -import org.atriasoft.ewol.compositing.GuiShape; +import org.atriasoft.ewol.compositing.CompositingSVG; import org.atriasoft.ewol.event.EventInput; import org.atriasoft.gale.backend3d.OpenGL; import org.atriasoft.gale.key.KeyStatus; @@ -35,8 +36,9 @@ class WidgetScrolled extends Widget { public static final int CALCULATE_SIMULTANEOUS_FINGER = 5; protected Uri propertyShapeVert = new Uri("THEME", "shape/WidgetScrolled.json", "ewol"); //!< Vertical shaper name protected Uri propertyShapeHori = new Uri("THEME", "shape/WidgetScrolled.json", "ewol"); //!< Horizontal shaper name - private GuiShape shaperH = null; //!< Compositing theme Horizontal. - private GuiShape shaperV = null; //!< Compositing theme Vertical. + + protected CompositingSVG compositingH = new CompositingSVG(); + protected CompositingSVG compositingV = new CompositingSVG(); protected Vector2f originScrooled = Vector2f.ZERO; //!< pixel distance from the origin of the display (Bottum left) protected Vector2f maxSize; //!< Maximum size of the Widget ==> to display scrollbar protected Vector2f limitScrolling = Vector2f.ZERO; //!< Mimit scrolling represent the propertion of the minimel scrolling activate (0.2 ==> 20% migt all time be visible) @@ -88,27 +90,27 @@ class WidgetScrolled extends Widget { } protected void onChangePropertyShapeHori() { - if (this.shaperH == null) { - this.shaperH = new GuiShape(this.propertyShapeHori); - } else { - this.shaperH.setSource(this.propertyShapeHori); - } + // if (this.shaperH == null) { + // this.shaperH = new GuiShape(this.propertyShapeHori); + // } else { + // this.shaperH.setSource(this.propertyShapeHori); + // } markToRedraw(); } protected void onChangePropertyShapeVert() { - if (this.shaperV == null) { - this.shaperV = new GuiShape(this.propertyShapeVert); - } else { - this.shaperV.setSource(this.propertyShapeVert); - } + // if (this.shaperV == null) { + // this.shaperV = new GuiShape(this.propertyShapeVert); + // } else { + // this.shaperV.setSource(this.propertyShapeVert); + // } markToRedraw(); } @Override protected void onDraw() { - this.shaperH.draw(); - this.shaperV.draw(); + this.compositingH.draw(); + this.compositingV.draw(); } @Override @@ -117,8 +119,8 @@ class WidgetScrolled extends Widget { Vector3f relativePos = relativePosition(new Vector3f(event.pos().x(), event.pos().y(), 0.0f)); // Correction due to the open Gl insertion ... relativePos = relativePos.withY(this.size.y() - relativePos.y()); - final Padding paddingV = this.shaperV.getPadding(); - final Padding paddingH = this.shaperH.getPadding(); + final Padding paddingV = new Padding(2, 2, 2, 2);// this.shaperV.getPadding(); + final Padding paddingH = new Padding(2, 2, 2, 2);// this.shaperH.getPadding(); if (this.scroollingMode == ScrollingMode.scroolModeNormal) { if (event.type() == KeyType.mouse && (this.highSpeedType == KeyType.unknow || this.highSpeedType == KeyType.mouse)) { @@ -443,14 +445,14 @@ class WidgetScrolled extends Widget { @Override public void onRegenerateDisplay() { - this.shaperH.clear(); - this.shaperV.clear(); + this.compositingH.clear(); + this.compositingV.clear(); if (this.scroollingMode == ScrollingMode.scroolModeGame) { // nothing to do ... return; } - final Padding paddingVert = this.shaperV.getPadding(); - final Padding paddingHori = this.shaperH.getPadding(); + final Padding paddingVert = new Padding(2, 2, 2, 2); // this.compositingV.getPadding(); + final Padding paddingHori = new Padding(2, 2, 2, 2); // this.compositingH.getPadding(); if (this.size.y() < this.maxSize.y() || this.originScrooled.y() != 0) { float lenScrollBar = this.size.y() * this.size.y() / this.maxSize.y(); lenScrollBar = FMath.avg(10.0f, lenScrollBar, this.size.y()); @@ -458,10 +460,18 @@ class WidgetScrolled extends Widget { / (this.maxSize.y() - this.size.y() * this.limitScrolling.y()); originScrollBar = FMath.avg(0.0f, originScrollBar, 1.0f); originScrollBar *= (this.size.y() - lenScrollBar); - this.shaperV.setShape(new Vector2f(this.size.x() - paddingVert.x(), 0), - new Vector2f(paddingVert.x(), this.size.y()), - new Vector2f(this.size.x() - paddingVert.right(), this.size.y() - originScrollBar - lenScrollBar), - new Vector2f(0, lenScrollBar)); + + final Vector2f renderOrigin = new Vector2f(this.size.x() - paddingVert.x(), 0); + final Vector2f renderSize = new Vector2f(paddingVert.x(), this.size.y()); + this.compositingV.setRectangleAsSource((int) renderSize.x(), (int) renderSize.y(), Color.GREEN); + this.compositingV.setPos(renderOrigin); + this.compositingV.print(renderSize); + this.compositingV.flush(); + + // this.shaperV.setShape(new Vector2f(this.size.x() - paddingVert.x(), 0), + // new Vector2f(paddingVert.x(), this.size.y()), + // new Vector2f(this.size.x() - paddingVert.right(), this.size.y() - originScrollBar - lenScrollBar), + // new Vector2f(0, lenScrollBar)); } if (this.size.x() < this.maxSize.x() || this.originScrooled.x() != 0) { float lenScrollBar = (this.size.x() - paddingHori.left()) * (this.size.x() - paddingVert.x()) @@ -471,8 +481,16 @@ class WidgetScrolled extends Widget { / (this.maxSize.x() - this.size.x() * this.limitScrolling.x()); originScrollBar = FMath.avg(0.0f, originScrollBar, 1.0f); originScrollBar *= (this.size.x() - paddingHori.right() - lenScrollBar); - this.shaperH.setShape(new Vector2f(0, 0), new Vector2f(this.size.x() - paddingVert.x(), paddingHori.y()), - new Vector2f(originScrollBar, paddingHori.bottom()), new Vector2f(lenScrollBar, 0)); + + final Vector2f renderOrigin = Vector2f.ZERO; + final Vector2f renderSize = new Vector2f(this.size.x() - paddingVert.x(), paddingHori.y()); + this.compositingH.setRectangleAsSource((int) renderSize.x(), (int) renderSize.y(), Color.GREEN); + this.compositingH.setPos(renderOrigin); + this.compositingH.print(renderSize); + this.compositingH.flush(); + + // this.shaperH.setShape(new Vector2f(0, 0), new Vector2f(this.size.x() - paddingVert.x(), paddingHori.y()), + // new Vector2f(originScrollBar, paddingHori.bottom()), new Vector2f(lenScrollBar, 0)); } }