Ephoto: Add ability to search images

This commit is contained in:
Stephen okra Houston 2015-12-15 16:42:38 -06:00
parent d5cb519422
commit 230ffeaa8c
2 changed files with 179 additions and 28 deletions

1
TODO
View File

@ -6,7 +6,6 @@ Add more effects, filters as necessary
Clean up Cropper
-Thumb Browser:
Add ability to view more info on image(Exif perhaps?)
Add ability to search
-Slideshow:
Possibly look at implementing moving slideshows.
-Other Possibilities:

View File

@ -22,6 +22,7 @@ struct _Ephoto_Thumb_Browser
Ephoto *ephoto;
Evas_Object *main;
Evas_Object *table;
Evas_Object *gridbox;
Evas_Object *grid;
Evas_Object *nolabel;
Evas_Object *infolabel;
@ -32,8 +33,10 @@ struct _Ephoto_Thumb_Browser
Evas_Object *leftbox;
Evas_Object *direntry;
Evas_Object *ficon;
Evas_Object *search;
Elm_Object_Item *dir_current;
Elm_Object_Item *last_sel;
Elm_Object_Item *last_search;
Ephoto_Sort sort;
Eio_File *ls;
Eina_List *cut_items;
@ -49,6 +52,7 @@ struct _Ephoto_Thumb_Browser
int totimages;
int file_errors;
int dragging;
int searching;
double totsize;
struct
{
@ -120,6 +124,7 @@ _on_list_expanded(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
tb->thumbs_only = 0;
ephoto_directory_set(tb->ephoto, path, it, tb->dirs_only, tb->thumbs_only);
ephoto_title_set(tb->ephoto, tb->ephoto->config->directory);
elm_object_focus_set(tb->main, EINA_TRUE);
}
static void
@ -143,6 +148,7 @@ _on_list_contracted(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
tb->dirs_only, tb->thumbs_only);
ephoto_title_set(tb->ephoto,
tb->ephoto->config->directory);
elm_object_focus_set(tb->main, EINA_TRUE);
}
static void
@ -158,6 +164,7 @@ _dir_job(void *data)
ephoto_directory_set(tb->ephoto, path, NULL,
tb->dirs_only, tb->thumbs_only);
ephoto_title_set(tb->ephoto, tb->ephoto->config->directory);
elm_object_focus_set(tb->main, EINA_TRUE);
}
static void
@ -519,6 +526,7 @@ _ephoto_dir_go_up(void *data, Evas_Object *obj EINA_UNUSED,
ephoto_directory_set(tb->ephoto, dirname(path), NULL,
tb->dirs_only, tb->thumbs_only);
ephoto_title_set(tb->ephoto, tb->ephoto->config->directory);
elm_object_focus_set(tb->main, EINA_TRUE);
}
}
@ -539,6 +547,7 @@ _ephoto_dir_go_trash(void *data, Evas_Object *obj EINA_UNUSED,
ephoto_directory_set(tb->ephoto, path, NULL,
tb->dirs_only, tb->thumbs_only);
ephoto_title_set(tb->ephoto, _("Trash"));
elm_object_focus_set(tb->main, EINA_TRUE);
}
static void
@ -558,9 +567,63 @@ _ephoto_direntry_go(void *data, Evas_Object *obj EINA_UNUSED,
ephoto_directory_set(tb->ephoto, dir, NULL,
tb->dirs_only, tb->thumbs_only);
ephoto_title_set(tb->ephoto, tb->ephoto->config->directory);
elm_object_focus_set(tb->main, EINA_TRUE);
}
}
static void
_ephoto_search_go(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
Evas_Object *search = data;
Ephoto_Thumb_Browser *tb = evas_object_data_get(search, "thumb_browser");
Elm_Object_Item *next = NULL;
Elm_Object_Item *found = NULL;
Elm_Object_Item *o = NULL;
Eina_List *sel = eina_list_clone(elm_gengrid_selected_items_get(tb->grid));
Eina_List *l;
const char *search_text = elm_object_text_get(search);
char pattern[PATH_MAX];
if (tb->last_search)
next = elm_gengrid_item_next_get(tb->last_search);
if (!next)
next = elm_gengrid_first_item_get(tb->grid);
snprintf(pattern, PATH_MAX, "*%s*", search_text);
EINA_LIST_FOREACH(sel, l, o)
{
elm_gengrid_item_selected_set(o, EINA_FALSE);
}
eina_list_free(sel);
found = elm_gengrid_search_by_text_item_get(tb->grid, next, NULL, pattern,
ELM_GLOB_MATCH_NOCASE);
tb->last_search = found;
if (found)
{
elm_gengrid_item_selected_set(found, EINA_TRUE);
elm_gengrid_item_bring_in(found, ELM_GENGRID_ITEM_SCROLLTO_MIDDLE);
elm_object_focus_set(search, EINA_TRUE);
}
}
static void
_ephoto_search_cancel(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
Evas_Object *search = data;
Evas_Object *hbox = evas_object_data_get(search, "parent");
Ephoto_Thumb_Browser *tb = evas_object_data_get(search, "thumb_browser");
evas_object_del(tb->last_search);
tb->last_search = NULL;
elm_box_unpack(tb->gridbox, hbox);
evas_object_del(hbox);
tb->searching = 0;
}
static void
_ephoto_thumb_activated(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info)
@ -629,6 +692,71 @@ _zoom_out(void *data, Evas_Object *obj EINA_UNUSED,
_zoom_set(tb, zoom);
}
static void
_search(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
Ephoto_Thumb_Browser *tb = data;
Evas_Object *hbox, *search, *ic, *but;
if (!tb->searching)
tb->searching = 1;
else
return;
hbox = elm_box_add(tb->gridbox);
elm_box_horizontal_set(hbox, EINA_TRUE);
evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(hbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_start(tb->gridbox, hbox);
evas_object_show(hbox);
search = elm_entry_add(hbox);
elm_entry_single_line_set(search, EINA_TRUE);
elm_entry_scrollable_set(search, EINA_TRUE);
elm_object_part_text_set(search, "guide", _("Search"));
elm_scroller_policy_set(search, ELM_SCROLLER_POLICY_OFF,
ELM_SCROLLER_POLICY_OFF);
evas_object_size_hint_weight_set(search, EVAS_HINT_EXPAND,
EVAS_HINT_FILL);
evas_object_size_hint_align_set(search, EVAS_HINT_FILL,
EVAS_HINT_FILL);
evas_object_data_set(search, "thumb_browser", tb);
evas_object_data_set(search, "parent", hbox);
evas_object_smart_callback_add(search, "activated",
_ephoto_search_go, search);
elm_box_pack_end(hbox, search);
evas_object_show(search);
tb->search = search;
ic = elm_icon_add(hbox);
elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME);
elm_icon_standard_set(ic, "system-search");
evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
but = elm_button_add(hbox);
elm_object_part_content_set(but, "icon", ic);
elm_object_text_set(but, _("Search"));
evas_object_size_hint_weight_set(but, 0.0, 0.0);
evas_object_size_hint_align_set(but, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_smart_callback_add(but, "clicked", _ephoto_search_go, search);
elm_box_pack_end(hbox, but);
evas_object_show(but);
ic = elm_icon_add(hbox);
elm_icon_order_lookup_set(ic, ELM_ICON_LOOKUP_FDO_THEME);
elm_icon_standard_set(ic, "window-close");
evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
but = elm_button_add(hbox);
elm_object_part_content_set(but, "icon", ic);
elm_object_text_set(but, _("Cancel"));
evas_object_size_hint_weight_set(but, 0.0, 0.0);
evas_object_size_hint_align_set(but, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_smart_callback_add(but, "clicked", _ephoto_search_cancel, search);
elm_box_pack_end(hbox, but);
evas_object_show(but);
elm_object_focus_set(search, EINA_TRUE);
}
static void
_slideshow(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
@ -778,8 +906,8 @@ _ephoto_dir_show_folders(void *data, Evas_Object *obj EINA_UNUSED,
elm_table_unpack(tb->table, tb->nolabel);
elm_table_pack(tb->table, tb->nolabel, 1, 0, 4, 1);
elm_table_unpack(tb->table, tb->grid);
elm_table_pack(tb->table, tb->grid, 1, 0, 4, 1);
elm_table_unpack(tb->table, tb->gridbox);
elm_table_pack(tb->table, tb->gridbox, 1, 0, 4, 1);
elm_object_item_del(tb->ficon);
tb->ficon = elm_toolbar_item_prepend(tb->bar, "system-file-manager", _("Folders"),
@ -800,8 +928,8 @@ _ephoto_dir_hide_folders(void *data, Evas_Object *obj EINA_UNUSED,
elm_table_unpack(tb->table, tb->nolabel);
elm_table_pack(tb->table, tb->nolabel, 0, 0, 5, 1);
elm_table_unpack(tb->table, tb->grid);
elm_table_pack(tb->table, tb->grid, 0, 0, 5, 1);
elm_table_unpack(tb->table, tb->gridbox);
elm_table_pack(tb->table, tb->gridbox, 0, 0, 5, 1);
elm_object_item_del(tb->ficon);
tb->ficon = elm_toolbar_item_prepend(tb->bar, "system-file-manager", _("Folders"),
@ -3008,6 +3136,31 @@ _key_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
{
_grid_menu_select_all_cb(tb, NULL, NULL);
}
else if (!strcmp(k, "f"))
{
_search(tb, NULL, NULL);
}
else if (!strcmp(k, "Delete"))
{
char path[PATH_MAX];
char *trash;
snprintf(path, PATH_MAX, "%s/.config/ephoto/trash",
getenv("HOME"));
trash = strdup(path);
if ((strlen(trash)) == (strlen(tb->ephoto->config->directory)))
{
if (!strcmp(trash, tb->ephoto->config->directory))
{
_grid_menu_empty_cb(tb, NULL, NULL);
free(trash);
return;
}
}
else
_grid_menu_delete_cb(tb, NULL, NULL);
free(trash);
}
}
else if (!strcmp(k, "F1"))
{
@ -3044,26 +3197,10 @@ _key_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
elm_win_fullscreen_set(win, !elm_win_fullscreen_get(win));
}
else if (!strcmp(k, "Delete"))
else if (!strcmp(k, "Escape"))
{
char path[PATH_MAX];
char *trash;
snprintf(path, PATH_MAX, "%s/.config/ephoto/trash",
getenv("HOME"));
trash = strdup(path);
if ((strlen(trash)) == (strlen(tb->ephoto->config->directory)))
{
if (!strcmp(trash, tb->ephoto->config->directory))
{
_grid_menu_empty_cb(tb, NULL, NULL);
free(trash);
return;
}
}
else
_grid_menu_delete_cb(tb, NULL, NULL);
free(trash);
if (tb->searching)
_ephoto_search_cancel(tb->search, NULL, NULL);
}
}
@ -3278,6 +3415,7 @@ ephoto_thumb_browser_add(Ephoto *ephoto, Evas_Object *parent)
tb->thumbs_only = 0;
tb->dirs_only = 0;
tb->dragging = 0;
tb->searching = 0;
tb->cut_items = NULL;
tb->copy_items = NULL;
tb->dir_current = NULL;
@ -3333,6 +3471,8 @@ ephoto_thumb_browser_add(Ephoto *ephoto, Evas_Object *parent)
tb->min = elm_object_item_widget_get(icon);
evas_object_data_set(tb->max, "min", tb->min);
evas_object_data_set(tb->min, "max", tb->max);
elm_toolbar_item_append(tb->bar, "system-search", _("Search"),
_search, tb);
elm_toolbar_item_append(tb->bar, "media-playback-start", _("Slideshow"),
_slideshow, tb);
elm_toolbar_item_append(tb->bar, "preferences-system", _("Settings"),
@ -3398,7 +3538,7 @@ ephoto_thumb_browser_add(Ephoto *ephoto, Evas_Object *parent)
elm_box_pack_end(hbox, but);
evas_object_show(but);
tb->direntry = elm_entry_add(tb->leftbox);
tb->direntry = elm_entry_add(tb->main);
elm_entry_single_line_set(tb->direntry, EINA_TRUE);
elm_entry_scrollable_set(tb->direntry, EINA_TRUE);
elm_scroller_policy_set(tb->direntry, ELM_SCROLLER_POLICY_OFF,
@ -3440,7 +3580,9 @@ ephoto_thumb_browser_add(Ephoto *ephoto, Evas_Object *parent)
evas_object_show(tb->leftbox);
}
else
{
evas_object_hide(tb->leftbox);
}
tb->nolabel = elm_label_add(tb->table);
elm_label_line_wrap_set(tb->nolabel, ELM_WRAP_WORD);
@ -3458,7 +3600,15 @@ ephoto_thumb_browser_add(Ephoto *ephoto, Evas_Object *parent)
else
elm_table_pack(tb->table, tb->nolabel, 0, 0, 5, 1);
tb->grid = elm_gengrid_add(tb->table);
tb->gridbox = elm_box_add(tb->table);
elm_box_horizontal_set(tb->gridbox, EINA_FALSE);
evas_object_size_hint_weight_set(tb->gridbox, EVAS_HINT_EXPAND,
EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(tb->gridbox, EVAS_HINT_FILL,
EVAS_HINT_FILL);
evas_object_show(tb->gridbox);
tb->grid = elm_gengrid_add(tb->gridbox);
evas_object_size_hint_weight_set(tb->grid, EVAS_HINT_EXPAND,
EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(tb->grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
@ -3476,11 +3626,13 @@ ephoto_thumb_browser_add(Ephoto *ephoto, Evas_Object *parent)
_zoom_set(tb, tb->ephoto->config->thumb_size);
elm_box_pack_end(tb->gridbox, tb->grid);
evas_object_show(tb->grid);
if (!tb->ephoto->config->fsel_hide)
elm_table_pack(tb->table, tb->grid, 1, 0, 4, 1);
elm_table_pack(tb->table, tb->gridbox, 1, 0, 4, 1);
else
elm_table_pack(tb->table, tb->grid, 0, 0, 5, 1);
elm_table_pack(tb->table, tb->gridbox, 0, 0, 5, 1);
tb->infolabel = elm_label_add(tb->table);
elm_label_line_wrap_set(tb->infolabel, ELM_WRAP_WORD);