239 lines
7.7 KiB
C++
239 lines
7.7 KiB
C++
/**
|
|
* @author Edouard DUPIN
|
|
*
|
|
* @copyright 2011, Edouard DUPIN, all right reserved
|
|
*
|
|
* @license BSD v3 (see license file)
|
|
*/
|
|
|
|
#include <ewol/widget/ColorBar.h>
|
|
|
|
#include <ewol/compositing/Drawing.h>
|
|
#include <ewol/widget/WidgetManager.h>
|
|
|
|
#include <draw/Color.h>
|
|
|
|
extern const char * const ewolEventColorBarChange = "ewol-color-bar-change";
|
|
|
|
|
|
|
|
#undef __class__
|
|
#define __class__ "ColorBar"
|
|
|
|
widget::ColorBar::ColorBar(void)
|
|
{
|
|
AddEventId(ewolEventColorBarChange);
|
|
m_currentUserPos.setValue(0,0);
|
|
m_currentColor = draw::color::black;
|
|
SetCanHaveFocus(true);
|
|
SetMouseLimit(1);
|
|
}
|
|
|
|
widget::ColorBar::~ColorBar(void)
|
|
{
|
|
|
|
}
|
|
|
|
|
|
bool widget::ColorBar::CalculateMinSize(void)
|
|
{
|
|
m_minSize.setValue(160, 80);
|
|
MarkToRedraw();
|
|
return true;
|
|
}
|
|
static draw::Color s_listColorWhite(0xFFFFFFFF);
|
|
static draw::Color s_listColorBlack(0x000000FF);
|
|
#define NB_BAND_COLOR (6)
|
|
static draw::Color s_listColor[NB_BAND_COLOR+1] = {
|
|
0xFF0000FF,
|
|
0xFFFF00FF,
|
|
0x00FF00FF,
|
|
0x00FFFFFF,
|
|
0x0000FFFF,
|
|
0xFF00FFFF,
|
|
0xFF0000FF
|
|
};
|
|
|
|
draw::Color widget::ColorBar::GetCurrentColor(void)
|
|
{
|
|
return m_currentColor;
|
|
}
|
|
void widget::ColorBar::SetCurrentColor(draw::Color newOne)
|
|
{
|
|
m_currentColor = newOne;
|
|
m_currentColor.a = 0xFF;
|
|
// estimate the cursor position :
|
|
// TODO : Later when really needed ...
|
|
}
|
|
|
|
void widget::ColorBar::OnDraw(ewol::DrawProperty& displayProp)
|
|
{
|
|
m_draw.Draw();
|
|
}
|
|
|
|
|
|
void widget::ColorBar::OnRegenerateDisplay(void)
|
|
{
|
|
if (true == NeedRedraw()) {
|
|
// clean the object list ...
|
|
m_draw.Clear();
|
|
|
|
int32_t tmpSizeX = m_minSize.x();
|
|
int32_t tmpSizeY = m_minSize.y();
|
|
int32_t tmpOriginX = (m_size.x() - m_minSize.x()) / 2;
|
|
int32_t tmpOriginY = (m_size.y() - m_minSize.y()) / 2;
|
|
|
|
if (true==m_userFill.x()) {
|
|
tmpSizeX = m_size.x();
|
|
tmpOriginX = 0;
|
|
}
|
|
if (true==m_userFill.y()) {
|
|
tmpSizeY = m_size.y();
|
|
tmpOriginY = 0;
|
|
}
|
|
|
|
for(int32_t iii=0; iii<NB_BAND_COLOR ; iii++) {
|
|
/* Step 1 :
|
|
*
|
|
* **
|
|
* ****
|
|
* ******
|
|
* ********
|
|
*/
|
|
m_draw.SetColor(s_listColorWhite);
|
|
m_draw.SetPos(vec3(tmpOriginX + (iii)*(tmpSizeX/NB_BAND_COLOR), tmpOriginY, 0) );
|
|
m_draw.AddVertex();
|
|
m_draw.SetColor(s_listColor[iii+1]);
|
|
m_draw.SetPos(vec3(tmpOriginX + (iii+1)*(tmpSizeX/NB_BAND_COLOR), tmpOriginY+tmpSizeY/2, 0) );
|
|
m_draw.AddVertex();
|
|
m_draw.SetColor(s_listColor[iii]);
|
|
m_draw.SetPos(vec3(tmpOriginX + iii*(tmpSizeX/NB_BAND_COLOR), tmpOriginY+tmpSizeY/2, 0) );
|
|
m_draw.AddVertex();
|
|
/* Step 2 :
|
|
* ********
|
|
* ******
|
|
* ****
|
|
* **
|
|
*
|
|
*/
|
|
m_draw.SetColor(s_listColorWhite);
|
|
m_draw.SetPos(vec3(tmpOriginX + iii*(tmpSizeX/NB_BAND_COLOR), tmpOriginY, 0) );
|
|
m_draw.AddVertex();
|
|
m_draw.SetColor(s_listColorWhite);
|
|
m_draw.SetPos(vec3(tmpOriginX + (iii+1)*(tmpSizeX/NB_BAND_COLOR), tmpOriginY, 0) );
|
|
m_draw.AddVertex();
|
|
m_draw.SetColor(s_listColor[iii+1]);
|
|
m_draw.SetPos(vec3(tmpOriginX + (iii+1)*(tmpSizeX/NB_BAND_COLOR), tmpOriginY+tmpSizeY/2, 0) );
|
|
m_draw.AddVertex();
|
|
/* Step 3 :
|
|
*
|
|
* **
|
|
* ****
|
|
* ******
|
|
* ********
|
|
*/
|
|
m_draw.SetColor(s_listColor[iii]);
|
|
m_draw.SetPos(vec3(tmpOriginX + iii*(tmpSizeX/NB_BAND_COLOR), tmpOriginY+tmpSizeY/2, 0));
|
|
m_draw.AddVertex();
|
|
m_draw.SetColor(s_listColorBlack);
|
|
m_draw.SetPos(vec3(tmpOriginX + (iii+1)*(tmpSizeX/NB_BAND_COLOR), tmpOriginY+tmpSizeY, 0));
|
|
m_draw.AddVertex();
|
|
m_draw.SetColor(s_listColorBlack);
|
|
m_draw.SetPos(vec3(tmpOriginX + iii*(tmpSizeX/NB_BAND_COLOR), tmpOriginY+tmpSizeY, 0));
|
|
m_draw.AddVertex();
|
|
/* Step 4 :
|
|
* ********
|
|
* ******
|
|
* ****
|
|
* **
|
|
*
|
|
*/
|
|
m_draw.SetColor(s_listColor[iii]);
|
|
m_draw.SetPos(vec3(tmpOriginX + iii*(tmpSizeX/NB_BAND_COLOR), tmpOriginY+tmpSizeY/2, 0));
|
|
m_draw.AddVertex();
|
|
m_draw.SetColor(s_listColor[iii+1]);
|
|
m_draw.SetPos(vec3(tmpOriginX + (iii+1)*(tmpSizeX/NB_BAND_COLOR), tmpOriginY+tmpSizeY/2, 0));
|
|
m_draw.AddVertex();
|
|
m_draw.SetColor(s_listColorBlack);
|
|
m_draw.SetPos(vec3(tmpOriginX + (iii+1)*(tmpSizeX/NB_BAND_COLOR), tmpOriginY+tmpSizeY, 0));
|
|
m_draw.AddVertex();
|
|
}
|
|
if (m_currentUserPos.y() > 0.5) {
|
|
m_draw.SetColor(draw::color::white);
|
|
} else {
|
|
m_draw.SetColor(draw::color::black);
|
|
}
|
|
m_draw.SetPos(vec3(m_currentUserPos.x()*m_size.x(), m_currentUserPos.y()*m_size.y(), 0) );
|
|
m_draw.SetThickness(1);
|
|
m_draw.Circle(3.0);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
bool widget::ColorBar::OnEventInput(ewol::keyEvent::type_te type, int32_t IdInput, ewol::keyEvent::status_te typeEvent, vec2 pos)
|
|
{
|
|
vec2 relativePos = RelativePosition(pos);
|
|
//EWOL_DEBUG("Event on BT ...");
|
|
if (1 == IdInput) {
|
|
relativePos.setValue( etk_max(etk_min(relativePos.x(), m_size.x()),0),
|
|
etk_max(etk_min(relativePos.y(), m_size.y()),0));
|
|
if( ewol::keyEvent::statusSingle == typeEvent
|
|
|| ewol::keyEvent::statusMove == typeEvent) {
|
|
// nothing to do ...
|
|
m_currentUserPos.setValue( relativePos.x()/m_size.x(),
|
|
relativePos.y()/m_size.y() );
|
|
MarkToRedraw();
|
|
//==> try to estimate color
|
|
EWOL_VERBOSE("event on (" << relativePos.x() << "," << relativePos.y() << ")");
|
|
int32_t bandID = (int32_t)(relativePos.x()/(m_size.x()/6));
|
|
float localPos = relativePos.x() - (m_size.x()/6) * bandID;
|
|
float poroportionnalPos = localPos/(m_size.x()/6);
|
|
EWOL_VERBOSE("bandId=" << bandID << " relative pos=" << localPos);
|
|
draw::Color estimateColor = draw::color::white;
|
|
if (s_listColor[bandID].r == s_listColor[bandID+1].r) {
|
|
estimateColor.r = s_listColor[bandID].r;
|
|
} else if (s_listColor[bandID].r < s_listColor[bandID+1].r) {
|
|
estimateColor.r = s_listColor[bandID].r + (s_listColor[bandID+1].r-s_listColor[bandID].r)*poroportionnalPos;
|
|
} else {
|
|
estimateColor.r = s_listColor[bandID+1].r + (s_listColor[bandID].r-s_listColor[bandID+1].r)*(1-poroportionnalPos);
|
|
}
|
|
if (s_listColor[bandID].g == s_listColor[bandID+1].g) {
|
|
estimateColor.g = s_listColor[bandID].g;
|
|
} else if (s_listColor[bandID].g < s_listColor[bandID+1].g) {
|
|
estimateColor.g = s_listColor[bandID].g + (s_listColor[bandID+1].g-s_listColor[bandID].g)*poroportionnalPos;
|
|
} else {
|
|
estimateColor.g = s_listColor[bandID+1].g + (s_listColor[bandID].g-s_listColor[bandID+1].g)*(1-poroportionnalPos);
|
|
}
|
|
if (s_listColor[bandID].b == s_listColor[bandID+1].b) {
|
|
estimateColor.b = s_listColor[bandID].b;
|
|
} else if (s_listColor[bandID].b < s_listColor[bandID+1].b) {
|
|
estimateColor.b = s_listColor[bandID].b + (s_listColor[bandID+1].b-s_listColor[bandID].b)*poroportionnalPos;
|
|
} else {
|
|
estimateColor.b = s_listColor[bandID+1].b + (s_listColor[bandID].b-s_listColor[bandID+1].b)*(1-poroportionnalPos);
|
|
}
|
|
// step 2 generate the white and black ...
|
|
if (m_currentUserPos.y() == 0.5) {
|
|
// nothing to do ... just get the current color ...
|
|
} else if (m_currentUserPos.y() < 0.5) {
|
|
float poroportionnalWhite = (0.5-m_currentUserPos.y())*2.0;
|
|
estimateColor.r = estimateColor.r + (0xFF-estimateColor.r)*poroportionnalWhite;
|
|
estimateColor.g = estimateColor.g + (0xFF-estimateColor.g)*poroportionnalWhite;
|
|
estimateColor.b = estimateColor.b + (0xFF-estimateColor.b)*poroportionnalWhite;
|
|
} else {
|
|
float poroportionnalBlack = (m_currentUserPos.y()-0.5)*2.0;
|
|
estimateColor.r = estimateColor.r - estimateColor.r*poroportionnalBlack;
|
|
estimateColor.g = estimateColor.g - estimateColor.g*poroportionnalBlack;
|
|
estimateColor.b = estimateColor.b - estimateColor.b*poroportionnalBlack;
|
|
}
|
|
if(m_currentColor != estimateColor) {
|
|
m_currentColor = estimateColor;
|
|
GenerateEventId(ewolEventColorBarChange);
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|