[DEV] correction of the scroll widget and add distance field load precompiled basic file

This commit is contained in:
Edouard DUPIN 2014-03-30 12:37:10 +02:00
parent 6be6a33789
commit 189665162e
16 changed files with 214 additions and 67 deletions

2
external/airtaudio vendored

@ -1 +1 @@
Subproject commit a1f0b0f81c895b946a6db763d9845acdd2d05525
Subproject commit b30ff7808fe7205aa166dc4a856566a6ecfd9b85

2
external/etk vendored

@ -1 +1 @@
Subproject commit d431e72b0916391c011830a5db9d8f756c510405
Subproject commit a2e5f4e0cedf31ab2605b0980981bf1721c29a98

View File

@ -151,7 +151,7 @@ void ewol::compositing::Image::setAngle(float _angle) {
}
void ewol::compositing::Image::print(const vec2& _size) {
printPart(_size, vec2(0,0), vec2(1,1));
printPart(_size, vec2(0,0), vec2(1.0,1.0));
}
void ewol::compositing::Image::printPart(const vec2& _size,

View File

@ -52,6 +52,14 @@ ewol::Context& ewol::getContext(void) {
return *l_curentInterface;
}
void ewol::Context::setInitImage(const std::string& _fileName) {
//m_initDisplayImageName = _fileName;
}
/**
* @brief set the curent interface.
* @note this lock the main mutex
@ -154,7 +162,8 @@ void ewol::Context::processEvents(void) {
case eSystemMessage::msgInit:
// this is due to the openGL context
/*bool returnVal = */
APP_Init(*this);
APP_Init(*this, m_initStepId, m_initTotalStep);
m_initStepId++;
break;
case eSystemMessage::msgRecalculateSize:
forceRedrawAll();
@ -288,7 +297,9 @@ ewol::Context::Context(int32_t _argc, const char* _argv[]) :
m_FpsSystem( "Draw ", true),
m_FpsFlush( "Flush ", false),
m_windowsCurrent(NULL),
m_windowsSize(320,480) {
m_windowsSize(320,480),
m_initStepId(0),
m_initTotalStep(1) {
m_commandLine.parse(_argc, _argv);
EWOL_INFO(" == > Ewol system init (BEGIN)");
// Reset the random system to be sure have real random values...
@ -553,6 +564,15 @@ bool ewol::Context::OS_Draw(bool _displayEveryTime) {
// set the curent interface :
lockContext();
processEvents();
if (m_initStepId < m_initTotalStep) {
ewol::eSystemMessage *data = new ewol::eSystemMessage();
if (data == NULL) {
EWOL_ERROR("allocation error of message");
} else {
data->TypeMessage = eSystemMessage::msgInit;
m_msgSystem.post(data);
}
}
// call all the widget that neded to do something periodicly
//! ewol::widgetManager::periodicCall(currentTime);
m_widgetManager.periodicCall(currentTime);

View File

@ -328,6 +328,15 @@ namespace ewol {
* @return normal error int for the application error management
*/
static int main(int _argc, const char *_argv[]);
private:
size_t m_initStepId;
size_t m_initTotalStep;
public:
/**
* @brief Special for init (main) set the start image when loading data
* @param[in] _fileName Name of the image to load
*/
void setInitImage(const std::string& _fileName);
};
/**
* @brief From everyware in the program, we can get the context inteface.
@ -337,8 +346,18 @@ namespace ewol {
};
//!< must be define in CPP by the application ... this are the main init and unInit of the Application
// return false if an error occured
bool APP_Init(ewol::Context& _context);
/**
* @brief main application function initialisation
* @param[in] _context curent context property
* @param[in] _initId current init step
* @param[out] _nbInitStep total number of step
* @return true, all OK
* @return false, an error occured
*/
bool APP_Init(ewol::Context& _context, size_t _initId, size_t& _nbInitStep);
/**
* @brief main application function un-initialisation
*/
void APP_UnInit(ewol::Context& _context);

View File

@ -47,5 +47,3 @@ std::string ewol::getVersion(void) {
return EWOL_VERSION;
}

View File

@ -18,6 +18,7 @@
#include <ewol/context/Context.h>
#include <ewol/resource/DistanceFieldFont.h>
#include <edtaa3/edtaa3func.h>
#include <ejson/ejson.h>
#undef __class__
#define __class__ "resource::DistanceFieldFont"
@ -97,6 +98,12 @@ ewol::resource::DistanceFieldFont::DistanceFieldFont(const std::string& _fontNam
if (m_font == NULL) {
return;
}
if (importFromFile() == true) {
EWOL_INFO("GET distance field from previous file");
flush();
return;
}
m_sizeRatio = ((float)SIZE_GENERATION) / ((float)m_font->getHeight(SIZE_GENERATION));
// TODO : basic font use 512 is better ... == > maybe estimate it with the dpi ???
setImageSize(ivec2(256,32));
@ -110,6 +117,7 @@ ewol::resource::DistanceFieldFont::DistanceFieldFont(const std::string& _fontNam
addGlyph(iii);
}
flush();
//exportOnFile();
}
ewol::resource::DistanceFieldFont::~DistanceFieldFont(void) {
@ -365,3 +373,81 @@ void ewol::resource::DistanceFieldFont::release(ewol::resource::DistanceFieldFon
}
_object = NULL;
}
void ewol::resource::DistanceFieldFont::exportOnFile(void) {
EWOL_DEBUG("EXPORT: DistanceFieldFont : file : '" << m_fileName << ".json'");
ejson::Document doc;
ejson::Array* tmpList = new ejson::Array();
if (tmpList == NULL) {
EWOL_ERROR("NULL pointer");
return;
}
for (size_t iii=0; iii<m_listElement.size(); ++iii) {
ejson::Object* tmpObj = new ejson::Object();
if (tmpObj == NULL) {
continue;
}
tmpObj->addString("m_UVal", std::to_string(m_listElement[iii].m_UVal));
tmpObj->addNumber("m_glyphIndex", m_listElement[iii].m_glyphIndex);
tmpObj->addString("m_sizeTexture", (std::string)m_listElement[iii].m_sizeTexture);
tmpObj->addString("m_bearing", (std::string)m_listElement[iii].m_bearing);
tmpObj->addString("m_advance", (std::string)m_listElement[iii].m_advance);
tmpObj->addString("m_texturePosStart", (std::string)m_listElement[iii].m_texturePosStart);
tmpObj->addString("m_texturePosSize", (std::string)m_listElement[iii].m_texturePosSize);
tmpObj->addBoolean("m_exist", m_listElement[iii].m_exist);
tmpList->add(tmpObj);
}
doc.add("m_listElement", tmpList);
doc.addNumber("m_sizeRatio", m_sizeRatio);
doc.addString("m_lastGlyphPos", (std::string)m_lastGlyphPos);
doc.addNumber("m_lastRawHeigh", m_lastRawHeigh);
doc.addNumber("m_borderSize", m_borderSize);
doc.addString("m_textureBorderSize", (std::string)m_textureBorderSize);
doc.store(m_fileName + ".json");
egami::store(m_data, m_fileName + ".bmp");
egami::store(m_data, m_fileName + ".png");
}
bool ewol::resource::DistanceFieldFont::importFromFile(void) {
EWOL_DEBUG("IMPORT: DistanceFieldFont : file : '" << m_fileName << ".json'");
// test file existance:
etk::FSNode fileJSON(m_fileName + ".json");
etk::FSNode fileBMP(m_fileName + ".bmp");
if ( fileJSON.exist() == false
|| fileBMP.exist() == false) {
EWOL_DEBUG("Does not import file for distance field system");
return false;
}
ejson::Document doc;
doc.load(m_fileName + ".json");
m_sizeRatio = doc.getNumberValue("m_sizeRatio", 0);
m_lastGlyphPos = doc.getStringValue("m_lastGlyphPos", "0,0");
m_lastRawHeigh = doc.getNumberValue("m_lastRawHeigh", 0);
m_borderSize = doc.getNumberValue("m_borderSize", 2);
m_textureBorderSize = doc.addString("m_textureBorderSize", "0,0");
ejson::Array* tmpList = doc.getArray("m_listElement");
if (tmpList == NULL) {
EWOL_ERROR("NULL pointer array");
return false;
}
m_listElement.clear();
for (size_t iii=0; iii<tmpList->size(); ++iii) {
ejson::Object* tmpObj = tmpList->getObject(iii);
if (tmpObj == NULL) {
continue;
}
GlyphProperty prop;
prop.m_UVal = std::stoi(tmpObj->getStringValue("m_UVal", "0"));
prop.m_glyphIndex = tmpObj->getNumberValue("m_glyphIndex", 0);
prop.m_sizeTexture = tmpObj->getStringValue("m_sizeTexture", "0,0");
prop.m_bearing = tmpObj->getStringValue("m_bearing", "0,0");
prop.m_advance = tmpObj->getStringValue("m_advance", "0,0");
prop.m_texturePosStart = tmpObj->getStringValue("m_texturePosStart", "0,0");
prop.m_texturePosSize = tmpObj->getStringValue("m_texturePosSize", "0,0");
prop.m_exist = tmpObj->getBooleanValue("m_exist", false);
m_listElement.push_back(prop);
}
egami::load(m_data, m_fileName + ".bmp");
return true;
}

View File

@ -95,6 +95,9 @@ namespace ewol {
const vec2& getTextureBorderSize(void) {
return m_textureBorderSize;
}
public:
void exportOnFile(void);
bool importFromFile(void);
};
};
};

View File

@ -337,7 +337,7 @@ ewol::GlyphProperty* ewol::resource::TexturedFont::getGlyphPointer(const char32_
}
ewol::resource::TexturedFont* ewol::resource::TexturedFont::keep(const std::string& _filename) {
EWOL_VERBOSE("KEEP : TexturedFont : file : '" << _filename << "'");
EWOL_ERROR("KEEP : TexturedFont : file : '" << _filename << "'");
ewol::resource::TexturedFont* object = NULL;
ewol::Resource* object2 = getManager().localKeep(_filename);
if (NULL != object2) {
@ -351,7 +351,7 @@ ewol::resource::TexturedFont* ewol::resource::TexturedFont::keep(const std::stri
return object;
}
// need to crate a new one ...
EWOL_DEBUG("CREATE: TexturedFont : file : '" << _filename << "'");
EWOL_ERROR("CREATE: TexturedFont : file : '" << _filename << "'");
object = new ewol::resource::TexturedFont(_filename);
if (NULL == object) {
EWOL_ERROR("allocation error of a resource : " << _filename);
@ -365,11 +365,12 @@ void ewol::resource::TexturedFont::release(ewol::resource::TexturedFont*& _objec
if (NULL == _object) {
return;
}
EWOL_ERROR("RELEASE: TexturedFont : file : '" << _object->getName() << "' count=" << _object->getCounter());
std::string name = _object->getName();
int32_t count = _object->getCounter() - 1;
ewol::Resource* object2 = static_cast<ewol::Resource*>(_object);
if (getManager().release(object2) == true) {
EWOL_DEBUG("REMOVE: TexturedFont : file : '" << name << "' count=" << count);
EWOL_ERROR("REMOVE: TexturedFont : file : '" << name << "' count=" << count);
//etk::displayBacktrace(false);
}
_object = NULL;

View File

@ -53,7 +53,7 @@ namespace ewol {
class GlyphProperty {
public:
char32_t m_UVal; //!< Unicode value
private:
public:
bool m_exist;
public:
int32_t m_glyphIndex; //!< Glyph index in the system

View File

@ -159,6 +159,7 @@ void ewol::widget::Image::onRegenerateDisplay(void) {
m_compositing.setPos(origin);
m_compositing.print(imageRealSize);
//EWOL_DEBUG("Paint Image at : " << origin << " size=" << imageRealSize << " origin=" << origin);
EWOL_DEBUG("Paint Image :" << m_fileName << " realsize=" << m_compositing.getRealSize() << " size=" << imageRealSize);
}
}

View File

@ -30,7 +30,7 @@ namespace ewol {
static const char* const configRemoveOnExternClick;
static const char* const configAnimation;
static const char* const configLockExpand;
private:
protected:
ewol::compositing::Shaper m_shaper; //!< Compositing theme.
public:
/**

View File

@ -99,18 +99,22 @@ bool ewol::widget::ProgressBar::onSetConfig(const ewol::object::Config& _conf) {
}
if (_conf.getConfig() == configColorBg) {
m_textColorFg = _conf.getData();
markToRedraw();
return true;
}
if (_conf.getConfig() == configColorFgOn) {
m_textColorBgOn = _conf.getData();
markToRedraw();
return true;
}
if (_conf.getConfig() == configColorFgOff) {
m_textColorBgOff = _conf.getData();
markToRedraw();
return true;
}
if (_conf.getConfig() == configValue) {
m_value = stof(_conf.getData());
markToRedraw();
return true;
}
return false;

View File

@ -24,7 +24,9 @@ void ewol::widget::Scroll::init(ewol::widget::Manager& _widgetManager) {
const char* const ewol::widget::Scroll::configLimit = "limit";
ewol::widget::Scroll::Scroll(void) :
ewol::widget::Scroll::Scroll(const std::string& _shaperName) :
m_shaperH(_shaperName),
m_shaperV(_shaperName),
m_limit(0.15,0.5),
m_pixelScrolling(20),
m_highSpeedStartPos(0,0),
@ -68,54 +70,56 @@ void ewol::widget::Scroll::systemDraw(const ewol::DrawProperty& _displayProp) {
}
void ewol::widget::Scroll::onDraw(void) {
m_draw.draw();
m_shaperH.draw();
m_shaperV.draw();
}
void ewol::widget::Scroll::onRegenerateDisplay(void) {
// call upper class
ewol::widget::Container::onRegenerateDisplay();
if (true == needRedraw()) {
// clear all previous display
m_draw.clear();
m_draw.setColor(0xFF00007F);
vec2 scrollOffset(0,0);
vec2 scrollSize(0,0);
if (NULL!=m_subWidget) {
scrollOffset = m_subWidget->getOffset();
scrollSize = m_subWidget->getSize();
}
m_draw.setThickness(1);
if( m_size.y() < scrollSize.y()
|| scrollOffset.y()!=0) {
//EWOL_DEBUG("plop : " << vec2(m_size.x()-(SCROLL_BAR_SPACE/2), 0) << " " << vec2(m_size.x()-(SCROLL_BAR_SPACE/2), m_size.y()));
m_draw.setPos(vec2(m_size.x()-(SCROLL_BAR_SPACE/2), 0) );
m_draw.lineTo(vec2(m_size.x()-(SCROLL_BAR_SPACE/2), m_size.y()) );
float lenScrollBar = m_size.y()*m_size.y() / scrollSize.y();
lenScrollBar = etk_avg(10, lenScrollBar, m_size.y());
float originScrollBar = scrollOffset.y() / (scrollSize.y()-m_size.y()*m_limit.y());
originScrollBar = etk_avg(0.0, originScrollBar, 1.0);
originScrollBar *= (m_size.y()-lenScrollBar);
m_draw.setPos(vec2(m_size.x()-SCROLL_BAR_SPACE, m_size.y() - originScrollBar - lenScrollBar) );
m_draw.rectangleWidth(vec2(SCROLL_BAR_SPACE, lenScrollBar));
}
if( m_size.x() < scrollSize.x()
|| scrollOffset.x()!=0) {
m_draw.setPos(vec2(0, (SCROLL_BAR_SPACE/2)) );
m_draw.lineTo(vec2(m_size.x()-SCROLL_BAR_SPACE, (SCROLL_BAR_SPACE/2)) );
float lenScrollBar = m_size.x()*(m_size.x()-SCROLL_BAR_SPACE) / scrollSize.x();
lenScrollBar = etk_avg(10, lenScrollBar, (m_size.x()-SCROLL_BAR_SPACE));
float originScrollBar = scrollOffset.x() / (scrollSize.x()-m_size.x()*m_limit.x());
originScrollBar = etk_avg(0.0, originScrollBar, 1.0);
originScrollBar *= (m_size.x()-SCROLL_BAR_SPACE-lenScrollBar);
m_draw.setPos(vec2(originScrollBar, 0) );
m_draw.rectangle(vec2(lenScrollBar, SCROLL_BAR_SPACE) );
}
if (needRedraw() == false) {
return;
}
// clear all previous display
m_shaperH.clear();
m_shaperV.clear();
ewol::Padding paddingVert = m_shaperV.getPadding();
ewol::Padding paddingHori = m_shaperH.getPadding();
vec2 scrollOffset(0,0);
vec2 scrollSize(0,0);
if (NULL!=m_subWidget) {
scrollOffset = m_subWidget->getOffset();
scrollSize = m_subWidget->getSize();
}
if( m_size.y() < scrollSize.y()
|| scrollOffset.y()!=0) {
float lenScrollBar = m_size.y()*m_size.y() / scrollSize.y();
lenScrollBar = etk_avg(10, lenScrollBar, m_size.y());
float originScrollBar = scrollOffset.y() / (scrollSize.y()-m_size.y()*m_limit.y());
originScrollBar = etk_avg(0.0, originScrollBar, 1.0);
originScrollBar *= (m_size.y()-lenScrollBar);
m_shaperV.setShape(vec2(m_size.x() - paddingVert.x(), 0),
vec2(paddingVert.x(), m_size.y()),
vec2(m_size.x() - paddingVert.xRight(), m_size.y() - originScrollBar - lenScrollBar),
vec2(0, lenScrollBar));
}
if( m_size.x() < scrollSize.x()
|| scrollOffset.x()!=0) {
float lenScrollBar = (m_size.x()-paddingHori.xLeft())*(m_size.x()-paddingVert.x()) / scrollSize.x();
lenScrollBar = etk_avg(10, lenScrollBar, (m_size.x()-paddingVert.x()));
float originScrollBar = scrollOffset.x() / (scrollSize.x()-m_size.x()*m_limit.x());
originScrollBar = etk_avg(0.0, originScrollBar, 1.0);
originScrollBar *= (m_size.x()-paddingHori.xRight()-lenScrollBar);
m_shaperH.setShape(vec2(0, 0),
vec2(m_size.x()-paddingVert.x(), paddingHori.y()),
vec2(originScrollBar, paddingHori.yButtom()),
vec2(lenScrollBar, 0));
}
}
bool ewol::widget::Scroll::onEventInput(const ewol::event::Input& _event) {
//ewol::event::Input _event = event;
//_event.setType(ewol::key::typeFinger);
vec2 relativePos = relativePosition(_event.getPos());
vec2 scrollOffset(0,0);
vec2 scrollSize(0,0);
@ -123,6 +127,7 @@ bool ewol::widget::Scroll::onEventInput(const ewol::event::Input& _event) {
scrollOffset = m_subWidget->getOffset();
scrollSize = m_subWidget->getSize();
}
EWOL_WARNING("Get Event on scroll : " << _event);
relativePos.setY(m_size.y() - relativePos.y());
if( _event.getType() == ewol::key::typeMouse
&& ( ewol::key::typeUnknow == m_highSpeedType
@ -282,12 +287,12 @@ bool ewol::widget::Scroll::onEventInput(const ewol::event::Input& _event) {
&& ( ewol::key::typeUnknow == m_highSpeedType
|| ewol::key::typeFinger == m_highSpeedType ) ) {
if (1 == _event.getId()) {
//EWOL_VERBOSE("event 1 << " << (int32_t)typeEvent << "(" << x << "," << y << ")");
EWOL_VERBOSE("event: " << _event);
if (ewol::key::statusDown == _event.getStatus()) {
m_highSpeedMode = speedModeInit;
m_highSpeedType = ewol::key::typeFinger;
m_highSpeedStartPos.setValue(relativePos.x(), relativePos.y());
EWOL_VERBOSE("SCROOL == > INIT");
EWOL_VERBOSE("SCROOL == > INIT pos=" << m_highSpeedStartPos << " && curent scrollOffset=" << scrollOffset);
return true;
} else if (ewol::key::statusUp == _event.getStatus()) {
m_highSpeedMode = speedModeDisable;
@ -310,14 +315,23 @@ bool ewol::widget::Scroll::onEventInput(const ewol::event::Input& _event) {
}
if ( m_highSpeedMode == speedModeEnableFinger
&& ewol::key::statusMove == _event.getStatus()) {
EWOL_VERBOSE("SCROOL == > INIT scrollOffset=" << scrollOffset.y() << " relativePos=" << relativePos.y() << " m_highSpeedStartPos=" << m_highSpeedStartPos.y());
//scrollOffset.x = (int32_t)(scrollSize.x * x / m_size.x);
scrollOffset.setX(scrollOffset.x() - relativePos.x() - m_highSpeedStartPos.x());
scrollOffset.setY(scrollOffset.y() - relativePos.y() - m_highSpeedStartPos.y());
scrollOffset.setX(etk_avg(0, scrollOffset.x(), (scrollSize.x() - m_size.x()*m_limit.x())));
scrollOffset.setY(etk_avg(0, scrollOffset.y(), (scrollSize.y() - m_size.y()*m_limit.y())));
m_highSpeedStartPos.setValue(relativePos.x(), relativePos.y());
EWOL_VERBOSE("SCROOL == > MOVE (" << scrollOffset.x() << "," << scrollOffset.y() << ")");
if (m_limit.x() != 0.0f) {
scrollOffset.setX(scrollOffset.x() + (relativePos.x() - m_highSpeedStartPos.x()));
scrollOffset.setX(etk_avg(0, scrollOffset.x(), (scrollSize.x() - m_size.x()*m_limit.x())));
}
if (m_limit.y() != 0.0f) {
scrollOffset.setY(scrollOffset.y() - (relativePos.y() - m_highSpeedStartPos.y()));
scrollOffset.setY(etk_avg(0, scrollOffset.y(), (scrollSize.y() - m_size.y()*m_limit.y())));
}
// update current position:
m_highSpeedStartPos = relativePos;
EWOL_VERBOSE("SCROOL == > MOVE " << scrollOffset);
markToRedraw();
if (NULL!=m_subWidget) {
m_subWidget->setOffset(scrollOffset);
}
return true;
}
} else if ( m_highSpeedMode != speedModeDisable

View File

@ -13,7 +13,7 @@
#include <ewol/debug.h>
#include <ewol/widget/Container.h>
#include <ewol/compositing/Compositing.h>
#include <ewol/compositing/Drawing.h>
#include <ewol/compositing/Shaper.h>
#include <ewol/widget/Manager.h>
namespace ewol {
@ -37,7 +37,8 @@ namespace ewol {
public:
static void init(ewol::widget::Manager& _widgetManager);
private:
ewol::compositing::Drawing m_draw; // TODO : change in shaper ... == > better for annimation and dynamic display ...
ewol::compositing::Shaper m_shaperH; //!< Compositing theme Horizontal.
ewol::compositing::Shaper m_shaperV; //!< Compositing theme Vertical.
protected:
vec2 m_limit;
private:
@ -47,7 +48,7 @@ namespace ewol {
int32_t m_highSpeedButton;
enum ewol::key::type m_highSpeedType;
public:
Scroll(void);
Scroll(const std::string& _shaperName="THEME:GUI:WidgetScrolled.json");
virtual ~Scroll(void);
/**
* @brief set the limit of scrolling

View File

@ -16,8 +16,8 @@
ewol::widget::WidgetScrolled::WidgetScrolled(const std::string& _shaperName) :
m_shaperH(_shaperName),
m_shaperV(_shaperName) {
m_shaperH(_shaperName),
m_shaperV(_shaperName) {
addObjectType("ewol::widget::WidgetScrolled");
m_originScrooled.setValue(0,0);
m_pixelScrolling = 20;