diff --git a/data/themes/default_icons.edc b/data/themes/default_icons.edc index c489f8214..0e928fc33 100644 --- a/data/themes/default_icons.edc +++ b/data/themes/default_icons.edc @@ -29,6 +29,9 @@ images { image: "e17_pager_window.png" COMP; image: "e17_icon_right_arrow.png" COMP; + image: "e17_icon_up_arrow.png" COMP; + image: "e17_icon_down_arrow.png" COMP; + image: "e17_pointer.png" COMP; } @@ -511,6 +514,40 @@ group { } } } +group { + name: "icons/widget/up_arrow"; + parts { + part { + name: "icon"; + mouse_events: 0; + description { + state: "default" 0.0; + aspect: 0.83333333333 0.83333333333; + max: 12 10; + image { + normal: "e17_icon_up_arrow.png"; + } + } + } + } +} +group { + name: "icons/widget/down_arrow"; + parts { + part { + name: "icon"; + mouse_events: 0; + description { + state: "default" 0.0; + aspect: 0.83333333333 0.83333333333; + max: 12 10; + image { + normal: "e17_icon_down_arrow.png"; + } + } + } + } +} group { name: "icons/enlightenment/mouse"; max: 64 64; diff --git a/data/themes/images/e17_icon_down_arrow.png b/data/themes/images/e17_icon_down_arrow.png new file mode 100644 index 000000000..073fff679 Binary files /dev/null and b/data/themes/images/e17_icon_down_arrow.png differ diff --git a/data/themes/images/e17_icon_up_arrow.png b/data/themes/images/e17_icon_up_arrow.png new file mode 100644 index 000000000..1c9b756e7 Binary files /dev/null and b/data/themes/images/e17_icon_up_arrow.png differ diff --git a/src/bin/e_ilist.c b/src/bin/e_ilist.c index 68df4f2fb..3b7504126 100644 --- a/src/bin/e_ilist.c +++ b/src/bin/e_ilist.c @@ -296,6 +296,29 @@ e_ilist_remove_label(Evas_Object *obj, const char *label) } } +EAPI const char * +e_ilist_nth_label_get(Evas_Object *obj, int n) +{ + E_Smart_Item *si; + + API_ENTRY return NULL; + if (!sd->items) return NULL; + si = evas_list_nth(sd->items, n); + if (si) return edje_object_part_text_get(si->base_obj, "label"); + return NULL; +} + +EAPI void +e_ilist_nth_label_set(Evas_Object *obj, int n, const char *label) +{ + E_Smart_Item *si; + + API_ENTRY return; + if (!sd->items) return; + si = evas_list_nth(sd->items, n); + if (si) edje_object_part_text_set(si->base_obj, "label", label); +} + EAPI int e_ilist_count(Evas_Object *obj) { diff --git a/src/bin/e_ilist.h b/src/bin/e_ilist.h index 36995f130..7f11ba67c 100644 --- a/src/bin/e_ilist.h +++ b/src/bin/e_ilist.h @@ -20,6 +20,8 @@ EAPI void e_ilist_selector_set (Evas_Object *obj, int selector) EAPI int e_ilist_selector_get (Evas_Object *obj); EAPI void e_ilist_remove_num (Evas_Object *obj, int n); EAPI void e_ilist_remove_label (Evas_Object *obj, const char *label); +EAPI const char *e_ilist_nth_label_get (Evas_Object *obj, int n); +EAPI void e_ilist_nth_label_set (Evas_Object *obj, int n, const char *label); EAPI int e_ilist_count (Evas_Object *obj); EAPI void e_ilist_clear (Evas_Object *obj); diff --git a/src/bin/e_int_config_fonts.c b/src/bin/e_int_config_fonts.c index 8cdacf563..48d13a94d 100644 --- a/src/bin/e_int_config_fonts.c +++ b/src/bin/e_int_config_fonts.c @@ -3,28 +3,24 @@ */ #include "e.h" -#define CLASS_ENABLED 0 -#define CLASS_DISABLED 1 - typedef struct _E_Text_Class_Pair E_Text_Class_Pair; typedef struct _CFText_Class CFText_Class; -typedef struct _E_Widget_Data E_Widget_Data; 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 _ilist_cb_change(void *data, Evas_Object *obj); -static void _enabled_cb_change(void *data, Evas_Object *obj); +static void _ilist_font_cb_change(void *data, Evas_Object *obj); +static void _enabled_font_cb_change(void *data, Evas_Object *obj); - -struct _E_Widget_Data -{ - E_Radio_Group *group; - Evas_Object *o_radio; - int valnum; -}; +static void _ilist_fallback_cb_change(void *data, Evas_Object *obj); +static void _enabled_fallback_cb_change(void *data, Evas_Object *obj); +static void _button_fallback_cb_add(void *data, void *obj); +static void _button_fallback_cb_remove(void *data, void *obj); +static void _button_fallback_cb_up(void *data, void *obj); +static void _button_fallback_cb_down(void *data, void *obj); +static void _list_select_num(E_Config_Dialog_Data *cfdata, int indx); struct _E_Text_Class_Pair { @@ -84,19 +80,29 @@ struct _E_Config_Dialog_Data int cur_index; /* Font Fallbacks */ - Evas_List *font_fallbacks; - int fallbacks_state; + char *cur_fallback; + int cur_fallbacks_enabled; /* Font Hinting */ int hinting; struct { + /* Font Classes */ Evas_Object *class_list; Evas_Object *font; Evas_Object *size; Evas_Object *enabled; + + /* Font Fallbacks */ + Evas_Object *fallback_list; /* Selecting a list entry starts edit*/ + + Evas_Object *fallback; /* Text Entry */ + Evas_Object *fallback_up; /* Move selected list entry up */ + Evas_Object *fallback_down; /* Move selected list entry down */ + Evas_Object *fallback_add; /* create and select a new list entry */ + Evas_Object *fallback_remove; /* remove the selected entry */ } gui; }; @@ -121,13 +127,13 @@ e_int_config_fonts(E_Container *con) static void _fill_data(E_Config_Dialog_Data *cfdata) { - Evas_List *enabled_list; + Evas_List *font_list; Evas_List *next; E_Font_Default *efd; CFText_Class *tc; int i; - enabled_list = e_font_default_list(); + font_list = e_font_default_list(); /* Fill out the font list */ for (i = 0; text_class_predefined_names[i].class_name; i++ ) @@ -140,7 +146,7 @@ _fill_data(E_Config_Dialog_Data *cfdata) tc->size = 0; tc->enabled = 0; - for (next = enabled_list; next ; next = next->next) + for (next = font_list; next ; next = next->next) { efd = next->data; @@ -173,6 +179,8 @@ _fill_data(E_Config_Dialog_Data *cfdata) /* Fill Hinting */ cfdata->hinting = e_config->font_hinting; + /* Font fallbacks configured in widgets */ + return; } @@ -201,12 +209,14 @@ _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) evas_stringshare_del(tc->font); E_FREE(tc); } + free(cfdata); } static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) { + int i; Evas_List *next; CFText_Class *tc; @@ -234,6 +244,19 @@ _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) } } + /* Fallbacks configure */ + e_font_fallback_clear(); + + if (cfdata->cur_fallbacks_enabled) + { + for (i = 0; i < e_widget_ilist_count(cfdata->gui.fallback_list); i++) + { + const char *fallback; + fallback = e_widget_ilist_nth_label_get(cfdata->gui.fallback_list, i); + if (fallback != NULL && strlen(fallback) > 0) + e_font_fallback_append(fallback); + } + } e_font_apply(); /* Apply Hinting */ @@ -259,7 +282,7 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf of = e_widget_frametable_add(evas, _("Font Class Configuration"), 0); cfdata->gui.class_list = e_widget_ilist_add(evas, 16, 16, NULL); e_widget_min_size_set(cfdata->gui.class_list, 100, 100); - e_widget_on_change_hook_set(cfdata->gui.class_list, _ilist_cb_change, cfdata); + e_widget_on_change_hook_set(cfdata->gui.class_list, _ilist_font_cb_change, cfdata); /* Fill In Ilist */ for (i = 0; i < evas_list_count(cfdata->text_classes); i++) @@ -319,7 +342,7 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf e_widget_frametable_object_append(of, cfdata->gui.enabled, 1, 3, 2, 1, 1, 1, 1, 1); - e_widget_on_change_hook_set(cfdata->gui.enabled, _enabled_cb_change, cfdata); + e_widget_on_change_hook_set(cfdata->gui.enabled, _enabled_font_cb_change, cfdata); e_widget_list_object_append(o, of, 1, 1, 0.5); @@ -342,13 +365,99 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf ob = e_widget_radio_add(evas, _("None"), 2, rg); e_widget_disabled_set(ob, !option_enable); e_widget_framelist_object_append(of, ob); - + + e_widget_list_object_append(o, of, 1, 1, 0.5); + + /* Create Fallbacks Widgets */ + option_enable = (e_font_fallback_list() != NULL); + of = e_widget_frametable_add(evas, _("Font Fallbacks"), 1); + + ob = e_widget_button_add(evas, _("Move Up"), "widget/up_arrow", _button_fallback_cb_up, cfdata, NULL); + cfdata->gui.fallback_up = ob; + e_widget_disabled_set(ob, 1); + e_widget_frametable_object_append( of, + ob, + 1, 0, 1, 1, + 1, 1, 1, 1); + + + ob = e_widget_button_add(evas, _("Move Down"), "widget/down_arrow", _button_fallback_cb_down, cfdata, NULL); + cfdata->gui.fallback_down = ob; + e_widget_disabled_set(ob, 1); + e_widget_frametable_object_append( of, + ob, + 1, 3, 1, 1, + 1, 1, 1, 1); + + + cfdata->gui.fallback_list = e_widget_ilist_add(evas, 16, 16, NULL); + e_widget_disabled_set(cfdata->gui.fallback_list, !option_enable); + e_widget_min_size_set(cfdata->gui.fallback_list, 100, 100); + e_widget_on_change_hook_set(cfdata->gui.fallback_list, _ilist_fallback_cb_change, cfdata); + /* Fill In Ilist */ + for (i = 0; i < evas_list_count(e_font_fallback_list()); i++) + { + E_Font_Fallback *eff; + + eff = evas_list_nth(e_font_fallback_list(), i); + e_widget_ilist_append(cfdata->gui.fallback_list, NULL, eff->name, NULL, NULL, NULL); + } + e_widget_ilist_go(cfdata->gui.fallback_list); + e_widget_frametable_object_append( of, + cfdata->gui.fallback_list, + 2, /* Col Start*/ + 0, /* Row Start */ + 1, /* Col Span*/ + 4, /* Row Span*/ + 1, 1, 1, 1); + + ob = e_widget_label_add(evas, _("Fallback Name")); + e_widget_frametable_object_append( of, + ob, + 0, 0, 1, 1, + 1, 1, 1, 1); + + cfdata->gui.fallback = e_widget_entry_add(evas, &(cfdata->cur_fallback)); + e_widget_disabled_set(cfdata->gui.fallback, !option_enable); + e_widget_min_size_set(cfdata->gui.fallback, 100, 25); + e_widget_frametable_object_append(of, cfdata->gui.fallback, + 0, 1, 1, 1, + 1, 1, 1, 1); + + cfdata->gui.fallback_add = e_widget_button_add(evas, _("Add"), NULL, _button_fallback_cb_add, cfdata, NULL); + e_widget_disabled_set(cfdata->gui.fallback_add, !option_enable); + e_widget_frametable_object_append( of, + cfdata->gui.fallback_add, + 1, 1, 1, 1, + 1, 1, 1, 1); + + cfdata->gui.fallback_remove = e_widget_button_add(evas, _("Remove"), NULL, _button_fallback_cb_remove, cfdata, NULL); + e_widget_disabled_set(cfdata->gui.fallback_remove, !option_enable); + e_widget_frametable_object_append( of, + cfdata->gui.fallback_remove , + 1, 2, 1, 1, + 1, 1, 1, 1); + + ob = e_widget_check_add(evas, _("Enable Fallbacks"), &(cfdata->cur_fallbacks_enabled)); + e_widget_frametable_object_append(of, ob, + 0, 3, 1, 1, + 1, 1, 1, 1); + e_widget_check_checked_set(ob, option_enable); + e_widget_on_change_hook_set(ob, _enabled_fallback_cb_change, cfdata); + + if (e_widget_ilist_count(cfdata->gui.fallback_list) > 0) + { + e_widget_ilist_selected_set(cfdata->gui.fallback_list, 0); + } + e_widget_list_object_append(o, of, 1, 1, 0.5); return o; } +/* Private Font Class Functions */ + static void -_ilist_cb_change(void *data, Evas_Object *obj) +_ilist_font_cb_change(void *data, Evas_Object *obj) { int indx; E_Config_Dialog_Data *cfdata; @@ -383,7 +492,7 @@ _ilist_cb_change(void *data, Evas_Object *obj) } static void -_enabled_cb_change(void *data, Evas_Object *obj) +_enabled_font_cb_change(void *data, Evas_Object *obj) { E_Config_Dialog_Data *cfdata; cfdata = data; @@ -400,3 +509,173 @@ _enabled_cb_change(void *data, Evas_Object *obj) e_widget_disabled_set(cfdata->gui.size, 1); } } + +/* Private Font Fallback Functions */ +static void _ilist_fallback_cb_change(void *data, Evas_Object *obj) +{ + int indx; + E_Config_Dialog_Data *cfdata; + + cfdata = data; + if (!cfdata) return; + + indx = e_widget_ilist_selected_get(cfdata->gui.fallback_list); + _list_select_num(cfdata, indx); +} +static void _enabled_fallback_cb_change(void *data, Evas_Object *obj) +{ + E_Config_Dialog_Data *cfdata; + + cfdata = data; + if (!cfdata) return; + + if (cfdata->cur_fallbacks_enabled) + { + e_widget_disabled_set(cfdata->gui.fallback_list, 0); + e_widget_disabled_set(cfdata->gui.fallback_add, 0); + e_widget_disabled_set(cfdata->gui.fallback, 0); + } + else + { + _list_select_num(cfdata, -1); + e_widget_disabled_set(cfdata->gui.fallback_list, 1); + e_widget_disabled_set(cfdata->gui.fallback, 1); + e_widget_disabled_set(cfdata->gui.fallback_add, 1); + } +} +static void _button_fallback_cb_add(void *data, void *obj) +{ + E_Config_Dialog_Data *cfdata; + + cfdata = data; + if (!cfdata) return; + + if (cfdata->cur_fallback && strlen(cfdata->cur_fallback) > 0) + { + int count; + int i; + + /* If it already esists just select the existing one */ + for (i = 0; i < e_widget_ilist_count(cfdata->gui.fallback_list); i++) + { + const char *fallback; + fallback = e_widget_ilist_nth_label_get(cfdata->gui.fallback_list, i); + if ( fallback != NULL && + strlen(fallback) > 0 && + !strcmp(fallback, cfdata->cur_fallback) ) + { + e_widget_ilist_selected_set(cfdata->gui.fallback_list, i); + return; + } + } + + e_widget_ilist_append(cfdata->gui.fallback_list, NULL, cfdata->cur_fallback, NULL, NULL, NULL); + e_widget_ilist_go(cfdata->gui.fallback_list); + count = e_widget_ilist_count(cfdata->gui.fallback_list); + e_widget_ilist_selected_set(cfdata->gui.fallback_list, count - 1); + + e_widget_entry_text_set(cfdata->gui.fallback, ""); + } +} + +static void _button_fallback_cb_remove(void *data, void *obj) +{ + int indx; + int count; + E_Config_Dialog_Data *cfdata; + + cfdata = data; + if (!cfdata) return; + + indx = e_widget_ilist_selected_get(cfdata->gui.fallback_list); + count = e_widget_ilist_count(cfdata->gui.fallback_list); + + e_widget_ilist_remove_num(cfdata->gui.fallback_list, indx); + + e_widget_ilist_go(cfdata->gui.fallback_list); + e_widget_ilist_selected_set(cfdata->gui.fallback_list, indx); + if (count == 1) + { + _list_select_num(cfdata, -1); + } +} +static void _button_fallback_cb_up(void *data, void *obj) +{ + E_Config_Dialog_Data *cfdata; + int idx_sel; + const char *label_sel; + const char *label_rep; + + cfdata = data; + if (!cfdata) return; + + idx_sel = e_widget_ilist_selected_get(cfdata->gui.fallback_list); + + label_sel = e_widget_ilist_nth_label_get(cfdata->gui.fallback_list, idx_sel); + label_rep = e_widget_ilist_nth_label_get(cfdata->gui.fallback_list, idx_sel - 1); + + e_widget_ilist_nth_label_set(cfdata->gui.fallback_list, idx_sel - 1, label_sel); + e_widget_ilist_nth_label_set(cfdata->gui.fallback_list, idx_sel, label_rep); + + e_widget_ilist_selected_set(cfdata->gui.fallback_list, idx_sel - 1); +} +static void _button_fallback_cb_down(void *data, void *obj) +{ + E_Config_Dialog_Data *cfdata; + int idx_sel; + const char *label_sel; + const char *label_rep; + + cfdata = data; + if (!cfdata) return; + + idx_sel = e_widget_ilist_selected_get(cfdata->gui.fallback_list); + + label_sel = e_widget_ilist_nth_label_get(cfdata->gui.fallback_list, idx_sel); + label_rep = e_widget_ilist_nth_label_get(cfdata->gui.fallback_list, idx_sel + 1); + + e_widget_ilist_nth_label_set(cfdata->gui.fallback_list, idx_sel + 1, label_sel); + e_widget_ilist_nth_label_set(cfdata->gui.fallback_list, idx_sel, label_rep); + + e_widget_ilist_selected_set(cfdata->gui.fallback_list, idx_sel + 1); +} + +static void _list_select_num(E_Config_Dialog_Data *cfdata, int indx) +{ + int count; + + /* Disable selecting the list while we are disabled */ + if (indx >= 0 && !cfdata->cur_fallbacks_enabled) return; + + count = e_widget_ilist_count(cfdata->gui.fallback_list); + + if (count == 0 || indx < 0) + { + e_widget_disabled_set(cfdata->gui.fallback_remove, 1); + } + else + { + e_widget_disabled_set(cfdata->gui.fallback_remove, 0); + } + + if (count == 1 || indx < 0) + { + e_widget_disabled_set(cfdata->gui.fallback_up, 1); + e_widget_disabled_set(cfdata->gui.fallback_down, 1); + } + else if (indx == 0) + { + e_widget_disabled_set(cfdata->gui.fallback_up, 1); + e_widget_disabled_set(cfdata->gui.fallback_down, 0); + } + else if (indx + 1 == count) + { + e_widget_disabled_set(cfdata->gui.fallback_up, 0); + e_widget_disabled_set(cfdata->gui.fallback_down, 1); + } + else + { + e_widget_disabled_set(cfdata->gui.fallback_up, 0); + e_widget_disabled_set(cfdata->gui.fallback_down, 0); + } +} diff --git a/src/bin/e_widget_ilist.c b/src/bin/e_widget_ilist.c index 4623e3bf2..169f42dd0 100644 --- a/src/bin/e_widget_ilist.c +++ b/src/bin/e_widget_ilist.c @@ -166,6 +166,24 @@ e_widget_ilist_remove_label(Evas_Object *obj, const char *label) e_ilist_remove_label(wd->o_ilist, label); } +EAPI const char * +e_widget_ilist_nth_label_get(Evas_Object *obj, int n) +{ + E_Widget_Data *wd; + + wd = e_widget_data_get(obj); + return e_ilist_nth_label_get(wd->o_ilist, n); +} + +EAPI void +e_widget_ilist_nth_label_set(Evas_Object *obj, int n, const char *label) +{ + E_Widget_Data *wd; + + wd = e_widget_data_get(obj); + e_ilist_nth_label_set(wd->o_ilist, n, label); +} + EAPI int e_widget_ilist_count(Evas_Object *obj) { @@ -179,8 +197,9 @@ EAPI void e_widget_ilist_clear(Evas_Object *obj) { E_Widget_Data *wd; +/* int mw, mh, vw, vh, w, h; - + */ wd = e_widget_data_get(obj); e_ilist_clear(wd->o_ilist); diff --git a/src/bin/e_widget_ilist.h b/src/bin/e_widget_ilist.h index c7aba584f..342d6aeb4 100644 --- a/src/bin/e_widget_ilist.h +++ b/src/bin/e_widget_ilist.h @@ -16,6 +16,8 @@ EAPI int e_widget_ilist_selected_get(Evas_Object *obj); EAPI const char *e_widget_ilist_selected_label_get(Evas_Object *obj); EAPI void e_widget_ilist_remove_num(Evas_Object *obj, int n); EAPI void e_widget_ilist_remove_label(Evas_Object *obj, const char *label); +EAPI const char *e_widget_ilist_nth_label_get(Evas_Object *obj, int n); +EAPI void e_widget_ilist_nth_label_set(Evas_Object *obj, int n, const char *label); EAPI int e_widget_ilist_count(Evas_Object *obj); EAPI void e_widget_ilist_clear(Evas_Object *obj);