diff --git a/Sources/libetk/etk/os/FSNode.cpp b/Sources/libetk/etk/os/FSNode.cpp index 416e8a33..d7481963 100644 --- a/Sources/libetk/etk/os/FSNode.cpp +++ b/Sources/libetk/etk/os/FSNode.cpp @@ -29,6 +29,7 @@ #include #include #include +#include extern "C" { // file browsing ... @@ -569,10 +570,12 @@ void etk::FSNode::GenerateFileSystemPath(void) basicName = m_userFileName.Extract(firstPos+1); } TK_DBG_MODE(" THEME party : \"" << themeName << "\" => \"" << basicName << "\""); + themeName = etk::theme::GetName(themeName); + TK_DBG_MODE(" ==> theme Folder \"" << themeName << "\""); // search the corect folder : if (themeName == "") { TK_WARNING("no theme name detected : set it to \"default\""); - } else { + } else if (themeName != "default") { // Selected theme : // check in the user data : m_systemFileName = baseFolderDataUser + "theme/" + themeName + "/" + basicName; @@ -1245,3 +1248,63 @@ bool etk::FSNode::FileSeek(long int offset, int origin) } } + + +// TODO : Add an INIT to reset all allocated parameter : + +class tmpThemeElement +{ + public: + etk::UString refName; + etk::UString folderName; +}; + +static etk::Vector g_listTheme; + +// set the Folder of a subset of a theme ... +void etk::theme::SetName(etk::UString refName, etk::UString folderName) +{ + for(int32_t iii=0; iiirefName==refName) { + g_listTheme[iii]->folderName = folderName; + // action done + return; + } + } + } + // we did not find it ... + tmpThemeElement* tmpp = new tmpThemeElement(); + if (NULL==tmpp) { + TK_ERROR("pb to add a reference theme"); + return; + } + tmpp->refName = refName; + tmpp->folderName = folderName; + g_listTheme.PushBack(tmpp); +} + +// get the folder from a Reference theme +etk::UString etk::theme::GetName(etk::UString refName) +{ + for(int32_t iii=0; iiirefName==refName) { + return g_listTheme[iii]->folderName; + } + } + } + // We did not find the theme + return refName; +} + +// get the list of all the theme folder availlable in the user Home/appl +etk::Vector etk::theme::List(void) +{ + etk::Vector tmpp; + return tmpp; + // TODO : +} + + + diff --git a/Sources/libetk/etk/os/FSNode.h b/Sources/libetk/etk/os/FSNode.h index 1c2e0d30..3bcd1070 100644 --- a/Sources/libetk/etk/os/FSNode.h +++ b/Sources/libetk/etk/os/FSNode.h @@ -228,7 +228,16 @@ namespace etk void InitDefaultFolder(const char * applName); etk::UString GetUserHomeFolder(void); - + namespace theme + { + // TODO : Add an INIT ... + // set the Folder of a subset of a theme ... + void SetName(etk::UString refName, etk::UString folderName); + // get the folder from a Reference theme + etk::UString GetName(etk::UString refName); + // get the list of all the theme folder availlable in the user Home/appl + etk::Vector List(void); + }; }; #endif diff --git a/Sources/libewol/ewol/ResourceManager.cpp b/Sources/libewol/ewol/ResourceManager.cpp index c79d865a..931f8669 100644 --- a/Sources/libewol/ewol/ResourceManager.cpp +++ b/Sources/libewol/ewol/ResourceManager.cpp @@ -374,6 +374,24 @@ bool ewol::resource::Keep(etk::UString& accesMode, ewol::VirtualBufferObject*& o return true; } +bool ewol::resource::Keep(etk::UString& filename, ewol::SimpleConfigFile*& object) +{ + EWOL_INFO("KEEP : SimpleConfig : file : \"" << filename << "\""); + object = static_cast(LocalKeep(filename)); + if (NULL != object) { + return true; + } + // this element create a new one every time .... + object = new ewol::SimpleConfigFile(filename); + if (NULL == object) { + EWOL_ERROR("allocation error of a resource : ??Mesh.obj??"); + return false; + } + LocalAdd(object); + return true; +} + + void ewol::resource::Release(ewol::Resource*& object) { @@ -464,3 +482,10 @@ void ewol::resource::Release(ewol::MeshObj*& object) Release(object2); object = NULL; } + +void ewol::resource::Release(ewol::SimpleConfigFile*& object) +{ + ewol::Resource* object2 = static_cast(object); + Release(object2); + object = NULL; +} diff --git a/Sources/libewol/ewol/ResourceManager.h b/Sources/libewol/ewol/ResourceManager.h index 1045ba82..c6323dbe 100644 --- a/Sources/libewol/ewol/ResourceManager.h +++ b/Sources/libewol/ewol/ResourceManager.h @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -65,6 +66,7 @@ namespace ewol bool Keep(etk::UString& filename, ewol::TextureFile*& object, etk::Vector2D size); bool Keep(etk::UString& accesMode, ewol::VirtualBufferObject*& object); bool Keep(etk::UString& filename, ewol::MeshObj*& object); + bool Keep(etk::UString& filename, ewol::SimpleConfigFile*& object); void Release(ewol::Resource*& object); void Release(ewol::TexturedFont*& object); @@ -78,6 +80,7 @@ namespace ewol void Release(ewol::TextureFile*& object); void Release(ewol::VirtualBufferObject*& object); void Release(ewol::MeshObj*& object); + void Release(ewol::SimpleConfigFile*& object); } }; diff --git a/Sources/libewol/ewol/SimpleConfigFile.cpp b/Sources/libewol/ewol/SimpleConfigFile.cpp new file mode 100644 index 00000000..7a6ada1c --- /dev/null +++ b/Sources/libewol/ewol/SimpleConfigFile.cpp @@ -0,0 +1,166 @@ +/** + ******************************************************************************* + * @file ewol/impleConfigFile.cpp + * @brief ewol basic file configuration system (Sources) + * @author Edouard DUPIN + * @date 06/11/2012 + * @par Project + * ewol + * + * @par Copyright + * Copyright 2011 Edouard DUPIN, all right reserved + * + * This software is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY. + * + * Licence summary : + * You can modify and redistribute the sources code and binaries. + * You can send me the bug-fix + * + * Term of the licence in in the file licence.txt. + * + ******************************************************************************* + */ + +#include +#include +#include +#include + + +void ewol::SimpleConfigElement::Parse(etk::UString value) +{ + char* tmp = value.c_str(); + m_valueInt = 0; + m_valuefloat = 0; + sscanf(tmp, "%d", &m_valueInt); + sscanf(tmp, "%f", &m_valuefloat); +} + + + +ewol::SimpleConfigFile::SimpleConfigFile(etk::UString& filename): + ewol::Resource(filename) +{ + EWOL_DEBUG("SFP : load \"" << filename << "\""); + Reload(); +} + + +ewol::SimpleConfigFile::~SimpleConfigFile(void) +{ + // remove all element + for (int32_t iii=0; iiiParse(""); + } + } + // acess of the file : + etk::FSNode file(m_name); + + if (false == file.Exist()) { + EWOL_ERROR("File does not Exist : \"" << file << "\""); + return; + } + etk::UString fileExtention = file.FileGetExtention(); + if (fileExtention != "conf") { + EWOL_ERROR("File does not have extention \".prog\" for program but : \"" << fileExtention << "\""); + return; + } + if (false == file.FileOpenRead()) { + EWOL_ERROR("Can not open the file : " << file); + return; + } + #define MAX_LINE_SIZE (2048) + char tmpData[MAX_LINE_SIZE]; + while (file.FileGets(tmpData, MAX_LINE_SIZE) != NULL) { + int32_t len = strlen(tmpData); + if( tmpData[len-1] == '\n' + || tmpData[len-1] == '\r') { + tmpData[len-1] = '\0'; + len--; + } + //EWOL_DEBUG(" Read data : \"" << tmpData << "\""); + if (len == 0) { + continue; + } + etk::UString tmpData2(tmpData); + etk::UString tmppp("#"); + if (true == tmpData2.StartWith(tmppp)) { + // comment ... + continue; + } + tmppp="//"; + if (true == tmpData2.StartWith(tmppp)) { + // comment ... + continue; + } + // get parameters : + int32_t pos = tmpData2.FindForward('='); + if (pos == -1){ + //the element "=" is not find ... + continue; + } + etk::UString paramName = tmpData2.Extract(0, pos); + etk::UString paramValue = tmpData2.Extract(pos+1, 0x7FFFF); + EWOL_DEBUG(" param name=\"" << paramName << "\" val=\"" << paramValue << "\""); + // check if the parameters existed : + bool findParam = false; + for (int32_t iii=0; iiim_paramName == paramName) { + m_list[iii]->Parse(paramValue); + findParam = true; + // stop parsing ... + break; + } + } + } + if (false == findParam) { + ewol::SimpleConfigElement* tmpElement = new ewol::SimpleConfigElement(paramName); + if (NULL == tmpElement) { + EWOL_DEBUG("error while allocation"); + } else { + tmpElement->Parse(paramValue); + m_list.PushBack(tmpElement); + } + } + } + // close the file: + file.FileClose(); + +} + + +int32_t ewol::SimpleConfigFile::Request(etk::UString paramName) +{ + // check if the parameters existed : + for (int32_t iii=0; iiim_paramName == paramName) { + return iii; + } + } + } + ewol::SimpleConfigElement* tmpElement = new ewol::SimpleConfigElement(paramName); + if (NULL == tmpElement) { + EWOL_DEBUG("error while allocation"); + } else { + m_list.PushBack(tmpElement); + } + return m_list.Size()-1; +} + diff --git a/Sources/libewol/ewol/SimpleConfigFile.h b/Sources/libewol/ewol/SimpleConfigFile.h new file mode 100644 index 00000000..be25b962 --- /dev/null +++ b/Sources/libewol/ewol/SimpleConfigFile.h @@ -0,0 +1,72 @@ +/** + ******************************************************************************* + * @file ewol/impleConfigFile.h + * @brief ewol basic file configuration system (header) + * @author Edouard DUPIN + * @date 06/11/2012 + * @par Project + * ewol + * + * @par Copyright + * Copyright 2011 Edouard DUPIN, all right reserved + * + * This software is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY. + * + * Licence summary : + * You can modify and redistribute the sources code and binaries. + * You can send me the bug-fix + * + * Term of the licence in in the file licence.txt. + * + ******************************************************************************* + */ + +#ifndef __SIMPLE_CONFIG_FILE_H__ +#define __SIMPLE_CONFIG_FILE_H__ + #include + #include + #include + + namespace ewol + { + class SimpleConfigElement + { + public: + etk::UString m_paramName; + private: + etk::UString m_value; + int32_t m_valueInt; + float m_valuefloat; + public: + SimpleConfigElement(etk::UString name) : + m_paramName(name), + m_value(""), + m_valueInt(0), + m_valuefloat(0.0) { }; + ~SimpleConfigElement(void) { }; + void Parse(etk::UString value); + int32_t GetInteger(void) { return m_valueInt; }; + float GetFloat(void) { return m_valuefloat; }; + etk::UString& GetString(void) { return m_value; }; + }; + + class SimpleConfigFile : public ewol::Resource + { + private: + etk::Vector m_list; + public: + SimpleConfigFile(etk::UString& filename); + virtual ~SimpleConfigFile(void); + const char* GetType(void) { return "ewol::SimpleConfigFile"; }; + void Reload(void); + + int32_t Request(etk::UString paramName); + + int32_t GetInteger(int32_t id) { return m_list[id]->GetInteger(); }; + float GetFloat(int32_t id) { return m_list[id]->GetFloat(); }; + etk::UString& GetString(int32_t id) { return m_list[id]->GetString(); }; + }; + }; +#endif + diff --git a/Sources/libewol/ewol/widget/Button.cpp b/Sources/libewol/ewol/widget/Button.cpp index 44b8a136..79757590 100644 --- a/Sources/libewol/ewol/widget/Button.cpp +++ b/Sources/libewol/ewol/widget/Button.cpp @@ -60,7 +60,7 @@ void ewol::Button::Init(void) AddEventId(ewolEventButtonLeave); m_hasAnImage = false; m_alignement = ewol::TEXT_ALIGN_CENTER; - + /* #ifdef __TARGET_OS__Android m_padding.y = 12; m_padding.x = 12; @@ -68,24 +68,31 @@ void ewol::Button::Init(void) m_padding.y = 4; m_padding.x = 4; #endif - + */ m_textColorFg = draw::color::black; - m_textColorBg = draw::color::black; - m_textColorBg.a = 0x3F; SetCanHaveFocus(true); #ifdef __VIDEO__OPENGL_ES_2 - etk::UString tmpString("THEME:rounded:widgetButton.prog"); + etk::UString tmpString("THEME:GUI:widgetButton.conf"); + if (true == ewol::resource::Keep(tmpString, m_config) ) { + m_confIdPaddingX = m_config->Request("PaddingX"); + m_confIdPaddingY = m_config->Request("PaddingY"); + m_confIdChangeTime = m_config->Request("ChangeTime"); + } + tmpString ="THEME:GUI:widgetButton.prog"; // get the shader resource : m_GLPosition = 0; if (true == ewol::resource::Keep(tmpString, m_GLprogram) ) { - m_GLPosition = m_GLprogram->GetAttribute("EW_coord2d"); - m_GLMatrix = m_GLprogram->GetUniform("EW_MatrixTransformation"); - m_GLsizeBorder = m_GLprogram->GetUniform("EW_sizeBorder"); - m_GLsizePadding = m_GLprogram->GetUniform("EW_sizePadding"); - m_GLsize = m_GLprogram->GetUniform("EW_size"); - m_GLposText = m_GLprogram->GetUniform("EW_posText"); - m_GLstate = m_GLprogram->GetUniform("EW_state"); + m_GLPosition = m_GLprogram->GetAttribute("EW_coord2d"); + m_GLMatrix = m_GLprogram->GetUniform("EW_MatrixTransformation"); + // Widget property ==> for the Vertex shader + m_GLwidgetProperty.m_size = m_GLprogram->GetUniform("EW_widgetProperty.size"); + m_GLwidgetProperty.m_insidePos = m_GLprogram->GetUniform("EW_widgetProperty.insidePos"); + m_GLwidgetProperty.m_insideSize = m_GLprogram->GetUniform("EW_widgetProperty.insideSize"); + // status property ==> for the fragment shader + m_GLstatus.m_stateOld = m_GLprogram->GetUniform("EW_status.stateOld"); + m_GLstatus.m_stateNew = m_GLprogram->GetUniform("EW_status.stateNew"); + m_GLstatus.m_transition = m_GLprogram->GetUniform("EW_status.transition"); } #endif } @@ -119,22 +126,19 @@ void ewol::Button::SetImage(etk::UString imageName) MarkToRedraw(); } - -void ewol::Button::SetPadding(etk::Vector2D newPadding) -{ - m_padding = newPadding; -} - bool ewol::Button::CalculateMinSize(void) { + etk::Vector2D padding; + padding.x = m_config->GetInteger(m_confIdPaddingX); + padding.y = m_config->GetInteger(m_confIdPaddingY); etk::Vector2D minSize = m_oObjectText.GetSize(m_label); - m_minSize.x = m_padding.x*2 + minSize.x; - m_minSize.y = m_padding.y*2 + minSize.y; + m_minSize.x = padding.x*2 + minSize.x; + m_minSize.y = padding.y*2 + minSize.y; // Add the image element ... if (true == m_hasAnImage) { //m_minSize.x += -m_padding.x + m_padding.y*2 + minHeight; //m_minSize.y += m_padding.y*2; - m_minSize.x += m_padding.x + minSize.y; + m_minSize.x += padding.x + minSize.y; } MarkToRedraw(); @@ -200,29 +204,32 @@ bool ewol::Button::GetValue(void) void ewol::Button::OnDraw(DrawProperty& displayProp) { - #ifdef __VIDEO__OPENGL_ES_2 - if (m_GLprogram==NULL) { - EWOL_ERROR("No shader ..."); - return; - } - //glScalef(m_scaling.x, m_scaling.y, 1.0); - m_GLprogram->Use(); - // set Matrix : translation/positionMatrix - etk::Matrix4 tmpMatrix = ewol::openGL::GetMatrix(); - m_GLprogram->UniformMatrix4fv(m_GLMatrix, 1, tmpMatrix.m_mat); - // position : - m_GLprogram->SendAttribute(m_GLPosition, 2/*x,y*/, &m_coord[0]); - // all entry parameters : - m_GLprogram->Uniform1f(m_GLsizeBorder, 3); - m_GLprogram->Uniform1f(m_GLsizePadding, m_padding.x); - m_GLprogram->Uniform2fv(m_GLsize, 1, &m_size.x); - m_GLprogram->Uniform4fv(m_GLposText, 1, m_pos); - m_GLprogram->Uniform1i(m_GLstate, 0); - // Request the draw of the elements : - glDrawArrays(GL_TRIANGLES, 0, m_coord.Size()); - m_GLprogram->UnUse(); - #endif - m_oObjectDecoration.Draw(); + if (m_GLprogram==NULL) { + EWOL_ERROR("No shader ..."); + return; + } + //glScalef(m_scaling.x, m_scaling.y, 1.0); + m_GLprogram->Use(); + // set Matrix : translation/positionMatrix + etk::Matrix4 tmpMatrix = ewol::openGL::GetMatrix(); + m_GLprogram->UniformMatrix4fv(m_GLMatrix, 1, tmpMatrix.m_mat); + // position : + // Note : Must be all the time a [-1..1] square ... + // TODO : plop ... + m_GLprogram->SendAttribute(m_GLPosition, 2/*x,y*/, &m_coord[0]); + // all entry parameters : + m_GLprogram->Uniform2fv(m_GLwidgetProperty.m_size, 1, &m_size.x); + m_GLprogram->Uniform2fv(m_GLwidgetProperty.m_insidePos, 1, &m_widgetProperty.m_insidePos.x); + m_GLprogram->Uniform2fv(m_GLwidgetProperty.m_insideSize, 1, &m_widgetProperty.m_insideSize.x); + m_GLprogram->Uniform1i(m_GLstatus.m_stateOld, m_status.m_stateOld); + m_GLprogram->Uniform1i(m_GLstatus.m_stateNew, m_status.m_stateNew); + m_GLprogram->Uniform1f(m_GLstatus.m_transition, m_status.m_transition); + + // Request the draw of the elements : + glDrawArrays(GL_TRIANGLES, 0, m_coord.Size()); + m_GLprogram->UnUse(); + + if (NULL != m_oObjectImage) { m_oObjectImage->Draw(); } @@ -232,7 +239,11 @@ void ewol::Button::OnDraw(DrawProperty& displayProp) void ewol::Button::OnRegenerateDisplay(void) { if (true == NeedRedraw()) { - m_oObjectDecoration.Clear(); + + etk::Vector2D padding; + padding.x = m_config->GetInteger(m_confIdPaddingX); + padding.y = m_config->GetInteger(m_confIdPaddingY); + m_oObjectText.Clear(); if (NULL != m_oObjectImage) { m_oObjectImage->Clear(); @@ -242,24 +253,24 @@ void ewol::Button::OnRegenerateDisplay(void) int32_t tmpOriginX = (m_size.x - m_minSize.x) / 2; int32_t tmpOriginY = (m_size.y - m_minSize.y) / 2; // no change for the text orogin : - int32_t tmpTextOriginX = (m_size.x - m_minSize.x) / 2 + m_padding.x; - int32_t tmpTextOriginY = (m_size.y - m_minSize.y) / 2 + m_padding.y; + int32_t tmpTextOriginX = (m_size.x - m_minSize.x) / 2 + padding.x; + int32_t tmpTextOriginY = (m_size.y - m_minSize.y) / 2 + padding.y; if (true==m_userFill.x) { tmpSizeX = m_size.x; tmpOriginX = 0; if (m_alignement == ewol::TEXT_ALIGN_LEFT) { - tmpTextOriginX = m_padding.x; + tmpTextOriginX = padding.x; } } if (true==m_userFill.y) { tmpSizeY = m_size.y; tmpOriginY = 0; } - tmpOriginX += m_padding.x; - tmpOriginY += m_padding.y; - tmpSizeX -= 2*m_padding.x; - tmpSizeY -= 2*m_padding.y; + tmpOriginX += padding.x; + tmpOriginY += padding.y; + tmpSizeX -= 2*padding.x; + tmpSizeY -= 2*padding.y; etk::Vector2D textPos(tmpTextOriginX, tmpTextOriginY); @@ -274,23 +285,20 @@ void ewol::Button::OnRegenerateDisplay(void) } */ clipping_ts drawClipping; - drawClipping.x = m_padding.x; - drawClipping.y = m_padding.y; - drawClipping.w = m_size.x - 2*m_padding.x; - drawClipping.h = m_size.y - 2*m_padding.y; + drawClipping.x = padding.x; + drawClipping.y = padding.y; + drawClipping.w = m_size.x - 2*padding.x; + drawClipping.h = m_size.y - 2*padding.y; //EWOL_DEBUG("draw tex at pos : " < m_insidePos; + etk::Vector2D m_insideSize; + }; + + class GLWidgetPosProperty + { + public: + int32_t m_size; + int32_t m_insidePos; + int32_t m_insideSize; + }; + // DATA + class WidgetStateProperty + { + public: + int32_t m_stateOld; + int32_t m_stateNew; + float m_transition; + }; + // ID of the UNIFORM element + class GLWidgetStateProperty + { + public: + int32_t m_stateOld; + int32_t m_stateNew; + int32_t m_transition; + }; +}; + + + namespace ewol { typedef enum { TEXT_ALIGN_LEFT, @@ -45,31 +81,34 @@ namespace ewol { { private: #ifdef __VIDEO__OPENGL_ES_2 - ewol::Program* m_GLprogram; - int32_t m_GLPosition; - int32_t m_GLMatrix; - int32_t m_GLsizeBorder; - int32_t m_GLsizePadding; - int32_t m_GLsize; - float m_pos[4]; - int32_t m_GLposText; - int32_t m_GLstate; - etk::Vector > m_coord; //!< internal coord of the object - draw::Colorf m_color[3]; + // External theme config: + ewol::SimpleConfigFile* m_config; + int32_t m_confIdPaddingX; + int32_t m_confIdPaddingY; + int32_t m_confIdChangeTime; + // OpenGL shaders programs: + ewol::Program* m_GLprogram; + int32_t m_GLPosition; + int32_t m_GLMatrix; + // widget property + ewol::GLWidgetPosProperty m_GLwidgetProperty; // id of the uniform + ewol::WidgetPosProperty m_widgetProperty; // structure of this uniform + // state property + ewol::GLWidgetStateProperty m_GLstatus; + ewol::WidgetStateProperty m_status; + + etk::Vector > m_coord; //!< internal coord of the object void SetPoint(float x, float y); void Rectangle(float x, float y, float w, float h); #endif private: ewol::OObject2DTextColored m_oObjectText; - ewol::OObject2DColored m_oObjectDecoration; ewol::OObject2DTextured* m_oObjectImage; bool m_hasAnImage; etk::UString m_imageSelected; textAlignement_te m_alignement; - etk::Vector2D m_padding; etk::UString m_label; draw::Color m_textColorFg; //!< Text color - draw::Color m_textColorBg; //!< Background color public: Button(void); Button(etk::UString newLabel); @@ -89,8 +128,6 @@ namespace ewol { void SetValue(bool val); bool GetValue(void); void SetAlignement(textAlignement_te typeAlign); - void SetPadding(etk::Vector2D newPadding); - void SetColorBg(draw::Color newColor) { m_textColorBg = newColor; }; void SetColorFg(draw::Color newColor) { m_textColorFg = newColor; }; public: virtual void OnRegenerateDisplay(void); diff --git a/Sources/libewol/ewol/widget/Entry.cpp b/Sources/libewol/ewol/widget/Entry.cpp index b701d61a..12e16916 100644 --- a/Sources/libewol/ewol/widget/Entry.cpp +++ b/Sources/libewol/ewol/widget/Entry.cpp @@ -69,7 +69,7 @@ void ewol::Entry::Init(void) ShortCutAdd("ctrl+a", ewolEventEntrySelect, "ALL"); ShortCutAdd("ctrl+shift+a", ewolEventEntrySelect, "NONE"); #ifdef __VIDEO__OPENGL_ES_2 - etk::UString tmpString("THEME:rounded:widgetEntry.prog"); + etk::UString tmpString("THEME:GUI:widgetEntry.prog"); // get the shader resource : m_GLPosition = 0; if (true == ewol::resource::Keep(tmpString, m_GLprogram) ) { diff --git a/Sources/libewol/file.mk b/Sources/libewol/file.mk index bcb9c488..6fdb56bb 100644 --- a/Sources/libewol/file.mk +++ b/Sources/libewol/file.mk @@ -4,7 +4,8 @@ FILE_LIST = ewol/ewol.cpp \ ewol/ClipBoard.cpp \ ewol/Debug.cpp \ ewol/ShortCutManager.cpp \ - ewol/ResourceManager.cpp + ewol/ResourceManager.cpp \ + ewol/SimpleConfigFile.cpp FILE_LIST+= ewol/openGL/openGL.cpp \ ewol/openGL/Shader.cpp \ @@ -110,7 +111,13 @@ LOCAL_COPY_FILES := ../../share/textured3D.prog:textured3D.prog \ ../../share/theme/rounded/widgetEntry.frag:theme/rounded/widgetEntry.frag \ ../../share/theme/rounded/widgetEntry.vert:theme/rounded/widgetEntry.vert \ \ + ../../share/theme/default/widgetButton.conf:theme/default/widgetButton.conf \ ../../share/theme/default/widgetButton.prog:theme/default/widgetButton.prog \ ../../share/theme/default/widgetButton.frag:theme/default/widgetButton.frag \ - ../../share/theme/default/widgetButton.vert:theme/default/widgetButton.vert + ../../share/theme/default/widgetButton.vert:theme/default/widgetButton.vert \ + \ + ../../share/theme/rounded/widgetButton.conf:theme/rounded/widgetButton.conf \ + ../../share/theme/rounded/widgetButton.prog:theme/rounded/widgetButton.prog \ + ../../share/theme/rounded/widgetButton.frag:theme/rounded/widgetButton.frag \ + ../../share/theme/rounded/widgetButton.vert:theme/rounded/widgetButton.vert diff --git a/share/theme/default/widgetButton.conf b/share/theme/default/widgetButton.conf new file mode 100644 index 00000000..cf2df998 --- /dev/null +++ b/share/theme/default/widgetButton.conf @@ -0,0 +1,11 @@ +# padding for the GUI +PaddingX=11 +PaddingY=11 +# change status in ms +ChangeTime=356 + + + + + + diff --git a/share/theme/default/widgetButton.frag b/share/theme/default/widgetButton.frag index 19ccd797..680c40cc 100644 --- a/share/theme/default/widgetButton.frag +++ b/share/theme/default/widgetButton.frag @@ -3,37 +3,38 @@ precision mediump float; precision mediump int; #endif -uniform float EW_sizeBorder; -uniform float EW_sizePadding; -uniform vec2 EW_size; -uniform vec4 EW_posText; -uniform int EW_state; -/* struct displayProperty { - vec4 colorBackGround; - vec4 colorForeGround; - vec4 colorBorder; - float sizeBorder; - vec2 sizePaddingOut; - vec2 sizePaddingIn; - + vec2 size; + vec2 insidePos; + vec2 insideSize; }; -uniform displayProperty EW_buttonProperty; -*/ + +struct widgetStateProperty { + int stateOld; + int stateNew; + float transition; +}; + +uniform displayProperty EW_widgetProperty; + +uniform widgetStateProperty EW_status; + // transmit from the vertex shader varying vec2 v_position; // interpolated position ... + // internal static define vec4 S_colorBg = vec4(0.0); vec4 S_colorFg = vec4(0.5,0.5,0.5,0.8); vec4 S_colorBorder = vec4(0.0,0.0,0.0,1.0); - +float S_sizePadding = 5.0; +float S_sizeBorder = 1.0; void main(void) { - float specialBorder = EW_sizeBorder+EW_sizePadding; - vec2 endStart = EW_size - vec2(EW_sizePadding) - vec2(EW_sizeBorder); - vec2 endStop = EW_size - vec2(EW_sizePadding); - if( v_position.x> EW_sizePadding - && v_position.y> EW_sizePadding + float specialBorder = S_sizeBorder+S_sizePadding; + vec2 endStart = EW_widgetProperty.size - vec2(S_sizePadding) - vec2(S_sizeBorder); + vec2 endStop = EW_widgetProperty.size - vec2(S_sizePadding); + if( v_position.x> S_sizePadding + && v_position.y> S_sizePadding && v_position.x<= endStop.x && v_position.y<= endStop.y ) { diff --git a/share/theme/rounded/widgetButton.conf b/share/theme/rounded/widgetButton.conf new file mode 100644 index 00000000..3db723d3 --- /dev/null +++ b/share/theme/rounded/widgetButton.conf @@ -0,0 +1,11 @@ +# padding for the GUI +PaddingX=14 +PaddingY=14 +# change status in ms +ChangeTime=356 + + + + + + diff --git a/share/theme/rounded/widgetButton.frag b/share/theme/rounded/widgetButton.frag new file mode 100644 index 00000000..79d64302 --- /dev/null +++ b/share/theme/rounded/widgetButton.frag @@ -0,0 +1,64 @@ +#ifdef GL_ES +precision mediump float; +precision mediump int; +#endif + +struct displayProperty { + vec2 size; + vec2 insidePos; + vec2 insideSize; +}; + +struct widgetStateProperty { + int stateOld; + int stateNew; + float transition; +}; + +uniform displayProperty EW_widgetProperty; + +uniform widgetStateProperty EW_status; + +// transmit from the vertex shader +varying vec2 v_position; // interpolated position ... + +// internal static define +float S_roundedRatio = 10.0; +vec4 S_colorBg = vec4(0.0); +vec4 S_colorFg = vec4(0.5,0.5,0.5,0.3); +vec4 S_colorBorder = vec4(0.0,0.0,0.0,1.0); +float S_sizePadding = 3.0; // must not be NULL +float S_sizeBorder = 1.0; + + +void main(void) { + // position form center : + vec2 ratio = EW_widgetProperty.size / 2.0; + vec2 positionCenter = v_position-ratio; + if(positionCenter.x<0.0) { + positionCenter.x = -1.0*positionCenter.x; + } + if(positionCenter.y<0.0) { + positionCenter.y = -1.0*positionCenter.y; + } + vec2 ratioHight = ratio - S_sizePadding; + vec2 ratioLow = ratioHight - (S_sizeBorder+S_roundedRatio); + vec2 circleMode = smoothstep(ratioLow, ratioHight, positionCenter); + float tmpDist = sqrt(circleMode.x*circleMode.x + circleMode.y*circleMode.y); + + //float distanceInternal = (S_roundedRatio-S_sizeBorder/2.0)/(S_roundedRatio-S_sizeBorder); + //float distanceExternal = (S_roundedRatio+S_sizeBorder/2.0)/(S_roundedRatio-S_sizeBorder);; + if(tmpDist <= 0.6 ) { + gl_FragColor = S_colorFg; + } else if(tmpDist <= 0.9) { + float tmpVal = smoothstep(0.7, 0.9, tmpDist); + if (tmpVal<=0.5) { + gl_FragColor = S_colorBorder*(tmpVal*2.0) + S_colorFg*(1.0-tmpVal*2.0); + } else { + gl_FragColor = S_colorBorder*(1.0-(tmpVal-0.5)*2.0) + S_colorBg*((tmpVal-0.5)*2.0); + } + } else { + gl_FragColor = S_colorBg; + } +} + diff --git a/share/theme/rounded/widgetButton.prog b/share/theme/rounded/widgetButton.prog new file mode 100644 index 00000000..a6c7b7f8 --- /dev/null +++ b/share/theme/rounded/widgetButton.prog @@ -0,0 +1,2 @@ +widgetButton.vert +widgetButton.frag \ No newline at end of file diff --git a/share/theme/rounded/widgetButton.vert b/share/theme/rounded/widgetButton.vert new file mode 100644 index 00000000..1b0652d7 --- /dev/null +++ b/share/theme/rounded/widgetButton.vert @@ -0,0 +1,17 @@ +#ifdef GL_ES +precision mediump float; +precision mediump int; +#endif + +// Input : +attribute vec2 EW_coord2d; +uniform mat4 EW_MatrixTransformation; + +// output : +varying vec2 v_position; // This will be passed into the fragment shader. + +void main(void) { + gl_Position = EW_MatrixTransformation * vec4(EW_coord2d, 0.0, 1.0); + // transmit position of the curent element (intermolated ...) + v_position = EW_coord2d; +}