Added a "Jump To" entry.

This lets us jump to specific objects in the tree. Really useful.
This commit is contained in:
Tom Hacohen 2013-08-19 11:59:26 +01:00
parent 7638eb7c4f
commit 9588ca1a5c
1 changed files with 132 additions and 2 deletions

View File

@ -45,6 +45,10 @@ static Elm_Genlist_Item_Class _obj_info_itc;
// Item class for objects classnames
static Elm_Genlist_Item_Class _class_info_itc;
/* FIXME: Most hackish thing even seen. Needed because of the lack of a
* way to list genlist item's children. */
static Elm_Object_Item *_tree_item_show_last_expanded_item = NULL;
struct _app_data_st
{
app_info_st *app;
@ -252,6 +256,8 @@ _load_gui_with_list(gui_elements *g, Eina_List *trees)
elm_progressbar_pulse(g->pb, EINA_FALSE);
evas_object_hide(g->pb);
elm_genlist_clear(g->gl);
EINA_LIST_FOREACH(trees, l, treeit)
{ /* Insert the base ee items */
Elm_Genlist_Item_Type glflag = (treeit->children) ?
@ -1016,8 +1022,9 @@ gl_exp(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
Elm_Genlist_Item_Type iflag = (treeit->children) ?
ELM_GENLIST_ITEM_TREE : ELM_GENLIST_ITEM_NONE;
elm_genlist_item_append(gl, &itc, treeit, glit, iflag,
NULL, NULL);
_tree_item_show_last_expanded_item =
elm_genlist_item_append(gl, &itc, treeit, glit, iflag,
NULL, NULL);
}
}
@ -1485,6 +1492,94 @@ _save_all(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
eina_list_free(ck_list);
}
static Eina_Bool
_tree_item_show_item(Elm_Object_Item *git, Eina_List *item_list)
{
if (eina_list_data_get(item_list) == elm_object_item_data_get(git))
{
item_list = eina_list_next(item_list);
if (item_list)
{
Elm_Object_Item *gitc;
_tree_item_show_last_expanded_item = NULL;
elm_genlist_item_expanded_set(git, EINA_TRUE);
gitc = _tree_item_show_last_expanded_item;
while (gitc && (gitc != git))
{
if (_tree_item_show_item(gitc, item_list))
return EINA_TRUE;
gitc = elm_genlist_item_prev_get(gitc);
}
}
else
{
elm_genlist_item_bring_in(git, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
elm_genlist_item_selected_set(git, EINA_TRUE);
return EINA_TRUE;
}
}
return EINA_FALSE;
}
static void
_tree_item_show(Evas_Object *tree_genlist, Eina_List *item_list)
{
Elm_Object_Item *git = elm_genlist_first_item_get(tree_genlist);
while (git)
{
if (_tree_item_show_item(git, item_list))
break;
git = elm_genlist_item_next_get(git);
}
}
static Eina_List *
_tree_item_pointer_find(Clouseau_Tree_Item *treeit, uintptr_t ptr)
{
Eina_List *l;
/* Mark that we found the item, and start adding. */
if (treeit->ptr == ptr)
return eina_list_prepend(NULL, NULL);
EINA_LIST_FOREACH(treeit->children, l, treeit)
{
Eina_List *found;
if ((found = _tree_item_pointer_find(treeit, ptr)))
{
if (!eina_list_data_get(found))
{
eina_list_free(found);
found = NULL;
}
return eina_list_prepend(found, treeit);
}
}
return NULL;
}
static Eina_List *
_list_tree_item_pointer_find(Eina_List *tree, uintptr_t ptr)
{
Clouseau_Tree_Item *treeit;
Eina_List *l;
EINA_LIST_FOREACH(tree, l, treeit)
{
Eina_List *found;
if ((found = _tree_item_pointer_find(treeit, ptr)))
{
found = eina_list_prepend(found, treeit);
return found;
}
}
return NULL;
}
static void
_save_file_dialog(void *data,
Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
@ -1679,16 +1774,36 @@ _ofl_bt_clicked(void *data,
_show_gui(data, EINA_TRUE);
}
static void
_jump_to_entry_activated(void *data,
Evas_Object *obj, void *event_info EINA_UNUSED)
{
gui_elements *g = data;
tree_data_st *td = (g->sel_app->td) ? g->sel_app->td : NULL;
long long int ptr = strtol(elm_object_text_get(obj), NULL, 16);
Eina_List *found = NULL;
if ((found = _list_tree_item_pointer_find(td->tree, (uintptr_t) ptr)))
{
_load_gui_with_list(g, td->tree);
_tree_item_show(g->gl, found);
eina_list_free(found);
}
}
static void
_control_buttons_create(gui_elements *g, Evas_Object *win)
{
Evas_Object *show_hidden_check, *show_clippers_check, *highlight_check;
Evas_Object *jump_to_entry;
g->hbx = elm_box_add(g->bx);
evas_object_size_hint_align_set(g->hbx, 0.0, 0.5);
elm_box_horizontal_set(g->hbx, EINA_TRUE);
elm_box_pack_end(g->bx, g->hbx);
elm_box_padding_set(g->hbx, 10, 0);
evas_object_size_hint_align_set(g->hbx, EVAS_HINT_FILL, 0.0);
evas_object_size_hint_weight_set(g->hbx, EVAS_HINT_EXPAND, 0.0);
evas_object_show(g->hbx);
g->bt_load = elm_button_add(g->hbx);
@ -1728,6 +1843,21 @@ _control_buttons_create(gui_elements *g, Evas_Object *win)
_show_clippers_check_changed, g);
evas_object_smart_callback_add(highlight_check, "changed",
_highlight_check_check_changed, g);
jump_to_entry = elm_entry_add(g->hbx);
elm_entry_scrollable_set(jump_to_entry, EINA_FALSE);
elm_entry_single_line_set(jump_to_entry, EINA_TRUE);
/* FIXME: Hack because for some reason we don't have "hints" in entry */
elm_object_text_set(jump_to_entry, "Jump To");
evas_object_size_hint_align_set(jump_to_entry,
EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_size_hint_weight_set(jump_to_entry,
EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_box_pack_end(g->hbx, jump_to_entry);
evas_object_show(jump_to_entry);
evas_object_smart_callback_add(jump_to_entry, "activated",
_jump_to_entry_activated, g);
}
static void