ryuan pushed a commit to branch master.
commit 74f308df90026fca68ef366f68a12ce9741b2b2b
Author: Ryuan Choi <[email protected]>
Date: Tue Sep 10 18:47:30 2013 +0900
elc_fileselector : Select path which user typed on path_entry.
Summary:
In fileselector, user can write directory path or file path which they want.
If then, fileselector navigates path when directory path is given,
but just send a "selected" signal without real selection when file path or
wrong path is given.
With this path,
- fileselector will navigate (if needed) and select file with signal when
file path is given.
- no action when wrong path is given.
---
ChangeLog | 5 ++
NEWS | 1 +
src/lib/elc_fileselector.c | 149 ++++++++++++++++++++++++++++----------
src/lib/elm_widget_fileselector.h | 1 +
4 files changed, 118 insertions(+), 38 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index d957f29..9b701ef 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1598,3 +1598,8 @@
* ProgressBar: Added support for more than one progress status in a
single progress bar
+
+2013-09-10 Ryuan Choi (ryuan)
+
+ * elc_fileselector : Navigate (if needed) and select file with
"selected"
+ signal when user typed file path on path_entry.
diff --git a/NEWS b/NEWS
index 2a3ed46..b14ad6c 100644
--- a/NEWS
+++ b/NEWS
@@ -277,6 +277,7 @@ Fixes:
This prevents the asynchronous states between ime and conformant.
* Flip : Fix the flip page to not flip on a direction if the direction is
disabled.
* Spinner : change part name to access.text from access_text on default
style.
+ * Fix fileselector only send "selected" signal without selection when file
path is typed on the path entry.
Removals:
diff --git a/src/lib/elc_fileselector.c b/src/lib/elc_fileselector.c
index ef73b6a..742ac30 100644
--- a/src/lib/elc_fileselector.c
+++ b/src/lib/elc_fileselector.c
@@ -393,6 +393,7 @@ _ls_main_cb(void *data,
const Eina_File_Direct_Info *info)
{
Listing_Request *lreq = data;
+ Elm_Object_Item *item;
int itcn = ELM_FILE_UNKNOW;
if (eio_file_check(handler)) return;
@@ -416,16 +417,26 @@ _ls_main_cb(void *data,
}
if (lreq->sd->mode == ELM_FILESELECTOR_LIST)
- elm_genlist_item_sorted_insert(lreq->sd->files_list, list_itc[itcn],
- eina_stringshare_add(info->path),
- lreq->parent_it,
- ((lreq->sd->expand) && (itcn ==
ELM_DIRECTORY))
- ? ELM_GENLIST_ITEM_TREE :
ELM_GENLIST_ITEM_NONE,
- _file_list_cmp, NULL, NULL);
+ {
+ item = elm_genlist_item_sorted_insert(lreq->sd->files_list,
list_itc[itcn],
+ eina_stringshare_add(info->path),
+ lreq->parent_it,
+ ((lreq->sd->expand) && (itcn ==
ELM_DIRECTORY))
+ ? ELM_GENLIST_ITEM_TREE :
ELM_GENLIST_ITEM_NONE,
+ _file_list_cmp, NULL, NULL);
+
+ if (lreq->selected && !strcmp(info->path, lreq->selected))
+ elm_genlist_item_selected_set(item, EINA_TRUE);
+ }
else if (lreq->sd->mode == ELM_FILESELECTOR_GRID)
- elm_gengrid_item_sorted_insert(lreq->sd->files_grid, grid_itc[itcn],
- eina_stringshare_add(info->path),
- _file_grid_cmp, NULL, NULL);
+ {
+ item = elm_gengrid_item_sorted_insert(lreq->sd->files_grid,
grid_itc[itcn],
+ eina_stringshare_add(info->path),
+ _file_grid_cmp, NULL, NULL);
+
+ if (lreq->selected && !strcmp(info->path, lreq->selected))
+ elm_gengrid_item_selected_set(item, EINA_TRUE);
+ }
}
static void
@@ -434,6 +445,7 @@ _listing_request_cleanup(Listing_Request *lreq)
EINA_REFCOUNT_UNREF(lreq->sd) _elm_fileselector_smart_del_do(lreq->sd);
eina_stringshare_del(lreq->path);
+ eina_stringshare_del(lreq->selected);
free(lreq);
}
@@ -468,7 +480,8 @@ _ls_error_cb(void *data, Eio_File *handler, int error
__UNUSED__)
static void
_populate(Evas_Object *obj,
const char *path,
- Elm_Object_Item *parent_it)
+ Elm_Object_Item *parent_it,
+ const char *selected)
{
ELM_FILESELECTOR_DATA_GET(obj, sd);
if (!path) return;
@@ -538,14 +551,24 @@ _populate(Evas_Object *obj,
ELM_FILE_IMAGE : ELM_FILE_UNKNOW;
if (sd->mode == ELM_FILESELECTOR_LIST)
- elm_genlist_item_append(sd->files_list, list_itc[type],
- entry, /* item data */
- parent_it, ELM_GENLIST_ITEM_NONE,
- NULL, NULL);
+ {
+ Elm_Object_Item *item;
+ item = elm_genlist_item_append(sd->files_list, list_itc[type],
+ entry, /* item data */
+ parent_it, ELM_GENLIST_ITEM_NONE,
+ NULL, NULL);
+ if (selected && !strcmp(entry, selected))
+ elm_genlist_item_selected_set(item, EINA_TRUE);
+ }
else if (sd->mode == ELM_FILESELECTOR_GRID)
- elm_gengrid_item_append(sd->files_grid, grid_itc[type],
- entry, /* item data */
- NULL, NULL);
+ {
+ Elm_Object_Item *item;
+ item = elm_gengrid_item_append(sd->files_grid, grid_itc[type],
+ entry, /* item data */
+ NULL, NULL);
+ if (selected && !strcmp(entry, selected))
+ elm_gengrid_item_selected_set(item, EINA_TRUE);
+ }
}
#else /* asynchronous listing path */
@@ -564,6 +587,11 @@ _populate(Evas_Object *obj,
lreq->path = eina_stringshare_add(path);
lreq->first = EINA_TRUE;
+ if (selected)
+ lreq->selected = eina_stringshare_add(selected);
+ else
+ lreq->selected = NULL;
+
sd->current = eio_file_stat_ls(path, _ls_filter_cb, _ls_main_cb,
_ls_done_cb, _ls_error_cb, lreq);
elm_progressbar_pulse(sd->spinner, EINA_TRUE);
@@ -579,7 +607,7 @@ _on_list_expanded(void *data,
Elm_Object_Item *it = event_info;
const char *path = elm_object_item_data_get(it);
- _populate(data, path, it);
+ _populate(data, path, it, NULL);
}
static void
@@ -632,7 +660,7 @@ _sel_do(void *data)
{
/* keep a ref to path 'couse it will be destroyed by _populate */
p = eina_stringshare_add(path);
- _populate(sdata->fs, p, NULL);
+ _populate(sdata->fs, p, NULL, NULL);
eina_stringshare_del(p);
}
else
@@ -703,7 +731,7 @@ _on_dir_up(void *data,
ELM_FILESELECTOR_DATA_GET(fs, sd);
parent = ecore_file_dir_get(sd->path);
- _populate(fs, parent, NULL);
+ _populate(fs, parent, NULL, NULL);
free(parent);
}
@@ -714,7 +742,7 @@ _home(void *data,
{
Evas_Object *fs = data;
- _populate(fs, getenv("HOME"), NULL);
+ _populate(fs, getenv("HOME"), NULL, NULL);
}
static void
@@ -729,7 +757,7 @@ _current_filer_changed(void *data,
elm_object_text_set(obj, filter->filter_name);
filter->sd->current_filter = filter;
- _populate(filter->sd->obj, filter->sd->path, NULL);
+ _populate(filter->sd->obj, filter->sd->path, NULL, NULL);
}
static void
@@ -778,16 +806,61 @@ _on_text_activated(void *data,
void *event_info __UNUSED__)
{
Evas_Object *fs = data;
- const char *p;
+ const char *p, *path;
+ char *dir;
- // keep a ref to path 'couse it will be destroyed by _populate
- p = eina_stringshare_add(elm_object_text_get(obj));
- if (ecore_file_is_dir(p))
- _populate(fs, p, NULL);
+ ELM_FILESELECTOR_DATA_GET(fs, sd);
+
+ path = elm_object_text_get(obj);
+
+ // FIXME: Needs some feedback to user like alert.
+ if (!ecore_file_exists(path)) goto end;
+
+ if (ecore_file_is_dir(path))
+ {
+ // keep a ref to path 'couse it will be destroyed by _populate
+ p = eina_stringshare_add(path);
+ _populate(fs, p, NULL, NULL);
+ eina_stringshare_del(p);
+ goto end;
+ }
+
+ dir = ecore_file_dir_get(path);
+ if (!dir) goto end;
+
+ if (strcmp(dir, sd->path))
+ _populate(fs, dir, NULL, path);
else
- evas_object_smart_callback_call(data, SIG_SELECTED, (void *)p);
+ {
+ if (sd->mode == ELM_FILESELECTOR_LIST)
+ {
+ Elm_Object_Item *item =
elm_genlist_first_item_get(sd->files_list);
+ while (item)
+ {
+ const char *item_path = elm_object_item_data_get(item);
+ if (!strcmp(item_path, path))
+ elm_genlist_item_selected_set(item, EINA_TRUE);
+ item = elm_genlist_item_next_get(item);
+ }
+ }
+ else
+ {
+ Elm_Object_Item *item =
elm_gengrid_first_item_get(sd->files_list);
+ while (item)
+ {
+ const char *item_path = elm_object_item_data_get(item);
+ if (!strcmp(item_path, path))
+ {
+ elm_gengrid_item_selected_set(item, EINA_TRUE);
+ break;
+ }
+ item = elm_gengrid_item_next_get(item);
+ }
+ }
+ }
+ free(dir);
- eina_stringshare_del(p);
+end:
elm_object_focus_set(obj, EINA_FALSE);
}
@@ -811,7 +884,7 @@ _anchor_clicked(void *data,
// keep a ref to path 'couse it will be destroyed by _populate
p = eina_stringshare_add(info->name);
- _populate(fs, p, NULL);
+ _populate(fs, p, NULL, NULL);
evas_object_smart_callback_call(data, SIG_SELECTED, (void *)p);
eina_stringshare_del(p);
/* After anchor was clicked, entry will be focused, and will be editable.
@@ -1035,7 +1108,7 @@ _folder_only_set(Eo *obj, void *_pd, va_list *list)
if (sd->only_folder == only) return;
sd->only_folder = !!only;
- if (sd->path) _populate(obj, sd->path, NULL);
+ if (sd->path) _populate(obj, sd->path, NULL, NULL);
}
EAPI Eina_Bool
@@ -1136,7 +1209,7 @@ _expandable_set(Eo *obj, void *_pd, va_list *list)
sd->expand = !!expand;
- if (sd->path) _populate(obj, sd->path, NULL);
+ if (sd->path) _populate(obj, sd->path, NULL, NULL);
}
EAPI Eina_Bool
@@ -1171,7 +1244,7 @@ _path_set(Eo *obj, void *_pd EINA_UNUSED, va_list *list)
char *path;
path = ecore_file_realpath(_path);
- _populate(obj, path, NULL);
+ _populate(obj, path, NULL, NULL);
free(path);
}
@@ -1217,7 +1290,7 @@ _mode_set(Eo *obj, void *_pd, va_list *list)
sd->mode = mode;
- _populate(obj, sd->path, NULL);
+ _populate(obj, sd->path, NULL, NULL);
}
EAPI Elm_Fileselector_Mode
@@ -1306,7 +1379,7 @@ _selected_set(Eo *obj, void *_pd, va_list *list)
path = ecore_file_realpath(_path);
- if (ecore_file_is_dir(path)) _populate(obj, path, NULL);
+ if (ecore_file_is_dir(path)) _populate(obj, path, NULL, NULL);
else
{
if (!ecore_file_exists(path))
@@ -1316,7 +1389,7 @@ _selected_set(Eo *obj, void *_pd, va_list *list)
}
selected = ecore_file_dir_get(path);
- _populate(obj, selected, NULL);
+ _populate(obj, selected, NULL, NULL);
eina_stringshare_replace(&sd->selection, path);
free(selected);
}
@@ -1373,7 +1446,7 @@ _mime_types_filter_append(Eo *obj, void *_pd, va_list
*list)
sd->filter_list = eina_list_append(sd->filter_list, ff);
- _populate(obj, sd->path, NULL);
+ _populate(obj, sd->path, NULL, NULL);
if (need_theme)
eo_do(obj, elm_wdg_theme(NULL));
@@ -1409,7 +1482,7 @@ _filters_clear(Eo *obj, void *_pd, va_list *list
EINA_UNUSED)
ELM_SAFE_FREE(sd->filter_hoversel, evas_object_del);
- _populate(obj, sd->path, NULL);
+ _populate(obj, sd->path, NULL, NULL);
}
static void
diff --git a/src/lib/elm_widget_fileselector.h
b/src/lib/elm_widget_fileselector.h
index ad8c35a..353a4fb 100644
--- a/src/lib/elm_widget_fileselector.h
+++ b/src/lib/elm_widget_fileselector.h
@@ -68,6 +68,7 @@ struct _Listing_Request
Evas_Object *obj;
const char *path;
+ const char *selected;
Eina_Bool first : 1;
};
--
------------------------------------------------------------------------------
How ServiceNow helps IT people transform IT departments:
1. Consolidate legacy IT systems to a single system of record for IT
2. Standardize and globalize service processes across IT
3. Implement zero-touch automation to replace manual, redundant tasks
http://pubads.g.doubleclick.net/gampad/clk?id=51271111&iu=/4140/ostg.clktrk