fix disk selector to handle intl trext properly. was bad to begin with.

SVN revision: 59831
This commit is contained in:
Carsten Haitzler 2011-05-31 05:24:58 +00:00
parent eeaf9ea360
commit 284ee2b43b
2 changed files with 49 additions and 13 deletions

View File

@ -133,6 +133,25 @@ test_diskselector(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *even
evas_object_show(disk);
evas_object_smart_callback_add(disk, "selected", _print_disk_info_cb, NULL);
disk = elm_diskselector_add(win);
ic = elm_icon_add(win);
snprintf(buf, sizeof(buf), "%s/images/logo_small.png", PACKAGE_DATA_DIR);
elm_icon_file_set(ic, buf, NULL);
elm_icon_scale_set(ic, 1, 1);
elm_diskselector_item_append(disk, "머리스타일", ic, NULL, NULL);
elm_diskselector_item_append(disk, "プロが伝授する", NULL, NULL, NULL);
elm_diskselector_item_append(disk, "生上访要求政府", NULL, NULL, NULL);
elm_diskselector_item_append(disk, "English", NULL, NULL, NULL);
elm_diskselector_item_append(disk, "والشريعة", NULL, NULL, NULL);
elm_diskselector_item_append(disk, "עִבְרִית", NULL, NULL, NULL);
elm_diskselector_item_append(disk, "Grüßen", NULL, NULL, NULL);
elm_diskselector_round_set(disk, EINA_TRUE);
evas_object_size_hint_weight_set(disk, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(disk, EVAS_HINT_FILL, 0.5);
elm_box_pack_end(bx, disk);
evas_object_show(disk);
evas_object_smart_callback_add(disk, "selected", _print_disk_info_cb, NULL);
// displayed item number setting example
disk = elm_diskselector_add(win);
elm_diskselector_display_item_num_set(disk, 5);

View File

@ -413,21 +413,33 @@ _event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type ty
return EINA_TRUE;
}
static int
_count_letter(const char *str)
{
int pos = 0;
int code = 0, chnum;
for (chnum = 0; ; chnum++)
{
pos = evas_string_char_next_get(str, pos, &code);
if (code == 0) break;
}
return chnum;
}
static int
_check_letter(const char *str, int length)
{
int code = str[length];
if (code == '\0')
return length; // null string
else if (((code >= 65) && (code <= 90)) || ((code >= 97) && (code <= 122)))
return length; // alphabet
else if ((48 <= code) && (code < 58))
return length; // number
else if (((33 <= code) && (code < 47)) || ((58 <= code) && (code < 64))
|| ((91 <= code) && (code < 96)) || ((123 <= code) && (code < 126)))
return length; // special letter
return length - 1;
int pos = 0;
int code = 0, chnum;
for (chnum = 0; ; chnum++)
{
if (chnum == length) break;
pos = evas_string_char_next_get(str, pos, &code);
if (code == 0) break;
}
return pos;
}
static Eina_Bool
@ -459,7 +471,9 @@ _check_string(void *data)
if ((x + w <= ox) || (x >= ox + ow))
continue;
len = eina_stringshare_strlen(it->label);
len = _count_letter(it->label);
// // FIXME: len should be # of ut8f letters. ie count using utf8 string walk, not stringshare len
// len = eina_stringshare_strlen(it->label);
if (x <= ox + 5)
edje_object_signal_emit(it->base.view, "elm,state,left_side",
@ -477,6 +491,7 @@ _check_string(void *data)
"elm");
}
// if len is les that the limit len, skip anyway
if (len <= wd->len_side)
continue;
@ -489,7 +504,9 @@ _check_string(void *data)
length = len - (int)(diff * steps / (ow / 3));
length = MAX(length, wd->len_side);
// limit string len to "length" ut8f chars
length = _check_letter(it->label, length);
// cut it off at byte mark returned form _check_letter
strncpy(buf, it->label, length);
buf[length] = '\0';
edje_object_part_text_set(it->base.view, "elm.text", buf);