Rework of the ilist widget.

- Added ability to optionally do multi-select and range-select.
   - Update Font Config Dialog to allow multi-select & setting of fonts in batch.

No changes should be necessary for existing apps/dialogs that use ilist. If
you would like to implement multi-select in something, have a look at the
font config dialog for usage.


SVN revision: 27875
This commit is contained in:
Christopher Michael 2007-01-08 19:23:21 +00:00
parent ed8c48f4ae
commit 332f1bc2ce
5 changed files with 737 additions and 530 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,36 +1,54 @@
/*
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#ifdef E_TYPEDEFS
typedef struct _E_Ilist_Item E_Ilist_Item;
#else
#ifndef E_ILIST_H
#define E_ILIST_H
struct _E_Ilist_Item
{
void *sd;
Evas_Object *o_base;
Evas_Object *o_icon;
unsigned char header : 1;
unsigned char selected : 1;
void (*func) (void *data, void *data2);
void (*func_hilight) (void *data, void *data2);
void *data, *data2;
};
EAPI Evas_Object *e_ilist_add (Evas *evas);
EAPI void e_ilist_icon_size_set (Evas_Object *obj, Evas_Coord w, Evas_Coord h);
EAPI void e_ilist_append (Evas_Object *obj, Evas_Object *icon, const char *label, int header, void (*func) (void *data, void *data2), void (*func_hilight) (void *data, void *data2), void *data, void *data2);
EAPI void e_ilist_clear (Evas_Object *obj);
EAPI void e_ilist_freeze (Evas_Object *obj);
EAPI void e_ilist_thaw (Evas_Object *obj);
EAPI int e_ilist_count (Evas_Object *obj);
EAPI int e_ilist_selector_get (Evas_Object *obj);
EAPI void e_ilist_selector_set (Evas_Object *obj, int selector);
EAPI int e_ilist_multi_select_get (Evas_Object *obj);
EAPI void e_ilist_multi_select_set (Evas_Object *obj, int multi);
EAPI void e_ilist_min_size_get (Evas_Object *obj, Evas_Coord *w, Evas_Coord *h);
EAPI void e_ilist_unselect (Evas_Object *obj);
EAPI void e_ilist_selected_set (Evas_Object *obj, int n);
EAPI int e_ilist_selected_get (Evas_Object *obj);
EAPI const char *e_ilist_selected_label_get (Evas_Object *obj);
EAPI void *e_ilist_selected_data_get (Evas_Object *obj);
EAPI void *e_ilist_selected_data2_get (Evas_Object *obj);
EAPI Evas_Object *e_ilist_selected_icon_get (Evas_Object *obj);
EAPI void e_ilist_selected_geometry_get (Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h);
EAPI void e_ilist_min_size_get (Evas_Object *obj, Evas_Coord *w, Evas_Coord *h);
EAPI void e_ilist_selector_set (Evas_Object *obj, int selector);
EAPI int e_ilist_selector_get (Evas_Object *obj);
EAPI void e_ilist_unselect (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 void e_ilist_nth_icon_set (Evas_Object *obj, int n, Evas_Object *icon);
EAPI Evas_Object *e_ilist_nth_icon_get (Evas_Object *obj, int n);
EAPI Evas_Object *e_ilist_selected_icon_get (Evas_Object *obj);
EAPI int e_ilist_count (Evas_Object *obj);
EAPI void e_ilist_clear (Evas_Object *obj);
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 Evas_Object *e_ilist_nth_icon_get (Evas_Object *obj, int n);
EAPI void e_ilist_nth_icon_set (Evas_Object *obj, int n, Evas_Object *icon);
EAPI int e_ilist_nth_is_header (Evas_Object *obj, int n);
EAPI void e_ilist_freeze (Evas_Object *obj);
EAPI void e_ilist_thaw (Evas_Object *obj);
EAPI void e_ilist_icon_size_set (Evas_Object *obj, Evas_Coord w, Evas_Coord h);
EAPI Evas_List *e_ilist_items_get (Evas_Object *obj);
EAPI void e_ilist_multi_select (Evas_Object *obj, int n);
EAPI void e_ilist_range_select (Evas_Object *obj, int n);
#endif
#endif

View File

@ -21,6 +21,8 @@ static void _ilist_font_cb_change(void *data, Evas_Object *obj);
static void _enabled_font_cb_change(void *data, Evas_Object *obj);
static void _enabled_fallback_cb_change(void *data, Evas_Object *obj);
static int _sort_fonts(void *data1, void *data2);
static void _size_cb_change(void *data, Evas_Object *obj);
static void _font_cb_change(void *data, Evas_Object *obj);
struct _E_Text_Class_Pair
{
@ -193,13 +195,10 @@ _fill_data(E_Config_Dialog_Data *cfdata)
tc->font = evas_stringshare_add(efd->font);
else
tc->font = evas_stringshare_add("");
tc->size = efd->size;
}
else
{
tc->font = evas_stringshare_add("");
}
tc->font = evas_stringshare_add("");
}
}
@ -209,9 +208,6 @@ _fill_data(E_Config_Dialog_Data *cfdata)
/* Fill Hinting */
cfdata->hinting = e_config->font_hinting;
/* Font fallbacks configured in widgets */
return;
}
@ -274,7 +270,6 @@ _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
}
e_font_apply();
return 1;
}
@ -294,6 +289,7 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf
/* Create Font Class Widgets */
of = e_widget_framelist_add(evas, _("Font Classes"), 0);
cfdata->gui.class_list = e_widget_ilist_add(evas, 16, 16, NULL);
e_widget_ilist_multi_select_set(cfdata->gui.class_list, 1);
e_widget_min_size_set(cfdata->gui.class_list, 100, 250);
e_widget_on_change_hook_set(cfdata->gui.class_list, _ilist_font_cb_change, cfdata);
_fill_ilist(cfdata);
@ -312,6 +308,7 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf
cfdata->gui.size = e_widget_slider_add(evas, 1, 0, _("%2.1f pixels"), 5.0, 25.0, 0.5, 0, &(cfdata->cur_size), NULL, 25);
e_widget_disabled_set(cfdata->gui.size, 1);
e_widget_min_size_set(cfdata->gui.size, 180, 25);
e_widget_on_change_hook_set(cfdata->gui.size, _size_cb_change, cfdata);
e_widget_table_object_append(ott, cfdata->gui.size,
1, 1, 1, 1, 1, 0, 1, 0);
e_widget_table_object_append(ot, ott,
@ -319,6 +316,7 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf
of = e_widget_framelist_add(evas, _("Fonts"), 0);
cfdata->gui.font_list = e_widget_ilist_add(evas, 16, 16, &(cfdata->cur_font));
e_widget_on_change_hook_set(cfdata->gui.font_list, _font_cb_change, cfdata);
evas_event_freeze(evas_object_evas_get(cfdata->gui.font_list));
edje_freeze();
e_widget_ilist_freeze(cfdata->gui.font_list);
@ -352,7 +350,6 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf
e_widget_table_object_append(ot, of, 1, 1, 2, 4, 1, 1, 1, 1);
e_widget_list_object_append(o, ot, 1, 1, 0.5);
return o;
}
@ -376,9 +373,7 @@ _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
for (next = cfdata->text_classes; next; next = next->next)
{
tc = next->data;
if (!tc->class_name) continue;
if (tc->enabled && tc->font)
e_font_default_set(tc->class_name, tc->font, tc->size);
else
@ -404,7 +399,6 @@ _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
e_config->font_hinting = cfdata->hinting;
e_config_save_queue();
e_canvas_rehint();
return 1;
}
@ -425,6 +419,7 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data
/* Create Font Class Widgets */
of = e_widget_frametable_add(evas, _("Font Class Configuration"), 0);
cfdata->gui.class_list = e_widget_ilist_add(evas, 16, 16, NULL);
e_widget_ilist_multi_select_set(cfdata->gui.class_list, 1);
e_widget_min_size_set(cfdata->gui.class_list, 100, 100);
e_widget_on_change_hook_set(cfdata->gui.class_list, _ilist_font_cb_change, cfdata);
_fill_ilist(cfdata);
@ -442,6 +437,7 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data
1, 2, 1, 1, 1, 1, 1, 1);
cfdata->gui.font = e_widget_entry_add(evas, &(cfdata->cur_font));
e_widget_on_change_hook_set(cfdata->gui.font, _font_cb_change, cfdata);
e_widget_disabled_set(cfdata->gui.font, 1);
e_widget_min_size_set(cfdata->gui.font, 100, 25);
e_widget_frametable_object_append(of, cfdata->gui.font,
@ -452,6 +448,7 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data
1, 3, 1, 1, 1, 1, 1, 1);
cfdata->gui.size = e_widget_slider_add(evas, 1, 0, _("%2.1f pixels"), 5.0, 25.0, 0.5, 0, &(cfdata->cur_size), NULL, 25);
e_widget_on_change_hook_set(cfdata->gui.size, _size_cb_change, cfdata);
e_widget_disabled_set(cfdata->gui.size, 1);
e_widget_min_size_set(cfdata->gui.size, 180, 25);
e_widget_frametable_object_append(of, cfdata->gui.size,
@ -508,7 +505,6 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data
e_widget_change(ob);
e_widget_list_object_append(o, of, 1, 1, 0.5);
return o;
}
@ -566,17 +562,16 @@ _ilist_font_cb_change(void *data, Evas_Object *obj)
cfdata = data;
if (!cfdata) return;
/* Save old data */
if (cfdata->cur_index >= 0)
{
tc = evas_list_nth(cfdata->text_classes, cfdata->cur_index);
tc->enabled = cfdata->cur_enabled;
tc->size = cfdata->cur_size;
if (tc->font) evas_stringshare_del(tc->font);
if (cfdata->cur_font)
tc->font = evas_stringshare_add(cfdata->cur_font);
}
/* Fillout form with new data */
indx = e_widget_ilist_selected_get(cfdata->gui.class_list);
tc = evas_list_nth(cfdata->text_classes, indx);
cfdata->cur_index = indx;
@ -610,31 +605,94 @@ static void
_enabled_font_cb_change(void *data, Evas_Object *obj)
{
E_Config_Dialog_Data *cfdata;
Evas_Object *icon;
Evas_List *l;
int n;
cfdata = data;
if (!cfdata) return;
e_widget_disabled_set(cfdata->gui.font, !cfdata->cur_enabled);
e_widget_disabled_set(cfdata->gui.size, !cfdata->cur_enabled);
n = e_widget_ilist_selected_get(cfdata->gui.class_list);
if (cfdata->cur_enabled)
for (n = 0, l = e_widget_ilist_items_get(cfdata->gui.class_list); l; l = l->next, n++)
{
e_widget_disabled_set(cfdata->gui.font, 0);
e_widget_disabled_set(cfdata->gui.size, 0);
icon = edje_object_add(cfdata->evas);
e_util_edje_icon_set(icon, ILIST_ICON_WITH_DEFINED_FONT);
E_Ilist_Item *i;
Evas_Object *icon = NULL;
CFText_Class *tc;
i = l->data;
if (!i) continue;
if (!i->selected) continue;
tc = evas_list_nth(cfdata->text_classes, n);
tc->enabled = cfdata->cur_enabled;
tc->size = cfdata->cur_size;
if (tc->font) evas_stringshare_del(tc->font);
if (cfdata->cur_font)
tc->font = evas_stringshare_add(cfdata->cur_font);
if (cfdata->cur_enabled)
{
icon = edje_object_add(cfdata->evas);
e_util_edje_icon_set(icon, ILIST_ICON_WITH_DEFINED_FONT);
}
e_widget_ilist_nth_icon_set(cfdata->gui.class_list, n, icon);
}
else
}
static void
_size_cb_change(void *data, Evas_Object *obj)
{
E_Config_Dialog_Data *cfdata;
Evas_List *l;
int n;
cfdata = data;
if (!cfdata) return;
for (n = 0, l = e_widget_ilist_items_get(cfdata->gui.class_list); l; l = l->next, n++)
{
e_widget_disabled_set(cfdata->gui.font, 1);
e_widget_disabled_set(cfdata->gui.size, 1);
icon = NULL;
E_Ilist_Item *i;
Evas_Object *icon = NULL;
CFText_Class *tc;
i = l->data;
if (!i) continue;
if (!i->selected) continue;
tc = evas_list_nth(cfdata->text_classes, n);
tc->size = cfdata->cur_size;
}
}
static void
_font_cb_change(void *data, Evas_Object *obj)
{
E_Config_Dialog_Data *cfdata;
Evas_List *l;
int n;
cfdata = data;
if (!cfdata) return;
for (n = 0, l = e_widget_ilist_items_get(cfdata->gui.class_list); l; l = l->next, n++)
{
E_Ilist_Item *i;
Evas_Object *icon = NULL;
CFText_Class *tc;
i = l->data;
if (!i) continue;
if (!i->selected) continue;
tc = evas_list_nth(cfdata->text_classes, n);
if (tc->font) evas_stringshare_del(tc->font);
if (cfdata->cur_font)
tc->font = evas_stringshare_add(cfdata->cur_font);
}
e_widget_ilist_nth_icon_set(cfdata->gui.class_list, n, icon);
}
/* Private Font Fallback Functions */
static void _enabled_fallback_cb_change(void *data, Evas_Object *obj)
static void
_enabled_fallback_cb_change(void *data, Evas_Object *obj)
{
E_Config_Dialog_Data *cfdata;

View File

@ -59,7 +59,6 @@ e_widget_ilist_add(Evas *evas, int icon_w, int icon_h, char **value)
evas_object_show(o);
evas_object_smart_callback_add(o, "selected", _e_wid_cb_selected, obj);
evas_object_resize(obj, 32, 32);
e_widget_min_size_set(obj, 32, 32);
return obj;
@ -157,9 +156,7 @@ e_widget_ilist_go(Evas_Object *obj)
e_widget_min_size_set(obj, mw + (w - vw), wmh);
}
else if (mw < vw)
{
evas_object_resize(wd->o_ilist, vw,mh);
}
evas_object_resize(wd->o_ilist, vw,mh);
}
EAPI void
@ -286,6 +283,51 @@ e_widget_ilist_thaw(Evas_Object *obj)
e_ilist_thaw(wd->o_ilist);
}
EAPI void
e_widget_ilist_multi_select_set(Evas_Object *obj, int multi)
{
E_Widget_Data *wd;
wd = e_widget_data_get(obj);
e_ilist_multi_select_set(wd->o_ilist, multi);
}
EAPI int
e_widget_ilist_multi_select_get(Evas_Object *obj)
{
E_Widget_Data *wd;
wd = e_widget_data_get(obj);
return e_ilist_multi_select_get(wd->o_ilist);
}
EAPI Evas_List *
e_widget_ilist_items_get(Evas_Object *obj)
{
E_Widget_Data *wd;
wd = e_widget_data_get(obj);
return e_ilist_items_get(wd->o_ilist);
}
EAPI void
e_widget_ilist_multi_select(Evas_Object *obj, int n)
{
E_Widget_Data *wd;
wd = e_widget_data_get(obj);
e_ilist_multi_select(wd->o_ilist, n);
}
EAPI void
e_widget_ilist_range_select(Evas_Object *obj, int n)
{
E_Widget_Data *wd;
wd = e_widget_data_get(obj);
e_ilist_range_select(wd->o_ilist, n);
}
static void
_e_wid_del_hook(Evas_Object *obj)
{

View File

@ -27,6 +27,11 @@ EAPI void e_widget_ilist_clear(Evas_Object *obj);
EAPI int e_widget_ilist_nth_is_header(Evas_Object *obj, int n);
EAPI void e_widget_ilist_freeze(Evas_Object *obj);
EAPI void e_widget_ilist_thaw(Evas_Object *obj);
EAPI void e_widget_ilist_multi_select_set(Evas_Object *obj, int multi);
EAPI int e_widget_ilist_multi_select_get(Evas_Object *obj);
EAPI Evas_List *e_widget_ilist_items_get(Evas_Object *obj);
EAPI void e_widget_ilist_multi_select(Evas_Object *obj, int n);
EAPI void e_widget_ilist_range_select(Evas_Object *obj, int n);
#endif
#endif