From d7eb875806f5bbdf1537531e6e8b827678a8a2f1 Mon Sep 17 00:00:00 2001 From: Gustavo Sverzut Barbieri Date: Sun, 7 Mar 2010 05:33:34 +0000 Subject: [PATCH] new color configuration dialog. The goal of this dialog is to be simpler to use and fit a small screen, however provide more useful features to the user. This was done by having one single multi-select ilist with color previews on the left (just text now, but supports solid colors as well) and a full-featured preview on the editor box. The list supports multi-select, so one can enable, disable or set colors on multiple items at the same time, avoiding the old enable/disable radios that did not make much sense. The frame label should be updated based on the items one select (if they have the same colors or are "mixed", if they are all unset). The list also uses the new feature to show an "end" icon to notify the item is customized or not. TODO: review supported/known color classes, it is as simple as changing the description array. SVN revision: 46928 --- data/themes/default.edc | 117 ++ .../conf_colors/e_int_config_color_classes.c | 1516 +++++++++-------- src/modules/conf_colors/e_mod_main.c | 14 +- 3 files changed, 887 insertions(+), 760 deletions(-) diff --git a/data/themes/default.edc b/data/themes/default.edc index 8f85d3794..170494816 100644 --- a/data/themes/default.edc +++ b/data/themes/default.edc @@ -29807,3 +29807,120 @@ MIMEBASE("application/x-font-bdf","icon_mime_font_generic.png", ".BDF", 128); } } } + +///////////////////////////////////////////////////////////////////////////// + /*** MOD: CONF_COLORS ***/ + group { + name: "e/modules/conf_colors/preview/solid"; + parts { + part { + name: "e.rect"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + color: 255 255 255 255; + color_class: "color_preview"; + rel1 { + relative: 0.0 0.0; + offset: 0 0; + } + rel2 { + relative: 1.0 1.0; + offset: -1 -1; + } + } + } + } + } + group { + name: "e/modules/conf_colors/preview/text"; + parts { + part { + name: "e.text"; + type: TEXT; + effect: OUTLINE_SOFT_SHADOW; + mouse_events: 0; + description { + state: "default" 0.0; + color: 255 255 255 255; + color2: 255 255 255 255; + color3: 255 255 255 255; + color_class: "color_preview"; + rel1 { + relative: 0.0 0.0; + offset: 0 0; + } + rel2 { + relative: 1.0 1.0; + offset: -1 -1; + } + text { + font: "Sans:style=Bold"; + size: 16; + text: "Aa"; + min: 1 1; + } + } + } + } + } + group { + name: "e/modules/conf_colors/preview/unknown"; + parts { + part { + name: "c1"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + color: 255 255 255 255; + color_class: "color_preview_c1"; + rel1 { + relative: 0.0 0.0; + offset: 0 0; + } + rel2 { + relative: 1.0 1.0; + offset: -7 -1; + } + } + } + part { + name: "c2"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + color: 255 255 255 255; + color_class: "color_preview_c2"; + rel1 { + relative: 1.0 0.0; + offset: -6 0; + } + rel2 { + relative: 1.0 1.0; + offset: -4 -1; + } + } + } + part { + name: "c3"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + color: 255 255 255 255; + color_class: "color_preview_c3"; + rel1 { + relative: 1.0 0.0; + offset: -3 0; + } + rel2 { + relative: 1.0 1.0; + offset: -1 -1; + } + } + } + } + } diff --git a/src/modules/conf_colors/e_int_config_color_classes.c b/src/modules/conf_colors/e_int_config_color_classes.c index 6f3018f72..f9342efec 100644 --- a/src/modules/conf_colors/e_int_config_color_classes.c +++ b/src/modules/conf_colors/e_int_config_color_classes.c @@ -4,867 +4,877 @@ #include "e.h" typedef struct _CFColor_Class CFColor_Class; -typedef struct _CFColor_Hash CFColor_Hash; +typedef struct _CFColor_Class_Description CFColor_Class_Description; -struct _CFColor_Hash +typedef enum { + COLOR_CLASS_UNKNOWN = 0, + COLOR_CLASS_SOLID = 1, + COLOR_CLASS_TEXT = 2 +} CFColor_Class_Type; + +struct _CFColor_Class { const char *key; const char *name; -}; -struct _CFColor_Class -{ - const char *key; - const char *name; - int enabled; + E_Color_Class *cc; - int r, g, b, a; - int r2, g2, b2, a2; - int r3, g3, b3, a3; -}; - -struct _E_Config_Dialog_Data -{ - char *cur_class; - int state; - int wm_enabled, wid_enabled, mod_enabled; - E_Color *color1, *color2, *color3; - Eina_List *classes; struct { - Evas_Object *ilist, *button; - Evas_Object *renable, *rdisable; - Evas_Object *c1, *c2, *c3; - Eina_List *disable_list; + int r[3], g[3], b[3], a[3]; + Eina_Bool changed; + Eina_Bool enabled; + } val; + + struct { + Evas_Object *icon; + Evas_Object *end; + CFColor_Class_Type type; } gui; }; -/* Key Pairs for color classes - * - * These can/should be changed to "official" key/names +struct _E_Config_Dialog_Data +{ + int state; + E_Color color[3]; + + Eina_List *classes; + Eina_List *selected; + Eina_List *changed; + + struct { + Evas *evas; + Evas_Object *ilist; + Evas_Object *frame; + Evas_Object *state; + Evas_Object *color[3]; + Evas_Object *reset; + Evas_Object *text_preview; + Eina_List *disable_list; + } gui; + + Ecore_Timer *delay_load_timer; + Ecore_Timer *delay_color_timer; + Ecore_Idler *selection_idler; + + Eina_Bool populating; +}; + +struct _CFColor_Class_Description +{ + const char *key; + size_t keylen; + const char *name; + CFColor_Class_Type type; +}; + +#define CCDESC_S(k, n) {k, sizeof(k) - 1, n, COLOR_CLASS_SOLID} +#define CCDESC_T(k, n) {k, sizeof(k) - 1, n, COLOR_CLASS_TEXT} + +/* + * TODO PRE-RELEASE: check all color classes */ -static const CFColor_Hash _wm_hash[] = +static const CFColor_Class_Description _color_classes_wm[] = { - {NULL, N_("Window Manager")}, - {"about_title", N_("About Dialog Title")}, - {"about_version", N_("About Dialog Version")}, - {"border_title", N_("Border Title")}, - {"configure_title", N_("Settings Dialog Title")}, - {"error_text", N_("Error Text")}, - {"menu_title", N_("Menu Title")}, - {"menu_title_active", N_("Menu Title Active")}, - {"menu_item", N_("Menu Item")}, - {"menu_item_active", N_("Menu Item Active")}, - {"move_text", N_("Move Text")}, - {"resize_text", N_("Resize Text")}, - {"winlist_item", N_("Winlist Item")}, - {"winlist_label", N_("Winlist Label")}, - {"winlist_title", N_("Winlist Title")}, - {NULL, NULL} + CCDESC_T("about_title", N_("About Dialog Title")), + CCDESC_T("about_version", N_("About Dialog Version")), + CCDESC_T("border_title", N_("Border Title")), + CCDESC_T("border_title_active", N_("Border Title Active")), + CCDESC_T("configure_title", N_("Settings Dialog Title")), + CCDESC_T("error_text", N_("Error Text")), + CCDESC_T("menu_title", N_("Menu Title")), + CCDESC_T("menu_title_active", N_("Menu Title Active")), + CCDESC_T("menu_item", N_("Menu Item")), + CCDESC_T("menu_item_active", N_("Menu Item Active")), + CCDESC_T("menu_item_disabled", N_("Menu Item Disabled")), + CCDESC_T("move_text", N_("Move Text")), + CCDESC_T("resize_text", N_("Resize Text")), + CCDESC_T("winlist_item", N_("Winlist Item")), + CCDESC_T("winlist_item_active", N_("Winlist Item Active")), + CCDESC_T("winlist_label", N_("Winlist Label")), + CCDESC_T("winlist_title", N_("Winlist Title")), + {NULL, 0, NULL, COLOR_CLASS_UNKNOWN} }; - -static const CFColor_Hash _wid_hash[] = +static const CFColor_Class_Description _color_classes_widgets[] = { - {NULL, N_("Widgets")}, - {"button_text", N_("Button Text")}, - {"button_text_disabled", N_("Button Text Disabled")}, - {"check_text", N_("Check Text")}, - {"check_text_disabled", N_("Check Text Disabled")}, - {"entry_text", N_("Entry Text")}, - {"label_text", N_("Label Text")}, - {"ilist_item", N_("List Item Text")}, - {"ilist_item_odd", N_("List Item Odd Text")}, - {"ilist_header", N_("List Header")}, - {"radio_text", N_("Radio Text")}, - {"radio_text_disabled", N_("Radio Text Disabled")}, - {"slider_text", N_("Slider Text")}, - {"slider_text_disabled", N_("Slider Text Disabled")}, - {NULL, NULL} + CCDESC_T("button_text", N_("Button Text")), + CCDESC_T("button_text_disabled", N_("Button Text Disabled")), + CCDESC_T("check_text", N_("Check Text")), + CCDESC_T("check_text_disabled", N_("Check Text Disabled")), + CCDESC_T("entry_text", N_("Entry Text")), + CCDESC_T("entry_text_disabled", N_("Entry Text Disabled")), + CCDESC_T("label_text", N_("Label Text")), + CCDESC_T("ilist_item", N_("List Item Text")), + CCDESC_T("ilist_item_selected", N_("List Item Text Selected")), + CCDESC_T("ilist_item_odd", N_("List Item Odd Text")), + CCDESC_T("ilist_header", N_("List Header")), + CCDESC_T("radio_text", N_("Radio Text")), + CCDESC_T("radio_text_disabled", N_("Radio Text Disabled")), + CCDESC_T("slider_text", N_("Slider Text")), + CCDESC_T("slider_text_disabled", N_("Slider Text Disabled")), + {NULL, 0, NULL, COLOR_CLASS_UNKNOWN} }; - -//xxx todo fix this crap design xxxx - -static const CFColor_Hash _mod_hash[] = +static const CFColor_Class_Description _color_classes_modules[] = { - {NULL, N_("Modules")}, - {"module_label", N_("Module Label")}, - {NULL, NULL} + CCDESC_T("module_label", N_("Module Label")), + {NULL, 0, NULL, COLOR_CLASS_UNKNOWN} }; +#undef CCDESC_S +#undef CCDESC_T -static Eina_List *color_classes; -static void *_create_data (E_Config_Dialog *cfd); -static void _free_data (E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); -static int _basic_apply_data (E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); -static Evas_Object *_basic_create_widgets (E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata); -static int _adv_apply_data (E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); -static Evas_Object *_adv_create_widgets (E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata); +static void *_create_data(E_Config_Dialog *cfd); +static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); +static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); +static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata); -static void _fill_data_hash (E_Config_Dialog_Data *cfdata, const CFColor_Hash *cfhash); -static void _fill_data_list (E_Config_Dialog_Data *cfdata); -static void _fill_data_basic (E_Config_Dialog_Data *cfdata); - -static void _load_color_classes (Evas_Object *obj, E_Config_Dialog_Data *cfdata); -static void _list_cb_change (void *data, Evas_Object *obj); -static void _update_colors (E_Config_Dialog_Data *cfdata, CFColor_Class *cc); -static void _color1_cb_change (void *data, Evas_Object *obj); -static void _color2_cb_change (void *data, Evas_Object *obj); -static void _color3_cb_change (void *data, Evas_Object *obj); -static void _button_cb (void *data, void *data2); +static void _config_color_class_free(CFColor_Class *ccc); +static void _config_color_class_icon_state_apply(CFColor_Class *ccc); +static void _config_color_class_end_state_apply(CFColor_Class *ccc); +static int _fill_data_delayed(void *data); +static int _color_changed_delay(void *data); E_Config_Dialog * -e_int_config_color_classes(E_Container *con, const char *params __UNUSED__) +e_int_config_color_classes(E_Container *con, const char *params __UNUSED__) { E_Config_Dialog *cfd; E_Config_Dialog_View *v; - + if (e_config_dialog_find("E", "appearance/colors")) return NULL; v = E_NEW(E_Config_Dialog_View, 1); if (!v) return NULL; - + v->create_cfdata = _create_data; v->free_cfdata = _free_data; v->basic.apply_cfdata = _basic_apply_data; v->basic.create_widgets = _basic_create_widgets; - v->advanced.apply_cfdata = _adv_apply_data; - v->advanced.create_widgets = _adv_create_widgets; - - cfd = - e_config_dialog_new(con, _("Colors"), "E", "appearance/colors", - "preferences-desktop-color", 0, v, NULL); + + cfd = e_config_dialog_new(con, _("Colors"), "E", "appearance/colors", + "preferences-desktop-color", 0, v, NULL); return cfd; } -static void -_fill_data(E_Config_Dialog_Data *cfdata) -{ - cfdata->cur_class = NULL; - cfdata->state = 0; - cfdata->color1 = calloc(1, sizeof(E_Color)); - cfdata->color2 = calloc(1, sizeof(E_Color)); - cfdata->color3 = calloc(1, sizeof(E_Color)); - cfdata->color1->r = 255; - cfdata->color1->g = 255; - cfdata->color1->b = 255; - cfdata->color1->a = 255; - cfdata->color2->r = 0; - cfdata->color2->g = 0; - cfdata->color2->b = 0; - cfdata->color2->a = 255; - cfdata->color3->r = 0; - cfdata->color3->g = 0; - cfdata->color3->b = 0; - cfdata->color3->a = 255; - e_color_update_rgb(cfdata->color1); - e_color_update_rgb(cfdata->color2); - e_color_update_rgb(cfdata->color3); - - color_classes = edje_color_class_list(); - - _fill_data_hash(cfdata, _wm_hash); - _fill_data_hash(cfdata, _wid_hash); - _fill_data_hash(cfdata, _mod_hash); - - _fill_data_list(cfdata); -} - -static void -_fill_data_hash(E_Config_Dialog_Data *cfdata, const CFColor_Hash *cfhash) -{ - int i; - - for (i = 0; cfhash[i].name; i++) - { - CFColor_Class *cfc; - E_Color_Class *cc; - - cfc = E_NEW(CFColor_Class, 1); - cfc->enabled = 0; - cfc->key = NULL; - - if (cfhash[i].key) - { - Eina_List *l, *l_next; - char *key; - int len = strlen(cfhash[i].key); - - EINA_LIST_FOREACH_SAFE(color_classes, l, l_next, key) - { - if (!strncmp(cfhash[i].key, key, len)) - { - E_FREE(key); - color_classes = eina_list_remove_list(color_classes, l); - } - } - - cfc->key = eina_stringshare_add(cfhash[i].key); - cfc->name = eina_stringshare_add(_(cfhash[i].name)); - cc = e_color_class_find(cfc->key); - if (cc) - { - cfc->enabled = 1; - cfc->r = cc->r; - cfc->g = cc->g; - cfc->b = cc->b; - cfc->a = cc->a; - cfc->r2 = cc->r2; - cfc->g2 = cc->g2; - cfc->b2 = cc->b2; - cfc->a2 = cc->a2; - cfc->r3 = cc->r3; - cfc->g3 = cc->g3; - cfc->b3 = cc->b3; - cfc->a3 = cc->a3; - } - else - { - cfc->r = 255; - cfc->g = 255; - cfc->b = 255; - cfc->a = 255; - cfc->r2 = 0; - cfc->g2 = 0; - cfc->b2 = 0; - cfc->a2 = 255; - cfc->r3 = 0; - cfc->g3 = 0; - cfc->b3 = 0; - cfc->a3 = 255; - } - } - else - cfc->name = eina_stringshare_add(cfhash[i].name); - - cfdata->classes = eina_list_append(cfdata->classes, cfc); - } -} - -static void -_fill_data_list(E_Config_Dialog_Data *cfdata) -{ - Eina_List *l; - CFColor_Class *cfc; - E_Color_Class *cc; - - if (eina_list_count(color_classes)) - { - cfc = E_NEW(CFColor_Class, 1); - cfc->enabled = 0; - cfc->key = NULL; - cfc->name = eina_stringshare_add(_("Other")); - - cfdata->classes = eina_list_append(cfdata->classes, cfc); - } - - for (l = color_classes; l; l = l->next) - { - cfc = E_NEW(CFColor_Class, 1); - cfc->enabled = 0; - cfc->key = eina_stringshare_add((char *) l->data); - cfc->name = eina_stringshare_add((char *) l->data); - - cc = e_color_class_find(cfc->key); - if (cc) - { - cfc->enabled = 1; - cfc->r = cc->r; - cfc->g = cc->g; - cfc->b = cc->b; - cfc->a = cc->a; - cfc->r2 = cc->r2; - cfc->g2 = cc->g2; - cfc->b2 = cc->b2; - cfc->a2 = cc->a2; - cfc->r3 = cc->r3; - cfc->g3 = cc->g3; - cfc->b3 = cc->b3; - cfc->a3 = cc->a3; - } - else - { - cfc->r = 255; - cfc->g = 255; - cfc->b = 255; - cfc->a = 255; - cfc->r2 = 0; - cfc->g2 = 0; - cfc->b2 = 0; - cfc->a2 = 255; - cfc->r3 = 0; - cfc->g3 = 0; - cfc->b3 = 0; - cfc->a3 = 255; - } - - cfdata->classes = eina_list_append(cfdata->classes, cfc); - E_FREE(l->data); - } - - color_classes = eina_list_free(color_classes); -} - -static void -_fill_data_basic(E_Config_Dialog_Data *cfdata) -{ - Eina_List *l; - int i; - - cfdata->wm_enabled = 0; - cfdata->wid_enabled = 0; - cfdata->mod_enabled = 0; - - for (l = cfdata->classes; l; l = l->next) - { - CFColor_Class *c; - - c = l->data; - if (!c) continue; - if (!c->key) continue; - for (i = 0; _wm_hash[i].name; i++) - { - if (!_wm_hash[i].key) continue; - if (strcmp(_wm_hash[i].key, c->key)) continue; - if (c->enabled) - { - cfdata->wm_enabled = 1; - break; - } - } - for (i = 0; _wid_hash[i].name; i++) - { - if (!_wid_hash[i].key) continue; - if (strcmp(_wid_hash[i].key, c->key)) continue; - if (c->enabled) - { - cfdata->wid_enabled = 1; - break; - } - } - for (i = 0; _mod_hash[i].name; i++) - { - if (!_mod_hash[i].key) continue; - if (strcmp(_mod_hash[i].key, c->key)) continue; - if (c->enabled) - { - cfdata->mod_enabled = 1; - break; - } - } - } -} - static void * -_create_data(E_Config_Dialog *cfd) +_create_data(E_Config_Dialog *cfd __UNUSED__) { - E_Config_Dialog_Data *cfdata; - - cfdata = E_NEW(E_Config_Dialog_Data, 1); - _fill_data(cfdata); + E_Config_Dialog_Data *cfdata = E_NEW(E_Config_Dialog_Data, 1); + if (!cfdata) return NULL; return cfdata; } static void -_free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) +_free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) { - while (cfdata->classes) - { - CFColor_Class *cfc; - - cfc = cfdata->classes->data; - if (!cfc) continue; - if (cfc->name) - eina_stringshare_del(cfc->name); - if (cfc->key) - eina_stringshare_del(cfc->key); - E_FREE(cfc); - - cfdata->classes = eina_list_remove_list(cfdata->classes, cfdata->classes); - } - eina_list_free(cfdata->gui.disable_list); - E_FREE(cfdata->color1); - E_FREE(cfdata->color2); - E_FREE(cfdata->color3); + CFColor_Class *ccc; + + EINA_LIST_FREE(cfdata->classes, ccc) + _config_color_class_free(ccc); + + eina_list_free(cfdata->selected); + eina_list_free(cfdata->changed); + + if (cfdata->delay_load_timer) + ecore_timer_del(cfdata->delay_load_timer); + if (cfdata->delay_color_timer) + ecore_timer_del(cfdata->delay_color_timer); + if (cfdata->selection_idler) + ecore_idler_del(cfdata->selection_idler); + E_FREE(cfdata); } static int -_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) +_color_class_list_selection_idler(void *data) { - Eina_List *l; - int i; - - for (l = cfdata->classes; l; l = l->next) - { - CFColor_Class *c; + E_Config_Dialog_Data *cfdata = data; + const Eina_List *l; + const E_Ilist_Item *it; + CFColor_Class *ccc = NULL; + const char *description; + Evas_Object *o; + char buf[256]; + unsigned int i, count; + int r[3] = {-1, -1, -1}; + int g[3] = {-1, -1, -1}; + int b[3] = {-1, -1, -1}; + int a[3] = {-1, -1, -1}; + Eina_Bool mixed[3]; + Eina_Bool unset[3]; + Eina_Bool enabled = EINA_FALSE; - c = l->data; - if (!c) continue; - if (!c->key) continue; - for (i = 0; _wm_hash[i].name; i++) - { - if (!_wm_hash[i].key) continue; - if (strcmp(_wm_hash[i].key, c->key)) continue; - c->enabled = cfdata->wm_enabled; - break; - } - for (i = 0; _wid_hash[i].name; i++) - { - if (!_wid_hash[i].key) continue; - if (strcmp(_wid_hash[i].key, c->key)) continue; - c->enabled = cfdata->wid_enabled; - break; - } - for (i = 0; _mod_hash[i].name; i++) - { - if (!_mod_hash[i].key) continue; - if (strcmp(_mod_hash[i].key, c->key)) continue; - c->enabled = cfdata->mod_enabled; - break; - } + if (cfdata->delay_color_timer) + { + ecore_timer_del(cfdata->delay_color_timer); + cfdata->delay_color_timer = NULL; + _color_changed_delay(cfdata); } - - return _adv_apply_data(cfd, cfdata); + + eina_list_free(cfdata->selected); + cfdata->selected = NULL; + + EINA_LIST_FOREACH(e_widget_ilist_items_get(cfdata->gui.ilist), l, it) + { + if ((!it->selected) || (it->header)) continue; + ccc = e_widget_ilist_item_data_get(it); + cfdata->selected = eina_list_append(cfdata->selected, ccc); + + if ((!enabled) && (ccc->val.enabled)) + enabled = EINA_TRUE; + +#define _X(_n) \ + do \ + { \ + for (i = 0; i < 3; i++) \ + { \ + if (ccc->val._n[i] >= 0) \ + { \ + if (_n[i] == -1) \ + _n[i] = ccc->val._n[i]; \ + else if ((_n[i] >= 0) && \ + (ccc->val._n[i] != _n[i])) \ + _n[i] = -2; \ + } \ + } \ + } \ + while (0) + + _X(r); + _X(g); + _X(b); + _X(a); +#undef _X + } + + for (i = 0; i < 3; i++) + { + mixed[i] = ((r[i] == -2) || (g[i] == -2) || + (b[i] == -2) || (a[i] == -2)); + + unset[i] = ((r[i] == -1) && (g[i] == -1) && + (b[i] == -1) && (a[i] == -1)); + } + + count = eina_list_count(cfdata->selected); + if ((ccc) && (count == 1)) + { + snprintf(buf, sizeof(buf), _("Color class: %s"), ccc->name); + description = buf; + } + else if (count > 1) + { + if (mixed[0] || mixed[1] || mixed[2]) + snprintf(buf, sizeof(buf), + _("Selected %u mixed colors classes"), count); + else if (unset[0] && unset[1] && unset[2]) + snprintf(buf, sizeof(buf), + _("Selected %u unset colors classes"), count); + else + snprintf(buf, sizeof(buf), + _("Selected %u uniform colors classes"), count); + description = buf; + } + else + description = _("No selected color class"); + + cfdata->populating = EINA_TRUE; + + for (i = 0; i < 3; i++) + { + if (unset[i] || mixed[i]) + r[i] = g[i] = b[i] = a[i] = 0; + + cfdata->color[i].r = r[i]; + cfdata->color[i].g = g[i]; + cfdata->color[i].b = b[i]; + cfdata->color[i].a = a[i]; + e_color_update_rgb(cfdata->color + i); + e_widget_color_well_update(cfdata->gui.color[i]); + } + + edje_object_color_class_set + (cfdata->gui.text_preview, "color_preview", + r[0], g[0], b[0], a[0], + r[1], g[1], b[1], a[1], + r[2], g[2], b[2], a[2]); + + e_widget_frametable_label_set(cfdata->gui.frame, description); + + e_widget_disabled_set(cfdata->gui.state, count == 0); + e_widget_check_checked_set(cfdata->gui.state, enabled); + + EINA_LIST_FOREACH(cfdata->gui.disable_list, l, o) + e_widget_disabled_set(o, ((!enabled) || (count == 0))); + + cfdata->populating = EINA_FALSE; + cfdata->selection_idler = NULL; + return 0; } -static Evas_Object * -_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) +static void +_color_class_list_selection_changed(void *data, Evas_Object *obj __UNUSED__) { - Evas_Object *o, *of, *ob; - E_Radio_Group *wg, *dg, *mg; + E_Config_Dialog_Data *cfdata = data; - _fill_data_basic(cfdata); - - o = e_widget_list_add(evas, 0, 0); + if (cfdata->selection_idler) + ecore_idler_del(cfdata->selection_idler); + cfdata->selection_idler = ecore_idler_add + (_color_class_list_selection_idler, cfdata); +} - of = e_widget_framelist_add(evas, _("Window Manager Colors"), 0); - wg = e_widget_radio_group_new(&(cfdata->wm_enabled)); - ob = e_widget_radio_add(evas, _("Enabled"), 1, wg); - e_widget_framelist_object_append(of, ob); - ob = e_widget_radio_add(evas, _("Disabled"), 0, wg); - e_widget_framelist_object_append(of, ob); - e_widget_list_object_append(o, of, 1, 0, 0.5); +static Eina_Bool +_config_color_class_color_reset(CFColor_Class *ccc) +{ + Eina_Bool ret = EINA_FALSE; + int *r = ccc->val.r; + int *g = ccc->val.g; + int *b = ccc->val.b; + int *a = ccc->val.a; - of = e_widget_framelist_add(evas, _("Widget Colors"), 0); - dg = e_widget_radio_group_new(&(cfdata->wid_enabled)); - ob = e_widget_radio_add(evas, _("Enabled"), 1, dg); - e_widget_framelist_object_append(of, ob); - ob = e_widget_radio_add(evas, _("Disabled"), 0, dg); - e_widget_framelist_object_append(of, ob); - e_widget_list_object_append(o, of, 1, 0, 0.5); + /* trick: use object so it will look up all 3 levels: + * 1. object (should not have) + * 2. global set values (may have) + * 3. theme file provided value (may have) + */ + if (ccc->gui.icon) + ret = edje_object_color_class_get + (ccc->gui.icon, ccc->key, + r + 0, g + 0, b + 0, a + 0, + r + 1, g + 1, b + 1, a + 1, + r + 2, g + 2, b + 2, a + 2); - of = e_widget_framelist_add(evas, _("Module Colors"), 0); - mg = e_widget_radio_group_new(&(cfdata->mod_enabled)); - ob = e_widget_radio_add(evas, _("Enabled"), 1, mg); - e_widget_framelist_object_append(of, ob); - ob = e_widget_radio_add(evas, _("Disabled"), 0, mg); - e_widget_framelist_object_append(of, ob); - e_widget_list_object_append(o, of, 1, 0, 0.5); + if (!ret) + { + unsigned int i; + for (i = 0; i < 3; i++) + { + r[i] = -1; + g[i] = -1; + b[i] = -1; + a[i] = -1; + } + } - return o; + return ret; } static int -_adv_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) +_basic_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) { - Eina_List *l; - - for (l = cfdata->classes; l; l = l->next) - { - CFColor_Class *c; - E_Color_Class *cc; - - c = l->data; - if (!c) continue; - if (!c->key) continue; + CFColor_Class *ccc; - cc = e_color_class_find(c->key); - if (!c->enabled) + if (cfdata->delay_color_timer) + { + ecore_timer_del(cfdata->delay_color_timer); + cfdata->delay_color_timer = NULL; + _color_changed_delay(cfdata); + } + + EINA_LIST_FREE(cfdata->changed, ccc) + { + ccc->val.changed = EINA_FALSE; + + if (ccc->val.enabled) { - if (cc) - e_color_class_del(c->key); + int *r = ccc->val.r; + int *g = ccc->val.g; + int *b = ccc->val.b; + int *a = ccc->val.a; + + if (ccc->cc) + { + e_color_class_instance_set + (ccc->cc, + r[0], g[0], b[0], a[0], + r[1], g[1], b[1], a[1], + r[2], g[2], b[2], a[2]); + } + else + { + ccc->cc = e_color_class_set_stringshared + (ccc->key, + r[0], g[0], b[0], a[0], + r[1], g[1], b[1], a[1], + r[2], g[2], b[2], a[2]); + } } - else + else { - e_color_class_set(c->key, c->r, c->g, c->b, c->a, - c->r2, c->g2, c->b2, c->a2, - c->r3, c->g3, c->b3, c->a3); + if (ccc->cc) + { + e_color_class_instance_del(ccc->cc); + ccc->cc = NULL; + } + _config_color_class_color_reset(ccc); + _config_color_class_icon_state_apply(ccc); } } + return 1; } -static Evas_Object * -_adv_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) +static void +_custom_color_cb_change(void *data, Evas_Object *obj) { - Evas_Object *o, *ob, *ot; + E_Config_Dialog_Data *cfdata = data; + const Eina_List *l; + CFColor_Class *ccc; + Eina_Bool enabled; + Evas_Object *o; + + if (cfdata->populating) return; + + enabled = e_widget_check_checked_get(obj); + EINA_LIST_FOREACH(cfdata->selected, l, ccc) + { + ccc->val.enabled = enabled; + _config_color_class_end_state_apply(ccc); + if (!enabled) + { + _config_color_class_color_reset(ccc); + _config_color_class_icon_state_apply(ccc); + } + + if (!ccc->val.changed) + { + ccc->val.changed = EINA_TRUE; + cfdata->changed = eina_list_append(cfdata->changed, ccc); + } + } + + EINA_LIST_FOREACH(cfdata->gui.disable_list, l, o) + e_widget_disabled_set(o, !enabled); + + _color_class_list_selection_changed(cfdata, NULL); +} + +static int +_color_changed_delay(void *data) +{ + E_Config_Dialog_Data *cfdata = data; + const Eina_List *l; + CFColor_Class *ccc; + E_Color *col; + + EINA_LIST_FOREACH(cfdata->selected, l, ccc) + _config_color_class_icon_state_apply(ccc); + + col = cfdata->color; + edje_object_color_class_set + (cfdata->gui.text_preview, "color_preview", + col[0].r, col[0].g, col[0].b, col[0].a, + col[1].r, col[1].g, col[1].b, col[1].a, + col[2].r, col[2].g, col[2].b, col[2].a); + + cfdata->delay_color_timer = NULL; + return 0; +} + +static void +_color_cb_change(void *data, Evas_Object *obj) +{ + E_Config_Dialog_Data *cfdata = data; + const Eina_List *l; + CFColor_Class *ccc; + E_Color *col; + unsigned int i; + + if (cfdata->populating) return; + + for (i = 0; i < 3; i++) + if (cfdata->gui.color[i] == obj) + break; + + if (i == 3) + { + EINA_LOG_ERR("unknown widget changed color: %p\n", obj); + return; + } + + col = cfdata->color + i; + EINA_LIST_FOREACH(cfdata->selected, l, ccc) + { + ccc->val.r[i] = col->r; + ccc->val.g[i] = col->g; + ccc->val.b[i] = col->b; + ccc->val.a[i] = col->a; + + if (!ccc->val.changed) + { + ccc->val.changed = EINA_TRUE; + cfdata->changed = eina_list_append(cfdata->changed, ccc); + } + } + + if (!cfdata->delay_color_timer) + cfdata->delay_color_timer = ecore_timer_add + (0.2, _color_changed_delay, cfdata); +} + +static Evas_Object * +_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) +{ + Evas_Object *ol, *ot, *o; Evas_Coord mw, mh; - char buf[1024]; + unsigned int i; + const Eina_List *l; - o = e_widget_list_add(evas, 0, 0); + cfdata->gui.evas = evas; - ob = e_widget_ilist_add(evas, 16, 16, NULL); - e_widget_ilist_selector_set(ob, 1); - cfdata->gui.ilist = ob; - e_widget_on_change_hook_set(ob, _list_cb_change, cfdata); - _load_color_classes(ob, cfdata); - e_widget_list_object_append(o, ob, 1, 1, 0.5); + ol = e_widget_list_add(evas, 0, 0); - snprintf(buf, sizeof(buf), _("Color settings: %s"), ""); - ot = e_widget_frametable_add(evas, buf, 0); + cfdata->gui.ilist = e_widget_ilist_add(evas, 32, 24, NULL); + e_widget_on_change_hook_set + (cfdata->gui.ilist, _color_class_list_selection_changed, cfdata); + e_widget_ilist_multi_select_set(cfdata->gui.ilist, 1); + e_widget_size_min_get(cfdata->gui.ilist, &mw, &mh); + if (mw < 200 * e_scale) mw = 200 * e_scale; + if (mh < 150 * e_scale) mh = 150 * e_scale; + e_widget_size_min_set(cfdata->gui.ilist, mw, mh); + e_widget_list_object_append(ol, cfdata->gui.ilist, 1, 1, 0.0); - cfdata->state = 0; - ob = e_widget_check_add(evas, _("Custom colors"), &(cfdata->state)); - cfdata->gui.renable = ob; -// e_widget_on_change_hook_set(ob, _custom_color_cb_change, cfdata); - e_widget_size_min_get(ob, &mw, &mh); + cfdata->gui.frame = ot = e_widget_frametable_add + (evas, _("No selected color class"), 0); + + cfdata->gui.state = o = e_widget_check_add + (evas, _("Custom colors"), &(cfdata->state)); + e_widget_on_change_hook_set(o, _custom_color_cb_change, cfdata); + e_widget_size_min_get(o, &mw, &mh); e_widget_frametable_object_append_full - (ot, ob, 0, 0, 2, 1, 1, 0, 1, 0, 0.0, 0.0, mw, mh, 9999, 9999); + (ot, o, 0, 0, 3, 1, 1, 0, 1, 0, 0.0, 0.0, mw, mh, 9999, 9999); - ob = e_widget_label_add(evas, _("Object:")); - cfdata->gui.disable_list = eina_list_append(cfdata->gui.disable_list, ob); - e_widget_size_min_get(ob, &mw, &mh); + o = e_widget_label_add(evas, _("Object:")); + cfdata->gui.disable_list = eina_list_append(cfdata->gui.disable_list, o); + e_widget_size_min_get(o, &mw, &mh); e_widget_frametable_object_append_full - (ot, ob, 0, 1, 1, 1, 0, 0, 0, 0, 1.0, 0.0, mw, mh, 9999, 9999); + (ot, o, 0, 1, 1, 1, 0, 0, 0, 0, 0.0, 0.5, mw, mh, 9999, 9999); - ob = e_widget_color_well_add(evas, cfdata->color1, 1); - cfdata->gui.disable_list = eina_list_append(cfdata->gui.disable_list, ob); - cfdata->gui.c1 = ob; - e_widget_on_change_hook_set(ob, _color1_cb_change, cfdata); - e_widget_size_min_get(ob, &mw, &mh); - if (mw < 16 * e_scale) mw = 16 * e_scale; - if (mh < 16 * e_scale) mh = 16 * e_scale; + o = e_widget_label_add(evas, _("Outline:")); + cfdata->gui.disable_list = eina_list_append(cfdata->gui.disable_list, o); + e_widget_size_min_get(o, &mw, &mh); e_widget_frametable_object_append_full - (ot, ob, 0, 1, 1, 1, 0, 0, 0, 0, 1.0, 0.0, mw, mh, 9999, 9999); + (ot, o, 1, 1, 1, 1, 0, 0, 0, 0, 0.0, 0.5, mw, mh, 9999, 9999); - ob = e_widget_label_add(evas, _("Outline:")); - cfdata->gui.disable_list = eina_list_append(cfdata->gui.disable_list, ob); - e_widget_size_min_get(ob, &mw, &mh); + o = e_widget_label_add(evas, _("Shadow:")); + cfdata->gui.disable_list = eina_list_append(cfdata->gui.disable_list, o); + e_widget_size_min_get(o, &mw, &mh); e_widget_frametable_object_append_full - (ot, ob, 0, 2, 1, 1, 0, 0, 0, 0, 1.0, 0.0, mw, mh, 9999, 9999); + (ot, o, 2, 1, 1, 1, 0, 0, 0, 0, 0.0, 0.5, mw, mh, 9999, 9999); - ob = e_widget_color_well_add(evas, cfdata->color2, 1); - cfdata->gui.disable_list = eina_list_append(cfdata->gui.disable_list, ob); - cfdata->gui.c2 = ob; - e_widget_on_change_hook_set(ob, _color2_cb_change, cfdata); - e_widget_size_min_get(ob, &mw, &mh); - if (mw < 16 * e_scale) mw = 16 * e_scale; - if (mh < 16 * e_scale) mh = 16 * e_scale; + if (mh < 32) mh = 32; + + for (i = 0; i < 3; i++) + { + o = e_widget_color_well_add_full(evas, cfdata->color + i, 1, 1); + cfdata->gui.color[i] = o; + cfdata->gui.disable_list = eina_list_append + (cfdata->gui.disable_list, o); + e_widget_on_change_hook_set(o, _color_cb_change, cfdata); + e_widget_size_min_get(o, &mw, NULL); + mw = 32 * e_scale; + e_widget_frametable_object_append_full + (ot, o, i, 2, 1, 1, 1, 1, 1, 0, 0.0, 0.0, mw, mh, 9999, 9999); + } + + o = edje_object_add(evas); + if (!e_theme_edje_object_set(o, "base/theme/widgets", + "e/modules/conf_colors/preview/text")) + { + evas_object_del(o); + } + else + { + cfdata->gui.text_preview = o; + edje_object_color_class_set + (o, "color_preview", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + edje_object_part_text_set(o, "e.text", _("Text with applied colors.")); + edje_object_size_min_calc(o, &mw, &mh); + e_widget_frametable_object_append_full + (ot, o, 0, 3, 3, 1, 0, 0, 0, 0, 0.5, 0.5, mw, mh, 9999, 9999); + } + + o = e_widget_label_add(evas, _("Colors depends on theme capabilities.")); e_widget_frametable_object_append_full - (ot, ob, 0, 2, 1, 1, 0, 0, 0, 0, 1.0, 0.0, mw, mh, 9999, 9999); + (ot, o, 0, 4, 3, 1, 0, 0, 0, 0, 0.0, 0.5, mw, mh, 9999, 9999); - ob = e_widget_label_add(evas, _("Shadow:")); - cfdata->gui.disable_list = eina_list_append(cfdata->gui.disable_list, ob); - e_widget_size_min_get(ob, &mw, &mh); - e_widget_frametable_object_append_full - (ot, ob, 0, 3, 1, 1, 0, 0, 0, 0, 1.0, 0.0, mw, mh, 9999, 9999); - - ob = e_widget_color_well_add(evas, cfdata->color3, 1); - cfdata->gui.disable_list = eina_list_append(cfdata->gui.disable_list, ob); - cfdata->gui.c3 = ob; - e_widget_on_change_hook_set(ob, _color3_cb_change, cfdata); - e_widget_size_min_get(ob, &mw, &mh); - if (mw < 16 * e_scale) mw = 16 * e_scale; - if (mh < 16 * e_scale) mh = 16 * e_scale; - e_widget_frametable_object_append_full - (ot, ob, 0, 3, 1, 1, 0, 0, 0, 0, 1.0, 0.0, mw, mh, 9999, 9999); - - ob = e_widget_button_add - (evas, _("Defaults"), NULL, _button_cb, cfdata, NULL); - cfdata->gui.disable_list = eina_list_append(cfdata->gui.disable_list, ob); - cfdata->gui.button = ob; - e_widget_frametable_object_append_full - (ot, ob, 0, 4, 2, 1, 0, 0, 0, 0, 1.0, 0.0, mw, mh, 9999, 9999); - -// _custom_color_cb_change(cfdata, NULL); + e_widget_list_object_append(ol, cfdata->gui.frame, 1, 0, 0.0); e_dialog_resizable_set(cfd->dia, 1); - return o; + e_util_win_auto_resize_fill(cfd->dia->win); + e_win_centered_set(cfd->dia->win, 1); + + cfdata->delay_load_timer = ecore_timer_add(0.15, _fill_data_delayed, cfdata); + + EINA_LIST_FOREACH(cfdata->gui.disable_list, l, o) + e_widget_disabled_set(o, 1); + + e_widget_disabled_set(cfdata->gui.state, 1); + + return ol; } -static void -_load_color_classes(Evas_Object *obj, E_Config_Dialog_Data *cfdata) +static void +_config_color_class_free(CFColor_Class *ccc) { - Eina_List *l; - Evas_Coord w, h; + eina_stringshare_del(ccc->key); + eina_stringshare_del(ccc->name); + E_FREE(ccc); +} - evas_event_freeze(evas_object_evas_get(obj)); - edje_freeze(); - e_widget_ilist_freeze(obj); - e_widget_ilist_clear(obj); - for (l = cfdata->classes; l; l = l->next) +static CFColor_Class * +_config_color_class_new(const char *key_stringshared, const char *name, E_Color_Class *cc) +{ + CFColor_Class *ccc = E_NEW(CFColor_Class, 1); + if (!ccc) return NULL; + + ccc->name = eina_stringshare_add(name); + ccc->cc = cc; + ccc->key = eina_stringshare_ref(key_stringshared); + + if (cc) { - CFColor_Class *cfc; - Evas_Object *icon; - - cfc = l->data; - if (!cfc) continue; - if (!cfc->key) - e_widget_ilist_header_append(obj, NULL, cfc->name); - else - { - if (cfc->enabled) - { - icon = e_icon_add(evas_object_evas_get(obj)); - e_util_icon_theme_set(icon, "dialog-ok-apply"); - } - else - icon = NULL; + ccc->val.r[0] = cc->r; + ccc->val.g[0] = cc->g; + ccc->val.b[0] = cc->b; + ccc->val.a[0] = cc->a; - e_widget_ilist_append(obj, icon, cfc->name, NULL, NULL, NULL); - } + ccc->val.r[1] = cc->r2; + ccc->val.g[1] = cc->g2; + ccc->val.b[1] = cc->b2; + ccc->val.a[1] = cc->a2; + + ccc->val.r[2] = cc->r3; + ccc->val.g[2] = cc->g3; + ccc->val.b[2] = cc->b3; + ccc->val.a[2] = cc->a3; + + ccc->val.enabled = EINA_TRUE; } - e_widget_ilist_go(obj); - e_widget_size_min_get(obj, &w, &h); - e_widget_size_min_set(obj, w, 300); - e_widget_ilist_thaw(obj); - edje_thaw(); - evas_event_thaw(evas_object_evas_get(obj)); -} - -static void -_radio_cb_change(void *data, Evas_Object *obj, void *event_info) -{ - E_Config_Dialog_Data *cfdata; - Eina_List *l; - Evas_Object *icon; - int n; - - cfdata = data; - if (!cfdata) return; - - n = e_widget_ilist_selected_get(cfdata->gui.ilist); - - for (l = cfdata->classes; l; l = l->next) + else { - CFColor_Class *c; - - c = l->data; - if (!c) continue; - if (!c->name) continue; - if (strcmp(c->name, cfdata->cur_class)) continue; - c->enabled = cfdata->state; - if (c->enabled) - { - icon = e_icon_add(evas_object_evas_get(cfdata->gui.ilist)); - e_util_icon_theme_set(icon, "dialog-ok-apply"); - } - else - icon = NULL; - - e_widget_ilist_nth_icon_set(cfdata->gui.ilist, n, icon); - break; + unsigned int i; + for (i = 0; i < 3; i++) + ccc->val.r[i] = ccc->val.g[i] = ccc->val.b[i] = ccc->val.a[i] = -1; + + ccc->val.enabled = EINA_FALSE; } - if (!cfdata->gui.c1) return; - if (cfdata->state == 0) + return ccc; +} + +static void +_config_color_class_icon_state_apply(CFColor_Class *ccc) +{ + if (!ccc->val.enabled) + _config_color_class_color_reset(ccc); + + if ((ccc->gui.type == COLOR_CLASS_TEXT) || + (ccc->gui.type == COLOR_CLASS_SOLID)) { - e_widget_disabled_set(cfdata->gui.c1, 1); - e_widget_disabled_set(cfdata->gui.c2, 1); - e_widget_disabled_set(cfdata->gui.c3, 1); - e_widget_disabled_set(cfdata->gui.button, 1); + edje_object_color_class_set + (ccc->gui.icon, "color_preview", + ccc->val.r[0], ccc->val.g[0], ccc->val.b[0], ccc->val.a[0], + ccc->val.r[1], ccc->val.g[1], ccc->val.b[1], ccc->val.a[1], + ccc->val.r[2], ccc->val.g[2], ccc->val.b[2], ccc->val.a[2]); } - else if (cfdata->state == 1) + else { - e_widget_disabled_set(cfdata->gui.c1, 0); - e_widget_disabled_set(cfdata->gui.c2, 0); - e_widget_disabled_set(cfdata->gui.c3, 0); - e_widget_disabled_set(cfdata->gui.button, 0); - } -} + edje_object_color_class_set + (ccc->gui.icon, "color_preview_c1", + ccc->val.r[0], ccc->val.g[0], ccc->val.b[0], ccc->val.a[0], + 0, 0, 0, 0, 0, 0, 0, 0); -static void -_list_cb_change(void *data, Evas_Object *obj) -{ - E_Config_Dialog_Data *cfdata; - Eina_List *l; - - cfdata = data; - if (!cfdata) return; - - cfdata->cur_class = (char *)e_widget_ilist_selected_label_get(obj); - e_widget_disabled_set(cfdata->gui.rdisable, 0); - e_widget_disabled_set(cfdata->gui.renable, 0); - - for (l = cfdata->classes; l; l = l->next) - { - CFColor_Class *c; - int enable = 0; - - c = l->data; - if (!c) continue; - if (!c->name) continue; - if (!strcmp(c->name, cfdata->cur_class)) - { - enable = c->enabled; - cfdata->state = enable; - if (enable) - { - e_widget_disabled_set(cfdata->gui.c1, 0); - e_widget_disabled_set(cfdata->gui.c2, 0); - e_widget_disabled_set(cfdata->gui.c3, 0); - e_widget_disabled_set(cfdata->gui.button, 0); - e_widget_radio_toggle_set(cfdata->gui.renable, 1); - e_widget_radio_toggle_set(cfdata->gui.rdisable, 0); - } - else - { - e_widget_disabled_set(cfdata->gui.c1, 1); - e_widget_disabled_set(cfdata->gui.c2, 1); - e_widget_disabled_set(cfdata->gui.c3, 1); - e_widget_disabled_set(cfdata->gui.button, 1); - e_widget_radio_toggle_set(cfdata->gui.renable, 0); - e_widget_radio_toggle_set(cfdata->gui.rdisable, 1); - } - _update_colors(cfdata, c); - break; - } - } -} + edje_object_color_class_set + (ccc->gui.icon, "color_preview_c2", + ccc->val.r[1], ccc->val.g[1], ccc->val.b[1], ccc->val.a[1], + 0, 0, 0, 0, 0, 0, 0, 0); -static void -_update_colors(E_Config_Dialog_Data *cfdata, CFColor_Class *cc) -{ - cfdata->color1->a = cc->a; - cfdata->color1->r = cc->r; - cfdata->color1->g = cc->g; - cfdata->color1->b = cc->b; - - cfdata->color2->a = cc->a2; - cfdata->color2->r = cc->r2; - cfdata->color2->g = cc->g2; - cfdata->color2->b = cc->b2; - - cfdata->color3->a = cc->a3; - cfdata->color3->r = cc->r3; - cfdata->color3->g = cc->g3; - cfdata->color3->b = cc->b3; - - e_color_update_rgb(cfdata->color1); - e_color_update_rgb(cfdata->color2); - e_color_update_rgb(cfdata->color3); - - e_widget_color_well_update(cfdata->gui.c1); - e_widget_color_well_update(cfdata->gui.c2); - e_widget_color_well_update(cfdata->gui.c3); -} - -static void -_color1_cb_change(void *data, Evas_Object *obj) -{ - E_Config_Dialog_Data *cfdata; - Eina_List *l; - - cfdata = data; - if (!cfdata) return; - - e_color_update_rgb(cfdata->color1); - - for (l = cfdata->classes; l; l = l->next) - { - CFColor_Class *c; - - c = l->data; - if (!c) continue; - if (!c->name) continue; - if (!strcmp(c->name, cfdata->cur_class)) - { - c->r = cfdata->color1->r; - c->g = cfdata->color1->g; - c->b = cfdata->color1->b; - c->a = cfdata->color1->a; - break; - } - } -} - -static void -_color2_cb_change(void *data, Evas_Object *obj) -{ - E_Config_Dialog_Data *cfdata; - Eina_List *l; - - cfdata = data; - if (!cfdata) return; - - e_color_update_rgb(cfdata->color2); - - for (l = cfdata->classes; l; l = l->next) - { - CFColor_Class *c; - - c = l->data; - if (!c) continue; - if (!c->name) continue; - if (!strcmp(c->name, cfdata->cur_class)) - { - c->r2 = cfdata->color2->r; - c->g2 = cfdata->color2->g; - c->b2 = cfdata->color2->b; - c->a2 = cfdata->color2->a; - break; - } - } -} - -static void -_color3_cb_change(void *data, Evas_Object *obj) -{ - E_Config_Dialog_Data *cfdata; - Eina_List *l; - - cfdata = data; - if (!cfdata) return; - - e_color_update_rgb(cfdata->color3); - - for (l = cfdata->classes; l; l = l->next) - { - CFColor_Class *c; - - c = l->data; - if (!c) continue; - if (!c->name) continue; - if (!strcmp(c->name, cfdata->cur_class)) - { - c->r3 = cfdata->color3->r; - c->g3 = cfdata->color3->g; - c->b3 = cfdata->color3->b; - c->a3 = cfdata->color3->a; - break; - } + edje_object_color_class_set + (ccc->gui.icon, "color_preview_c3", + ccc->val.r[2], ccc->val.g[2], ccc->val.b[2], ccc->val.a[2], + 0, 0, 0, 0, 0, 0, 0, 0); } } static void -_button_cb(void *data, void *data2) +_config_color_class_end_state_apply(CFColor_Class *ccc) { - E_Config_Dialog_Data *cfdata; - Eina_List *l; - const char *name; - - cfdata = data; - name = e_widget_ilist_selected_label_get(cfdata->gui.ilist); - if (!name) return; - - for (l = cfdata->classes; l; l = l->next) + const char *sig; + if (!ccc->gui.end) return; + sig = ccc->val.enabled ? "e,state,checked" : "e,state,unchecked"; + edje_object_signal_emit(ccc->gui.end, sig, "e"); +} + +static int +_config_color_class_sort(const void *data1, const void *data2) +{ + const CFColor_Class *ccc1 = data1, *ccc2 = data2; + return strcmp(ccc1->name, ccc2->name); +} + +static int +_color_class_sort(const void *data1, const void *data2) +{ + const E_Color_Class *cc1 = data1, *cc2 = data2; + return strcmp(cc1->name, cc2->name); +} + +static void +_fill_data_add_header(E_Config_Dialog_Data *cfdata, const char *name) +{ + e_widget_ilist_header_append(cfdata->gui.ilist, NULL, name); +} + +static void +_fill_data_add_item(E_Config_Dialog_Data *cfdata, CFColor_Class *ccc) +{ + Evas_Object *icon, *end; + + icon = edje_object_add(cfdata->gui.evas); + if (icon) { - CFColor_Class *c; - - c = l->data; - if (!c->name) continue; - if (strcmp(c->name, name)) continue; - c->r = 255; - c->g = 255; - c->b = 255; - c->a = 255; - c->r2 = 0; - c->g2 = 0; - c->b2 = 0; - c->a2 = 255; - c->r3 = 0; - c->g3 = 0; - c->b3 = 0; - c->a3 = 255; - _update_colors(cfdata, c); - break; + const char *group; + + switch (ccc->gui.type) + { + case COLOR_CLASS_TEXT: + group = "e/modules/conf_colors/preview/text"; + break; + case COLOR_CLASS_SOLID: + group = "e/modules/conf_colors/preview/solid"; + break; + default: + group = "e/modules/conf_colors/preview/unknown"; + } + + if (e_theme_edje_object_set(icon, "base/theme/widgets", group)) + { + ccc->gui.icon = icon; + _config_color_class_icon_state_apply(ccc); + } + else + { + EINA_LOG_ERR("your theme misses '%s'!", group); + evas_object_del(icon); + icon = NULL; + } + } + + end = edje_object_add(cfdata->gui.evas); + if (end) + { + if (e_theme_edje_object_set(end, "base/theme/widgets", + "e/widgets/ilist/toggle_end")) + { + ccc->gui.end = end; + _config_color_class_end_state_apply(ccc); + } + else + { + EINA_LOG_ERR("your theme misses 'e/widgets/ilist/toggle_end'!"); + evas_object_del(end); + end = NULL; + } + } + + e_widget_ilist_append_full + (cfdata->gui.ilist, icon, end, ccc->name, NULL, ccc, NULL); +} + +static void +_fill_data_add_batch(E_Config_Dialog_Data *cfdata, Eina_List **p_todo, const CFColor_Class_Description *descs) +{ + CFColor_Class *ccc; + Eina_List *batch = NULL; + const CFColor_Class_Description *itr; + + for (itr = descs; itr->key; itr++) + { + E_Color_Class *cc; + Eina_List *l, *found_node = NULL; + const char *key_stringshared = eina_stringshare_add(itr->key); + + EINA_LIST_FOREACH(*p_todo, l, cc) + { + if (cc->name == key_stringshared) + { + found_node = l; + break; + } + } + + if (!found_node) + cc = NULL; + else + { + cc = found_node->data; + *p_todo = eina_list_remove_list(*p_todo, found_node); + } + + ccc = _config_color_class_new(key_stringshared, itr->name, cc); + eina_stringshare_del(key_stringshared); + + if (ccc) + { + batch = eina_list_append(batch, ccc); + ccc->gui.type = itr->type; + } + } + + batch = eina_list_sort(batch, -1, _config_color_class_sort); + EINA_LIST_FREE(batch, ccc) + _fill_data_add_item(cfdata, ccc); +} + +static void +_fill_data(E_Config_Dialog_Data *cfdata) +{ + Eina_List *todo = eina_list_clone(e_color_class_list()); + E_Color_Class *cc; + + _fill_data_add_header(cfdata, _("Window Manager")); + _fill_data_add_batch(cfdata, &todo, _color_classes_wm); + _fill_data_add_header(cfdata, _("Widgets")); + _fill_data_add_batch(cfdata, &todo, _color_classes_widgets); + _fill_data_add_header(cfdata, _("Modules")); + _fill_data_add_batch(cfdata, &todo, _color_classes_modules); + + if (!todo) return; + _fill_data_add_header(cfdata, _("Others")); + todo = eina_list_sort(todo, -1, _color_class_sort); + EINA_LIST_FREE(todo, cc) + { + CFColor_Class *ccc; + char name[256], *d = name, *d_end = name + sizeof(name) - 1; + const char *s = cc->name; + Eina_Bool needs_upcase = EINA_TRUE; + + for (; *s && d < d_end; s++, d++) + { + if (!isalnum(*s)) + { + *d = ' '; + needs_upcase = EINA_TRUE; + } + else if (needs_upcase) + { + *d = toupper(*s); + needs_upcase = EINA_FALSE; + } + else + *d = *s; + } + *d = '\0'; + + ccc = _config_color_class_new(cc->name, name, cc); + if (!ccc) continue; + _fill_data_add_item(cfdata, ccc); } } + +static int +_fill_data_delayed(void *data) +{ + E_Config_Dialog_Data *cfdata = data; + cfdata->delay_load_timer = NULL; + _fill_data(cfdata); + return 0; +} diff --git a/src/modules/conf_colors/e_mod_main.c b/src/modules/conf_colors/e_mod_main.c index 22356fdef..01c1ea9a3 100644 --- a/src/modules/conf_colors/e_mod_main.c +++ b/src/modules/conf_colors/e_mod_main.c @@ -15,12 +15,12 @@ EAPI E_Module_Api e_modapi = }; EAPI void * -e_modapi_init(E_Module *m) +e_modapi_init(E_Module *m __UNUSED__) { - e_configure_registry_category_add("appearance", 10, _("Look"), NULL, + e_configure_registry_category_add("appearance", 10, _("Look"), NULL, "preferences-appearance"); - e_configure_registry_item_add("appearance/colors", 30, _("Colors"), NULL, - "preferences-desktop-color", + e_configure_registry_item_add("appearance/colors", 30, _("Colors"), NULL, + "preferences-desktop-color", e_int_config_color_classes); conf_module = m; e_module_delayed_set(m, 1); @@ -28,11 +28,11 @@ e_modapi_init(E_Module *m) } EAPI int -e_modapi_shutdown(E_Module *m) +e_modapi_shutdown(E_Module *m __UNUSED__) { E_Config_Dialog *cfd; - while ((cfd = e_config_dialog_get("E", "appearance/colors"))) + while ((cfd = e_config_dialog_get("E", "appearance/colors"))) e_object_del(E_OBJECT(cfd)); e_configure_registry_item_del("appearance/colors"); e_configure_registry_category_del("appearance"); @@ -41,7 +41,7 @@ e_modapi_shutdown(E_Module *m) } EAPI int -e_modapi_save(E_Module *m) +e_modapi_save(E_Module *m __UNUSED__) { return 1; }