#ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include "edi_filepanel.h" #include "edi_private.h" static Elm_Genlist_Item_Class itc, itc2; static Evas_Object *list; static edi_filepanel_item_clicked_cb _open_cb; static void _populate(Evas_Object *obj, const char *path, Elm_Object_Item *parent_it, const char *selected); static char * _text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *source EINA_UNUSED) { return strdup(basename(data)); } static Evas_Object * _content_get(void *data, Evas_Object *obj, const char *source) { if (!strcmp(source, "elm.swallow.icon")) { Evas_Object *ic; const char *iconpath; ic = elm_icon_add(obj); // TODO hook into the selected theme somehow (currently owned by E...) iconpath = efreet_mime_type_icon_get(data, "hicolor", 128); if (iconpath) elm_icon_file_set(ic, iconpath, NULL); else elm_icon_standard_set(ic, "file"); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); evas_object_show(ic); return ic; } return NULL; } static void _item_del(void *data, Evas_Object *obj) { eina_stringshare_del(data); } static void _item_sel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { const char *path = data; if (!ecore_file_is_dir(path)) _open_cb(path); } static Evas_Object * _content_dir_get(void *data, Evas_Object *obj, const char *source) { if (!strcmp(source, "elm.swallow.icon")) { Evas_Object *ic; ic = elm_icon_add(obj); elm_icon_standard_set(ic, "folder"); evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); evas_object_show(ic); return ic; } return NULL; } static Eina_Bool _ls_filter_cb(void *data, Eio_File *handler EINA_UNUSED, const Eina_File_Direct_Info *info) { return info->path[info->name_start] != '.'; } static int _file_list_cmp(const void *data1, const void *data2) { const Elm_Object_Item *item1 = data1; const Elm_Object_Item *item2 = data2; const Elm_Genlist_Item_Class *ca = elm_genlist_item_item_class_get(item1); const Elm_Genlist_Item_Class *cb = elm_genlist_item_item_class_get(item2); if (ca == &itc2) { if (cb != &itc2) return -1; } else if (cb == &itc2) { return 1; } const char *name1 = elm_object_item_data_get(item1); const char *name2 = elm_object_item_data_get(item2); printf("n1 %s, n2 %s\n", name1, name2); return strcasecmp(name1, name2); } static void _listing_request_cleanup(Listing_Request *lreq) { eina_stringshare_del(lreq->path); eina_stringshare_del(lreq->selected); free(lreq); } static void _on_list_expand_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Elm_Object_Item *it = event_info; elm_genlist_item_expanded_set(it, EINA_TRUE); } static void _on_list_contract_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Elm_Object_Item *it = event_info; elm_genlist_item_expanded_set(it, EINA_FALSE); } static void _on_list_expanded(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) { Elm_Object_Item *it = event_info; const char *path = elm_object_item_data_get(it); _populate(data, path, it, NULL); } static void _on_list_contracted(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Elm_Object_Item *it = event_info; elm_genlist_item_subitems_clear(it); } static void _ls_main_cb(void *data, Eio_File *handler, const Eina_File_Direct_Info *info) { Listing_Request *lreq = data; Elm_Object_Item *item; Elm_Genlist_Item_Class *clas = &itc; const char *path; if (eio_file_check(handler)) return; //if (!lreq->sd->files_view || lreq->sd->current != handler) //{ //eio_file_cancel(handler); //return; //} // _signal_first(lreq); if (info->type == EINA_FILE_DIR) { clas = &itc2; } path = eina_stringshare_add(info->path); item = elm_genlist_item_sorted_insert(list, clas, path, lreq->parent_it, (clas == &itc2) ? ELM_GENLIST_ITEM_TREE : ELM_GENLIST_ITEM_NONE, _file_list_cmp, _item_sel, path); if (lreq->selected && !strcmp(info->path, lreq->selected)) { elm_genlist_item_selected_set(item, EINA_TRUE); elm_object_text_set(lreq->sd->name_entry, ecore_file_file_get(info->path)); } } static void _ls_done_cb(void *data, Eio_File *handler EINA_UNUSED) { Listing_Request *lreq = data; _listing_request_cleanup(lreq); } static void _ls_error_cb(void *data, Eio_File *handler, int error EINA_UNUSED) { Listing_Request *lreq = data; _listing_request_cleanup(lreq); } static void _populate(Evas_Object *obj, const char *path, Elm_Object_Item *parent_it, const char *selected) { if (!path) return; Listing_Request *lreq; //if (sd->monitor) eio_monitor_del(sd->monitor); //if (sd->current) eio_file_cancel(sd->current); lreq = malloc(sizeof (Listing_Request)); if (!lreq) return; lreq->parent_it = parent_it; lreq->obj = obj; lreq->path = eina_stringshare_add(path); lreq->first = EINA_TRUE; if (selected) lreq->selected = eina_stringshare_add(selected); else lreq->selected = NULL; /* TODO: sub directory should be monitored for expand mode */ //sd->monitor = eio_monitor_add(path); //sd->current = eio_file_stat_ls(path, _ls_filter_cb, _ls_main_cb, _ls_done_cb, _ls_error_cb, lreq); } void edi_filepanel_add(Evas_Object *parent, const char *path, edi_filepanel_item_clicked_cb cb) { list = elm_genlist_add(parent); evas_object_size_hint_min_set(list, 100, -1); evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(list); evas_object_smart_callback_add(list, "expand,request", _on_list_expand_req, parent); evas_object_smart_callback_add(list, "contract,request", _on_list_contract_req, parent); evas_object_smart_callback_add(list, "expanded", _on_list_expanded, parent); evas_object_smart_callback_add(list, "contracted", _on_list_contracted, parent); itc.item_style = "default"; itc.func.text_get = _text_get; itc.func.content_get = _content_get; itc.func.del = _item_del; itc2.item_style = "default"; itc2.func.text_get = _text_get; itc2.func.content_get = _content_dir_get; // itc2.func.state_get = _state_get; itc2.func.del = _item_del; _open_cb = cb; _populate(list, path, NULL, NULL); elm_box_pack_end(parent, list); }