232 lines
5.5 KiB
C
232 lines
5.5 KiB
C
|
/*
|
||
|
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
|
||
|
*/
|
||
|
#include "e.h"
|
||
|
|
||
|
typedef struct _E_Widget_Data E_Widget_Data;
|
||
|
struct _E_Widget_Data
|
||
|
{
|
||
|
Evas_List *sliders;
|
||
|
Evas_List *entries;
|
||
|
Evas_Object *spectrum, *vert, *current;
|
||
|
E_Color *cv;
|
||
|
char **values;
|
||
|
int mode;
|
||
|
int changing;
|
||
|
};
|
||
|
|
||
|
static void
|
||
|
_e_wid_cb_radio_changed(void *data, Evas_Object *o)
|
||
|
{
|
||
|
E_Widget_Data *wd = data;
|
||
|
|
||
|
e_widget_spectrum_mode_set(wd->spectrum, wd->mode);
|
||
|
e_widget_cslider_mode_set(wd->vert, wd->mode);
|
||
|
}
|
||
|
|
||
|
static void
|
||
|
_e_wid_cb_color_changed(void *data, Evas_Object *o)
|
||
|
{
|
||
|
E_Widget_Data *wd = data;
|
||
|
Evas_List *l;
|
||
|
int i;
|
||
|
int changed = -1;
|
||
|
|
||
|
if (wd->changing) return;
|
||
|
|
||
|
wd->changing = 1;
|
||
|
|
||
|
// entry changed
|
||
|
for(l = wd->entries, i = 0; l; l = l->next, i++)
|
||
|
{
|
||
|
if (o == l->data)
|
||
|
{
|
||
|
changed = i;
|
||
|
switch(i)
|
||
|
{
|
||
|
case E_COLOR_COMPONENT_R:
|
||
|
wd->cv->r = atoi(wd->values[i]);
|
||
|
break;
|
||
|
case E_COLOR_COMPONENT_G:
|
||
|
wd->cv->g = atoi(wd->values[i]);
|
||
|
break;
|
||
|
case E_COLOR_COMPONENT_B:
|
||
|
wd->cv->b = atoi(wd->values[i]);
|
||
|
break;
|
||
|
case E_COLOR_COMPONENT_H:
|
||
|
wd->cv->h = atof(wd->values[i]);
|
||
|
break;
|
||
|
case E_COLOR_COMPONENT_S:
|
||
|
wd->cv->s = atof(wd->values[i]);
|
||
|
break;
|
||
|
case E_COLOR_COMPONENT_V:
|
||
|
wd->cv->v = atof(wd->values[i]);
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (changed != -1)
|
||
|
{
|
||
|
if (changed>= E_COLOR_COMPONENT_H)
|
||
|
e_color_update_hsv(wd->cv);
|
||
|
else if (changed >= E_COLOR_COMPONENT_R)
|
||
|
e_color_update_rgb(wd->cv);
|
||
|
}
|
||
|
|
||
|
if (o == wd->vert)
|
||
|
changed = wd->mode;
|
||
|
else
|
||
|
e_widget_cslider_update(wd->vert);
|
||
|
|
||
|
|
||
|
// update the sliders
|
||
|
for (l = wd->sliders, i = 0; l; l = l->next, i++)
|
||
|
{
|
||
|
Evas_Object *so = l->data;
|
||
|
if (o != so)
|
||
|
{
|
||
|
e_widget_cslider_update(so);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
changed = i;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// and update the sepctrum
|
||
|
if (o != wd->spectrum && changed != -1)
|
||
|
{
|
||
|
if (wd->mode == changed ||
|
||
|
(wd->mode >= E_COLOR_COMPONENT_H && changed <= E_COLOR_COMPONENT_B) ||
|
||
|
(wd->mode <= E_COLOR_COMPONENT_B && changed >= E_COLOR_COMPONENT_H))
|
||
|
e_widget_spectrum_update(wd->spectrum, 1);
|
||
|
else
|
||
|
e_widget_spectrum_update(wd->spectrum, 0);
|
||
|
}
|
||
|
|
||
|
// now update the text fields to show current values
|
||
|
for(l = wd->entries, i = 0; l; l = l->next, i++)
|
||
|
{
|
||
|
char buf[10];
|
||
|
if (o == l->data) continue;
|
||
|
switch(i)
|
||
|
{
|
||
|
case E_COLOR_COMPONENT_R:
|
||
|
snprintf(buf, 10, "%i", wd->cv->r);
|
||
|
break;
|
||
|
case E_COLOR_COMPONENT_G:
|
||
|
snprintf(buf, 10, "%i", wd->cv->g);
|
||
|
break;
|
||
|
case E_COLOR_COMPONENT_B:
|
||
|
snprintf(buf, 10, "%i", wd->cv->b);
|
||
|
break;
|
||
|
case E_COLOR_COMPONENT_H:
|
||
|
snprintf(buf, 10, "%.2f", wd->cv->h);
|
||
|
break;
|
||
|
case E_COLOR_COMPONENT_S:
|
||
|
snprintf(buf, 10, "%.2f", wd->cv->s);
|
||
|
break;
|
||
|
case E_COLOR_COMPONENT_V:
|
||
|
snprintf(buf, 10, "%.2f", wd->cv->v);
|
||
|
break;
|
||
|
}
|
||
|
e_widget_entry_text_set((Evas_Object *)(l->data), buf);
|
||
|
}
|
||
|
|
||
|
wd->changing = 0;
|
||
|
}
|
||
|
|
||
|
Evas_Object *
|
||
|
e_widget_csel_add(Evas *evas)
|
||
|
{
|
||
|
Evas_Object *o;
|
||
|
Evas_Object *frame, *table;
|
||
|
Evas_Coord mw, mh;
|
||
|
E_Color*cv;
|
||
|
int i;
|
||
|
E_Radio_Group *grp = NULL;
|
||
|
char *labels[6] = { "R", "G", "B", "H", "S", "V" };
|
||
|
E_Widget_Data *wd;
|
||
|
|
||
|
table = e_widget_table_add(evas, 0);
|
||
|
|
||
|
frame = e_widget_frametable_add(evas, "colors", 0);
|
||
|
wd = calloc(1, sizeof(E_Widget_Data));
|
||
|
wd->mode = 1;
|
||
|
grp = e_widget_radio_group_new(&wd->mode);
|
||
|
|
||
|
// all sliders update a single color value struct
|
||
|
cv = calloc(1, sizeof(E_Color));
|
||
|
wd->cv = cv;
|
||
|
|
||
|
cv->r = 20; cv->g = 120; cv->b = 79;
|
||
|
cv->a = 255;
|
||
|
e_color_update_rgb(cv);
|
||
|
|
||
|
wd->values = calloc(E_COLOR_COMPONENT_MAX, sizeof(char *));
|
||
|
|
||
|
for(i = 0; i < E_COLOR_COMPONENT_MAX; i++)
|
||
|
{
|
||
|
wd->values[i] = calloc(10, sizeof(char));
|
||
|
switch(i)
|
||
|
{
|
||
|
case E_COLOR_COMPONENT_R:
|
||
|
snprintf(wd->values[i], 10, "%i", cv->r);
|
||
|
break;
|
||
|
case E_COLOR_COMPONENT_G:
|
||
|
snprintf(wd->values[i], 10, "%i", cv->g);
|
||
|
break;
|
||
|
case E_COLOR_COMPONENT_B:
|
||
|
snprintf(wd->values[i], 10, "%i", cv->b);
|
||
|
break;
|
||
|
case E_COLOR_COMPONENT_H:
|
||
|
snprintf(wd->values[i], 10, "%.0f", cv->h);
|
||
|
break;
|
||
|
case E_COLOR_COMPONENT_S:
|
||
|
snprintf(wd->values[i], 10, "%.2f", cv->s);
|
||
|
break;
|
||
|
case E_COLOR_COMPONENT_V:
|
||
|
snprintf(wd->values[i], 11, "%.2f", cv->v);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
o = e_widget_radio_add(evas, labels[i], i, grp);
|
||
|
e_widget_on_change_hook_set(o, _e_wid_cb_radio_changed, wd);
|
||
|
e_widget_frametable_object_append(frame, o, 0, i, 1, 1, 1, 1, 0, 0);
|
||
|
|
||
|
o = e_widget_cslider_add(evas, i, cv, 0, 0);
|
||
|
evas_object_show(o);
|
||
|
wd->sliders = evas_list_append(wd->sliders, o);
|
||
|
e_widget_on_change_hook_set(o, _e_wid_cb_color_changed, wd);
|
||
|
e_widget_frametable_object_append(frame, o, 1, i, 1, 1, 1, 1, 1, 0);
|
||
|
|
||
|
o = e_widget_entry_add(evas, &(wd->values[i]));
|
||
|
evas_object_show(o);
|
||
|
wd->entries = evas_list_append(wd->entries, o);
|
||
|
e_widget_frametable_object_append(frame, o, 2, i, 1, 1, 1, 1, 1, 1);
|
||
|
e_widget_on_change_hook_set(o, _e_wid_cb_color_changed, wd);
|
||
|
|
||
|
}
|
||
|
|
||
|
o = e_widget_spectrum_add(evas, wd->mode, cv);
|
||
|
evas_object_show(o);
|
||
|
e_widget_on_change_hook_set(o, _e_wid_cb_color_changed, wd);
|
||
|
wd->spectrum = o;
|
||
|
e_widget_table_object_append(table, o, 1, 1, 1, 1, 1, 1, 1, 1);
|
||
|
|
||
|
o = e_widget_cslider_add(evas, wd->mode, cv, 1, 1);
|
||
|
e_widget_on_change_hook_set(o, _e_wid_cb_color_changed, wd);
|
||
|
evas_object_show(o);
|
||
|
wd->vert = o;
|
||
|
e_widget_table_object_append(table, o, 2, 1, 1, 1, 1, 1, 0, 1);
|
||
|
|
||
|
e_widget_table_object_append(table, frame, 3, 1, 1, 1, 1, 1, 1, 1);
|
||
|
|
||
|
return table;
|
||
|
}
|
||
|
|
||
|
|
||
|
|