extra: add a background selector

this brings a background selector to extra
This commit is contained in:
Marcel Hollerbach 2017-01-20 10:37:19 +01:00
parent 6b5bb23524
commit bdb41a0b87
4 changed files with 224 additions and 5 deletions

View File

@ -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

View File

@ -0,0 +1,174 @@
#include <Elementary.h>
#include <Elementary_Cursor.h>
#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;
}

View File

@ -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

View File

@ -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;