summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/themes/Makefile.am4
-rw-r--r--data/themes/default.edc2
-rw-r--r--data/themes/default_cslider.edc87
-rw-r--r--data/themes/default_spectrum.edc89
-rw-r--r--src/bin/Makefile.am10
-rw-r--r--src/bin/e_color.c19
-rw-r--r--src/bin/e_color.h27
-rw-r--r--src/bin/e_includes.h5
-rw-r--r--src/bin/e_spectrum.c350
-rw-r--r--src/bin/e_spectrum.h9
-rw-r--r--src/bin/e_test.c25
-rw-r--r--src/bin/e_widget_csel.c231
-rw-r--r--src/bin/e_widget_csel.h6
-rw-r--r--src/bin/e_widget_cslider.c441
-rw-r--r--src/bin/e_widget_cslider.h7
-rw-r--r--src/bin/e_widget_spectrum.c313
-rw-r--r--src/bin/e_widget_spectrum.h6
17 files changed, 1629 insertions, 2 deletions
diff --git a/data/themes/Makefile.am b/data/themes/Makefile.am
index 90e371c47f..9a40d3f2b3 100644
--- a/data/themes/Makefile.am
+++ b/data/themes/Makefile.am
@@ -53,7 +53,9 @@ default_exebuf.edc \
default_desklock.edc \
default_textblock.edc \
default_shelf.edc \
-default_preview.edc
+default_preview.edc \
+default_cslider.edc \
+default_spectrum.edc
default.edj: Makefile $(EXTRA_DIST)
$(EDJE_CC) $(EDJE_FLAGS) \
diff --git a/data/themes/default.edc b/data/themes/default.edc
index 55d5e1e872..5b7d886b35 100644
--- a/data/themes/default.edc
+++ b/data/themes/default.edc
@@ -62,5 +62,7 @@ collections {
#include "default_textblock.edc"
#include "default_shelf.edc"
#include "default_preview.edc"
+#include "default_cslider.edc"
+#include "default_spectrum.edc"
}
diff --git a/data/themes/default_cslider.edc b/data/themes/default_cslider.edc
new file mode 100644
index 0000000000..8ea73c8d89
--- /dev/null
+++ b/data/themes/default_cslider.edc
@@ -0,0 +1,87 @@
+group {
+ name: "widgets/cslider";
+ parts {
+ part {
+ name: "bg";
+ type: RECT;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 100;
+ min: 0 20;
+ max: 99999 20;
+ rel1.offset: 2 2;
+ rel2.offset: -3 -3;
+ }
+ description {
+ state: "vertical" 0.0;
+ inherit: "default" 0.0;
+ min: 20 0;
+ max: 20 99999;
+ }
+ }
+ part {
+ name: "gradient";
+ type: SWALLOW;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1.to: "bg";
+ rel1.offset: 1 1;
+ rel2.to: "bg";
+ rel2.offset: -2 -2;
+ }
+ }
+ part {
+ name: "cursor";
+ type: RECT;
+ dragable {
+ confine: "gradient";
+ x: 1 1 0;
+ y: -1 1 0;
+ }
+ description {
+ state: "default" 0.0;
+ min: 3 16;
+ max: 3 9999;
+ fixed: 1 1;
+ rel1 {
+ to: "gradient";
+ relative: 0.5 0;
+ offset: 0 0;
+ }
+ rel2 {
+ to: "gradient";
+ relative: 0.5 1;
+ offset: 0 -1;
+ }
+ }
+ description {
+ state: "vertical" 0.0;
+ min: 16 3;
+ max: 9999 3;
+ fixed: 1 1;
+ rel1 {
+ to: "gradient";
+ relative: 0 0.5 ;
+ offset: 0 0;
+ }
+ rel2 {
+ to: "gradient";
+ relative: 1 0.5;
+ offset: -1 0;
+ }
+ }
+ }
+ }
+ programs {
+ program {
+ name: "go_vertical";
+ signal: "e,direction,v";
+ source: "";
+ action: STATE_SET "vertical" 0.0;
+ target: "cursor";
+ target: "bg";
+ }
+ }
+}
diff --git a/data/themes/default_spectrum.edc b/data/themes/default_spectrum.edc
new file mode 100644
index 0000000000..2dc2c9732b
--- /dev/null
+++ b/data/themes/default_spectrum.edc
@@ -0,0 +1,89 @@
+group {
+ name: "widgets/spectrum";
+ parts {
+ part {
+ name: "bg";
+ type: RECT;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ aspect: 1 1;
+ color: 0 0 0 100;
+ rel1.offset: 2 2;
+ rel2.offset: -3 -3;
+ }
+ }
+ part {
+ name: "spectrum";
+ type: SWALLOW;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ min: 18 18;
+ max: 9999 9999;
+ rel1.to: "bg";
+ rel1.offset: 1 1;
+ rel2.to: "bg";
+ rel2.offset: -2 -2;
+ }
+ }
+ part {
+ name: "cursor";
+ type: RECT;
+ dragable {
+ confine: "spectrum";
+ x: 1 1 0;
+ y: 1 1 0;
+ }
+ description {
+ state: "default" 0.0;
+ min: 3 3;
+ max: 3 3;
+ fixed: 1 1;
+ visible: 0;
+ rel1 {
+ to: "spectrum";
+ relative: 0.5 0.5;
+ offset: 0 0;
+ }
+ rel2 {
+ to: "spectrum";
+ relative: 0.5 0.5;
+ offset: 0 0;
+ }
+ }
+ }
+ part {
+ name: "cursor_x";
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ rel1 {
+ to_x: "cursor";
+ to_y: "spectrum";
+ }
+ rel2 {
+ to_x: "cursor";
+ to_y: "spectrum";
+
+ }
+ }
+ }
+ part {
+ name: "cursor_y";
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ rel1 {
+ to_x: "spectrum";
+ to_y: "cursor";
+ }
+ rel2 {
+ to_x: "spectrum";
+ to_y: "cursor";
+
+ }
+ }
+ }
+ }
+}
diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am
index 0d589fa011..fe8c36f67e 100644
--- a/src/bin/Makefile.am
+++ b/src/bin/Makefile.am
@@ -167,6 +167,11 @@ e_widget_scrollframe.h \
e_sha1.h \
e_widget_fsel.h \
e_fm_mime.h \
+e_color.h \
+e_spectrum.h \
+e_widget_spectrum.h \
+e_widget_cslider.h \
+e_widget_csel.h \
e_int_config_wallpaper.h \
e_int_config_wallpaper_import.h
@@ -311,6 +316,11 @@ e_widget_scrollframe.c \
e_sha1.c \
e_widget_fsel.c \
e_fm_mime.c \
+e_color.c \
+e_spectrum.c \
+e_widget_spectrum.c \
+e_widget_cslider.c \
+e_widget_csel.c \
e_int_config_wallpaper.c \
e_int_config_wallpaper_import.c \
$(ENLIGHTENMENTHEADERS)
diff --git a/src/bin/e_color.c b/src/bin/e_color.c
new file mode 100644
index 0000000000..2c1dd4fbf2
--- /dev/null
+++ b/src/bin/e_color.c
@@ -0,0 +1,19 @@
+#include "e.h"
+
+void
+e_color_update_rgb(E_Color *ec)
+{
+ if (!ec) return;
+ evas_color_rgb_to_hsv(ec->r, ec->g, ec->b, &(ec->h), &(ec->s), &(ec->v));
+}
+
+void
+e_color_update_hsv(E_Color *ec)
+{
+
+ if (!ec) return;
+ if (ec->v == 0)
+ ec->r = ec->g = ec->b = 0;
+ else
+ evas_color_hsv_to_rgb(ec->h, ec->s, ec->v, &(ec->r), &(ec->g), &(ec->b));
+}
diff --git a/src/bin/e_color.h b/src/bin/e_color.h
new file mode 100644
index 0000000000..773f6f5259
--- /dev/null
+++ b/src/bin/e_color.h
@@ -0,0 +1,27 @@
+#ifndef E_COLOR_HEADER
+#define E_COLOR_HEADER
+typedef enum _E_Color_Component E_Color_Component;
+
+enum _E_Color_Component
+{
+ E_COLOR_COMPONENT_R,
+ E_COLOR_COMPONENT_G,
+ E_COLOR_COMPONENT_B,
+ E_COLOR_COMPONENT_H,
+ E_COLOR_COMPONENT_S,
+ E_COLOR_COMPONENT_V,
+ E_COLOR_COMPONENT_MAX
+};
+
+// used so that a single color struct can be shared by all elements of the color dialog
+typedef struct _E_Color E_Color;
+struct _E_Color
+{
+ int r, g, b;
+ float h, s, v;
+ int a;
+};
+
+void e_color_update_rgb(E_Color *ec);
+void e_color_update_hsv(E_Color *ec);
+#endif
diff --git a/src/bin/e_includes.h b/src/bin/e_includes.h
index 8d105e1f01..060c4782f2 100644
--- a/src/bin/e_includes.h
+++ b/src/bin/e_includes.h
@@ -145,3 +145,8 @@
#include "e_fm_mime.h"
#include "e_int_config_wallpaper.h"
#include "e_int_config_wallpaper_import.h"
+#include "e_color.h"
+#include "e_spectrum.h"
+#include "e_widget_spectrum.h"
+#include "e_widget_cslider.h"
+#include "e_widget_csel.h"
diff --git a/src/bin/e_spectrum.c b/src/bin/e_spectrum.c
new file mode 100644
index 0000000000..f9408bee62
--- /dev/null
+++ b/src/bin/e_spectrum.c
@@ -0,0 +1,350 @@
+#include "e.h"
+
+Evas_Smart *_e_spectrum_smart = NULL;
+
+typedef struct _E_Spectrum E_Spectrum;
+
+struct _E_Spectrum
+{
+ Evas_Object *o_spectrum;
+ Evas_Object *o_event;
+ Evas_Object *o_cursor;
+
+ int iw, ih; /* square image width/height */
+ E_Color_Component mode;
+
+ E_Color *cv;
+};
+
+static void
+_e_spectrum_smart_add(Evas_Object *o)
+{
+ E_Spectrum *sp;
+ sp = calloc(1, sizeof(E_Spectrum));
+
+ if (!sp) return;
+
+ evas_object_smart_data_set(o, sp);
+
+ sp->mode = E_COLOR_COMPONENT_R;
+
+ sp->o_spectrum = evas_object_image_add(evas_object_evas_get(o));
+ sp->iw = sp->ih = 255;
+ evas_object_image_size_set(sp->o_spectrum, sp->iw, sp->ih);
+ evas_object_image_alpha_set(sp->o_spectrum, 1);
+
+ evas_object_smart_member_add(sp->o_spectrum, o);
+}
+
+static void
+_e_spectrum_smart_del(Evas_Object *o)
+{
+ E_Spectrum *sp;
+
+ sp = evas_object_smart_data_get(o);
+ if (!sp) return;
+
+ evas_object_del(sp->o_spectrum);
+ evas_object_del(sp->o_event);
+ evas_object_del(sp->o_cursor);
+}
+
+static void
+_e_spectrum_smart_show(Evas_Object *o)
+{
+ E_Spectrum *sp;
+
+ sp = evas_object_smart_data_get(o);
+ if (!sp) return;
+
+ evas_object_show(sp->o_spectrum);
+ evas_object_show(sp->o_event);
+ evas_object_show(sp->o_cursor);
+}
+
+static void
+_e_spectrum_smart_hide(Evas_Object *o)
+{
+ E_Spectrum *sp;
+
+ sp = evas_object_smart_data_get(o);
+ if (!sp) return;
+
+ evas_object_hide(sp->o_spectrum);
+ evas_object_hide(sp->o_event);
+ evas_object_hide(sp->o_cursor);
+}
+
+static void
+_e_spectrum_smart_move(Evas_Object *o, Evas_Coord x, Evas_Coord y)
+{
+ E_Spectrum *sp;
+
+ sp = evas_object_smart_data_get(o);
+ if (!sp) return;
+
+ evas_object_move(sp->o_spectrum, x, y);
+ evas_object_move(sp->o_event, x, y);
+ evas_object_move(sp->o_cursor, x, y);
+}
+
+static void
+_e_spectrum_smart_resize(Evas_Object *o, Evas_Coord w, Evas_Coord h)
+{
+ E_Spectrum *sp;
+ Evas_Coord x, y;
+
+ sp = evas_object_smart_data_get(o);
+ if (!sp) return;
+
+ evas_object_image_fill_set(sp->o_spectrum, 0, 0, w, h);
+
+ evas_object_resize(sp->o_spectrum, w, h);
+ evas_object_resize(sp->o_event, w, h);
+ evas_object_resize(sp->o_cursor, w, h);
+}
+
+static void
+_e_spectrum_smart_color_set(Evas_Object *o, int r, int g, int b, int a)
+{
+ E_Spectrum *sp;
+
+ sp = evas_object_smart_data_get(o);
+ if (!sp) return;
+ evas_object_color_set(sp->o_spectrum, r, g, b, a);
+ evas_object_color_set(sp->o_event, r, g, b, a);
+ evas_object_color_set(sp->o_cursor, r, g, b, a);
+}
+
+static void
+_e_spectrum_smart_clip_set(Evas_Object *o, Evas_Object *o_clip)
+{
+ E_Spectrum *sp;
+
+ sp = evas_object_smart_data_get(o);
+ if (!sp) return;
+ evas_object_clip_set(sp->o_spectrum, o_clip);
+ evas_object_clip_set(sp->o_event, o_clip);
+ evas_object_clip_set(sp->o_cursor, o_clip);
+}
+
+static void
+_e_spectrum_smart_clip_unset(Evas_Object *o)
+{
+ E_Spectrum *sp;
+
+ sp = evas_object_smart_data_get(o);
+ if (!sp) return;
+ evas_object_clip_unset(sp->o_spectrum);
+ evas_object_clip_unset(sp->o_event);
+ evas_object_clip_unset(sp->o_cursor);
+}
+
+static void
+_e_spectrum_smart_init()
+{
+ Evas_Smart *smart;
+ if ( _e_spectrum_smart ) return;
+ _e_spectrum_smart = evas_smart_new("e_spectrum",
+ _e_spectrum_smart_add,
+ _e_spectrum_smart_del,
+ NULL, NULL, NULL, NULL, NULL,
+ _e_spectrum_smart_move,
+ _e_spectrum_smart_resize,
+ _e_spectrum_smart_show,
+ _e_spectrum_smart_hide,
+ _e_spectrum_smart_color_set,
+ _e_spectrum_smart_clip_set,
+ _e_spectrum_smart_clip_unset,
+ NULL);
+}
+
+void
+_e_spectrum_color_calc(E_Spectrum *sp, float vx, float vy, float vz, int *r, int *g, int *b)
+{
+ switch (sp->mode)
+ {
+ case E_COLOR_COMPONENT_R:
+ *r = 255 * vz;
+ *g = 255 * vy;
+ *b = 255 * vx;
+ break;
+ case E_COLOR_COMPONENT_G:
+ *r = 255 * vx;
+ *g = 255 * vz;
+ *b = 255 * vy;
+ break;
+ case E_COLOR_COMPONENT_B:
+ *r = 255 * vy;
+ *g = 255 * vx;
+ *b = 255 * vz;
+ break;
+ case E_COLOR_COMPONENT_H:
+ evas_color_hsv_to_rgb(vz * 360.0, vy, vx, r, g, b);
+ break;
+ case E_COLOR_COMPONENT_S:
+ evas_color_hsv_to_rgb(vx * 360.0, vz, vy, r, g, b);
+ break;
+ case E_COLOR_COMPONENT_V:
+ evas_color_hsv_to_rgb(vy * 360.0, vx, vz, r, g, b);
+ break;
+ default:
+ break;
+ }
+}
+
+void
+_e_spectrum_2d_color_at(E_Spectrum *sp, int x, int y, int *r, int *g, int *b)
+{
+ int rr, gg, bb, aa;
+ float h, s, v;
+
+ if (!sp || !sp->cv) return;
+
+ switch (sp->mode)
+ {
+ case E_COLOR_COMPONENT_R:
+ rr = sp->cv->r;
+ gg = (1 - (y / (double)(sp->ih))) * 255;
+ bb = (x / (double)(sp->iw)) * 255;
+ break;
+ case E_COLOR_COMPONENT_G:
+ rr = (x / (double)(sp->iw)) * 255;
+ gg = sp->cv->g;
+ bb = (1 - (y / (double)(sp->ih))) * 255;
+ break;
+ case E_COLOR_COMPONENT_B:
+ rr = (1 - (y / (double)(sp->ih))) * 255;
+ gg = (x / (double)(sp->iw)) * 255;
+ bb = sp->cv->b;
+ break;
+ case E_COLOR_COMPONENT_H:
+ h = sp->cv->h;
+ s = 1 - (y / (double)(sp->ih));
+ v = x / (double)(sp->iw);
+ evas_color_hsv_to_rgb(h, s, v, &rr, &gg, &bb);
+ break;
+ case E_COLOR_COMPONENT_S:
+ s = sp->cv->s;
+ v = 1 - (y / (double)(sp->ih));
+ h = x / (double)(sp->iw) * 360;
+ evas_color_hsv_to_rgb(h, s, v, &rr, &gg, &bb);
+ break;
+ case E_COLOR_COMPONENT_V:
+ v = sp->cv->v;
+ h = (1 - (y / (double)(sp->ih))) * 360;
+ s = x / (double)(sp->iw);
+ evas_color_hsv_to_rgb(h, s, v, &rr, &gg, &bb);
+ break;
+ }
+
+ if (r) *r = rr;
+ if (g) *g = gg;
+ if (b) *b = bb;
+}
+
+void
+_e_spectrum_update(E_Spectrum *sp)
+{
+ int i, j;
+ int r, g, b;
+ int *data;
+ float vx, vy, vz;
+ if (!sp || !sp->cv) return;
+
+ //printf("UPDATE SPECTRUM\n");
+ data = evas_object_image_data_get(sp->o_spectrum, 1);
+ if (!data) return;
+
+ switch(sp->mode)
+ {
+ case E_COLOR_COMPONENT_R:
+ vz = (float)sp->cv->r / 255;
+ break;
+ case E_COLOR_COMPONENT_G:
+ vz = (float)sp->cv->g / 255;
+ break;
+ case E_COLOR_COMPONENT_B:
+ vz = (float)sp->cv->b / 255;
+ break;
+ case E_COLOR_COMPONENT_H:
+ vz = sp->cv->h / 360;
+ break;
+ case E_COLOR_COMPONENT_S:
+ vz = sp->cv->s;
+ break;
+ case E_COLOR_COMPONENT_V:
+ vz = sp->cv->v;
+ break;
+ }
+
+ for (i = 0; i < sp->ih; i++)
+ {
+ vy = (float)i / sp->ih;
+ for (j = 0; j < sp->iw; j++)
+ {
+ vx = (float)j / sp->iw;
+ //_e_spectrum_2d_color_at(sp, j, i, &r, &g, &b);
+ _e_spectrum_color_calc(sp, vx, vy, vz, &r, &g, &b);
+ data[(i * sp->iw) + j] = (sp->cv->a << 24) | (r << 16) | (g << 8) | b;
+ }
+ }
+
+ evas_object_image_data_set(sp->o_spectrum, data);
+ evas_object_image_data_update_add(sp->o_spectrum, 0, 0, sp->iw, sp->ih);
+}
+
+
+Evas_Object *
+e_spectrum_add(Evas *e)
+{
+ _e_spectrum_smart_init();
+ return evas_object_smart_add(e, _e_spectrum_smart);
+}
+
+void
+e_spectrum_mode_set(Evas_Object *o, E_Color_Component mode)
+{
+ E_Spectrum *sp;
+
+ sp = evas_object_smart_data_get(o);
+ if (!sp) return;
+
+ if (sp->mode == mode) return;
+ sp->mode = mode;
+ _e_spectrum_update(sp);
+}
+
+E_Color_Component
+e_spectrum_mode_get(Evas_Object *o)
+{
+ E_Spectrum *sp;
+
+ sp = evas_object_smart_data_get(o);
+ if (!sp) return -1;
+
+ return sp->mode;
+}
+
+void
+e_spectrum_color_value_set(Evas_Object *o, E_Color *cv)
+{
+ E_Spectrum *sp;
+
+ sp = evas_object_smart_data_get(o);
+ if (!sp) return;
+
+ sp->cv = cv;
+ _e_spectrum_update(sp);
+}
+
+void
+e_spectrum_update(Evas_Object *o)
+{
+ E_Spectrum *sp;
+
+ sp = evas_object_smart_data_get(o);
+ if (!sp) return;
+
+ _e_spectrum_update(sp);
+}
diff --git a/src/bin/e_spectrum.h b/src/bin/e_spectrum.h
new file mode 100644
index 0000000000..8963fe0111
--- /dev/null
+++ b/src/bin/e_spectrum.h
@@ -0,0 +1,9 @@
+#ifndef E_SPECTRUM_H
+#define E_SPECTRUM_H
+
+Evas_Object *e_spectrum_add(Evas *e);
+void e_spectrum_color_value_set(Evas_Object *o, E_Color *cv);
+void e_spectrum_mode_set(Evas_Object *o, E_Color_Component mode);
+void e_spectrum_update(Evas_Object *o);
+
+#endif
diff --git a/src/bin/e_test.c b/src/bin/e_test.c
index e1e00c5756..fb92ea39fe 100644
--- a/src/bin/e_test.c
+++ b/src/bin/e_test.c
@@ -331,7 +331,7 @@ _e_test_internal(E_Container *con)
e_dialog_title_set(dia, "A Test Dialog");
o = e_icon_add(dia->win->evas);
- e_icon_file_set(o, "/home/raster/t.png");
+ e_icon_file_set(o, "/home/rephorm/scroll.png");
evas_object_resize(o, 1024, 768);
evas_object_focus_set(o, 1);
evas_object_show(o);
@@ -793,6 +793,29 @@ _e_test_internal(E_Container *con)
e_win_resize(dia->win, 400, 300);
}
+#elif 0
+static void
+_e_test_internal(E_Container *con)
+{
+ E_Dialog *dia;
+ Evas_Object *o;
+ Evas_Coord mw, mh;
+
+ dia = e_dialog_new(con);
+ e_dialog_title_set(dia, "Test Color Selector");
+ o = e_widget_csel_add(dia->win->evas);
+ evas_object_show(o);
+ e_widget_min_size_get(o, &mw, &mh);
+ e_dialog_content_set(dia, o, mw, mh);
+
+ /* buttons at the bottom */
+ e_dialog_button_add(dia, "OK", NULL, NULL, NULL);
+ e_dialog_resizable_set(dia, 1);
+ e_win_centered_set(dia->win, 1);
+ e_dialog_show(dia);
+ e_win_resize(dia->win, 460, 230);
+}
+
#else
static void
_e_test_internal(E_Container *con)
diff --git a/src/bin/e_widget_csel.c b/src/bin/e_widget_csel.c
new file mode 100644
index 0000000000..d17ac2aea9
--- /dev/null
+++ b/src/bin/e_widget_csel.c
@@ -0,0 +1,231 @@
+/*
+ * 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;
+}
+
+
+
diff --git a/src/bin/e_widget_csel.h b/src/bin/e_widget_csel.h
new file mode 100644
index 0000000000..50ce8d621a
--- /dev/null
+++ b/src/bin/e_widget_csel.h
@@ -0,0 +1,6 @@
+#ifndef E_WIDGET_CSEL_H
+#define E_WIDGET_CSEL_H
+
+Evas_Object *e_widget_csel_add(Evas *evas);
+
+#endif
diff --git a/src/bin/e_widget_cslider.c b/src/bin/e_widget_cslider.c
new file mode 100644
index 0000000000..47656c6ae4
--- /dev/null
+++ b/src/bin/e_widget_cslider.c
@@ -0,0 +1,441 @@
+/*
+ * 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_Object *o_cslider;
+ Evas_Object *o_grad;
+ Evas_Object *o_event;
+
+ int vertical;
+ int fixed;
+ E_Color_Component mode;
+ int valnum;
+ //int r, g, b, a;
+ E_Color *color;
+
+ int dragging;
+};
+
+static void _e_wid_del_hook(Evas_Object *obj);
+static void _e_wid_focus_hook(Evas_Object *obj);
+static void _e_wid_activate_hook(Evas_Object *obj);
+static void _e_wid_disable_hook(Evas_Object *obj);
+static void _e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _e_wid_value_set(Evas_Object *obj, double vx);
+static void _e_wid_update(E_Widget_Data *wd);
+static void _e_wid_update_standard(E_Widget_Data *wd);
+static void _e_wid_update_fixed(E_Widget_Data *wd);
+static void _e_wid_move(void *data, Evas_Object *o, Evas_Coord x, Evas_Coord y);
+static void _e_wid_resize(void *data, Evas_Object *o, Evas_Coord w, Evas_Coord h);
+
+static void _e_wid_cb_down(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _e_wid_cb_move(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _e_wid_cb_up(void *data, Evas *e, Evas_Object *obj, void *event_info);
+
+Evas_Object *
+e_widget_cslider_add(Evas *evas, E_Color_Component mode, E_Color *color, int vertical, int fixed)
+{
+ Evas_Object *obj, *o;
+ E_Widget_Data *wd;
+ Evas_Coord mw, mh;
+
+ obj = e_widget_add(evas);
+
+ e_widget_del_hook_set(obj, _e_wid_del_hook);
+ e_widget_focus_hook_set(obj, _e_wid_focus_hook);
+ e_widget_activate_hook_set(obj, _e_wid_activate_hook);
+ e_widget_disable_hook_set(obj, _e_wid_disable_hook);
+ wd = calloc(1, sizeof(E_Widget_Data));
+ e_widget_data_set(obj, wd);
+
+ wd->vertical = vertical;
+ wd->fixed = fixed;
+ wd->mode = mode;
+ wd->color = color;
+
+ o = edje_object_add(evas);
+ wd->o_cslider = o;
+ e_theme_edje_object_set(o, "base/theme/widgets",
+ "widgets/cslider");
+ if (wd->vertical)
+ edje_object_signal_emit(o, "e,direction,v", "");
+ else
+ edje_object_signal_emit(o, "e,direction,h", "");
+ evas_object_show(o);
+ edje_object_size_min_calc(o, &mw, &mh);
+ e_widget_min_size_set(obj, mw, mh);
+
+ e_widget_sub_object_add(obj, o);
+ evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_wid_focus_steal, obj);
+ e_widget_resize_object_set(obj, o);
+
+ // add gradient obj
+ o = evas_object_gradient_add(evas);
+ e_widget_sub_object_add(obj, o);
+
+ if (wd->vertical)
+ evas_object_gradient_angle_set(o, 180);
+ else
+ evas_object_gradient_angle_set(o, 270);
+
+ evas_object_show(o);
+ e_widget_sub_object_add(obj, o);
+ wd->o_grad = o;
+ edje_object_part_swallow(wd->o_cslider, "gradient", o);
+ evas_object_intercept_resize_callback_add(o, _e_wid_resize, wd);
+ evas_object_intercept_move_callback_add(o, _e_wid_move, wd);
+ _e_wid_update(wd);
+
+ o = evas_object_rectangle_add(evas);
+ evas_object_color_set(o, 0, 0, 0, 0);
+ evas_object_show(o);
+ evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_wid_cb_down, obj);
+ evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_MOVE, _e_wid_cb_move, obj);
+ evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP, _e_wid_cb_up, obj);
+ wd->o_event = o;
+
+ return obj;
+}
+
+static void
+_e_wid_move(void *data, Evas_Object *o, Evas_Coord x, Evas_Coord y)
+{
+ E_Widget_Data *wd = data;
+ evas_object_move(wd->o_grad, x, y);
+ evas_object_move(wd->o_event, x, y);
+}
+
+static void
+_e_wid_resize(void *data, Evas_Object *o, Evas_Coord w, Evas_Coord h)
+{
+ E_Widget_Data *wd = data;
+ if (wd->vertical)
+ evas_object_gradient_fill_set(o, 0, 0, w, h);
+ else
+ evas_object_gradient_fill_set(o, 0, 0, h, w);
+ evas_object_resize(o, w, h);
+ evas_object_resize(wd->o_event, w, h);
+}
+
+static void
+_e_wid_value_set(Evas_Object *o, double vx)
+{
+ E_Widget_Data *wd;
+ wd = e_widget_data_get(o);
+
+ switch(wd->mode)
+ {
+ case E_COLOR_COMPONENT_R:
+ wd->color->r = 255 * vx;
+ e_color_update_rgb(wd->color);
+ break;
+ case E_COLOR_COMPONENT_G:
+ wd->color->g = 255 * vx;
+ e_color_update_rgb(wd->color);
+ break;
+ case E_COLOR_COMPONENT_B:
+ wd->color->b = 255 * vx;
+ e_color_update_rgb(wd->color);
+ break;
+ case E_COLOR_COMPONENT_H:
+ wd->color->h = 360 * vx;
+ e_color_update_hsv(wd->color);
+ break;
+ case E_COLOR_COMPONENT_S:
+ wd->color->s = vx;
+ e_color_update_hsv(wd->color);
+ break;
+ case E_COLOR_COMPONENT_V:
+ wd->color->v = vx;
+ e_color_update_hsv(wd->color);
+ break;
+ }
+
+ _e_wid_update(wd);
+ e_widget_change(o);
+}
+
+void
+e_widget_cslider_color_value_set(Evas_Object *obj, E_Color *val)
+{
+ E_Widget_Data *wd;
+
+ wd = e_widget_data_get(obj);
+ wd->color = val;
+ _e_wid_update(wd);
+}
+
+void
+e_widget_cslider_update(Evas_Object *obj)
+{
+ E_Widget_Data *wd;
+
+ wd = e_widget_data_get(obj);
+
+ _e_wid_update(wd);
+}
+
+void
+e_widget_cslider_mode_set(Evas_Object *obj, E_Color_Component mode)
+{
+ E_Widget_Data *wd;
+ wd = e_widget_data_get(obj);
+ if (wd->mode == mode) return;
+ wd->mode = mode;
+ _e_wid_update(wd);
+}
+
+static void
+_e_wid_update(E_Widget_Data *wd)
+{
+ if (wd->fixed)
+ _e_wid_update_fixed(wd);
+ else
+ _e_wid_update_standard(wd);
+}
+
+static void
+_e_wid_update_standard(E_Widget_Data *wd)
+{
+ int r, g, b;
+ float h, s, v;
+ int max, min;
+ float vx;
+
+ if (!wd->color) return;
+
+ evas_object_gradient_colors_clear(wd->o_grad);
+
+ switch(wd->mode)
+ {
+ case E_COLOR_COMPONENT_R:
+ evas_object_gradient_color_add(wd->o_grad, 0, wd->color->g, wd->color->b, 255, 1);
+ evas_object_gradient_color_add(wd->o_grad, 255, wd->color->g, wd->color->b, 255, 1);
+ vx = wd->color->r / 255.0;
+ break;
+ case E_COLOR_COMPONENT_G:
+ evas_object_gradient_color_add(wd->o_grad, wd->color->r, 0, wd->color->b, 255, 1);
+ evas_object_gradient_color_add(wd->o_grad, wd->color->r, 255, wd->color->b, 255, 1);
+ vx = wd->color->g / 255.0;
+ break;
+ case E_COLOR_COMPONENT_B:
+ evas_object_gradient_color_add(wd->o_grad, wd->color->r, wd->color->g, 0, 255, 1);
+ evas_object_gradient_color_add(wd->o_grad, wd->color->r, wd->color->g, 255, 255, 1);
+ vx = wd->color->b / 255.0;
+ break;
+ case E_COLOR_COMPONENT_H:
+ evas_color_hsv_to_rgb(0, wd->color->s, wd->color->v, &max, &min, NULL);
+
+ evas_object_gradient_color_add(wd->o_grad, max, min, min, 255, 1);
+ evas_object_gradient_color_add(wd->o_grad, max, max, min, 255, 1);
+ evas_object_gradient_color_add(wd->o_grad, min, max, min, 255, 1);
+ evas_object_gradient_color_add(wd->o_grad, min, max, max, 255, 1);
+ evas_object_gradient_color_add(wd->o_grad, min, min, max, 255, 1);
+ evas_object_gradient_color_add(wd->o_grad, max, min, max, 255, 1);
+ evas_object_gradient_color_add(wd->o_grad, max, min, min, 255, 1);
+ vx = wd->color->h / 360.0;
+ break;
+ case E_COLOR_COMPONENT_S:
+ evas_color_hsv_to_rgb(wd->color->h, 0, wd->color->v, &r, &g, &b);
+ evas_object_gradient_color_add(wd->o_grad, r, g, b, 255, 1);
+ evas_color_hsv_to_rgb(wd->color->h, 1, wd->color->v, &r, &g, &b);
+ evas_object_gradient_color_add(wd->o_grad, r, g, b, 255, 1);
+ vx = wd->color->s;
+ break;
+ case E_COLOR_COMPONENT_V:
+ evas_color_hsv_to_rgb(wd->color->h, wd->color->s, 0, &r, &g, &b);
+ evas_object_gradient_color_add(wd->o_grad, r, g, b, 255, 1);
+ evas_color_hsv_to_rgb(wd->color->h, wd->color->s, 1, &r, &g, &b);
+ evas_object_gradient_color_add(wd->o_grad, r, g, b, 255, 1);
+ vx = wd->color->v;
+ break;
+ }
+
+ edje_object_part_drag_value_set(wd->o_cslider, "cursor", vx, vx);
+}
+
+void
+_e_wid_update_fixed(E_Widget_Data *wd)
+{
+ int r, g, b;
+ int max, min;
+ float vx;
+ if (!wd) return;
+
+ evas_object_gradient_colors_clear(wd->o_grad);
+ switch(wd->mode)
+ {
+ case E_COLOR_COMPONENT_R:
+ evas_object_gradient_color_add(wd->o_grad, 255, 0, 0, 255, 1);
+ evas_object_gradient_color_add(wd->o_grad, 0, 0, 0, 255, 1);
+ vx = wd->color->r / 255.0;
+ break;
+ case E_COLOR_COMPONENT_G:
+ evas_object_gradient_color_add(wd->o_grad, 0, 255, 0, 255, 1);
+ evas_object_gradient_color_add(wd->o_grad, 0, 0, 0, 255, 1);
+ vx = wd->color->g / 255.0;
+ break;
+ case E_COLOR_COMPONENT_B:
+ evas_object_gradient_color_add(wd->o_grad, 0, 0, 255, 255, 1);
+ evas_object_gradient_color_add(wd->o_grad, 0, 0, 0, 255, 1);
+ vx = wd->color->b / 255.0;
+ break;
+ case E_COLOR_COMPONENT_H:
+/*
+ * Color Stops:
+ * 0 x n n
+ * 60 x x n
+ * 120 n x n
+ * 180 n x x
+ * 240 n n x
+ * 300 x n x
+ * 360 x n n
+ */
+ min = 0;
+ max = 255;
+
+ evas_object_gradient_color_add(wd->o_grad, max, min, min, 255, 1);
+ evas_object_gradient_color_add(wd->o_grad, max, min, max, 255, 1);
+ evas_object_gradient_color_add(wd->o_grad, min, min, max, 255, 1);
+ evas_object_gradient_color_add(wd->o_grad, min, max, max, 255, 1);
+ evas_object_gradient_color_add(wd->o_grad, min, max, min, 255, 1);
+ evas_object_gradient_color_add(wd->o_grad, max, max, min, 255, 1);
+ evas_object_gradient_color_add(wd->o_grad, max, min, min, 255, 1);
+ vx = wd->color->h / 360.0;
+ break;
+ case E_COLOR_COMPONENT_S:
+ evas_object_gradient_color_add(wd->o_grad, 255, 255, 255, 255, 1);
+ evas_object_gradient_color_add(wd->o_grad, 0, 0, 0, 255, 1);
+ vx = wd->color->s;
+ break;
+ case E_COLOR_COMPONENT_V:
+ evas_object_gradient_color_add(wd->o_grad, 255, 255, 255, 255, 1);
+ evas_object_gradient_color_add(wd->o_grad, 0, 0, 0, 255, 1);
+ vx = wd->color->v;
+ break;
+ }
+
+ edje_object_part_drag_value_set(wd->o_cslider, "cursor", vx, vx);
+}
+
+static void
+_e_wid_del_hook(Evas_Object *obj)
+{
+ E_Widget_Data *wd;
+
+ wd = e_widget_data_get(obj);
+ free(wd);
+}
+
+static void
+_e_wid_focus_hook(Evas_Object *obj)
+{
+ E_Widget_Data *wd;
+
+ wd = e_widget_data_get(obj);
+ if (e_widget_focus_get(obj))
+ {
+ edje_object_signal_emit(wd->o_cslider, "focus_in", "");
+ evas_object_focus_set(wd->o_cslider, 1);
+ }
+ else
+ {
+ edje_object_signal_emit(wd->o_cslider, "focus_out", "");
+ evas_object_focus_set(wd->o_cslider, 0);
+ }
+}
+
+static void
+_e_wid_activate_hook(Evas_Object *obj)
+{
+ E_Widget_Data *wd;
+
+ wd = e_widget_data_get(obj);
+}
+
+static void
+_e_wid_disable_hook(Evas_Object *obj)
+{
+ E_Widget_Data *wd;
+
+ wd = e_widget_data_get(obj);
+ if (e_widget_disabled_get(obj))
+ edje_object_signal_emit(wd->o_cslider, "disabled", "");
+ else
+ edje_object_signal_emit(wd->o_cslider, "enabled", "");
+}
+
+static void
+_e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ e_widget_focus_steal(data);
+}
+
+static void
+_e_wid_cb_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Down *ev;
+ Evas_Object *o_wid;
+ E_Widget_Data *wd;
+ Evas_Coord ox, oy, ow, oh;
+ double val;
+
+ ev = event_info;
+
+ o_wid = data;
+ wd = e_widget_data_get(o_wid);
+ wd->dragging = 1;
+
+ evas_object_geometry_get(wd->o_grad, &ox, &oy, &ow, &oh);
+
+ if (wd->vertical)
+ val = 1 - ((ev->canvas.y - oy) / (double)oh);
+ else
+ val = (ev->canvas.x - ox) / (double)ow;
+ if (val > 1) val = 1;
+ if (val < 0) val = 0;
+ _e_wid_value_set(o_wid, val);
+}
+
+static void
+_e_wid_cb_up(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *o_wid;
+ E_Widget_Data *wd;
+
+ o_wid = data;
+ wd = e_widget_data_get(o_wid);
+ wd->dragging = 0;
+}
+
+static void
+_e_wid_cb_move(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Move *ev;
+ Evas_Object *o_wid;
+ E_Widget_Data *wd;
+
+ o_wid = data;
+ wd = e_widget_data_get(o_wid);
+ ev = event_info;
+
+ if (wd->dragging == 1)
+ {
+ Evas_Coord ox, oy, ow, oh;
+ double val;
+ evas_object_geometry_get(wd->o_grad, &ox, &oy, &ow, &oh);
+
+ if (wd->vertical)
+ val = 1 - ((ev->cur.canvas.y - oy) / (double)oh);
+ else
+ val = (ev->cur.canvas.x - ox) / (double)ow;
+ if (val > 1) val = 1;
+ if (val < 0) val = 0;
+ _e_wid_value_set(o_wid, val);
+ }
+}
diff --git a/src/bin/e_widget_cslider.h b/src/bin/e_widget_cslider.h
new file mode 100644
index 0000000000..54c87540ee
--- /dev/null
+++ b/src/bin/e_widget_cslider.h
@@ -0,0 +1,7 @@
+#ifndef E_WIDGET_CSLIDER_H
+#define E_WIDGET_CSLIDER_H
+Evas_Object * e_widget_cslider_add(Evas *e, E_Color_Component mode, E_Color *color, int vertical, int fixed);
+void e_widget_cslider_color_value_set(Evas_Object *obj, E_Color *ec);
+void e_widget_cslider_update(Evas_Object *obj);
+void e_widget_cslider_mode_set(Evas_Object *obj, E_Color_Component mode);
+#endif
diff --git a/src/bin/e_widget_spectrum.c b/src/bin/e_widget_spectrum.c
new file mode 100644
index 0000000000..7e880480a2
--- /dev/null
+++ b/src/bin/e_widget_spectrum.c
@@ -0,0 +1,313 @@
+/*
+ * 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_Object *o_edje;
+ Evas_Object *o_spectrum;
+ Evas_Object *o_event;
+
+ E_Color *cv;
+ E_Color_Component mode;
+
+ int dragging;
+};
+
+static void _e_wid_del_hook(Evas_Object *obj);
+static void _e_wid_focus_hook(Evas_Object *obj);
+static void _e_wid_activate_hook(Evas_Object *obj);
+static void _e_wid_disable_hook(Evas_Object *obj);
+static void _e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info);
+
+static void _e_wid_resize(void *data, Evas_Object *o, Evas_Coord w, Evas_Coord h);
+static void _e_wid_move(void *data, Evas_Object *o, Evas_Coord x, Evas_Coord y);
+
+static void _e_wid_mouse_handle(Evas_Object *obj, int mx, int my);
+static void _e_wid_cb_down(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _e_wid_cb_move(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _e_wid_cb_up(void *data, Evas *e, Evas_Object *obj, void *event_info);
+
+Evas_Object *
+e_widget_spectrum_add(Evas *evas, E_Color_Component mode, E_Color *cv)
+{
+ Evas_Object *obj, *o;
+ E_Widget_Data *wd;
+ Evas_Coord mw, mh;
+
+ obj = e_widget_add(evas);
+
+ e_widget_del_hook_set(obj, _e_wid_del_hook);
+ e_widget_focus_hook_set(obj, _e_wid_focus_hook);
+ e_widget_activate_hook_set(obj, _e_wid_activate_hook);
+ e_widget_disable_hook_set(obj, _e_wid_disable_hook);
+
+ wd = calloc(1, sizeof(E_Widget_Data));
+ e_widget_data_set(obj, wd);
+
+ wd->cv = cv;
+ wd->mode = mode;
+
+ o = edje_object_add(evas);
+ wd->o_edje = o;
+ e_theme_edje_object_set(o, "base/theme/widgets",
+ "widgets/spectrum");
+
+ evas_object_show(o);
+ edje_object_size_min_calc(o, &mw, &mh);
+ e_widget_min_size_set(obj, mw, mh);
+
+ e_widget_sub_object_add(obj, o);
+ evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_wid_focus_steal, obj);
+ e_widget_resize_object_set(obj, o);
+ evas_object_intercept_resize_callback_add(o, _e_wid_resize, wd);
+ evas_object_intercept_move_callback_add(o, _e_wid_move, wd);
+
+
+ o = e_spectrum_add(evas);
+ e_spectrum_color_value_set(o, cv);
+ e_spectrum_mode_set(o, mode);
+ e_widget_sub_object_add(obj, o);
+ evas_object_show(o);
+ wd->o_spectrum = o;
+ edje_object_part_swallow(wd->o_edje, "spectrum", o);
+ edje_extern_object_min_size_set(o, 100, 100);
+
+ o = evas_object_rectangle_add(evas);
+ evas_object_color_set(o, 0, 0, 0, 0);
+ evas_object_show(o);
+ evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_wid_cb_down, obj);
+ evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_MOVE, _e_wid_cb_move, obj);
+ evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP, _e_wid_cb_up, obj);
+ wd->o_event = o;
+
+ return obj;
+}
+
+void
+e_widget_spectrum_update(Evas_Object *obj, int redraw)
+{
+ E_Widget_Data *wd;
+ double vx, vy;
+
+ wd = e_widget_data_get(obj);
+ // redraw spectrum
+ if (redraw)
+ e_spectrum_update(wd->o_spectrum);
+
+ switch(wd->mode)
+ {
+ case E_COLOR_COMPONENT_R:
+ vy = wd->cv->g / 255.0;
+ vx = wd->cv->b / 255.0;
+ break;
+ case E_COLOR_COMPONENT_G:
+ vy = wd->cv->b / 255.0;
+ vx = wd->cv->r / 255.0;
+ break;
+ case E_COLOR_COMPONENT_B:
+ vy = wd->cv->r / 255.0;
+ vx = wd->cv->g / 255.0;
+ break;
+ case E_COLOR_COMPONENT_H:
+ vy = wd->cv->s;
+ vx = wd->cv->v;
+ break;
+ case E_COLOR_COMPONENT_S:
+ vy = wd->cv->v;
+ vx = wd->cv->h / 360.0;
+ break;
+ case E_COLOR_COMPONENT_V:
+ vy = wd->cv->h / 360.0;
+ vx = wd->cv->s;
+ break;
+ }
+ edje_object_part_drag_value_set(wd->o_edje, "cursor", vx, vy);
+
+}
+
+void
+e_widget_spectrum_mode_set(Evas_Object *obj, E_Color_Component mode)
+{
+ E_Widget_Data *wd;
+
+ wd = e_widget_data_get(obj);
+ if (wd->mode == mode) return;
+ wd->mode = mode;
+ e_spectrum_mode_set(wd->o_spectrum, mode);
+ e_widget_spectrum_update(obj, 0);
+}
+
+static void
+_e_wid_move(void *data, Evas_Object *o, Evas_Coord x, Evas_Coord y)
+{
+ E_Widget_Data *wd = data;
+ evas_object_move(wd->o_edje, x, y);
+ evas_object_move(wd->o_event, x, y);
+}
+
+static void
+_e_wid_resize(void *data, Evas_Object *o, Evas_Coord w, Evas_Coord h)
+{
+ E_Widget_Data *wd = data;
+ evas_object_resize(wd->o_edje, w, h);
+ evas_object_resize(wd->o_event, w, h);
+}
+
+
+static void
+_e_wid_del_hook(Evas_Object *obj)
+{
+ E_Widget_Data *wd;
+
+ wd = e_widget_data_get(obj);
+ free(wd);
+}
+
+static void
+_e_wid_focus_hook(Evas_Object *obj)
+{
+ E_Widget_Data *wd;
+
+ wd = e_widget_data_get(obj);
+ if (e_widget_focus_get(obj))
+ {
+ edje_object_signal_emit(wd->o_edje, "focus_in", "");
+ evas_object_focus_set(wd->o_edje, 1);
+ }
+ else
+ {
+ edje_object_signal_emit(wd->o_edje, "focus_out", "");
+ evas_object_focus_set(wd->o_edje, 0);
+ }
+}
+
+static void
+_e_wid_activate_hook(Evas_Object *obj)
+{
+ E_Widget_Data *wd;
+
+ wd = e_widget_data_get(obj);
+
+}
+
+static void
+_e_wid_disable_hook(Evas_Object *obj)
+{
+ E_Widget_Data *wd;
+
+ wd = e_widget_data_get(obj);
+ if (e_widget_disabled_get(obj))
+ edje_object_signal_emit(wd->o_spectrum, "disabled", "");
+ else
+ edje_object_signal_emit(wd->o_spectrum, "enabled", "");
+}
+
+static void
+_e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ e_widget_focus_steal(data);
+}
+
+static void
+_e_wid_mouse_handle(Evas_Object *obj, int mx, int my)
+{
+ E_Widget_Data *wd;
+ Evas_Coord x, y, w, h;
+ double vx, vy;
+
+ wd = e_widget_data_get(obj);
+
+ evas_object_geometry_get(wd->o_spectrum, &x, &y, &w, &h);
+ vx = (mx - x) / (double)w;
+ vy = (my - y) / (double)h;
+ if (vx > 1) vx = 1;
+ if (vx < 0) vx = 0;
+ if (vy > 1) vy = 1;
+ if (vy < 0) vy = 0;
+
+ edje_object_part_drag_value_set(wd->o_edje, "cursor", vx, vy);
+
+ switch(wd->mode)
+ {
+ case E_COLOR_COMPONENT_R:
+ wd->cv->g = vy * 255;
+ wd->cv->b = vx * 255;
+ e_color_update_rgb(wd->cv);
+ break;
+ case E_COLOR_COMPONENT_G:
+ wd->cv->b = vy * 255;
+ wd->cv->r = vx * 255;
+ e_color_update_rgb(wd->cv);
+ break;
+ case E_COLOR_COMPONENT_B:
+ wd->cv->r = vy * 255;
+ wd->cv->g = vx * 255;
+ e_color_update_rgb(wd->cv);
+ break;
+ case E_COLOR_COMPONENT_H:
+ wd->cv->s = vy;
+ wd->cv->v = vx;
+ e_color_update_hsv(wd->cv);
+ break;
+ case E_COLOR_COMPONENT_S:
+ wd->cv->v = vy;
+ wd->cv->h = vx * 360;
+ e_color_update_hsv(wd->cv);
+ break;
+ case E_COLOR_COMPONENT_V:
+ wd->cv->h = vy * 360;
+ wd->cv->s = vx;
+ e_color_update_hsv(wd->cv);
+ break;
+
+ }
+ e_widget_change(obj);
+}
+
+
+static void
+_e_wid_cb_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Down *ev;
+ Evas_Object *o_wid;
+ E_Widget_Data *wd;
+
+ o_wid = data;
+ wd = e_widget_data_get(o_wid);
+ ev = event_info;
+
+ wd->dragging = 1;
+ _e_wid_mouse_handle(o_wid, ev->canvas.x, ev->canvas.y);
+}
+
+static void
+_e_wid_cb_up(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *o_wid;
+ E_Widget_Data *wd;
+
+ o_wid = data;
+ wd = e_widget_data_get(o_wid);
+ wd->dragging = 0;
+}
+
+static void
+_e_wid_cb_move(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Move *ev;
+ Evas_Object *o_wid;
+ E_Widget_Data *wd;
+
+ o_wid = data;
+ wd = e_widget_data_get(o_wid);
+ ev = event_info;
+
+ if (wd->dragging == 1)
+ {
+ _e_wid_mouse_handle(o_wid, ev->cur.canvas.x, ev->cur.canvas.y);
+ }
+}
diff --git a/src/bin/e_widget_spectrum.h b/src/bin/e_widget_spectrum.h
new file mode 100644
index 0000000000..e929dbbb17
--- /dev/null
+++ b/src/bin/e_widget_spectrum.h
@@ -0,0 +1,6 @@
+#ifndef E_WIDGET_SPECTRUM_H
+#define E_WIDGET_SPECTRUM_H
+Evas_Object *e_widget_spectrum_add(Evas *evas, E_Color_Component mode, E_Color *cv);
+void e_widget_spectrum_mode_set(Evas_Object *obj, E_Color_Component mode);
+void e_widget_spectrum_update(Evas_Object *obj, int redraw);
+#endif