From bdb41a0b87b52650b85176c338cafff188acfbf0 Mon Sep 17 00:00:00 2001 From: Marcel Hollerbach Date: Fri, 20 Jan 2017 10:37:19 +0100 Subject: [PATCH] extra: add a background selector this brings a background selector to extra --- src/bin/Makefile.am | 1 + src/bin/extra_background_selector.c | 174 ++++++++++++++++++++++++++++ src/bin/extra_main.c | 51 +++++++- src/bin/extra_private.h | 3 +- 4 files changed, 224 insertions(+), 5 deletions(-) create mode 100644 src/bin/extra_background_selector.c diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index 8b83804..64edf87 100644 --- a/src/bin/Makefile.am +++ b/src/bin/Makefile.am @@ -11,6 +11,7 @@ AM_CPPFLAGS = -DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \ extra_SOURCES = extra_main.c \ extra_theme_selector.c \ + extra_background_selector.c \ extra_util.c extra_LDADD = @EFL_LIBS@ $(top_builddir)/src/lib/libextra.la diff --git a/src/bin/extra_background_selector.c b/src/bin/extra_background_selector.c new file mode 100644 index 0000000..6eb999f --- /dev/null +++ b/src/bin/extra_background_selector.c @@ -0,0 +1,174 @@ +#include +#include +#include "extra_private.h" +#include "../lib/extra.h" + +static Evas_Object *_selector; +static Evas_Object *_popup; + +static Elm_Gengrid_Item_Class *_item_class_basic; + +static Extra_Ui_Small_Preview_Accessor acc = { + ((Extra_ui_preview_get*) extra_background_preview_get), + ((Extra_ui_preview_download*) extra_background_preview_download), +}; + +static void +_background_installed(void *data EINA_UNUSED) +{ + /*TODO FIND A WAY TO REMOTE OPEN ENLIGHTENMENT BACKGROUND SELECTOR*/ +} + +static void +_install_background(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Extra_Background *b = data; + Extra_Progress *p; + + p = extra_ui_progress_popup_show("Installing background", _background_installed, b); + extra_background_download(p, b); +} + +static void +_uninstall_background(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Extra_Background *b = data; + + extra_background_delete(b); +} + +static void +_fullscreen_background(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Extra_Background *b = data; + char *path; + + path = extra_background_preview_get(b); + if (!path) return; + + extra_ui_fullscreen_preview(path); +} + +static void +_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + _popup = NULL; + evas_object_del(_popup); +} + +static void +_show_tooltip(Extra_Background *b) +{ + Evas_Object *tooltip, *box, *o, *icon; + + if (_popup) + { + evas_object_del(_popup); + _popup = NULL; + } + + tooltip = elm_popup_add(_selector); + evas_object_smart_callback_add(tooltip, "block,clicked", _del, tooltip); + elm_popup_allow_events_set(tooltip, EINA_TRUE); + elm_popup_orient_set(tooltip, ELM_POPUP_ORIENT_TOP); + evas_object_show(tooltip); + + + box = elm_box_add(tooltip); + elm_box_horizontal_set(box, EINA_TRUE); + elm_object_content_set(tooltip, box); + + icon = elm_icon_add(tooltip); + o = elm_button_add(box); + + if (extra_background_installed(b)) + { + elm_object_text_set(o, "Uninstall"); + elm_icon_standard_set(icon, "edit-delete"); + evas_object_smart_callback_add(o, "clicked", _uninstall_background, b); + } + else + { + elm_object_text_set(o, "Install"); + elm_icon_standard_set(icon, "emblem-downloads"); + evas_object_smart_callback_add(o, "clicked", _install_background, b); + } + elm_object_part_content_set(o, "icon", icon); + elm_box_pack_end(box, o); + evas_object_show(o); + + //view-fullscreen + o = elm_button_add(box); + elm_object_text_set(o, "Show fullscreen"); + evas_object_smart_callback_add(o, "clicked", _fullscreen_background , b); + elm_box_pack_end(box, o); + evas_object_show(o); + icon = elm_icon_add(tooltip); + elm_icon_standard_set(icon, "view-fullscreen"); + elm_object_part_content_set(o, "icon", icon); + + _popup = tooltip; +} + +static void +_fill_backgrounds(void) +{ + Eina_List *backgrounds, *n; + Extra_Background *b; + + backgrounds = extra_backgrounds_list(); + + EINA_LIST_FOREACH(backgrounds, n, b) + { + elm_gengrid_item_append(_selector, _item_class_basic, b, NULL, NULL); + } +} + +static Evas_Object* +_content_basic_get(void *data, Evas_Object *obj, const char *source) +{ + if (!strcmp(source, "elm.swallow.end")) + return NULL; + + return extra_ui_small_preview_new(acc, obj, data); +} + +static char* +_text_basic_get(void *data, Evas_Object *obj EINA_UNUSED, const char *source EINA_UNUSED) +{ + Extra_Background *t = data; + + return strdup(t->name); +} + +static void +_item_selected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + + Elm_Widget_Item *it = event_info; + _show_tooltip(elm_object_item_data_get(it)); +} + +Evas_Object* +extra_background_selector_create(void) +{ + Evas_Object *grid; + + _item_class_basic = elm_gengrid_item_class_new(); + _item_class_basic->item_style = "thumb"; + _item_class_basic->func.content_get = _content_basic_get; + _item_class_basic->func.text_get = _text_basic_get; + + _selector = grid = elm_gengrid_add(_ui.win); + elm_gengrid_select_mode_set(grid, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_gengrid_multi_select_set(grid, EINA_FALSE); + evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_gengrid_item_size_set(grid, 300, 300); + evas_object_smart_callback_add(grid, "selected", _item_selected, _ui.win); + evas_object_show(grid); + + _fill_backgrounds(); + + return grid; +} \ No newline at end of file diff --git a/src/bin/extra_main.c b/src/bin/extra_main.c index 1c9a644..b7452ce 100644 --- a/src/bin/extra_main.c +++ b/src/bin/extra_main.c @@ -24,14 +24,57 @@ _extra_win_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event elm_exit(); } +static void +_item_changed(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Elm_Segment_Control_Item *it = + elm_segment_control_item_selected_get(obj); + Evas_Object *new = elm_object_item_data_get(it); + + evas_object_hide(_ui.background_selector); + evas_object_hide(_ui.theme_selector); + + evas_object_show(new); +} + static void _extra_win_sync_done_cb(void *data EINA_UNUSED) { - Evas_Object *new_view; + Elm_Table *table, *segcontrol, *ic; + Elm_Object_Item *it; - new_view = extra_theme_selector_create(); - _ui.current_view = new_view; - elm_win_resize_object_add(_ui.win, _ui.current_view); + table = elm_table_add(_ui.win); + evas_object_size_hint_weight_set(table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(table); + + _ui.background_selector = extra_background_selector_create(); + elm_table_pack(table, _ui.background_selector, 0, 1, 1, 1); + + _ui.theme_selector = extra_theme_selector_create(); + elm_table_pack(table, _ui.theme_selector, 0, 1, 1, 1); + + segcontrol = elm_segment_control_add(table); + evas_object_size_hint_weight_set(segcontrol, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(segcontrol, EVAS_HINT_FILL, 0.0); + elm_table_pack(table, segcontrol, 0, 0, 1, 1); + evas_object_smart_callback_add(segcontrol, "changed", _item_changed, NULL); + evas_object_show(segcontrol); + +#define IC_ADD(ic_txt, txt, obj) \ + ic = elm_icon_add(segcontrol); \ + elm_icon_standard_set(ic, ic_txt); \ + it = elm_segment_control_item_add(segcontrol, ic, txt); \ + elm_object_item_data_set(it, obj); \ + + IC_ADD("preferences-desktop-theme", "Themes", _ui.theme_selector); + IC_ADD("preferences-desktop-wallpaper", "Backgrounds", _ui.background_selector); + +#undef IC_ADD + + elm_segment_control_item_selected_set(elm_segment_control_item_get(segcontrol, 0), EINA_TRUE); + + elm_win_resize_object_add(_ui.win, table); } static void diff --git a/src/bin/extra_private.h b/src/bin/extra_private.h index 4b3c980..fe58665 100644 --- a/src/bin/extra_private.h +++ b/src/bin/extra_private.h @@ -5,7 +5,8 @@ typedef struct { Evas_Object *win; - Evas_Object *current_view; + Evas_Object *background_selector; + Evas_Object *theme_selector; } Ui; extern Ui _ui;