diff options
Diffstat (limited to 'src/bin')
123 files changed, 59181 insertions, 0 deletions
diff --git a/src/bin/elementary/.gitignore b/src/bin/elementary/.gitignore new file mode 100644 index 0000000000..5cbbb5c189 --- /dev/null +++ b/src/bin/elementary/.gitignore @@ -0,0 +1,7 @@ +/elementary_config +/elementary_quicklaunch +/elementary_run +/elementary_test +/elementary_codegen +/elementary_testql +/elm_prefs_cc diff --git a/src/bin/elementary/Makefile.am b/src/bin/elementary/Makefile.am new file mode 100644 index 0000000000..46db673e5d --- /dev/null +++ b/src/bin/elementary/Makefile.am @@ -0,0 +1,195 @@ +AUTOMAKE_OPTIONS = 1.4 foreign + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I$(top_srcdir) \ +-I$(top_srcdir)/src/lib \ +-I$(top_builddir)/src/lib \ +-I$(top_srcdir)/src/bin \ +-DPACKAGE_BIN_DIR=\"$(bindir)\" \ +-DPACKAGE_LIB_DIR=\"$(libdir)\" \ +-DPACKAGE_DATA_DIR=\"$(pkgdatadir)\" \ +@ELEMENTARY_CFLAGS@ + +bin_PROGRAMS = \ +@ELEMENTARY_TEST_PRG@ \ +@ELEMENTARY_CONFIG_PRG@ \ +@ELEMENTARY_CODEGEN_PRG@ \ +@ELM_PREFS_CC_PRG@ + +if BUILD_QUICKLAUNCH +bin_PROGRAMS += elementary_quicklaunch elementary_run +endif + +EXTRA_PROGRAMS = elementary_test elementary_config elementary_codegen elm_prefs_cc + +elementary_test_SOURCES = \ +test.c \ +test_explode.c \ +test_explode.h \ +test_3d.c \ +test_access.c \ +test_actionslider.c \ +test_anim.c \ +test_application_server.c \ +test_bg.c \ +test_box.c \ +test_bubble.c \ +test_button.c \ +test_calendar.c \ +test_check.c \ +test_clock.c \ +test_cnp.c \ +test_colorselector.c \ +test_colorclass.c \ +test_combobox.c \ +test_config.c \ +test_conform.c \ +test_conform_indicator.c \ +test_ctxpopup.c \ +test_cursor.c \ +test_datetime.c \ +test_dayselector.c \ +test_disable.c \ +test_diskselector.c \ +test_dnd.c \ +test_eio.c \ +test_entry.c \ +test_entry_anchor.c \ +test_entry_anchor2.c \ +test_external.c \ +test_fileselector_button.c \ +test_fileselector.c \ +test_fileselector_entry.c \ +test_flip.c \ +test_flip_page.c \ +test_flipselector.c \ +test_floating.c \ +test_focus.c \ +test_focus_custom_chain.c \ +test_focus_policy.c \ +test_focus_style.c \ +test_gengrid.c \ +test_genlist.c \ +test_gesture_layer.c \ +test_gesture_layer2.c \ +test_gesture_layer3.c \ +test_glview_simple.c \ +test_glview.c \ +test_glview_manygears.c \ +test_grid.c \ +test_hover.c \ +test_hoversel.c \ +test_icon.c \ +test_icon_desktops.c \ +test_icon_animated.c \ +test_image.c \ +test_index.c \ +test_inwin.c \ +test_label.c \ +test_launcher.c \ +test_layout.c \ +test_list.c \ +test_map.c \ +test_main_menu.c \ +test_menu.c \ +test_multi.c \ +test_multibuttonentry.c \ +test_naviframe.c \ +test_naviframe_complex.c \ +test_notify.c \ +test_panel.c \ +test_panes.c \ +test_photo.c \ +test_photocam.c \ +test_popup.c \ +test_prefs.c \ +test_progressbar.c \ +test_radio.c \ +test_scaling.c \ +test_scroller.c \ +test_segment_control.c \ +test_separator.c \ +test_slider.c \ +test_slideshow.c \ +test_spinner.c \ +test_store.c \ +test_sys_notify.c \ +test_systray.c \ +test_task_switcher.c \ +test_table.c \ +test_thumb.c \ +test_toolbar.c \ +test_tooltip.c \ +test_transit.c \ +test_transit_bezier.c \ +test_video.c \ +test_weather.c \ +test_web.c \ +test_win_inline.c \ +test_win_keygrab.c \ +test_win_socket.c \ +test_win_plug.c \ +test_win_state.c \ +test_win_wm_rotation.c \ +test_win_dialog.c \ +test.h + +elementary_test_LDADD = $(top_builddir)/src/lib/libelementary.la \ + @ELEMENTARY_LIBS@ +elementary_test_CFLAGS = +elementary_test_LDFLAGS = + +elementary_config_SOURCES = \ +config.c + +elementary_config_LDADD = $(top_builddir)/src/lib/libelementary.la \ + @ELEMENTARY_LIBS@ +elementary_config_LDFLAGS = + +elementary_codegen_SOURCES = \ +elementary_codegen.c + +elementary_codegen_LDADD = \ + $(top_builddir)/src/lib/libelementary.la \ + @ELEMENTARY_LIBS@ +elementary_codegen_LDFLAGS = + +noinst_HEADERS = \ +elm_prefs_cc.h + +elm_prefs_cc_SOURCES = \ +elm_prefs_cc.c \ +elm_prefs_cc_mem.c \ +elm_prefs_cc_out.c \ +elm_prefs_cc_parse.c \ +elm_prefs_cc_handlers.c + +elm_prefs_cc_LDADD = \ +$(top_builddir)/src/lib/libelementary.la \ +@ELEMENTARY_LIBS@ + +if BUILD_QUICKLAUNCH +elementary_quicklaunch_SOURCES = quicklaunch.c +elementary_quicklaunch_LDADD = $(top_builddir)/src/lib/libelementary.la \ + @ELEMENTARY_LIBS@ +elementary_quicklaunch_LDFLAGS = + +if BUILD_RUN +elementary_run_CPPFLAGS = -I$(top_srcdir) \ +-I$(top_srcdir)/src/lib \ +-I$(top_builddir)/src/lib \ +-I$(top_srcdir)/src/bin \ +-DPACKAGE_BIN_DIR=\"$(bindir)\" \ +-DPACKAGE_LIB_DIR=\"$(libdir)\" \ +-DPACKAGE_DATA_DIR=\"$(pkgdatadir)\" + +elementary_run_SOURCES = run.c +elementary_run_LDADD = +elementary_run_LDFLAGS = +endif +endif + +EXTRA_DIST = \ +test_factory.c diff --git a/src/bin/elementary/config.c b/src/bin/elementary/config.c new file mode 100644 index 0000000000..d63bcef157 --- /dev/null +++ b/src/bin/elementary/config.c @@ -0,0 +1,4115 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +typedef struct _Theme Theme; +typedef struct _Fonts_Data Fonts_Data; +typedef struct _Elm_Text_Class_Data Elm_Text_Class_Data; +typedef struct _Elm_Font_Size_Data Elm_Font_Size_Data; + +struct _Theme +{ + const char *label; + const char *name; + const char *path; + Eina_Bool in_search_path; +}; + +static const Eina_List *tsel = NULL; +static Eina_List *themes = NULL; + +struct _Elm_Text_Class_Data +{ + const char *name; + const char *desc; + const char *font; + const char *style; + Evas_Font_Size size; +}; + +struct _Elm_Font_Size_Data +{ + const char *size_str; + Evas_Font_Size size; +}; + +struct _Fonts_Data +{ + Eina_List *text_classes; + + Eina_Hash *font_hash; + Eina_List *font_px_list; + Eina_List *font_scale_list; + + const char *cur_font; + const char *cur_style; + double cur_size; +}; + +#define ELM_LIST_DISABLE(list) \ + do \ + { \ + const Eina_List *_l = elm_list_items_get(list); \ + if (_l) \ + { \ + elm_list_item_show(eina_list_data_get(_l));\ + elm_object_disabled_set(list, EINA_TRUE); \ + } \ + } \ + while (0) + +#define ELM_LIST_ENABLE(list) \ + do \ + { \ + elm_object_disabled_set(list, EINA_FALSE); \ + } \ + while (0) + +#define LABEL_FRAME_ADD(label) \ + do \ + { \ + pd = elm_frame_add(win); \ + evas_object_size_hint_weight_set(pd, EVAS_HINT_EXPAND, 0.0); \ + evas_object_size_hint_align_set(pd, EVAS_HINT_FILL, 0.5); \ + elm_object_style_set(pd, "pad_medium"); \ + elm_box_pack_end(bx, pd); \ + evas_object_show(pd); \ + \ + lb = elm_label_add(win); \ + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0); \ + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, 0.5); \ + elm_object_text_set(lb, label); \ + elm_object_content_set(pd, lb); \ + evas_object_show(lb); \ + } \ + while (0) + +#define CHECK_ADD(_label, _desc, _cb, _cb_param) \ + ck = elm_check_add(win); \ + elm_object_text_set(ck, _label); \ + elm_object_tooltip_text_set(ck, _desc); \ + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0); \ + evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, 0.5); \ + elm_box_pack_end(bx, ck); \ + evas_object_show(ck); \ + evas_object_smart_callback_add(ck, "changed", _cb, _cb_param); + +static int quiet = 0; +static int interactive = 1; + +static const char *theme_set = NULL; +static const char *finger_size_set = NULL; +static const char *scale_set = NULL; +static const char *web_backend = NULL; +static Fonts_Data fndata = {NULL, NULL, NULL, NULL, NULL, NULL, 0.0}; +static Evas_Object *web_backend_entry = NULL; + +static void +_font_styles_list_sel(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info); + +static void +config_exit(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Elm_Text_Class_Data *tc_data; + Elm_Font_Size_Data *sd; + + EINA_LIST_FREE(fndata.text_classes, tc_data) + { + eina_stringshare_del(tc_data->name); + eina_stringshare_del(tc_data->desc); + eina_stringshare_del(tc_data->font); + eina_stringshare_del(tc_data->style); + free(tc_data); + } + + elm_font_available_hash_del(fndata.font_hash); + fndata.font_hash = NULL; + + EINA_LIST_FREE(fndata.font_px_list, sd) + { + eina_stringshare_del(sd->size_str); + free(sd); + } + + EINA_LIST_FREE(fndata.font_scale_list, sd) + { + eina_stringshare_del(sd->size_str); + free(sd); + } + + if (fndata.cur_font) eina_stringshare_del(fndata.cur_font); + fndata.cur_font = NULL; + + if (fndata.cur_style) eina_stringshare_del(fndata.cur_style); + fndata.cur_style = NULL; + + elm_config_save(); + elm_exit(); /* exit the program's main loop that runs in elm_run() */ +} + +static void +scroll_animation_disable_change(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Eina_Bool val = elm_check_state_get(obj); + Eina_Bool sb = elm_config_scroll_animation_disable_get(); + + if (val == sb) return; + elm_config_scroll_animation_disable_set(val); + elm_config_all_flush(); +} + +static void +scroll_accel_factor_change(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + double bf = elm_config_scroll_accel_factor_get(); + double val = elm_slider_value_get(obj); + + if (fabs(bf - val) < DBL_EPSILON) return; + elm_config_scroll_accel_factor_set(val); + elm_config_all_flush(); +} + +static void +sb_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Eina_Bool val = elm_check_state_get(obj); + Eina_Bool sb = elm_config_scroll_bounce_enabled_get(); + + if (val == sb) return; + elm_config_scroll_bounce_enabled_set(val); + elm_config_all_flush(); + + /*TODO: enable/disable subordinate sliders (make 'em support it 1st)*/ +} + +static void +ss_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Eina_Bool val = elm_check_state_get(obj); + Eina_Bool ss = elm_config_scroll_thumbscroll_smooth_start_get(); + + if (val == ss) return; + elm_config_scroll_thumbscroll_smooth_start_set(val); + elm_config_all_flush(); +} + +static void +bf_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 10.0))) / 10.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +bf_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double bf = elm_config_scroll_bounce_friction_get(); + double val = elm_slider_value_get(obj); + + if (bf == val) return; + elm_config_scroll_bounce_friction_set(val); + elm_config_all_flush(); +} + +static void +ps_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 10.0))) / 10.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +ps_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double ps = elm_config_scroll_page_scroll_friction_get(); + double val = elm_slider_value_get(obj); + + if (ps == val) return; + elm_config_scroll_page_scroll_friction_set(val); + elm_config_all_flush(); +} + +static void +bis_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 10.0))) / 10.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +bis_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double bis = elm_config_scroll_bring_in_scroll_friction_get(); + double val = elm_slider_value_get(obj); + + if (bis == val) return; + elm_config_scroll_bring_in_scroll_friction_set(val); + elm_config_all_flush(); +} + +static void +zf_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 10.0))) / 10.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +zf_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double zf = elm_config_scroll_zoom_friction_get(); + double val = elm_slider_value_get(obj); + + if (zf == val) return; + elm_config_scroll_zoom_friction_set(val); + elm_config_all_flush(); +} + +static void +smooth_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 100.0))) / 100.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +smooth_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double zf = elm_config_scroll_thumbscroll_smooth_amount_get(); + double val = elm_slider_value_get(obj); + + if (zf == val) return; + elm_config_scroll_thumbscroll_smooth_amount_set(val); + elm_config_all_flush(); +} + +static void +smooth_win_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 100.0))) / 100.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +smooth_win_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double zf = elm_config_scroll_thumbscroll_smooth_time_window_get(); + double val = elm_slider_value_get(obj); + + if (zf == val) return; + elm_config_scroll_thumbscroll_smooth_time_window_set(val); + elm_config_all_flush(); +} + +static void +ts_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Eina_Bool val = elm_check_state_get(obj); + Eina_Bool sb = elm_config_scroll_thumbscroll_enabled_get(); + + if (val == sb) return; + elm_config_scroll_thumbscroll_enabled_set(val); + elm_config_all_flush(); + + /*TODO: enable/disable subordinate sliders (make 'em support it 1st)*/ +} + +static void +tst_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 10.0))) / 10.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +tst_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double tst = elm_config_scroll_thumbscroll_threshold_get(); + double val = elm_slider_value_get(obj); + + if (tst == val) return; + elm_config_scroll_thumbscroll_threshold_set(val); + elm_config_all_flush(); +} + +static void +tsht_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 10.0))) / 10.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +tsht_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double tst = elm_config_scroll_thumbscroll_hold_threshold_get(); + double val = elm_slider_value_get(obj); + + if (tst == val) return; + elm_config_scroll_thumbscroll_hold_threshold_set(val); + elm_config_all_flush(); +} + +static void +tsmt_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 10.0))) / 10.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +tsmt_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double tsmt = elm_config_scroll_thumbscroll_momentum_threshold_get(); + double val = elm_slider_value_get(obj); + + if (tsmt == val) return; + elm_config_scroll_thumbscroll_momentum_threshold_set(val); + elm_config_all_flush(); +} + +static void +tsfdt_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 10.0))) / 10.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +tsfdt_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double tsfdt = elm_config_scroll_thumbscroll_flick_distance_tolerance_get(); + double val = elm_slider_value_get(obj); + + if (tsfdt == val) return; + elm_config_scroll_thumbscroll_flick_distance_tolerance_set(val); + elm_config_all_flush(); +} + +static void +tsf_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 10.0))) / 10.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +tsf_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double tsf = elm_config_scroll_thumbscroll_friction_get(); + double val = elm_slider_value_get(obj); + + if (tsf == val) return; + elm_config_scroll_thumbscroll_friction_set(val); + elm_config_all_flush(); +} + +static void +tsmf_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 10.0))) / 10.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +tsmf_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double tsmf = elm_config_scroll_thumbscroll_min_friction_get(); + double val = elm_slider_value_get(obj); + + if (tsmf == val) return; + elm_config_scroll_thumbscroll_min_friction_set(val); + elm_config_all_flush(); +} + +static void +tsfs_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 10.0))) / 10.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +tsfs_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double tsfs = elm_config_scroll_thumbscroll_friction_standard_get(); + double val = elm_slider_value_get(obj); + + if (tsfs == val) return; + elm_config_scroll_thumbscroll_friction_standard_set(val); + elm_config_all_flush(); +} + +static void +tsbf_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 10.0))) / 10.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +tsbf_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double tsbf = elm_config_scroll_thumbscroll_border_friction_get(); + double val = elm_slider_value_get(obj); + + if (tsbf == val) return; + elm_config_scroll_thumbscroll_border_friction_set(val); + elm_config_all_flush(); +} + +static void +tssf_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 20.0))) / 20.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +tssf_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double tssf = elm_config_scroll_thumbscroll_sensitivity_friction_get(); + double val = elm_slider_value_get(obj); + + if (tssf == val) return; + elm_config_scroll_thumbscroll_sensitivity_friction_set(val); + elm_config_all_flush(); +} + +static void +tsat_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 10.0))) / 10.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +tsat_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double tsat = elm_config_scroll_thumbscroll_acceleration_threshold_get(); + double val = elm_slider_value_get(obj); + + if (tsat == val) return; + elm_config_scroll_thumbscroll_acceleration_threshold_set(val); + elm_config_all_flush(); +} + +static void +tsatl_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 10.0))) / 10.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +tsatl_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double tsatl = elm_config_scroll_thumbscroll_acceleration_time_limit_get(); + double val = elm_slider_value_get(obj); + + if (tsatl == val) return; + elm_config_scroll_thumbscroll_acceleration_time_limit_set(val); + elm_config_all_flush(); +} + +static void +tsaw_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 10.0))) / 10.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +tsaw_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double tsaw = elm_config_scroll_thumbscroll_acceleration_weight_get(); + double val = elm_slider_value_get(obj); + + if (tsaw == val) return; + elm_config_scroll_thumbscroll_acceleration_weight_set(val); + elm_config_all_flush(); +} + +static void +cf_enable(void *data, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Eina_Bool cf = elm_config_cache_flush_enabled_get(); + Eina_Bool val = elm_check_state_get(obj); + + if (cf == val) return; + elm_object_disabled_set((Evas_Object *)data, !val); + elm_config_cache_flush_enabled_set(val); + elm_config_all_flush(); +} + +static void +cf_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 5.0))) / 5.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +cf_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double cf = elm_config_cache_flush_interval_get(); + double val = elm_slider_value_get(obj); + + if (cf == val) return; + elm_config_cache_flush_interval_set(val); + elm_config_all_flush(); +} + +static void +fc_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 10.0))) / 10.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +fc_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double font_cache = elm_config_cache_font_cache_size_get(); + double val = elm_slider_value_get(obj); + + if (font_cache == val) return; + elm_config_cache_font_cache_size_set(val * 1024); + elm_config_all_flush(); +} + +static void +ic_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 10.0))) / 10.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +ic_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double image_cache = elm_config_cache_image_cache_size_get(); + double val = elm_slider_value_get(obj); + + if (image_cache == val) return; + elm_config_cache_image_cache_size_set(val * 1024); + elm_config_all_flush(); +} + +static void +sc_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 10.0))) / 10.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +sc_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double scale = elm_config_scale_get(); + double val = elm_slider_value_get(obj); + + if (scale == val) return; + elm_config_scale_set(val); + elm_config_all_flush(); +} + +static void +fs_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 5.0))) / 5.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +fs_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double fs = elm_config_finger_size_get(); + double val = elm_slider_value_get(obj); + + if (fs == val) return; + elm_config_finger_size_set(val); + elm_config_all_flush(); +} + +static void +efc_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 5.0))) / 5.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +efc_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double efc = elm_config_cache_edje_file_cache_size_get(); + double val = elm_slider_value_get(obj); + + if (efc == val) return; + elm_config_cache_edje_file_cache_size_set(val); + elm_config_all_flush(); +} + +static void +ecc_round(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + double v; + + v = ((double)((int)(val * 5.0))) / 5.0; + if (v != val) elm_slider_value_set(obj, v); +} + +static void +ecc_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double ecc = elm_config_cache_edje_collection_cache_size_get(); + double val = elm_slider_value_get(obj); + + if (ecc == val) return; + elm_config_cache_edje_collection_cache_size_set(val); + elm_config_all_flush(); +} + +static void +ac_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Eina_Bool val = elm_check_state_get(obj); + Eina_Bool ac = elm_config_access_get(); + + if (val == ac) return; + elm_config_access_set(val); + elm_config_all_flush(); +} + +static void +sel_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Eina_Bool val = elm_check_state_get(obj); + Eina_Bool sel = elm_config_selection_unfocused_clear_get(); + + if (val == sel) return; + elm_config_selection_unfocused_clear_set(val); + elm_config_all_flush(); +} + +static void +dbg_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Eina_Bool val = elm_check_state_get(obj); + Eina_Bool sel = elm_config_clouseau_enabled_get(); + + if (val == sel) return; + elm_config_clouseau_enabled_set(val); + elm_config_all_flush(); +} + +static void +atspi_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Eina_Bool val = elm_check_state_get(obj); + Eina_Bool sel = elm_config_atspi_mode_get(); + + if (val == sel) return; + elm_config_atspi_mode_set(val); + elm_config_all_flush(); +} + +static void +transition_duration_change(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + Eina_Bool scale = elm_config_transition_duration_factor_get(); + + if (scale == val) return; + elm_config_transition_duration_factor_set(val); + elm_config_all_flush(); +} + +static void +_status_basic(Evas_Object *win, + Evas_Object *bx0) +{ + Evas_Object *lb, *fr; + + fr = elm_frame_add(win); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(fr, "Information"); + elm_box_pack_end(bx0, fr); + evas_object_show(fr); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "Applying configuration change" + ); + elm_object_content_set(fr, lb); + evas_object_show(lb); +} + +static void +_status_config(Evas_Object *win, + Evas_Object *bx0) +{ + Evas_Object *lb, *pd, *bx, *fr, *sl, *sp; + + fr = elm_frame_add(win); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(fr, "Sizing"); + elm_box_pack_end(bx0, fr); + evas_object_show(fr); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.5); + + LABEL_FRAME_ADD("<hilight>Scale</>"); + + sl = elm_slider_add(win); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.2f"); + elm_slider_indicator_format_set(sl, "%1.2f"); + elm_slider_min_max_set(sl, 0.25, 5.0); + elm_slider_value_set(sl, elm_config_scale_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", sc_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", sc_change, NULL); + + sp = elm_separator_add(win); + elm_separator_horizontal_set(sp, EINA_TRUE); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + LABEL_FRAME_ADD("<hilight>Finger Size</><br/>"); + + sl = elm_slider_add(win); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.0f"); + elm_slider_indicator_format_set(sl, "%1.0f"); + elm_slider_min_max_set(sl, 5, 200); + elm_slider_value_set(sl, elm_config_finger_size_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", fs_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", fs_change, NULL); + + // FIXME: add theme selector (basic mode and advanced for fallbacks) + // FIXME: save config + // FIXME: profile selector / creator etc. + elm_object_content_set(fr, bx); + evas_object_show(bx); +} + +static void +_flip_to(Evas_Object *win, + const char *name) +{ + Evas_Object *wid, *naviframe; + wid = evas_object_data_get(win, name); + naviframe = evas_object_data_get(win, "naviframe"); + if (!naviframe) return; + elm_naviframe_item_simple_promote(naviframe, wid); +} + +static void +_cf_sizing(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + _flip_to(data, "sizing"); +} + +static void +_cf_themes(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + _flip_to(data, "themes"); +} + +static void +_cf_fonts(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + _flip_to(data, "fonts"); +} + +static void +_cf_profiles(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + _flip_to(data, "profiles"); +} + +static void +_cf_scrolling(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + _flip_to(data, "scrolling"); +} + +static void +_cf_rendering(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + _flip_to(data, "rendering"); +} + +static void +_cf_caches(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + _flip_to(data, "caches"); +} + +static void +_cf_audio(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + _flip_to(data,"audio"); +} + +static void +_cf_focus(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + _flip_to(data, "focus"); +} + +static void +_cf_etc(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + _flip_to(data,"etc"); +} + +const char * +_elm_theme_current_get(const char *theme_search_order) +{ + const char *ret; + const char *p; + + if (!theme_search_order) + return NULL; + + for (p = theme_search_order;; p++) + { + if ((*p == ':') || (!*p)) + { + if (p > theme_search_order) + { + char *n = malloc(p - theme_search_order + 1); + if (!n) + return NULL; + + strncpy(n, theme_search_order, p - theme_search_order); + n[p - theme_search_order] = 0; + ret = eina_stringshare_add(n); + free(n); + break; + } + } + } + + return ret; +} + +static void +_font_overlay_set_all(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *fclasses; + Elm_Text_Class_Data *tc_data, *tc; + Elm_Object_Item *list_it; + Eina_List *l; + + win = data; + + fclasses = evas_object_data_get(win, "font_classes_list"); + list_it = elm_list_selected_item_get(fclasses); + if (!list_it) return; + tc_data = elm_object_item_data_get(list_it); + if (!tc_data) return; + + EINA_LIST_FOREACH(fndata.text_classes, l, tc) + { + eina_stringshare_replace(&tc->font, tc_data->font); + eina_stringshare_replace(&tc->style, tc_data->style); + tc->size = tc_data->size; + } + + elm_config_all_flush(); +} + +static void +_font_overlay_reset(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *fclasses, *fnames, *fstyles, *fsizes; + Elm_Text_Class_Data *tc_data; + Elm_Object_Item *list_it; + + win = data; + + fclasses = evas_object_data_get(win, "font_classes_list"); + list_it = elm_list_selected_item_get(fclasses); + if (!list_it) return; + tc_data = elm_object_item_data_get(list_it); + if (!tc_data) return; + + fnames = evas_object_data_get(win, "font_names_list"); + fstyles = evas_object_data_get(win, "font_styles_list"); + fsizes = evas_object_data_get(win, "font_sizes_list"); + + elm_config_font_overlay_unset(tc_data->name); + + eina_stringshare_replace(&fndata.cur_font, NULL); + eina_stringshare_replace(&tc_data->font, NULL); + eina_stringshare_replace(&fndata.cur_style, NULL); + eina_stringshare_replace(&tc_data->style, NULL); + fndata.cur_size = 0.0; + tc_data->size = 0.0; + + ELM_LIST_DISABLE(fnames); + ELM_LIST_DISABLE(fstyles); + ELM_LIST_DISABLE(fsizes); + + elm_config_all_flush(); +} + +static void +_font_overlay_reset_all(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *fclasses, *fnames, *fstyles, *fsizes; + Elm_Text_Class_Data *tc_data; + Elm_Object_Item *list_it; + Eina_List *l; + + win = data; + eina_stringshare_replace(&fndata.cur_font, NULL); + eina_stringshare_replace(&fndata.cur_style, NULL); + fndata.cur_size = 0.0; + + EINA_LIST_FOREACH(fndata.text_classes, l, tc_data) + { + elm_config_font_overlay_unset(tc_data->name); + + eina_stringshare_replace(&tc_data->font, NULL); + eina_stringshare_replace(&tc_data->style, NULL); + tc_data->size = 0.0; + } + + fclasses = evas_object_data_get(win, "font_classes_list"); + fnames = evas_object_data_get(win, "font_names_list"); + fstyles = evas_object_data_get(win, "font_styles_list"); + fsizes = evas_object_data_get(win, "font_sizes_list"); + + list_it = elm_list_selected_item_get(fclasses); + if (list_it) elm_list_item_selected_set(list_it, EINA_FALSE); + + ELM_LIST_DISABLE(fnames); + ELM_LIST_DISABLE(fstyles); + ELM_LIST_DISABLE(fsizes); + + elm_config_all_flush(); +} + +static void +_font_overlay_change(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Elm_Text_Class_Data *tc_data; + Eina_List *l; + + EINA_LIST_FOREACH(fndata.text_classes, l, tc_data) + { + if (tc_data->font) + { + char *name; + + name = elm_font_fontconfig_name_get(tc_data->font, + tc_data->style); + elm_config_font_overlay_set(tc_data->name, name, + tc_data->size ? tc_data->size : -100); + elm_font_fontconfig_name_free(name); + } + else + elm_config_font_overlay_unset(tc_data->name); + } + + elm_config_font_overlay_apply(); + elm_config_all_flush(); + + /* TODO: apply hinting */ +} + +static void +_config_display_update(Evas_Object *win) +{ + int flush_interval, font_c, image_c, edje_file_c, edje_col_c, ts_threshould, + ts_hold_threshold; + double scale, s_bounce_friction, ts_momentum_threshold, + ts_flick_distance_tolerance, ts_friction, + ts_min_friction, ts_friction_standard, ts_border_friction, + ts_sensitivity_friction, ts_acceleration_threshold, + ts_acceleration_time_limit, ts_acceleration_weight, page_friction, + bring_in_friction, zoom_friction, transition_duration, + smooth_amount, smooth_time_window; + const char *curr_theme; + Eina_Bool s_bounce, ts, smooth_start; + Elm_Theme *th; + int fs; + + scale = elm_config_scale_get(); + fs = elm_config_finger_size_get(); + flush_interval = elm_config_cache_flush_interval_get(); + font_c = elm_config_cache_font_cache_size_get(); + image_c = elm_config_cache_image_cache_size_get(); + transition_duration = elm_config_transition_duration_factor_get(); + edje_file_c = elm_config_cache_edje_file_cache_size_get(); + edje_col_c = elm_config_cache_edje_collection_cache_size_get(); + + s_bounce = elm_config_scroll_bounce_enabled_get(); + s_bounce_friction = elm_config_scroll_bounce_friction_get(); + ts = elm_config_scroll_thumbscroll_enabled_get(); + ts_threshould = elm_config_scroll_thumbscroll_threshold_get(); + ts_hold_threshold = elm_config_scroll_thumbscroll_hold_threshold_get(); + ts_momentum_threshold = elm_config_scroll_thumbscroll_momentum_threshold_get(); + ts_flick_distance_tolerance = elm_config_scroll_thumbscroll_flick_distance_tolerance_get(); + ts_friction = elm_config_scroll_thumbscroll_friction_get(); + ts_min_friction = elm_config_scroll_thumbscroll_min_friction_get(); + ts_friction_standard = elm_config_scroll_thumbscroll_friction_standard_get(); + ts_border_friction = elm_config_scroll_thumbscroll_border_friction_get(); + ts_sensitivity_friction = elm_config_scroll_thumbscroll_sensitivity_friction_get(); + ts_acceleration_threshold = elm_config_scroll_thumbscroll_acceleration_threshold_get(); + ts_acceleration_time_limit = elm_config_scroll_thumbscroll_acceleration_time_limit_get(); + ts_acceleration_weight = elm_config_scroll_thumbscroll_acceleration_weight_get(); + page_friction = elm_config_scroll_page_scroll_friction_get(); + bring_in_friction = elm_config_scroll_bring_in_scroll_friction_get(); + zoom_friction = elm_config_scroll_zoom_friction_get(); + smooth_start = elm_config_scroll_thumbscroll_smooth_start_get(); + smooth_amount = elm_config_scroll_thumbscroll_smooth_amount_get(); + smooth_time_window = elm_config_scroll_thumbscroll_smooth_time_window_get(); + + /* gotta update root windows' atoms */ + elm_slider_value_set(evas_object_data_get(win, "scale_slider"), scale); + elm_slider_value_set(evas_object_data_get(win, "fs_slider"), fs); + + elm_slider_value_set(evas_object_data_get(win, + "cache_flush_interval_slider"), + flush_interval); + elm_slider_value_set(evas_object_data_get(win, "font_cache_slider"), + font_c / 1024.0); + elm_slider_value_set(evas_object_data_get(win, "image_cache_slider"), + image_c / 1024.0); + elm_slider_value_set(evas_object_data_get(win, "edje_file_cache_slider"), + edje_file_c); + elm_slider_value_set(evas_object_data_get(win, + "edje_collection_cache_slider"), + edje_col_c); + + elm_check_state_set(evas_object_data_get(win, "scroll_bounce_check"), + s_bounce); + elm_slider_value_set(evas_object_data_get(win, "bounce_friction_slider"), + s_bounce_friction); + elm_check_state_set(evas_object_data_get(win, "thumbscroll_check"), ts); + elm_slider_value_set(evas_object_data_get(win, + "ts_threshold_slider"), + ts_threshould); + elm_slider_value_set(evas_object_data_get(win, + "ts_hold_threshold_slider"), + ts_hold_threshold); + elm_slider_value_set(evas_object_data_get(win, + "ts_momentum_threshold_slider"), + ts_momentum_threshold); + elm_slider_value_set(evas_object_data_get(win, + "ts_flick_distance_tolerance_slider"), + ts_flick_distance_tolerance); + elm_slider_value_set(evas_object_data_get(win, + "ts_friction_slider"), + ts_friction); + elm_slider_value_set(evas_object_data_get(win, + "ts_min_friction_slider"), + ts_min_friction); + elm_slider_value_set(evas_object_data_get(win, + "ts_friction_standard_slider"), + ts_friction_standard); + elm_slider_value_set(evas_object_data_get(win, "ts_border_friction_slider"), + ts_border_friction); + elm_slider_value_set(evas_object_data_get(win, "ts_sensitivity_friction_slider"), + ts_sensitivity_friction); + elm_slider_value_set(evas_object_data_get(win, "ts_acceleration_threshold_slider"), + ts_acceleration_threshold); + elm_slider_value_set(evas_object_data_get(win, "ts_acceleration_time_limit_slider"), + ts_acceleration_time_limit); + elm_slider_value_set(evas_object_data_get(win, "ts_acceleration_weight_slider"), + ts_acceleration_weight); + elm_slider_value_set(evas_object_data_get(win, + "page_scroll_friction_slider"), + page_friction); + elm_slider_value_set(evas_object_data_get(win, + "bring_in_scroll_friction_slider"), + bring_in_friction); + elm_slider_value_set(evas_object_data_get(win, + "zoom_scroll_friction_slider"), + zoom_friction); + + elm_check_state_set(evas_object_data_get(win, "scroll_smooth_start"), + smooth_start); + elm_slider_value_set(evas_object_data_get(win, + "scroll_smooth_amount"), + smooth_amount); + elm_slider_value_set(evas_object_data_get(win, + "scroll_smooth_time_window"), + smooth_time_window); + + curr_theme = _elm_theme_current_get(elm_theme_get(NULL)); + + th = elm_theme_new(); + elm_theme_set(th, curr_theme); + elm_object_theme_set(evas_object_data_get(win, "theme_preview"), th); + elm_theme_free(th); + elm_config_transition_duration_factor_set(transition_duration); + eina_stringshare_del(curr_theme); +} + +static Eina_Bool +_config_all_changed(void *data, + int ev_type EINA_UNUSED, + void *ev EINA_UNUSED) +{ + Evas_Object *win = data; + _config_display_update(win); + return ECORE_CALLBACK_PASS_ON; +} + +static void +_profile_use(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *li; + const char *selection; + const char *profile; + + li = data; + selection = elm_object_item_data_get(elm_list_selected_item_get(li)); + if (!selection) return; + profile = elm_config_profile_get(); + + if (!profile) + { + fprintf(stderr, "No profile currently set!\n"); /* FIXME: log domain */ + return; + } + + if (!strcmp(profile, selection)) + return; + + elm_config_profile_set(selection); /* just here to update info for getters below */ + + _config_display_update(elm_object_top_widget_get(li)); + elm_config_all_flush(); +} + +static void +_btn_todo(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("To be done!\n"); +} + +static void +_profile_reset(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + const char *selection; + const char *pdir; + Evas_Object *li; + + li = data; + selection = elm_object_item_data_get(elm_list_selected_item_get(li)); + if (!selection) return; + + elm_config_all_flush(); + + pdir = elm_config_profile_dir_get(selection, EINA_TRUE); + if (!pdir) + return; + + ecore_file_recursive_rm(pdir); + elm_config_profile_dir_free(pdir); + + elm_config_reload(); + + elm_config_all_flush(); + _config_display_update(elm_object_top_widget_get(li)); +} + +static void +_theme_use(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + const char *defth; + Elm_Theme *th; + Evas_Object *win = elm_object_top_widget_get(obj); + Evas_Object *sample = evas_object_data_get(win, "theme_preview"); + + th = elm_object_theme_get(sample); + defth = elm_theme_get(th); + elm_theme_set(NULL, defth); + elm_config_all_flush(); +} + +static void +_theme_sel(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Evas_Object *win = elm_object_top_widget_get(obj); + Evas_Object *sample = evas_object_data_get(win, "theme_preview"); + Elm_Theme *th; + Elm_Object_Item *list_it; + Eina_Strbuf *newth; + Eina_List *l; + + if (!sample) return; + tsel = elm_list_selected_items_get(obj); + newth = eina_strbuf_new(); + EINA_SAFETY_ON_NULL_RETURN(newth); + th = elm_theme_new(); + if (!th) + { + eina_strbuf_free(newth); + return; + } + EINA_LIST_REVERSE_FOREACH((Eina_List*)tsel, l, list_it) + { + Theme *t = elm_object_item_data_get(list_it); + if (!t) continue; + + eina_strbuf_append_printf(newth, "%s:", t->name); + if ((!l->prev) && strcmp(t->name, "default")) + /* ensure default theme is always there for fallback */ + eina_strbuf_append(newth, "default"); + } + elm_theme_set(th, eina_strbuf_string_get(newth)); + eina_strbuf_free(newth); + elm_object_theme_set(sample, th); + elm_theme_free(th); +} + +/*static void + _theme_browse(void *data, Evas_Object *obj, void *event_info) + { + printf("not implemented\n"); + }*/ + +static void +_status_config_sizing(Evas_Object *win, + Evas_Object *naviframe) +{ + Evas_Object *lb, *pd, *bx, *sl, *sp; + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.5); + + LABEL_FRAME_ADD("<hilight>Scale</>"); + + sl = elm_slider_add(win); + evas_object_data_set(win, "scale_slider", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.2f"); + elm_slider_indicator_format_set(sl, "%1.2f"); + elm_slider_min_max_set(sl, 0.25, 5.0); + elm_slider_value_set(sl, elm_config_scale_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", sc_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", sc_change, NULL); + + sp = elm_separator_add(win); + elm_separator_horizontal_set(sp, EINA_TRUE); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + LABEL_FRAME_ADD("<hilight>Finger Size</><br/>"); + + sl = elm_slider_add(win); + evas_object_data_set(win, "fs_slider", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.0f"); + elm_slider_indicator_format_set(sl, "%1.0f"); + elm_slider_min_max_set(sl, 5, 200); + elm_slider_value_set(sl, elm_config_finger_size_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", fs_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", fs_change, NULL); + + evas_object_data_set(win, "sizing", bx); + + elm_naviframe_item_simple_push(naviframe, bx); +} + +#define MUTE_CB(_cb, _chan) \ +static void \ +_cb(void *data EINA_UNUSED, \ + Evas_Object *obj, \ + void *event_info EINA_UNUSED) \ +{ \ + Eina_Bool val = elm_check_state_get(obj); \ + Eina_Bool v = elm_config_audio_mute_get(_chan); \ + if (val == v) return; \ + elm_config_audio_mute_set(_chan, val); \ + elm_config_all_flush(); \ +} + +MUTE_CB(mute_effect_change, EDJE_CHANNEL_EFFECT) +MUTE_CB(mute_background_change, EDJE_CHANNEL_BACKGROUND) +MUTE_CB(mute_music_change, EDJE_CHANNEL_MUSIC) +MUTE_CB(mute_foreground_change, EDJE_CHANNEL_FOREGROUND) +MUTE_CB(mute_interface_change, EDJE_CHANNEL_INTERFACE) +MUTE_CB(mute_input_change, EDJE_CHANNEL_INPUT) +MUTE_CB(mute_alert_change, EDJE_CHANNEL_ALERT) +MUTE_CB(mute_all_change, EDJE_CHANNEL_ALL) + +static void +_status_config_audio(Evas_Object *win, + Evas_Object *naviframe) +{ + Evas_Object *bx, *ck; + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.5); + +#define MUTE_CHECK(_label, _chan, _cb) \ + CHECK_ADD(_label, _label, _cb, NULL) \ + elm_check_state_set(ck, elm_config_audio_mute_get(_chan)); + + MUTE_CHECK("Mute Effects", EDJE_CHANNEL_EFFECT, mute_effect_change); + MUTE_CHECK("Mute Background", EDJE_CHANNEL_BACKGROUND, mute_background_change); + MUTE_CHECK("Mute Music", EDJE_CHANNEL_MUSIC, mute_music_change); + MUTE_CHECK("Mute Foreground", EDJE_CHANNEL_FOREGROUND, mute_foreground_change); + MUTE_CHECK("Mute Interface", EDJE_CHANNEL_INTERFACE, mute_interface_change); + MUTE_CHECK("Mute Input", EDJE_CHANNEL_INPUT, mute_input_change); + MUTE_CHECK("Mute Alert", EDJE_CHANNEL_ALERT, mute_alert_change); + MUTE_CHECK("Mute Everything", EDJE_CHANNEL_ALL, mute_all_change); + + evas_object_data_set(win, "audio", bx); + + elm_naviframe_item_simple_push(naviframe, bx); +} + +static void +_config_focus_highlight_enabled_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Eina_Bool cf = elm_config_focus_highlight_enabled_get(); + Eina_Bool val = elm_check_state_get(obj); + + printf("%d %d\n", cf, val); + if (cf == val) return; + elm_config_focus_highlight_enabled_set(val); + elm_config_all_flush(); +} + +static void +_config_focus_highlight_anim_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Eina_Bool cf = elm_config_focus_highlight_animate_get(); + Eina_Bool val = elm_check_state_get(obj); + + if (cf == val) return; + elm_config_focus_highlight_animate_set(val); + elm_config_all_flush(); +} + +static void +_config_focus_highlight_clip_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Eina_Bool cf = elm_config_focus_highlight_clip_disabled_get(); + Eina_Bool val = elm_check_state_get(obj); + + if (cf == val) return; + elm_config_focus_highlight_clip_disabled_set(val); + elm_config_all_flush(); +} + +static void +_config_focus_item_select_on_focus_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Eina_Bool cf = elm_config_item_select_on_focus_disabled_get(); + Eina_Bool val = elm_check_state_get(obj); + + if (cf == val) return; + elm_config_item_select_on_focus_disabled_set(val); + elm_config_all_flush(); +} + +static void +_status_config_focus_autoscroll_changed_cb(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_config_focus_autoscroll_mode_set(elm_radio_value_get(obj)); +} + +static void +_config_focus_auto_show_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Eina_Bool cf = elm_config_window_auto_focus_enable_get(); + Eina_Bool val = elm_check_state_get(obj); + + if (cf == val) return; + elm_config_window_auto_focus_enable_set(val); + elm_config_all_flush(); +} + +static void +_config_focus_auto_animate_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Eina_Bool cf = elm_config_window_auto_focus_animate_get(); + Eina_Bool val = elm_check_state_get(obj); + + if (cf == val) return; + elm_config_window_auto_focus_animate_set(val); + elm_config_all_flush(); +} + +static void +_status_config_focus(Evas_Object *win, + Evas_Object *naviframe) +{ + Evas_Object *bx, *ck, *fr; + + bx = elm_box_add(win); + + CHECK_ADD("Enable Focus Highlight (only new window)", + "Set whether enable/disable focus highlight.<br/>" + "This feature is disabled by default.", + _config_focus_highlight_enabled_cb, NULL); + elm_check_state_set(ck, elm_config_focus_highlight_enabled_get()); + + CHECK_ADD("Enable Focus Highlight Animation (only new window)", + "Set whether enable/disable focus highlight animation.<br/>" + "This feature is disabled by default", + _config_focus_highlight_anim_cb, NULL); + elm_check_state_set(ck, elm_config_focus_highlight_animate_get()); + + CHECK_ADD("Disable Focus Highlight clip", + "Set whether enable/disable focus highlight clip feature.<br/>" + "If the focus highlight clip is disabled,<br/>" + "focus highlight object would not be clipped" + "by the target object's parent", + _config_focus_highlight_clip_cb, NULL); + elm_check_state_set(ck, elm_config_focus_highlight_clip_disabled_get()); + + CHECK_ADD("Disable Item Select on Focus", + "Set whether item would be selected on item focus.<br/>" + "This is enabled by default.", + _config_focus_item_select_on_focus_cb, NULL); + elm_check_state_set(ck, elm_config_item_select_on_focus_disabled_get()); + + CHECK_ADD("Enable Automatic focus display", + "Set whether enable/disable focus highlight automatically.", + _config_focus_auto_show_cb, NULL); + elm_check_state_set(ck, elm_config_window_auto_focus_enable_get()); + CHECK_ADD("Enable Automatic focus animation", + "Set whether enable/disable focus highlight animation<br/>" + "automatically when automatic focus shows.", + _config_focus_auto_animate_cb, NULL); + elm_check_state_set(ck, elm_config_window_auto_focus_enable_get()); + + fr = elm_frame_add(bx); + elm_object_text_set(fr, "Focus Autoscroll Mode"); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + { + Evas_Object *bx2, *rdg, *rd; + bx2 = elm_box_add(fr); + elm_object_content_set(fr, bx2); + evas_object_show(bx2); + + rdg = rd = elm_radio_add(bx2); + elm_radio_state_value_set(rd, ELM_FOCUS_AUTOSCROLL_MODE_SHOW); + elm_object_text_set(rd, "ELM_FOCUS_AUTOSCROLL_MODE_SHOW"); + elm_object_tooltip_text_set(rd, "Directly show the focused region<br/>" + "or item automatically inside a scroller."); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL); + elm_box_pack_end(bx2, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", + _status_config_focus_autoscroll_changed_cb, + NULL); + + rd = elm_radio_add(bx2); + elm_radio_state_value_set(rd, ELM_FOCUS_AUTOSCROLL_MODE_NONE); + elm_object_text_set(rd, "ELM_FOCUS_AUTOSCROLL_MODE_NONE"); + elm_object_tooltip_text_set(rd, "Do not show the focused region or<br/>" + "item automatically inside a scroller."); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL); + elm_box_pack_end(bx2, rd); + elm_radio_group_add(rd, rdg); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", + _status_config_focus_autoscroll_changed_cb, + NULL); + + + rd = elm_radio_add(bx2); + elm_radio_state_value_set(rd, ELM_FOCUS_AUTOSCROLL_MODE_BRING_IN); + elm_object_text_set(rd, "ELM_FOCUS_AUTOSCROLL_MODE_BRING_IN"); + elm_object_tooltip_text_set(rd, "Bring in the focused region or item<br/>" + "automatically which might invole the scrolling."); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL); + elm_box_pack_end(bx2, rd); + elm_radio_group_add(rd, rdg); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", + _status_config_focus_autoscroll_changed_cb, + NULL); + + elm_radio_value_set(rdg, elm_config_focus_autoscroll_mode_get()); + } + + evas_object_data_set(win, "focus", bx); + + elm_naviframe_item_simple_push(naviframe, bx); +} + +static void +_status_config_etc(Evas_Object *win, + Evas_Object *naviframe) +{ + Evas_Object *bx, *ck, *sl, *fr, *bx2, *fr2, *bx3, *en; + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.5); + + // access + CHECK_ADD("Enable Access Mode", "Set access mode", ac_change, NULL); + elm_check_state_set(ck, elm_config_access_get()); + + // selection + CHECK_ADD("Enable clear selection when unfocus", "Set selection mode", + sel_change, NULL); + elm_check_state_set(ck, elm_config_selection_unfocused_clear_get()); + + // clouseau + CHECK_ADD("Enable clouseau", "Set clouseau mode", dbg_change, NULL); + elm_check_state_set(ck, elm_config_clouseau_enabled_get()); + + // atspi + CHECK_ADD("Enable ATSPI support", "Set atspi mode", atspi_change, NULL); + elm_check_state_set(ck, elm_config_atspi_mode_get()); + + // transition duration in edje + fr = elm_frame_add(bx); + elm_object_text_set(fr, "Edje Transition Duration Factor"); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + bx2 = elm_box_add(fr); + elm_object_content_set(fr, bx2); + evas_object_show(bx2); + + sl = elm_slider_add(bx2); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.1f"); + elm_slider_indicator_format_set(sl, "%1.1f"); + elm_slider_min_max_set(sl, 0, 20.0); + elm_slider_value_set(sl, elm_config_transition_duration_factor_get()); + elm_box_pack_end(bx2, sl); + evas_object_show(sl); + evas_object_smart_callback_add(sl, "changed", sc_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", transition_duration_change, NULL); + + // Web backend + fr2 = elm_frame_add(bx); + elm_object_text_set(fr2, "Elm_Web backend"); + evas_object_size_hint_weight_set(fr2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr2, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, fr2); + evas_object_show(fr2); + + bx3 = elm_box_add(fr2); + elm_object_content_set(fr2, bx3); + evas_object_show(bx3); + + en = elm_entry_add(win); + elm_entry_editable_set(en, EINA_TRUE); + elm_entry_scrollable_set(en, EINA_FALSE); + elm_object_text_set(en, elm_config_web_backend_get()); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(en); + elm_box_pack_end(bx3, en); + + web_backend_entry = en; + + evas_object_data_set(win, "etc", bx); + + elm_naviframe_item_simple_push(naviframe, bx); +} + +static Evas_Object * +_sample_theme_new(Evas_Object *win) +{ + Evas_Object *base, *bg, *bt, *ck, *rd, *rdg, *sl, *fr, *li, *rc, *sp; + + base = elm_table_add(win); + evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(base, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(base, bg, 0, 0, 2, 5); + evas_object_show(bg); + + bt = elm_button_add(win); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_object_text_set(bt, "Button"); + elm_table_pack(base, bt, 0, 0, 1, 1); + evas_object_show(bt); + + ck = elm_check_add(win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0); + elm_object_text_set(ck, "Check"); + elm_table_pack(base, ck, 0, 1, 1, 1); + evas_object_show(ck); + + rd = elm_radio_add(win); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + elm_radio_state_value_set(rd, 0); + elm_object_text_set(rd, "Radio 1"); + elm_table_pack(base, rd, 1, 0, 1, 1); + evas_object_show(rd); + rdg = rd; + + rd = elm_radio_add(win); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + elm_radio_state_value_set(rd, 1); + elm_object_text_set(rd, "Radio 2"); + elm_radio_group_add(rd, rdg); + elm_table_pack(base, rd, 1, 1, 1, 1); + evas_object_show(rd); + + sp = elm_separator_add(win); + elm_separator_horizontal_set(sp, EINA_TRUE); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + elm_table_pack(base, sp, 0, 2, 2, 1); + evas_object_show(sp); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "Slider"); + elm_slider_span_size_set(sl, 120); + elm_slider_min_max_set(sl, 1, 10); + elm_slider_value_set(sl, 4); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(base, sl, 0, 3, 2, 1); + evas_object_show(sl); + + fr = elm_frame_add(win); + elm_object_text_set(fr, "Frame"); + elm_table_pack(base, fr, 0, 4, 2, 1); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(fr); + + li = elm_list_add(win); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_content_set(fr, li); + evas_object_show(li); + + elm_list_item_append(li, "List Item 1", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Second Item", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Third Item", NULL, NULL, NULL, NULL); + elm_list_go(li); + + rc = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_weight_set(rc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_min_set(rc, 160, 120); + elm_table_pack(base, rc, 0, 4, 2, 1); + + return base; +} + +static void +_status_config_themes(Evas_Object *win, + Evas_Object *naviframe) +{ + Evas_Object *tb, *rc, *sc, *sp, *li, *pd, *fr, *bt, *sample; + Eina_List *list, *l; + char *th, *s, *ext; + Elm_Theme *d; + Elm_Object_Item *list_it, *def_it = NULL; + const char *theme_name, *sep[20]; + unsigned int x; + + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + rc = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_weight_set(rc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_min_set(rc, 0, 130); + elm_table_pack(tb, rc, 0, 0, 1, 1); + + rc = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_weight_set(rc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_min_set(rc, 0, 200); + elm_table_pack(tb, rc, 0, 1, 1, 1); + + ///////////////////////////////////////////// + + pd = elm_frame_add(win); + elm_object_style_set(pd, "pad_medium"); + evas_object_size_hint_weight_set(pd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(pd, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, pd, 0, 0, 1, 1); + evas_object_show(pd); + + li = elm_list_add(win); + elm_list_multi_select_set(li, EINA_TRUE); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_content_set(pd, li); + evas_object_show(li); + + list = elm_theme_name_available_list_new(); + d = elm_theme_default_get(); + theme_name = elm_theme_get(d); + for (x = 1, sep[0] = theme_name; x < sizeof(sep) / sizeof(sep[0]); x++) + { + sep[x] = strchr(sep[x - 1] + 1, ':'); + if (!sep[x]) break; + } + EINA_LIST_FOREACH(list, l, th) + { + Theme *t; + int y; + + t = calloc(1, sizeof(Theme)); + t->name = eina_stringshare_add(th); + s = elm_theme_list_item_path_get(th, &(t->in_search_path)); + if (s) + { + t->path = eina_stringshare_add(s); + free(s); + } + if (t->in_search_path) + { + s = strdup(th); + if (s) + { + s[0] = toupper(s[0]); + t->label = eina_stringshare_add(s); + free(s); + } + else + t->label = eina_stringshare_add(s); + } + else + { + s = strdup(ecore_file_file_get(th)); + if (s) + { + s[0] = toupper(s[0]); + ext = strrchr(s, '.'); + if (ext) *ext = 0; + t->label = eina_stringshare_add(s); + free(s); + } + else + t->label = eina_stringshare_add(s); + } + themes = eina_list_append(themes, t); + list_it = elm_list_item_append(li, t->label, NULL, NULL, NULL, t); + if (!strcmp(t->name, "default")) def_it = list_it; + for (y = x - 1 /* ignore default e theme */; y > 0; y--) + { + const char *start = (sep[y - 1][0] == ':') ? sep[y - 1] + 1 : sep[y - 1]; + unsigned int len = (unsigned int)(sep[y] - start); + if (strncmp(start , t->name, len) || (strlen(t->name) != len)) continue; + + if (!elm_list_item_selected_get(list_it)) + elm_list_item_selected_set(list_it, EINA_TRUE); + break; + } + } + if (!elm_list_selected_items_get(li)) + elm_list_item_selected_set(def_it, EINA_TRUE); + evas_object_smart_callback_add(li, "selected", _theme_sel, NULL); + evas_object_smart_callback_add(li, "unselected", _theme_sel, NULL); + elm_theme_name_available_list_free(list); + + elm_list_go(li); + + pd = elm_frame_add(win); + elm_object_style_set(pd, "pad_medium"); + evas_object_size_hint_weight_set(pd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(pd, 0.9, 0.9); + elm_table_pack(tb, pd, 0, 0, 1, 1); + evas_object_show(pd); + + /* FIXME: not implemented yet + bt = elm_button_add(win); + evas_object_smart_callback_add(bt, "clicked", _theme_browse, win); + elm_object_text_set(bt, "Browse..."); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.9, 0.9); + elm_object_content_set(pd, bt); + evas_object_show(bt); + */ + pd = elm_frame_add(win); + elm_object_style_set(pd, "pad_medium"); + evas_object_size_hint_weight_set(pd, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(pd, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, pd, 0, 1, 1, 1); + evas_object_show(pd); + + fr = elm_frame_add(win); + elm_object_text_set(fr, "Preview"); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_content_set(pd, fr); + evas_object_show(fr); + + sc = elm_scroller_add(win); + elm_scroller_bounce_set(sc, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_content_set(fr, sc); + evas_object_show(sc); + + sample = _sample_theme_new(win); + elm_object_content_set(sc, sample); + evas_object_show(sample); + evas_object_data_set(win, "theme_preview", sample); + + ///////////////////////////////////////////// + sp = elm_separator_add(win); + elm_separator_horizontal_set(sp, EINA_TRUE); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + elm_table_pack(tb, sp, 0, 2, 1, 1); + evas_object_show(sp); + + pd = elm_frame_add(win); + elm_object_style_set(pd, "pad_medium"); + evas_object_size_hint_weight_set(pd, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(pd, 0.5, 0.5); + elm_table_pack(tb, pd, 0, 3, 1, 1); + evas_object_show(pd); + + bt = elm_button_add(win); + evas_object_smart_callback_add(bt, "clicked", _theme_use, win); + elm_object_text_set(bt, "Use Theme"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bt, 0.5, 0.5); + elm_object_content_set(pd, bt); + evas_object_show(bt); + + evas_object_data_set(win, "themes", tb); + elm_naviframe_item_simple_push(naviframe, tb); +} + +static void +_font_preview_update(Evas_Object *win) +{ + Evas_Font_Size sz; + char *name; + + if (!fndata.cur_font) + return; + + name = elm_font_fontconfig_name_get(fndata.cur_font, fndata.cur_style); + sz = fndata.cur_size; + + if (sz < 0) + sz = (-sz * 10) / 100; + if (sz == 0) + sz = 10; + + edje_object_text_class_set(evas_object_data_get(win, "font_preview"), + "font_preview", name, sz); + + elm_font_fontconfig_name_free(name); +} + +static void +_font_classes_list_sel(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info) +{ + const Eina_List *f_names_items, *l; + Elm_Text_Class_Data *tc_data; + Evas_Object *f_names_list; + Elm_Object_Item *list_it; + + tc_data = elm_object_item_data_get(event_info); + if (!tc_data) return; + + f_names_list = evas_object_data_get(elm_object_top_widget_get(obj), + "font_names_list"); + ELM_LIST_ENABLE(f_names_list); + + f_names_items = elm_list_items_get(f_names_list); + + EINA_LIST_FOREACH(f_names_items, l, list_it) + { + const char *s; + + s = elm_object_item_text_get(list_it); + if (!s) continue; + + if (tc_data->font && !strcmp(s, tc_data->font)) + { + elm_list_item_selected_set(list_it, EINA_TRUE); + elm_list_item_show(list_it); + break; + } + } +} + +static void +_font_names_list_sel(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info) +{ + Evas_Object *style_list, *cls_list, *win; + const char *style, *sel_font; + Elm_Text_Class_Data *tc_data; + Elm_Object_Item *list_it, *fc_list_it; + Elm_Font_Properties *efp; + const Eina_List *l; + + list_it = event_info; + sel_font = elm_object_item_text_get(list_it); + + win = elm_object_top_widget_get(obj); + style_list = evas_object_data_get(win, "font_styles_list"); + cls_list = evas_object_data_get(win, "font_classes_list"); + + fc_list_it = elm_list_selected_item_get(cls_list); + if (!fc_list_it) return; /* should not happen, fonts list disabled in + * this case */ + + eina_stringshare_replace(&fndata.cur_font, sel_font); + + tc_data = elm_object_item_data_get(fc_list_it); + if (!tc_data) return; + if (tc_data->font) eina_stringshare_del(tc_data->font); + if (fndata.cur_font) tc_data->font = eina_stringshare_ref(fndata.cur_font); + + /* load styles list */ + efp = eina_hash_find(fndata.font_hash, sel_font); + if (!efp) return; + + ELM_LIST_ENABLE(style_list); + elm_list_clear(style_list); + + evas_event_freeze(evas_object_evas_get(style_list)); + edje_freeze(); + + list_it = NULL; + + EINA_LIST_FOREACH(efp->styles, l, style) + { + Elm_Object_Item *i; + + i = elm_list_item_append(style_list, style, NULL, NULL, + _font_styles_list_sel, NULL); + + if (tc_data->style && (!strcmp(style, tc_data->style))) + list_it = i; + } + + elm_list_go(style_list); + + edje_thaw(); + evas_event_thaw(evas_object_evas_get(style_list)); + + if (list_it) + elm_list_item_selected_set(list_it, EINA_TRUE); + + _font_preview_update(win); +} + +static void +_font_styles_list_sel(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info) +{ + Evas_Object *fc_list, *fs_list, *win; + Elm_Text_Class_Data *tc_data; + const Eina_List *l; + Elm_Object_Item *list_it; + + win = elm_object_top_widget_get(obj); + fc_list = evas_object_data_get(win, "font_classes_list"); + fs_list = evas_object_data_get(win, "font_sizes_list"); + + list_it = elm_list_selected_item_get(fc_list); + if (!list_it) return; /* should not happen */ + + eina_stringshare_replace(&fndata.cur_style, + elm_object_item_text_get(event_info)); + ELM_LIST_ENABLE(fs_list); + + tc_data = elm_object_item_data_get(list_it); + if (!tc_data) return; + eina_stringshare_del(tc_data->style); + tc_data->style = eina_stringshare_ref(fndata.cur_style); + + evas_event_freeze(evas_object_evas_get(fs_list)); + edje_freeze(); + + EINA_LIST_FOREACH(elm_list_items_get(fs_list), l, list_it) + { + Elm_Font_Size_Data *sdata; + + sdata = elm_object_item_data_get(list_it); + if (!sdata) continue; + elm_list_item_selected_set(l->data, EINA_FALSE); + + if (tc_data->size == sdata->size) + { + elm_list_item_selected_set(list_it, EINA_TRUE); + elm_list_item_show(list_it); + break; + } + } + + edje_thaw(); + evas_event_thaw(evas_object_evas_get(fs_list)); + + _font_preview_update(win); +} + +static void +_font_sizes_list_sel(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Elm_Text_Class_Data *tc_data; + Evas_Object *fc_list, *win; + Elm_Font_Size_Data *sd; + Elm_Object_Item *list_it; + + win = elm_object_top_widget_get(obj); + fc_list = evas_object_data_get(win, "font_classes_list"); + + list_it = elm_list_selected_item_get(fc_list); + if (!list_it) return; /* should not happen */ + sd = elm_object_item_data_get(event_info); + if (!sd) return; + + fndata.cur_size = sd->size; + + tc_data = elm_object_item_data_get(list_it); + if (!tc_data) return; + tc_data->size = fndata.cur_size; + + _font_preview_update(win); +} + +static void +_fstyle_list_unselect_cb(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Evas_Object *sizes_list, *win; + + if (elm_list_selected_item_get(obj)) return; + + win = elm_object_top_widget_get(obj); + + sizes_list = evas_object_data_get(win, "font_sizes_list"); + ELM_LIST_DISABLE(sizes_list); +} + +static void +_fc_list_unselect_cb(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Evas_Object *font_names_list, *styles_list, *sizes_list, *win; + + if (elm_list_selected_item_get(obj)) return; + + win = elm_object_top_widget_get(obj); + + font_names_list = evas_object_data_get(win, "font_names_list"); + ELM_LIST_DISABLE(font_names_list); + + styles_list = evas_object_data_get(win, "font_styles_list"); + ELM_LIST_DISABLE(styles_list); + + sizes_list = evas_object_data_get(win, "font_sizes_list"); + ELM_LIST_DISABLE(sizes_list); +} + +static void +_font_classes_list_load(Evas_Object *li) +{ + Elm_Text_Class_Data *tc_data; + Eina_List *l; + Evas *evas; + + evas = evas_object_evas_get(li); + evas_event_freeze(evas); + edje_freeze(); + + EINA_LIST_FOREACH(fndata.text_classes, l, tc_data) + elm_list_item_append(li, tc_data->desc, NULL, NULL, + _font_classes_list_sel, tc_data); + + evas_object_smart_callback_add(li, "unselected", _fc_list_unselect_cb, + NULL); + + elm_list_go(li); + edje_thaw(); + evas_event_thaw(evas); +} + +static void +_fonts_data_fill(Evas *evas) +{ + const Eina_List *fo_list, *l; + Eina_List *text_classes; + Elm_Text_Class_Data *tc_data; + Elm_Font_Size_Data *sd; + Elm_Font_Overlay *efo; + Eina_List *evas_fonts; + Elm_Text_Class *etc; + int i; + + evas_fonts = evas_font_available_list(evas); + fndata.font_hash = elm_font_available_hash_add(evas_fonts); + evas_font_available_list_free(evas, evas_fonts); + + text_classes = elm_config_text_classes_list_get(); + fo_list = elm_config_font_overlay_list_get(); + + EINA_LIST_FOREACH(text_classes, l, etc) + { + const Eina_List *ll; + + tc_data = calloc(1, sizeof(*tc_data)); + if (!tc_data) continue; + + tc_data->name = eina_stringshare_add(etc->name); + tc_data->desc = eina_stringshare_add(etc->desc); + + EINA_LIST_FOREACH(fo_list, ll, efo) + { + if (strcmp(tc_data->name, efo->text_class)) + continue; + + if (efo->font) + { + Elm_Font_Properties *efp; + + efp = elm_font_properties_get(efo->font); + if (efp) + { + tc_data->font = eina_stringshare_add(efp->name); + /* we're sure we recorded with only 1 style selected */ + tc_data->style = eina_stringshare_add(efp->styles->data); + elm_font_properties_free(efp); + } + } + tc_data->size = efo->size; + } + + fndata.text_classes = eina_list_append(fndata.text_classes, tc_data); + } + + elm_config_text_classes_list_free(text_classes); + + /* FIXME: hinting later */ + /* fndata.hinting = e_config->font_hinting; */ + + sd = calloc(1, sizeof(Elm_Font_Size_Data)); + sd->size_str = eina_stringshare_add("Tiny"); + sd->size = -50; + fndata.font_scale_list = eina_list_append(fndata.font_scale_list, sd); + + sd = calloc(1, sizeof(Elm_Font_Size_Data)); + sd->size_str = eina_stringshare_add("Small"); + sd->size = -80; + fndata.font_scale_list = eina_list_append(fndata.font_scale_list, sd); + + sd = calloc(1, sizeof(Elm_Font_Size_Data)); + sd->size_str = eina_stringshare_add("Normal"); + sd->size = -100; + fndata.font_scale_list = eina_list_append(fndata.font_scale_list, sd); + + sd = calloc(1, sizeof(Elm_Font_Size_Data)); + sd->size_str = eina_stringshare_add("Big"); + sd->size = -150; + fndata.font_scale_list = eina_list_append(fndata.font_scale_list, sd); + + sd = calloc(1, sizeof(Elm_Font_Size_Data)); + sd->size_str = eina_stringshare_add("Really Big"); + sd->size = -190; + fndata.font_scale_list = eina_list_append(fndata.font_scale_list, sd); + + sd = calloc(1, sizeof(Elm_Font_Size_Data)); + sd->size_str = eina_stringshare_add("Huge"); + sd->size = -250; + fndata.font_scale_list = eina_list_append(fndata.font_scale_list, sd); + + for (i = 5; i < 51; i++) + { + char str[16]; + + str[0] = 0; + snprintf(str, sizeof(str), "%d pixels", i); + + sd = calloc(1, sizeof(Elm_Font_Size_Data)); + sd->size_str = eina_stringshare_add(str); + sd->size = i; + fndata.font_px_list = eina_list_append(fndata.font_px_list, sd); + } +} + +static int +_font_sort_cb(const void *data1, + const void *data2) +{ + if (!data1) return 1; + if (!data2) return -1; + return strcmp(data1, data2); +} + +static void +_font_sizes_list_load(Evas_Object *size_list) +{ + Elm_Font_Size_Data *size_data; + Eina_List *l; + Evas *evas; + + evas = evas_object_evas_get(size_list); + evas_event_freeze(evas); + edje_freeze(); + + EINA_LIST_FOREACH(fndata.font_scale_list, l, size_data) + elm_list_item_append(size_list, size_data->size_str, NULL, NULL, + _font_sizes_list_sel, size_data); + + EINA_LIST_FOREACH(fndata.font_px_list, l, size_data) + elm_list_item_append(size_list, size_data->size_str, NULL, NULL, + _font_sizes_list_sel, size_data); + + elm_list_go(size_list); + edje_thaw(); + evas_event_thaw(evas); +} + +static void +_fnames_list_unselect_cb(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Evas_Object *styles_list, *sizes_list, *win; + + if (elm_list_selected_item_get(obj)) return; + + win = elm_object_top_widget_get(obj); + + styles_list = evas_object_data_get(win, "font_styles_list"); + ELM_LIST_DISABLE(styles_list); + + sizes_list = evas_object_data_get(win, "font_sizes_list"); + ELM_LIST_DISABLE(sizes_list); +} + +static Eina_Bool +_font_list_fill(const Eina_Hash *hash EINA_UNUSED, + const void *key EINA_UNUSED, + void *data, + void *fdata) +{ + Elm_Font_Properties *efp; + Eina_List **flist; + + flist = fdata; + efp = data; + + *flist = eina_list_append(*flist, efp->name); + + return EINA_TRUE; +} + +static void +_font_names_list_load(Evas_Object *flist) +{ + Eina_List *l, *names_list = NULL; + const char *font; + Evas *evas; + + evas = evas_object_evas_get(flist); + evas_event_freeze(evas); + edje_freeze(); + + eina_hash_foreach(fndata.font_hash, _font_list_fill, &names_list); + names_list = eina_list_sort(names_list, eina_list_count(names_list), + _font_sort_cb); + + EINA_LIST_FOREACH(names_list, l, font) + elm_list_item_append(flist, font, NULL, NULL, _font_names_list_sel, NULL); + + eina_list_free(names_list); + + evas_object_smart_callback_add(flist, "unselected", + _fnames_list_unselect_cb, NULL); + + elm_list_go(flist); + + edje_thaw(); + evas_event_thaw(evas); +} + +static void +_status_config_fonts(Evas_Object *win, + Evas_Object *naviframe) +{ + Evas_Object *base, *fr, *li, *rc, *preview, *sp, *pd, *bt, *bx; + char buf[PATH_MAX]; + + _fonts_data_fill(evas_object_evas_get(win)); + + base = elm_table_add(win); + evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(base, EVAS_HINT_FILL, EVAS_HINT_FILL); + + /* yeah, dummy rectangles are ugly as hell, but no good way yet of + fixing sizes */ + rc = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_weight_set(rc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(rc, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_min_set(rc, 70, 170); + elm_table_pack(base, rc, 1, 0, 1, 1); + + fr = elm_frame_add(win); + elm_object_text_set(fr, "Font Class"); + elm_table_pack(base, fr, 0, 0, 1, 2); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(fr); + + /* FIXME: no multiselection for this list, for now */ + li = elm_list_add(win); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_content_set(fr, li); + evas_object_show(li); + + evas_object_data_set(win, "font_classes_list", li); + _font_classes_list_load(li); + + fr = elm_frame_add(win); + elm_object_text_set(fr, "Font"); + elm_table_pack(base, fr, 1, 0, 1, 2); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(fr); + + li = elm_list_add(win); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_content_set(fr, li); + evas_object_show(li); + + evas_object_data_set(win, "font_names_list", li); + _font_names_list_load(li); + ELM_LIST_DISABLE(li); + + rc = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_weight_set(rc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(rc, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_min_set(rc, 70, 130); + elm_table_pack(base, rc, 1, 2, 1, 1); + + fr = elm_frame_add(win); + elm_object_text_set(fr, "Style"); + elm_table_pack(base, fr, 0, 2, 1, 1); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(fr); + ELM_LIST_DISABLE(li); + + li = elm_list_add(win); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_content_set(fr, li); + evas_object_show(li); + + evas_object_data_set(win, "font_styles_list", li); + evas_object_smart_callback_add(li, "unselected", _fstyle_list_unselect_cb, + NULL); + + fr = elm_frame_add(win); + elm_object_text_set(fr, "Size"); + elm_table_pack(base, fr, 1, 2, 1, 1); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(fr); + + li = elm_list_add(win); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_content_set(fr, li); + evas_object_show(li); + + evas_object_data_set(win, "font_sizes_list", li); + _font_sizes_list_load(li); + ELM_LIST_DISABLE(li); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(base, bx, 0, 3, 2, 1); + evas_object_show(bx); + + /* FIXME: what to do here? dedicated widget? some new entry API set? */ + snprintf(buf, sizeof(buf), "%s/objects/font_preview.edj", elm_app_data_dir_get()); + preview = elm_layout_add(win); + elm_layout_file_set(preview, buf, "font_preview"); + elm_object_part_text_set(preview, "elm.text", "Preview Text — 我真的会写中文"); + evas_object_size_hint_weight_set(preview, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(preview, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(preview); + + elm_box_pack_end(bx, preview); + evas_object_data_set(win, "font_preview", elm_layout_edje_get(preview)); + + ///////////////////////////////////////////// + sp = elm_separator_add(win); + elm_separator_horizontal_set(sp, EINA_TRUE); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + elm_table_pack(base, sp, 0, 4, 2, 1); + evas_object_show(sp); + + pd = elm_frame_add(win); + elm_object_style_set(pd, "pad_medium"); + evas_object_size_hint_weight_set(pd, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(pd, 0.5, 0.5); + elm_table_pack(base, pd, 0, 5, 2, 1); + evas_object_show(pd); + + bx = elm_box_add(win); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(bx); + + bt = elm_button_add(win); + evas_object_smart_callback_add(bt, "clicked", _font_overlay_set_all, win); + elm_object_text_set(bt, "Set to All"); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_size_hint_align_set(bt, 0.5, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + evas_object_smart_callback_add(bt, "clicked", _font_overlay_reset, win); + elm_object_text_set(bt, "Reset"); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_size_hint_align_set(bt, 0.5, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + evas_object_smart_callback_add(bt, "clicked", _font_overlay_reset_all, win); + elm_object_text_set(bt, "Reset All"); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_size_hint_align_set(bt, 0.5, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + evas_object_smart_callback_add(bt, "clicked", _font_overlay_change, win); + elm_object_text_set(bt, "Apply"); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_size_hint_align_set(bt, 0.5, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + elm_object_content_set(pd, bx); + + evas_object_data_set(win, "fonts", base); + + elm_naviframe_item_simple_push(naviframe, base); +} + +static void +_profiles_list_item_del_cb(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + free(data); +} + +static void +_profiles_list_selected_cb(void *data, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + const char *cur_profile = NULL; + const char *sel_profile, *pdir; + const char *prof_name; + char buf[PATH_MAX]; + Evas_Object *en; +#ifdef ELM_EFREET + Efreet_Desktop *desk = NULL; +#endif + + sel_profile = data; + if (!sel_profile) + return; + + cur_profile = elm_config_profile_get(); + + pdir = elm_config_profile_dir_get(sel_profile, EINA_TRUE); + if (!pdir) pdir = elm_config_profile_dir_get(sel_profile, EINA_FALSE); +#ifdef ELM_EFREET + snprintf(buf, sizeof(buf), "%s/profile.desktop", pdir); + desk = efreet_desktop_new(buf); + if ((desk) && (desk->name)) prof_name = desk->name; + else + { + if (desk) efreet_desktop_free(desk); + if (pdir) elm_config_profile_dir_free(pdir); + + pdir = elm_config_profile_dir_get(sel_profile, EINA_FALSE); + snprintf(buf, sizeof(buf), "%s/profile.desktop", pdir); + desk = efreet_desktop_new(buf); + if ((desk) && (desk->name)) prof_name = desk->name; + else prof_name = cur_profile; + } +#endif + + if (!pdir) + elm_object_disabled_set(evas_object_data_get(obj, "prof_reset_btn"), + EINA_TRUE); + else + { + elm_object_disabled_set(evas_object_data_get(obj, "prof_del_btn"), + EINA_TRUE); + elm_object_disabled_set(evas_object_data_get(obj, "prof_reset_btn"), + EINA_FALSE); + elm_object_disabled_set(evas_object_data_get(obj, "prof_use_btn"), + EINA_FALSE); + elm_config_profile_dir_free(pdir); + } + + snprintf(buf, sizeof(buf), "<hilight>Selected profile: %s</><br/>", + prof_name); + elm_object_text_set(evas_object_data_get(obj, "prof_name_lbl"), buf); + + en = evas_object_data_get(obj, "prof_desc_entry"); +#ifdef ELM_EFREET + if (desk) elm_object_text_set(en, desk->comment); + else +#endif + elm_object_text_set(en, "Unknown"); + +#ifdef ELM_EFREET + if (desk) efreet_desktop_free(desk); +#endif +} + +static void +_profiles_list_fill(Evas_Object *l_widget, + Eina_List *p_names) +{ + const char *cur_profile = NULL; + const char *profile; + void *sel_it = NULL; + Eina_List *l; + + if (!p_names) + return; + + elm_list_clear(l_widget); + + cur_profile = elm_config_profile_get(); + + EINA_LIST_FOREACH(p_names, l, profile) + { +#ifdef ELM_EFREET + Efreet_Desktop *desk = NULL; +#endif + const char *label, *ext, *pdir; + char buf[PATH_MAX]; + Elm_Object_Item *list_it; + Evas_Object *ic; + + pdir = elm_config_profile_dir_get(profile, EINA_TRUE); + if (!pdir) pdir = elm_config_profile_dir_get(profile, EINA_FALSE); + +#ifdef ELM_EFREET + snprintf(buf, sizeof(buf), "%s/profile.desktop", pdir); + desk = efreet_desktop_new(buf); + if ((desk) && (desk->name)) label = desk->name; + else + { + if (desk) efreet_desktop_free(desk); + if (pdir) elm_config_profile_dir_free(pdir); + + pdir = elm_config_profile_dir_get(profile, EINA_FALSE); + snprintf(buf, sizeof(buf), "%s/profile.desktop", pdir); + desk = efreet_desktop_new(buf); + if ((desk) && (desk->name)) label = desk->name; + else label = profile; + } +#endif + + buf[0] = 0; + if (pdir) snprintf(buf, sizeof(buf), "%s/icon.edj", pdir); +#ifdef ELM_EFREET + if ((desk) && (desk->icon) && (pdir)) + snprintf(buf, sizeof(buf), "%s/%s", pdir, desk->icon); +#endif + ic = elm_icon_add(l_widget); + ext = strrchr(buf, '.'); + if (ext) + { + if (!strcmp(ext, ".edj")) elm_image_file_set(ic, buf, "icon"); + else elm_image_file_set(ic, buf, NULL); + } + + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, + 1, 1); + evas_object_show(ic); + + list_it = elm_list_item_append(l_widget, label, ic, NULL, + _profiles_list_selected_cb, + strdup(profile)); + elm_object_item_del_cb_set(list_it, _profiles_list_item_del_cb); + if (cur_profile && !strcmp(profile, cur_profile)) + sel_it = list_it; + + elm_config_profile_dir_free(pdir); + +#ifdef ELM_EFREET + if (desk) efreet_desktop_free(desk); +#endif + } + + if (sel_it) elm_list_item_selected_set(sel_it, EINA_TRUE); + elm_list_go(l_widget); +} + +static void +_profiles_list_unselect_cb(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + if (elm_list_selected_item_get(obj)) return; + elm_object_disabled_set(evas_object_data_get(obj, "prof_del_btn"), + EINA_TRUE); + elm_object_disabled_set(evas_object_data_get(obj, "prof_reset_btn"), + EINA_TRUE); + elm_object_disabled_set(evas_object_data_get(obj, "prof_use_btn"), + EINA_TRUE); +} + +static void +_status_config_profiles(Evas_Object *win, + Evas_Object *naviframe) +{ + Evas_Object *li, *bx, *fr_bx1, *fr_bx2, *btn_bx, *fr, *lb, *en, *sp, *pd, + *bt; + Eina_List *profs; + Evas *evas; + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + + fr_bx1 = elm_box_add(win); + evas_object_size_hint_weight_set(fr_bx1, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fr_bx1, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_homogeneous_set(fr_bx1, EINA_TRUE); + evas_object_show(fr_bx1); + + fr_bx2 = elm_box_add(win); + evas_object_size_hint_weight_set(fr_bx2, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fr_bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(fr_bx2); + + fr = elm_frame_add(win); + elm_object_text_set(fr, "Available Profiles"); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_content_set(fr, fr_bx1); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + li = elm_list_add(win); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(li, "unselected", _profiles_list_unselect_cb, + NULL); + + profs = elm_config_profile_list_get(); + + evas_object_show(li); + elm_box_pack_end(fr_bx2, li); + + lb = elm_label_add(win); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, 0.5); + + evas_object_show(lb); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_editable_set(en, EINA_FALSE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(en); + + evas_object_data_set(li, "prof_name_lbl", lb); + evas_object_data_set(li, "prof_desc_entry", en); + + elm_box_pack_end(fr_bx2, lb); + elm_box_pack_end(fr_bx1, fr_bx2); + elm_box_pack_end(fr_bx1, en); + + ///////////////////////////////////////////// + sp = elm_separator_add(win); + elm_separator_horizontal_set(sp, EINA_TRUE); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + pd = elm_frame_add(win); + elm_object_style_set(pd, "pad_medium"); + evas_object_size_hint_weight_set(pd, 0.0, 0.0); + evas_object_size_hint_align_set(pd, 0.5, 0.5); + elm_box_pack_end(bx, pd); + evas_object_show(pd); + + btn_bx = elm_box_add(win); + elm_box_horizontal_set(btn_bx, EINA_TRUE); + evas_object_size_hint_weight_set(btn_bx, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn_bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(btn_bx); + + bt = elm_button_add(win); + evas_object_smart_callback_add(bt, "clicked", _profile_use, li); + elm_object_text_set(bt, "Use"); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_size_hint_align_set(bt, 0.5, 0.5); + elm_box_pack_end(btn_bx, bt); + evas_object_show(bt); + + evas_object_data_set(li, "prof_use_btn", bt); + + bt = elm_button_add(win); + evas_object_smart_callback_add(bt, "clicked", _btn_todo, NULL); /* TODO */ + elm_object_text_set(bt, "Delete"); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_size_hint_align_set(bt, 0.5, 0.5); + elm_box_pack_end(btn_bx, bt); + evas_object_show(bt); + + evas_object_data_set(li, "prof_del_btn", bt); + + bt = elm_button_add(win); + evas_object_smart_callback_add(bt, "clicked", _profile_reset, li); + elm_object_text_set(bt, "Reset"); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_size_hint_align_set(bt, 0.5, 0.5); + elm_box_pack_end(btn_bx, bt); + evas_object_show(bt); + + evas_object_data_set(li, "prof_reset_btn", bt); + + bt = elm_button_add(win); + evas_object_smart_callback_add(bt, "clicked", _btn_todo, NULL); /* TODO */ + elm_object_text_set(bt, "Add new"); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_size_hint_align_set(bt, 0.5, 0.5); + elm_box_pack_end(btn_bx, bt); + evas_object_show(bt); + + elm_object_content_set(pd, btn_bx); + + evas = evas_object_evas_get(li); + evas_event_freeze(evas); + edje_freeze(); + + _profiles_list_fill(li, profs); + + elm_config_profile_list_free(profs); + + edje_thaw(); + evas_event_thaw(evas); + + evas_object_data_set(win, "profiles", bx); + elm_naviframe_item_simple_push(naviframe, bx); +} + +static void +_status_config_scrolling_bounce(Evas_Object *win, Evas_Object *box) +{ + Evas_Object *fr, *bx, *ck, *pd, *lb, *sl; + + fr = elm_frame_add(box); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(fr, "Bounce"); + elm_box_pack_end(box, fr); + evas_object_show(fr); + + bx = elm_box_add(fr); + elm_object_content_set(fr, bx); + evas_object_show(bx); + + /* Enable Scroll Bounce */ + CHECK_ADD("Enable scroll bounce", + "Set whether scrollers should bounce<br/>" + "when they reach their viewport's edge<br/>" + "during a scroll", + sb_change, NULL); + evas_object_data_set(win, "scroll_bounce_check", ck); + elm_check_state_set(ck, elm_config_scroll_bounce_enabled_get()); + + /* Scroll bounce friction */ + LABEL_FRAME_ADD("<hilight>Scroll bounce friction</>"); + + sl = elm_slider_add(bx); + elm_object_tooltip_text_set(sl, "This is the amount of inertia a <br/>" + "scroller will impose at bounce animations"); + evas_object_data_set(win, "bounce_friction_slider", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.2f"); + elm_slider_indicator_format_set(sl, "%1.2f"); + elm_slider_min_max_set(sl, 0.0, 4.0); + elm_slider_value_set(sl, elm_config_scroll_bounce_friction_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", bf_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", bf_change, NULL); +} + +static void +_status_config_scrolling_thumb(Evas_Object *win, Evas_Object *box) +{ + Evas_Object *fr, *bx, *ck, *sl, *sp, *pd, *lb; + + fr = elm_frame_add(box); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(fr, "Thumb Scroll"); + elm_box_pack_end(box, fr); + evas_object_show(fr); + + bx = elm_box_add(fr); + elm_object_content_set(fr, bx); + evas_object_show(bx); + + /* Enable thumb scroll */ + CHECK_ADD("Enable thumb scroll", + "Set whether scrollers should be<br/>" + "draggable from any point in their views", + ts_change, NULL); + evas_object_data_set(win, "thumbscroll_check", ck); + elm_check_state_set(ck, elm_config_scroll_thumbscroll_enabled_get()); + + /* Thumb scroll threadhold */ + LABEL_FRAME_ADD("<hilight>Thumb scroll threshold</>"); + + sl = elm_slider_add(win); + elm_object_tooltip_text_set(sl, "This is the number of pixels one should<br/>" + "travel while dragging a scroller's view<br/>" + "to actually trigger scrolling"); + evas_object_data_set(win, "ts_threshold_slider", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.0f pixels"); + elm_slider_indicator_format_set(sl, "%1.0f"); + elm_slider_min_max_set(sl, 8.0, 50.0); + elm_slider_value_set(sl, elm_config_scroll_thumbscroll_threshold_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", tst_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", tst_change, NULL); + + /* Thumb scroll hold threashold */ + LABEL_FRAME_ADD("<hilight>Thumb scroll hold threshold</>"); + + sl = elm_slider_add(win); + elm_object_tooltip_text_set(sl, "This is the number of pixels the range<br/>" + "which can be scrolled, while the scroller<br/>" + "is holed"); + evas_object_data_set(win, "ts_hold_threshold_slider", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.0f pixels"); + elm_slider_indicator_format_set(sl, "%1.0f"); + elm_slider_min_max_set(sl, 4.0, 500.0); + elm_slider_value_set(sl, elm_config_scroll_thumbscroll_hold_threshold_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", tsht_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", tsht_change, NULL); + + /* Thumb scroll momentum threshold */ + LABEL_FRAME_ADD("<hilight>Thumb scroll momentum threshold</>"); + + sl = elm_slider_add(win); + elm_object_tooltip_text_set(sl, "This is the minimum speed of mouse <br/>" + "cursor movement which will trigger<br/>" + "list self scrolling animation after a<br/>" + "mouse up event (pixels/second)"); + evas_object_data_set(win, "ts_momentum_threshold_slider", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.0f pixels/s"); + elm_slider_indicator_format_set(sl, "%1.0f"); + elm_slider_min_max_set(sl, 10.0, 200.0); + elm_slider_value_set(sl, elm_config_scroll_thumbscroll_momentum_threshold_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", tsmt_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", tsmt_change, + NULL); + + /* Thumb scroll flick distance tolerance */ + LABEL_FRAME_ADD("<hilight>Thumb scroll flick distance tolerance</>"); + + sl = elm_slider_add(win); + elm_object_tooltip_text_set(sl, "This is the number of pixels the maximum<br/>" + "distance which can be flicked. If it is<br/>" + "flicked more than this, the flick distance<br/>" + "is same with maximum distance"); + evas_object_data_set(win, "ts_flick_distance_tolerance_slider", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.0f pixels"); + elm_slider_indicator_format_set(sl, "%1.0f"); + elm_slider_min_max_set(sl, 100.0, 3000.0); + elm_slider_value_set(sl, elm_config_scroll_thumbscroll_flick_distance_tolerance_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", tsfdt_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", tsfdt_change, NULL); + + /* Thumb scroll friction */ + LABEL_FRAME_ADD("<hilight>Thumb scroll friction</>"); + + sl = elm_slider_add(win); + elm_object_tooltip_text_set(sl, "This is the amount of inertia a<br/>" + "scroller will impose at self scrolling<br/>" + "animations"); + evas_object_data_set(win, "ts_friction_slider", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.1f"); + elm_slider_indicator_format_set(sl, "%1.1f"); + elm_slider_min_max_set(sl, 0.1, 10.0); + elm_slider_value_set(sl, elm_config_scroll_thumbscroll_friction_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", tsf_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", tsf_change, NULL); + + /* Thumb scroll min friction */ + LABEL_FRAME_ADD("<hilight>Thumb scroll min friction</>"); + + sl = elm_slider_add(win); + elm_object_tooltip_text_set(sl, "This is the min amount of inertia a<br/>" + "scroller will impose at self scrolling<br/>" + "animations"); + evas_object_data_set(win, "ts_min_friction_slider", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.1f"); + elm_slider_indicator_format_set(sl, "%1.1f"); + elm_slider_min_max_set(sl, 0.1, 10.0); + elm_slider_value_set(sl, elm_config_scroll_thumbscroll_min_friction_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", tsmf_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", tsmf_change, NULL); + + /* Thumb scroll friction standard */ + LABEL_FRAME_ADD("<hilight>Thumb scroll friction standard</>"); + + sl = elm_slider_add(win); + elm_object_tooltip_text_set(sl, "This is the standard velocity of the scroller." + "<br/>The scroll animation time is same<br/>" + "with thumbscroll friction, if the velocity" + "<br/>is same with standard velocity."); + evas_object_data_set(win, "ts_friction_standard_slider", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.0f pixel/s"); + elm_slider_indicator_format_set(sl, "%1.0f"); + elm_slider_min_max_set(sl, 10.0, 5000.0); + elm_slider_value_set(sl, elm_config_scroll_thumbscroll_friction_standard_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", tsfs_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", tsfs_change, NULL); + + /* Thumb scroll border friction */ + LABEL_FRAME_ADD("<hilight>Thumb scroll border friction</>"); + + sl = elm_slider_add(win); + elm_object_tooltip_text_set(sl, "This is the amount of lag between your<br/>" + "actual mouse cursor dragging movement<br/>" + "and a scroller's view movement itself,<br/>" + "while pushing it into bounce state<br/>" + "manually"); + evas_object_data_set(win, "ts_border_friction_slider", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.2f"); + elm_slider_indicator_format_set(sl, "%1.2f"); + elm_slider_min_max_set(sl, 0.0, 1.0); + elm_slider_value_set(sl, elm_config_scroll_thumbscroll_border_friction_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", tsbf_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", tsbf_change, NULL); + + /* Thumb scroll sensitivity friction */ + LABEL_FRAME_ADD("<hilight>Thumb scroll sensitivity friction</>"); + + sl = elm_slider_add(win); + elm_object_tooltip_text_set(sl, "This is the sensitivity amount which<br/>" + "is be multiplied by the length of mouse<br/>" + "dragging."); + evas_object_data_set(win, "ts_sensitivity_friction_slider", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.2f"); + elm_slider_indicator_format_set(sl, "%1.2f"); + elm_slider_min_max_set(sl, 0.1, 1.0); + elm_slider_value_set(sl, elm_config_scroll_thumbscroll_sensitivity_friction_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", tssf_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", tssf_change, NULL); + + sp = elm_separator_add(win); + elm_separator_horizontal_set(sp, EINA_TRUE); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, sp); + evas_object_show(sp); +} + +static void +_status_config_scrolling_acceleration(Evas_Object *win, Evas_Object *box) +{ + Evas_Object *fr, *bx, *sl, *pd, *lb; + + fr = elm_frame_add(box); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(fr, "Thumb Scroll Acceleration"); + elm_box_pack_end(box, fr); + evas_object_show(fr); + + bx = elm_box_add(fr); + elm_object_content_set(fr, bx); + evas_object_show(bx); + + /* Thumb scroll acceleration threshold */ + LABEL_FRAME_ADD("<hilight>Thumb scroll acceleration threshold</>"); + + sl = elm_slider_add(bx); + elm_object_tooltip_text_set(sl, "This is the minimum speed of mouse <br/>" + "cursor movement which will accelerate<br/>" + "scrolling velocity after a<br/>" + "mouse up event (pixels/second)"); + evas_object_data_set(win, "ts_acceleration_threshold_slider", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.0f pixels/s"); + elm_slider_indicator_format_set(sl, "%1.0f"); + elm_slider_min_max_set(sl, 10.0, 5000.0); + elm_slider_value_set(sl, elm_config_scroll_thumbscroll_acceleration_threshold_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", tsat_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", tsat_change, NULL); + + /* Thumb scroll acceleration time limit */ + LABEL_FRAME_ADD("<hilight>Thumb scroll acceleration time limit</>"); + + sl = elm_slider_add(bx); + elm_object_tooltip_text_set(sl, "This is the time limit for<br/>" + "accelerating velocity<br/>"); + evas_object_data_set(win, "ts_acceleration_time_limit_slider", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.1f"); + elm_slider_indicator_format_set(sl, "%1.1f"); + elm_slider_min_max_set(sl, 0.0, 15.0); + elm_slider_value_set(sl, elm_config_scroll_thumbscroll_acceleration_time_limit_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", tsatl_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", tsatl_change, NULL); + + /* Thumb scroll acceleration weight */ + LABEL_FRAME_ADD("<hilight>Thumb scroll acceleration weight</>"); + + sl = elm_slider_add(bx); + elm_object_tooltip_text_set(sl, "This is the weight for acceleration"); + evas_object_data_set(win, "ts_acceleration_weight_slider", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.1f"); + elm_slider_indicator_format_set(sl, "%1.1f"); + elm_slider_min_max_set(sl, 1.0, 10.0); + elm_slider_value_set(sl, elm_config_scroll_thumbscroll_acceleration_weight_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", tsaw_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", tsaw_change, NULL); +} + +static void +_status_config_scrolling(Evas_Object *win, + Evas_Object *naviframe) +{ + Evas_Object *lb, *pd, *box, *bx, *sl, *sc, *ck, *fr; + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0.5); + + sc = elm_scroller_add(win); + elm_scroller_step_size_set(sc, 32, 64 * elm_config_scale_get()); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE); + evas_object_show(sc); + elm_object_content_set(sc, box); + + fr = elm_frame_add(box); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(fr, "Acceleration"); + elm_box_pack_end(box, fr); + evas_object_show(fr); + + bx = elm_box_add(fr); + elm_object_content_set(fr, bx); + evas_object_show(bx); + + LABEL_FRAME_ADD("<hilight>Wheel acceleration factor</>"); + + sl = elm_slider_add(win); + elm_object_tooltip_text_set(sl, "This is the factor by which scrolling<br/>" + "increments will be multiplied when scrolling<br/>" + "quickly"); + evas_object_data_set(win, "scroll_accel_factor", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.1f"); + elm_slider_indicator_format_set(sl, "%2.1f"); + elm_slider_min_max_set(sl, 0.0, 10.0); + elm_slider_value_set(sl, elm_config_scroll_accel_factor_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", bis_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", scroll_accel_factor_change, NULL); + + fr = elm_frame_add(box); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(fr, "Animation"); + elm_box_pack_end(box, fr); + evas_object_show(fr); + + bx = elm_box_add(fr); + elm_object_content_set(fr, bx); + evas_object_show(bx); + + /* Disable Scroll Animation */ + CHECK_ADD("Disable scroll animation", + "Set whether scrollers should scroll<br/>" + "immediately instead of animating", + scroll_animation_disable_change, NULL); + evas_object_data_set(win, "scroll_animation_disable", ck); + elm_check_state_set(ck, elm_config_scroll_animation_disable_get()); + + /* Bounce */ + _status_config_scrolling_bounce(win, box); + + _status_config_scrolling_thumb(win, box); + + /* Acceleration */ + _status_config_scrolling_acceleration(win, box); + + fr = elm_frame_add(box); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(fr, "Friction"); + elm_box_pack_end(box, fr); + evas_object_show(fr); + + bx = elm_box_add(fr); + elm_object_content_set(fr, bx); + evas_object_show(bx); + /* Page scroll friction */ + LABEL_FRAME_ADD("<hilight>Page scroll friction</>"); + + sl = elm_slider_add(win); + elm_object_tooltip_text_set(sl, "This is the amount of inertia a<br/>" + "paged scroller will impose at<br/>" + "page fitting animations"); + evas_object_data_set(win, "page_scroll_friction_slider", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.1f"); + elm_slider_indicator_format_set(sl, "%1.1f"); + elm_slider_min_max_set(sl, 0.0, 5.0); + elm_slider_value_set(sl, elm_config_scroll_page_scroll_friction_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", ps_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", ps_change, NULL); + + /* Bring in scroll friction */ + LABEL_FRAME_ADD("<hilight>Bring in scroll friction</>"); + + sl = elm_slider_add(win); + elm_object_tooltip_text_set(sl, "This is the amount of inertia a<br/>" + "scroller will impose at region bring<br/>" + "animations"); + evas_object_data_set(win, "bring_in_scroll_friction_slider", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.1f"); + elm_slider_indicator_format_set(sl, "%1.1f"); + elm_slider_min_max_set(sl, 0.0, 5.0); + elm_slider_value_set(sl, elm_config_scroll_bring_in_scroll_friction_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", bis_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", bis_change, NULL); + + /* Zoom scroll friction */ + LABEL_FRAME_ADD("<hilight>Zoom scroll friction</>"); + + sl = elm_slider_add(win); + elm_object_tooltip_text_set(sl, "This is the amount of inertia<br/>" + "scrollers will impose at animations<br/>" + "triggered by Elementary widgets'<br/>" + "zooming API"); + evas_object_data_set(win, "zoom_scroll_friction_slider", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.1f"); + elm_slider_indicator_format_set(sl, "%1.1f"); + elm_slider_min_max_set(sl, 0.0, 5.0); + elm_slider_value_set(sl, elm_config_scroll_zoom_friction_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", zf_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", zf_change, NULL); + + fr = elm_frame_add(box); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(fr, "Smooth Start"); + elm_box_pack_end(box, fr); + evas_object_show(fr); + + bx = elm_box_add(fr); + elm_object_content_set(fr, bx); + evas_object_show(bx); + CHECK_ADD("Enable smooth start", + "Set whether scrollers start smoothly on thumb<br/>" + "scroll", + ss_change, NULL); + evas_object_data_set(win, "scroll_smooth_start", ck); + elm_check_state_set(ck, elm_config_scroll_thumbscroll_smooth_start_get()); + + /* Scroll Smooth Amount */ + LABEL_FRAME_ADD("<hilight>Scroll Smooth Amount</>"); + + sl = elm_slider_add(win); + elm_object_tooltip_text_set(sl, "This is the amount smoothing to apply<br/>" + "to thumbscroll to avoid jerky input"); + evas_object_data_set(win, "scroll_smooth_amount", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.2f"); + elm_slider_indicator_format_set(sl, "%1.2f"); + elm_slider_min_max_set(sl, 0.0, 1.0); + elm_slider_value_set(sl, elm_config_scroll_thumbscroll_smooth_amount_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", smooth_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", smooth_change, NULL); + + /* Scroll Smooth Time Window */ + LABEL_FRAME_ADD("<hilight>Scroll Smooth Time Window</>"); + + sl = elm_slider_add(win); + elm_object_tooltip_text_set(sl, "This is the window of time to look back<br/>" + "into for smoothing of thumbscroll"); + evas_object_data_set(win, "scroll_smooth_time_window", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.2f"); + elm_slider_indicator_format_set(sl, "%1.2f"); + elm_slider_min_max_set(sl, 0.0, 1.0); + elm_slider_value_set(sl, elm_config_scroll_thumbscroll_smooth_time_window_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", smooth_win_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", smooth_win_change, NULL); + + + evas_object_data_set(win, "scrolling", sc); + + elm_naviframe_item_simple_push(naviframe, sc); +} + +static void +_cb_accel(void *data, Evas_Object *obj EINA_UNUSED, void *info EINA_UNUSED) +{ + const char *val = data; + const char *ss = elm_config_accel_preference_get(); + + if ((!ss) || (ss && (strcasecmp(ss, val)))) + { + elm_config_accel_preference_set(val); + elm_config_all_flush(); + } +} + +static void +_cb_accel_override(void *data EINA_UNUSED, Evas_Object *obj, void *info EINA_UNUSED) +{ + Eina_Bool val = elm_check_state_get(obj); + Eina_Bool sb = elm_config_accel_preference_override_get(); + + if (val != sb) + { + elm_config_accel_preference_override_set(val); + elm_config_all_flush(); + } +} + +static void +_cb_vsync(void *data EINA_UNUSED, Evas_Object *obj, void *info EINA_UNUSED) +{ + Eina_Bool val = elm_check_state_get(obj); + Eina_Bool sb = elm_config_vsync_get(); + + if (val != sb) + { + elm_config_vsync_set(val); + elm_config_all_flush(); + } +} + +static void +_status_config_rendering(Evas_Object *win, + Evas_Object *naviframe) +{ + Evas_Object *li, *bx, *ck, *sp; + Elm_Object_Item *it; + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + + li = elm_list_add(win); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, li); + evas_object_show(li); + + it = elm_list_item_append(li, "No Acceleration", NULL, NULL, + _cb_accel, "none"); + if (!elm_config_accel_preference_get() || + (!strcasecmp(elm_config_accel_preference_get(), "none"))) + elm_list_item_selected_set(it, EINA_TRUE); + + it = elm_list_item_append(li, "OpenGL / OpenGL-ES", NULL, NULL, + _cb_accel, "gl"); + if (elm_config_accel_preference_get() && + ((!strcasecmp(elm_config_accel_preference_get(), "gl")) || + (!strcasecmp(elm_config_accel_preference_get(), "opengl")))) + elm_list_item_selected_set(it, EINA_TRUE); + + it = elm_list_item_append(li, "3D (any 3D hardware)", NULL, NULL, + _cb_accel, "3d"); + if (elm_config_accel_preference_get() && + (!strcasecmp(elm_config_accel_preference_get(), "3d"))) + elm_list_item_selected_set(it, EINA_TRUE); + + it = elm_list_item_append(li, "Hardware (any hardware)", NULL, NULL, + _cb_accel, "hw"); + if (elm_config_accel_preference_get() && + ((!strcasecmp(elm_config_accel_preference_get(), "hw")) || + (!strcasecmp(elm_config_accel_preference_get(), "hardware")) || + (!strcasecmp(elm_config_accel_preference_get(), "accel")))) + elm_list_item_selected_set(it, EINA_TRUE); + + elm_list_go(li); + + CHECK_ADD("Override Preferred Acceleration", + "Force any application requesting<br>" + "acceleration to use the system<br>" + "configured acceleration as above", + _cb_accel_override, NULL); + elm_check_state_set(ck, elm_config_accel_preference_override_get()); + + ///////////////////////////////////////////// + sp = elm_separator_add(win); + elm_separator_horizontal_set(sp, EINA_TRUE); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + CHECK_ADD("Tear-free rendering (VSync)", + "This enables Vsync hints for some<br>" + "rendering engines to try keep display<br>" + "VSynced and from Tearing", + _cb_vsync, NULL); + elm_check_state_set(ck, elm_config_vsync_get()); + + evas_object_data_set(win, "rendering", bx); + elm_naviframe_item_simple_push(naviframe, bx); +} + +static void +_status_config_caches(Evas_Object *win, + Evas_Object *naviframe) +{ + Evas_Object *lb, *pd, *bx, *sl, *sp, *ck; + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.5); + + LABEL_FRAME_ADD("<hilight>Cache Flush Interval (8 ticks per second)</>"); + + sl = elm_slider_add(win); + evas_object_data_set(win, "cache_flush_interval_slider", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.0f ticks"); + elm_slider_indicator_format_set(sl, "%1.0f"); + elm_slider_min_max_set(sl, 8.0, 4096.0); + elm_slider_value_set(sl, elm_config_cache_flush_interval_get()); + elm_object_disabled_set(sl, !elm_config_cache_flush_enabled_get()); + + CHECK_ADD("Enable Flushing", "Enable Flushing", cf_enable, sl); + elm_check_state_set(ck, elm_config_cache_flush_enabled_get()); + + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", cf_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", cf_change, NULL); + + sp = elm_separator_add(win); + elm_separator_horizontal_set(sp, EINA_TRUE); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + LABEL_FRAME_ADD("<hilight>Font Cache Size</>"); + + sl = elm_slider_add(win); + evas_object_data_set(win, "font_cache_slider", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.1f MB"); + elm_slider_indicator_format_set(sl, "%1.1f"); + elm_slider_min_max_set(sl, 0.0, 4.0); + elm_slider_value_set(sl, (double)elm_config_cache_font_cache_size_get() / 1024.0); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", fc_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", fc_change, NULL); + + sp = elm_separator_add(win); + elm_separator_horizontal_set(sp, EINA_TRUE); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + LABEL_FRAME_ADD("<hilight>Image Cache Size</>"); + + sl = elm_slider_add(win); + evas_object_data_set(win, "image_cache_slider", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.0f MB"); + elm_slider_indicator_format_set(sl, "%1.0f"); + elm_slider_min_max_set(sl, 0, 32); + elm_slider_value_set(sl, (double)elm_config_cache_image_cache_size_get() / 1024.0); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", ic_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", ic_change, NULL); + + sp = elm_separator_add(win); + elm_separator_horizontal_set(sp, EINA_TRUE); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + LABEL_FRAME_ADD("<hilight>Number of Edje Files to Cache</>"); + + sl = elm_slider_add(win); + evas_object_data_set(win, "edje_file_cache_slider", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.0f files"); + elm_slider_indicator_format_set(sl, "%1.0f"); + elm_slider_min_max_set(sl, 0, 32); + elm_slider_value_set(sl, elm_config_cache_edje_file_cache_size_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", efc_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", efc_change, NULL); + + sp = elm_separator_add(win); + elm_separator_horizontal_set(sp, EINA_TRUE); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + LABEL_FRAME_ADD("<hilight>Number of Edje Collections to Cache</>"); + + sl = elm_slider_add(win); + evas_object_data_set(win, "edje_collection_cache_slider", sl); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + elm_slider_span_size_set(sl, 120); + elm_slider_unit_format_set(sl, "%1.0f collections"); + elm_slider_indicator_format_set(sl, "%1.0f"); + elm_slider_min_max_set(sl, 0, 128); + elm_slider_value_set(sl, elm_config_cache_edje_collection_cache_size_get()); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl, "changed", ecc_round, NULL); + evas_object_smart_callback_add(sl, "delay,changed", ecc_change, NULL); + + evas_object_data_set(win, "caches", bx); + + elm_naviframe_item_simple_push(naviframe, bx); +} + +static void +_status_config_full(Evas_Object *win, + Evas_Object *bx0) +{ + Evas_Object *tb, *naviframe; + Elm_Object_Item *tb_sizing, *tb_it; + + tb = elm_toolbar_add(win); + elm_toolbar_select_mode_set(tb, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_toolbar_menu_parent_set(tb, win); + elm_toolbar_homogeneous_set(tb, EINA_FALSE); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + tb_sizing = elm_toolbar_item_append(tb, "zoom-fit-best", "Sizing", + _cf_sizing, win); + elm_toolbar_item_priority_set(tb_sizing, 100); + + tb_it = elm_toolbar_item_append(tb, "preferences-desktop-theme", "Theme", + _cf_themes, win); + elm_toolbar_item_priority_set(tb_it, 90); + + elm_toolbar_item_append(tb, "preferences-desktop-font", "Fonts", + _cf_fonts, win); + + tb_it = elm_toolbar_item_append(tb, "system-users", "Profiles", + _cf_profiles, win); + elm_toolbar_item_priority_set(tb_it, 90); + + elm_toolbar_item_append(tb, "system-run", "Scrolling", _cf_scrolling, win); + elm_toolbar_item_append(tb, "video-display", "Rendering", + _cf_rendering, win); + elm_toolbar_item_append(tb, "appointment-new", "Caches", _cf_caches, win); + elm_toolbar_item_append(tb, "sound", "Audio", _cf_audio, win); + elm_toolbar_item_append(tb, NULL, "Focus", _cf_focus, win); + elm_toolbar_item_append(tb, NULL, "Etc", _cf_etc, win); + + elm_box_pack_end(bx0, tb); + evas_object_show(tb); + + naviframe = elm_naviframe_add(win); + evas_object_size_hint_align_set(naviframe, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_data_set(win, "naviframe", naviframe); + + _status_config_themes(win, naviframe); + _status_config_fonts(win, naviframe); + _status_config_profiles(win, naviframe); + _status_config_rendering(win, naviframe); + _status_config_scrolling(win, naviframe); + _status_config_caches(win, naviframe); + _status_config_audio(win, naviframe); + _status_config_focus(win, naviframe); + _status_config_etc(win, naviframe); + _status_config_sizing(win, naviframe); // Note: call this at the end. + + // FIXME uncomment after flip style fix, please + //elm_object_style_set(naviframe, "flip"); + elm_toolbar_item_selected_set(tb_sizing, EINA_TRUE); + elm_box_pack_end(bx0, naviframe); + evas_object_show(naviframe); +} + +static void +win_create(void) +{ + Evas_Object *win, *bx0; + + win = elm_win_util_standard_add("main", "Elementary Config"); + if (!win) exit(1); + ecore_event_handler_add(ELM_EVENT_CONFIG_ALL_CHANGED, _config_all_changed, + win); + evas_object_smart_callback_add(win, "delete,request", config_exit, NULL); + + bx0 = elm_box_add(win); + evas_object_size_hint_weight_set(bx0, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx0); + evas_object_show(bx0); + + if (!interactive) _status_basic(win, bx0); + else if (0) + _status_config(win, bx0); + else _status_config_full(win, bx0); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} + +static Eina_Bool +_exit_timer(void *data EINA_UNUSED) +{ + elm_exit(); + return ECORE_CALLBACK_CANCEL; +} + +/* this is your elementary main function - it MUST be called IMMEDIATELY + * after elm_init() and MUST be passed argc and argv, and MUST be called + * elm_main and not be static - must be a visible symbol with EAPI infront */ +EAPI_MAIN int +elm_main(int argc, + char **argv) +{ + int i; + + elm_app_info_set(elm_main, "elementary", "images/logo.png"); + elm_app_compile_bin_dir_set(PACKAGE_BIN_DIR); + elm_app_compile_data_dir_set(PACKAGE_DATA_DIR); + + for (i = 1; i < argc; i++) + { + if (!strcmp(argv[i], "-h")) + { + printf("Usage:\n" + " -h This help\n" + " -q Quiet mode (dont show window)\n" + " -t THEME Set theme to THEME (ELM_THEME spec)\n" + " -f SIZE Set finger size to SIZE pixels\n" + " -s SCALE Set scale factor to SCALE\n" + " -w WEB_BACKEND Set the web backend to be used\n" + ); + } + else if (!strcmp(argv[i], "-q")) + { + quiet = 1; + interactive = 0; + } + else if ((!strcmp(argv[i], "-t")) && (i < argc - 1)) + { + i++; + theme_set = argv[i]; + interactive = 0; + } + else if ((!strcmp(argv[i], "-f")) && (i < argc - 1)) + { + i++; + finger_size_set = argv[i]; + interactive = 0; + } + else if ((!strcmp(argv[i], "-s")) && (i < argc - 1)) + { + i++; + scale_set = argv[i]; + interactive = 0; + } + else if ((!strcmp(argv[i], "-w")) && (i < argc - 1)) + { + i++; + web_backend = argv[i]; + interactive = 0; + } + } + /* put here any init code specific to this app like parsing args, etc. */ + if (!quiet) + { +#ifdef ELM_EFREET + elm_need_efreet(); +#endif + win_create(); /* create main window */ + if (!interactive) + ecore_timer_add(2.0, _exit_timer, NULL); + } + if (!interactive) + { + if (theme_set) elm_theme_set(NULL, theme_set); + if (finger_size_set) elm_config_finger_size_set(atoi(finger_size_set)); + if (scale_set) elm_config_scale_set(atof(scale_set)); + if (web_backend) elm_config_web_backend_set(web_backend); + + elm_config_all_flush(); + + if (quiet) elm_exit(); + } + elm_run(); /* and run the program now and handle all events, etc. */ + /* if the mainloop that elm_run() runs exists, we exit the app */ + /* exit code */ + + if (interactive) + { + const char *web_backend_set = elm_config_web_backend_get(); + + web_backend = elm_object_text_get(web_backend_entry); + fprintf(stderr, "[%s] vs [%s]\n", web_backend, web_backend_set); + if (strcmp(web_backend, web_backend_set)) + { + elm_config_web_backend_set(web_backend); + fprintf(stderr, "web backend set to : [%s]\n", elm_config_web_backend_get()); + elm_config_all_flush(); + } + } + + return 0; +} +/* All elementary apps should use this. Put it right after elm_main() */ +ELM_MAIN() diff --git a/src/bin/elementary/elementary_codegen.c b/src/bin/elementary/elementary_codegen.c new file mode 100644 index 0000000000..e9cc685b66 --- /dev/null +++ b/src/bin/elementary/elementary_codegen.c @@ -0,0 +1,887 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif + +#include <Ecore.h> +#include <Ecore_Evas.h> +#include <Ecore_Getopt.h> +#include <Edje.h> +#define EDJE_EDIT_IS_UNSTABLE_AND_I_KNOW_ABOUT_IT 1 +#include <Edje_Edit.h> +#include <Eina.h> + +#include <Elementary.h> + +#include <ctype.h> +#include <fcntl.h> +#include <locale.h> +#include <stdio.h> +#include <unistd.h> + +#ifndef ENABLE_NLS +# ifndef libintl_setlocale +# define libintl_setlocale(c, l) +# endif +#endif + +static int _log_dom; +#define DBG(...) EINA_LOG_DOM_DBG(_log_dom, __VA_ARGS__) +#define ERR(...) EINA_LOG_DOM_ERR(_log_dom, __VA_ARGS__) +#define WRN(...) EINA_LOG_DOM_WARN(_log_dom, __VA_ARGS__) + +static Ecore_Evas *ee = NULL; +static char *file = NULL; +static char *group = NULL; +static char *prefix = NULL; +static FILE *source_fd = NULL; +static FILE *header_fd = NULL; + +#define H_HEADER \ + "#ifndef _%s\n" \ + "#define _%s\n\n" \ + "#include <Edje.h>\n" \ + "#include <Elementary.h>\n" \ + "#include <Evas.h>\n\n" \ + "#include <stdlib.h>\n\n" + +#define H_FOOTER \ + "\n#endif /* _%s */\n" + +#define C_HEADER \ + "#include \"%s\"\n\n" + +#define H_CODEGEN_LAYOUT_ADD \ + "/**\n * @brief Creates the layout object and set the theme\n" \ + " * @param o The parent\n" \ + " * @param th The theme to add to, or if NULL, the default theme\n" \ + " * @param edje_file The path to edj, if NULL it's used the path given\n" \ + " * to elementary_codegen\n */\n" \ + "Evas_Object *%s_layout_add(Evas_Object *o, Elm_Theme *th, " \ + "const char *edje_file);\n" + +#define C_CODEGEN_LAYOUT_ADD \ + "Evas_Object *\n" \ + "%s_layout_add(Evas_Object *o, Elm_Theme *th, const char *edje_file)\n" \ + "{\n" \ + " Evas_Object *l;\n\n" \ + " if (edje_file)\n" \ + " elm_theme_extension_add(th, edje_file);\n" \ + " else\n" \ + " elm_theme_extension_add(th, \"./%s\");\n\n" \ + " l = elm_layout_add(o);\n" \ + " if (!l) return NULL;\n\n" \ + " if (!elm_layout_theme_set(l, \"%s\", \"%s\", \"%s\"))\n" \ + " {\n" \ + " evas_object_del(l);\n" \ + " return NULL;\n" \ + " }\n\n" \ + " return l;\n" \ + "}\n\n" + +#define C_CODEGEN_PART_CONTENT_SET \ + "void\n" \ + "%s_%s_set(Evas_Object *o, Evas_Object *value)\n" \ + "{\n" \ + " elm_layout_content_set(o, \"%s\", value);\n" \ + "}\n\n" + +#define C_CODEGEN_PART_TEXT_SET \ + "void\n" \ + "%s_%s_set(Evas_Object *o, const char *value)\n" \ + "{\n" \ + " elm_layout_text_set(o, \"%s\", value);\n" \ + "}\n\n" + +#define C_CODEGEN_PART_CONTENT_UNSET \ + "Evas_Object *\n" \ + "%s_%s_unset(Evas_Object *o)\n" \ + "{\n" \ + " return elm_layout_content_unset(o, \"%s\");\n" \ + "}\n\n" + +#define H_CODEGEN_PART_CONTENT_SET \ + "void %s_%s_set(Evas_Object *o, Evas_Object *value);\n" + +#define H_CODEGEN_PART_TEXT_SET \ + "void %s_%s_set(Evas_Object *o, const char *value);\n" + +#define H_CODEGEN_PART_CONTENT_UNSET \ + "Evas_Object *%s_%s_unset(Evas_Object *o);\n" + +#define C_CODEGEN_PART_CONTENT_GET \ + "Evas_Object *\n" \ + "%s_%s_get(const Evas_Object *o)\n" \ + "{\n" \ + " return elm_layout_content_get(o, \"%s\");\n" \ + "}\n\n" + +#define H_CODEGEN_PART_CONTENT_GET \ + "Evas_Object *%s_%s_get(const Evas_Object *o);\n" + +#define C_CODEGEN_PART_TEXT_GET \ + "const char *\n" \ + "%s_%s_get(const Evas_Object *o)\n" \ + "{\n" \ + " return elm_layout_text_get(o, \"%s\");\n" \ + "}\n\n" + +#define H_CODEGEN_PART_TEXT_GET \ + "const char *%s_%s_get(const Evas_Object *o);\n" + +#define C_CODEGEN_PART_BOX_APPEND \ + "Eina_Bool\n" \ + "%s_%s_append(Evas_Object *o, Evas_Object *child)\n" \ + "{\n" \ + " return elm_layout_box_append(o, \"%s\", child);\n" \ + "}\n\n" + +#define H_CODEGEN_PART_BOX_APPEND \ + "Eina_Bool %s_%s_append(Evas_Object *o, Evas_Object *child);\n" + +#define C_CODEGEN_PART_BOX_PREPEND \ + "Eina_Bool\n" \ + "%s_%s_prepend(Evas_Object *o, Evas_Object *child)\n" \ + "{\n" \ + " return elm_layout_box_prepend(o, \"%s\", child);\n" \ + "}\n\n" + +#define H_CODEGEN_PART_BOX_PREPEND \ + "Eina_Bool %s_%s_prepend(Evas_Object *o, Evas_Object *child);\n" + +#define C_CODEGEN_PART_BOX_INSERT_BEFORE \ + "Eina_Bool\n" \ + "%s_%s_insert_before(Evas_Object *o, Evas_Object *child, " \ + "const Evas_Object *reference)\n" \ + "{\n" \ + " return elm_layout_box_insert_before(o, \"%s\", " \ + "child, reference);\n" \ + "}\n\n" + +#define H_CODEGEN_PART_BOX_INSERT_BEFORE \ + "Eina_Bool %s_%s_insert_before(Evas_Object *o, Evas_Object *child, " \ + "const Evas_Object *reference);\n" + +#define C_CODEGEN_PART_BOX_INSERT_AT \ + "Eina_Bool\n" \ + "%s_%s_insert_at(Evas_Object *o, Evas_Object *child, unsigned int pos)\n" \ + "{\n" \ + " return elm_layout_box_insert_at(o, \"%s\", child, pos);\n" \ + "}\n\n" + +#define H_CODEGEN_PART_BOX_INSERT_AT \ + "Eina_Bool %s_%s_insert_at(Evas_Object *o, Evas_Object *child, " \ + "unsigned int pos);\n" + +#define C_CODEGEN_PART_BOX_REMOVE \ + "Evas_Object *\n" \ + "%s_%s_remove(Evas_Object *o, Evas_Object *child)\n" \ + "{\n" \ + " return elm_layout_box_remove(o, \"%s\", child);\n" \ + "}\n\n" + +#define H_CODEGEN_PART_BOX_REMOVE \ + "Evas_Object *%s_%s_remove(Evas_Object *o, Evas_Object *child);\n" + +#define C_CODEGEN_PART_BOX_REMOVE_ALL \ + "Eina_Bool\n" \ + "%s_%s_remove_all(Evas_Object *o, Eina_Bool clear)\n" \ + "{\n" \ + " return elm_layout_box_remove_all(o, \"%s\", clear);\n" \ + "}\n\n" + +#define H_CODEGEN_PART_BOX_REMOVE_ALL \ + "Eina_Bool %s_%s_remove_all(Evas_Object *o, Eina_Bool clear);\n" + +#define C_CODEGEN_PART_TABLE_PACK \ + "Eina_Bool\n" \ + "%s_%s_pack(Evas_Object *o, Evas_Object *child, unsigned short col, " \ + "unsigned short row, unsigned short colspan, unsigned short rowspan)\n" \ + "{\n" \ + " return elm_layout_table_pack(o, \"%s\", child, col, row, " \ + "colspan, rowspan);\n" \ + "}\n\n" + +#define H_CODEGEN_PART_TABLE_PACK \ + "Eina_Bool %s_%s_pack(Evas_Object *o, Evas_Object *child, " \ + "unsigned short col, unsigned short row, unsigned short " \ + "colspan, unsigned short rowspan);\n" + +#define C_CODEGEN_PART_TABLE_UNPACK \ + "Evas_Object *\n" \ + "%s_%s_unpack(Evas_Object *o, Evas_Object *child)\n" \ + "{\n" \ + " return elm_layout_table_unpack(o, \"%s\", child);\n" \ + "}\n\n" + +#define H_CODEGEN_PART_TABLE_UNPACK \ + "Evas_Object *%s_%s_unpack(Evas_Object *o, Evas_Object *child);\n" + +#define C_CODEGEN_PART_TABLE_CLEAR \ + "Eina_Bool\n" \ + "%s_%s_clear(Evas_Object *o, Eina_Bool clear)\n" \ + "{\n" \ + " return elm_layout_table_clear(o, \"%s\", clear);\n" \ + "}\n\n" + +#define H_CODEGEN_PART_TABLE_CLEAR \ + "Eina_Bool %s_%s_clear(Evas_Object *o, Eina_Bool clear);\n" + +#define C_CODEGEN_PROGRAM_EMIT \ + "void\n" \ + "%s_%s_emit(Evas_Object *o)\n" \ + "{\n" \ + " elm_layout_signal_emit(o, \"%s\", \"%s\");\n" \ + "}\n\n" + +#define H_CODEGEN_PROGRAM_EMIT \ + "void %s_%s_emit(Evas_Object *o);\n" + +#define C_CODEGEN_PROGRAM_CALLBACK_ADD \ + "void\n" \ + "%s_%s_callback_add(Evas_Object *o, Edje_Signal_Cb func, void *data)\n" \ + "{\n" \ + " elm_layout_signal_callback_add(o, \"%s\", \"%s\", func, data);\n" \ + "}\n\n" + +#define H_CODEGEN_PROGRAM_CALLBACK_ADD \ + "void %s_%s_callback_add(Evas_Object *o, Edje_Signal_Cb func, " \ + "void *data);\n" + +#define C_CODEGEN_PROGRAM_CALLBACK_DEL \ + "void\n" \ + "%s_%s_callback_del(Evas_Object *o, Edje_Signal_Cb func)\n" \ + "{\n" \ + " elm_layout_signal_callback_del(o, \"%s\", \"%s\", func);\n" \ + "}\n\n" + +#define H_CODEGEN_PROGRAM_CALLBACK_DEL \ + "void %s_%s_callback_del(Evas_Object *o, Edje_Signal_Cb func);\n" + +const Ecore_Getopt optdesc = +{ + "elm_codegen", + "%prog [options] <file.edj> <group> <source_file_name> <header_file_name>", + PACKAGE_VERSION, + "(C) 2012 - The Enlightenment Project", + "BSD", + "elm_codegen generates the boilerplate code to get and set the " + "parts of a group from a compiled (binary) edje " + "file avoiding common errors with typos.\n", + 0, + { + ECORE_GETOPT_STORE_STR('p', "prefix", "The prefix for the " \ + "generataed code."), + ECORE_GETOPT_LICENSE('L', "license"), + ECORE_GETOPT_COPYRIGHT('C', "copyright"), + ECORE_GETOPT_VERSION('V', "version"), + ECORE_GETOPT_HELP('h', "help"), + ECORE_GETOPT_SENTINEL + } +}; + +static char * +_header_standardize(const char *filename) +{ + char *str, *itr, *aux; + + aux = strrchr(filename, '/'); + str = itr = strdup(aux ? aux + 1 : filename); + + for (; *itr; itr++) + if (*itr == '.') + *itr = '_'; + else + *itr = toupper(*itr); + + return str; +} + +static Eina_Bool +_file_descriptors_open(const char *source, const char *header) +{ + header_fd = fopen(header, "w"); + if (!header_fd) + return EINA_FALSE; + + source_fd = fopen(source, "w"); + if (!source_fd) + goto err; + + return EINA_TRUE; + + err: + fclose(header_fd); + return EINA_FALSE; +} + +static Eina_Bool +_file_descriptors_close(void) +{ + Eina_Bool ret = EINA_FALSE; + + if (!fclose(header_fd)) + ret = EINA_TRUE; + + if (!fclose(source_fd)) + ret &= EINA_TRUE; + + return ret; +} + +static Eina_Bool +_headers_write(const char *filename) +{ + char buf[512]; + char *str; + + str = _header_standardize(filename); + snprintf(buf, sizeof(buf), H_HEADER, str, str); + if (fwrite(buf, strlen(buf), 1, header_fd) != 1) + { + free(str); + return EINA_FALSE; + } + + free(str); + + snprintf(buf, sizeof(buf), C_HEADER, filename); + if (fwrite(buf, strlen(buf), 1, source_fd) != 1) + return EINA_FALSE; + + return EINA_TRUE; +} + +static Eina_Bool +_footer_write(const char *filename) +{ + char buf[512]; + char *str; + + str = _header_standardize(filename); + snprintf(buf, sizeof(buf), H_FOOTER, str); + if (fwrite(buf, strlen(buf), 1, header_fd) != 1) + { + free(str); + return EINA_FALSE; + } + + free(str); + + return EINA_TRUE; +} + +static Eina_Bool +_theme_set_write(void) +{ + Eina_Bool ret = EINA_FALSE; + char *str[3]; /* *klas, *style, *group */ + char *token, *_group, buf[512]; + int i; + + str[0] = str[1] = str[2] = NULL; + if (strncmp(group, "elm/", 4)) return EINA_FALSE; + + _group = strdup(group); + if (!_group) return EINA_FALSE; + + strtok(_group, "/"); + for (i = 0; i < 3; i++) + { + token = strtok(NULL, "/"); + if (!token) break; + + str[i] = token; + } + + if (!str[0] || !str[1] || !str[2]) + goto end; + + snprintf(buf, sizeof(buf), C_CODEGEN_LAYOUT_ADD, prefix, file, str[0], + str[1], str[2]); + if (fwrite(buf, strlen(buf), 1, source_fd) != 1) + goto end; + + snprintf(buf, sizeof(buf), H_CODEGEN_LAYOUT_ADD, prefix); + if (fwrite(buf, strlen(buf), 1, header_fd) != 1) + goto end; + + ret = EINA_TRUE; + +end: + free(_group); + return ret; +} + +static Eina_Bool +_part_write(const char *apiname, const char *partname, const char *description, + Edje_Part_Type type) +{ + char buf[1024]; + +#define TEMPLATE_NAME(sufix) \ + do { \ + snprintf(buf, sizeof(buf), C_CODEGEN_PART_##sufix, prefix, \ + apiname, partname); \ + if (fwrite(buf, strlen(buf), 1, source_fd) != 1) \ + goto err; \ + snprintf(buf, sizeof(buf), H_CODEGEN_PART_##sufix, prefix, \ + apiname); \ + if (fwrite(buf, strlen(buf), 1, header_fd) != 1) \ + goto err; \ + } while(0) + + if (description) + { + snprintf(buf, sizeof(buf), "\n/**\n * @brief %s\n */\n", description); + if (fwrite(buf, strlen(buf), 1, header_fd) != 1) + goto err; + } + + switch (type) + { + case EDJE_PART_TYPE_BOX: + TEMPLATE_NAME(BOX_APPEND); + TEMPLATE_NAME(BOX_PREPEND); + TEMPLATE_NAME(BOX_INSERT_BEFORE); + TEMPLATE_NAME(BOX_INSERT_AT); + TEMPLATE_NAME(BOX_REMOVE); + TEMPLATE_NAME(BOX_REMOVE_ALL); + break; + + case EDJE_PART_TYPE_TABLE: + TEMPLATE_NAME(TABLE_PACK); + TEMPLATE_NAME(TABLE_UNPACK); + TEMPLATE_NAME(TABLE_CLEAR); + break; + + case EDJE_PART_TYPE_TEXT: + TEMPLATE_NAME(TEXT_SET); + TEMPLATE_NAME(TEXT_GET); + break; + + default: + TEMPLATE_NAME(CONTENT_SET); + TEMPLATE_NAME(CONTENT_UNSET); + TEMPLATE_NAME(CONTENT_GET); + break; + } + +#undef TEMPLATE_NAME + + return EINA_TRUE; + + err: + ERR("Could not write the part: %s", partname); + return EINA_FALSE; +} + +static inline Eina_Bool +_c_id_allowed(char c) +{ + if ((c >= '0') && (c <= '9')) return EINA_TRUE; + if ((c >= 'a') && (c <= 'z')) return EINA_TRUE; + if ((c >= 'A') && (c <= 'Z')) return EINA_TRUE; + + return EINA_FALSE; +} + +static char * +_api_name_fix(const char *orig) +{ + char *d, *d_end, buf[256]; + const char *s; + + if (!orig) return NULL; + + s = orig; + d = buf; + d_end = d + sizeof(buf) - 1; + + for (; (*s != '\0') && (d < d_end); s++, d++) + if (_c_id_allowed(*s)) *d = *s; + else *d = '_'; + *d = '\0'; + + return strdup(buf); +} + +static char * +_part_api_name_get(Evas_Object *ed, const char *program) +{ + const char *orig; + char *fix; + + orig = edje_edit_part_api_name_get(ed, program); + fix = _api_name_fix(orig); + edje_edit_string_free(orig); + + return fix; +} + +static Eina_Bool +_parts_parse(Evas_Object *ed) +{ + Eina_List *parts, *l; + const char *name, *description; + char *apiname; + Edje_Part_Type type; + Eina_Bool ret = EINA_TRUE; + + parts = edje_edit_parts_list_get(ed); + EINA_LIST_FOREACH(parts, l, name) + { + if (!(apiname = _part_api_name_get(ed, name))) + { + DBG("filter out part '%s': not API.", name); + continue; + } + + type = edje_edit_part_type_get(ed, name); + if ((type != EDJE_PART_TYPE_SWALLOW) && + (type != EDJE_PART_TYPE_TEXT) && + (type != EDJE_PART_TYPE_BOX) && + (type != EDJE_PART_TYPE_TABLE)) + { + free(apiname); + continue; + } + + description = edje_edit_part_api_description_get(ed, name); + if (!_part_write(apiname, name, description, type)) + { + ret = EINA_FALSE; + edje_edit_string_free(description); + free(apiname); + break; + } + + edje_edit_string_free(description); + free(apiname); + } + + edje_edit_string_list_free(parts); + return ret; +} + +static Eina_Bool +_program_emit_write(const char *apiname, const char *source, const char *sig, + const char *description) +{ + char buf[512]; + + snprintf(buf, sizeof(buf), C_CODEGEN_PROGRAM_EMIT, prefix, + apiname, sig, source); + if (fwrite(buf, strlen(buf), 1, source_fd) != 1) + goto err; + + if (description) + { + snprintf(buf, sizeof(buf), "\n/**\n * @brief %s\n */\n", description); + if (fwrite(buf, strlen(buf), 1, header_fd) != 1) + goto err; + } + + snprintf(buf, sizeof(buf), H_CODEGEN_PROGRAM_EMIT, prefix, + apiname); + if (fwrite(buf, strlen(buf), 1, header_fd) != 1) + goto err; + + return EINA_TRUE; + + err: + ERR("Could not write the program: %s", apiname); + return EINA_FALSE; +} + +static Eina_Bool +_program_add_write(const char *apiname, const char *source, const char *sig, + const char *description) +{ + char buf[512]; + + snprintf(buf, sizeof(buf), C_CODEGEN_PROGRAM_CALLBACK_ADD, prefix, + apiname, sig, source); + if (fwrite(buf, strlen(buf), 1, source_fd) != 1) + goto err; + + snprintf(buf, sizeof(buf), C_CODEGEN_PROGRAM_CALLBACK_DEL, prefix, + apiname, sig, source); + if (fwrite(buf, strlen(buf), 1, source_fd) != 1) + goto err; + + if (description) + { + snprintf(buf, sizeof(buf), "\n/**\n * @brief %s\n */\n", description); + if (fwrite(buf, strlen(buf), 1, header_fd) != 1) + goto err; + } + + snprintf(buf, sizeof(buf), H_CODEGEN_PROGRAM_CALLBACK_ADD, prefix, + apiname); + if (fwrite(buf, strlen(buf), 1, header_fd) != 1) + goto err; + + snprintf(buf, sizeof(buf), H_CODEGEN_PROGRAM_CALLBACK_DEL, prefix, + apiname); + if (fwrite(buf, strlen(buf), 1, header_fd) != 1) + goto err; + + return EINA_TRUE; + + err: + ERR("Could not write the program [action]: %s", apiname); + return EINA_FALSE; +} + +static char * +_program_api_name_get(Evas_Object *ed, const char *program) +{ + const char *orig; + char *fix; + + orig = edje_edit_program_api_name_get(ed, program); + fix = _api_name_fix(orig); + edje_edit_string_free(orig); + + return fix; +} + +static Eina_Bool +_programs_parse(Evas_Object *ed) +{ + Eina_Bool ret = EINA_TRUE; + Eina_List *programs, *l; + const char *name, *source = NULL, *sig = NULL, *description; + char *apiname; + Edje_Action_Type type; + + programs = edje_edit_programs_list_get(ed); + EINA_LIST_FOREACH(programs, l, name) + { + if (!(apiname = _program_api_name_get(ed, name))) + { + DBG("filter out program '%s': not API.", name); + continue; + } + + description = edje_edit_program_api_description_get(ed, name); + type = edje_edit_program_action_get(ed, name); + if (type == EDJE_ACTION_TYPE_SIGNAL_EMIT) + { + const char *str, *str2; + str = edje_edit_program_state_get(ed, name); + str2 = edje_edit_program_state2_get(ed, name); + + if (!_program_add_write(apiname, str2, str, description)) + { + ret = EINA_FALSE; + edje_edit_string_free(str); + edje_edit_string_free(str2); + break; + } + + edje_edit_string_free(str); + edje_edit_string_free(str2); + } + + sig = edje_edit_program_signal_get(ed, name); + if (!sig) sig = eina_stringshare_add(""); + + source = edje_edit_program_source_get(ed, name); + if (!source) source = eina_stringshare_add(""); + + if (strlen (sig)) + { + if (!_program_emit_write(apiname, source, sig, description)) + { + ret = EINA_FALSE; + break; + } + } + + edje_edit_string_free(description); + edje_edit_string_free(sig); + edje_edit_string_free(source); + free(apiname); + } + + edje_edit_string_list_free(programs); + if (!ret) + { + edje_edit_string_free(description); + edje_edit_string_free(sig); + edje_edit_string_free(source); + free(apiname); + } + + return ret; +} + +static Eina_Bool +_parse(void) +{ + Evas_Object *ed; + Eina_Bool ret; + + ed = edje_edit_object_add(ecore_evas_get(ee)); + if (!edje_object_file_set(ed, file, group)) + { + Edje_Load_Error err = edje_object_load_error_get(ed); + const char *errmsg = edje_load_error_str(err); + ERR("could not load group '%s' from file '%s': %s", + group, file, errmsg); + evas_object_del(ed); + return EINA_FALSE; + } + + ret = _parts_parse(ed) && _programs_parse(ed); + + evas_object_del(ed); + return ret; +} + +int +main(int argc, char *argv[]) +{ + Eina_Bool quit_option = EINA_FALSE; + char *source = NULL, *header = NULL; + int arg_index, ret = 0; + Ecore_Getopt_Value values[] = { + ECORE_GETOPT_VALUE_STR(prefix), + ECORE_GETOPT_VALUE_BOOL(quit_option), + ECORE_GETOPT_VALUE_BOOL(quit_option), + ECORE_GETOPT_VALUE_BOOL(quit_option), + ECORE_GETOPT_VALUE_BOOL(quit_option), + ECORE_GETOPT_VALUE_NONE + }; + + setlocale(LC_NUMERIC, "C"); + + eina_init(); + ecore_init(); + ecore_evas_init(); + edje_init(); + + if (argc < 2) + { + fprintf(stderr, "Missing action. See '--help or -h'.\n"); + ret = 1; + goto error_log; + } + + _log_dom = eina_log_domain_register("elementary_codegen", EINA_COLOR_YELLOW); + if (_log_dom < 0) + { + EINA_LOG_CRIT("could not register log domain 'elementary_codegen'"); + ret = 1; + goto error_log; + } + + arg_index = ecore_getopt_parse(&optdesc, values, argc, argv); + if (arg_index < 0) + { + ERR("could not parse arguments."); + ret = 1; + goto error_getopt; + } + else if (quit_option) goto error_getopt; + else if (arg_index != argc - 4) + { + fprintf(stderr, "Incorrect number of parameters. Requires " \ + "fours arguments, an edje, the group, " \ + "the source output (foo.c) and the header(foo.h).\n" \ + "See %s --help\n", argv[0]); + ret = 1; + goto error_getopt; + } + + file = argv[arg_index++]; + + // check if the file is accessible + if (access(file, R_OK) == -1) + { + ERR("File '%s' not accessible, error %d (%s).\n", + file, errno, strerror(errno)); + ret = 1; + goto error_getopt; + } + + group = argv[arg_index++]; + source = argv[arg_index++]; + header = argv[arg_index++]; + + if (!edje_file_group_exists(file, group)) + { + ERR("The group %s not exists", group); + ret = 2; + goto error_getopt; + } + + ee = ecore_evas_buffer_new(1, 1); + if (!ee) + { + ERR("could not create ecore_evas_buffer"); + ret = 3; + goto error_getopt; + } + + if (!_file_descriptors_open(source, header)) + { + ERR("Could not create the source files, error %d (%s)", + errno, strerror(errno)); + ret = 4; + goto error_getopt; + } + + if (!_headers_write(header)) + { + ERR("Could not write the header, error %d (%s)", + errno, strerror(errno)); + ret = 5; + goto error_getopt; + } + + if (!_theme_set_write()) + WRN("Theme set getter/setter not created. Group name: %s invalid.", group); + + if (!_parse()) + { + ERR("Could not parsing the EDJE"); + ret = 6; + goto error_getopt; + } + + if (!_footer_write(header)) + { + ERR("Could not write the footer, error %d (%s)", + errno, strerror(errno)); + ret = 7; + goto error_getopt; + } + + if (!_file_descriptors_close()) + { + ERR("Could not close the source files, error %d (%s)", + errno, strerror(errno)); + ret = 8; + } + +error_getopt: + if (ee) + ecore_evas_free(ee); + +error_log: + edje_shutdown(); + ecore_evas_shutdown(); + ecore_shutdown(); + eina_log_domain_unregister(_log_dom); + eina_shutdown(); + + if (ret > 4) + { + unlink(header); + unlink(source); + } + + return ret; +} diff --git a/src/bin/elementary/elm_prefs_cc.c b/src/bin/elementary/elm_prefs_cc.c new file mode 100644 index 0000000000..9f5da87bf9 --- /dev/null +++ b/src/bin/elementary/elm_prefs_cc.c @@ -0,0 +1,201 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif + +#include <string.h> +#include <locale.h> +#include <limits.h> +#include <sys/stat.h> + +#include "elm_prefs_cc.h" + +int _elm_prefs_cc_log_dom = -1; +static void main_help(void); + +Eina_Prefix *pfx = NULL; +char *file_in = NULL; +const char *tmp_dir = NULL; +char *file_out = NULL; + +static const char *progname = NULL; + +static void +_elm_prefs_cc_log_cb(const Eina_Log_Domain *d, + Eina_Log_Level level, + const char *file, + const char *fnc, + int _line, + const char *fmt, + EINA_UNUSED void *data, + va_list args) +{ + if ((d->name) && (d->namelen == sizeof("elm_prefs_cc") - 1) && + (memcmp(d->name, "elm_prefs_cc", sizeof("elm_prefs_cc") - 1) == 0)) + { + const char *prefix; + + eina_log_console_color_set(stderr, eina_log_level_color_get(level)); + switch (level) + { + case EINA_LOG_LEVEL_CRITICAL: + prefix = "Critical. "; + break; + + case EINA_LOG_LEVEL_ERR: + prefix = "Error. "; + break; + + case EINA_LOG_LEVEL_WARN: + prefix = "Warning. "; + break; + + default: + prefix = ""; + } + fprintf(stderr, "%s: %s", progname, prefix); + eina_log_console_color_set(stderr, EINA_COLOR_RESET); + + vfprintf(stderr, fmt, args); + putc('\n', stderr); + } + else + eina_log_print_cb_stderr(d, level, file, fnc, _line, fmt, NULL, args); +} + +static void +main_help(void) +{ + printf + ("Usage:\n" + "\t%s [OPTIONS] input_file.epc [output_file.epb]\n" + "\n" + "Where OPTIONS is one or more of:\n" + "\n" + "-v Verbose output\n" + , progname); +} + +int +main(int argc, char **argv) +{ + int i; + struct stat st; +#ifdef HAVE_REALPATH + char rpath[PATH_MAX], rpath2[PATH_MAX]; +#endif + + setlocale(LC_NUMERIC, "C"); + + if (!eina_init()) + return -1; + + _elm_prefs_cc_log_dom = eina_log_domain_register + ("elm_prefs_cc", ELM_PREFS_CC_DEFAULT_LOG_COLOR); + if (_elm_prefs_cc_log_dom < 0) + { + EINA_LOG_ERR("Unable to create a log domain."); + exit(-1); + } + if (!eina_log_domain_level_check(_elm_prefs_cc_log_dom, EINA_LOG_LEVEL_WARN)) + eina_log_domain_level_set("elm_prefs_cc", EINA_LOG_LEVEL_WARN); + + progname = ecore_file_file_get(argv[0]); + eina_log_print_cb_set(_elm_prefs_cc_log_cb, NULL); + + tmp_dir = eina_environment_tmp_get(); + + for (i = 1; i < argc; i++) + { + if (!strcmp(argv[i], "-h")) + { + main_help(); + exit(0); + } + else if (!strcmp(argv[i], "-v")) + { + eina_log_domain_level_set("elm_prefs_cc", EINA_LOG_LEVEL_INFO); + } + else if (!file_in) + file_in = argv[i]; + else if (!file_out) + file_out = argv[i]; + } + + if (!file_in) + { + ERR("no input file specified."); + main_help(); + exit(-1); + } + + pfx = eina_prefix_new(argv[0], /* argv[0] value (optional) */ + main, /* an optional symbol to check path of */ + "ELM_PREFS", /* env var prefix to use (XXX_PREFIX, XXX_BIN_DIR etc. */ + "elementary", /* dir to add after "share" (PREFIX/share/DIRNAME) */ + "themes/default.edj", /* a magic file to check for in PREFIX/share/DIRNAME for success */ + PACKAGE_BIN_DIR, /* package bin dir @ compile time */ + PACKAGE_LIB_DIR, /* package lib dir @ compile time */ + PACKAGE_DATA_DIR, /* package data dir @ compile time */ + PACKAGE_DATA_DIR); /* if locale needed use LOCALE_DIR */ + + /* check whether file_in exists */ +#ifdef HAVE_REALPATH + if (!realpath(file_in, rpath) || stat(rpath, &st) || !S_ISREG(st.st_mode)) +#else + if (stat(file_in, &st) || !S_ISREG(st.st_mode)) +#endif + { + ERR("file not found: %s.", file_in); + main_help(); + exit(-1); + } + + if (!file_out) + { + char *suffix; + + if ((suffix = strstr(file_in, ".epc")) && (suffix[4] == 0)) + { + file_out = strdup(file_in); + if (file_out) + { + suffix = strstr(file_out, ".epc"); + strcpy(suffix, ".epb"); + } + } + } + if (!file_out) + { + ERR("no output file specified."); + main_help(); + exit(-1); + } + +#ifdef HAVE_REALPATH + if (realpath(file_out, rpath2) && !strcmp(rpath, rpath2)) +#else + if (!strcmp(file_in, file_out)) +#endif + { + ERR("input file equals output file."); + main_help(); + exit(-1); + } + + elm_prefs_file = mem_alloc(SZ(Elm_Prefs_File)); + elm_prefs_file->compiler = strdup("elm_prefs_cc"); + + compile(); + + data_init(); + data_write(); + data_shutdown(); + + eina_prefix_free(pfx); + pfx = NULL; + + eina_log_domain_unregister(_elm_prefs_cc_log_dom); + eina_shutdown(); + + return 0; +} diff --git a/src/bin/elementary/elm_prefs_cc.h b/src/bin/elementary/elm_prefs_cc.h new file mode 100644 index 0000000000..ef848babc8 --- /dev/null +++ b/src/bin/elementary/elm_prefs_cc.h @@ -0,0 +1,107 @@ +#ifndef ELM_PREFS_CC_H +#define ELM_PREFS_CC_H + +#include <Elementary.h> + +#define ELM_INTERNAL_API_ARGESFSDFEFC +#include "elm_priv.h" +#include "elm_widget_prefs.h" + +extern Eina_Prefix *pfx; + +/* + * On Windows, if the file is not opened in binary mode, + * read does not return the correct size, because of + * CR / LF translation. + */ +#ifndef O_BINARY +# define O_BINARY 0 +#endif + +/* logging variables */ +extern int _elm_prefs_cc_log_dom; +#define ELM_PREFS_CC_DEFAULT_LOG_COLOR EINA_COLOR_CYAN + +#ifdef ERR +# undef ERR +#endif +#define ERR(...) EINA_LOG_DOM_ERR(_elm_prefs_cc_log_dom, __VA_ARGS__) +#ifdef INF +# undef INF +#endif +#define INF(...) EINA_LOG_DOM_INFO(_elm_prefs_cc_log_dom, __VA_ARGS__) +#ifdef WRN +# undef WRN +#endif +#define WRN(...) EINA_LOG_DOM_WARN(_elm_prefs_cc_log_dom, __VA_ARGS__) +#ifdef CRI +# undef CRI +#endif +#define CRI(...) EINA_LOG_DOM_CRIT(_elm_prefs_cc_log_dom, __VA_ARGS__) +#ifdef DBG +# undef DBG +#endif +#define DBG(...) EINA_LOG_DOM_DBG(_elm_prefs_cc_log_dom, __VA_ARGS__) + +/* types */ +typedef struct _Elm_Prefs_File Elm_Prefs_File; +typedef struct _New_Object_Handler New_Object_Handler; +typedef struct _New_Statement_Handler New_Statement_Handler; + +struct _Elm_Prefs_File +{ + const char *compiler; + + Eina_List *pages; +}; + +struct _New_Object_Handler +{ + const char *type; + void (*func)(void); +}; + +struct _New_Statement_Handler +{ + const char *type; + void (*func)(void); +}; + +/* global fn calls */ +void compile(void); +char *parse_str(int n); +int parse_enum(int n, ...); +int parse_int(int n); +int parse_int_range(int n, int f, int t); +int parse_bool(int n); +double parse_float(int n); +void check_arg_count(int n); +void check_regex(const char *regex); +void set_verbatim(char *s, int l1, int l2); + +void data_init(void); +void data_write(void); +void data_shutdown(void); + +int object_handler_num(void); +int statement_handler_num(void); + +void *mem_alloc(size_t size); +char *mem_strdup(const char *s); +#define SZ sizeof + +/* global vars */ +extern char *file_in; +extern const char *tmp_dir; +extern char *file_out; +extern int line; +extern Eina_List *stack; +extern Eina_List *params; + +extern Elm_Prefs_File *elm_prefs_file; + +extern Eina_List *elm_prefs_pages; +extern New_Object_Handler object_handlers[]; +extern New_Statement_Handler statement_handlers[]; + +#endif diff --git a/src/bin/elementary/elm_prefs_cc_handlers.c b/src/bin/elementary/elm_prefs_cc_handlers.c new file mode 100644 index 0000000000..93577ed38f --- /dev/null +++ b/src/bin/elementary/elm_prefs_cc_handlers.c @@ -0,0 +1,1218 @@ +/* + Concerning the EPC reference: + + The formatting for blocks and properties has been implemented as a table + which is filled using ALIASES. + For maximum flexibility I implemented them in the \@code/\@encode style, + this means that missing one or changing the order most certainly cause + formatting errors. + + \@block + block name + \@context + code sample of the block + \@description + the block's description + \@endblock + + \@property + property name + \@parameters + property's parameter list + \@effect + the property description (lol) + \@endproperty +*/ + +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif + +#include <string.h> +#include <errno.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <sys/mman.h> +#include <unistd.h> + +#include "elm_prefs_cc.h" + +void check_min_arg_count(int min_required_args); +int params_min_check(int n); + +/** + * @page epcref Elementary Prefs Data Collection Reference + * An Elementary Prefs Collection is a plain text file (normally + * identified with the .epc extension), consisting of instructions for the + * Elm Prefs Compiler. + * + * The syntax for the elementary prefs data files follows a simple structure of + * "blocks { .. }" that can contain "properties: ..", more blocks, or both. + * + * @anchor sec_quickaccess Quick access to block descriptions: + * <ul> + * <li>@ref sec_page "Page"</li> + * <li>@ref sec_items "Items"</li> + * <ul> + * <li>@ref sec_items_bool "Bool"</li> + * <li>@ref sec_items_int "Int"</li> + * <li>@ref sec_items_float "Float"</li> + * <li>@ref sec_items_date "Date"</li> + * <li>@ref sec_items_text "Text"</li> + * <li>@ref sec_items_textarea "Text Area"</li> + * </ul> + * </ul> + * + * @author Ricardo de Almeida Gonzaga (ricardotk) ricardo@profusion.mobi + * + * <table class="edcref" border="0"> + */ + +static Elm_Prefs_Page_Node *current_page = NULL; +static Elm_Prefs_Item_Node *current_item = NULL; + +/* objects and statments */ + +/* Collection */ +static void ob_collection(void); + +/** + @epcsection{page,Page} + */ + +/** + @page epcref + @block + page + @context + collection { + .. + page { + name: "main"; + version: 1; + title: "Preference Widgets"; + subtitle: "Subtitle"; + widget: "elm/vertical_frame"; + + items { } + } + .. + } + @description + A "page" block is a grouping of prefs items together. A prefs widget + must always be bound to a page, that can address other pages in the + collection too as @b sub-pages. + @endblock + + @property + name + @parameters + [page name] + @effect + The name of the page (to be referred by the application). It must be + unique within the collection. + @endproperty + + @property + version + @parameters + [page version] + @effect + The page's version. + @endproperty + + @property + title + @parameters + [page title] + @effect + Set page's title. + @endproperty + + @property + subtitle + @parameters + [page subtitle] + @effect + Set page's subtitle. + @endproperty + + @property + widget + @parameters + [page widget] + @effect + Set the widget from among the available page widgets. Valid, built-in + page widgets are: + @li elm/horizontal_box + @li elm/vertical_box + @li elm/horizontal_frame + @li elm/vertical_frame + @endproperty + + @property + style + @parameters + [page style] + @effect + Set page's style. + @endproperty + + @property + icon + @parameters + [page icon] + @effect + Set page's icon. + @endproperty + + @property + autosave + @parameters + [1 or 0] + @effect + Takes a boolean value specifying whether page is autosaved (1) + or not (0). The default value is 1. + @endproperty +*/ + +/* Page */ +static void ob_collection_page(void); +static void st_collection_page_name(void); +static void st_collection_page_version(void); +static void st_collection_page_title(void); +static void st_collection_page_subtitle(void); +static void st_collection_page_widget(void); +static void st_collection_page_style(void); +static void st_collection_page_icon(void); +static void st_collection_page_autosave(void); + +/** + @epcsection{items,Items} + */ + +/** + @page epcref + @block + items + @context + page { + .. + items { + name: "item"; + type: INT; + label: "Just a item label..."; + + type { } + } + .. + } + + @description + An "item" block declares a new Prefs item, along with its properties. + @endblock + + @property + name + @parameters + [item name] + @effect + The item's name, to be referred by the application. It must be unique + within the page. + @endproperty + + @property + type + @parameters + [TYPE] + @effect + Set the type (all types must be entered in capitals) from among the + available types, that are: + @li BOOL - Checkbox. + @li INT - Slider. + @li FLOAT - Slider. + @li DATE - Date/time display and input widget. + @li TEXT - Single-line text entry. + @li TEXTAREA - Text entry. + @li LABEL - Read-only label. + @li PAGE - Prefs subpage object. + @li SEPARATOR - Line that serves only to divide and organize prefs + item. + @li SWALLOW - Swallows an Evas_Object. + @li SAVE - Button that will get all the values bounded to items and + save it on CFG file. + @li ACTION - Button that will emit a signal to .C file and call a + smart callback. + @li RESET - Button that will return all the values bounded to items + as default declared on .EPC file. + @endproperty + + @property + label + @parameters + [a string to label] + @effect + Set a string to item's label. + @endproperty + + @property + icon + @parameters + [item icon] + @effect + This is the item icon. + @endproperty + + @property + persistent + @parameters + [1 or 0] + @effect + Takes a boolean value specifying whether item is persistent (1) or + not (0). The default value is 1. A non persistent item doesn't save + its values when saved. + @endproperty + + @property + editable + @parameters + [1 or 0] + @effect + Takes a boolean value specifying whether item is editable (1) + or not (0). The default value is 1. + @endproperty + + @property + visible + @parameters + [1 or 0] + @effect + Takes a boolean value specifying whether item is visible (1) or not (0). + The default value is 1. + @endproperty + + @property + style + @parameters + [item style] + @effect + This is the item's style. + @endproperty + + @property + widget + @parameters + [item widget] + @effect + This is the item's widget, for cases where a widget differs than the + default assigned to the type is desired. + @endproperty +*/ +/* Items */ + +static void ob_collection_page_items(void); + +static void ob_collection_page_items_item(void); +static void st_collection_page_items_item_name(void); +static void st_collection_page_items_item_type(void); +static void st_collection_page_items_item_label(void); +static void st_collection_page_items_item_icon(void); +static void st_collection_page_items_item_persistent(void); +static void st_collection_page_items_item_editable(void); +static void st_collection_page_items_item_visible(void); +static void st_collection_page_items_item_source(void); +static void st_collection_page_items_item_style(void); +static void st_collection_page_items_item_widget(void); + +/** + @epcsection{items_bool,Bool item sub blocks} + */ + +/** + @page epcref + + @block + bool + @context + item { + .. + bool { + default: true; + } + .. + } + @description + @endblock + + @property + default + @parameters + [true or false] + @effect + Takes a boolean value specifying whether item is checked (true) + or not (false). + @endproperty +*/ + +/* Item: Bool */ +static void ob_collection_page_items_item_bool(void); +static void st_collection_page_items_item_bool_default(void); + +/** + @epcsection{items_int,Int item sub blocks} + */ + +/** + @page epcref + + @block + int + @context + item { + .. + int { + default: 150; + min: 0; + max: 300; + } + .. + } + @description + @endblock + + @property + default + @parameters + [value] + @effect + Set a default (initial) value to the item. + @endproperty + + @property + min + @parameters + [value] + @effect + Set a minimum value to the item. Note that, without a minimum + value, the widget implementing the item visually will get an + available range of values bound to the minimum of the least + integer number representable, and it might not be what you + want. + + @endproperty + + @property + max + @parameters + [value] + @effect + Set a maximum value to the item. Note that, without a maximum + value, the widget implementing the item visually will get an + available range of values bound to the maximum of the least + integer number representable, and it might not be what you + want. + @endproperty +*/ + +/* Item: Integer */ +static void ob_collection_page_items_item_int(void); +static void st_collection_page_items_item_int_default(void); +static void st_collection_page_items_item_int_max(void); +static void st_collection_page_items_item_int_min(void); + +/** + @epcsection{items_float,Float item sub blocks} + */ + +/** + @page epcref + + @block + float + @context + item { + .. + float { + default: 0.5; + min: 0; + max: 1; + } + .. + } + @description + @endblock + + @property + default + @parameters + [value] + @effect + Set a default (initial) value to the item. + @endproperty + + @property + min + @parameters + [value] + @effect + Set a minimum value to the item. Note that, without a minimum + value, the widget implementing the item visually will get an + available range of values bound to the minimum of the least + floating point number representable, and it might not be what you + want. + @endproperty + + @property + max + @parameters + [value] + @effect + Set a maximum value to the item. Note that, without a maximum + value, the widget implementing the item visually will get an + available range of values bound to the maximum of the least + floating point number representable, and it might not be what you + want. + @endproperty +*/ + +/* Item: Float */ +static void ob_collection_page_items_item_float(void); +static void st_collection_page_items_item_float_default(void); +static void st_collection_page_items_item_float_max(void); +static void st_collection_page_items_item_float_min(void); + +/** + @epcsection{items_date,Date item sub blocks} + */ + +/** + @page epcref + + @block + date + @context + item { + .. + date { + default: 2012 11 05; + min: 1900 1 1; + max: 2200 12 31; + } + .. + } + @description + @endblock + + @property + default + @parameters + [year month date] or "today" + @effect + Set a default (initial) date to the item. "today" will translate + to current date. + @endproperty + + @property + min + @parameters + [year month date] or "today" + @effect + Set a minimum date to the item. "today" will translate + to current date. + @endproperty + + @property + max + @parameters + [year month date] or "today" + @effect + Set a maximum date to the item. "today" will translate + to current date. + @endproperty +*/ + +/* Item: Date */ +static void ob_collection_page_items_item_date(void); +static void st_collection_page_items_item_date_default(void); +static void st_collection_page_items_item_date_max(void); +static void st_collection_page_items_item_date_min(void); + +/** + @epcsection{items_text,Text item sub blocks} + */ + +/** + @page epcref + + @block + text + @context + item { + .. + text { + default: "Default text"; + placeholder: "Text:"; + accept: "^[a-zA-Z ]$"; + deny: ""; + } + .. + } + @description + @endblock + + @property + default + @parameters + [a string of text] + @effect + Set a default text. + @endproperty + + @property + placeholder + @parameters + [a string of text] + @effect + Set a placeholder. + @endproperty + + @property + accept + @parameters + [regular expression] + @effect + Set an acceptance regular expression. It must be a valid one. + @endproperty + + @property + deny + @parameters + [regular expression] + @effect + Set a denial regular expression. It must be a valid one. + @endproperty +*/ + +/** + @epcsection{items_textarea,Text Area item sub blocks} + */ + +/** + @page epcref + + @block + textarea + @context + item { + .. + textarea { + default: "Default text"; + placeholder: "No Numbers!"; + accept: ""; + deny: "^[0-9]*$"; + } + .. + } + @description + @endblock + + @property + default + @parameters + [a string of text] + @effect + Set a default text. + @endproperty + + @property + placeholder + @parameters + [a string of text] + @effect + Set a placeholder. + @endproperty + + @property + accept + @parameters + [regular expression] + @effect + Set an acceptance regular expression. It must be a valid one. + @endproperty + + @property + deny + @parameters + [regular expression] + @effect + Set a denial regular expression. It must be a valid one. + @endproperty +*/ + +/* Item: Text and Text Area */ +static void ob_collection_page_items_item_text(void); +static void ob_collection_page_items_item_textarea(void); + +/* String shared statements */ +static void st_collection_page_items_item_string_default(void); +static void st_collection_page_items_item_string_placeholder(void); +static void st_collection_page_items_item_string_accept(void); +static void st_collection_page_items_item_string_deny(void); +static void st_collection_page_items_item_string_max(void); +static void st_collection_page_items_item_string_min(void); + +/* Statement Array */ +New_Statement_Handler statement_handlers[] = +{ + {"collection.page.name", st_collection_page_name}, + {"collection.page.name", st_collection_page_name}, + {"collection.page.version", st_collection_page_version}, + {"collection.page.title", st_collection_page_title}, + {"collection.page.subtitle", st_collection_page_subtitle}, + {"collection.page.widget", st_collection_page_widget}, + {"collection.page.style", st_collection_page_style}, + {"collection.page.icon", st_collection_page_icon}, + {"collection.page.autosave", st_collection_page_autosave}, + + {"collection.page.items.item.name", st_collection_page_items_item_name}, + {"collection.page.items.item.type", st_collection_page_items_item_type}, + {"collection.page.items.item.label", st_collection_page_items_item_label}, + {"collection.page.items.item.icon", st_collection_page_items_item_icon}, + {"collection.page.items.item.persistent", st_collection_page_items_item_persistent}, + {"collection.page.items.item.editable", st_collection_page_items_item_editable}, + {"collection.page.items.item.visible", st_collection_page_items_item_visible}, + {"collection.page.items.item.source", st_collection_page_items_item_source}, + {"collection.page.items.item.style", st_collection_page_items_item_style}, + {"collection.page.items.item.widget", st_collection_page_items_item_widget}, + + {"collection.page.items.item.bool.default", st_collection_page_items_item_bool_default}, + + {"collection.page.items.item.int.default", st_collection_page_items_item_int_default}, + {"collection.page.items.item.int.max", st_collection_page_items_item_int_max}, + {"collection.page.items.item.int.min", st_collection_page_items_item_int_min}, + + {"collection.page.items.item.float.default", st_collection_page_items_item_float_default}, + {"collection.page.items.item.float.max", st_collection_page_items_item_float_max}, + {"collection.page.items.item.float.min", st_collection_page_items_item_float_min}, + + {"collection.page.items.item.date.default", st_collection_page_items_item_date_default}, + {"collection.page.items.item.date.max", st_collection_page_items_item_date_max}, + {"collection.page.items.item.date.min", st_collection_page_items_item_date_min}, + + {"collection.page.items.item.text.placeholder", st_collection_page_items_item_string_placeholder}, + {"collection.page.items.item.text.default", st_collection_page_items_item_string_default}, + {"collection.page.items.item.text.accept", st_collection_page_items_item_string_accept}, + {"collection.page.items.item.text.deny", st_collection_page_items_item_string_deny}, + {"collection.page.items.item.text.max", st_collection_page_items_item_string_max}, + {"collection.page.items.item.text.min", st_collection_page_items_item_string_min}, + + {"collection.page.items.item.textarea.placeholder", st_collection_page_items_item_string_placeholder}, + {"collection.page.items.item.textarea.default", st_collection_page_items_item_string_default}, + {"collection.page.items.item.textarea.accept", st_collection_page_items_item_string_accept}, + {"collection.page.items.item.textarea.deny", st_collection_page_items_item_string_deny}, + {"collection.page.items.item.textarea.max", st_collection_page_items_item_string_max}, + {"collection.page.items.item.textarea.min", st_collection_page_items_item_string_min} +}; + +/* Object Array */ +New_Object_Handler object_handlers[] = +{ + {"collection", ob_collection}, + {"collection.page", ob_collection_page}, + + {"collection.page.items", ob_collection_page_items}, + {"collection.page.items.item", ob_collection_page_items_item}, + {"collection.page.items.item.bool", ob_collection_page_items_item_bool}, + {"collection.page.items.item.int", ob_collection_page_items_item_int}, + {"collection.page.items.item.float", ob_collection_page_items_item_float}, + {"collection.page.items.item.date", ob_collection_page_items_item_date}, + {"collection.page.items.item.text", ob_collection_page_items_item_text}, + {"collection.page.items.item.textarea", ob_collection_page_items_item_textarea} +}; + +int +object_handler_num(void) +{ + return sizeof(object_handlers) / sizeof (New_Object_Handler); +} + +int +statement_handler_num(void) +{ + return sizeof(statement_handlers) / sizeof (New_Object_Handler); +} + +static void +ob_collection(void) +{ + // NULL +} + +static void +ob_collection_page(void) +{ + current_page = mem_alloc(SZ(Elm_Prefs_Page_Node)); + if (current_page) + elm_prefs_file->pages = + eina_list_append(elm_prefs_file->pages, current_page); +} + +static void +st_collection_page_name(void) +{ + check_arg_count(1); + + current_page->name = parse_str(0); + + //TODO: check for duplicated name entries. +} + +static void +st_collection_page_version(void) +{ + check_arg_count(1); + + current_page->version = parse_int(0); +} + +static void +st_collection_page_title(void) +{ + check_arg_count(1); + + current_page->title = parse_str(0); +} + +static void +st_collection_page_subtitle(void) +{ + check_arg_count(1); + + current_page->sub_title = parse_str(0); +} + +static void +st_collection_page_widget(void) +{ + check_arg_count(1); + + current_page->widget = parse_str(0); +} + +static void +st_collection_page_style(void) +{ + check_arg_count(1); + + current_page->style = parse_str(0); +} + +static void +st_collection_page_icon(void) +{ + check_arg_count(1); + + current_page->icon = parse_str(0); +} + +static void +st_collection_page_autosave(void) +{ + check_arg_count(1); + + current_page->autosave = parse_bool(0); +} + +static void +ob_collection_page_items(void) +{ + // NULL +} + +static void +ob_collection_page_items_item(void) +{ + current_item = mem_alloc(SZ(Elm_Prefs_Item_Node)); + if (current_item) + { + current_item->visible = EINA_TRUE; + current_item->persistent = EINA_TRUE; + current_item->editable = EINA_TRUE; + current_page->items = + eina_list_append(current_page->items, current_item); + } +} + +static void +st_collection_page_items_item_name(void) +{ + check_arg_count(1); + + current_item->name = parse_str(0); +} + +static void +st_collection_page_items_item_type(void) +{ + check_arg_count(1); + + current_item->type = parse_enum(0, + "ACTION", ELM_PREFS_TYPE_ACTION, + "BOOL", ELM_PREFS_TYPE_BOOL, + "INT", ELM_PREFS_TYPE_INT, + "FLOAT", ELM_PREFS_TYPE_FLOAT, + "DATE", ELM_PREFS_TYPE_DATE, + "LABEL", ELM_PREFS_TYPE_LABEL, + "PAGE", ELM_PREFS_TYPE_PAGE, + "TEXT", ELM_PREFS_TYPE_TEXT, + "TEXTAREA", ELM_PREFS_TYPE_TEXTAREA, + "RESET", ELM_PREFS_TYPE_RESET, + "SAVE", ELM_PREFS_TYPE_SAVE, + "SEPARATOR", ELM_PREFS_TYPE_SEPARATOR, + "SWALLOW", ELM_PREFS_TYPE_SWALLOW, + NULL); + + switch (current_item->type) + { + case ELM_PREFS_TYPE_ACTION: + case ELM_PREFS_TYPE_LABEL: + case ELM_PREFS_TYPE_RESET: + case ELM_PREFS_TYPE_SEPARATOR: + case ELM_PREFS_TYPE_SWALLOW: + current_item->editable = EINA_FALSE; + current_item->persistent = EINA_FALSE; + break; + + case ELM_PREFS_TYPE_INT: + current_item->spec.i.max = INT_MAX; + current_item->spec.i.min = INT_MIN; + break; + + case ELM_PREFS_TYPE_FLOAT: + current_item->spec.f.max = FLT_MAX; + current_item->spec.f.min = -FLT_MAX; + break; + + case ELM_PREFS_TYPE_DATE: + { + time_t t = time(NULL); + struct tm *lt = localtime(&t); + + current_item->spec.d.def.y = lt->tm_year + 1900; + current_item->spec.d.def.m = lt->tm_mon + 1; + current_item->spec.d.def.d = lt->tm_mday; + + current_item->spec.d.min.y = 1900; + current_item->spec.d.min.m = 1; + current_item->spec.d.min.d = 1; + + current_item->spec.d.max.y = 10000 - 1900; + current_item->spec.d.max.m = 1; + current_item->spec.d.max.d = 1; + } + break; + + case ELM_PREFS_TYPE_TEXT: + case ELM_PREFS_TYPE_TEXTAREA: + current_item->spec.s.length.max = INT_MAX; + break; + + default: + break; + } +} + +static void +st_collection_page_items_item_label(void) +{ + check_arg_count(1); + + current_item->label = parse_str(0); +} + +static void +st_collection_page_items_item_icon(void) +{ + check_arg_count(1); + + current_item->icon = parse_str(0); +} + +static void +st_collection_page_items_item_persistent(void) +{ + check_arg_count(1); + + current_item->persistent = parse_bool(0); +} + +static void +st_collection_page_items_item_editable(void) +{ + check_arg_count(1); + + current_item->editable = parse_bool(0); +} + +static void +st_collection_page_items_item_visible(void) +{ + check_arg_count(1); + + current_item->visible = parse_bool(0); +} + +static void +st_collection_page_items_item_source(void) +{ + check_arg_count(1); + + current_item->spec.p.source = parse_str(0); +} + +static void +st_collection_page_items_item_style(void) +{ + check_arg_count(1); + + current_item->style = parse_str(0); +} + +static void +st_collection_page_items_item_widget(void) +{ + check_arg_count(1); + + current_item->widget = parse_str(0); +} + +static void +ob_collection_page_items_item_bool(void) +{ + //TODO: check if current item type match +} + +static void +st_collection_page_items_item_bool_default(void) +{ + check_arg_count(1); + + current_item->spec.b.def = parse_bool(0); +} + +static void +ob_collection_page_items_item_int(void) +{ + //TODO: check if current item type match +} + +static void +st_collection_page_items_item_int_default(void) +{ + check_arg_count(1); + + current_item->spec.i.def = parse_int(0); +} + +static void +st_collection_page_items_item_int_max(void) +{ + check_arg_count(1); + + current_item->spec.i.max = parse_int(0); +} + +static void +st_collection_page_items_item_int_min(void) +{ + check_arg_count(1); + + current_item->spec.i.min = parse_int(0); +} + +static void +ob_collection_page_items_item_float(void) +{ + //TODO: check if current item type match +} + +static void +st_collection_page_items_item_float_default(void) +{ + check_arg_count(1); + + current_item->spec.f.def = parse_float(0); +} + +static void +st_collection_page_items_item_float_max(void) +{ + check_arg_count(1); + + current_item->spec.f.max = parse_float(0); +} + +static void +st_collection_page_items_item_float_min(void) +{ + check_arg_count(1); + + current_item->spec.f.min = parse_float(0); +} + +static void +ob_collection_page_items_item_date(void) +{ + //TODO: check if current item type match +} + +static void +st_collection_page_items_item_date_default(void) +{ + check_min_arg_count(1); + + if (params_min_check(1)) + { + check_arg_count(3); + + current_item->spec.d.def.y = parse_int_range(0, 1900, 10000); + current_item->spec.d.def.m = parse_int_range(1, 1, 12); + current_item->spec.d.def.d = parse_int_range(2, 1, 31); + } + else + { + const char *date = parse_str(0); + if (!strcasecmp(date, "today")) + { + time_t t = time(NULL); + struct tm *lt = localtime(&t); + + current_item->spec.d.def.y = lt->tm_year + 1900; + current_item->spec.d.def.m = lt->tm_mon + 1; + current_item->spec.d.def.d = lt->tm_mday; + } + free((void *)date); + } +} + +static void +st_collection_page_items_item_date_max(void) +{ + check_min_arg_count(1); + + if (params_min_check(1)) + { + check_arg_count(3); + + current_item->spec.d.max.y = parse_int_range(0, 1900, 10000); + current_item->spec.d.max.m = parse_int_range(1, 1, 12); + current_item->spec.d.max.d = parse_int_range(2, 1, 31); + } + else + { + const char *date = parse_str(0); + if (!strcasecmp(date, "today")) + { + time_t t = time(NULL); + struct tm *lt = localtime(&t); + + current_item->spec.d.max.y = lt->tm_year + 1900; + current_item->spec.d.max.m = lt->tm_mon + 1; + current_item->spec.d.max.d = lt->tm_mday; + } + free((void *)date); + } +} + +static void +st_collection_page_items_item_date_min(void) +{ + check_min_arg_count(1); + + if (params_min_check(1)) + { + check_arg_count(3); + + current_item->spec.d.min.y = parse_int_range(0, 1900, 10000); + current_item->spec.d.min.m = parse_int_range(1, 1, 12); + current_item->spec.d.min.d = parse_int_range(2, 1, 31); + } + else + { + const char *date = parse_str(0); + if (!strcasecmp(date, "today")) + { + time_t t = time(NULL); + struct tm *lt = localtime(&t); + + current_item->spec.d.min.y = lt->tm_year + 1900; + current_item->spec.d.min.m = lt->tm_mon + 1; + current_item->spec.d.min.d = lt->tm_mday; + } + free((void *)date); + } +} + +static void +ob_collection_page_items_item_text(void) +{ + //TODO: check if current item type match +} + +static void +ob_collection_page_items_item_textarea(void) +{ + //todo: check if current item type match +} + +static void +st_collection_page_items_item_string_placeholder(void) +{ + check_arg_count(1); + + current_item->spec.s.placeholder = parse_str(0); +} + +static void +st_collection_page_items_item_string_default(void) +{ + check_arg_count(1); + + current_item->spec.s.def = parse_str(0); +} + +static void +st_collection_page_items_item_string_accept(void) +{ + check_arg_count(1); + + current_item->spec.s.accept = parse_str(0); + + check_regex(current_item->spec.s.accept); +} + +static void +st_collection_page_items_item_string_deny(void) +{ + check_arg_count(1); + + current_item->spec.s.deny = parse_str(0); + + check_regex(current_item->spec.s.deny); +} + +static void +st_collection_page_items_item_string_max(void) +{ + check_arg_count(1); + + current_item->spec.s.length.max = parse_int(0); +} + +static void +st_collection_page_items_item_string_min(void) +{ + check_arg_count(1); + + current_item->spec.s.length.min = parse_int(0); +} diff --git a/src/bin/elementary/elm_prefs_cc_mem.c b/src/bin/elementary/elm_prefs_cc_mem.c new file mode 100644 index 0000000000..3e269d3674 --- /dev/null +++ b/src/bin/elementary/elm_prefs_cc_mem.c @@ -0,0 +1,35 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif + +#include <string.h> +#include <errno.h> + +#include "elm_prefs_cc.h" + +void * +mem_alloc(size_t size) +{ + void *mem; + + mem = calloc(1, size); + if (mem) return mem; + ERR("%s:%i memory allocation of %zu bytes failed. %s", + file_in, line, size, strerror(errno)); + exit(-1); + return NULL; +} + +char * +mem_strdup(const char *s) +{ + void *str; + + str = strdup(s); + if (str) return str; + ERR("%s:%i memory allocation of %zu bytes failed. %s. string " + "being duplicated: \"%s\"", + file_in, line, strlen(s) + 1, strerror(errno), s); + exit(-1); + return NULL; +} diff --git a/src/bin/elementary/elm_prefs_cc_out.c b/src/bin/elementary/elm_prefs_cc_out.c new file mode 100644 index 0000000000..8913b71712 --- /dev/null +++ b/src/bin/elementary/elm_prefs_cc_out.c @@ -0,0 +1,52 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif + +#include "elm_prefs_cc.h" +#include "elm_prefs_edd.x" + +Elm_Prefs_File *elm_prefs_file = NULL; + +void +data_init() +{ + eet_init(); + _elm_prefs_descriptors_init(); +} + +void +data_shutdown() +{ + _elm_prefs_descriptors_shutdown(); + eet_shutdown(); +} + +void +data_write() +{ + Eina_List *l; + Eet_File *ef; + Elm_Prefs_Page_Node *page; + + if (!elm_prefs_file || !elm_prefs_file->pages) + { + ERR("No data to put in \"%s\"", file_out); + exit(-1); + } + + ef = eet_open(file_out, EET_FILE_MODE_WRITE); + if (!ef) + { + ERR("Unable to open \"%s\" for writing output", file_out); + exit(-1); + } + + EINA_LIST_FOREACH (elm_prefs_file->pages, l, page) + { + if (!(eet_data_write + (ef, _page_edd, page->name, page, EET_COMPRESSION_DEFAULT))) + ERR("Failed to write page %s to file %s", page->name, file_out); + } + + eet_close(ef); +} diff --git a/src/bin/elementary/elm_prefs_cc_parse.c b/src/bin/elementary/elm_prefs_cc_parse.c new file mode 100644 index 0000000000..5fda91eed1 --- /dev/null +++ b/src/bin/elementary/elm_prefs_cc_parse.c @@ -0,0 +1,1401 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif + +#ifdef HAVE_ALLOCA_H +# include <alloca.h> +#elif defined __GNUC__ +# define alloca __builtin_alloca +#elif defined _AIX +# define alloca __alloca +#elif defined _MSC_VER +# include <malloc.h> +# define alloca _alloca +#else +# include <stddef.h> +# ifdef __cplusplus +extern "C" +# endif +void *alloca(size_t); +#endif + +#include <string.h> +#include <ctype.h> +#include <limits.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <fcntl.h> +#include <math.h> +#include <regex.h> + +#include "elm_prefs_cc.h" +#include <Ecore.h> +#include <Ecore_File.h> + +#ifdef _WIN32 +# define EPP_EXT ".exe" +#else +# define EPP_EXT +#endif + +static void new_object(void); +static void new_statement(void); +static char *perform_math(char *input); +static int isdelim(char c); +static char *next_token(char *p, char *end, char **new_p, int *delim); +static const char *stack_id(void); +static void parse(char *data, off_t size); + +/* simple expression parsing protos */ +static int my_atoi(const char *s); +static char *_alphai(char *s, int *val); +static char *_betai(char *s, int *val); +static char *_gammai(char *s, int *val); +static char *_deltai(char *s, int *val); +static char *_get_numi(char *s, int *val); +static int _is_numi(char c); +static int _is_op1i(char c); +static int _is_op2i(char c); +static int _calci(char op, int a, int b); + +static double my_atof(const char *s); +static char *_alphaf(char *s, double *val); +static char *_betaf(char *s, double *val); +static char *_gammaf(char *s, double *val); +static char *_deltaf(char *s, double *val); +static char *_get_numf(char *s, double *val); +static int _is_numf(char c); +static int _is_op1f(char c); +static int _is_op2f(char c); +static double _calcf(char op, double a, double b); +static int strstrip(const char *in, char *out, size_t size); + +int line = 0; +Eina_List *stack = NULL; +Eina_List *params = NULL; + +static char file_buf[4096]; +static int verbatim = 0; +static int verbatim_line1 = 0; +static int verbatim_line2 = 0; +static char *verbatim_str = NULL; +static Eina_Strbuf *stack_buf = NULL; + +static void +err_show_stack(void) +{ + const char *s; + + s = stack_id(); + if (s) + ERR("PARSE STACK:\n%s", s); + else + ERR("NO PARSE STACK"); +} + +static void +err_show_params(void) +{ + Eina_List *l; + char *p; + + ERR("PARAMS:"); + EINA_LIST_FOREACH(params, l, p) + { + ERR(" %s", p); + } +} + +static void +err_show(void) +{ + err_show_stack(); + err_show_params(); +} + +static char * +_parse_param_get(int n) +{ + if (n < (int) eina_list_count(params)) + return eina_list_nth(params, n); + return NULL; +} + +static Eina_Hash *_new_object_hash = NULL; +static Eina_Hash *_new_statement_hash = NULL; + +static void +fill_object_statement_hashes(void) +{ + int i, n; + + if (_new_object_hash) return; + + _new_object_hash = eina_hash_string_superfast_new(NULL); + _new_statement_hash = eina_hash_string_superfast_new(NULL); + + n = object_handler_num(); + for (i = 0; i < n; i++) + { + eina_hash_direct_add(_new_object_hash, object_handlers[i].type, + &(object_handlers[i])); + } + n = statement_handler_num(); + for (i = 0; i < n; i++) + { + eina_hash_direct_add(_new_statement_hash, statement_handlers[i].type, + &(statement_handlers[i])); + } +} + +static void +new_object(void) +{ + const char *id; + New_Object_Handler *oh; + New_Statement_Handler *sh; + + fill_object_statement_hashes(); + id = stack_id(); + oh = eina_hash_find(_new_object_hash, id); + if (oh) + { + if (oh->func) oh->func(); + } + else + { + sh = eina_hash_find(_new_statement_hash, id); + if (!sh) + { + ERR("%s:%i unhandled keyword %s", + file_in, line - 1, + (char *)eina_list_data_get(eina_list_last(stack))); + err_show(); + exit(-1); + } + } +} + +static void +new_statement(void) +{ + const char *id; + New_Statement_Handler *sh; + + fill_object_statement_hashes(); + id = stack_id(); + sh = eina_hash_find(_new_statement_hash, id); + if (sh) + { + if (sh->func) sh->func(); + } + else + { + ERR("%s:%i unhandled keyword %s", + file_in, line - 1, + (char *)eina_list_data_get(eina_list_last(stack))); + err_show(); + exit(-1); + } +} + +static char * +perform_math(char *input) +{ + char buf[256]; + double res; + + /* FIXME + * Always apply floating-point arithmetic. + * Does this cause problems for integer parameters? (yes it will) + * + * What we should do is, loop over the string and figure out whether + * there are floating point operands, too and then switch to + * floating point math. + */ + res = my_atof(input); + snprintf(buf, sizeof (buf), "%lf", res); + return strdup(buf); +} + +static int +isdelim(char c) +{ + const char *delims = "{},;:"; + char *d; + + d = (char *)delims; + while (*d) + { + if (c == *d) return 1; + d++; + } + return 0; +} + +static char * +next_token(char *p, char *end, char **new_p, int *delim) +{ + char *tok_start = NULL, *tok_end = NULL, *tok = NULL, *sa_start = NULL; + int in_tok = 0; + int in_quote = 0; + int in_parens = 0; + int in_comment_ss = 0; + int in_comment_cpp = 0; + int in_comment_sa = 0; + int had_quote = 0; + int is_escaped = 0; + + *delim = 0; + if (p >= end) return NULL; + while (p < end) + { + if (*p == '\n') + { + in_comment_ss = 0; + in_comment_cpp = 0; + line++; + } + if ((!in_comment_ss) && (!in_comment_sa)) + { + if ((!in_quote) && (*p == '/') && (p < (end - 1)) && (*(p + 1) == '/')) + in_comment_ss = 1; + if ((!in_quote) && (*p == '#')) + in_comment_cpp = 1; + if ((!in_quote) && (*p == '/') && (p < (end - 1)) && (*(p + 1) == '*')) + { + in_comment_sa = 1; + sa_start = p; + } + } + if ((in_comment_cpp) && (*p == '#')) + { + char *pp, fl[4096]; + char *tmpstr = NULL; + int l, nm; + + /* handle cpp comments */ + /* their line format is + * #line <line no. of next line> <filename from next line on> [??] + */ + + pp = p; + while ((pp < end) && (*pp != '\n')) + { + pp++; + } + l = pp - p; + tmpstr = alloca(l + 1); + if (!tmpstr) + { + ERR("%s:%i malloc %i bytes failed", + file_in, line - 1, l + 1); + exit(-1); + } + strncpy(tmpstr, p, l); + tmpstr[l] = 0; + l = sscanf(tmpstr, "%*s %i \"%[^\"]\"", &nm, fl); + if (l == 2) + { + strcpy(file_buf, fl); + line = nm; + file_in = file_buf; + } + } + else if ((!in_comment_ss) && (!in_comment_sa) && (!in_comment_cpp)) + { + if (!in_tok) + { + if (!in_quote) + { + if (!isspace(*p)) + { + if (*p == '"') + { + in_quote = 1; + had_quote = 1; + } + else if (*p == '(') + in_parens++; + + in_tok = 1; + tok_start = p; + if (isdelim(*p)) *delim = 1; + } + } + } + else + { + if (in_quote) + { + if ((*p) == '\\') + is_escaped = !is_escaped; + else if (((*p) == '"') && (!is_escaped)) + { + in_quote = 0; + had_quote = 1; + } + else if (is_escaped) + is_escaped = 0; + } + else if (in_parens) + { + if (((*p) == ')') && (!is_escaped)) + in_parens--; + } + else + { + if (*p == '"') + { + in_quote = 1; + had_quote = 1; + } + else if (*p == '(') + in_parens++; + + /* check for end-of-token */ + if ( + (isspace(*p)) || + ((*delim) && (!isdelim(*p))) || + (isdelim(*p)) + ) /*the line below this is never used because it skips to + * the 'done' label which is after the return call for + * in_tok being 0. is this intentional? + */ + { + in_tok = 0; + + tok_end = p - 1; + if (*p == '\n') line--; + goto done; + } + } + } + } + if (in_comment_sa) + { + if ((*p == '/') && (*(p - 1) == '*') && ((p - sa_start) > 2)) + in_comment_sa = 0; + } + p++; + } + if (!in_tok) return NULL; + tok_end = p - 1; + +done: + *new_p = p; + + tok = mem_alloc(tok_end - tok_start + 2); + if (!tok) return NULL; + strncpy(tok, tok_start, tok_end - tok_start + 1); + tok[tok_end - tok_start + 1] = 0; + + if (had_quote) + { + is_escaped = 0; + p = tok; + + while (*p) + { + if ((*p == '\"') && (!is_escaped)) + { + memmove(p, p + 1, strlen(p)); + } + else if ((*p == '\\') && (*(p + 1) == 'n')) + { + memmove(p, p + 1, strlen(p)); + *p = '\n'; + } + else if ((*p == '\\') && (*(p + 1) == 't')) + { + memmove(p, p + 1, strlen(p)); + *p = '\t'; + } + else if (*p == '\\') + { + memmove(p, p + 1, strlen(p)); + if (*p == '\\') p++; + else is_escaped = 1; + } + else + { + if (is_escaped) is_escaped = 0; + p++; + } + } + } + else if (*tok == '(') + { + char *tmp; + tmp = tok; + tok = perform_math(tok); + free(tmp); + } + + return tok; +} + +static void +stack_push(char *token) +{ + if (stack) eina_strbuf_append(stack_buf, "."); + eina_strbuf_append(stack_buf, token); + + stack = eina_list_append(stack, token); +} + +static void +stack_pop(void) +{ + char *top; + int top_length; + + if (!stack) + { + ERR("parse error %s:%i. } marker without matching { marker", + file_in, line - 1); + + err_show(); + exit(-1); + } + + top = eina_list_data_get(eina_list_last(stack)); + top_length = strlen(top); + + stack = eina_list_remove_list(stack, eina_list_last(stack)); + + if (eina_list_count(stack)) top_length++; // remove '.' as well. + + eina_strbuf_remove(stack_buf, + eina_strbuf_length_get(stack_buf) - top_length, + eina_strbuf_length_get(stack_buf)); + + free(top); +} + +static const char * +stack_id(void) +{ + return eina_strbuf_string_get(stack_buf); +} + +static void +parse(char *data, off_t size) +{ + char *p, *end, *token; + int delim = 0; + int do_params = 0; + + DBG("Parsing input file"); + + p = data; + end = data + size; + line = 1; + while ((token = next_token(p, end, &p, &delim))) + { + /* if we are in param mode, the only delimiter + * we'll accept is the semicolon + */ + if (do_params && delim && *token != ';') + { + ERR("parse error %s:%i. %c marker before ; marker", + file_in, line - 1, *token); + err_show(); + exit(-1); + } + else if (delim) + { + if (*token == ',' || *token == ':') do_params = 1; + else if (*token == '}') + { + if (do_params) + { + ERR("Parse error %s:%i. } marker before ; marker", + file_in, line - 1); + err_show(); + exit(-1); + } + else + stack_pop(); + } + else if (*token == ';') + { + if (do_params) + { + do_params = 0; + new_statement(); + /* clear out params */ + while (params) + { + free(eina_list_data_get(params)); + params = eina_list_remove(params, eina_list_data_get(params)); + } + /* remove top from stack */ + stack_pop(); + } + } + else if (*token == '{') + { + if (do_params) + { + ERR("parse error %s:%i. { marker before ; marker", + file_in, line - 1); + err_show(); + exit(-1); + } + } + free(token); + } + else + { + if (do_params) + params = eina_list_append(params, token); + else + { + stack_push(token); + new_object(); + if ((verbatim == 1) && (p < (end - 2))) + { + int escaped = 0; + int inquotes = 0; + int insquotes = 0; + int squigglie = 1; + int l1 = 0, l2 = 0; + char *verbatim_1; + char *verbatim_2; + + l1 = line; + while ((p[0] != '{') && (p < end)) + { + if (*p == '\n') line++; + p++; + } + p++; + verbatim_1 = p; + verbatim_2 = NULL; + for (; p < end; p++) + { + if (*p == '\n') line++; + if (escaped) escaped = 0; + if (!escaped) + { + if (p[0] == '\\') escaped = 1; + else if (p[0] == '\"') + { + if (!insquotes) + { + if (inquotes) inquotes = 0; + else inquotes = 1; + } + } + else if (p[0] == '\'') + { + if (!inquotes) + { + if (insquotes) insquotes = 0; + else insquotes = 1; + } + } + else if ((!inquotes) && (!insquotes)) + { + if (p[0] == '{') squigglie++; + else if (p[0] == '}') + squigglie--; + if (squigglie == 0) + { + verbatim_2 = p - 1; + l2 = line; + break; + } + } + } + } + if (verbatim_2 > verbatim_1) + { + int l; + char *v; + + l = verbatim_2 - verbatim_1 + 1; + v = malloc(l + 1); + strncpy(v, verbatim_1, l); + v[l] = 0; + set_verbatim(v, l1, l2); + } + else + { + ERR("Parse error %s:%i. { marker does not have matching } marker", + file_in, line - 1); + err_show(); + exit(-1); + } + new_object(); + verbatim = 0; + } + } + } + } + + DBG("Parsing done"); +} + +void +set_verbatim(char *s, int l1, int l2) +{ + verbatim_line1 = l1; + verbatim_line2 = l2; + verbatim_str = s; +} + +void +compile(void) +{ + int fd; + off_t size; + char *data; + + fd = open(file_in, O_RDONLY | O_BINARY, S_IRUSR | S_IWUSR); + if (fd < 0) + { + ERR("Cannot open file \"%s\" for input. %s", + file_in, strerror(errno)); + exit(-1); + } + DBG("Opening \"%s\" for input", file_in); + + size = lseek(fd, 0, SEEK_END); + if (size <= 0) + { + ERR("lseek failed"); + close(fd); + return; + } + lseek(fd, 0, SEEK_SET); + data = malloc(size); + if (data && (read(fd, data, size) == size)) + { + stack_buf = eina_strbuf_new(); + parse(data, size); + eina_strbuf_free(stack_buf); + stack_buf = NULL; + } + else + { + ERR("Cannot read file \"%s\". %s", file_in, strerror(errno)); + exit(-1); + } + free(data); + close(fd); +} + +char * +parse_str(int n) +{ + char *str; + char *s; + + str = eina_list_nth(params, n); + if (!str) + { + ERR("%s:%i no parameter supplied as argument %i", + file_in, line - 1, n + 1); + err_show(); + exit(-1); + } + s = mem_strdup(str); + return s; +} + +static int +_parse_enum(char *str, va_list va) +{ + va_list va2; + va_copy(va2, va); /* iterator for the error message */ + + for (;; ) + { + char *s; + int v; + + s = va_arg(va, char *); + + /* End of the list, nothing matched. */ + if (!s) + { + ERR("%s:%i token %s not one of:", file_in, line - 1, str); + s = va_arg(va2, char *); + while (s) + { + va_arg(va2, int); + fprintf(stderr, " %s", s); + s = va_arg(va2, char *); + if (!s) break; + } + fprintf(stderr, "\n"); + va_end(va2); + va_end(va); + err_show(); + exit(-1); + } + + v = va_arg(va, int); + if (!strcmp(s, str)) + { + va_end(va2); + va_end(va); + return v; + } + } + va_end(va2); + va_end(va); + return 0; +} + +int +parse_enum(int n, ...) +{ + char *str; + int result; + va_list va; + + str = eina_list_nth(params, n); + if (!str) + { + ERR("%s:%i no parameter supplied as argument %i", + file_in, line - 1, n + 1); + err_show(); + exit(-1); + } + + va_start(va, n); + result = _parse_enum(str, va); + va_end(va); + + return result; +} + +int +parse_int(int n) +{ + char *str; + int i; + + str = eina_list_nth(params, n); + if (!str) + { + ERR("%s:%i no parameter supplied as argument %i", + file_in, line - 1, n + 1); + err_show(); + exit(-1); + } + i = my_atoi(str); + return i; +} + +int +parse_int_range(int n, int f, int t) +{ + char *str; + int i; + + str = eina_list_nth(params, n); + if (!str) + { + ERR("%s:%i no parameter supplied as argument %i", + file_in, line - 1, n + 1); + err_show(); + exit(-1); + } + i = my_atoi(str); + if ((i < f) || (i > t)) + { + ERR("%s:%i integer %i out of range of %i to %i inclusive", + file_in, line - 1, i, f, t); + err_show(); + exit(-1); + } + return i; +} + +int +parse_bool(int n) +{ + char *str, buf[4096]; + int i; + + str = eina_list_nth(params, n); + if (!str) + { + ERR("%s:%i no parameter supplied as argument %i", + file_in, line - 1, n + 1); + err_show(); + exit(-1); + } + + if (!strstrip(str, buf, sizeof (buf))) + { + ERR("%s:%i expression is too long", + file_in, line - 1); + return 0; + } + + if (!strcasecmp(buf, "false") || !strcasecmp(buf, "off")) + return 0; + if (!strcasecmp(buf, "true") || !strcasecmp(buf, "on")) + return 1; + + i = my_atoi(str); + if ((i < 0) || (i > 1)) + { + ERR("%s:%i integer %i out of range of 0 to 1 inclusive", + file_in, line - 1, i); + err_show(); + exit(-1); + } + return i; +} + +double +parse_float(int n) +{ + char *str; + double i; + + str = eina_list_nth(params, n); + if (!str) + { + ERR("%s:%i no parameter supplied as argument %i", + file_in, line - 1, n + 1); + err_show(); + exit(-1); + } + i = my_atof(str); + return i; +} + +int +get_arg_count(void) +{ + return eina_list_count(params); +} + +void +check_arg_count(int required_args) +{ + int num_args = eina_list_count(params); + + if (num_args != required_args) + { + ERR("%s:%i got %i arguments, but expected %i", + file_in, line - 1, num_args, required_args); + err_show(); + exit(-1); + } +} + +void +check_min_arg_count(int min_required_args) +{ + int num_args = eina_list_count(params); + + if (num_args < min_required_args) + { + ERR("%s:%i got %i arguments, but expected at least %i", + file_in, line - 1, num_args, min_required_args); + err_show(); + exit(-1); + } +} + +void +check_regex(const char *regex) +{ + int ret; + char errbuf[1024]; + regex_t preg; + + ret = regcomp(&preg, regex, REG_EXTENDED | REG_NOSUB); + if (ret) + { + regerror(ret, &preg, errbuf, 1024); + ERR("%s:%i Invalid regular expression:\n" + "%s", file_in, line, errbuf); + err_show(); + exit(-1); + } + + regfree(&preg); +} + +/* simple expression parsing stuff */ + +/* + * alpha ::= beta + beta || beta + * beta ::= gamma + gamma || gamma + * gamma ::= num || delta + * delta ::= '(' alpha ')' + * + */ + +/* int set of function */ + +static int +my_atoi(const char *s) +{ + int res = 0; + char buf[4096]; + + if (!s) return 0; + if (!strstrip(s, buf, sizeof(buf))) + { + ERR("%s:%i expression is too long", + file_in, line - 1); + return 0; + } + _alphai(buf, &res); + return res; +} + +static char * +_deltai(char *s, int *val) +{ + if (!val) return NULL; + if ('(' != s[0]) + { + ERR("%s:%i unexpected character at %s", + file_in, line - 1, s); + return s; + } + else + { + s++; + s = _alphai(s, val); + s++; + return s; + } + return s; +} + +static char * +_funci(char *s, int *val) +{ + if (!strncmp(s, "floor(", 6)) + { + s += 5; + s = _deltai(s, val); + } + else if (!strncmp(s, "ceil(", 5)) + { + s += 4; + s = _deltai(s, val); + } + else + { + ERR("%s:%i unexpected character at %s", + file_in, line - 1, s); + } + return s; +} + +static char * +_gammai(char *s, int *val) +{ + if (!val) return NULL; + if (_is_numi(s[0])) + { + s = _get_numi(s, val); + return s; + } + else if ('(' == s[0]) + { + s = _deltai(s, val); + return s; + } + else + { + s = _funci(s, val); +// ERR("%s:%i unexpected character at %s", +// progname, file_in, line - 1, s); + } + return s; +} + +static char * +_betai(char *s, int *val) +{ + int a1, a2; + char op; + + if (!val) return NULL; + s = _gammai(s, &a1); + while (_is_op1i(s[0])) + { + op = s[0]; + s++; + s = _gammai(s, &a2); + a1 = _calci(op, a1, a2); + } + (*val) = a1; + return s; +} + +static char * +_alphai(char *s, int *val) +{ + int a1, a2; + char op; + + if (!val) return NULL; + s = _betai(s, &a1); + while (_is_op2i(s[0])) + { + op = s[0]; + s++; + s = _betai(s, &a2); + a1 = _calci(op, a1, a2); + } + (*val) = a1; + return s; +} + +static char * +_get_numi(char *s, int *val) +{ + char buf[4096]; + int pos = 0; + + if (!val) return s; + while ((('0' <= s[pos]) && ('9' >= s[pos])) || + ((0 == pos) && ('-' == s[pos]))) + { + buf[pos] = s[pos]; + pos++; + } + buf[pos] = '\0'; + (*val) = atoi(buf); + return s + pos; +} + +static int +_is_numi(char c) +{ + if (((c >= '0') && (c <= '9')) || ('-' == c) || ('+' == c)) + return 1; + else + return 0; +} + +static int +_is_op1i(char c) +{ + switch (c) + { + case '*':; + + case '%':; + + case '/': return 1; + + default: break; + } + return 0; +} + +static int +_is_op2i(char c) +{ + switch (c) + { + case '+':; + + case '-': return 1; + + default: break; + } + return 0; +} + +static int +_calci(char op, int a, int b) +{ + switch (op) + { + case '+': + a += b; + return a; + + case '-': + a -= b; + return a; + + case '/': + if (0 != b) a /= b; + else + ERR("%s:%i divide by zero", file_in, line - 1); + return a; + + case '*': + a *= b; + return a; + + case '%': + if (0 != b) a = a % b; + else + ERR("%s:%i modula by zero", file_in, line - 1); + return a; + + default: + ERR("%s:%i unexpected character '%c'", file_in, line - 1, op); + } + return a; +} + +/* float set of functoins */ + +static double +my_atof(const char *s) +{ + double res = 0; + char buf[4096]; + + if (!s) return 0; + + if (!strstrip(s, buf, sizeof (buf))) + { + ERR("%s:%i expression is too long", file_in, line - 1); + return 0; + } + _alphaf(buf, &res); + return res; +} + +static char * +_deltaf(char *s, double *val) +{ + if (!val) return NULL; + if ('(' != s[0]) + { + ERR("%s:%i unexpected character at %s", file_in, line - 1, s); + return s; + } + else + { + s++; + s = _alphaf(s, val); + s++; + } + return s; +} + +static char * +_funcf(char *s, double *val) +{ + if (!strncmp(s, "floor(", 6)) + { + s += 5; + s = _deltaf(s, val); + *val = floor(*val); + } + else if (!strncmp(s, "ceil(", 5)) + { + s += 4; + s = _deltaf(s, val); + *val = ceil(*val); + } + else + { + ERR("%s:%i unexpected character at %s", file_in, line - 1, s); + } + return s; +} + +static char * +_gammaf(char *s, double *val) +{ + if (!val) return NULL; + + if (_is_numf(s[0])) + { + s = _get_numf(s, val); + return s; + } + else if ('(' == s[0]) + { + s = _deltaf(s, val); + return s; + } + else + { + s = _funcf(s, val); +// ERR("%s:%i unexpected character at %s", +// progname, file_in, line - 1, s); + } + return s; +} + +static char * +_betaf(char *s, double *val) +{ + double a1 = 0, a2 = 0; + char op; + + if (!val) return NULL; + s = _gammaf(s, &a1); + while (_is_op1f(s[0])) + { + op = s[0]; + s++; + s = _gammaf(s, &a2); + a1 = _calcf(op, a1, a2); + } + (*val) = a1; + return s; +} + +static char * +_alphaf(char *s, double *val) +{ + double a1 = 0, a2 = 0; + char op; + + if (!val) return NULL; + s = _betaf(s, &a1); + while (_is_op2f(s[0])) + { + op = s[0]; + s++; + s = _betaf(s, &a2); + a1 = _calcf(op, a1, a2); + } + (*val) = a1; + return s; +} + +static char * +_get_numf(char *s, double *val) +{ + char buf[4096]; + int pos = 0; + + if (!val) return s; + + while ((('0' <= s[pos]) && ('9' >= s[pos])) || + ('.' == s[pos]) || + ((0 == pos) && ('-' == s[pos]))) + { + buf[pos] = s[pos]; + pos++; + } + buf[pos] = '\0'; + (*val) = atof(buf); + return s + pos; +} + +int +params_min_check(int n) +{ + char *str; + + str = _parse_param_get(n); + if (str) return 1; + return 0; +} + +static int +_is_numf(char c) +{ + if (((c >= '0') && (c <= '9')) + || ('-' == c) + || ('.' == c) + || ('+' == c)) + return 1; + return 0; +} + +static int +_is_op1f(char c) +{ + switch (c) + { + case '*':; + + case '%':; + + case '/': return 1; + + default: break; + } + return 0; +} + +static int +_is_op2f(char c) +{ + switch (c) + { + case '+':; + + case '-': return 1; + + default: break; + } + return 0; +} + +static double +_calcf(char op, double a, double b) +{ + switch (op) + { + case '+': + a += b; + return a; + + case '-': + a -= b; + return a; + + case '/': + if (b != 0) a /= b; + else + ERR("%s:%i divide by zero", file_in, line - 1); + return a; + + case '*': + a *= b; + return a; + + case '%': + if (0 != b) a = (double)((int)a % (int)b); + else + ERR("%s:%i modula by zero", file_in, line - 1); + return a; + + default: + ERR("%s:%i unexpected character '%c'", file_in, line - 1, op); + } + return a; +} + +static int +strstrip(const char *in, char *out, size_t size) +{ + if ((size - 1) < strlen(in)) + { + ERR("%s:%i expression is too long", file_in, line - 1); + return 0; + } + /* remove spaces and tabs */ + while (*in) + { + if ((0x20 != *in) && (0x09 != *in)) + { + *out = *in; + out++; + } + in++; + } + *out = '\0'; + return 1; +} diff --git a/src/bin/elementary/quicklaunch.c b/src/bin/elementary/quicklaunch.c new file mode 100644 index 0000000000..6ca0a3c973 --- /dev/null +++ b/src/bin/elementary/quicklaunch.c @@ -0,0 +1,347 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <string.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/un.h> +#ifdef HAVE_ENVIRON +# define _GNU_SOURCE 1 +#endif +#include <unistd.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <signal.h> +#include <sys/wait.h> + +#include <Elementary.h> + +#ifdef HAVE_ENVIRON +extern char **environ; +#endif + +static double restart_time = 0.0; + +#define LENGTH_OF_SOCKADDR_UN(s) (strlen((s)->sun_path) + (size_t)(((struct sockaddr_un *)NULL)->sun_path)) + +static struct sigaction old_sigint; +static struct sigaction old_sigterm; +static struct sigaction old_sigquit; +static struct sigaction old_sigalrm; +static struct sigaction old_sigusr1; +static struct sigaction old_sigusr2; +static struct sigaction old_sighup; +static struct sigaction old_sigchld; +static struct sigaction old_sigsegv; +static struct sigaction old_sigill; +static struct sigaction old_sigfpe; +static struct sigaction old_sigbus; +static struct sigaction old_sigabrt; +static int _log_dom = -1; + +#define CRI(...) EINA_LOG_DOM_CRIT(_log_dom, __VA_ARGS__) +#define ERR(...) EINA_LOG_DOM_ERR(_log_dom, __VA_ARGS__) +#define WRN(...) EINA_LOG_DOM_WARN(_log_dom, __VA_ARGS__) +#define INF(...) EINA_LOG_DOM_INFO(_log_dom, __VA_ARGS__) +#define DBG(...) EINA_LOG_DOM_DBG(_log_dom, __VA_ARGS__) + +static void +post_fork(void *data EINA_UNUSED) +{ + sigaction(SIGINT, &old_sigint, NULL); + sigaction(SIGTERM, &old_sigterm, NULL); + sigaction(SIGQUIT, &old_sigquit, NULL); + sigaction(SIGALRM, &old_sigalrm, NULL); + sigaction(SIGUSR1, &old_sigusr1, NULL); + sigaction(SIGUSR2, &old_sigusr2, NULL); + sigaction(SIGHUP, &old_sighup, NULL); + sigaction(SIGCHLD, &old_sigchld, NULL); + sigaction(SIGSEGV, &old_sigsegv, NULL); + sigaction(SIGILL, &old_sigill, NULL); + sigaction(SIGFPE, &old_sigfpe, NULL); + sigaction(SIGBUS, &old_sigbus, NULL); + sigaction(SIGABRT, &old_sigabrt, NULL); + if ((_log_dom > -1) && (_log_dom != EINA_LOG_DOMAIN_GLOBAL)) + { + eina_log_domain_unregister(_log_dom); + _log_dom = -1; + } +} + +static void +child_handler(int x EINA_UNUSED, siginfo_t *info EINA_UNUSED, void *data EINA_UNUSED) +{ + int status; + while (waitpid(-1, &status, WNOHANG) > 0); +} + +static void +crash_handler(int x EINA_UNUSED, siginfo_t *info EINA_UNUSED, void *data EINA_UNUSED) +{ + double t; + + ERR("crash detected. restarting."); + t = ecore_time_get(); + if ((t - restart_time) <= 2.0) + { + CRI("crash too fast - less than 2 seconds. abort restart"); + exit(-1); + } + ecore_app_restart(); +} + +static void +handle_run(int fd, unsigned long bytes) +{ + unsigned char *buf = NULL; + int i; + char **argv = NULL; + char **envir = NULL; + char *cwd; + int argc, envnum; + unsigned long off; + + _elm_startup_time = ecore_time_unix_get(); + + buf = alloca(bytes); + if (read(fd, buf, bytes) != (int)bytes) + { + CRI("cannot read %i bytes of args and environment data", (int)bytes); + close(fd); + return; + } + close(fd); + + argc = ((unsigned long *)(buf))[0]; + envnum = ((unsigned long *)(buf))[1]; + + if (argc <= 0) + { + CRI("no executable specified"); + return; + } + + argv = alloca(argc * sizeof(char *)); + if (envnum > 0) envir = alloca(envnum * sizeof(char *)); + off = ((unsigned long *)(buf))[2 + argc + envnum] - sizeof(unsigned long); + cwd = (char *)(buf + off); + + for (i = 0; i < argc; i++) + { + off = ((unsigned long *)(buf))[2 + i] - sizeof(unsigned long); + argv[i] = (char *)(buf + off); + } + +#ifdef HAVE_ENVIRON + if (envir) + { +#ifdef HAVE_CLEARENV + clearenv(); +#else + environ = NULL; +#endif + for (i = 0; i < envnum; i++) + { + off = ((unsigned long *)(buf))[2 + argc + i] - sizeof(unsigned long); + envir[i] = (char *)(buf + off); + putenv(envir[i]); + } + } +#endif + elm_quicklaunch_prepare(argc, argv, cwd); + elm_quicklaunch_fork(argc, argv, cwd, post_fork, NULL); + elm_quicklaunch_cleanup(); +} + +int +main(int argc, char **argv) +{ + int sock, socket_unix_len; + struct stat st; + struct sockaddr_un socket_unix; + struct linger lin; + char buf[PATH_MAX]; + struct sigaction action; + const char *disp; + int ret = 0; + + if (!eina_init()) + { + fprintf(stderr, "ERROR: failed to init eina."); + exit(-1); + } + _log_dom = eina_log_domain_register + ("elementary_quicklaunch", EINA_COLOR_CYAN); + if (_log_dom < 0) + { + EINA_LOG_ERR("could not register elementary_quicklaunch log domain."); + _log_dom = EINA_LOG_DOMAIN_GLOBAL; + } + + if (!(disp = getenv("DISPLAY"))) disp = "unknown"; + snprintf(buf, sizeof(buf), "/tmp/elm-ql-%i", getuid()); + if (stat(buf, &st) < 0) + { + ret = mkdir(buf, S_IRUSR | S_IWUSR | S_IXUSR); + if (ret < 0) + { + CRI("cannot create directory '%s'", buf); + exit(-1); + } + } + snprintf(buf, sizeof(buf), "/tmp/elm-ql-%i/%s", getuid(), disp); + unlink(buf); + sock = socket(AF_UNIX, SOCK_STREAM, 0); + if (sock < 0) + { + CRI("cannot create socket for socket for '%s': %s", + buf, strerror(errno)); + exit(-1); + } + if (fcntl(sock, F_SETFD, FD_CLOEXEC) < 0) + { + CRI("cannot set close on exec socket for '%s' (fd=%d): %s", + buf, sock, strerror(errno)); + exit(-1); + } + lin.l_onoff = 1; + lin.l_linger = 0; + if (setsockopt(sock, SOL_SOCKET, SO_LINGER, &lin, sizeof(struct linger)) < 0) + { + CRI("cannot set linger for socket for '%s' (fd=%d): %s", + buf, sock, strerror(errno)); + exit(-1); + } + socket_unix.sun_family = AF_UNIX; + strncpy(socket_unix.sun_path, buf, sizeof(socket_unix.sun_path)); + socket_unix_len = LENGTH_OF_SOCKADDR_UN(&socket_unix); + if (bind(sock, (struct sockaddr *)&socket_unix, socket_unix_len) < 0) + { + CRI("cannot bind socket for '%s' (fd=%d): %s", + buf, sock, strerror(errno)); + exit(-1); + } + if (listen(sock, 4096) < 0) + { + CRI("listen(sock=%d, 4096): %s", sock, strerror(errno)); + exit(-1); + } + elm_quicklaunch_mode_set(EINA_TRUE); + elm_quicklaunch_init(argc, argv); + restart_time = ecore_time_get(); + + memset(&action, 0, sizeof(struct sigaction)); + action.sa_handler = SIG_DFL; + action.sa_sigaction = NULL; + action.sa_flags = SA_RESTART | SA_SIGINFO; + sigemptyset(&action.sa_mask); + sigaction(SIGINT, &action, &old_sigint); + + action.sa_handler = SIG_DFL; + action.sa_sigaction = NULL; + action.sa_flags = SA_RESTART | SA_SIGINFO; + sigemptyset(&action.sa_mask); + sigaction(SIGTERM, &action, &old_sigterm); + + action.sa_handler = SIG_DFL; + action.sa_sigaction = NULL; + action.sa_flags = SA_RESTART | SA_SIGINFO; + sigemptyset(&action.sa_mask); + sigaction(SIGQUIT, &action, &old_sigquit); + + action.sa_handler = SIG_DFL; + action.sa_sigaction = NULL; + action.sa_flags = SA_RESTART | SA_SIGINFO; + sigemptyset(&action.sa_mask); + sigaction(SIGALRM, &action, &old_sigalrm); + + action.sa_handler = SIG_DFL; + action.sa_sigaction = NULL; + action.sa_flags = SA_RESTART | SA_SIGINFO; + sigemptyset(&action.sa_mask); + sigaction(SIGUSR1, &action, &old_sigusr1); + + action.sa_handler = SIG_DFL; + action.sa_sigaction = NULL; + action.sa_flags = SA_RESTART | SA_SIGINFO; + sigemptyset(&action.sa_mask); + sigaction(SIGUSR2, &action, &old_sigusr2); + + action.sa_handler = SIG_DFL; + action.sa_sigaction = NULL; + action.sa_flags = SA_RESTART | SA_SIGINFO; + sigemptyset(&action.sa_mask); + sigaction(SIGHUP, &action, &old_sighup); + + action.sa_handler = NULL; + action.sa_sigaction = child_handler; + action.sa_flags = SA_RESTART | SA_SIGINFO; + sigemptyset(&action.sa_mask); + sigaction(SIGCHLD, &action, &old_sigchld); + + action.sa_handler = NULL; + action.sa_sigaction = crash_handler; + action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO; + sigemptyset(&action.sa_mask); + sigaction(SIGSEGV, &action, &old_sigsegv); + + action.sa_handler = NULL; + action.sa_sigaction = crash_handler; + action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO; + sigemptyset(&action.sa_mask); + sigaction(SIGILL, &action, &old_sigill); + + action.sa_handler = NULL; + action.sa_sigaction = crash_handler; + action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO; + sigemptyset(&action.sa_mask); + sigaction(SIGFPE, &action, &old_sigfpe); + + action.sa_handler = NULL; + action.sa_sigaction = crash_handler; + action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO; + sigemptyset(&action.sa_mask); + sigaction(SIGBUS, &action, &old_sigbus); + + action.sa_handler = NULL; + action.sa_sigaction = crash_handler; + action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO; + sigemptyset(&action.sa_mask); + sigaction(SIGABRT, &action, &old_sigabrt); + + for (;;) + { + int fd; + struct sockaddr_un client; + socklen_t len; + + len = sizeof(struct sockaddr_un); + fd = accept(sock, (struct sockaddr *)&client, &len); + elm_quicklaunch_sub_init(argc, argv); + // don't seed since we are doing this AFTER launch request + // elm_quicklaunch_seed(); + if (fd >= 0) + { + unsigned long bytes; + int num; + + num = read(fd, &bytes, sizeof(unsigned long)); + if (num == sizeof(unsigned long)) + handle_run(fd, bytes); + } + while (elm_quicklaunch_sub_shutdown() > 0); + } + elm_quicklaunch_shutdown(); + + if ((_log_dom > -1) && (_log_dom != EINA_LOG_DOMAIN_GLOBAL)) + { + eina_log_domain_unregister(_log_dom); + _log_dom = -1; + } + eina_shutdown(); + + return 0; +} diff --git a/src/bin/elementary/run.c b/src/bin/elementary/run.c new file mode 100644 index 0000000000..a3ad3a4cab --- /dev/null +++ b/src/bin/elementary/run.c @@ -0,0 +1,213 @@ +#include "elementary_config.h" +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <string.h> +#include <limits.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/un.h> +#ifdef HAVE_ENVIRON +# define _GNU_SOURCE 1 +#endif +#include <unistd.h> +#include <sys/stat.h> +#include <fcntl.h> +#ifdef HAVE_ALLOCA_H +# include <alloca.h> +#endif + +#ifdef HAVE_ENVIRON +extern char **environ; +#endif + +#define LENGTH_OF_SOCKADDR_UN(s) (strlen((s)->sun_path) + (size_t)(((struct sockaddr_un *)NULL)->sun_path)) + +int +main(int argc, char **argv) +{ + int sock, socket_unix_len, i, n; + struct sockaddr_un socket_unix; + char buf[PATH_MAX]; + struct stat st; + char *exe; + int we_are_elementary_run = 0; + char *disp; + char *cwd; + + int sargc, slen, envnum; + unsigned char *sbuf = NULL, *pos; + char **sargv = NULL; + + if (!getcwd(buf, sizeof(buf) - 1)) + { + fprintf(stderr, "elementary_quicklaunch: currect working dir too big.\n"); + exit(-1); + } + cwd = strdup(buf); + if (!(disp = getenv("DISPLAY"))) disp = "unknown"; + snprintf(buf, sizeof(buf), "/tmp/elm-ql-%i/%s", getuid(), disp); + if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) + { + perror("elementary_quicklaunch: socket(AF_UNIX, SOCK_STREAM, 0)"); + exit(-1); + } + socket_unix.sun_family = AF_UNIX; + strncpy(socket_unix.sun_path, buf, sizeof(socket_unix.sun_path)); + socket_unix.sun_path[(int)(sizeof(socket_unix.sun_path)/sizeof(socket_unix.sun_path[0])) - 1] = '\0'; + socket_unix_len = LENGTH_OF_SOCKADDR_UN(&socket_unix); + if (connect(sock, (struct sockaddr *)&socket_unix, socket_unix_len) < 0) + { + perror("elementary_quicklaunch: connect(sock, (struct sockaddr *)&socket_unix, socket_unix_len)"); + printf("elementary_quicklaunch: cannot connect to socket '%s'\n", buf); + exit(1); + } + exe = argv[0]; + if (!(((exe[0] == '/')) || + ((exe[0] == '.') && (exe[1] == '/')) || + ((exe[0] == '.') && (exe[1] == '.') && (exe[2] == '/')))) + { + char *path = getenv("PATH"); + int exelen = strlen(argv[0]); + if (path) + { + const char *p, *pp; + + p = path; + pp = p; + exe = NULL; + for (;;) + { + if ((*p == ':') || (!*p)) + { + unsigned int len; + + len = p - pp; + if (len < (sizeof(buf) - exelen - 3)) + { + strncpy(buf, pp, len); + strcpy(buf + len, "/"); + strcpy(buf + len + 1, argv[0]); + if (!access(buf, R_OK | X_OK)) + { + exe = buf; + break; + } + if (!*p) break; + p++; + pp = p; + } + } + else + { + if (!*p) break; + p++; + } + } + } + } + if (exe) + { + if (!lstat(exe, &st)) + { + if (S_ISLNK(st.st_mode)) + { + char buf2[PATH_MAX]; + + ssize_t len = readlink(exe, buf2, sizeof(buf2) - 1); + if (len >= 0) + { + char *p; + buf2[len] = 0; + p = strrchr(buf2, '/'); + if (p) p++; + else p = buf2; + if (!strncasecmp(p, "elementary_run", 14)) + we_are_elementary_run = 1; + } + } + } + } + if (we_are_elementary_run) + { + sargc = argc; + sargv = argv; + } + else + { + sargc = argc - 1; + sargv = &(argv[1]); + } + + slen = 0; + envnum = 0; + + // header: + // UL 'total bytes' + // UL 'argnum' + // UL 'envnum' + slen += sizeof(unsigned long) * 3; + + for (i = 0; i < sargc; i++) + { + slen += sizeof(unsigned long); + slen += strlen(sargv[i]) + 1; + } + +#ifdef HAVE_ENVIRON + // count how much space is needed for environment + for (i = 0; environ[i]; i++) + { + slen += sizeof(unsigned long); + slen += strlen(environ[i]) + 1; + envnum++; + } +#endif + + // how much space is needed for cwd + slen += sizeof(unsigned long); + slen += strlen(cwd) + 1; + + // allocate buffer on stack + sbuf = alloca(slen); + + // fill in header + ((unsigned long *)(sbuf))[0] = slen - sizeof(unsigned long); + ((unsigned long *)(sbuf))[1] = sargc; + ((unsigned long *)(sbuf))[2] = envnum; + // pos pointer after header + pos = (unsigned char *)(&((((unsigned long *)(sbuf))[3 + sargc + envnum + 1]))); + n = 3; + + // fill in args + for (i = 0; i < sargc; i++) + { + ((unsigned long *)(sbuf))[n] = (unsigned long)pos - (unsigned long)sbuf; + strcpy((char *)pos, sargv[i]); + pos += strlen(sargv[i]) + 1; + n++; + } + +#ifdef HAVE_ENVIRON + // fill in environ + for (i = 0; environ[i]; i++) + { + ((unsigned long *)(sbuf))[n] = (unsigned long)pos - (unsigned long)sbuf; + strcpy((char *)pos, environ[i]); + pos += strlen(environ[i]) + 1; + n++; + } +#endif + + // fill in cwd + ((unsigned long *)(sbuf))[n] = (unsigned long)pos - (unsigned long)sbuf; + n++; + strcpy((char *)pos, cwd); + + if (write(sock, sbuf, slen) < 0) + printf("elementary_quicklaunch: cannot write to socket '%s'\n", buf); + close(sock); + + free(cwd); + return 0; +} diff --git a/src/bin/elementary/test.c b/src/bin/elementary/test.c new file mode 100644 index 0000000000..3bad1c6d2c --- /dev/null +++ b/src/bin/elementary/test.c @@ -0,0 +1,1030 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif + +#include <string.h> +#include <Elementary.h> +#include "test.h" +#include "test_explode.h" + +int _log_domain = -1; + +/* all tests prototypes */ +void test_access(void *data, Evas_Object *obj, void *event_info); +void test_access2(void *data, Evas_Object *obj, void *event_info); +void test_access3(void *data, Evas_Object *obj, void *event_info); +void test_bg_plain(void *data, Evas_Object *obj, void *event_info); +void test_bg_image(void *data, Evas_Object *obj, void *event_info); +void test_bg_options(void *data, Evas_Object *obj, void *event_info); +void test_icon(void *data, Evas_Object *obj, void *event_info); +void test_icon_transparent(void *data, Evas_Object *obj, void *event_info); +void test_icon_standard(void *data, Evas_Object *obj, void *event_info); +void test_box_vert(void *data, Evas_Object *obj, void *event_info); +void test_box_vert2(void *data, Evas_Object *obj, void *event_info); +void test_box_pack(void *data, Evas_Object *obj, void *event_info); +void test_box_horiz(void *data, Evas_Object *obj, void *event_info); +void test_box_homo(void *data, Evas_Object *obj, void *event_info); +void test_box_transition(void *data, Evas_Object *obj, void *event_info); +void test_box_align(void *data, Evas_Object *obj, void *event_info); +void test_button(void *data, Evas_Object *obj, void *event_info); +void test_cnp(void *data, Evas_Object *obj, void *event_info); +void test_transit(void *data, Evas_Object *obj, void *event_info); +void test_transit_blend(void *data, Evas_Object *obj, void *event_info); +void test_transit_chain(void *data, Evas_Object *obj, void *event_info); +void test_transit_custom(void *data, Evas_Object *obj, void *event_info); +void test_transit_fade(void *data, Evas_Object *obj, void *event_info); +void test_transit_flip(void *data, Evas_Object *obj, void *event_info); +void test_transit_resizable_flip(void *data, Evas_Object *obj, void *event_info); +void test_transit_resizing(void *data, Evas_Object *obj, void *event_info); +void test_transit_zoom(void *data, Evas_Object *obj, void *event_info); +void test_transit_tween(void *data, Evas_Object *obj, void *event_info); +void test_transit_bezier(void *data, Evas_Object *obj, void *event_info); +void test_fileselector_button(void *data, Evas_Object *obj, void *event_info); +void test_fileselector_entry(void *data, Evas_Object *obj, void *event_info); +void test_clock(void *data, Evas_Object *obj, void *event_info); +void test_clock_edit(void *data, Evas_Object *obj, void *event_info); +void test_clock_edit2(void *data, Evas_Object *obj, void *event_info); +void test_clock_pause(void *data, Evas_Object *obj, void *event_info); +void test_combobox(void *data, Evas_Object *obj, void *event_info); +void test_combobox2(void *data, Evas_Object *obj, void *event_info); +void test_check(void *data, Evas_Object *obj, void *event_info); +void test_check_toggle(void *data, Evas_Object *obj, void *event_info); +void test_radio(void *data, Evas_Object *obj, void *event_info); +void test_layout(void *data, Evas_Object *obj, void *event_info); +void test_layout2(void *data, Evas_Object *obj, void *event_info); +void test_hover(void *data, Evas_Object *obj, void *event_info); +void test_hover2(void *data, Evas_Object *obj, void *event_info); +void test_hover3(void *data, Evas_Object *obj, void *event_info); +void test_entry(void *data, Evas_Object *obj, void *event_info); +void test_entry_style_user(void *data, Evas_Object *obj, void *event_info); +void test_entry_style_default(void *data, Evas_Object *obj, void *event_info); +void test_entry_scrolled(void *data, Evas_Object *obj, void *event_info); +void test_entry3(void *data, Evas_Object *obj, void *event_info); +void test_entry4(void *data, Evas_Object *obj, void *event_info); +void test_entry5(void *data, Evas_Object *obj, void *event_info); +void test_entry6(void *data, Evas_Object *obj, void *event_info); +void test_entry7(void *data, Evas_Object *obj, void *event_info); +void test_entry8(void *data, Evas_Object *obj, void *event_info); +void test_entry_regex(void *data, Evas_Object *obj, void *event_info); +void test_entry_notepad(void *data, Evas_Object *obj, void *event_info); +void test_multibuttonentry(void *data, Evas_Object *obj, void *event_info); +void test_entry_anchor2(void *data, Evas_Object *obj, void *event_info); +void test_entry_anchor(void *data, Evas_Object *obj, void *event_info); +void test_entry_emoticon(void *data, Evas_Object *obj, void *event_info); +void test_toolbar(void *data, Evas_Object *obj, void *event_info); +void test_toolbar2(void *data, Evas_Object *obj, void *event_info); +void test_toolbar3(void *data, Evas_Object *obj, void *event_info); +void test_toolbar4(void *data, Evas_Object *obj, void *event_info); +void test_toolbar5(void *data, Evas_Object *obj, void *event_info); +void test_toolbar6(void *data, Evas_Object *obj, void *event_info); +void test_toolbar7(void *data, Evas_Object *obj, void *event_info); +void test_toolbar8(void *data, Evas_Object *obj, void *event_info); +void test_toolbar_vertical(void *data, Evas_Object *obj, void *event_info); +void test_toolbar_focus(void *data, Evas_Object *obj, void *event_info); +void test_hoversel(void *data, Evas_Object *obj, void *event_info); +void test_hoversel_focus(void *data, Evas_Object *obj, void *event_info); +void test_list(void *data, Evas_Object *obj, void *event_info); +void test_list_horizontal(void *data, Evas_Object *obj, void *event_info); +void test_list2(void *data, Evas_Object *obj, void *event_info); +void test_list3(void *data, Evas_Object *obj, void *event_info); +void test_list4(void *data, Evas_Object *obj, void *event_info); +void test_list5(void *data, Evas_Object *obj, void *event_info); +void test_list6(void *data, Evas_Object *obj, void *event_info); +void test_list7(void *data, Evas_Object *obj, void *event_info); +void test_list_focus(void *data, Evas_Object *obj, void *event_info); +void test_list_horiz_focus(void *data, Evas_Object *obj, void *event_info); +void test_list_separator(void *data, Evas_Object *obj, void *event_info); +void test_list_multi_select(void *data, Evas_Object *obj, void *event_info); +void test_inwin(void *data, Evas_Object *obj, void *event_info); +void test_inwin2(void *data, Evas_Object *obj, void *event_info); +void test_scaling(void *data, Evas_Object *obj, void *event_info); +void test_scaling2(void *data, Evas_Object *obj, void *event_info); +void test_slider(void *data, Evas_Object *obj, void *event_info); +void test_actionslider(void *data, Evas_Object *obj, void *event_info); +void test_genlist(void *data, Evas_Object *obj, void *event_info); +void test_genlist2(void *data, Evas_Object *obj, void *event_info); +void test_genlist3(void *data, Evas_Object *obj, void *event_info); +void test_genlist4(void *data, Evas_Object *obj, void *event_info); +void test_genlist5(void *data, Evas_Object *obj, void *event_info); +void test_genlist6(void *data, Evas_Object *obj, void *event_info); +void test_genlist7(void *data, Evas_Object *obj, void *event_info); +void test_genlist8(void *data, Evas_Object *obj, void *event_info); +void test_genlist9(void *data, Evas_Object *obj, void *event_info); +void test_genlist10(void *data, Evas_Object *obj, void *event_info); +void test_genlist_reorder(void *data, Evas_Object *obj, void *event_info); +void test_genlist12(void *data, Evas_Object *obj, void *event_info); +void test_genlist13(void *data, Evas_Object *obj, void *event_info); +void test_genlist14(void *data, Evas_Object *obj, void *event_info); +void test_genlist15(void *data, Evas_Object *obj, void *event_info); +void test_genlist16(void *data, Evas_Object *obj, void *event_info); +void test_genlist17(void *data, Evas_Object *obj, void *event_info); +void test_genlist18(void *data, Evas_Object *obj, void *event_info); +void test_genlist19(void *data, Evas_Object *obj, void *event_info); +void test_genlist20(void *data, Evas_Object *obj, void *event_info); +void test_genlist_focus(void *data, Evas_Object *obj, void *event_info); +void test_genlist_item_styles(void *data, Evas_Object *obj, void *event_info); +void test_genlist_multi_select(void *data, Evas_Object *obj, void *event_info); +void test_genlist_del(void *data, Evas_Object *obj, void *event_info); +void test_genlist_filter(void *data, Evas_Object *obj, void *event_info); +void test_genlist_show_bring(void *data, Evas_Object *obj, void *event_info); +void test_gesture_layer(void *data, Evas_Object *obj, void *event_info); +void test_gesture_layer2(void *data, Evas_Object *obj, void *event_info); +void test_gesture_layer3(void *data, Evas_Object *obj, void *event_info); +void test_table(void *data, Evas_Object *obj, void *event_info); +void test_table2(void *data, Evas_Object *obj, void *event_info); +void test_table3(void *data, Evas_Object *obj, void *event_info); +void test_table4(void *data, Evas_Object *obj, void *event_info); +void test_table5(void *data, Evas_Object *obj, void *event_info); +void test_table6(void *data, Evas_Object *obj, void *event_info); +void test_table7(void *data, Evas_Object *obj, void *event_info); +void test_table8(void *data, Evas_Object *obj, void *event_info); +void test_gengrid(void *data, Evas_Object *obj, void *event_info); +void test_gengrid2(void *data, Evas_Object *obj, void *event_info); +void test_gengrid3(void *data, Evas_Object *obj, void *event_info); +void test_gengrid4(void *data, Evas_Object *obj, void *event_info); +void test_gengrid5(void *data, Evas_Object *obj, void *event_info); +void test_gengrid_item_styles(void *data, Evas_Object *obj, void *event_info); +void test_gengrid_speed(void *data, Evas_Object *obj, void *event_info); +void test_gengrid_focus(void *data, Evas_Object *obj, void *event_info); +void test_gengrid_update(void *data, Evas_Object *obj, void *event_info); +void test_win_state(void *data, Evas_Object *obj, void *event_info); +void test_win_state2(void *data, Evas_Object *obj, void *event_info); +void test_progressbar(void *data, Evas_Object *obj, void *event_info); +void test_progressbar2(void *data, Evas_Object *obj, void *event_info); +void test_fileselector(void *data, Evas_Object *obj, void *event_info); +void test_separator(void *data, Evas_Object *obj, void *event_info); +void test_scroller(void *data, Evas_Object *obj, void *event_info); +void test_scroller2(void *data, Evas_Object *obj, void *event_info); +void test_scroller3(void *data, Evas_Object *obj, void *event_info); +void test_scroller4(void *data, Evas_Object *obj, void *event_info); +void test_spinner(void *data, Evas_Object *obj, void *event_info); +void test_index(void *data, Evas_Object *obj, void *event_info); +void test_index2(void *data, Evas_Object *obj, void *event_info); +void test_index3(void *data, Evas_Object *obj, void *event_info); +void test_index_horizontal(void *data, Evas_Object *obj, void *event_info); +void test_photocam(void *data, Evas_Object *obj, void *event_info); +void test_photocam_remote(void *data, Evas_Object *obj, void *event_info); +void test_photo(void *data, Evas_Object *obj, void *event_info); +void test_prefs(void *data, Evas_Object *obj, void *event_info); +void test_thumb(void *data, Evas_Object *obj, void *event_info); +void test_icon_desktops(void *data, Evas_Object *obj, void *event_info); +void test_icon_animated(void *data, Evas_Object *obj, void *event_info); +void test_notify(void *data, Evas_Object *obj, void *event_info); +void test_slideshow(void *data, Evas_Object *obj, void *event_info); +void test_menu(void *data, Evas_Object *obj, void *event_info); +void test_menu2(void *data, Evas_Object *obj, void *event_info); +void test_panel(void *data, Evas_Object *obj, void *event_info); +void test_panel2(void *data, Evas_Object *obj, void *event_info); +void test_panes(void *data, Evas_Object *obj, void *event_info); +void test_calendar(void *data, Evas_Object *obj, void *event_info); +void test_calendar2(void *data, Evas_Object *obj, void *event_info); +void test_calendar3(void *data, Evas_Object *obj, void *event_info); +void test_map(void *data, Evas_Object *obj, void *event_info); +void test_weather(void *data, Evas_Object *obj, void *event_info); +void test_flip(void *data, Evas_Object *obj, void *event_info); +void test_flip2(void *data, Evas_Object *obj, void *event_info); +void test_flip3(void *data, Evas_Object *obj, void *event_info); +void test_flip_interactive(void *data, Evas_Object *obj, void *event_info); +void test_flip_to(void *data, Evas_Object *obj, void *event_info); +void test_flip_page(void *data, Evas_Object *obj, void *event_info); +void test_label(void *data, Evas_Object *obj, void *event_info); +void test_label_slide(void *data, Evas_Object *obj, void *event_info); +void test_label_wrap(void *data, Evas_Object *obj, void *event_info); +void test_label_ellipsis(void *data, Evas_Object *obj, void *event_info); +void test_conformant(void *data, Evas_Object *obj, void *event_info); +void test_conformant2(void *data, Evas_Object *obj, void *event_info); +void test_conformant_indicator(void *data, Evas_Object *obj, void *event_info); +void test_main_menu(void *data, Evas_Object *obj, void *event_info); +void test_multi(void *data, Evas_Object *obj, void *event_info); +void test_floating(void *data, Evas_Object *obj, void *event_info); +void test_launcher(void *data, Evas_Object *obj, void *event_info); +void test_launcher2(void *data, Evas_Object *obj, void *event_info); +void test_launcher3(void *data, Evas_Object *obj, void *event_info); +void test_anim(void *data, Evas_Object *obj, void *event_info); +void test_tooltip(void *data, Evas_Object *obj, void *event_info); +void test_tooltip2(void *data, Evas_Object *obj, void *event_info); +void test_tooltip3(void *data, Evas_Object *obj, void *event_info); +void test_cursor(void *data, Evas_Object *obj, void *event_info); +void test_cursor2(void *data, Evas_Object *obj, void *event_info); +void test_cursor3(void *data, Evas_Object *obj, void *event_info); +void test_cursor4(void *data, Evas_Object *obj, void *event_info); +void test_focus(void *data, Evas_Object *obj, void *event_info); +void test_focus2(void *data, Evas_Object *obj, void *event_info); +void test_focus_hide_del(void *data, Evas_Object *obj, void *event_info); +void test_focus_custom_chain(void *data, Evas_Object *obj, void *event_info); +void test_focus_style(void *data, Evas_Object *obj, void *event_info); +void test_focus_part(void *data, Evas_Object *obj, void *event_info); +void test_focus3(void *data, Evas_Object *obj, void *event_info); +void test_focus_object_style(void *data, Evas_Object *obj, void *event_info); +void test_focus_object_policy(void *data, Evas_Object *obj, void *event_info); +void test_flipselector(void *data, Evas_Object *obj, void *event_info); +void test_diskselector(void *data, Evas_Object *obj, void *event_info); +void test_colorselector(void *data, Evas_Object *obj, void *event_info); +void test_ctxpopup(void *data, Evas_Object *obj, void *event_info); +void test_bubble(void *data, Evas_Object *obj, void *event_info); +void test_segment_control(void *data, Evas_Object *obj, void *event_info); +void test_store(void *data, Evas_Object *obj, void *event_info); +void test_sys_notify(void *data, Evas_Object *obj, void *event_info); +void test_systray(void *data, Evas_Object *obj, void *event_info); +void test_win_inline(void *data, Evas_Object *obj, void *event_info); +void test_win_keygrab(void *data, Evas_Object *obj, void *event_info); +void test_win_socket(void *data, Evas_Object *obj, void *event_info); +void test_win_plug(void *data, Evas_Object *obj, void *event_info); +void test_win_wm_rotation(void *data, Evas_Object *obj, void *event_info); +void test_grid(void *data, Evas_Object *obj, void *event_info); +void test_glview_simple(void *data, Evas_Object *obj, void *event_info); +void test_glview(void *data, Evas_Object *obj, void *event_info); +void test_glview_manygears(void *data, Evas_Object *obj, void *event_info); +void test_3d(void *data, Evas_Object *obj, void *event_info); +void test_naviframe(void *data, Evas_Object *obj, void *event_info); +void test_naviframe2(void *data, Evas_Object *obj, void *event_info); +void test_naviframe3(void *data, Evas_Object *obj, void *event_info); +void test_naviframe_complex(void *data, Evas_Object *obj, void *event_info); +//void test_factory(void *data, Evas_Object *obj, void *event_info); +void test_datetime(void *data, Evas_Object *obj, void *event_info); +void test_popup(void *data, Evas_Object *obj, void *event_info); +void test_dayselector(void *data, Evas_Object *obj, void *event_info); +void test_image(void *data, Evas_Object *obj, void *event_info); +void test_remote_image(void *data, Evas_Object *obj, void *event_info); +void test_click_image(void *data, Evas_Object *obj, void *event_info); +void test_external_button(void *data, Evas_Object *obj, void *event_info); +void test_external_slider(void *data, Evas_Object *obj, void *event_info); +void test_external_scroller(void *data, Evas_Object *obj, void *event_info); +void test_external_pbar(void *data, Evas_Object *obj, void *event_info); +void test_external_video(void *data, Evas_Object *obj, void *event_info); +void test_config(void *data, Evas_Object *obj, void *event_info); +void test_video(void *data, Evas_Object *obj, void *event_info); +void test_eio(void *data, Evas_Object *obj, void *event_info); +#ifdef HAVE_ELEMENTARY_WEB +void test_web(void *data, Evas_Object *obj, void *event_info); +void test_web_ui(void *data, Evas_Object *obj, void *event_info); +#endif +void test_dnd_genlist_default_anim(void *data, Evas_Object *obj, void *event_info); +void test_dnd_genlist_user_anim(void *data, Evas_Object *obj, void *event_info); +void test_dnd_genlist_gengrid(void *data, Evas_Object *obj, void *event_info); +void test_dnd_multi_features(void *data, Evas_Object *obj, void *event_info); +void test_dnd_types(void *data, Evas_Object *obj, void *event_info); +void test_task_switcher(void *data, Evas_Object *obj, void *event_info); +void test_application_server_message(void *data, Evas_Object *obj, void *event_info); +void test_application_server_phone(void *data, Evas_Object *obj, void *event_info); +void test_win_dialog(void *data, Evas_Object *obj, void *event_info); +void test_box_disable(void *data, Evas_Object *obj, void *event_info); +void test_layout_disable(void *data, Evas_Object *obj, void *event_info); + +void test_colorclass(void *data, Evas_Object *obj, void *event_info); + +Evas_Object *win, *tbx; // TODO: refactoring +void *tt; +Eina_List *tests; + +struct elm_test +{ + const char *icon; + const char *category; + const char *name; + void (*cb)(void *, Evas_Object *, void *); +}; + +static int +_elm_test_sort(const void *pa, const void *pb) +{ + const struct elm_test *a = pa, *b = pb; + int res = strcasecmp(a->category, b->category); + if (res) return res; + return strcasecmp(a->name, b->name); +} + +static void +_elm_test_add(Eina_List **p_list, const char *icon, const char *category, const char *name, void (*cb)(void *, Evas_Object *, void *)) +{ + struct elm_test *t = malloc(sizeof(struct elm_test)); + t->icon = icon; + t->category = category; + t->name = name; + t->cb = cb; + *p_list = eina_list_sorted_insert(*p_list, _elm_test_sort, t); +} + +void +my_win_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_exit(); /* exit the program's main loop that runs in elm_run() */ +} + +static void +_ui_tg_changed(void *data, Evas_Object *obj, void *event_info) +{ + (void) data; (void) event_info; + elm_config_mirrored_set(elm_check_state_get(obj)); +} + +static void +_frame_clicked(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + printf("frame %p is: %s\n", obj, elm_frame_collapse_get(obj) ? "collapsed" : "expanded"); +} + +static void +_menu_create(const char *option_str) +{ + struct elm_test *t = NULL; + const char *pcat = NULL; + Evas_Object *cfr = NULL, *tbx2 = NULL, *bt = NULL, *ic = NULL; + char buf[PATH_MAX]; + Eina_List *l; + + elm_box_clear(tbx); + EINA_LIST_FOREACH(tests, l, t) + { + if (option_str && !strcasestr(t->name, option_str)) continue; + if ((!pcat) || (strcmp(pcat, t->category))) + { + cfr = elm_frame_add(win); + // FIXME: add new style of frame for this + evas_object_smart_callback_add(cfr, "clicked", _frame_clicked, NULL); + elm_frame_autocollapse_set(cfr, EINA_TRUE); + elm_object_text_set(cfr, t->category); + evas_object_size_hint_weight_set(cfr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(cfr, EVAS_HINT_FILL, 0.0); + elm_box_pack_end(tbx, cfr); + evas_object_show(cfr); + + tbx2 = elm_box_add(win); + elm_box_layout_set(tbx2, evas_object_box_layout_flow_horizontal, NULL, NULL); + evas_object_size_hint_weight_set(tbx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(tbx2, EVAS_HINT_FILL, 0.0); + elm_box_align_set(tbx2, 0.0, 0.5); + elm_object_content_set(cfr, tbx2); + evas_object_show(tbx2); + } + bt = elm_button_add(win); + // FIXME: add new style of button for this like efm in e17 + elm_object_text_set(bt, t->name); + if (t->icon) + { + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), t->icon); + elm_image_file_set(ic, buf, NULL); + elm_object_part_content_set(bt, "icon", ic); + evas_object_show(ic); + } + elm_box_pack_end(tbx2, bt); + evas_object_show(bt); + evas_object_smart_callback_add(bt, "clicked", t->cb, win); + pcat = t->category; + if (t == tt) tt = cfr; + } +} + +static void +_entry_changed_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + const char *str = elm_entry_entry_get(obj); + if (!str) return; + _menu_create(str); +} + +static char * +_space_removed_string_get(const char *name) +{ + int i = 0, j = 0, len; + char *ret; + + len = strlen(name); + ret = calloc(len + 1, sizeof(char)); + + while (name[i]) + { + if (name[i] != ' ') + { + ret[j] = name[i]; + j++; + } + i++; + } + + return ret; +} + +static void +my_win_main(const char *autorun, Eina_Bool test_win_only) +{ + Evas_Object *bg = NULL, *bx0 = NULL, *bx1 = NULL, *lb = NULL; + Evas_Object *fr = NULL, *tg = NULL, *sc = NULL, *en = NULL; + Eina_List *l = NULL; + struct elm_test *t = NULL; + + if (test_win_only) goto add_tests; + /* Create an elm window - It returns an evas object. This is a little + * special as the object lives in the canvas that is inside the window + * so what is returned is really inside the window, but as you manipulate + * the evas object returned - the window will respond. elm_win makes sure + * of that so you can blindly treat it like any other evas object + * pretty much, just as long as you know it has special significance. + * The first parameter is a "parent" window - eg for a dialog you want to + * have a main window it is related to, here it is NULL meaning there + * is no parent. "main" is the name of the window - used by the window + * manager for identifying the window uniquely amongst all the windows + * within this application (and all instances of the application). The + * type is a basic window (the final parameter). + * You can call elm_win_util_standard_add() instead. This is a convenient API + * for window and bg creation. You don't need to create bg object manually. + * You can also set the title of the window at the same time. + * ex) win = elm_win_util_standard_add("main", "Elementary Tests"); */ + win = elm_win_add(NULL, "main", ELM_WIN_BASIC); + if (!win) exit(1); + + explode_win_enable(win); + /* Set the title of the window - This is in the titlebar. */ + elm_win_title_set(win, "Elementary Tests"); + + /* Set a callback on the window when "delete,request" is emitted as + * a callback. When this happens my_win_del() is called and the + * data pointer (first param) is passed the final param here (in this + * case it is NULL). This is how you can pass specific things to a + * callback like objects or data layered on top. */ + evas_object_smart_callback_add(win, "delete,request", my_win_del, NULL); + + /* Add a background to our window. This just uses the standard theme set + * background. Without a background, you could make a window seem + * transparent with elm_win_alpha_set(win, EINA_TRUE); For example. if you + * have a compositor running this will make the window able to be + * semi-transparent and any space not filled by object/widget pixels will + * be transparent or translucent based on alpha. If you do not have a + * compositor running this should fall back to using shaped windows + * (which have a mask). Both these features will be slow and rely on + * a lot more resources, so only use it if you need it. */ + bg = elm_bg_add(win); + /* Set weight to 1.0 x 1.0 == expand in both x and y direction. */ + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + /* Tell the window that this object is to be resized along with the window. + * Also as a result this object will be one of several objects that + * controls the minimum/maximum size of the window. */ + elm_win_resize_object_add(win, bg); + /* And show the background. */ + evas_object_show(bg); + + /* Add a box layout widget to the window. */ + bx0 = elm_box_add(win); + /* Allow base box (bx0) to expand in x and y. */ + evas_object_size_hint_weight_set(bx0, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + /* Tell the window that the box affects window size and also will be + * resized when the window is resized. */ + elm_win_resize_object_add(win, bx0); + evas_object_show(bx0); + + fr = elm_frame_add(win); + evas_object_smart_callback_add(fr, "clicked", _frame_clicked, NULL); + elm_frame_autocollapse_set(fr, EINA_TRUE); + elm_object_text_set(fr, "Information"); + elm_box_pack_end(bx0, fr); + evas_object_show(fr); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "Please select a test from the list below by clicking<br/>" + "the test button to show the test window."); + elm_object_content_set(fr, lb); + evas_object_show(lb); + + /* This label will not be read out */ + elm_access_object_unregister(lb); + + tg = elm_check_add(win); + elm_object_style_set(tg, "toggle"); + elm_object_text_set(tg, "UI-Mirroring:"); + elm_check_state_set(tg, elm_config_mirrored_get()); + evas_object_smart_callback_add(tg, "changed", _ui_tg_changed, NULL); + elm_box_pack_end(bx0, tg); + evas_object_show(tg); + + bx1 = elm_box_add(win); + elm_box_horizontal_set(bx1, EINA_TRUE); + evas_object_size_hint_weight_set(bx1, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx1, EVAS_HINT_FILL, 0.0); + elm_box_pack_end(bx0, bx1); + evas_object_show(bx1); + + lb = elm_label_add(win); + elm_object_text_set(lb, " Search Menu :"); + evas_object_size_hint_weight_set(lb, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(lb, 0.0, EVAS_HINT_FILL); + elm_box_pack_end(bx1, lb); + evas_object_show(lb); + + en = elm_entry_add(win); + elm_entry_single_line_set(en, EINA_TRUE); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_object_part_text_set(en, "guide", "Type widget name here to search."); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(en, "changed,user", _entry_changed_cb, NULL); + elm_box_pack_end(bx1, en); + evas_object_show(en); + elm_object_focus_set(en, EINA_TRUE); + + sc = elm_scroller_add(win); + elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx0, sc); + evas_object_show(sc); + + tbx = elm_box_add(win); + evas_object_size_hint_weight_set(tbx, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(tbx, EVAS_HINT_FILL, 0.0); + elm_object_content_set(sc, tbx); + evas_object_show(tbx); + +add_tests: + tests = NULL; +#define ADD_TEST(icon_, cat_, name_, cb_) _elm_test_add(&tests, icon_, cat_, name_, cb_) + + //------------------------------// + ADD_TEST(NULL, "Window / Background", "Bg Plain", test_bg_plain); + ADD_TEST(NULL, "Window / Background", "Bg Image", test_bg_image); + ADD_TEST(NULL, "Window / Background", "Bg Options", test_bg_options); + ADD_TEST(NULL, "Window / Background", "Window States", test_win_state); + ADD_TEST(NULL, "Window / Background", "Window States 2", test_win_state2); + ADD_TEST(NULL, "Window / Background", "Inwin", test_inwin); + ADD_TEST(NULL, "Window / Background", "Inwin 2", test_inwin2); + ADD_TEST(NULL, "Window / Background", "Window Inline", test_win_inline); + ADD_TEST(NULL, "Window / Background", "Window Socket", test_win_socket); + ADD_TEST(NULL, "Window / Background", "Window Plug", test_win_plug); + ADD_TEST(NULL, "Window / Background", "Window WM Rotation", test_win_wm_rotation); + ADD_TEST(NULL, "Window / Background", "Window Standard/Dialog", test_win_dialog); + ADD_TEST(NULL, "Window / Background", "Window Keygrab Set", test_win_keygrab); + + //------------------------------// + ADD_TEST(NULL, "Images", "Icon", test_icon); + ADD_TEST(NULL, "Images", "Icon Transparent", test_icon_transparent); + ADD_TEST(NULL, "Images", "Icon Animation", test_icon_animated); + ADD_TEST(NULL, "Images", "Icon Standard", test_icon_standard); + ADD_TEST(NULL, "Images", "Photocam", test_photocam); + ADD_TEST(NULL, "Images", "Photocam Remote", test_photocam_remote); + ADD_TEST(NULL, "Images", "Photo", test_photo); + ADD_TEST(NULL, "Images", "Thumb", test_thumb); + ADD_TEST(NULL, "Images", "Image", test_image); + ADD_TEST(NULL, "Images", "Image Remote", test_remote_image); + ADD_TEST(NULL, "Images", "Image Click", test_click_image); + ADD_TEST(NULL, "Images", "Slideshow", test_slideshow); + ADD_TEST(NULL, "Images", "Video", test_video); + + //------------------------------// + ADD_TEST(NULL, "Containers", "Box Vert", test_box_vert); + ADD_TEST(NULL, "Containers", "Box Vert 2", test_box_vert2); + ADD_TEST(NULL, "Containers", "Box Pack", test_box_pack); + ADD_TEST(NULL, "Containers", "Box Horiz", test_box_horiz); + ADD_TEST(NULL, "Containers", "Box Homogeneous", test_box_homo); + ADD_TEST(NULL, "Containers", "Box Transition", test_box_transition); + ADD_TEST(NULL, "Containers", "Box Align", test_box_align); + ADD_TEST(NULL, "Containers", "Table", test_table); + ADD_TEST(NULL, "Containers", "Table Homogeneous", test_table2); + ADD_TEST(NULL, "Containers", "Table 3", test_table3); + ADD_TEST(NULL, "Containers", "Table 4", test_table4); + ADD_TEST(NULL, "Containers", "Table 5", test_table5); + ADD_TEST(NULL, "Containers", "Table 6", test_table6); + ADD_TEST(NULL, "Containers", "Table 7", test_table7); + ADD_TEST(NULL, "Containers", "Table Padding", test_table8); + ADD_TEST(NULL, "Containers", "Layout", test_layout); + ADD_TEST(NULL, "Containers", "Layout 2", test_layout2); + ADD_TEST(NULL, "Containers", "Grid", test_grid); + + //------------------------------// + ADD_TEST(NULL, "Entries", "Entry", test_entry); + ADD_TEST(NULL, "Entries", "Entry Style Default", test_entry_style_default); + ADD_TEST(NULL, "Entries", "Entry Style User", test_entry_style_user); + ADD_TEST(NULL, "Entries", "Entry Scrolled", test_entry_scrolled); + ADD_TEST(NULL, "Entries", "Entry 3", test_entry3); + ADD_TEST(NULL, "Entries", "Entry 4", test_entry4); + ADD_TEST(NULL, "Entries", "Entry 5", test_entry5); + ADD_TEST(NULL, "Entries", "Entry 6", test_entry6); + ADD_TEST(NULL, "Entries", "Entry 7", test_entry7); + ADD_TEST(NULL, "Entries", "Entry 8", test_entry8); + ADD_TEST(NULL, "Entries", "Entry Regex", test_entry_regex); + ADD_TEST(NULL, "Entries", "Entry Notepad", test_entry_notepad); + ADD_TEST(NULL, "Entries", "Multibuttonentry", test_multibuttonentry); + ADD_TEST(NULL, "Entries", "Entry Anchor", test_entry_anchor); + ADD_TEST(NULL, "Entries", "Entry Anchor2", test_entry_anchor2); + ADD_TEST(NULL, "Entries", "Entry Emoticon", test_entry_emoticon); + + //------------------------------// + ADD_TEST(NULL, "Buttons", "Button", test_button); + + //------------------------------// + ADD_TEST(NULL, "Prefs", "Prefs", test_prefs); + + //------------------------------// + ADD_TEST(NULL, "Effects", "Transit", test_transit); + ADD_TEST(NULL, "Effects", "Transit Resizing", test_transit_resizing); + ADD_TEST(NULL, "Effects", "Transit Flip", test_transit_flip); + ADD_TEST(NULL, "Effects", "Transit Zoom", test_transit_zoom); + ADD_TEST(NULL, "Effects", "Transit Blend", test_transit_blend); + ADD_TEST(NULL, "Effects", "Transit Fade", test_transit_fade); + ADD_TEST(NULL, "Effects", "Transit Resizable Flip", + test_transit_resizable_flip); + ADD_TEST(NULL, "Effects", "Transit Custom", test_transit_custom); + ADD_TEST(NULL, "Effects", "Transit Chain", test_transit_chain); + ADD_TEST(NULL, "Effects", "Transit Tween", test_transit_tween); + ADD_TEST(NULL, "Effects", "Transit Bezier", test_transit_bezier); + ADD_TEST(NULL, "Effects", "Flip", test_flip); + ADD_TEST(NULL, "Effects", "Flip 2", test_flip2); + ADD_TEST(NULL, "Effects", "Flip 3", test_flip3); + ADD_TEST(NULL, "Effects", "Flip Interactive", test_flip_interactive); + ADD_TEST(NULL, "Effects", "Flip To", test_flip_to); + ADD_TEST(NULL, "Effects", "Flip Page", test_flip_page); + ADD_TEST(NULL, "Effects", "Animation", test_anim); + + //------------------------------// + ADD_TEST(NULL, "Edje External", "ExtButton", test_external_button); + ADD_TEST(NULL, "Edje External", "ExtProgressBar", test_external_pbar); + ADD_TEST(NULL, "Edje External", "ExtScroller", test_external_scroller); + ADD_TEST(NULL, "Edje External", "ExtSlider", test_external_slider); + ADD_TEST(NULL, "Edje External", "ExtVideo", test_external_video); + + //------------------------------// + ADD_TEST(NULL, "Toolbars", "Toolbar", test_toolbar); + ADD_TEST(NULL, "Toolbars", "Toolbar 2", test_toolbar2); + ADD_TEST(NULL, "Toolbars", "Toolbar 3", test_toolbar3); + ADD_TEST(NULL, "Toolbars", "Toolbar 4", test_toolbar4); + ADD_TEST(NULL, "Toolbars", "Toolbar 5", test_toolbar5); + ADD_TEST(NULL, "Toolbars", "Toolbar 6", test_toolbar6); + ADD_TEST(NULL, "Toolbars", "Toolbar 7", test_toolbar7); + ADD_TEST(NULL, "Toolbars", "Toolbar 8", test_toolbar8); + ADD_TEST(NULL, "Toolbars", "Toolbar Vertical", test_toolbar_vertical); + ADD_TEST(NULL, "Toolbars", "Toolbar Focus", test_toolbar_focus); + + //------------------------------// + ADD_TEST(NULL, "Lists - List", "List", test_list); + ADD_TEST(NULL, "Lists - List", "List - Horizontal", test_list_horizontal); + ADD_TEST(NULL, "Lists - List", "List 2", test_list2); + ADD_TEST(NULL, "Lists - List", "List 3", test_list3); + ADD_TEST(NULL, "Lists - List", "List 4", test_list4); + ADD_TEST(NULL, "Lists - List", "List 5", test_list5); + ADD_TEST(NULL, "Lists - List", "List 6", test_list6); + ADD_TEST(NULL, "Lists - List", "List 7", test_list7); + ADD_TEST(NULL, "Lists - List", "List Focus", test_list_focus); + ADD_TEST(NULL, "Lists - List", "List Focus Horizontal", test_list_horiz_focus); + ADD_TEST(NULL, "Lists - List", "List Separator", test_list_separator); + ADD_TEST(NULL, "Lists - List", "List Multi Select", test_list_multi_select); + + //------------------------------// + + ADD_TEST(NULL, "Lists - Genlist", "Genlist", test_genlist); + ADD_TEST(NULL, "Lists - Genlist", "Genlist 2", test_genlist2); + ADD_TEST(NULL, "Lists - Genlist", "Genlist 3", test_genlist3); + ADD_TEST(NULL, "Lists - Genlist", "Genlist 4", test_genlist4); + ADD_TEST(NULL, "Lists - Genlist", "Genlist 5", test_genlist5); + ADD_TEST(NULL, "Lists - Genlist", "Genlist 7", test_genlist7); + ADD_TEST(NULL, "Lists - Genlist", "Genlist Tree", test_genlist6); + ADD_TEST(NULL, "Lists - Genlist", "Genlist Group", test_genlist8); + ADD_TEST(NULL, "Lists - Genlist", "Genlist Group Tree", test_genlist9); + ADD_TEST(NULL, "Lists - Genlist", "Genlist Decorate Item Mode", test_genlist10); + ADD_TEST(NULL, "Lists - Genlist", "Genlist Decorate All Mode", test_genlist15); + ADD_TEST(NULL, "Lists - Genlist", "Genlist Reorder Mode", test_genlist_reorder); +#ifdef HAVE_EIO + ADD_TEST(NULL, "Lists - Genlist", "Genlist Eio", test_eio); +#endif + ADD_TEST(NULL, "Lists - Genlist", "Genlist Textblock", test_genlist12); + ADD_TEST(NULL, "Lists - Genlist", "Genlist Tree, Insert Sorted", test_genlist13); + ADD_TEST(NULL, "Lists - Genlist", "Genlist Tree, Insert Relative", test_genlist14); + ADD_TEST(NULL, "Lists - Genlist", "Genlist Flip Mode", test_genlist16); + ADD_TEST(NULL, "Lists - Genlist", "Genlist Decorate Modes", test_genlist17); + ADD_TEST(NULL, "Lists - Genlist", "Genlist Tree and Decorate All Mode", test_genlist18); + ADD_TEST(NULL, "Lists - Genlist", "Genlist Full Widget", test_genlist19); + ADD_TEST(NULL, "Lists - Genlist", "Genlist Item Search By Text", test_genlist20); + ADD_TEST(NULL, "Lists - Genlist", "Genlist Focus", test_genlist_focus); + ADD_TEST(NULL, "Lists - Genlist", "Genlist Item Styles", test_genlist_item_styles); + ADD_TEST(NULL, "Lists - Genlist", "Genlist Multi Select", test_genlist_multi_select); + ADD_TEST(NULL, "Lists - Genlist", "Genlist Del", test_genlist_del); + ADD_TEST(NULL, "Lists - Genlist", "Genlist Filter", test_genlist_filter); + ADD_TEST(NULL, "Lists - Genlist", "Genlist Show/Bring", test_genlist_show_bring); + + //------------------------------// + + ADD_TEST(NULL, "Lists - Gengrid", "GenGrid", test_gengrid); + ADD_TEST(NULL, "Lists - Gengrid", "GenGrid 2", test_gengrid2); + ADD_TEST(NULL, "Lists - Gengrid", "GenGrid Group", test_gengrid3); + ADD_TEST(NULL, "Lists - Gengrid", "GenGrid Show/Bring_in", test_gengrid4); + ADD_TEST(NULL, "Lists - Gengrid", "GenGrid Item Search by Text", test_gengrid5); + ADD_TEST(NULL, "Lists - Gengrid", "GenGrid Item Styles", test_gengrid_item_styles); + ADD_TEST(NULL, "Lists - Gengrid", "Gengrid Update Speed", test_gengrid_speed); + ADD_TEST(NULL, "Lists - Gengrid", "GenGrid Focus", test_gengrid_focus); + ADD_TEST(NULL, "Lists - Gengrid", "GenGrid Update", test_gengrid_update); + + //------------------------------// + ADD_TEST(NULL, "General", "Scaling", test_scaling); + ADD_TEST(NULL, "General", "Scaling 2", test_scaling2); + + //------------------------------// + ADD_TEST(NULL, "3D", "Evas Map 3D", test_3d); + ADD_TEST(NULL, "3D", "GLViewSimple", test_glview_simple); + ADD_TEST(NULL, "3D", "GLView Gears", test_glview); + ADD_TEST(NULL, "3D", "GLView Many Gears", test_glview_manygears); + + //------------------------------// +#ifdef HAVE_ELEMENTARY_WEB + ADD_TEST(NULL, "Web", "Web", test_web); + ADD_TEST(NULL, "Web", "Web UI", test_web_ui); +#endif + + //------------------------------// + ADD_TEST(NULL, "Input", "Gesture Layer", test_gesture_layer); + ADD_TEST(NULL, "Input", "Gesture Layer 2", test_gesture_layer2); + ADD_TEST(NULL, "Input", "Gesture Layer 3", test_gesture_layer3); + ADD_TEST(NULL, "Input", "Multi Touch", test_multi); + + //------------------------------// + ADD_TEST(NULL, "Selectors", "Index", test_index); + ADD_TEST(NULL, "Selectors", "Index 2", test_index2); + ADD_TEST(NULL, "Selectors", "Index 3", test_index3); + ADD_TEST(NULL, "Selectors", "Index Horizontal", test_index_horizontal); + ADD_TEST(NULL, "Selectors", "FileSelector", test_fileselector); + ADD_TEST(NULL, "Selectors", "FileSelector Entry", test_fileselector_entry); + ADD_TEST(NULL, "Selectors", "FileSelector Button", test_fileselector_button); + ADD_TEST(NULL, "Selectors", "Actionslider", test_actionslider); + ADD_TEST(NULL, "Selectors", "Menu", test_menu); + ADD_TEST(NULL, "Selectors", "Menu 2", test_menu2); + ADD_TEST(NULL, "Selectors", "DiskSelector", test_diskselector); + ADD_TEST(NULL, "Selectors", "ColorSelector", test_colorselector); + ADD_TEST(NULL, "Selectors", "Color Classes", test_colorclass); + ADD_TEST(NULL, "Selectors", "SegmentControl", test_segment_control); + ADD_TEST(NULL, "Selectors", "Hoversel", test_hoversel); + ADD_TEST(NULL, "Selectors", "Hoversel Focus", test_hoversel_focus); + ADD_TEST(NULL, "Selectors", "Radio", test_radio); + ADD_TEST(NULL, "Selectors", "FlipSelector", test_flipselector); + ADD_TEST(NULL, "Selectors", "DaySelector", test_dayselector); + ADD_TEST(NULL, "Selectors", "Main menu", test_main_menu); + ADD_TEST(NULL, "Selectors", "Combobox", test_combobox); + ADD_TEST(NULL, "Selectors", "Combobox Multiple Selection", test_combobox2); + + //------------------------------// + ADD_TEST(NULL, "Cursors", "Cursor", test_cursor); + ADD_TEST(NULL, "Cursors", "Cursor 2", test_cursor2); + ADD_TEST(NULL, "Cursors", "Cursor 3", test_cursor3); + ADD_TEST(NULL, "Cursors", "Cursor Layout", test_cursor4); + + //------------------------------// + ADD_TEST(NULL, "Scroller", "Scroller", test_scroller); + ADD_TEST(NULL, "Scroller", "Scroller 2", test_scroller2); + ADD_TEST(NULL, "Scroller", "Scroller 3", test_scroller3); + ADD_TEST(NULL, "Scroller", "Page Scroller", test_scroller4); + + //------------------------------// + // FIXME: add frame test + ADD_TEST(NULL, "Boundaries", "Bubble", test_bubble); + ADD_TEST(NULL, "Boundaries", "Separator", test_separator); + + //------------------------------// + ADD_TEST(NULL, "Range Values", "Spinner", test_spinner); + ADD_TEST(NULL, "Range Values", "Slider", test_slider); + ADD_TEST(NULL, "Range Values", "Progressbar", test_progressbar); + ADD_TEST(NULL, "Range Values", "Progressbar 2", test_progressbar2); + + //------------------------------// + ADD_TEST(NULL, "Booleans", "Check", test_check); + ADD_TEST(NULL, "Booleans", "Check Toggle", test_check_toggle); + + //------------------------------// + ADD_TEST(NULL, "Popups", "Ctxpopup", test_ctxpopup); + ADD_TEST(NULL, "Popups", "Hover", test_hover); + ADD_TEST(NULL, "Popups", "Hover 2", test_hover2); + ADD_TEST(NULL, "Popups", "Hover 3", test_hover3); + ADD_TEST(NULL, "Popups", "Notify", test_notify); + ADD_TEST(NULL, "Popups", "Tooltip", test_tooltip); + ADD_TEST(NULL, "Popups", "Tooltip 2", test_tooltip2); + ADD_TEST(NULL, "Popups", "Tooltip 3", test_tooltip3); + ADD_TEST(NULL, "Popups", "Popup", test_popup); + + //------------------------------// + ADD_TEST(NULL, "Times & Dates", "Calendar", test_calendar); + ADD_TEST(NULL, "Times & Dates", "Calendar 2", test_calendar2); + ADD_TEST(NULL, "Times & Dates", "Calendar 3", test_calendar3); + ADD_TEST(NULL, "Times & Dates", "Clock", test_clock); + ADD_TEST(NULL, "Times & Dates", "Clock Edit", test_clock_edit); + ADD_TEST(NULL, "Times & Dates", "Clock Edit 2", test_clock_edit2); + ADD_TEST(NULL, "Times & Dates", "Clock Pause", test_clock_pause); + ADD_TEST(NULL, "Times & Dates", "Datetime", test_datetime); + + //------------------------------// + ADD_TEST(NULL, "Text", "Label", test_label); + ADD_TEST(NULL, "Text", "Label Slide", test_label_slide); + ADD_TEST(NULL, "Text", "Label Wrap", test_label_wrap); + ADD_TEST(NULL, "Text", "Label Ellipsis", test_label_ellipsis); + + //------------------------------// + ADD_TEST(NULL, "Stored Surface Buffer", "Launcher", test_launcher); + ADD_TEST(NULL, "Stored Surface Buffer", "Launcher 2", test_launcher2); + ADD_TEST(NULL, "Stored Surface Buffer", "Launcher 3", test_launcher3); + + //------------------------------// + ADD_TEST(NULL, "Focus", "Focus", test_focus); + ADD_TEST(NULL, "Focus", "Focus 2", test_focus2); + ADD_TEST(NULL, "Focus", "Focus Hide/Del", test_focus_hide_del); + ADD_TEST(NULL, "Focus", "Focus Custom Chain", test_focus_custom_chain); + ADD_TEST(NULL, "Focus", "Focus Style", test_focus_style); + ADD_TEST(NULL, "Focus", "Focus On Part", test_focus_part); + ADD_TEST(NULL, "Focus", "Focus 3", test_focus3); + ADD_TEST(NULL, "Focus", "Focus Object Style", test_focus_object_style); + ADD_TEST(NULL, "Focus", "Focus Object Policy", test_focus_object_policy); + + //------------------------------// + ADD_TEST(NULL, "Naviframe", "Naviframe", test_naviframe); + ADD_TEST(NULL, "Naviframe", "Naviframe 2", test_naviframe2); + ADD_TEST(NULL, "Naviframe", "Naviframe 3", test_naviframe3); + ADD_TEST(NULL, "Naviframe", "Naviframe: Complex", test_naviframe_complex); + + //------------------------------// + ADD_TEST(NULL, "Geographic", "Map", test_map); + + //------------------------------// + ADD_TEST(NULL, "Dividers", "Panel", test_panel); + ADD_TEST(NULL, "Dividers", "Panel Scrollable", test_panel2); + ADD_TEST(NULL, "Dividers", "Panes", test_panes); + + //------------------------------// + ADD_TEST(NULL, "Standardization", "Conformant", test_conformant); + ADD_TEST(NULL, "Standardization", "Conformant 2", test_conformant2); + ADD_TEST(NULL, "Standardization", "Conformant indicator", test_conformant_indicator); + + //------------------------------// + ADD_TEST(NULL, "Helpers", "Store", test_store); +// ADD_TEST(NULL, "Helpers", "Factory", test_factory); + + //------------------------------// + ADD_TEST(NULL, "System", "Notification", test_sys_notify); + ADD_TEST(NULL, "System", "Systray Item", test_systray); + + //------------------------------// + ADD_TEST(NULL, "Drag & Drop", "Genlist DnD Dflt Anim", test_dnd_genlist_default_anim); + ADD_TEST(NULL, "Drag & Drop", "Genlist DnD User Anim", test_dnd_genlist_user_anim); + ADD_TEST(NULL, "Drag & Drop", "Genlist-Gengrid DnD", test_dnd_genlist_gengrid); + ADD_TEST(NULL, "Drag & Drop", "Features DnD", test_dnd_multi_features); + ADD_TEST(NULL, "Drag & Drop", "Types DnD", test_dnd_types); + + //------------------------------// + ADD_TEST(NULL, "Miscellaneous", "Copy And Paste", test_cnp); + ADD_TEST(NULL, "Miscellaneous", "Weather", test_weather); + ADD_TEST(NULL, "Miscellaneous", "Icon Desktops", test_icon_desktops); + ADD_TEST(NULL, "Miscellaneous", "Floating Objects", test_floating); + ADD_TEST(NULL, "Miscellaneous", "Configuration", test_config); + ADD_TEST(NULL, "Miscellaneous", "Accessibility", test_access); + ADD_TEST(NULL, "Miscellaneous", "Accessibility2", test_access2); + ADD_TEST(NULL, "Miscellaneous", "Accessibility3", test_access3); + + //------------------------------// + ADD_TEST(NULL, "Application client/server", "Task switcher", test_task_switcher); + ADD_TEST(NULL, "Application client/server", "Phone", test_application_server_phone); + ADD_TEST(NULL, "Application client/server", "Message", test_application_server_message); + + ADD_TEST(NULL, "Widgets Disable/Enable", "Box", test_box_disable); + ADD_TEST(NULL, "Widgets Disable/Enable", "Layout", test_layout_disable); + +#undef ADD_TEST + + if (autorun) + { + char *tmp = _space_removed_string_get(autorun); + EINA_LIST_FOREACH(tests, l, t) + { + char *name; + + if (!t->name || !t->cb) continue; + + name = _space_removed_string_get(t->name); + if (!strcasecmp(name, tmp)) + { + t->cb(NULL, NULL, NULL); + free(name); + break; + } + free(name); + } + free(tmp); + + if (!l) + ERR("'%s' is not valid test case name\n", autorun); + } + tt = t; + + if (test_win_only) + { + EINA_LIST_FREE(tests, t) + free(t); + + if (!l) + elm_exit(); + + return; + } + + if (tests) + _menu_create(NULL); + + /* bring in autorun frame */ + if (autorun) + { + Evas_Coord x, y; + evas_object_geometry_get(tt, &x, &y, NULL, NULL); + elm_scroller_region_bring_in(sc, x, y, 0, 0); + } + + /* set an initial window size */ + evas_object_resize(win, 480, 480); + evas_object_show(win); +} + +static char * +colorclass_tl_cb(char *str) +{ + /* FIXME: translate? */ + return str; +} + +static Eina_List * +colorclass_list_cb(void) +{ + Eina_List *l, *ret = NULL; + Eina_Iterator *it; + Eina_File *f; + + it = edje_file_iterator_new(); + if (!it) return NULL; + EINA_ITERATOR_FOREACH(it, f) + { + l = elm_color_class_util_edje_file_list(f); + if (l) + ret = eina_list_merge(ret, l); + } + eina_iterator_free(it); + return ret; +} + +/* this is your elementary main function - it MUST be called IMMEDIATELY + * after elm_init() and MUST be passed argc and argv, and MUST be called + * elm_main and not be static - must be a visible symbol with EAPI_MAIN infront */ +EAPI_MAIN int +elm_main(int argc, char **argv) +{ + Eina_Bool test_win_only = EINA_FALSE; + char *autorun = NULL; + struct elm_test *t = NULL; + + _log_domain = eina_log_domain_register("elementary_test", NULL); + + elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); + + /* tell elm about our app so it can figure out where to get files */ + elm_app_compile_bin_dir_set(PACKAGE_BIN_DIR); + elm_app_compile_lib_dir_set(PACKAGE_LIB_DIR); + elm_app_compile_data_dir_set(PACKAGE_DATA_DIR); + elm_app_info_set(elm_main, "elementary", "images/logo.png"); + + /* if called with a single argument try to autorun a test with + * the same name as the given param + * ex: elementary_test "Box Vert 2" */ + if (argc == 2) + { + if (!strcmp(argv[1], "--help")) + { + printf("Usages:\n" + "$ elementary_test\n" + "$ elementary_test --test-win-only [TEST_NAME]\n" + "$ elementary_test -to [TEST_NAME]\n\n" + "Examples:\n" + "$ elementary_test -to Button\n\n"); + goto end; + } + autorun = argv[1]; + } + else if (argc == 3) + { + /* Just a workaround to make the shot module more + * useful with elementary test. */ + if ((!strcmp(argv[1], "--test-win-only")) || + (!strcmp(argv[1], "-to"))) + { + test_win_only = EINA_TRUE; + autorun = argv[2]; + } + } + + elm_color_class_translate_cb_set(colorclass_tl_cb); + elm_color_class_list_cb_set(colorclass_list_cb); + /* put here any init specific to this app like parsing args etc. */ + my_win_main(autorun, test_win_only); /* create main window */ + elm_run(); /* and run the program now and handle all events etc. */ + /* if the mainloop that elm_run() runs exist - we exit the app */ + + EINA_LIST_FREE(tests, t) + free(t); + +end: + eina_log_domain_unregister(_log_domain); + + /* exit code */ + return 0; +} +/* all elementary apps should use this. but it should be placed right after + * elm_main() */ +ELM_MAIN() diff --git a/src/bin/elementary/test.h b/src/bin/elementary/test.h new file mode 100644 index 0000000000..a5e78bb56a --- /dev/null +++ b/src/bin/elementary/test.h @@ -0,0 +1,12 @@ +#ifndef _TEST_H +#define _TEST_H + +extern int _log_domain; + +#define CRI(...) EINA_LOG_DOM_CRIT(_log_domain, _VA_ARGS__) +#define ERR(...) EINA_LOG_DOM_ERR(_log_domain, __VA_ARGS__) +#define WRN(...) EINA_LOG_DOM_WARN(_log_domain, __VA_ARGS__) +#define INF(...) EINA_LOG_DOM_INFO(_log_domain, __VA_ARGS__) +#define DBG(...) EINA_LOG_DOM_DBG(_log_domain, __VA_ARGS__) + +#endif diff --git a/src/bin/elementary/test_3d.c b/src/bin/elementary/test_3d.c new file mode 100644 index 0000000000..66292727b9 --- /dev/null +++ b/src/bin/elementary/test_3d.c @@ -0,0 +1,333 @@ +#include "test.h" +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +typedef struct _Point +{ + Evas_Coord x, y, z, u, v; +} Point; + +typedef struct _Side +{ + Evas_Object *o; + Point pt[4]; +} Side; + +typedef struct _Cube +{ + Side side[6]; +} Cube; + +static Cube *cube; +static double rotx = 0.0, roty = 0.0, rotz = 0.0; +static double cxo = 0.0, cyo = 0.0, focv = 256.0, z0v = 0.0; +#define POINT(n, p, xx, yy, zz, uu, vv) \ + c->side[n].pt[p].x = xx; \ + c->side[n].pt[p].y = yy; \ + c->side[n].pt[p].z = zz; \ + c->side[n].pt[p].u = uu; \ + c->side[n].pt[p].v = vv + +static Cube * +_cube_new(Evas *evas, Evas_Coord w, Evas_Coord h, Evas_Coord d) +{ + Cube *c; + int i; + + w -= (w / 2); + h -= (h / 2); + d -= (d / 2); + c = calloc(1, sizeof(Cube)); + for (i = 0; i < 6; i++) + { + Evas_Object *o; + char buf[PATH_MAX]; + o = evas_object_image_filled_add(evas); + c->side[i].o = o; + snprintf(buf, sizeof(buf), "%s/images/%s", + elm_app_data_dir_get(), "twofish.jpg"); + evas_object_image_file_set(o, buf, NULL); + evas_object_resize(o, 256, 256); + evas_object_pass_events_set(o, EINA_TRUE); + evas_object_color_set(o, 235, 235, 235, 235); + evas_object_show(o); + } + POINT(0, 0, -w, -h, -d, 0, 0); + POINT(0, 1, w, -h, -d, 256, 0); + POINT(0, 2, w, h, -d, 256, 256); + POINT(0, 3, -w, h, -d, 0, 256); + + POINT(1, 0, w, -h, -d, 0, 0); + POINT(1, 1, w, -h, d, 256, 0); + POINT(1, 2, w, h, d, 256, 256); + POINT(1, 3, w, h, -d, 0, 256); + + POINT(2, 0, w, -h, d, 0, 0); + POINT(2, 1, -w, -h, d, 256, 0); + POINT(2, 2, -w, h, d, 256, 256); + POINT(2, 3, w, h, d, 0, 256); + + POINT(3, 0, -w, -h, d, 0, 0); + POINT(3, 1, -w, -h, -d, 256, 0); + POINT(3, 2, -w, h, -d, 256, 256); + POINT(3, 3, -w, h, d, 0, 256); + + POINT(4, 0, -w, -h, d, 0, 0); + POINT(4, 1, w, -h, d, 256, 0); + POINT(4, 2, w, -h, -d, 256, 256); + POINT(4, 3, -w, -h, -d, 0, 256); + + POINT(5, 0, -w, h, -d, 0, 0); + POINT(5, 1, w, h, -d, 256, 0); + POINT(5, 2, w, h, d, 256, 256); + POINT(5, 3, -w, h, d, 0, 256); + + return c; +} + +static void +_cube_pos(Cube *c, + Evas_Coord x, Evas_Coord y, Evas_Coord z, + double dx, double dy, double dz, + Evas_Coord cx, Evas_Coord cy, Evas_Coord z0, Evas_Coord foc) +{ + Evas_Map *m; + int i, j, order[6], sorted; + Evas_Coord mz[6]; + + m = evas_map_new(4); + + for (i = 0; i < 6; i++) + { + Evas_Coord tz[4]; + + for (j = 0; j < 4; j++) + { + evas_map_point_coord_set(m, j, + c->side[i].pt[j].x + x, + c->side[i].pt[j].y + y, + c->side[i].pt[j].z + z); + evas_map_point_image_uv_set(m, j, + c->side[i].pt[j].u, + c->side[i].pt[j].v); + evas_map_point_color_set(m, j, 255, 255, 255, 255); + } + evas_map_util_3d_rotate(m, dx, dy, dz, x, y, z); + evas_map_util_3d_lighting(m, -1000, -1000, -1000, + 255, 255, 255, + 20, 20, 20); + evas_map_util_3d_perspective(m, cx, cy, z0, foc); + if (evas_map_util_clockwise_get(m)) + { + evas_object_map_enable_set(c->side[i].o, EINA_TRUE); + evas_object_map_set(c->side[i].o, m); + evas_object_show(c->side[i].o); + } + else + evas_object_hide(c->side[i].o); + + order[i] = i; + for (j = 0; j < 4; j++) + evas_map_point_coord_get(m, j, NULL, NULL, &(tz[j])); + mz[i] = (tz[0] + tz[1] + tz[2] + tz[3]) / 4; + } + do + { + sorted = 1; + for (i = 0; i < 5; i++) + { + if (mz[order[i]] > mz[order[i + 1]]) + { + j = order[i]; + order[i] = order[i + 1]; + order[i + 1] = j; + sorted = 0; + } + } + } + while (!sorted); + + evas_object_raise(c->side[order[0]].o); + for (i = 1; i < 6; i++) + evas_object_stack_below(c->side[order[i]].o, c->side[order[i - 1]].o); + evas_map_free(m); +} + +static void +_cube_update(Evas_Object *win, Cube *c) +{ + Evas_Coord w, h; + + evas_object_geometry_get(win, NULL, NULL, &w, &h); + _cube_pos(c, + (w / 2), (h / 2), 512, + rotx, roty, rotz, + (w / 2) + cxo, (h / 2) + cyo, z0v, focv); +} + +void +_ch_rot_x(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + rotx = elm_slider_value_get(obj); + _cube_update(win, cube); +} + +void +_ch_rot_y(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + roty = elm_slider_value_get(obj); + _cube_update(win, cube); +} + +void +_ch_rot_z(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + rotz = elm_slider_value_get(obj); + _cube_update(win, cube); +} + +void +_ch_cx(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + cxo = elm_slider_value_get(obj); + _cube_update(win, cube); +} + +void +_ch_cy(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + cyo = elm_slider_value_get(obj); + _cube_update(win, cube); +} + +void +_ch_foc(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + focv = elm_slider_value_get(obj); + _cube_update(win, cube); +} + +void +_ch_z0(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + z0v = elm_slider_value_get(obj); + _cube_update(win, cube); +} + +void +test_3d(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *sl; + + win = elm_win_util_standard_add("evas-map-3d", "Evas Map 3D"); + elm_win_autodel_set(win, EINA_TRUE); + + cube = _cube_new(evas_object_evas_get(win), 240, 240, 240); + + bx = elm_box_add(win); + evas_object_layer_set(bx, 10); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "Rot X"); + elm_slider_unit_format_set(sl, "%1.0f units"); + elm_slider_indicator_format_set(sl, "%1.0f units"); + elm_slider_span_size_set(sl, 360); + elm_slider_min_max_set(sl, 0, 360); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sl); + evas_object_smart_callback_add(sl, "changed", _ch_rot_x, win); + evas_object_show(sl); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "Rot Y"); + elm_slider_unit_format_set(sl, "%1.0f units"); + elm_slider_indicator_format_set(sl, "%1.0f units"); + elm_slider_span_size_set(sl, 360); + elm_slider_min_max_set(sl, 0, 360); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sl); + evas_object_smart_callback_add(sl, "changed", _ch_rot_y, win); + evas_object_show(sl); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "Rot Z"); + elm_slider_unit_format_set(sl, "%1.0f units"); + elm_slider_indicator_format_set(sl, "%1.0f units"); + elm_slider_span_size_set(sl, 360); + elm_slider_min_max_set(sl, 0, 360); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sl); + evas_object_smart_callback_add(sl, "changed", _ch_rot_z, win); + evas_object_show(sl); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "PX Off"); + elm_slider_unit_format_set(sl, "%1.0f units"); + elm_slider_indicator_format_set(sl, "%1.0f units"); + elm_slider_span_size_set(sl, 360); + elm_slider_min_max_set(sl, -320, 320); + elm_slider_value_set(sl, cxo); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sl); + evas_object_smart_callback_add(sl, "changed", _ch_cx, win); + evas_object_show(sl); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "PY Off"); + elm_slider_unit_format_set(sl, "%1.0f units"); + elm_slider_indicator_format_set(sl, "%1.0f units"); + elm_slider_span_size_set(sl, 360); + elm_slider_min_max_set(sl, -320, 320); + elm_slider_value_set(sl, cyo); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sl); + evas_object_smart_callback_add(sl, "changed", _ch_cy, win); + evas_object_show(sl); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "Foc"); + elm_slider_unit_format_set(sl, "%1.0f units"); + elm_slider_indicator_format_set(sl, "%1.0f units"); + elm_slider_span_size_set(sl, 360); + elm_slider_min_max_set(sl, 1, 2000); + elm_slider_value_set(sl, focv); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sl); + evas_object_smart_callback_add(sl, "changed", _ch_foc, win); + evas_object_show(sl); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "Z0"); + elm_slider_unit_format_set(sl, "%1.0f units"); + elm_slider_indicator_format_set(sl, "%1.0f units"); + elm_slider_span_size_set(sl, 360); + elm_slider_min_max_set(sl, -2000, 2000); + elm_slider_value_set(sl, z0v); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sl); + evas_object_smart_callback_add(sl, "changed", _ch_z0, win); + evas_object_show(sl); + + evas_object_resize(win, 480, 480); + _cube_update(win, cube); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_access.c b/src/bin/elementary/test_access.c new file mode 100644 index 0000000000..80b8ea36e6 --- /dev/null +++ b/src/bin/elementary/test_access.c @@ -0,0 +1,398 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void +_cleanup_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_config_access_set(EINA_FALSE); +} + +typedef struct _Item_Data +{ + Elm_Object_Item *item; + int index; +} Item_Data; + +static Elm_Genlist_Item_Class *itc1, *itc2; +char *gl_access_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + char buf[256]; + Item_Data *id = data; + snprintf(buf, sizeof(buf), "Item # %d", id->index); + return strdup(buf); +} + +Evas_Object *gl_access_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part) +{ + char buf[PATH_MAX]; + Evas_Object *bt; + + if (!strcmp(part, "elm.swallow.end")) + { + bt = elm_button_add(obj); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_layout_text_set(bt, NULL, "OK"); + } + else + { + bt = elm_icon_add(obj); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(bt, buf, NULL); + evas_object_size_hint_aspect_set(bt, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + } + + return bt; +} + +static void +gl_del(void *data, Evas_Object *obj EINA_UNUSED) +{ + free(data); +} + +static Elm_Gengrid_Item_Class *gic; + +Evas_Object * +grid_access_content_get(void *data, Evas_Object *obj, const char *part) +{ + char buf[PATH_MAX]; + Evas_Object *ic; + const Item_Data *id = data; + + if (!strcmp(part, "elm.swallow.icon")) + { + ic = elm_icon_add(obj); + elm_object_scale_set(ic, 0.5); + snprintf(buf, sizeof(buf), "%s/images/icon_%02i.png", elm_app_data_dir_get(), (id->index % 4)); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ic, 0.5, 0.5); + evas_object_show(ic); + return ic; + } + return NULL; +} + +Evas_Object *gl_access_content_full_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part) +{ + int i; + Evas_Object *grid; + + if (strcmp(part, "elm.swallow.content")) return NULL; + + grid = elm_gengrid_add(obj); + elm_gengrid_item_size_set(grid, ELM_SCALE_SIZE(100), ELM_SCALE_SIZE(100)); + elm_gengrid_horizontal_set(grid, EINA_FALSE); + elm_gengrid_reorder_mode_set(grid, EINA_TRUE); + 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); + + gic = elm_gengrid_item_class_new(); + gic->item_style = "default"; + gic->func.text_get = NULL; + gic->func.content_get = grid_access_content_get; + gic->func.state_get = NULL; + gic->func.del = gl_del; + + for (i = 0; i < 4; i++) + { + Item_Data *id = calloc(1, sizeof(Item_Data)); + id->index = i; + + elm_gengrid_item_append(grid, gic, id, NULL, NULL); + } + elm_gengrid_item_class_free(gic); + + evas_object_size_hint_min_set(grid, + ELM_SCALE_SIZE(300), ELM_SCALE_SIZE(150)); + return grid; +} + +static void _realized(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *ei) +{ + Evas_Object *content, *bt; + Eina_List *items; + items = NULL; + + if (!ei) return; + Elm_Object_Item *item = ei; + + const Elm_Genlist_Item_Class *itc = elm_genlist_item_item_class_get(item); + + if (!strcmp(itc->item_style, "full")) + { + /* unregister item itself */ + elm_object_item_access_unregister(item); + + /* convey highlight to its content */ + content = elm_object_item_part_content_get(item, "elm.swallow.content"); + if (!content) return; + + items = eina_list_append(items, content); + } + else + { + bt = elm_object_item_part_content_get(item, "elm.swallow.end"); + if (!bt) return; + + items = eina_list_append(items, bt); + } + + elm_object_item_access_order_set(item, items); +} + +void +test_access(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + int i; + Evas_Object *win, *bx, *gl; + + win = elm_win_util_standard_add("access", "Access"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, NULL); + + elm_config_access_set(EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_homogeneous_set(bx, EINA_TRUE); + elm_box_horizontal_set(bx, EINA_TRUE); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + gl = elm_genlist_add(win); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, gl); + evas_object_show(gl); + + evas_object_smart_callback_add(gl, "realized", _realized, NULL); + + itc1 = elm_genlist_item_class_new(); + itc1->item_style = "default"; + itc1->func.text_get = gl_access_text_get; + itc1->func.content_get = gl_access_content_get; + itc1->func.state_get = NULL; + itc1->func.del = gl_del; + + itc2 = elm_genlist_item_class_new(); + itc2->item_style = "full"; + itc2->func.text_get = NULL; + itc2->func.content_get = gl_access_content_full_get; + itc2->func.state_get = NULL; + itc2->func.del = gl_del; + + for (i = 1; i < 10; i++) + { + Item_Data *id = calloc(1, sizeof(Item_Data)); + id->index = i; + + if (i % 4) + { + elm_genlist_item_append( + gl, + itc1, + id, + NULL/* parent */, + ELM_GENLIST_ITEM_NONE, + NULL/* func */, + NULL/* func data */ + ); + } + else + { + elm_genlist_item_append( + gl, + itc2, + id, + NULL/* parent */, + ELM_GENLIST_ITEM_NONE, + NULL/* func */, + NULL/* func data */ + ); + } + } + + elm_genlist_item_class_free(itc1); + elm_genlist_item_class_free(itc2); + evas_object_resize(win, 500, 400); + evas_object_show(win); +} + +void +test_access2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + int i, j, k; + char buf[PATH_MAX]; + Evas_Object *win, *bx, *sc, *ly, *ly2, *ic; + Evas_Object *ao, *to; + + win = elm_win_util_standard_add("access", "Access"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, NULL); + + elm_config_access_set(EINA_TRUE); + + sc = elm_scroller_add(win); + elm_scroller_bounce_set(sc, EINA_TRUE, EINA_FALSE); + elm_scroller_policy_set(sc, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, sc); + evas_object_show(sc); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_homogeneous_set(bx, EINA_TRUE); + elm_box_horizontal_set(bx, EINA_TRUE); + elm_object_content_set(sc, bx); + evas_object_show(bx); + + for (k = 0 ; k < 3; k++) + { + ly = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "access_page"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(ly); + + for (j = 0; j < 3; j++) + { + for (i = 0; i < 3; i++) + { + ly2 = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly2, buf, "access_icon"); + evas_object_size_hint_weight_set(ly2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ic = elm_icon_add(win); + elm_object_scale_set(ic, 0.5); + snprintf(buf, sizeof(buf), "%s/images/icon_%02i.png", elm_app_data_dir_get(), (i + (k * 3))); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ic, 0.5, 0.5); + elm_object_part_content_set(ly2, "slot", ic); + evas_object_show(ic); + + snprintf(buf, sizeof(buf), "slot.%i.%i", i, j); + elm_object_part_content_set(ly, buf, ly2); + evas_object_show(ly2); + + /* access */ + to = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(ly2), "access"); + ao = elm_access_object_register(to, ly2); + elm_object_focus_custom_chain_append(ly2, ao, NULL); + } + } + + elm_box_pack_end(bx, ly); + } + + evas_object_resize(win, 300, 300); + evas_object_show(win); +} + +static Eina_Bool +_key_down_cb(void *data, int type EINA_UNUSED, void *ei) +{ + Elm_Access_Action_Info *a; + Ecore_Event_Key *ev = ei; + + a = calloc(1, sizeof(Elm_Access_Action_Info)); + if (!a) return ECORE_CALLBACK_PASS_ON; + + if (ev && ev->key) + { + if (!strcmp(ev->key, "F1")) + { + a->highlight_cycle = EINA_TRUE; + elm_access_action(data, ELM_ACCESS_ACTION_HIGHLIGHT_NEXT, a); + } + } + free(a); + + return ECORE_CALLBACK_PASS_ON; +} + +static char * +_access_info_cb(void *data, Evas_Object *obj EINA_UNUSED) +{ + if (data) return strdup(data); + return NULL; +} + +void +test_access3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + char buf[PATH_MAX]; + Evas_Object *win, *box, *lbl, *ly, *btn; + Evas_Object *red_ao, *green_ao, *blue_ao, *black_ao, *to; + + win = elm_win_util_standard_add("access", "Access"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, NULL); + + elm_config_access_set(EINA_TRUE); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + lbl = elm_label_add(box); + elm_object_text_set(lbl, + "Move a mouse pointer to any object and press F1 to " + "move access highlight to the next object."); + evas_object_size_hint_weight_set(lbl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(lbl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, lbl); + evas_object_show(lbl); + + ly = elm_layout_add(box); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "access_color_page"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, ly); + evas_object_show(ly); + + btn = elm_button_add(win); + elm_object_text_set(btn, "action"); + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(btn); + + elm_object_part_content_set(ly, "center", btn); + + to = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(ly), "red"); + red_ao = elm_access_object_register(to, ly); + elm_access_info_cb_set(red_ao, ELM_ACCESS_INFO, _access_info_cb, "red"); + elm_access_highlight_next_set(btn, ELM_HIGHLIGHT_DIR_NEXT, red_ao); + + to = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(ly), "green"); + green_ao = elm_access_object_register(to, ly); + elm_access_info_cb_set(green_ao, ELM_ACCESS_INFO, _access_info_cb, "green"); + elm_access_highlight_next_set(red_ao, ELM_HIGHLIGHT_DIR_NEXT, green_ao); + + to = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(ly), "blue"); + blue_ao = elm_access_object_register(to, ly); + elm_access_info_cb_set(blue_ao, ELM_ACCESS_INFO, _access_info_cb, "blue"); + elm_access_highlight_next_set(green_ao, ELM_HIGHLIGHT_DIR_NEXT, blue_ao); + + to = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(ly), "black"); + black_ao = elm_access_object_register(to, ly); + elm_access_info_cb_set(black_ao, ELM_ACCESS_INFO, _access_info_cb, "black"); + elm_access_highlight_next_set(blue_ao, ELM_HIGHLIGHT_DIR_NEXT, black_ao); + + ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _key_down_cb, win); + + evas_object_resize(win, 300, 300); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_actionslider.c b/src/bin/elementary/test_actionslider.c new file mode 100644 index 0000000000..62b99e67bd --- /dev/null +++ b/src/bin/elementary/test_actionslider.c @@ -0,0 +1,209 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void _pos_selected_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info) +{ + Elm_Actionslider_Pos ipos, mpos, epos; + + printf("Selection: %s\n", (char *)event_info); + printf("Label selected: %s\n", elm_actionslider_selected_label_get(obj)); + + ipos = elm_actionslider_indicator_pos_get(obj); + + switch (ipos) + { + case ELM_ACTIONSLIDER_NONE: + printf("actionslider indicator pos: none!\n"); + break; + case ELM_ACTIONSLIDER_LEFT: + printf("actionslider indicator pos: left!\n"); + break; + case ELM_ACTIONSLIDER_CENTER: + printf("actionslider indicator pos: center!\n"); + break; + case ELM_ACTIONSLIDER_RIGHT: + printf("actionslider indicator pos: right!\n"); + break; + case ELM_ACTIONSLIDER_ALL: + printf("actionslider indicator pos: all!\n"); + break; + } + + mpos = elm_actionslider_magnet_pos_get(obj); + + switch (mpos) + { + case ELM_ACTIONSLIDER_NONE: + printf("actionslider magnet pos: none!\n"); + break; + case ELM_ACTIONSLIDER_LEFT: + printf("actionslider magnet pos: left!\n"); + break; + case ELM_ACTIONSLIDER_CENTER: + printf("actionslider magnet pos: center!\n"); + break; + case ELM_ACTIONSLIDER_RIGHT: + printf("actionslider magnet pos: right!\n"); + break; + case ELM_ACTIONSLIDER_ALL: + printf("actionslider magnet pos: all!\n"); + break; + } + + epos = elm_actionslider_enabled_pos_get(obj); + + if (epos) + { + printf("actionslider enabled pos: "); + if (epos & ELM_ACTIONSLIDER_LEFT) + printf("left "); + if (epos & ELM_ACTIONSLIDER_CENTER) + printf("center "); + if (epos & ELM_ACTIONSLIDER_RIGHT) + printf("right "); + printf("\n"); + } +} + +static void +_position_change_magnetic_cb(void *data EINA_UNUSED, Evas_Object * obj, void *event_info) +{ + if (!strcmp((char *)event_info, "left")) + elm_actionslider_magnet_pos_set(obj, ELM_ACTIONSLIDER_LEFT); + else if (!strcmp((char *)event_info, "right")) + elm_actionslider_magnet_pos_set(obj, ELM_ACTIONSLIDER_RIGHT); +} + +static void +_magnet_enable_disable_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info) +{ + if (!strcmp((char *)event_info, "left")) + elm_actionslider_magnet_pos_set(obj, ELM_ACTIONSLIDER_CENTER); + else if (!strcmp((char *)event_info, "right")) + elm_actionslider_magnet_pos_set(obj, ELM_ACTIONSLIDER_NONE); +} + +void +test_actionslider(void *data EINA_UNUSED, Evas_Object * obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *as; + + win = elm_win_util_standard_add("actionslider", "Actionslider"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + as = elm_actionslider_add(win); + evas_object_size_hint_weight_set(as, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(as, EVAS_HINT_FILL, 0); + elm_actionslider_indicator_pos_set(as, ELM_ACTIONSLIDER_RIGHT); + elm_actionslider_magnet_pos_set(as, ELM_ACTIONSLIDER_RIGHT); + elm_object_part_text_set(as, "left", "Snooze"); + elm_object_part_text_set(as, "center", NULL); + elm_object_part_text_set(as, "right", "Stop"); + elm_actionslider_enabled_pos_set(as, ELM_ACTIONSLIDER_LEFT | + ELM_ACTIONSLIDER_RIGHT); + evas_object_smart_callback_add(as, "pos_changed", + _position_change_magnetic_cb, NULL); + evas_object_smart_callback_add(as, "selected", _pos_selected_cb, NULL); + evas_object_show(as); + elm_box_pack_end(bx, as); + + as = elm_actionslider_add(win); + evas_object_size_hint_weight_set(as, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(as, EVAS_HINT_FILL, 0); + elm_actionslider_indicator_pos_set(as, ELM_ACTIONSLIDER_CENTER); + elm_actionslider_magnet_pos_set(as, ELM_ACTIONSLIDER_CENTER); + elm_object_part_text_set(as, "left", "Snooze"); + elm_object_part_text_set(as, "center", NULL); + elm_object_part_text_set(as, "right", "Stop"); + elm_actionslider_enabled_pos_set(as, ELM_ACTIONSLIDER_LEFT | + ELM_ACTIONSLIDER_RIGHT); + evas_object_smart_callback_add(as, "selected", _pos_selected_cb, NULL); + evas_object_show(as); + elm_box_pack_end(bx, as); + + as = elm_actionslider_add(win); + elm_object_style_set(as, "bar"); + evas_object_size_hint_weight_set(as, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(as, EVAS_HINT_FILL, 0); + elm_actionslider_indicator_pos_set(as, ELM_ACTIONSLIDER_LEFT); + elm_actionslider_magnet_pos_set(as, ELM_ACTIONSLIDER_CENTER| + ELM_ACTIONSLIDER_RIGHT); + elm_actionslider_enabled_pos_set(as, ELM_ACTIONSLIDER_CENTER | + ELM_ACTIONSLIDER_RIGHT); + elm_object_part_text_set(as, "left", NULL); + elm_object_part_text_set(as, "center", "Accept"); + elm_object_part_text_set(as, "right", "Reject"); + evas_object_smart_callback_add(as, "selected", _pos_selected_cb, NULL); + evas_object_show(as); + elm_box_pack_end(bx, as); + + as = elm_actionslider_add(win); + elm_object_style_set(as, "bar"); + evas_object_size_hint_weight_set(as, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(as, EVAS_HINT_FILL, 0); + elm_actionslider_indicator_pos_set(as, ELM_ACTIONSLIDER_LEFT); + elm_actionslider_magnet_pos_set(as, ELM_ACTIONSLIDER_LEFT); + elm_object_part_text_set(as, "left", NULL); + elm_object_part_text_set(as, "center", "Accept"); + elm_object_part_text_set(as, "right", "Reject"); + elm_object_text_set(as, "Go"); + evas_object_smart_callback_add(as, "pos_changed", + _position_change_magnetic_cb, NULL); + evas_object_smart_callback_add(as, "selected", _pos_selected_cb, NULL); + evas_object_show(as); + elm_box_pack_end(bx, as); + + as = elm_actionslider_add(win); + elm_object_style_set(as, "bar"); + elm_object_disabled_set(as, EINA_TRUE); + evas_object_size_hint_weight_set(as, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(as, EVAS_HINT_FILL, 0); + elm_actionslider_indicator_pos_set(as, ELM_ACTIONSLIDER_LEFT); + elm_actionslider_magnet_pos_set(as, ELM_ACTIONSLIDER_LEFT); + elm_object_part_text_set(as, "left", NULL); + elm_object_part_text_set(as, "center", "Accept"); + elm_object_part_text_set(as, "right", "Reject"); + elm_object_text_set(as, "Go"); + evas_object_smart_callback_add(as, "pos_changed", + _position_change_magnetic_cb, NULL); + evas_object_smart_callback_add(as, "selected", _pos_selected_cb, NULL); + evas_object_show(as); + elm_box_pack_end(bx, as); + + as = elm_actionslider_add(win); + evas_object_size_hint_weight_set(as, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(as, EVAS_HINT_FILL, 0); + elm_actionslider_indicator_pos_set(as, ELM_ACTIONSLIDER_LEFT); + elm_actionslider_magnet_pos_set(as, ELM_ACTIONSLIDER_ALL); + elm_object_part_text_set(as, "left", "Left"); + elm_object_part_text_set(as, "center", "Center"); + elm_object_part_text_set(as, "right", "Right"); + elm_object_text_set(as, "Go"); + evas_object_smart_callback_add(as, "selected", _pos_selected_cb, NULL); + evas_object_show(as); + elm_box_pack_end(bx, as); + + as = elm_actionslider_add(win); + evas_object_size_hint_weight_set(as, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(as, EVAS_HINT_FILL, 0); + elm_actionslider_indicator_pos_set(as, ELM_ACTIONSLIDER_CENTER); + elm_actionslider_magnet_pos_set(as, ELM_ACTIONSLIDER_CENTER); + elm_object_part_text_set(as, "left", "Enable"); + elm_object_part_text_set(as, "center", "Magnet"); + elm_object_part_text_set(as, "right", "Disable"); + evas_object_smart_callback_add(as, "pos_changed", + _magnet_enable_disable_cb, NULL); + evas_object_smart_callback_add(as, "selected", _pos_selected_cb, NULL); + evas_object_show(as); + elm_box_pack_end(bx, as); + + evas_object_resize(win, 320, 400); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_anim.c b/src/bin/elementary/test_anim.c new file mode 100644 index 0000000000..24125bcffa --- /dev/null +++ b/src/bin/elementary/test_anim.c @@ -0,0 +1,97 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static const char *names[] = +{ + "bub1", "sh1", + "bub2", "sh2", + "bub3", "sh3", +}; + +static Eina_Bool +_anim_tick(void *data EINA_UNUSED, const Eo_Event *event) +{ + Evas_Object *bub, *sh; + Evas_Coord x, y, w, h, vw, vh; + double t, xx, yy, zz, r, fac; + double lx, ly; + unsigned int i; + + evas_output_viewport_get(evas_object_evas_get(event->obj), 0, 0, &vw, &vh); + r = 48; + t = ecore_loop_time_get(); + fac = 2.0 / (double)((sizeof(names) / sizeof(char *) / 2)); + evas_pointer_canvas_xy_get(evas_object_evas_get(event->obj), &x, &y); + lx = x; + ly = y; + + for (i = 0; i < (sizeof(names) / sizeof(char *) / 2); i++) + { + bub = evas_object_data_get(event->obj, names[i * 2]); + sh = evas_object_data_get(event->obj, names[(i * 2) + 1]); + zz = (((2 + sin(t * 6 + (M_PI * (i * fac)))) / 3) * 64) * 2; + xx = (cos(t * 4 + (M_PI * (i * fac))) * r) * 2; + yy = (sin(t * 6 + (M_PI * (i * fac))) * r) * 2; + + w = zz; + h = zz; + x = (vw / 2) + xx - (w / 2); + y = (vh / 2) + yy - (h / 2); + + evas_object_move(bub, x, y); + evas_object_resize(bub, w, h); + + x = x - ((lx - (x + (w / 2))) / 4); + y = y - ((ly - (y + (h / 2))) / 4); + + evas_object_move(sh, x, y); + evas_object_resize(sh, w, h); + } + return ECORE_CALLBACK_RENEW; +} + +void +test_anim(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bg, *bub, *sh; + char buf[PATH_MAX]; + unsigned int i; + + win = elm_win_add(NULL, "animation", ELM_WIN_BASIC); + elm_win_title_set(win, "Animation"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/rock_01.jpg", elm_app_data_dir_get()); + elm_bg_file_set(bg, buf, NULL); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + snprintf(buf, sizeof(buf), "%s/images/bubble_sh.png", elm_app_data_dir_get()); + for (i = 0; i < (sizeof(names) / sizeof(char *) / 2); i++) + { + sh = evas_object_image_filled_add(evas_object_evas_get(win)); + evas_object_image_file_set(sh, buf, NULL); + evas_object_resize(sh, 64, 64); + evas_object_show(sh); + evas_object_data_set(win, names[(i * 2) + 1], sh); + } + + snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get()); + for (i = 0; i < (sizeof(names) / sizeof(char *) / 2); i++) + { + bub = evas_object_image_filled_add(evas_object_evas_get(win)); + evas_object_image_file_set(bub, buf, NULL); + evas_object_resize(bub, 64, 64); + evas_object_show(bub); + evas_object_data_set(win, names[(i * 2)], bub); + } + + evas_object_resize(win, 480, 800); + evas_object_show(win); + + eo_event_callback_add(win, EFL_ANIMATOR_EVENT_ANIMATOR_TICK, _anim_tick, NULL); +} diff --git a/src/bin/elementary/test_application_server.c b/src/bin/elementary/test_application_server.c new file mode 100644 index 0000000000..d05d74e3ea --- /dev/null +++ b/src/bin/elementary/test_application_server.c @@ -0,0 +1,206 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +typedef struct { + Evas_Object *win, *label; + Eina_Stringshare *view_name; +} App_View_Context; + +static Elm_App_Server *phone_server = NULL, *msg_server = NULL; + +static void _text_update(App_View_Context *ctx, const char *state) +{ + char buffer[1024]; + + if (!ctx->label) + return; + snprintf(buffer, sizeof(buffer), "%s - state=%s", ctx->view_name, state); + elm_object_text_set(ctx->label, buffer); +} + +static void +_window_create(App_View_Context *ctx) +{ + ctx->win = elm_win_util_standard_add("app_view", ctx->view_name); + + ctx->label = elm_label_add(ctx->win); + evas_object_size_hint_weight_set(ctx->label, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_data_set(ctx->win, "label", ctx->label); + + _text_update(ctx, "alive"); + + elm_win_resize_object_add(ctx->win, ctx->label); + evas_object_show(ctx->label); + + evas_object_resize(ctx->win, 400, 300); + evas_object_show(ctx->win); +} + +static Eina_Bool +_close_cb(void *data, const Eo_Event *event) +{ + App_View_Context *ctx = data; + if (ctx->win) + evas_object_del(ctx->win); + eo_del(event->obj); + return EINA_TRUE; +} + +static Eina_Bool +_pause_cb(void *data, const Eo_Event *event EINA_UNUSED) +{ + App_View_Context *ctx = data; + _text_update(ctx, "paused"); + return EINA_TRUE; +} + +static Eina_Bool +_resume_cb(void *data, const Eo_Event *event) +{ + App_View_Context *ctx = data; + + //shallow state + if (!ctx->win) + { + _window_create(ctx); + elm_app_server_view_window_set(event->obj, ctx->win); + } + + _text_update(ctx, "alive"); + return EINA_TRUE; +} + +static Eina_Bool +_view_del_cb(void *data, const Eo_Event *event) +{ + App_View_Context *ctx = data; + + if (ctx->win) + evas_object_del(ctx->win); + elm_app_server_view_window_set(event->obj, NULL); + eina_stringshare_del(ctx->view_name); + free(ctx); + return EINA_TRUE; +} + +static Elm_App_Server_View * +_create_view_cb(Elm_App_Server *app_server, const Eina_Value *args EINA_UNUSED, Eina_Stringshare **error_name, Eina_Stringshare **error_message EINA_UNUSED) +{ + Elm_App_Server_View *view; + const char *id = NULL, *pkg = NULL; + App_View_Context *ctx; + + ctx = calloc(1, sizeof(App_View_Context)); + if (!ctx) + { + *error_name = eina_stringshare_add("No memory available"); + return NULL; + } + + view = eo_add(ELM_APP_SERVER_VIEW_CLASS, app_server, elm_app_server_view_id_set(eo_self, NULL)); + + id = elm_app_server_view_id_get(view); + pkg = elm_app_server_package_get(app_server); + ctx->view_name = eina_stringshare_printf("%s %s", pkg, id); + + _window_create(ctx); + + elm_app_server_view_title_set(view, ctx->view_name); + elm_app_server_view_new_events_set(view, 5); + elm_app_server_view_window_set(view, ctx->win); + elm_app_server_view_resume(view); + eo_event_callback_add(view, ELM_APP_SERVER_VIEW_EVENT_CLOSED, _close_cb, ctx); + eo_event_callback_add(view, ELM_APP_SERVER_VIEW_EVENT_PAUSED, _pause_cb, ctx); + eo_event_callback_add(view, ELM_APP_SERVER_VIEW_EVENT_RESUMED, _resume_cb, ctx); + eo_event_callback_add(view, EO_BASE_EVENT_DEL, _view_del_cb, ctx); + + return view; +} + +static Eina_Bool +_terminate_cb(void *data EINA_UNUSED, const Eo_Event *event) +{ + const char *title = NULL; + + printf("terminate cb\n"); + elm_app_server_save(event->obj); + title = elm_app_server_title_get(event->obj); + + printf("Closing: %s\n", title); + eo_unref(event->obj); + return EINA_TRUE; +} + +Elm_App_Server * +test_application_server_common(const char *pkg) +{ + Eina_Iterator *views_iter = NULL; + Elm_App_Server_View *view; + Elm_App_Server *server; + + server = eo_add(ELM_APP_SERVER_CLASS, NULL, elm_app_server_constructor(eo_self, pkg, _create_view_cb)); + elm_app_server_title_set(server, pkg); + views_iter = elm_app_server_views_get(server); + eo_event_callback_add(server, ELM_APP_SERVER_EVENT_TERMINATE, _terminate_cb, NULL); + + //views create in shallow state + EINA_ITERATOR_FOREACH(views_iter, view) + { + App_View_Context *ctx; + const char *id = NULL; + + ctx = calloc(1, sizeof(App_View_Context)); + + id = elm_app_server_view_id_get(view); + ctx->view_name = eina_stringshare_printf("%s %s", pkg, id); + + eo_event_callback_add(view, ELM_APP_SERVER_VIEW_EVENT_CLOSED, _close_cb, ctx); + eo_event_callback_add(view, ELM_APP_SERVER_VIEW_EVENT_PAUSED, _pause_cb, ctx); + eo_event_callback_add(view, ELM_APP_SERVER_VIEW_EVENT_RESUMED, _resume_cb, ctx); + eo_event_callback_add(view, EO_BASE_EVENT_DEL, _view_del_cb, ctx); + } + eina_iterator_free(views_iter); + + return server; +} + +static Eina_Bool +_server_del_cb(void *data, const Eo_Event *event EINA_UNUSED) +{ + Elm_App_Server **server = data; + *server = NULL; + return EINA_TRUE; +} + +void +test_application_server_phone(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + if (phone_server) + { + printf("Phone already running\n"); + return; + } + printf("Starting phone\n"); + phone_server = test_application_server_common("org.enlightenment.phone"); + eo_event_callback_add(phone_server, EO_BASE_EVENT_DEL, _server_del_cb, &phone_server); +} + +void +test_application_server_message(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + if (msg_server) + { + printf("Message already running\n"); + return; + } + printf("Starting message\n"); + msg_server = test_application_server_common( "org.enlightenment.message"); + eo_event_callback_add(msg_server, EO_BASE_EVENT_DEL, _server_del_cb, &msg_server); +} diff --git a/src/bin/elementary/test_bg.c b/src/bin/elementary/test_bg.c new file mode 100644 index 0000000000..995ae12971 --- /dev/null +++ b/src/bin/elementary/test_bg.c @@ -0,0 +1,270 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void +_cb_size_radio_changed(void *data, Evas_Object *obj, void *event EINA_UNUSED) +{ + Evas_Object *o_bg = data; + int size; + size = elm_radio_value_get((Evas_Object *)obj); + elm_bg_load_size_set(o_bg, size, size); +} + +static void +_cb_radio_changed(void *data, Evas_Object *obj, void *event EINA_UNUSED) +{ + Evas_Object *o_bg = data; + + elm_bg_option_set(o_bg, elm_radio_value_get((Evas_Object *)obj)); +} + +static void +_cb_overlay_changed(void *data, Evas_Object *obj, void *event EINA_UNUSED) +{ + Evas_Object *o_bg = data; + + if (elm_check_state_get(obj)) + { + Evas_Object *parent, *over; + char buff[PATH_MAX]; + + snprintf(buff, sizeof(buff), "%s/objects/test.edj", elm_app_data_dir_get()); + parent = elm_object_parent_widget_get(o_bg); + over = edje_object_add(evas_object_evas_get(parent)); + edje_object_file_set(over, buff, "bg_overlay"); + elm_object_part_content_set(o_bg, "overlay", over); + } + else + elm_object_part_content_set(o_bg, "overlay", NULL); +} + +static void +_cb_color_changed(void *data, Evas_Object *obj, void *event EINA_UNUSED) +{ + Evas_Object *o_bg = data; + double val = 0.0; + + val = elm_spinner_value_get(obj); + if (val == 1.0) + elm_bg_color_set(o_bg, 255, 255, 255); + else if (val == 2.0) + elm_bg_color_set(o_bg, 255, 0, 0); + else if (val == 3.0) + elm_bg_color_set(o_bg, 0, 0, 255); + else if (val == 4.0) + elm_bg_color_set(o_bg, 0, 255, 0); +} + +void +test_bg_plain(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bg; + + win = elm_win_add(NULL, "bg-plain", ELM_WIN_BASIC); + elm_win_title_set(win, "Bg Plain"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + /* allow bg to expand in x & y */ + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + /* set size hints. a minimum size for the bg. this should propagate back + * to the window thus limiting its size based off the bg as the bg is one + * of the window's resize objects. */ + evas_object_size_hint_min_set(bg, 160, 160); + /* and set a maximum size. not needed very often. normally used together + * with evas_object_size_hint_min_set() at the same size to make a + * window not resizable */ + evas_object_size_hint_max_set(bg, 640, 640); + /* and now just resize the window to a size you want. normally widgets + * will determine the initial size though */ + evas_object_resize(win, 320, 320); + /* and show the window */ + evas_object_show(win); +} + +void +test_bg_image(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bg; + Evas_Object *box, *hbox, *o_bg; + Evas_Object *rd, *rdg; + char buf[PATH_MAX]; + + win = elm_win_add(NULL, "bg-image", ELM_WIN_BASIC); + elm_win_title_set(win, "Bg Image"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + o_bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_bg_file_set(o_bg, buf, NULL); + evas_object_size_hint_weight_set(o_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(o_bg, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, o_bg); + + hbox = elm_box_add(win); + elm_box_horizontal_set(hbox, EINA_TRUE); + evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_size_hint_align_set(hbox, EVAS_HINT_FILL, EVAS_HINT_FILL); + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, 50); + elm_object_text_set(rd, "50 x 50"); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_smart_callback_add(rd, "changed", _cb_size_radio_changed, o_bg); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + rdg = rd; + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, 100); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "100 x 100"); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_smart_callback_add(rd, "changed", _cb_size_radio_changed, o_bg); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, 200); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "200 x 200"); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_smart_callback_add(rd, "changed", _cb_size_radio_changed, o_bg); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + + elm_radio_value_set(rdg, 200); + + elm_box_pack_end(box, hbox); + evas_object_show(hbox); + + evas_object_show(o_bg); + evas_object_size_hint_min_set(bg, 160, 160); + evas_object_size_hint_max_set(bg, 640, 640); + evas_object_resize(win, 320, 320); + evas_object_show(win); +} + +void +test_bg_options(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bg; + Evas_Object *box, *hbox, *o_bg; + Evas_Object *rd, *rdg; + char buf[PATH_MAX]; + + win = elm_win_add(NULL, "bg-options", ELM_WIN_BASIC); + elm_win_title_set(win, "Bg Options"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + o_bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_bg_file_set(o_bg, buf, NULL); + evas_object_size_hint_weight_set(o_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(o_bg, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, o_bg); + evas_object_show(o_bg); + + hbox = elm_box_add(win); + elm_box_horizontal_set(hbox, EINA_TRUE); + evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_size_hint_align_set(hbox, EVAS_HINT_FILL, EVAS_HINT_FILL); + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, ELM_BG_OPTION_CENTER); + elm_object_text_set(rd, "Center"); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_smart_callback_add(rd, "changed", _cb_radio_changed, o_bg); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + rdg = rd; + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, ELM_BG_OPTION_SCALE); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "Scale"); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_smart_callback_add(rd, "changed", _cb_radio_changed, o_bg); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, ELM_BG_OPTION_STRETCH); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "Stretch"); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_smart_callback_add(rd, "changed", _cb_radio_changed, o_bg); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, ELM_BG_OPTION_TILE); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "Tile"); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_smart_callback_add(rd, "changed", _cb_radio_changed, o_bg); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + + elm_radio_value_set(rdg, ELM_BG_OPTION_SCALE); + + rd = elm_check_add(win); + elm_object_text_set(rd, "Show Overlay"); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_smart_callback_add(rd, "changed", _cb_overlay_changed, o_bg); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + + /* color choices ... this is ghetto, but we don't have a 'colorpicker' + * widget yet :( */ + rd = elm_spinner_add(win); + elm_object_tooltip_text_set(rd, "The background's part being affected<br/>" + "here may be seen only if you enlarge<br/>" + "the window and mark the 'Center' radio."); + elm_object_style_set(rd, "vertical"); + elm_spinner_min_max_set(rd, 1, 4); + elm_spinner_label_format_set(rd, "%.0f"); + elm_spinner_editable_set(rd, EINA_FALSE); + elm_spinner_special_value_add(rd, 1, "White"); + elm_spinner_special_value_add(rd, 2, "Red"); + elm_spinner_special_value_add(rd, 3, "Blue"); + elm_spinner_special_value_add(rd, 4, "Green"); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(rd, "changed", _cb_color_changed, o_bg); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + + elm_box_pack_end(box, hbox); + evas_object_show(hbox); + + evas_object_size_hint_min_set(bg, 160, 160); + evas_object_size_hint_max_set(bg, 640, 640); + evas_object_resize(win, 320, 320); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_box.c b/src/bin/elementary/test_box.c new file mode 100644 index 0000000000..6da21d63c4 --- /dev/null +++ b/src/bin/elementary/test_box.c @@ -0,0 +1,882 @@ +#include "test.h" +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +#define ICON_MAX 24 + +typedef enum +{ + BOX_PACK_POSITION_START, + BOX_PACK_POSITION_BEFORE, + BOX_PACK_POSITION_AFTER, + BOX_PACK_POSITION_END +} Box_Pack_Position; + +struct _api_data +{ + unsigned int state; /* What state we are testing */ + void *box; /* Use this to get box content */ +}; +typedef struct _api_data api_data; + +enum _api_state +{ + BOX_PACK_START, + BOX_PACK_BEFORE, + BOX_PACK_AFTER, + BOX_PADDING_SET, + BOX_ALIGN_SET, + BOX_HOMOGENEOUS_SET, + BOX_UNPACK_ALL, + BOX_CLEAR, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + const Eina_List *items = elm_box_children_get(api->box); + if (!eina_list_count(items)) + return; + + /* use elm_box_children_get() to get list of children */ + switch(api->state) + { /* Put all api-changes under switch */ + case BOX_PACK_START: /* Move last item to beginning */ + elm_box_unpack(api->box, eina_list_data_get(eina_list_last(items))); + elm_box_pack_start(api->box, eina_list_data_get(eina_list_last(items))); + break; + + case BOX_PACK_BEFORE: + if (eina_list_count(items) > 1) + { /* Put last item before the one preceding it */ + elm_box_unpack(api->box, eina_list_data_get(eina_list_last(items))); + elm_box_pack_before(api->box, + eina_list_data_get(eina_list_last(items)), + eina_list_nth(items, eina_list_count(items)-2)); + } + break; + + case BOX_PACK_AFTER: + if (eina_list_count(items) > 1) + { /* Put item before last to last */ + elm_box_unpack(api->box, eina_list_nth(items, + eina_list_count(items)-2)); + elm_box_pack_after(api->box, + eina_list_nth(items, eina_list_count(items)-2), + eina_list_data_get(eina_list_last(items))); + } + break; + + case BOX_PADDING_SET: + elm_box_padding_set(api->box, 30, 15); + break; + + case BOX_ALIGN_SET: + elm_box_align_set(api->box, 0.25, 0.75); + break; + + case BOX_HOMOGENEOUS_SET: + elm_box_homogeneous_set(api->box, EINA_TRUE); + break; + + case BOX_UNPACK_ALL: + { + Eina_List *l; + Evas_Object *data; + elm_box_unpack_all(api->box); + EINA_LIST_REVERSE_FOREACH(items, l, data) + elm_box_pack_end(api->box, data); + } + break; + + case BOX_CLEAR: + elm_box_clear(api->box); + break; + + case API_STATE_LAST: + + break; + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(obj, str); + elm_object_disabled_set(obj, a->state == API_STATE_LAST); +} + +static void +_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + free(data); +} + +void +test_box_vert(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *ic, *bxx, *bt; + char buf[PATH_MAX]; + api_data *api = calloc(1, sizeof(api_data)); + + win = elm_win_util_standard_add("box-vert", "Box Vert"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bxx = elm_box_add(win); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bxx); + evas_object_show(bxx); + + bx = elm_box_add(win); + api->box = bx; + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Next API function"); + evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, bt); + elm_object_disabled_set(bt, api->state == API_STATE_LAST); + evas_object_show(bt); + + elm_box_pack_end(bxx, bx); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/icon_01.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_align_set(ic, 0.5, 0.5); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/icon_02.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_align_set(ic, 0.0, 0.5); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/icon_03.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_align_set(ic, EVAS_HINT_EXPAND, 0.5); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + evas_object_show(win); +} + +static void +_del_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + elm_box_unpack(data, obj); + evas_object_move(obj, 0, 0); + evas_object_color_set(obj, 128, 64, 0, 128); + evas_object_del(obj); +} + +void +test_box_vert2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bt; + + win = elm_win_util_standard_add("box-vert2", "Box Vert 2"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + elm_box_padding_set(bx, 10, 10); + evas_object_show(bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 1"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_smart_callback_add(bt, "clicked", _del_cb, bx); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 2"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_smart_callback_add(bt, "clicked", _del_cb, bx); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 3"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_smart_callback_add(bt, "clicked", _del_cb, bx); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 4"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_smart_callback_add(bt, "clicked", _del_cb, bx); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 5"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_smart_callback_add(bt, "clicked", _del_cb, bx); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + evas_object_show(win); +} + +void +test_box_horiz(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *ic, *bxx, *bt; + char buf[PATH_MAX]; + api_data *api = calloc(1, sizeof(api_data)); + + win = elm_win_util_standard_add("box-horiz", "Box Horiz"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bxx = elm_box_add(win); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bxx); + evas_object_show(bxx); + + bx = elm_box_add(win); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + api->box = bx; + evas_object_show(bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Next API function"); + evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, bt); + elm_object_disabled_set(bt, api->state == API_STATE_LAST); + evas_object_show(bt); + + elm_box_pack_end(bxx, bx); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/icon_01.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_align_set(ic, 0.5, 0.5); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/icon_02.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_align_set(ic, 0.5, 0.0); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/icon_03.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_align_set(ic, 0.0, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + evas_object_show(win); +} + +static Eina_Bool radio_index[ICON_MAX]; + +static int +_index_get(void) +{ + int i; + for (i = 0; i < ICON_MAX; i++) + { + if (!radio_index[i]) + { + radio_index[i] = EINA_TRUE; + return i; + } + + } + return -1; +} + +static void +_index_remove(int i) +{ + if (i >= ICON_MAX) return; + radio_index[i] = EINA_FALSE; +} + +static void +_index_clear() +{ + int i; + for (i = 0; i < ICON_MAX; i++) + radio_index[i] = EINA_FALSE; +} + +static Evas_Object * +_radio_new(Evas_Object *obj) +{ + Evas_Object *ic, *rd; + int idx; + char buf[PATH_MAX]; + Evas_Object *rdg; + + idx = _index_get(); + if (idx == -1) return NULL; + + ic = elm_icon_add(obj); + snprintf(buf, sizeof(buf), "%s/images/icon_%02d.png", + elm_app_data_dir_get(), idx); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + + rd = elm_radio_add(obj); + elm_radio_state_value_set(rd, idx); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, 0.5); + elm_object_part_content_set(rd, "icon", ic); + + rdg = evas_object_data_get(obj, "radio-group"); + if (rdg) elm_radio_group_add(rd, rdg); + + evas_object_show(rd); + evas_object_show(ic); + + return rd; +} + +static void +_pack_start_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *rd; + if (!data) return; + + rd = _radio_new(data); + if (!rd) return; + elm_box_pack_start(data, rd); +} + +static void +_pack_before_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *rd, *selected_rd, *rdg; + if (!data) return; + + rdg = evas_object_data_get(data, "radio-group"); + if (!rdg) return; + + selected_rd = elm_radio_selected_object_get(rdg); + if (!selected_rd || (selected_rd == rdg)) return; + + rd = _radio_new(data); + if (!rd) return; + elm_box_pack_before(data, rd, selected_rd); +} + +static void +_pack_after_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *rd, *selected_rd, *rdg; + if (!data) return; + + rdg = evas_object_data_get(data, "radio-group"); + if (!rdg) return; + + selected_rd = elm_radio_selected_object_get(rdg); + if (!selected_rd || (selected_rd == rdg)) return; + + rd = _radio_new(data); + if (!rd) return; + elm_box_pack_after(data, rd, selected_rd); +} + +static void +_pack_end_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *rd; + if (!data) return; + + rd = _radio_new(data); + if (!rd) return; + elm_box_pack_end(data, rd); +} + +static void +_unpack_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *rdg, *selected_rd; + if (!data) return; + + rdg = evas_object_data_get(data, "radio-group"); + if (!rdg) return; + + selected_rd = elm_radio_selected_object_get(rdg); + if (selected_rd == rdg) return; + + _index_remove(elm_radio_value_get(selected_rd)); + elm_box_unpack(data, selected_rd); + evas_object_del(selected_rd); + elm_radio_value_set(rdg, -1); +} + +static void +_unpack_all_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *radio, *rdg; + Eina_List *rl, *l; + if (!data) return; + + rdg = evas_object_data_get(data, "radio-group"); + if (!rdg) return; + + _index_clear(); + rl = elm_box_children_get(data); + EINA_LIST_FOREACH(rl, l, radio) + { + if (radio != rdg) + evas_object_del(radio); + } + elm_box_unpack_all(data); + elm_radio_value_set(rdg, -1); +} + +void +test_box_pack(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *sc, *bt; + Evas_Object *box, *lbox, *rbox; + Evas_Object *rd, *rdg = NULL; + int i; + + win = elm_win_util_standard_add("box-pack", "Box Pack"); + elm_win_autodel_set(win, EINA_TRUE); + + box = elm_box_add(win); + elm_box_horizontal_set(box, EINA_TRUE); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + // left side + lbox = elm_box_add(win); + evas_object_size_hint_weight_set(lbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(lbox, EVAS_HINT_FILL, EVAS_HINT_FILL); + + sc = elm_scroller_add(win); + elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL); + + rdg = elm_radio_add(win); /* a radio for easy group handling */ + elm_radio_state_value_set(rdg, -1); + evas_object_data_set(lbox, "radio-group", rdg); + + for (i = 0; i < 3; i++) + { + rd = _radio_new(lbox); + elm_box_pack_end(lbox, rd); + } + + elm_object_content_set(sc, lbox); + evas_object_show(lbox); + elm_box_pack_end(box, sc); + evas_object_show(sc); + + // right side + rbox = elm_box_add(win); + evas_object_size_hint_weight_set(rbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(rbox, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(rbox); + elm_box_pack_end(box, rbox); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Pack Start"); + evas_object_show(bt); + elm_box_pack_end(rbox, bt); + evas_object_smart_callback_add(bt, "clicked", _pack_start_btn_cb, lbox); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Pack Before"); + evas_object_show(bt); + elm_box_pack_end(rbox, bt); + evas_object_smart_callback_add(bt, "clicked", _pack_before_btn_cb, lbox); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Pack After"); + evas_object_show(bt); + elm_box_pack_end(rbox, bt); + evas_object_smart_callback_add(bt, "clicked", _pack_after_btn_cb, lbox); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Pack End"); + evas_object_show(bt); + elm_box_pack_end(rbox, bt); + evas_object_smart_callback_add(bt, "clicked", _pack_end_btn_cb, lbox); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Unpack"); + evas_object_show(bt); + elm_box_pack_end(rbox, bt); + evas_object_smart_callback_add(bt, "clicked", _unpack_btn_cb, lbox); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Unpack All"); + evas_object_show(bt); + elm_box_pack_end(rbox, bt); + evas_object_smart_callback_add(bt, "clicked", _unpack_all_btn_cb, lbox); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} + +static void +_cb_check_changed(void *data, Evas_Object *obj, void *event EINA_UNUSED) +{ + Eina_Bool homo; + Evas_Object *box = data; + + homo = elm_check_state_get(obj); + elm_box_homogeneous_set(box, homo); +} + +void +test_box_homo(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win; + Evas_Object *box, *o_bg; + Evas_Object *rd; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("box-homogeneous", "Box Homogeneous"); + elm_win_autodel_set(win, EINA_TRUE); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + o_bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/twofish.jpg", elm_app_data_dir_get()); + elm_bg_file_set(o_bg, buf, NULL); + evas_object_size_hint_weight_set(o_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(o_bg, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, o_bg); + + rd = elm_check_add(win); + elm_object_text_set(rd, "Homogeneous"); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_smart_callback_add(rd, "changed", _cb_check_changed, box); + elm_box_pack_end(box, rd); + evas_object_show(rd); + evas_object_show(o_bg); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} + +typedef struct +{ + Eina_List *transitions; + Evas_Object *box; + Evas_Object_Box_Layout last_layout; +} Transitions_Data; + +static void +_test_box_transition_change(void *data) +{ + Transitions_Data *tdata = data; + Elm_Box_Transition *layout_data; + Evas_Object_Box_Layout next_layout; + + if (!data) return; + next_layout = eina_list_data_get(tdata->transitions); + layout_data = elm_box_transition_new(2.0, tdata->last_layout, + NULL, NULL, next_layout, NULL, NULL, + _test_box_transition_change, tdata); + elm_box_layout_set(tdata->box, elm_box_layout_transition, layout_data, elm_box_transition_free); + tdata->last_layout = next_layout; + + tdata->transitions = eina_list_demote_list(tdata->transitions, tdata->transitions); +} + +static void +_win_del(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Transitions_Data *tdata = data; + if (!data) return; + free(tdata); +} + +void +test_box_transition(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bt; + Transitions_Data *tdata; + + win = elm_win_util_standard_add("box-transition", "Box Transition"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 1"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(bt, "clicked", _del_cb, bx); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 2"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(bt, "clicked", _del_cb, bx); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 3"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(bt, "clicked", _del_cb, bx); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + tdata = calloc(1, sizeof(Transitions_Data)); + tdata->box = bx; + tdata->last_layout = evas_object_box_layout_horizontal; + tdata->transitions = eina_list_append(tdata->transitions, + evas_object_box_layout_vertical); + tdata->transitions = eina_list_append(tdata->transitions, + evas_object_box_layout_horizontal); + tdata->transitions = eina_list_append(tdata->transitions, + evas_object_box_layout_stack); + tdata->transitions = eina_list_append(tdata->transitions, + evas_object_box_layout_homogeneous_vertical); + tdata->transitions = eina_list_append(tdata->transitions, + evas_object_box_layout_homogeneous_horizontal); + tdata->transitions = eina_list_append(tdata->transitions, + evas_object_box_layout_flow_vertical); + tdata->transitions = eina_list_append(tdata->transitions, + evas_object_box_layout_flow_horizontal); + tdata->transitions = eina_list_append(tdata->transitions, + evas_object_box_layout_stack); + + evas_object_smart_callback_add(win, "delete,request", _win_del, tdata); + elm_box_layout_set(bx, evas_object_box_layout_horizontal, NULL, NULL); + _test_box_transition_change(tdata); + + evas_object_resize(win, 300, 300); + evas_object_show(win); +} + +typedef struct _Box_Align_Data Box_Align_Data; +struct _Box_Align_Data +{ + Evas_Object *hor_box; // target box horizontal + Evas_Object *vert_box; // target box vertical + double hor; // horizontal slider + double vert; // vertical slider +}; + +static void +_box_align_win_del_cb(void *data, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + free(data); +} + +static void +_hor_slider_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Box_Align_Data *bdata = data; + + bdata->hor = elm_slider_value_get(obj); + printf("box align: %0.2f %0.2f\n", bdata->hor, bdata->vert); + elm_box_align_set(bdata->hor_box, bdata->hor, bdata->vert); + elm_box_align_set(bdata->vert_box, bdata->hor, bdata->vert); +} + +static void +_vert_slider_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Box_Align_Data *bdata = data; + + bdata->vert = elm_slider_value_get(obj); + printf("box align: %0.2f %0.2f\n", bdata->hor, bdata->vert); + elm_box_align_set(bdata->hor_box, bdata->hor, bdata->vert); + elm_box_align_set(bdata->vert_box, bdata->hor, bdata->vert); +} + +void +_description_add(Evas_Object *bx_out, Box_Align_Data *bdata) +{ + Evas_Object *fr, *bx, *lb, *sl, *tb; + + // description + fr = elm_frame_add(bx_out); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx_out, fr); + elm_object_text_set(fr, "Description"); + evas_object_show(fr); + + bx = elm_box_add(fr); + elm_object_content_set(fr, bx); + evas_object_show(bx); + + lb = elm_label_add(fr); + elm_object_text_set(lb, "This test shows how elm_box_align_set() works."); + evas_object_size_hint_align_set(lb, 0.0, EVAS_HINT_FILL); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + tb = elm_table_add(bx); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + lb = elm_label_add(tb); + elm_object_text_set(lb, " Horizontal "); + elm_table_pack(tb, lb, 0, 0, 1, 1); + evas_object_show(lb); + + lb = elm_label_add(tb); + elm_object_text_set(lb, " Vertical "); + elm_table_pack(tb, lb, 0, 1, 1, 1); + evas_object_show(lb); + + sl = elm_slider_add(fr); + elm_slider_unit_format_set(sl, "%1.2f"); + elm_slider_min_max_set(sl, 0.0, 1.0); + elm_slider_value_set(sl, 0.5); + bdata->hor = 0.5; + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, sl, 1, 0, 1, 1); + evas_object_show(sl); + evas_object_smart_callback_add(sl, "changed", _hor_slider_changed_cb, bdata); + + sl = elm_slider_add(fr); + elm_slider_unit_format_set(sl, "%1.2f"); + elm_slider_min_max_set(sl, 0.0, 1.0); + elm_slider_value_set(sl, 0.5); + bdata->vert = 0.5; + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, sl, 1, 1, 1, 1); + evas_object_show(sl); + evas_object_smart_callback_add(sl, "changed", _vert_slider_changed_cb, bdata); +} + +void +_align_box_add(Evas_Object *bx_out, Box_Align_Data *bdata) +{ + Evas_Object *bx, *sp, *bt; + + // test box - vertical + bdata->vert_box = bx = elm_box_add(bx_out); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx_out, bx); + elm_box_align_set(bx, 0.5, 0.5); + evas_object_show(bx); + + bt = elm_button_add(bx); + elm_object_text_set(bt, "Button 1"); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(bx); + elm_object_text_set(bt, "Button 2"); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + // separator + sp = elm_separator_add(bx_out); + elm_separator_horizontal_set(sp, EINA_TRUE); + elm_box_pack_end(bx_out, sp); + evas_object_show(sp); + + // test box - horizontal + bdata->hor_box = bx = elm_box_add(bx_out); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx_out, bx); + elm_box_align_set(bx, 0.5, 0.5); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + bt = elm_button_add(bx); + elm_object_text_set(bt, "Button 1"); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(bx); + elm_object_text_set(bt, "Button 2"); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); +} +void +test_box_align(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx_out; + Box_Align_Data *bdata= (Box_Align_Data *)calloc(1, sizeof(Box_Align_Data)); + + win = elm_win_util_standard_add("box-align", "Box Align"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, + _box_align_win_del_cb, bdata); + + bx_out = elm_box_add(win); + evas_object_size_hint_weight_set(bx_out, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx_out); + evas_object_show(bx_out); + + _description_add(bx_out, bdata); + _align_box_add(bx_out, bdata); + + evas_object_resize(win, 300, 400); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_bubble.c b/src/bin/elementary/test_bubble.c new file mode 100644 index 0000000000..497ab2f78d --- /dev/null +++ b/src/bin/elementary/test_bubble.c @@ -0,0 +1,176 @@ +#include "test.h" +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +#include "test_explode.h" + +static void +_print_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("bubble clicked\n"); +} + +struct _api_data +{ + unsigned int state; /* What state we are testing */ + Evas_Object *win; /* Parent Window of widgets */ + void *box; /* Use this to get box content */ +}; +typedef struct _api_data api_data; + +enum _api_state +{ + BUBBLE_SET_CORNER_1, + BUBBLE_SET_CORNER_2, + BUBBLE_SET_ICON_CONTENT, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + const Eina_List *items = elm_box_children_get(api->box); + if (!eina_list_count(items)) + return; + + switch(api->state) + { /* Put all api-changes under switch */ + case BUBBLE_SET_CORNER_1: + elm_bubble_pos_set(eina_list_nth(items, 0), ELM_BUBBLE_POS_BOTTOM_LEFT); + elm_object_text_set(elm_object_content_get(eina_list_nth(items, 0)), + "Corner: base (bottom-left) - with icon"); + elm_bubble_pos_set(eina_list_nth(items, 1), ELM_BUBBLE_POS_TOP_RIGHT); + elm_object_text_set(elm_object_content_get(eina_list_nth(items, 1)), + "Corner: base (top-right) - no icon"); + break; + + case BUBBLE_SET_CORNER_2: + elm_bubble_pos_set(eina_list_nth(items, 0), ELM_BUBBLE_POS_TOP_RIGHT); + elm_object_text_set(elm_object_content_get(eina_list_nth(items, 0)), + "Corner: base (top-right) - with icon"); + elm_bubble_pos_set(eina_list_nth(items, 1), ELM_BUBBLE_POS_BOTTOM_LEFT); + elm_object_text_set(elm_object_content_get(eina_list_nth(items, 1)), + "Corner: base (bottom-left) - no icon"); + break; + + case BUBBLE_SET_ICON_CONTENT: + { + char buf[PATH_MAX]; + Evas_Object *ct, *ic = elm_icon_add(api->win); + + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + elm_object_content_set(eina_list_nth(items, 0), ic); + ct = elm_label_add(api->win); + elm_object_text_set(ct, "Using icon as top-bubble content"); + elm_object_content_set(eina_list_nth(items, 1), ct); + evas_object_size_hint_align_set(ic, 0.5, 0.5); + evas_object_show(ic); + } + break; + + case API_STATE_LAST: + + break; + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(obj, str); + elm_object_disabled_set(obj, a->state == API_STATE_LAST); +} + +static void +_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + free(data); +} + +void +test_bubble(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *ic, *bb, *ct, *bxx, *bt; + char buf[PATH_MAX]; + api_data *api = calloc(1, sizeof(api_data)); + + win = elm_win_util_standard_add("bubble", "Bubble"); + explode_win_enable(win); + api->win = win; + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bxx = elm_box_add(win); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bxx); + evas_object_show(bxx); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + api->box = bx; + evas_object_show(bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Next API function"); + evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, bt); + elm_object_disabled_set(bt, api->state == API_STATE_LAST); + evas_object_show(bt); + + elm_box_pack_end(bxx, bx); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1); + + bb = elm_bubble_add(win); + elm_object_text_set(bb, "Message 1"); + elm_object_part_text_set(bb, "info", "Corner: bottom_right"); + elm_object_part_content_set(bb, "icon", ic); + elm_bubble_pos_set(bb, ELM_BUBBLE_POS_BOTTOM_RIGHT); + evas_object_smart_callback_add(bb, "clicked", _print_clicked, NULL); + evas_object_show(ic); + evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ct = elm_label_add(win); + elm_object_text_set(ct, + "\"The future of the art: R or G or B?\", by Rusty"); + elm_object_content_set(bb, ct); + + elm_box_pack_end(bx, bb); + evas_object_show(bb); + + bb = elm_bubble_add(win); + elm_object_text_set(bb, "Message 2"); + elm_object_part_text_set(bb, "info", "10:32 4/11/2008"); + evas_object_smart_callback_add(bb, "clicked", _print_clicked, NULL); + evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ct = elm_label_add(win); + elm_object_text_set(ct, "Corner: base (top-left) - no icon"); + elm_object_content_set(bb, ct); + + elm_box_pack_end(bx, bb); + evas_object_show(bb); + + evas_object_show(win); +} diff --git a/src/bin/elementary/test_button.c b/src/bin/elementary/test_button.c new file mode 100644 index 0000000000..b7e4288d7c --- /dev/null +++ b/src/bin/elementary/test_button.c @@ -0,0 +1,205 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void +_bt_repeated(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + static int count; + char buf[16]; + + snprintf(buf, sizeof(buf), "count=%d", count++); + if (count >= 10000) + count = 0; + elm_object_text_set(obj, buf); +} + +static void +_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + int param = (int)(uintptr_t)(data); + + printf("clicked event on Button:%d\n", param); +} + +#define NUM_LABEL 4 +const char *btn_label[NUM_LABEL] = +{ + "Label Only", "Label Only Test", "Label Only Test 2", "Short" +}; + +static void +_bt_clicked_label_change_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + static int i = 1; + elm_object_text_set(obj, btn_label[i]); + i++; + if (i >= NUM_LABEL) i = 0; +} + +static void +_bt_unpressed(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + int param = (int)(uintptr_t)(data); + + printf("unpressed event on Button:%d\n", param); +} + +void +test_button(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *scr, *bx, *ic, *bt; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("buttons", "Buttons"); + elm_win_autodel_set(win, EINA_TRUE); + + scr = elm_scroller_add(win); + elm_scroller_bounce_set(scr, EINA_FALSE, EINA_TRUE); + elm_scroller_policy_set(scr, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO); + evas_object_size_hint_weight_set(scr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, scr); + evas_object_show(scr); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_content_set(scr, bx); + evas_object_show(bx); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + bt = elm_button_add(win); + elm_object_text_set(bt, "Icon sized to button"); + elm_object_part_content_set(bt, "icon", ic); + evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)1); + evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)1); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + ic = elm_icon_add(bx); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + bt = elm_button_add(win); + elm_object_text_set(bt, "Icon no scale"); + elm_object_part_content_set(bt, "icon", ic); + evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)2); + evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)2); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + bt = elm_button_add(win); + elm_object_text_set(bt, "Disabled Button"); + elm_object_part_content_set(bt, "icon", ic); + elm_object_disabled_set(bt, EINA_TRUE); + evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)3); + evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)3); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + bt = elm_button_add(win); + elm_object_part_content_set(bt, "icon", ic); + elm_object_disabled_set(bt, EINA_TRUE); + evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)4); + evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)4); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Label Only"); + evas_object_smart_callback_add(bt, "clicked", + _bt_clicked_label_change_cb, NULL); + evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)5); + elm_box_pack_end(bx, bt); + evas_object_smart_callback_add(bt, "repeated", _bt_repeated, NULL); + elm_button_autorepeat_set(bt, EINA_TRUE); + elm_button_autorepeat_initial_timeout_set(bt, 2.0); + elm_button_autorepeat_gap_timeout_set(bt, 0.5); + evas_object_show(bt); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + bt = elm_button_add(win); + elm_object_part_content_set(bt, "icon", ic); + evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)6); + evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)6); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_style_set(bt, "anchor"); + elm_object_text_set(bt, "Anchor style"); + evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)7); + evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)7); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + bt = elm_button_add(win); + elm_object_style_set(bt, "anchor"); + elm_object_text_set(bt, "Icon sized to button"); + elm_object_part_content_set(bt, "icon", ic); + evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)8); + evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)8); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + ic = elm_icon_add(bx); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + bt = elm_button_add(win); + elm_object_style_set(bt, "anchor"); + elm_object_text_set(bt, "Icon no scale"); + elm_object_part_content_set(bt, "icon", ic); + evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)9); + evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)9); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + bt = elm_button_add(win); + elm_object_style_set(bt, "anchor"); + elm_object_part_content_set(bt, "icon", ic); + evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)10); + evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)10); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + bt = elm_button_add(win); + elm_object_access_info_set(bt, "This is some custom text describing this widget"); + elm_object_style_set(bt, "anchor"); + elm_object_text_set(bt, "Disabled"); + elm_object_part_content_set(bt, "icon", ic); + elm_object_disabled_set(bt, EINA_TRUE); + evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)11); + evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)11); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_calendar.c b/src/bin/elementary/test_calendar.c new file mode 100644 index 0000000000..6f3eb5685d --- /dev/null +++ b/src/bin/elementary/test_calendar.c @@ -0,0 +1,375 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +struct _api_data +{ + unsigned int state; /* What state we are testing */ + void *box; /* box used in set_api_state */ +}; +typedef struct _api_data api_data; + +enum _api_state +{ + STATE_MARK_MONTHLY, + STATE_MARK_WEEKLY, + STATE_SUNDAY_HIGHLIGHT, + STATE_SELECT_DATE_DISABLED_WITH_MARKS, + STATE_SELECT_DATE_DISABLED_NO_MARKS, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +#define SEC_PER_DAY 24 * 60 * 60 +#define SEC_PER_YEAR 365 * SEC_PER_DAY + +static void +set_api_state(api_data *api) +{ + const Eina_List *items = elm_box_children_get(api->box); + static Elm_Calendar_Mark *m = NULL; + if (!eina_list_count(items)) + return; + + switch(api->state) + { /* Put all api-changes under switch */ + case STATE_MARK_MONTHLY: + { + Evas_Object *cal = eina_list_nth(items, 0); + time_t the_time = (SEC_PER_YEAR * 41) + (SEC_PER_DAY * 9); /* Set date to DEC 31, 2010 */ + elm_calendar_min_max_year_set(cal, 2010, 2011); + m = elm_calendar_mark_add(cal, "checked", gmtime(&the_time), ELM_CALENDAR_MONTHLY); + elm_calendar_selected_time_set(cal, gmtime(&the_time)); + } + break; + case STATE_MARK_WEEKLY: + { + Evas_Object *cal = eina_list_nth(items, 0); + time_t the_time = (SEC_PER_YEAR * 41) + (SEC_PER_DAY * 4); /* Set date to DEC 26, 2010 */ + elm_calendar_mark_del(m); + m = elm_calendar_mark_add(cal, "checked", gmtime(&the_time), ELM_CALENDAR_WEEKLY); + elm_calendar_selected_time_set(cal, gmtime(&the_time)); + } + break; + case STATE_SUNDAY_HIGHLIGHT: + { + Evas_Object *cal = eina_list_nth(items, 0); + time_t the_time = (SEC_PER_YEAR * 41) + (SEC_PER_DAY * 3); /* Set date to DEC 25, 2010 */ + /* elm_calendar_mark_del(m); */ + m = elm_calendar_mark_add(cal, "holiday", gmtime(&the_time), ELM_CALENDAR_WEEKLY); + elm_calendar_selected_time_set(cal, gmtime(&the_time)); + } + break; + case STATE_SELECT_DATE_DISABLED_WITH_MARKS: + { + Evas_Object *cal = eina_list_nth(items, 0); + time_t the_time = (SEC_PER_YEAR * 41) + (SEC_PER_DAY * 10); /* Set date to JAN 01, 2011 */ + elm_calendar_select_mode_set(cal, ELM_CALENDAR_SELECT_MODE_NONE); + elm_calendar_selected_time_set(cal, gmtime(&the_time)); + } + break; + case STATE_SELECT_DATE_DISABLED_NO_MARKS: + { + Evas_Object *cal = eina_list_nth(items, 0); + time_t the_time = (SEC_PER_YEAR * 41) + (SEC_PER_DAY * 40); /* Set date to FEB 01, 2011 */ + elm_calendar_marks_clear(cal); + elm_calendar_select_mode_set(cal, ELM_CALENDAR_SELECT_MODE_NONE); + elm_calendar_selected_time_set(cal, gmtime(&the_time)); + } + break; + case API_STATE_LAST: + break; + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(obj, str); + elm_object_disabled_set(obj, a->state == API_STATE_LAST); +} + +static void +_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + free(data); +} + +/* A simple test, just displaying calendar in it's default state */ +void +test_calendar(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *cal, *bx, *bxx, *bt; + api_data *api = calloc(1, sizeof(api_data)); + + win = elm_win_util_standard_add("calendar", "Calendar"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bxx = elm_box_add(win); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bxx); + evas_object_show(bxx); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + api->box = bx; + evas_object_show(bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Next API function"); + evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, bt); + elm_object_disabled_set(bt, api->state == API_STATE_LAST); + evas_object_show(bt); + + elm_box_pack_end(bxx, bx); + + cal = elm_calendar_add(win); + elm_calendar_first_day_of_week_set(cal, ELM_DAY_MONDAY); + evas_object_size_hint_weight_set(cal, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, cal); + + time_t the_time = (SEC_PER_YEAR * 41) + (SEC_PER_DAY * 9); /* Set date to DEC 31, 2010 */ + elm_calendar_selected_time_set(cal, gmtime(&the_time)); + elm_calendar_min_max_year_set(cal, 2010, 2012); + + evas_object_show(cal); + + evas_object_show(win); +} + +void +_print_cal_info(Evas_Object *cal, Evas_Object *en) +{ + char info[1024]; + double interval; + int year_min, year_max; + Eina_Bool sel_enabled; + const char **wds; + struct tm stm; + + if (!elm_calendar_selected_time_get(cal, &stm)) + return; + + interval = elm_calendar_interval_get(cal); + elm_calendar_min_max_year_get(cal, &year_min, &year_max); + sel_enabled = !!(elm_calendar_select_mode_get(cal) != ELM_CALENDAR_SELECT_MODE_NONE); + wds = elm_calendar_weekdays_names_get(cal); + + snprintf(info, sizeof(info), + " Day: %i, Mon: %i, Year %i, WeekDay: %i<br/>" + " Interval: %0.2f, Year_Min: %i, Year_Max %i, Sel Enabled : %i<br/>" + " Weekdays: %s, %s, %s, %s, %s, %s, %s<br/>", + stm.tm_mday, stm.tm_mon, stm.tm_year + 1900, stm.tm_wday, + interval, year_min, year_max, sel_enabled, + wds[0], wds[1], wds[2], wds[3], wds[4], wds[5], wds[6]); + + elm_object_text_set(en, info); +} + +void +_print_cal_shown_info(Evas_Object *cal, Evas_Object *en) +{ + char info[1024]; + struct tm stm; + + elm_calendar_displayed_time_get(cal, &stm); + snprintf(info, sizeof(info), + " Mon: %i, Year %i", + stm.tm_mon, stm.tm_year + 1900); + + elm_object_text_set(en, info); +} + +void +_print_cal_shown_info_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + _print_cal_shown_info(obj, data); +} + +static void +_print_cal_info_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + _print_cal_info(obj, data); +} + +static char * +_format_month_year(struct tm *stm) +{ + char buf[32]; + if (!strftime(buf, sizeof(buf), "%b %y", stm)) return NULL; + return strdup(buf); +} + +static Evas_Object * +_calendar_create(Evas_Object *parent) +{ + Evas_Object *cal; + Elm_Calendar_Mark *mark; + struct tm selected_time; + time_t current_time; + const char *weekdays[] = + { + "Sunday", "Monday", "Tuesday", "Wednesday", + "Thursday", "Friday", "Saturday" + }; + + cal = elm_calendar_add(parent); + elm_calendar_weekdays_names_set(cal, weekdays); // FIXME: this causes smart cal recalc loop error + elm_calendar_first_day_of_week_set(cal, ELM_DAY_SATURDAY); + elm_calendar_interval_set(cal, 0.4); + elm_calendar_format_function_set(cal, _format_month_year); + elm_calendar_min_max_year_set(cal, 2010, 2020); + + current_time = time(NULL) + 4 * SEC_PER_DAY; + localtime_r(¤t_time, &selected_time); + elm_calendar_mark_add(cal, "holiday", &selected_time, ELM_CALENDAR_ANNUALLY); + + current_time = time(NULL) + 1 * SEC_PER_DAY; + localtime_r(¤t_time, &selected_time); + elm_calendar_mark_add(cal, "checked", &selected_time, ELM_CALENDAR_UNIQUE); + + current_time = time(NULL) - 363 * SEC_PER_DAY; + localtime_r(¤t_time, &selected_time); + elm_calendar_mark_add(cal, "checked", &selected_time, ELM_CALENDAR_MONTHLY); + + current_time = time(NULL) - 5 * SEC_PER_DAY; + localtime_r(¤t_time, &selected_time); + mark = elm_calendar_mark_add(cal, "holiday", &selected_time, + ELM_CALENDAR_WEEKLY); + + current_time = time(NULL) + 1 * SEC_PER_DAY; + localtime_r(¤t_time, &selected_time); + elm_calendar_mark_add(cal, "holiday", &selected_time, ELM_CALENDAR_WEEKLY); + + elm_calendar_mark_del(mark); + elm_calendar_marks_draw(cal); + + return cal; +} + +/* A test intended to cover all the calendar api and much use cases as + possible */ +void +test_calendar2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bxh, *cal, *cal2, *cal3, *en; + struct tm selected_time; + time_t current_time; + + win = elm_win_util_standard_add("calendar2", "Calendar 2"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + bxh = elm_box_add(win); + elm_box_horizontal_set(bxh, EINA_TRUE); + evas_object_size_hint_weight_set(bxh, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bxh, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(bxh); + elm_box_pack_end(bx, bxh); + + // calendar 1 + cal = _calendar_create(win); + evas_object_size_hint_weight_set(cal, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(cal, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(cal); + elm_box_pack_end(bx, cal); + + en = elm_entry_add(win); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(en); + elm_box_pack_end(bx, en); + elm_entry_editable_set(en, EINA_FALSE); + + _print_cal_info(cal, en); + evas_object_smart_callback_add(cal, "changed", _print_cal_info_cb, en); + + // calendar 2 + cal2 = elm_calendar_add(win); + evas_object_size_hint_weight_set(cal2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(cal2, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_calendar_select_mode_set(cal2, ELM_CALENDAR_SELECT_MODE_NONE); + evas_object_show(cal2); + elm_box_pack_end(bxh, cal2); + + // calendar 3 + cal3 = elm_calendar_add(win); + evas_object_size_hint_weight_set(cal3, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(cal3, EVAS_HINT_FILL, EVAS_HINT_FILL); + current_time = time(NULL) + 34 * SEC_PER_DAY; + localtime_r(¤t_time, &selected_time); + elm_calendar_selected_time_set(cal3, &selected_time); + current_time = time(NULL) + 1 * SEC_PER_DAY; + localtime_r(¤t_time, &selected_time); + elm_calendar_mark_add(cal3, "checked", &selected_time, ELM_CALENDAR_UNIQUE); + elm_calendar_marks_clear(cal3); + current_time = time(NULL); + localtime_r(¤t_time, &selected_time); + elm_calendar_mark_add(cal3, "checked", &selected_time, ELM_CALENDAR_DAILY); + elm_calendar_mark_add(cal3, "holiday", &selected_time, ELM_CALENDAR_DAILY); + elm_calendar_marks_draw(cal3); + evas_object_show(cal3); + elm_box_pack_end(bxh, cal3); + elm_calendar_min_max_year_set(cal3, -1, -1); + + evas_object_show(win); +} + +void +test_calendar3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *cal, *en, *bx; + struct tm selected_time; + time_t current_time; + + win = elm_win_util_standard_add("calendar", "Calendar"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + en = elm_entry_add(win); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(en); + elm_box_pack_end(bx, en); + + elm_entry_editable_set(en, EINA_FALSE); + cal = elm_calendar_add(win); + elm_object_style_set(cal, "double_spinners"); + elm_calendar_first_day_of_week_set(cal, ELM_DAY_THURSDAY); + elm_calendar_select_mode_set(cal, ELM_CALENDAR_SELECT_MODE_ONDEMAND); + elm_calendar_selectable_set(cal, + (ELM_CALENDAR_SELECTABLE_YEAR + | ELM_CALENDAR_SELECTABLE_MONTH)); + current_time = time(NULL) + 34 * SEC_PER_DAY; + localtime_r(¤t_time, &selected_time); + evas_object_size_hint_weight_set(cal, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, cal); + + evas_object_show(cal); + elm_calendar_selected_time_set(cal, &selected_time); + _print_cal_shown_info(cal, en); + evas_object_smart_callback_add(cal, "display,changed", _print_cal_shown_info_cb, en); + + evas_object_show(win); +} diff --git a/src/bin/elementary/test_check.c b/src/bin/elementary/test_check.c new file mode 100644 index 0000000000..1ee3935cc0 --- /dev/null +++ b/src/bin/elementary/test_check.c @@ -0,0 +1,190 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static Eina_Bool eb; + +static void +changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *ck2 = data; + printf("ck %p to %i\n", obj, elm_check_state_get(obj)); + elm_check_state_set(ck2, elm_check_state_get(obj)); + printf("ck2 %p is now %i\n", ck2, elm_check_state_get(ck2)); +} + +static void +state_changed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("State Pointer Value: %d\n", eb); +} + +void +test_check(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *ic, *ck, *ck0; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("check", "Check"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + ck = elm_check_add(win); + elm_object_text_set(ck, "Icon sized to check"); + elm_object_part_content_set(ck, "icon", ic); + elm_check_state_set(ck, EINA_TRUE); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + evas_object_show(ic); + + ck0 = ck; + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + ck = elm_check_add(win); + elm_object_text_set(ck, "Icon not resizable"); + elm_object_part_content_set(ck, "icon", ic); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + evas_object_show(ic); + + evas_object_smart_callback_add(ck, "changed", changed_cb, ck0); + + ck = elm_check_add(win); + elm_object_text_set(ck, "Label Only"); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "Use State Pointer"); + elm_check_state_pointer_set(ck, &eb); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "Print State Pointer Value"); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + evas_object_smart_callback_add(ck, "changed", state_changed_cb, NULL); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + ck = elm_check_add(win); + elm_object_text_set(ck, "Disabled check"); + elm_object_part_content_set(ck, "icon", ic); + elm_check_state_set(ck, EINA_TRUE); + elm_box_pack_end(bx, ck); + elm_object_disabled_set(ck, EINA_TRUE); + evas_object_show(ck); + evas_object_show(ic); + + ck = elm_check_add(win); + elm_box_pack_end(bx, ck); + elm_object_disabled_set(ck, EINA_TRUE); + evas_object_show(ck); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + ck = elm_check_add(win); + elm_object_part_content_set(ck, "icon", ic); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + evas_object_show(ic); + + evas_object_show(win); +} + +void +test_check_toggle(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *ic, *tg; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("check-toggle", "Check Toggle"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + + tg = elm_check_add(win); + elm_object_style_set(tg, "toggle"); + elm_object_text_set(tg, "Icon sized to toggle"); + elm_object_part_content_set(tg, "icon", ic); + elm_check_state_set(tg, EINA_TRUE); + elm_object_part_text_set(tg, "on", "Yes"); + elm_object_part_text_set(tg, "off", "No"); + elm_box_pack_end(bx, tg); + evas_object_show(tg); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + + tg = elm_check_add(win); + elm_object_style_set(tg, "toggle"); + elm_object_text_set(tg, "Icon no scale"); + elm_object_part_content_set(tg, "icon", ic); + elm_box_pack_end(bx, tg); + evas_object_show(tg); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + + tg = elm_check_add(win); + elm_object_style_set(tg, "toggle"); + elm_object_text_set(tg, "Disabled toggle"); + elm_object_part_content_set(tg, "icon", ic); + elm_object_disabled_set(tg, EINA_TRUE); + elm_box_pack_end(bx, tg); + evas_object_show(tg); + evas_object_show(ic); + + tg = elm_check_add(win); + elm_object_style_set(tg, "toggle"); + elm_object_text_set(tg, "Label Only"); + elm_object_part_text_set(tg, "on", "Big long fun times label"); + elm_object_part_text_set(tg, "off", "Small long happy fun label"); + elm_box_pack_end(bx, tg); + evas_object_show(tg); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + + tg = elm_check_add(win); + elm_object_style_set(tg, "toggle"); + elm_object_part_content_set(tg, "icon", ic); + elm_box_pack_end(bx, tg); + evas_object_show(tg); + evas_object_show(ic); + + evas_object_show(win); +} diff --git a/src/bin/elementary/test_clock.c b/src/bin/elementary/test_clock.c new file mode 100644 index 0000000000..fdb096faa0 --- /dev/null +++ b/src/bin/elementary/test_clock.c @@ -0,0 +1,363 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#include "test.h" +#endif +#include <Elementary.h> + +struct _api_data +{ + unsigned int state; /* What state we are testing */ + Evas_Object *box; /* Used in set_api_state */ +}; +typedef struct _api_data api_data; + +enum _api_state +{ + CLOCK_HIDE_SEC, + CLOCK_SHOW_AM_PM, + CLOCK_SHOW_SEC, + CLOCK_EDIT_MIN, + CLOCK_EDIT_HOUR, + CLOCK_EDIT_ALL, + CLOCK_HIDE_AM_PM, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static const char* api_state_description[] = { + "Hide Sec", + "Show AM/PM", + "Show Sec", + "Edit Min", + "Edit Hour", + "Edit All", + "Hide AM/PM", + NULL +}; + +static void +set_api_state(api_data *api) +{ + const Eina_List *items = elm_box_children_get(api->box); + Evas_Object *ck = eina_list_nth(items, 0); + if (!eina_list_count(items)) + return; + + /* use elm_box_children_get() to get list of children */ + switch(api->state) + { /* Put all api-changes under switch */ + case CLOCK_HIDE_SEC: + elm_clock_show_seconds_set(ck, EINA_FALSE); + break; + + case CLOCK_SHOW_AM_PM: + elm_clock_show_am_pm_set(ck, EINA_TRUE); + break; + + case CLOCK_SHOW_SEC: + elm_clock_show_seconds_set(ck, EINA_TRUE); + break; + + case CLOCK_EDIT_MIN: + elm_clock_edit_set(ck, EINA_TRUE); + elm_clock_edit_mode_set(ck, ELM_CLOCK_EDIT_MIN_DECIMAL | ELM_CLOCK_EDIT_MIN_UNIT); + break; + + case CLOCK_EDIT_HOUR: + elm_clock_edit_set(ck, EINA_TRUE); + elm_clock_edit_mode_set(ck, ELM_CLOCK_EDIT_HOUR_DECIMAL | ELM_CLOCK_EDIT_HOUR_UNIT); + break; + + case CLOCK_EDIT_ALL: + elm_clock_edit_set(ck, EINA_TRUE); + elm_clock_edit_mode_set(ck, ELM_CLOCK_EDIT_ALL); + break; + + case CLOCK_HIDE_AM_PM: + elm_clock_show_am_pm_set(ck, EINA_FALSE); + break; + + case API_STATE_LAST: + + break; + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%s>\n", api_state_description[a->state]); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(obj, str); + elm_object_disabled_set(obj, a->state == API_STATE_LAST); +} + +static void +_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + free(data); +} + +void +test_clock(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *ck, *bt, *bxx; + unsigned int digedit; + api_data *api = calloc(1, sizeof(api_data)); + + win = elm_win_util_standard_add("clock", "Clock"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bxx = elm_box_add(win); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bxx); + evas_object_show(bxx); + + bx = elm_box_add(bxx); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + api->box = bx; + evas_object_show(bx); + + bt = elm_button_add(bxx); + elm_object_text_set(bt, "Next API function"); + evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, bt); + elm_object_disabled_set(bt, EINA_TRUE); + evas_object_show(bt); + + elm_box_pack_end(bxx, bx); + + ck = elm_clock_add(bx); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + ck = elm_clock_add(bx); + elm_clock_show_am_pm_set(ck, EINA_TRUE); + elm_box_pack_end(bx, ck); + elm_clock_time_set(ck, 17, 25, 0); + evas_object_show(ck); + + ck = elm_clock_add(bx); + elm_clock_show_seconds_set(ck, EINA_TRUE); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + ck = elm_clock_add(bx); + elm_clock_show_seconds_set(ck, EINA_TRUE); + elm_clock_show_am_pm_set(ck, EINA_TRUE); + elm_box_pack_end(bx, ck); + elm_clock_time_set(ck, 11, 59, 57); + evas_object_show(ck); + + ck = elm_clock_add(bx); + elm_clock_show_seconds_set(ck, EINA_TRUE); + elm_clock_show_am_pm_set(ck, EINA_FALSE); + elm_clock_time_set(ck, 23, 59, 57); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + ck = elm_clock_add(bx); + elm_clock_edit_set(ck, EINA_TRUE); + elm_clock_show_seconds_set(ck, EINA_TRUE); + elm_clock_show_am_pm_set(ck, EINA_TRUE); + elm_clock_time_set(ck, 10, 11, 12); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + ck = elm_clock_add(bx); + elm_clock_show_seconds_set(ck, EINA_TRUE); + elm_clock_edit_set(ck, EINA_TRUE); + digedit = ELM_CLOCK_EDIT_HOUR_UNIT | ELM_CLOCK_EDIT_MIN_UNIT | ELM_CLOCK_EDIT_SEC_UNIT; + elm_clock_edit_mode_set(ck, digedit); + elm_box_pack_end(bx, ck); + elm_clock_time_set(ck, 0, 0, 0); + evas_object_show(ck); + + evas_object_show(win); +} + +static void +_edit_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *ck = data; + + if (!elm_clock_edit_get(ck)) + { + elm_object_text_set(obj, "Done"); + elm_clock_edit_set(ck, EINA_TRUE); + return; + } + elm_object_text_set(obj, "Edit"); + elm_clock_edit_set(ck, EINA_FALSE); +} + +static void +_hmode_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *ck = data; + + if (!elm_clock_show_am_pm_get(ck)) + { + elm_object_text_set(obj, "24h"); + elm_clock_show_am_pm_set(ck, EINA_TRUE); + return; + } + elm_object_text_set(obj, "12h"); + elm_clock_show_am_pm_set(ck, EINA_FALSE); +} + +static void +_pause_resume_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *ck = data; + + if (!elm_clock_pause_get(ck)) + { + elm_object_text_set(obj, "Resume"); + elm_clock_pause_set(ck, EINA_TRUE); + return; + } + elm_object_text_set(obj, "Pause"); + elm_clock_pause_set(ck, EINA_FALSE); +} + +void +test_clock_edit(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *hbx, *ck, *bt, *bxx; + api_data *api = calloc(1, sizeof(api_data)); + + win = elm_win_util_standard_add("clock-edit", "Clock Edit"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bxx = elm_box_add(win); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bxx); + evas_object_show(bxx); + + bx = elm_box_add(bxx); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + api->box = bx; + evas_object_show(bx); + + bt = elm_button_add(bxx); + elm_object_text_set(bt, "Next API function"); + evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, bt); + elm_object_disabled_set(bt, api->state == API_STATE_LAST); + evas_object_show(bt); + + elm_box_pack_end(bxx, bx); + + ck = elm_clock_add(bx); + elm_clock_time_set(ck, 0, 15, 3); + elm_clock_edit_mode_set(ck, ELM_CLOCK_EDIT_DEFAULT); + elm_clock_show_seconds_set(ck, EINA_TRUE); + elm_clock_show_am_pm_set(ck, EINA_TRUE); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + hbx = elm_box_add(bx); + evas_object_size_hint_weight_set(hbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_horizontal_set(hbx, EINA_TRUE); + elm_box_pack_end(bx, hbx); + evas_object_show(hbx); + + bt = elm_button_add(hbx); + elm_object_text_set(bt, "Edit"); + evas_object_smart_callback_add(bt, "clicked", _edit_bt_clicked, ck); + elm_box_pack_end(hbx, bt); + evas_object_show(bt); + + bt = elm_button_add(hbx); + elm_object_text_set(bt, "24h"); + evas_object_smart_callback_add(bt, "clicked", _hmode_bt_clicked, ck); + elm_box_pack_end(hbx, bt); + evas_object_show(bt); + + evas_object_show(win); +} + +void +test_clock_edit2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *ck, *lb; + + win = elm_win_util_standard_add("clock-edit2", "Clock Edit 2"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "Check time updates for a user mouse button hold." + ); + evas_object_size_hint_weight_set(lb, 0.0, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + ck = elm_clock_add(win); + elm_clock_show_seconds_set(ck, 1); + elm_clock_edit_set(ck, EINA_TRUE); + elm_clock_first_interval_set(ck, 0.4); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + ck = elm_clock_add(win); + elm_clock_show_seconds_set(ck, 1); + elm_clock_edit_set(ck, EINA_TRUE); + elm_clock_first_interval_set(ck, 1.2); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + ck = elm_clock_add(win); + elm_clock_show_seconds_set(ck, 1); + elm_clock_edit_set(ck, EINA_TRUE); + elm_clock_first_interval_set(ck, 2.0); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + evas_object_show(win); +} + +void +test_clock_pause(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *ck, *bt; + + win = elm_win_util_standard_add("clock4", "Clock4"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + ck = elm_clock_add(win); + elm_clock_show_seconds_set(ck, EINA_TRUE); + elm_clock_time_set(ck, 0, 0, 0); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Pause"); + evas_object_smart_callback_add(bt, "clicked", _pause_resume_bt_clicked, ck); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + evas_object_show(win); +} diff --git a/src/bin/elementary/test_cnp.c b/src/bin/elementary/test_cnp.c new file mode 100644 index 0000000000..35de89e93d --- /dev/null +++ b/src/bin/elementary/test_cnp.c @@ -0,0 +1,135 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static Evas_Object *glb; + +static void +_bt_copy_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + const char *txt = elm_object_text_get(en); + + elm_object_text_set(glb, txt); + elm_cnp_selection_set(elm_object_parent_widget_get(en), ELM_SEL_TYPE_CLIPBOARD, + ELM_SEL_FORMAT_TEXT, txt, strlen(txt)); +} + +static Eina_Bool +_selection(void *data, Evas_Object *obj EINA_UNUSED, Elm_Selection_Data *ev) +{ + Evas_Object *en = data; + const char *fmt = NULL; + + switch (ev->format) + { + case ELM_SEL_FORMAT_TARGETS: fmt = "TARGETS"; break; + case ELM_SEL_FORMAT_NONE: fmt = "NONE"; break; + case ELM_SEL_FORMAT_TEXT: fmt = "TEXT"; break; + case ELM_SEL_FORMAT_MARKUP: fmt = "MARKUP"; break; + case ELM_SEL_FORMAT_IMAGE: fmt = "IMAGE"; break; + case ELM_SEL_FORMAT_VCARD: fmt = "VCARD"; break; + case ELM_SEL_FORMAT_HTML: fmt = "HTML"; break; + } + fprintf(stderr, "got selection type '%s': length %zu\n", fmt, ev->len); + + if (ev->format == ELM_SEL_FORMAT_TEXT) + { + char *stripstr; + + stripstr = malloc(ev->len + 1); + strncpy(stripstr, (char *)ev->data, ev->len); + stripstr[ev->len] = '\0'; + elm_entry_entry_insert(en, stripstr); + free(stripstr); + } + + return EINA_TRUE; +} + +static void +_bt_paste_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + + elm_cnp_selection_get(en, ELM_SEL_TYPE_CLIPBOARD, ELM_SEL_FORMAT_TEXT, + _selection, en); +} + +static void +_bt_clear_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + + elm_object_text_set(glb, ""); + elm_object_cnp_selection_clear(elm_object_parent_widget_get(en), ELM_SEL_TYPE_CLIPBOARD); +} + +void +test_cnp(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *gd, *bt, *en, *lb; + + win = elm_win_util_standard_add("copypaste", "CopyPaste"); + elm_win_autodel_set(win, EINA_TRUE); + + gd = elm_grid_add(win); + elm_grid_size_set(gd, 100, 100); + evas_object_size_hint_weight_set(gd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, gd); + evas_object_show(gd); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_line_wrap_set(en, ELM_WRAP_CHAR); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(en, "Elementary provides "); + elm_grid_pack(gd, en, 10, 10, 60, 30); + evas_object_show(en); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Copy from left entry"); + evas_object_smart_callback_add(bt, "clicked", _bt_copy_clicked, en); + elm_grid_pack(gd, bt, 70, 10, 22, 30); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Clear clipboard"); + evas_object_smart_callback_add(bt, "clicked", _bt_clear_clicked, en); + elm_grid_pack(gd, bt, 70, 70, 22, 20); + evas_object_show(bt); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_line_wrap_set(en, ELM_WRAP_CHAR); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(en, "rich copying and pasting functionality,"); + elm_grid_pack(gd, en, 10, 40, 60, 30); + evas_object_show(en); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Paste to left entry"); + evas_object_smart_callback_add(bt, "clicked", _bt_paste_clicked, en); + elm_grid_pack(gd, bt, 70, 40, 22, 30); + evas_object_show(bt); + + lb = elm_label_add(win); + elm_object_text_set(lb, "<b>Clipboard:</b>"); + evas_object_size_hint_weight_set(lb, 0.0, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_grid_pack(gd, lb, 10, 70, 60, 10); + evas_object_show(lb); + + glb = elm_label_add(win); + elm_object_text_set(glb, ""); + evas_object_size_hint_weight_set(glb, 0.0, 0.0); + evas_object_size_hint_align_set(glb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_grid_pack(gd, glb, 10, 80, 60, 10); + evas_object_show(glb); + + evas_object_resize(win, 480, 200); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_colorclass.c b/src/bin/elementary/test_colorclass.c new file mode 100644 index 0000000000..8764065891 --- /dev/null +++ b/src/bin/elementary/test_colorclass.c @@ -0,0 +1,24 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + + +void +test_colorclass(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *cc; + + win = elm_win_util_standard_add("colorclass", "Color Classes"); + elm_win_autodel_set(win, EINA_TRUE); + + cc = elm_color_class_editor_add(win); + elm_win_resize_object_add(win, cc); + evas_object_size_hint_weight_set(cc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(cc, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(cc); + + evas_object_show(win); + evas_object_size_hint_min_set(win, 400, 280); + evas_object_resize(win, 400, 280); +} diff --git a/src/bin/elementary/test_colorselector.c b/src/bin/elementary/test_colorselector.c new file mode 100644 index 0000000000..d1a6febebd --- /dev/null +++ b/src/bin/elementary/test_colorselector.c @@ -0,0 +1,212 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void +_colorselector_changed_cb(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Evas_Object *re = data; + int r, g, b, a; + + elm_colorselector_color_get(obj, &r, &g, &b, &a); + printf("Changed Color [r=%d g=%d b=%d a=%d]\n", r, g, b, a); + evas_color_argb_premul(a, &r, &g, &b); + evas_object_color_set(re, r, g, b, a); +} + +static void +_color_item_selected_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + int r = 0, g = 0, b = 0 ,a = 0; + Elm_Object_Item *color_it = event_info; + + elm_colorselector_palette_item_color_get(color_it, &r, &g, &b, &a); + printf("Selected Color Palette [r=%d g=%d b=%d a=%d]\n", r, g, b, a); +} + +static void +_color_item_longpressed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + int r = 0,g = 0,b = 0 ,a = 0; + Elm_Object_Item *color_it = event_info; + + elm_colorselector_palette_item_color_get(color_it, &r, &g, &b, &a); + printf("Longpressed color item : %p, color = %d-%d-%d-%d\n", + color_it, r, g, b, a); +} + +static void +_palette_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *cs = data; + elm_colorselector_mode_set(cs, ELM_COLORSELECTOR_PALETTE); +} + +static void +_components_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *cs = data; + elm_colorselector_mode_set(cs, ELM_COLORSELECTOR_COMPONENTS); +} + +static void +_both_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *cs = data; + elm_colorselector_mode_set(cs, ELM_COLORSELECTOR_BOTH); +} + +static void +_picker_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *cs = data; + elm_colorselector_mode_set(cs, ELM_COLORSELECTOR_PICKER); +} + +static void +_all_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *cs = data; + elm_colorselector_mode_set(cs, ELM_COLORSELECTOR_ALL); +} + +void +test_colorselector(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bx2, *cs, *fr, *re, *bt; + const Eina_List *item_list, *last_item_list; + Elm_Object_Item *color_item; + int r, g, b, a; + Elm_Object_Item *item; + + win = elm_win_util_standard_add("colorselector", "ColorSelector"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + fr = elm_frame_add(bx); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(fr, "Color View"); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + re = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_min_set(re, 1, ELM_SCALE_SIZE(100)); + evas_object_show(re); + elm_object_content_set(fr, re); + + fr = elm_frame_add(bx); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(fr, "Color Selector"); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + cs = elm_colorselector_add(fr); + item = elm_colorselector_palette_color_add(cs, 0, 0, 0, 255); + elm_colorselector_palette_item_selected_set(item, EINA_TRUE); + + elm_colorselector_palette_color_add(cs, 255, 255, 255, 255); + elm_colorselector_palette_color_add(cs, 255, 0, 0, 255); + elm_colorselector_palette_color_add(cs, 0, 255, 0, 255); + elm_colorselector_palette_color_add(cs, 0, 0, 255, 255); + elm_colorselector_palette_color_add(cs, 255, 255, 0, 255); + elm_colorselector_palette_color_add(cs, 0, 255, 255, 255); + elm_colorselector_palette_color_add(cs, 255, 0, 255, 255); + elm_colorselector_palette_color_add(cs, 192, 192, 192, 255); + elm_colorselector_palette_color_add(cs, 128, 128, 128, 255); + elm_colorselector_palette_color_add(cs, 128, 0, 0, 255); + elm_colorselector_palette_color_add(cs, 128, 128, 0, 255); + elm_colorselector_palette_color_add(cs, 0, 128, 0, 255); + elm_colorselector_palette_color_add(cs, 128, 0, 128, 255); + elm_colorselector_palette_color_add(cs, 0, 128, 128, 255); + elm_colorselector_palette_color_add(cs, 0, 100, 128, 255); + + item_list = elm_colorselector_palette_items_get(cs); + last_item_list = eina_list_last(item_list); + color_item = eina_list_data_get(last_item_list); + elm_colorselector_palette_item_color_set(color_item, 0, 0, 128, 255); + + a = 180; + r = 255; + g = 160; + b = 132; + + elm_colorselector_color_set(cs, r, g, b, a); + evas_object_size_hint_weight_set(cs, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(cs, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_content_set(fr, cs); + evas_object_show(cs); + evas_object_smart_callback_add(cs, "changed", _colorselector_changed_cb, re); + evas_object_smart_callback_add(cs, "color,item,selected", + _color_item_selected_cb, re); + evas_object_smart_callback_add(cs, "color,item,longpressed", + _color_item_longpressed_cb, re); + + elm_colorselector_color_get(cs, &r, &g, &b, &a); + /* Fix Alpha pre multiplication by edje */ + r = (r * a) / 255; + g = (g * a) / 255; + b = (b * a) / 255; + evas_object_color_set(re, r, g, b, a); + + bx2 = elm_box_add(bx); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(bx2); + elm_box_pack_end(bx, bx2); + + bt = elm_button_add(bx2); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(bt, "clicked", _palette_cb, cs); + elm_object_text_set(bt, "Palette"); + evas_object_show(bt); + elm_box_pack_end(bx2, bt); + + bt = elm_button_add(bx2); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(bt, "clicked", _components_cb, cs); + elm_object_text_set(bt, "Components"); + evas_object_show(bt); + elm_box_pack_end(bx2, bt); + + bt = elm_button_add(bx2); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(bt, "clicked", _both_cb, cs); + elm_object_text_set(bt, "Both"); + evas_object_show(bt); + elm_box_pack_end(bx2, bt); + + bt = elm_button_add(bx2); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(bt, "clicked", _picker_cb, cs); + elm_object_text_set(bt, "Picker"); + evas_object_show(bt); + elm_box_pack_end(bx2, bt); + + bt = elm_button_add(bx2); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(bt, "clicked", _all_cb, cs); + elm_object_text_set(bt, "All"); + evas_object_show(bt); + elm_box_pack_end(bx2, bt); + + evas_object_show(win); +} diff --git a/src/bin/elementary/test_combobox.c b/src/bin/elementary/test_combobox.c new file mode 100644 index 0000000000..baa6962cc3 --- /dev/null +++ b/src/bin/elementary/test_combobox.c @@ -0,0 +1,278 @@ +#include "test.h" +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void +_combobox_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("Hover button is clicked and 'clicked' callback is called.\n"); +} + +static void +_combobox_item_selected_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + const char *txt = elm_object_item_text_get(event_info); + printf("'item,selected' callback is called. (selected item : %s)\n", txt); +} + +static void +_combobox_dismissed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("'dismissed' callback is called.\n"); +} + +static void +_combobox_expanded_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("'expanded' callback is called.\n"); +} + +static void +_combobox_item_pressed_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info) +{ + const char *txt = elm_object_item_text_get(event_info); + printf("'item,pressed' callback is called. (selected item : %s)\n", txt); + elm_object_text_set(obj, txt); + elm_combobox_hover_end(obj); + elm_entry_cursor_end_set(obj); +} + +static char * +gl_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + char buf[256]; + snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data); + return strdup(buf); +} + +static char * +gl2_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + char buf[256]; + snprintf(buf, sizeof(buf), "%s", (char*)data); + return strdup(buf); +} + +static Evas_Object *gl_content_get(void *data EINA_UNUSED, Evas_Object *obj, + const char *part) +{ + char buf[PATH_MAX]; + Evas_Object *ic = elm_icon_add(obj); + if (!strcmp(part, "elm.swallow.end")) + snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get()); + else + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + return ic; +} + +static Eina_Bool gl_state_get(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + const char *part EINA_UNUSED) +{ + return EINA_FALSE; +} + +static Eina_Bool +gl_filter_get(void *data, Evas_Object *obj EINA_UNUSED, void *key) +{ + char buf[256]; + // if the key is empty/NULL, return true for item + if (!strlen((char *)key)) return EINA_TRUE; + snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data); + if (strcasestr(buf, (char *)key)) + return EINA_TRUE; + // Default case should return false (item fails filter hence will be hidden) + return EINA_FALSE; +} + +static void +_gl_filter_restart_cb(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_genlist_filter_set(obj, (void *)elm_object_text_get(obj)); +} + +static void +_gl2_filter_restart_cb(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_genlist_filter_set(obj, (void *)elm_object_text_get(elm_multibuttonentry_entry_get(obj))); +} + +static Eina_Bool +gl2_filter_get(void *data, Evas_Object *obj EINA_UNUSED, void *key) +{ + char buf[256]; + // if the key is empty/NULL, return true for item + if (!strlen((char *)key)) return EINA_TRUE; + snprintf(buf, sizeof(buf), "%s", (char*)data); + if (!strncmp(buf, (char *)key, strlen((char*)key))) + return EINA_TRUE; + // Default case should return false (item fails filter hence will be hidden) + return EINA_FALSE; +} + +static void +_gl_filter_finished_cb(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("Filter finished\n"); +} + +void +test_combobox(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *combobox; + Elm_Genlist_Item_Class *itc; + win = elm_win_util_standard_add("combobox", "Combobox"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + itc = elm_genlist_item_class_new(); + itc->item_style = "default"; + itc->func.text_get = gl_text_get; + itc->func.content_get = gl_content_get; + itc->func.state_get = gl_state_get; + itc->func.filter_get = gl_filter_get; + itc->func.del = NULL; + + combobox = elm_combobox_add(win); + evas_object_size_hint_weight_set(combobox, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(combobox, EVAS_HINT_FILL, 0); + elm_object_part_text_set(combobox, "guide", "A long list"); + for (int i = 0; i < 1000; i++) + elm_genlist_item_append(combobox, itc, (void *)(uintptr_t)i, + NULL, ELM_GENLIST_ITEM_NONE, NULL, + (void*)(uintptr_t)(i * 10)); + evas_object_smart_callback_add(combobox, "clicked", + _combobox_clicked_cb, NULL); + evas_object_smart_callback_add(combobox, "dismissed", + _combobox_dismissed_cb, NULL); + evas_object_smart_callback_add(combobox, "expanded", + _combobox_expanded_cb, NULL); + evas_object_smart_callback_add(combobox, "item,selected", + _combobox_item_selected_cb, NULL); + evas_object_smart_callback_add(combobox, "item,pressed", + _combobox_item_pressed_cb, NULL); + evas_object_smart_callback_add(combobox, "filter,done", + _gl_filter_finished_cb, NULL); + evas_object_smart_callback_add(combobox, "changed", + _gl_filter_restart_cb, NULL); + elm_box_pack_end(bx, combobox); + evas_object_show(combobox); + + combobox = elm_combobox_add(win); + evas_object_size_hint_weight_set(combobox, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(combobox, EVAS_HINT_FILL, 0); + elm_object_text_set(combobox, "Disabled Combobox"); + for (int i = 0; i < 1000; i++) + elm_genlist_item_append(combobox, itc, (void *)(uintptr_t)i, + NULL, ELM_GENLIST_ITEM_NONE, NULL, + (void*)(uintptr_t)(i * 10)); + evas_object_smart_callback_add(combobox, "clicked", + _combobox_clicked_cb, NULL); + evas_object_smart_callback_add(combobox, "item,selected", + _combobox_item_selected_cb, NULL); + evas_object_smart_callback_add(combobox, "item,pressed", + _combobox_item_pressed_cb, NULL); + evas_object_smart_callback_add(combobox, "dismissed", + _combobox_dismissed_cb, NULL); + evas_object_smart_callback_add(combobox, "expanded", + _combobox_expanded_cb, NULL); + evas_object_smart_callback_add(combobox, "filter,done", + _gl_filter_finished_cb, NULL); + elm_object_disabled_set(combobox, EINA_TRUE); + elm_box_pack_end(bx, combobox); + evas_object_show(combobox); + + evas_object_resize(win, 320, 500); + evas_object_show(win); +} + +static void +_combobox2_item_pressed_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info) +{ + const char *txt = elm_object_item_text_get(event_info); + printf("'item,pressed' callback is called. (selected item : %s)\n", txt); + if (elm_combobox_multiple_selection_get(obj)) + elm_multibuttonentry_item_append(obj, txt, NULL, NULL); + else + elm_object_text_set(obj, txt); + elm_combobox_hover_end(obj); +} +// Combobox with multiple selection +void +test_combobox2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *combobox, *ly; + Elm_Genlist_Item_Class *itc; + char buf[128]; + char* email_address[300] = {"augue.ut.lacus@Suspendisse.com","egestas.Aliquam.nec@Vivamusmolestiedapibus.edu","urna.et@purusNullam.co.uk","elit@Sedid.net","cursus@malesuadafringillaest.net","Lorem@Cras.org","risus@sedhendrerita.co.uk","auctor.nunc.nulla@utsemNulla.com","nunc.nulla@nonenim.org","egestas@egetipsum.co.uk","sed.tortor@tempusmauris.edu","rutrum@gravida.org","nunc@acsemut.com","lobortis.quam@eratvolutpatNulla.net","fames@ullamcorperDuisat.co.uk","pede.et.risus@necurna.edu","semper.cursus.Integer@justo.com","sem.molestie@orciPhasellusdapibus.com","quam.a@tinciduntvehicula.co.uk","ullamcorper.Duis@odioEtiam.com","enim.Sed.nulla@Etiamligulatortor.net","molestie.pharetra.nibh@velfaucibus.com","morbi@neceuismodin.com","egestas.hendrerit.neque@nequetellus.com","Etiam.gravida.molestie@purusDuis.org","metus.vitae@risus.net","tincidunt.tempus.risus@nonummyFusce.co.uk","Curabitur.ut.odio@in.com","rutrum@utnisi.ca","iaculis.nec@ultriciesdignissimlacus.ca","consectetuer.ipsum.nunc@Cumsociisnatoque.ca","non.arcu.Vivamus@ornare.com","arcu.Vestibulum@interdumligula.edu","sem.magna@urnasuscipit.ca","eu.euismod@urnaconvalliserat.net","Maecenas.mi.felis@mattisInteger.ca","magna.Suspendisse@Donecdignissimmagna.ca","cursus.Integer.mollis@fringillaeuismodenim.ca","tellus.eu@molestie.co.uk","metus.In@egestas.co.uk","Cum@nisl.com","Phasellus@atarcu.net","nec.quam.Curabitur@tortorInteger.org","condimentum.Donec@egetodioAliquam.edu","orci.luctus@magnatellus.co.uk","adipiscing@noncursusnon.co.uk","Sed.eget.lacus@Nullam.edu","felis.ullamcorper@ornare.co.uk","Nunc.quis.arcu@Proineget.edu","in@lobortis.co.uk","leo.Vivamus.nibh@seddui.com","eu.tellus.Phasellus@natoque.ca","ultrices.iaculis@Aliquam.net","purus.ac@feugiatLorem.net","tincidunt.neque@ut.net","odio.sagittis.semper@nibhdolornonummy.org","Sed@eunequepellentesque.com","elementum@sempererat.co.uk","Curae.Donec.tincidunt@neque.net","rhoncus@erat.edu","mauris.elit@Donec.ca","metus.vitae.velit@ad.edu","scelerisque.scelerisque@etmalesuadafames.net","velit.in@convallis.co.uk","ridiculus@laoreetlectusquis.org","tincidunt.orci.quis@musDonec.net","tempor@orciconsectetuereuismod.co.uk","Duis.sit@eratSednunc.com","elit.sed.consequat@nuncinterdum.edu","lorem@Pellentesqueultricies.org","ornare.placerat.orci@pretiumnequeMorbi.com","euismod.enim@primisinfaucibus.ca","a.scelerisque.sed@sapienCras.com","Aliquam@Vestibulum.net","nec@at.ca","quis.diam.luctus@atauctor.ca","nec@purusin.org","montes.nascetur.ridiculus@viverraMaecenas.co.uk","elementum@amet.edu","fringilla.cursus.purus@velarcuCurabitur.co.uk","et.rutrum@consectetuerrhoncus.edu","Aenean@maurissapiencursus.com","interdum@vehiculaaliquet.co.uk","orci.quis.lectus@facilisisfacilisis.org","et.netus.et@arcu.net","ipsum.porta.elit@sapienNunc.edu","libero.Morbi@ipsumCurabiturconsequat.ca","libero@sitamet.com","porta@penatibus.org","nec.enim.Nunc@egetmetusIn.edu","Nunc.sollicitudin.commodo@porttitorinterdum.org","Phasellus.at.augue@dolor.org","nec.ante@etlibero.com","diam@gravida.co.uk","laoreet@malesuada.co.uk","in.lobortis@blanditenim.edu","ante@ipsumnon.net","in@odio.org","Quisque.tincidunt@risus.co.uk","lacus.varius@Vestibulum.com","eu.eros.Nam@arcuNunc.org","pellentesque@Vivamuseuismodurna.org","Cum.sociis@eleifendCras.com","neque@vulputate.org","imperdiet.dictum.magna@risus.org","sagittis@enimcondimentum.edu","hendrerit@maurisMorbi.org","suscipit.nonummy@disparturientmontes.org","Vivamus.non.lorem@fermentummetusAenean.net","In.mi@maurisaliquam.com","est@massanonante.org","molestie@a.co.uk","sit@acturpis.org","diam@felisorci.edu","dolor.nonummy.ac@elitsedconsequat.co.uk","justo@Praesentinterdum.co.uk","Quisque.varius@enimMaurisquis.ca","nibh.enim.gravida@ut.ca","arcu.Vivamus@orciquis.co.uk","sociis@Sedeget.net","risus@egetvolutpatornare.com","vel.est.tempor@ipsum.net","ipsum@dolordapibusgravida.edu","sem.egestas@quamelementum.co.uk","ipsum@Duisatlacus.co.uk","facilisis.vitae@acturpisegestas.net","Nam@aliquetlobortis.net","ipsum.dolor.sit@nuncInat.net","gravida.sagittis@et.org","mauris@magnatellus.edu","sed@adipiscingenimmi.org","sed@ipsumportaelit.com","malesuada.vel.convallis@amet.net","Praesent.interdum@dictumeu.co.uk","nunc.In.at@ornare.co.uk","Phasellus.fermentum.convallis@ipsum.net","sed.libero.Proin@Aliquameratvolutpat.org","aliquet.libero@telluslorem.net","lectus.pede.ultrices@Maurisquisturpis.edu","blandit.at.nisi@ut.net","erat@convallisdolor.net","ante.Nunc.mauris@vehiculaetrutrum.ca","vel.quam@egestas.edu","non@justofaucibuslectus.co.uk","sem.ut.dolor@odioNaminterdum.org","et.ipsum@malesuada.net","non@Nulladignissim.com","ullamcorper.nisl@iaculisodio.com","neque.sed@necurna.ca","in.cursus.et@fermentumvelmauris.co.uk","magna.sed@eteuismodet.co.uk","a@Crasvehicula.com","tortor.Nunc.commodo@velmauris.net","dignissim.pharetra@Aeneaneuismodmauris.org","egestas.urna.justo@acorci.org","iaculis.enim.sit@maurisIntegersem.com","malesuada@imperdietnec.com","erat.volutpat.Nulla@ipsum.org","Aliquam@IntegerurnaVivamus.co.uk","Nunc.sollicitudin@ipsumCurabitur.net","nibh.enim@quam.co.uk","pede@quismassa.com","vel.nisl@fringillacursuspurus.co.uk","vel@auctorvelitAliquam.org","auctor.quis.tristique@fringillamilacinia.org","nisl.elementum@amagna.com","facilisis@feugiattelluslorem.co.uk","eleifend.Cras@Vestibulumante.net","Integer.eu.lacus@ipsumCurabiturconsequat.com","Donec.porttitor@Etiamvestibulummassa.ca","montes@auctorquistristique.net","Nunc.ullamcorper.velit@Vivamusnon.co.uk","dictum.cursus@sed.org","Aliquam.erat.volutpat@nonummyut.org","ac.mattis@ligulaNullamenim.net","id.sapien.Cras@Proin.ca","Phasellus.dolor@fermentumfermentum.edu","in@odio.edu","non.luctus@pedeNuncsed.com","per.conubia@euismodacfermentum.com","luctus.aliquet@venenatisvelfaucibus.ca","nulla.Cras@purusaccumsaninterdum.ca","aliquet.vel.vulputate@pedesagittis.edu","rutrum@pedeultrices.co.uk","Nullam.lobortis@hendrerit.ca","nonummy.ac.feugiat@Sedmalesuadaaugue.edu","nibh@ipsum.com","in.faucibus.orci@vehicula.com","odio.vel.est@in.edu","amet.ornare.lectus@Suspendisse.co.uk","Maecenas.malesuada.fringilla@at.co.uk","Aliquam@aceleifendvitae.org","Nullam.feugiat.placerat@massaQuisque.ca","urna@tempor.org","magnis.dis.parturient@arcuCurabitur.edu","erat.vel@In.ca","rutrum@Integervitae.ca","metus.In@odio.co.uk","nec.imperdiet@tellus.ca","dui.semper.et@at.org","sit.amet@quisarcu.org","ante@Donecsollicitudinadipiscing.edu","turpis.egestas.Aliquam@egestasnunc.edu","posuere@quismassaMauris.co.uk","Nulla.dignissim@nibhAliquamornare.com","facilisis.vitae.orci@estmaurisrhoncus.net","vitae.aliquet.nec@nostraper.co.uk","lorem@enimsitamet.co.uk","pellentesque@acipsum.org","pede.et.risus@nonvestibulum.org","sed@Nuncsollicitudin.com","erat@Maurisvestibulum.org","scelerisque@tortorNunc.org","metus@idsapien.org","dignissim@Duis.ca","Duis.at.lacus@egestaslaciniaSed.com","auctor.velit@dapibus.co.uk","Curae.Phasellus.ornare@eudolor.net","arcu@metusfacilisis.ca","laoreet@dictummagna.net","tristique.neque@auctorvitaealiquet.ca","nunc.interdum.feugiat@primisinfaucibus.edu","elit.pede.malesuada@quam.net","semper.et.lacinia@ornareliberoat.ca","magna.Praesent.interdum@elit.net","consequat@loremDonec.ca","Vivamus@nisiMauris.edu","feugiat.tellus@sociisnatoquepenatibus.co.uk","scelerisque.mollis.Phasellus@facilisis.edu","rhoncus.Proin@enimEtiam.com","amet.consectetuer.adipiscing@lacusNullatincidunt.edu","aliquet.lobortis.nisi@leo.com","magna@purus.org","a@etmalesuadafames.com","Nunc.commodo@vulputatenisisem.net","et.rutrum.non@imperdieteratnonummy.com","consectetuer@mauris.net","iaculis.lacus@Proinvelarcu.ca","tincidunt.Donec.vitae@habitant.net","et.ultrices@nequesed.org","Lorem.ipsum@nonante.edu","Vestibulum.ut@sed.co.uk","fermentum.arcu@Duis.com","Morbi.quis.urna@vulputate.org","Sed.eget@liberolacusvarius.net","amet.lorem@tincidunt.co.uk","morbi@Classaptenttaciti.com","nisl.Quisque.fringilla@ut.ca","Aenean.egestas.hendrerit@eleifendnec.co.uk","elit@odio.net","sodales.Mauris.blandit@fermentumfermentumarcu.com","massa.non@Nuncsollicitudin.com","quam@sit.co.uk","consectetuer@quispedePraesent.co.uk","erat.eget@aliquetPhasellusfermentum.ca","libero@convalliserat.net","dui@arcu.ca","Curabitur@ascelerisquesed.org","amet@sed.com","in.aliquet.lobortis@acipsum.net","Donec.non@feugiatnec.com","Suspendisse.dui.Fusce@musProin.com","congue@loremauctor.co.uk","magna@Morbi.com","sit@dolor.edu","Praesent.eu.nulla@parturientmontes.com","eu.dui.Cum@arcuvelquam.org","leo.elementum@aliquet.edu","aliquam@urna.org","congue@nonummy.ca","urna.Nullam@atauctor.ca","natoque.penatibus@id.co.uk","aliquam.arcu@risusQuisque.com","ultrices.iaculis@liberoet.com","mollis.Integer.tincidunt@auctorvelit.org","sit@mus.org","est.mollis@orci.net","gravida@eunullaat.co.uk","varius.ultrices@Intinciduntcongue.org","Duis.cursus@nuncnulla.org","eu.turpis@Cumsociis.com","metus.In@sapiencursusin.org","a.feugiat.tellus@velitjusto.co.uk","nibh.lacinia.orci@mifelis.org","tincidunt.neque.vitae@Sed.ca","convallis.est.vitae@Donec.org","mauris@semelit.co.uk","Nam.interdum@Morbiquis.ca","vel.arcu.Curabitur@ullamcorperDuisat.net","dolor@mauris.com","Suspendisse@ipsum.org","Vivamus@dui.edu","condimentum.eget.volutpat@lobortisultrices.ca","commodo@et.edu","ut.ipsum@MorbimetusVivamus.co.uk","ut@feugiatnecdiam.org","Nam@ultrices.co.uk","orci.Donec@turpis.org","semper.tellus@venenatislacus.com","elit.elit@arcuimperdietullamcorper.edu"}; + win = elm_win_util_standard_add("combobox", "Combobox"); + elm_win_autodel_set(win, EINA_TRUE); + + ly = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/combobox_multiple.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "combobox_multiple_test"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, ly); + evas_object_show(ly); + + itc = elm_genlist_item_class_new(); + itc->item_style = "default"; + itc->func.text_get = gl2_text_get; + itc->func.content_get = gl_content_get; + itc->func.state_get = gl_state_get; + itc->func.filter_get = gl2_filter_get; + itc->func.del = NULL; + + combobox = elm_combobox_add(win); + evas_object_size_hint_weight_set(combobox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(combobox, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(combobox, "To:"); + elm_object_part_text_set(combobox, "guide", "Tap to add recipient"); + elm_combobox_multiple_selection_set(combobox, EINA_TRUE); + for (int i = 0; i < 300; i++) + elm_genlist_item_append(combobox, itc, (void *)email_address[i], + NULL, ELM_GENLIST_ITEM_NONE, NULL, + (void*)(uintptr_t)(i * 10)); + + evas_object_smart_callback_add(combobox, "clicked", + _combobox_clicked_cb, NULL); + evas_object_smart_callback_add(combobox, "item,selected", + _combobox_item_selected_cb, NULL); + evas_object_smart_callback_add(combobox, "dismissed", + _combobox_dismissed_cb, NULL); + evas_object_smart_callback_add(combobox, "expanded", + _combobox_expanded_cb, NULL); + evas_object_smart_callback_add(combobox, "item,pressed", + _combobox2_item_pressed_cb, NULL); + evas_object_smart_callback_add(combobox, "filter,done", + _gl_filter_finished_cb, NULL); + evas_object_smart_callback_add(combobox, "changed", + _gl2_filter_restart_cb, NULL); + elm_object_part_content_set(ly, "combobox", combobox); + evas_object_show(combobox); + + evas_object_resize(win, 640, 600); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_config.c b/src/bin/elementary/test_config.c new file mode 100644 index 0000000000..bf032a73ec --- /dev/null +++ b/src/bin/elementary/test_config.c @@ -0,0 +1,534 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +#ifdef MAX_PROFILES +# undef MAX_PROFILES +#endif + +#define MAX_PROFILES 20 + +#ifdef LOG +# undef LOG +#endif + +#define LOG(m) \ + do { \ + lb = elm_label_add(win); \ + elm_object_text_set(lb, m); \ + evas_object_size_hint_weight_set(lb, 0.0, 0.0); \ + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); \ + evas_object_show(lb); \ + } while(0) + +typedef struct _Prof_Data Prof_Data; +typedef struct _App_Data App_Data; + +struct _Prof_Data +{ + Evas_Object *rdg; + Eina_List *cks; + const char *profile; + const char *available_profiles[MAX_PROFILES]; + int count; +}; + +struct _App_Data +{ + Evas_Object *win; + Eina_List *profiles; + Prof_Data curr; + Prof_Data new; +}; + +void test_config(void *data, Evas_Object *obj, void *event_info); + +static void +_profile_clear(Prof_Data *pd) +{ + if (pd->profile) + eina_stringshare_del(pd->profile); + pd->profile = NULL; +} + +static void +_profiles_clear(Prof_Data *pd) +{ + int i; + for (i = 0; i < MAX_PROFILES; i++) + { + if (pd->available_profiles[i]) + eina_stringshare_del(pd->available_profiles[i]); + pd->available_profiles[i] = NULL; + } +} + +static void +_profile_update(Evas_Object *win) +{ + Evas_Object *lb = evas_object_data_get(win, "lb"); + char **profiles = NULL; + const char *profile; + unsigned int i, n = 0; + char buf[PATH_MAX]; + + profile = elm_win_profile_get(win); + snprintf(buf, sizeof(buf), + "Profile: <b>%s</b><br/>" + "Available profiles: <b>", + profile); + + elm_win_available_profiles_get(win, &profiles, &n); + if ((profiles) && (n > 0)) + { + for (i = 0; i < n; i++) + { + if (i >= 1) strncat(buf, ", ", 2); + strncat(buf, profiles[i], strlen(profiles[i]) + 1); + } + strncat(buf, "</b>", 4); + } + elm_object_text_set(lb, buf); +} + +static void +_bt_profile_set(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + App_Data *ad = evas_object_data_get((Evas_Object *)data, "ad"); + Evas_Object *rd = elm_radio_selected_object_get(ad->curr.rdg); + const char *profile = elm_object_text_get(rd); + if (strcmp(profile, "Nothing") != 0) + elm_win_profile_set(ad->win, elm_object_text_get(rd)); + else + elm_win_profile_set(ad->win, NULL); + _profile_update(ad->win); +} + +static void +_bt_available_profiles_set(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + App_Data *ad = evas_object_data_get((Evas_Object *)data, "ad"); + Eina_List *l = NULL; + const char *str; + Evas_Object *o; + int i = 0; + + _profiles_clear(&ad->curr); + + EINA_LIST_FOREACH(ad->curr.cks, l, o) + { + if (elm_check_state_get(o)) + { + str = evas_object_data_get(o, "profile"); + if (str) + { + ad->curr.available_profiles[i] = eina_stringshare_add(str); + i++; + } + } + } + ad->curr.count = i; + + elm_win_available_profiles_set(ad->win, + ad->curr.available_profiles, + ad->curr.count); + _profile_update(ad->win); +} + +static void +_bt_win_add(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + App_Data *ad = evas_object_data_get((Evas_Object *)data, "ad"); + Evas_Object *rd = elm_radio_selected_object_get(ad->new.rdg); + const char *profile = elm_object_text_get(rd); + const char *str; + Eina_List *l = NULL; + Evas_Object *o; + int i = 0; + + _profile_clear(&ad->new); + _profiles_clear(&ad->new); + + if (strcmp(profile, "Nothing") != 0) + ad->new.profile = (char *)eina_stringshare_add(profile); + + EINA_LIST_FOREACH(ad->new.cks, l, o) + { + if (elm_check_state_get(o)) + { + str = evas_object_data_get(o, "profile"); + if (str) + { + ad->new.available_profiles[i] = eina_stringshare_add(str); + i++; + } + } + } + ad->new.count = i; + + test_config(&(ad->new), NULL, NULL); +} + +static void +_win_profile_changed_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event EINA_UNUSED) +{ + _profile_update(obj); +} + +static void +_win_del_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + App_Data *ad = evas_object_data_get(obj, "ad"); + Evas_Object *o; + char *str; + + elm_config_profile_list_free(ad->profiles); + ad->profiles = NULL; + + EINA_LIST_FREE(ad->curr.cks, o) + { + str = evas_object_data_del(o, "profile"); + if (str) eina_stringshare_del(str); + } + + EINA_LIST_FREE(ad->new.cks, o) + { + str = evas_object_data_del(o, "profile"); + if (str) eina_stringshare_del(str); + } + + _profile_clear(&ad->curr); + _profiles_clear(&ad->curr); + _profile_clear(&ad->new); + _profiles_clear(&ad->new); + + free(ad); +} + +static Evas_Object * +_radio_add(Evas_Object *win, Evas_Object *bx) +{ + App_Data *ad = evas_object_data_get(win, "ad"); + Evas_Object *bx2, *rd, *rdg = NULL; + Eina_List *l = NULL; + const char *str; + int i = 0; + + bx2 = elm_box_add(win); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0.0); + elm_box_align_set(bx2, 0.0, 0.5); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + rdg = rd = elm_radio_add(win); + elm_radio_state_value_set(rd, i); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "Nothing"); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx2, rd); + evas_object_show(rd); + i++; + + EINA_LIST_FOREACH(ad->profiles, l, str) + { + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, i); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, str); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx2, rd); + evas_object_show(rd); + i++; + } + + return rdg; +} + +static Eina_List * +_check_add(Evas_Object *win, Evas_Object *bx) +{ + App_Data *ad = evas_object_data_get(win, "ad"); + Evas_Object *bx2, *ck; + Eina_List *l = NULL, *ll = NULL; + const char *str; + + bx2 = elm_box_add(win); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0.0); + elm_box_align_set(bx2, 0.0, 0.5); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + EINA_LIST_FOREACH(ad->profiles, l, str) + { + ck = elm_check_add(win); + elm_object_text_set(ck, str); + evas_object_data_set(ck, "profile", eina_stringshare_add(str)); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx2, ck); + evas_object_show(ck); + + ll = eina_list_append(ll, ck); + } + + return ll; +} + +static Evas_Object * +_inlined_add(Evas_Object *parent) +{ + Evas_Object *win, *bg, *bx, *lb; + + win = elm_win_add(parent, "inlined", ELM_WIN_INLINED_IMAGE); + if (!win) return NULL; + + bg = elm_bg_add(win); + elm_bg_color_set(bg, 110, 210, 120); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.0); + evas_object_show(bx); + + LOG("ELM_WIN_INLINED_IMAGE"); + elm_box_pack_end(bx, lb); + + LOG("Profile: <b>N/A</b>"); + elm_box_pack_end(bx, lb); + evas_object_data_set(win, "lb", lb); + + evas_object_move(win, 10, 100); + evas_object_resize(win, 150, 70); + evas_object_move(elm_win_inlined_image_object_get(win), 10, 100); + evas_object_resize(elm_win_inlined_image_object_get(win), 150, 70); + + evas_object_smart_callback_add(win, "profile,changed", _win_profile_changed_cb, NULL); + evas_object_show(win); + + return win; +} + +static Evas_Object * +_socket_add(const char *name) +{ + Evas_Object *win, *bg, *bx, *lb; + + win = elm_win_add(NULL, "socket image", ELM_WIN_SOCKET_IMAGE); + if (!win) return NULL; + + if (elm_win_socket_listen(win, name, 0, EINA_FALSE)) + { + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + elm_bg_color_set(bg, 80, 110, 205); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.0); + evas_object_show(bx); + + LOG("ELM_WIN_SOCKET_IMAGE"); + elm_box_pack_end(bx, lb); + + LOG("Profile: <b>N/A</b>"); + elm_box_pack_end(bx, lb); + evas_object_data_set(win, "lb", lb); + + _inlined_add(win); + + evas_object_move(win, 0, 0); + evas_object_resize(win, 150, 200); + + evas_object_smart_callback_add(win, "profile,changed", _win_profile_changed_cb, NULL); + evas_object_show(win); + } + else + { + evas_object_del(win); + win = NULL; + } + + return win; +} + +static Evas_Object * +_plug_add(Evas_Object *win, Evas_Object *bx, const char *name) +{ + Evas_Object *plug, *ly; + Eina_Bool res = EINA_FALSE; + char buf[PATH_MAX]; + + plug = elm_plug_add(win); + if (plug) res = elm_plug_connect(plug, name, 0, EINA_FALSE); + + if (res) + { + ly = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "win_config"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(ly); + + evas_object_size_hint_weight_set(plug, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, ly); + elm_object_part_content_set(ly, "swallow", plug); + evas_object_show(plug); + } + else + { + if (plug) evas_object_del(plug); + plug = NULL; + } + + return plug; +} + +#ifdef FRAME +# undef FRAME +#endif + +#define FRAME(t) \ + do { \ + fr = elm_frame_add(bx); \ + elm_object_text_set(fr, t); \ + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); \ + evas_object_size_hint_fill_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); \ + elm_box_pack_end(bx, fr); \ + evas_object_show(fr); \ + bx2 = elm_box_add(win); \ + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); \ + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0.0); \ + elm_box_align_set(bx2, 0.0, 0.5); \ + elm_object_content_set(fr, bx2); \ + evas_object_show(bx2); \ + } while(0) + +void +test_config(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + App_Data *ad; + Prof_Data *pd = (Prof_Data *)data; + Evas_Object *win, *sc, *bx, *fr, *bx2, *lb, *bt; + Ecore_Evas *ee; + const char *siname = "_TestConfigSocketImage_"; + char buf[PATH_MAX]; + + if (!(ad = calloc(1, sizeof(App_Data)))) return; + + win = elm_win_util_standard_add("config", "Configuration"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_data_set(win, "ad", ad); + ad->win = win; + ad->profiles = elm_config_profile_list_get(); + + sc = elm_scroller_add(win); + elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, sc); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_content_set(sc, bx); + + FRAME("Current window profile"); + ee = ecore_evas_ecore_evas_get(evas_object_evas_get(win)); + snprintf(buf, sizeof(buf), + "Virtual desktop window profile support: <b>%s</b>", + ecore_evas_window_profile_supported_get(ee) ? "Yes" : "No"); + LOG(buf); + elm_box_pack_end(bx2, lb); + + LOG("Profile: <b>N/A</b><br/>Available profiles:"); + elm_box_pack_end(bx2, lb); + evas_object_data_set(win, "lb", lb); + + LOG("<br/>Window profile"); + elm_box_pack_end(bx2, lb); + ad->curr.rdg = _radio_add(win, bx2); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Set"); + evas_object_smart_callback_add(bt, "clicked", _bt_profile_set, win); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + LOG("Window available profiles"); + elm_box_pack_end(bx2, lb); + ad->curr.cks = _check_add(win, bx2); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Set"); + evas_object_smart_callback_add(bt, "clicked", _bt_available_profiles_set, win); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + FRAME("Socket"); + if (_socket_add(siname)) + { + LOG("Starting socket image."); + elm_box_pack_end(bx2, lb); + } + else + { + LOG("Failed to create socket.<br/>" + "Please check whether another test configuration window is<br/>" + "already running and providing socket image."); + elm_box_pack_end(bx2, lb); + } + + FRAME("Plug"); + if (!_plug_add(win, bx2, siname)) + { + LOG("Failed to connect to server."); + elm_box_pack_end(bx2, lb); + } + + FRAME("Create new window with profile"); + LOG("Window profile"); + elm_box_pack_end(bx2, lb); + ad->new.rdg = _radio_add(win, bx2); + + LOG("Window available profiles"); + elm_box_pack_end(bx2, lb); + ad->new.cks = _check_add(win, bx2); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Create"); + evas_object_smart_callback_add(bt, "clicked", _bt_win_add, win); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + evas_object_smart_callback_add(win, "profile,changed", _win_profile_changed_cb, NULL); + evas_object_smart_callback_add(win, "delete,request", _win_del_cb, NULL); + + if (pd && !obj) //obj is NULL when called by _bt_win_add but not when user clicks this test + { + if (pd->available_profiles[0]) + elm_win_available_profiles_set(win, + pd->available_profiles, + pd->count); + if (pd->profile) + elm_win_profile_set(win, pd->profile); + + _profile_update(win); + } + + evas_object_show(bx); + evas_object_show(sc); + + evas_object_resize(win, 400, 500); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_conform.c b/src/bin/elementary/test_conform.c new file mode 100644 index 0000000000..f850b1c6e9 --- /dev/null +++ b/src/bin/elementary/test_conform.c @@ -0,0 +1,195 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +void +test_conformant(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) +{ + Evas_Object *win, *conform, *btn, *bx, *en; + + win = elm_win_util_standard_add("conformant", "Conformant"); + elm_win_autodel_set(win, EINA_TRUE); + elm_win_conformant_set(win, EINA_TRUE); + + conform = elm_conformant_add(win); + evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, conform); + evas_object_show(conform); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_single_line_set(en, EINA_TRUE); + elm_scroller_bounce_set(en, EINA_TRUE, EINA_FALSE); + elm_object_text_set(en, "This is the top entry here"); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + evas_object_show(en); + elm_box_pack_end(bx, en); + + btn = elm_button_add(win); + elm_object_text_set(btn, "Test Conformant"); + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn); + evas_object_show(btn); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_single_line_set(en, EINA_TRUE); + elm_scroller_bounce_set(en, EINA_TRUE, EINA_FALSE); + elm_object_text_set(en, "This is the middle entry here"); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + evas_object_show(en); + elm_box_pack_end(bx, en); + + btn = elm_button_add(win); + elm_object_text_set(btn, "Test Conformant"); + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn); + evas_object_show(btn); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_scroller_bounce_set(en, EINA_FALSE, EINA_TRUE); + elm_object_text_set(en, + "This is a multi-line entry at the bottom<br/>" + "This can contain more than 1 line of text and be " + "scrolled around to allow for entering of lots of " + "content. It is also to test to see that autoscroll " + "moves to the right part of a larger multi-line " + "text entry that is inside of a scroller than can be " + "scrolled around, thus changing the expected position " + "as well as cursor changes updating auto-scroll when " + "it is enabled."); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(en); + elm_box_pack_end(bx, en); + + elm_object_content_set(conform, bx); + evas_object_show(bx); + + evas_object_resize(win, 240, 240); + evas_object_show(win); +} + +static void +popobj(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) +{ + elm_naviframe_item_pop(data); +} + +void +test_conformant2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) +{ + Evas_Object *win, *conform, *btn, *bx, *en, *pg; + + win = elm_win_util_standard_add("conformant2", "Conformant 2"); + elm_win_autodel_set(win, EINA_TRUE); + elm_win_conformant_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_single_line_set(en, EINA_TRUE); + elm_scroller_bounce_set(en, EINA_TRUE, EINA_FALSE); + elm_object_text_set(en, "This is the top entry here"); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, en); + evas_object_show(en); + + btn = elm_button_add(win); + elm_object_focus_allow_set(btn, EINA_FALSE); + elm_object_text_set(btn, "Delete Below"); + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn); + evas_object_show(btn); + + pg = elm_naviframe_add(win); + evas_object_size_hint_weight_set(pg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(pg, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, pg); + evas_object_show(pg); + + evas_object_smart_callback_add(btn, "clicked", popobj, pg); + + conform = elm_conformant_add(win); + evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(conform, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_naviframe_item_simple_push(pg, conform); + evas_object_show(conform); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_scroller_bounce_set(en, EINA_FALSE, EINA_TRUE); + elm_object_text_set(en, "This entry and button below get deleted."); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(en); + elm_box_pack_end(bx, en); + + btn = elm_button_add(win); + elm_object_focus_allow_set(btn, EINA_FALSE); + elm_object_text_set(btn, "Delete this bottom bit 1"); + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn); + evas_object_show(btn); + + evas_object_smart_callback_add(btn, "clicked", popobj, pg); + + elm_object_content_set(conform, bx); + evas_object_show(bx); + + conform = elm_conformant_add(win); + evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(conform, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_naviframe_item_simple_push(pg, conform); + evas_object_show(conform); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_scroller_bounce_set(en, EINA_FALSE, EINA_TRUE); + elm_object_text_set(en, "This entry and button below get deleted."); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(en); + elm_box_pack_end(bx, en); + + btn = elm_button_add(win); + elm_object_focus_allow_set(btn, EINA_FALSE); + elm_object_text_set(btn, "Delete this bottom bit 2"); + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn); + evas_object_show(btn); + + evas_object_smart_callback_add(btn, "clicked", popobj, pg); + + elm_object_content_set(conform, bx); + evas_object_show(bx); + + evas_object_resize(win, 240, 480); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_conform_indicator.c b/src/bin/elementary/test_conform_indicator.c new file mode 100644 index 0000000000..d7c13b9e7b --- /dev/null +++ b/src/bin/elementary/test_conform_indicator.c @@ -0,0 +1,384 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static int vis = 0; +static int rotate_with_resize = 0; +static Evas_Object *win_port = NULL; +static Evas_Object *win_land = NULL; + +static void +_rot_0(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + if (rotate_with_resize) + elm_win_rotation_with_resize_set(win, 0); + else + elm_win_rotation_set(win, 0); +} + +static void +_rot_90(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + if (rotate_with_resize) + elm_win_rotation_with_resize_set(win, 90); + else + elm_win_rotation_set(win, 90); +} + +static void +_rot_180(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + if (rotate_with_resize) + elm_win_rotation_with_resize_set(win, 180); + else + elm_win_rotation_set(win, 180); +} + +static void +_rot_270(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + if (rotate_with_resize) + elm_win_rotation_with_resize_set(win, 270); + else + elm_win_rotation_set(win, 270); +} + +static void +_visible_change_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + + printf("visible change before = %d\n", vis); + if (vis == 0) + { + elm_win_indicator_mode_set(win, ELM_WIN_INDICATOR_SHOW); + vis = 1; + } + else + { + elm_win_indicator_mode_set(win, ELM_WIN_INDICATOR_HIDE); + vis = 0; + } + + /*Add App code here*/ + printf("visible change after = %d\n", vis); +} + +static void +_launch_conformant_indicator_window_btn_cb(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *conform, *bt, *bx; + Evas_Object *plug_port = NULL, *plug_land = NULL; + + win = elm_win_util_standard_add("conformant-indicator", + "Conformant Indicator"); + elm_win_autodel_set(win, EINA_TRUE); + elm_win_conformant_set(win, EINA_TRUE); + + //Create conformant + conform = elm_conformant_add(win); + evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, conform); + evas_object_show(conform); + + bx = elm_box_add(conform); + elm_object_content_set(conform, bx); + evas_object_show(bx); + + bt = elm_button_add(bx); + elm_object_text_set(bt, "Rot 0"); + evas_object_smart_callback_add(bt, "clicked", _rot_0, win); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(bx); + elm_object_text_set(bt, "Rot 90"); + evas_object_smart_callback_add(bt, "clicked", _rot_90, win); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(bx); + elm_object_text_set(bt, "Rot 180"); + evas_object_smart_callback_add(bt, "clicked", _rot_180, win); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(bx); + elm_object_text_set(bt, "Rot 270"); + evas_object_smart_callback_add(bt, "clicked", _rot_270, win); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + /* portrait plug */ + plug_port = elm_plug_add(bx); + if (!plug_port) + { + printf("fail to create plug to server [elm_indicator_portrait]\n"); + evas_object_del(win); + return; + } + + if (!elm_plug_connect(plug_port, "elm_indicator_portrait", 0, EINA_FALSE)) + { + printf("fail to connect to server [elm_indicator_portraits]\n"); + evas_object_del(win); + return; + } + evas_object_size_hint_weight_set(plug_port, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(plug_port, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(plug_port); + elm_box_pack_end(bx, plug_port); + + /* landscape plug */ + plug_land = elm_plug_add(bx); + if (!plug_land) + { + printf("fail to create plug to server [elm_indicator_landscape]\n"); + evas_object_del(win); + return; + } + if (!elm_plug_connect(plug_land, "elm_indicator_landscape", 0, EINA_FALSE)) + { + printf("fail to connect to server [elm_indicator_landscape]\n"); + evas_object_del(win); + return; + } + evas_object_size_hint_weight_set(plug_land, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(plug_land, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(plug_land); + elm_box_pack_end(bx, plug_land); + + bt = elm_button_add(bx); + elm_object_text_set(bt, "Show/Hide"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_smart_callback_add(bt, "clicked", _visible_change_cb, win); + + evas_object_resize(win, 400, 600); + evas_object_show(win); +} + +static void +_mouse_down_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Evas_Event_Mouse_Down *ev = event_info; + Evas_Object *sub_obj = data; + + printf("\nAPP mouse down [%d]x[%d] obj=%p type=%s\n", ev->canvas.x, ev->canvas.y,sub_obj,evas_object_type_get(sub_obj)); + + evas_object_move(sub_obj, ev->canvas.x, ev->canvas.y); +} + +static void +_mouse_move_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Evas_Event_Mouse_Move *ev = event_info; + Evas_Object *sub_obj = data; + if (!ev->buttons) return; + + printf("APP mouse move [%d]x[%d] obj=%p type=%s\n", ev->cur.canvas.x, ev->cur.canvas.y,sub_obj,evas_object_type_get(sub_obj)); + evas_object_move(sub_obj, ev->cur.canvas.x, ev->cur.canvas.y); +} + +static void +_fill_portrait(Evas_Object *win) +{ + Evas_Object *bg, *btn; + + bg = elm_bg_add(win); + evas_object_resize(bg, 720, 60); + elm_bg_color_set(bg, 221, 187, 187); + evas_object_show(bg); + + btn = elm_button_add(win); + if (!btn) + { + printf("fail to elm_button_add() \n"); + return; + } + + elm_object_text_set(btn, "portrait"); + + evas_object_resize(btn, 200, 50); + evas_object_move(btn, 260, 0); + evas_object_show(btn); + + // This checks whether the indicator gets mouse event from application correctly + evas_object_event_callback_add(bg, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, btn); + evas_object_event_callback_add(bg, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb, btn); +} + +static void +_fill_landscape(Evas_Object *win) +{ + Evas_Object *bg, *btn; + + bg = elm_bg_add(win); + evas_object_resize(bg, 1280, 60); + elm_bg_color_set(bg, 207, 255, 255); + evas_object_show(bg); + + btn = elm_button_add(win); + if (!btn) + { + printf("fail to elm_button_add() \n"); + return; + } + + elm_object_text_set(btn, "landscape"); + + evas_object_resize(btn, 200, 50); + evas_object_move(btn, 580, 0); + evas_object_show(btn); + + // This checks whether the indicator gets mouse event from application correctly + evas_object_event_callback_add(bg, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, btn); + evas_object_event_callback_add(bg, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb, btn); +} + +static Evas_Object * +_create_portrait(void) +{ + const char *port_indi_name; + + win_port = elm_win_add(NULL, "portrait_indicator", ELM_WIN_SOCKET_IMAGE); + if (!win_port) + { + printf("fail to create a portrait indicator window\n"); + return NULL; + } + elm_win_autodel_set(win_port, EINA_TRUE); + + port_indi_name = elm_config_indicator_service_get(0); + if (!port_indi_name) + { + printf("indicator has no portrait service name: use default name\n"); + port_indi_name = "elm_indicator_portrait"; + } + + if (!elm_win_socket_listen(win_port, port_indi_name, 0, EINA_FALSE)) + { + printf("failed to listen portrait window socket.\n"); + evas_object_del(win_port); + return NULL; + } + + elm_win_title_set(win_port, "win sock test:port"); + elm_win_borderless_set(win_port, EINA_TRUE); + + evas_object_move(win_port, 0, 0); + evas_object_resize(win_port, 720, 60); + + _fill_portrait(win_port); + + return win_port; +} + +static Evas_Object * +_create_landscape(void) +{ + const char *land_indi_name; + + win_land = elm_win_add(NULL, "win_socket_test:land", ELM_WIN_SOCKET_IMAGE); + if (!win_land) + { + printf("fail to create a landscape indicator window\n"); + return NULL; + } + elm_win_autodel_set(win_land, EINA_TRUE); + + land_indi_name = elm_config_indicator_service_get(90); + if (!land_indi_name) + { + printf("indicator has no landscape service name: use default name\n"); + land_indi_name = "elm_indicator_landscape"; + } + + if (!elm_win_socket_listen(win_land, land_indi_name, 0, 0)) + { + printf("fail to listen landscape window socket.\n"); + evas_object_del(win_land); + return NULL; + } + + elm_win_title_set(win_land, "win sock test:land"); + elm_win_borderless_set(win_land, EINA_TRUE); + + evas_object_move(win_land, 0, 0); + evas_object_resize(win_land, 1280, 60); + + _fill_landscape(win_land); + + return win_land; +} + +static void +_indicator_service_start_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event EINA_UNUSED) +{ + elm_object_disabled_set(data, EINA_TRUE); + + win_port = _create_portrait(); + if (!win_port) return; + + win_land = _create_landscape(); + if (!win_land) return; + + evas_object_show(win_port); + evas_object_show(win_land); + +} + +void +test_conformant_indicator(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event EINA_UNUSED) +{ + Evas_Object *win, *btn, *bx; + + win = elm_win_util_standard_add("conformant-indicator-service", + "Conformant Indicator Service"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + btn = elm_button_add(win); + elm_object_text_set(btn, "Start Indicator Service"); + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn); + evas_object_show(btn); + evas_object_smart_callback_add(btn, "clicked", + _indicator_service_start_btn_cb, btn); + + btn = elm_button_add(win); + elm_object_text_set(btn, "Launch Conformant Indicator Window"); + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn); + evas_object_show(btn); + evas_object_smart_callback_add(btn, "clicked", + _launch_conformant_indicator_window_btn_cb, NULL); + + evas_object_resize(win, 200, 200); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_ctxpopup.c b/src/bin/elementary/test_ctxpopup.c new file mode 100644 index 0000000000..27e5376a2a --- /dev/null +++ b/src/bin/elementary/test_ctxpopup.c @@ -0,0 +1,433 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static int list_mouse_down = 0; + +static void +_dismissed(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + evas_object_del(obj); +} + +static void +_print_current_dir(Evas_Object *obj) +{ + Elm_Ctxpopup_Direction dir; + dir = elm_ctxpopup_direction_get(obj); + + switch(dir) + { + case ELM_CTXPOPUP_DIRECTION_LEFT: + printf("ctxpopup direction: left!\n"); + break; + case ELM_CTXPOPUP_DIRECTION_RIGHT: + printf("ctxpopup direction: right!\n"); + break; + case ELM_CTXPOPUP_DIRECTION_UP: + printf("ctxpopup direction: up!\n"); + break; + case ELM_CTXPOPUP_DIRECTION_DOWN: + printf("ctxpopup direction: down!\n"); + break; + case ELM_CTXPOPUP_DIRECTION_UNKNOWN: + printf("ctxpopup direction: unknow!\n"); + break; + } + printf(" [%s : %d] auto_hide_mode=%d\n", __func__, __LINE__, elm_ctxpopup_auto_hide_disabled_get(obj)); +} + +static void +_btn_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("Button Clicked\n"); +} + +static void +_ctxpopup_item_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("ctxpopup item selected: %s\n", + elm_object_item_text_get(event_info)); +} + +static Elm_Object_Item * +_ctxpopup_item_new(Evas_Object *obj, const char *label, const char *icon) +{ + Evas_Object *ic = NULL; + Elm_Object_Item *it = NULL; + + if (!obj) return NULL; + + if (icon) + { + ic = elm_icon_add(obj); + elm_icon_standard_set(ic, icon); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + } + + it = elm_ctxpopup_item_append(obj, label, ic, _ctxpopup_item_cb, NULL); + return it; +} + +static void +_geometry_update(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Evas_Coord_Rectangle *geom = event_info; + printf("ctxpopup geometry(%d %d %d %d)\n", geom->x, geom->y, geom->w, geom->h); +} + +static void +_list_item_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *ctxpopup; + Elm_Object_Item *it = NULL; + Evas_Coord x,y; + + if (list_mouse_down > 0) return; + + ctxpopup = elm_ctxpopup_add(obj); + evas_object_smart_callback_add(ctxpopup, "dismissed", _dismissed, NULL); + evas_object_smart_callback_add(ctxpopup, "geometry,update", _geometry_update, NULL); + + _ctxpopup_item_new(ctxpopup, "Go to home folder", "home"); + _ctxpopup_item_new(ctxpopup, "Save file", "file"); + _ctxpopup_item_new(ctxpopup, "Delete file", "delete"); + it = _ctxpopup_item_new(ctxpopup, "Navigate to folder", "folder"); + elm_object_item_disabled_set(it, EINA_TRUE); + _ctxpopup_item_new(ctxpopup, "Edit entry", "edit"); + it = _ctxpopup_item_new(ctxpopup, "Set date and time", "clock"); + elm_object_item_disabled_set(it, EINA_TRUE); + + evas_pointer_canvas_xy_get(evas_object_evas_get(obj), &x, &y); + evas_object_size_hint_max_set(ctxpopup, 240, 240); + evas_object_move(ctxpopup, x, y); + evas_object_show(ctxpopup); + _print_current_dir(ctxpopup); +} + +static void +_list_item_cb2(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *ctxpopup; + Elm_Object_Item *it = NULL; + Evas_Coord x,y; + + if (list_mouse_down > 0) return; + + ctxpopup = elm_ctxpopup_add(obj); + evas_object_smart_callback_add(ctxpopup, "dismissed", _dismissed, NULL); + evas_object_smart_callback_add(ctxpopup, "geometry,update", _geometry_update, NULL); + + _ctxpopup_item_new(ctxpopup, NULL, "home"); + _ctxpopup_item_new(ctxpopup, NULL, "file"); + _ctxpopup_item_new(ctxpopup, NULL, "delete"); + _ctxpopup_item_new(ctxpopup, NULL, "folder"); + it = _ctxpopup_item_new(ctxpopup, NULL, "edit"); + elm_object_item_disabled_set(it, EINA_TRUE); + _ctxpopup_item_new(ctxpopup, NULL, "clock"); + + evas_pointer_canvas_xy_get(evas_object_evas_get(obj), &x, &y); + evas_object_size_hint_max_set(ctxpopup, 240, 240); + evas_object_move(ctxpopup, x, y); + evas_object_show(ctxpopup); + _print_current_dir(ctxpopup); +} + +static void +_list_item_cb3(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *ctxpopup; + Elm_Object_Item *it = NULL; + Evas_Coord x,y; + + if (list_mouse_down > 0) return; + + ctxpopup = elm_ctxpopup_add(obj); + evas_object_smart_callback_add(ctxpopup, "dismissed", _dismissed, NULL); + evas_object_smart_callback_add(ctxpopup, "geometry,update", _geometry_update, NULL); + + _ctxpopup_item_new(ctxpopup, "Eina", NULL); + _ctxpopup_item_new(ctxpopup, "Eet", NULL); + _ctxpopup_item_new(ctxpopup, "Evas", NULL); + it = _ctxpopup_item_new(ctxpopup, "Ecore", NULL); + elm_object_item_disabled_set(it, EINA_TRUE); + _ctxpopup_item_new(ctxpopup, "Embryo", NULL); + _ctxpopup_item_new(ctxpopup, "Edje", NULL); + + evas_pointer_canvas_xy_get(evas_object_evas_get(obj), &x, &y); + evas_object_move(ctxpopup, x, y); + evas_object_show(ctxpopup); + _print_current_dir(ctxpopup); +} + +static void +_list_item_cb4(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *ctxpopup; + Evas_Coord x,y; + + if (list_mouse_down > 0) return; + + ctxpopup = elm_ctxpopup_add(obj); + evas_object_smart_callback_add(ctxpopup, "dismissed", _dismissed, NULL); + evas_object_smart_callback_add(ctxpopup, "geometry,update", _geometry_update, NULL); + + elm_ctxpopup_horizontal_set(ctxpopup, EINA_TRUE); + + _ctxpopup_item_new(ctxpopup, NULL, "home"); + _ctxpopup_item_new(ctxpopup, NULL, "file"); + _ctxpopup_item_new(ctxpopup, NULL, "delete"); + _ctxpopup_item_new(ctxpopup, NULL, "folder"); + _ctxpopup_item_new(ctxpopup, NULL, "edit"); + _ctxpopup_item_new(ctxpopup, NULL, "clock"); + + evas_pointer_canvas_xy_get(evas_object_evas_get(obj), &x, &y); + evas_object_size_hint_max_set(ctxpopup, 240, 240); + evas_object_move(ctxpopup, x, y); + evas_object_show(ctxpopup); + _print_current_dir(ctxpopup); +} + +static void +_list_item_cb5(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *ctxpopup, *btn, *sc, *bx; + Evas_Coord x,y; + + if (list_mouse_down > 0) return; + + bx = elm_box_add(obj); + evas_object_size_hint_min_set(bx, 150, 150); + + sc = elm_scroller_add(bx); + elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE); + evas_object_size_hint_fill_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(sc); + + btn = elm_button_add(sc); + elm_object_text_set(btn, "Enlightenment"); + evas_object_size_hint_min_set(btn, 140, 140); + + elm_object_content_set(sc, btn); + + elm_box_pack_end(bx, sc); + + ctxpopup = elm_ctxpopup_add(obj); + evas_object_smart_callback_add(ctxpopup, "dismissed", _dismissed, NULL); + evas_object_smart_callback_add(ctxpopup, "geometry,update", _geometry_update, NULL); + + elm_object_content_set(ctxpopup, bx); + + evas_pointer_canvas_xy_get(evas_object_evas_get(obj), &x, &y); + evas_object_move(ctxpopup, x, y); + evas_object_show(ctxpopup); + _print_current_dir(ctxpopup); + + evas_object_smart_callback_add(btn, "clicked", _btn_clicked_cb, ctxpopup); +} + +static void +_ctxpopup_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + evas_object_del(data); +} + +static void +_restack_btn_clicked_cb(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Evas_Object *im, *ctxpopup = data; + char buf[PATH_MAX]; + + printf("Restack button clicked\n"); + + im = evas_object_image_filled_add(evas_object_evas_get(obj)); + snprintf(buf, sizeof(buf), "%s/images/%s", + elm_app_data_dir_get(), "twofish.jpg"); + evas_object_image_file_set(im, buf, NULL); + evas_object_move(im, 40, 40); + evas_object_resize(im, 320, 320); + evas_object_show(im); + + evas_object_raise(ctxpopup); + evas_object_event_callback_add(ctxpopup, EVAS_CALLBACK_DEL, + _ctxpopup_del_cb, im); +} + +static void +_list_item_cb6(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *ctxpopup, *btn, *sc, *bx; + Evas_Coord x,y; + + if (list_mouse_down > 0) return; + + bx = elm_box_add(obj); + evas_object_size_hint_min_set(bx, 200, 150); + + sc = elm_scroller_add(bx); + elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE); + evas_object_size_hint_fill_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(sc); + + btn = elm_button_add(sc); + elm_object_text_set(btn, "Ctxpop will be on the top of layer"); + evas_object_size_hint_min_set(btn, 190, 140); + + elm_object_content_set(sc, btn); + + elm_box_pack_end(bx, sc); + + ctxpopup = elm_ctxpopup_add(obj); + evas_object_smart_callback_add(ctxpopup, "dismissed", _dismissed, NULL); + evas_object_smart_callback_add(ctxpopup, "geometry,update", _geometry_update, NULL); + + elm_object_content_set(ctxpopup, bx); + + evas_pointer_canvas_xy_get(evas_object_evas_get(obj), &x, &y); + evas_object_move(ctxpopup, x, y); + evas_object_show(ctxpopup); + _print_current_dir(ctxpopup); + + evas_object_smart_callback_add(btn, "clicked", + _restack_btn_clicked_cb, ctxpopup); +} + +static void +_ctxpopup_item_disable_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("ctxpopup item selected: %s\n", + elm_object_item_text_get(event_info)); + + elm_object_item_disabled_set(event_info, EINA_TRUE); +} + +static void +_ctxpopup_item_delete_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info) +{ + printf("ctxpopup item selected: %s\n", + elm_object_item_text_get(event_info)); + + evas_object_del(obj); +} + +static void +_list_item_cb7(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *ctxpopup; + Evas_Coord x,y; + + if (list_mouse_down > 0) return; + ctxpopup = elm_ctxpopup_add(obj); + evas_object_smart_callback_add(ctxpopup, "dismissed", _dismissed, NULL); + evas_object_smart_callback_add(ctxpopup, "geometry,update", _geometry_update, NULL); + + elm_ctxpopup_item_append(ctxpopup, "Disable this item", NULL, _ctxpopup_item_disable_cb, ctxpopup); + elm_ctxpopup_item_append(ctxpopup, "Delete this ctxpopup", NULL, _ctxpopup_item_delete_cb, ctxpopup); + elm_ctxpopup_item_append(ctxpopup, "Another item", NULL, _ctxpopup_item_cb, NULL); + + evas_pointer_canvas_xy_get(evas_object_evas_get(obj), &x, &y); + evas_object_size_hint_max_set(ctxpopup, 240, 240); + evas_object_move(ctxpopup, x, y); + evas_object_show(ctxpopup); + _print_current_dir(ctxpopup); +} + +static void +_list_item_cb8(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *ctxpopup; + Elm_Object_Item *it = NULL; + Evas_Coord x,y; + + if (list_mouse_down > 0) return; + + ctxpopup = elm_ctxpopup_add(obj); + evas_object_smart_callback_add(ctxpopup, "dismissed", _dismissed, NULL); + evas_object_smart_callback_add(ctxpopup, "geometry,update", _geometry_update, NULL); + + elm_ctxpopup_auto_hide_disabled_set(ctxpopup, EINA_TRUE); + + _ctxpopup_item_new(ctxpopup, "Go to home folder", "home"); + _ctxpopup_item_new(ctxpopup, "Save file", "file"); + _ctxpopup_item_new(ctxpopup, "Delete file", "delete"); + it = _ctxpopup_item_new(ctxpopup, "Navigate to folder", "folder"); + elm_object_item_disabled_set(it, EINA_TRUE); + _ctxpopup_item_new(ctxpopup, "Edit entry", "edit"); + + evas_pointer_canvas_xy_get(evas_object_evas_get(obj), &x, &y); + evas_object_move(ctxpopup, x, y); + evas_object_show(ctxpopup); + _print_current_dir(ctxpopup); +} + +static void +_list_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + elm_list_item_selected_set(event_info, EINA_FALSE); +} + +static void +_list_mouse_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + list_mouse_down++; +} + +static void +_list_mouse_up(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + list_mouse_down--; +} + +static void +_win_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + list_mouse_down = 0; +} + +void +test_ctxpopup(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *list; + + win = elm_win_util_standard_add("contextual-popup", "Contextual Popup"); + evas_object_smart_callback_add(win, "delete,request", _win_del, NULL); + elm_win_autodel_set(win, EINA_TRUE); + + list = elm_list_add(win); + evas_object_event_callback_add(list, EVAS_CALLBACK_MOUSE_DOWN, + _list_mouse_down, NULL); + evas_object_event_callback_add(list, EVAS_CALLBACK_MOUSE_UP, + _list_mouse_up, NULL); + evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, list); + elm_list_mode_set(list, ELM_LIST_COMPRESS); + evas_object_smart_callback_add(list, "selected", _list_clicked, NULL); + + elm_list_item_append(list, "Ctxpopup with icons and labels", NULL, NULL, + _list_item_cb, NULL); + elm_list_item_append(list, "Ctxpopup with icons only", NULL, NULL, + _list_item_cb2, NULL); + elm_list_item_append(list, "Ctxpopup with labels only", NULL, NULL, + _list_item_cb3, NULL); + elm_list_item_append(list, "Ctxpopup at horizontal mode", NULL, NULL, + _list_item_cb4, NULL); + elm_list_item_append(list, "Ctxpopup with user content", NULL, NULL, + _list_item_cb5, NULL); + elm_list_item_append(list, "Ctxpopup with restacking", NULL, NULL, + _list_item_cb6, NULL); + elm_list_item_append(list, "Ctxpopup with callback function", NULL, NULL, + _list_item_cb7, NULL); + elm_list_item_append(list, "Ctxpopup with auto hide disabled mode", NULL, NULL, + _list_item_cb8, NULL); + evas_object_show(list); + elm_list_go(list); + + evas_object_resize(win, 400, 400); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_cursor.c b/src/bin/elementary/test_cursor.c new file mode 100644 index 0000000000..1e6401abb9 --- /dev/null +++ b/src/bin/elementary/test_cursor.c @@ -0,0 +1,473 @@ +#include <Elementary_Cursor.h> +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +// XXX: show all type of cursors in the elementary_test. this needs to be the first test + +typedef struct _Testitem +{ + Elm_Object_Item *item; + const char *path; + int mode; + int onoff; +} Testitem; + +static Elm_Gengrid_Item_Class gic; +static Eina_Bool cursor_setted = EINA_FALSE; + +char * +grd_lbl_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + const Testitem *ti = data; + char buf[256]; + snprintf(buf, sizeof(buf), "Photo %s", ti->path); + return strdup(buf); +} + +Evas_Object * +grd_content_get(void *data, Evas_Object *obj, const char *part) +{ + const Testitem *ti = data; + if (!strcmp(part, "elm.swallow.icon")) + { + Evas_Object *icon = elm_bg_add(obj); + elm_bg_file_set(icon, ti->path, NULL); + evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, + 1, 1); + evas_object_show(icon); + return icon; + } + return NULL; +} + +static Elm_Genlist_Item_Class itct; + +static void +glt_exp(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *glit = event_info; + Evas_Object *gl = elm_object_item_widget_get(glit); + int val = (int)(uintptr_t) elm_object_item_data_get(glit); + Elm_Object_Item *glit1, *glit2, *glit3; + + val *= 10; + glit1 = elm_genlist_item_append(gl, &itct, (void *)(uintptr_t) (val + 1), glit, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + glit2 = elm_genlist_item_append(gl, &itct, (void *)(uintptr_t) (val + 2), glit, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + glit3 = elm_genlist_item_append(gl, &itct, (void *)(uintptr_t) (val + 3), glit, + ELM_GENLIST_ITEM_TREE, NULL, NULL); + + elm_genlist_item_cursor_set(glit1, ELM_CURSOR_HAND2); + elm_genlist_item_cursor_set(glit2, ELM_CURSOR_HAND2); + elm_genlist_item_cursor_set(glit3, ELM_CURSOR_HAND1); + +} + +static void +glt_con(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *glit = event_info; + elm_genlist_item_subitems_clear(glit); +} + +static void +glt_exp_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *glit = event_info; + elm_genlist_item_expanded_set(glit, EINA_TRUE); +} + +static void +glt_con_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *glit = event_info; + elm_genlist_item_expanded_set(glit, EINA_FALSE); +} + +char * +glt_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + char buf[256]; + snprintf(buf, sizeof(buf), "Item mode %i", (int)(uintptr_t)data); + return strdup(buf); +} + +static void +bt_clicked(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + if (cursor_setted) + { + elm_object_cursor_unset(obj); + cursor_setted = EINA_FALSE; + elm_object_text_set(obj, "Cursor set on click"); + } + else + { + elm_object_cursor_set(obj, ELM_CURSOR_HAND1); + cursor_setted = EINA_TRUE; + elm_object_text_set(obj, "Cursor unset on click"); + } +} + +void +test_cursor(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bg, *bx, *bt, *list, *entry, *ck; + Elm_Object_Item *lit; + + win = elm_win_add(NULL, "cursor", ELM_WIN_BASIC); + elm_win_title_set(win, "Cursor"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + elm_object_cursor_set(bg, ELM_CURSOR_CIRCLE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + ck = elm_clock_add(win); + elm_object_cursor_set(ck, ELM_CURSOR_CLOCK); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + bt = elm_button_add(win); + elm_object_cursor_set(bt, ELM_CURSOR_COFFEE_MUG); + elm_object_text_set(bt, "Coffee Mug"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_cursor_set(bt, ELM_CURSOR_CLOCK); + elm_object_text_set(bt, "Cursor unset"); + elm_object_cursor_unset(bt); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Cursor set on click"); + evas_object_smart_callback_add(bt, "clicked", bt_clicked, NULL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + list = elm_list_add(win); + elm_box_pack_end(bx, list); + evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_cursor_set(list, ELM_CURSOR_WATCH); + lit = elm_list_item_append(list, "watch over list | hand1", NULL, NULL, NULL, + NULL); + elm_object_item_cursor_set(lit, ELM_CURSOR_HAND1); + lit = elm_list_item_append(list, "watch over list | hand2", NULL, NULL, NULL, + NULL); + elm_object_item_cursor_set(lit, ELM_CURSOR_HAND2); + elm_list_go(list); + evas_object_show(list); + + entry = elm_entry_add(win); + elm_entry_scrollable_set(entry, EINA_TRUE); + elm_object_text_set(entry, "Xterm cursor"); + elm_entry_single_line_set(entry, EINA_TRUE); + evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_fill_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, entry); + evas_object_show(entry); + elm_object_cursor_set(entry, ELM_CURSOR_XTERM); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} + +void +test_cursor2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *o, *grid, *gl; + Elm_Object_Item *glit1, *glit2, *glit3; + Elm_Object_Item *tb_it; + Elm_Object_Item *lit; + char buf[PATH_MAX]; + static Testitem ti[144]; + int i, n; + const char *img[9] = + { + "panel_01.jpg", + "plant_01.jpg", + "rock_01.jpg", + "rock_02.jpg", + "sky_01.jpg", + "sky_02.jpg", + "sky_03.jpg", + "sky_04.jpg", + "wood_01.jpg", + }; + + win = elm_win_util_standard_add("cursor2", "Cursor 2"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + o = elm_toolbar_add(win); + elm_toolbar_homogeneous_set(o, EINA_FALSE); + evas_object_size_hint_weight_set(o, 0.0, 0.0); + evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.0); + tb_it = elm_toolbar_item_append(o, NULL, "Bogosity", NULL, NULL); + elm_object_item_cursor_set(tb_it, ELM_CURSOR_BOGOSITY); + tb_it = elm_toolbar_item_append(o, NULL, "Unset", NULL, NULL); + elm_object_item_cursor_set(tb_it, ELM_CURSOR_BOGOSITY); + elm_object_item_cursor_unset(tb_it); + tb_it = elm_toolbar_item_append(o, NULL, "Xterm", NULL, NULL); + elm_object_item_cursor_set(tb_it, ELM_CURSOR_XTERM); + elm_box_pack_end(bx, o); + evas_object_show(o); + + o = elm_list_add(win); + elm_box_pack_end(bx, o); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + lit = elm_list_item_append(o, "cursor bogosity", NULL, NULL, NULL, NULL); + elm_object_item_cursor_set(lit, ELM_CURSOR_BOGOSITY); + lit = elm_list_item_append(o, "cursor unset", NULL, NULL, NULL, NULL); + elm_object_item_cursor_set(lit, ELM_CURSOR_BOGOSITY); + elm_object_item_cursor_unset(lit); + lit = elm_list_item_append(o, "cursor xterm", NULL, NULL, NULL, NULL); + elm_object_item_cursor_set(lit, ELM_CURSOR_XTERM); + elm_list_go(o); + evas_object_show(o); + + gl = elm_genlist_add(win); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(gl); + + itct.item_style = "default"; + itct.func.text_get = glt_text_get; + + glit1 = elm_genlist_item_append(gl, &itct, (void *) 1, NULL, + ELM_GENLIST_ITEM_TREE, NULL, NULL); + glit2 = elm_genlist_item_append(gl, &itct, (void *) 2, NULL, + ELM_GENLIST_ITEM_TREE, NULL, NULL); + glit3 = elm_genlist_item_append(gl, &itct, (void *) 3, NULL, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + + elm_genlist_item_cursor_set(glit1, ELM_CURSOR_HAND1); + elm_genlist_item_cursor_set(glit2, ELM_CURSOR_HAND1); + elm_genlist_item_cursor_set(glit3, ELM_CURSOR_CROSS); + + evas_object_smart_callback_add(gl, "expand,request", glt_exp_req, gl); + evas_object_smart_callback_add(gl, "contract,request", glt_con_req, gl); + evas_object_smart_callback_add(gl, "expanded", glt_exp, gl); + evas_object_smart_callback_add(gl, "contracted", glt_con, gl); + + elm_box_pack_end(bx, gl); + + grid = elm_gengrid_add(win); + elm_gengrid_item_size_set(grid, 130, 130); + elm_gengrid_horizontal_set(grid, EINA_FALSE); + elm_gengrid_multi_select_set(grid, EINA_TRUE); + evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL); + + gic.item_style = "default"; + gic.func.text_get = grd_lbl_get; + gic.func.content_get = grd_content_get; + + n = 0; + for (i = 0; i < 3 * 3; i++) + { + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]); + n = (n + 1) % 9; + ti[i].mode = i; + ti[i].path = eina_stringshare_add(buf); + ti[i].item = elm_gengrid_item_append(grid, &gic, &(ti[i]), NULL, NULL); + if (n % 2) + elm_gengrid_item_cursor_set(ti[i].item, ELM_CURSOR_HAND1); + else + elm_gengrid_item_cursor_set(ti[i].item, ELM_CURSOR_CLOCK); + if (!(i % 5)) + elm_gengrid_item_selected_set(ti[i].item, EINA_TRUE); + } + elm_box_pack_end(bx, grid); + evas_object_show(grid); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} + +void +test_cursor3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *o; + Elm_Object_Item *lit; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("cursor3", "Cursor 3"); + elm_win_autodel_set(win, EINA_TRUE); + + snprintf(buf, sizeof(buf), "%s/objects/cursors.edj", elm_app_data_dir_get()); + elm_theme_extension_add(NULL, buf); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + o = elm_button_add(win); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_cursor_set(o, ELM_CURSOR_HAND1); + elm_object_cursor_theme_search_enabled_set(o, EINA_TRUE); + elm_object_text_set(o, "hand1"); + elm_box_pack_end(bx, o); + evas_object_show(o); + + o = elm_button_add(win); + elm_object_cursor_set(o, ELM_CURSOR_HAND2); + elm_object_text_set(o, "hand2 x"); + elm_box_pack_end(bx, o); + evas_object_show(o); + + o = elm_button_add(win); + elm_object_cursor_set(o, ELM_CURSOR_HAND2); + elm_object_cursor_theme_search_enabled_set(o, EINA_TRUE); + elm_object_text_set(o, "hand2"); + elm_box_pack_end(bx, o); + evas_object_show(o); + + o = elm_button_add(win); + elm_object_cursor_set(o, "hand3"); + elm_object_cursor_theme_search_enabled_set(o, EINA_TRUE); + elm_object_text_set(o, "hand3"); + elm_box_pack_end(bx, o); + evas_object_show(o); + + o = elm_button_add(win); + elm_object_cursor_set(o, "hand3"); + elm_object_cursor_theme_search_enabled_set(o, EINA_TRUE); + elm_object_cursor_style_set(o, "transparent"); + elm_object_text_set(o, "hand3 transparent"); + elm_box_pack_end(bx, o); + evas_object_show(o); + + o = elm_button_add(win); + elm_object_cursor_set(o, "hand3"); + elm_object_cursor_theme_search_enabled_set(o, EINA_TRUE); + elm_object_cursor_unset(o); + elm_object_text_set(o, "unset"); + elm_box_pack_end(bx, o); + evas_object_show(o); + + o = elm_button_add(win); + elm_object_cursor_set(o, "hand4"); + elm_object_text_set(o, "not existent"); + elm_box_pack_end(bx, o); + evas_object_show(o); + + elm_config_cursor_engine_only_set(EINA_FALSE); + o = elm_button_add(win); + elm_object_cursor_set(o, "hand2"); + elm_object_text_set(o, "hand 2 engine only config false"); + elm_box_pack_end(bx, o); + evas_object_show(o); + + elm_config_cursor_engine_only_set(EINA_TRUE); + o = elm_button_add(win); + elm_object_cursor_set(o, "hand2"); + elm_object_text_set(o, "hand 2 engine only config true"); + elm_box_pack_end(bx, o); + evas_object_show(o); + + o = elm_list_add(win); + elm_box_pack_end(bx, o); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + lit = elm_list_item_append(o, "cursor hand2 x", NULL, NULL, NULL, NULL); + elm_object_item_cursor_set(lit, ELM_CURSOR_HAND2); + lit = elm_list_item_append(o, "cursor hand2", NULL, NULL, NULL, NULL); + elm_object_item_cursor_set(lit, ELM_CURSOR_HAND2); + elm_object_item_cursor_engine_only_set(lit, EINA_FALSE); + lit = elm_list_item_append(o, "cursor hand3", NULL, NULL, NULL, NULL); + elm_object_item_cursor_set(lit, "hand3"); + elm_object_item_cursor_engine_only_set(lit, EINA_FALSE); + lit = elm_list_item_append(o, "cursor hand3 transparent", NULL, NULL, + NULL, NULL); + elm_object_item_cursor_set(lit, "hand3"); + elm_object_item_cursor_style_set(lit, "transparent"); + elm_object_item_cursor_engine_only_set(lit, EINA_FALSE); + elm_list_go(o); + evas_object_show(o); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} + +void +test_cursor4(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *ly, *bt; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("cursor layout", "Cursor Layout"); + elm_win_autodel_set(win, EINA_TRUE); + + snprintf(buf, sizeof(buf), "%s/objects/cursors.edj", elm_app_data_dir_get()); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + ly = elm_layout_add(win); + elm_layout_file_set(ly, buf, "test/layout/events"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_cursor_set(ly, ELM_CURSOR_HAND1); + elm_box_pack_end(bx, ly); + evas_object_show(ly); + + ly = elm_layout_add(win); + elm_layout_file_set(ly, buf, "test/layout/noevents"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_cursor_set(ly, ELM_CURSOR_XTERM); + elm_layout_part_cursor_set(ly, "top-left", ELM_CURSOR_CROSS); + elm_layout_part_cursor_set(ly, "bottom-left", ELM_CURSOR_PIRATE); + elm_box_pack_end(bx, ly); + evas_object_show(ly); + + ly = elm_layout_add(win); + elm_layout_file_set(ly, buf, "test/layout/parts2"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_layout_part_cursor_set(ly, "top-left", ELM_CURSOR_CROSS); + elm_layout_part_cursor_set(ly, "bottom-left", ELM_CURSOR_PIRATE); + elm_box_pack_end(bx, ly); + evas_object_show(ly); + + ly = elm_layout_add(win); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_layout_file_set(ly, buf, "test/layout/swallow"); + bt = elm_button_add(win); + elm_object_text_set(bt, "Cursor over obj"); + elm_object_part_content_set(ly, "swallow1", bt); + elm_object_cursor_set(bt, ELM_CURSOR_PIRATE); + bt = elm_button_add(win); + elm_object_text_set(bt, "Cursor over part"); + elm_object_part_content_set(ly, "swallow2", bt); + elm_layout_part_cursor_set(ly, "swallow2", ELM_CURSOR_PIRATE); + elm_box_pack_end(bx, ly); + evas_object_show(ly); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_datetime.c b/src/bin/elementary/test_datetime.c new file mode 100644 index 0000000000..8a8a199eff --- /dev/null +++ b/src/bin/elementary/test_datetime.c @@ -0,0 +1,107 @@ +#ifdef HAVE_CONFIG_H +#include "elementary_config.h" +#endif +#include <Elementary.h> + +/* A simple test, just displaying datetime in its default format */ + +Evas_Object *dt1, *dt2, *dt3; + +static void +_changed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("Datetime value is changed\n"); +} + +static void +_bt_clicked(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + time_t t; + struct tm new_time; + + t = time(NULL); + localtime_r(&t, &new_time); + + new_time.tm_year = 85; + new_time.tm_mon = 9; + new_time.tm_mday = 26; + new_time.tm_hour = 9; + new_time.tm_min = 0; + elm_datetime_field_visible_set(dt1, ELM_DATETIME_HOUR, EINA_TRUE); + elm_datetime_field_visible_set(dt1, ELM_DATETIME_MINUTE, EINA_TRUE); + elm_datetime_value_set(dt1, &new_time); + elm_object_disabled_set(dt1, EINA_TRUE); + + elm_object_disabled_set(obj, EINA_TRUE); + evas_object_del(dt2); + evas_object_del(dt3); + dt2 = dt3 = NULL; +} + +void +test_datetime(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bt; + time_t t; + struct tm time1; + + win = elm_win_util_standard_add("datetime", "DateTime"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + elm_box_horizontal_set(bx, EINA_FALSE); + evas_object_show(bx); + evas_object_size_hint_min_set(bx, 360, 240); + + dt1 = elm_datetime_add(bx); + evas_object_size_hint_weight_set(dt1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(dt1, EVAS_HINT_FILL, 0.5); + elm_datetime_field_visible_set(dt1, ELM_DATETIME_HOUR, EINA_FALSE); + elm_datetime_field_visible_set(dt1, ELM_DATETIME_MINUTE, EINA_FALSE); + elm_datetime_field_visible_set(dt1, ELM_DATETIME_AMPM, EINA_FALSE); + elm_box_pack_end(bx, dt1); + evas_object_show(dt1); + + dt2 = elm_datetime_add(bx); + evas_object_size_hint_weight_set(dt2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(dt2, EVAS_HINT_FILL, 0.5); + elm_datetime_field_visible_set(dt2, ELM_DATETIME_YEAR, EINA_FALSE); + elm_datetime_field_visible_set(dt2, ELM_DATETIME_MONTH, EINA_FALSE); + elm_datetime_field_visible_set(dt2, ELM_DATETIME_DATE, EINA_FALSE); + elm_box_pack_end(bx, dt2); + elm_object_disabled_set(dt2, EINA_TRUE); + evas_object_show(dt2); + + dt3 = elm_datetime_add(bx); + evas_object_size_hint_weight_set(dt3, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(dt3, EVAS_HINT_FILL, 0.5); + + // get the current local time + t = time(NULL); + localtime_r(&t, &time1); + // set the max year as 2030 and the remaining fields are equal to current time values + time1.tm_year = 130; + elm_datetime_value_max_set(dt3, &time1); + // set the min time limit as "1980 January 10th 02:30 PM" + time1.tm_year = 80; + time1.tm_mon = 4; + time1.tm_mday = 10; + time1.tm_hour = 14; + time1.tm_min = 30; + elm_datetime_value_min_set(dt3, &time1); + // minutes can be input only in between 15 and 45 + elm_datetime_field_limit_set(dt3, ELM_DATETIME_MINUTE, 15, 45); + evas_object_smart_callback_add(dt3, "changed", _changed_cb, NULL); + elm_box_pack_end(bx, dt3); + evas_object_show(dt3); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Back to the future..."); + evas_object_smart_callback_add(bt, "clicked", _bt_clicked, NULL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + evas_object_show(win); +} diff --git a/src/bin/elementary/test_dayselector.c b/src/bin/elementary/test_dayselector.c new file mode 100644 index 0000000000..16259e32fa --- /dev/null +++ b/src/bin/elementary/test_dayselector.c @@ -0,0 +1,125 @@ +#ifdef HAVE_CONFIG_H +#include "elementary_config.h" +#endif +#include <Elementary.h> + +static void _changed_cb(void* data EINA_UNUSED, Evas_Object* obj, void* event_info) +{ + char buf[256]; + Elm_Dayselector_Day day = (Elm_Dayselector_Day) event_info; + Eina_Bool checked = elm_dayselector_day_selected_get(obj, day); + + switch(day) + { + case ELM_DAYSELECTOR_SUN: + snprintf(buf, sizeof(buf), "%s", "Sun"); + break; + case ELM_DAYSELECTOR_MON: + snprintf(buf, sizeof(buf), "%s", "Mon"); + break; + case ELM_DAYSELECTOR_TUE: + snprintf(buf, sizeof(buf), "%s", "Tue"); + break; + case ELM_DAYSELECTOR_WED: + snprintf(buf, sizeof(buf), "%s", "Wed"); + break; + case ELM_DAYSELECTOR_THU: + snprintf(buf, sizeof(buf), "%s", "Thu"); + break; + case ELM_DAYSELECTOR_FRI: + snprintf(buf, sizeof(buf), "%s", "Fri"); + break; + case ELM_DAYSELECTOR_SAT: + snprintf(buf, sizeof(buf), "%s", "Sat"); + break; + default: + snprintf(buf, sizeof(buf), "%s", "???"); + break; + } + fprintf(stderr, "%s = %d\n", buf, checked); +} + +void +test_dayselector(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *dayselector, *monday; + Eina_List *weekdays_list; + const char *weekday; + const char *weekdays[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; + const char *weekdays2[] = {"S", "M", "T", "W", "T", "F", "S"}; + + win = elm_win_util_standard_add("dayselector", "Day Selector"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + // Default + dayselector = elm_dayselector_add(bx); + evas_object_size_hint_weight_set(dayselector, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(dayselector, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, dayselector); + evas_object_show(dayselector); + evas_object_smart_callback_add(dayselector, "dayselector,changed", + _changed_cb, NULL); + + //Sunday first + dayselector = elm_dayselector_add(bx); + evas_object_size_hint_weight_set(dayselector, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(dayselector, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, dayselector); + evas_object_show(dayselector); + evas_object_smart_callback_add(dayselector, "dayselector,changed", + _changed_cb, NULL); + elm_dayselector_weekdays_names_set(dayselector, weekdays); + elm_dayselector_week_start_set(dayselector, ELM_DAYSELECTOR_SUN); + + //Special Style + dayselector = elm_dayselector_add(bx); + evas_object_size_hint_weight_set(dayselector, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(dayselector, EVAS_HINT_FILL, 0.5); + elm_dayselector_week_start_set(dayselector, ELM_DAYSELECTOR_MON); + elm_box_pack_end(bx, dayselector); + evas_object_show(dayselector); + evas_object_smart_callback_add(dayselector, "dayselector,changed", + _changed_cb, NULL); + monday = elm_object_part_content_get(dayselector, "day0"); + elm_object_signal_emit(monday, "elm,type,weekend,style1", ""); + + //Setting weekday name + dayselector = elm_dayselector_add(bx); + evas_object_size_hint_weight_set(dayselector, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(dayselector, EVAS_HINT_FILL, 0.5); + elm_dayselector_weekdays_names_set(dayselector, weekdays2); + elm_box_pack_end(bx, dayselector); + evas_object_show(dayselector); + evas_object_smart_callback_add(dayselector, "dayselector,changed", + _changed_cb, NULL); + + weekdays_list = elm_dayselector_weekdays_names_get(dayselector); + + fprintf(stderr, "User set weekday names to: "); + EINA_LIST_FREE(weekdays_list, weekday) + { + fprintf(stderr, "%s\n", weekday); + eina_stringshare_del(weekday); + } + + //Disabled + dayselector = elm_dayselector_add(bx); + evas_object_size_hint_weight_set(dayselector, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(dayselector, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, dayselector); + evas_object_show(dayselector); + elm_object_disabled_set(dayselector, EINA_TRUE); + + evas_object_resize(win, 350, 150); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_disable.c b/src/bin/elementary/test_disable.c new file mode 100644 index 0000000000..3d5c6a8f90 --- /dev/null +++ b/src/bin/elementary/test_disable.c @@ -0,0 +1,207 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void +_disable_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Eina_Bool status = EINA_FALSE; + status = elm_object_disabled_get(data); + elm_object_disabled_set(data, !status); +} + +void +test_box_disable(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bt, *bx_out, *fr, *lb; + Evas_Object *btn[4]; + + win = elm_win_util_standard_add("box-enable/disable", "Box Enable/Disable"); + elm_win_autodel_set(win, EINA_TRUE); + + bx_out = elm_box_add(win); + evas_object_size_hint_weight_set(bx_out, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx_out); + evas_object_show(bx_out); + + fr = elm_frame_add(bx_out); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx_out, fr); + elm_object_text_set(fr, "Description"); + evas_object_show(fr); + + bx = elm_box_add(fr); + elm_object_content_set(fr, bx); + evas_object_show(bx); + + lb = elm_label_add(bx); + elm_object_text_set(lb, "This test shows how enable/disable of Container widget works"); + evas_object_size_hint_align_set(lb, 0.0, EVAS_HINT_FILL); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + btn[0] = elm_button_add(bx); + elm_object_text_set(btn[0], "Disable/Enable Box"); + evas_object_size_hint_weight_set(btn[0], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn[0], EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn[0]); + evas_object_show(btn[0]); + + btn[1] = elm_button_add(bx); + elm_object_text_set(btn[1], "Disable/Enable Button 1"); + evas_object_size_hint_weight_set(btn[1], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn[1], EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn[1]); + evas_object_show(btn[1]); + + btn[2] = elm_button_add(bx); + elm_object_text_set(btn[2], "Disable/Enable Button 2"); + evas_object_size_hint_weight_set(btn[2], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn[2], EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn[2]); + evas_object_show(btn[2]); + + btn[3] = elm_button_add(bx); + elm_object_text_set(btn[3], "Disable/Enable Button 3"); + evas_object_size_hint_weight_set(btn[3], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn[3], EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn[3]); + evas_object_show(btn[3]); + + bx = elm_box_add(bx_out); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx_out, bx); + evas_object_show(bx); + evas_object_smart_callback_add(btn[0], "clicked", _disable_cb, bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 1"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_smart_callback_add(btn[1], "clicked", _disable_cb, bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 2"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_smart_callback_add(btn[2], "clicked", _disable_cb, bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 3"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_smart_callback_add(btn[3], "clicked", _disable_cb, bt); + + evas_object_resize(win, 300, 300); + evas_object_show(win); +} + +void +test_layout_disable(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *box, *ly, *bt; + Evas_Object *fr, *btn[4], *bx, *lb; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("layout", "Layout"); + elm_win_autodel_set(win, EINA_TRUE); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + fr = elm_frame_add(box); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, fr); + elm_object_text_set(fr, "Description"); + evas_object_show(fr); + + bx = elm_box_add(fr); + elm_object_content_set(fr, bx); + evas_object_show(bx); + + lb = elm_label_add(bx); + elm_object_text_set(lb, "This test shows how enable/disable of Container widget works"); + evas_object_size_hint_align_set(lb, 0.0, EVAS_HINT_FILL); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + btn[0] = elm_button_add(bx); + elm_object_text_set(btn[0], "Disable/Enable Layout"); + evas_object_size_hint_weight_set(btn[0], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn[0], EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn[0]); + evas_object_show(btn[0]); + + btn[1] = elm_button_add(bx); + elm_object_text_set(btn[1], "Disable/Enable Button 1"); + evas_object_size_hint_weight_set(btn[1], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn[1], EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn[1]); + evas_object_show(btn[1]); + + btn[2] = elm_button_add(bx); + elm_object_text_set(btn[2], "Disable/Enable Button 2"); + evas_object_size_hint_weight_set(btn[2], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn[2], EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn[2]); + evas_object_show(btn[2]); + + btn[3] = elm_button_add(bx); + elm_object_text_set(btn[3], "Disable/Enable Button 3"); + evas_object_size_hint_weight_set(btn[3], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn[3], EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn[3]); + evas_object_show(btn[3]); + + ly = elm_layout_add(win); + + if (!elm_layout_theme_set( + ly, "layout", "application", "titlebar")) + fprintf(stderr, "Failed to set layout"); + + elm_object_part_text_set(ly, "elm.text", "Layout Disable/Enable Test"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, ly); + evas_object_show(ly); + + ly = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "layout"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(box, ly); + evas_object_show(ly); + evas_object_smart_callback_add(btn[0], "clicked", _disable_cb, ly); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 1"); + elm_object_part_content_set(ly, "element1", bt); + evas_object_show(bt); + evas_object_smart_callback_add(btn[1], "clicked", _disable_cb, bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 2"); + elm_object_part_content_set(ly, "element2", bt); + evas_object_show(bt); + evas_object_smart_callback_add(btn[2], "clicked", _disable_cb, bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 3"); + elm_object_part_content_set(ly, "element3", bt); + evas_object_show(bt); + evas_object_smart_callback_add(btn[3], "clicked", _disable_cb, bt); + + evas_object_show(win); +} diff --git a/src/bin/elementary/test_diskselector.c b/src/bin/elementary/test_diskselector.c new file mode 100644 index 0000000000..a6e14f7609 --- /dev/null +++ b/src/bin/elementary/test_diskselector.c @@ -0,0 +1,355 @@ +#include "test.h" +#include <Elementary_Cursor.h> +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +struct _api_data +{ + unsigned int state; /* What state we are testing */ + void *box; /* Use this to get box content */ +}; +typedef struct _api_data api_data; + +enum _api_state +{ + SCROLLER_POLICY_SET_ON, + SCROLLER_POLICY_SET_OFF, + BOUNCE_SET, + ITEM_LABEL_SET, + TOOLTIP_TEXT_SET, + ITEM_TOOLTIP_UNSET, + ITEM_CURSOR_SET, + ITEM_CURSOR_UNSET, + ITEM_ICON_SET, + SELECTED_SET, + ITEM_PREV_GET, + ITEM_DEL_NOT_SELECTED, + ITEM_DEL, /* delete when selected */ + CLEAR, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + const Eina_List *disks = elm_box_children_get(api->box); + if (!eina_list_count(disks)) + return; + + switch(api->state) + { /* Put all api-changes under switch */ + case SCROLLER_POLICY_SET_ON: /* 0 */ + { /* Get first disk */ + Evas_Object *disk = eina_list_nth(disks, 0); + elm_scroller_policy_set(disk, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON); + } + break; + + case SCROLLER_POLICY_SET_OFF: /* 1 */ + { /* Get first disk */ + Evas_Object *disk = eina_list_nth(disks, 0); + elm_scroller_policy_set(disk, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + } + break; + + case BOUNCE_SET: /* 2 */ + { /* Get second disk, cancel bounce */ + Evas_Object *disk = eina_list_nth(disks, 1); + elm_scroller_bounce_set(disk, EINA_FALSE, EINA_FALSE); + } + break; + + case ITEM_LABEL_SET: /* 3 */ + elm_object_item_text_set(elm_diskselector_selected_item_get(eina_list_nth(disks, 0)), "Label from API"); + break; + + case TOOLTIP_TEXT_SET: /* 4 */ + elm_object_item_tooltip_text_set(elm_diskselector_selected_item_get(eina_list_nth(disks, 0)), "Tooltip from API"); + break; + + case ITEM_TOOLTIP_UNSET: /* 5 */ + elm_object_item_tooltip_unset(elm_diskselector_selected_item_get(eina_list_nth(disks, 0))); + break; + + case ITEM_CURSOR_SET: /* 6 */ + elm_object_item_cursor_set(elm_diskselector_selected_item_get(eina_list_nth(disks, 0)), ELM_CURSOR_HAND2); + break; + + case ITEM_CURSOR_UNSET: /* 7 */ + elm_object_item_cursor_unset(elm_diskselector_selected_item_get(eina_list_nth(disks, 0))); + break; + + case ITEM_ICON_SET: /* 8 */ + { /* Set icon of selected item in first disk */ + char buf[PATH_MAX]; + Evas_Object *ic = elm_icon_add(elm_object_parent_widget_get(eina_list_nth(disks, 0))); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_object_item_part_content_set(elm_diskselector_selected_item_get(eina_list_nth(disks, 0)), NULL, ic); + evas_object_show(ic); + } + break; + + case SELECTED_SET: /* 9 */ + { /* Select NEXT item of third disk */ + elm_diskselector_item_selected_set(elm_diskselector_last_item_get(eina_list_nth(disks, 1)), EINA_TRUE); + elm_diskselector_item_selected_set(elm_diskselector_item_next_get(elm_diskselector_selected_item_get(eina_list_nth(disks, 2))), EINA_TRUE); + } + break; + + case ITEM_PREV_GET: /* 10 */ + { /* Select PREV item of third disk */ + elm_diskselector_item_selected_set(elm_diskselector_item_prev_get(elm_diskselector_selected_item_get(eina_list_nth(disks, 2))), EINA_TRUE); + } + break; + + case ITEM_DEL_NOT_SELECTED: /* 11 */ + { /* Remove selected item of third disk */ + elm_object_item_del(elm_diskselector_item_prev_get(elm_diskselector_selected_item_get(eina_list_nth(disks, 2)))); + } + break; + + case ITEM_DEL: /* 12 */ + { /* Remove selected item of first disk */ + elm_object_item_del(elm_diskselector_selected_item_get(eina_list_nth(disks, 1))); + } + break; + + case CLEAR: /* 13 */ + elm_diskselector_clear(eina_list_nth(disks, 0)); + break; + + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(obj, str); + elm_object_disabled_set(obj, a->state == API_STATE_LAST); +} + +static void +_disk_sel(void *data EINA_UNUSED, Evas_Object * obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *ds_it = event_info; + printf("Equinox: %s\n", elm_object_item_text_get(ds_it)); +} + +static void +_disk_next(void *data EINA_UNUSED, Evas_Object * obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *next_ds_it, *prev_ds_it, *ds_it = event_info; + prev_ds_it = elm_diskselector_item_prev_get(ds_it); + next_ds_it = elm_diskselector_item_next_get(ds_it); + printf("Prev: %s, Next: %s\n", elm_object_item_text_get(prev_ds_it), + elm_object_item_text_get(next_ds_it)); +} + +static void +_print_disk_info_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *ds_it = event_info; + printf("Selected label: %s\n", elm_object_item_text_get(ds_it)); +} + +static void +_item_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *ds_it = event_info; + printf("Clicked label: %s\n", elm_object_item_text_get(ds_it)); +} + +static Evas_Object * +_disk_create(Evas_Object *parent, Eina_Bool rnd) +{ + Elm_Object_Item *ds_it; + Evas_Object *di; + + di = elm_diskselector_add(parent); + + elm_diskselector_item_append(di, "January", NULL, NULL, NULL); + elm_diskselector_item_append(di, "February", NULL, _disk_next, NULL); + elm_diskselector_item_append(di, "March", NULL, _disk_sel, NULL); + elm_diskselector_item_append(di, "April", NULL, NULL, NULL); + elm_diskselector_item_append(di, "May", NULL, NULL, NULL); + elm_diskselector_item_append(di, "June", NULL, NULL, NULL); + elm_diskselector_item_append(di, "July", NULL, NULL, NULL); + ds_it = elm_diskselector_item_append(di, "August", NULL, NULL, NULL); + elm_diskselector_item_append(di, "September", NULL, _disk_sel, NULL); + elm_diskselector_item_append(di, "October", NULL, NULL, NULL); + elm_diskselector_item_append(di, "November", NULL, NULL, NULL); + elm_diskselector_item_append(di, "December", NULL, NULL, NULL); + + elm_diskselector_item_selected_set(ds_it, EINA_TRUE); + elm_diskselector_round_enabled_set(di, rnd); + + return di; +} + +static void +_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + free(data); +} + +void +test_diskselector(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *disk, *ic, *bxx, *bt; + Elm_Object_Item *ds_it; + char buf[PATH_MAX]; + api_data *api = calloc(1, sizeof(api_data)); + int idx = 0; + + char *month_list[] = { + "Jan", "Feb", "Mar", + "Apr", "May", "Jun", + "Jul", "Aug", "Sep", + "Oct", "Nov", "Dec" + }; + char date[3]; + + win = elm_win_util_standard_add("diskselector", "Disk Selector"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bxx = elm_box_add(win); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bxx); + evas_object_show(bxx); + + bt = elm_button_add(bxx); + elm_object_text_set(bt, "Next API function"); + evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api); + elm_object_disabled_set(bt, api->state == API_STATE_LAST); + evas_object_show(bt); + elm_box_pack_end(bxx, bt); + + bx = elm_box_add(bxx); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(bx); + elm_box_pack_end(bxx, bx); + api->box = bx; + + disk = _disk_create(bx, EINA_TRUE); + evas_object_size_hint_weight_set(disk, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(disk, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, disk); + evas_object_show(disk); + evas_object_smart_callback_add(disk, "selected", _print_disk_info_cb, NULL); + ds_it = elm_diskselector_selected_item_get(disk); + elm_diskselector_item_selected_set(ds_it, EINA_FALSE); + + disk = _disk_create(bx, EINA_FALSE); + evas_object_size_hint_weight_set(disk, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(disk, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, disk); + evas_object_show(disk); + evas_object_smart_callback_add(disk, "selected", _print_disk_info_cb, NULL); + ds_it = elm_diskselector_first_item_get(disk); + ds_it = elm_diskselector_item_next_get(ds_it); + elm_diskselector_item_selected_set(ds_it, EINA_TRUE); + + disk = _disk_create(bx, EINA_FALSE); + evas_object_size_hint_weight_set(disk, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(disk, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, disk); + evas_object_show(disk); + evas_object_smart_callback_add(disk, "selected", _print_disk_info_cb, NULL); + elm_diskselector_side_text_max_length_set(disk, 4); + + disk = elm_diskselector_add(bx); + ic = elm_icon_add(disk); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_diskselector_item_append(disk, "Sunday", ic, NULL, NULL); + elm_diskselector_item_append(disk, "Monday", NULL, NULL, NULL); + elm_diskselector_item_append(disk, "Tuesday", NULL, NULL, NULL); + elm_diskselector_item_append(disk, "Wednesday", NULL, NULL, NULL); + elm_diskselector_item_append(disk, "Thursday", NULL, NULL, NULL); + elm_diskselector_item_append(disk, "Friday", NULL, NULL, NULL); + elm_diskselector_item_append(disk, "Saturday", NULL, NULL, NULL); + elm_diskselector_round_enabled_set(disk, EINA_TRUE); + evas_object_size_hint_weight_set(disk, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(disk, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, disk); + evas_object_show(disk); + evas_object_smart_callback_add(disk, "selected", _print_disk_info_cb, NULL); + + disk = elm_diskselector_add(bx); + ic = elm_icon_add(disk); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_diskselector_item_append(disk, "머리스타일", ic, NULL, NULL); + elm_diskselector_item_append(disk, "プロが伝授する", NULL, NULL, NULL); + elm_diskselector_item_append(disk, "生上访要求政府", NULL, NULL, NULL); + elm_diskselector_item_append(disk, "English", NULL, NULL, NULL); + elm_diskselector_item_append(disk, "والشريعة", NULL, NULL, NULL); + elm_diskselector_item_append(disk, "עִבְרִית", NULL, NULL, NULL); + elm_diskselector_item_append(disk, "Grüßen", NULL, NULL, NULL); + elm_diskselector_round_enabled_set(disk, EINA_TRUE); + evas_object_size_hint_weight_set(disk, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(disk, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, disk); + evas_object_show(disk); + evas_object_smart_callback_add(disk, "selected", _print_disk_info_cb, NULL); + + // displayed item number setting example + disk = elm_diskselector_add(bx); + elm_diskselector_display_item_num_set(disk, 5); + printf("Number of Items in DiskSelector : %d\n", + elm_diskselector_display_item_num_get(disk)); + + for (idx = 0; idx < (int)(sizeof(month_list) / sizeof(month_list[0])); idx++) + { + ds_it = elm_diskselector_item_append(disk, month_list[idx], NULL, NULL, + NULL); + } + + elm_diskselector_item_selected_set(ds_it, EINA_TRUE); + elm_diskselector_round_enabled_set(disk, EINA_TRUE); + evas_object_size_hint_weight_set(disk, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(disk, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, disk); + evas_object_show(disk); + evas_object_smart_callback_add(disk, "selected", _print_disk_info_cb, NULL); + evas_object_smart_callback_add(disk, "clicked", _item_clicked_cb, NULL); + + // displayed item number setting example + disk = elm_diskselector_add(bx); + elm_diskselector_display_item_num_set(disk, 7); + printf("Number of Items in DiskSelector : %d\n", + elm_diskselector_display_item_num_get(disk)); + + for (idx = 1; idx < 31; idx++) + { + snprintf(date, sizeof(date), "%d", idx); + ds_it = elm_diskselector_item_append(disk, date, NULL, NULL, NULL); + } + + elm_diskselector_item_selected_set(ds_it, EINA_TRUE); + elm_diskselector_round_enabled_set(disk, EINA_TRUE); + evas_object_size_hint_weight_set(disk, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(disk, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, disk); + evas_object_show(disk); + evas_object_smart_callback_add(disk, "selected", _print_disk_info_cb, NULL); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_dnd.c b/src/bin/elementary/test_dnd.c new file mode 100644 index 0000000000..40c2c61c11 --- /dev/null +++ b/src/bin/elementary/test_dnd.c @@ -0,0 +1,1399 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +#define FILESEP "file://" +#define FILESEP_LEN sizeof(FILESEP) - 1 + +static const char *img[9] = +{ + "panel_01.jpg", + "plant_01.jpg", + "rock_01.jpg", + "rock_02.jpg", + "sky_01.jpg", + "sky_02.jpg", + "sky_03.jpg", + "sky_04.jpg", + "wood_01.jpg", +}; + +struct _anim_icon_st +{ + int start_x; + int start_y; + Evas_Object *o; +}; +typedef struct _anim_icon_st anim_icon_st; + +struct _drag_anim_st +{ + Evas_Object *icwin; + Evas *e; + Evas_Coord mdx; /* Mouse-down x */ + Evas_Coord mdy; /* Mouse-down y */ + Eina_List *icons; /* List of icons to animate (anim_icon_st) */ + Ecore_Timer *tm; + Ecore_Animator *ea; + Evas_Object *gl; +}; +typedef struct _drag_anim_st drag_anim_st; + +#define DRAG_TIMEOUT 0.3 +#define ANIM_TIME 0.5 + +static Eina_Bool _5s_cancel = EINA_FALSE; +static Ecore_Timer *_5s_timeout = NULL; + +static int +_item_ptr_cmp(const void *d1, const void *d2) +{ + return ((const char *) d1 - (const char *) d2); +} + +static Elm_Genlist_Item_Class *itc1; +static Elm_Gengrid_Item_Class *gic; + +static const char * +_drag_data_build(Eina_List **items) +{ + const char *drag_data = NULL; + if (*items) + { + Eina_List *l; + Elm_Object_Item *it; + const char *t; + unsigned int len = 0; + + EINA_LIST_FOREACH(*items, l, it) + { + t = (char *)elm_object_item_data_get(it); + if (t) + len += strlen(t); + } + + drag_data = malloc(len + eina_list_count(*items) * (FILESEP_LEN + 1) + 1); + strcpy((char *) drag_data, ""); + + /* drag data in form: file://URI1\nfile://URI2\n */ + EINA_LIST_FOREACH(*items, l, it) + { + t = (char *)elm_object_item_data_get(it); + if (t) + { + strcat((char *) drag_data, FILESEP); + strcat((char *) drag_data, t); + } + } + } + return drag_data; +} + +static char * +_drag_data_extract(char **drag_data) +{ + char *uri = NULL; + if (!drag_data) + return uri; + + char *p = *drag_data; + if (!p) + return uri; + char *s = strstr(p, FILESEP); + if (s) + p += FILESEP_LEN; + s = strchr(p, '\n'); + uri = p; + if (s) + { + if (s - p > 0) + { + char *s1 = s - 1; + if (s1[0] == '\r') + s1[0] = '\0'; + else + { + char *s2 = s + 1; + if (s2[0] == '\r') + { + s[0] = '\0'; + s++; + } + else + s[0] = '\0'; + } + } + else + s[0] = '\0'; + s++; + } + else + p = NULL; + *drag_data = s; + + return uri; +} + +static char * +gl_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + return strdup(data); +} + +static Evas_Object * +gl_content_get(void *data, Evas_Object *obj, const char *part) +{ + if (!strcmp(part, "elm.swallow.icon")) + { + Evas_Object *icon = elm_icon_add(obj); + elm_image_file_set(icon, data, NULL); + evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + evas_object_show(icon); + return icon; + } + return NULL; +} + +static void +gl_del_cb(void *data, Evas_Object *obj EINA_UNUSED) +{ + eina_stringshare_del(data); +} + +static void +_win_del(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("<%s> <%d> will del <%p>\n", __func__, __LINE__, data); + elm_drop_item_container_del(data); + elm_drag_item_container_del(data); + + if (gic) elm_gengrid_item_class_free(gic); + gic = NULL; + if (itc1) elm_genlist_item_class_free(itc1); + itc1 = NULL; +} + +static Elm_Object_Item * +_gl_item_getcb(Evas_Object *obj, Evas_Coord x, Evas_Coord y, int *xposret EINA_UNUSED, int *yposret) +{ /* This function returns pointer to item under (x,y) coords */ + printf("<%s> <%d> obj=<%p>\n", __func__, __LINE__, obj); + Elm_Object_Item *gli; + gli = elm_genlist_at_xy_item_get(obj, x, y, yposret); + if (gli) + printf("over <%s>, gli=<%p> yposret %i\n", + (char *)elm_object_item_data_get(gli), gli, *yposret); + else + printf("over none, yposret %i\n", *yposret); + return gli; +} + +static Elm_Object_Item * +_grid_item_getcb(Evas_Object *obj, Evas_Coord x, Evas_Coord y, int *xposret, int *yposret) +{ /* This function returns pointer to item under (x,y) coords */ + printf("<%s> <%d> obj=<%p>\n", __func__, __LINE__, obj); + Elm_Object_Item *item; + item = elm_gengrid_at_xy_item_get(obj, x, y, xposret, yposret); + if (item) + printf("over <%s>, item=<%p> xposret %i yposret %i\n", + (char *)elm_object_item_data_get(item), item, *xposret, *yposret); + else + printf("over none, xposret %i yposret %i\n", *xposret, *yposret); + return item; +} + +static inline char * +_strndup(const char *str, size_t len) +{ + size_t slen = strlen(str); + char *ret; + + if (slen > len) slen = len; + ret = malloc (slen + 1); + if (!ret) return NULL; + + if (slen > 0) memcpy(ret, str, slen); + ret[slen] = '\0'; + return ret; +} + +static void +_gl_poscb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Object_Item *it, Evas_Coord x, Evas_Coord y, int xposret, int yposret, Elm_Xdnd_Action action EINA_UNUSED) +{ + printf("<%s> <%d> obj: %p, item: %p <%s>, x y: %d %d, posret: %d %d\n", + __func__, __LINE__, obj, it, elm_object_item_text_get(it), + x, y, xposret, yposret); +} + +static Eina_Bool +_gl_dropcb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Object_Item *it, Elm_Selection_Data *ev, int xposret EINA_UNUSED, int yposret) +{ /* This function is called when data is dropped on the genlist */ + printf("<%s> <%d> str=<%s>\n", __func__, __LINE__, (char *) ev->data); + if (!ev->data) + return EINA_FALSE; + if (ev->len <= 0) + return EINA_FALSE; + + char *dd = _strndup(ev->data, ev->len); + if (!dd) return EINA_FALSE; + char *p = dd; + + char *s = _drag_data_extract(&p); + while (s) + { + switch(yposret) + { + case -1: /* Dropped on top-part of the it item */ + { + elm_genlist_item_insert_before(obj, + itc1, strdup(s), NULL, it, + ELM_GENLIST_ITEM_NONE, + NULL, NULL); + break; + } + case 0: /* Dropped on center of the it item */ + case 1: /* Dropped on botton-part of the it item */ + { + if (!it) it = elm_genlist_last_item_get(obj); + if (it) it = elm_genlist_item_insert_after(obj, + itc1, strdup(s), NULL, it, + ELM_GENLIST_ITEM_NONE, + NULL, NULL); + else + it = elm_genlist_item_append(obj, + itc1, strdup(s), NULL, + ELM_GENLIST_ITEM_NONE, + NULL, NULL); + break; + } + default: + { + free(dd); + return EINA_FALSE; + } + } + + s = _drag_data_extract(&p); + } + free(dd); + + return EINA_TRUE; +} + +static Eina_Bool +_grid_dropcb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Object_Item *it, Elm_Selection_Data *ev, int xposret EINA_UNUSED, int yposret EINA_UNUSED) +{ /* This function is called when data is dropped on the genlist */ + printf("<%s> <%d> str=<%s>\n", __func__, __LINE__, (char *) ev->data); + if (!ev->data) + return EINA_FALSE; + if (ev->len <= 0) + return EINA_FALSE; + + char *dd = _strndup(ev->data, ev->len); + if (!dd) return EINA_FALSE; + char *p = dd; + char *s = _drag_data_extract(&p); + while(s) + { + if (it) + it = elm_gengrid_item_insert_after(obj, gic, eina_stringshare_add(s), it, NULL, NULL); + else + it = elm_gengrid_item_append(obj, gic, eina_stringshare_add(s), NULL, NULL); + s = _drag_data_extract(&p); + } + free(dd); + + return EINA_TRUE; +} + +static void _gl_obj_mouse_move( void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _gl_obj_mouse_up( void *data, Evas *e, Evas_Object *obj, void *event_info); + +static void +anim_st_free(drag_anim_st *anim_st) +{ /* Stops and free mem of ongoing animation */ + printf("<%s> <%d>\n", __func__, __LINE__); + if (anim_st) + { + evas_object_event_callback_del_full + (anim_st->gl, EVAS_CALLBACK_MOUSE_MOVE, _gl_obj_mouse_move, anim_st); + evas_object_event_callback_del_full + (anim_st->gl, EVAS_CALLBACK_MOUSE_UP, _gl_obj_mouse_up, anim_st); + if (anim_st->tm) + { + ecore_timer_del(anim_st->tm); + anim_st->tm = NULL; + } + + if (anim_st->ea) + { + ecore_animator_del(anim_st->ea); + anim_st->ea = NULL; + } + + anim_icon_st *st; + + EINA_LIST_FREE(anim_st->icons, st) + { + evas_object_hide(st->o); + evas_object_del(st->o); + free(st); + } + + free(anim_st); + } +} + +static Eina_Bool +_drag_anim_play(void *data, double pos) +{ /* Impl of the animation of icons, called on frame time */ + drag_anim_st *anim_st = data; + printf("<%s> <%d>\n", __func__, __LINE__); + Eina_List *l; + anim_icon_st *st; + + if (anim_st) + { + if (pos > 0.99) + { + anim_st->ea = NULL; /* Avoid deleting on mouse up */ + + EINA_LIST_FOREACH(anim_st->icons, l, st) + evas_object_hide(st->o); /* Hide animated icons */ + anim_st_free(anim_st); + return ECORE_CALLBACK_CANCEL; + } + + EINA_LIST_FOREACH(anim_st->icons, l, st) + { + int x, y, w, h; + Evas_Coord xm, ym; + evas_object_geometry_get(st->o, NULL, NULL, &w, &h); + evas_pointer_canvas_xy_get(anim_st->e, &xm, &ym); + x = st->start_x + (pos * (xm - (st->start_x + (w/2)))); + y = st->start_y + (pos * (ym - (st->start_y + (h/2)))); + evas_object_move(st->o, x, y); + } + + return ECORE_CALLBACK_RENEW; + } + + return ECORE_CALLBACK_CANCEL; +} + +static Eina_Bool +_gl_anim_start(void *data) +{ /* Start icons animation before actually drag-starts */ + drag_anim_st *anim_st = data; + printf("<%s> <%d>\n", __func__, __LINE__); + int yposret = 0; + + Eina_List *l; + Eina_List *items = eina_list_clone(elm_genlist_selected_items_get(anim_st->gl)); + Elm_Object_Item *gli = elm_genlist_at_xy_item_get(anim_st->gl, + anim_st->mdx, anim_st->mdy, &yposret); + if (gli) + { /* Add the item mouse is over to the list if NOT seleced */ + void *p = eina_list_search_unsorted(items, _item_ptr_cmp, gli); + if (!p) + items = eina_list_append(items, gli); + } + + EINA_LIST_FOREACH(items, l, gli) + { /* Now add icons to animation window */ + Evas_Object *o = elm_object_item_part_content_get(gli, + "elm.swallow.icon"); + + if (o) + { + int w, h; + const char *f; + const char *g; + anim_icon_st *st = calloc(1, sizeof(*st)); + elm_image_file_get(o, &f, &g); + Evas_Object *ic = elm_icon_add(anim_st->gl); + elm_image_file_set(ic, f, g); + evas_object_geometry_get(o, &st->start_x, &st->start_y, &w, &h); + evas_object_size_hint_align_set(ic, + EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(ic, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + evas_object_move(ic, st->start_x, st->start_y); + evas_object_resize(ic, w, h); + evas_object_show(ic); + + st->o = ic; + anim_st->icons = eina_list_append(anim_st->icons, st); + } + } + + eina_list_free(items); + + anim_st->tm = NULL; + anim_st->ea = ecore_animator_timeline_add(DRAG_TIMEOUT, + _drag_anim_play, anim_st); + + return ECORE_CALLBACK_CANCEL; +} + +static void +_gl_obj_mouse_up( + void *data, + Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ /* Cancel any drag waiting to start on timeout */ + drag_anim_st *anim_st = data; + anim_st_free(anim_st); +} + +static void +_gl_obj_mouse_move( + void *data, + Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info) +{ /* Cancel any drag waiting to start on timeout */ + + if (((Evas_Event_Mouse_Move *)event_info)->event_flags & EVAS_EVENT_FLAG_ON_HOLD) + { + drag_anim_st *anim_st = data; + anim_st_free(anim_st); + } +} + +static void +_gl_obj_mouse_down( + void *data, + Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info) +{ /* Launch a timer to start drag animation */ + Evas_Event_Mouse_Down *ev = event_info; + drag_anim_st *anim_st = calloc(1, sizeof(*anim_st)); + anim_st->e = e; + anim_st->mdx = ev->canvas.x; + anim_st->mdy = ev->canvas.y; + anim_st->gl = data; + anim_st->tm = ecore_timer_add(DRAG_TIMEOUT, _gl_anim_start, anim_st); + evas_object_event_callback_add(data, EVAS_CALLBACK_MOUSE_UP, + _gl_obj_mouse_up, anim_st); + evas_object_event_callback_add(data, EVAS_CALLBACK_MOUSE_MOVE, + _gl_obj_mouse_move, anim_st); +} +/* END - Handling drag start animation */ + +static void +_gl_dragdone(void *data, Evas_Object *obj EINA_UNUSED, Eina_Bool doaccept) +{ + printf("<%s> <%d> data=<%p> doaccept=<%d>\n", + __func__, __LINE__, data, doaccept); + + Elm_Object_Item *it; + Eina_List *l; + + if (_5s_cancel) + { + ecore_timer_del(_5s_timeout); + _5s_timeout = NULL; + } + + if (doaccept) + { /* Remove items dragged out (accepted by target) */ + EINA_LIST_FOREACH(data, l, it) + elm_object_item_del(it); + } + + eina_list_free(data); + return; +} + +static Eina_Bool +_5s_timeout_gone(void *data) +{ + printf("Cancel DnD\n"); + elm_drag_cancel(data); + _5s_timeout = NULL; + return ECORE_CALLBACK_CANCEL; +} + +static Evas_Object * +_gl_createicon(void *data, Evas_Object *win, Evas_Coord *xoff, Evas_Coord *yoff) +{ + printf("<%s> <%d>\n", __func__, __LINE__); + Evas_Object *icon = NULL; + Evas_Object *o = elm_object_item_part_content_get(data, "elm.swallow.icon"); + + if (o) + { + int xm, ym, w = 30, h = 30; + const char *f; + const char *g; + elm_image_file_get(o, &f, &g); + evas_pointer_canvas_xy_get(evas_object_evas_get(o), &xm, &ym); + if (xoff) *xoff = xm - (w/2); + if (yoff) *yoff = ym - (h/2); + icon = elm_icon_add(win); + elm_image_file_set(icon, f, g); + evas_object_size_hint_align_set(icon, + EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(icon, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + if (xoff && yoff) evas_object_move(icon, *xoff, *yoff); + evas_object_resize(icon, w, h); + } + + return icon; +} + +static Eina_List * +_gl_icons_get(void *data) +{ /* Start icons animation before actually drag-starts */ + printf("<%s> <%d>\n", __func__, __LINE__); + int yposret = 0; + + Eina_List *l; + + Eina_List *icons = NULL; + + Evas_Coord xm, ym; + evas_pointer_canvas_xy_get(evas_object_evas_get(data), &xm, &ym); + Eina_List *items = eina_list_clone(elm_genlist_selected_items_get(data)); + Elm_Object_Item *gli = elm_genlist_at_xy_item_get(data, + xm, ym, &yposret); + if (gli) + { /* Add the item mouse is over to the list if NOT seleced */ + void *p = eina_list_search_unsorted(items, _item_ptr_cmp, gli); + if (!p) + items = eina_list_append(items, gli); + } + + EINA_LIST_FOREACH(items, l, gli) + { /* Now add icons to animation window */ + Evas_Object *o = elm_object_item_part_content_get(gli, + "elm.swallow.icon"); + + if (o) + { + int x, y, w, h; + const char *f, *g; + elm_image_file_get(o, &f, &g); + Evas_Object *ic = elm_icon_add(data); + elm_image_file_set(ic, f, g); + evas_object_geometry_get(o, &x, &y, &w, &h); + evas_object_size_hint_align_set(ic, + EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(ic, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + evas_object_move(ic, x, y); + evas_object_resize(ic, w, h); + evas_object_show(ic); + + icons = eina_list_append(icons, ic); + } + } + + eina_list_free(items); + return icons; +} + +static const char * +_gl_get_drag_data(Evas_Object *obj, Elm_Object_Item *it, Eina_List **items) +{ /* Construct a string of dragged info, user frees returned string */ + const char *drag_data = NULL; + printf("<%s> <%d>\n", __func__, __LINE__); + + *items = eina_list_clone(elm_genlist_selected_items_get(obj)); + if (it) + { /* Add the item mouse is over to the list if NOT seleced */ + void *p = eina_list_search_unsorted(*items, _item_ptr_cmp, it); + if (!p) + *items = eina_list_append(*items, it); + } + drag_data = _drag_data_build(items); + printf("<%s> <%d> Sending <%s>\n", __func__, __LINE__, drag_data); + + return drag_data; +} + +static const char * +_grid_get_drag_data(Evas_Object *obj, Elm_Object_Item *it, Eina_List **items) +{ /* Construct a string of dragged info, user frees returned string */ + const char *drag_data = NULL; + printf("<%s> <%d>\n", __func__, __LINE__); + + *items = eina_list_clone(elm_gengrid_selected_items_get(obj)); + if (it) + { /* Add the item mouse is over to the list if NOT seleced */ + void *p = eina_list_search_unsorted(*items, _item_ptr_cmp, it); + if (!p) + *items = eina_list_append(*items, it); + } + drag_data = _drag_data_build(items); + printf("<%s> <%d> Sending <%s>\n", __func__, __LINE__, drag_data); + + return drag_data; +} + +static Eina_Bool +_gl_dnd_default_anim_data_getcb(Evas_Object *obj, /* The genlist object */ + Elm_Object_Item *it, + Elm_Drag_User_Info *info) +{ /* This called before starting to drag, mouse-down was on it */ + info->format = ELM_SEL_FORMAT_TARGETS; + info->createicon = _gl_createicon; + info->createdata = it; + info->icons = _gl_icons_get(obj); + info->dragdone = _gl_dragdone; + + /* Now, collect data to send for drop from ALL selected items */ + /* Save list pointer to remove items after drop and free list on done */ + info->data = _gl_get_drag_data(obj, it, (Eina_List **) &info->donecbdata); + printf("%s - data = %s\n", __FUNCTION__, info->data); + info->acceptdata = info->donecbdata; + + if (info->data) + return EINA_TRUE; + else + return EINA_FALSE; +} + +static Eina_Bool +_gl_data_getcb(Evas_Object *obj, /* The genlist object */ + Elm_Object_Item *it, + Elm_Drag_User_Info *info) +{ /* This called before starting to drag, mouse-down was on it */ + info->format = ELM_SEL_FORMAT_TARGETS; + info->createicon = _gl_createicon; + info->createdata = it; + info->dragdone = _gl_dragdone; + + /* Now, collect data to send for drop from ALL selected items */ + /* Save list pointer to remove items after drop and free list on done */ + info->data = _gl_get_drag_data(obj, it, (Eina_List **) &info->donecbdata); + info->acceptdata = info->donecbdata; + + if (info->data) + return EINA_TRUE; + else + return EINA_FALSE; +} + +static Eina_List * +_grid_icons_get(void *data) +{ /* Start icons animation before actually drag-starts */ + printf("<%s> <%d>\n", __func__, __LINE__); + + Eina_List *l; + + Eina_List *icons = NULL; + + Evas_Coord xm, ym; + evas_pointer_canvas_xy_get(evas_object_evas_get(data), &xm, &ym); + Eina_List *items = eina_list_clone(elm_gengrid_selected_items_get(data)); + Elm_Object_Item *gli = elm_gengrid_at_xy_item_get(data, + xm, ym, NULL, NULL); + if (gli) + { /* Add the item mouse is over to the list if NOT seleced */ + void *p = eina_list_search_unsorted(items, _item_ptr_cmp, gli); + if (!p) + items = eina_list_append(items, gli); + } + + EINA_LIST_FOREACH(items, l, gli) + { /* Now add icons to animation window */ + Evas_Object *o = elm_object_item_part_content_get(gli, + "elm.swallow.icon"); + + if (o) + { + int x, y, w, h; + const char *f, *g; + elm_image_file_get(o, &f, &g); + Evas_Object *ic = elm_icon_add(data); + elm_image_file_set(ic, f, g); + evas_object_geometry_get(o, &x, &y, &w, &h); + evas_object_size_hint_align_set(ic, + EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(ic, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + evas_object_move(ic, x, y); + evas_object_resize(ic, w, h); + evas_object_show(ic); + + icons = eina_list_append(icons, ic); + } + } + + eina_list_free(items); + return icons; +} + +static void +_gl_dragstart(void *data EINA_UNUSED, Evas_Object *obj) +{ + printf("<%s> <%d>\n", __func__, __LINE__); + if (_5s_cancel) + _5s_timeout = ecore_timer_add(5.0, _5s_timeout_gone, obj); +} + +static Eina_Bool +_grid_data_getcb(Evas_Object *obj, /* The genlist object */ + Elm_Object_Item *it, + Elm_Drag_User_Info *info) +{ + /* This called before starting to drag, mouse-down was on it */ + info->format = ELM_SEL_FORMAT_TARGETS; + info->createicon = _gl_createicon; + info->createdata = it; + info->dragstart = _gl_dragstart; + info->icons = _grid_icons_get(obj); + info->dragdone = _gl_dragdone; + + /* Now, collect data to send for drop from ALL selected items */ + /* Save list pointer to remove items after drop and free list on done */ + info->data = _grid_get_drag_data(obj, it, (Eina_List **) &info->donecbdata); + printf("%s %d- data = %s\n", __FUNCTION__, __LINE__, info->data); + info->acceptdata = info->donecbdata; + + if (info->data) + return EINA_TRUE; + else + return EINA_FALSE; +} + +void +test_dnd_genlist_default_anim(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + char buf[PATH_MAX]; + Evas_Object *win, *gl, *bxx, *bx2, *lb; + int i, j; + + win = elm_win_util_standard_add("dnd-genlist-default-anim", "DnD-Genlist-Default-Anim"); + elm_win_autodel_set(win, EINA_TRUE); + + bxx = elm_box_add(win); + elm_box_horizontal_set(bxx, EINA_FALSE); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bxx); + evas_object_show(bxx); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Drag and drop between genlists with default anim."); + evas_object_size_hint_min_set(lb, 0, 50); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, 0.5); + evas_object_show(lb); + elm_box_pack_end(bxx, lb); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx2); + elm_box_pack_end(bxx, bx2); + + itc1 = elm_genlist_item_class_new(); + itc1->item_style = "default"; + itc1->func.text_get = gl_text_get; + itc1->func.content_get = gl_content_get; + itc1->func.del = NULL; + + for (j = 0; j < 2; j++) + { + gl = elm_genlist_add(win); + + /* START Drag and Drop handling */ + evas_object_smart_callback_add(win, "delete,request", _win_del, gl); + elm_genlist_multi_select_set(gl, EINA_TRUE); /* We allow multi drag */ + elm_drop_item_container_add(gl, + ELM_SEL_FORMAT_TARGETS, + _gl_item_getcb, + NULL, NULL, + NULL, NULL, + _gl_poscb, NULL, + _gl_dropcb, NULL); + + elm_drag_item_container_add(gl, ANIM_TIME, DRAG_TIMEOUT, + _gl_item_getcb, _gl_dnd_default_anim_data_getcb); + + // FIXME: This causes genlist to resize the horiz axis very slowly :( + // Reenable this and resize the window horizontally, then try to resize it back + //elm_genlist_mode_set(gl, ELM_LIST_LIMIT); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx2, gl); + evas_object_show(gl); + + for (i = 0; i < 20; i++) + { + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[(i % 9)]); + const char *path = eina_stringshare_add(buf); + elm_genlist_item_append(gl, itc1, path, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + } + } + + evas_object_resize(win, 680, 800); + evas_object_show(win); +} + +void +test_dnd_genlist_user_anim(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + char buf[PATH_MAX]; + Evas_Object *win, *gl, *bxx; + int i, j; + + win = elm_win_util_standard_add("dnd-genlist-user-anim", "DnD-Genlist-User-Anim"); + elm_win_autodel_set(win, EINA_TRUE); + + bxx = elm_box_add(win); + elm_box_horizontal_set(bxx, EINA_TRUE); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bxx); + evas_object_show(bxx); + + itc1 = elm_genlist_item_class_new(); + itc1->item_style = "default"; + itc1->func.text_get = gl_text_get; + itc1->func.content_get = gl_content_get; + itc1->func.del = NULL; + + for (j = 0; j < 2; j++) + { + gl = elm_genlist_add(win); + + /* START Drag and Drop handling */ + evas_object_smart_callback_add(win, "delete,request", _win_del, gl); + elm_genlist_multi_select_set(gl, EINA_TRUE); /* We allow multi drag */ + elm_drop_item_container_add(gl, + ELM_SEL_FORMAT_TARGETS, + _gl_item_getcb, + NULL, NULL, + NULL, NULL, + NULL, NULL, + _gl_dropcb, NULL); + + elm_drag_item_container_add(gl, ANIM_TIME, DRAG_TIMEOUT, + _gl_item_getcb, _gl_data_getcb); + + /* We add mouse-down, up callbacks to start/stop drag animation */ + evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_DOWN, + _gl_obj_mouse_down, gl); + /* END Drag and Drop handling */ + + // FIXME: This causes genlist to resize the horiz axis very slowly :( + // Reenable this and resize the window horizontally, then try to resize it back + //elm_genlist_mode_set(gl, ELM_LIST_LIMIT); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bxx, gl); + evas_object_show(gl); + + for (i = 0; i < 20; i++) + { + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[(i % 9)]); + const char *path = eina_stringshare_add(buf); + elm_genlist_item_append(gl, itc1, path, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + } + } + + evas_object_resize(win, 680, 800); + evas_object_show(win); +} + +void +test_dnd_genlist_gengrid(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + char buf[PATH_MAX]; + Evas_Object *win, *bxx; + int i; + + win = elm_win_util_standard_add("dnd-genlist-gengrid", "DnD-Genlist-Gengrid"); + elm_win_autodel_set(win, EINA_TRUE); + + bxx = elm_box_add(win); + elm_box_horizontal_set(bxx, EINA_TRUE); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bxx); + evas_object_show(bxx); + + { + itc1 = elm_genlist_item_class_new(); + itc1->item_style = "default"; + itc1->func.text_get = gl_text_get; + itc1->func.content_get = gl_content_get; + itc1->func.del = NULL; + + Evas_Object *gl = elm_genlist_add(win); + evas_object_smart_callback_add(win, "delete,request", _win_del, gl); + + /* START Drag and Drop handling */ + elm_genlist_multi_select_set(gl, EINA_TRUE); /* We allow multi drag */ + elm_drop_item_container_add(gl, ELM_SEL_FORMAT_TARGETS, _gl_item_getcb, NULL, NULL, + NULL, NULL, NULL, NULL, _gl_dropcb, NULL); + + elm_drag_item_container_add(gl, ANIM_TIME, DRAG_TIMEOUT, + _gl_item_getcb, _gl_dnd_default_anim_data_getcb); + /* END Drag and Drop handling */ + + // FIXME: This causes genlist to resize the horiz axis very slowly :( + // Reenable this and resize the window horizontally, then try to resize it back + //elm_genlist_mode_set(gl, ELM_LIST_LIMIT); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bxx, gl); + evas_object_show(gl); + + for (i = 0; i < 20; i++) + { + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[(i % 9)]); + const char *path = eina_stringshare_add(buf); + elm_genlist_item_append(gl, itc1, path, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + } + } + + { + Evas_Object *grid = elm_gengrid_add(win); + evas_object_smart_callback_add(win, "delete,request", _win_del, grid); + elm_gengrid_item_size_set(grid, + ELM_SCALE_SIZE(150), ELM_SCALE_SIZE(150)); + elm_gengrid_horizontal_set(grid, EINA_FALSE); + elm_gengrid_reorder_mode_set(grid, EINA_FALSE); + elm_gengrid_multi_select_set(grid, EINA_TRUE); /* We allow multi drag */ + 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); + + gic = elm_gengrid_item_class_new(); + gic->item_style = "default"; + gic->func.text_get = gl_text_get; + gic->func.content_get = gl_content_get; + gic->func.del = gl_del_cb; + + elm_drop_item_container_add(grid, ELM_SEL_FORMAT_TARGETS, _grid_item_getcb, NULL, NULL, + NULL, NULL, NULL, NULL, _grid_dropcb, NULL); + + elm_drag_item_container_add(grid, ANIM_TIME, DRAG_TIMEOUT, + _grid_item_getcb, _grid_data_getcb); + for (i = 0; i < 20; i++) + { + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[(i % 9)]); + const char *path = eina_stringshare_add(buf); + elm_gengrid_item_append(grid, gic, path, NULL, NULL); + } + elm_box_pack_end(bxx, grid); + evas_object_show(grid); + } + + evas_object_resize(win, 680, 800); + evas_object_show(win); +} + +static Eina_Bool _drop_box_button_new_cb(void *data, Evas_Object *obj, Elm_Selection_Data *ev) +{ + Evas_Object *win = data; + if (ev->len <= 0) + return EINA_FALSE; + + char *dd = _strndup(ev->data, ev->len); + if (!dd) return EINA_FALSE; + char *p = dd; + char *s = _drag_data_extract(&p); + while (s) + { + Evas_Object *ic = elm_icon_add(win); + elm_image_file_set(ic, s, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + Evas_Object *bt = elm_button_add(win); + elm_object_text_set(bt, "Dropped button"); + elm_object_part_content_set(bt, "icon", ic); + elm_box_pack_end(obj, bt); + evas_object_show(bt); + evas_object_show(ic); + s = _drag_data_extract(&p); + } + free(dd); + + return EINA_TRUE; +} + +void _enter_but_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED) +{ + printf("Entered %s - drop it here and I will never print this line anymore.\n", __FUNCTION__); +} + +static Eina_Bool _drop_but_icon_change_cb(void *data, Evas_Object *obj, Elm_Selection_Data *ev) +{ + Evas_Object *win = data; + Evas_Object *ic; + if (ev->len <= 0) + return EINA_FALSE; + + char *dd = _strndup(ev->data, ev->len); + if (!dd) return EINA_FALSE; + char *p = dd; + char *s = _drag_data_extract(&p); + ic = elm_icon_add(win); + elm_image_file_set(ic, s, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + evas_object_del(elm_object_part_content_get(obj, "icon")); + elm_object_part_content_set(obj, "icon", ic); + evas_object_show(ic); + free(dd); + + return EINA_TRUE; +} + +/* Callback used to test multi-callbacks feature */ +static Eina_Bool _drop_but_cb_remove_cb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Selection_Data *ev EINA_UNUSED) +{ + printf("Second callback called - removing it\n"); + elm_drop_target_del(obj, ELM_SEL_FORMAT_TARGETS, _enter_but_cb, NULL, NULL, NULL, NULL, NULL, _drop_but_cb_remove_cb, NULL); + return EINA_TRUE; +} + +static Eina_Bool _drop_bg_change_cb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Selection_Data *ev) +{ + if (ev->len <= 0) + return EINA_FALSE; + + char *dd = _strndup(ev->data, ev->len); + if (!dd) return EINA_FALSE; + char *p = dd; + char *s = _drag_data_extract(&p); + elm_bg_file_set(obj, s, NULL); + free(dd); + + return EINA_TRUE; +} + +static void +_5s_cancel_ck_changed(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + _5s_cancel = elm_check_state_get(obj); +} + +void +test_dnd_multi_features(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + char buf[PATH_MAX]; + Evas_Object *win, *bxx, *bg; + int i; + + win = elm_win_util_standard_add("dnd-multi-features", "DnD-Multi Features"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_drop_target_add(bg, ELM_SEL_FORMAT_TARGETS, NULL, NULL, NULL, NULL, NULL, NULL, _drop_bg_change_cb, NULL); + elm_win_resize_object_add(win, bg); + + /* And show the background. */ + evas_object_show(bg); + bxx = elm_box_add(win); + elm_box_horizontal_set(bxx, EINA_TRUE); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bxx); + evas_object_show(bxx); + + { + Evas_Object *grid = elm_gengrid_add(bxx); + evas_object_smart_callback_add(win, "delete,request", _win_del, grid); + elm_gengrid_item_size_set(grid, + ELM_SCALE_SIZE(100), ELM_SCALE_SIZE(100)); + elm_gengrid_horizontal_set(grid, EINA_FALSE); + elm_gengrid_reorder_mode_set(grid, EINA_FALSE); + elm_gengrid_multi_select_set(grid, EINA_TRUE); /* We allow multi drag */ + 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); + + gic = elm_gengrid_item_class_new(); + gic->item_style = "default"; + gic->func.text_get = gl_text_get; + gic->func.content_get = gl_content_get; + + elm_drag_item_container_add(grid, ANIM_TIME, DRAG_TIMEOUT, + _grid_item_getcb, _grid_data_getcb); + for (i = 0; i < 10; i++) + { + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[(i % 9)]); + const char *path = eina_stringshare_add(buf); + elm_gengrid_item_append(grid, gic, path, NULL, NULL); + } + elm_box_pack_end(bxx, grid); + evas_object_show(grid); + } + + { + Evas_Object *ic, *bt; + Evas_Object *vert_box = elm_box_add(bxx); + evas_object_size_hint_weight_set(vert_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bxx, vert_box); + evas_object_show(vert_box); + elm_drop_target_add(vert_box, ELM_SEL_FORMAT_TARGETS, NULL, NULL, NULL, NULL, NULL, NULL, _drop_box_button_new_cb, win); + + _5s_cancel = EINA_FALSE; + Evas_Object *ck = elm_check_add(vert_box); + elm_object_style_set(ck, "toggle"); + elm_object_text_set(ck, "Cancel after 5s:"); + elm_check_state_set(ck, _5s_cancel); + evas_object_smart_callback_add(ck, "changed", _5s_cancel_ck_changed, NULL); + elm_box_pack_end(vert_box, ck); + evas_object_show(ck); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + bt = elm_button_add(win); + elm_object_text_set(bt, "Multi-callbacks check"); + elm_drop_target_add(bt, ELM_SEL_FORMAT_TARGETS, NULL, NULL, NULL, NULL, NULL, NULL, _drop_but_icon_change_cb, win); + elm_drop_target_add(bt, ELM_SEL_FORMAT_TARGETS, _enter_but_cb, NULL, NULL, NULL, NULL, NULL, _drop_but_cb_remove_cb, NULL); + elm_object_part_content_set(bt, "icon", ic); + elm_box_pack_end(vert_box, bt); + evas_object_show(bt); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + bt = elm_button_add(win); + elm_object_text_set(bt, "Drop into me to change my icon"); + elm_drop_target_add(bt, ELM_SEL_FORMAT_TARGETS, NULL, NULL, NULL, NULL, NULL, NULL, _drop_but_icon_change_cb, win); + elm_object_part_content_set(bt, "icon", ic); + elm_box_pack_end(vert_box, bt); + evas_object_show(bt); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + bt = elm_button_add(win); + elm_object_text_set(bt, "No action on drop"); + elm_object_part_content_set(bt, "icon", ic); + elm_box_pack_end(vert_box, bt); + evas_object_show(bt); + evas_object_show(ic); + } + evas_object_resize(win, 680, 800); + evas_object_show(win); +} + +static void +_enter_cb(void *data EINA_UNUSED, Evas_Object *obj) +{ + printf("%s: obj: %s %p enter\n", __func__, + evas_object_type_get(obj), obj); +} + +static void +_leave_cb(void *data EINA_UNUSED, Evas_Object *obj) +{ + printf("%s: obj: %s %p leave\n", __func__, + evas_object_type_get(obj), obj); +} + +static void +_pos_cb(void *data EINA_UNUSED, Evas_Object *obj, Evas_Coord x, Evas_Coord y, Elm_Xdnd_Action action) +{ + printf("%s: obj: %s %p pos: %d %d, action: %d\n", __func__, + evas_object_type_get(obj), obj, x, y, action); +} + +static Eina_Bool +_label_drop_cb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Selection_Data *ev) +{ + const char *text = ev->data; + printf("%s: obj: %s %p drop data: %s\n", __func__, + evas_object_type_get(obj), obj, text); + elm_object_text_set(obj, text); + return EINA_TRUE; +} + +static Eina_Bool +_image_drop_cb(void *data EINA_UNUSED, Evas_Object *obj, Elm_Selection_Data *ev) +{ + const char *f = ev->data; + printf("%s: obj: %s %p drop data: %s\n", __func__, + evas_object_type_get(obj), obj, f); + elm_image_file_set(obj, f, NULL); + return EINA_TRUE; +} + +static Evas_Object * +_label_create_icon(void *data, Evas_Object *parent, Evas_Coord *xoff, Evas_Coord *yoff) +{ + Evas_Object *lb = data; + Evas_Object *icon; + const char *text; + Evas_Coord x, y, w, h; + int xm, ym; + + icon = elm_label_add(parent); + text = elm_object_text_get(lb); + elm_object_text_set(icon, text); + + evas_object_geometry_get(lb, &x, &y, &w, &h); + evas_object_move(icon, x, y); + evas_object_resize(icon, w, h); + evas_object_show(icon); + + evas_pointer_canvas_xy_get(evas_object_evas_get(lb), &xm, &ym); + if (xoff) *xoff = xm - (w / 2); + if (yoff) *yoff = ym - (h / 2); + + return icon; +} + +static void +_label_drag_done_cb(void *data, Evas_Object *obj EINA_UNUSED) +{ + free(data); +} + +static void +_label_mouse_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *lb = data; + const char *mkup = elm_object_text_get(lb); + char *text = evas_textblock_text_markup_to_utf8(NULL, mkup); + + if (!text) + { + printf("Cannot convert text\n"); + } + elm_drag_start(lb, ELM_SEL_FORMAT_TEXT, text, ELM_XDND_ACTION_COPY, + _label_create_icon, lb, + NULL, NULL, NULL, NULL, + _label_drag_done_cb, text); +} + +static Evas_Object * +_image_create_icon(void *data, Evas_Object *parent, Evas_Coord *xoff, Evas_Coord *yoff) +{ + Evas_Object *ic; + Evas_Object *io = data; + const char *f, *g; + Evas_Coord x, y, w, h, xm, ym; + + elm_image_file_get(io, &f, &g); + ic = elm_image_add(parent); + elm_image_file_set(ic, f, g); + evas_object_geometry_get(io, &x, &y, &w, &h); + evas_object_move(ic, x, y); + evas_object_resize(ic, 60, 60); + evas_object_show(ic); + + evas_pointer_canvas_xy_get(evas_object_evas_get(io), &xm, &ym); + if (xoff) *xoff = xm - 30; + if (yoff) *yoff = ym - 30; + + return ic; +} + +static void +_image_mouse_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *io = data; + const char *f; + char dd[PATH_MAX]; + + elm_image_file_get(io, &f, NULL); + snprintf(dd, sizeof(dd), "file://%s", f); + + elm_drag_start(io, ELM_SEL_FORMAT_IMAGE, dd, ELM_XDND_ACTION_COPY, + _image_create_icon, io, + NULL, NULL, NULL, NULL, NULL, NULL); +} + +void +test_dnd_types(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bx1, *lb, *io, *en; + int i; + + win = elm_win_util_standard_add("dnd-types", "DnD types"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + for(i = 0; i < 2; i++) + { + char buf[PATH_MAX]; + bx1 = elm_box_add(win); + evas_object_size_hint_weight_set(bx1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx1, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bx1); + evas_object_show(bx1); + + lb = elm_label_add(win); + if (i == 0) + elm_object_text_set(lb, "This is an label.<br/>You can drag or drop text here.<br/>" + "This is a larger label with newlines<br/>" + "to make it bigger, bit it won't expand or wrap<br/>" + "just be a block of text that can't change its<br/>" + "formatting as it's fixed based on text<br/>"); + else + elm_object_text_set(lb, "Another label for drag and drop test.<br/>" + "A small label. You can drag or drop text.<br/><br/><br/>"); + elm_drop_target_add(lb, ELM_SEL_FORMAT_TEXT, + _enter_cb, NULL, + _leave_cb, NULL, + _pos_cb, NULL, + _label_drop_cb, NULL); + evas_object_event_callback_add(lb, EVAS_CALLBACK_MOUSE_DOWN, _label_mouse_down_cb, lb); + elm_box_pack_end(bx1, lb); + evas_object_show(lb); + + en = elm_entry_add(win); + if (i == 0) + { + elm_object_text_set(en, + "Entry:<br/>You can only drop <b>text</> here.<br/>" + "This is an entry widget in this window that<br/>" + "uses markup <b>like this</> for styling."); + elm_entry_cnp_mode_set(en, ELM_CNP_MODE_PLAINTEXT); + } + else + { + elm_object_text_set(en, + "Entry:<br/>You can drop <b>text or image</> here.<br/>" + "This is an entry widget in this window that<br/>" + "uses markup <b>like this</> for styling."); + + } + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx1, en); + evas_object_show(en); + + if (i == 0) + snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get()); + else + snprintf(buf, sizeof(buf), "%s/images/rock_02.jpg", elm_app_data_dir_get()); + io = elm_image_add(win); + elm_image_file_set(io, buf, NULL); + evas_object_size_hint_weight_set(io, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(io, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_min_set(io, 100, 100); + elm_drop_target_add(io, ELM_SEL_FORMAT_IMAGE, + _enter_cb, NULL, + _leave_cb, NULL, + _pos_cb, NULL, + _image_drop_cb, NULL); + evas_object_event_callback_add(io, EVAS_CALLBACK_MOUSE_DOWN, _image_mouse_down_cb, io); + elm_box_pack_end(bx1, io); + evas_object_show(io); + } + + evas_object_show(win); + evas_object_resize(win, 400, 400); +} diff --git a/src/bin/elementary/test_eio.c b/src/bin/elementary/test_eio.c new file mode 100644 index 0000000000..51118b7f17 --- /dev/null +++ b/src/bin/elementary/test_eio.c @@ -0,0 +1,245 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif + +#ifdef HAVE_SYS_TIMES_H +# include <sys/times.h> +#endif + +#ifdef _WIN32 +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif +# include <windows.h> +# undef WIN32_LEAN_AND_MEAN +#endif + +#include <Eio.h> + +#include <Elementary.h> + +static Elm_Genlist_Item_Class it_eio; + +#ifdef _WIN32 +ULONGLONG st_time_kernel; +ULONGLONG st_time_user; +ULONGLONG en_time_kernel; +ULONGLONG en_time_user; +#else +static clock_t st_time; +static clock_t en_time; +static struct tms st_cpu; +static struct tms en_cpu; +#endif + +static void _sel_file(void *data, Evas_Object *obj, void *event_info); +static Eina_Bool _ls_filter_cb(void *data, Eio_File *handler, const char *file); +static void _ls_main_cb(void *data, Eio_File *handler, const char *file); +static void _ls_done_cb(void *data, Eio_File *handler); +static void _ls_error_cb(void *data, Eio_File *handler, int error); +static void _file_chosen(void *data, Evas_Object *obj, void *event_info); +static char *_gl_text_get(void *data, Evas_Object *obj, const char *part); +static Evas_Object *_gl_content_get(void *data, Evas_Object *obj, const char *part); +static Eina_Bool _gl_state_get(void *data, Evas_Object *obj, const char *part); +static void _gl_del(void *data, Evas_Object *obj); +static void _test_eio_clear(void *data, Evas_Object *obj, void *event); + +static void +_sel_file(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ +} + +static Eina_Bool +_ls_filter_cb(void *data EINA_UNUSED, Eio_File *handler EINA_UNUSED, const char *file EINA_UNUSED) +{ + return EINA_TRUE; +} + +static int +_compare_cb(const void *data1, const void *data2) +{ + Elm_Object_Item *it = (Elm_Object_Item *)data1; + Elm_Object_Item *it2 = (Elm_Object_Item *)data2; + return strcoll(elm_object_item_data_get(it), + elm_object_item_data_get(it2)); +} + +static void +_ls_main_cb(void *data, Eio_File *handler EINA_UNUSED, const char *file) +{ + elm_genlist_item_sorted_insert(data, + &it_eio, + eina_stringshare_add(file), + NULL, + ELM_GENLIST_ITEM_NONE, + _compare_cb, + _sel_file, + NULL); +} + +static void +_ls_done_cb(void *data EINA_UNUSED, Eio_File *handler EINA_UNUSED) +{ +#ifdef _WIN32 + FILETIME tc; + FILETIME te; + FILETIME tk; + FILETIME tu; + ULARGE_INTEGER time_kernel; + ULARGE_INTEGER time_user; + + if (!GetProcessTimes(GetCurrentProcess(), + &tc, &te, &tk, &tu)) + return; + + time_kernel.u.LowPart = tk.dwLowDateTime; + time_kernel.u.HighPart = tk.dwHighDateTime; + en_time_kernel = time_kernel.QuadPart; + + time_user.u.LowPart = tu.dwLowDateTime; + time_user.u.HighPart = tu.dwHighDateTime; + en_time_user = time_user.QuadPart; + + fprintf(stderr, "ls done\n"); + fprintf(stderr, "Kernel Time: %lld, User Time: %lld", + (en_time_kernel - st_time_kernel), + (en_time_user - st_time_user)); +#else + en_time = times(&en_cpu); + fprintf(stderr, "ls done\n"); + fprintf(stderr, "Real Time: %.jd, User Time: %.jd, System Time: %.jd\n", + (intmax_t)(en_time - st_time), + (intmax_t)(en_cpu.tms_utime - st_cpu.tms_utime), + (intmax_t)(en_cpu.tms_stime - st_cpu.tms_stime)); +#endif +} + +static void +_ls_error_cb(void *data EINA_UNUSED, Eio_File *handler EINA_UNUSED, int error) +{ + fprintf(stderr, "error: [%s]\n", strerror(error)); +} + +static void +_file_chosen(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + const char *file = event_info; + if (file) + { +#ifdef _WIN32 + FILETIME tc; + FILETIME te; + FILETIME tk; + FILETIME tu; + ULARGE_INTEGER time_kernel; + ULARGE_INTEGER time_user; + + if (!GetProcessTimes(GetCurrentProcess(), + &tc, &te, &tk, &tu)) + return; + + time_kernel.u.LowPart = tk.dwLowDateTime; + time_kernel.u.HighPart = tk.dwHighDateTime; + st_time_kernel = time_kernel.QuadPart; + + time_user.u.LowPart = tu.dwLowDateTime; + time_user.u.HighPart = tu.dwHighDateTime; + st_time_user = time_user.QuadPart; +#else + st_time = times(&st_cpu); +#endif + eio_file_ls(file, + _ls_filter_cb, + _ls_main_cb, + _ls_done_cb, + _ls_error_cb, + data); + } +} + +static char * +_gl_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "Item # %s", (char*)data); + return strdup(buf); +} + +static Evas_Object * +_gl_content_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + return NULL; +} + +static Eina_Bool +_gl_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + return EINA_FALSE; +} + +static void +_gl_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED) +{ +} + +static void +_test_eio_clear(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) +{ + elm_genlist_clear(data); +} + +void +test_eio(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *vbox, *hbox, *ic, *bt, *fs_bt, *gl; + + it_eio.item_style = "default"; + it_eio.func.text_get = _gl_text_get; + it_eio.func.content_get = _gl_content_get; + it_eio.func.state_get = _gl_state_get; + it_eio.func.del = _gl_del; + + win = elm_win_util_standard_add("fileselector-button", "File Selector Button"); + elm_win_autodel_set(win, EINA_TRUE); + + vbox = elm_box_add(win); + evas_object_size_hint_weight_set(vbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, vbox); + evas_object_show(vbox); + + gl = elm_genlist_add(win); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(vbox, gl); + evas_object_show(gl); + + /* file selector button */ + hbox = elm_box_add(win); + elm_box_horizontal_set(hbox, EINA_TRUE); + ic = elm_icon_add(win); + elm_icon_standard_set(ic, "file"); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + fs_bt = elm_fileselector_button_add(win); + elm_object_text_set(fs_bt, "Select a dir"); + elm_object_part_content_set(fs_bt, "icon", ic); + elm_fileselector_button_inwin_mode_set(fs_bt, EINA_TRUE); + elm_fileselector_folder_only_set(fs_bt, EINA_TRUE); + + elm_box_pack_end(hbox, fs_bt); + elm_box_pack_end(vbox, hbox); + evas_object_show(fs_bt); + evas_object_show(ic); + + /* attribute setting buttons */ + bt = elm_button_add(win); + elm_object_text_set(bt, "clear"); + evas_object_smart_callback_add(bt, "clicked", _test_eio_clear, gl); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + evas_object_show(hbox); + + evas_object_smart_callback_add(fs_bt, "file,chosen", _file_chosen, gl); + + evas_object_resize(win, 300, 500); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_entry.c b/src/bin/elementary/test_entry.c new file mode 100644 index 0000000000..1a56d000e4 --- /dev/null +++ b/src/bin/elementary/test_entry.c @@ -0,0 +1,2716 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#define EO_BETA_API +#include <Elementary.h> + +static void +my_entry_bt_1(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_object_text_set(en, ""); +} + +static void +my_entry_bt_2(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + const char *s = elm_object_text_get(en); + printf("ENTRY:\n"); + if (s) printf("%s\n", s); + printf("ENTRY PLAIN UTF8:\n"); + if (s) + { + s = elm_entry_markup_to_utf8(s); + if (s) + { + printf("%s\n", s); + free((char *)s); + } + } +} + +static void +my_entry_bt_3(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + const char *s = elm_entry_selection_get(en); + int start = 0, end = 0; + elm_entry_select_region_get(en, &start, &end); + printf("SELECTION REGION: %d - %d\n", start, end); + printf("SELECTION:\n"); + if (s) printf("%s\n", s); + printf("SELECTION PLAIN UTF8:\n"); + if (s) + { + s = elm_entry_markup_to_utf8(s); + if (s) + { + printf("%s\n", s); + free((char *)s); + } + } +} + +static void +my_entry_bt_4(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_entry_insert(en, "Insert some <b>BOLD</> text"); +} + +static void +my_entry_bt_5(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_scrollable_set(en, !elm_entry_scrollable_get(en)); +} + +static void +my_entry_bt_6(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + static Elm_Wrap_Type wr = ELM_WRAP_NONE; + + wr++; + if (wr == ELM_WRAP_LAST) wr = ELM_WRAP_NONE; + printf("wr: %i\n", wr); + elm_entry_line_wrap_set(en, wr); +} + +static void +my_entry_bt_7(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_editable_set(en, !elm_entry_editable_get(en)); +} + +static void +changed_cb1(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *ck = data; + printf("ck %p to %i\n", obj, elm_check_state_get(obj)); + elm_config_context_menu_disabled_set(elm_check_state_get(obj)); + printf("ck2 %p is now %i\n", ck, elm_check_state_get(ck)); +} + +void +test_entry(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bx2, *bt, *en, *ck; + char buf[4096]; + + win = elm_win_util_standard_add("entry", "Entry"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + en = elm_entry_add(win); + elm_entry_line_wrap_set(en, ELM_WRAP_NONE); + snprintf(buf, sizeof(buf), + "This is an entry widget in this window that<br/>" + "uses markup <b>like this</> for styling and<br/>" + "formatting <em>like this</>, as well as<br/>" + "<a href=X><link>links in the text</></a>, so enter text<br/>" + "in here to edit it. By the way, links are<br/>" + "called <a href=anc-02>Anchors</a> so you will need<br/>" + "to refer to them this way.<br/>" + "<br/>" + + "Also you can stick in items with (relsize + ascent): " + "<item relsize=16x16 vsize=ascent href=emoticon/evil-laugh></item>" + " (full) " + "<item relsize=16x16 vsize=full href=emoticon/guilty-smile></item>" + " (to the left)<br/>" + + "Also (size + ascent): " + "<item size=16x16 vsize=ascent href=emoticon/haha></item>" + " (full) " + "<item size=16x16 vsize=full href=emoticon/happy-panting></item>" + " (before this)<br/>" + + "And as well (absize + ascent): " + "<item absize=64x64 vsize=ascent href=emoticon/knowing-grin></item>" + " (full) " + "<item absize=64x64 vsize=full href=emoticon/not-impressed></item>" + " or even paths to image files on disk too like: " + "<item absize=96x128 vsize=full href=file://%s/images/sky_01.jpg></item>" + " ... end." + , elm_app_data_dir_get() + ); + elm_object_text_set(en, buf); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, en); + evas_object_show(en); + elm_object_focus_set(en, EINA_TRUE); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Clr"); + evas_object_smart_callback_add(bt, "clicked", my_entry_bt_1, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Prnt"); + evas_object_smart_callback_add(bt, "clicked", my_entry_bt_2, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Sel"); + evas_object_smart_callback_add(bt, "clicked", my_entry_bt_3, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Ins"); + evas_object_smart_callback_add(bt, "clicked", my_entry_bt_4, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Scrl"); + evas_object_smart_callback_add(bt, "clicked", my_entry_bt_5, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Wr"); + evas_object_smart_callback_add(bt, "clicked", my_entry_bt_6, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Edit"); + evas_object_smart_callback_add(bt, "clicked", my_entry_bt_7, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + ck = elm_check_add(win); + elm_object_text_set(ck, "Context Menu Disable"); + evas_object_smart_callback_add(ck, "changed", changed_cb1, ck); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_show(win); +} + +static void +my_scrolled_entry_bt_1(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_object_text_set(en, ""); +} + +static void +my_scrolled_entry_bt_2(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + const char *s = elm_object_text_get(en); + printf("ENTRY:\n"); + if (s) printf("%s\n", s); + printf("ENTRY PLAIN UTF8:\n"); + if (s) + { + s = elm_entry_markup_to_utf8(s); + if (s) + { + printf("%s\n", s); + free((char *)s); + } + } +} + +static void +my_scrolled_entry_bt_3(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + const char *s = elm_entry_selection_get(en); + int start = 0, end = 0; + elm_entry_select_region_get(en, &start, &end); + printf("SELECTION REGION: %d - %d\n", start, end); + printf("SELECTION:\n"); + if (s) printf("%s\n", s); + printf("SELECTION PLAIN UTF8:\n"); + if (s) + { + s = elm_entry_markup_to_utf8(s); + if (s) + { + printf("%s\n", s); + free((char *)s); + } + } +} + +static void +my_scrolled_entry_bt_4(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_entry_insert(en, "Insert some <b>BOLD</> text"); +} + +static void +my_scrolled_entry_bt_5(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + const char *s = elm_object_text_get(en); + printf("PASSWORD: '%s'\n", s ? s : ""); +} + +static void +scrolled_anchor_test(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_entry_insert(en, "ANCHOR CLICKED"); +} + +static void +_item_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Entry_Context_Menu_Item *item = (Elm_Entry_Context_Menu_Item *)event_info; + printf("\ncurrent selected text = %s\n", elm_entry_context_menu_item_label_get(item)); +} + +static void +_entry_rejected_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Elm_Entry_Filter_Accept_Set *accept_set = data; + + if (!accept_set) return; + + if (accept_set->accepted) + printf("REJECTED: This entry only accepts the following character set: [%s]\n", accept_set->accepted); + else + printf("REJECTED: This entry rejects the following character set: [%s]\n", accept_set->rejected); +} + +static void +_end_show_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_end_visible_set(en, EINA_TRUE); +} + +static void +_end_hide_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_end_visible_set(en, EINA_FALSE); +} + +static Eina_Bool +_context_menu_show_cb(void *data EINA_UNUSED, const Eo_Event *event) +{ + elm_entry_context_menu_clear(event->obj); + elm_entry_context_menu_item_add(event->obj, "MenuD1", NULL, ELM_ICON_NONE, _item_cb, NULL); + elm_entry_context_menu_item_add(event->obj, "MenuD2", NULL, ELM_ICON_NONE, _item_cb, NULL); + return EO_CALLBACK_CONTINUE; +} + +void +test_entry_scrolled(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bx2, *bx3, *bx4, *bt, *en, *en_p, *sp, *entry, *label; + static Elm_Entry_Filter_Accept_Set digits_filter_data, digits_filter_data2; + static Elm_Entry_Filter_Limit_Size limit_filter_data, limit_filter_data2; + + win = elm_win_util_standard_add("entry-scrolled", "Entry Scrolled"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + /* disabled entry */ + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_object_text_set(en, "Disabled entry"); + elm_entry_single_line_set(en, EINA_TRUE); + elm_object_disabled_set(en, EINA_TRUE); + evas_object_show(en); + elm_box_pack_end(bx, en); + + /* entry with guide */ + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_object_part_text_set(en, "guide", "This string is guide"); + elm_entry_single_line_set(en, EINA_TRUE); + evas_object_show(en); + elm_box_pack_end(bx, en); + + /* password entry */ + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_password_set(en, EINA_TRUE); + elm_entry_single_line_set(en, EINA_TRUE); + elm_object_text_set(en, "Access denied, give up!"); + elm_object_disabled_set(en, EINA_TRUE); + evas_object_show(en); + elm_box_pack_end(bx, en); + + /* multi-line disable entry */ + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON); + elm_object_disabled_set(en, EINA_TRUE); + elm_entry_context_menu_item_add(en, "Hello", NULL, ELM_ICON_NONE, NULL, NULL); + elm_entry_context_menu_item_add(en, "World", NULL, ELM_ICON_NONE, NULL, NULL); + elm_object_text_set(en, + "Multi-line disabled entry widget :)<br/>" + "We can use markup <b>like this</> for styling and<br/>" + "formatting <em>like this</>, as well as<br/>" + "<a href=X><link>links in the text</></a>," + "but it won't be editable or clickable."); + evas_object_show(en); + elm_box_pack_end(bx, en); + + sp = elm_separator_add(win); + elm_separator_horizontal_set(sp, EINA_TRUE); + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + /* Single line selected entry */ + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_object_text_set(en, "This is a single line"); + elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_single_line_set(en, EINA_TRUE); + elm_entry_select_all(en); + elm_entry_context_menu_item_add(en, "Menu1", NULL, ELM_ICON_NONE, _item_cb, NULL); + elm_entry_context_menu_item_add(en, "Menu2", NULL, ELM_ICON_NONE, _item_cb, NULL); + evas_object_show(en); + elm_box_pack_end(bx, en); + + /* Only digits entry */ + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_object_text_set(en, "01234"); + elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_single_line_set(en, EINA_TRUE); + evas_object_show(en); + elm_box_pack_end(bx, en); + + digits_filter_data.accepted = "0123456789"; + digits_filter_data.rejected = NULL; + elm_entry_markup_filter_append(en, elm_entry_filter_accept_set, &digits_filter_data); + evas_object_smart_callback_add(en, "rejected", _entry_rejected_cb, &digits_filter_data); + + /* No digits entry */ + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_object_text_set(en, "No numbers here"); + elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_single_line_set(en, EINA_TRUE); + evas_object_show(en); + elm_box_pack_end(bx, en); + + digits_filter_data2.accepted = NULL; + digits_filter_data2.rejected = "0123456789"; + elm_entry_markup_filter_append(en, elm_entry_filter_accept_set, &digits_filter_data2); + evas_object_smart_callback_add(en, "rejected", _entry_rejected_cb, &digits_filter_data2); + + /* Size limited entry */ + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_object_text_set(en, "Just 20 chars"); + elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_single_line_set(en, EINA_TRUE); + evas_object_show(en); + elm_box_pack_end(bx, en); + + limit_filter_data.max_char_count = 20; + limit_filter_data.max_byte_count = 0; + elm_entry_markup_filter_append(en, elm_entry_filter_limit_size, &limit_filter_data); + + /* Byte size limited entry */ + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_object_text_set(en, "And now only 30 bytes"); + elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_single_line_set(en, EINA_TRUE); + evas_object_show(en); + elm_box_pack_end(bx, en); + + limit_filter_data2.max_char_count = 0; + limit_filter_data2.max_byte_count = 30; + elm_entry_markup_filter_append(en, elm_entry_filter_limit_size, &limit_filter_data2); + + /* Single line password entry */ + en_p = elm_entry_add(win); + elm_entry_scrollable_set(en_p, EINA_TRUE); + evas_object_size_hint_weight_set(en_p, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en_p, EVAS_HINT_FILL, 0.5); + elm_scroller_policy_set(en_p, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_object_text_set(en_p, "Password here"); + elm_entry_single_line_set(en_p, EINA_TRUE); + elm_entry_password_set(en_p, EINA_TRUE); + evas_object_show(en_p); + elm_box_pack_end(bx, en_p); + + /* Last password show entry */ + bx4 = elm_box_add(win); + evas_object_size_hint_weight_set(bx4, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx4); + + label = elm_label_add(bx4); + elm_object_text_set(label, "<b>Last password show entry</b>"); + evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx4, label); + evas_object_show(label); + + en = elm_entry_add(bx4); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_password_set(en, EINA_TRUE); + elm_object_text_set(en, "Last password show"); + elm_entry_single_line_set(en, EINA_TRUE); + edje_password_show_last_set(EINA_TRUE); + edje_password_show_last_timeout_set(-1); + evas_object_show(en); + + elm_box_pack_end(bx4, en); + elm_box_pack_end(bx, bx4); + + /* entry with icon/end widgets */ + entry = elm_entry_add(win); + elm_entry_scrollable_set(entry, EINA_TRUE); + elm_scroller_policy_set(entry, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_single_line_set(entry, EINA_TRUE); + evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL); + bt = elm_icon_add(win); + elm_icon_standard_set(bt, "home"); + evas_object_size_hint_min_set(bt, 48, 48); + evas_object_color_set(bt, 128, 0, 0, 128); + evas_object_show(bt); + elm_object_part_content_set(entry, "icon", bt); + bt = elm_icon_add(win); + elm_icon_standard_set(bt, "delete"); + evas_object_color_set(bt, 128, 0, 0, 128); + evas_object_size_hint_min_set(bt, 48, 48); + evas_object_show(bt); + elm_object_part_content_set(entry, "end", bt); + elm_object_text_set(entry, "entry with icon and end objects. For the test of show/hide end, text should be long long..."); + evas_object_show(entry); + elm_box_pack_end(bx, entry); + + /* markup entry */ + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON); + elm_object_text_set(en, + "This is an entry widget in this window that<br/>" + "uses markup <b>like this</> for styling and<br/>" + "formatting <em>like this</>, as well as<br/>" + "<a href=X><link>links in the text</></a>, so enter text<br/>" + "in here to edit it. By them way, links are<br/>" + "called <a href=anc-02>Anchors</a> so you will need<br/>" + "to refer to them this way. At the end here is a really long " + "line to test line wrapping to see if it works. But just in " + "case this line is not long enough I will add more here to " + "really test it out, as Elementary really needs some " + "good testing to see if entry widgets work as advertised."); + evas_object_smart_callback_add(en, "anchor,clicked", scrolled_anchor_test, en); + evas_object_show(en); + elm_box_pack_end(bx, en); + eo_event_callback_add(en, ELM_ENTRY_EVENT_CONTEXT_OPEN, _context_menu_show_cb, NULL); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Clear"); + evas_object_smart_callback_add(bt, "clicked", my_scrolled_entry_bt_1, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Print"); + evas_object_smart_callback_add(bt, "clicked", my_scrolled_entry_bt_2, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Print pwd"); + evas_object_smart_callback_add(bt, "clicked", my_scrolled_entry_bt_5, en_p); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Selection"); + evas_object_smart_callback_add(bt, "clicked", my_scrolled_entry_bt_3, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Insert"); + evas_object_smart_callback_add(bt, "clicked", my_scrolled_entry_bt_4, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx3 = elm_box_add(win); + elm_box_horizontal_set(bx3, EINA_TRUE); + evas_object_size_hint_weight_set(bx3, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "End Show"); + evas_object_smart_callback_add(bt, "clicked", _end_show_cb, entry); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx3, bt); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "End Hide"); + evas_object_smart_callback_add(bt, "clicked", _end_hide_cb, entry); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx3, bt); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + elm_box_pack_end(bx, bx3); + evas_object_show(bx3); + + elm_object_focus_set(win, EINA_TRUE); + evas_object_resize(win, 320, 500); + evas_object_show(win); +} + +static void +my_ent_bt_clr(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_object_text_set(en, ""); +} + +static void +my_ent_bt_pri(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + const char *s = elm_object_text_get(en); + printf("ENTRY:\n"); + if (s) printf("%s\n", s); + printf("ENTRY PLAIN UTF8:\n"); + if (s) + { + s = elm_entry_markup_to_utf8(s); + if (s) + { + printf("%s\n", s); + free((char *)s); + } + } +} + +static void +my_ent_bt_sel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + const char *s = elm_entry_selection_get(en); + int start = 0, end = 0; + elm_entry_select_region_get(en, &start, &end); + printf("SELECTION REGION: %d - %d\n", start, end); + printf("SELECTION:\n"); + if (s) printf("%s\n", s); + printf("SELECTION PLAIN UTF8:\n"); + if (s) + { + s = elm_entry_markup_to_utf8(s); + if (s) + { + printf("%s\n", s); + free((char *)s); + } + } +} + +static void +my_ent_bt_all(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_select_all(en); +} + +static void +my_ent_bt_non(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_select_none(en); +} + +static void +my_ent_bt_region(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_select_region_set(en, 10, 16); +} + +static void +my_ent_bt_ins(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_entry_insert(en, "Insert text"); +} + +static void +my_ent_bt_lef(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_cursor_prev(en); +} + +static void +my_ent_bt_rig(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_cursor_next(en); +} + +static void +my_ent_bt_up_(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_cursor_up(en); +} + +static void +my_ent_bt_dow(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_cursor_down(en); +} + +static void +my_ent_bt_beg(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_cursor_begin_set(en); +} + +static void +my_ent_bt_end(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_cursor_end_set(en); +} + +static void +my_ent_bt_lbe(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_cursor_line_begin_set(en); +} + +static void +my_ent_bt_len(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_cursor_line_end_set(en); +} + +static void +my_ent_bt_sbe(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_cursor_selection_begin(en); +} + +static void +my_ent_bt_sen(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_cursor_selection_end(en); +} + +static void +my_ent_bt_fmt(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + printf("IS FORMAT: %i\n", + (int)elm_entry_cursor_is_format_get(en)); +} + +static void +my_ent_bt_vfm(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + printf("IS VISIBLE FORMAT %i\n", + (int)elm_entry_cursor_is_visible_format_get(en)); +} + +static void +my_ent_bt_chr(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + printf("CHAR '%s'\n", elm_entry_cursor_content_get(en)); +} + +static void +my_ent_bt_cut(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_selection_cut(en); +} + +static void +my_ent_bt_cop(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_selection_copy(en); +} + +static void +my_ent_bt_pas(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_selection_paste(en); +} + +static char *user_style = + "DEFAULT='font_size=16 color=#F00'" + "em='+ backing=on backing_color=#FFF'" + "grn='+ color=#0F0'" + "ul='+ underline=on underline_color=#AAA'"; + +static void +ent_bt_style_user_peek(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + const char* cur_style = elm_entry_text_style_user_peek(en); + if (cur_style) + printf("Current style user: %s\n", cur_style); + else + printf("Style user stack is empty.\n"); +} + +static void +ent_bt_style_user_pop(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_text_style_user_pop(en); + printf("Style user popped\n"); +} + +static void +ent_bt_style_user_push(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_text_style_user_push(en, user_style); + printf("Style user pushed\n"); +} + +void +test_entry_style_user(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *hbx, *en, *bt, *bt2; + + win = elm_win_util_standard_add("entry-user-style", "Entry User Style"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + en = elm_entry_add(bx); + elm_entry_line_wrap_set(en, ELM_WRAP_MIXED); + elm_entry_text_style_user_push(en, user_style); + elm_object_text_set(en, + "Default style<br>" + "<em>Change a standard tag (backing)</em><br>" + "<grn>Create a custom tag (green)</grn><br>" + "<ul>Create a custom tag (underline)</ul><br>" + "<underline=double underline_color=#0F0 underline2_color=#00F>Unnamed tag (underline double)</underline><br>" + ); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, en); + evas_object_show(en); + elm_object_focus_set(en, EINA_TRUE); + + hbx = elm_box_add(bx); + elm_box_horizontal_set(hbx, EINA_TRUE); + elm_box_pack_end(bx, hbx); + evas_object_show(hbx); + + bt = elm_button_add(hbx); + elm_object_text_set(bt, "Peek"); + evas_object_smart_callback_add(bt, "clicked", ent_bt_style_user_peek, en); + elm_box_pack_end(hbx, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt2 = elm_button_add(hbx); + elm_object_text_set(bt2, "Pop"); + evas_object_smart_callback_add(bt2, "clicked", ent_bt_style_user_pop, en); + elm_box_pack_end(hbx, bt2); + elm_object_focus_allow_set(bt2, EINA_FALSE); + evas_object_show(bt2); + + bt2 = elm_button_add(hbx); + elm_object_text_set(bt2, "Push"); + evas_object_smart_callback_add(bt2, "clicked", ent_bt_style_user_push, en); + elm_box_pack_end(hbx, bt2); + elm_object_focus_allow_set(bt2, EINA_FALSE); + evas_object_show(bt2); + + evas_object_resize(win, 300, 300); + evas_object_show(win); +} + + +static char *default_style_text = + "<title>Elementary typography</title><br>" + "<ps>" + "<subtitle>Basic tags</subtitle><br>" + "Elm by default provide the <b>bold</b>, the <i>italic</i>, the " + "<hilight>hilight</hilight> and the <link>link</link> tags.<br>" + "<ps>" + "<subtitle>Font sizes</subtitle><br>" + "You can also use the <big>big</big> or <bigger>bigger</bigger> and " + "the <small>small</small> or <smaller>smaller</smaller> tags.<br>" + "<ps>" + "<subtitle>Status indicators</subtitle><br>" + "<info>info</info>, <success>success</success>, <warning>warning</warning> and <failure>failure</failure><br>" + "<ps>" + "<subtitle>Forms attributes</subtitle><br>" + "<name>Song:</name> <val>The show must go on</val><br>" + "<name>Artist:</name> <val>Queen</val><br>" + "<name>Album:</name> <val>Innuendo</val><br>" + "<ps>" + "<subtitle>Syntax highlight</subtitle><br>" + "<code>" + "<preprocessor>#include</preprocessor> <string><stdlib.h></string><br>" + "<preprocessor>#include</preprocessor> <string><Evas.h></string><br>" + "<br>" + "<preprocessor>#define</preprocessor> MESSAGE <string>\"Hello World\"</string><br>" + "<br>" + "<comment>/* Prints a message to standard output */</comment><br>" + "<type>void</type> <function>print_message</function><brace>(</brace><type>const char</type> *msg<brace>)</brace> <brace>{</brace><br>" + " printf<brace>(</brace><string>\"%s\\n\"</string>, msg<brace>)</brace>;<br>" + "<brace>}</brace><br>" + "<br>" + "<type>int</type> <function>main</function><brace>(</brace><type>int</type> argc, <type>char</type> *argv[]<brace>)</brace> <brace>{</brace><br>" + " <type>int</type> num_int = <number>123</number>;<br>" + " <type>float</type> num_float = <number>0.999</number>;<br>" + " <type>char</type> *str = <string>\"This is a string\"</string>;<br>" + " <type>Evas_Object</type> *obj = <keyword>NULL</keyword>;<br>" + " print_message<brace>(</brace>MESSAGE<brace>)</brace>;<br>" + " <keyword>return</keyword> <number>0</number>;<br>" + "<brace>}</brace><br>" + "<ps>" + "<line_added>+diff line added</line_added><br>" + "<line_removed>-diff line removed</line_removed><br>" + "<line_changed> diff line changed</line_changed><br>" + "</code>"; + +static void +ent_bt_def_style_disabled(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_object_disabled_set(en, elm_check_state_get(obj)); +} + +static void +ent_bt_def_style_scrollable(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_scrollable_set(en, elm_check_state_get(obj)); +} + +static void +ent_bt_def_style_markup(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + + if (elm_check_state_get(obj)) + { + char *markup = elm_entry_utf8_to_markup(default_style_text); + elm_object_text_set(en, markup); + free(markup); + } + else + elm_object_text_set(en, default_style_text); +} + +static void +ent_bt_def_style_wrap(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + + if (elm_check_state_get(obj)) + elm_entry_line_wrap_set(en, ELM_WRAP_NONE); + else + elm_entry_line_wrap_set(en, ELM_WRAP_WORD); +} + +void +test_entry_style_default(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *vbx, *en, *o; + + win = elm_win_util_standard_add("entry-style", "Entry Default Style"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_resize(win, 400, 400); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + en = elm_entry_add(win); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(en, default_style_text); + elm_entry_editable_set(en, EINA_TRUE); + elm_entry_line_wrap_set(en, ELM_WRAP_WORD); + elm_box_pack_end(bx, en); + evas_object_show(en); + + o = elm_separator_add(win); + elm_separator_horizontal_set(o, EINA_TRUE); + elm_box_pack_end(bx, o); + evas_object_show(o); + + vbx = elm_box_add(win); + elm_box_horizontal_set(vbx, EINA_TRUE); + elm_box_pack_end(bx, vbx); + evas_object_show(vbx); + + o = elm_check_add(win); + elm_object_text_set(o, "show markup"); + evas_object_smart_callback_add(o, "changed", ent_bt_def_style_markup, en); + elm_box_pack_end(vbx, o); + evas_object_show(o); + + o = elm_check_add(win); + elm_object_text_set(o, "disabled"); + evas_object_smart_callback_add(o, "changed", ent_bt_def_style_disabled, en); + elm_box_pack_end(vbx, o); + evas_object_show(o); + + o = elm_check_add(win); + elm_object_text_set(o, "scrollable"); + evas_object_smart_callback_add(o, "changed", ent_bt_def_style_scrollable, en); + elm_box_pack_end(vbx, o); + evas_object_show(o); + + o = elm_check_add(win); + elm_object_text_set(o, "no wrap"); + evas_object_smart_callback_add(o, "changed", ent_bt_def_style_wrap, en); + elm_box_pack_end(vbx, o); + evas_object_show(o); + + evas_object_show(win); +} + +static void +_entry_activated_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + printf("entry is activated: %s\n", elm_entry_entry_get(obj)); +} + +void +test_entry3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bx2, *bt, *en; + + win = elm_win_util_standard_add("entry3", "Entry 3"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + /* Single line selected entry */ + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_object_text_set(en, "This is a single line"); + elm_entry_single_line_set(en, EINA_TRUE); + evas_object_smart_callback_add(en, "activated", _entry_activated_cb, NULL); + elm_box_pack_end(bx, en); + evas_object_show(en); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Clr"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_clr, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Pri"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_pri, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Sel"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sel, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "All"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_all, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Non"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_non, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Region"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_region, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Ins"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_ins, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Lef"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_lef, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Rig"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_rig, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Up "); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_up_, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Dow"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_dow, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Beg"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_beg, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "End"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_end, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "LBe"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_lbe, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "LEn"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_len, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "SBe"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sbe, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "SEn"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sen, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Fmt"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_fmt, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "VFm"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_vfm, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Chr"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_chr, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Cut"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_cut, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Cop"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_cop, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Pas"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_pas, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + /* markup entry */ + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(en, + "This is an entry widget in this window that<br/>" + "uses markup <b>like this</> for styling and<br/>" + "formatting <em>like this</>, as well as<br/>" + "<a href=X><link>links in the text</></a>, so enter text<br/>" + "in here to edit it. By them way, links are<br/>" + "called <a href=anc-02>Anchors</a> so you will need<br/>" + "to refer to them this way. At the end here is a really long " + "line to test line wrapping to see if it works. But just in " + "case this line is not long enough I will add more here to " + "really test it out, as Elementary really needs some " + "good testing to see if entry widgets work as advertised." + ); + evas_object_smart_callback_add(en, "anchor,clicked", scrolled_anchor_test, en); + elm_box_pack_end(bx, en); + evas_object_show(en); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Clr"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_clr, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Pri"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_pri, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Sel"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sel, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "All"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_all, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Non"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_non, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Ins"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_ins, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Lef"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_lef, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Rig"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_rig, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Up "); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_up_, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Dow"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_dow, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Beg"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_beg, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "LEn"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_len, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "SBe"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sbe, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "SEn"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sen, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Fmt"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_fmt, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "VFm"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_vfm, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Chr"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_chr, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Cut"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_cut, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Cop"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_cop, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Pas"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_pas, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 320, 480); + + elm_object_focus_set(win, EINA_TRUE); + evas_object_show(win); +} + +void +test_entry4(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *ly, *en; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("entry4", "Entry 4"); + elm_win_autodel_set(win, EINA_TRUE); + + ly = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "layout"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, ly); + evas_object_show(ly); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_object_text_set(en, "This is a single line"); + elm_entry_single_line_set(en, EINA_TRUE); + elm_object_part_content_set(ly, "element1", en); + evas_object_show(en); + + en = elm_entry_add(win); + elm_entry_line_wrap_set(en, ELM_WRAP_NONE); + elm_object_text_set(en, + "This is an entry widget<br/>" + "that uses markup<br/>" + "<b>like this</> and has<br/>" + "no scroller, so you can<br/>" + "use it more flexibly."); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_part_content_set(ly, "element2", en); + evas_object_show(en); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(en, + "This is an entry widget in this window that<br/>" + "uses markup <b>like this</> for styling and<br/>" + "formatting <em>like this</>, as well as<br/>" + "<a href=X><link>links in the text</></a>, so enter text<br/>" + "in here to edit it. By them way, links are<br/>" + "called <a href=anc-02>Anchors</a> so you will need<br/>" + "to refer to them this way. At the end here is a really long " + "line to test line wrapping to see if it works. But just in " + "case this line is not long enough I will add more here to " + "really test it out, as Elementary really needs some " + "good testing to see if entry widgets work as advertised." + ); + evas_object_smart_callback_add(en, "anchor,clicked", scrolled_anchor_test, en); + elm_object_part_content_set(ly, "element3", en); + evas_object_show(en); + + evas_object_show(win); +} + +void +test_entry5(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bx2, *bt, *en; + + win = elm_win_util_standard_add("entry5", "Entry 5"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_line_wrap_set(en, ELM_WRAP_CHAR); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(en, + "This is an entry widget in this window that " + "uses markup like this for styling and " + "formatting like this, as well as " + "to refer to them this way. At the end here is a really long " + "line to test line wrapping to see if it works. But just in " + "case this line is not long enough I will add more here to " + "really test it out, as Elementary really needs some " + "good testing to see if entry widgets work as advertised." + ); + evas_object_smart_callback_add(en, "anchor,clicked", scrolled_anchor_test, en); + elm_box_pack_end(bx, en); + evas_object_show(en); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Clr"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_clr, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Pri"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_pri, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Sel"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sel, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "All"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_all, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Non"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_non, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Ins"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_ins, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Lef"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_lef, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Rig"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_rig, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Up "); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_up_, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Dow"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_dow, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Beg"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_beg, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "End"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_end, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "LBe"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_lbe, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "LEn"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_len, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "SBe"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sbe, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "SEn"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sen, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Fmt"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_fmt, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "VFm"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_vfm, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Chr"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_chr, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Cut"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_cut, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Cop"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_cop, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Pas"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_pas, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + elm_object_focus_allow_set(bt, EINA_FALSE); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 320, 480); + + elm_object_focus_set(win, EINA_TRUE); + evas_object_show(win); +} + +void +test_entry6(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *en; + + win = elm_win_util_standard_add("entry6", "Entry 6"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_line_wrap_set(en, ELM_WRAP_CHAR); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(en, + "input_panel_enabled: TRUE.<br>" + "When this entry gets a focus, virtual keyboard will be shown " + "in illume environment."); + elm_box_pack_end(bx, en); + evas_object_show(en); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_line_wrap_set(en, ELM_WRAP_CHAR); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(en, + "input_panel_enabled: FALSE.<br>" + "This entry doesn't allow to show virtual keyboard automatically.<br>" + "it is used in case that wants its own keypad such as calculator."); + elm_entry_input_panel_enabled_set(en, EINA_FALSE); + elm_box_pack_end(bx, en); + evas_object_show(en); + + evas_object_resize(win, 320, 300); + + elm_object_focus_set(win, EINA_TRUE); + evas_object_show(win); +} + +static void +changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *en; + en = (Evas_Object*)data; + + elm_entry_editable_set(en, elm_check_state_get(obj)); +} + +static void +en_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *sp, *en; + sp = (Evas_Object *)data; + en = (Evas_Object *)obj; + elm_spinner_min_max_set(sp, 0, strlen(elm_object_text_get(en))); +} + +static void +sp_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *en, *sp; + en = (Evas_Object *)data; + sp = (Evas_Object *)obj; + elm_entry_cursor_pos_set(en, elm_spinner_value_get(sp)); + elm_object_focus_set(en, EINA_TRUE); +} + +static void +add_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en; + en = (Evas_Object *)data; + + elm_entry_context_menu_item_add(en, "item", NULL, ELM_ICON_NONE, NULL, NULL); +} + +static void +clear_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en; + en = (Evas_Object *)data; + + elm_entry_context_menu_clear(en); +} + +static Evas_Object * +item_provider(void *images EINA_UNUSED, Evas_Object *en, const char *item) +{ + Evas_Object *o = NULL;; + char buf[1024]; + + if (!strcmp(item, "itemprovider")) + { + snprintf(buf, sizeof(buf), "%s/images/icon_00.png", + elm_app_data_dir_get()); + o = evas_object_image_filled_add(evas_object_evas_get(en)); + evas_object_image_file_set(o, buf, NULL); + } + + return o; +} + +static Evas_Object * +prepend_item_provider(void *images EINA_UNUSED, Evas_Object *en, const char *item) +{ + Evas_Object *o = NULL;; + char buf[1024]; + + if (!strcmp(item, "itemprovider")) + { + snprintf(buf, sizeof(buf), "%s/images/icon_10.png", + elm_app_data_dir_get()); + o = evas_object_image_filled_add(evas_object_evas_get(en)); + evas_object_image_file_set(o, buf, NULL); + } + + return o; +} + +static void +prepend_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en; + en = (Evas_Object *)data; + + elm_entry_item_provider_prepend(en, prepend_item_provider, NULL); + elm_object_text_set(en, + "Item Provider" + "<item size=50x50 vsize=full href=itemprovider></item>" + ); +} + +static void +remove_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en; + en = (Evas_Object *)data; + + elm_entry_item_provider_remove(en, item_provider, NULL); + elm_entry_item_provider_remove(en, prepend_item_provider, NULL); + elm_object_text_set(en, + "Item Provider" + "<item size=50x50 vsize=full href=itemprovider></item>" + ); +} + +static void +enable_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *en; + en = (Evas_Object*)data; + + elm_entry_context_menu_disabled_set(en, elm_check_state_get(obj)); +} + +void +test_entry7(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *gd, *bg, *en, *tg, *lb, *sp; + Evas_Object *bt, *en2; + + win = elm_win_util_standard_add("entry7", "Entry 7"); + elm_win_autodel_set(win, EINA_TRUE); + + gd = elm_grid_add(win); + elm_grid_size_set(gd, 100, 100); + evas_object_size_hint_weight_set(gd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, gd); + evas_object_show(gd); + + /* upper entry group */ + bg = elm_bg_add(win); + elm_bg_color_set(bg, 255, 0, 0); + elm_grid_pack(gd, bg, 10, 10, 60, 30); + evas_object_show(bg); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(en, "Editable, Cursor Position"); + evas_object_show(en); + elm_grid_pack(gd, en, 10, 10, 60, 30); + + tg = elm_check_add(win); + evas_object_size_hint_weight_set(tg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(tg, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(tg, "Editable"); + elm_check_state_set(tg, EINA_TRUE); + evas_object_smart_callback_add(tg, "changed", changed_cb, en); + elm_grid_pack(gd, tg, 70, 10, 22, 10); + evas_object_show(tg); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Cursor position:"); + evas_object_size_hint_weight_set(lb, 0.0, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_grid_pack(gd, lb, 70, 25, 25, 5); + evas_object_show(lb); + + sp = elm_spinner_add(win); + elm_spinner_label_format_set(sp, "%1.0f"); + elm_spinner_step_set(sp, 1); + elm_spinner_wrap_set(sp, ELM_WRAP_CHAR); + elm_spinner_min_max_set(sp, 0, strlen(elm_object_text_get(en))); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_grid_pack(gd, sp, 70, 30, 25, 10); + evas_object_smart_callback_add(en, "changed", en_changed_cb, sp); + evas_object_smart_callback_add(sp, "delay,changed", sp_changed_cb, en); + evas_object_show(sp); + + /* bottom entry group */ + bg = elm_bg_add(win); + elm_bg_color_set(bg, 0, 255, 0); + elm_grid_pack(gd, bg, 10, 50, 45, 30); + evas_object_show(bg); + + en2 = elm_entry_add(win); + elm_entry_scrollable_set(en2, EINA_TRUE); + evas_object_size_hint_weight_set(en2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en2, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(en2, + "Item Provider" + "<item size=50x50 vsize=full href=itemprovider></item>" + ); + elm_entry_item_provider_append(en2, item_provider, NULL); + elm_entry_context_menu_disabled_set(en2, EINA_TRUE); + elm_grid_pack(gd, en2, 10, 50, 45, 30); + evas_object_show(en2); + + tg = elm_check_add(win); + evas_object_size_hint_weight_set(tg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(tg, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(tg, "Disable Context Menu"); + elm_check_state_set(tg, EINA_TRUE); + evas_object_smart_callback_add(tg, "changed", enable_changed_cb, en2); + elm_grid_pack(gd, tg, 55, 50, 40, 10); + evas_object_show(tg); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Add Context Menu"); + elm_grid_pack(gd, bt, 55, 60, 40, 10); + evas_object_smart_callback_add(bt, "clicked", add_bt_clicked, en2); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Clear Context Menu"); + elm_grid_pack(gd, bt, 55, 70, 40, 10); + evas_object_smart_callback_add(bt, "clicked", clear_bt_clicked, en2); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Prepend Item Provider"); + elm_grid_pack(gd, bt, 10, 80, 45, 10); + evas_object_smart_callback_add(bt, "clicked", prepend_bt_clicked, en2); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Remove Item Provider"); + elm_grid_pack(gd, bt, 55, 80, 40, 10); + evas_object_smart_callback_add(bt, "clicked", remove_bt_clicked, en2); + evas_object_show(bt); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} + +static void +filter_prepend_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en, *en2; + static Elm_Entry_Filter_Accept_Set digits_filter_data; + + en = (Evas_Object *)data; + en2 = evas_object_data_get(en, "filter-entry"); + digits_filter_data.accepted = elm_object_text_get(en2); + digits_filter_data.rejected = NULL; + + elm_entry_markup_filter_append(en, elm_entry_filter_accept_set, + &digits_filter_data); + elm_object_text_set(en, "Markup Filter Prepend Test:"); +} + +static void +filter_remove_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en; + en = (Evas_Object *)data; + + elm_entry_markup_filter_remove(en, elm_entry_filter_accept_set, NULL); + elm_object_text_set(en, "Markup Filter Prepend Test:"); +} + +static void +icon_visible_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *en; + en = (Evas_Object*)data; + + elm_entry_icon_visible_set(en, elm_check_state_get(obj)); +} + +static void +end_visible_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *en; + en = (Evas_Object*)data; + + elm_entry_end_visible_set(en, elm_check_state_get(obj)); +} + +static void +horizontal_bounce_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *en; + Eina_Bool vb; + Eina_Bool bounce = elm_check_state_get(obj); + en = (Evas_Object*)data; + + elm_scroller_bounce_get(en, NULL, &vb); + elm_scroller_bounce_set(en, bounce, bounce); +} + +static void +vertical_bounce_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *en; + Eina_Bool hb; + Eina_Bool bounce = elm_check_state_get(obj); + en = (Evas_Object*)data; + + elm_scroller_bounce_get(en, &hb, NULL); + elm_scroller_bounce_set(en, hb, bounce); +} + +void +test_entry8(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *gd, *rect, *en, *lb; + Evas_Object *bt, *en2; + Evas_Object *ch, *en3; + Evas_Object *en4; + static Elm_Entry_Filter_Limit_Size limit_filter_data; + + win = elm_win_util_standard_add("entry8", "Entry 8"); + elm_win_autodel_set(win, EINA_TRUE); + + gd = elm_grid_add(win); + elm_grid_size_set(gd, 100, 100); + evas_object_size_hint_weight_set(gd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, gd); + evas_object_show(gd); + + rect = evas_object_rectangle_add(evas_object_evas_get(win)); + elm_grid_pack(gd, rect, 5, 5, 90, 10); + evas_object_color_set(rect, 125, 125, 255, 255); + evas_object_show(rect); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(en, "Markup Filter Prepend Test"); + elm_grid_pack(gd, en, 5, 5, 90, 10); + evas_object_show(en); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Markup Filter (20 Characters):"); + evas_object_size_hint_weight_set(lb, 0.0, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_grid_pack(gd, lb, 5, 15, 50, 10); + evas_object_show(lb); + + rect = evas_object_rectangle_add(evas_object_evas_get(win)); + elm_grid_pack(gd, rect, 55, 15, 40, 10); + evas_object_color_set(rect, 0, 125, 255, 255); + evas_object_show(rect); + + en2 = elm_entry_add(win); + elm_entry_scrollable_set(en2, EINA_TRUE); + elm_scroller_policy_set(en2, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + evas_object_size_hint_weight_set(en2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en2, EVAS_HINT_FILL, EVAS_HINT_FILL); + limit_filter_data.max_char_count = 20; + limit_filter_data.max_byte_count = 0; + elm_entry_markup_filter_append(en2, elm_entry_filter_limit_size, &limit_filter_data); + evas_object_data_set(en, "filter-entry", en2); + evas_object_show(en2); + elm_grid_pack(gd, en2, 55, 15, 40, 10); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Markup Filter Prepend"); + elm_grid_pack(gd, bt, 5, 25, 45, 10); + evas_object_smart_callback_add(bt, "clicked", filter_prepend_bt_clicked, en); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Markup Filter Remove"); + elm_grid_pack(gd, bt, 50, 25, 45, 10); + evas_object_smart_callback_add(bt, "clicked", filter_remove_bt_clicked, en); + evas_object_show(bt); + + en3 = elm_entry_add(win); + elm_entry_scrollable_set(en3, EINA_TRUE); + elm_scroller_policy_set(en3, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_single_line_set(en3, EINA_TRUE); + evas_object_size_hint_weight_set(en3, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en3, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(en3); + elm_grid_pack(gd, en3, 5, 35, 90, 20); + + bt = elm_icon_add(win); + elm_icon_standard_set(bt, "home"); + evas_object_size_hint_min_set(bt, 48, 48); + evas_object_color_set(bt, 128, 0, 0, 128); + evas_object_show(bt); + elm_object_part_content_set(en3, "icon", bt); + + bt = elm_icon_add(win); + elm_icon_standard_set(bt, "delete"); + evas_object_color_set(bt, 128, 0, 0, 128); + evas_object_size_hint_min_set(bt, 48, 48); + evas_object_show(bt); + elm_object_part_content_set(en3, "end", bt); + + ch = elm_check_add(win); + evas_object_size_hint_weight_set(ch, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ch, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(ch, "Icon Visible"); + elm_check_state_set(ch, EINA_TRUE); + evas_object_smart_callback_add(ch, "changed", icon_visible_changed_cb, en3); + elm_grid_pack(gd, ch, 5, 55, 30, 10); + evas_object_show(ch); + + ch = elm_check_add(win); + evas_object_size_hint_weight_set(ch, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ch, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(ch, "End Visible"); + elm_check_state_set(ch, EINA_TRUE); + evas_object_smart_callback_add(ch, "changed", end_visible_changed_cb, en3); + elm_grid_pack(gd, ch, 70, 55, 25, 10); + evas_object_show(ch); + + rect = evas_object_rectangle_add(evas_object_evas_get(win)); + elm_grid_pack(gd, rect, 5, 65, 90, 20); + evas_object_color_set(rect, 255, 125, 125, 255); + evas_object_show(rect); + + en4 = elm_entry_add(win); + elm_object_part_text_set(en4, "guide", "Type in here"); + elm_entry_scrollable_set(en4, EINA_TRUE); + elm_scroller_bounce_set(en4, EINA_TRUE, EINA_TRUE); + elm_entry_autocapital_type_set(en4, EINA_TRUE); + evas_object_size_hint_weight_set(en4, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en4, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_grid_pack(gd, en4, 5, 65, 90, 20); + evas_object_show(en4); + + ch = elm_check_add(win); + evas_object_size_hint_weight_set(ch, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ch, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(ch, "Horizontal Bounce Set"); + elm_check_state_set(ch, EINA_TRUE); + evas_object_smart_callback_add(ch, "changed", horizontal_bounce_changed_cb, en4); + elm_grid_pack(gd, ch, 5, 85, 45, 10); + evas_object_show(ch); + + ch = elm_check_add(win); + evas_object_size_hint_weight_set(ch, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ch, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(ch, "Vertical Bounce Set"); + elm_check_state_set(ch, EINA_TRUE); + evas_object_smart_callback_add(ch, "changed", vertical_bounce_changed_cb, en4); + elm_grid_pack(gd, ch, 50, 85, 45, 10); + evas_object_show(ch); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} + +typedef struct { + Evas_Object *en_regex; + Evas_Object *lb_regex; + Evas_Object *en_single; + Evas_Object *en_multi; + Elm_Validator_Regexp *re; +} _test_regex_data_t; + +static void +_test_regex_data_del(void *data, + Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + _test_regex_data_t *test_data = data; + if (test_data->re) elm_validator_regexp_free(test_data->re); + free(test_data); +} + +static void +_test_regex_bt_cb(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + int status; + _test_regex_data_t *test_data = data; + Eina_Strbuf *tmp; + + if (test_data->re) + { + eo_event_callback_del(test_data->en_single, ELM_ENTRY_EVENT_VALIDATE, elm_validator_regexp_helper, test_data->re); + eo_event_callback_del(test_data->en_multi, ELM_ENTRY_EVENT_VALIDATE, elm_validator_regexp_helper, test_data->re); + elm_validator_regexp_free(test_data->re); + } + test_data->re = elm_validator_regexp_new(elm_entry_entry_get(test_data->en_regex), NULL); + + status = elm_validator_regexp_status_get(test_data->re); + tmp = eina_strbuf_manage_new(strdup("Regex error: ")); + switch (status) + { + case ELM_REG_NOERROR: + { + eina_strbuf_append(tmp, "No error. Regex maches to the Entrys text."); + break; + } + case ELM_REG_BADPAT: + { + eina_strbuf_append(tmp, "Invalid regular expression."); + break; + } + default: + break; + } + if (!status) + { + eo_event_callback_add(test_data->en_single, ELM_ENTRY_EVENT_VALIDATE, elm_validator_regexp_helper, test_data->re); + eo_event_callback_add(test_data->en_multi, ELM_ENTRY_EVENT_VALIDATE, elm_validator_regexp_helper, test_data->re); + } + + elm_object_text_set(test_data->lb_regex, eina_strbuf_string_get(tmp)); + eina_strbuf_free(tmp); +} + +static inline Evas_Object * +_test_regex_entry_add(Evas_Object *parent, Eina_Bool is_singleline) +{ + Evas_Object *entry = elm_entry_add(parent); + elm_entry_scrollable_set(entry, EINA_TRUE); + elm_entry_single_line_set(entry, is_singleline); + evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_entry_editable_set(entry, EINA_TRUE); + evas_object_show(entry); + return entry; +} + +void +test_entry_regex(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *scr, *box; + Evas_Object *item, *label, *bt, *sep; + _test_regex_data_t *test_data; +#define REGEX "^[0-9]*$" + + test_data = malloc(sizeof(_test_regex_data_t)); + + win = elm_win_util_standard_add("Entry", "Entry Regex Test"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, + _test_regex_data_del, test_data); + + scr = elm_scroller_add(win); + elm_scroller_bounce_set(scr, EINA_FALSE, EINA_TRUE); + elm_scroller_policy_set(scr, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO); + evas_object_size_hint_weight_set(scr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, scr); + evas_object_show(scr); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_homogeneous_set(box, EINA_FALSE); + elm_object_content_set(scr, box); + + evas_object_show(box); + + label = elm_label_add(box); + elm_object_text_set(label, "Regular Expression"); + elm_box_pack_end(box, label); + evas_object_show(label); + + item = elm_box_add(win); + evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_horizontal_set(item, EINA_TRUE); + elm_box_homogeneous_set(item, EINA_FALSE); + evas_object_show(item); + elm_box_pack_end(box, item); + + test_data->en_regex = _test_regex_entry_add(item, EINA_TRUE); + elm_box_pack_end(item, test_data->en_regex); + + bt = elm_button_add(item); + elm_object_text_set(bt, "Set"); + evas_object_smart_callback_add(bt, "clicked", _test_regex_bt_cb, test_data); + evas_object_show(bt); + elm_box_pack_end(item, bt); + + test_data->lb_regex = elm_label_add(box); + elm_object_text_set(test_data->lb_regex, "Regex error: no error."); + elm_box_pack_end(box, test_data->lb_regex); + evas_object_show(test_data->lb_regex); + + sep = elm_separator_add(box); + elm_separator_horizontal_set(sep, EINA_TRUE); + evas_object_show(sep); + elm_box_pack_end(box, sep); + + label = elm_label_add(box); + elm_object_text_set(label, "Test regex in single line entry"); + elm_box_pack_end(box, label); + evas_object_show(label); + + test_data->en_single = _test_regex_entry_add(box, EINA_TRUE); + elm_box_pack_end(box, test_data->en_single); + + label = elm_label_add(box); + elm_object_text_set(label, "Test regex in multi line entry"); + elm_box_pack_end(box, label); + evas_object_show(label); + + test_data->en_multi = _test_regex_entry_add(box, EINA_FALSE); + elm_box_pack_end(box, test_data->en_multi); + + test_data->re = elm_validator_regexp_new(REGEX, NULL); + elm_entry_entry_set(test_data->en_regex, REGEX); + eo_event_callback_add(test_data->en_single, ELM_ENTRY_EVENT_VALIDATE, elm_validator_regexp_helper, test_data->re); + eo_event_callback_add(test_data->en_multi, ELM_ENTRY_EVENT_VALIDATE, elm_validator_regexp_helper, test_data->re); + + evas_object_resize(win, 400, 400); + evas_object_show(win); + +#undef REGEX +} + +static void +_scrolled_entry_clear(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_object_text_set(en, ""); +} + +static void +_scrolled_entry_save(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *en = data; + elm_entry_file_save(en); +} + +static void +auto_save_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *en; + en = (Evas_Object*)data; + + elm_entry_autosave_set(en, elm_check_state_get(obj)); +} + +void +test_entry_notepad(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bx2, *bt, *np, *ch; + + win = elm_win_util_standard_add("entry-notepad", "Entry Notepad"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + np = elm_entry_add(win); + elm_entry_scrollable_set(np, EINA_TRUE); + elm_entry_file_set(np, "note.txt", ELM_TEXT_FORMAT_PLAIN_UTF8); + evas_object_size_hint_weight_set(np, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(np, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, np); + evas_object_show(np); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Clear"); + evas_object_smart_callback_add(bt, "clicked", _scrolled_entry_clear, np); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Save"); + evas_object_smart_callback_add(bt, "clicked", _scrolled_entry_save, np); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + ch = elm_check_add(win); + evas_object_size_hint_weight_set(ch, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ch, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(ch, "Auto Save"); + elm_check_state_set(ch, EINA_FALSE); + evas_object_smart_callback_add(ch, "changed", auto_save_changed_cb, np); + elm_box_pack_end(bx2, ch); + evas_object_show(ch); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 320, 300); + + elm_object_focus_set(win, EINA_TRUE); + evas_object_show(win); +} + +void +test_entry_emoticon(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *en; + + win = elm_win_util_standard_add("entry-emoticon", "Entry Emoticon"); + elm_win_autodel_set(win, EINA_TRUE); + + en = elm_entry_add(win); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, en); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_object_text_set(en, + "angry <item absize=64x64 vsize=ascent href=emoticon/angry></item> <br>" + "angry-shout <item absize=64x64 vsize=ascent href=emoticon/angry-shout></item> <br>" + "crazy-laugh <item absize=64x64 vsize=ascent href=emoticon/crazy-laugh></item> <br>" + "evil-laugh <item absize=64x64 vsize=ascent href=emoticon/evil-laugh></item> <br>" + "evil <item absize=64x64 vsize=ascent href=emoticon/evil></item> <br>" + "goggle-smile <item absize=64x64 vsize=ascent href=emoticon/goggle-smile></item> <br>" + "grumpy <item absize=64x64 vsize=ascent href=emoticon/grumpy></item> <br>" + "guilty <item absize=64x64 vsize=ascent href=emoticon/guilty></item> <br>" + "haha <item absize=64x64 vsize=ascent href=emoticon/haha></item> <br>" + "happy-panting <item absize=64x64 vsize=ascent href=emoticon/happy-panting></item> <br>" + "happy <item absize=64x64 vsize=ascent href=emoticon/happy></item> <br>" + "indifferent <item absize=64x64 vsize=ascent href=emoticon/indifferent></item> <br>" + "kiss <item absize=64x64 vsize=ascent href=emoticon/kiss></item> <br>" + "knowing-grin <item absize=64x64 vsize=ascent href=emoticon/knowing-grin></item> <br>" + "laugh <item absize=64x64 vsize=ascent href=emoticon/laugh></item> <br>" + "little-bit-sorry <item absize=64x64 vsize=ascent href=emoticon/little-bit-sorry></item> <br>" + "love-lots <item absize=64x64 vsize=ascent href=emoticon/love-lots></item> <br>" + "love <item absize=64x64 vsize=ascent href=emoticon/love></item> <br>" + "minimal-smile <item absize=64x64 vsize=ascent href=emoticon/minimal-smile></item> <br>" + "not-happy <item absize=64x64 vsize=ascent href=emoticon/not-happy></item> <br>" + "not-impressed <item absize=64x64 vsize=ascent href=emoticon/not-impressed></item> <br>" + "omg <item absize=64x64 vsize=ascent href=emoticon/omg></item> <br>" + "opensmile <item absize=64x64 vsize=ascent href=emoticon/opensmile></item> <br>" + "smile <item absize=64x64 vsize=ascent href=emoticon/smile></item> <br>" + "sorry <item absize=64x64 vsize=ascent href=emoticon/sorry></item> <br>" + "squint-laugh <item absize=64x64 vsize=ascent href=emoticon/squint-laugh></item> <br>" + "surprised <item absize=64x64 vsize=ascent href=emoticon/surprised></item> <br>" + "suspicious <item absize=64x64 vsize=ascent href=emoticon/suspicious></item> <br>" + "tongue-dangling <item absize=64x64 vsize=ascent href=emoticon/tongue-dangling></item> <br>" + "tongue-poke <item absize=64x64 vsize=ascent href=emoticon/tongue-poke></item> <br>" + "uh <item absize=64x64 vsize=ascent href=emoticon/uh></item> <br>" + "unhappy <item absize=64x64 vsize=ascent href=emoticon/unhappy></item> <br>" + "very-sorry <item absize=64x64 vsize=ascent href=emoticon/very-sorry></item> <br>" + "what <item absize=64x64 vsize=ascent href=emoticon/what></item> <br>" + "wink <item absize=64x64 vsize=ascent href=emoticon/wink></item> <br>" + "worried <item absize=64x64 vsize=ascent href=emoticon/worried></item> <br>" + "wtf <item absize=64x64 vsize=ascent href=emoticon/wtf></item> <br>" + ); + evas_object_show(en); + elm_object_focus_set(en, EINA_TRUE); + + evas_object_resize(win, 400, 500); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_entry_anchor.c b/src/bin/elementary/test_entry_anchor.c new file mode 100644 index 0000000000..c5210b899d --- /dev/null +++ b/src/bin/elementary/test_entry_anchor.c @@ -0,0 +1,236 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void +_print_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("bubble clicked\n"); +} + +static void +my_entry_anchor_bt(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *av = data; + elm_entry_anchor_hover_end(av); +} + +static void +my_entry_anchor(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *av = data; + Elm_Entry_Anchor_Hover_Info *ei = event_info; + Evas_Object *bt, *bx; + + bt = elm_button_add(obj); + elm_object_text_set(bt, ei->anchor_info->name); + elm_object_part_content_set(ei->hover, "middle", bt); + evas_object_show(bt); + + // hints as to where we probably should put hover contents (buttons etc.). + if (ei->hover_top) + { + bx = elm_box_add(obj); + bt = elm_button_add(obj); + elm_object_text_set(bt, "Top 1"); + elm_box_pack_end(bx, bt); + evas_object_smart_callback_add(bt, "clicked", my_entry_anchor_bt, av); + evas_object_show(bt); + bt = elm_button_add(obj); + elm_object_text_set(bt, "Top 2"); + elm_box_pack_end(bx, bt); + evas_object_smart_callback_add(bt, "clicked", my_entry_anchor_bt, av); + evas_object_show(bt); + bt = elm_button_add(obj); + elm_object_text_set(bt, "Top 3"); + elm_box_pack_end(bx, bt); + evas_object_smart_callback_add(bt, "clicked", my_entry_anchor_bt, av); + evas_object_show(bt); + elm_object_part_content_set(ei->hover, "top", bx); + evas_object_show(bx); + } + if (ei->hover_bottom) + { + bt = elm_button_add(obj); + elm_object_text_set(bt, "Bot"); + elm_object_part_content_set(ei->hover, "bottom", bt); + evas_object_smart_callback_add(bt, "clicked", my_entry_anchor_bt, av); + evas_object_show(bt); + } + if (ei->hover_left) + { + bt = elm_button_add(obj); + elm_object_text_set(bt, "Left"); + elm_object_part_content_set(ei->hover, "left", bt); + evas_object_smart_callback_add(bt, "clicked", my_entry_anchor_bt, av); + evas_object_show(bt); + } + if (ei->hover_right) + { + bt = elm_button_add(obj); + elm_object_text_set(bt, "Right"); + elm_object_part_content_set(ei->hover, "right", bt); + evas_object_smart_callback_add(bt, "clicked", my_entry_anchor_bt, av); + evas_object_show(bt); + } +} + +static void +my_entry_anchor_edge_left(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("left\n"); +} + +static void +my_entry_anchor_edge_right(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("right\n"); +} + +static void +my_entry_anchor_edge_top(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("top\n"); +} + +static void +my_entry_anchor_edge_bottom(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("bottom\n"); +} + +static void +my_entry_anchor_scroll(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Coord x, y, w, h, vw, vh; + + elm_scroller_region_get(obj, &x, &y, &w, &h); + elm_scroller_child_size_get(obj, &vw, &vh); + printf("scroll %ix%i +%i+%i in %ix%i\n", w, h, x, y, vw, vh); +} + +void +test_entry_anchor(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *en, *sc, *bx, *bb, *ic; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("entry_anchor", "Entry Anchor"); + elm_win_autodel_set(win, EINA_TRUE); + + sc = elm_scroller_add(win); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, sc); + + evas_object_smart_callback_add(sc, "edge,left", my_entry_anchor_edge_left, NULL); + evas_object_smart_callback_add(sc, "edge,right", my_entry_anchor_edge_right, NULL); + evas_object_smart_callback_add(sc, "edge,top", my_entry_anchor_edge_top, NULL); + evas_object_smart_callback_add(sc, "edge,bottom", my_entry_anchor_edge_bottom, NULL); + evas_object_smart_callback_add(sc, "scroll", my_entry_anchor_scroll, NULL); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1); + + bb = elm_bubble_add(win); + elm_object_text_set(bb, "Message 3"); + elm_object_part_text_set(bb, "info", "10:32 4/11/2008"); + elm_object_part_content_set(bb, "icon", ic); + evas_object_smart_callback_add(bb, "clicked", _print_clicked, NULL); + evas_object_show(ic); + evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + en = elm_entry_add(win); + elm_entry_anchor_hover_style_set(en, "popout"); + elm_entry_anchor_hover_parent_set(en, win); + elm_object_text_set(en, + "Hi there. This is the most recent message in the " + "list of messages. It has one <a href=tel:+614321234>+61 432 1234</a> " + "(phone number) to click on."); + evas_object_smart_callback_add(en, "anchor,hover,opened", + my_entry_anchor, en); + elm_object_content_set(bb, en); + evas_object_show(en); + elm_box_pack_end(bx, bb); + evas_object_show(bb); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + + bb = elm_bubble_add(win); + elm_object_text_set(bb, "Message 2"); + elm_object_part_text_set(bb, "info", "7:16 27/10/2008"); + elm_object_part_content_set(bb, "icon", ic); + evas_object_smart_callback_add(bb, "clicked", _print_clicked, NULL); + evas_object_show(ic); + evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + en = elm_entry_add(win); + elm_entry_anchor_hover_style_set(en, "popout"); + elm_entry_anchor_hover_parent_set(en, win); + elm_object_text_set(en, + "Hey what are you doing? This is the second last message " + "Hi there. This is the most recent message in the " + "list. It's a longer one so it can wrap more and " + "contains a <a href=contact:john>John</a> contact " + "link in it to test popups on links. The idea is that " + "all SMS's are scanned for things that look like phone " + "numbers or names that are in your contacts list, and " + "if they are, they become clickable links that pop up " + "a menus of obvious actions to perform on this piece " + "of information. This of course can be later explicitly " + "done by links maybe running local apps or even being " + "web URL's too that launch the web browser and point it " + "to that URL. <item relsize=16x16 vsize=full href=emoticon/omg></item>"); + evas_object_smart_callback_add(en, "anchor,hover,opened", my_entry_anchor, en); + elm_object_content_set(bb, en); + evas_object_show(en); + elm_box_pack_end(bx, bb); + evas_object_show(bb); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1); + + bb = elm_bubble_add(win); + elm_object_text_set(bb, "Message 1"); + elm_object_part_text_set(bb, "info", "20:47 18/6/2008"); + elm_object_part_content_set(bb, "icon", ic); + evas_object_smart_callback_add(bb, "clicked", _print_clicked, NULL); + evas_object_show(ic); + evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + en = elm_entry_add(win); + elm_entry_anchor_hover_style_set(en, "popout"); + elm_entry_anchor_hover_parent_set(en, win); + elm_object_text_set(en, "This is a short message. <item relsize=16x16 vsize=full href=emoticon/haha></item>"); + evas_object_smart_callback_add(en, "anchor,hover,opened", + my_entry_anchor, en); + elm_object_content_set(bb, en); + evas_object_show(en); + elm_box_pack_end(bx, bb); + evas_object_show(bb); + + elm_object_content_set(sc, bx); + evas_object_show(bx); + + evas_object_show(sc); + + elm_object_focus_set(win, EINA_TRUE); + evas_object_resize(win, 320, 300); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_entry_anchor2.c b/src/bin/elementary/test_entry_anchor2.c new file mode 100644 index 0000000000..a96bdf9ece --- /dev/null +++ b/src/bin/elementary/test_entry_anchor2.c @@ -0,0 +1,109 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void +my_entry_anchor_bt(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *av = data; + elm_entry_anchor_hover_end(av); +} + +static void +_anchor_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Entry_Anchor_Info *ev = event_info; + printf("anchor click %d: '%s' (%d, %d)\n", ev->button, ev->name, ev->x, ev->y); +} + +static void +_anchor_hover_opened_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *av = data; + Elm_Entry_Anchor_Hover_Info *ei = event_info; + Evas_Object *bt, *bx; + + bt = elm_button_add(obj); + elm_object_text_set(bt, ei->anchor_info->name); + elm_object_part_content_set(ei->hover, "middle", bt); + evas_object_show(bt); + + // hints as to where we probably should put hover contents (buttons etc.). + if (ei->hover_top) + { + bx = elm_box_add(obj); + bt = elm_button_add(obj); + elm_object_text_set(bt, "Top 1"); + elm_box_pack_end(bx, bt); + evas_object_smart_callback_add(bt, "clicked", my_entry_anchor_bt, av); + evas_object_show(bt); + bt = elm_button_add(obj); + elm_object_text_set(bt, "Top 2"); + elm_box_pack_end(bx, bt); + evas_object_smart_callback_add(bt, "clicked", my_entry_anchor_bt, av); + evas_object_show(bt); + bt = elm_button_add(obj); + elm_object_text_set(bt, "Top 3"); + elm_box_pack_end(bx, bt); + evas_object_smart_callback_add(bt, "clicked", my_entry_anchor_bt, av); + evas_object_show(bt); + elm_object_part_content_set(ei->hover, "top", bx); + evas_object_show(bx); + } + if (ei->hover_bottom) + { + bt = elm_button_add(obj); + elm_object_text_set(bt, "Bot"); + elm_object_part_content_set(ei->hover, "bottom", bt); + evas_object_smart_callback_add(bt, "clicked", my_entry_anchor_bt, av); + evas_object_show(bt); + } + if (ei->hover_left) + { + bt = elm_button_add(obj); + elm_object_text_set(bt, "Left"); + elm_object_part_content_set(ei->hover, "left", bt); + evas_object_smart_callback_add(bt, "clicked", my_entry_anchor_bt, av); + evas_object_show(bt); + } + if (ei->hover_right) + { + bt = elm_button_add(obj); + elm_object_text_set(bt, "Right"); + elm_object_part_content_set(ei->hover, "right", bt); + evas_object_smart_callback_add(bt, "clicked", my_entry_anchor_bt, av); + evas_object_show(bt); + } +} + +void +test_entry_anchor2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *en; + + win = elm_win_util_standard_add("entry_anchor2", "Entry Anchor 2"); + elm_win_autodel_set(win, EINA_TRUE); + + en = elm_entry_add(win); + elm_entry_anchor_hover_style_set(en, "popout"); + elm_entry_anchor_hover_parent_set(en, win); + elm_object_text_set(en, + "This is an entry widget in this window that<br/>" + "uses markup <b>like this</> for styling and<br/>" + "formatting <em>like this</>, as well as<br/>" + "<a href=X><link>links in the text</></a>, so enter text<br/>" + "in here to edit it. By the way, links are<br/>" + "called <a href=anc-02>Anchors</a> so you will need<br/>" + "to refer to them this way. <item relsize=16x16 vsize=full href=emoticon/guilty-smile></item>"); + evas_object_smart_callback_add(en, "anchor,hover,opened", _anchor_hover_opened_cb, en); + evas_object_smart_callback_add(en, "anchor,clicked", _anchor_clicked_cb, en); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, en); + evas_object_show(en); + + evas_object_resize(win, 320, 300); + + elm_object_focus_set(win, EINA_TRUE); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_explode.c b/src/bin/elementary/test_explode.c new file mode 100644 index 0000000000..63b1b4608f --- /dev/null +++ b/src/bin/elementary/test_explode.c @@ -0,0 +1,211 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static Evas_Object *target = NULL; +static Ecore_Animator *anim = NULL; + +static Eina_List *mirrors = NULL; + +static Eina_Bool +_cb_anim(void *data EINA_UNUSED, double pos) +{ + Eina_List *l; + Evas_Object *o; + double v = ecore_animator_pos_map(pos, ECORE_POS_MAP_SINUSOIDAL, 0.0, 0.0); + Evas_Coord x, y, w, h; + Evas_Coord vw, vh; + int tot; + + evas_output_viewport_get(evas_object_evas_get(target), NULL, NULL, &vw, &vh); + evas_object_geometry_get(target, &x, &y, &w, &h); + tot = (eina_list_count(mirrors) + 2) / 2; + EINA_LIST_FOREACH(mirrors, l, o) + { + Evas_Map *m = evas_map_new(4); + int n = (int)((unsigned long)evas_object_data_get(o, "stack")); + double ang = (((double)(n + 1) * 20.0) / (double)tot); + evas_map_util_points_populate_from_object(m, o); + evas_map_util_3d_rotate(m, ang * v / 2.0, ang * v, 0, + x + w + (w / 2), y + (h / 2), 0); + evas_map_util_3d_perspective(m, vw / 2, vh / 2, 0, vw + vh); + evas_object_map_set(o, m); + evas_map_free(m); + evas_object_map_enable_set(o, EINA_TRUE); + } + if (pos >= 1.0) anim = NULL; + return EINA_TRUE; +} + +static int +explode_obj(Evas_Object *obj, int n) +{ + Eina_List *children = NULL; + Evas_Object *o; + Evas *e; + + e = evas_object_evas_get(obj); + children = evas_object_smart_members_get(obj); + if (!children) + { + Evas_Object *m; + Evas_Coord x, y, w, h; + + evas_object_geometry_get(obj, &x, &y, &w, &h); + + m = evas_object_image_filled_add(e); + mirrors = eina_list_append(mirrors, m); + evas_object_anti_alias_set(m, EINA_TRUE); + evas_object_image_source_clip_set(m, EINA_FALSE); + evas_object_pass_events_set(m, EINA_TRUE); + evas_object_image_source_set(m, obj); + evas_object_image_source_visible_set(m, EINA_FALSE); + evas_object_layer_set(m, EVAS_LAYER_MAX - 10); + evas_object_move(m, x, y); + evas_object_resize(m, w, h); + evas_object_show(m); + evas_object_color_set(m, 0, 0, 0, 128); + evas_object_data_set(m, "stack", (void *)((unsigned long)n)); + + n++; + + m = evas_object_image_filled_add(e); + mirrors = eina_list_append(mirrors, m); + evas_object_anti_alias_set(m, EINA_TRUE); + evas_object_image_source_clip_set(m, EINA_FALSE); + evas_object_pass_events_set(m, EINA_TRUE); + evas_object_image_source_set(m, obj); + evas_object_image_source_visible_set(m, EINA_FALSE); + evas_object_layer_set(m, EVAS_LAYER_MAX - 10); + evas_object_move(m, x, y); + evas_object_resize(m, w, h); + evas_object_show(m); + evas_object_data_set(m, "stack", (void *)((unsigned long)n)); + } + else + { + EINA_LIST_FREE(children, o) + { + if (!evas_object_visible_get(o)) continue; + if (evas_object_clipees_has(o)) continue; + + n = explode_obj(o, n); + } + } + return n; +} + +static void +explode(Evas_Object *obj) +{ + Evas_Object *o; + + EINA_LIST_FREE(mirrors, o) evas_object_del(o); + if (!obj) return; + + explode_obj(obj, 0); + if (!anim) anim = ecore_animator_timeline_add(1.0, _cb_anim, NULL); +} + +static void +_cb_target_del(void *data EINA_UNUSED, Evas *e EINA_UNUSED, + Evas_Object *obj, void *info EINA_UNUSED) +{ + if (obj == target) + { + if (anim) + { + ecore_animator_del(anim); + anim = NULL; + } + explode(NULL); + target = NULL; + } +} + +static void +_cb_catcher_down(void *data, Evas *e, + Evas_Object *obj EINA_UNUSED, void *info) +{ + Evas_Event_Mouse_Down *ev = info; + + if (target) + { + evas_object_event_callback_del_full(target, EVAS_CALLBACK_DEL, + _cb_target_del, data); + if (anim) + { + ecore_animator_del(anim); + anim = NULL; + } + explode(NULL); + target = NULL; + } + if ((ev->button == 2) && + (evas_key_modifier_is_set(ev->modifiers, "Control"))) + { + Eina_List *objs; + + objs = evas_tree_objects_at_xy_get(e, NULL, ev->canvas.x, ev->canvas.y); + if (objs) + { + Eina_List *l; + Evas_Object *lobj, *parent; + + target = NULL; + EINA_LIST_FOREACH(objs, l, lobj) + { + if (evas_object_data_get(lobj, "::catcher::")) continue; + if (evas_object_repeat_events_get(lobj)) + { + int r, g, b, a; + evas_object_color_get(lobj, &r, &g, &b, &a); + if ((r == 0) && (g == 0) && (b == 0) && (a == 0)) continue; + } + if (elm_object_widget_check(lobj)) + { + target = lobj; + break; + } + else + { + for (parent = lobj; parent != NULL; + parent = elm_object_parent_widget_get(parent)) + { + if (elm_object_widget_check(parent)) + { + target = parent; + break; + } + } + if (target) break; + } + } + if (target) + { + evas_object_event_callback_add(target, EVAS_CALLBACK_DEL, + _cb_target_del, data); + eina_list_free(objs); + explode(target); + } + } + } +} + +void +explode_win_enable(Evas_Object *win) +{ + Evas *e = evas_object_evas_get(win); + + Evas_Object *catcher = evas_object_rectangle_add(e); + evas_object_layer_set(catcher, EVAS_LAYER_MAX); + evas_object_color_set(catcher, 0, 0, 0, 0); + evas_object_resize(catcher, 99999, 99999); + evas_object_repeat_events_set(catcher, EINA_TRUE); + evas_object_data_set(catcher, "::catcher::", catcher); + evas_object_show(catcher); + + evas_object_event_callback_add(catcher, EVAS_CALLBACK_MOUSE_DOWN, + _cb_catcher_down, win); +} diff --git a/src/bin/elementary/test_explode.h b/src/bin/elementary/test_explode.h new file mode 100644 index 0000000000..e91a61511f --- /dev/null +++ b/src/bin/elementary/test_explode.h @@ -0,0 +1 @@ +void explode_win_enable(Evas_Object *win); diff --git a/src/bin/elementary/test_external.c b/src/bin/elementary/test_external.c new file mode 100644 index 0000000000..768185aa58 --- /dev/null +++ b/src/bin/elementary/test_external.c @@ -0,0 +1,182 @@ +#include "test.h" +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +void +test_external_button(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *ly; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("ext_button", "Edje External Button"); + elm_win_autodel_set(win, EINA_TRUE); + + ly = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test_external.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "external/button"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, ly); + evas_object_show(ly); + + evas_object_resize(win, 320, 400); + evas_object_show(win); +} + +void +test_external_slider(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *ly; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("ext_slider", "Edje External Slider"); + elm_win_autodel_set(win, EINA_TRUE); + + ly = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test_external.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "external/slider"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, ly); + evas_object_show(ly); + + evas_object_resize(win, 320, 400); + evas_object_show(win); +} + +void +test_external_scroller(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *ly; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("ext_scroller", "Edje External Scroller"); + elm_win_autodel_set(win, EINA_TRUE); + + ly = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test_external.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "external/scroller"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, ly); + evas_object_show(ly); + + evas_object_resize(win, 320, 400); + evas_object_show(win); +} + + +static Eina_Bool +_timer_cb(void *data) +{ + Evas_Object *edje = data; + Evas_Object *bt1, *bt2, *bt3, *pb1, *pb2, *pb3, *pb4, *pb5, *pb6, *pb7; + double progress; + + pb1 = edje_object_part_external_object_get(edje, "ext_pbar1"); + pb2 = edje_object_part_external_object_get(edje, "ext_pbar2"); + pb3 = edje_object_part_external_object_get(edje, "ext_pbar3"); + pb4 = edje_object_part_external_object_get(edje, "ext_pbar4"); + pb6 = edje_object_part_external_object_get(edje, "ext_pbar6"); + progress = elm_progressbar_value_get(pb1) + 0.0123; + + elm_progressbar_value_set(pb1, progress); + elm_progressbar_value_set(pb2, progress); + elm_progressbar_value_set(pb3, progress); + elm_progressbar_value_set(pb4, progress); + elm_progressbar_value_set(pb6, progress); + + if (progress < 1.0) + return ECORE_CALLBACK_RENEW; + + pb5 = edje_object_part_external_object_get(edje, "ext_pbar5"); + pb7 = edje_object_part_external_object_get(edje, "ext_pbar7"); + elm_progressbar_pulse(pb2, EINA_FALSE); + elm_progressbar_pulse(pb5, EINA_FALSE); + elm_progressbar_pulse(pb7, EINA_FALSE); + + bt1 = edje_object_part_external_object_get(edje, "ext_button1"); + bt2 = edje_object_part_external_object_get(edje, "ext_button2"); + bt3 = edje_object_part_external_object_get(edje, "ext_button3"); + elm_object_disabled_set(bt1, EINA_FALSE); + elm_object_disabled_set(bt2, EINA_FALSE); + elm_object_disabled_set(bt3, EINA_FALSE); + + return ECORE_CALLBACK_CANCEL; +} + +static void +_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *edje = data; + Evas_Object *bt1, *bt2, *bt3, *pb1, *pb2, *pb3, *pb4, *pb5, *pb6, *pb7; + + bt1 = edje_object_part_external_object_get(edje, "ext_button1"); + bt2 = edje_object_part_external_object_get(edje, "ext_button2"); + bt3 = edje_object_part_external_object_get(edje, "ext_button3"); + elm_object_disabled_set(bt1, EINA_TRUE); + elm_object_disabled_set(bt2, EINA_TRUE); + elm_object_disabled_set(bt3, EINA_TRUE); + + pb1 = edje_object_part_external_object_get(edje, "ext_pbar1"); + pb2 = edje_object_part_external_object_get(edje, "ext_pbar2"); + pb3 = edje_object_part_external_object_get(edje, "ext_pbar3"); + pb4 = edje_object_part_external_object_get(edje, "ext_pbar4"); + pb5 = edje_object_part_external_object_get(edje, "ext_pbar5"); + pb6 = edje_object_part_external_object_get(edje, "ext_pbar6"); + pb7 = edje_object_part_external_object_get(edje, "ext_pbar7"); + + elm_progressbar_value_set(pb1, 0.0); + elm_progressbar_value_set(pb3, 0.0); + elm_progressbar_value_set(pb4, 0.0); + elm_progressbar_value_set(pb6, 0.0); + + elm_progressbar_pulse(pb2, EINA_TRUE); + elm_progressbar_pulse(pb5, EINA_TRUE); + elm_progressbar_pulse(pb7, EINA_TRUE); + + ecore_timer_add(0.1, _timer_cb, edje); +} + +void +test_external_pbar(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *ly, *edje, *bt; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("ext_pbar", "Edje External ProgressBar"); + elm_win_autodel_set(win, EINA_TRUE); + + ly = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test_external.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "external/pbar"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, ly); + evas_object_show(ly); + + edje = elm_layout_edje_get(ly); + bt = edje_object_part_external_object_get(edje, "ext_button3"); + evas_object_smart_callback_add(bt, "clicked", _bt_clicked, edje); + + evas_object_resize(win, 320, 400); + evas_object_show(win); +} + +void +test_external_video(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *ly; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("ext_video", "Edje External Video"); + elm_win_autodel_set(win, EINA_TRUE); + + ly = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test_external.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "external/video"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, ly); + evas_object_show(ly); + + evas_object_resize(win, 320, 400); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_factory.c b/src/bin/elementary/test_factory.c new file mode 100644 index 0000000000..daae81b63d --- /dev/null +++ b/src/bin/elementary/test_factory.c @@ -0,0 +1,181 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +// 16 ^ 4 = 65k +#define BLOK 16 +// homogenous layout +//#define HOMOG 1 +// aligned to top of box +#define ZEROALIGN 1 +#define DEFSZ 64 + +static void +fac_unrealize(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + // setting factory content to null deletes it + printf("--------DELETE for factory %p [f: %p]\n", elm_object_content_get(obj), obj); + elm_object_content_set(obj, NULL); +} + +static void +fac_realize_end(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + Evas_Object *bx, *bt; + int i; + + bx = elm_box_add(win); + printf(" ADD lv 3 = %p [%i]\n", bx, (BLOK * (int)(long)evas_object_data_get(obj, "num"))); +#ifdef HOMOG + elm_box_homogeneous_set(bx, EINA_TRUE); +#endif +#ifdef ZEROALIGN + elm_box_align_set(bx, 0.0, 0.0); +#endif + + for (i = 0; i < BLOK; i++) + { + char buf[32]; + + snprintf(buf, sizeof(buf), "%i", + (i + (BLOK * (int)(long)evas_object_data_get(obj, "num")))); + + bt = elm_button_add(win); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(bt, buf); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + } + + elm_object_content_set(obj, bx); + evas_object_show(bx); +} + +static void +fac_realize2(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + Evas_Object *bx, *fc; + int i; + + bx = elm_box_add(win); + printf(" ADD lv 2 = %p [%i]\n", bx, (BLOK * (int)(long)evas_object_data_get(obj, "num"))); +#ifdef HOMOG + elm_box_homogeneous_set(bx, EINA_TRUE); +#endif +#ifdef ZEROALIGN + elm_box_align_set(bx, 0.0, 0.0); +#endif + + for (i = 0; i < BLOK; i++) + { + fc = elm_factory_add(win); + elm_factory_maxmin_mode_set(fc, EINA_TRUE); + // initial height per factory of DEFSZ + // scrollbar will be wrong until enough + // children have been realized and the + // real size is known + evas_object_data_set(fc, "num", (void *)(long)(i + (BLOK * (int)(long)evas_object_data_get(obj, "num")))); + evas_object_size_hint_min_set(fc, 0, DEFSZ); + evas_object_size_hint_weight_set(fc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fc, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(fc, "realize", fac_realize_end, win); + evas_object_smart_callback_add(fc, "unrealize", fac_unrealize, win); + elm_box_pack_end(bx, fc); + evas_object_show(fc); + } + + elm_object_content_set(obj, bx); + evas_object_show(bx); +} + +static void +fac_realize1(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + Evas_Object *bx, *fc; + int i; + + bx = elm_box_add(win); + printf(" ADD lv 1 = %p [%i]\n", bx, (BLOK * (int)(long)evas_object_data_get(obj, "num"))); +#ifdef HOMOG + elm_box_homogeneous_set(bx, EINA_TRUE); +#endif +#ifdef ZEROALIGN + elm_box_align_set(bx, 0.0, 0.0); +#endif + + for (i = 0; i < BLOK; i++) + { + fc = elm_factory_add(win); + elm_factory_maxmin_mode_set(fc, EINA_TRUE); + // initial height per factory of DEFSZ + // scrollbar will be wrong until enough + // children have been realized and the + // real size is known + evas_object_data_set(fc, "num", (void *)(long)(i + (BLOK * (int)(long)evas_object_data_get(obj, "num")))); + evas_object_size_hint_min_set(fc, 0, DEFSZ); + evas_object_size_hint_weight_set(fc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fc, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(fc, "realize", fac_realize2, win); +// evas_object_smart_callback_add(fc, "unrealize", fac_unrealize, win); + elm_box_pack_end(bx, fc); + evas_object_show(fc); + } + + elm_object_content_set(obj, bx); + evas_object_show(bx); +} + +void +test_factory(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *sc, *fc; + int i; + + win = elm_win_util_standard_add("factory", "Factory"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); +#ifdef HOMOG + elm_box_homogeneous_set(bx, EINA_TRUE); +#endif +#ifdef ZEROALIGN + elm_box_align_set(bx, 0.0, 0.0); +#endif + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0); + + for (i = 0; i < BLOK; i++) + { + fc = elm_factory_add(win); + elm_factory_maxmin_mode_set(fc, EINA_TRUE); + // initial height per factory of DEFSZ + // scrollbar will be wrong until enough + // children have been realized and the + // real size is known + evas_object_data_set(fc, "num", (void *)(long)i); + evas_object_size_hint_min_set(fc, 0, DEFSZ); + evas_object_size_hint_weight_set(fc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fc, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(fc, "realize", fac_realize1, win); +// evas_object_smart_callback_add(fc, "unrealize", fac_unrealize, win); + elm_box_pack_end(bx, fc); + evas_object_show(fc); + } + + sc = elm_scroller_add(win); + elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, sc); + + elm_object_content_set(sc, bx); + evas_object_show(bx); + + evas_object_show(sc); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_fileselector.c b/src/bin/elementary/test_fileselector.c new file mode 100644 index 0000000000..3568fcdb57 --- /dev/null +++ b/src/bin/elementary/test_fileselector.c @@ -0,0 +1,589 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif + +#include <Elementary.h> +#ifndef ENABLE_NLS +# ifndef setlocale +# define setlocale(c, l) +# endif +# ifndef libintl_setlocale +# define libintl_setlocale(c, l) +# endif +#endif + +#include <Elementary.h> + +static void +my_fileselector_done(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + /* event_info conatin the full path of the selected file + * or NULL if none is selected or cancel is pressed */ + const char *selected = event_info; + + if (selected) + printf("Selected file: %s\n", selected); + else + evas_object_del(data); /* delete the test window */ +} + +static void +my_fileselector_selected(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info) +{ + /* event_info conatin the full path of the selected file */ + const char *selected = event_info; + printf("Selected file: %s\n", selected); + + /* or you can query the selection */ + if (elm_fileselector_multi_select_get(obj)) + { + const Eina_List *li; + const Eina_List *paths = elm_fileselector_selected_paths_get(obj); + char *path; + printf("All selected files are:\n"); + EINA_LIST_FOREACH(paths, li, path) + printf(" %s\n", path); + } + else + printf("or: %s\n", elm_fileselector_selected_get(obj)); +} + +static void +_popup_close_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + evas_object_del(data); +} + +static void +my_fileselector_invalid(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + Evas_Object *popup; + Evas_Object *btn; + char error_msg[256]; + + snprintf(error_msg, 256, "No such file or directory: %s", (char *)event_info); + + popup = elm_popup_add(data); + elm_popup_content_text_wrap_type_set(popup, ELM_WRAP_CHAR); + elm_object_part_text_set(popup, "title,text", "Error"); + elm_object_text_set(popup, error_msg); + + btn = elm_button_add(popup); + elm_object_text_set(btn, "OK"); + elm_object_part_content_set(popup, "button1", btn); + evas_object_smart_callback_add(btn, "clicked", _popup_close_cb, popup); + + evas_object_show(popup); +} + +static void +my_fileselector_activated(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + printf("Activated file: %s\n", (char *)event_info); +} + +static void +_is_save_clicked(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *fs = data; + printf("Toggle Is save\n"); + if (elm_fileselector_is_save_get(fs)) + elm_fileselector_is_save_set(fs, EINA_FALSE); + else + elm_fileselector_is_save_set(fs, EINA_TRUE); +} + +static void +_folder_only_clicked(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *fs = data; + printf("Toggle Folder only\n"); + if (elm_fileselector_folder_only_get(fs)) + elm_fileselector_folder_only_set(fs, EINA_FALSE); + else + elm_fileselector_folder_only_set(fs, EINA_TRUE); +} + +static void +_expandable_clicked(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *fs = data; + printf("Toggle Expandable\n"); + if (elm_fileselector_expandable_get(fs)) + elm_fileselector_expandable_set(fs, EINA_FALSE); + else + elm_fileselector_expandable_set(fs, EINA_TRUE); +} + +static void +_multi_clicked(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *fs = data; + Eina_Bool enabled = elm_fileselector_multi_select_get(fs); + printf("Toggle Multiple selection to: %s\n", !enabled ? "On" : "Off"); + elm_fileselector_multi_select_set(fs, !enabled); +} + +static void +_buttons_clicked(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *fs = data; + printf("Toggle Buttons\n"); + if (elm_fileselector_buttons_ok_cancel_get(fs)) + elm_fileselector_buttons_ok_cancel_set(fs, EINA_FALSE); + else + elm_fileselector_buttons_ok_cancel_set(fs, EINA_TRUE); +} + +static void +_hidden_clicked(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *fs = data; + printf("Toggle visibility of hidden files/directories\n"); + if (elm_fileselector_hidden_visible_get(fs)) + elm_fileselector_hidden_visible_set(fs, EINA_FALSE); + else + elm_fileselector_hidden_visible_set(fs, EINA_TRUE); +} + +static void +_sel_get_clicked(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *fs = data; + printf("Get Selected: %s\n", elm_fileselector_selected_get(fs)); +} + +static void +_path_get_clicked(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *fs = data; + printf("Get Path: %s\n", elm_fileselector_path_get(fs)); +} + +static Evas_Object * +_option_create(Evas_Object *parent, Evas_Object *fs) +{ + Evas_Object *frame = NULL, *box = NULL, *hbox = NULL, *bt = NULL; + + frame = elm_frame_add(parent); + evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(frame, EVAS_HINT_FILL, 0); + elm_object_text_set(frame, "Options"); + evas_object_show(frame); + + // outer vertical box + box = elm_box_add(frame); + elm_object_content_set(frame, box); + evas_object_show(box); + + // first horizontal box + hbox = elm_box_add(frame); + evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(hbox, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_horizontal_set(hbox, EINA_TRUE); + elm_box_pack_end(box, hbox); + evas_object_show(hbox); + + bt = elm_check_add(hbox); + elm_object_text_set(bt, "is save"); + elm_check_state_set(bt, elm_fileselector_is_save_get(fs)); + evas_object_smart_callback_add(bt, "changed", _is_save_clicked, fs); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + bt = elm_check_add(hbox); + elm_object_text_set(bt, "folder only"); + elm_check_state_set(bt, elm_fileselector_folder_only_get(fs)); + evas_object_smart_callback_add(bt, "changed", _folder_only_clicked, fs); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + bt = elm_check_add(hbox); + elm_object_text_set(bt, "expandable"); + elm_check_state_set(bt, elm_fileselector_expandable_get(fs)); + evas_object_smart_callback_add(bt, "changed", _expandable_clicked, fs); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + // second horizontal box + hbox = elm_box_add(frame); + evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(hbox, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_horizontal_set(hbox, EINA_TRUE); + elm_box_pack_end(box, hbox); + evas_object_show(hbox); + + bt = elm_check_add(hbox); + elm_object_text_set(bt, "multiple selection"); + elm_check_state_set(bt, elm_fileselector_multi_select_get(fs)); + evas_object_smart_callback_add(bt, "changed", _multi_clicked, fs); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + bt = elm_check_add(hbox); + elm_object_text_set(bt, "buttons"); + elm_check_state_set(bt, elm_fileselector_buttons_ok_cancel_get(fs)); + evas_object_smart_callback_add(bt, "changed", _buttons_clicked, fs); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + bt = elm_check_add(hbox); + elm_object_text_set(bt, "hidden"); + elm_check_state_set(bt, elm_fileselector_hidden_visible_get(fs)); + evas_object_smart_callback_add(bt, "changed", _hidden_clicked, fs); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + return frame; +} + +static Evas_Object * +_getter_option_create(Evas_Object *parent, Evas_Object *fs) +{ + Evas_Object *frame = NULL, *hbox = NULL, *bt = NULL; + + frame = elm_frame_add(parent); + elm_object_text_set(frame, "Getter Options"); + evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(frame, EVAS_HINT_FILL, 0); + evas_object_show(frame); + + hbox = elm_box_add(frame); + elm_box_horizontal_set(hbox, EINA_TRUE); + elm_object_content_set(frame, hbox); + evas_object_show(hbox); + + bt = elm_button_add(hbox); + elm_object_text_set(bt, "selected get"); + evas_object_smart_callback_add(bt, "clicked", _sel_get_clicked, fs); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + bt = elm_button_add(hbox); + elm_object_text_set(bt, "path get"); + evas_object_smart_callback_add(bt, "clicked", _path_get_clicked, fs); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + return frame; +} + +static void +_mode_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *fs = data; + Elm_Fileselector_Mode mode; + + mode = (elm_fileselector_mode_get(fs) + 1) % ELM_FILESELECTOR_LAST; + switch (mode) + { + case ELM_FILESELECTOR_LIST: + printf("Setting mode to: List\n"); + break; + case ELM_FILESELECTOR_GRID: + default: + printf("Setting mode to: Grid\n"); + break; + } + + elm_radio_value_set(obj, mode); + elm_fileselector_mode_set(data, mode); +} + +static Evas_Object * +_mode_option_create(Evas_Object *parent, Evas_Object *fs) +{ + Evas_Object *frame = NULL, *hbox = NULL, *rd = NULL, *rdg = NULL; + + frame = elm_frame_add(parent); + evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(frame, EVAS_HINT_FILL, 0); + elm_object_text_set(frame, "Mode Option"); + evas_object_show(frame); + + hbox = elm_box_add(frame); + elm_box_horizontal_set(hbox, EINA_TRUE); + elm_object_content_set(frame, hbox); + evas_object_show(hbox); + + rdg = rd = elm_radio_add(hbox); + elm_radio_state_value_set(rd, ELM_FILESELECTOR_LIST); + elm_object_text_set(rd, "List"); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", _mode_changed_cb, fs); + + rd = elm_radio_add(hbox); + elm_radio_group_add(rd, rdg); + elm_radio_state_value_set(rd, ELM_FILESELECTOR_GRID); + elm_object_text_set(rd, "Grid"); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", _mode_changed_cb, fs); + + return frame; +} + +static void +_sort_selected_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *fs = evas_object_data_get(obj, "fileselector"); + const char *selected = elm_object_item_text_get(event_info); + + printf("selected sort method : %s\n", selected); + elm_object_text_set(obj, selected); + elm_fileselector_sort_method_set(fs, (Elm_Fileselector_Sort)data); +} + +static Evas_Object * +_sort_option_create(Evas_Object *win, Evas_Object *parent, Evas_Object *fs) +{ + Evas_Object *frame = NULL, *hbox = NULL, *hoversel; + + frame = elm_frame_add(parent); + evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(frame, EVAS_HINT_FILL, 0); + elm_object_text_set(frame, "Sort Option"); + evas_object_show(frame); + + hbox = elm_box_add(frame); + elm_box_horizontal_set(hbox, EINA_TRUE); + elm_object_content_set(frame, hbox); + evas_object_show(hbox); + + hoversel = elm_hoversel_add(hbox); + elm_hoversel_hover_parent_set(hoversel, win); + evas_object_data_set(hoversel, "fileselector", fs); + elm_object_text_set(hoversel, "Choose sort method"); + + elm_hoversel_item_add(hoversel, "File Name(asc)", NULL, ELM_ICON_NONE, + _sort_selected_cb, + (const void *)ELM_FILESELECTOR_SORT_BY_FILENAME_ASC); + elm_hoversel_item_add(hoversel, "File Name(desc)", NULL, ELM_ICON_NONE, + _sort_selected_cb, + (const void *) ELM_FILESELECTOR_SORT_BY_FILENAME_DESC); + elm_hoversel_item_add(hoversel, "Type(asc)", NULL, ELM_ICON_NONE, + _sort_selected_cb, + (const void *) ELM_FILESELECTOR_SORT_BY_TYPE_ASC); + elm_hoversel_item_add(hoversel, "Type(desc)", NULL, ELM_ICON_NONE, + _sort_selected_cb, + (const void *) ELM_FILESELECTOR_SORT_BY_TYPE_DESC); + elm_hoversel_item_add(hoversel, "Size(asc)", NULL, ELM_ICON_NONE, + _sort_selected_cb, + (const void *) ELM_FILESELECTOR_SORT_BY_SIZE_ASC); + elm_hoversel_item_add(hoversel, "Size(desc)", NULL, ELM_ICON_NONE, + _sort_selected_cb, + (const void *) ELM_FILESELECTOR_SORT_BY_SIZE_DESC); + elm_hoversel_item_add(hoversel, "Modified time(asc)", NULL, ELM_ICON_NONE, + _sort_selected_cb, + (const void *) ELM_FILESELECTOR_SORT_BY_MODIFIED_ASC); + elm_hoversel_item_add(hoversel, "Modified time(desc)", NULL, ELM_ICON_NONE, + _sort_selected_cb, + (const void *) ELM_FILESELECTOR_SORT_BY_MODIFIED_DESC); + + elm_box_pack_end(hbox, hoversel); + evas_object_show(hoversel); + + return frame; +} + +static void +_small_icon_clicked(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *fs = data; + Evas_Coord w, h; + + elm_fileselector_thumbnail_size_get(fs, &w, &h); + + elm_fileselector_thumbnail_size_set(fs, 56, 56); + printf("Thumbnail icon was changed from %dx%d to 56x56\n", w, h); +} + +static void +_middle_icon_clicked(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *fs = data; + Evas_Coord w, h; + + elm_fileselector_thumbnail_size_get(fs, &w, &h); + + elm_fileselector_thumbnail_size_set(fs, 78, 78); + printf("Thumbnail icon was changed from %dx%d to 78x78\n", w, h); +} + +static void +_big_icon_clicked(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *fs = data; + Evas_Coord w, h; + + elm_fileselector_thumbnail_size_get(fs, &w, &h); + + elm_fileselector_thumbnail_size_set(fs, 131, 131); + printf("Thumbnail icon was changed from %dx%d to 131x131\n", w, h); +} + +static Evas_Object * +_thumbnail_size_option_create(Evas_Object *parent, Evas_Object *fs) +{ + Evas_Object *frame = NULL, *hbox = NULL, *bt = NULL; + + frame = elm_frame_add(parent); + elm_object_text_set(frame, "Thumbnail Size"); + evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(frame, EVAS_HINT_FILL, 0); + evas_object_show(frame); + + hbox = elm_box_add(frame); + elm_box_horizontal_set(hbox, EINA_TRUE); + elm_object_content_set(frame, hbox); + evas_object_show(hbox); + + bt = elm_button_add(hbox); + elm_object_text_set(bt, "Small icon"); + evas_object_smart_callback_add(bt, "clicked", _small_icon_clicked, fs); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + bt = elm_button_add(hbox); + elm_object_text_set(bt, "Middle icon"); + evas_object_smart_callback_add(bt, "clicked", _middle_icon_clicked, fs); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + bt = elm_button_add(hbox); + elm_object_text_set(bt, "Big icon"); + evas_object_smart_callback_add(bt, "clicked", _big_icon_clicked, fs); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + return frame; +} + +static Eina_Bool +_all_filter(const char *path EINA_UNUSED, + Eina_Bool dir EINA_UNUSED, + void *data EINA_UNUSED) +{ + return EINA_TRUE; +} + +static Eina_Bool +_edje_filter(const char *path, Eina_Bool dir, + void *data EINA_UNUSED) +{ + if (dir) return EINA_TRUE; + + if (eina_str_has_extension(path, ".edc") || + eina_str_has_extension(path, ".edj")) + return EINA_TRUE; + return EINA_FALSE; +} + +void +test_fileselector(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *fs, *box, *vbox, *sep; + const char * home_env; + + /* Set the locale according to the system pref. + * If you don't do so the file selector will order the files list in + * a case sensitive manner + */ + setlocale(LC_ALL, ""); + + elm_need_ethumb(); + elm_need_efreet(); + + win = elm_win_util_standard_add("fileselector", "File Selector"); + elm_win_autodel_set(win, EINA_TRUE); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + + box = elm_box_add(win); + elm_box_horizontal_set(box, EINA_TRUE); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + fs = elm_fileselector_add(box); + evas_object_size_hint_weight_set(fs, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fs, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, fs); + evas_object_show(fs); + + /* enable the fs file name entry */ + elm_fileselector_is_save_set(fs, EINA_TRUE); + /* make the file list a tree with dir expandable in place */ + elm_fileselector_expandable_set(fs, EINA_FALSE); + /* start the fileselector in the home dir */ + home_env = eina_environment_home_get(); + elm_fileselector_path_set(fs, home_env); + + /* provides suggested name (just for showing) */ + elm_fileselector_current_name_set(fs, "No name"); + + /* add filesters */ + elm_fileselector_mime_types_filter_append(fs, "text/*", "Text Files"); + elm_fileselector_mime_types_filter_append(fs, "image/*", "Image Files"); + elm_fileselector_custom_filter_append(fs, _all_filter, NULL, "All Files"); + elm_fileselector_custom_filter_append(fs, _edje_filter, NULL, "Edje Files"); + + evas_object_smart_callback_add(fs, "done", my_fileselector_done, win); + evas_object_smart_callback_add(fs, "selected", my_fileselector_selected, + win); + evas_object_smart_callback_add(fs, "selected,invalid", + my_fileselector_invalid, win); + evas_object_smart_callback_add(fs, "activated", my_fileselector_activated, + win); + + sep = elm_separator_add(box); + elm_box_pack_end(box, sep); + evas_object_show(sep); + + vbox = elm_box_add(box); + elm_box_pack_end(box, vbox); + evas_object_show(vbox); + + /* test options */ + elm_box_pack_end(vbox, _option_create(vbox, fs)); + elm_box_pack_end(vbox, _getter_option_create(vbox, fs)); + elm_box_pack_end(vbox, _mode_option_create(vbox, fs)); + elm_box_pack_end(vbox, _sort_option_create(win, vbox, fs)); + elm_box_pack_end(vbox, _thumbnail_size_option_create(vbox, fs)); + + evas_object_resize(win, 550, 500); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_fileselector_button.c b/src/bin/elementary/test_fileselector_button.c new file mode 100644 index 0000000000..f87db9d0e9 --- /dev/null +++ b/src/bin/elementary/test_fileselector_button.c @@ -0,0 +1,248 @@ +#include "test.h" +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif + +#include <Elementary.h> + +struct _api_data +{ + unsigned int state; /* What state we are testing */ + Evas_Object *box; /* Additional data defined by test */ + Eina_Bool free_data; /* free data on close */ +}; +typedef struct _api_data api_data; +enum _api_state +{ + ICON_UNSET, + WINDOW_TITLE_SET, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + const Eina_List *items = elm_box_children_get(api->box); + if (!eina_list_count(items)) + return; + + /* Get first item of list of vbox children */ + Evas_Object *fs_bt = eina_list_nth(items, 0); + + /* use elm_box_children_get() to get list of children */ + switch(api->state) + { /* Put all api-changes under switch */ + case ICON_UNSET: + elm_object_part_content_unset(fs_bt, NULL); + break; + + case WINDOW_TITLE_SET: + elm_fileselector_button_window_title_set(fs_bt, "Custom title from API"); + break; + + case API_STATE_LAST: + + break; + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(obj, str); + elm_object_disabled_set(obj, a->state == API_STATE_LAST); +} + +static void +create_dir_struct(void) +{ + FILE *fp; + if (mkdir("/tmp/test_fs_bt", S_IRWXU) < 0) + printf("make dir /tmp/test_fs_bt failed!\n"); + fp = fopen("/tmp/test_fs_bt/a_file.txt", "w"); + if (fp) fclose(fp); + fp = fopen("/tmp/test_fs_bt/k_file.txt", "w"); + if (fp) fclose(fp); + fp = fopen("/tmp/test_fs_bt/m_file.txt", "w"); + if (fp) fclose(fp); + + if (mkdir("/tmp/test_fs_bt/a_subdir", S_IRWXU) < 0) + printf("make dir /tmp/test_fs_bt/a_subdir failed!\n"); + fp = fopen("/tmp/test_fs_bt/a_subdir/d_sub_file.txt", "w"); + if (fp) fclose(fp); + fp = fopen("/tmp/test_fs_bt/a_subdir/j_sub_file.txt", "w"); + if (fp) fclose(fp); +} + +static void +_file_chosen(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + Evas_Object *entry = data; + const char *file = event_info; + if (file) + { + elm_object_text_set(entry, file); + printf("File chosen: %s\n", file); + } + else + printf("File selection canceled.\n"); +} + +static void +_inwin_mode_toggle(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *fs_bt = data; + Eina_Bool value = elm_fileselector_button_inwin_mode_get(fs_bt); + elm_fileselector_button_inwin_mode_set(fs_bt, !value); + printf("Inwin mode set to: %s\n", value ? "false" : "true"); +} + +static void +_current_sel_toggle(void *data, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Evas_Object *fs_bt = data; + Eina_Bool value = elm_check_state_get(obj); + elm_fileselector_is_save_set(fs_bt, value); + printf("Current selection editable entry set to: %s\n", + value ? "true" : "false"); +} + +static void +_folder_only_toggle(void *data, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Evas_Object *fs_bt = data; + Eina_Bool value = elm_check_state_get(obj); + elm_fileselector_folder_only_set(fs_bt, value); + printf("Folder only flag set to: %s\n", value ? "true" : "false"); +} + +static void +_expandable_toggle(void *data, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Evas_Object *fs_bt = data; + Eina_Bool value = elm_check_state_get(obj); + elm_fileselector_expandable_set(fs_bt, value); + printf("Expandable flag set to: %s\n", value ? "true" : "false"); +} + +static void +_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + free(data); +} + +void +test_fileselector_button(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *vbox, *hbox, *ic, *bt, *fs_bt, *en, *lb, *bxx; + api_data *api = calloc(1, sizeof(api_data)); + + win = elm_win_util_standard_add("fileselector-button", "File Selector Button"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bxx = elm_box_add(win); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bxx); + evas_object_show(bxx); + + vbox = elm_box_add(win); + api->box = vbox; + evas_object_show(vbox); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Next API function"); + evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, bt); + elm_object_disabled_set(bt, api->state == API_STATE_LAST); + evas_object_show(bt); + + elm_box_pack_end(bxx, vbox); + + create_dir_struct(); /* Create a dir struct in /tmp */ + /* file selector button */ + ic = elm_icon_add(win); + elm_icon_standard_set(ic, "file"); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + fs_bt = elm_fileselector_button_add(win); + elm_object_text_set(fs_bt, "Select a file"); + elm_object_part_content_set(fs_bt, "icon", ic); + elm_fileselector_path_set(fs_bt, "/tmp/test_fs_bt"); + + elm_box_pack_end(vbox, fs_bt); + evas_object_show(fs_bt); + evas_object_show(ic); + + /* attribute setting buttons */ + hbox = elm_box_add(win); + elm_box_horizontal_set(hbox, EINA_TRUE); + elm_box_pack_end(vbox, hbox); + evas_object_show(hbox); + + bt = elm_check_add(win); + elm_object_style_set(bt, "toggle"); + elm_object_text_set(bt, "current selection text entry"); + evas_object_smart_callback_add(bt, "changed", _current_sel_toggle, fs_bt); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + bt = elm_check_add(win); + elm_object_style_set(bt, "toggle"); + elm_object_text_set(bt, "Inwin mode"); + elm_check_state_set(bt, elm_fileselector_button_inwin_mode_get(fs_bt)); + evas_object_smart_callback_add(bt, "changed", _inwin_mode_toggle, fs_bt); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + bt = elm_check_add(win); + elm_object_style_set(bt, "toggle"); + elm_object_text_set(bt, "Folder only mode"); + evas_object_smart_callback_add(bt, "changed", _folder_only_toggle, fs_bt); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + bt = elm_check_add(win); + elm_object_style_set(bt, "toggle"); + elm_object_text_set(bt, "Expandable mode"); + evas_object_smart_callback_add(bt, "changed", _expandable_toggle, fs_bt); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Last selection:"); + elm_box_pack_end(vbox, lb); + evas_object_show(lb); + + en = elm_entry_add(win); + elm_entry_line_wrap_set(en, ELM_WRAP_NONE); + elm_entry_editable_set(en, EINA_FALSE); + evas_object_smart_callback_add(fs_bt, "file,chosen", _file_chosen, en); + elm_box_pack_end(vbox, en); + evas_object_show(en); + + evas_object_resize(win, 400, 400); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_fileselector_entry.c b/src/bin/elementary/test_fileselector_entry.c new file mode 100644 index 0000000000..07d6cf0fba --- /dev/null +++ b/src/bin/elementary/test_fileselector_entry.c @@ -0,0 +1,259 @@ +#include "test.h" +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif + +#include <Elementary.h> + +struct _api_data +{ + unsigned int state; /* What state we are testing */ + void *box; /* Use this to get box content */ +}; +typedef struct _api_data api_data; + +enum _api_state +{ + ICON_UNSET, + WINDOW_TITLE_SET, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + const Eina_List *items = elm_box_children_get(api->box); + if (!eina_list_count(items)) + return; + + /* Get first item of list of vbox children */ + Evas_Object *fs_bt = eina_list_nth(items, 0); + + /* use elm_box_children_get() to get list of children */ + switch(api->state) + { /* Put all api-changes under switch */ + case ICON_UNSET: + elm_object_part_content_unset(fs_bt, NULL); + break; + + case WINDOW_TITLE_SET: + elm_fileselector_entry_window_title_set(fs_bt, "Custom title from API"); + break; + + case API_STATE_LAST: + + break; + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(obj, str); + elm_object_disabled_set(obj, a->state == API_STATE_LAST); +} + +static void +create_dir_struct(void) +{ + FILE *fp; + int ret = 0; + + ret = mkdir("/tmp/test_fs_bt", S_IRWXU); + if (ret < 0) return; + fp = fopen("/tmp/test_fs_bt/a_file.txt", "w"); + if (fp) fclose(fp); + fp = fopen("/tmp/test_fs_bt/k_file.txt", "w"); + if (fp) fclose(fp); + fp = fopen("/tmp/test_fs_bt/m_file.txt", "w"); + if (fp) fclose(fp); + + ret = mkdir("/tmp/test_fs_bt/a_subdir", S_IRWXU); + if (ret < 0) return; + fp = fopen("/tmp/test_fs_bt/a_subdir/d_sub_file.txt", "w"); + if (fp) fclose(fp); + fp = fopen("/tmp/test_fs_bt/a_subdir/j_sub_file.txt", "w"); + if (fp) fclose(fp); +} + +static void +_file_chosen(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + Evas_Object *entry = data; + char *file = event_info; + elm_object_text_set(entry, file); + printf("File chosen: %s\n", file); +} + +static void +_inwin_mode_toggle(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *fs_en = data; + Eina_Bool value = elm_fileselector_entry_inwin_mode_get(fs_en); + elm_fileselector_entry_inwin_mode_set(fs_en, !value); + printf("Inwin mode set to: %s\n", value ? "false" : "true"); +} + +static void +_folder_only_toggle(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *fs_en = data; + Evas_Object *ic = elm_object_part_content_get(fs_en, "button icon"); + Eina_Bool value = elm_fileselector_folder_only_get(fs_en); + elm_fileselector_folder_only_set(fs_en, !value); + printf("Folder only flag set to: %s\n", value ? "false" : "true"); + if (!value) + { + if (ic) elm_icon_standard_set(ic, "folder"); + elm_object_text_set(fs_en, "Select a folder"); + } + else + { + if (ic) elm_icon_standard_set(ic, "file"); + elm_object_text_set(fs_en, "Select a file"); + } +} + +static void +_expandable_toggle(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *fs_en = data; + Eina_Bool value = elm_fileselector_expandable_get(fs_en); + elm_fileselector_expandable_set(fs_en, !value); + printf("Expandable flag set to: %s\n", value ? "false" : "true"); +} + +static void +_disabled_toggle(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *fs_en = data; + Eina_Bool value = elm_object_disabled_get(fs_en); + elm_object_disabled_set(fs_en, !value); + printf("Disabled flag set to: %s\n", value ? "false" : "true"); +} + +static void +_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + free(data); +} + +void +test_fileselector_entry(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *vbox, *hbox, *ic, *bt, *fs_en, *en, *lb, *bxx; + api_data *api = calloc(1, sizeof(api_data)); + + win = elm_win_util_standard_add("fileselector-entry", "File Selector Entry"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bxx = elm_box_add(win); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bxx); + evas_object_show(bxx); + + vbox = elm_box_add(win); + evas_object_size_hint_weight_set(vbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + api->box = vbox; + evas_object_show(vbox); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Next API function"); + evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, bt); + elm_object_disabled_set(bt, api->state == API_STATE_LAST); + evas_object_show(bt); + + elm_box_pack_end(bxx, vbox); + + create_dir_struct(); /* Create a dir struct in /tmp */ + + /* file selector entry */ + ic = elm_icon_add(win); + elm_icon_standard_set(ic, "file"); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + fs_en = elm_fileselector_entry_add(win); + elm_fileselector_path_set(fs_en, "/tmp/test_fs_bt"); + elm_object_text_set(fs_en, "Select a file"); + elm_object_part_content_set(fs_en, "button icon", ic); + evas_object_size_hint_weight_set(fs_en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fs_en, EVAS_HINT_FILL, EVAS_HINT_FILL); + + elm_box_pack_end(vbox, fs_en); + evas_object_show(fs_en); + evas_object_show(ic); + + /* attribute setting buttons */ + hbox = elm_box_add(win); + elm_box_horizontal_set(hbox, EINA_TRUE); + elm_box_pack_end(vbox, hbox); + evas_object_show(hbox); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Toggle inwin mode"); + evas_object_smart_callback_add(bt, "clicked", _inwin_mode_toggle, fs_en); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Toggle folder only mode"); + evas_object_smart_callback_add(bt, "clicked", _folder_only_toggle, fs_en); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Toggle expandable mode"); + evas_object_smart_callback_add(bt, "clicked", _expandable_toggle, fs_en); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Last selection:"); + elm_box_pack_end(vbox, lb); + evas_object_show(lb); + + hbox = elm_box_add(win); + elm_box_horizontal_set(hbox, EINA_TRUE); + elm_box_pack_end(vbox, hbox); + evas_object_show(hbox); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Toggle disabled"); + evas_object_smart_callback_add(bt, "clicked", _disabled_toggle, fs_en); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + en = elm_entry_add(win); + elm_entry_line_wrap_set(en, ELM_WRAP_NONE); + elm_entry_editable_set(en, EINA_FALSE); + evas_object_smart_callback_add(fs_en, "file,chosen", _file_chosen, en); + elm_box_pack_end(vbox, en); + evas_object_show(en); + + evas_object_resize(win, 400, 500); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_flip.c b/src/bin/elementary/test_flip.c new file mode 100644 index 0000000000..d885a7bd5b --- /dev/null +++ b/src/bin/elementary/test_flip.c @@ -0,0 +1,711 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +void +my_fl_1(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *fl = data; + elm_flip_go(fl, ELM_FLIP_ROTATE_Y_CENTER_AXIS); +} + +void +my_fl_2(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *fl = data; + elm_flip_go(fl, ELM_FLIP_ROTATE_X_CENTER_AXIS); +} + +void +my_fl_3(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *fl = data; + elm_flip_go(fl, ELM_FLIP_ROTATE_XZ_CENTER_AXIS); +} + +void +my_fl_4(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *fl = data; + elm_flip_go(fl, ELM_FLIP_ROTATE_YZ_CENTER_AXIS); +} + +void +my_fl_5(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *fl = data; + elm_flip_go(fl, ELM_FLIP_CUBE_LEFT); +} + +void +my_fl_6(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *fl = data; + elm_flip_go(fl, ELM_FLIP_CUBE_RIGHT); +} + +void +my_fl_7(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *fl = data; + elm_flip_go(fl, ELM_FLIP_CUBE_UP); +} + +void +my_fl_8(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *fl = data; + elm_flip_go(fl, ELM_FLIP_CUBE_DOWN); +} + +void +my_fl_front(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *fl = data; + elm_flip_go_to(fl, EINA_TRUE, ELM_FLIP_ROTATE_X_CENTER_AXIS); +} + +void +my_fl_back(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *fl = data; + elm_flip_go_to(fl, EINA_FALSE, ELM_FLIP_ROTATE_X_CENTER_AXIS); +} + +void +test_flip(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bx2, *fl, *o, *bt, *ly; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("flip", "Flip"); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + fl = elm_flip_add(win); + evas_object_size_hint_align_set(fl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(fl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, fl); + + o = elm_bg_add(win); + evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), "sky_01.jpg"); + elm_bg_file_set(o, buf, NULL); + elm_object_part_content_set(fl, "front", o); + evas_object_show(o); + + ly = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "layout"); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(fl, "back", ly); + evas_object_show(ly); + + bt = elm_button_add(ly); + elm_object_text_set(bt, "Button 1"); + elm_object_part_content_set(ly, "element1", bt); + + bt = elm_button_add(ly); + elm_object_text_set(bt, "Button 2"); + elm_object_part_content_set(ly, "element2", bt); + + bt = elm_button_add(ly); + elm_object_text_set(bt, "Button 3"); + elm_object_part_content_set(ly, "element3", bt); + + evas_object_show(fl); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + + bt = elm_button_add(win); + elm_object_text_set(bt, "1"); + evas_object_smart_callback_add(bt, "clicked", my_fl_1, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "2"); + evas_object_smart_callback_add(bt, "clicked", my_fl_2, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "3"); + evas_object_smart_callback_add(bt, "clicked", my_fl_3, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "4"); + evas_object_smart_callback_add(bt, "clicked", my_fl_4, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + + bt = elm_button_add(win); + elm_object_text_set(bt, "5"); + evas_object_smart_callback_add(bt, "clicked", my_fl_5, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "6"); + evas_object_smart_callback_add(bt, "clicked", my_fl_6, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "7"); + evas_object_smart_callback_add(bt, "clicked", my_fl_7, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "8"); + evas_object_smart_callback_add(bt, "clicked", my_fl_8, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} + +void +test_flip2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bg, *bx, *bx2, *fl, *o, *bt, *tb, *li, *en; + char buf[PATH_MAX]; + + win = elm_win_add(NULL, "flip2", ELM_WIN_BASIC); + elm_win_title_set(win, "Flip 2"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), "sky_01.jpg"); + elm_bg_file_set(bg, buf, NULL); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + fl = elm_flip_add(win); + evas_object_size_hint_align_set(fl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(fl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, fl); + + o = elm_box_add(win); + evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + tb = elm_toolbar_add(win); + elm_toolbar_homogeneous_set(tb, EINA_FALSE); + evas_object_size_hint_weight_set(tb, 0.0, 0.0); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, 0.0); + + elm_toolbar_item_append(tb, "arrow_left", "Hello", NULL, NULL); + elm_toolbar_item_append(tb, "arrow_right", "Out", NULL, NULL); + elm_toolbar_item_append(tb, "home", "There", NULL, NULL); + elm_toolbar_item_append(tb, "refresh", "World", NULL, NULL); + + elm_box_pack_end(o, tb); + evas_object_show(tb); + + li = elm_list_add(win); + evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + elm_list_item_append(li, "This is a list", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Second item", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "3rd", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Fourth", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Number five is alive!", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "The quick brown fox jumps over the lazy dog", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Booyah", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "And another item", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "More of them", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Get with it", NULL, NULL, NULL, NULL); + + elm_list_go(li); + + elm_box_pack_end(o, li); + evas_object_show(li); + + elm_object_part_content_set(fl, "front", o); + evas_object_show(o); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_line_wrap_set(en, ELM_WRAP_NONE); + snprintf(buf, sizeof(buf), + "This is an entry widget in this window that<br/>" + "uses markup <b>like this</> for styling and<br/>" + "formatting <em>like this</>, as well as<br/>" + "<a href=X><link>links in the text</></a>, so enter text<br/>" + "in here to edit it. By the way, links are<br/>" + "called <a href=anc-02>Anchors</a> so you will need<br/>" + "to refer to them this way.<br/>" + "<br/>" + + "Also you can stick in items with (relsize + ascent): " + "<item relsize=16x16 vsize=ascent href=emoticon/evil-laugh></item>" + " (full) " + "<item relsize=16x16 vsize=full href=emoticon/guilty-smile></item>" + " (to the left)<br/>" + + "Also (size + ascent): " + "<item size=16x16 vsize=ascent href=emoticon/haha></item>" + " (full) " + "<item size=16x16 vsize=full href=emoticon/happy-panting></item>" + " (before this)<br/>" + + "And as well (absize + ascent): " + "<item absize=64x64 vsize=ascent href=emoticon/knowing-grin></item>" + " (full) " + "<item absize=64x64 vsize=full href=emoticon/not-impressed></item>" + " or even paths to image files on disk too like: " + "<item absize=96x128 vsize=full href=file://%s/images/sky_01.jpg></item>" + " ... end." + , elm_app_data_dir_get() + ); + elm_object_text_set(en, buf); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + elm_object_part_content_set(fl, "back", en); + evas_object_show(en); + + evas_object_show(fl); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + + bt = elm_button_add(win); + elm_object_text_set(bt, "1"); + evas_object_smart_callback_add(bt, "clicked", my_fl_1, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "2"); + evas_object_smart_callback_add(bt, "clicked", my_fl_2, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "3"); + evas_object_smart_callback_add(bt, "clicked", my_fl_3, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "4"); + evas_object_smart_callback_add(bt, "clicked", my_fl_4, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "5"); + evas_object_smart_callback_add(bt, "clicked", my_fl_5, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "6"); + evas_object_smart_callback_add(bt, "clicked", my_fl_6, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} + +void +test_flip3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bx2, *fl, *fl_f, *fl_b, *o, *bt, *fr; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("flip3", "Flip Flip"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + fl = elm_flip_add(win); + evas_object_size_hint_align_set(fl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(fl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, fl); + evas_object_show(fl); + + fr = elm_frame_add(win); + elm_object_text_set(fr, "Front"); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(fl, "front", fr); + evas_object_show(fr); + + fl_f = elm_flip_add(win); + evas_object_size_hint_align_set(fl_f, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(fl_f, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_content_set(fr, fl_f); + evas_object_show(fl_f); + + o = elm_bg_add(win); + evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), "sky_01.jpg"); + elm_bg_file_set(o, buf, NULL); + elm_object_part_content_set(fl_f, "front", o); + evas_object_show(o); + + o = elm_bg_add(win); + evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), "sky_02.jpg"); + elm_bg_file_set(o, buf, NULL); + elm_object_part_content_set(fl_f, "back", o); + evas_object_show(o); + + fr = elm_frame_add(win); + elm_object_text_set(fr, "Back"); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(fl, "back", fr); + evas_object_show(fr); + + fl_b = elm_flip_add(win); + evas_object_size_hint_align_set(fl_b, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(fl_b, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_content_set(fr, fl_b); + evas_object_show(fl_b); + + o = elm_bg_add(win); + evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), "sky_03.jpg"); + elm_bg_file_set(o, buf, NULL); + elm_object_part_content_set(fl_b, "front", o); + evas_object_show(o); + + o = elm_bg_add(win); + evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), "sky_04.jpg"); + elm_bg_file_set(o, buf, NULL); + elm_object_part_content_set(fl_b, "back", o); + evas_object_show(o); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Main Flip"); + evas_object_smart_callback_add(bt, "clicked", my_fl_6, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Front Flip"); + evas_object_smart_callback_add(bt, "clicked", my_fl_6, fl_f); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Back Flip"); + evas_object_smart_callback_add(bt, "clicked", my_fl_6, fl_b); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} + +static void +my_fl_go(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + + Evas_Object *rdg = evas_object_data_get(win, "rdg"); + Evas_Object *rd = elm_radio_selected_object_get(rdg); + Evas_Object *fl = evas_object_data_get(win, "fl"); + + const char *text = elm_object_text_get(rd); + if (!text) return; + + if (!strcmp(text, "Rotate")) + elm_flip_go(fl, ELM_FLIP_ROTATE_Y_CENTER_AXIS); + else if (!strcmp(text, "Cube")) + elm_flip_go(fl, ELM_FLIP_CUBE_RIGHT); + else if (!strcmp(text, "Page")) + elm_flip_go(fl, ELM_FLIP_PAGE_RIGHT); +} + +static void +my_fl_ch(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + Evas_Object *fl = evas_object_data_get(win, "fl"); + Evas_Object *rdg = evas_object_data_get(win, "rdg"); + elm_flip_interaction_set(fl, elm_radio_value_get(rdg)); +} + +void +test_flip_interactive(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *fl, *im, *li, *bt, *rd, *rdg; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("flip-interactive", "Flip Interactive"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + fl = elm_flip_add(win); + evas_object_size_hint_align_set(fl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(fl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, fl); + evas_object_data_set(win, "fl", fl); + + elm_flip_interaction_set(fl, ELM_FLIP_INTERACTION_NONE); + elm_flip_interaction_direction_enabled_set(fl, ELM_FLIP_DIRECTION_UP, EINA_TRUE); + elm_flip_interaction_direction_enabled_set(fl, ELM_FLIP_DIRECTION_DOWN, EINA_TRUE); + elm_flip_interaction_direction_enabled_set(fl, ELM_FLIP_DIRECTION_LEFT, EINA_TRUE); + elm_flip_interaction_direction_enabled_set(fl, ELM_FLIP_DIRECTION_RIGHT, EINA_TRUE); + elm_flip_interaction_direction_hitsize_set(fl, ELM_FLIP_DIRECTION_UP, 0.25); + elm_flip_interaction_direction_hitsize_set(fl, ELM_FLIP_DIRECTION_DOWN, 0.25); + elm_flip_interaction_direction_hitsize_set(fl, ELM_FLIP_DIRECTION_LEFT, 0.25); + elm_flip_interaction_direction_hitsize_set(fl, ELM_FLIP_DIRECTION_RIGHT, 0.25); + evas_object_show(fl); + + im = evas_object_image_filled_add(evas_object_evas_get(win)); + evas_object_size_hint_weight_set(im, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + snprintf(buf, sizeof(buf), "%s/images/%s", + elm_app_data_dir_get(), "twofish.jpg"); + evas_object_image_file_set(im, buf, NULL); + elm_object_part_content_set(fl, "front", im); + evas_object_show(im); + +#if 0 + im = evas_object_image_filled_add(evas_object_evas_get(win)); + evas_object_size_hint_weight_set(im, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + snprintf(buf, sizeof(buf), "%s/images/%s", + elm_app_data_dir_get(), "sky_04.jpg"); + evas_object_image_file_set(im, buf, NULL); + elm_object_part_content_set(fl, "back", im); + evas_object_show(im); +#else + li = elm_list_add(win); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_list_item_append(li, "Item 0", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Item 1", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Item 2", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Item 3 (Which is very long just for testing purposes)", NULL, NULL, NULL, NULL); + elm_list_go(li); + elm_object_part_content_set(fl, "back", li); + evas_object_show(li); +#endif + + rd = elm_radio_add(win); + evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + elm_radio_state_value_set(rd, ELM_FLIP_INTERACTION_NONE); + elm_object_text_set(rd, "None"); + elm_box_pack_end(bx, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", my_fl_ch, win); + rdg = rd; + evas_object_data_set(win, "rdg", rdg); + + rd = elm_radio_add(win); + evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + elm_radio_state_value_set(rd, ELM_FLIP_INTERACTION_ROTATE); + elm_object_text_set(rd, "Rotate"); + elm_radio_group_add(rd, rdg); + elm_box_pack_end(bx, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", my_fl_ch, win); + + rd = elm_radio_add(win); + evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + elm_radio_state_value_set(rd, ELM_FLIP_INTERACTION_CUBE); + elm_object_text_set(rd, "Cube"); + elm_radio_group_add(rd, rdg); + elm_box_pack_end(bx, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", my_fl_ch, win); + + rd = elm_radio_add(win); + evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + elm_radio_state_value_set(rd, ELM_FLIP_INTERACTION_PAGE); + elm_object_text_set(rd, "Page"); + elm_radio_group_add(rd, rdg); + elm_box_pack_end(bx, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", my_fl_ch, win); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Flip Go"); + evas_object_smart_callback_add(bt, "clicked", my_fl_go, win); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} + +void +test_flip_to(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bx2, *fl, *o, *bt, *ly; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("flip-to", "Flip To"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + fl = elm_flip_add(win); + evas_object_size_hint_align_set(fl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(fl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, fl); + + o = elm_bg_add(win); + evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), "sky_01.jpg"); + elm_bg_file_set(o, buf, NULL); + elm_object_part_content_set(fl, "front", o); + evas_object_show(o); + + ly = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "layout"); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(fl, "back", ly); + evas_object_show(ly); + + bt = elm_button_add(ly); + elm_object_text_set(bt, "Button 1"); + elm_object_part_content_set(ly, "element1", bt); + + bt = elm_button_add(ly); + elm_object_text_set(bt, "Button 2"); + elm_object_part_content_set(ly, "element2", bt); + + bt = elm_button_add(ly); + elm_object_text_set(bt, "Button 3"); + elm_object_part_content_set(ly, "element3", bt); + + evas_object_show(fl); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Show Front"); + evas_object_smart_callback_add(bt, "clicked", my_fl_front, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Show Back"); + evas_object_smart_callback_add(bt, "clicked", my_fl_back, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_flip_page.c b/src/bin/elementary/test_flip_page.c new file mode 100644 index 0000000000..5fbb9dfb3a --- /dev/null +++ b/src/bin/elementary/test_flip_page.c @@ -0,0 +1,909 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +typedef struct _State State; +typedef struct _Slice Slice; + +typedef struct _Vertex2 Vertex2; +typedef struct _Vertex3 Vertex3; + +struct _State +{ + Evas_Object *front, *back; + Evas_Coord down_x, down_y, x, y; + Eina_Bool down : 1; + Eina_Bool backflip : 1; + + Ecore_Animator *anim; + Ecore_Job *job; + Evas_Coord ox, oy, w, h; + int slices_w, slices_h; + Slice **slices, **slices2; + int dir; // 0 == left, 1 == right, 2 == up, 3 == down + int finish; +}; + +struct _Slice +{ + Evas_Object *obj; + // (0)---(1) + // | | + // | | + // (3)---(2) + double u[4], v[4], x[4], y[4], z[4]; +}; + +struct _Vertex2 +{ + double x, y; +}; + +struct _Vertex3 +{ + double x, y, z; +}; + +static State state = +{ + NULL, NULL, + 0, 0, 0, 0, + 0, + 0, + + NULL, + NULL, + 0, 0, 0, 0, + 0, 0, + NULL, NULL, + -1, + 0 +}; + +static Slice * +_slice_new(State *st EINA_UNUSED, Evas_Object *obj) +{ + Slice *sl; + + sl = calloc(1, sizeof(Slice)); + if (!sl) return NULL; + sl->obj = evas_object_image_add(evas_object_evas_get(obj)); + evas_object_image_smooth_scale_set(sl->obj, EINA_FALSE); + evas_object_pass_events_set(sl->obj, EINA_TRUE); + evas_object_image_source_set(sl->obj, obj); + return sl; +} + +static void +_slice_free(Slice *sl) +{ + evas_object_del(sl->obj); + free(sl); +} + +static void +_slice_apply(State *st, Slice *sl, + Evas_Coord x EINA_UNUSED, Evas_Coord y EINA_UNUSED, Evas_Coord w, Evas_Coord h EINA_UNUSED, + Evas_Coord ox, Evas_Coord oy, Evas_Coord ow, Evas_Coord oh) +{ + Evas_Map *m; + int i; + + m = evas_map_new(4); + if (!m) return; + evas_map_smooth_set(m, EINA_FALSE); + for (i = 0; i < 4; i++) + { + evas_map_point_color_set(m, i, 255, 255, 255, 255); + if (st->dir == 0) + { + int p[4] = { 0, 1, 2, 3 }; + evas_map_point_coord_set(m, i, ox + sl->x[p[i]], oy + sl->y[p[i]], sl->z[p[i]]); + evas_map_point_image_uv_set(m, i, sl->u[p[i]] , sl->v[p[i]]); + } + else if (st->dir == 1) + { + int p[4] = { 1, 0, 3, 2 }; + evas_map_point_coord_set(m, i, ox + (w - sl->x[p[i]]), oy + sl->y[p[i]], sl->z[p[i]]); + evas_map_point_image_uv_set(m, i, ow - sl->u[p[i]] , sl->v[p[i]]); + } + else if (st->dir == 2) + { + int p[4] = { 1, 0, 3, 2 }; + evas_map_point_coord_set(m, i, ox + sl->y[p[i]], oy + sl->x[p[i]], sl->z[p[i]]); + evas_map_point_image_uv_set(m, i, sl->v[p[i]] , sl->u[p[i]]); + } + else if (st->dir == 3) + { + int p[4] = { 0, 1, 2, 3 }; + evas_map_point_coord_set(m, i, ox + sl->y[p[i]], oy + (w - sl->x[p[i]]), sl->z[p[i]]); + evas_map_point_image_uv_set(m, i, sl->v[p[i]] , oh - sl->u[p[i]]); + } + } + evas_object_map_enable_set(sl->obj, EINA_TRUE); + evas_object_image_fill_set(sl->obj, 0, 0, ow, oh); + evas_object_map_set(sl->obj, m); + evas_map_free(m); +} + +static void +_slice_3d(State *st EINA_UNUSED, Slice *sl, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) +{ + Evas_Map *m = (Evas_Map *)evas_object_map_get(sl->obj); + int i; + + if (!m) return; + // vanishing point is center of page, and focal dist is 1024 + evas_map_util_3d_perspective(m, x + (w / 2), y + (h / 2), 0, 1024); + for (i = 0; i < 4; i++) + { + Evas_Coord xx, yy, zz; + evas_map_point_coord_get(m, i, &xx, &yy, &zz); + evas_map_point_coord_set(m, i, xx, yy, 0); + } + if (evas_map_util_clockwise_get(m)) evas_object_show(sl->obj); + else evas_object_hide(sl->obj); + evas_object_map_set(sl->obj, m); +} + +static void +_slice_light(State *st EINA_UNUSED, Slice *sl, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) +{ + Evas_Map *m = (Evas_Map *)evas_object_map_get(sl->obj); + int i; + + if (!m) return; + evas_map_util_3d_lighting(m, + // light position + // (centered over page 10 * h toward camera) + x + (w / 2) , y + (h / 2) , -10000, + 255, 255, 255, // light color + 0 , 0 , 0); // ambient minimum + // multiply brightness by 1.2 to make lightish bits all white so we dont + // add shading where we could otherwise be pure white + for (i = 0; i < 4; i++) + { + int r, g, b, a; + + evas_map_point_color_get(m, i, &r, &g, &b, &a); + r = (double)r * 1.2; if (r > 255) r = 255; + g = (double)g * 1.2; if (g > 255) g = 255; + b = (double)b * 1.2; if (b > 255) b = 255; + evas_map_point_color_set(m, i, r, g, b, a); + } + evas_object_map_set(sl->obj, m); +} + +static void +_slice_xyz(State *st EINA_UNUSED, Slice *sl, + double xx1, double yy1, double zz1, + double xx2, double yy2, double zz2, + double xx3, double yy3, double zz3, + double xx4, double yy4, double zz4) +{ + sl->x[0] = xx1; sl->y[0] = yy1; sl->z[0] = zz1; + sl->x[1] = xx2; sl->y[1] = yy2; sl->z[1] = zz2; + sl->x[2] = xx3; sl->y[2] = yy3; sl->z[2] = zz3; + sl->x[3] = xx4; sl->y[3] = yy4; sl->z[3] = zz4; +} + +static void +_slice_uv(State *st EINA_UNUSED, Slice *sl, + double u1, double v1, + double u2, double v2, + double u3, double v3, + double u4, double v4) +{ + sl->u[0] = u1; sl->v[0] = v1; + sl->u[1] = u2; sl->v[1] = v2; + sl->u[2] = u3; sl->v[2] = v3; + sl->u[3] = u4; sl->v[3] = v4; +} + +static void +_deform_point(Vertex2 *vi, Vertex3 *vo, double rho, double theta, double A) +{ + // ^Y + // | + // | X + // +----> + // theta == cone angle (0 -> PI/2) + // A == distance of cone apex from origin + // rho == angle of cone from vertical axis (...-PI/2 to PI/2...) + Vertex3 v1; + double d, r, b; + + d = sqrt((vi->x * vi->x) + pow(vi->y - A, 2)); + r = d * sin(theta); + b = asin(vi->x / d) / sin(theta); + + v1.x = r * sin(b); + v1.y = d + A - (r * (1 - cos(b)) * sin(theta)); + v1.z = r * (1 - cos(b)) * cos(theta); + + vo->x = (v1.x * cos(rho)) - (v1.z * sin(rho)); + vo->y = v1.y; + vo->z = (v1.x * sin(rho)) + (v1.z * cos(rho)); +} + +static void +_interp_point(Vertex3 *vi1, Vertex3 *vi2, Vertex3 *vo, double v) +{ + vo->x = (v * vi2->x) + ((1.0 - v) * vi1->x); + vo->y = (v * vi2->y) + ((1.0 - v) * vi1->y); + vo->z = (v * vi2->z) + ((1.0 - v) * vi1->z); +} + +static void +_state_slices_clear(State *st) +{ + int i, j, num; + + if (st->slices) + { + num = 0; + for (j = 0; j < st->slices_h; j++) + { + for (i = 0; i < st->slices_w; i++) + { + if (st->slices[num]) _slice_free(st->slices[num]); + if (st->slices2[num]) _slice_free(st->slices2[num]); + num++; + } + } + free(st->slices); + free(st->slices2); + st->slices = NULL; + st->slices2 = NULL; + } + st->slices_w = 0; + st->slices_h = 0; +} + +static int +_slice_obj_color_sum(Slice *s, int p, int *r, int *g, int *b, int *a) +{ + Evas_Map *m; + int rr = 0, gg = 0, bb = 0, aa = 0; + + if (!s) return 0; + m = (Evas_Map *)evas_object_map_get(s->obj); + if (!m) return 0; + evas_map_point_color_get(m, p, &rr, &gg, &bb, &aa); + *r += rr; *g += gg; *b += bb; *a += aa; + return 1; +} + +static void +_slice_obj_color_set(Slice *s, int p, int r, int g, int b, int a) +{ + Evas_Map *m; + + if (!s) return; + m = (Evas_Map *)evas_object_map_get(s->obj); + if (!m) return; + evas_map_point_color_set(m, p, r, g, b, a); + evas_object_map_set(s->obj, m); +} + +static void +_slice_obj_vert_color_merge(Slice *s1, int p1, Slice *s2, int p2, + Slice *s3, int p3, Slice *s4, int p4) +{ + int r = 0, g = 0, b = 0, a = 0, n = 0; + + n += _slice_obj_color_sum(s1, p1, &r, &g, &b, &a); + n += _slice_obj_color_sum(s2, p2, &r, &g, &b, &a); + n += _slice_obj_color_sum(s3, p3, &r, &g, &b, &a); + n += _slice_obj_color_sum(s4, p4, &r, &g, &b, &a); + + if (n < 1) return; + r /= n; g /= n; b /= n; a /= n; + + _slice_obj_color_set(s1, p1, r, g, b, a); + _slice_obj_color_set(s2, p2, r, g, b, a); + _slice_obj_color_set(s3, p3, r, g, b, a); + _slice_obj_color_set(s4, p4, r, g, b, a); +} + +static int +_state_update(State *st) +{ + Evas_Coord xx1, yy1, xx2, yy2, mx, my, dst, dx, dy; + Evas_Coord x, y, w, h, ox, oy, ow, oh; + int i, j, num, nn, jump, num2; + Slice *sl; + double b, minv = 0.0, minva, mgrad; + int gx, gy, gszw, gszh, gw, gh, col, row, nw, nh; + double rho, A, theta, perc, n, rhol, Al, thetal; + Vertex3 *tvo, *tvol; + + st->backflip = 0; + + evas_object_geometry_get(st->front, &x, &y, &w, &h); + ox = x; oy = y; ow = w; oh = h; + xx1 = st->down_x; + yy1 = st->down_y; + xx2 = st->x; + yy2 = st->y; + + dx = xx2 - xx1; + dy = yy2 - yy1; + dst = sqrt((dx * dx) + (dy * dy)); + if (st->dir == -1) + { + if (dst < 20) // MAGIC: 20 == drag hysterisis + return 0; + } + if (st->dir == -1) + { + if ((xx1 > (w / 2)) && (dx < 0) && (abs(dx) > abs(dy))) st->dir = 0; // left + else if ((xx1 < (w / 2)) && (dx >= 0) && (abs(dx) > abs(dy))) st->dir = 1; // right + else if ((yy1 > (h / 2)) && (dy < 0) && (abs(dy) >= abs(dx))) st->dir = 2; // up + else if ((yy1 < (h / 2)) && (dy >= 0) && (abs(dy) >= abs(dx))) st->dir = 3; // down + if (st->dir == -1) return 0; + } + if (st->dir == 0) + { + // no nothing. left drag is standard + } + else if (st->dir == 1) + { + xx1 = (w - 1) - xx1; + xx2 = (w - 1) - xx2; + } + else if (st->dir == 2) + { + Evas_Coord tmp; + + tmp = xx1; xx1 = yy1; yy1 = tmp; + tmp = xx2; xx2 = yy2; yy2 = tmp; + tmp = w; w = h; h = tmp; + } + else if (st->dir == 3) + { + Evas_Coord tmp; + + tmp = xx1; xx1 = yy1; yy1 = tmp; + tmp = xx2; xx2 = yy2; yy2 = tmp; + tmp = w; w = h; h = tmp; + xx1 = (w - 1) - xx1; + xx2 = (w - 1) - xx2; + } + + if (xx2 >= xx1) xx2 = xx1 - 1; + mx = (xx1 + xx2) / 2; + my = (yy1 + yy2) / 2; + + if (mx < 0) mx = 0; + else if (mx >= w) mx = w - 1; + if (my < 0) my = 0; + else if (my >= h) my = h - 1; + + mgrad = (double)(yy1 - yy2) / (double)(xx1 - xx2); + + if (mx < 1) mx = 1; // quick hack to keep curl line visible + + if (mgrad == 0.0) // special horizontal case + mgrad = 0.001; // quick dirty hack for now + // else + { + minv = 1.0 / mgrad; + // y = (m * x) + b + b = my + (minv * mx); + } + if ((b >= -5) && (b <= (h + 5))) + { + if (minv > 0.0) // clamp to h + { + minv = (double)(h + 5 - my) / (double)(mx); + b = my + (minv * mx); + } + else // clamp to 0 + { + minv = (double)(-5 - my) / (double)(mx); + b = my + (minv * mx); + } + } + + perc = (double)xx2 / (double)xx1; + if (perc < 0.0) perc = 0.0; + else if (perc > 1.0) perc = 1.0; + + minva = atan(minv) / (M_PI / 2); + if (minva < 0.0) minva = -minva; + + // A = apex of cone + if (b <= 0) A = b; + else A = h - b; + if (A < -(h * 20)) A = -h * 20; + //--// + Al = -5; + + // rho = is how much the page is turned + n = 1.0 - perc; + n = 1.0 - cos(n * M_PI / 2.0); + n = n * n; + rho = -(n * M_PI); + //--// + rhol = -(n * M_PI); + + // theta == curliness (how much page culrs in on itself + n = sin((1.0 - perc) * M_PI); + n = n * 1.2; + theta = 7.86 + n; + //--// + n = sin((1.0 - perc) * M_PI); + n = 1.0 - n; + n = n * n; + n = 1.0 - n; + thetal = 7.86 + n; + + nw = 16; + nh = 16; + gszw = w / nw; + gszh = h / nh; + if (gszw < 4) gszw = 4; + if (gszh < 4) gszh = 4; + + nw = (w + gszw - 1) / gszw; + nh = (h + gszh - 1) / gszh; + if ((st->slices_w != nw) || (st->slices_h != nh)) _state_slices_clear(st); + st->slices_w = nw; + st->slices_h = nh; + if (!st->slices) + { + st->slices = calloc(st->slices_w * st->slices_h, sizeof(Slice *)); + if (!st->slices) return 0; + st->slices2 = calloc(st->slices_w * st->slices_h, sizeof(Slice *)); + if (!st->slices2) + { + free(st->slices); + st->slices = NULL; + return 0; + } + } + + num = (st->slices_w + 1) * (st->slices_h + 1); + + tvo = alloca(sizeof(Vertex3) * num); + tvol = alloca(sizeof(Vertex3) * (st->slices_w + 1)); + + for (col = 0, gx = 0; gx <= (w + gszw - 1); gx += gszw, col++) + { + Vertex2 vil; + + vil.x = gx; + vil.y = h - gx; + _deform_point(&vil, &(tvol[col]), rhol, thetal, Al); + } + + n = minva * sin(perc * M_PI); + n = n * n; + + num = 0; + for (col = 0, gx = 0; gx <= (w + gszw - 1); gx += gszw, col++) + { + for (gy = 0; gy <= (h + gszh - 1); gy += gszh) + { + Vertex2 vi; + Vertex3 vo, tvo1; + + if (gx > w) vi.x = w; + else vi.x = gx; + if (gy > h) vi.y = h; + else vi.y = gy; + _deform_point(&vi, &vo, rho, theta, A); + tvo1 = tvol[col]; + if (gy > h) tvo1.y = h; + else tvo1.y = gy; + _interp_point(&vo, &tvo1, &(tvo[num]), n); + num++; + } + } + + jump = st->slices_h + 1; + for (col = 0, gx = 0; gx < w; gx += gszw, col++) + { + num = st->slices_h * col; + num2 = jump * col; + + gw = gszw; + if ((gx + gw) > w) gw = w - gx; + + for (row = 0, gy = 0; gy < h; gy += gszh, row++) + { + Vertex3 vo[4]; + + memset(vo, 0, sizeof(vo)); + + if (b > 0) nn = num + st->slices_h - row - 1; + else nn = num + row; + + gh = gszh; + if ((gy + gh) > h) gh = h - gy; + + vo[0] = tvo[num2 + row]; + vo[1] = tvo[num2 + row + jump]; + vo[2] = tvo[num2 + row + jump + 1]; + vo[3] = tvo[num2 + row + 1]; +#define SWP(a, b) do {typeof(a) vt; vt = (a); (a) = (b); (b) = vt;} while (0) + if (b > 0) + { + SWP(vo[0], vo[3]); + SWP(vo[1], vo[2]); + vo[0].y = h - vo[0].y; + vo[1].y = h - vo[1].y; + vo[2].y = h - vo[2].y; + vo[3].y = h - vo[3].y; + } + + // FRONT + sl = st->slices[nn]; + if (!sl) + { + sl = _slice_new(st, st->front); + st->slices[nn] = sl; + } + _slice_xyz(st, sl, + vo[0].x, vo[0].y, vo[0].z, + vo[1].x, vo[1].y, vo[1].z, + vo[2].x, vo[2].y, vo[2].z, + vo[3].x, vo[3].y, vo[3].z); + if (b <= 0) + _slice_uv(st, sl, + gx, gy, gx + gw, gy, + gx + gw, gy + gh, gx, gy + gh); + else + _slice_uv(st, sl, + gx, h - (gy + gh), gx + gw, h - (gy + gh), + gx + gw, h - gy, gx, h - gy); + + // BACK + sl = st->slices2[nn]; + if (!sl) + { + sl = _slice_new(st, st->back); + st->slices2[nn] = sl; + } + + _slice_xyz(st, sl, + vo[1].x, vo[1].y, vo[1].z, + vo[0].x, vo[0].y, vo[0].z, + vo[3].x, vo[3].y, vo[3].z, + vo[2].x, vo[2].y, vo[2].z); + if (st->backflip) + { + if (b <= 0) + _slice_uv(st, sl, + gx + gw, gy, gx, gy, + gx, gy + gh, gx + gw, gy + gh); + else + _slice_uv(st, sl, + gx + gw, h - (gy + gh), gx, h - (gy + gh), + gx, h - gy, gx + gw, h - gy); + } + else + { + if (b <= 0) + _slice_uv(st, sl, + w - (gx + gw), gy, w - (gx), gy, + w - (gx), gy + gh, w - (gx + gw), gy + gh); + else + _slice_uv(st, sl, + w - (gx + gw), h - (gy + gh), w - (gx), h - (gy + gh), + w - (gx), h - gy, w - (gx + gw), h - gy); + } + } + } + + num = 0; + for (j = 0; j < st->slices_h; j++) + { + for (i = 0; i < st->slices_w; i++) + { + _slice_apply(st, st->slices[num], x, y, w, h, ox, oy, ow, oh); + _slice_apply(st, st->slices2[num], x, y, w, h, ox, oy, ow, oh); + _slice_light(st, st->slices[num], ox, oy, ow, oh); + _slice_light(st, st->slices2[num], ox, oy, ow, oh); + num++; + } + } + + for (i = 0; i <= st->slices_w; i++) + { + num = i * st->slices_h; + for (j = 0; j <= st->slices_h; j++) + { + Slice *s[4]; + + s[0] = s[1] = s[2] = s[3] = NULL; + if ((i > 0) && (j > 0)) + s[0] = st->slices[num - 1 - st->slices_h]; + if ((i < st->slices_w) && (j > 0)) + s[1] = st->slices[num - 1]; + if ((i > 0) && (j < st->slices_h)) + s[2] = st->slices[num - st->slices_h]; + if ((i < st->slices_w) && (j < st->slices_h)) + s[3] = st->slices[num]; + if (st->dir == 0) + _slice_obj_vert_color_merge(s[0], 2, s[1], 3, + s[2], 1, s[3], 0); + else if (st->dir == 1) + _slice_obj_vert_color_merge(s[0], 3, s[1], 2, + s[2], 0, s[3], 1); + else if (st->dir == 2) + _slice_obj_vert_color_merge(s[0], 3, s[1], 2, + s[2], 0, s[3], 1); + else if (st->dir == 3) + _slice_obj_vert_color_merge(s[0], 2, s[1], 3, + s[2], 1, s[3], 0); + s[0] = s[1] = s[2] = s[3] = NULL; + if ((i > 0) && (j > 0)) + s[0] = st->slices2[num - 1 - st->slices_h]; + if ((i < st->slices_w) && (j > 0)) + s[1] = st->slices2[num - 1]; + if ((i > 0) && (j < st->slices_h)) + s[2] = st->slices2[num - st->slices_h]; + if ((i < st->slices_w) && (j < st->slices_h)) + s[3] = st->slices2[num]; + if (st->dir == 0) + _slice_obj_vert_color_merge(s[0], 3, s[1], 2, + s[2], 0, s[3], 1); + else if (st->dir == 1) + _slice_obj_vert_color_merge(s[0], 2, s[1], 3, + s[2], 1, s[3], 0); + else if (st->dir == 2) + _slice_obj_vert_color_merge(s[0], 2, s[1], 3, + s[2], 1, s[3], 0); + else if (st->dir == 3) + _slice_obj_vert_color_merge(s[0], 3, s[1], 2, + s[2], 0, s[3], 1); + num++; + } + } + + num = 0; + for (i = 0; i < st->slices_w; i++) + { + for (j = 0; j < st->slices_h; j++) + { + _slice_3d(st, st->slices[num], ox, oy, ow, oh); + _slice_3d(st, st->slices2[num], ox, oy, ow, oh); + num++; + } + } + + return 1; +} + +static void +_state_end(State *st) +{ + _state_slices_clear(st); +} + +static Eina_Bool +_state_anim(void *data, double pos) +{ + State *st = data; + double p; + + p = ecore_animator_pos_map(pos, ECORE_POS_MAP_ACCELERATE, 0.0, 0.0); + if (st->finish) + { + if (st->dir == 0) + st->x = st->ox * (1.0 - p); + else if (st->dir == 1) + st->x = st->ox + ((st->w - st->ox) * p); + else if (st->dir == 2) + st->y = st->oy * (1.0 - p); + else if (st->dir == 3) + st->y = st->oy + ((st->h - st->oy) * p); + } + else + { + if (st->dir == 0) + st->x = st->ox + ((st->w - st->ox) * p); + else if (st->dir == 1) + st->x = st->ox * (1.0 - p); + else if (st->dir == 2) + st->y = st->oy + ((st->h - st->oy) * p); + else if (st->dir == 3) + st->y = st->oy * (1.0 - p); + } + _state_update(st); + if (pos < 1.0) return EINA_TRUE; + evas_object_show(st->front); + evas_object_show(st->back); + _state_end(st); + st->anim = NULL; + return EINA_FALSE; +} + +static void +_update_curl_job(void *data) +{ + State *st = data; + st->job = NULL; + if (_state_update(st)) + { + evas_object_hide(st->front); + evas_object_hide(st->back); + } +} + +static void +im_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + State *st = &state; + Evas_Event_Mouse_Down *ev = event_info; + Evas_Coord x, y, w, h; + + if (ev->button != 1) return; + st->front = data; + st->back = evas_object_data_get(data, "im2"); + st->backflip = 1; + st->down = 1; + evas_object_geometry_get(st->front, &x, &y, &w, &h); + st->x = ev->canvas.x - x; + st->y = ev->canvas.y - y; + st->w = w; + st->h = h; + st->down_x = st->x; + st->down_y = st->y; + st->dir = -1; + if (_state_update(st)) + { + evas_object_hide(st->front); + evas_object_hide(st->back); + } +} + +static void +im_up_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + State *st = &state; + Evas_Event_Mouse_Up *ev = event_info; + Evas_Coord x, y, w, h; + double tm = 0.5; + + if (ev->button != 1) return; + st->down = 0; + evas_object_geometry_get(st->front, &x, &y, &w, &h); + st->x = ev->canvas.x - x; + st->y = ev->canvas.y - y; + st->w = w; + st->h = h; + st->ox = st->x; + st->oy = st->y; + if (st->job) + { + ecore_job_del(st->job); + st->job = NULL; + } + if (st->anim) ecore_animator_del(st->anim); + st->finish = 0; + if (st->dir == 0) + { + tm = (double)st->x / (double)st->w; + if (st->x < (st->w / 2)) st->finish = 1; + } + else if (st->dir == 1) + { + if (st->x > (st->w / 2)) st->finish = 1; + tm = 1.0 - ((double)st->x / (double)st->w); + } + else if (st->dir == 2) + { + if (st->y < (st->h / 2)) st->finish = 1; + tm = (double)st->y / (double)st->h; + } + else if (st->dir == 3) + { + if (st->y > (st->h / 2)) st->finish = 1; + tm = 1.0 - ((double)st->y / (double)st->h); + } + if (tm < 0.01) tm = 0.01; + else if (tm > 0.99) tm = 0.99; + if (!st->finish) tm = 1.0 - tm; + tm *= 0.5; + st->anim = ecore_animator_timeline_add(tm, _state_anim, st); + _state_anim(st, 0.0); +} + +static void +im_move_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + State *st = &state; + Evas_Event_Mouse_Move *ev = event_info; + Evas_Coord x, y, w, h; + + if (!st->down) return; + evas_object_geometry_get(st->front, &x, &y, &w, &h); + st->x = ev->cur.canvas.x - x; + st->y = ev->cur.canvas.y - y; + st->w = w; + st->h = h; + if (st->job) ecore_job_del(st->job); + st->job = ecore_job_add(_update_curl_job, st); +} + +void +test_flip_page(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *im, *im2, *rc; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("flip-page", "Flip Page"); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + elm_win_autodel_set(win, EINA_TRUE); + + im2 = evas_object_image_filled_add(evas_object_evas_get(win)); + snprintf(buf, sizeof(buf), "%s/images/%s", + elm_app_data_dir_get(), "sky_04.jpg"); + evas_object_image_file_set(im2, buf, NULL); + evas_object_move(im2, 40, 40); + evas_object_resize(im2, 400, 400); + evas_object_show(im2); + +#if 0 + im = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(im, buf, "layout"); +#else + im = evas_object_image_filled_add(evas_object_evas_get(win)); + snprintf(buf, sizeof(buf), "%s/images/%s", + elm_app_data_dir_get(), "twofish.jpg"); + evas_object_image_file_set(im, buf, NULL); +#endif + evas_object_move(im, 40, 40); + evas_object_resize(im, 400, 400); + evas_object_show(im); + + evas_object_data_set(im, "im2", im2); + + rc = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(rc, 0, 0, 0, 0); + evas_object_move(rc, 40, 340); + evas_object_resize(rc, 400, 100); + evas_object_show(rc); + + evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_DOWN, im_down_cb, im); + evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_UP, im_up_cb, im); + evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_MOVE, im_move_cb, im); + + rc = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(rc, 0, 0, 0, 0); + evas_object_move(rc, 40, 40); + evas_object_resize(rc, 400, 100); + evas_object_show(rc); + + evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_DOWN, im_down_cb, im); + evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_UP, im_up_cb, im); + evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_MOVE, im_move_cb, im); + + rc = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(rc, 0, 0, 0, 0); + evas_object_move(rc, 340, 40); + evas_object_resize(rc, 100, 400); + evas_object_show(rc); + + evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_DOWN, im_down_cb, im); + evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_UP, im_up_cb, im); + evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_MOVE, im_move_cb, im); + + rc = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(rc, 0, 0, 0, 0); + evas_object_move(rc, 40, 40); + evas_object_resize(rc, 100, 400); + evas_object_show(rc); + + evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_DOWN, im_down_cb, im); + evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_UP, im_up_cb, im); + evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_MOVE, im_move_cb, im); + + evas_object_resize(win, 480, 480); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_flipselector.c b/src/bin/elementary/test_flipselector.c new file mode 100644 index 0000000000..62a67cff09 --- /dev/null +++ b/src/bin/elementary/test_flipselector.c @@ -0,0 +1,188 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +void +_sel_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *it; + + it = event_info; + printf("label of selected item is: %s\n", elm_object_item_text_get(it)); +} + +void +_unsel_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Elm_Object_Item *it; + Evas_Object *fp = data; + it = elm_flipselector_selected_item_get(fp); + elm_flipselector_item_selected_set(it, EINA_FALSE); +} + +void +_last_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Elm_Object_Item *it; + Evas_Object *fp = data; + it = elm_flipselector_last_item_get(fp); + elm_flipselector_item_selected_set(it, EINA_TRUE); +} + +void +_third_from_end_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Elm_Object_Item *it; + Evas_Object *fp = data; + it = elm_flipselector_last_item_get(fp); + it = elm_flipselector_item_prev_get(it); + it = elm_flipselector_item_prev_get(it); + elm_flipselector_item_selected_set(it, EINA_TRUE); +} + +void +_underflow_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("underflow!\n"); +} + +void +_overflow_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("overflow!\n"); +} + +void +slider_change_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *fl = (Evas_Object *)data; + + double val = elm_slider_value_get(obj); + elm_flipselector_first_interval_set(fl, val); +} + +void +flip_next_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *fp = data; + elm_flipselector_flip_next(fp); +} + +void +flip_prev_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *fp = data; + elm_flipselector_flip_prev(fp); +} + +void +test_flipselector(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + char buf[8]; + unsigned int i; + Evas_Object *win, *bx, *fp, *fpd, *bt, *bx2, *sl; + Elm_Object_Item *it; + static const char *lbl[] = { + "Elementary", + "Evas", + "Eina", + "Edje", + "Eet", + "Ecore", + "Efreet", + "Eldbus" + }; + + win = elm_win_util_standard_add("flipselector", "Flip Selector"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + fp = elm_flipselector_add(bx); + evas_object_size_hint_weight_set(fp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_smart_callback_add(fp, "selected", _sel_cb, NULL); + evas_object_smart_callback_add(fp, "underflowed", _overflow_cb, NULL); + evas_object_smart_callback_add(fp, "overflowed", _underflow_cb, NULL); + for (i = 0; i < sizeof(lbl)/sizeof(char *); i++) + { + it = elm_flipselector_item_append(fp, lbl[i], NULL, NULL); + if (i == 3) + elm_flipselector_item_selected_set(it, EINA_TRUE); + } + elm_box_pack_end(bx, fp); + evas_object_show(fp); + + bx2 = elm_box_add(bx); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + fp = elm_flipselector_add(bx2); + evas_object_smart_callback_add(fp, "underflowed", _overflow_cb, NULL); + evas_object_smart_callback_add(fp, "overflowed", _underflow_cb, NULL); + evas_object_size_hint_weight_set(fp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + for (i = 1990; i <= 2099; i++) + { + snprintf(buf, 8, "%u", i); + elm_flipselector_item_append(fp, buf, _sel_cb, NULL); + } + + bt = elm_button_add(bx2); + elm_object_text_set(bt, "Flip Prev"); + evas_object_smart_callback_add(bt, "clicked", flip_prev_cb, fp); + + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx2, fp); + evas_object_show(fp); + + bt = elm_button_add(bx2); + elm_object_text_set(bt, "Flip Next"); + evas_object_smart_callback_add(bt, "clicked", flip_next_cb, fp); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + fpd = elm_flipselector_add(bx); + evas_object_size_hint_weight_set(fpd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_flipselector_item_append(fpd, "disabled", NULL, NULL); + elm_object_disabled_set(fpd, EINA_TRUE); + elm_box_pack_end(bx, fpd); + evas_object_show(fpd); + + sl = elm_slider_add(bx); + elm_object_text_set(sl, "Flip Interval:"); + elm_slider_unit_format_set(sl, "%1.2f"); + elm_slider_min_max_set(sl, 0, 3.0); + elm_slider_value_set(sl, 0.85); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + evas_object_smart_callback_add(sl, "changed", slider_change_cb, fp); + + bt = elm_button_add(bx); + elm_object_text_set(bt, "Select Last"); + evas_object_smart_callback_add(bt, "clicked", _last_cb, fp); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(bx); + elm_object_text_set(bt, "Select 2097"); + evas_object_smart_callback_add(bt, "clicked", _third_from_end_cb, fp); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(bx); + elm_object_text_set(bt, "Unselect year"); + evas_object_smart_callback_add(bt, "clicked", _unsel_cb, fp); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + evas_object_show(win); +} diff --git a/src/bin/elementary/test_floating.c b/src/bin/elementary/test_floating.c new file mode 100644 index 0000000000..b74cd4a762 --- /dev/null +++ b/src/bin/elementary/test_floating.c @@ -0,0 +1,101 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +typedef struct _Testitem +{ + Elm_Object_Item *item; + int mode; + int onoff; +} Testitem; + +static Elm_Genlist_Item_Class itc1; +static char *glf_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + char buf[256]; + snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data); + return strdup(buf); +} + +static Evas_Object *glf_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part EINA_UNUSED) +{ + char buf[PATH_MAX]; + Evas_Object *ic = elm_icon_add(obj); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + return ic; +} +static Eina_Bool glf_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + return EINA_FALSE; +} +static void glf_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED) +{ +} + +static void +gl_sel(void *data, Evas_Object *obj, void *event_info) +{ + printf("sel item data [%p] on genlist obj [%p], item pointer [%p]\n", data, obj, event_info); +} + +static Eina_Bool +anim(void *data) +{ + Evas_Object *gl = data; + Evas_Coord x, y; + + y = 0; + x = (sin(ecore_loop_time_get()) * 500); + evas_object_move(gl, x, y); + return ECORE_CALLBACK_RENEW; +} + +static void +_del(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Ecore_Animator *ani = data; + + ecore_animator_del(ani); +} + +void +test_floating(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *gl; + int i; + Ecore_Animator *ani; + + win = elm_win_util_standard_add("floating", "Floating"); + elm_win_autodel_set(win, EINA_TRUE); + + gl = elm_genlist_add(win); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_move(gl, 800, 0); + evas_object_resize(gl, 480, 800); + evas_object_show(gl); + + itc1.item_style = "default"; + itc1.func.text_get = glf_text_get; + itc1.func.content_get = glf_content_get; + itc1.func.state_get = glf_state_get; + itc1.func.del = glf_del; + + for (i = 0; i < 20; i++) + { + elm_genlist_item_append(gl, &itc1, + (void *)(uintptr_t)i/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_NONE, + gl_sel/* func */, + (void *)(uintptr_t)(i * 10)/* func data */); + } + evas_object_resize(win, 480, 800); + evas_object_show(win); + + ani = ecore_animator_add(anim, gl); + evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _del, ani); +} diff --git a/src/bin/elementary/test_focus.c b/src/bin/elementary/test_focus.c new file mode 100644 index 0000000000..88e223fd43 --- /dev/null +++ b/src/bin/elementary/test_focus.c @@ -0,0 +1,902 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +Evas_Object * _focus_autoscroll_mode_frame_create(Evas_Object *parent); + +/**** focus 1 ****/ + +static Eina_Bool +_event(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, Evas_Object *src EINA_UNUSED, Evas_Callback_Type type, void *event_info) +{ + if (type == EVAS_CALLBACK_KEY_DOWN) + printf ("Key Down:"); + else if (type == EVAS_CALLBACK_KEY_UP) + printf ("Key Up:"); + else + return EINA_FALSE; + Evas_Event_Key_Down *ev = event_info; + printf("%s\n", ev->key); + + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; + return EINA_TRUE; +} + +static void +_on_key_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *einfo EINA_UNUSED) +{ + //Evas_Event_Key_Down *event = einfo; + //printf("%s %p Key %s Parent %p\n", evas_object_type_get(obj), + // obj, event->key, evas_object_smart_parent_get(obj)); +} + +static void +my_disable(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *bt = data; + elm_object_disabled_set(bt, EINA_TRUE); +} + +static void +my_enable(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *bt = data; + elm_object_disabled_set(bt, EINA_FALSE); +} + +static inline void +my_show(Evas_Object *obj) +{ + evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_DOWN, + _on_key_down, NULL); + evas_object_show(obj); +} + +static void +_tb_sel(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + printf("tb sel %p\n", obj); +} + +static void +_focus_highlight_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + if (elm_check_state_get(obj)) + elm_win_focus_highlight_enabled_set(data, EINA_TRUE); + else + elm_win_focus_highlight_enabled_set(data, EINA_FALSE); +} + +static void +_focus_anim_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + if (elm_check_state_get(obj)) + elm_win_focus_highlight_animate_set(data, EINA_TRUE); + else + elm_win_focus_highlight_animate_set(data, EINA_FALSE); +} + +static void +_rd_changed_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + int value = elm_radio_state_value_get(obj); + + if (value == 0) + elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_CLICK); + else if (value == 1) + elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_IN); + else + elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_KEY_ONLY); +} + +void +test_focus(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *tbx, *tbar, *mainbx, *menu, *ttb; + Elm_Object_Item *tb_it; + Elm_Object_Item *menu_it; + unsigned int i, j; + + win = elm_win_util_standard_add("focus", "Focus"); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + evas_object_resize(win, 800, 600); + elm_object_event_callback_add(win, _event, NULL); + elm_win_autodel_set(win, EINA_TRUE); + my_show(win); + + tbx = elm_box_add(win); + evas_object_size_hint_weight_set(tbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, tbx); + evas_object_show(tbx); + + tbar = elm_toolbar_add(win); + elm_toolbar_shrink_mode_set(tbar, ELM_TOOLBAR_SHRINK_MENU); + evas_object_size_hint_weight_set(tbar, 0.0, 0.0); + evas_object_size_hint_align_set(tbar, EVAS_HINT_FILL, 0.0); + tb_it = elm_toolbar_item_append(tbar, "document-print", "Hello", _tb_sel, NULL); + elm_object_item_disabled_set(tb_it, EINA_TRUE); + elm_toolbar_item_priority_set(tb_it, 100); + + tb_it = elm_toolbar_item_append(tbar, "folder-new", "World", _tb_sel, NULL); + elm_toolbar_item_priority_set(tb_it, -100); + + tb_it = elm_toolbar_item_append(tbar, "object-rotate-right", "H", _tb_sel, NULL); + elm_toolbar_item_priority_set(tb_it, 150); + + tb_it = elm_toolbar_item_append(tbar, "mail-send", "Comes", _tb_sel, NULL); + elm_toolbar_item_priority_set(tb_it, 0); + + tb_it = elm_toolbar_item_append(tbar, "clock", "Elementary", _tb_sel, NULL); + elm_toolbar_item_priority_set(tb_it, -200); + + tb_it = elm_toolbar_item_append(tbar, "refresh", "Menu", NULL, NULL); + elm_toolbar_item_menu_set(tb_it, EINA_TRUE); + elm_toolbar_item_priority_set(tb_it, -9999); + elm_toolbar_menu_parent_set(tbar, win); + + menu = elm_toolbar_item_menu_get(tb_it); + elm_menu_item_add(menu, NULL, "edit-cut", "Shrink", _tb_sel, NULL); + menu_it = elm_menu_item_add(menu, NULL, "edit-copy", "Mode", _tb_sel, NULL); + elm_menu_item_add(menu, menu_it, "edit-paste", "is set to", _tb_sel, NULL); + elm_menu_item_add(menu, NULL, "edit-delete", "Menu", _tb_sel, NULL); + + elm_box_pack_end(tbx, tbar); + evas_object_show(tbar); + + mainbx = elm_box_add(win); + elm_box_horizontal_set(mainbx, EINA_TRUE); + evas_object_size_hint_weight_set(mainbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(tbx, mainbx); + my_show(mainbx); + + { //First Col + Evas_Object *bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + elm_box_pack_end(mainbx, bx); + my_show(bx); + + { + Evas_Object *lb = elm_label_add(win); + elm_object_text_set(lb, "<b>Use Tab or Shift+Tab<br/>or Arrow keys</b>"); + evas_object_size_hint_weight_set(lb, 0.0, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, + EVAS_HINT_FILL); + elm_box_pack_end(bx, lb); + my_show(lb); + } + + { + Evas_Object *tg = elm_check_add(win); + elm_object_style_set(tg, "toggle"); + elm_object_part_text_set(tg, "on", "Yes"); + elm_object_part_text_set(tg, "off", "No"); + elm_box_pack_end(bx, tg); + my_show(tg); + } + + { + Evas_Object *en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_object_text_set(en, "This is a single line"); + elm_entry_single_line_set(en, EINA_TRUE); + elm_box_pack_end(bx, en); + my_show(en); + } + + { + Evas_Object *bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx2, 0.0, 0.0); + elm_box_pack_end(bx, bx2); + + for (i = 2; i; i--) + { + Evas_Object *bt; + bt = elm_button_add(win); + elm_object_text_set(bt, "Box"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + if (i%2) + elm_object_disabled_set(bt, EINA_TRUE); + elm_box_pack_end(bx2, bt); + my_show(bt); + } + + { + Evas_Object *sc = elm_scroller_add(win); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, + EVAS_HINT_FILL); + elm_scroller_bounce_set(sc, EINA_TRUE, EINA_TRUE); + elm_scroller_content_min_limit(sc, 1, 1); + elm_box_pack_end(bx2, sc); + my_show(sc); + + { + Evas_Object *bt; + bt = elm_button_add(win); + elm_object_text_set(bt, "Scroller"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + elm_object_event_callback_add(bt, _event, NULL); + elm_object_content_set(sc, bt); + my_show(bt); + elm_object_event_callback_del(bt, _event, NULL); + } + } + + my_show(bx2); + } + + { + Evas_Object *bt; + bt = elm_button_add(win); + elm_object_text_set(bt, "Box"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + elm_box_pack_end(bx, bt); + my_show(bt); + } + + { + Evas_Object *bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx2, 0.0, 0.0); + elm_box_pack_end(bx, bx2); + my_show(bx2); + + for (i = 2; i; i--) + { + Evas_Object *bx3 = elm_box_add(win); + evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx3, 0.0, 0.0); + elm_box_pack_end(bx2, bx3); + my_show(bx3); + + for (j = 3; j; j--) + { + Evas_Object *bt; + bt = elm_button_add(win); + elm_object_text_set(bt, "Box"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + elm_box_pack_end(bx3, bt); + my_show(bt); + } + } + + { + Evas_Object *sc = elm_scroller_add(win); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, + EVAS_HINT_FILL); + elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE); + elm_scroller_content_min_limit(sc, 1, 0); + elm_box_pack_end(bx2, sc); + my_show(sc); + + Evas_Object *bx3 = elm_box_add(win); + evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx3, 0.0, 0.0); + elm_object_content_set(sc, bx3); + my_show(bx3); + + for (i = 5; i; i--) + { + Evas_Object *bt; + bt = elm_button_add(win); + elm_object_text_set(bt, "BX Scroller"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + elm_box_pack_end(bx3, bt); + my_show(bt); + } + } + } + } + + {//Second Col + char buf[PATH_MAX]; + Evas_Object *ly = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "twolines"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(mainbx, ly); + my_show(ly); + + { + Evas_Object *bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx2, 0.0, 0.0); + elm_object_part_content_set(ly, "element1", bx2); + my_show(bx2); + + for (i = 3; i; i--) + { + Evas_Object *bt; + bt = elm_button_add(win); + elm_object_text_set(bt, "Layout"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + elm_box_pack_end(bx2, bt); + my_show(bt); + elm_object_focus_custom_chain_prepend(bx2, bt, NULL); + } + } + + { + Evas_Object *bx2 = elm_box_add(win); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx2, 0.0, 0.0); + elm_object_part_content_set(ly, "element2", bx2); + my_show(bx2); + + { + Evas_Object *bt; + bt = elm_button_add(win); + elm_object_text_set(bt, "Disable"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_smart_callback_add(bt, "clicked", my_disable, bt); + my_show(bt); + elm_object_focus_custom_chain_prepend(bx2, bt, NULL); + + Evas_Object *bt2; + bt2 = elm_button_add(win); + elm_object_text_set(bt2, "Enable"); + evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt2, 0.0, 0.0); + elm_box_pack_end(bx2, bt2); + evas_object_smart_callback_add(bt2, "clicked", my_enable, bt); + my_show(bt2); + elm_object_focus_custom_chain_append(bx2, bt2, NULL); + + Evas_Object *bt3; + bt3 = elm_button_add(win); + elm_object_text_set(bt3, "KeyOnly with Auto"); + elm_object_focus_move_policy_set(bt3, ELM_FOCUS_MOVE_POLICY_KEY_ONLY); + elm_object_focus_move_policy_automatic_set(bt, EINA_TRUE); // EINA_TURE is default + evas_object_size_hint_align_set(bt3, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt3, 0.0, 0.0); + elm_box_pack_end(bx2, bt3); + my_show(bt3); + elm_object_focus_custom_chain_append(bx2, bt3, NULL); + + Evas_Object *bt4; + bt4 = elm_button_add(win); + elm_object_text_set(bt4, "KeyOnly without Auto"); + elm_object_focus_move_policy_set(bt4, ELM_FOCUS_MOVE_POLICY_KEY_ONLY); + elm_object_focus_move_policy_automatic_set(bt4, EINA_FALSE); + evas_object_size_hint_align_set(bt4, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt4, 0.0, 0.0); + elm_box_pack_end(bx2, bt4); + my_show(bt4); + elm_object_focus_custom_chain_append(bx2, bt4, NULL); + } + + } + } + + {//Third Col + Evas_Object *bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + elm_box_pack_end(mainbx, bx); + my_show(bx); + + { + Evas_Object *fr = elm_frame_add(win); + elm_object_text_set(fr, "Frame"); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + { + Evas_Object *tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_content_set(fr, tb); + my_show(tb); + for (j = 0; j < 1; j++) + for (i = 0; i < 2; i++) + { + Evas_Object *bt; + bt = elm_button_add(win); + elm_object_text_set(bt, "Table"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_table_pack(tb, bt, i, j, 1, 1); + my_show(bt); + } + } + } + + { + Evas_Object *fr = elm_bubble_add(win); + elm_object_text_set(fr, "Bubble"); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, + EVAS_HINT_FILL); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + { + Evas_Object *tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_content_set(fr, tb); + my_show(tb); + for (j = 0; j < 2; j++) + for (i = 0; i < 1; i++) + { + Evas_Object *bt; + bt = elm_button_add(win); + elm_object_text_set(bt, "Table"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_table_pack(tb, bt, i, j, 1, 1); + my_show(bt); + } + } + } + } + + ttb = elm_table_add(win); + evas_object_size_hint_weight_set(ttb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(tbx, ttb); + my_show(ttb); + + { + Evas_Object *ck; + + ck = elm_check_add(ttb); + elm_object_text_set(ck, "Focus Highlight Enable"); + elm_check_state_set(ck, elm_win_focus_highlight_enabled_get(win)); + evas_object_size_hint_align_set(ck, 0.0, EVAS_HINT_FILL); + elm_table_pack(ttb, ck, 0, 0, 1, 1); + my_show(ck); + evas_object_smart_callback_add(ck, "changed", + _focus_highlight_changed, + win); + + ck = elm_check_add(ttb); + elm_object_text_set(ck, "Focus Highlight Animation Enable"); + elm_check_state_set(ck, elm_win_focus_highlight_animate_get(win)); + evas_object_size_hint_align_set(ck, 0.0, EVAS_HINT_FILL); + elm_table_pack(ttb, ck, 0, 1, 1, 1); + my_show(ck); + evas_object_smart_callback_add(ck, "changed", + _focus_anim_changed, + win); + } + + { + Evas_Object *rd, *rdg; + + for (i = 0; i < 3; i++) + { + rd = elm_radio_add(ttb); + elm_radio_state_value_set(rd, i); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL); + elm_table_pack(ttb, rd, 1, i, 1, 1); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, NULL); + + if (i == 0) + { + rdg = rd; + elm_object_text_set(rd, "Move Policy: Key+Click(Default)"); + } + else if (i == 1) + { + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "Move Policy: Key+Click+In"); + } + else + { + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "Move Policy: Key Only"); + } + } + } +} + +/**** focus 2 ****/ + +static void +_focus_in(void *data EINA_UNUSED, Evas *e EINA_UNUSED, void *event_info) +{ + const char *type = evas_object_type_get(event_info); + if ((type) && (!strcmp(type, "elm_widget"))) + type = elm_object_widget_type_get(event_info); + printf("Evas_Object focus in: %p %s\n", event_info, type); +} + +static void +_focus_out(void *data EINA_UNUSED, Evas *e EINA_UNUSED, void *event_info) +{ + const char *type = evas_object_type_get(event_info); + if ((type) && (!strcmp(type, "elm_widget"))) + type = elm_object_widget_type_get(event_info); + printf("Evas_Object focus out: %p %s\n", event_info, type); +} + +static void +_focus_obj(void *data, Evas_Object *o EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *newfocus = data; + const char *type = evas_object_type_get(newfocus); + if ((type) && (!strcmp(type, "elm_widget"))) + type = elm_object_widget_type_get(newfocus); + printf("elm_object_focus_set(%p, EINA_TRUE) %s\n", newfocus, type); + elm_object_focus_set(newfocus, EINA_TRUE); +} + +static void +_focus_layout_part(void *data, Evas_Object *o EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *ed = elm_layout_edje_get(data); + + Evas_Object *newfocus = (Evas_Object *)edje_object_part_object_get(ed, "sky"); + const char *type = evas_object_type_get(newfocus); + printf("evas_object_focus_set(%p, EINA_TRUE) %s\n", newfocus, type); + evas_object_focus_set(newfocus, EINA_TRUE);; +} + +void +test_focus2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *ly, *bt, *en, *en1, *bt1, *bt2; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("focus2", "Focus 2"); + elm_win_autodel_set(win, EINA_TRUE); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + + evas_event_callback_add + (evas_object_evas_get(win), EVAS_CALLBACK_CANVAS_OBJECT_FOCUS_IN, + _focus_in, NULL); + evas_event_callback_add + (evas_object_evas_get(win), EVAS_CALLBACK_CANVAS_OBJECT_FOCUS_OUT, + _focus_out, NULL); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + +#define PARENT bx /* this is broken, but should work */ +//#define PARENT win + + en = elm_entry_add(PARENT); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_object_text_set(en, "Entry that should get focus"); + elm_entry_single_line_set(en, EINA_TRUE); + evas_object_show(en); + elm_box_pack_end(bx, en); + + bt = elm_button_add(PARENT); + elm_object_text_set(bt, "Give focus to entry"); + evas_object_smart_callback_add(bt, "clicked", _focus_obj, en); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + ly = elm_layout_add(PARENT); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "layout"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, ly); + evas_object_show(ly); + + bt1 = bt = elm_button_add(ly); + elm_object_text_set(bt, "Button 1"); + elm_object_part_content_set(ly, "element1", bt); + + en1 = elm_entry_add(ly); + elm_entry_scrollable_set(en1, EINA_TRUE); + evas_object_size_hint_weight_set(en1, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en1, EVAS_HINT_FILL, 0.5); + elm_scroller_policy_set(en1, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_object_text_set(en1, "Scrolled Entry that should get focus"); + elm_entry_single_line_set(en1, EINA_TRUE); + elm_object_part_content_set(ly, "element2", en1); + + bt = elm_button_add(ly); + elm_object_text_set(bt, "Button 2"); + elm_object_part_content_set(ly, "element3", bt); + + bt = elm_button_add(PARENT); + elm_object_text_set(bt, "Give focus to layout"); + evas_object_smart_callback_add(bt, "clicked", _focus_obj, ly); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(PARENT); + elm_object_text_set(bt, "Give focus to layout part"); + evas_object_smart_callback_add(bt, "clicked", _focus_layout_part, ly); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(PARENT); + elm_object_text_set(bt, "Give focus to layout 'Button 1'"); + evas_object_smart_callback_add(bt, "clicked", _focus_obj, bt1); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt2 = elm_button_add(PARENT); + elm_object_text_set(bt2, "Give focus to layout 'Entry'"); + evas_object_smart_callback_add(bt2, "clicked", _focus_obj, en1); + evas_object_size_hint_weight_set(bt2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, bt2); + evas_object_show(bt2); + + elm_object_focus_next_object_set(bt2, en, ELM_FOCUS_DOWN); + + evas_object_resize(win, 400, 400); + evas_object_show(win); +} + +/**** focus hide/del ****/ + +static Evas_Object *foc = NULL; + +static void +_foc(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + foc = obj; + printf("foc -> %p\n", foc); +} + +static void +_unfoc(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + foc = NULL; + printf("foc -> %p\n", foc); +} + +static void +_add(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *bx = data, *en; + + en = elm_entry_add(elm_object_top_widget_get(bx)); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_object_text_set(en, "An entry"); + evas_object_smart_callback_add(en, "focused", _foc, NULL); + evas_object_smart_callback_add(en, "unfocused", _unfoc, NULL); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_entry_single_line_set(en, EINA_TRUE); + elm_box_pack_start(bx, en); + evas_object_show(en); +} + +static void +_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + if (foc) evas_object_del(foc); +} + +static void +_hide(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + if (foc) evas_object_hide(foc); +} + +void +test_focus_hide_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bt, *en; + + win = elm_win_util_standard_add("focus-hide-del", "Focus Hide/Del"); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_object_text_set(en, "An entry"); + evas_object_smart_callback_add(en, "focused", _foc, NULL); + evas_object_smart_callback_add(en, "unfocused", _unfoc, NULL); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_entry_single_line_set(en, EINA_TRUE); + elm_box_pack_end(bx, en); + evas_object_show(en); + + bt = elm_button_add(win); + elm_object_focus_allow_set(bt, EINA_FALSE); + elm_object_text_set(bt, "Add"); + evas_object_smart_callback_add(bt, "clicked", _add, bx); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_focus_allow_set(bt, EINA_FALSE); + elm_object_text_set(bt, "Del"); + evas_object_smart_callback_add(bt, "clicked", _del, NULL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_focus_allow_set(bt, EINA_FALSE); + elm_object_text_set(bt, "Hide"); + evas_object_smart_callback_add(bt, "clicked", _hide, NULL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} + +/**** focus 3 ****/ + +static Evas_Object * +create_button(Evas_Object *parent, const char *text, Eina_Bool expand) +{ + Evas_Object *btn = elm_button_add(parent); + elm_object_text_set(btn, text); + if (expand) + { + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + } + + evas_object_show(btn); + + return btn; +} + +static void +_focus_highlight_clip_disable_changed_cb(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Eina_Bool disable = elm_check_state_get(obj); + elm_config_focus_highlight_clip_disabled_set(disable); +} + +static void +_horizontal_btn(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *box_btn = data; + elm_box_horizontal_set(box_btn, elm_check_state_get(obj)); +} + +void +test_focus3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *box, *sc, *btn_top, *btn_down, *btn[20], *box_btn, *lb, *fr, *ck; + + char win_focus_theme[PATH_MAX] = { 0 }; + char item_name[PATH_MAX]; + int i; + + snprintf(win_focus_theme, sizeof(win_focus_theme), "%s/objects/test_focus_custom.edj", elm_app_data_dir_get()); + + elm_theme_extension_add(NULL, win_focus_theme); + + win = elm_win_util_standard_add("focus3", "Focus 3"); + elm_win_autodel_set(win, EINA_TRUE); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + elm_win_focus_highlight_animate_set(win, EINA_TRUE); + elm_win_focus_highlight_style_set(win, "glow"); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + fr = elm_frame_add(box); + elm_object_text_set(fr, "Focus Check Points"); + elm_box_pack_end(box, fr); + evas_object_show(fr); + + lb = elm_label_add(fr); + elm_object_text_set(lb, "<align=left>This test cases list down the" + " focus related check points for regression test.<br/>" + " 1. Focus cut for the first/last item by scroller<br/>" + " 2. Focus animation on the last item<br/>" + " 3. Focus goes out of view port while scrolling<br/>" + " 4. Sometimes focus moves but the area of focus does not change<br/>" + " e.g if focus is on 'top' and with down key it comes on Item1 <br/>" + " but the area is same as of top <br/>" + " </align>"); + elm_object_content_set(fr, lb); + evas_object_show(lb); + + btn_top = create_button(box, "top", EINA_FALSE); + elm_box_pack_end(box, btn_top); + + sc = elm_scroller_add(box); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, sc); + + box_btn = elm_box_add(sc); + evas_object_size_hint_weight_set(box_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_content_set(sc, box_btn); + evas_object_show(box_btn); + evas_object_show(sc); + + for (i = 0; i < 20; i++) + { + sprintf(item_name, "Item %d", i); + btn[i] = create_button(box_btn, item_name, EINA_TRUE); + elm_box_pack_end(box_btn, btn[i]); + } + + btn_down = create_button(box, "down", EINA_FALSE); + evas_object_show(btn_down); + elm_box_pack_end(box, btn_down); + + ck = elm_check_add(box); + elm_object_text_set(ck, "Focus Highlight Clip Disable"); + elm_check_state_set(ck, elm_config_focus_highlight_clip_disabled_get()); + elm_box_pack_end(box, ck); + evas_object_show(ck); + evas_object_smart_callback_add(ck, "changed", + _focus_highlight_clip_disable_changed_cb, + NULL); + + // Focus Autoscroll Mode + fr = _focus_autoscroll_mode_frame_create(box); + elm_box_pack_end(box, fr); + + ck = elm_check_add(box); + elm_object_text_set(ck, "Horizontal Mode"); + evas_object_smart_callback_add(ck, "changed", _horizontal_btn, box_btn); + elm_box_pack_end(box, ck); + evas_object_show(ck); + + evas_object_resize(win, 320, 500); + evas_object_show(win); +} + diff --git a/src/bin/elementary/test_focus_custom_chain.c b/src/bin/elementary/test_focus_custom_chain.c new file mode 100644 index 0000000000..c9d982b9c9 --- /dev/null +++ b/src/bin/elementary/test_focus_custom_chain.c @@ -0,0 +1,243 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void +highlight_enabled_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + elm_config_focus_highlight_enabled_set(elm_check_state_get(obj)); +} + +static void +highlight_animate_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + elm_config_focus_highlight_animate_set(elm_check_state_get(obj)); +} + +static void +win_highlight_enabled_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + elm_win_focus_highlight_enabled_set((Evas_Object *)data, + elm_check_state_get(obj)); +} + +static void +win_highlight_animate_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + elm_win_focus_highlight_animate_set((Evas_Object *)data, + elm_check_state_get(obj)); +} + +static void +custom_chain_unset_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *c, *child = NULL; + Evas_Object *bx = (Evas_Object *)data; + Eina_List *l, *children = NULL, *custom_chain = NULL; + int i = 0; + + if (elm_check_state_get(obj)) + { + children = elm_box_children_get(bx); + EINA_LIST_FOREACH(children, l, c) + { + if (i == 0) + { + child = c; + custom_chain = eina_list_append(custom_chain, c); + elm_object_focus_custom_chain_set(bx, custom_chain); + } + else if (i == 1) elm_object_focus_custom_chain_prepend(bx, c, child); + else if (i == 2) + { + elm_object_focus_custom_chain_append(bx, c, child); + child = c; + } + else if (i == 3) elm_object_focus_custom_chain_prepend(bx, c, child); + i++; + } + } + else + { + if (!elm_object_focus_custom_chain_get(bx)) return; + elm_object_focus_custom_chain_unset(bx); + } +} + +static void +create_win_bt_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *gd, *bt; + + win = elm_win_util_standard_add("test focus", "Test Focus"); + elm_win_autodel_set(win, EINA_TRUE); + + gd = elm_grid_add(win); + elm_grid_size_set(gd, 100, 100); + evas_object_size_hint_weight_set(gd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, gd); + evas_object_show(gd); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 1"); + elm_grid_pack(gd, bt, 10, 10, 80, 20); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 2"); + elm_grid_pack(gd, bt, 10, 30, 80, 20); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 3"); + elm_grid_pack(gd, bt, 10, 50, 80, 20); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 4"); + elm_grid_pack(gd, bt, 10, 70, 80, 20); + evas_object_show(bt); + + evas_object_resize(win, 160, 160); + evas_object_show(win); +} + +void +test_focus_custom_chain(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *fr, *bx, *bx2, *tg, *bt, *sp; + Evas_Object *lb, *bt1, *bt2, *bt3, *bt4; + Eina_List *custom_chain = NULL; + + elm_config_focus_highlight_enabled_set(EINA_TRUE); + elm_config_focus_highlight_animate_set(EINA_TRUE); + + win = elm_win_util_standard_add("focus-custom-chain", "Focus Custom Chain"); + elm_win_autodel_set(win, EINA_TRUE); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + elm_win_focus_highlight_animate_set(win, EINA_TRUE); + + fr = elm_frame_add(win); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, fr); + elm_object_style_set(fr, "pad_large"); + evas_object_show(fr); + + /* First Example - Using Focus Highlight */ + bx = elm_box_add(fr); + elm_object_content_set(fr, bx); + evas_object_show(bx); + + tg = elm_check_add(bx); + evas_object_size_hint_weight_set(tg, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(tg, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(tg, "Focus Highlight Enabled (Config)"); + elm_check_state_set(tg, elm_config_focus_highlight_enabled_get()); + evas_object_smart_callback_add(tg, "changed", highlight_enabled_cb, NULL); + elm_box_pack_end(bx, tg); + evas_object_show(tg); + + tg = elm_check_add(bx); + evas_object_size_hint_weight_set(tg, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(tg, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(tg, "Focus Highlight Animate (Config)"); + elm_check_state_set(tg, elm_config_focus_highlight_animate_get()); + evas_object_smart_callback_add(tg, "changed", highlight_animate_cb, NULL); + elm_box_pack_end(bx, tg); + evas_object_show(tg); + + tg = elm_check_add(bx); + evas_object_size_hint_weight_set(tg, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(tg, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(tg, "Focus Highlight Enabled (Win)"); + elm_check_state_set(tg, elm_win_focus_highlight_enabled_get(win)); + evas_object_smart_callback_add(tg, "changed", win_highlight_enabled_cb, win); + elm_box_pack_end(bx, tg); + evas_object_show(tg); + + tg = elm_check_add(bx); + evas_object_size_hint_weight_set(tg, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(tg, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(tg, "Focus Highlight Animate (Win)"); + elm_check_state_set(tg, elm_win_focus_highlight_enabled_get(win)); + evas_object_smart_callback_add(tg, "changed", win_highlight_animate_cb, win); + elm_box_pack_end(bx, tg); + evas_object_show(tg); + + bt = elm_button_add(bx); + elm_object_text_set(bt, "Create Window"); + evas_object_size_hint_weight_set(tg, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(tg, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bt); + evas_object_smart_callback_add(bt, "clicked", create_win_bt_clicked, NULL); + evas_object_show(bt); + + sp = elm_separator_add(bx); + elm_separator_horizontal_set(sp, EINA_TRUE); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + /* Second Example - Using Custom Chain */ + lb = elm_label_add(bx); + elm_object_text_set(lb, "Custom Chain: Please use tab key to check"); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bx2 = elm_box_add(bx); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bt1 = elm_button_add(bx2); + elm_object_text_set(bt1, "Button 1"); + evas_object_size_hint_weight_set(bt1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt1, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx2, bt1); + evas_object_show(bt1); + + bt2 = elm_button_add(bx2); + elm_object_text_set(bt2, "Button 2"); + evas_object_size_hint_weight_set(bt2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx2, bt2); + evas_object_show(bt2); + + bt3 = elm_button_add(bx2); + elm_object_text_set(bt3, "Button 3"); + evas_object_size_hint_weight_set(bt3, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt3, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx2, bt3); + evas_object_show(bt3); + + bt4 = elm_button_add(bx2); + elm_object_text_set(bt4, "Button 4"); + evas_object_size_hint_weight_set(bt4, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt4, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx2, bt4); + evas_object_show(bt4); + + custom_chain = eina_list_append(custom_chain, bt2); + custom_chain = eina_list_append(custom_chain, bt1); + custom_chain = eina_list_append(custom_chain, bt4); + custom_chain = eina_list_append(custom_chain, bt3); + elm_object_focus_custom_chain_set(bx2, custom_chain); + + tg = elm_check_add(bx); + elm_object_text_set(tg, "Custom Chain"); + evas_object_size_hint_weight_set(tg, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(tg, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_check_state_set(tg, EINA_TRUE); + evas_object_smart_callback_add(tg, "changed", custom_chain_unset_cb, bx2); + elm_box_pack_end(bx, tg); + evas_object_show(tg); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_focus_policy.c b/src/bin/elementary/test_focus_policy.c new file mode 100644 index 0000000000..66a424453a --- /dev/null +++ b/src/bin/elementary/test_focus_policy.c @@ -0,0 +1,150 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void +_rdg_changed_cb(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Evas_Object *bt = data; + int value = elm_radio_value_get(obj); + + // set focus move policy to the test button + switch (value) + { + case 0: + elm_object_text_set(bt, "Test Button (MOUSE CLICK or KEY)"); + elm_object_focus_move_policy_set(bt, ELM_FOCUS_MOVE_POLICY_CLICK); + break; + case 1: + elm_object_text_set(bt, "Test Button (MOUSE IN or KEY)"); + elm_object_focus_move_policy_set(bt, ELM_FOCUS_MOVE_POLICY_IN); + break; + case 2: + elm_object_text_set(bt, "Test Button (KEY ONLY)"); + elm_object_focus_move_policy_set(bt, ELM_FOCUS_MOVE_POLICY_KEY_ONLY); + break; + default: + break; + } +} + +void +test_focus_object_policy(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *fr, *fr2, *bx, *fr_bx, *bt, *test_bt, *lbl, *rdg, *rd; + + win = elm_win_util_standard_add("focus-object-policy", "Focus Object Policy"); + elm_win_autodel_set(win, EINA_TRUE); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + elm_win_focus_highlight_animate_set(win, EINA_TRUE); + elm_win_focus_highlight_style_set(win, "glow"); + + fr = elm_frame_add(win); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, fr); + elm_object_style_set(fr, "pad_large"); + evas_object_show(fr); + + bx = elm_box_add(fr); + elm_object_content_set(fr, bx); + evas_object_show(bx); + + /* frame 1 for normal buttons */ + { + fr2 = elm_frame_add(bx); + evas_object_size_hint_weight_set(fr2, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(fr2, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(fr2, "Focusable Buttons"); + elm_box_pack_end(bx, fr2); + evas_object_show(fr2); + + fr_bx = elm_box_add(fr2); + elm_object_content_set(fr2, fr_bx); + evas_object_show(fr_bx); + + bt = elm_button_add(fr_bx); + elm_object_text_set(bt, "Button 1"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(fr_bx, bt); + evas_object_show(bt); + elm_object_focus_set(bt, EINA_TRUE); + + bt = elm_button_add(fr_bx); + elm_object_text_set(bt, "Button 2"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(fr_bx, bt); + evas_object_show(bt); + + // a button to test focus object policy + test_bt = elm_button_add(fr_bx); + elm_object_text_set(test_bt, "Test Button (MOUSE CLICK or KEY)"); + evas_object_size_hint_weight_set(test_bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(test_bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(fr_bx, test_bt); + evas_object_show(test_bt); + + elm_object_focus_move_policy_set(bt, ELM_FOCUS_MOVE_POLICY_CLICK); + bt = elm_button_add(fr_bx); + elm_object_text_set(bt, "Button 4"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(fr_bx, bt); + evas_object_show(bt); + } + + /* a frame 2 for the test button */ + { + fr2 = elm_frame_add(bx); + evas_object_size_hint_weight_set(fr2, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(fr2, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(fr2, "Focus Options for a TEST button"); + elm_box_pack_end(bx, fr2); + evas_object_show(fr2); + + fr_bx = elm_box_add(fr2); + elm_object_content_set(fr2, fr_bx); + evas_object_show(fr_bx); + + lbl = elm_label_add(fr_bx); + evas_object_size_hint_weight_set(lbl, EVAS_HINT_EXPAND, 0); + elm_object_text_set(lbl, "This focus option will be applied only for a TEST button. <br/>The focus policies of other buttons will be remain in MOUSE CLICK status."); + elm_box_pack_end(fr_bx, lbl); + evas_object_show(lbl); + + // radios to select focus object policy + rd = elm_radio_add(fr_bx); + elm_radio_state_value_set(rd, 0); + evas_object_size_hint_align_set(rd, 0.0, 0.5); + elm_object_text_set(rd, "Focus Move Pollicy Mouse Click"); + elm_box_pack_end(fr_bx, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, test_bt); + + rdg = rd; + + rd = elm_radio_add(fr_bx); + elm_radio_state_value_set(rd, 1); + elm_radio_group_add(rd, rdg); + evas_object_size_hint_align_set(rd, 0.0, 0.5); + elm_object_text_set(rd, "Focus Move Policy Mouse In"); + elm_box_pack_end(fr_bx, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, test_bt); + + rd = elm_radio_add(fr_bx); + elm_radio_state_value_set(rd, 2); + elm_radio_group_add(rd, rdg); + evas_object_size_hint_align_set(rd, 0.0, 0.5); + elm_object_text_set(rd, "Focus Move Pollicy Key Only"); + elm_box_pack_end(fr_bx, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, test_bt); + } + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_focus_style.c b/src/bin/elementary/test_focus_style.c new file mode 100644 index 0000000000..62f632ab14 --- /dev/null +++ b/src/bin/elementary/test_focus_style.c @@ -0,0 +1,234 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void +glow_effect_on_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *chk = evas_object_data_get(obj, "glow_is_enable"); + + if (elm_check_state_get(chk)) elm_win_focus_highlight_style_set(data, "glow_effect"); +} + +static void +glow_effect_off_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *chk = evas_object_data_get(obj, "glow_is_enable"); + + if (elm_check_state_get(chk)) elm_win_focus_highlight_style_set(data, "glow"); +} + +void +test_focus_style(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *fr, *bx, *bx2, *bt, *spinner, *sp, *chk; + char win_focus_theme[PATH_MAX] = { 0 }; + + sprintf(win_focus_theme, "%s/objects/test_focus_style.edj", elm_app_data_dir_get()); + elm_theme_extension_add(NULL, win_focus_theme); + + win = elm_win_util_standard_add("focus-style", "Focus Style"); + elm_win_autodel_set(win, EINA_TRUE); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + elm_win_focus_highlight_animate_set(win, EINA_TRUE); + elm_win_focus_highlight_style_set(win, "glow"); + + fr = elm_frame_add(win); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, fr); + elm_object_style_set(fr, "pad_large"); + evas_object_show(fr); + + bx = elm_box_add(fr); + elm_object_content_set(fr, bx); + evas_object_show(bx); + + chk = elm_check_add(bx); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(chk, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(chk, "Enable glow effect on \"Glow\" Button"); + elm_check_state_set(chk, EINA_TRUE); + elm_box_pack_end(bx, chk); + evas_object_show(chk); + + spinner = elm_spinner_add(bx); + evas_object_size_hint_weight_set(spinner, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(spinner, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, spinner); + evas_object_show(spinner); + + bt = elm_button_add(bx); + elm_object_text_set(bt, "Glow Button"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bt); + evas_object_smart_callback_add(bt, "focused", glow_effect_on_cb, win); + evas_object_smart_callback_add(bt, "unfocused", glow_effect_off_cb, win); + evas_object_data_set(bt, "glow_is_enable", chk); + evas_object_show(bt); + + sp = elm_separator_add(bx); + elm_separator_horizontal_set(sp, EINA_TRUE); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + bx2 = elm_box_add(bx); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bt = elm_button_add(bx2); + elm_object_text_set(bt, "Button 1"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(bx2); + elm_object_text_set(bt, "Button 2"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(bx2); + elm_object_text_set(bt, "Button 3"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(bx2); + elm_object_text_set(bt, "Button 4"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} + +void +test_focus_part(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *fr, *bx, *chk, *layout, *ic, *btn; + char win_focus_theme[PATH_MAX] = {0}, buf[PATH_MAX] = {0}; + + sprintf(win_focus_theme, "%s/objects/test_focus_style.edj", elm_app_data_dir_get()); + elm_theme_extension_add(NULL, win_focus_theme); + + win = elm_win_util_standard_add("focus_part", "Focus On Part"); + elm_win_autodel_set(win, EINA_TRUE); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + elm_win_focus_highlight_animate_set(win, EINA_TRUE); + + fr = elm_frame_add(win); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, fr); + elm_object_style_set(fr, "pad_large"); + evas_object_show(fr); + + bx = elm_box_add(fr); + elm_object_content_set(fr, bx); + evas_object_show(bx); + + chk = elm_check_add(bx); + elm_object_style_set(chk, "focus_text"); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(chk, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(chk, "Focus highlight on text part only"); + elm_check_state_set(chk, EINA_TRUE); + elm_box_pack_end(bx, chk); + evas_object_show(chk); + + layout = elm_layout_add(bx); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(chk, EVAS_HINT_FILL, EVAS_HINT_FILL); + if (!elm_layout_theme_set(layout, "layout", "focus", "example")) + printf("error setting focus example layout\n"); + elm_box_pack_end(bx, layout); + elm_object_focus_allow_set(layout, EINA_TRUE); + evas_object_show(layout); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + btn = elm_button_add(win); + elm_object_style_set(btn, "focus_icon"); + elm_object_text_set(btn, "Focus highlight on icon part only"); + elm_object_part_content_set(btn, "icon", ic); + elm_box_pack_end(bx, btn); + evas_object_show(btn); + + btn = elm_button_add(win); + elm_object_text_set(btn, "Button"); + elm_box_pack_end(bx, btn); + evas_object_show(btn); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} + +void +test_focus_object_style(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *fr, *bx, *bt; + char win_focus_theme[PATH_MAX] = { 0 }; + + snprintf(win_focus_theme, sizeof(win_focus_theme), "%s/objects/test_focus_custom.edj", elm_app_data_dir_get()); + elm_theme_extension_add(NULL, win_focus_theme); + + win = elm_win_util_standard_add("object-focus-style", "Object Focus Style"); + elm_win_autodel_set(win, EINA_TRUE); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + elm_win_focus_highlight_animate_set(win, EINA_TRUE); + + fr = elm_frame_add(win); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, fr); + elm_object_style_set(fr, "pad_large"); + evas_object_show(fr); + + bx = elm_box_add(fr); + elm_object_content_set(fr, bx); + evas_object_show(bx); + + bt = elm_button_add(bx); + elm_object_text_set(bt, "Button 1"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(bx); + elm_object_text_set(bt, "Button 2"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(bx); + elm_object_text_set(bt, "Button Glow In Focus Style"); + elm_object_focus_highlight_style_set(bt, "glow"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(bx); + elm_object_text_set(bt, "Button 4"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_gengrid.c b/src/bin/elementary/test_gengrid.c new file mode 100644 index 0000000000..4a106d53c4 --- /dev/null +++ b/src/bin/elementary/test_gengrid.c @@ -0,0 +1,2231 @@ +#include <Elementary_Cursor.h> +#include "test.h" +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +Evas_Object * _focus_autoscroll_mode_frame_create(Evas_Object *parent); + +static Elm_Gengrid_Item_Class *gic, *ggic; + +Evas_Object *grid_content_get(void *data, Evas_Object *obj, const char *part); +char *grid_text_get(void *data, Evas_Object *obj EINA_UNUSED, + const char *part EINA_UNUSED); +Eina_Bool grid_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + const char *part EINA_UNUSED); +void grid_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED); + +typedef struct _Item_Data +{ + Elm_Object_Item *item; + const char *path; + int mode; + int onoff; +} Item_Data; + +struct _api_data +{ + unsigned int state; /* What state we are testing */ + Evas_Object *box; /* Use this to get box content */ + Evas_Object *grid; + Evas_Object *grid2; + Elm_Gengrid_Item_Field_Type field_type; +}; +typedef struct _api_data api_data; + +struct _Show_Data +{ + int scrollto; + Evas_Object *grid; +}; +typedef struct _Show_Data Show_Data; + +enum _api_state +{ + GRID_ALIGN_SET, + GRID_BRING_IN, + GRID_NO_SELECT_MODE, + GRID_NO_BOUNCE, + GRID_PAGE_RELATIVE, + GRID_PAGE_SIZE, + GRID_TOOLTIP_SET_TEXT, + GRID_TOOLTIP_UNSET, + GRID_ITEM_CLASS_SET, + GRID_ITEM_UPDATE_SET, + GRID_PAGE_BRING_IN, + GRID_PAGE_SHOW, + GRID_TOOLTIP_CONTENT_CB, + GRID_TOOLTIP_STYLE_SET, + GRID_TOOLTIP_WINDOW_MODE_SET, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + Evas_Object *grid = api->grid; + + /* use elm_box_children_get() to get list of children */ + switch(api->state) + { /* Put all api-changes under switch */ + case GRID_ALIGN_SET: /* 0 */ + elm_gengrid_align_set(grid, 0.2, 0.8); + break; + + case GRID_BRING_IN: /* 1 */ + elm_gengrid_item_bring_in(elm_gengrid_first_item_get(grid), ELM_GENGRID_ITEM_SCROLLTO_IN); + break; + + case GRID_NO_SELECT_MODE: /* 2 */ + elm_gengrid_select_mode_set(grid, ELM_OBJECT_SELECT_MODE_NONE); + break; + + case GRID_NO_BOUNCE: /* 3 */ + elm_scroller_bounce_set(grid, EINA_TRUE, EINA_FALSE); + break; + + case GRID_PAGE_RELATIVE: /* 4 */ + elm_scroller_bounce_set(grid, EINA_TRUE, EINA_TRUE); + elm_scroller_page_relative_set(grid, 0.5, 0.5); + break; + + case GRID_PAGE_SIZE: /* 5 */ + elm_scroller_page_size_set(grid, 50, 25); + break; + + case GRID_TOOLTIP_SET_TEXT: /* 6 */ + { + Elm_Object_Item *item = elm_gengrid_first_item_get(grid); + elm_gengrid_item_tooltip_text_set(item, "This is the first item"); + } + break; + + case GRID_TOOLTIP_UNSET: /* 7 */ + { + Elm_Object_Item *item = elm_gengrid_first_item_get(grid); + elm_gengrid_item_tooltip_unset(item); + } + break; + + case API_STATE_LAST: + break; + + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(obj, str); + elm_object_disabled_set(obj, a->state == API_STATE_LAST); +} + +static const char *img[9] = +{ + "panel_01.jpg", + "plant_01.jpg", + "rock_01.jpg", + "rock_02.jpg", + "sky_01.jpg", + "sky_02.jpg", + "sky_03.jpg", + "sky_04.jpg", + "wood_01.jpg", +}; + +static const char *cur[4] = +{ + ELM_CURSOR_CIRCLE, + ELM_CURSOR_CLOCK, + ELM_CURSOR_COFFEE_MUG, + ELM_CURSOR_CROSS, +}; + +static int n_current_pic = 0; +static void +_horizontal_grid(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *grid = data; + elm_gengrid_horizontal_set(grid, elm_check_state_get(obj)); +} + +static void +_item_loop_enable_changed_cb(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Evas_Object *grid = data; + elm_object_scroll_item_loop_enabled_set(grid, elm_check_state_get(obj)); +} + +static void +_focus_highlight_changed_cb(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_win_focus_highlight_enabled_set(data, elm_check_state_get(obj)); +} + +static void +grid_drag_up(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("Drag up: %p\n", event_info); +} + +static void +grid_drag_right(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("Drag right: %p\n", event_info); +} + +static void +grid_drag_down(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("Drag down: %p\n", event_info); +} + +static void +grid_drag_left(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("Drag left: %p\n", event_info); +} + +static void +grid_drag_stop(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("Drag stop: %p\n", event_info); +} + +static void +grid_selected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("Selected: %p\n", event_info); +} + +static void +grid_unselected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("Unselected: %p\n", event_info); +} + +static void +grid_double_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("Double clicked: %p\n", event_info); +} + +static void +grid_right_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("Right clicked: %p\n", event_info); +} + +static void +grid_longpressed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("longpressed %p\n", event_info); +} + +static void +grid_pressed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("pressed %p\n", event_info); +} + +static void +grid_released(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("released %p\n", event_info); +} + +static void +grid_moved(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("moved %p\n", event_info); +} + +static void +grid_item_check_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Item_Data *id = data; + id->onoff = elm_check_state_get(obj); + printf("item %p onoff = %i\n", id, id->onoff); +} + +char * +grid_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + const Item_Data *id = data; + char buf[256]; + snprintf(buf, sizeof(buf), "Photo %s", id->path); + return strdup(buf); +} + +Evas_Object * +grid_content_get(void *data, Evas_Object *obj, const char *part) +{ + const Item_Data *id = data; + if (!strcmp(part, "elm.swallow.icon")) + { + Evas_Object *image = elm_image_add(obj); + elm_image_file_set(image, id->path, NULL); + elm_image_aspect_fixed_set(image, EINA_FALSE); + evas_object_show(image); + return image; + } + else if (!strcmp(part, "elm.swallow.end")) + { + Evas_Object *ck = elm_check_add(obj); + evas_object_propagate_events_set(ck, EINA_FALSE); + elm_check_state_set(ck, id->onoff); + evas_object_smart_callback_add(ck, "changed", grid_item_check_changed, data); + evas_object_show(ck); + return ck; + } + return NULL; +} + +Eina_Bool +grid_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + return EINA_FALSE; +} + +void +grid_del(void *data, Evas_Object *obj EINA_UNUSED) +{ + free(data); +} + +static void +grid_sel(void *data, Evas_Object *obj, void *event_info) +{ + printf("sel item data [%p] on grid obj [%p], pointer [%p], position [%d]\n", data, obj, event_info, elm_gengrid_item_index_get(event_info)); +} + +static void +_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + free(data); +} + +static void +reorder_mode_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + elm_gengrid_reorder_mode_set(data, elm_check_state_get(obj)); +} + +static void +always_select_mode_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + if (elm_check_state_get(obj)) + elm_gengrid_select_mode_set(data, ELM_OBJECT_SELECT_MODE_ALWAYS); + else + elm_gengrid_select_mode_set(data, ELM_OBJECT_SELECT_MODE_DEFAULT); +} + +static void +multi_select_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + elm_gengrid_multi_select_set(data, elm_check_state_get(obj)); +} + +static void +wheel_disable_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + elm_gengrid_wheel_disabled_set(data, elm_check_state_get(obj)); +} + +static void +clear_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + api_data *api = data; + elm_gengrid_clear(api->grid); +} + +static Evas_Object * +create_gengrid(Evas_Object *obj, int items) +{ + Evas_Object *grid = NULL; + Item_Data *id = NULL; + int i, n; + char buf[PATH_MAX]; + + grid = elm_gengrid_add(obj); + elm_gengrid_item_size_set(grid, ELM_SCALE_SIZE(200), ELM_SCALE_SIZE(150)); + evas_object_smart_callback_add(grid, "selected", grid_selected, NULL); + evas_object_smart_callback_add(grid, "unselected", grid_unselected, NULL); + evas_object_smart_callback_add(grid, "clicked,double", grid_double_clicked, NULL); + evas_object_smart_callback_add(grid, "clicked,right", grid_right_clicked, NULL); + evas_object_smart_callback_add(grid, "longpressed", grid_longpressed, NULL); + evas_object_smart_callback_add(grid, "pressed", grid_pressed, NULL); + evas_object_smart_callback_add(grid, "released", grid_released, NULL); + evas_object_smart_callback_add(grid, "moved", grid_moved, NULL); + evas_object_smart_callback_add(grid, "drag,start,up", grid_drag_up, NULL); + evas_object_smart_callback_add(grid, "drag,start,right", grid_drag_right, NULL); + evas_object_smart_callback_add(grid, "drag,start,down", grid_drag_down, NULL); + evas_object_smart_callback_add(grid, "drag,start,left", grid_drag_left, NULL); + evas_object_smart_callback_add(grid, "drag,stop", grid_drag_stop, NULL); + 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); + + gic = elm_gengrid_item_class_new(); + gic->item_style = "default"; + gic->func.text_get = grid_text_get; + gic->func.content_get = grid_content_get; + gic->func.state_get = grid_state_get; + gic->func.del = grid_del; + + n = 0; + for (i = 0; i < items; i++) + { + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]); + n = (n + 1) % 9; + id = calloc(1, sizeof(Item_Data)); + id->mode = i; + id->path = eina_stringshare_add(buf); + id->item = elm_gengrid_item_append(grid, gic, id, grid_sel, NULL); + if (!(i % 5)) + elm_gengrid_item_selected_set(id->item, EINA_TRUE); + } + elm_gengrid_item_class_free(gic); + + return grid; +} + +static void +restore_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + api_data *api = data; + elm_box_clear(api->box); + api->grid = create_gengrid(obj, (12 * 12)); + elm_box_pack_end(api->box, api->grid); + evas_object_show(api->grid); +} + +static void +filled_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *box = (Evas_Object *)data; + Evas_Object *grid; + + elm_box_clear(box); + grid = create_gengrid(box, 1); + elm_gengrid_filled_set(grid, elm_check_state_get(obj)); + elm_box_pack_end(box, grid); + evas_object_show(grid); +} + +static void +filled_bt_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *box, *content_box, *grid, *tg; + + win = elm_win_util_standard_add("test filled", "Test Filled"); + elm_win_autodel_set(win, EINA_TRUE); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + content_box = elm_box_add(win); + evas_object_size_hint_weight_set(content_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, content_box); + elm_box_pack_end(box, content_box); + evas_object_show(content_box); + + grid = create_gengrid(win, 1); + elm_box_pack_end(content_box, grid); + evas_object_show(grid); + + tg = elm_check_add(win); + elm_object_text_set(tg, "Filled"); + evas_object_smart_callback_add(tg, "changed", filled_cb, content_box); + elm_box_pack_end(box, tg); + evas_object_show(tg); + + evas_object_resize(win, 450, 200); + evas_object_show(win); +} + +static void +cursor_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *grid = (Evas_Object *)data; + Elm_Object_Item *item = NULL; + int i = 0; + + for ((item = elm_gengrid_first_item_get(grid)); item; + (item = elm_gengrid_item_next_get(item))) + { + if (!elm_check_state_get(obj)) + { + elm_gengrid_item_cursor_unset(item); + continue; + } + + elm_gengrid_item_cursor_set(item, cur[i]); + elm_gengrid_item_cursor_engine_only_set(item, EINA_FALSE); + i++; + } +} + +static void +cursor_bt_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *box, *content_box, *hbox, *grid, *tg; + + win = elm_win_util_standard_add("test cursor", "Test Cursor"); + elm_win_autodel_set(win, EINA_TRUE); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + content_box = elm_box_add(win); + evas_object_size_hint_weight_set(content_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, content_box); + elm_box_pack_end(box, content_box); + evas_object_show(content_box); + + grid = create_gengrid(win, 4); + elm_box_pack_end(content_box, grid); + evas_object_show(grid); + + hbox = elm_box_add(win); + elm_box_horizontal_set(hbox, EINA_TRUE); + + tg = elm_check_add(win); + elm_object_text_set(tg, "Cursor"); + evas_object_smart_callback_add(tg, "changed", cursor_cb, grid); + elm_box_pack_end(hbox, tg); + evas_object_show(tg); + + elm_box_pack_end(box, hbox); + evas_object_show(hbox); + + evas_object_resize(win, 450, 450); + evas_object_show(win); +} + +static void +_btn_bring_in_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + if (!data) return; + Elm_Object_Item *it = elm_gengrid_selected_item_get(data); + if (!it) return; + elm_gengrid_item_bring_in(it, ELM_GENGRID_ITEM_SCROLLTO_IN); +} + +static void +_btn_show_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + if (!data) return; + Elm_Object_Item *it = elm_gengrid_selected_item_get(data); + if (!it) return; + elm_gengrid_item_show(it, ELM_GENGRID_ITEM_SCROLLTO_IN); +} + +void +test_gengrid(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bt, *bxx, *bx, *ck; + api_data *api = calloc(1, sizeof(api_data)); + + win = elm_win_util_standard_add("gengrid", "GenGrid"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + api->box = bxx = elm_box_add(win); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bxx); + evas_object_show(bxx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Next API function"); + evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *)api); + elm_box_pack_end(bxx, bt); + elm_object_disabled_set(bt, api->state == API_STATE_LAST); + evas_object_show(bt); + + /* Create GenGrid */ + api->grid = create_gengrid(win, (12 * 12)); + elm_box_pack_end(bxx, api->grid); + evas_object_show(api->grid); + + /* Gengrid Options 1 */ + bx = elm_box_add(win); + elm_box_horizontal_set(bx, EINA_TRUE); + elm_box_pack_end(bxx, bx); + evas_object_show(bx); + + ck = elm_check_add(win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(ck, "Reorder mode enable"); + evas_object_smart_callback_add(ck, "changed", reorder_mode_cb, + api->grid); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + ck = elm_check_add(win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(ck, "Always Select Mode"); + evas_object_smart_callback_add(ck, "changed", always_select_mode_cb, + api->grid); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + ck = elm_check_add(win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(ck, "Multi Select Mode"); + elm_check_state_set(ck, EINA_TRUE); + elm_gengrid_multi_select_set(api->grid, EINA_TRUE); + evas_object_smart_callback_add(ck, "changed", multi_select_cb, + api->grid); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + ck = elm_check_add(win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(ck, "Wheel Disable"); + evas_object_smart_callback_add(ck, "changed", wheel_disable_cb, + api->grid); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + /* Gengrid Options 2 */ + bx = elm_box_add(win); + elm_box_horizontal_set(bx, EINA_TRUE); + elm_box_pack_end(bxx, bx); + evas_object_show(bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Clear"); + evas_object_smart_callback_add(bt, "clicked", clear_bt_clicked, + (void *)api); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Restore"); + evas_object_smart_callback_add(bt, "clicked", restore_bt_clicked, + (void *) api); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Check Filled"); + evas_object_smart_callback_add(bt, "clicked", filled_bt_clicked, NULL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Check Cursor"); + evas_object_smart_callback_add(bt, "clicked", cursor_bt_clicked, + (void *) api); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Bring in"); + evas_object_smart_callback_add(bt, "clicked", _btn_bring_in_clicked_cb, api->grid); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Show"); + evas_object_smart_callback_add(bt, "clicked", _btn_show_clicked_cb, api->grid); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + evas_object_resize(win, 600, 600); + evas_object_show(win); +} + +static void +_before_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Item_Data *id; + Evas_Object *grid = data; + Elm_Object_Item *sel; + char buf[PATH_MAX]; + + sel = elm_gengrid_selected_item_get(grid); + if (!sel) + return; + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n_current_pic]); + n_current_pic = ((n_current_pic +1) % 9); + id = calloc(1, sizeof(*id)); + id->mode = 0; + id->path = eina_stringshare_add(buf); + id->item = elm_gengrid_item_insert_before(grid, gic, id, sel, grid_sel, + NULL); +} + +static int +compare_cb(const void *data1, const void *data2) +{ + Item_Data *ti1 = elm_object_item_data_get(data1); + Item_Data *ti2 = elm_object_item_data_get(data2); + return strlen(ti1->path) - strlen(ti2->path); +} + +static void +_sorted_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Item_Data *id; + Evas_Object *grid = data; + char buf[PATH_MAX]; + + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n_current_pic]); + n_current_pic = ((n_current_pic +1) % 9); + id = calloc(1, sizeof(*id)); + id->mode = 0; + id->path = eina_stringshare_add(buf); + id->item = elm_gengrid_item_sorted_insert(grid, gic, id, compare_cb, grid_sel, + NULL); +} + +static void +_after_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Item_Data *id; + Evas_Object *grid = data; + Elm_Object_Item *sel; + char buf[PATH_MAX]; + + sel = elm_gengrid_selected_item_get(grid); + if (!sel) + return; + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n_current_pic]); + n_current_pic = ((n_current_pic +1) % 9); + id = calloc(1, sizeof(*id)); + id->mode = 0; + id->path = eina_stringshare_add(buf); + id->item = elm_gengrid_item_insert_after(grid, gic, id, sel, grid_sel, + NULL); +} + +static void +_delete_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *grid = data; + Eina_List *l, *l2, *l3; + Elm_Object_Item *gg_it; + + l = (Eina_List*)elm_gengrid_selected_items_get(grid); + if (!l) return; + EINA_LIST_FOREACH_SAFE(l, l2, l3, gg_it) + elm_object_item_del(gg_it); +} + +static void +_prepend_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Item_Data *id; + Evas_Object *grid = data; + char buf[PATH_MAX]; + + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n_current_pic]); + n_current_pic = ((n_current_pic +1) % 9); + id = calloc(1, sizeof(*id)); + id->mode = 0; + id->path = eina_stringshare_add(buf); + id->item = elm_gengrid_item_prepend(grid, gic, id, grid_sel, NULL); + if (id->item) elm_gengrid_item_show(id->item, ELM_GENGRID_ITEM_SCROLLTO_IN); +} + +static void +_append_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Item_Data *id; + Evas_Object *grid = data; + char buf[PATH_MAX]; + + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n_current_pic]); + n_current_pic = ((n_current_pic +1) % 9); + id = calloc(1, sizeof(*id)); + id->mode = 0; + id->path = eina_stringshare_add(buf); + id->item = elm_gengrid_item_append(grid, gic, id, grid_sel, NULL); + if (id->item) elm_gengrid_item_show(id->item, ELM_GENGRID_ITEM_SCROLLTO_IN); +} + +static void +_size_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *grid = data; + int size = elm_spinner_value_get(obj); + elm_gengrid_item_size_set(grid, ELM_SCALE_SIZE(size), ELM_SCALE_SIZE(size)); +} + +static void +_gg_focus_item_select_on_focus_disable_changed_cb(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info + EINA_UNUSED) +{ + elm_config_item_select_on_focus_disabled_set(elm_check_state_get(obj)); +} + +static void +_grid_mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, + Evas_Object *obj, void *event_info) +{ + Elm_Object_Item *it; + Evas_Event_Mouse_Down *m_info = event_info; + + if (m_info->button == 1) + { + printf("mouse at (%d, %d), ", m_info->canvas.x, m_info->canvas.y); + it = elm_gengrid_at_xy_item_get(obj, m_info->canvas.x, m_info->canvas.y, NULL, NULL); + printf("Item found : %p\n", it); + } +} + +void +test_gengrid2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *grid, *bx, *hbx, *bt, *ck; + + win = elm_win_util_standard_add("gengrid2", "GenGrid 2"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + grid = elm_gengrid_add(win); + elm_gengrid_item_size_set(grid, ELM_SCALE_SIZE(150), ELM_SCALE_SIZE(150)); + elm_gengrid_multi_select_set(grid, EINA_FALSE); + evas_object_smart_callback_add(grid, "selected", grid_selected, NULL); + evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_min_set(grid, 600, 500); + elm_box_pack_end(bx, grid); + evas_object_event_callback_add(grid, EVAS_CALLBACK_MOUSE_DOWN, + _grid_mouse_down_cb, NULL); + evas_object_show(grid); + + hbx = elm_box_add(win); + evas_object_size_hint_weight_set(hbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_horizontal_set(hbx, EINA_TRUE); + elm_box_pack_end(bx, hbx); + evas_object_show(hbx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Append"); + evas_object_smart_callback_add(bt, "clicked", _append_bt_clicked, grid); + elm_box_pack_end(hbx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Prepend"); + evas_object_smart_callback_add(bt, "clicked", _prepend_bt_clicked, grid); + elm_box_pack_end(hbx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Insert before"); + evas_object_smart_callback_add(bt, "clicked", _before_bt_clicked, grid); + elm_box_pack_end(hbx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Insert after"); + evas_object_smart_callback_add(bt, "clicked", _after_bt_clicked, grid); + elm_box_pack_end(hbx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Sorted insert"); + evas_object_smart_callback_add(bt, "clicked", _sorted_bt_clicked, grid); + elm_box_pack_end(hbx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Delete"); + evas_object_smart_callback_add(bt, "clicked", _delete_bt_clicked, grid); + elm_box_pack_end(hbx, bt); + evas_object_show(bt); + + bt = elm_spinner_add(win); + elm_spinner_min_max_set(bt, 10, 1024); + elm_spinner_value_set(bt, 150); + elm_spinner_label_format_set(bt, "Item size: %.0f"); + evas_object_smart_callback_add(bt, "changed", _size_changed, grid); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(hbx, bt); + evas_object_show(bt); + + ck = elm_check_add(win); + elm_object_text_set(ck, "Reorder mode enable"); + evas_object_smart_callback_add(ck, "changed", reorder_mode_cb, grid); + elm_box_pack_end(hbx, ck); + evas_object_show(ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "Horizontal Mode"); + evas_object_smart_callback_add(ck, "changed", _horizontal_grid, grid); + elm_box_pack_end(hbx, ck); + evas_object_show(ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "Item loop enable"); + evas_object_smart_callback_add(ck, "changed", _item_loop_enable_changed_cb, grid); + elm_box_pack_end(hbx, ck); + evas_object_show(ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "Focus Highlight Set"); + evas_object_smart_callback_add(ck, "changed", _focus_highlight_changed_cb, win); + elm_box_pack_end(hbx, ck); + evas_object_show(ck); + + ck = elm_check_add(hbx); + elm_object_text_set(ck, "Item Select on Focus disable"); + elm_check_state_set(ck, elm_config_item_select_on_focus_disabled_get()); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(ck, "changed", + _gg_focus_item_select_on_focus_disable_changed_cb, + NULL); + elm_box_pack_end(hbx, ck); + evas_object_show(ck); + + + gic = elm_gengrid_item_class_new(); + gic->item_style = "default"; + gic->func.text_get = grid_text_get; + gic->func.content_get = grid_content_get; + gic->func.state_get = grid_state_get; + gic->func.del = grid_del; + + /* item_class_ref is needed for gic. some items can be added in callbacks */ + elm_gengrid_item_class_ref(gic); + elm_gengrid_item_class_free(gic); + + evas_object_resize(win, 600, 600); + evas_object_show(win); +} + +void +test_gengrid3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *grid; + static Item_Data id[144]; + int i, n; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("gengrid_group", "GenGrid Group"); + elm_win_autodel_set(win, EINA_TRUE); + + grid = elm_gengrid_add(win); + evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, grid); + elm_gengrid_item_size_set(grid, ELM_SCALE_SIZE(150), ELM_SCALE_SIZE(150)); + elm_gengrid_group_item_size_set(grid, ELM_SCALE_SIZE(31), ELM_SCALE_SIZE(31)); + elm_gengrid_multi_select_set(grid, EINA_TRUE); + evas_object_smart_callback_add(grid, "selected", grid_selected, NULL); + evas_object_smart_callback_add(grid, "clicked,double", grid_double_clicked, NULL); + evas_object_smart_callback_add(grid, "longpressed", grid_longpressed, NULL); + evas_object_smart_callback_add(grid, "moved", grid_moved, NULL); + evas_object_smart_callback_add(grid, "drag,start,up", grid_drag_up, NULL); + evas_object_smart_callback_add(grid, "drag,start,right", grid_drag_right, NULL); + evas_object_smart_callback_add(grid, "drag,start,down", grid_drag_down, NULL); + evas_object_smart_callback_add(grid, "drag,start,left", grid_drag_left, NULL); + evas_object_smart_callback_add(grid, "drag,stop", grid_drag_stop, NULL); + + gic = elm_gengrid_item_class_new(); + gic->item_style = "default"; + gic->func.text_get = grid_text_get; + gic->func.content_get = grid_content_get; + gic->func.state_get = grid_state_get; + gic->func.del = NULL; + + ggic = elm_gengrid_item_class_new(); + ggic->item_style = "group_index"; + ggic->func.text_get = grid_text_get; + ggic->func.content_get = NULL; + ggic->func.state_get = NULL; + ggic->func.del = NULL; + + n = 0; + for (i = 0; i < 12 * 12; i++) + { + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]); + n = (n + 1) % 9; + id[i].mode = i; + id[i].path = eina_stringshare_add(buf); + if (i == 0 || i == 18 || i == 53 || i == 100) + //if (i == 0 || i == 18) + id[i].item = elm_gengrid_item_append(grid, ggic, &(id[i]), grid_sel, NULL); + else + id[i].item = elm_gengrid_item_append(grid, gic, &(id[i]), grid_sel, NULL); + if (!(i % 5)) + elm_gengrid_item_selected_set(id[i].item, EINA_TRUE); + } + elm_gengrid_item_class_free(gic); + elm_gengrid_item_class_free(ggic); + + evas_object_show(grid); + + evas_object_resize(win, 600, 600); + evas_object_show(win); +} + +/* test gengrid item styles */ + +static Evas_Object * +_gengrid_create(Evas_Object *obj, int items, const char *style) +{ + static Evas_Object *grid = NULL; + Elm_Gengrid_Item_Class *ic; + Item_Data *id; + int i, n; + char buf[PATH_MAX]; + + if (grid) + elm_gengrid_clear(grid); + else + { + if (!obj) return NULL; + grid = elm_gengrid_add(obj); + elm_gengrid_item_size_set(grid, ELM_SCALE_SIZE(150), ELM_SCALE_SIZE(150)); + 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); + } + + ic = elm_gengrid_item_class_new(); + if (style) ic->item_style = style; + else ic->item_style = "default"; + ic->func.text_get = grid_text_get; + ic->func.content_get = grid_content_get; + ic->func.state_get = NULL; + ic->func.del = grid_del; + + n = 0; + for (i = 0; i < items; i++) + { + id = calloc(1, sizeof(Item_Data)); + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]); + n = (n + 1) % 9; + id->mode = i; + id->path = eina_stringshare_add(buf); + id->item = elm_gengrid_item_append(grid, ic, id, NULL, NULL); + } + elm_gengrid_item_class_free(ic); + + return grid; +} + +static void +_item_style_sel_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + _gengrid_create(NULL, (12*12), data); +} + +static Evas_Object * +_item_styles_list_create(Evas_Object *parent) +{ + Evas_Object *list; + + list = elm_list_add(parent); + 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); + elm_list_item_append(list, "default", NULL, NULL, + _item_style_sel_cb, "default"); + elm_list_item_append(list, "default_style", NULL, NULL, + _item_style_sel_cb, "default_style"); + elm_list_item_append(list, "up", NULL, NULL, + _item_style_sel_cb, "up"); + elm_list_item_append(list, "album-preview", NULL, NULL, + _item_style_sel_cb, "album-preview"); + elm_list_item_append(list, "thumb", NULL, NULL, + _item_style_sel_cb, "thumb"); + elm_list_go(list); + + return list; +} + +/* Set elementary widget's min size. + * We should not set min size hint to elementary widgets because elementary has + * its own size policy/logic. This is an official trick from raster. + * @param obj the actual object that you want to set the min size + * @param parent parent object for elm_table_add + * @param w min width + * @param h min height + */ +Evas_Object * +_elm_min_set(Evas_Object *obj, Evas_Object *parent, Evas_Coord w, Evas_Coord h) +{ + Evas_Object *table, *rect; + + table = elm_table_add(parent); + + rect = evas_object_rectangle_add(evas_object_evas_get(table)); + evas_object_size_hint_min_set(rect, w, h); + evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(rect, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(table, rect, 0, 0, 1, 1); + + evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(table, obj, 0, 0, 1, 1); + + return table; +} + +void +test_gengrid_item_styles(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *box, *gengrid, *list, *table; + + win = elm_win_util_standard_add("gengrid-styles", "Gengrid Item Styles"); + elm_win_autodel_set(win, EINA_TRUE); + + box = elm_box_add(win); + elm_box_horizontal_set(box, EINA_TRUE); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + list = _item_styles_list_create(box); + evas_object_show(list); + + table = _elm_min_set(list, box, 100, 0); + evas_object_size_hint_weight_set(table, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, table); + evas_object_show(table); + + gengrid = _gengrid_create(win, (12 * 12), NULL); + elm_box_pack_end(box, gengrid); + evas_object_show(gengrid); + + evas_object_resize(win, 600, 600); + evas_object_show(win); +} + +static void +_rd1_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Show_Data *sd = data; + int winmode = elm_radio_state_value_get(obj); + if (winmode == 0) + elm_gengrid_horizontal_set(sd->grid, EINA_TRUE); + else if (winmode == 1) + elm_gengrid_horizontal_set(sd->grid, EINA_FALSE); +} + +static void +_rd2_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Show_Data *sd = data; + sd->scrollto = elm_radio_state_value_get(obj); +} + +static void +_bring_in_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Show_Data *sd = data; + Elm_Object_Item *item = elm_gengrid_selected_item_get(sd->grid); + elm_gengrid_item_bring_in(item, sd->scrollto); + elm_gengrid_item_selected_set(item, EINA_TRUE); +} + +static void +_show_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Show_Data *sd = data; + Elm_Object_Item *item = elm_gengrid_selected_item_get(sd->grid); + elm_gengrid_item_show(item, sd->scrollto); + elm_gengrid_item_selected_set(item, EINA_TRUE); +} + +static Evas_Object * +_window_mode_frame_new(Evas_Object *win, void *data) +{ + Evas_Object *fr, *bx, *rd, *rdg; + Show_Data *sd = data; + + fr = elm_frame_add(win); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(fr, "Direction"); + evas_object_show(fr); + + bx = elm_box_add(win); + elm_object_content_set(fr, bx); + evas_object_show(bx); + + rd = elm_radio_add(win); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_radio_state_value_set(rd, 0); + elm_object_text_set(rd, "horizontal"); + evas_object_smart_callback_add(rd, "changed", _rd1_changed_cb, sd); + evas_object_show(rd); + elm_box_pack_end(bx, rd); + rdg = rd; + + rd = elm_radio_add(win); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_radio_state_value_set(rd, 1); + elm_object_text_set(rd, "vertical"); + elm_radio_group_add(rd, rdg); + evas_object_smart_callback_add(rd, "changed", _rd1_changed_cb, sd); + evas_object_show(rd); + elm_box_pack_end(bx, rd); + + return fr; +} + +static Evas_Object * +_scrollto_mode_frame_new(Evas_Object *win, void *data) +{ + Evas_Object *fr, *bx, *rd, *rdg; + Show_Data *sd = data; + + fr = elm_frame_add(win); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(fr, "Scrollto Mode"); + evas_object_show(fr); + + bx = elm_box_add(win); + elm_object_content_set(fr, bx); + evas_object_show(bx); + + rd = elm_radio_add(win); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_radio_state_value_set(rd, 0); + elm_object_text_set(rd, "SCROLLTO_NONE"); + evas_object_smart_callback_add(rd, "changed", _rd2_changed_cb, sd); + evas_object_show(rd); + elm_box_pack_end(bx, rd); + rdg = rd; + + rd = elm_radio_add(win); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_radio_state_value_set(rd, 1); + elm_object_text_set(rd, "SCROLLTO_IN"); + elm_radio_group_add(rd, rdg); + evas_object_smart_callback_add(rd, "changed", _rd2_changed_cb, sd); + evas_object_show(rd); + elm_box_pack_end(bx, rd); + + rd = elm_radio_add(win); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_radio_state_value_set(rd, 2); + elm_object_text_set(rd, "SCROLLTO_TOP"); + elm_radio_group_add(rd, rdg); + evas_object_smart_callback_add(rd, "changed", _rd2_changed_cb, sd); + evas_object_show(rd); + elm_box_pack_end(bx, rd); + + rd = elm_radio_add(win); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_radio_state_value_set(rd, 4); + elm_object_text_set(rd, "SCROLLTO_MIDDLE"); + elm_radio_group_add(rd, rdg); + evas_object_smart_callback_add(rd, "changed", _rd2_changed_cb, sd); + evas_object_show(rd); + elm_box_pack_end(bx, rd); + + rd = elm_radio_add(win); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_radio_state_value_set(rd, 8); + elm_object_text_set(rd, "SCROLLTO_BOTTOM"); + elm_radio_group_add(rd, rdg); + evas_object_smart_callback_add(rd, "changed", _rd2_changed_cb, sd); + evas_object_show(rd); + elm_box_pack_end(bx, rd); + + return fr; +} + +void +test_gengrid4(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bt, *bx, *bx2, *fr, *grid; + Show_Data *sd = calloc(1, sizeof(Show_Data)); + char buf[PATH_MAX]; + int i, n; + static Item_Data ti[10000]; + + win = elm_win_util_standard_add("gengrid-show-bringin", "GenGrid Show/Bring_in"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, sd); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + grid = elm_gengrid_add(win); + elm_gengrid_item_size_set(grid, ELM_SCALE_SIZE(150), ELM_SCALE_SIZE(150)); + elm_gengrid_group_item_size_set(grid, ELM_SCALE_SIZE(31), ELM_SCALE_SIZE(31)); + elm_gengrid_align_set(grid, 0.1, 0.1); + elm_gengrid_horizontal_set(grid, EINA_TRUE); + + gic = elm_gengrid_item_class_new(); + gic->item_style = "default"; + gic->func.text_get = grid_text_get; + gic->func.content_get = grid_content_get; + gic->func.state_get = grid_state_get; + gic->func.del = NULL; + + for (i = 0, n = 0; i < 10000; i++) + { + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]); + n = (n + 1) % 9; + ti[i].mode = i; + ti[i].path = eina_stringshare_add(buf); + ti[i].item = elm_gengrid_item_append(grid, gic, &(ti[i]), grid_sel, NULL); + if (i == 2579) + elm_gengrid_item_selected_set(ti[i].item, EINA_TRUE); + } + + elm_gengrid_item_class_free(gic); + elm_gengrid_item_show(ti[2579].item, sd->scrollto); + 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); + evas_object_size_hint_min_set(grid, 600, 400); + evas_object_show(grid); + sd->grid = grid; + elm_box_pack_end(bx, grid); + + bx2 = elm_box_add(bx); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + fr = _window_mode_frame_new(bx2, sd); + elm_box_pack_end(bx2, fr); + + fr = _scrollto_mode_frame_new(bx2, sd); + elm_box_pack_end(bx2, fr); + + bx2 = elm_box_add(bx); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bt = elm_button_add(bx2); + elm_object_text_set(bt, "Show"); + evas_object_smart_callback_add(bt, "clicked", _show_clicked_cb, sd); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(bx2); + elm_object_text_set(bt, "Bring In"); + evas_object_smart_callback_add(bt, "clicked", _bring_in_clicked_cb, sd); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + evas_object_show(win); +} + +typedef struct _grid5_Event_Data grid5_Event_Data; +struct _grid5_Event_Data +{ + Evas_Object *grid_obj; + Evas_Object *en_obj; + Elm_Object_Item *last_item_found; +}; + +static const char *_grid5_items_text[] = { + "Albany", "Annapolis", + "Atlanta", "Augusta", + "Austin", "Baton Rouge", + "Bismarck", "Boise", + "Boston", "Carson City", + "Charleston", "Cheyenne", + "Columbia", "Columbus", + "Concord", "Denver", + "Des Moines", "Dover", + "Frankfort", "Harrisburg", + "Hartford", "Helena", + "Honolulu", "Indianapolis", + "Jackson", "Jefferson City", + "Juneau", "Lansing", + "Lincoln", "Little Rock", + "Madison", "Montgomery", + "Montpelier", "Nashville", + "Oklahoma City", "Olympia", + "Phoenix", "Pierre", + "Providence", "Raleigh", + "Richmond", "Sacramento", + "Saint Paul", "Salem", + "Salt Lake City", "Santa Fe", + "Springfield", "Tallahassee", + "Topeka", "Trenton" +}; + +static char * +_grid5_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + Item_Data *id = data; + char buf[64]; + snprintf(buf, sizeof(buf), "%s", _grid5_items_text[id->mode]); + return strdup(buf); +} + +static void +_grid5_search_item(grid5_Event_Data *event_data, Elm_Object_Item * it) +{ + const char *str = elm_entry_entry_get(event_data->en_obj); + if (!str || !strlen(str)) return; + + printf("Looking for \"%s\". ", str); + event_data->last_item_found = elm_gengrid_search_by_text_item_get + (event_data->grid_obj, it, NULL, str, 0); + + if (event_data->last_item_found) + { + printf("Found.\n"); + elm_gengrid_item_selected_set(event_data->last_item_found, EINA_TRUE); + elm_gengrid_item_bring_in(event_data->last_item_found, ELM_GENGRID_ITEM_SCROLLTO_MIDDLE); + elm_object_focus_set(event_data->en_obj, EINA_TRUE); + } + else + printf("Not Found.\n"); +} + +static void +_grid5_search_settings_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *einfo EINA_UNUSED) +{ + _grid5_search_item(data, NULL); +} + +static void +_grid5_on_keydown(void *data, Evas *evas EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info) +{ + Evas_Event_Key_Down *ev = event_info; + grid5_Event_Data * event_data = (grid5_Event_Data *)data; + + if (!strcmp(ev->key, "Return")) + { + printf("Looking for next item\n"); + _grid5_search_item(data, event_data->last_item_found); + } +} + +static Elm_Gengrid_Item_Class * +_grid5_item_class_create(const char *item_style) +{ + Elm_Gengrid_Item_Class * itc = elm_gengrid_item_class_new(); + itc->item_style = item_style; + itc->func.text_get = _grid5_text_get; + itc->func.content_get = grid_content_get; + itc->func.state_get = grid_state_get; + itc->func.del = NULL; + return itc; +} + +void +test_gengrid5(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *grid; + Evas_Object *fr, *lb_frame; + Evas_Object *en, *bx_entry, *lb_entry; + grid5_Event_Data *event_data; + Elm_Gengrid_Item_Class *itc = NULL; + static Item_Data id[50]; + char buf[PATH_MAX]; + int i, n; + + win = elm_win_util_standard_add("gengrid-item-search-by-text", "Gengrid Item Search By Text"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + fr = elm_frame_add(bx); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.0); + elm_object_text_set(fr, "Information"); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + lb_frame = elm_label_add(fr); + elm_object_text_set(lb_frame, + "<align=left>This is an example of elm_gengrid_search_by_text_item_get() usage.<br>" + "Enter search string to the entry and press Enter to show next search result.<br>"); + elm_object_content_set(fr, lb_frame); + evas_object_show(lb_frame); + + bx_entry = elm_box_add(win); + elm_box_horizontal_set(bx_entry, EINA_TRUE); + evas_object_size_hint_weight_set(bx_entry, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx_entry, EVAS_HINT_FILL, 0.0); + elm_box_pack_end(bx, bx_entry); + evas_object_show(bx_entry); + + lb_entry = elm_label_add(win); + elm_object_text_set(lb_entry, " Search:"); + evas_object_size_hint_weight_set(lb_entry, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(lb_entry, 0.0, EVAS_HINT_FILL); + elm_box_pack_end(bx_entry, lb_entry); + evas_object_show(lb_entry); + + en = elm_entry_add(win); + elm_entry_single_line_set(en, EINA_TRUE); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_object_part_text_set(en, "guide", "Type item's name here to search."); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx_entry, en); + evas_object_show(en); + elm_object_focus_set(en, EINA_TRUE); + + grid = elm_gengrid_add(bx); + elm_gengrid_item_size_set(grid, ELM_SCALE_SIZE(200), ELM_SCALE_SIZE(150)); + 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_select_mode_set(grid, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_box_pack_end(bx, grid); + evas_object_show(grid); + + event_data = calloc(1, sizeof(grid5_Event_Data)); + event_data->en_obj = en; + event_data->grid_obj = grid; + event_data->last_item_found = NULL; + + evas_object_event_callback_add(en, EVAS_CALLBACK_KEY_DOWN, _grid5_on_keydown, (void*)event_data); + evas_object_smart_callback_add(en, "changed,user", _grid5_search_settings_changed_cb, (void*)event_data); + evas_object_event_callback_add(grid, EVAS_CALLBACK_FREE, _cleanup_cb, (void*)event_data); + + itc = _grid5_item_class_create("default"); + + for (i = 0, n = 0; i < 50; i++) + { + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]); + n = (n + 1) % 9; + id[i].mode = i; + id[i].path = eina_stringshare_add(buf); + id[i].item = elm_gengrid_item_append(grid, itc, &(id[i]), grid_sel, NULL); + if (!(i % 5)) + elm_gengrid_item_selected_set(id[i].item, EINA_TRUE); + } + elm_gengrid_item_class_free(itc); + + evas_object_resize(win, 320, 500); + evas_object_show(win); +} + +void +test_gengrid_speed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *fr, *bx; + api_data *api = calloc(1, sizeof(api_data)); + + win = elm_win_util_standard_add("gengrid", "Gengrid"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + api->box = bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + fr = elm_frame_add(win); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.5); + elm_frame_autocollapse_set(fr, EINA_TRUE); + elm_object_text_set(fr, "Collapse me!"); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + api->grid = create_gengrid(win, 5000); + evas_object_size_hint_min_set(api->grid, 600, 600); + elm_gengrid_item_size_set(api->grid, + ELM_SCALE_SIZE(30), + ELM_SCALE_SIZE(36)); + elm_object_content_set(fr, api->grid); + evas_object_show(api->grid); + evas_object_resize(win, 600, 600); + evas_object_show(win); +} + + +/*** Gengrid Focus *********************************************************/ +static void +_gengrid_focus_item_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + printf("%s: %p\n", (char *)data, event_info); +} + +static void +_gengrid_focus_popup_close_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + evas_object_del(data); +} + +static void +_gengrid_focus_item_activated_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup, *btn; + + popup = elm_popup_add(data); + elm_object_text_set(popup, "This Popup must have the focus"); + + btn = elm_button_add(popup); + elm_object_text_set(btn, "Close"); + elm_object_part_content_set(popup, "button1", btn); + evas_object_smart_callback_add(btn, "clicked", + _gengrid_focus_popup_close_cb, popup); + + evas_object_show(popup); +} + +static void +_gengrid_focus_key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Evas_Event_Key_Down *ev = event_info; + printf("\n=== Key Down : %s ===\n", ev->keyname); +} + +static void +_gg_focus_focus_move_policy_changed_cb(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + int val = elm_radio_value_get(obj); + + if (val == 0) + elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_CLICK); + else if (val == 1) + elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_IN); +} + +static void +_gg_focus_win_auto_focus_enable_changed(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_config_window_auto_focus_enable_set(elm_check_state_get(obj)); +} + +static void +_gg_focus_win_auto_focus_animate_changed(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_config_window_auto_focus_animate_set(elm_check_state_get(obj)); +} + +static void +_gg_focus_focus_highlight_changed_cb(void *data, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_win_focus_highlight_enabled_set((Evas_Object *)data, + elm_check_state_get(obj)); +} + +static void +_gg_focus_focus_animate_changed_cb(void *data, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_win_focus_highlight_animate_set((Evas_Object *)data, + elm_check_state_get(obj)); +} + +static void +_gg_focus_region_show_item_cb(void *data, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + if (elm_check_state_get(obj)) + elm_object_focus_region_show_mode_set((Evas_Object *)data, + ELM_FOCUS_REGION_SHOW_ITEM); + else + elm_object_focus_region_show_mode_set((Evas_Object *)data, + ELM_FOCUS_REGION_SHOW_WIDGET); +} + +static void +_grid_reorder_mode(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + if (elm_check_state_get(obj)) + elm_gengrid_reorder_mode_start((Evas_Object *)data, + ECORE_POS_MAP_LINEAR); + else + elm_gengrid_reorder_mode_stop((Evas_Object *)data); +} + +static void +_gg_first_item_focus_on_first_focus_in_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_config_first_item_focus_on_first_focusin_set(elm_check_state_get(obj)); +} + +void +test_gengrid_focus(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bx_horiz, *in_bx, *scr, *gengrid, *gengrid2, *btn, *fr, *bx_mv, *bx_opt, *ck, *rdg, *rd; + Elm_Gengrid_Item_Class *ic; + Item_Data *id; + char buf[PATH_MAX]; + int i, n; + + win = elm_win_util_standard_add("gengrid-focus", "Gengrid Focus"); + elm_config_window_auto_focus_enable_set(EINA_TRUE); + elm_config_window_auto_focus_animate_set(EINA_TRUE); + elm_win_focus_highlight_enabled_set(win, EINA_FALSE); + elm_win_focus_highlight_animate_set(win, EINA_FALSE); + elm_win_autodel_set(win, EINA_TRUE); + + bx_horiz = elm_box_add(win); + elm_box_horizontal_set(bx_horiz, EINA_TRUE); + evas_object_size_hint_weight_set(bx_horiz, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx_horiz); + evas_object_show(bx_horiz); + + btn = elm_button_add(bx_horiz); + elm_object_text_set(btn, "Left"); + elm_box_pack_end(bx_horiz, btn); + evas_object_show(btn); + + bx = elm_box_add(bx_horiz); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx_horiz, bx); + evas_object_show(bx); + + btn = elm_button_add(bx); + elm_object_text_set(btn, "Up"); + elm_box_pack_end(bx, btn); + evas_object_show(btn); + elm_object_focus_set(btn, EINA_TRUE); + + scr = elm_scroller_add(bx); + evas_object_size_hint_weight_set(scr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(scr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, scr); + evas_object_show(scr); + + in_bx = elm_box_add(scr); + evas_object_size_hint_weight_set(in_bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(in_bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_content_set(scr, in_bx); + evas_object_show(in_bx); + + gengrid = elm_gengrid_add(in_bx); + elm_gengrid_item_size_set(gengrid, + ELM_SCALE_SIZE(150), + ELM_SCALE_SIZE(150)); + evas_object_size_hint_weight_set(gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gengrid, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_min_set(gengrid, 0, ELM_SCALE_SIZE(620)); + elm_box_pack_end(in_bx, gengrid); + evas_object_show(gengrid); + evas_object_smart_callback_add(gengrid, "item,focused", _gengrid_focus_item_cb, "item,focused"); + evas_object_smart_callback_add(gengrid, "item,unfocused", _gengrid_focus_item_cb, "item,unfocused"); + evas_object_smart_callback_add(gengrid, "selected", _gengrid_focus_item_cb, "selected"); + evas_object_smart_callback_add(gengrid, "unselected", _gengrid_focus_item_cb, "unselected"); + evas_object_smart_callback_add(gengrid, "highlighted", _gengrid_focus_item_cb, "highlighted"); + evas_object_smart_callback_add(gengrid, "unhighlighted", _gengrid_focus_item_cb, "unhighlighted"); + evas_object_smart_callback_add(gengrid, "activated", _gengrid_focus_item_cb, "activated"); + evas_object_smart_callback_add(gengrid, "activated", _gengrid_focus_item_activated_cb, win); + evas_object_event_callback_add(gengrid, EVAS_CALLBACK_KEY_DOWN, _gengrid_focus_key_down_cb, NULL); + + gengrid2 = elm_gengrid_add(in_bx); + elm_gengrid_item_size_set(gengrid2, + ELM_SCALE_SIZE(150), + ELM_SCALE_SIZE(150)); + evas_object_size_hint_weight_set(gengrid2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gengrid2, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_min_set(gengrid2, 0, ELM_SCALE_SIZE(620)); + elm_box_pack_end(in_bx, gengrid2); + evas_object_show(gengrid2); + evas_object_smart_callback_add(gengrid2, "item,focused", _gengrid_focus_item_cb, "item,focused"); + evas_object_smart_callback_add(gengrid2, "item,unfocused", _gengrid_focus_item_cb, "item,unfocused"); + evas_object_smart_callback_add(gengrid2, "selected", _gengrid_focus_item_cb, "selected"); + evas_object_smart_callback_add(gengrid2, "unselected", _gengrid_focus_item_cb, "unselected"); + evas_object_smart_callback_add(gengrid2, "highlighted", _gengrid_focus_item_cb, "highlighted"); + evas_object_smart_callback_add(gengrid2, "unhighlighted", _gengrid_focus_item_cb, "unhighlighted"); + evas_object_smart_callback_add(gengrid2, "activated", _gengrid_focus_item_cb, "activated"); + evas_object_smart_callback_add(gengrid2, "activated", _gengrid_focus_item_activated_cb, win); + evas_object_event_callback_add(gengrid2, EVAS_CALLBACK_KEY_DOWN, _gengrid_focus_key_down_cb, NULL); + + btn = elm_button_add(bx); + elm_object_text_set(btn, "Down"); + elm_box_pack_end(bx, btn); + evas_object_show(btn); + + btn = elm_button_add(bx_horiz); + elm_object_text_set(btn, "Right"); + elm_box_pack_end(bx_horiz, btn); + evas_object_show(btn); + + //Options + fr = elm_frame_add(bx); + elm_object_text_set(fr, "Options"); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + bx_opt = elm_box_add(fr); + elm_box_layout_set(bx_opt, evas_object_box_layout_flow_horizontal, NULL, NULL); + evas_object_size_hint_weight_set(bx_opt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx_opt, EVAS_HINT_FILL, 0.0); + elm_box_align_set(bx_opt, 0.0, 0.5); + elm_object_content_set(fr, bx_opt); + evas_object_show(bx_opt); + + ck = elm_check_add(bx_opt); + elm_object_text_set(ck, "Window Auto Focus Enable"); + elm_check_state_set(ck, EINA_TRUE); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(ck, "changed", + _gg_focus_win_auto_focus_enable_changed, + NULL); + elm_box_pack_end(bx_opt, ck); + evas_object_show(ck); + + ck = elm_check_add(bx_opt); + elm_object_text_set(ck, "Window Auto Focus Animate"); + elm_check_state_set(ck, EINA_TRUE); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(ck, "changed", + _gg_focus_win_auto_focus_animate_changed, + NULL); + elm_box_pack_end(bx_opt, ck); + evas_object_show(ck); + + ck = elm_check_add(bx_opt); + elm_object_text_set(ck, "Focus Highlight"); + elm_check_state_set(ck, EINA_FALSE); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(ck, "changed", + _gg_focus_focus_highlight_changed_cb, + win); + elm_box_pack_end(bx_opt, ck); + evas_object_show(ck); + + ck = elm_check_add(bx_opt); + elm_object_text_set(ck, "Focus Animation"); + elm_check_state_set(ck, EINA_FALSE); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(ck, "changed", + _gg_focus_focus_animate_changed_cb, + win); + elm_box_pack_end(bx_opt, ck); + evas_object_show(ck); + + ck = elm_check_add(bx_opt); + elm_object_text_set(ck, "Focus Region Show as Item"); + elm_check_state_set(ck, EINA_FALSE); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(ck, "changed", + _gg_focus_region_show_item_cb, + gengrid); + evas_object_smart_callback_add(ck, "changed", + _gg_focus_region_show_item_cb, + gengrid2); + elm_box_pack_end(bx_opt, ck); + evas_object_show(ck); + + ck = elm_check_add(bx_opt); + elm_object_text_set(ck, "Horizontal Mode"); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(ck, "changed", _horizontal_grid, gengrid); + evas_object_smart_callback_add(ck, "changed", _horizontal_grid, gengrid2); + elm_box_pack_end(bx_opt, ck); + evas_object_show(ck); + + ck = elm_check_add(bx_opt); + elm_object_text_set(ck, "Rorder mode enable"); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(ck, "changed", _grid_reorder_mode, gengrid); + evas_object_smart_callback_add(ck, "changed", _grid_reorder_mode, gengrid2); + elm_box_pack_end(bx_opt, ck); + evas_object_show(ck); + + ck = elm_check_add(bx_opt); + elm_object_text_set(ck, "Item Select on Focus disable"); + elm_check_state_set(ck, elm_config_item_select_on_focus_disabled_get()); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(ck, "changed", + _gg_focus_item_select_on_focus_disable_changed_cb, + NULL); + elm_box_pack_end(bx_opt, ck); + evas_object_show(ck); + + ck = elm_check_add(bx_opt); + elm_object_text_set(ck, "First item focus on first focus in"); + elm_check_state_set(ck, elm_config_first_item_focus_on_first_focusin_get()); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(ck, "changed", + _gg_first_item_focus_on_first_focus_in_cb, + NULL); + elm_box_pack_end(bx_opt, ck); + evas_object_show(ck); + + // Focus Autoscroll Mode + fr = _focus_autoscroll_mode_frame_create(bx); + elm_box_pack_end(bx, fr); + + //Focus movement policy + fr = elm_frame_add(bx); + elm_object_text_set(fr, "Focus Movement Policy"); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + bx_mv = elm_box_add(fr); + elm_box_horizontal_set(bx_mv, EINA_TRUE); + elm_object_content_set(fr, bx_mv); + evas_object_show(bx_mv); + + rdg = rd = elm_radio_add(bx_mv); + elm_object_text_set(rd, "Focus Move by Click"); + elm_radio_state_value_set(rd, 0); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(rd, "changed", + _gg_focus_focus_move_policy_changed_cb, + NULL); + elm_box_pack_end(bx_mv, rd); + evas_object_show(rd); + + rd = elm_radio_add(bx_mv); + elm_object_text_set(rd, "Focus Move by Mouse-In"); + elm_radio_group_add(rd, rdg); + elm_radio_state_value_set(rd, 1); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(rd, "changed", + _gg_focus_focus_move_policy_changed_cb, + NULL); + elm_box_pack_end(bx_mv, rd); + evas_object_show(rd); + + ic = elm_gengrid_item_class_new(); + ic->item_style = "default"; + ic->func.text_get = grid_text_get; + ic->func.content_get = grid_content_get; + ic->func.state_get = NULL; + ic->func.del = grid_del; + + n = 0; + for (i = 0; i < 24; i++) + { + id = calloc(1, sizeof(Item_Data)); + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]); + n = (n + 1) % 9; + id->mode = i; + id->path = eina_stringshare_add(buf); + id->item = elm_gengrid_item_append(gengrid, ic, id, NULL, NULL); + if (i == 4) + elm_object_item_disabled_set(id->item, EINA_TRUE); + } + + n = 0; + for (i = 0; i < 24; i++) + { + id = calloc(1, sizeof(Item_Data)); + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]); + n = (n + 1) % 9; + id->mode = i; + id->path = eina_stringshare_add(buf); + id->item = elm_gengrid_item_append(gengrid2, ic, id, NULL, NULL); + if (i == 4) + elm_object_item_disabled_set(id->item, EINA_TRUE); + } + elm_gengrid_item_class_free(ic); + + evas_object_resize(win, 600, 600); + evas_object_show(win); +} + +char * +_gg_update_text_get(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + const char *part EINA_UNUSED) +{ + char *txt[] = {"Sky", "Stone", "Water", "Flower", "Sand", "Sun", "Moon", "Star", "Cloud", NULL}; + int n = rand() % 9; + + return strdup(txt[n]); +} + +Evas_Object * +_gg_update_content_get(void *data, Evas_Object *obj, const char *part) +{ + const Item_Data *id = data; + char buf[256]; + int n = 0; + + if (!strcmp(part, "elm.swallow.icon")) + { + n = rand() % 9; + + Evas_Object *image = elm_image_add(obj); + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]); + elm_image_file_set(image, buf, NULL); + elm_image_aspect_fixed_set(image, EINA_FALSE); + evas_object_show(image); + return image; + } + else if (!strcmp(part, "elm.swallow.end")) + { + Evas_Object *ck = elm_check_add(obj); + evas_object_propagate_events_set(ck, EINA_FALSE); + elm_check_state_set(ck, id->onoff); + evas_object_smart_callback_add(ck, "changed", grid_item_check_changed, data); + evas_object_show(ck); + return ck; + } + return NULL; +} + +Eina_Bool +_gg_update_state_get(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + const char *part EINA_UNUSED) +{ + return EINA_FALSE; +} + +static void +_gg_item_update_clicked_cb(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + api_data *api = (api_data *)data; + + Evas_Object *gengrid = api->grid; + Eina_List *l = elm_gengrid_realized_items_get(gengrid); + Elm_Object_Item *item = NULL; + Item_Data *id = NULL; + + EINA_LIST_FREE(l, item) + { + id = elm_object_item_data_get(item); + if (id && id->onoff) elm_gengrid_item_update(item); + } +} + +static void +_gg_item_fields_update_clicked_cb(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + api_data *api = (api_data *)data; + + Evas_Object *gengrid = api->grid; + Eina_List *l = elm_gengrid_realized_items_get(gengrid); + Elm_Object_Item *item = NULL; + Item_Data *id = NULL; + + EINA_LIST_FREE(l, item) + { + id = elm_object_item_data_get(item); + if (id && id->onoff) + { + elm_gengrid_item_fields_update(item, "*", api->field_type); + } + } +} + +static void +_gg_text_update_changed_cb(void *data, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + api_data *api = (api_data *)data; + + if (elm_check_state_get(obj)) + api->field_type |= ELM_GENGRID_ITEM_FIELD_TEXT; + else + api->field_type ^= ELM_GENGRID_ITEM_FIELD_TEXT; +} + +static void +_gg_content_update_changed_cb(void *data, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + api_data *api = (api_data *)data; + + if (elm_check_state_get(obj)) + api->field_type |= ELM_GENGRID_ITEM_FIELD_CONTENT; + else + api->field_type ^= ELM_GENGRID_ITEM_FIELD_CONTENT; +} + +static void +_gg_state_update_changed_cb(void *data, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + api_data *api = (api_data *)data; + + if (elm_check_state_get(obj)) + api->field_type |= ELM_GENGRID_ITEM_FIELD_STATE; + else + api->field_type ^= ELM_GENGRID_ITEM_FIELD_STATE; +} + +void +test_gengrid_update(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *gengrid, *btn, *fr, *bx_opt, *ck; + Elm_Gengrid_Item_Class *ic; + api_data *api = calloc(1, sizeof(api_data)); + Item_Data *id; + int i; + + win = elm_win_util_standard_add("gengrid-update", "Gengrid Update"); + elm_win_autodel_set(win, EINA_TRUE); + + api->box = bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + api->grid = gengrid = elm_gengrid_add(bx); + elm_gengrid_item_size_set(gengrid, + ELM_SCALE_SIZE(150), + ELM_SCALE_SIZE(150)); + evas_object_size_hint_weight_set(gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gengrid, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, gengrid); + evas_object_show(gengrid); + evas_object_smart_callback_add(gengrid, "item,focused", _gengrid_focus_item_cb, "item,focused"); + evas_object_smart_callback_add(gengrid, "item,unfocused", _gengrid_focus_item_cb, "item,unfocused"); + evas_object_smart_callback_add(gengrid, "selected", _gengrid_focus_item_cb, "selected"); + evas_object_smart_callback_add(gengrid, "unselected", _gengrid_focus_item_cb, "unselected"); + evas_object_smart_callback_add(gengrid, "activated", _gengrid_focus_item_cb, "activated"); + evas_object_smart_callback_add(gengrid, "highlighted", _gengrid_focus_item_cb, "highlighted"); + evas_object_smart_callback_add(gengrid, "unhighlighted", _gengrid_focus_item_cb, "unhighlighted"); + evas_object_event_callback_add(gengrid, EVAS_CALLBACK_KEY_DOWN, _gengrid_focus_key_down_cb, NULL); + + //initialize field type + api->field_type = ELM_GENGRID_ITEM_FIELD_ALL; + + //Field Options + fr = elm_frame_add(bx); + elm_object_text_set(fr, "Field Options"); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + bx_opt = elm_box_add(fr); + elm_box_horizontal_set(bx_opt, EINA_TRUE); + elm_object_content_set(fr, bx_opt); + evas_object_show(bx_opt); + + ck = elm_check_add(bx_opt); + elm_object_text_set(ck, "TEXT"); + elm_check_state_set(ck, EINA_FALSE); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(ck, "changed", + _gg_text_update_changed_cb, + api); + elm_box_pack_end(bx_opt, ck); + evas_object_show(ck); + + ck = elm_check_add(bx_opt); + elm_object_text_set(ck, "CONTENT"); + elm_check_state_set(ck, EINA_FALSE); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(ck, "changed", + _gg_content_update_changed_cb, + api); + elm_box_pack_end(bx_opt, ck); + evas_object_show(ck); + + ck = elm_check_add(bx_opt); + elm_object_text_set(ck, "STATE"); + elm_check_state_set(ck, EINA_FALSE); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(ck, "changed", + _gg_state_update_changed_cb, + api); + elm_box_pack_end(bx_opt, ck); + evas_object_show(ck); + + //Update Buttons + fr = elm_frame_add(bx); + elm_object_text_set(fr, "Update Options"); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + bx_opt = elm_box_add(fr); + elm_box_horizontal_set(bx_opt, EINA_TRUE); + elm_object_content_set(fr, bx_opt); + evas_object_show(bx_opt); + + btn = elm_button_add(bx_opt); + elm_object_text_set(btn, "Update"); + evas_object_smart_callback_add(btn, "clicked", _gg_item_update_clicked_cb, api); + elm_box_pack_end(bx_opt, btn); + evas_object_show(btn); + + btn = elm_button_add(bx_opt); + elm_object_text_set(btn, "Fields Update"); + evas_object_smart_callback_add(btn, "clicked", _gg_item_fields_update_clicked_cb, api); + elm_box_pack_end(bx_opt, btn); + evas_object_show(btn); + + + //Gengrid Item Append + ic = elm_gengrid_item_class_new(); + ic->item_style = "default"; + ic->func.text_get = _gg_update_text_get; + ic->func.content_get = _gg_update_content_get; + ic->func.state_get = _gg_update_state_get; + ic->func.del = grid_del; + + for (i = 0; i < 24; i++) + { + id = calloc(1, sizeof(Item_Data)); + id->mode = i; + id->item = elm_gengrid_item_append(gengrid, ic, id, NULL, NULL); + if (i == 4) + elm_object_item_disabled_set(id->item, EINA_TRUE); + } + elm_gengrid_item_class_free(ic); + + evas_object_resize(win, 600, 600); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_genlist.c b/src/bin/elementary/test_genlist.c new file mode 100644 index 0000000000..4c69be277d --- /dev/null +++ b/src/bin/elementary/test_genlist.c @@ -0,0 +1,5300 @@ +#include <Elementary_Cursor.h> +#include "test.h" +#ifdef HAVE_CONFIG_H +#include "elementary_config.h" +#endif +#include <Elementary.h> + +#include "test_explode.h" + +Evas_Object * _elm_min_set(Evas_Object *obj, Evas_Object *parent, + Evas_Coord w, Evas_Coord h); + +struct _api_data +{ + unsigned int state; /* What state we are testing */ + void *box; /* Use this to get box content */ + + Elm_Genlist_Item_Class *itc; + Elm_Genlist_Item_Class *itc1; + Elm_Genlist_Item_Class *itc2; + void *gl; + + void *filter_data; /* The data used for filtering */ + int scrollto; +}; +typedef struct _api_data api_data; + +enum _api_state +{ + HORIZONTAL_SET, + NO_SELECT_MODE_SET, + COMPRESS_MODE_SET, + BOUNCE_SET, + HOMOGENEOUS_SET, + SCROLLER_POLICY_SET, + TOOLTIP_TEXT_SET, + ITEM_CURSOR_SET, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static int bounce_max = 50; + +static void +set_api_state(api_data *api) +{ + const Eina_List *items = elm_box_children_get(api->box); + if (!eina_list_count(items)) + return; + + Evas_Object *gl = eina_list_nth(items, 0); /* Genlist is the first item */ + /* use elm_box_children_get() to get list of children */ + switch(api->state) + {/* Put all api-changes under switch */ + case HORIZONTAL_SET: /* 0 */ + elm_genlist_mode_set(gl, ELM_LIST_LIMIT); + break; + + case NO_SELECT_MODE_SET: /* 1 */ + elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_NONE); + elm_genlist_mode_set(gl, ELM_LIST_SCROLL); /* Back to default */ + break; + + case COMPRESS_MODE_SET: /* 2 */ + elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_DEFAULT); + elm_genlist_mode_set(gl, ELM_LIST_COMPRESS); + break; + + case BOUNCE_SET: /* 3 */ + elm_scroller_bounce_set(gl, EINA_FALSE, EINA_FALSE); + break; + + case HOMOGENEOUS_SET: /* 4 */ + elm_scroller_bounce_set(gl, EINA_TRUE, EINA_TRUE); /* Back to default */ + elm_genlist_homogeneous_set(gl, EINA_TRUE); + break; + + case SCROLLER_POLICY_SET: /* 5 */ + elm_genlist_homogeneous_set(gl, EINA_FALSE); /* Back to default */ + elm_scroller_policy_set(gl, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON); + break; + + case TOOLTIP_TEXT_SET: /* 6 */ + { + elm_genlist_item_tooltip_text_set(elm_genlist_first_item_get(gl), "Tooltip text from API"); + elm_genlist_item_bring_in(elm_genlist_first_item_get(gl), + ELM_GENLIST_ITEM_SCROLLTO_IN); + } + break; + + case ITEM_CURSOR_SET: /* 7 */ + elm_genlist_item_cursor_set(elm_genlist_first_item_get(gl), ELM_CURSOR_HAND2); + break; + + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + INF("clicked event on API Button: api_state=<%d>", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(obj, str); + elm_object_disabled_set(obj, a->state == API_STATE_LAST); +} +/* Hint: + * In this example some calls to elm_genlist_item_append() are used which give the + * value of an int as 'item data' and 'func data' after casting into (void*). For + * sure this works only on architectures where sizeof(int)==sizeof(void*). + * For real world usage you should hold a data structure or value in your + * application and then give only a pointer to this data as data pointer. + */ + +typedef struct _Testitem +{ + Elm_Object_Item *item; + int mode; + int onoff; + Eina_Bool checked; +} Testitem; + +static char * +gl_text_get1(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + char buf[256]; + int num = (int)(uintptr_t)data; + + snprintf(buf, sizeof(buf), "Item # %i", num); + + return strdup(buf); +} + +Evas_Object *gl_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part) +{ + char buf[PATH_MAX]; + Evas_Object *ic = elm_icon_add(obj); + if (!strcmp(part, "elm.swallow.end")) + snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get()); + else + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + return ic; +} + +static void on_bt_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("button clicked\n"); +} + +static void on_ck_changed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("checkbox changed\n"); +} + +Evas_Object *gl_content_full_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part) +{ + Evas_Object *fr, *bx, *ic, *bt, *ck; + + if (strcmp(part, "elm.swallow.content") != 0) return NULL; + + fr = elm_frame_add(obj); + elm_layout_text_set(fr, NULL, "A Frame"); + + bx = elm_box_add(fr); + elm_box_horizontal_set(bx, EINA_TRUE); + + ic = elm_icon_add(bx); + elm_icon_standard_set(ic, "home"); + evas_object_size_hint_min_set(ic, + ELM_SCALE_SIZE(32), + ELM_SCALE_SIZE(32)); + evas_object_size_hint_align_set(ic, 0.5, EVAS_HINT_FILL); + evas_object_show(ic); + elm_box_pack_end(bx, ic); + + bt = elm_button_add(bx); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_smart_callback_add(bt, "clicked", on_bt_clicked, NULL); + elm_layout_text_set(bt, NULL, "Click Me"); + evas_object_show(bt); + elm_box_pack_end(bx, bt); + + ck = elm_check_add(bx); + evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_smart_callback_add(ck, "changed", on_ck_changed, NULL); + elm_layout_text_set(ck, NULL, "some checkbox"); + evas_object_show(ck); + elm_box_pack_end(bx, ck); + + elm_layout_content_set(fr, NULL, bx); + evas_object_size_hint_min_set(fr, + ELM_SCALE_SIZE(100), + ELM_SCALE_SIZE(100)); + + return fr; +} + + +Eina_Bool gl_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + return EINA_FALSE; +} + +Evas_Object *gl_reusable_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part, Evas_Object *old) +{ + if (old && !strcmp(part, "elm.swallow.end")) + { + // Reuse old content + // Here need to add initializing and state changing + // for cached content. + // printf("content reuse for cached content %p, %s\n", old, part); + return old; + } + else + { + // Create new content object for non-reused part. + //printf("content create in reuse %p, %s\n", old, part); + char buf[PATH_MAX]; + Evas_Object *ic = elm_icon_add(obj); + if (!strcmp(part, "elm.swallow.end")) + snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get()); + else + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + return ic; + } + + // If return NULL value, content_get will be called to get new content. + // return NULL; +} + +static void +gl_sel(void *data, Evas_Object *obj, void *event_info) +{ + printf("sel item data [%p] on genlist obj [%p], item pointer [%p], index [%d]\n", + data, obj, event_info, elm_genlist_item_index_get(event_info)); +} + +static void +_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Evas_Object *gl = data; + Evas_Event_Mouse_Move *ev = event_info; + int where = 0; + Elm_Object_Item *gli; + gli = elm_genlist_at_xy_item_get(gl, ev->cur.canvas.x, ev->cur.canvas.y, &where); + if (gli) + INF("<%s> over %p, where %i\n", __func__, elm_object_item_data_get(gli), where); + else + INF("<%s> over none, where %i\n", __func__,where); +} + + +/*** Genlist ***************************************************************/ +static void +_bt50_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_genlist_item_bring_in(data, ELM_GENLIST_ITEM_SCROLLTO_IN); +} + +static void +_bt1500_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_genlist_item_bring_in(data, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); +} + +static void +_gl_selected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("selected: %p\n", event_info); +} + +static void +_gl_double_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("double clicked: %p\n", event_info); +} + +static void +_gl_right_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("right clicked: %p\n", event_info); +} + +static void +_gl_longpress(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("longpress %p\n", event_info); +} + +static void +_gl_changed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ +// printf("changed %p\n", event_info); +} + +static void +_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + api_data *api = (api_data *)data; + if (api->filter_data) free(api->filter_data); + free(api); +} + +typedef struct +{ + Evas_Object *gl; + Elm_Object_Item *it1, *it2; + int state; +} Bounce; + +static Eina_Bool +_bounce_cb(void *data) +{ + Bounce *bounce = data; + bounce->state++; + if (bounce->state & 0x1) + elm_genlist_item_bring_in(bounce->it2, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); + else + elm_genlist_item_bring_in(bounce->it1, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); + if (bounce->state > bounce_max) + { + if (getenv("ELM_TEST_AUTOBOUNCE")) elm_exit(); + } + return EINA_TRUE; +} + +static void +_btbounce_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Ecore_Timer *tim = evas_object_data_get(obj, "timer"); + if (!tim) + { + _bounce_cb(data); + tim = ecore_timer_add(0.5, _bounce_cb, data); + evas_object_data_set(obj, "timer", tim); + } +} + +static void +_btdel_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Bounce *bounce = data; + Ecore_Timer *tim = evas_object_data_get(obj, "timer"); + if (tim) + { + ecore_timer_del(tim); + evas_object_data_del(obj, "timer"); + } + free(bounce); +} + +void +test_genlist(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *gl, *bt_50, *bt_1500, *bx, *bxx, *bt; + Evas_Object *over; + Elm_Object_Item *gli; + int i, max; + Bounce *bounce; + api_data *api = calloc(1, sizeof(api_data)); + + win = elm_win_util_standard_add("genlist", "Genlist"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _cleanup_cb, api); + + bxx = elm_box_add(win); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bxx); + evas_object_show(bxx); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + api->box = bx; + evas_object_show(bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Next API function"); + evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, bt); + elm_object_disabled_set(bt, api->state == API_STATE_LAST); + evas_object_show(bt); + + elm_box_pack_end(bxx, bx); + + gl = elm_genlist_add(win); + evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL); + evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL); + evas_object_smart_callback_add(gl, "clicked,right", _gl_right_clicked, NULL); + evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL); + evas_object_smart_callback_add(gl, "changed", _gl_changed, NULL); + // FIXME: This causes genlist to resize the horiz axis very slowly :( + // Reenable this and resize the window horizontally, then try to resize it back + //elm_genlist_mode_set(gl, ELM_LIST_LIMIT); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, gl); + evas_object_show(gl); + + over = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(over, 0, 0, 0, 0); + evas_object_event_callback_add(over, EVAS_CALLBACK_MOUSE_MOVE, _move, gl); + evas_object_repeat_events_set(over, EINA_TRUE); + evas_object_show(over); + evas_object_size_hint_weight_set(over, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, over); + + api->itc1 = elm_genlist_item_class_new(); + api->itc1->item_style = "default"; + api->itc1->func.text_get = gl_text_get1; + api->itc1->func.content_get = NULL; // gl_content_get; + api->itc1->func.state_get = gl_state_get; + api->itc1->func.del = NULL; + // use content_reuse function for reusing + // repeated content objects instead of content_get + api->itc1->func.reusable_content_get = gl_reusable_content_get; + + bt_50 = elm_button_add(win); + elm_object_text_set(bt_50, "Go to 50"); + evas_object_show(bt_50); + elm_box_pack_end(bx, bt_50); + + bt_1500 = elm_button_add(win); + elm_object_text_set(bt_1500, "Go to 1500"); + evas_object_show(bt_1500); + elm_box_pack_end(bx, bt_1500); + + bounce = calloc(1, sizeof(Bounce)); + bt = elm_button_add(win); + elm_object_text_set(bt, "Bounce"); + evas_object_show(bt); + elm_box_pack_end(bx, bt); + bounce->gl = gl; + evas_object_smart_callback_add(bt, "clicked", _btbounce_cb, bounce); + evas_object_event_callback_add(bt, EVAS_CALLBACK_DEL, _btdel_cb, bounce); + + max = 2000; + if (getenv("ELM_TEST_AUTOBOUNCE")) + { + max = 200; + bounce_max = atoi(getenv("ELM_TEST_AUTOBOUNCE")); + } + for (i = 0; i < max; i++) + { + gli = elm_genlist_item_append(gl, api->itc1, + (void *)(uintptr_t)i/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_NONE, + gl_sel/* func */, + (void *)(uintptr_t)(i * 10)/* func data */); + + if (i == 50) + evas_object_smart_callback_add(bt_50, "clicked", _bt50_cb, gli); + else if (i == 1500) + evas_object_smart_callback_add(bt_1500, "clicked", _bt1500_cb, gli); + + if (i == 100) bounce->it1 = gli; + if (i == 120) bounce->it2 = gli; + } + elm_genlist_item_class_free(api->itc1); + + evas_object_resize(win, 480, 400); + explode_win_enable(win); + evas_object_show(win); + + if (max == 200) _btbounce_cb(bounce, bt, NULL); +} + + +/*** Genlist 2 *************************************************************/ +static void +my_gl_clear(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_genlist_clear(data); +} + +static char * +gl_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + char buf[256]; + snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data); + return strdup(buf); +} +static void +my_gl_add(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + api_data *api = data; + Evas_Object *gl = api->gl; + static int i = 0; + + if (!api->itc1) + { + ERR("Genlist item class should not be null. Something very bad is happening!!"); + return; + } + + api->itc1->item_style = "default"; + api->itc1->func.text_get = gl_text_get; + api->itc1->func.content_get = gl_content_get; + api->itc1->func.state_get = gl_state_get; + api->itc1->func.del = NULL; + + elm_genlist_item_append(gl, api->itc1, + (void *)(uintptr_t)i/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_NONE, + gl_sel/* func */, + (void *)(uintptr_t)(i * 10)/* func data */); + i++; +} + +static void +my_gl_insert_before(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + api_data *api = data; + Evas_Object *gl = api->gl; + static int i = 0; + Elm_Object_Item *gli_selected; + + if (!api->itc1) + { + ERR("Genlist item class should not be null. Something very bad is happening!!"); + return; + } + + api->itc1->item_style = "default"; + api->itc1->func.text_get = gl_text_get; + api->itc1->func.content_get = gl_content_get; + api->itc1->func.state_get = gl_state_get; + api->itc1->func.del = NULL; + + gli_selected = elm_genlist_selected_item_get(gl); + if (!gli_selected) + { + printf("no item selected\n"); + return ; + } + + elm_genlist_item_insert_before(gl, api->itc1, + (void *)(uintptr_t)i/* item data */, + NULL/* parent */, + gli_selected /* item before */, + ELM_GENLIST_ITEM_NONE, + gl_sel/* func */, + (void *)(uintptr_t)(i * 10)/* func data */); + i++; +} + +static void +my_gl_insert_after(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + api_data *api = data; + Evas_Object *gl = api->gl; + static int i = 0; + Elm_Object_Item *gli_selected; + + if (!api->itc1) + { + ERR("Genlist item class should not be null. Something very bad is happening!!"); + return; + } + + api->itc1->item_style = "default"; + api->itc1->func.text_get = gl_text_get; + api->itc1->func.content_get = gl_content_get; + api->itc1->func.state_get = gl_state_get; + api->itc1->func.del = NULL; + + gli_selected = elm_genlist_selected_item_get(gl); + if (!gli_selected) + { + printf("no item selected\n"); + return ; + } + + elm_genlist_item_insert_after(gl, api->itc1, + (void *)(uintptr_t)i/* item data */, + NULL/* parent */, + gli_selected /* item after */, + ELM_GENLIST_ITEM_NONE, + gl_sel/* func */, + (void *)(uintptr_t)(i * 10)/* func data */); + i++; +} + +static void +my_gl_del(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + api_data *api = data; + Evas_Object *gl = api->gl; + Elm_Object_Item *gli = elm_genlist_selected_item_get(gl); + if (!gli) + { + printf("no item selected\n"); + return; + } + elm_object_item_del(gli); +} + +static void +my_gl_disable(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + api_data *api = data; + Evas_Object *gl = api->gl; + Elm_Object_Item *gli = elm_genlist_selected_item_get(gl); + if (!gli) + { + printf("no item selected\n"); + return; + } + elm_object_item_disabled_set(gli, EINA_TRUE); + elm_genlist_item_selected_set(gli, EINA_FALSE); + elm_genlist_item_update(gli); +} + +static void +my_gl_update_all(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + api_data *api = data; + Evas_Object *gl = api->gl; + int i = 0; + Elm_Object_Item *it = elm_genlist_first_item_get(gl); + while (it) + { + elm_genlist_item_update(it); + INF("%i", i); + i++; + it = elm_genlist_item_next_get(it); + } +} + +static void +my_gl_first(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + api_data *api = data; + Evas_Object *gl = api->gl; + Elm_Object_Item *gli = elm_genlist_first_item_get(gl); + if (!gli) return; + elm_genlist_item_show(gli, ELM_GENLIST_ITEM_SCROLLTO_IN); + elm_genlist_item_selected_set(gli, 1); +} + +static void +my_gl_last(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + api_data *api = data; + Evas_Object *gl = api->gl; + Elm_Object_Item *gli = elm_genlist_last_item_get(gl); + if (!gli) return; + elm_genlist_item_show(gli, ELM_GENLIST_ITEM_SCROLLTO_IN); + elm_genlist_item_selected_set(gli, 1); +} + +static Eina_Bool +my_gl_flush_delay(void *data EINA_UNUSED) +{ + elm_cache_all_flush(); + return ECORE_CALLBACK_CANCEL; +} + +static void +my_gl_flush(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + ecore_timer_add(1.2, my_gl_flush_delay, NULL); +} + +static void +_genlist_del_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + if (!data) return; + + elm_genlist_item_class_free(data); +} + +void +test_genlist2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bg, *gl, *bx, *bx2, *bx3, *bt; + Elm_Object_Item *gli[10]; + char buf[PATH_MAX]; + + api_data *api = calloc(1, sizeof(api_data)); + win = elm_win_add(NULL, "genlist2", ELM_WIN_BASIC); + elm_win_title_set(win, "Genlist 2"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_bg_file_set(bg, buf, NULL); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + gl = elm_genlist_add(win); + elm_genlist_mode_set(gl, ELM_LIST_COMPRESS); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + api->gl = gl; + evas_object_show(gl); + + api->itc1 = elm_genlist_item_class_new(); + api->itc1->item_style = "default"; + api->itc1->func.text_get = gl_text_get; + api->itc1->func.content_get = gl_content_get; + api->itc1->func.state_get = gl_state_get; + api->itc1->func.del = NULL; + + gli[0] = elm_genlist_item_append(gl, api->itc1, + (void *)1001/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + (void *)1001/* func data */); + gli[1] = elm_genlist_item_append(gl, api->itc1, + (void *)1002/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + (void *)1002/* func data */); + gli[2] = elm_genlist_item_append(gl, api->itc1, + (void *)1003/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + (void *)1003/* func data */); + gli[3] = elm_genlist_item_prepend(gl, api->itc1, + (void *)1004/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + (void *)1004/* func data */); + gli[4] = elm_genlist_item_prepend(gl, api->itc1, + (void *)1005/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + (void *)1005/* func data */); + gli[5] = elm_genlist_item_insert_before(gl, api->itc1, + (void *)1006/* item data */, NULL/* parent */, gli[2]/* rel */, ELM_GENLIST_ITEM_NONE, + gl_sel/* func */, (void *)1006/* func data */); + gli[6] = elm_genlist_item_insert_after(gl, api->itc1, + (void *)1007/* item data */, NULL/* parent */, gli[2]/* rel */, ELM_GENLIST_ITEM_NONE, + gl_sel/* func */, (void *)1007/* func data */); + elm_box_pack_end(bx, gl); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "/\\"); + evas_object_smart_callback_add(bt, "clicked", my_gl_first, api); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "\\/"); + evas_object_smart_callback_add(bt, "clicked", my_gl_last, api); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "#"); + evas_object_smart_callback_add(bt, "clicked", my_gl_disable, api); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "U"); + evas_object_smart_callback_add(bt, "clicked", my_gl_update_all, api); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "X"); + evas_object_smart_callback_add(bt, "clicked", my_gl_clear, gl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "+"); + evas_object_smart_callback_add(bt, "clicked", my_gl_add, api); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "-"); + evas_object_smart_callback_add(bt, "clicked", my_gl_del, api); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx3 = elm_box_add(win); + elm_box_horizontal_set(bx3, EINA_TRUE); + elm_box_homogeneous_set(bx3, EINA_TRUE); + evas_object_size_hint_weight_set(bx3, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "+ before"); + evas_object_smart_callback_add(bt, "clicked", my_gl_insert_before, api); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx3, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "+ after"); + evas_object_smart_callback_add(bt, "clicked", my_gl_insert_after, api); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx3, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Flush"); + evas_object_smart_callback_add(bt, "clicked", my_gl_flush, api); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx3, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx3); + evas_object_show(bx3); + + evas_object_event_callback_add(gl, EVAS_CALLBACK_DEL, _genlist_del_cb, api->itc1); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} + + +/*** Genlist 3 *************************************************************/ +char * +gl2_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + const Testitem *tit = data; + char buf[256]; + snprintf(buf, sizeof(buf), "Item mode %i", tit->mode); + return strdup(buf); +} + +Evas_Object * +gl2_content_get(void *data, Evas_Object *obj, const char *part) +{ + const Testitem *tit = data; + char buf[PATH_MAX]; + Evas_Object *ic = elm_icon_add(obj); + if (!strcmp(part, "elm.swallow.icon")) + { + if (!(tit->mode & 0x3)) + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + else if ((tit->mode & 0x3) == 1) + snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get()); + else if ((tit->mode & 0x3) == 2) + snprintf(buf, sizeof(buf), "%s/images/panel_01.jpg", elm_app_data_dir_get()); + else if ((tit->mode & 0x3) == 3) + snprintf(buf, sizeof(buf), "%s/images/rock_01.jpg", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + } + else if (!strcmp(part, "elm.swallow.end")) + { + if (!(tit->mode & 0x3)) + snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get()); + else if ((tit->mode & 0x3) == 1) + snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get()); + else if ((tit->mode & 0x3) == 2) + snprintf(buf, sizeof(buf), "%s/images/sky_03.jpg", elm_app_data_dir_get()); + else if ((tit->mode & 0x3) == 3) + snprintf(buf, sizeof(buf), "%s/images/sky_04.jpg", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + } + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + return ic; +} + +Eina_Bool +gl2_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + return EINA_FALSE; +} + +static void +my_gl_update(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Testitem *tit = data; + tit->mode++; + elm_genlist_item_update(tit->item); +} + +static void +my_gl_labels_update(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Testitem *tit = data; + tit->mode++; + elm_genlist_item_fields_update(tit->item, "*", ELM_GENLIST_ITEM_FIELD_TEXT); +} + +static void +my_gl_contents_update(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Testitem *tit = data; + tit->mode++; + elm_genlist_item_fields_update(tit->item, "*", ELM_GENLIST_ITEM_FIELD_CONTENT); +} + +void +test_genlist3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *gl, *bx, *bx2, *bt; + static Testitem tit[3]; + + api_data *api = calloc(1, sizeof(api_data)); + win = elm_win_util_standard_add("genlist3", "Genlist 3"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + gl = elm_genlist_add(win); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(gl); + + api->itc1 = elm_genlist_item_class_new(); + api->itc1->item_style = "default"; + api->itc1->func.text_get = gl2_text_get; + api->itc1->func.content_get = gl2_content_get; + api->itc1->func.state_get = gl2_state_get; + api->itc1->func.del = NULL; + + tit[0].mode = 0; + tit[0].item = elm_genlist_item_append(gl, api->itc1, + &(tit[0])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + NULL/* func data */); + tit[1].mode = 1; + tit[1].item = elm_genlist_item_append(gl, api->itc1, + &(tit[1])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + NULL/* func data */); + tit[2].mode = 2; + tit[2].item = elm_genlist_item_append(gl, api->itc1, + &(tit[2])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + NULL/* func data */); + + elm_box_pack_end(bx, gl); + evas_object_show(bx); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "[1]"); + evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[0])); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "labels"); + evas_object_smart_callback_add(bt, "clicked", my_gl_labels_update, &(tit[1])); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "contents"); + evas_object_smart_callback_add(bt, "clicked", my_gl_contents_update, &(tit[2])); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + elm_genlist_item_class_free(api->itc1); + evas_object_resize(win, 320, 320); + evas_object_show(win); +} + + +/*** Genlist 4 *************************************************************/ +static void +my_gl_item_check_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Testitem *tit = data; + tit->onoff = elm_check_state_get(obj); + printf("item %p onoff = %i\n", tit, tit->onoff); +} + +char * +gl3_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + const Testitem *tit = data; + char buf[256]; + snprintf(buf, sizeof(buf), "Item mode %i", tit->mode); + return strdup(buf); +} + +Evas_Object * +gl3_content_get(void *data, Evas_Object *obj, const char *part) +{ + const Testitem *tit = data; + if (!strcmp(part, "elm.swallow.icon")) + { + Evas_Object *lb; + + lb = elm_label_add(obj); + elm_label_line_wrap_set(lb, ELM_WRAP_CHAR); + elm_label_wrap_width_set(lb, 201); + elm_object_text_set(lb, "ashj ascjscjh n asjkl hcjlh ls hzshnn zjh sh zxjcjsnd h dfw sdv edev efe fwefvv vsd cvs ws wf fvwf wd fwe f we wef we wfe rfwewef wfv wswf wefg sdfws w wsdcfwcf wsc vdv sdsd sdcd cv wsc sdcv wsc d sdcdcsd sdcdsc wdvd sdcsd wscxcv wssvd sd"); + return lb; + } + else if (!strcmp(part, "elm.swallow.end")) + { + Evas_Object *ck; + ck = elm_check_add(obj); + evas_object_propagate_events_set(ck, EINA_FALSE); + elm_check_state_set(ck, tit->onoff); + evas_object_smart_callback_add(ck, "changed", my_gl_item_check_changed, data); + return ck; + } + return NULL; +} + +Eina_Bool +gl3_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + return EINA_FALSE; +} + +static void +_realized(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *ei) +{ + Evas_Object *check; + Eina_List *items; + items = NULL; + + if (!ei) return; + Elm_Object_Item *item = ei; + + check = elm_object_item_part_content_get(item, "elm.swallow.end"); + + if (!check) return; + + items = eina_list_append(items, check); + elm_object_item_access_order_set(item, items); +} + +void +test_genlist4(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *gl, *bx, *bx2, *bt; + static Testitem tit[3]; + + api_data *api = calloc(1, sizeof(api_data)); + win = elm_win_util_standard_add("genlist4", "Genlist 4"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + gl = elm_genlist_add(win); + elm_genlist_mode_set(gl, ELM_LIST_COMPRESS); + elm_genlist_multi_select_set(gl, EINA_TRUE); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + api->gl = gl; + evas_object_show(gl); + + evas_object_smart_callback_add(gl, "realized", _realized, NULL); + + api->itc1 = elm_genlist_item_class_new(); + api->itc1->item_style = "default"; + api->itc1->func.text_get = gl3_text_get; + api->itc1->func.content_get = gl3_content_get; + api->itc1->func.state_get = gl3_state_get; + api->itc1->func.del = NULL; + + tit[0].mode = 0; + tit[0].item = elm_genlist_item_append(gl, api->itc1, + &(tit[0])/* item data */, NULL/* parent */, + ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + NULL/* func data */); + tit[1].mode = 1; + tit[1].item = elm_genlist_item_append(gl, api->itc1, + &(tit[1])/* item data */, NULL/* parent */, + ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + NULL/* func data */); + tit[2].mode = 2; + tit[2].item = elm_genlist_item_append(gl, api->itc1, + &(tit[2])/* item data */, NULL/* parent */, + ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + NULL/* func data */); + + elm_genlist_item_class_free(api->itc1); + elm_box_pack_end(bx, gl); + evas_object_show(bx); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "[1]"); + evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[0])); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "[2]"); + evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[1])); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "[3]"); + evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[2])); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} + + +/*** Genlist 5 *************************************************************/ +static void +my_gl_item_check_changed2(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Testitem *tit = data; + tit->onoff = elm_check_state_get(obj); + printf("item %p onoff = %i\n", tit, tit->onoff); +} + +char * +gl5_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part) +{ + const Testitem *tit = data; + char buf[256] = { 0 }; + if (!strcmp(part, "elm.text")) + { + snprintf(buf, sizeof(buf), "Item mode %i", tit->mode); + } + else if (!strcmp(part, "elm.text.sub")) + { + snprintf(buf, sizeof(buf), "%i bottles on the wall", tit->mode); + } + return strdup(buf); +} + +Evas_Object * +gl5_content_get(void *data, Evas_Object *obj, const char *part) +{ + const Testitem *tit = data; + char buf[PATH_MAX]; + if (!strcmp(part, "elm.swallow.icon")) + { + Evas_Object *bx = elm_box_add(obj); + Evas_Object *ic; + elm_box_horizontal_set(bx, EINA_TRUE); + ic = elm_icon_add(obj); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_show(ic); + elm_box_pack_end(bx, ic); + ic = elm_icon_add(obj); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_show(ic); + elm_box_pack_end(bx, ic); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + return bx; + } + else if (!strcmp(part, "elm.swallow.end")) + { + Evas_Object *ck; + ck = elm_check_add(obj); + evas_object_propagate_events_set(ck, EINA_FALSE); + elm_check_state_set(ck, tit->onoff); + evas_object_smart_callback_add(ck, "changed", my_gl_item_check_changed2, data); + evas_object_show(ck); + return ck; + } + return NULL; +} + +Eina_Bool +gl5_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + return EINA_FALSE; +} + +static void +item_drag_up(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + INF("drag up"); +} + +static void +item_drag_down(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + INF("drag down"); +} + +static void +item_drag_left(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + INF("drag left"); +} + +static void +item_drag_right(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + INF("drag right"); +} + +static void +scroll_top(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + INF("Top edge!"); +} + +static void +scroll_bottom(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + INF("Bottom edge!"); +} + +static void +scroll_left(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + INF("Left edge!"); +} + +static void +scroll_right(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + INF("Right edge!"); +} + +static void +item_drag(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + INF("drag"); +} + +static void +item_drag_stop(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + INF("drag stop"); +} + +static void +item_longpress(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + INF("longpress"); +} + +void +test_genlist5(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *gl, *bx, *bx2, *bt; + static Testitem tit[3]; + + api_data *api = calloc(1, sizeof(api_data)); + win = elm_win_util_standard_add("genlist5", "Genlist 5"); + elm_win_autodel_set(win, EINA_TRUE); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + gl = elm_genlist_add(win); + elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_ALWAYS); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + api->gl = gl; + evas_object_show(gl); + + api->itc1 = elm_genlist_item_class_new(); + api->itc1->item_style = "double_label"; + api->itc1->func.text_get = gl5_text_get; + api->itc1->func.content_get = gl5_content_get; + api->itc1->func.state_get = gl5_state_get; + api->itc1->func.del = NULL; + + tit[0].mode = 0; + tit[0].item = elm_genlist_item_append(gl, api->itc1, + &(tit[0])/* item data */, NULL/* parent */, + ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + NULL/* func data */); + tit[1].mode = 1; + tit[1].item = elm_genlist_item_append(gl, api->itc1, + &(tit[1])/* item data */, NULL/* parent */, + ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + NULL/* func data */); + tit[2].mode = 2; + tit[2].item = elm_genlist_item_append(gl, api->itc1, + &(tit[2])/* item data */, NULL/* parent */, + ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + NULL/* func data */); + + elm_box_pack_end(bx, gl); + evas_object_show(bx); + + evas_object_smart_callback_add(gl, "drag,start,up", item_drag_up, NULL); + evas_object_smart_callback_add(gl, "drag,start,down", item_drag_down, NULL); + evas_object_smart_callback_add(gl, "drag,start,left", item_drag_left, NULL); + evas_object_smart_callback_add(gl, "drag,start,right", item_drag_right, NULL); + evas_object_smart_callback_add(gl, "drag", item_drag, NULL); + evas_object_smart_callback_add(gl, "drag,stop", item_drag_stop, NULL); + evas_object_smart_callback_add(gl, "longpressed", item_longpress, NULL); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "[1]"); + evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[0])); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "[2]"); + evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[1])); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "[3]"); + evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[2])); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + elm_genlist_item_class_free(api->itc1); + evas_object_resize(win, 320, 320); + evas_object_show(win); +} + + +/*** Genlist Tree **********************************************************/ +static void +gl4_sel(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *glit = event_info; + int depth = elm_genlist_item_expanded_depth_get(glit); + printf("item sel callback %p - expanded depth = %d\n", glit, depth); +} + +static void +gl4_exp(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + api_data *api = data; + Elm_Object_Item *glit = event_info; + Evas_Object *gl = elm_object_item_widget_get(glit); + int val = (int)(uintptr_t) elm_object_item_data_get(glit); + int i = 0; + + printf("expand %p\n", glit); + val *= 10; + for (i = 0; i < 30; i++) + { + elm_genlist_item_append(gl, api->itc2, + (void *)(uintptr_t) (val + i)/* item data */, + glit/* parent */, + ELM_GENLIST_ITEM_TREE, gl4_sel/* func */, + NULL/* func data */); + } +} + +static void +gl4_con(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *glit = event_info; + const Eina_List *list = NULL, *l = NULL; + Elm_Object_Item *it = NULL; + + printf("contract request %p\n", glit); + + list = elm_genlist_item_subitems_get(glit); + EINA_LIST_FOREACH(list, l, it) + { + printf("sub item: %p %s\n", it, elm_object_item_text_get(it)); + } + + elm_genlist_item_subitems_clear(glit); +} + +static void +gl4_exp_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *glit = event_info; + printf("expand request %p\n", glit); + elm_genlist_item_expanded_set(glit, EINA_TRUE); +} + +static void +gl4_con_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *glit = event_info; + elm_genlist_item_expanded_set(glit, EINA_FALSE); +} + +static void +gl4_selected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *glit = event_info; + printf("selected %p\n", glit); +} + +static void +gl4_activated(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *glit = event_info; + printf("activated %p\n", glit); +} + +static void +gl4_unselected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *glit = event_info; + printf("unselected %p\n", glit); +} + +static void +gl4_longpressed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *glit = event_info; + printf("longpressed %p\n", glit); +} + +static void +gl4_pressed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *glit = event_info; + printf("pressed %p\n", glit); +} + +static void +gl4_released(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *glit = event_info; + printf("released %p\n", glit); +} + +char * +gl4_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + char buf[256]; + snprintf(buf, sizeof(buf), "Item mode %i", (int)(uintptr_t)data); + return strdup(buf); +} + +Evas_Object * +gl4_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part) +{ + char buf[PATH_MAX]; + if (!strcmp(part, "elm.swallow.icon")) + { + Evas_Object *ic = elm_icon_add(obj); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + evas_object_show(ic); + return ic; + } + else if (!strcmp(part, "elm.swallow.end")) + { + Evas_Object *ck; + ck = elm_check_add(obj); + evas_object_propagate_events_set(ck, EINA_FALSE); + evas_object_show(ck); + return ck; + } + return NULL; +} + +Eina_Bool +gl4_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + return EINA_FALSE; +} + +void +gl4_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED) +{ + printf("item deleted.\n"); +} + +static void +_tree_effect_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + elm_genlist_tree_effect_enabled_set(data, elm_check_state_get(obj)); +} + +static void +_tree_homogeneous_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + elm_genlist_homogeneous_set(data, elm_check_state_get(obj)); +} + +void +test_genlist6(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *gl, *bx, *fr, *bx2, *ck1, *ck2; + + api_data *api = calloc(1, sizeof(api_data)); + win = elm_win_util_standard_add("genlist-tree", "Genlist Tree"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + fr = elm_frame_add(win); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.0); + elm_object_text_set(fr, "Genlist Tree Options"); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_content_set(fr, bx2); + evas_object_show(bx2); + + ck1 = elm_check_add(win); + elm_object_text_set(ck1, "Tree Effect"); + evas_object_show(ck1); + elm_box_pack_end(bx2, ck1); + + ck2 = elm_check_add(win); + elm_object_text_set(ck2, "Homogeneous"); + evas_object_show(ck2); + elm_box_pack_end(bx2, ck2); + + gl = elm_genlist_add(win); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + api->gl = gl; + evas_object_show(gl); + evas_object_smart_callback_add(gl, "edge,left", scroll_left, NULL); + evas_object_smart_callback_add(gl, "edge,right", scroll_right, NULL); + evas_object_smart_callback_add(gl, "edge,top", scroll_top, NULL); + evas_object_smart_callback_add(gl, "edge,bottom", scroll_bottom, NULL); + + api->itc1 = elm_genlist_item_class_new(); + api->itc1->item_style = "default"; + api->itc1->func.text_get = gl4_text_get; + api->itc1->func.content_get = gl4_content_get; + api->itc1->func.state_get = gl4_state_get; + api->itc1->func.del = gl4_del; + + api->itc2 = elm_genlist_item_class_new(); + api->itc2->item_style = "tree_effect"; + api->itc2->func.text_get = gl4_text_get; + api->itc2->func.content_get = gl4_content_get; + api->itc2->func.state_get = gl4_state_get; + api->itc2->func.del = gl4_del; + + elm_genlist_item_append(gl, api->itc2, + (void *)1/* item data */, NULL/* parent */, + ELM_GENLIST_ITEM_TREE, gl4_sel/* func */, + NULL/* func data */); + elm_genlist_item_append(gl, api->itc2, + (void *)2/* item data */, NULL/* parent */, + ELM_GENLIST_ITEM_TREE, gl4_sel/* func */, + NULL/* func data */); + elm_genlist_item_append(gl, api->itc1, + (void *)3/* item data */, NULL/* parent */, + ELM_GENLIST_ITEM_NONE, gl4_sel/* func */, + NULL/* func data */); + + elm_genlist_item_class_free(api->itc1); + elm_genlist_item_class_free(api->itc2); + + evas_object_smart_callback_add(gl, "expand,request", gl4_exp_req, api); + evas_object_smart_callback_add(gl, "contract,request", gl4_con_req, api); + evas_object_smart_callback_add(gl, "expanded", gl4_exp, api); + evas_object_smart_callback_add(gl, "contracted", gl4_con, api); + + evas_object_smart_callback_add(gl, "selected", gl4_selected, api); + evas_object_smart_callback_add(gl, "unselected", gl4_unselected, api); + evas_object_smart_callback_add(gl, "activated", gl4_activated, api); + evas_object_smart_callback_add(gl, "longpressed", gl4_longpressed, api); + evas_object_smart_callback_add(gl, "pressed", gl4_pressed, api); + evas_object_smart_callback_add(gl, "released", gl4_released, api); + + evas_object_smart_callback_add(ck1, "changed", _tree_effect_changed_cb, gl); + evas_object_smart_callback_add(ck2, "changed", _tree_homogeneous_changed_cb, gl); + + elm_box_pack_end(bx, gl); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} + + +/*** Genlist 7 *************************************************************/ +struct genlist7_data +{ + Evas_Object *win, *naviframe; +}; + +static void +gl_sel7(void *data, Evas_Object *obj, void *event_info) +{ + if (!event_info) return; + api_data *api = data; + elm_genlist_item_item_class_update(event_info, api->itc2); + printf("sel item data [%p] on genlist obj [%p], item pointer [%p], new item style [%s] \n", data, obj, event_info, api->itc2->item_style); +} + +static void +_gl7_back_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct genlist7_data *info = data; + if (!info) return; + + elm_naviframe_item_pop(info->naviframe); +} + +static void +_gl7_swipe_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + struct genlist7_data *info = data; + Evas_Object *box, *entry, *button; + char item_data[] = "Just a simple test"; + + if ((!event_info) || (!data)) return; + + box = elm_box_add(info->win); + elm_box_homogeneous_set(box, EINA_FALSE); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(box); + + entry = elm_entry_add(info->win); + elm_entry_scrollable_set(entry, EINA_TRUE); + elm_entry_editable_set(entry, EINA_FALSE); + elm_object_text_set(entry, item_data); + evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(entry); + + button = elm_button_add(info->win); + elm_object_text_set(button, "back"); + evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 0); + evas_object_smart_callback_add(button, "clicked", _gl7_back_cb, + info); + evas_object_show(button); + + elm_box_pack_start(box, entry); + elm_box_pack_end(box, button); + + elm_naviframe_item_simple_push(info->naviframe, box); +} + +void +test_genlist7(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *gl, *naviframe; + static struct genlist7_data info; + static Testitem tit[3]; + + api_data *api = calloc(1, sizeof(api_data)); + win = elm_win_util_standard_add("genlist7", "Genlist 7"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + info.win = win; + + naviframe = elm_naviframe_add(win); + elm_win_resize_object_add(win, naviframe); + evas_object_size_hint_weight_set(naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(naviframe, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(naviframe); + info.naviframe = naviframe; + + gl = elm_genlist_add(win); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_smart_callback_add(gl, "swipe", _gl7_swipe_cb, &info); + api->gl = gl; + evas_object_show(gl); + elm_naviframe_item_simple_push(naviframe, gl); + + api->itc1 = elm_genlist_item_class_new(); + api->itc1->item_style = "default"; + api->itc1->func.text_get = gl2_text_get; + api->itc1->func.content_get = gl2_content_get; + api->itc1->func.state_get = gl2_state_get; + api->itc1->func.del = NULL; + + api->itc2 = elm_genlist_item_class_new(); + api->itc2->item_style = "double_label"; + api->itc2->func.text_get = gl5_text_get; + api->itc2->func.content_get = gl5_content_get; + api->itc2->func.state_get = gl5_state_get; + api->itc2->func.del = NULL; + + tit[0].mode = 0; + tit[0].item = elm_genlist_item_append(gl, api->itc1, + &(tit[0])/* item data */, NULL/* parent */, + ELM_GENLIST_ITEM_NONE, gl_sel7/* func */, + api/* func data */); + tit[1].mode = 1; + tit[1].item = elm_genlist_item_append(gl, api->itc1, + &(tit[1])/* item data */, NULL/* parent */, + ELM_GENLIST_ITEM_NONE, gl_sel7/* func */, + api/* func data */); + tit[2].mode = 2; + tit[2].item = elm_genlist_item_append(gl, api->itc1, + &(tit[2])/* item data */, NULL/* parent */, + ELM_GENLIST_ITEM_NONE, gl_sel7/* func */, + api/* func data */); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} + + +/*** Genlist Group *********************************************************/ +char *gl8_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + char buf[256]; + snprintf(buf, sizeof(buf), "Group Index # %i (Item # %i)", (int)((uintptr_t)data / 10), (int)(uintptr_t)data); + return strdup(buf); +} + +static void +_bt_show_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_genlist_item_show(data, ELM_GENLIST_ITEM_SCROLLTO_TOP); +} + +static void +_bt_bring_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_genlist_item_bring_in(data, ELM_GENLIST_ITEM_SCROLLTO_TOP); +} + +void +test_genlist8(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *gl, *bt[8], *bx, *bx2, *bx3; + Elm_Object_Item *gli = NULL, *git = NULL; + int i, bt_num; + + api_data *api = calloc(1, sizeof(api_data)); + win = elm_win_util_standard_add("genlist-group", "Genlist Group"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + gl = elm_genlist_add(win); + evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL); + evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL); + evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, gl); + api->gl = gl; + evas_object_show(gl); + + // Use homogeneous mode for group index + homogeneous test. + // Homogeneous is not mandatory for group index. + elm_genlist_homogeneous_set(gl, EINA_TRUE); + + api->itc1 = elm_genlist_item_class_new(); + api->itc1->item_style = "default"; + api->itc1->func.text_get = gl_text_get; + api->itc1->func.content_get = gl_content_get; + api->itc1->func.state_get = gl_state_get; + api->itc1->func.del = NULL; + + api->itc2 = elm_genlist_item_class_new(); + api->itc2->item_style = "group_index"; + api->itc2->func.text_get = gl8_text_get; + api->itc2->func.content_get = NULL; + api->itc2->func.state_get = NULL; + api->itc2->func.del = NULL; + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt_num = 0; + bt[bt_num] = elm_button_add(win); + elm_object_text_set(bt[bt_num], "Show 0"); + evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0); + evas_object_show(bt[bt_num]); + elm_box_pack_end(bx2, bt[bt_num]); + + bt[++bt_num] = elm_button_add(win); + elm_object_text_set(bt[bt_num], "Show 26"); + evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0); + evas_object_show(bt[bt_num]); + elm_box_pack_end(bx2, bt[bt_num]); + + bt[++bt_num] = elm_button_add(win); + elm_object_text_set(bt[bt_num], "Show 101"); + evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0); + evas_object_show(bt[bt_num]); + elm_box_pack_end(bx2, bt[bt_num]); + + bt[++bt_num] = elm_button_add(win); + elm_object_text_set(bt[bt_num], "Show 480"); + evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0); + evas_object_show(bt[bt_num]); + elm_box_pack_end(bx2, bt[bt_num]); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx3 = elm_box_add(win); + elm_box_horizontal_set(bx3, EINA_TRUE); + elm_box_homogeneous_set(bx3, EINA_TRUE); + evas_object_size_hint_weight_set(bx3, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt[++bt_num] = elm_button_add(win); + elm_object_text_set(bt[bt_num], "Bring top 0"); + evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0); + evas_object_show(bt[bt_num]); + elm_box_pack_end(bx3, bt[bt_num]); + + bt[++bt_num] = elm_button_add(win); + elm_object_text_set(bt[bt_num], "Bring top 31"); + evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0); + evas_object_show(bt[bt_num]); + elm_box_pack_end(bx3, bt[bt_num]); + + bt[++bt_num] = elm_button_add(win); + elm_object_text_set(bt[bt_num], "Bring top 239"); + evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0); + evas_object_show(bt[bt_num]); + elm_box_pack_end(bx3, bt[bt_num]); + + bt[++bt_num] = elm_button_add(win); + elm_object_text_set(bt[bt_num], "Bring top 477"); + evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0); + evas_object_show(bt[bt_num]); + elm_box_pack_end(bx3, bt[bt_num]); + + elm_box_pack_end(bx, bx3); + evas_object_show(bx3); + + for (i = 0; i < 500; i++) + { + if (!(i % 10)) + { + gli = git = elm_genlist_item_append(gl, api->itc2, + (void *)(uintptr_t)i/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_GROUP, + gl_sel/* func */, + (void *)(uintptr_t)(i * 10)/* func data */); + elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + } + else if (git) + { + gli = elm_genlist_item_append(gl, api->itc1, + (void *)(uintptr_t)i/* item data */, + git/* parent */, + ELM_GENLIST_ITEM_NONE, + gl_sel/* func */, + (void *)(uintptr_t)(i * 10)/* func data */); + } + switch (i) + { + case 0: + evas_object_smart_callback_add(bt[0], "clicked", _bt_show_cb, gli); + evas_object_smart_callback_add(bt[4], "clicked", _bt_bring_cb, gli); + break; + case 26: + evas_object_smart_callback_add(bt[1], "clicked", _bt_show_cb, gli); + break; + case 31: + evas_object_smart_callback_add(bt[5], "clicked", _bt_bring_cb, gli); + break; + case 101: + evas_object_smart_callback_add(bt[2], "clicked", _bt_show_cb, gli); + break; + case 239: + evas_object_smart_callback_add(bt[6], "clicked", _bt_bring_cb, gli); + break; + case 477: + evas_object_smart_callback_add(bt[7], "clicked", _bt_bring_cb, gli); + break; + case 480: + evas_object_smart_callback_add(bt[3], "clicked", _bt_show_cb, gli); + break; + } + } + + elm_genlist_item_class_free(api->itc1); + elm_genlist_item_class_free(api->itc2); + + evas_object_resize(win, 480, 800); + evas_object_show(win); +} + + +/*** Genlist Group Tree ****************************************************/ +static void +gl9_exp(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + api_data *api = data; + Elm_Object_Item *glit = event_info; + Evas_Object *gl = elm_object_item_widget_get(glit); + int val = (int)(uintptr_t) elm_object_item_data_get(glit); + val *= 10; + elm_genlist_item_append(gl, api->itc1, + (void *)(uintptr_t) (val + 1)/* item data */, + glit/* parent */, + ELM_GENLIST_ITEM_NONE, gl4_sel/* func */, + NULL/* func data */); + elm_genlist_item_append(gl, api->itc1, + (void *)(uintptr_t) (val + 2)/* item data */, + glit/* parent */, + ELM_GENLIST_ITEM_NONE, gl4_sel/* func */, + NULL/* func data */); + elm_genlist_item_append(gl, api->itc1, + (void *)(uintptr_t) (val + 3)/* item data */, + glit/* parent */, + ELM_GENLIST_ITEM_TREE, gl4_sel/* func */, + NULL/* func data */); +} + +static void +gl9_con(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *glit = event_info; + elm_genlist_item_subitems_clear(glit); +} + +static void +gl9_exp_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *glit = event_info; + elm_genlist_item_expanded_set(glit, EINA_TRUE); +} + +static void +gl9_con_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *glit = event_info; + elm_genlist_item_expanded_set(glit, EINA_FALSE); +} + +void +test_genlist9(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *gl, *bx; + Elm_Object_Item *git; + + api_data *api = calloc(1, sizeof(api_data)); + win = elm_win_util_standard_add("genlist-group-tree", "Genlist Group Tree"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + gl = elm_genlist_add(win); + evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL); + evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL); + evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, gl); + api->gl = gl; + evas_object_show(gl); + + api->itc1 = elm_genlist_item_class_new(); + api->itc1->item_style = "default"; + api->itc1->func.text_get = gl_text_get; + api->itc1->func.content_get = gl_content_get; + api->itc1->func.state_get = gl_state_get; + api->itc1->func.del = NULL; + + api->itc2 = elm_genlist_item_class_new(); + api->itc2->item_style = "group_index"; + api->itc2->func.text_get = gl8_text_get; + api->itc2->func.content_get = NULL; + api->itc2->func.state_get = NULL; + api->itc2->func.del = NULL; + + git = elm_genlist_item_append(gl, api->itc2, + (void *)0/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_GROUP, gl4_sel/* func */, + NULL/* func data */); + elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + + elm_genlist_item_append(gl, api->itc1, + (void *)1/* item data */, git/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */, + NULL/* func data */); + elm_genlist_item_append(gl, api->itc1, + (void *)2/* item data */, git/* parent */, ELM_GENLIST_ITEM_NONE, gl4_sel/* func */, + NULL/* func data */); + elm_genlist_item_append(gl, api->itc1, + (void *)3/* item data */, git/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */, + NULL/* func data */); + git = elm_genlist_item_append(gl, api->itc2, + (void *)4/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_GROUP, gl4_sel/* func */, + NULL/* func data */); + elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + + elm_genlist_item_append(gl, api->itc1, + (void *)5/* item data */, git/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */, + NULL/* func data */); + elm_genlist_item_append(gl, api->itc1, + (void *)6/* item data */, git/* parent */, ELM_GENLIST_ITEM_NONE, gl4_sel/* func */, + NULL/* func data */); + elm_genlist_item_append(gl, api->itc1, + (void *)7/* item data */, git/* parent */, ELM_GENLIST_ITEM_TREE, gl4_sel/* func */, + NULL/* func data */); + elm_genlist_item_class_free(api->itc1); + elm_genlist_item_class_free(api->itc2); + + evas_object_smart_callback_add(gl, "expand,request", gl9_exp_req, api); + evas_object_smart_callback_add(gl, "contract,request", gl9_con_req, api); + evas_object_smart_callback_add(gl, "expanded", gl9_exp, api); + evas_object_smart_callback_add(gl, "contracted", gl9_con, api); + + evas_object_resize(win, 480, 800); + evas_object_show(win); +} + + +/*** Genlist Decorate Item Mode ********************************************/ +static char *mode_type[] = { "slide", "rotate" }; + +char * +gl10_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part) +{ + char buf[256]; + if (!strcmp(part, "elm.text.mode")) + snprintf(buf, sizeof(buf), "Mode # %i", (int)(uintptr_t)data); + else + snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data); + return strdup(buf); +} + +Evas_Object * +gl10_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part) +{ + char buf[PATH_MAX]; + Evas_Object *ic = elm_icon_add(obj); + if (!strcmp(part, "elm.swallow.end")) + snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get()); + else + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + return ic; +} + +static void +_gl_sel10(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + if (!data) return; + int v = elm_radio_value_get(data); + if (v == 1) + elm_genlist_item_decorate_mode_set(event_info, mode_type[v], EINA_TRUE); +} + +static void +_my_gl_mode_right(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + if (!data) return; + int v = elm_radio_value_get(data); + if (v == 0) + elm_genlist_item_decorate_mode_set(event_info, mode_type[v], EINA_TRUE); +} + +static void +_my_gl_mode_left(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + if (!data) return; + int v = elm_radio_value_get(data); + if (v == 0) + elm_genlist_item_decorate_mode_set(event_info, mode_type[v], EINA_FALSE); +} + +static void +_my_gl_mode_cancel(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + fprintf(stderr, "drag\n"); + if (!data) return; + int v = elm_radio_value_get(data); + Elm_Object_Item *glit = elm_genlist_decorated_item_get(obj); + if (glit) elm_genlist_item_decorate_mode_set(glit, mode_type[v], EINA_FALSE); +} + +void +test_genlist10(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *fr, *bx, *bx2, *rd, *rdg, *gl; + int i; + + api_data *api = calloc(1, sizeof(api_data)); + win = elm_win_util_standard_add("genlist-decorate-item-mode", "Genlist Decorate Item Mode"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + fr = elm_frame_add(win); + elm_object_text_set(fr, "Decorate Item Mode Type"); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + bx2 = elm_box_add(win); + elm_object_content_set(fr, bx2); + evas_object_show(bx2); + + rd = elm_radio_add(win); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_radio_state_value_set(rd, 0); + elm_object_text_set(rd, "Slide : Sweep genlist items to the right."); + evas_object_show(rd); + elm_box_pack_end(bx2, rd); + rdg = rd; + + rd = elm_radio_add(win); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_radio_state_value_set(rd, 1); + elm_object_text_set(rd, "Rotate : Click each item."); + elm_radio_group_add(rd, rdg); + evas_object_show(rd); + elm_box_pack_end(bx2, rd); + + gl = elm_genlist_add(win); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_smart_callback_add(gl, "drag,start,right", _my_gl_mode_right, rdg); + evas_object_smart_callback_add(gl, "drag,start,left", _my_gl_mode_left, rdg); + evas_object_smart_callback_add(gl, "drag,start,up", _my_gl_mode_cancel, rdg); + evas_object_smart_callback_add(gl, "drag,start,down", _my_gl_mode_cancel, rdg); + api->gl = gl; + evas_object_show(gl); + + api->itc1 = elm_genlist_item_class_new(); + api->itc1->item_style = "default"; + api->itc1->decorate_item_style = "mode"; + api->itc1->func.text_get = gl10_text_get; + api->itc1->func.content_get = gl10_content_get; + api->itc1->func.state_get = gl_state_get; + api->itc1->func.del = NULL; + + for (i = 0; i < 50; i++) + elm_genlist_item_append(gl, + api->itc1, + (void *)(uintptr_t)(1000 + i)/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_NONE/* flags */, + _gl_sel10/* func */, + rdg/* func data */); + + elm_box_pack_end(bx, gl); + + elm_genlist_item_class_free(api->itc1); + evas_object_resize(win, 520, 520); + evas_object_show(win); +} + + +/*** Genlist Reorder Mode **************************************************/ +static void +_reorder_tg_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + elm_genlist_reorder_mode_set(data, elm_check_state_get(obj)); +} + +/** + * gl_moved is called after an item was reordered. + * This is only called when reorder mode is enabled. + * + * @param obj : the genlist object. + * @param event_info : the moved item. + * + * the item(event_info) had been moved + * + */ +static void +_gl_reorder_moved_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("\"moved\" it: %p\n", event_info); +} + +/** + * _gl_reorder_moved_after_cb is called after an item was reordered. + * This is only called when reorder mode is enabled. + * + * @param obj : the genlist object. + * @param event_info : the moved item. + * + * the item(event_info) had been moved after the given relative item(*rel_item) in list. + * + */ +static void +_gl_reorder_moved_after_cb(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info) +{ + // if needed, add application logic. + Elm_Object_Item *it = elm_genlist_item_prev_get((Elm_Object_Item *)event_info); + printf("it = %p, prev_it = %p\n", event_info, it); +} + +/** + * _gl_reorder_moved_before_cb is called after an item was reordered. + * This is only called when reorder mode is enabled. + * + * @param obj : the genlist object. + * @param event_info : the moved item. + * + * the item(event_info) had been moved before the given relative item(*rel_item) in list. + * + */ +static void +_gl_reorder_moved_before_cb(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info) +{ + // if needed, add application logic. + Elm_Object_Item *it = elm_genlist_item_next_get((Elm_Object_Item *)event_info); + printf("it = %p, next_it = %p\n", event_info, it); +} + +static void +_gl_reorder_item_focused_cb(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("\"item,focused\" it: %p\n", event_info); +} + +static void +_gl_reorder_item_unfocused_cb(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("\"item,unfocused\" it: %p\n", event_info); +} + +static void +_gl_reorder_item_selected_cb(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("\"selected\" it: %p\n", event_info); +} + +static void +_gl_reorder_item_unselected_cb(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("\"unselected\" it: %p\n", event_info); +} + +void +test_genlist_reorder(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *fr, *lb, *bx, *tg, *gl; + int i; + + api_data *api = calloc(1, sizeof(api_data)); + win = elm_win_util_standard_add("genlist-reorder-mode", "Genlist Reorder Mode"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + fr = elm_frame_add(win); + + elm_object_text_set(fr, "Reorder Mode"); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "Enable reorder mode if you want to move item.<br/>" + "Then long press and drag item."); + elm_object_content_set(fr, lb); + evas_object_show(lb); + + gl = elm_genlist_add(win); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + api->gl = gl; + evas_object_show(gl); + + tg = elm_check_add(win); + elm_object_style_set(tg, "toggle"); + elm_object_text_set(tg, "Reorder Mode:"); + elm_check_state_set(tg, elm_config_mirrored_get()); + evas_object_smart_callback_add(tg, "changed", _reorder_tg_changed_cb, gl); + elm_box_pack_end(bx, tg); + evas_object_show(tg); + + api->itc1 = elm_genlist_item_class_new(); + api->itc1->item_style = "default"; + api->itc1->func.text_get = gl_text_get; + api->itc1->func.content_get = gl_content_get; + api->itc1->func.state_get = gl_state_get; + api->itc1->func.del = NULL; + evas_object_smart_callback_add(gl, "moved", _gl_reorder_moved_cb, NULL); + evas_object_smart_callback_add(gl, "moved,after", _gl_reorder_moved_after_cb, NULL); + evas_object_smart_callback_add(gl, "moved,before", _gl_reorder_moved_before_cb, NULL); + evas_object_smart_callback_add(gl, "item,focused", _gl_reorder_item_focused_cb, NULL); + evas_object_smart_callback_add(gl, "item,unfocused", _gl_reorder_item_unfocused_cb, NULL); + evas_object_smart_callback_add(gl, "selected", _gl_reorder_item_selected_cb, NULL); + evas_object_smart_callback_add(gl, "unselected", _gl_reorder_item_unselected_cb, NULL); + + for (i = 0; i < 50; i++) + elm_genlist_item_append(gl, + api->itc1, + (void *)(uintptr_t)(1 + i)/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_NONE/* flags */, + NULL/* func */, + NULL/* func data */); + + elm_genlist_item_class_free(api->itc1); + + elm_box_pack_end(bx, gl); + + evas_object_resize(win, 400, 500); + evas_object_show(win); +} + + +/*** Genlist Textblock *****************************************************/ +char *gl12_text_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + return strdup("Enlightenment is not just a window manager for Linux/X11 and others, but also a whole suite of libraries to help you create beautiful user interfaces with much less work than doing it the old fashioned way and fighting with traditional toolkits, not to mention a traditional window manager. It covers uses from small mobile devices like phones all the way to powerful multi-core desktops (which are the primary development environment)."); +} + +void +test_genlist12(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *gl; + int i; + api_data *api = calloc(1, sizeof(api_data)); + + win = elm_win_util_standard_add("genlist-textblock", "Genlist Textblock"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + gl = elm_genlist_add(win); + elm_genlist_mode_set(gl, ELM_LIST_COMPRESS); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, gl); + api->gl = gl; + evas_object_show(gl); + + api->itc1 = elm_genlist_item_class_new(); + api->itc1->item_style = "message"; + api->itc1->func.text_get = gl12_text_get; + api->itc1->func.state_get = gl_state_get; + api->itc1->func.del = NULL; + + for (i = 0; i < 1000; i++) + { + elm_genlist_item_append(gl, api->itc1, + (void *)(uintptr_t)i/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_NONE, + gl_sel/* func */, + (void *)(uintptr_t)(i * 10)/* func data */); + } + elm_genlist_item_class_free(api->itc1); + + evas_object_resize(win, 400, 500); + evas_object_show(win); +} + + +/*** Genlist Tree, Insert Sorted *******************************************/ +static int +gl13_cmp(const void *pa, const void *pb) +{ + const Elm_Object_Item *ia = pa, *ib = pb; + int a = (int)(uintptr_t) elm_object_item_data_get(ia); + int b = (int)(uintptr_t) elm_object_item_data_get(ib); + return a - b; +} + +void +test_genlist13(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Elm_Object_Item *pi[6]; + Evas_Object *win, *bx, *gl; int i, base, idx[3] = {1, 10, 15}; + + api_data *api = calloc(1, sizeof(api_data)); + win = elm_win_util_standard_add("genlist-tree-insert-sorted", "Genlist Tree, Insert Sorted"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + gl = elm_genlist_add(win); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(gl); + + api->itc2 = elm_genlist_item_class_new(); + api->itc2->item_style = "default"; + api->itc2->func.text_get = gl4_text_get; + api->itc2->func.content_get = NULL; + api->itc2->func.state_get = NULL; + api->itc2->func.del = NULL; + + /* mixed order to test insert sorted */ + + for (i = 0; i < 3; i++) + { + pi[i] = elm_genlist_item_sorted_insert + (gl, api->itc2, (void *)(uintptr_t)idx[i]/* item data */, NULL/* parent */, + ELM_GENLIST_ITEM_TREE, gl13_cmp/* cmp */, + NULL/* func */, NULL/* func data */); + } + + for (i = 0, base = 100; i < 3; i++, base += 100) + { + int j; + for (j = 0; j < 3; j++) + { + elm_genlist_item_sorted_insert + (gl, api->itc2, (void *)(uintptr_t)(idx[j] + base)/* item data */, + pi[i]/* parent */, ELM_GENLIST_ITEM_NONE, + gl13_cmp/* cmp */, NULL/* func */, NULL/* func data */); + } + } + + for (i = 0; i < 3; i++) + { + pi[i + 3] = elm_genlist_item_sorted_insert + (gl, api->itc2, (void *)(uintptr_t)(idx[i] * 2)/* item data */, NULL/* parent */, + ELM_GENLIST_ITEM_TREE, gl13_cmp/* cmp */, NULL/* func */, + NULL/* func data */); + } + + + for (i = 0, base = 10000; i < 3; i++, base += 10000) + { + int j; + for (j = 0; j < 3; j++) + { + elm_genlist_item_sorted_insert + (gl, api->itc2, (void *)(uintptr_t)(idx[j] + base)/* item data */, + pi[i + 3]/* parent */, ELM_GENLIST_ITEM_NONE, + gl13_cmp/* cmp */, NULL/* func */, NULL/* func data */); + } + } + elm_genlist_item_class_free(api->itc2); + elm_box_pack_end(bx, gl); + evas_object_show(bx); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} + + +/*** Genlist Tree, Insert Relative *****************************************/ +static void +my_gl_insert_before_rel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + api_data *api = data; + Evas_Object *gl = api->gl; + static int i = 1000; + Elm_Object_Item *gli_selected; + + if (!api->itc1) api->itc1 = elm_genlist_item_class_new(); + api->itc1->item_style = "default"; + api->itc1->func.text_get = gl_text_get; + api->itc1->func.content_get = NULL; + api->itc1->func.state_get = NULL; + api->itc1->func.del = NULL; + + gli_selected = elm_genlist_selected_item_get(gl); + if (!gli_selected) + { + printf("no item selected\n"); + return; + } + + elm_genlist_item_insert_before(gl, api->itc1, + (void *)(uintptr_t)i/* item data */, + elm_genlist_item_parent_get(gli_selected), + gli_selected/* item before */, + ELM_GENLIST_ITEM_NONE, + NULL/* func */, NULL/* func data */); + i++; +} + +static void +my_gl_insert_after_rel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + api_data *api = data; + Evas_Object *gl = api->gl; + static int i = 0; + Elm_Object_Item *gli_selected; + + if (!api->itc1) api->itc1 = elm_genlist_item_class_new(); + api->itc1->item_style = "default"; + api->itc1->func.text_get = gl_text_get; + api->itc1->func.content_get = NULL; + api->itc1->func.state_get = NULL; + api->itc1->func.del = NULL; + + gli_selected = elm_genlist_selected_item_get(gl); + if (!gli_selected) + { + printf("no item selected\n"); + return; + } + + elm_genlist_item_insert_after(gl, api->itc1, + (void *)(uintptr_t)i/* item data */, + elm_genlist_item_parent_get(gli_selected), + gli_selected/* item after */, + ELM_GENLIST_ITEM_NONE, + NULL/* func */, NULL/* func data */); + i++; +} + +void +test_genlist14(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Elm_Object_Item *pi[6]; + Evas_Object *win, *bx, *bx2, *bt, *gl; + int i, base; + /* index: 0, 1, 2, 3, 4, 5 + * items: 1, 15, 11, 2, 33, 21 + * final: 1, 2, 11, 15, 21, 33 + */ + const int idx[6] = {1, 15, 11, 2, 33, 21}; + const int relative[6] = { + 0, /* item '1' - not used */ + 0, /* item '15' - insert after pi[0], item '1' */ + -1, /* item '11' - insert before pi[1], item '15' */ + -2, /* item '2' - insert before pi[2], item '11' */ + 1, /* item '33' - insert after pi[1], item '15' */ + -4 /* item '21' - insert before pi[4], item '33' */ + }; + + api_data *api = calloc(1, sizeof(api_data)); + win = elm_win_util_standard_add("genlist-tree-insert-relative", "Genlist Tree, Insert Relative"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + gl = elm_genlist_add(win); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + api->gl = gl; + evas_object_show(gl); + + api->itc2 = elm_genlist_item_class_new(); + api->itc2->item_style = "default"; + api->itc2->func.text_get = gl4_text_get; + api->itc2->func.content_get = NULL; + api->itc2->func.state_get = NULL; + api->itc2->func.del = NULL; + + /* mixed order to test insert sorted */ + + // BUG1: should be able to insert before=NULL, prepend + // BUG2: should be able to insert after=NULL, append + + pi[0] = elm_genlist_item_append + (gl, api->itc2, (void *)(uintptr_t)idx[0]/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */); + + for (i = 1; i < 3; i++) + { + if (relative[i] < 0) + pi[i] = elm_genlist_item_insert_before + (gl, api->itc2, (void *)(uintptr_t)idx[i]/* item data */, + NULL/* parent */, pi[-relative[i]], + ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */); + else + pi[i] = elm_genlist_item_insert_after + (gl, api->itc2, (void *)(uintptr_t)idx[i]/* item data */, + NULL/* parent */, pi[relative[i]], + ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */); + } + + for (i = 0; i < 3; i++) + { + Elm_Object_Item *sub_glit[6]; + int j; + + base = 1000 * (int)(uintptr_t) elm_object_item_data_get(pi[i]); + + sub_glit[0] = elm_genlist_item_append + (gl, api->itc2, (void *)(uintptr_t) (idx[0] + base)/* item data */, pi[i]/* parent */, + ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */); + + for (j = 1; j < 6; j++) { + if (relative[j] < 0) + sub_glit[j] = elm_genlist_item_insert_before + (gl, api->itc2, (void *)(uintptr_t) (idx[j] + base)/* item data */, + pi[i]/* parent */, sub_glit[-relative[j]], + ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */); + else + sub_glit[j] = elm_genlist_item_insert_after + (gl, api->itc2, (void *)(uintptr_t) (idx[j] + base)/* item data */, + pi[i]/* parent */, sub_glit[relative[j]], + ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */); + } + } + + for (i = 3; i < 6; i++) + { + if (relative[i] < 0) + pi[i] = elm_genlist_item_insert_before + (gl, api->itc2, (void *)(uintptr_t) idx[i]/* item data */, + NULL/* parent */, pi[-relative[i]], + ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */); + else + pi[i] = elm_genlist_item_insert_after + (gl, api->itc2, (void *)(uintptr_t) idx[i]/* item data */, + NULL/* parent */, pi[relative[i]], + ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */); + } + + for (i = 3; i < 6; i++) + { + Elm_Object_Item *sub_glit[6]; + int j; + + base = 1000 * (int)(uintptr_t) elm_object_item_data_get(pi[i]); + + sub_glit[0] = elm_genlist_item_append + (gl, api->itc2, (void *)(uintptr_t) (idx[0] + base)/* item data */, pi[i]/* parent */, + ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */); + + for (j = 1; j < 6; j++) { + if (relative[j] < 0) + sub_glit[j] = elm_genlist_item_insert_before + (gl, api->itc2, (void *)(uintptr_t) (idx[j] + base)/* item data */, + pi[i]/* parent */, sub_glit[-relative[j]], + ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */); + else + sub_glit[j] = elm_genlist_item_insert_after + (gl, api->itc2, (void *)(uintptr_t) (idx[j] + base)/* item data */, + pi[i]/* parent */, sub_glit[relative[j]], + ELM_GENLIST_ITEM_TREE, NULL/* func */, NULL/* func data */); + } + } + + elm_box_pack_end(bx, gl); + evas_object_show(bx); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "+ before"); + evas_object_smart_callback_add(bt, "clicked", my_gl_insert_before_rel, api); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "+ after"); + evas_object_smart_callback_add(bt, "clicked", my_gl_insert_after_rel, api); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + /* item_class_ref is needed for itc2. some items can be added in callbacks */ + elm_genlist_item_class_ref(api->itc2); + elm_genlist_item_class_free(api->itc2); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} + + +/*** Genlist Decorate All Mode *********************************************/ +static void +_edit_icon_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Elm_Object_Item *item = (Elm_Object_Item *)data; + elm_object_item_del(item); +} + +char * +gl15_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + const Testitem *tit = data; + char buf[256]; + snprintf(buf, sizeof(buf), "Item #%i", tit->mode); + return strdup(buf); +} + +Evas_Object * +gl15_content_get(void *data, Evas_Object *obj, const char *part) +{ + Testitem *tit = data; + char buf[PATH_MAX]; + + // "edit" EDC layout is like below. each part is swallow part. + // the existing item is swllowed to elm.swallow.edit.content part. + // -------------------------------------------------------------------- + // | elm.edit.icon.1 | elm.swallow.decorate.content | elm.edit.icon,2 | + // -------------------------------------------------------------------- + + if (!strcmp(part, "elm.swallow.end")) + { + Evas_Object *ic = elm_icon_add(obj); + snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + return ic; + } + else if (!strcmp(part, "elm.edit.icon.1")) + { + Evas_Object *ck; + ck = elm_check_add(obj); + elm_check_state_pointer_set(ck, &tit->checked); + evas_object_propagate_events_set(ck, EINA_FALSE); + evas_object_show(ck); + return ck; + } + else if (!strcmp(part, "elm.edit.icon.2")) + { + Evas_Object *icn = elm_icon_add(obj); + snprintf(buf, sizeof(buf), "%s/images/icon_06.png", elm_app_data_dir_get()); + elm_image_file_set(icn, buf, NULL); + evas_object_propagate_events_set(icn, EINA_FALSE); + evas_object_size_hint_aspect_set(icn, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + evas_object_smart_callback_add(icn, "clicked", _edit_icon_clicked_cb, (void *)tit->item); + return icn; + } + else return NULL; +} + +static void +gl15_sel(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Testitem *tit = data; + if (elm_genlist_decorate_mode_get(obj)) + { + if (!tit->checked) tit->checked = EINA_TRUE; + else tit->checked = EINA_FALSE; + } + elm_genlist_item_update(tit->item); +} + +static void +gl15_deco_all_mode(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_genlist_decorate_mode_set(data, EINA_TRUE); + elm_genlist_select_mode_set(data, ELM_OBJECT_SELECT_MODE_ALWAYS); +} + +static void +gl15_normal_mode(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_genlist_decorate_mode_set(data, EINA_FALSE); + elm_genlist_select_mode_set(data, ELM_OBJECT_SELECT_MODE_DEFAULT); +} + +void +gl15_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED) +{ + Testitem *ti = data; + printf("item deleted. (# %d)\n", ti->mode); +} + +void +test_genlist15(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bx2, *bt, *gl; + int i; + static Testitem tit[100]; + + api_data *api = calloc(1, sizeof(api_data)); + win = elm_win_util_standard_add("genlist-decorate-all-mode", "Genlist Decorate All Mode"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + gl = elm_genlist_add(win); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + api->gl = gl; + evas_object_show(gl); + + api->itc1 = elm_genlist_item_class_new(); + api->itc1->item_style = "default"; + api->itc1->func.text_get = gl15_text_get; + api->itc1->func.content_get = gl15_content_get; + api->itc1->func.state_get = gl_state_get; + api->itc1->func.del = gl15_del; + api->itc1->decorate_all_item_style = "edit"; + + for (i = 0; i < 100; i++) + { + tit[i].mode = i; + tit[i].item = elm_genlist_item_append(gl, api->itc1, + &(tit[i])/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_NONE/* flags */, + gl15_sel/* func */, + (void *)(uintptr_t)&(tit[i])/* func data */); + } + elm_genlist_item_class_free(api->itc1); + elm_box_pack_end(bx, gl); + evas_object_show(bx); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Decorate All mode"); + evas_object_smart_callback_add(bt, "clicked", gl15_deco_all_mode, gl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Normal mode"); + evas_object_smart_callback_add(bt, "clicked", gl15_normal_mode,gl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 520, 520); + evas_object_show(win); +} + + +/*** Genlist Flip Mode *****************************************************/ +static void +_flip_icon_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + const Testitem *tit = data; + + if (elm_genlist_item_flip_get(tit->item)) + elm_genlist_item_flip_set(tit->item, EINA_FALSE); + else + elm_genlist_item_flip_set(tit->item, EINA_TRUE); +} + +char * +gl16_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + const Testitem *tit = data; + char buf[256]; + snprintf(buf, sizeof(buf), "Item #%i", tit->mode); + return strdup(buf); +} + +Evas_Object * +gl16_content_get(void *data, Evas_Object *obj, const char *part) +{ + Testitem *tit = data; + char buf[PATH_MAX]; + + if (!strcmp(part, "elm.text.flip")) + { + Evas_Object *btn = elm_button_add(obj); + elm_object_text_set(btn, "flipped content placement"); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(btn, "clicked", _flip_icon_clicked_cb, (void *)tit); + evas_object_show(btn); + return btn; + } + else if (!strcmp(part, "elm.edit.icon.1")) + { + Evas_Object *icn = elm_icon_add(obj); + snprintf(buf, sizeof(buf), "%s/images/icon_04.png", elm_app_data_dir_get()); + elm_image_file_set(icn, buf, NULL); + evas_object_propagate_events_set(icn, EINA_FALSE); + evas_object_size_hint_aspect_set(icn, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + return icn; + } + else if (!strcmp(part, "elm.edit.icon.2")) + { + Evas_Object *icn = elm_icon_add(obj); + snprintf(buf, sizeof(buf), "%s/images/icon_09.png", elm_app_data_dir_get()); + elm_image_file_set(icn, buf, NULL); + evas_object_propagate_events_set(icn, EINA_FALSE); + evas_object_size_hint_aspect_set(icn, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + evas_object_smart_callback_add(icn, "clicked", _flip_icon_clicked_cb, (void *)tit); + return icn; + } + else return NULL; +} + +void +test_genlist16(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *gl; + int i; + static Testitem tit[100]; + + api_data *api = calloc(1, sizeof(api_data)); + win = elm_win_util_standard_add("genlist-flip-mode", "Genlist Flip Mode"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + gl = elm_genlist_add(win); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + api->gl = gl; + evas_object_show(gl); + + /* note: flip mode can be used with/without edit mode */ + elm_genlist_decorate_mode_set(gl, EINA_TRUE); + elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_ALWAYS); + + api->itc1 = elm_genlist_item_class_new(); + api->itc1->item_style = "default"; + api->itc1->func.text_get = gl16_text_get; + api->itc1->func.content_get = gl16_content_get; + api->itc1->func.state_get = gl_state_get; + api->itc1->func.del = NULL; + api->itc1->decorate_all_item_style = "edit"; + + for (i = 0; i < 100; i++) + { + tit[i].mode = i; + tit[i].item = elm_genlist_item_append(gl, api->itc1, + &(tit[i])/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_NONE/* flags */, + gl_sel/* func */, + (void *)(uintptr_t)&(tit[i])/* func data */); + } + elm_genlist_item_class_free(api->itc1); + elm_box_pack_end(bx, gl); + evas_object_show(bx); + + evas_object_resize(win, 520, 520); + evas_object_show(win); +} + + +/*** Genlist Decorate Modes ************************************************/ +char * +gl17_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part) +{ + const Testitem *tit = data; + char buf[256]; + if (!strcmp(part, "elm.text.mode")) + snprintf(buf, sizeof(buf), "Mode # %i", tit->mode); + else + snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data); + return strdup(buf); +} + +Evas_Object * +_decorate_item_mode_frame_new(Evas_Object *win, Evas_Object **rdg) +{ + Evas_Object *fr, *bx, *rd; + + fr = elm_frame_add(win); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(fr, "Decorate Item Mode Type"); + evas_object_show(fr); + + bx = elm_box_add(win); + elm_object_content_set(fr, bx); + evas_object_show(bx); + + rd = elm_radio_add(win); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_radio_state_value_set(rd, 0); + elm_object_text_set(rd, "Slide : Sweep genlist items to the right."); + evas_object_show(rd); + elm_box_pack_end(bx, rd); + *rdg = rd; + + rd = elm_radio_add(win); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_radio_state_value_set(rd, 1); + elm_object_text_set(rd, "Rotate : Click each item."); + elm_radio_group_add(rd, *rdg); + evas_object_show(rd); + elm_box_pack_end(bx, rd); + + return fr; +} + +void +_decorate_all_set_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + if (!data) return; + + Evas_Object *gl; + gl = evas_object_data_get(obj, "gl"); + if (!gl) return; + + if (evas_object_data_get(gl, "tree_effect")) + elm_genlist_tree_effect_enabled_set(gl, EINA_FALSE); + elm_genlist_decorate_mode_set(gl, EINA_TRUE); +} + +void +_decorate_all_unset_btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + if (evas_object_data_get(data, "tree_effect")) + elm_genlist_tree_effect_enabled_set(data, EINA_TRUE); + elm_genlist_decorate_mode_set(data, EINA_FALSE); +} + +Evas_Object * +_decorate_all_mode_frame_new(Evas_Object *win, Evas_Object *rdg, Evas_Object *gl) +{ + Evas_Object *fr, *bx, *btn; + + fr = elm_frame_add(win); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(fr, "Decorate All Mode Type"); + evas_object_show(fr); + + bx = elm_box_add(win); + elm_object_content_set(fr, bx); + evas_object_show(bx); + + btn = elm_button_add(win); + evas_object_data_set(btn, "gl", gl); + elm_object_text_set(btn, "Set Decorate All Mode"); + evas_object_smart_callback_add(btn, "clicked", _decorate_all_set_btn_clicked_cb, rdg); + elm_box_pack_end(bx, btn); + evas_object_show(btn); + + btn = elm_button_add(win); + elm_object_text_set(btn, "Unset Decorate All Mode"); + evas_object_smart_callback_add(btn, "clicked", _decorate_all_unset_btn_clicked_cb, gl); + elm_box_pack_end(bx, btn); + evas_object_show(btn); + + return fr; +} + +void +test_genlist17(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *fr1, *fr2, *bx, *bx2, *rdg = NULL, *gl; + int i; + static Testitem tit[50]; + + api_data *api = calloc(1, sizeof(api_data)); + win = elm_win_util_standard_add("genlist-decorate-modes", "Genlist Decorate Modes"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + bx2 = elm_box_add(win); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + fr1 = _decorate_item_mode_frame_new(win, &rdg); + elm_box_pack_end(bx2, fr1); + + gl = elm_genlist_add(win); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_smart_callback_add(gl, "drag,start,right", _my_gl_mode_right, rdg); + evas_object_smart_callback_add(gl, "drag,start,left", _my_gl_mode_left, rdg); + evas_object_smart_callback_add(gl, "drag,start,up", _my_gl_mode_cancel, rdg); + evas_object_smart_callback_add(gl, "drag,start,down", _my_gl_mode_cancel, rdg); + api->gl = gl; + evas_object_show(gl); + + api->itc1 = elm_genlist_item_class_new(); + api->itc1->item_style = "default"; + api->itc1->decorate_item_style = "mode"; + api->itc1->func.text_get = gl15_text_get; + api->itc1->func.content_get = gl15_content_get; + api->itc1->func.state_get = gl_state_get; + api->itc1->func.del = NULL; + api->itc1->decorate_all_item_style = "edit"; + + for (i = 0; i < 50; i++) + { + tit[i].checked = EINA_FALSE; + tit[i].mode = i; + tit[i].item = elm_genlist_item_append(gl, + api->itc1, + &(tit[i])/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_NONE/* flags */, + NULL/* select func */, + NULL/* func data */); + } + + elm_genlist_item_class_free(api->itc1); + elm_box_pack_end(bx, gl); + + fr2 = _decorate_all_mode_frame_new(win, rdg, gl); + elm_box_pack_end(bx2, fr2); + + evas_object_resize(win, 520, 520); + evas_object_show(win); +} + + +/*** Genlist Tree and Decorate All Mode ************************************/ +static void +_tree_effect_enable_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_genlist_tree_effect_enabled_set(data, EINA_TRUE); +} + +static void +_tree_effect_disable_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_genlist_tree_effect_enabled_set(data, EINA_FALSE); +} + +Evas_Object * +_tree_effect_frame_new(Evas_Object *win, Evas_Object **rdg, Evas_Object *gl) +{ + Evas_Object *fr, *bx, *rd; + + fr = elm_frame_add(win); + elm_object_text_set(fr, "Genlist Tree Effect"); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(fr); + + bx = elm_box_add(win); + elm_box_homogeneous_set(bx, EINA_TRUE); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_content_set(fr, bx); + evas_object_show(bx); + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, 0); + elm_object_text_set(rd, "Enable"); + evas_object_smart_callback_add(rd, "changed", _tree_effect_enable_cb, gl); + evas_object_show(rd); + elm_box_pack_end(bx, rd); + *rdg = rd; + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, 1); + elm_radio_group_add(rd, *rdg); + elm_object_text_set(rd, "Disable"); + evas_object_smart_callback_add(rd, "changed", _tree_effect_disable_cb, gl); + evas_object_show(rd); + elm_box_pack_end(bx, rd); + + + return fr; +} + +static void +gl18_sel(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *glit = event_info; + int depth = elm_genlist_item_expanded_depth_get(glit); + printf("expanded depth for selected item is %d\n", depth); +} + +static void +gl18_del(void *data, Evas_Object *obj EINA_UNUSED) +{ + free(data); +} + +static void +gl18_exp(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + api_data *api = data; + Elm_Object_Item *glit = event_info; + Evas_Object *gl = elm_object_item_widget_get(glit); + Testitem *tit = elm_object_item_data_get(glit); + int i, j, val; + + val = tit->mode * 10; + for (i = 0; i < 100; i++) + { + tit = calloc(1, sizeof(Testitem)); + tit->mode = val + i; + tit->item = elm_genlist_item_append(gl, + api->itc2, + tit/* item data */, + glit/* parent */, + ELM_GENLIST_ITEM_TREE, + gl18_sel/* func */, + NULL/* func data */); + } + for (j = 0; j < 3; j++) + { + tit = calloc(1, sizeof(Testitem)); + tit->mode = i; + tit->item = elm_genlist_item_append(gl, + api->itc1, + tit/* item data */, + glit/* parent */, + ELM_GENLIST_ITEM_NONE, + gl18_sel/* func */, + NULL/* func data */); + i++; + } +} + +static void +gl18_con(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *glit = event_info; + elm_genlist_item_subitems_clear(glit); +} + +static void +gl18_exp_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + Elm_Object_Item *glit = event_info; + elm_genlist_item_expanded_set(glit, EINA_TRUE); +} + +static void +gl18_con_req(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + Elm_Object_Item *glit = event_info; + elm_genlist_item_expanded_set(glit, EINA_FALSE); +} + +void +test_genlist18(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *gl, *bx, *fr1, *fr2, *bx2, *rdg; + Testitem *tit = NULL; + int i, j; + + api_data *api = calloc(1, sizeof(api_data)); + win = elm_win_util_standard_add("genlist-tree-decorate-all", + "Genlist Tree and Decorate All Mode"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + bx2 = elm_box_add(win); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + gl = elm_genlist_add(win); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + api->gl = gl; + evas_object_show(gl); + + elm_genlist_tree_effect_enabled_set(gl, EINA_TRUE); + evas_object_data_set(gl, "tree_effect", "true"); + + /* normal item */ + api->itc1 = elm_genlist_item_class_new(); + api->itc1->item_style = "tree_effect"; /* item/tree_effect */ + api->itc1->func.text_get = gl15_text_get; + api->itc1->func.content_get = gl15_content_get; + api->itc1->func.state_get = gl_state_get; + api->itc1->func.del = gl18_del; + api->itc1->decorate_all_item_style = "edit"; + + /* expandable item */ + api->itc2 = elm_genlist_item_class_new(); + api->itc2->item_style = "tree_effect"; /* tree/tree_effect */ + api->itc2->func.text_get = gl15_text_get; + api->itc2->func.content_get = gl15_content_get; + api->itc2->func.state_get = gl_state_get; + api->itc2->func.del = gl18_del; + api->itc2->decorate_all_item_style = "edit"; + + for (i = 0; i < 5; i++) + { + tit = calloc(1, sizeof(Testitem)); + tit->mode = i; + tit->item = elm_genlist_item_append(gl, + api->itc2, + tit/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_TREE, + gl18_sel/* func */, + NULL/* func data */); + } + + for (j = 0; j < 3; j++) + { + tit = calloc(1, sizeof(Testitem)); + tit->mode = i; + tit->item = elm_genlist_item_append(gl, + api->itc1, + tit/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_NONE, + gl18_sel/* func */, + NULL/* func data */); + i++; + } + + elm_genlist_item_class_free(api->itc1); + elm_genlist_item_class_free(api->itc2); + + evas_object_smart_callback_add(gl, "expand,request", gl18_exp_req, api); + evas_object_smart_callback_add(gl, "contract,request", gl18_con_req, api); + evas_object_smart_callback_add(gl, "expanded", gl18_exp, api); + evas_object_smart_callback_add(gl, "contracted", gl18_con, api); + + elm_box_pack_end(bx, gl); + + fr1 = _tree_effect_frame_new(win, &rdg, gl); + elm_box_pack_end(bx2, fr1); + + fr2 = _decorate_all_mode_frame_new(win, rdg, gl); + elm_box_pack_end(bx2, fr2); + + evas_object_resize(win, 400, 800); + evas_object_show(win); +} + + +/*** Genlist Full Widget ***************************************************/ +void +test_genlist19(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *gl, *bt_50, *bt_1500, *bx, *bxx, *bt; + Evas_Object *over; + Elm_Object_Item *gli; + int i; + api_data *api = calloc(1, sizeof(api_data)); + + win = elm_win_util_standard_add("genlist-full", "Genlist Full Widget"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bxx = elm_box_add(win); + elm_win_resize_object_add(win, bxx); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bxx); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + api->box = bx; + evas_object_show(bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Next API function"); + evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, bt); + elm_object_disabled_set(bt, api->state == API_STATE_LAST); + evas_object_show(bt); + + elm_box_pack_end(bxx, bx); + + gl = elm_genlist_add(win); + evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL); + evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL); + evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL); + // FIXME: This causes genlist to resize the horiz axis very slowly :( + // Reenable this and resize the window horizontally, then try to resize it back + //elm_genlist_mode_set(gl, ELM_LIST_LIMIT); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, gl); + api->gl = gl; + evas_object_show(gl); + + over = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(over, 0, 0, 0, 0); + evas_object_event_callback_add(over, EVAS_CALLBACK_MOUSE_MOVE, _move, gl); + evas_object_repeat_events_set(over, EINA_TRUE); + evas_object_show(over); + evas_object_size_hint_weight_set(over, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, over); + + api->itc1 = elm_genlist_item_class_new(); + api->itc1->item_style = "full"; + api->itc1->func.text_get = NULL; + api->itc1->func.content_get = gl_content_full_get; + api->itc1->func.state_get = gl_state_get; + api->itc1->func.del = NULL; + + bt_50 = elm_button_add(win); + elm_object_text_set(bt_50, "Go to 50"); + evas_object_show(bt_50); + elm_box_pack_end(bx, bt_50); + + bt_1500 = elm_button_add(win); + elm_object_text_set(bt_1500, "Go to 1500"); + evas_object_show(bt_1500); + elm_box_pack_end(bx, bt_1500); + + for (i = 0; i < 2000; i++) + { + gli = elm_genlist_item_append(gl, api->itc1, + (void *)(uintptr_t)i/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_NONE, + gl_sel/* func */, + (void *)(uintptr_t)(i * 10)/* func data */); + if (i == 50) + evas_object_smart_callback_add(bt_50, "clicked", _bt50_cb, gli); + else if (i == 1500) + evas_object_smart_callback_add(bt_1500, "clicked", _bt1500_cb, gli); + } + elm_genlist_item_class_free(api->itc1); + + evas_object_resize(win, 480, 800); + evas_object_show(win); +} + + +/*** Genlist Item Styles ***************************************************/ +const char *_genlist_styles[] = { + "default", "full", "one_icon", "end_icon", "no_icon", + "default_style", "double_label", "icon_top_text_bottom", + "message", "media", "media-album", "media-preview", + NULL +}; + +static void +_genlist_renew(Evas_Object *obj, const char *style) +{ + Elm_Genlist_Item_Class *ic; + Evas_Object *check; + int i; + + if (!obj) return; + + elm_genlist_clear(obj); + + check = evas_object_data_get(obj, "check"); + if (elm_check_state_get(check)) + elm_genlist_mode_set(obj, ELM_LIST_COMPRESS); + else + elm_genlist_mode_set(obj, ELM_LIST_SCROLL); + + ic = elm_genlist_item_class_new(); + ic->item_style = style; + ic->func.text_get = gl_text_get; + ic->func.content_get = gl_content_get; + ic->func.state_get = NULL; + ic->func.del = NULL; + + for (i = 0; i < 50; i++) + { + elm_genlist_item_append(obj, ic, (void *)(uintptr_t)i, NULL, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + } + elm_genlist_item_class_free(ic); +} + +static void +_item_style_sel_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info) +{ + Evas_Object *gl = evas_object_data_get(obj, "genlist"); + if (gl) + _genlist_renew(gl, elm_object_item_text_get(event_info)); +} + +static Evas_Object * +_item_styles_list_create(Evas_Object *parent) +{ + Evas_Object *list; + int i = 0; + + list = elm_list_add(parent); + 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); + + while (_genlist_styles[i]) + { + elm_list_item_append(list, _genlist_styles[i], NULL, NULL, + _item_style_sel_cb, _genlist_styles[i]); + i++; + } + + return list; +} + +void +test_genlist_item_styles(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *box, *gl, *list, *table, *check; + + win = elm_win_util_standard_add("genlist-item-styles", "Genlist Item Styles"); + elm_win_autodel_set(win, EINA_TRUE); + + box = elm_box_add(win); + elm_box_horizontal_set(box, EINA_TRUE); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + list = _item_styles_list_create(box); + evas_object_show(list); + + table = _elm_min_set(list, box, 200, 0); + evas_object_size_hint_weight_set(table, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, table); + evas_object_show(table); + + gl = elm_genlist_add(box); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, gl); + evas_object_show(gl); + + check = elm_check_add(win); + elm_object_text_set(check, "Compress"); + elm_box_pack_end(box, check); + evas_object_show(check); + evas_object_data_set(gl, "check", check); + _genlist_renew(gl, "default"); + + evas_object_data_set(list, "genlist", gl); + + evas_object_resize(win, 600, 600); + evas_object_show(win); +} + + +/*** Genlist Multi Select **************************************************/ +typedef struct _Genlist_Multi_Data Genlist_Multi_Data; +struct _Genlist_Multi_Data +{ + Evas_Object *gl; + Evas_Object *rd1; + Evas_Object *rd2; +}; + +static void +_multi_select_changed_cb(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Eina_Bool multi = elm_check_state_get(obj); + Genlist_Multi_Data *gd = data; + if (!gd) return; + + elm_genlist_multi_select_set(gd->gl, multi); + elm_object_disabled_set(gd->rd1, !multi); + elm_object_disabled_set(gd->rd2, !multi); +} + +static void +_multi_select_mode_changed_cb(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_genlist_multi_select_mode_set(data, elm_radio_value_get(obj)); +} + +static void +_multi_select_frame_create(Evas_Object *bx, Genlist_Multi_Data *gd) +{ + Evas_Object *fr, *bx2, *bx3, *tg, *rd, *rdg; + if (!gd) return; + + fr = elm_frame_add(bx); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.5); + elm_object_text_set(fr, "Multi Select Option"); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + bx2 = elm_box_add(fr); + elm_object_content_set(fr, bx2); + evas_object_show(bx2); + + tg = elm_check_add(bx2); + elm_object_style_set(tg, "toggle"); + elm_object_text_set(tg, "Multi Select Mode"); + elm_box_pack_end(bx2, tg); + evas_object_show(tg); + + bx3 = elm_box_add(bx2); + elm_box_horizontal_set(bx3, EINA_TRUE); + elm_box_pack_end(bx2, bx3); + evas_object_show(bx3); + + gd->rd1 = rdg = rd = elm_radio_add(bx3); + elm_radio_state_value_set(rd, ELM_OBJECT_MULTI_SELECT_MODE_DEFAULT); + elm_object_text_set(rd, "Default Mode"); + elm_box_pack_end(bx3, rd); + evas_object_show(rd); + elm_object_disabled_set(rd, EINA_TRUE); + evas_object_smart_callback_add(rd, "changed", + _multi_select_mode_changed_cb, gd->gl); + + gd->rd2 = rd = elm_radio_add(bx3); + elm_radio_state_value_set(rd, ELM_OBJECT_MULTI_SELECT_MODE_WITH_CONTROL); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "With Control Mode"); + elm_box_pack_end(bx3, rd); + evas_object_show(rd); + elm_object_disabled_set(rd, EINA_TRUE); + evas_object_smart_callback_add(rd, "changed", + _multi_select_mode_changed_cb, gd->gl); + + evas_object_smart_callback_add(tg, "changed", + _multi_select_changed_cb, gd); +} + +static void +_multi_data_free_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + free(data); +} + +void +test_genlist_multi_select(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *gl, *bx; + Genlist_Multi_Data *gd = calloc(1, sizeof(Genlist_Multi_Data)); + Elm_Genlist_Item_Class *itc = NULL; + int i = 0; + + win = elm_win_util_standard_add("genlist-multi-select", "Genlist Multi Select"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _multi_data_free_cb, gd); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + gd->gl = gl = elm_genlist_add(bx); + _multi_select_frame_create(bx, gd); + + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, gl); + evas_object_show(gl); + + itc = elm_genlist_item_class_new(); + itc->item_style = "default"; + itc->func.text_get = gl_text_get; + itc->func.content_get = gl_content_get; + itc->func.state_get = gl_state_get; + itc->func.del = NULL; + + for (i = 0; i < 100; i++) + { + elm_genlist_item_append(gl, itc, + (void *)(uintptr_t)i/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_NONE, + gl_sel/* func */, + (void *)(uintptr_t)(i * 10)/* func data */); + } + elm_genlist_item_class_free(itc); + + evas_object_resize(win, 320, 500); + evas_object_show(win); +} + + +/*** Genlist Item Search By Text *******************************************/ +typedef struct _gl20_Event_Data gl20_Event_Data; +struct _gl20_Event_Data +{ + Evas_Object *gl_obj; + Evas_Object *tg_obj; + Evas_Object *en_obj; + Elm_Object_Item *last_item_found; +}; + +static const char *_gl20_items_text[] = { + "Albany", "Annapolis", + "Atlanta", "Augusta", + "Austin", "Baton Rouge", + "Bismarck", "Boise", + "Boston", "Carson City", + "Charleston", "Cheyenne", + "Columbia", "Columbus", + "Concord", "Denver", + "Des Moines", "Dover", + "Frankfort", "Harrisburg", + "Hartford", "Helena", + "Honolulu", "Indianapolis", + "Jackson", "Jefferson City", + "Juneau", "Lansing", + "Lincoln", "Little Rock", + "Madison", "Montgomery", + "Montpelier", "Nashville", + "Oklahoma City", "Olympia", + "Phoenix", "Pierre", + "Providence", "Raleigh", + "Richmond", "Sacramento", + "Saint Paul", "Salem", + "Salt Lake City", "Santa Fe", + "Springfield", "Tallahassee", + "Topeka", "Trenton" }; + +static void +_gl20_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + free(data); +} + +static char * +_gl20_text_get(void *data, Evas_Object *obj EINA_UNUSED, + const char *part EINA_UNUSED) +{ + char buf[32]; + int item_index = (int)(uintptr_t)data; + + if (item_index < 50) + { + snprintf(buf, sizeof(buf), "%s", _gl20_items_text[item_index]); + return strdup(buf); + } + else if (item_index < 100) + { + snprintf(buf, sizeof(buf), "%X", (item_index - 50)); + return strdup(buf); + } + else if (item_index == 100) + return strdup("Tree Item"); + + return NULL; +} + +static void +_gl20_search_item(gl20_Event_Data *event_data, Elm_Object_Item * it) +{ + const char *str = elm_entry_entry_get(event_data->en_obj); + if (!str || !strlen(str)) return; + + Elm_Glob_Match_Flags flag = 0; + if (!elm_check_state_get(event_data->tg_obj)) flag = ELM_GLOB_MATCH_NOCASE; + + printf("Looking for \"%s\". ", str); + event_data->last_item_found = elm_genlist_search_by_text_item_get + (event_data->gl_obj, it, NULL, str, flag); + + if (event_data->last_item_found) + { + printf("Found.\n"); + elm_genlist_item_selected_set(event_data->last_item_found, EINA_TRUE); + elm_genlist_item_bring_in(event_data->last_item_found, + ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); + elm_object_focus_set(event_data->en_obj, EINA_TRUE); + } + else + printf("Not Found.\n"); +} + +static void +_gl20_search_settings_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *einfo EINA_UNUSED) +{ + _gl20_search_item(data, NULL); +} + +static Elm_Genlist_Item_Class * +_gl20_item_class_create(const char *item_style) +{ + Elm_Genlist_Item_Class * itc = elm_genlist_item_class_new(); + itc->item_style = item_style; + itc->func.text_get = _gl20_text_get; + itc->func.content_get = gl_content_get; + itc->func.state_get = gl_state_get; + itc->func.del = NULL; + return itc; +} + +static void +_gl20_expand_cb(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED, + void *event_info) +{ + Elm_Object_Item *glit = event_info; + Evas_Object *gl = elm_object_item_widget_get(glit); + Elm_Genlist_Item_Class *itc = NULL; + int i = 0; + + itc = _gl20_item_class_create("default"); + + for (i = 50; i < 100; i++) + { + elm_genlist_item_append(gl, itc, + (void *)(uintptr_t) i/* item data */, + glit/* parent */, + ELM_GENLIST_ITEM_NONE, NULL/* func */, + NULL/* func data */); + } + elm_genlist_item_class_free(itc); +} + +static void _gl20_on_keydown(void *data, Evas *evas EINA_UNUSED, + Evas_Object *o EINA_UNUSED, void *einfo) +{ + Evas_Event_Key_Down *ev = einfo; + gl20_Event_Data * event_data = (gl20_Event_Data *)data; + + if (!strcmp(ev->key, "Return")) + { + printf("Looking for next item\n"); + _gl20_search_item(data, event_data->last_item_found); + } +} + +void +test_genlist20(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *gl; + Evas_Object *fr, *lb_frame; // info frame + Evas_Object *bx_entry, *lb_entry, *en; // search line + Evas_Object *tg; // "case sensitive" toggle + Elm_Genlist_Item_Class *itc = NULL; + gl20_Event_Data* event_data = NULL; + int i = 0; + + win = elm_win_util_standard_add("genlist-item-search-by-text", + "Genlist Item Search By Text"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + fr = elm_frame_add(bx); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(fr, "Information"); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + lb_frame = elm_label_add(fr); + elm_object_text_set(lb_frame, + "<align=left>This is an example of " + "elm_genlist_search_by_text_item_get() usage.<br>" + "Enter search string to the entry and press Enter to " + "show next search result.<br>"); + elm_object_content_set(fr, lb_frame); + evas_object_show(lb_frame); + + tg = elm_check_add(win); + elm_object_style_set(tg, "toggle"); + elm_object_text_set(tg, " Case Sensitive Search"); + elm_check_state_set(tg, EINA_TRUE); + elm_box_pack_end(bx, tg); + evas_object_show(tg); + + bx_entry = elm_box_add(win); + elm_box_horizontal_set(bx_entry, EINA_TRUE); + evas_object_size_hint_weight_set(bx_entry, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx_entry, EVAS_HINT_FILL, 0.0); + elm_box_pack_end(bx, bx_entry); + evas_object_show(bx_entry); + + lb_entry = elm_label_add(win); + elm_object_text_set(lb_entry, " Search:"); + evas_object_size_hint_weight_set(lb_entry, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(lb_entry, 0.0, EVAS_HINT_FILL); + elm_box_pack_end(bx_entry, lb_entry); + evas_object_show(lb_entry); + + en = elm_entry_add(win); + elm_entry_single_line_set(en, EINA_TRUE); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_object_part_text_set(en, "guide", "Type item's name here to search."); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx_entry, en); + evas_object_show(en); + elm_object_focus_set(en, EINA_TRUE); + + gl = elm_genlist_add(bx); + + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, gl); + evas_object_show(gl); + + event_data = calloc(1, sizeof(gl20_Event_Data)); + event_data->tg_obj = tg; + event_data->en_obj = en; + event_data->gl_obj = gl; + event_data->last_item_found = NULL; + + evas_object_event_callback_add(en, EVAS_CALLBACK_KEY_DOWN, + _gl20_on_keydown, (void*)event_data); + evas_object_event_callback_add(gl, EVAS_CALLBACK_FREE, + _gl20_del_cb, (void*)event_data); + evas_object_smart_callback_add(en, "changed,user", + _gl20_search_settings_changed_cb, (void*)event_data); + evas_object_smart_callback_add(tg, "changed", + _gl20_search_settings_changed_cb, (void*)event_data); + evas_object_smart_callback_add(gl, "expand,request", gl4_exp_req, gl); + evas_object_smart_callback_add(gl, "contract,request", gl4_con_req, gl); + evas_object_smart_callback_add(gl, "contracted", gl4_con, gl); + evas_object_smart_callback_add(gl, "expanded", _gl20_expand_cb, gl); + + itc = _gl20_item_class_create("tree_effect"); + + elm_genlist_item_append(gl, itc, + (void *)100/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_TREE, + NULL/* func */, + NULL/* func data */); + + itc->item_style = "default"; + + for (i = 0; i < 50; i++) + { + elm_genlist_item_append(gl, itc, + (void *)(uintptr_t)i/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_NONE, + NULL/* func */, + NULL/* func data */); + } + + elm_genlist_item_class_free(itc); + + evas_object_resize(win, 320, 500); + evas_object_show(win); +} + + +/*** Genlist Del ***********************************************************/ +static void _gl_del_sel(void *data, Evas_Object *obj, void *event_info); + +static void +_gl_del_win_del_cb(void *data, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + if (!data) return; + elm_genlist_item_class_free(data); +} + +static void +_gl_del_unrealized_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + int num = (int)(uintptr_t)elm_object_item_data_get(event_info); + printf("unrealized item # %d\n", num); +} + +static void +_gl_del_doubleclick_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + int num = (int)(uintptr_t)elm_object_item_data_get(event_info); + int num_category = num % 4; + + if (num_category == 3) + elm_genlist_clear(obj); +} +static Evas_Object * +_gl_del_genlist_add(Evas_Object *bx) +{ + Evas_Object *gl = NULL; + + gl = elm_genlist_add(bx); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, gl); + evas_object_show(gl); + evas_object_smart_callback_add(gl, "unrealized", + _gl_del_unrealized_cb, NULL); + evas_object_smart_callback_add(gl, "clicked,double", + _gl_del_doubleclick_cb, NULL); + + return gl; +} + +static void +_gl_del_item_append(Evas_Object *gl, Elm_Genlist_Item_Class *itc) +{ + int i = 0; + for (i = 0; i < 1000; i++) + { + elm_genlist_item_append(gl, itc, + (void *)(uintptr_t)i/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_NONE, + _gl_del_sel/* func */, + (void *)(uintptr_t)(i)/* func data */); + } +} + +char * +_gl_del_text_get(void *data, Evas_Object *obj EINA_UNUSED, + const char *part EINA_UNUSED) +{ + char buf[256] = { 0 }; + int num = (int)(uintptr_t)data; + int num_category = num % 10; + + if (num_category == 3) + snprintf(buf, sizeof(buf), + "Item #%.02i - 1. Item Del", num); + else if (num_category == 5) + snprintf(buf, sizeof(buf), + "Item #%.02i - 2. Genlist Clear and Item Append", num); + else if (num_category == 7) + snprintf(buf, sizeof(buf), + "Item #%.02i - 3. Genlist Del", num); + else if (num_category == 9) + snprintf(buf, sizeof(buf), + "Item #%.02i - 4. Genlist Clear on double-click", num); + else + snprintf(buf, sizeof(buf), + "Item #%.02i - Normal item", num); + + return strdup(buf); +} + +static void +_gl_del_sel(void *data, Evas_Object *obj, void *event_info) +{ + int num = (int)(uintptr_t)data; + int num_category = num % 10; + Elm_Object_Item *it = event_info; + Elm_Genlist_Item_Class *itc = + (Elm_Genlist_Item_Class *)elm_genlist_item_item_class_get(it); + + if (num_category == 3) + elm_object_item_del(it); + else if (num_category == 5) + { + elm_genlist_clear(obj); + _gl_del_item_append(obj, itc); + } + else if (num_category == 7) + { + evas_object_del(obj); + } +} + +static void +_gl_del_del_cb(void *data, Evas_Object *obj EINA_UNUSED) +{ + printf("deleted item # %d\n", (int)(uintptr_t)data); +} + +void +test_genlist_del(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *fr, *lb, *gl; + Elm_Genlist_Item_Class *itc = NULL; + + win = elm_win_util_standard_add("genlist-del", "Genlist Del"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + elm_box_align_set(bx, 0.5, 0.0); + evas_object_show(bx); + + fr = elm_frame_add(bx); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(fr, "Information"); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + lb = elm_label_add(fr); + elm_object_text_set(lb, "<align=left>This example tests the following cases" + " on item selection.<br/>" + " 1. genlist item deletion<br/>" + " 2. genlist clear and item append<br/>" + " 3. genlist del<br/>" + " 4. genlist clear on double-click</align>"); + elm_object_content_set(fr, lb); + evas_object_show(lb); + + itc = elm_genlist_item_class_new(); + itc->item_style = "default"; + itc->func.text_get = _gl_del_text_get; + itc->func.content_get = gl_content_get; + itc->func.state_get = NULL; + itc->func.del = _gl_del_del_cb; + evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, + _gl_del_win_del_cb, itc); + + gl = _gl_del_genlist_add(bx); + _gl_del_item_append(gl, itc); + + evas_object_resize(win, 320, 500); + evas_object_show(win); +} + + +/*** Genlist Focus *********************************************************/ +static unsigned _gl_focus_objects = 3; +static const char *_gl_focus_object_names[] = {"None", "Square", "Button", "Check", "Box"}; + +// for the top genlist items +static char * +gl_focus_top_items_text_get(void *data, Evas_Object *obj EINA_UNUSED, + const char *part EINA_UNUSED) +{ + if (!data) return NULL; + + if (!strcmp(data, "do_nothing")) + return strdup("Genlist Item"); + else if (!strcmp(data, "popup_sel")) + return strdup("Create a popup on Select (popup parent is gl)"); + else if (!strcmp(data, "popup_mouse_down")) + return strdup("Create a popup on Mouse Down (popup parent is gl)"); + else if (!strcmp(data, "popup_activate")) + return strdup("Create a popup on Activate (popup parent is win)"); + else if (!strcmp(data, "clear_on_focus")) + return strdup("Genlist Clear on Focus"); + else + return NULL; +} + +static char * +gl_focus_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + char buf[256]; + unsigned char op = (uintptr_t)data % 100; + unsigned char v1, v2; + + v1 = op / 10; + if (v1 > 4) v1 = 4; + v2 = op % 10; + if (v2 > 4) v2 = 4; + snprintf(buf, sizeof(buf), " %s / %s ", + _gl_focus_object_names[v1], _gl_focus_object_names[v2]); + return strdup(buf); +} + +static Evas_Object * +gl_focus_content_get(void *data, Evas_Object *obj, const char *part) +{ + Evas_Object *cnt = NULL; + + char op = (uintptr_t)data % 100; + char type = (!strcmp(part,"elm.swallow.icon")) ? op / 10 : op % 10; + + switch(type) + { + case 1: + cnt = elm_bg_add(obj); + evas_object_color_set(cnt, 128, 18, 128, 255); + break; + case 2: + cnt = elm_button_add(obj); + break; + case 3: + cnt = elm_check_add(obj); + break; + case 4: + cnt = elm_box_add(obj); + evas_object_size_hint_align_set(cnt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_horizontal_set(cnt, EINA_TRUE); + elm_box_pack_end(cnt, gl_focus_content_get((void *)2, obj, "")); + elm_box_pack_end(cnt, gl_focus_content_get((void *)3, obj, "")); + elm_box_pack_end(cnt, gl_focus_content_get((void *)2, obj, "")); + break; + default: + break; + + } + if (cnt) + { + evas_object_size_hint_weight_set(cnt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(cnt); + } + return cnt; +} + +static void +_gl_focus_sel_popup_close_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + evas_object_del(data); +} + +static void +_gl_focus_sel_popup_create(Evas_Object *parent) +{ + Evas_Object *popup = NULL, *btn = NULL; + + popup = elm_popup_add(parent); + elm_object_text_set(popup, "Popup for the genlist focus test with popup creation."); + + // popup buttons + btn = elm_button_add(popup); + elm_object_text_set(btn, "Close"); + elm_object_part_content_set(popup, "button1", btn); + evas_object_smart_callback_add(btn, "clicked", _gl_focus_sel_popup_close_btn_cb, popup); + + // popup show should be called after adding all the contents and the buttons + // of popup to set the focus into popup's contents correctly. + evas_object_show(popup); + elm_object_focus_set(btn, EINA_TRUE); +} + +static void +_gl_focus_0_item_sel_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + _gl_focus_sel_popup_create(obj); +} + +static void +_gl_focus_item_loop_enable_changed_cb(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Evas_Object *gl = data; + elm_object_scroll_item_loop_enabled_set(gl, elm_check_state_get(obj)); +} + +static void +_gl_focus_focus_on_selection_set(Evas_Object *gl, + Evas_Object *chk, Eina_Bool focus) +{ + elm_genlist_focus_on_selection_set(gl, focus); + elm_check_state_set(chk, focus); + printf("genlist_focus_on_selection = %s\n", (focus) ? "true" : "false"); +} + +static void +_gl_focus_focus_on_selection_changed_cb(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Eina_Bool nextstate = !elm_genlist_focus_on_selection_get(data); + _gl_focus_focus_on_selection_set(data, obj, nextstate); +} + +static void +_gl_focus_win_auto_focus_enable_changed(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_config_window_auto_focus_enable_set(elm_check_state_get(obj)); +} + +static void +_gl_focus_win_auto_focus_animate_changed(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_config_window_auto_focus_animate_set(elm_check_state_get(obj)); +} + +static void +_gl_focus_focus_highlight_changed_cb(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_win_focus_highlight_enabled_set(data, + elm_check_state_get(obj)); +} + +static void +_gl_focus_focus_animate_changed_cb(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_win_focus_highlight_animate_set(data, + elm_check_state_get(obj)); +} + +static void +_gl_focus_move_policy_changed_cb(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + int val = elm_radio_value_get(obj); + + if (val == 0) + elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_CLICK); + else if (val == 1) + elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_IN); +} + +static void +_gl_focus_item_focus_cb(void *data, Evas_Object *obj, void *event_info) +{ + printf("item,focused: %p\n", event_info); + + if (event_info == data) + elm_genlist_clear(obj); +} + +static void +_gl_focus_item_unfocus_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + printf("item,unfocused %p\n", event_info); +} + +static void +_gl_focus_item_cb(void *data, Evas_Object *obj, void *event_info) +{ + Elm_Object_Item *it = event_info; + + printf("%s: %p\n", (char *)data, it); + + if (!strcmp((char *)data, "activated") && + !strcmp((char *)elm_object_item_data_get(it), "popup_activate")) + { + _gl_focus_sel_popup_create(elm_object_top_widget_get(obj)); + } +} + +static void +_gl_focus_key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Evas_Event_Key_Down *ev = event_info; + printf("\n=== Key Down : %s ===\n", ev->keyname); +} + +static void +_gl_focus_mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, + Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Down *ev = event_info; + Elm_Object_Item *it = NULL; + int postret = 0; + + it = elm_genlist_at_xy_item_get(obj, ev->canvas.x, ev->canvas.y, &postret); + if (!it) return; + + if (elm_genlist_item_index_get(it) == 4) + _gl_focus_sel_popup_create(obj); +} + +static Ecore_Timer *timer = NULL; +static void +_gl_focus_win_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + ecore_timer_del(timer); + timer = NULL; +} + +static void +_gl_focus_item_select_on_focus_disable_changed_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_config_item_select_on_focus_disabled_set(elm_check_state_get(obj)); +} + +static void +_gl_first_item_focus_on_first_focus_in_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_config_first_item_focus_on_first_focusin_set(elm_check_state_get(obj)); +} + +static void +_gl_wheel_disabled_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + elm_scroller_wheel_disabled_set(data, elm_check_state_get(obj)); +} + +static Eina_Bool +_focus_timer_cb(void *data) +{ + elm_object_item_focus_set(data, EINA_TRUE); + timer = NULL; + + return ECORE_CALLBACK_CANCEL; +} + +static Eina_Bool +_select_timer_cb(void *data) +{ + elm_genlist_item_selected_set(data, EINA_TRUE); + timer = NULL; + + return ECORE_CALLBACK_CANCEL; +} + +static void +_focus_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + ecore_timer_del(timer); + timer = ecore_timer_add(1.5, _focus_timer_cb, data); +} + +static void +_sel_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + ecore_timer_del(timer); + timer = ecore_timer_add(1.5, _select_timer_cb, data); +} + +static void +_dis_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + elm_object_item_disabled_set(data, EINA_TRUE); +} + +static void +_add_more_items_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Elm_Genlist_Item_Class *itc = NULL; + int i = 0; + + itc = elm_genlist_item_class_new(); + itc->item_style = "default"; + itc->func.text_get = gl_text_get; + itc->func.content_get = NULL; + itc->func.state_get = NULL; + itc->func.del = NULL; + + + for (i = 0; i < 1000; i++) + { + elm_genlist_item_append(data, itc, (void *)(uintptr_t)i, + NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + } + + elm_genlist_item_class_free(itc); +} + +static void +_focus_button_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("Button clicked: %s\n", (char *)data); +} + +void +_focus_autoscroll_changed_cb(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_config_focus_autoscroll_mode_set(elm_radio_value_get(obj)); +} + +/* this function is used in another tests such as list, gengrid, and toolbar. */ +Evas_Object * +_focus_autoscroll_mode_frame_create(Evas_Object *parent) +{ + Evas_Object *fr, *bx, *rdg, *rd; + + fr = elm_frame_add(parent); + elm_object_text_set(fr, "Focus Autoscroll Mode"); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.5); + evas_object_show(fr); + + bx = elm_box_add(fr); + elm_object_content_set(fr, bx); + evas_object_show(bx); + + rdg = rd = elm_radio_add(bx); + elm_radio_state_value_set(rd, ELM_FOCUS_AUTOSCROLL_MODE_SHOW); + elm_object_text_set(rd, "ELM_FOCUS_AUTOSCROLL_MODE_SHOW"); + elm_object_tooltip_text_set(rd, "Directly show the focused region<br/>" + "or item automatically inside a scroller."); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL); + elm_box_pack_end(bx, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", + _focus_autoscroll_changed_cb, + NULL); + + rd = elm_radio_add(bx); + elm_radio_state_value_set(rd, ELM_FOCUS_AUTOSCROLL_MODE_NONE); + elm_object_text_set(rd, "ELM_FOCUS_AUTOSCROLL_MODE_NONE"); + elm_object_tooltip_text_set(rd, "Do not show the focused region or<br/>" + "item automatically inside a scroller."); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL); + elm_box_pack_end(bx, rd); + elm_radio_group_add(rd, rdg); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", + _focus_autoscroll_changed_cb, + NULL); + + + rd = elm_radio_add(bx); + elm_radio_state_value_set(rd, ELM_FOCUS_AUTOSCROLL_MODE_BRING_IN); + elm_object_text_set(rd, "ELM_FOCUS_AUTOSCROLL_MODE_BRING_IN"); + elm_object_tooltip_text_set(rd, "Bring in the focused region or item<br/>" + "automatically which might invole the scrolling."); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(rd, 0.0, EVAS_HINT_FILL); + elm_box_pack_end(bx, rd); + elm_radio_group_add(rd, rdg); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", + _focus_autoscroll_changed_cb, + NULL); + + elm_radio_value_set(rdg, elm_config_focus_autoscroll_mode_get()); + + return fr; +} + +static void +_test_genlist_focus_option_panel_create(Evas_Object *win, Evas_Object *bx, + Evas_Object *gl, Elm_Object_Item *it_0, + Elm_Object_Item *it_2) +{ + Evas_Object *fr = NULL, *bx_opt = NULL, *chk = NULL; + Evas_Object *bx_mv = NULL, *rd = NULL, *rdg = NULL; + Evas_Object *btn_box = NULL, *btn = NULL; + + fr = elm_frame_add(bx); + elm_object_text_set(fr, "Options"); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + bx_opt = elm_box_add(fr); + elm_box_layout_set(bx_opt, evas_object_box_layout_flow_horizontal, NULL, NULL); + evas_object_size_hint_weight_set(bx_opt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx_opt, EVAS_HINT_FILL, 0.0); + elm_box_align_set(bx_opt, 0.0, 0.5); + elm_object_content_set(fr, bx_opt); + evas_object_show(bx_opt); + + chk = elm_check_add(bx_opt); + elm_object_text_set(chk, "Window Auto Focus Enable"); + elm_check_state_set(chk, EINA_TRUE); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(chk, "changed", + _gl_focus_win_auto_focus_enable_changed, + NULL); + elm_box_pack_end(bx_opt, chk); + evas_object_show(chk); + + chk = elm_check_add(bx_opt); + elm_object_text_set(chk, "Window Auto Focus Animate"); + elm_check_state_set(chk, EINA_TRUE); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(chk, "changed", + _gl_focus_win_auto_focus_animate_changed, + NULL); + elm_box_pack_end(bx_opt, chk); + evas_object_show(chk); + + chk = elm_check_add(bx_opt); + elm_object_text_set(chk, "Focus Highlight"); + elm_check_state_set(chk, EINA_FALSE); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(chk, "changed", + _gl_focus_focus_highlight_changed_cb, + win); + elm_box_pack_end(bx_opt, chk); + evas_object_show(chk); + + chk = elm_check_add(bx_opt); + elm_object_text_set(chk, "Focus Animation"); + elm_check_state_set(chk, EINA_FALSE); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(chk, "changed", + _gl_focus_focus_animate_changed_cb, + win); + elm_box_pack_end(bx_opt, chk); + evas_object_show(chk); + + chk = elm_check_add(bx_opt); + elm_object_text_set(chk, "Focus on selection"); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(chk, "changed", + _gl_focus_focus_on_selection_changed_cb, gl); + elm_box_pack_end(bx_opt, chk); + evas_object_show(chk); + + chk = elm_check_add(bx_opt); + elm_object_text_set(chk, "Item Looping Enable"); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(chk, "changed", + _gl_focus_item_loop_enable_changed_cb, gl); + elm_box_pack_end(bx_opt, chk); + evas_object_show(chk); + + chk = elm_check_add(bx_opt); + elm_object_text_set(chk, "Item Select on Focus disable"); + elm_check_state_set(chk, elm_config_item_select_on_focus_disabled_get()); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(chk, "changed", + _gl_focus_item_select_on_focus_disable_changed_cb, + NULL); + elm_box_pack_end(bx_opt, chk); + evas_object_show(chk); + + chk = elm_check_add(bx_opt); + elm_object_text_set(chk, "First item focus on first focus in"); + elm_check_state_set(chk, elm_config_first_item_focus_on_first_focusin_get()); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(chk, "changed", + _gl_first_item_focus_on_first_focus_in_cb, + NULL); + elm_box_pack_end(bx_opt, chk); + evas_object_show(chk); + + chk = elm_check_add(bx_opt); + elm_object_text_set(chk, "Wheel Disabled"); + elm_check_state_set(chk, elm_scroller_wheel_disabled_get(gl)); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(chk, "changed", _gl_wheel_disabled_cb, gl); + elm_box_pack_end(bx_opt, chk); + evas_object_show(chk); + + // Focus Autoscroll Mode + fr = _focus_autoscroll_mode_frame_create(bx); + elm_box_pack_end(bx, fr); + + // Focus Movement Policy + fr = elm_frame_add(bx); + elm_object_text_set(fr, "Focus Movement Policy"); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + bx_mv = elm_box_add(fr); + elm_box_horizontal_set(bx_mv, EINA_TRUE); + elm_object_content_set(fr, bx_mv); + evas_object_show(bx_mv); + + rdg = rd = elm_radio_add(bx_mv); + elm_object_text_set(rd, "Focus Move by Click"); + elm_radio_state_value_set(rd, 0); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(rd, "changed", + _gl_focus_move_policy_changed_cb, + NULL); + elm_box_pack_end(bx_mv, rd); + evas_object_show(rd); + + rd = elm_radio_add(bx_mv); + elm_object_text_set(rd, "Focus Move by Mouse-In"); + elm_radio_group_add(rd, rdg); + elm_radio_state_value_set(rd, 1); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(rd, "changed", + _gl_focus_move_policy_changed_cb, + NULL); + elm_box_pack_end(bx_mv, rd); + evas_object_show(rd); + + // Options + fr = elm_frame_add(bx); + elm_object_text_set(fr, "Options"); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + btn_box = elm_box_add(fr); + elm_object_content_set(fr, btn_box); + evas_object_show(btn_box); + + btn = elm_button_add(btn_box); + elm_object_text_set(btn, "Focus 2nd Item after 1.5 seconds."); + evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(btn_box, btn); + evas_object_show(btn); + evas_object_smart_callback_add(btn, "clicked", _focus_btn_cb, it_2); + + btn = elm_button_add(btn_box); + elm_object_text_set(btn, "Select 2nd Item after 1.5 seconds."); + evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(btn_box, btn); + evas_object_show(btn); + evas_object_smart_callback_add(btn, "clicked", _sel_btn_cb, it_2); + + btn = elm_button_add(btn_box); + elm_object_text_set(btn, "Disable 1st Item."); + evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(btn_box, btn); + evas_object_show(btn); + evas_object_smart_callback_add(btn, "clicked", _dis_btn_cb, it_0); + + + btn = elm_button_add(btn_box); + elm_object_text_set(btn, "Add more Genlist items"); + evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(btn_box, btn); + evas_object_show(btn); + evas_object_smart_callback_add(btn, "clicked", _add_more_items_btn_cb, gl); +} + +void +test_genlist_focus(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bx2, *gl, *btn; + unsigned lhand, rhand; + Elm_Object_Item *it = NULL, *it_1 = NULL, *it_2 = NULL; + Elm_Genlist_Item_Class *itc = NULL, *itc1 = NULL, *itc2 = NULL; + + api_data *api = calloc(1, sizeof(api_data)); + win = elm_win_util_standard_add("genlist-focus", "Genlist Focus"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, + _gl_focus_win_del_cb, NULL); + + elm_config_window_auto_focus_enable_set(EINA_TRUE); + elm_config_window_auto_focus_animate_set(EINA_TRUE); + elm_win_focus_highlight_enabled_set(win, EINA_FALSE); + elm_win_focus_highlight_animate_set(win, EINA_FALSE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + btn = elm_button_add(bx); + elm_object_text_set(btn, "Up"); + elm_box_pack_end(bx, btn); + evas_object_smart_callback_add(btn, "clicked", + _focus_button_clicked_cb, "Up"); + evas_object_show(btn); + + bx2 = elm_box_add(bx); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + btn = elm_button_add(bx2); + elm_object_text_set(btn, "Left"); + elm_box_pack_end(bx2, btn); + evas_object_smart_callback_add(btn, "clicked", + _focus_button_clicked_cb, "Left"); + evas_object_show(btn); + + gl = elm_genlist_add(bx); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_box_pack_end(bx2, gl); + api->gl = gl; + evas_object_show(gl); + evas_object_smart_callback_add(gl, "selected", _gl_focus_item_cb, "selected"); + evas_object_smart_callback_add(gl, "unselected", _gl_focus_item_cb, "unselected"); + evas_object_smart_callback_add(gl, "activated", _gl_focus_item_cb, "activated"); + evas_object_smart_callback_add(gl, "highlighted", _gl_focus_item_cb, "highlighted"); + evas_object_smart_callback_add(gl, "unhighlighted", _gl_focus_item_cb, "unhighlighted"); + evas_object_event_callback_add(gl, EVAS_CALLBACK_KEY_DOWN, _gl_focus_key_down_cb, NULL); + evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_DOWN, _gl_focus_mouse_down_cb, NULL); + + btn = elm_button_add(bx2); + elm_object_text_set(btn, "Right"); + elm_box_pack_end(bx2, btn); + evas_object_smart_callback_add(btn, "clicked", + _focus_button_clicked_cb, "Right"); + evas_object_show(btn); + + btn = elm_button_add(bx); + elm_object_text_set(btn, "Down"); + elm_box_pack_end(bx, btn); + evas_object_smart_callback_add(btn, "clicked", + _focus_button_clicked_cb, "Down"); + evas_object_show(btn); + + itc = elm_genlist_item_class_new(); + itc->item_style = "default"; + itc->func.text_get = gl_focus_top_items_text_get; + itc->func.content_get = NULL; + itc->func.state_get = NULL; + itc->func.del = NULL; + + itc1 = elm_genlist_item_class_new(); + itc1->item_style = "default"; + itc1->func.text_get = gl_focus_text_get; + itc1->func.content_get = gl_focus_content_get; + itc1->func.state_get = NULL; + itc1->func.del = NULL; + + itc2 = elm_genlist_item_class_new(); + itc2->item_style = "tree_effect"; + itc2->func.text_get = gl_focus_text_get; + itc2->func.content_get = gl_focus_content_get; + itc2->func.state_get = NULL; + itc2->func.del = NULL; + + it_1 = elm_genlist_item_append(gl, itc, "do_nothing", NULL, ELM_GENLIST_ITEM_NONE, + NULL, NULL); + it_2 = elm_genlist_item_append(gl, itc, "do_nothing", NULL, ELM_GENLIST_ITEM_NONE, + NULL, NULL); + elm_genlist_item_append(gl, itc, "popup_sel", NULL, ELM_GENLIST_ITEM_NONE, + _gl_focus_0_item_sel_cb, NULL); + elm_genlist_item_append(gl, itc, "popup_mouse_down", NULL, ELM_GENLIST_ITEM_NONE, + NULL, NULL); + elm_genlist_item_append(gl, itc, "popup_activate", NULL, ELM_GENLIST_ITEM_NONE, + NULL, NULL); + + it = elm_genlist_item_append(gl, itc, "clear_on_focus", NULL, ELM_GENLIST_ITEM_NONE, + NULL, NULL); + evas_object_smart_callback_add(gl, "item,focused", _gl_focus_item_focus_cb, it); + evas_object_smart_callback_add(gl, "item,unfocused", _gl_focus_item_unfocus_cb, NULL); + + for (lhand = 0; lhand < _gl_focus_objects; lhand++) + { + for (rhand = 0; rhand < _gl_focus_objects; rhand++) + { + unsigned digit1 = lhand * 10 + rhand; + elm_genlist_item_append(gl, itc1, (void*)(uintptr_t)digit1, + NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + + unsigned digit2 = (_gl_focus_objects - lhand -1) * 10 + + (_gl_focus_objects - rhand -1); + it = elm_genlist_item_append(gl, itc1, (void*)(uintptr_t)digit2, + NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + if (rhand == 4) + elm_object_item_disabled_set(it, EINA_TRUE); + + if (rhand == (_gl_focus_objects - 1)) + elm_genlist_item_append(gl, itc2, (void*)(uintptr_t)digit1, + NULL, ELM_GENLIST_ITEM_TREE, NULL, NULL); + } + } + + elm_genlist_item_class_free(itc); + elm_genlist_item_class_free(itc1); + elm_genlist_item_class_free(itc2); + + // Options + _test_genlist_focus_option_panel_create(win, bx, gl, it_1, it_2); + + evas_object_resize(win, 420, 600); + evas_object_show(win); +} + +char *genlist_demo_names[] = { + "Aaliyah", "Aamir", "Aaralyn", "Aaron", "Abagail", + "Babitha", "Bahuratna", "Bandana", "Bulbul", "Cade", "Caldwell", + "Chandan", "Caster", "Dagan ", "Daulat", "Dag", "Earl", "Ebenzer", + "Ellison", "Elizabeth", "Filbert", "Fitzpatrick", "Florian", "Fulton", + "Frazer", "Gabriel", "Gage", "Galen", "Garland", "Gauhar", "Hadden", + "Hafiz", "Hakon", "Haleem", "Hank", "Hanuman", "Jabali ", "Jaimini", + "Jayadev", "Jake", "Jayatsena", "Jonathan", "Kamaal", "Jeirk", + "Jasper", "Jack", "Mac", "Macy", "Marlon", "Milson", + NULL +}; + +static char * +glf_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + char buf[256]; + snprintf(buf, sizeof(buf), "%s", genlist_demo_names[((int)(uintptr_t)data)%50]); + return strdup(buf); +} + +Eina_Bool +gl_filter_get(void *data, Evas_Object *obj EINA_UNUSED, void *key) +{ + if (!strlen((char *)key)) return EINA_TRUE; + + if (strcasestr(genlist_demo_names[((int)(uintptr_t)data)%50], (char *)key)) + return EINA_TRUE; + // Default case should return false (item fails filter hence will be hidden) + return EINA_FALSE; +} + +static void +_gl_filter_finished_cb(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("Filter finished, filtered items count is %d\n", elm_genlist_filtered_items_count((Evas_Object *)data)); +} + +void +_entry_change_cb(void *data, Evas_Object *obj, void *event EINA_UNUSED) +{ + api_data *api = (api_data *)data; + char buf[100]; + unsigned int count = 0; + Elm_Object_Item *item; + + if (api->filter_data) free(api->filter_data); + + sprintf(buf, "%s", elm_object_text_get(obj)); + api->filter_data = strdup(buf); + elm_genlist_filter_set(api->gl, (void *)(api->filter_data)); + if (!strlen(buf)) + { + printf("Input data string empty; returning\n"); + return; + } + + item = elm_genlist_first_item_get(api->gl); + if (!item) + { + printf("No matches for the key %s\n", buf); + return; + } + while (item) + { + ++count; + item = elm_genlist_item_next_get(item); + } + printf("Number of matches for %s is %d\n", buf, count); +} + +void +test_genlist_filter(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bx2, *entry, *gl; + Elm_Genlist_Item_Class *itc = NULL; + int i; + + api_data *api = calloc(1, sizeof(api_data)); + win = elm_win_util_standard_add("genlist-filter", "Genlist filter"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, + _gl_focus_win_del_cb, NULL); + + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + elm_win_focus_highlight_animate_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + entry = elm_entry_add(bx); + elm_entry_single_line_set(entry, EINA_TRUE); + evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, 0.0); + elm_object_part_text_set(entry, "guide", "Search."); + elm_box_pack_end(bx, entry); + evas_object_show(entry); + + bx2 = elm_box_add(bx); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + gl = elm_genlist_add(bx); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_genlist_select_mode_set(gl, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_genlist_mode_set(gl, ELM_LIST_COMPRESS); + elm_genlist_homogeneous_set(gl, EINA_TRUE); + elm_box_pack_end(bx2, gl); + api->gl = gl; + evas_object_show(gl); + evas_object_smart_callback_add(gl, "selected", _gl_focus_item_cb, "selected"); + evas_object_smart_callback_add(gl, "unselected", _gl_focus_item_cb, "unselected"); + evas_object_smart_callback_add(gl, "activated", _gl_focus_item_cb, "activated"); + evas_object_smart_callback_add(gl, "highlighted", _gl_focus_item_cb, "highlighted"); + evas_object_smart_callback_add(gl, "unhighlighted", _gl_focus_item_cb, "unhighlighted"); + evas_object_smart_callback_add(gl, "filter,done", _gl_filter_finished_cb, gl); + evas_object_event_callback_add(gl, EVAS_CALLBACK_KEY_DOWN, _gl_focus_key_down_cb, NULL); + + itc = elm_genlist_item_class_new(); + itc->item_style = "default"; + itc->func.text_get = glf_text_get; + itc->func.content_get = NULL; + itc->func.filter_get = gl_filter_get; + itc->func.state_get = NULL; + itc->func.del = NULL; + + for (i = 0; i < 500; i++) + elm_genlist_item_append(gl, itc, + (void *)(long)i, NULL, + ELM_GENLIST_ITEM_NONE, + NULL, NULL); + + evas_object_resize(win, 420, 600); + evas_object_show(win); + elm_object_focus_set(entry, EINA_TRUE); + evas_object_smart_callback_add(entry, "changed,user", _entry_change_cb, api); +} + +static void +_rd_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + api_data *ad = data; + ad->scrollto = elm_radio_state_value_get(obj); +} + +static Evas_Object * +_scrollto_mode_frame_new(Evas_Object *win, void *data) +{ + Evas_Object *fr, *bx, *rd, *rdg; + api_data *sd = data; + + fr = elm_frame_add(win); + elm_object_text_set(fr, "Scrollto Mode"); + evas_object_show(fr); + + bx = elm_box_add(win); + elm_object_content_set(fr, bx); + evas_object_show(bx); + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, 0); + elm_object_text_set(rd, "SCROLLTO_NONE"); + evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, sd); + evas_object_show(rd); + elm_box_pack_end(bx, rd); + rdg = rd; + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, 1); + elm_object_text_set(rd, "SCROLLTO_IN"); + elm_radio_group_add(rd, rdg); + evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, sd); + evas_object_show(rd); + elm_box_pack_end(bx, rd); + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, 2); + elm_object_text_set(rd, "SCROLLTO_TOP"); + elm_radio_group_add(rd, rdg); + evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, sd); + evas_object_show(rd); + elm_box_pack_end(bx, rd); + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, 4); + elm_object_text_set(rd, "SCROLLTO_MIDDLE"); + elm_radio_group_add(rd, rdg); + evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, sd); + evas_object_show(rd); + elm_box_pack_end(bx, rd); + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, 8); + elm_object_text_set(rd, "SCROLLTO_BOTTOM"); + elm_radio_group_add(rd, rdg); + evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, sd); + evas_object_show(rd); + elm_box_pack_end(bx, rd); + + return fr; +} + +void +_scrollto_item_show(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + api_data *api = data; + Elm_Object_Item *it = elm_genlist_selected_item_get(api->gl); + elm_genlist_item_show(it, api->scrollto); +} + +void +_scrollto_item_bring(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + api_data *api = data; + Elm_Object_Item *it = elm_genlist_selected_item_get(api->gl); + elm_genlist_item_bring_in(it, api->scrollto); +} + +void +test_genlist_show_bring(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *gl, *bt_show, *bt_bring, *bx, *bxx, *fr; + Elm_Object_Item *gli; + int i, max; + api_data *api = calloc(1, sizeof(api_data)); + + win = elm_win_util_standard_add("genlist", "Genlist Item Show/Bring"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _cleanup_cb, api); + + bxx = elm_box_add(win); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bxx); + evas_object_show(bxx); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(bx); + elm_box_pack_end(bxx, bx); + + gl = elm_genlist_add(win); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, gl); + evas_object_show(gl); + api->gl = gl; + + api->itc1 = elm_genlist_item_class_new(); + api->itc1->item_style = "default"; + api->itc1->func.text_get = gl_text_get1; + api->itc1->func.content_get = gl_content_get; + api->itc1->func.state_get = NULL; + api->itc1->func.del = NULL; + + bt_show = elm_button_add(win); + elm_object_text_set(bt_show, "Show"); + evas_object_smart_callback_add(bt_show, "clicked", _scrollto_item_show, api); + evas_object_show(bt_show); + elm_box_pack_end(bx, bt_show); + + bt_bring = elm_button_add(win); + elm_object_text_set(bt_bring, "Bring"); + evas_object_smart_callback_add(bt_bring, "clicked", _scrollto_item_bring, api); + evas_object_show(bt_bring); + elm_box_pack_end(bx, bt_bring); + + fr = _scrollto_mode_frame_new(win, api); + elm_box_pack_end(bx, fr); + + max = 2000; + for (i = 0; i < max; i++) + elm_genlist_item_append(gl, api->itc1, (void*)(uintptr_t)i, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + + elm_genlist_item_class_free(api->itc1); + gli = elm_genlist_nth_item_get(gl, 1340); + elm_genlist_item_selected_set(gli, EINA_TRUE); + elm_genlist_item_show(gli, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); + + evas_object_resize(win, 480, 400); + explode_win_enable(win); + evas_object_show(win); +} + diff --git a/src/bin/elementary/test_gesture_layer.c b/src/bin/elementary/test_gesture_layer.c new file mode 100644 index 0000000000..5f75e6f32e --- /dev/null +++ b/src/bin/elementary/test_gesture_layer.c @@ -0,0 +1,400 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +/* We zoom out to this value so we'll be able to use map and have a nice + * resolution when zooming in. */ +#define BASE_ZOOM 0.5 +/* The amount of zoom to do when "lifting" objects. */ +#define LIFT_FACTOR 1.3 +/* The base size of the shadow image. */ +#define SHADOW_W 118 +#define SHADOW_H 118 + +static double zoom_out_animation_duration = 0.4; + +struct _Photo_Object { + Evas_Object *ic, *shadow; + Evas_Object *hit; + Evas_Object *gl; + Elm_Transit *zoom_out; + /* bx, by - current wanted coordinates of the photo object. + * bw, bh - original size of the "ic" object. + * dx, dy - Used to indicate the distance between the center point + * where we put down our fingers (when started moving the item) to + * the coords of the object, so we'll be able to calculate movement + * correctly. */ + Evas_Coord bx, by, bw, bh, dx, dy; + /* Because gesture layer only knows the amount of rotation/zoom we do + * per gesture, we have to keep the current rotate/zoom factor and the + * one that was before we started the gesture. */ + int base_rotate, rotate; + double base_zoom, zoom; + double shadow_zoom; +}; +typedef struct _Photo_Object Photo_Object; + +/* This function applies the information from the Photo_Object to the actual + * evas objects. Zoom/rotate factors and etc. */ +static void +apply_changes(Photo_Object *po) +{ + Evas_Map *map; + + map = evas_map_new(4); + evas_map_point_coord_set(map, 0, po->bx, po->by, 0); + evas_map_point_coord_set(map, 1, po->bx + po->bw, po->by, 0); + evas_map_point_coord_set(map, 2, po->bx + po->bw, po->by + po->bh, 0); + evas_map_point_coord_set(map, 3, po->bx, po->by + po->bh, 0); + evas_map_point_image_uv_set(map, 0, 0, 0); + evas_map_point_image_uv_set(map, 1, po->bw, 0); + evas_map_point_image_uv_set(map, 2, po->bw, po->bh); + evas_map_point_image_uv_set(map, 3, 0, po->bh); + evas_map_util_rotate(map, po->rotate, + po->bx + po->bw / 2, po->by + po->bh /2); + evas_map_util_zoom(map, po->zoom, po->zoom, + po->bx + po->bw / 2, po->by + po->bh /2); + evas_object_map_enable_set(po->ic, EINA_TRUE); + evas_object_map_set(po->ic, map); + + { + Evas_Map *shadow_map = evas_map_new(4); + evas_map_point_coord_set(shadow_map, 0, po->bx, po->by, 0); + evas_map_point_coord_set(shadow_map, 1, po->bx + po->bw, po->by, 0); + evas_map_point_coord_set(shadow_map, 2, po->bx + po->bw, po->by + po->bh, 0); + evas_map_point_coord_set(shadow_map, 3, po->bx, po->by + po->bh, 0); + evas_map_point_image_uv_set(shadow_map, 0, 0, 0); + evas_map_point_image_uv_set(shadow_map, 1, SHADOW_W, 0); + evas_map_point_image_uv_set(shadow_map, 2, SHADOW_W, SHADOW_H); + evas_map_point_image_uv_set(shadow_map, 3, 0, SHADOW_H); + evas_map_util_rotate(shadow_map, po->rotate, + po->bx + po->bw / 2, po->by + po->bh /2); + evas_map_util_zoom(shadow_map, po->zoom * po->shadow_zoom, + po->zoom * po->shadow_zoom, + po->bx + (po->bw / 2), po->by + (po->bh / 2)); + evas_object_map_enable_set(po->shadow, EINA_TRUE); + evas_object_map_set(po->shadow, shadow_map); + evas_map_free(shadow_map); + } + + /* Update the position of the hit box */ + { + Evas_Coord minx, miny, maxx, maxy; + int i; + evas_object_polygon_points_clear(po->hit); + evas_map_point_coord_get(map, 0, &minx, &miny, NULL); + maxx = minx; + maxy = miny; + evas_object_polygon_point_add(po->hit, minx, miny); + for (i = 1 ; i <= 3 ; i++) + { + Evas_Coord x, y; + evas_map_point_coord_get(map, i, &x, &y, NULL); + evas_object_polygon_point_add(po->hit, x, y); + if (x < minx) + minx = x; + else if (x > maxx) + maxx = x; + + if (y < miny) + miny = y; + else if (y > maxy) + maxy = y; + } + } + + evas_object_raise(po->shadow); + evas_object_raise(po->ic); + evas_object_raise(po->hit); + evas_map_free(map); +} + +/* Zoom out animation */ +static void +zoom_out_animation_operation(void *_po, Elm_Transit *transit EINA_UNUSED, + double progress) +{ + Photo_Object *po = (Photo_Object *) _po; + po->zoom = BASE_ZOOM + ((po->base_zoom - BASE_ZOOM) * (1.0 - progress)); + apply_changes(po); +} + +static void +zoom_out_animation_end(void *_po, Elm_Transit *transit EINA_UNUSED) +{ + Photo_Object *po = (Photo_Object *) _po; + + po->base_zoom = po->zoom = BASE_ZOOM; + apply_changes(po); + + po->zoom_out = NULL; +} + +static Evas_Event_Flags +rotate_move(void *_po, void *event_info) +{ + Photo_Object *po = (Photo_Object *) _po; + Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info; + printf("rotate move <%d,%d> base=<%f> <%f>\n", p->x, p->y, p->base_angle, p->angle); + po->rotate = po->base_rotate + (int) p->angle - p->base_angle; + if (po->rotate < 0) + po->rotate += 360; + apply_changes(po); + return EVAS_EVENT_FLAG_NONE; +} + +static Evas_Event_Flags +rotate_end(void *_po, void *event_info) +{ + Photo_Object *po = (Photo_Object *) _po; + Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info; + printf("rotate end/abort <%d,%d> base=<%f> <%f>\n", p->x, p->y, p->base_angle, p->angle); + po->base_rotate += (int) p->angle - p->base_angle; + if (po->rotate < 0) + po->rotate += 360; + return EVAS_EVENT_FLAG_NONE; +} + +static Evas_Event_Flags +zoom_start(void *_po, void *event_info) +{ + Photo_Object *po = (Photo_Object *) _po; + Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info; + printf("zoom start <%d,%d> <%f>\n", p->x, p->y, p->zoom); + + /* If there's an active animator, stop it */ + if (po->zoom_out) + { + elm_transit_del(po->zoom_out); + po->zoom_out = NULL; + } + + /* Give it a "lift" effect right from the start */ + po->base_zoom = BASE_ZOOM * LIFT_FACTOR; + po->zoom = po->base_zoom; + po->shadow_zoom = 1.7; + + apply_changes(po); + return EVAS_EVENT_FLAG_NONE; +} + +static Evas_Event_Flags +zoom_move(void *_po, void *event_info) +{ + Photo_Object *po = (Photo_Object *) _po; + Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info; + printf("zoom move <%d,%d> <%f>\n", p->x, p->y, p->zoom); + po->zoom = po->base_zoom * p->zoom; + apply_changes(po); + return EVAS_EVENT_FLAG_NONE; +} + +static Evas_Event_Flags +zoom_end(void *_po, void *event_info) +{ + Photo_Object *po = (Photo_Object *) _po; + Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info; + printf("zoom end/abort <%d,%d> <%f>\n", p->x, p->y, p->zoom); + + /* Apply the zoom out animator */ + po->shadow_zoom = 1.3; + po->base_zoom = po->zoom; + po->zoom_out = elm_transit_add(); + elm_transit_duration_set(po->zoom_out, zoom_out_animation_duration); + elm_transit_effect_add(po->zoom_out, zoom_out_animation_operation, po, zoom_out_animation_end); + elm_transit_go(po->zoom_out); + return EVAS_EVENT_FLAG_NONE; +} + +static Evas_Event_Flags +momentum_start(void *_po, void *event_info) +{ + Photo_Object *po = (Photo_Object *) _po; + Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info; + printf("momentum_start <%d,%d>\n", p->x2, p->y2); + + po->dx = p->x2 - po->bx; + po->dy = p->y2 - po->by; + apply_changes(po); + + return EVAS_EVENT_FLAG_NONE; +} + +static Evas_Event_Flags +momentum_move(void *_po, void *event_info) +{ + Photo_Object *po = (Photo_Object *) _po; + Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info; + printf("momentum move <%d,%d>\n", p->x2, p->y2); + + po->bx = p->x2 - po->dx; + po->by = p->y2 - po->dy; + apply_changes(po); + + return EVAS_EVENT_FLAG_NONE; +} + +static Evas_Event_Flags +momentum_end(void *_po, void *event_info) +{ + Photo_Object *po = (Photo_Object *) _po; + Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info; + printf("momentum end/abort <%d,%d> <%d,%d>\n", p->x2, p->y2, p->mx, p->my); + (void) po; + (void) p; + /* Make sure middle is in the screen, if not, fix it. */ + { + /* FIXME: Use actual window sizes instead of the hardcoded + * values */ + Evas_Coord mx, my; + mx = po->bx + (po->bw / 2); + my = po->by + (po->bh / 2); + if (mx < 0) + po->bx = 0 - (po->bw / 2); + else if (mx > 480) + po->bx = 480 - (po->bw / 2); + + if (my < 0) + po->by = 0 - (po->bw / 2); + else if (my > 800) + po->by = 800 - (po->bh / 2); + } + apply_changes(po); + + return EVAS_EVENT_FLAG_NONE; +} + +static void +_win_del_req(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Photo_Object **photo_array = (Photo_Object **) data; + + if (!photo_array) + return; + + /* The content of the photo object is automatically deleted when the win + * is deleted. */ + for ( ; *photo_array ; photo_array++) + free(*photo_array); + + free(data); +} + +Photo_Object * +photo_object_add(Evas_Object *parent, Evas_Object *ic, const char *icon, Evas_Coord x, + Evas_Coord y, Evas_Coord w, Evas_Coord h, int angle) +{ + char buf[PATH_MAX]; + Photo_Object *po; + po = calloc(1, sizeof(*po)); + po->base_zoom = po->zoom = BASE_ZOOM; + + if (ic) + { + po->ic = ic; + } + else + { + po->ic = elm_icon_add(parent); + elm_image_file_set(po->ic, icon, NULL); + } + + po->bx = x; + po->by = y; + po->bw = w; + po->bh = h; + + /* Add shadow */ + { + po->shadow = elm_icon_add(po->ic); + snprintf(buf, sizeof(buf), "%s/images/pol_shadow.png", elm_app_data_dir_get()); + elm_image_file_set(po->shadow, buf, NULL); + evas_object_resize(po->shadow, SHADOW_W, SHADOW_H); + evas_object_show(po->shadow); + } + + po->hit = evas_object_polygon_add(evas_object_evas_get(parent)); + evas_object_precise_is_inside_set(po->hit, EINA_TRUE); + evas_object_repeat_events_set(po->hit, EINA_TRUE); + evas_object_color_set(po->hit, 0, 0, 0, 0); + + evas_object_move(po->ic, 0, 0); + evas_object_resize(po->ic, po->bw, po->bh); + evas_object_show(po->ic); + + evas_object_show(po->hit); + + po->gl = elm_gesture_layer_add(po->ic); + elm_gesture_layer_hold_events_set(po->gl, EINA_TRUE); + elm_gesture_layer_attach(po->gl, po->hit); + + /* FIXME: Add a po->rotate start so we take the first angle!!!! */ + elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ROTATE, ELM_GESTURE_STATE_MOVE, rotate_move, po); + elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ROTATE, ELM_GESTURE_STATE_END, rotate_end, po); + elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ROTATE, ELM_GESTURE_STATE_ABORT, rotate_end, po); + elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM, ELM_GESTURE_STATE_START, zoom_start, po); + elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM, ELM_GESTURE_STATE_MOVE, zoom_move, po); + elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM, ELM_GESTURE_STATE_END, zoom_end, po); + elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM, ELM_GESTURE_STATE_ABORT, zoom_end, po); + elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM, ELM_GESTURE_STATE_START, momentum_start, po); + elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM, ELM_GESTURE_STATE_MOVE, momentum_move, po); + elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM, ELM_GESTURE_STATE_END, momentum_end, po); + elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM, ELM_GESTURE_STATE_ABORT, momentum_end, po); + + po->rotate = po->base_rotate = angle; + po->shadow_zoom = 1.3; + + apply_changes(po); + return po; +} + +void +test_gesture_layer(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Coord w, h; + Evas_Object *win, *bg; + char buf[PATH_MAX]; + int ind = 0; + Photo_Object **photo_array; + photo_array = calloc(4, sizeof(*photo_array)); + + w = 480; + h = 800; + + win = elm_win_add(NULL, "gesture-layer", ELM_WIN_BASIC); + elm_win_title_set(win, "Gesture Layer"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_resize(win, w, h); + + bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/wood_01.jpg", elm_app_data_dir_get()); + elm_bg_file_set(bg, buf, NULL); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + snprintf(buf, sizeof(buf), "%s/images/pol_sky.png", elm_app_data_dir_get()); + photo_array[ind++] = photo_object_add(win, NULL, buf, 200, 200, 365, 400, 0); + snprintf(buf, sizeof(buf), "%s/images/pol_twofish.png", elm_app_data_dir_get()); + photo_array[ind++] = photo_object_add(win, NULL, buf, 40, 300, 365, 400, 45); + + Evas_Object *en = elm_entry_add(win); + elm_object_text_set(en, "<font_size=40>You can use whatever object you want, " + "even entries like this.</font_size>"); + elm_entry_line_wrap_set(en, ELM_WRAP_MIXED); + + Evas_Object *postit = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/postit_ent.edj", elm_app_data_dir_get()); + elm_layout_file_set(postit, buf, "main"); + elm_object_part_content_set(postit, "ent", en); + + photo_array[ind++] = photo_object_add(win, postit, NULL, 50, 50, 382, 400, 355); + + photo_array[ind] = NULL; + evas_object_smart_callback_add(win, "delete,request", _win_del_req, + photo_array); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_gesture_layer2.c b/src/bin/elementary/test_gesture_layer2.c new file mode 100644 index 0000000000..f74912a1e5 --- /dev/null +++ b/src/bin/elementary/test_gesture_layer2.c @@ -0,0 +1,808 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +#define TAP_NAME "tap" +#define DOUBLE_TAP_NAME "double_tap" +#define TRIPLE_TAP_NAME "triple_tap" +#define LONG_TAP_NAME "long_tap" +#define FLICK_NAME "flick" +#define LINE_NAME "line" +#define MOMENTUM_NAME "momentum" +#define ROTATE_NAME "rotate" +#define ZOOM_NAME "zoom" + +#define N_GESTURE_TYPE 9 +#define MAX_DOUBLE_TAP 5 +#define MAX_FLICK 5 +#define MAX_LINE 5 +#define MAX_LONG_TAP 5 +#define MAX_MOMENTUM 5 +#define MAX_ROTATE 1 +#define MAX_TAP 5 +#define MAX_TRIPLE_TAP 5 +#define MAX_ZOOM 1 + +#define TB_PADDING_X 4 +#define TB_PADDING_Y 12 + +#define BX_PADDING_X 0 +#define BX_PADDING_Y 2 + +/* Define initial RGBA values for icons */ +#define INI_R 60 +#define INI_G 66 +#define INI_B 64 +#define INI_A 128 +#define COLOR_STEP 4 + +#define START_COLOR 220, 220, 200, 255 +#define MOVE_COLOR 255, 255, 0, 255 +#define ABORT_COLOR 255, 0, 0, 255 +#define END_COLOR 0, 255, 0, 255 + +struct _icon_properties +{ + Evas_Object *icon; + int r; /* current r */ + int g; + int b; + int a; + + const char *name; +}; +typedef struct _icon_properties icon_properties; + +struct _infra_data +{ /* Some data that is passed aroung between callbacks (replacing globals) */ + icon_properties *icons; + Ecore_Timer *colortimer; + char buf[1024]; + int long_tap_count; +}; +typedef struct _infra_data infra_data; + +void +_infra_data_free(infra_data *infra) +{ + if (infra) + { + if (infra->colortimer) + ecore_timer_del(infra->colortimer); + + if (infra->icons) + free(infra->icons); + + free (infra); + } +} + +infra_data * +_infra_data_alloc(void) +{ + infra_data *infra = malloc(sizeof(infra_data)); + infra->icons = calloc(N_GESTURE_TYPE, sizeof(icon_properties )); + infra->colortimer = NULL; + + return infra; +} + +static void +my_win_del(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ /* called when my_win_main is requested to be deleted */ + _infra_data_free(data); +} + +icon_properties * +_icon_properties_find(icon_properties *icons, char *name) +{ + int n; + + for (n = 0; n < N_GESTURE_TYPE; n++) + if (!strcmp(icons[n].name, name)) + return &icons[n]; + + return NULL; +} + +void +_icon_color_set(icon_properties *i, int r, int g, int b, int a) +{ + i->r = r; + i->g = g; + i->b = b; + i->a = a; + evas_object_color_set(i->icon, i->r, i->g, i->b, i->a); +} + +static Eina_Bool +_icon_color_set_cb(void *data) +{ +#define INC_COLOR(C, NC) \ + do { \ + if (abs(i->C - NC) < COLOR_STEP) \ + i->C = NC; \ + else \ + i->C += ((i->C < NC) ? COLOR_STEP : (-COLOR_STEP)); \ + } while (0) + + int n; + icon_properties *icons = data; + icon_properties *i; + + for (n = 0; n < N_GESTURE_TYPE; n++) + { + i = &icons[n]; + + INC_COLOR(r,INI_R); + INC_COLOR(g,INI_G); + INC_COLOR(b,INI_B); + INC_COLOR(a,INI_A); + + /* Change Icon color */ + evas_object_color_set(i->icon, i->r, i->g, i->b, i->a); + } + + return ECORE_CALLBACK_RENEW; +} + +void +_color_and_icon_set(infra_data *infra, char *name, int n, int max, + int r, int g, int b, int a) +{ + icon_properties *i; + int nn = n; + i = _icon_properties_find(infra->icons, name); + if (i) + { + if (n < 1) + nn = 1; + + if (n > max) + nn = max; + + snprintf(infra->buf, sizeof(infra->buf), + "%s/images/g_layer/%s_%d.png", elm_app_data_dir_get(), i->name, nn); + elm_image_file_set(i->icon, infra->buf, NULL); + _icon_color_set(i, r, g, b, a); + } +} + +/* START - Callbacks for gestures */ +static Evas_Event_Flags +n_finger_tap_start(void *data , void *event_info) +{ + Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info; + _color_and_icon_set(data, TAP_NAME, p->n, MAX_TAP, START_COLOR); + printf("N tap started <%p> x,y=<%d,%d> count=<%d>\n", + event_info, p->x, p->y, p->n); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +n_finger_tap_end(void *data , void *event_info) +{ + Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info; + + printf("N tap ended <%p> x,y=<%d,%d> count=<%d>\n", + event_info, p->x, p->y, p->n); + _color_and_icon_set(data, TAP_NAME, p->n, MAX_TAP, END_COLOR); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +n_finger_tap_abort(void *data , void *event_info) +{ + Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info; + printf("N tap abort\n"); + _color_and_icon_set(data, TAP_NAME, p->n, MAX_TAP, ABORT_COLOR); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +n_long_tap_start(void *data , void *event_info) +{ + Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info; + infra_data *infra = data; + + printf("N long tap started <%p> x,y=<%d,%d> count=<%d>\n", + event_info, p->x, p->y, p->n); + _color_and_icon_set(data, LONG_TAP_NAME, p->n, MAX_LONG_TAP, START_COLOR); + infra->long_tap_count = 0; + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +n_long_tap_move(void *data , void *event_info) +{ + Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info; + infra_data *infra = data; + + infra->long_tap_count++; + _color_and_icon_set(data, LONG_TAP_NAME, p->n, MAX_LONG_TAP, MOVE_COLOR); + + printf("N long tap moved <%p> x,y=<%d,%d> count=<%d>\n", + event_info, p->x, p->y, p->n); + if (infra->long_tap_count == 1) + printf("This is a first long tap.\n"); + + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +n_long_tap_end(void *data , void *event_info) +{ + Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info; + + printf("N long tap ended <%p> x,y=<%d,%d> count=<%d>\n", + event_info, p->x, p->y, p->n); + _color_and_icon_set(data, LONG_TAP_NAME, p->n, MAX_LONG_TAP, END_COLOR); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +n_long_tap_abort(void *data , void *event_info) +{ + Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info; + _color_and_icon_set(data, LONG_TAP_NAME, p->n, MAX_LONG_TAP, ABORT_COLOR); + printf("N long tap abort\n"); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +dbl_click_start(void *data , void *event_info) +{ + Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info; + + _color_and_icon_set(data,DOUBLE_TAP_NAME, p->n, MAX_DOUBLE_TAP, START_COLOR); + printf("Double click started <%p> x,y=<%d,%d> count=<%d>\n", + event_info, p->x, p->y, p->n); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +dbl_click_move(void *data , void *event_info) +{ + Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info; + _color_and_icon_set(data, DOUBLE_TAP_NAME, p->n, MAX_DOUBLE_TAP, MOVE_COLOR); + + printf("Double click move <%p> x,y=<%d,%d> count=<%d>\n", + event_info, p->x, p->y, p->n); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +dbl_click_end(void *data , void *event_info) +{ + Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info; + _color_and_icon_set(data, DOUBLE_TAP_NAME, p->n, MAX_DOUBLE_TAP, END_COLOR); + + printf("Double click ended <%p> x,y=<%d,%d> count=<%d>\n", + event_info, p->x, p->y, p->n); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +dbl_click_abort(void *data , void *event_info) +{ + Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info; + _color_and_icon_set(data,DOUBLE_TAP_NAME, p->n, MAX_DOUBLE_TAP, ABORT_COLOR); + + printf("Double click abort\n"); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +triple_click_start(void *data , void *event_info) +{ + Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info; + _color_and_icon_set(data,TRIPLE_TAP_NAME, p->n, MAX_TRIPLE_TAP, START_COLOR); + + printf("Triple click started <%p> x,y=<%d,%d> count=<%d>\n", + event_info, p->x, p->y, p->n); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +triple_click_move(void *data , void *event_info) +{ + Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info; + + _color_and_icon_set(data, TRIPLE_TAP_NAME, p->n, MAX_TRIPLE_TAP, MOVE_COLOR); + printf("Triple click move <%p> x,y=<%d,%d> count=<%d>\n", + event_info, p->x, p->y, p->n); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +triple_click_end(void *data , void *event_info) +{ + Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info; + + _color_and_icon_set(data, TRIPLE_TAP_NAME, p->n, MAX_TRIPLE_TAP, END_COLOR); + printf("Triple click ended <%p> x,y=<%d,%d> count=<%d>\n", + event_info, p->x, p->y, p->n); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +triple_click_abort(void *data , void *event_info) +{ + Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info; + _color_and_icon_set(data,TRIPLE_TAP_NAME, p->n, MAX_TRIPLE_TAP, ABORT_COLOR); + + printf("Triple click abort\n"); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +momentum_start(void *data , void *event_info) +{ + Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info; + _color_and_icon_set(data, MOMENTUM_NAME, p->n, MAX_MOMENTUM, START_COLOR); + + printf("momentum started x1,y1=<%d,%d> tx,ty=<%u,%u> n=<%u>\n", + p->x1, p->y1, p->tx, p->ty, p->n); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +momentum_end(void *data , void *event_info) +{ + Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info; + _color_and_icon_set(data, MOMENTUM_NAME, p->n, MAX_MOMENTUM, END_COLOR); + printf("momentum ended x1,y1=<%d,%d> x2,y2=<%d,%d> tx,ty=<%u,%u> mx=<%d> my=<%d> n=<%u>\n",p->x1, p->y1, p->x2, p->y2, p->tx, p->ty, p->mx, p->my, p->n); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +momentum_abort(void *data , void *event_info) +{ + Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info; + printf("momentum abort\n"); + _color_and_icon_set(data, MOMENTUM_NAME, p->n, MAX_MOMENTUM, ABORT_COLOR); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +momentum_move(void *data , void *event_info) +{ + Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info; + _color_and_icon_set(data, MOMENTUM_NAME, p->n, MAX_MOMENTUM, MOVE_COLOR); + printf("momentum move x1,y1=<%d,%d> x2,y2=<%d,%d> tx,ty=<%u,%u> mx=<%d> my=<%d> n=<%u>\n", p->x1, p->y1, p->x2, p->y2, p->tx, p->ty, p->mx, p->my, p->n); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +line_start(void *data , void *event_info) +{ + Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info; + _color_and_icon_set(data, LINE_NAME, p->momentum.n, MAX_LINE, START_COLOR); + + printf("line started x1,y1=<%d,%d> x2,y2=<%d,%d> tx,ty=<%u,%u> n=<%u>\n", p->momentum.x1, p->momentum.y1, p->momentum.x2, p->momentum.y2, p->momentum.tx, p->momentum.ty, p->momentum.n); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +line_move(void *data , void *event_info) +{ + Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info; + _color_and_icon_set(data, LINE_NAME, p->momentum.n, MAX_LINE, MOVE_COLOR); + printf("line move x1,y1=<%d,%d> x2,y2=<%d,%d> tx,ty=<%u,%u> n=<%u>\n", p->momentum.x1, p->momentum.y1, p->momentum.x2, p->momentum.y2, p->momentum.tx, p->momentum.ty, p->momentum.n); + + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +line_end(void *data , void *event_info) +{ + Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info; + _color_and_icon_set(data, LINE_NAME, p->momentum.n, MAX_LINE, END_COLOR); + printf("line end x1,y1=<%d,%d> x2,y2=<%d,%d> tx,ty=<%u,%u> n=<%u>\n", p->momentum.x1, p->momentum.y1, p->momentum.x2, p->momentum.y2, p->momentum.tx, p->momentum.ty, p->momentum.n); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +line_abort(void *data , void *event_info) +{ + Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info; + _color_and_icon_set(data, LINE_NAME, p->momentum.n, MAX_LINE, ABORT_COLOR); + printf("line abort\n"); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +flick_start(void *data , void *event_info) +{ + Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info; + _color_and_icon_set(data, FLICK_NAME, p->momentum.n, MAX_FLICK, START_COLOR); + + printf("flick started x1,y1=<%d,%d> tx,ty=<%u,%u> n=<%u>\n", + p->momentum.x1, p->momentum.y1, p->momentum.tx, + p->momentum.ty, p->momentum.n); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +flick_end(void *data , void *event_info) +{ + Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info; + _color_and_icon_set(data, FLICK_NAME, p->momentum.n, MAX_FLICK, END_COLOR); + + printf("flick ended x1,y1=<%d,%d> x2,y2=<%d,%d> tx,ty=<%u,%u> mx=<%d> my=<%d> n=<%u>\n",p->momentum.x1, p->momentum.y1, p->momentum.x2, p->momentum.y2, p->momentum.tx, p->momentum.ty, p->momentum.mx, p->momentum.my, p->momentum.n); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +flick_abort(void *data , void *event_info) +{ + Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info; + _color_and_icon_set(data, FLICK_NAME, p->momentum.n, MAX_FLICK, ABORT_COLOR); + printf("flick abort\n"); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +zoom_start(void *data , void *event_info) +{ + Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info; + _color_and_icon_set(data, ZOOM_NAME, MAX_ZOOM, MAX_ZOOM, START_COLOR); + printf("zoom started <%d,%d> zoom=<%f> radius=<%d> momentum=<%f>\n", + p->x, p->y, p->zoom, p->radius, p->momentum); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +zoom_move(void *data , void *event_info) +{ + Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info; + _color_and_icon_set(data, ZOOM_NAME, MAX_ZOOM, MAX_ZOOM, MOVE_COLOR); + printf("zoom move <%d,%d> zoom=<%f> radius=<%d> momentum=<%f>\n", + p->x, p->y, p->zoom, p->radius, p->momentum); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +zoom_end(void *data , void *event_info) +{ + Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info; + _color_and_icon_set(data, ZOOM_NAME, MAX_ZOOM, MAX_ZOOM, END_COLOR); + printf("zoom end <%d,%d> zoom=<%f> radius=<%d> momentum=<%f>\n", + p->x, p->y, p->zoom, p->radius, p->momentum); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +zoom_abort(void *data , void *event_info EINA_UNUSED) +{ + printf("zoom abort\n"); + _color_and_icon_set(data, ZOOM_NAME, MAX_ZOOM, MAX_ZOOM, ABORT_COLOR); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +rotate_start(void *data , void *event_info) +{ + Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info; + _color_and_icon_set(data, ROTATE_NAME, MAX_ROTATE, MAX_ROTATE, START_COLOR); + printf("rotate started <%d,%d> base=<%f> angle=<%f> radius=<%d> momentum=<%f>\n", p->x, p->y, p->base_angle, p->angle, p->radius, p->momentum); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +rotate_move(void *data , void *event_info) +{ + Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info; + _color_and_icon_set(data, ROTATE_NAME, MAX_ROTATE, MAX_ROTATE, MOVE_COLOR); + printf("rotate move <%d,%d> base=<%f> angle=<%f> radius=<%d> momentum=<%f>\n", p->x, p->y, p->base_angle, p->angle, p->radius, p->momentum); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +rotate_end(void *data , void *event_info) +{ + Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info; + _color_and_icon_set(data, ROTATE_NAME, MAX_ROTATE, MAX_ROTATE, END_COLOR); + printf("rotate end <%d,%d> base=<%f> angle=<%f> radius=<%d> momentum=<%f>\n", p->x, p->y, p->base_angle, p->angle, p->radius, p->momentum); + return EVAS_EVENT_FLAG_ON_HOLD; +} + +static Evas_Event_Flags +rotate_abort(void *data , void *event_info EINA_UNUSED) +{ + _color_and_icon_set(data, ROTATE_NAME, MAX_ROTATE, MAX_ROTATE, ABORT_COLOR); + printf("rotate abort\n"); + return EVAS_EVENT_FLAG_ON_HOLD; +} +/* END - Callbacks for gestures */ + +Evas_Object *create_gesture_box(Evas_Object *win, icon_properties *icons, + int idx, const char *name, const char *lb_txt) +{ /* Creates a box with icon and label, later placed in a table */ + Evas_Object *lb, *bx = elm_box_add(win); + char buf[1024]; + + elm_box_padding_set(bx, BX_PADDING_X, BX_PADDING_Y); + icons[idx].icon = elm_icon_add(win); + icons[idx].name = name; + snprintf(buf, sizeof(buf), "%s/images/g_layer/%s_1.png", + elm_app_data_dir_get(), icons[idx].name); + elm_image_file_set(icons[idx].icon, buf, NULL); + elm_image_resizable_set(icons[idx].icon, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_align_set(icons[idx].icon, 0.5, 0.5); + _icon_color_set(&icons[idx], INI_R, INI_G, INI_B, INI_A); + elm_box_pack_end(bx, icons[idx].icon); + evas_object_show(icons[idx].icon); + + lb = elm_label_add(win); + elm_object_text_set(lb, lb_txt); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(lb, 0.5, 0.5); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + evas_object_show(bx); + + return bx; +} + +void +test_gesture_layer2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *tb, *lb, *bx; + Evas_Object *r; /* Gesture layer transparent object */ + Evas_Object *g; /* The Gesture Layer object */ + + infra_data *infra = _infra_data_alloc(); + + win = elm_win_util_standard_add("gesture-layer2", "Gesture Layer 2"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_smart_callback_add(win, "delete,request", my_win_del, infra); + + /* START - Building icons table */ + bx = elm_box_add(win); + tb = elm_table_add(win); + elm_box_pack_end(bx, tb); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(tb, 0.5, 0.5); + elm_win_resize_object_add(win, bx); + evas_object_show(tb); + evas_object_show(bx); + + /* Box of Tap icon and label */ + bx = create_gesture_box(win, infra->icons, 0, TAP_NAME, "Tap"); + elm_table_pack(tb, bx, 0, 0, 1, 1); + + /* Box of Double Tap icon and label */ + bx = create_gesture_box(win, infra->icons, 1, DOUBLE_TAP_NAME, "Double Tap"); + elm_table_pack(tb, bx, 1, 0, 1, 1); + + /* Box of Triple Tap icon and label */ + bx = create_gesture_box(win, infra->icons, 2, TRIPLE_TAP_NAME, "Triple Tap"); + elm_table_pack(tb, bx, 2, 0, 1, 1); + + /* Box of Long Tap icon and label */ + bx = create_gesture_box(win, infra->icons, 3, LONG_TAP_NAME, "Long Tap"); + elm_table_pack(tb, bx, 3, 0, 1, 1); + + /* Box of Momentum icon and label */ + bx = create_gesture_box(win, infra->icons, 4, MOMENTUM_NAME, "Momentum"); + elm_table_pack(tb, bx, 0, 2, 1, 1); + + /* Box of Line icon and label */ + bx = create_gesture_box(win, infra->icons, 5, LINE_NAME, "Line"); + elm_table_pack(tb, bx, 1, 2, 1, 1); + + /* Box of Flick icon and label */ + bx = create_gesture_box(win, infra->icons, 6, FLICK_NAME, "Flick"); + elm_table_pack(tb, bx, 2, 2, 1, 1); + + /* Box of Zoom icon and label */ + bx = create_gesture_box(win, infra->icons, 7, ZOOM_NAME, "Zoom"); + elm_table_pack(tb, bx, 0, 3, 1, 1); + + /* Box of Rotate icon and label */ + bx = create_gesture_box(win, infra->icons, 8, ROTATE_NAME, "Rotate"); + elm_table_pack(tb, bx, 1, 3, 1, 1); + + /* Legend of gestures - states */ + lb = elm_label_add(win); + elm_object_text_set(lb, "<b>Gesture States</b>"); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, lb, 0, 6, 4, 2); + evas_object_show(lb); + + r = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_resize(r, 64, 64); + evas_object_color_set(r, INI_R, INI_G, INI_B, INI_A); + evas_object_size_hint_weight_set(r, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(r, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, r, 0, 7, 1, 1); + evas_object_show(r); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Not Started"); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, lb, 1, 7, 3, 1); + evas_object_show(lb); + + r = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_resize(r, 64, 64); + evas_object_color_set(r, START_COLOR); + evas_object_size_hint_weight_set(r, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(r, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, r, 0, 8, 1, 1); + evas_object_show(r); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Gesture START"); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, lb, 1, 8, 3, 1); + evas_object_show(lb); + + r = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_resize(r, 64, 64); + evas_object_color_set(r, MOVE_COLOR); + evas_object_size_hint_weight_set(r, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(r, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, r, 0, 9, 1, 1); + evas_object_show(r); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Gesture MOVE"); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, lb, 1, 9, 3, 1); + evas_object_show(lb); + + r = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_resize(r, 64, 64); + evas_object_color_set(r, END_COLOR); + evas_object_size_hint_weight_set(r, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(r, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, r, 0, 10, 1, 1); + evas_object_show(r); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Gesture END"); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, lb, 1, 10, 3, 1); + evas_object_show(lb); + + r = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_resize(r, 64, 64); + evas_object_color_set(r, ABORT_COLOR); + evas_object_size_hint_weight_set(r, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(r, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, r, 0, 11, 1, 1); + evas_object_show(r); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Gesture ABORT"); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, lb, 1, 11, 3, 1); + + elm_table_padding_set(tb, TB_PADDING_X, TB_PADDING_Y); + evas_object_show(lb); + /* END - Building icons table */ + + /* Gesture layer transparent object */ + r = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_move(r, 0, 0); + evas_object_color_set(r, 0, 0, 0, 0); + elm_win_resize_object_add(win, r); + + g = elm_gesture_layer_add(win); + elm_gesture_layer_attach(g, r); + evas_object_show(r); + + /* START - Setting gestures callbacks */ +#if 1 + elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TRIPLE_TAPS, + ELM_GESTURE_STATE_START, triple_click_start, infra); + elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TRIPLE_TAPS, + ELM_GESTURE_STATE_MOVE, triple_click_move, infra); + elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TRIPLE_TAPS, + ELM_GESTURE_STATE_END, triple_click_end, infra); + elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TRIPLE_TAPS, + ELM_GESTURE_STATE_ABORT, triple_click_abort, infra); +#endif + +#if 1 + elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS, + ELM_GESTURE_STATE_START, dbl_click_start, infra); + elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS, + ELM_GESTURE_STATE_MOVE, dbl_click_move, infra); + elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS, + ELM_GESTURE_STATE_END, dbl_click_end, infra); + elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS, + ELM_GESTURE_STATE_ABORT, dbl_click_abort, infra); +#endif + +#if 1 + elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS, + ELM_GESTURE_STATE_START, n_finger_tap_start, infra); + elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS, + ELM_GESTURE_STATE_END, n_finger_tap_end, infra); + elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS, + ELM_GESTURE_STATE_ABORT, n_finger_tap_abort, infra); +#endif + +#if 1 + elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LONG_TAPS, + ELM_GESTURE_STATE_START, n_long_tap_start, infra); + elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LONG_TAPS, + ELM_GESTURE_STATE_MOVE, n_long_tap_move, infra); + elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LONG_TAPS, + ELM_GESTURE_STATE_END, n_long_tap_end, infra); + elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LONG_TAPS, + ELM_GESTURE_STATE_ABORT, n_long_tap_abort, infra); +#endif + +#if 1 + elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM, + ELM_GESTURE_STATE_START, momentum_start, infra); + elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM, + ELM_GESTURE_STATE_END, momentum_end, infra); + elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM, + ELM_GESTURE_STATE_ABORT, momentum_abort, infra); + elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM, + ELM_GESTURE_STATE_MOVE, momentum_move, infra); +#endif + +#if 1 + elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LINES, + ELM_GESTURE_STATE_START, line_start, infra); + elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LINES, + ELM_GESTURE_STATE_MOVE, line_move, infra); + elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LINES, + ELM_GESTURE_STATE_END, line_end, infra); + elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LINES, + ELM_GESTURE_STATE_ABORT, line_abort, infra); +#endif + +#if 1 + elm_gesture_layer_cb_set(g, ELM_GESTURE_N_FLICKS, + ELM_GESTURE_STATE_START, flick_start, infra); + elm_gesture_layer_cb_set(g, ELM_GESTURE_N_FLICKS, + ELM_GESTURE_STATE_END, flick_end, infra); + elm_gesture_layer_cb_set(g, ELM_GESTURE_N_FLICKS, + ELM_GESTURE_STATE_ABORT, flick_abort, infra); +#endif + +#if 1 + elm_gesture_layer_cb_set(g, ELM_GESTURE_ZOOM, + ELM_GESTURE_STATE_START, zoom_start, infra); + elm_gesture_layer_cb_set(g, ELM_GESTURE_ZOOM, + ELM_GESTURE_STATE_END, zoom_end, infra); + elm_gesture_layer_cb_set(g, ELM_GESTURE_ZOOM, + ELM_GESTURE_STATE_ABORT, zoom_abort, infra); + elm_gesture_layer_cb_set(g, ELM_GESTURE_ZOOM, + ELM_GESTURE_STATE_MOVE, zoom_move, infra); + /* elm_gesture_layer_zoom_step_set(g, 0.2); */ +#endif + +#if 1 + elm_gesture_layer_cb_set(g, ELM_GESTURE_ROTATE, + ELM_GESTURE_STATE_START, rotate_start, infra); + elm_gesture_layer_cb_set(g, ELM_GESTURE_ROTATE, + ELM_GESTURE_STATE_END, rotate_end, infra); + elm_gesture_layer_cb_set(g, ELM_GESTURE_ROTATE, + ELM_GESTURE_STATE_ABORT, rotate_abort, infra); + elm_gesture_layer_cb_set(g, ELM_GESTURE_ROTATE, + ELM_GESTURE_STATE_MOVE, rotate_move, infra); + /* elm_gesture_layer_rotate_step_set(g, 5.2); */ +#endif + /* END - Setting gestures callbacks */ + + /* Update color state 20 times a second */ + infra->colortimer = ecore_timer_add(0.05, _icon_color_set_cb, infra->icons); + + evas_object_show(win); +} diff --git a/src/bin/elementary/test_gesture_layer3.c b/src/bin/elementary/test_gesture_layer3.c new file mode 100644 index 0000000000..9d89ca921c --- /dev/null +++ b/src/bin/elementary/test_gesture_layer3.c @@ -0,0 +1,585 @@ +#ifdef HAVE_CONFIG_H +#include "elementary_config.h" +#endif +#include <Elementary.h> + +/* We zoom out to this value so we'll be able to use map and have a nice + * resolution when zooming in. */ +#define BASE_ZOOM 0.8 +#define MIN_ZOOM 0.4 +/* The amount of zoom to do when "lifting" objects. */ +#define LIFT_FACTOR 1.3 +/* The base size of the shadow image. */ +#define SHADOW_W 118 +#define SHADOW_H 118 +//#define RAD2DEG(x) ((x) * 57.295779513) + +#define MOMENTUM_FACTOR 30 +#define MOMENTUM_FRICTION 1000 +#define ROTATE_MOMENTUM_FRICTION 30 +#define ZOOM_MOMENTUM_FRICTION 8 + +struct _Photo_Object { + Evas_Object *ic, *shadow; + Evas_Object *hit; + Evas_Object *gl; + + /* 3 transit object to implement momentum animation */ + Elm_Transit *zoom_momentum; + Ecore_Animator *rot_timer; + Ecore_Animator *mom_timer; + double rot_tot_time; + double rot_progress; + /* bx, by - current wanted coordinates of the photo object. + * bw, bh - original size of the "ic" object. + * dx, dy - Used to indicate the distance between the center point + * m_dx, m_dy - momentum delta to apply with momentum transit + * where we put down our fingers (when started moving the item) to + * the coords of the object, so we'll be able to calculate movement + * correctly. */ + Evas_Coord bx, by, bw, bh, dx, dy, m_dx, m_dy; + /* Because gesture layer only knows the amount of rotation/zoom we do + * per gesture, we have to keep the current rotate/zoom factor and the + * one that was before we started the gesture. */ + int base_rotate, rotate; /* base - initial angle */ + double mx, my; /* momentum on x, y */ + double mom_x_acc, mom_y_acc; + double rot_momentum, zoom_mom; + double mom_tot_time; + double zoom_mom_time; + double base_zoom, zoom; + double shadow_zoom; +}; +typedef struct _Photo_Object Photo_Object; + +/* This function applies the information from the Photo_Object to the actual + * evas objects. Zoom/rotate factors and etc. */ +static void +apply_changes(Photo_Object *po) +{ + Evas_Map *map; + + map = evas_map_new(4); + evas_map_point_coord_set(map, 0, po->bx, po->by, 0); + evas_map_point_coord_set(map, 1, po->bx + po->bw, po->by, 0); + evas_map_point_coord_set(map, 2, po->bx + po->bw, po->by + po->bh, 0); + evas_map_point_coord_set(map, 3, po->bx, po->by + po->bh, 0); + evas_map_point_image_uv_set(map, 0, 0, 0); + evas_map_point_image_uv_set(map, 1, po->bw, 0); + evas_map_point_image_uv_set(map, 2, po->bw, po->bh); + evas_map_point_image_uv_set(map, 3, 0, po->bh); + evas_map_util_rotate(map, po->rotate, + po->bx + po->bw / 2, po->by + po->bh /2); + evas_map_util_zoom(map, po->zoom, po->zoom, + po->bx + po->bw / 2, po->by + po->bh /2); + evas_object_map_enable_set(po->ic, EINA_TRUE); + evas_object_map_set(po->ic, map); + + { + Evas_Map *shadow_map = evas_map_new(4); + evas_map_point_coord_set(shadow_map, 0, po->bx, po->by, 0); + evas_map_point_coord_set(shadow_map, 1, po->bx + po->bw, po->by, 0); + evas_map_point_coord_set(shadow_map, 2, + po->bx + po->bw, po->by + po->bh, 0); + evas_map_point_coord_set(shadow_map, 3, po->bx, po->by + po->bh, 0); + evas_map_point_image_uv_set(shadow_map, 0, 0, 0); + evas_map_point_image_uv_set(shadow_map, 1, SHADOW_W, 0); + evas_map_point_image_uv_set(shadow_map, 2, SHADOW_W, SHADOW_H); + evas_map_point_image_uv_set(shadow_map, 3, 0, SHADOW_H); + evas_map_util_rotate(shadow_map, po->rotate, + po->bx + po->bw / 2, po->by + po->bh /2); + evas_map_util_zoom(shadow_map, po->zoom * po->shadow_zoom, + po->zoom * po->shadow_zoom, + po->bx + (po->bw / 2), po->by + (po->bh / 2)); + evas_object_map_enable_set(po->shadow, EINA_TRUE); + evas_object_map_set(po->shadow, shadow_map); + evas_map_free(shadow_map); + } + + /* Update the position of the hit box */ + { + Evas_Coord minx, miny, maxx, maxy; + int i; + evas_object_polygon_points_clear(po->hit); + evas_map_point_coord_get(map, 0, &minx, &miny, NULL); + maxx = minx; + maxy = miny; + evas_object_polygon_point_add(po->hit, minx, miny); + for (i = 1 ; i <= 3 ; i++) + { + Evas_Coord x, y; + evas_map_point_coord_get(map, i, &x, &y, NULL); + evas_object_polygon_point_add(po->hit, x, y); + if (x < minx) + minx = x; + else if (x > maxx) + maxx = x; + + if (y < miny) + miny = y; + else if (y > maxy) + maxy = y; + } + } + + evas_object_raise(po->shadow); + evas_object_raise(po->ic); + evas_object_raise(po->hit); + evas_map_free(map); +} + +/* Zoom momentum animation */ +static void +zoom_momentum_animation_operation(void *_po, Elm_Transit *transit EINA_UNUSED, + double progress) +{ + Photo_Object *po = (Photo_Object *) _po; + double time_prog = po->zoom_mom_time * progress; + double zoom_fric = ZOOM_MOMENTUM_FRICTION; + + if (po->zoom_mom > 0) + zoom_fric *= -1; + + /* Current = rot0 + (rotv0 * t) + (a * t^2 / 2) */ + po->zoom = po->base_zoom + + ((po->zoom_mom * time_prog) + + (zoom_fric * (time_prog * time_prog) / 2)); + printf("%f = %f + (%f + %f)\n", po->zoom, po->base_zoom, + (po->zoom_mom * time_prog), + (zoom_fric * (time_prog * time_prog) / 2)); + + if (po->zoom < MIN_ZOOM) + po->zoom = MIN_ZOOM; + + apply_changes(po); +} + +static void +zoom_momentum_animation_end(void *_po, Elm_Transit *transit EINA_UNUSED) +{ + Photo_Object *po = (Photo_Object *) _po; + po->base_zoom = po->zoom; + po->zoom_momentum = NULL; +} + +/* Rotate momentum animation */ +static Eina_Bool +rotate_momentum_animation_operation(void *_po) +{ + Eina_Bool rc = ECORE_CALLBACK_RENEW; + int deg_friction = ROTATE_MOMENTUM_FRICTION; + Photo_Object *po = (Photo_Object *) _po; + po->rot_progress += ecore_animator_frametime_get(); + if (po->rot_progress > po->rot_tot_time) + { + po->rot_timer = NULL; + po->rot_progress = po->rot_tot_time; + rc = ECORE_CALLBACK_CANCEL; + } + + if (po->rot_momentum > 0) + deg_friction *= -1; + + /* Current = rot0 + (rotv0 * t) + (a * t^2 / 2) */ + po->rotate = po->base_rotate - + ((po->rot_momentum * po->rot_progress) + + (deg_friction * (po->rot_progress * po->rot_progress) / 2)); + po->rotate = (po->rotate % 360); + if (po->rotate < 0) + po->rotate += 360; + printf("%d = %d - (%f + %f)\n", po->rotate, po->base_rotate, + (po->rot_momentum * po->rot_progress), + (deg_friction * (po->rot_progress * po->rot_progress) / 2)); + + if (rc == ECORE_CALLBACK_CANCEL) + { + po->base_rotate = po->rotate; + printf("%s po->rotate=<%d>\n", __func__, po->rotate); + } + + apply_changes(po); + return rc; +} + +static void +pic_obj_keep_inframe(void *_po) +{ /* Make sure middle is in the screen, if not, fix it. */ + /* FIXME: Use actual window sizes instead of the hardcoded + * values */ + Photo_Object *po = (Photo_Object *) _po; + + Evas_Coord mx, my; + mx = po->bx + (po->bw / 2); + my = po->by + (po->bh / 2); + if (mx < 0) + po->bx = 0 - (po->bw / 2); + else if (mx > 480) + po->bx = 480 - (po->bw / 2); + + if (my < 0) + po->by = 0 - (po->bw / 2); + else if (my > 800) + po->by = 800 - (po->bh / 2); +} + +static Evas_Event_Flags +rotate_start(void *_po, void *event_info) +{ + Photo_Object *po = (Photo_Object *) _po; + Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info; + printf("rotate start <%d,%d> po->rotate=<%d> base=<%f> p->angle=<%f>\n", p->x, p->y, po->rotate, + p->base_angle, p->angle); + + /* If there's an active animator, stop it */ + if (po->rot_timer) + { + po->base_rotate = po->rotate; + ecore_animator_del(po->rot_timer); + po->rot_timer = NULL; + } + + return EVAS_EVENT_FLAG_NONE; +} + +static Evas_Event_Flags +rotate_move(void *_po, void *event_info) +{ + Photo_Object *po = (Photo_Object *) _po; + Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info; + printf("rotate move <%d,%d> base=<%f> <%f> m=<%f>\n", p->x, p->y, + p->base_angle, p->angle, p->momentum); + po->rotate = po->base_rotate + (int) (p->angle - p->base_angle); + + if (po->rotate < 0) + po->rotate += 360; + apply_changes(po); + return EVAS_EVENT_FLAG_NONE; +} + +static Evas_Event_Flags +rotate_end(void *_po, void *event_info) +{ + Photo_Object *po = (Photo_Object *) _po; + Elm_Gesture_Rotate_Info *r_info = (Elm_Gesture_Rotate_Info *) event_info; + printf("rotate end <%d,%d> base=<%f> <%f> m=<%f>\n", r_info->x, r_info->y, + r_info->base_angle, r_info->angle, r_info->momentum); + if (po->rotate < 0) + po->rotate += 360; + + po->base_rotate = po->rotate; + + /* Apply the rotate-momentum */ + po->rot_tot_time = fabs(r_info->momentum) / ROTATE_MOMENTUM_FRICTION; + po->rot_momentum = r_info->momentum; + po->rot_progress = 0.0; + if (po->rot_momentum) + { + po->rot_timer = ecore_animator_add(rotate_momentum_animation_operation, po); + } + return EVAS_EVENT_FLAG_NONE; +} + +static Evas_Event_Flags +rotate_abort(void *_po, void *event_info) +{ + Photo_Object *po = (Photo_Object *) _po; + Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info; + printf("rotate abort <%d,%d> base=<%f> <%f>\n", p->x, p->y, + p->base_angle, p->angle); + po->base_rotate = po->rotate; + if (po->rotate < 0) + po->rotate += 360; + + return EVAS_EVENT_FLAG_NONE; +} + +static Evas_Event_Flags +zoom_start(void *_po, void *event_info) +{ + Photo_Object *po = (Photo_Object *) _po; + Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info; + printf("zoom start <%d,%d> <%f>\n", p->x, p->y, p->zoom); + + /* If there's an active animator, stop it */ + if (po->zoom_momentum) + { + elm_transit_del(po->zoom_momentum); + po->zoom_momentum = NULL; + } + + return EVAS_EVENT_FLAG_NONE; +} + +static Evas_Event_Flags +zoom_move(void *_po, void *event_info) +{ + Photo_Object *po = (Photo_Object *) _po; + Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info; + printf("zoom move <%d,%d> <%f> momentum=<%f>\n", p->x, p->y, p->zoom, p->momentum); + po->zoom = po->base_zoom * p->zoom; + apply_changes(po); + return EVAS_EVENT_FLAG_NONE; +} + +static Evas_Event_Flags +zoom_end(void *_po, void *event_info) +{ + Photo_Object *po = (Photo_Object *) _po; + Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info; + printf("zoom end/abort <%d,%d> <%f> momentum=<%f>\n", p->x, p->y, + p->zoom, p->momentum); + + /* Apply the zoom-momentum or zoom out animator */ + double tot_time = fabs(p->momentum) / ZOOM_MOMENTUM_FRICTION; + po->zoom_mom_time = tot_time; + po->zoom_mom = p->momentum; + po->base_zoom = po->zoom; + if (po->zoom_mom) + { + po->zoom_momentum = elm_transit_add(); + elm_transit_duration_set(po->zoom_momentum, + tot_time); + elm_transit_effect_add(po->zoom_momentum, + zoom_momentum_animation_operation, po, + zoom_momentum_animation_end); + elm_transit_go(po->zoom_momentum); + } + + return EVAS_EVENT_FLAG_NONE; +} + +static Evas_Event_Flags +momentum_start(void *_po, void *event_info) +{ + Photo_Object *po = (Photo_Object *) _po; + Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info; + printf("momentum_start po->rotate=<%d> <%d,%d>\n", po->rotate, p->x2, p->y2); + + /* If there's an active animator, stop it */ + if (po->mom_timer) + { + ecore_animator_del(po->mom_timer); + po->mom_timer = NULL; + } + + po->dx = p->x2 - po->bx; + po->dy = p->y2 - po->by; + apply_changes(po); + + return EVAS_EVENT_FLAG_NONE; +} + +static Evas_Event_Flags +momentum_move(void *_po, void *event_info) +{ + Photo_Object *po = (Photo_Object *) _po; + Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info; + printf("momentum move <%d,%d> fingers=<%d> mx,my=<%d,%d>\n", p->x2, p->y2, p->n, p->mx, p->my); + + po->bx = p->x2 - po->dx; + po->by = p->y2 - po->dy; + apply_changes(po); + + return EVAS_EVENT_FLAG_NONE; +} + +/* Momentum animation */ +static Eina_Bool +momentum_animation_operation(void *_po) +{ + Photo_Object *po = (Photo_Object *) _po; + Eina_Bool rc = ECORE_CALLBACK_RENEW; + Evas_Coord x = po->bx; + Evas_Coord y = po->by; + po->mom_tot_time -= ecore_animator_frametime_get(); + if (po->mom_tot_time <= 0) + { + po->mom_timer = NULL; + rc = ECORE_CALLBACK_CANCEL; + } + + /* x = v0t + 0.5at^2 */ + po->bx += ((po->mx * po->mom_tot_time) + + (0.5 * po->mom_x_acc * (po->mom_tot_time * po->mom_tot_time))); + + po->by += ((po->my * po->mom_tot_time) + + (0.5 * po->mom_y_acc * (po->mom_tot_time * po->mom_tot_time))); + + printf("%s prev_bx-new_bx,y=(%d,%d)\n", __func__, x-po->bx, y-po->by); + if (rc == ECORE_CALLBACK_CANCEL) + pic_obj_keep_inframe(po); + + apply_changes(po); + return rc; +} + +static Evas_Event_Flags +momentum_end(void *_po, void *event_info) +{ + Photo_Object *po = (Photo_Object *) _po; + Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info; + printf("momentum end x2,y2=<%d,%d> mx,my=<%d,%d>\n", p->x2, p->y2, p->mx, p->my); + pic_obj_keep_inframe(po); + apply_changes(po); + /* Make up some total-time for the movement */ + po->mom_tot_time = sqrt((p->mx * p->mx) + (p->my * p->my)) + / MOMENTUM_FRICTION; + + if (po->mom_tot_time) + { /* Compute acceleration for both compenents, and launch timer */ + po->mom_x_acc = (p->mx) / po->mom_tot_time; /* a = (v-v0) / t */ + po->mom_y_acc = (p->my) / po->mom_tot_time; /* a = (v-v0) / t */ + po->mom_x_acc /= MOMENTUM_FACTOR; + po->mom_y_acc /= MOMENTUM_FACTOR; + po->mom_timer = ecore_animator_add(momentum_animation_operation, po); + } + + return EVAS_EVENT_FLAG_NONE; +} + +static Evas_Event_Flags +momentum_abort(void *_po, void *event_info) +{ + Photo_Object *po = (Photo_Object *) _po; + Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info; + printf("momentum abort <%d,%d> <%d,%d>\n", p->x2, p->y2, p->mx, p->my); + pic_obj_keep_inframe(po); + apply_changes(po); + + return EVAS_EVENT_FLAG_NONE; +} + +static void +_win_del_req(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Photo_Object **photo_array = (Photo_Object **) data; + + if (!photo_array) + return; + + /* The content of the photo object is automatically deleted when the win + * is deleted. */ + for ( ; *photo_array ; photo_array++) + free(*photo_array); + + free(data); +} + +static Photo_Object * +photo_object_add(Evas_Object *parent, Evas_Object *ic, const char *icon, + Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h, int angle) +{ + char buf[PATH_MAX]; + Photo_Object *po; + po = calloc(1, sizeof(*po)); + po->base_zoom = po->zoom = BASE_ZOOM; + + if (ic) + { + po->ic = ic; + } + else + { + po->ic = elm_icon_add(parent); + elm_image_file_set(po->ic, icon, NULL); + } + + po->bx = x; + po->by = y; + po->bw = w; + po->bh = h; + + /* Add shadow */ + { + po->shadow = elm_icon_add(po->ic); + snprintf(buf, sizeof(buf), "%s/images/pol_shadow.png", elm_app_data_dir_get()); + elm_image_file_set(po->shadow, buf, NULL); + evas_object_resize(po->shadow, SHADOW_W, SHADOW_H); + evas_object_show(po->shadow); + } + + po->hit = evas_object_polygon_add(evas_object_evas_get(parent)); + evas_object_precise_is_inside_set(po->hit, EINA_TRUE); + evas_object_repeat_events_set(po->hit, EINA_TRUE); + evas_object_color_set(po->hit, 0, 0, 0, 0); + + evas_object_move(po->ic, 0, 0); + evas_object_resize(po->ic, po->bw, po->bh); + evas_object_show(po->ic); + + evas_object_show(po->hit); + + po->gl = elm_gesture_layer_add(po->ic); + elm_gesture_layer_hold_events_set(po->gl, EINA_TRUE); + elm_gesture_layer_attach(po->gl, po->hit); + + /* FIXME: Add a po->rotate start so we take the first angle!!!! */ + elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM, + ELM_GESTURE_STATE_START, momentum_start, po); + elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM, + ELM_GESTURE_STATE_MOVE, momentum_move, po); + elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM, + ELM_GESTURE_STATE_END, momentum_end, po); + elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM, + ELM_GESTURE_STATE_ABORT, momentum_abort, po); + + elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM, + ELM_GESTURE_STATE_START, zoom_start, po); + elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM, + ELM_GESTURE_STATE_MOVE, zoom_move, po); + elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM, + ELM_GESTURE_STATE_END, zoom_end, po); + elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM, + ELM_GESTURE_STATE_ABORT, zoom_end, po); + + elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ROTATE, + ELM_GESTURE_STATE_START, rotate_start, po); + elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ROTATE, + ELM_GESTURE_STATE_MOVE, rotate_move, po); + elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ROTATE, + ELM_GESTURE_STATE_END, rotate_end, po); + elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ROTATE, + ELM_GESTURE_STATE_ABORT, rotate_abort, po); + + po->rotate = po->base_rotate = angle; + po->shadow_zoom = 1.3; + + apply_changes(po); + return po; +} + +void +test_gesture_layer3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Coord w, h; + Evas_Object *win, *bg; + char buf[PATH_MAX]; + int ind = 0; + Photo_Object **photo_array; + photo_array = calloc(4, sizeof(*photo_array)); + + w = 480; + h = 800; + + win = elm_win_add(NULL, "gesture-layer3", ELM_WIN_BASIC); + elm_win_title_set(win, "Gesture Layer 3"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_resize(win, w, h); + + bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/wood_01.jpg", elm_app_data_dir_get()); + elm_bg_file_set(bg, buf, NULL); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + snprintf(buf, sizeof(buf), "%s/images/pol_sky.png", elm_app_data_dir_get()); + photo_array[ind++] = photo_object_add(win, NULL, buf, 50, 200, 365, 400, 0); + + photo_array[ind] = NULL; + evas_object_smart_callback_add(win, "delete,request", _win_del_req, + photo_array); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_glview.c b/src/bin/elementary/test_glview.c new file mode 100644 index 0000000000..31c76cffe3 --- /dev/null +++ b/src/bin/elementary/test_glview.c @@ -0,0 +1,717 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +#include <Elementary.h> +#ifndef M_PI +#define M_PI 3.14159265 +#endif + +typedef struct _Gear Gear; +typedef struct _GLData GLData; +struct _Gear +{ + GLfloat *vertices; + GLuint vbo; + int count; +}; + +// GL related data here.. +struct _GLData +{ + Evas_GL_API *glapi; + GLuint program; + GLuint vtx_shader; + GLuint fgmt_shader; + int initialized : 1; + int mouse_down : 1; + + // Gear Stuff + GLfloat view_rotx; + GLfloat view_roty; + GLfloat view_rotz; + + Gear *gear1; + Gear *gear2; + Gear *gear3; + + GLfloat angle; + + GLuint proj_location; + GLuint light_location; + GLuint color_location; + + GLfloat proj[16]; + GLfloat light[3]; +}; + +static void gears_init(GLData *gld); +static void free_gear(Gear *gear); +static void gears_reshape(GLData *gld, int width, int height); +static void render_gears(GLData *gld); + +//--------------------------------// +// Gear Stuff.... +static GLfloat * +vert(GLfloat *p, GLfloat x, GLfloat y, GLfloat z, GLfloat *n) +{ + p[0] = x; + p[1] = y; + p[2] = z; + p[3] = n[0]; + p[4] = n[1]; + p[5] = n[2]; + + return p + 6; +} + +/* Draw a gear wheel. You'll probably want to call this function when + * building a display list since we do a lot of trig here. + * + * Input: inner_radius - radius of hole at center + * outer_radius - radius at center of teeth + * width - width of gear + * teeth - number of teeth + * tooth_depth - depth of tooth + */ +static Gear * +make_gear(GLData *gld, GLfloat inner_radius, GLfloat outer_radius, GLfloat width, + GLint teeth, GLfloat tooth_depth) +{ + GLint i; + GLfloat r0, r1, r2; + GLfloat da; + GLfloat *v; + Gear *gear; + double s[5], c[5]; + GLfloat normal[3]; + const int tris_per_tooth = 20; + Evas_GL_API *gl = gld->glapi; + + gear = (Gear*)malloc(sizeof(Gear)); + if (gear == NULL) + return NULL; + + r0 = inner_radius; + r1 = outer_radius - tooth_depth / 2.0; + r2 = outer_radius + tooth_depth / 2.0; + + da = 2.0 * M_PI / teeth / 4.0; + + gear->vertices = calloc(teeth * tris_per_tooth * 3 * 6, + sizeof *gear->vertices); + s[4] = 0; + c[4] = 1; + v = gear->vertices; + for (i = 0; i < teeth; i++) + { + s[0] = s[4]; + c[0] = c[4]; + s[1] = sin(i * 2.0 * M_PI / teeth + da); + c[1] = cos(i * 2.0 * M_PI / teeth + da); + s[2] = sin(i * 2.0 * M_PI / teeth + da * 2); + c[2] = cos(i * 2.0 * M_PI / teeth + da * 2); + s[3] = sin(i * 2.0 * M_PI / teeth + da * 3); + c[3] = cos(i * 2.0 * M_PI / teeth + da * 3); + s[4] = sin(i * 2.0 * M_PI / teeth + da * 4); + c[4] = cos(i * 2.0 * M_PI / teeth + da * 4); + + normal[0] = 0.0; + normal[1] = 0.0; + normal[2] = 1.0; + + v = vert(v, r2 * c[1], r2 * s[1], width * 0.5, normal); + + v = vert(v, r2 * c[1], r2 * s[1], width * 0.5, normal); + v = vert(v, r2 * c[2], r2 * s[2], width * 0.5, normal); + v = vert(v, r1 * c[0], r1 * s[0], width * 0.5, normal); + v = vert(v, r1 * c[3], r1 * s[3], width * 0.5, normal); + v = vert(v, r0 * c[0], r0 * s[0], width * 0.5, normal); + v = vert(v, r1 * c[4], r1 * s[4], width * 0.5, normal); + v = vert(v, r0 * c[4], r0 * s[4], width * 0.5, normal); + + v = vert(v, r0 * c[4], r0 * s[4], width * 0.5, normal); + v = vert(v, r0 * c[0], r0 * s[0], width * 0.5, normal); + v = vert(v, r0 * c[4], r0 * s[4], -width * 0.5, normal); + v = vert(v, r0 * c[0], r0 * s[0], -width * 0.5, normal); + + normal[0] = 0.0; + normal[1] = 0.0; + normal[2] = -1.0; + + v = vert(v, r0 * c[4], r0 * s[4], -width * 0.5, normal); + + v = vert(v, r0 * c[4], r0 * s[4], -width * 0.5, normal); + v = vert(v, r1 * c[4], r1 * s[4], -width * 0.5, normal); + v = vert(v, r0 * c[0], r0 * s[0], -width * 0.5, normal); + v = vert(v, r1 * c[3], r1 * s[3], -width * 0.5, normal); + v = vert(v, r1 * c[0], r1 * s[0], -width * 0.5, normal); + v = vert(v, r2 * c[2], r2 * s[2], -width * 0.5, normal); + v = vert(v, r2 * c[1], r2 * s[1], -width * 0.5, normal); + + v = vert(v, r1 * c[0], r1 * s[0], width * 0.5, normal); + + v = vert(v, r1 * c[0], r1 * s[0], width * 0.5, normal); + v = vert(v, r1 * c[0], r1 * s[0], -width * 0.5, normal); + v = vert(v, r2 * c[1], r2 * s[1], width * 0.5, normal); + v = vert(v, r2 * c[1], r2 * s[1], -width * 0.5, normal); + v = vert(v, r2 * c[2], r2 * s[2], width * 0.5, normal); + v = vert(v, r2 * c[2], r2 * s[2], -width * 0.5, normal); + v = vert(v, r1 * c[3], r1 * s[3], width * 0.5, normal); + v = vert(v, r1 * c[3], r1 * s[3], -width * 0.5, normal); + v = vert(v, r1 * c[4], r1 * s[4], width * 0.5, normal); + v = vert(v, r1 * c[4], r1 * s[4], -width * 0.5, normal); + + v = vert(v, r1 * c[4], r1 * s[4], -width * 0.5, normal); + } + + gear->count = (v - gear->vertices) / 6; + + gl->glGenBuffers(1, &gear->vbo); + gl->glBindBuffer(GL_ARRAY_BUFFER, gear->vbo); + gl->glBufferData(GL_ARRAY_BUFFER, gear->count * 6 * 4, + gear->vertices, GL_STATIC_DRAW); + + return gear; +} + +static void +free_gear(Gear *gear) +{ + free(gear->vertices); + free(gear); + gear = NULL; +} + +static void +multiply(GLfloat *m, const GLfloat *n) +{ + GLfloat tmp[16]; + const GLfloat *row, *column; + div_t d; + int i, j; + + for (i = 0; i < 16; i++) + { + tmp[i] = 0; + d = div(i, 4); + row = n + d.quot * 4; + column = m + d.rem; + for (j = 0; j < 4; j++) + tmp[i] += row[j] * column[j * 4]; + } + memcpy(m, &tmp, sizeof tmp); +} + +static void +rotate(GLfloat *m, GLfloat angle, GLfloat x, GLfloat y, GLfloat z) +{ + double s, c; + + s = sin(angle); + c = cos(angle); + GLfloat r[16] = + { + x * x * (1 - c) + c, y * x * (1 - c) + z * s, x * z * (1 - c) - y * s, 0, + x * y * (1 - c) - z * s, y * y * (1 - c) + c, y * z * (1 - c) + x * s, 0, + x * z * (1 - c) + y * s, y * z * (1 - c) - x * s, z * z * (1 - c) + c, 0, + 0, 0, 0, 1 + }; + + multiply(m, r); +} + +static void +translate(GLfloat *m, GLfloat x, GLfloat y, GLfloat z) +{ + GLfloat t[16] = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1 }; + + multiply(m, t); +} + +static void +draw_gear(GLData *gld, Gear *gear, GLfloat *m, + GLfloat x, GLfloat y, GLfloat angle, const GLfloat *color) +{ + Evas_GL_API *gl = gld->glapi; + GLfloat tmp[16]; + + memcpy(tmp, m, sizeof tmp); + translate(tmp, x, y, 0); + rotate(tmp, 2 * M_PI * angle / 360.0, 0, 0, 1); + gl->glUniformMatrix4fv(gld->proj_location, 1, GL_FALSE, tmp); + gl->glUniform3fv(gld->light_location, 1, gld->light); + gl->glUniform4fv(gld->color_location, 1, color); + + gl->glBindBuffer(GL_ARRAY_BUFFER, gear->vbo); + + gl->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, + 6 * sizeof(GLfloat), NULL); + gl->glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, + 6 * sizeof(GLfloat), (GLfloat *) 0 + 3); + gl->glEnableVertexAttribArray(0); + gl->glEnableVertexAttribArray(1); + gl->glDrawArrays(GL_TRIANGLE_STRIP, 0, gear->count); +} + +static void +gears_draw(GLData *gld) +{ + Evas_GL_API *gl = gld->glapi; + + static const GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 }; + static const GLfloat green[4] = { 0.0, 0.8, 0.2, 1.0 }; + static const GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 }; + GLfloat m[16]; + + gl->glClearColor(0x25 / 255., 0x13 / 255., 0.0, 1.0); + gl->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + memcpy(m, gld->proj, sizeof m); + rotate(m, 2 * M_PI * gld->view_rotx / 360.0, 1, 0, 0); + rotate(m, 2 * M_PI * gld->view_roty / 360.0, 0, 1, 0); + rotate(m, 2 * M_PI * gld->view_rotz / 360.0, 0, 0, 1); + + draw_gear(gld, gld->gear1, m, -3.0, -2.0, gld->angle, red); + draw_gear(gld, gld->gear2, m, 3.1, -2.0, -2 * gld->angle - 9.0, green); + draw_gear(gld, gld->gear3, m, -3.1, 4.2, -2 * gld->angle - 25.0, blue); +} + +static void render_gears(GLData *gld) +{ + gears_draw(gld); + + gld->angle += 2.0; +} + +/* new window size or exposure */ +static void +gears_reshape(GLData *gld, int width, int height) +{ + Evas_GL_API *gl = gld->glapi; + + GLfloat ar, m[16] = { + 1.0, 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 0.1, 0.0, + 0.0, 0.0, 0.0, 1.0 + }; + + if (width < height) + ar = width; + else + ar = height; + + m[0] = 0.1 * ar / width; + m[5] = 0.1 * ar / height; + memcpy(gld->proj, m, sizeof gld->proj); + gl->glViewport(0, 0, (GLint) width, (GLint) height); +} + +static const char vertex_shader[] = + "uniform mat4 proj;\n" + "attribute vec4 position;\n" + "attribute vec4 normal;\n" + "varying vec3 rotated_normal;\n" + "varying vec3 rotated_position;\n" + "vec4 tmp;\n" + "void main()\n" + "{\n" + " gl_Position = proj * position;\n" + " rotated_position = gl_Position.xyz;\n" + " tmp = proj * normal;\n" + " rotated_normal = tmp.xyz;\n" + "}\n"; + + static const char fragment_shader[] = + "#ifdef GL_ES\n" + "precision mediump float;\n" + "#endif\n" + "uniform vec4 color;\n" + "uniform vec3 light;\n" + "varying vec3 rotated_normal;\n" + "varying vec3 rotated_position;\n" + "vec3 light_direction;\n" + "vec4 white = vec4(0.5, 0.5, 0.5, 1.0);\n" + "void main()\n" + "{\n" + " light_direction = normalize(light - rotated_position);\n" + " gl_FragColor = color + white * dot(light_direction, rotated_normal);\n" + "}\n"; + +static void +_print_gl_log(Evas_GL_API *gl, GLuint id) +{ + GLint log_len = 0; + char *log_info; + + if (gl->glIsShader(id)) + gl->glGetShaderiv(id, GL_INFO_LOG_LENGTH, &log_len); + else if (gl->glIsProgram(id)) + gl->glGetProgramiv(id, GL_INFO_LOG_LENGTH, &log_len); + + log_info = malloc(log_len * sizeof(char)); + + if (gl->glIsShader(id)) + gl->glGetShaderInfoLog(id, log_len, NULL, log_info); + else if (gl->glIsProgram(id)) + gl->glGetProgramInfoLog(id, log_len, NULL, log_info); + + printf("%s", log_info); + free(log_info); +} + +static void +gears_init(GLData *gld) +{ + Evas_GL_API *gl = gld->glapi; + + const char *p; + + gl->glEnable(GL_CULL_FACE); + gl->glEnable(GL_DEPTH_TEST); + + p = vertex_shader; + gld->vtx_shader = gl->glCreateShader(GL_VERTEX_SHADER); + gl->glShaderSource(gld->vtx_shader, 1, &p, NULL); + gl->glCompileShader(gld->vtx_shader); + _print_gl_log(gl, gld->vtx_shader); + + p = fragment_shader; + gld->fgmt_shader = gl->glCreateShader(GL_FRAGMENT_SHADER); + gl->glShaderSource(gld->fgmt_shader, 1, &p, NULL); + gl->glCompileShader(gld->fgmt_shader); + _print_gl_log(gl, gld->fgmt_shader); + + gld->program = gl->glCreateProgram(); + gl->glAttachShader(gld->program, gld->vtx_shader); + gl->glAttachShader(gld->program, gld->fgmt_shader); + gl->glBindAttribLocation(gld->program, 0, "position"); + gl->glBindAttribLocation(gld->program, 1, "normal"); + + gl->glLinkProgram(gld->program); + _print_gl_log(gl, gld->program); + + gl->glUseProgram(gld->program); + gld->proj_location = gl->glGetUniformLocation(gld->program, "proj"); + gld->light_location = gl->glGetUniformLocation(gld->program, "light"); + gld->color_location = gl->glGetUniformLocation(gld->program, "color"); + + /* make the gears */ + gld->gear1 = make_gear(gld, 1.0, 4.0, 1.0, 20, 0.7); + gld->gear2 = make_gear(gld, 0.5, 2.0, 2.0, 10, 0.7); + gld->gear3 = make_gear(gld, 1.3, 2.0, 0.5, 10, 0.7); +} + +static void +gldata_init(GLData *gld) +{ + gld->initialized = 0; + gld->mouse_down = 0; + + gld->view_rotx = -20.0; + gld->view_roty = -30.0; + gld->view_rotz = 0.0; + gld->angle = 0.0; + + gld->light[0] = 1.0; + gld->light[1] = 1.0; + gld->light[2] = -5.0; +} + +//-------------------------// + +static void +_init_gl(Evas_Object *obj) +{ + GLData *gld = evas_object_data_get(obj, "gld"); + + gears_init(gld); +} + +static void +_del_gl(Evas_Object *obj) +{ + GLData *gld = evas_object_data_get(obj, "gld"); + if (!gld) + { + printf("Unable to get GLData. \n"); + return; + } + Evas_GL_API *gl = gld->glapi; + + gl->glDeleteShader(gld->vtx_shader); + gl->glDeleteShader(gld->fgmt_shader); + gl->glDeleteProgram(gld->program); + gl->glDeleteBuffers(1, &gld->gear1->vbo); + gl->glDeleteBuffers(1, &gld->gear2->vbo); + gl->glDeleteBuffers(1, &gld->gear3->vbo); + + free_gear(gld->gear1); + free_gear(gld->gear2); + free_gear(gld->gear3); + + evas_object_data_del((Evas_Object*)obj, "..gld"); + free(gld); +} + +static void +_resize_gl(Evas_Object *obj) +{ + int w, h; + GLData *gld = evas_object_data_get(obj, "gld"); + + elm_glview_size_get(obj, &w, &h); + + // GL Viewport stuff. you can avoid doing this if viewport is all the + // same as last frame if you want + gears_reshape(gld, w,h); +} + +static void +_draw_gl(Evas_Object *obj) +{ + Evas_GL_API *gl = elm_glview_gl_api_get(obj); + GLData *gld = evas_object_data_get(obj, "gld"); + if (!gld) return; + + render_gears(gld); + gl->glFinish(); +} + +static Eina_Bool +_anim(void *data) +{ + elm_glview_changed_set(data); + return EINA_TRUE; +} + +static Eina_Bool +_quit_idler(void *data) +{ + evas_object_del(data); + + return ECORE_CALLBACK_CANCEL; +} + +static void +_on_done(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + ecore_idler_add(_quit_idler, data); +} + +static void +_on_direct(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + if (!data) return; + + // ON_DEMAND is necessary for Direct Rendering + elm_glview_render_policy_set(data, ELM_GLVIEW_RENDER_POLICY_ON_DEMAND); + elm_glview_mode_set(data, 0 + | ELM_GLVIEW_ALPHA + | ELM_GLVIEW_DEPTH + | ELM_GLVIEW_DIRECT + ); +} + +static void +_on_indirect(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + if (!data) return; + + // note that with policy ALWAYS the window will flicker on resize + elm_glview_render_policy_set(data, ELM_GLVIEW_RENDER_POLICY_ALWAYS); + elm_glview_mode_set(data, 0 + | ELM_GLVIEW_ALPHA + | ELM_GLVIEW_DEPTH + ); +} + +static void +_del(void *data EINA_UNUSED, Evas *evas EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Ecore_Animator *ani = evas_object_data_get(obj, "ani"); + ecore_animator_del(ani); +} + +static void +_key_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info) +{ + Evas_Event_Key_Down *ev; + ev = (Evas_Event_Key_Down *)event_info; + GLData *gld = evas_object_data_get(obj, "gld"); + + if (strcmp(ev->key, "Left") == 0) + { + gld->view_roty += 5.0; + return; + } + + if (strcmp(ev->key, "Right") == 0) + { + gld->view_roty -= 5.0; + return; + } + + if (strcmp(ev->key, "Up") == 0) + { + gld->view_rotx += 5.0; + return; + } + + if (strcmp(ev->key, "Down") == 0) + { + gld->view_rotx -= 5.0; + return; + } + if ((strcmp(ev->key, "Escape") == 0) || + (strcmp(ev->key, "Return") == 0)) + { + //_on_done(data, obj, event_info); + return; + } +} + +static void +_mouse_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + GLData *gld = evas_object_data_get(obj, "gld"); + gld->mouse_down = 1; +} + +static void +_mouse_move(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Event_Mouse_Move *ev; + ev = (Evas_Event_Mouse_Move *)event_info; + GLData *gld = evas_object_data_get(obj, "gld"); + float dx = 0, dy = 0; + + if (gld->mouse_down) + { + dx = ev->cur.canvas.x - ev->prev.canvas.x; + dy = ev->cur.canvas.y - ev->prev.canvas.y; + + gld->view_roty += -1.0 * dx; + gld->view_rotx += -1.0 * dy; + } +} + +static void +_mouse_up(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + GLData *gld = evas_object_data_get(obj, "gld"); + gld->mouse_down = 0; +} + +void +test_glview(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bt, *gl, *lb; + Ecore_Animator *ani; + GLData *gld = NULL; + const char *accel; + + // alloc a data struct to hold our relevant gl info in + if (!(gld = calloc(1, sizeof(GLData)))) return; + gldata_init(gld); + + // add a Z-depth buffer to the window and try to use GL + accel = eina_stringshare_add(elm_config_accel_preference_get()); + elm_config_accel_preference_set("gl:depth"); + + // new window - do the usual and give it a name, title and delete handler + win = elm_win_util_standard_add("glview", "GLView"); + elm_win_autodel_set(win, EINA_TRUE); + + // restore previous accel preference + elm_config_accel_preference_set(accel); + eina_stringshare_del(accel); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + // Add a GLView + gl = elm_glview_add(win); + if (gl) + { + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_glview_mode_set(gl, 0 + | ELM_GLVIEW_ALPHA + | ELM_GLVIEW_DEPTH + ); + elm_glview_resize_policy_set(gl, ELM_GLVIEW_RESIZE_POLICY_RECREATE); + elm_glview_render_policy_set(gl, ELM_GLVIEW_RENDER_POLICY_ALWAYS); + elm_glview_init_func_set(gl, _init_gl); + elm_glview_del_func_set(gl, _del_gl); + elm_glview_resize_func_set(gl, _resize_gl); + elm_glview_render_func_set(gl, _draw_gl); + elm_box_pack_end(bx, gl); + evas_object_show(gl); + + // Add Mouse/Key Event Callbacks + elm_object_focus_set(gl, EINA_TRUE); + evas_object_event_callback_add(gl, EVAS_CALLBACK_KEY_DOWN, _key_down, gl); + evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down, gl); + evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_UP, _mouse_up, gl); + evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move, gl); + + // Animator and other vars + ani = ecore_animator_add(_anim, gl); + gld->glapi = elm_glview_gl_api_get(gl); + evas_object_data_set(gl, "ani", ani); + evas_object_data_set(gl, "gld", gld); + evas_object_event_callback_add(gl, EVAS_CALLBACK_DEL, _del, gl); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Direct Mode"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_smart_callback_add(bt, "clicked", _on_direct, gl); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Indirect Mode"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_smart_callback_add(bt, "clicked", _on_indirect, gl); + } + else + { + lb = elm_label_add(bx); + elm_object_text_set(lb, "<align=left> GL backend engine is not supported.<br/>" + " 1. Check your back-end engine or<br/>" + " 2. Run elementary_test with engine option or<br/>" + " ex) $ <b>ELM_ENGINE=gl</b> elementary_test<br/>" + " 3. Change your back-end engine from elementary_config.<br/></align>"); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + free(gld); + } + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_smart_callback_add(bt, "clicked", _on_done, win); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_glview_manygears.c b/src/bin/elementary/test_glview_manygears.c new file mode 100644 index 0000000000..34627a510f --- /dev/null +++ b/src/bin/elementary/test_glview_manygears.c @@ -0,0 +1,951 @@ +/* + * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * Ported to GLES2. + * Kristian Høgsberg <krh@bitplanet.net> + * May 3, 2010 + * + * Improve GLES2 port: + * * Refactor gear drawing. + * * Use correct normals for surfaces. + * * Improve shader. + * * Use perspective projection transformation. + * * Add FPS count. + * * Add comments. + * Alexandros Frantzis <alexandros.frantzis@linaro.org> + * Jul 13, 2010 + * + * Ported to Elm_GLView and added features for testing purposes: + * * Has 5 gears + * * Number of teeth can be increased to test under many vertices + * * Up/Down button increases the teeth number + * Sung W. Park <sungwoo@gmail.com> + * (Some positioning and numbers taken from KHCho's example) + * Oct 27, 2011 + * + */ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +#ifndef M_PI +#define M_PI 3.14159265 +#endif + +#define STRIPS_PER_TOOTH 7 +#define VERTICES_PER_TOOTH 34 +#define GEAR_VERTEX_STRIDE 6 + +/* A set of macros for making the creation of the gears easier */ +#define GEAR_POINT(r, da) { (r) * c[(da)], (r) * s[(da)] } +#define SET_NORMAL(x, y, z) do { \ + normal[0] = (x); normal[1] = (y); normal[2] = (z); \ +} while(0); + +#define GEAR_VERT(v, point, sign) vert((v), p[(point)].x, p[(point)].y, \ + (sign) * width * 0.5, normal); + +#define START_STRIP do { \ + gear->strips[cur_strip].first = v - gear->vertices; \ +} while(0); + +#define END_STRIP do { \ + int _tmp = (v - gear->vertices); \ + gear->strips[cur_strip].count = _tmp - gear->strips[cur_strip].first; \ + cur_strip++; \ +} while (0); + +#define QUAD_WITH_NORMAL(p1, p2) do { \ + SET_NORMAL((p[(p1)].y - p[(p2)].y), -(p[(p1)].x - p[(p2)].x), 0); \ + v = GEAR_VERT(v, (p1), -1); \ + v = GEAR_VERT(v, (p1), 1); \ + v = GEAR_VERT(v, (p2), -1); \ + v = GEAR_VERT(v, (p2), 1); \ +} while(0); + +// Struct describing a point +typedef struct _Point +{ + GLfloat x; + GLfloat y; +} Point; + +// Struct describing the vertices in triangle strip +typedef struct _VertexStrip +{ + GLint first; + GLint count; +} VertexStrip; + +// Each vertex consist of GEAR_VERTEX_STRIDE GLfloat attributes +typedef GLfloat GearVertex[GEAR_VERTEX_STRIDE]; + +// Struct representing a gear. +typedef struct _Gear +{ + GearVertex *vertices; + int nvertices; + VertexStrip *strips; + int nstrips; + GLuint vbo; +} Gear; + +// GL related data here.. +typedef struct _GLData +{ + Evas_GL_API *glapi; + GLuint program; + GLuint vtx_shader; + GLuint fgmt_shader; + int initialized : 1; + int mouse_down : 1; + + // Gear Stuff + Gear *gear[6]; + GLfloat view_rot[3]; + GLfloat light_pos[4]; + GLfloat proj_mat[16]; + + GLfloat angle; + + GLuint mvp_loc; // ModelViewPorjection Matrix Loc + GLuint norm_mat_loc; + GLuint light_pos_loc; + GLuint material_loc; + + GLuint gear_teeth; + GLuint tot_vertices; + + int recreate_gears; +} GLData; + +static void gears_init(GLData *gld); +static void create_gears(GLData *gld); +static void render_gears(GLData *gld); +static void gears_reshape(GLData *gld, int width, int height); + +//--------------------------------// +// Fills a gear vertex. +static GearVertex * +vert(GearVertex *v, GLfloat x, GLfloat y, GLfloat z, GLfloat n[3]) +{ + v[0][0] = x; + v[0][1] = y; + v[0][2] = z; + v[0][3] = n[0]; + v[0][4] = n[1]; + v[0][5] = n[2]; + + return v + 1; +} + +// Create a gear wheel. +static Gear * +create_gear(GLData *gld, GLfloat inner_radius, GLfloat outer_radius, GLfloat width, + GLint teeth, GLfloat tooth_depth) +{ + GLfloat r0, r1, r2; + GLfloat da; + Gear *gear; + GearVertex *v; + double s[5], c[5]; + GLfloat normal[3]; + int cur_strip = 0; + int i; + Evas_GL_API *gl = gld->glapi; + + gear = (Gear*)malloc(sizeof(Gear)); + if (gear == NULL) + return NULL; + + r0 = inner_radius; + r1 = outer_radius - tooth_depth / 2.0; + r2 = outer_radius + tooth_depth / 2.0; + + da = 2.0 * M_PI / teeth / 4.0; + + // Allocate memory for the triangle strip information + gear->nstrips = STRIPS_PER_TOOTH * teeth; + gear->strips = calloc(gear->nstrips, sizeof (*gear->strips)); + + // Allocate memory for the vertices + gear->vertices = calloc(VERTICES_PER_TOOTH * teeth, + sizeof(*gear->vertices)); + + v = gear->vertices; + for (i = 0; i < teeth; i++) + { + // Calculate needed sin/cos for varius angles + s[0] = sin(i * 2.0 * M_PI / teeth); + c[0] = cos(i * 2.0 * M_PI / teeth); + s[1] = sin(i * 2.0 * M_PI / teeth + da); + c[1] = cos(i * 2.0 * M_PI / teeth + da); + s[2] = sin(i * 2.0 * M_PI / teeth + da * 2); + c[2] = cos(i * 2.0 * M_PI / teeth + da * 2); + s[3] = sin(i * 2.0 * M_PI / teeth + da * 3); + c[3] = cos(i * 2.0 * M_PI / teeth + da * 3); + s[4] = sin(i * 2.0 * M_PI / teeth + da * 4); + c[4] = cos(i * 2.0 * M_PI / teeth + da * 4); + + // Create the 7 points (only x,y coords) used to draw a tooth + Point p[7] = + { + GEAR_POINT(r2, 1), // 0 + GEAR_POINT(r2, 2), // 1 + GEAR_POINT(r1, 0), // 2 + GEAR_POINT(r1, 3), // 3 + GEAR_POINT(r0, 0), // 4 + GEAR_POINT(r1, 4), // 5 + GEAR_POINT(r0, 4), // 6 + }; + + // Front face + START_STRIP; + SET_NORMAL(0, 0, 1.0); + v = GEAR_VERT(v, 0, +1); + v = GEAR_VERT(v, 1, +1); + v = GEAR_VERT(v, 2, +1); + v = GEAR_VERT(v, 3, +1); + v = GEAR_VERT(v, 4, +1); + v = GEAR_VERT(v, 5, +1); + v = GEAR_VERT(v, 6, +1); + END_STRIP; + + // Inner face + START_STRIP; + QUAD_WITH_NORMAL(4, 6); + END_STRIP; + + // Back face + START_STRIP; + SET_NORMAL(0, 0, -1.0); + v = GEAR_VERT(v, 6, -1); + v = GEAR_VERT(v, 5, -1); + v = GEAR_VERT(v, 4, -1); + v = GEAR_VERT(v, 3, -1); + v = GEAR_VERT(v, 2, -1); + v = GEAR_VERT(v, 1, -1); + v = GEAR_VERT(v, 0, -1); + END_STRIP; + + // Outer face + START_STRIP; + QUAD_WITH_NORMAL(0, 2); + END_STRIP; + + START_STRIP; + QUAD_WITH_NORMAL(1, 0); + END_STRIP; + + START_STRIP; + QUAD_WITH_NORMAL(3, 1); + END_STRIP; + + START_STRIP; + QUAD_WITH_NORMAL(5, 3); + END_STRIP; + } + + gear->nvertices = (v - gear->vertices); + + // Store the vertices in a vertex buffer object (VBO) + gl->glGenBuffers(1, &gear->vbo); + gl->glBindBuffer(GL_ARRAY_BUFFER, gear->vbo); + gl->glBufferData(GL_ARRAY_BUFFER, gear->nvertices * sizeof(GearVertex), + gear->vertices, GL_STATIC_DRAW); + + return gear; +} + +static void +free_gear(GLData *gld, Gear *gear) +{ + Evas_GL_API *gl = gld->glapi; + + gl->glDeleteBuffers(1, &gear->vbo); + free(gear->strips); + free(gear->vertices); + free(gear); +} + + +static void +multiply(GLfloat *m, const GLfloat *n) +{ + GLfloat tmp[16]; + const GLfloat *row, *column; + div_t d; + int i, j; + + for (i = 0; i < 16; i++) + { + tmp[i] = 0; + d = div(i, 4); + row = n + d.quot * 4; + column = m + d.rem; + for (j = 0; j < 4; j++) + tmp[i] += row[j] * column[j * 4]; + } + memcpy(m, &tmp, sizeof tmp); +} + +static void +rotate(GLfloat *m, GLfloat angle, GLfloat x, GLfloat y, GLfloat z) +{ + double s, c; + + s = sin(angle); + c = cos(angle); + GLfloat r[16] = + { + x * x * (1 - c) + c, y * x * (1 - c) + z * s, x * z * (1 - c) - y * s, 0, + x * y * (1 - c) - z * s, y * y * (1 - c) + c, y * z * (1 - c) + x * s, 0, + x * z * (1 - c) + y * s, y * z * (1 - c) - x * s, z * z * (1 - c) + c, 0, + 0, 0, 0, 1 + }; + + multiply(m, r); +} + +static void +translate(GLfloat *m, GLfloat x, GLfloat y, GLfloat z) +{ + GLfloat t[16] = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1 }; + + multiply(m, t); +} + +static void +identity(GLfloat *m) +{ + GLfloat t[16] = + { + 1.0, 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 1.0, 0.0, + 0.0, 0.0, 0.0, 1.0, + }; + + memcpy(m, t, sizeof(t)); +} + +// Transposes a 4x4 matrix. +static void +transpose(GLfloat *m) +{ + GLfloat t[16] = + { + m[0], m[4], m[8], m[12], + m[1], m[5], m[9], m[13], + m[2], m[6], m[10], m[14], + m[3], m[7], m[11], m[15] + }; + + memcpy(m, t, sizeof(t)); +} + +/* + Inverts a 4x4 matrix. + + This function can currently handle only pure translation-rotation matrices. + Read http://www.gamedev.net/community/forums/topic.asp?topic_id=425118 + for an explanation. + */ +static void +invert(GLfloat *m) +{ + GLfloat t[16]; + identity(t); + + // Extract and invert the translation part 't'. The inverse of a + // translation matrix can be calculated by negating the translation + // coordinates. + t[12] = -m[12]; t[13] = -m[13]; t[14] = -m[14]; + + // Invert the rotation part 'r'. The inverse of a rotation matrix is + // equal to its transpose. + m[12] = m[13] = m[14] = 0; + transpose(m); + + // inv(m) = inv(r) * inv(t) + multiply(m, t); +} + +// Calculate a perspective projection transformation. +static void +perspective(GLfloat *m, GLfloat fovy, GLfloat aspect, GLfloat zNear, GLfloat zFar) +{ + GLfloat tmp[16]; + identity(tmp); + + double sine, cosine, cotangent, deltaZ; + GLfloat radians = fovy / 2 * M_PI / 180; + + deltaZ = zFar - zNear; + sine = sin(radians); + cosine = cos(radians); + + if ((deltaZ == 0) || (sine == 0) || (aspect == 0)) + return; + + cotangent = cosine / sine; + + tmp[0] = cotangent / aspect; + tmp[5] = cotangent; + tmp[10] = -(zFar + zNear) / deltaZ; + tmp[11] = -1; + tmp[14] = -2 * zNear * zFar / deltaZ; + tmp[15] = 0; + + memcpy(m, tmp, sizeof(tmp)); +} + +// Draws a gear +static void +draw_gear(GLData *gld, Gear *gear, GLfloat *transform, + GLfloat tx, GLfloat ty, GLfloat tz, + GLfloat angle, int rotate_gear, const GLfloat color[4]) +{ + Evas_GL_API *gl = gld->glapi; + GLfloat model_view[16]; + GLfloat normal_matrix[16]; + GLfloat model_view_projection[16]; + int i; + + // Translate and rotate the gear + memcpy(model_view, transform, sizeof (model_view)); + translate(model_view, tx, ty, tz); + if (rotate_gear) + rotate(model_view, 2 * M_PI * 90.0 / 360.0, 0, 1, 0); + rotate(model_view, 2 * M_PI * angle / 360.0, 0, 0, 1); + + // Create and set the ModelViewProjectionMatrix + memcpy(model_view_projection, gld->proj_mat, sizeof(model_view_projection)); + multiply(model_view_projection, model_view); + + gl->glUniformMatrix4fv(gld->mvp_loc, 1, GL_FALSE, + model_view_projection); + + // Create/set normal matrix: inverse transpose of the mvp + memcpy(normal_matrix, model_view, sizeof (normal_matrix)); + invert(normal_matrix); + transpose(normal_matrix); + + gl->glUniformMatrix4fv(gld->norm_mat_loc, 1, GL_FALSE, normal_matrix); + + // Set the gear color + gl->glUniform4fv(gld->material_loc, 1, color); + + // Set the vertex buffer object to use + gl->glBindBuffer(GL_ARRAY_BUFFER, gear->vbo); + + // Set up the position of the attributes in the vertex buffer object + gl->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), NULL); + gl->glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLfloat *) 0 + 3); + + // Enable the attributes + gl->glEnableVertexAttribArray(0); + gl->glEnableVertexAttribArray(1); + + // Draw the triangle strips that comprise the gear + for (i = 0; i < gear->nstrips; i++) + { + gl->glDrawArrays(GL_TRIANGLE_STRIP, gear->strips[i].first, gear->strips[i].count); + } + + + // Disable the attributes + gl->glDisableVertexAttribArray(1); + gl->glDisableVertexAttribArray(0); +} + +static void +gears_draw(GLData *gld) +{ + Evas_GL_API *gl = gld->glapi; + + static const GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 }; + static const GLfloat green[4] = { 0.0, 0.8, 0.2, 1.0 }; + static const GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 }; + static const GLfloat yellow[4] = { 1.0, 1.0, 0.2, 1.0 }; + static const GLfloat purple[4] = { 0.2, 1.0, 1.0, 1.0 }; + static const GLfloat cyan[4] = { 1.0, 0.2, 1.0, 1.0 }; + GLfloat transform[16]; + identity(transform); + + gl->glClearColor(0.0, 0.0, 0.0, 0.0); + gl->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + // Translate and rotate the view + translate(transform, 0, -2.5, -20); + rotate(transform, 2 * M_PI * gld->view_rot[0] / 360.0, 1, 0, 0); + rotate(transform, 2 * M_PI * gld->view_rot[1] / 360.0, 0, 1, 0); + rotate(transform, 2 * M_PI * gld->view_rot[2] / 360.0, 0, 0, 1); + + draw_gear(gld, gld->gear[0], transform, -2.0, -4.0, 0.0, gld->angle , 0, red); + draw_gear(gld, gld->gear[1], transform, 4.1, -4.0, 0.0, -2 * gld->angle - 9.0 , 0, green); + draw_gear(gld, gld->gear[2], transform, -2.1, 2.2, 0.0, -2 * gld->angle - 25.0, 0, blue); + draw_gear(gld, gld->gear[3], transform, -2.1, 8.4, 0.0, gld->angle , 0, yellow); + draw_gear(gld, gld->gear[4], transform, 6.4, -4.0, -4.5, gld->angle , 1, purple); + draw_gear(gld, gld->gear[5], transform, 6.4, 4.4, -4.5, -1 * gld->angle - 23.0, 1, cyan); +} + +//-------------------------// + +static void render_gears(GLData *gld) +{ + if (gld->recreate_gears) + { + create_gears(gld); + gld->recreate_gears = 0; + } + + gears_draw(gld); + + gld->angle += 2.0; +} + +// new window size or exposure +static void +gears_reshape(GLData *gld, int width, int height) +{ + Evas_GL_API *gl = gld->glapi; + + // Update the projection matrix + perspective(gld->proj_mat, 60.0, width / (float)height, 1.0, 1024.0); + + // Set the viewport + gl->glViewport(0, 0, (GLint) width, (GLint) height); + +} + +static const char vertex_shader[] = + "attribute vec3 position;\n" + "attribute vec3 normal;\n" + "uniform mat4 mvp;\n" + "uniform mat4 norm_mat;\n" + "uniform vec4 light_pos;\n" + "uniform vec4 material;\n" + "varying vec4 color;\n" + "\n" + "void main(void)\n" + "{\n" + " // Transform the normal to eye coordinates\n" + " vec3 N = normalize(vec3(norm_mat * vec4(normal, 1.0)));\n" + "\n" + " // The LightSourcePosition is actually its direction for directional ight\n" + " vec3 L = normalize(light_pos.xyz);\n" + "\n" + " // Multiply the diffuse value by the vertex color (which is fixed in this ase)\n" + " // to get the actual color that we will use to draw this vertex with\n" + " float diffuse = clamp(dot(N, L), 0.0, 1.0);\n" + " color = material*0.2 + diffuse * material;\n" + " color.a = 1.0; \n" + "\n" + " // Transform the position to clip coordinates\n" + " gl_Position = mvp * vec4(position, 1.0);\n" + "}"; + +static const char fragment_shader[] = + "#ifdef GL_ES\n" + "precision mediump float;\n" + "#endif\n" + "varying vec4 color;\n" + "\n" + "void main(void)\n" + "{\n" + " gl_FragColor = color;\n" + "}"; + +static void +create_gears(GLData *gld) +{ + int i; + + for (i = 0; i < 6; i++) + if (gld->gear[i]) free_gear(gld, gld->gear[i]); + + // make the gears + gld->gear[0] = create_gear(gld, 1.0, 4.0, 1.0, gld->gear_teeth*2, 0.7); + gld->gear[1] = create_gear(gld, 0.5, 2.0, 2.0, gld->gear_teeth , 0.7); + gld->gear[2] = create_gear(gld, 1.3, 2.0, 0.5, gld->gear_teeth , 0.7); + gld->gear[3] = create_gear(gld, 2.0, 4.0, 2.0, gld->gear_teeth*2, 0.7); + gld->gear[4] = create_gear(gld, 1.5, 4.0, 0.5, gld->gear_teeth*2, 1.0); + gld->gear[5] = create_gear(gld, 2.5, 4.0, 2.5, gld->gear_teeth*2, 1.0); + + gld->tot_vertices = 0; + for (i = 0; i < 6; i++) + gld->tot_vertices += gld->gear[i]->nvertices; + + //printf("Teeth: %d, Total Number of vertices %d\n", gld->gear_teeth, gld->tot_vertices); +} + +static void +gears_init(GLData *gld) +{ + Evas_GL_API *gl = gld->glapi; + + const char *p; + char msg[512]; + + gl->glEnable(GL_CULL_FACE); + gl->glEnable(GL_DEPTH_TEST); + + p = vertex_shader; + gld->vtx_shader = gl->glCreateShader(GL_VERTEX_SHADER); + gl->glShaderSource(gld->vtx_shader, 1, &p, NULL); + gl->glCompileShader(gld->vtx_shader); + gl->glGetShaderInfoLog(gld->vtx_shader, sizeof msg, NULL, msg); + printf("vertex shader info: %s\n", msg); + + p = fragment_shader; + gld->fgmt_shader = gl->glCreateShader(GL_FRAGMENT_SHADER); + gl->glShaderSource(gld->fgmt_shader, 1, &p, NULL); + gl->glCompileShader(gld->fgmt_shader); + gl->glGetShaderInfoLog(gld->fgmt_shader, sizeof msg, NULL, msg); + printf("fragment shader info: %s\n", msg); + + gld->program = gl->glCreateProgram(); + gl->glAttachShader(gld->program, gld->vtx_shader); + gl->glAttachShader(gld->program, gld->fgmt_shader); + gl->glBindAttribLocation(gld->program, 0, "position"); + gl->glBindAttribLocation(gld->program, 1, "normal"); + + gl->glLinkProgram(gld->program); + gl->glGetProgramInfoLog(gld->program, sizeof msg, NULL, msg); + printf("info: %s\n", msg); + + gl->glUseProgram(gld->program); + gld->mvp_loc = gl->glGetUniformLocation(gld->program, "mvp"); + gld->norm_mat_loc = gl->glGetUniformLocation(gld->program, "norm_mat"); + gld->light_pos_loc = gl->glGetUniformLocation(gld->program, "light_pos"); + gld->material_loc = gl->glGetUniformLocation(gld->program, "material"); + gl->glUniform4fv(gld->light_pos_loc, 1, gld->light_pos); + + create_gears(gld); +} + +static void +gldata_init(GLData *gld) +{ + gld->initialized = 0; + gld->mouse_down = 0; + + gld->view_rot[0] = 20.0; + gld->view_rot[1] = 30.0; + gld->view_rot[2] = 0.0; + + gld->light_pos[0] = 5.0; + gld->light_pos[1] = 5.0; + gld->light_pos[2] = 10.0; + gld->light_pos[3] = 1.0; + + gld->angle = 0.0; + + gld->tot_vertices = 0; + gld->gear_teeth = 10; +} + +//-------------------------// + +static void +_init_gl(Evas_Object *obj) +{ + GLData *gld = evas_object_data_get(obj, "gld"); + if (!gld) return; + + gears_init(gld); +} + +static void +_del_gl(Evas_Object *obj) +{ + int i; + GLData *gld = evas_object_data_get(obj, "gld"); + if (!gld) + { + printf("Unable to get GLData. \n"); + return; + } + Evas_GL_API *gl = gld->glapi; + + gl->glDeleteShader(gld->vtx_shader); + gl->glDeleteShader(gld->fgmt_shader); + gl->glDeleteProgram(gld->program); + + for (i = 0; i < 6; i++) + if (gld->gear[i]) free_gear(gld, gld->gear[i]); + + evas_object_data_del((Evas_Object*)obj, "gld"); + free(gld); + + Ecore_Animator *ani = evas_object_data_get(obj, "ani"); + ecore_animator_del(ani); + +} + +static void +_resize_gl(Evas_Object *obj) +{ + int w, h; + GLData *gld = evas_object_data_get(obj, "gld"); + if (!gld) return; + + elm_glview_size_get(obj, &w, &h); + gears_reshape(gld, w, h); +} + + +static void +_draw_gl(Evas_Object *obj) +{ + GLData *gld = evas_object_data_get(obj, "gld"); + if (!gld) return; + Evas_GL_API *gl = gld->glapi; + + render_gears(gld); + gl->glFinish(); +} + +static Eina_Bool +_anim(void *data) +{ + elm_glview_changed_set((Evas_Object*)data); + return EINA_TRUE; +} + +static Eina_Bool +_quit_idler(void *data) +{ + evas_object_del(data); + + return ECORE_CALLBACK_CANCEL; +} + +static void +_on_done(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + ecore_idler_add(_quit_idler, data); +} + +static void +_on_plus(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + GLData *gld = evas_object_data_get(data, "gld"); + gld->gear_teeth += 1; + gld->recreate_gears = 1; +} + +static void +_on_minus(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + GLData *gld = evas_object_data_get(data, "gld"); + if (gld->gear_teeth > 0) + { + gld->gear_teeth -= 1; + gld->recreate_gears -= 1; + } +} + +static void +_del(void *data EINA_UNUSED, Evas *evas EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Ecore_Animator *ani = evas_object_data_get(obj, "ani"); + ecore_animator_del(ani); +} + +static void +_key_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info) +{ + Evas_Event_Key_Down *ev; + ev = (Evas_Event_Key_Down *)event_info; + GLData *gld = evas_object_data_get(obj, "gld"); + + if (strcmp(ev->keyname, "Up") == 0) + { + gld->gear_teeth += 1; + gld->recreate_gears = 1; + return; + } + + if (strcmp(ev->keyname, "Down") == 0) + { + gld->gear_teeth -= 1; + gld->recreate_gears = 1; + return; + } +} + +static void +_mouse_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + GLData *gld = evas_object_data_get(obj, "gld"); + gld->mouse_down = 1; +} + +static void +_mouse_move(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Move *ev; + ev = (Evas_Event_Mouse_Move *)event_info; + GLData *gld = evas_object_data_get(obj, "gld"); + float dx = 0, dy = 0; + + if (gld->mouse_down) + { + dx = ev->cur.canvas.x - ev->prev.canvas.x; + dy = ev->cur.canvas.y - ev->prev.canvas.y; + + gld->view_rot[1] += 1.0 * dx; + gld->view_rot[0] += 1.0 * dy; + } +} + +static void +_mouse_up(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + GLData *gld = evas_object_data_get(obj, "gld"); + gld->mouse_down = 0; +} + +//---------------------------// +void +test_glview_manygears(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bg, *bx1, *bx2, *bt_ok, *bt_up, *bt_dn, *gl, *lb; + Ecore_Animator *ani; + GLData *gld = NULL; + char buf[PATH_MAX]; + + // alloc a data struct to hold our relevant gl info in + if (!(gld = calloc(1, sizeof(GLData)))) return; + gldata_init(gld); + + // new window - do the usual and give it a name, title and delete handler + win = elm_win_util_standard_add("glview_manygears", "GLView Many Gears"); + elm_win_autodel_set(win, EINA_TRUE); + + + // add an image bg + bg = elm_bg_add(win); + evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_bg_color_set(bg, 150, 150, 150); + snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get()); + elm_bg_file_set(bg, buf, NULL); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + bx1 = elm_box_add(win); + evas_object_size_hint_weight_set(bx1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx1); + evas_object_show(bx1); + + + // Add a GLView + gl = elm_glview_add(win); + if (gl) + { + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + // Add a glview + elm_glview_mode_set(gl, 0 + | ELM_GLVIEW_ALPHA + | ELM_GLVIEW_DEPTH + ); + elm_glview_resize_policy_set(gl, ELM_GLVIEW_RESIZE_POLICY_RECREATE); + elm_glview_render_policy_set(gl, ELM_GLVIEW_RENDER_POLICY_ALWAYS); + elm_glview_init_func_set(gl, (Elm_GLView_Func_Cb)_init_gl); + elm_glview_del_func_set(gl, (Elm_GLView_Func_Cb)_del_gl); + elm_glview_resize_func_set(gl, (Elm_GLView_Func_Cb)_resize_gl); + elm_glview_render_func_set(gl, (Elm_GLView_Func_Cb)_draw_gl); + elm_box_pack_end(bx1, gl); + evas_object_show(gl); + + // Add Mouse/Key Event Callbacks + elm_object_focus_set(gl, EINA_TRUE); + evas_object_event_callback_add(gl, EVAS_CALLBACK_KEY_DOWN, _key_down, gl); + evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down, gl); + evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_UP, _mouse_up, gl); + evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move, gl); + + // Add animator for rendering + ani = ecore_animator_add(_anim, gl); + gld->glapi = elm_glview_gl_api_get(gl); + evas_object_data_set(gl, "ani", ani); + evas_object_data_set(gl, "gld", gld); + evas_object_event_callback_add(gl, EVAS_CALLBACK_DEL, _del, gl); + + // Add Up/Down Buttons + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_show(bx2); + + bt_up = elm_button_add(win); + elm_object_text_set(bt_up, "+ Teeth"); + evas_object_size_hint_align_set(bt_up, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt_up, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx2, bt_up); + evas_object_show(bt_up); + evas_object_smart_callback_add(bt_up, "clicked", _on_plus, gl); + + bt_dn = elm_button_add(win); + elm_object_text_set(bt_dn, "- Teeth"); + evas_object_size_hint_align_set(bt_dn, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt_dn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx2, bt_dn); + evas_object_show(bt_dn); + evas_object_smart_callback_add(bt_dn, "clicked", _on_minus, gl); + + elm_box_pack_end(bx1, bx2); + } + else + { + lb = elm_label_add(bx1); + elm_object_text_set(lb, "<align=left> GL backend engine is not supported.<br/>" + " 1. Check your back-end engine or<br/>" + " 2. Run elementary_test with engine option or<br/>" + " ex) $ <b>ELM_ENGINE=gl</b> elementary_test<br/>" + " 3. Change your back-end engine from elementary_config.<br/></align>"); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx1, lb); + evas_object_show(lb); + free(gld); + } + + // Add Close Button + bt_ok = elm_button_add(win); + elm_object_text_set(bt_ok, "Close"); + evas_object_size_hint_align_set(bt_ok, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt_ok, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx1, bt_ok); + evas_object_show(bt_ok); + evas_object_smart_callback_add(bt_ok, "clicked", _on_done, win); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_glview_simple.c b/src/bin/elementary/test_glview_simple.c new file mode 100644 index 0000000000..dcc418316b --- /dev/null +++ b/src/bin/elementary/test_glview_simple.c @@ -0,0 +1,290 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +typedef struct _GL_Data GL_Data; + +// GL related data here.. +struct _GL_Data +{ + Evas_GL_API *glapi; + GLuint program; + GLuint vtx_shader; + GLuint fgmt_shader; + GLuint vbo; +}; + +static float red = 1.0; + +static void +_win_free_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + free(data); +} + +static GLuint +load_shader(GL_Data *gld, GLenum type, const char *shader_src) +{ + Evas_GL_API *gl = gld->glapi; + GLuint shader; + GLint compiled; + + // Create the shader object + shader = gl->glCreateShader(type); + if (shader==0) + return 0; + + // Load/Compile shader source + gl->glShaderSource(shader, 1, &shader_src, NULL); + gl->glCompileShader(shader); + gl->glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled); + + if (!compiled) + { + GLint info_len = 0; + gl->glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &info_len); + if (info_len > 1) + { + char* info_log = malloc(sizeof(char) * info_len); + + gl->glGetShaderInfoLog(shader, info_len, NULL, info_log); + printf("Error compiling shader:\n%s\n======\n%s\n======\n", info_log, shader_src ); + free(info_log); + } + gl->glDeleteShader(shader); + return 0; + } + + return shader; +} + +// Initialize the shader and program object +static int +init_shaders(GL_Data *gld) +{ + Evas_GL_API *gl = gld->glapi; + GLbyte vShaderStr[] = + "attribute vec4 vPosition;\n" + "void main()\n" + "{\n" + " gl_Position = vPosition;\n" + "}\n"; + + GLbyte fShaderStr[] = + "#ifdef GL_ES\n" + "precision mediump float;\n" + "#endif\n" + "void main()\n" + "{\n" + " gl_FragColor = vec4 ( 1.0, 0.0, 0.0, 1.0 );\n" + "}\n"; + + GLint linked; + + // Load the vertex/fragment shaders + gld->vtx_shader = load_shader(gld, GL_VERTEX_SHADER, (const char*)vShaderStr); + gld->fgmt_shader = load_shader(gld, GL_FRAGMENT_SHADER, (const char*)fShaderStr); + + // Create the program object + gld->program = gl->glCreateProgram( ); + if (gld->program==0) + return 0; + + gl->glAttachShader(gld->program, gld->vtx_shader); + gl->glAttachShader(gld->program, gld->fgmt_shader); + + gl->glBindAttribLocation(gld->program, 0, "vPosition"); + gl->glLinkProgram(gld->program); + gl->glGetProgramiv(gld->program, GL_LINK_STATUS, &linked); + + if (!linked) + { + GLint info_len = 0; + gl->glGetProgramiv(gld->program, GL_INFO_LOG_LENGTH, &info_len); + if (info_len > 1) + { + char* info_log = malloc(sizeof(char) * info_len); + + gl->glGetProgramInfoLog(gld->program, info_len, NULL, info_log); + printf("Error linking program:\n%s\n", info_log); + free(info_log); + } + gl->glDeleteProgram(gld->program); + return 0; + } + return 1; +} + +// Callbacks +static void +_init_gl(Evas_Object *obj) +{ + GL_Data *gld = evas_object_data_get(obj, "gld"); + Evas_GL_API *gl = gld->glapi; + GLfloat vVertices[] = { 0.0f, 0.5f, 0.0f, + -0.5f, -0.5f, 0.0f, + 0.5f, -0.5f, 0.0f }; + + if (!init_shaders(gld)) + { + printf("Error Initializing Shaders\n"); + return; + } + + gl->glGenBuffers(1, &gld->vbo); + gl->glBindBuffer(GL_ARRAY_BUFFER, gld->vbo); + gl->glBufferData(GL_ARRAY_BUFFER, sizeof(vVertices), vVertices, GL_STATIC_DRAW); + gl->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, + 0, 0); + gl->glEnableVertexAttribArray(0); +} + +static void +_del_gl(Evas_Object *obj) +{ + GL_Data *gld = evas_object_data_get(obj, "gld"); + if (!gld) + { + printf("Unable to get GL_Data. \n"); + return; + } + Evas_GL_API *gl = gld->glapi; + + gl->glDeleteShader(gld->vtx_shader); + gl->glDeleteShader(gld->fgmt_shader); + gl->glDeleteProgram(gld->program); + gl->glDeleteBuffers(1, &gld->vbo); + + evas_object_data_del(obj, "gld"); +} + +static void +_resize_gl(Evas_Object *obj) +{ + int w, h; + GL_Data *gld = evas_object_data_get(obj, "gld"); + Evas_GL_API *gl = gld->glapi; + + elm_glview_size_get(obj, &w, &h); + + // GL Viewport stuff. you can avoid doing this if viewport is all the + // same as last frame if you want + gl->glViewport(0, 0, w, h); +} + +static void +_draw_gl(Evas_Object *obj) +{ + Evas_GL_API *gl = elm_glview_gl_api_get(obj); + GL_Data *gld = evas_object_data_get(obj, "gld"); + if (!gld) return; + int w, h; + + elm_glview_size_get(obj, &w, &h); + + gl->glViewport(0, 0, w, h); + gl->glClearColor(red, 0.8, 0.3, 1); + gl->glClear(GL_COLOR_BUFFER_BIT); + + // Draw a Triangle + gl->glEnable(GL_BLEND); + + gl->glUseProgram(gld->program); + + gl->glBindBuffer(GL_ARRAY_BUFFER, gld->vbo); + + gl->glDrawArrays(GL_TRIANGLES, 0, 3); + + // Optional - Flush the GL pipeline + gl->glFinish(); + + red -= 0.1; + if (red < 0.0) red = 1.0; +} + +static Eina_Bool +_anim(void *data) +{ + elm_glview_changed_set(data); + return ECORE_CALLBACK_RENEW; +} + +static void +_close_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + evas_object_del(data); +} + +static void +_gl_del_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + ecore_animator_del(data); +} + +void +test_glview_simple(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bt, *gl, *lb; + Ecore_Animator *ani; + GL_Data *gld = NULL; + + if (!(gld = calloc(1, sizeof(GL_Data)))) return; + + win = elm_win_util_standard_add("glview-simple", "GLView Simple"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _win_free_cb, gld); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + gl = elm_glview_add(win); + if (gl) + { + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_glview_mode_set(gl, ELM_GLVIEW_ALPHA | ELM_GLVIEW_DEPTH); + elm_glview_resize_policy_set(gl, ELM_GLVIEW_RESIZE_POLICY_RECREATE); + elm_glview_render_policy_set(gl, ELM_GLVIEW_RENDER_POLICY_ON_DEMAND); + elm_glview_init_func_set(gl, _init_gl); + elm_glview_del_func_set(gl, _del_gl); + elm_glview_resize_func_set(gl, _resize_gl); + elm_glview_render_func_set(gl, _draw_gl); + elm_box_pack_end(bx, gl); + evas_object_show(gl); + + elm_object_focus_set(gl, EINA_TRUE); + + ani = ecore_animator_add(_anim, gl); + gld->glapi = elm_glview_gl_api_get(gl); + evas_object_data_set(gl, "gld", gld); + evas_object_event_callback_add(gl, EVAS_CALLBACK_DEL, _gl_del_cb, ani); + } + else + { + lb = elm_label_add(bx); + elm_object_text_set(lb, "<align=left> GL backend engine is not supported.<br/>" + " 1. Check your back-end engine or<br/>" + " 2. Run elementary_test with engine option or<br/>" + " ex) $ <b>ELM_ENGINE=gl</b> elementary_test<br/>" + " 3. Change your back-end engine from elementary_config.<br/></align>"); + evas_object_size_hint_weight_set(lb, 0.0, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + } + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_smart_callback_add(bt, "clicked", _close_cb, win); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_grid.c b/src/bin/elementary/test_grid.c new file mode 100644 index 0000000000..fc34ded8ed --- /dev/null +++ b/src/bin/elementary/test_grid.c @@ -0,0 +1,189 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +struct _Api_Data +{ + Evas_Object *grid; + Evas_Object *child; +}; +typedef struct _Api_Data Api_Data; + +struct _api_data +{ + unsigned int state; /* What state we are testing */ + Api_Data data; +}; +typedef struct _api_data api_data; + +enum _api_state +{ + GRID_PACK_SET, + GRID_UNPACK, + GRID_SIZE, + GRID_CLEAR, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + Api_Data *dt = &api->data; + int w, h; + + switch(api->state) + { /* Put all api-changes under switch */ + case GRID_PACK_SET: /* 0 */ + elm_grid_pack_set(dt->child, 5, 15, 60, 40); + break; + + case GRID_UNPACK: /* 1 */ + elm_grid_unpack(dt->grid, dt->child); + evas_object_del(dt->child); + break; + + case GRID_SIZE: /* 2 */ + elm_grid_size_get(dt->grid, &w, &h); + printf("size w=<%d> h=<%d>\n", w, h); + w = h = 100; /* grid size returns wrong values */ + w += 30; + h += 10; + + elm_grid_size_set(dt->grid, w, h); + break; + + case GRID_CLEAR: /* 3 */ + elm_grid_clear(dt->grid, EINA_TRUE); + break; + + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(obj, str); + elm_object_disabled_set(obj, a->state == API_STATE_LAST); +} + +static void +_ch_grid(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + int x, y, w, h; + + elm_grid_pack_get(obj, &x, &y, &w, &h); + elm_grid_pack_set(obj, x - 1, y - 1, w + 2, h + 2); +} + +static void +_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + free(data); +} + +void +test_grid(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *gd, *bt, *rc, *en; + + win = elm_win_util_standard_add("grid", "Grid"); + elm_win_autodel_set(win, EINA_TRUE); + api_data *api = calloc(1, sizeof(api_data)); + + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + gd = elm_grid_add(win); + elm_grid_size_set(gd, 100, 100); + evas_object_size_hint_weight_set(gd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, gd); + api->data.grid = gd; + evas_object_show(gd); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_object_text_set(en, "Entry text"); + elm_entry_single_line_set(en, EINA_TRUE); + elm_grid_pack(gd, en, 50, 10, 40, 10); + evas_object_show(en); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_object_text_set(en, "Entry text 2"); + elm_entry_single_line_set(en, EINA_TRUE); + elm_grid_pack(gd, en, 60, 20, 30, 10); + evas_object_show(en); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Next API function"); + evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api); + elm_grid_pack(gd, bt, 30, 0, 40, 10); + elm_object_disabled_set(bt, api->state == API_STATE_LAST); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button"); + elm_grid_pack(gd, bt, 0, 0, 20, 20); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button"); + elm_grid_pack(gd, bt, 10, 10, 40, 20); + api->data.child = bt; + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button"); + elm_grid_pack(gd, bt, 10, 30, 20, 50); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button"); + elm_grid_pack(gd, bt, 80, 80, 20, 20); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Change"); + elm_grid_pack(gd, bt, 40, 40, 20, 20); + evas_object_smart_callback_add(bt, "clicked", _ch_grid, gd); + evas_object_show(bt); + + rc = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(rc, 128, 0, 0, 128); + elm_grid_pack(gd, rc, 40, 70, 20, 10); + evas_object_show(rc); + + rc = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(rc, 0, 128, 0, 128); + elm_grid_pack(gd, rc, 60, 70, 10, 10); + evas_object_show(rc); + + rc = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(rc, 0, 0, 128, 128); + elm_grid_pack(gd, rc, 40, 80, 10, 10); + evas_object_show(rc); + + rc = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(rc, 128, 0, 128, 128); + elm_grid_pack(gd, rc, 50, 80, 10, 10); + evas_object_show(rc); + + rc = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(rc, 128, 64, 0, 128); + elm_grid_pack(gd, rc, 60, 80, 10, 10); + evas_object_show(rc); + + evas_object_resize(win, 480, 480); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_hover.c b/src/bin/elementary/test_hover.c new file mode 100644 index 0000000000..a2edea4c64 --- /dev/null +++ b/src/bin/elementary/test_hover.c @@ -0,0 +1,249 @@ +#include "elementary_config.h" +#include <Elementary.h> + +static void +_dismissed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("hover dismissed callback is called!\n"); +} + +static void +my_hover_bt(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *hv = data; + + evas_object_show(hv); +} + +static void +_dismiss_hover(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *hv = data; + + elm_hover_dismiss(hv); +} + +void +test_hover(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bt, *hv, *ic; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("hover", "Hover"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + hv = elm_hover_add(win); + evas_object_smart_callback_add(hv, "dismissed", _dismissed_cb, NULL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button"); + evas_object_smart_callback_add(bt, "clicked", my_hover_bt, hv); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + elm_hover_parent_set(hv, win); + elm_hover_target_set(hv, bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Popup"); + elm_object_part_content_set(hv, "middle", bt); + evas_object_show(bt); + + bx = elm_box_add(win); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Top 1"); + evas_object_smart_callback_add(bt, "clicked", _dismiss_hover, hv); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + bt = elm_button_add(win); + elm_object_text_set(bt, "Top 2"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + bt = elm_button_add(win); + elm_object_text_set(bt, "Top 3"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + evas_object_show(bx); + elm_object_part_content_set(hv, "top", bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Bottom"); + elm_object_part_content_set(hv, "bottom", bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Left"); + elm_object_part_content_set(hv, "left", bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Right"); + elm_object_part_content_set(hv, "right", bt); + evas_object_show(bt); + + evas_object_resize(win, 440, 440); + evas_object_show(win); +} + +void +test_hover2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bt, *hv, *ic; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("hover2", "Hover 2"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + hv = elm_hover_add(win); + elm_object_style_set(hv, "popout"); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button"); + evas_object_smart_callback_add(bt, "clicked", my_hover_bt, hv); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + elm_hover_parent_set(hv, win); + elm_hover_target_set(hv, bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Popup"); + elm_object_part_content_set(hv, "middle", bt); + evas_object_show(bt); + + bx = elm_box_add(win); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + bt = elm_button_add(win); + elm_object_text_set(bt, "Top 1"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + bt = elm_button_add(win); + elm_object_text_set(bt, "Top 2"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + bt = elm_button_add(win); + elm_object_text_set(bt, "Top 3"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_show(bx); + elm_object_part_content_set(hv, "top", bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Bot"); + elm_object_part_content_set(hv, "bottom", bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Left"); + elm_object_part_content_set(hv, "left", bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Right"); + elm_object_part_content_set(hv, "right", bt); + evas_object_show(bt); + + evas_object_resize(win, 440, 440); + evas_object_show(win); +} + +static void +_hover_show_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, + void *event_info) +{ + Evas_Object *fake_obj = evas_object_data_get(obj, "fake_obj"); + if (!fake_obj) return; + + Evas_Event_Mouse_Down *ev = event_info; + printf("position x: %d, y: %d \n", ev->canvas.x, ev->canvas.y); + + evas_object_move(fake_obj, ev->canvas.x, ev->canvas.y); + evas_object_show(data); +} + +/* + * hover acts like elm_menu but it has all the hover features such as: + * 1. positioning: left, top-left, top, top-right, right, bottom-right, bottom, + * bottom-left, middle + * 2. content: one can set any object object as hover content + */ +void +test_hover3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *fake_obj, *bx, *bt, *hv, *ic, *rect; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("hover3", "Hover 3"); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + elm_win_autodel_set(win, EINA_TRUE); + + rect = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, rect); + evas_object_color_set(rect, 0, 0, 0, 0); + evas_object_show(rect); + + // fake object to move hover object as we wish + fake_obj = elm_box_add(win); + evas_object_data_set(rect, "fake_obj", fake_obj); + + hv = elm_hover_add(win); + elm_hover_parent_set(hv, win); + elm_hover_target_set(hv, fake_obj); + + evas_object_event_callback_add(rect, EVAS_CALLBACK_MOUSE_DOWN, + _hover_show_cb, hv); + + bx = elm_box_add(win); + elm_object_part_content_set(hv, "smart", bx); + evas_object_show(bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_smart_callback_add(bt, "clicked", _dismiss_hover, hv); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", + elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_smart_callback_add(bt, "clicked", _dismiss_hover, hv); + + evas_object_resize(win, 440, 440); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_hoversel.c b/src/bin/elementary/test_hoversel.c new file mode 100644 index 0000000000..b59a6c3efe --- /dev/null +++ b/src/bin/elementary/test_hoversel.c @@ -0,0 +1,416 @@ +#include "test.h" +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +struct _api_data +{ + unsigned int state; /* What state we are testing */ + void *box; /* Use this to get box content */ +}; +typedef struct _api_data api_data; + +enum _api_state +{ + HOVERSEL_HORIZ, + HOVERSEL_END, + HOVERSEL_LABAL_SET, + HOVERSEL_ICON_UNSET, + HOVERSEL_CLEAR_OPEN, + HOVERSEL_CLEAR, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + Evas_Object *icon; + + const Eina_List *items = elm_box_children_get(api->box); + if (!eina_list_count(items)) + return; + + /* use elm_box_children_get() to get list of children */ + switch(api->state) + { /* Put all api-changes under switch */ + case HOVERSEL_HORIZ: /* Make first hover horiz (0) */ + elm_hoversel_horizontal_set(eina_list_nth(items, 0), EINA_TRUE); + elm_hoversel_hover_begin(eina_list_nth(items, 0)); + break; + + case HOVERSEL_END: /* Make first hover horiz (1) */ + elm_hoversel_hover_begin(eina_list_nth(items, 1)); + elm_hoversel_hover_end(eina_list_nth(items, 1)); + break; + + case HOVERSEL_LABAL_SET: /* set second hover label (2) */ + elm_object_text_set(eina_list_nth(items, 1), "Label from API"); + break; + + case HOVERSEL_ICON_UNSET: /* 3 */ + elm_object_text_set(eina_list_nth(items, 5), "Label only"); + icon = elm_object_part_content_unset(eina_list_nth(items, 5), "icon"); + evas_object_del(icon); + break; + + case HOVERSEL_CLEAR_OPEN: /* 4 */ + elm_hoversel_hover_begin(eina_list_nth(items, 1)); + elm_hoversel_clear(eina_list_nth(items, 1)); + break; + + case HOVERSEL_CLEAR: /* 5 */ + elm_hoversel_clear(eina_list_nth(items, 0)); + break; + + case API_STATE_LAST: + break; + + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(obj, str); + elm_object_disabled_set(obj, a->state == API_STATE_LAST); +} + +static void +_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + free(data); +} + +static void +_hoversel_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("Hover button is clicked and 'clicked' callback is called.\n"); +} + +static void +_hoversel_clicked_populate_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + printf("Hover button is clicked and 'clicked' callback is called.\n"); + elm_hoversel_item_add(obj, "Item 1", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(obj, "Item 2", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(obj, "Item 3", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(obj, "Item 4", NULL, ELM_ICON_NONE, NULL, NULL); +} + +static void +_hoversel_selected_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + const char *txt = elm_object_item_text_get(event_info); + + printf("'selected' callback is called. (selected item : %s)\n", txt); +} + +static void +_hoversel_dismissed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("'dismissed' callback is called.\n"); +} + +static void +_hoversel_expanded_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Elm_Object_Item *it = data; + + printf("'expanded' callback is called.\n"); + if (it) + { + printf("old style: %s\n", elm_object_item_style_get(it)); + //item type is button. set the style of button + elm_object_item_style_set(it, "anchor"); + printf("new style: %s\n", elm_object_item_style_get(it)); + } +} + +void +test_hoversel(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bt, *ic, *bxx, *hoversel; + Elm_Object_Item *it; + char buf[PATH_MAX]; + api_data *api = calloc(1, sizeof(api_data)); + + win = elm_win_util_standard_add("hoversel", "HoverSel"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bxx = elm_box_add(win); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bxx); + evas_object_show(bxx); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + api->box = bx; + evas_object_show(bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Next API function"); + evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, bt); + elm_object_disabled_set(bt, api->state == API_STATE_LAST); + evas_object_show(bt); + + elm_box_pack_end(bxx, bx); + + hoversel = elm_hoversel_add(win); +// FIXME: need to add horizontal hoversel theme to default some day +// elm_hoversel_horizontal_set(bt, EINA_TRUE); + elm_hoversel_auto_update_set(hoversel, EINA_TRUE); + elm_hoversel_hover_parent_set(hoversel, win); + elm_object_text_set(hoversel, "Labels"); + elm_hoversel_item_add(hoversel, "Item 1", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 2", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 3", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 4 - Long Label Here", "close", ELM_ICON_STANDARD, NULL, NULL); + it = elm_hoversel_item_add(hoversel, "Item 5 - Disabled", NULL, ELM_ICON_NONE, NULL, NULL); + elm_object_item_disabled_set(it, EINA_TRUE); + evas_object_smart_callback_add(hoversel, "clicked", + _hoversel_clicked_cb, NULL); + evas_object_smart_callback_add(hoversel, "selected", + _hoversel_selected_cb, NULL); + evas_object_smart_callback_add(hoversel, "dismissed", + _hoversel_dismissed_cb, NULL); + elm_box_pack_end(bx, hoversel); + evas_object_show(hoversel); + + hoversel = elm_hoversel_add(win); + elm_hoversel_auto_update_set(hoversel, EINA_TRUE); + elm_hoversel_hover_parent_set(hoversel, win); + elm_object_text_set(hoversel, "Some Icons"); + elm_hoversel_item_add(hoversel, "Item 1", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 2", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 3", "home", ELM_ICON_STANDARD, NULL, + NULL); + elm_hoversel_item_add(hoversel, "Item 4", "close", ELM_ICON_STANDARD, NULL, + NULL); + elm_hoversel_item_add(hoversel, "Item 5 - Long Label Here", NULL, ELM_ICON_NONE, NULL, + NULL); + elm_hoversel_item_add(hoversel, "Item 6", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 7", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 8", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 9", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 10", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 11", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 12", NULL, ELM_ICON_NONE, NULL, NULL); + elm_box_pack_end(bx, hoversel); + evas_object_show(hoversel); + + hoversel = elm_hoversel_add(win); + elm_hoversel_hover_parent_set(hoversel, win); + elm_object_text_set(hoversel, "All Icons"); + elm_hoversel_item_add(hoversel, "Item 1", "apps", ELM_ICON_STANDARD, NULL, + NULL); + elm_hoversel_item_add(hoversel, "Item 2", "arrow_down", ELM_ICON_STANDARD, + NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 3", "home", ELM_ICON_STANDARD, NULL, + NULL); + elm_hoversel_item_add(hoversel, "Item 4", "close", ELM_ICON_STANDARD, NULL, + NULL); + elm_box_pack_end(bx, hoversel); + evas_object_show(hoversel); + + hoversel = elm_hoversel_add(win); + elm_hoversel_hover_parent_set(hoversel, win); + elm_object_text_set(hoversel, "All Icons"); + elm_hoversel_item_add(hoversel, "Item 1", "apps", ELM_ICON_STANDARD, NULL, + NULL); + snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get()); + elm_hoversel_item_add(hoversel, "Item 2", buf, ELM_ICON_FILE, NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 3", "home", ELM_ICON_STANDARD, NULL, + NULL); + elm_hoversel_item_add(hoversel, "Item 4", "close", ELM_ICON_STANDARD, NULL, + NULL); + elm_box_pack_end(bx, hoversel); + evas_object_show(hoversel); + + hoversel = elm_hoversel_add(win); + elm_hoversel_hover_parent_set(hoversel, win); + elm_object_text_set(hoversel, "Disabled Hoversel"); + elm_hoversel_item_add(hoversel, "Item 1", "apps", ELM_ICON_STANDARD, NULL, + NULL); + elm_hoversel_item_add(hoversel, "Item 2", "close", ELM_ICON_STANDARD, NULL, + NULL); + elm_object_disabled_set(hoversel, EINA_TRUE); + elm_box_pack_end(bx, hoversel); + evas_object_show(hoversel); + + hoversel = elm_hoversel_add(win); + elm_hoversel_hover_parent_set(hoversel, win); + elm_object_text_set(hoversel, "Icon + Label"); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/sky_03.jpg", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_object_part_content_set(hoversel, "icon", ic); + evas_object_show(ic); + + elm_hoversel_item_add(hoversel, "Item 1", "apps", ELM_ICON_STANDARD, NULL, + NULL); + elm_hoversel_item_add(hoversel, "Item 2", "arrow_down", ELM_ICON_STANDARD, + NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 3", "home", ELM_ICON_STANDARD, NULL, + NULL); + elm_hoversel_item_add(hoversel, "Item 4", "close", ELM_ICON_STANDARD, NULL, + NULL); + elm_box_pack_end(bx, hoversel); + evas_object_show(hoversel); + + hoversel = elm_hoversel_add(win); + elm_hoversel_auto_update_set(hoversel, EINA_TRUE); + elm_hoversel_hover_parent_set(hoversel, win); + elm_object_text_set(hoversel, "Custom Item Style"); + elm_hoversel_item_add(hoversel, "Item 1", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 2", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 3", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 4", NULL, ELM_ICON_NONE, NULL, NULL); + it = elm_hoversel_item_add(hoversel, "Manage items", NULL, ELM_ICON_NONE, NULL, NULL); + evas_object_smart_callback_add(hoversel, "clicked", + _hoversel_clicked_cb, NULL); + evas_object_smart_callback_add(hoversel, "selected", + _hoversel_selected_cb, NULL); + evas_object_smart_callback_add(hoversel, "dismissed", + _hoversel_dismissed_cb, NULL); + //pass the last item as data and use elm_object_item_style_set() to change the item style. + evas_object_smart_callback_add(hoversel, "expanded", + _hoversel_expanded_cb, it); + elm_box_pack_end(bx, hoversel); + evas_object_show(hoversel); + + hoversel = elm_hoversel_add(win); + elm_hoversel_hover_parent_set(hoversel, win); + elm_object_text_set(hoversel, "Add items when clicked"); + evas_object_smart_callback_add(hoversel, "clicked", + _hoversel_clicked_populate_cb, NULL); + evas_object_smart_callback_add(hoversel, "selected", + _hoversel_selected_cb, NULL); + evas_object_smart_callback_add(hoversel, "dismissed", + _hoversel_dismissed_cb, NULL); + evas_object_smart_callback_add(hoversel, "expanded", + _hoversel_expanded_cb, NULL); + elm_box_pack_end(bx, hoversel); + evas_object_show(hoversel); + + evas_object_resize(win, 320, 500); + + evas_object_show(win); +} + +static void +_item_focused_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *it = event_info; + + printf("item,focused: %p\n", it); +} + +static void +_item_unfocused_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *it = event_info; + + printf("item,unfocused: %p\n", it); +} +static void +_hoversel_expanded_cb2(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Elm_Object_Item *it = data; + + printf("expanded\n"); + elm_object_item_focus_set(it, EINA_TRUE); + printf("focus set to item: %p\n", it); +} + +void +test_hoversel_focus(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *hoversel; + Elm_Object_Item *it; + + win = elm_win_util_standard_add("hoversel focus", "Hoversel Focus"); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + elm_win_focus_highlight_animate_set(win, EINA_TRUE); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + hoversel = elm_hoversel_add(win); + elm_hoversel_hover_parent_set(hoversel, win); + elm_object_text_set(hoversel, "Vertical"); + elm_hoversel_item_add(hoversel, "Item 1", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 2", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 3", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 4 - Long Label Here", "close", ELM_ICON_STANDARD, NULL, NULL); + evas_object_smart_callback_add(hoversel, "clicked", + _hoversel_clicked_cb, NULL); + evas_object_smart_callback_add(hoversel, "selected", + _hoversel_selected_cb, NULL); + evas_object_smart_callback_add(hoversel, "dismissed", + _hoversel_dismissed_cb, NULL); + elm_box_pack_end(bx, hoversel); + evas_object_show(hoversel); + elm_object_focus_set(hoversel, EINA_TRUE); + evas_object_smart_callback_add(hoversel, "item,focused", _item_focused_cb, NULL); + evas_object_smart_callback_add(hoversel, "item,unfocused", _item_unfocused_cb, NULL); + + hoversel = elm_hoversel_add(win); + elm_hoversel_horizontal_set(hoversel, EINA_TRUE); + elm_hoversel_hover_parent_set(hoversel, win); + elm_object_text_set(hoversel, "Horizontal"); + elm_hoversel_item_add(hoversel, "Item 1", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 2", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 3", "home", ELM_ICON_STANDARD, NULL, + NULL); + elm_hoversel_item_add(hoversel, "Item 4", "close", ELM_ICON_STANDARD, NULL, + NULL); + elm_box_pack_end(bx, hoversel); + evas_object_show(hoversel); + evas_object_smart_callback_add(hoversel, "item,focused", _item_focused_cb, NULL); + evas_object_smart_callback_add(hoversel, "item,unfocused", _item_unfocused_cb, NULL); + + hoversel = elm_hoversel_add(win); + elm_hoversel_hover_parent_set(hoversel, win); + elm_object_text_set(hoversel, "Icons"); + elm_hoversel_item_add(hoversel, "Item 1", "apps", ELM_ICON_STANDARD, NULL, + NULL); + it = elm_hoversel_item_add(hoversel, "Item 2", "arrow_down", ELM_ICON_STANDARD, + NULL, NULL); + elm_hoversel_item_add(hoversel, "Item 3", "home", ELM_ICON_STANDARD, NULL, + NULL); + elm_hoversel_item_add(hoversel, "Item 4", "close", ELM_ICON_STANDARD, NULL, + NULL); + elm_box_pack_end(bx, hoversel); + evas_object_show(hoversel); + evas_object_smart_callback_add(hoversel, "item,focused", _item_focused_cb, NULL); + evas_object_smart_callback_add(hoversel, "item,unfocused", _item_unfocused_cb, NULL); + evas_object_smart_callback_add(hoversel, "expanded", + _hoversel_expanded_cb2, it); + + evas_object_resize(win, 320, 500); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_icon.c b/src/bin/elementary/test_icon.c new file mode 100644 index 0000000000..e84d075c82 --- /dev/null +++ b/src/bin/elementary/test_icon.c @@ -0,0 +1,437 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void +aspect_fixed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *ic = (Evas_Object *)data; + elm_image_aspect_fixed_set(ic, elm_check_state_get(obj)); +} + +static void +fill_outside_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *ic = (Evas_Object *)data; + elm_image_fill_outside_set(ic, elm_check_state_get(obj)); +} + +static void +smooth_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *ic = (Evas_Object *)data; + elm_image_smooth_set(ic, elm_check_state_get(obj)); +} + +static void +bt_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *ic; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("preload-prescale", "Preload & Prescale"); + elm_win_autodel_set(win, EINA_TRUE); + + ic = elm_icon_add(win); + evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, ic); + snprintf(buf, sizeof(buf), "%s/images/insanely_huge_test_image.jpg", + elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + + elm_image_aspect_fixed_set(ic, EINA_FALSE); + elm_image_preload_disabled_set(ic, EINA_TRUE); + elm_image_prescale_set(ic, EINA_TRUE); + evas_object_show(ic); + + evas_object_resize(win, 350, 350); + evas_object_show(win); +} + +void +test_icon(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *box, *ic, *hbox, *tg, *bt; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("icon-test", "Icon Test"); + elm_win_autodel_set(win, EINA_TRUE); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + ic = elm_icon_add(box); + snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ic, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, ic); + evas_object_show(ic); + + hbox = elm_box_add(box); + elm_box_horizontal_set(hbox, EINA_TRUE); + evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(box, hbox); + evas_object_show(hbox); + + /* Test Aspect Fixed */ + tg = elm_check_add(hbox); + elm_object_text_set(tg, "Aspect Fixed"); + elm_check_state_set(tg, EINA_TRUE); + evas_object_smart_callback_add(tg, "changed", aspect_fixed_cb, ic); + elm_box_pack_end(hbox, tg); + evas_object_show(tg); + + /* Test Fill Outside */ + tg = elm_check_add(hbox); + elm_object_text_set(tg, "Fill Outside"); + evas_object_smart_callback_add(tg, "changed", fill_outside_cb, ic); + elm_box_pack_end(hbox, tg); + evas_object_show(tg); + + /* Test Smooth */ + tg = elm_check_add(hbox); + elm_object_text_set(tg, "Smooth"); + elm_check_state_set(tg, EINA_TRUE); + evas_object_smart_callback_add(tg, "changed", smooth_cb, ic); + elm_box_pack_end(hbox, tg); + evas_object_show(tg); + + /* Test Preload, Prescale */ + bt = elm_button_add(hbox); + elm_object_text_set(bt, "Preload & Prescale"); + evas_object_smart_callback_add(bt, "clicked", bt_clicked, NULL); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + evas_object_resize(win, 400, 400); + evas_object_show(win); +} + +/* Test: Icon Transparent */ +static void +icon_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("clicked!\n"); +} + +void +test_icon_transparent(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *ic; + char buf[PATH_MAX]; + + win = elm_win_add(NULL, "icon-transparent", ELM_WIN_BASIC); + elm_win_title_set(win, "Icon Transparent"); + elm_win_autodel_set(win, EINA_TRUE); + elm_win_alpha_set(win, EINA_TRUE); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + elm_image_no_scale_set(ic, EINA_TRUE); + evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(ic, 0.5, 0.5); + elm_win_resize_object_add(win, ic); + evas_object_show(ic); + + evas_object_smart_callback_add(ic, "clicked", icon_clicked, NULL); + + evas_object_show(win); +} + +/* Test: Icon Standard */ +static void +_standard_list_populate(Evas_Object *list, Elm_Icon_Lookup_Order order, int size) +{ + Evas_Object *ic; + Eina_List *l; + const char *group; + char name[128], *p; + + elm_list_clear(list); + l = elm_theme_group_base_list(NULL, "elm/icon/"); + EINA_LIST_FREE(l, group) + { + // group = "/elm/icon/standard-name/style/maybe_another_style??" + snprintf(name, sizeof(name), "%s", group + 9); + if ((p = strrchr(name, '/'))) + *p = '\0'; + // printf("Found group:%s Name:%s\n", group, name); + + // quick hack to show only standard-compliant icons + // apart from the "folder" one, all the others have "-" in the name + if ((strrchr(name, '-') != NULL) || !strcmp(name, "folder")) + { + ic = elm_icon_add(list); + elm_icon_order_lookup_set(ic, order); + elm_icon_standard_set(ic, name); + if (size) + evas_object_size_hint_min_set(ic, size, size); + elm_list_item_append(list, name, ic, NULL, NULL, NULL); + } + + eina_stringshare_del(group); + } + elm_list_go(list); +} + +static void +_rdg_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *li = data; + Evas_Object *icon = evas_object_data_get(li, "resize_icon"); + Evas_Object *order_rdg = evas_object_data_get(li, "order_rdg"); + Evas_Object *size_rdg = evas_object_data_get(li, "size_rdg"); + + _standard_list_populate(li, elm_radio_value_get(order_rdg), + elm_radio_value_get(size_rdg)); + + elm_icon_order_lookup_set(icon, elm_radio_value_get(order_rdg)); +} + +static void +_slider_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *icon = data; + int size = (int)elm_slider_value_get(obj); + + evas_object_size_hint_min_set(icon, size, size); +} + +static void +_list_selected_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info) +{ + Elm_Object_Item *list_it = event_info; + Evas_Object *icon = evas_object_data_get(obj, "resize_icon"); + + elm_icon_standard_set(icon, elm_object_item_text_get(list_it)); +} + +static void +_std_btn_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *panes, *icon; + + win = elm_win_util_standard_add("icon-test-std-auto", "Icon Standard"); + elm_win_autodel_set(win, EINA_TRUE); + + panes = elm_panes_add(win); + evas_object_size_hint_weight_set(panes, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_panes_content_left_min_size_set(panes, 16); + elm_panes_content_right_min_size_set(panes, 16); + elm_win_resize_object_add(win, panes); + evas_object_show(panes); + + icon = elm_icon_add(panes); + evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_icon_order_lookup_set(icon, ELM_ICON_LOOKUP_FDO_THEME); + elm_icon_standard_set(icon, "folder"); + elm_object_part_content_set(panes, "left", icon); + evas_object_show(icon); + + icon = elm_icon_add(panes); + evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_icon_order_lookup_set(icon, ELM_ICON_LOOKUP_FDO_THEME); + elm_icon_standard_set(icon, "user-home"); + elm_object_part_content_set(panes, "right", icon); + evas_object_show(icon); + + evas_object_resize(win, 300, 200); + evas_object_show(win); +} + +void +test_icon_standard(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *li, *box, *hbox, *fr, *rd, *rdg, *icon, *sl, *bt; + + win = elm_win_util_standard_add("icon-test-std", "Icon Standard"); + elm_win_autodel_set(win, EINA_TRUE); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + li = elm_list_add(box); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(li, "selected", _list_selected_cb, NULL); + _standard_list_populate(li, ELM_ICON_LOOKUP_FDO_THEME, 0); + evas_object_show(li); + + // lookup order + fr = elm_frame_add(box); + elm_object_text_set(fr, "standard icon order lookup"); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.0); + elm_box_pack_end(box, fr); + evas_object_show(fr); + + hbox = elm_box_add(fr); + elm_box_horizontal_set(hbox, EINA_TRUE); + elm_object_content_set(fr, hbox); + evas_object_show(hbox); + + rdg = elm_radio_add(hbox); + elm_radio_state_value_set(rdg, ELM_ICON_LOOKUP_FDO_THEME); + elm_object_text_set(rdg, "fdo, theme"); + elm_box_pack_end(hbox, rdg); + evas_object_show(rdg); + evas_object_smart_callback_add(rdg, "changed", _rdg_changed_cb, li); + evas_object_data_set(li, "order_rdg", rdg); + + rd = elm_radio_add(hbox); + elm_radio_state_value_set(rd, ELM_ICON_LOOKUP_THEME_FDO); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "theme, fdo"); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, li); + + rd = elm_radio_add(hbox); + elm_radio_state_value_set(rd, ELM_ICON_LOOKUP_FDO); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "fdo only"); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, li); + + rd = elm_radio_add(hbox); + elm_radio_state_value_set(rd, ELM_ICON_LOOKUP_THEME); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "theme only"); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, li); + + // size + fr = elm_frame_add(box); + elm_object_text_set(fr, "standard icon size"); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.0); + elm_box_pack_end(box, fr); + evas_object_show(fr); + + hbox = elm_box_add(fr); + elm_box_horizontal_set(hbox, EINA_TRUE); + elm_object_content_set(fr, hbox); + evas_object_show(hbox); + + rdg = elm_radio_add(hbox); + elm_radio_state_value_set(rdg, 0); + elm_object_text_set(rdg, "Free"); + elm_box_pack_end(hbox, rdg); + evas_object_show(rdg); + evas_object_smart_callback_add(rdg, "changed", _rdg_changed_cb, li); + evas_object_data_set(li, "size_rdg", rdg); + + rd = elm_radio_add(hbox); + elm_radio_state_value_set(rd, 16); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "16"); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, li); + + rd = elm_radio_add(hbox); + elm_radio_state_value_set(rd, 22); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "22"); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, li); + + rd = elm_radio_add(hbox); + elm_radio_state_value_set(rd, 24); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "24"); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, li); + + rd = elm_radio_add(hbox); + elm_radio_state_value_set(rd, 32); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "32"); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, li); + + rd = elm_radio_add(hbox); + elm_radio_state_value_set(rd, 48); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "48"); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, li); + + rd = elm_radio_add(hbox); + elm_radio_state_value_set(rd, 64); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "64"); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, li); + + rd = elm_radio_add(hbox); + elm_radio_state_value_set(rd, 128); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "128"); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, li); + + // pack the list + elm_box_pack_end(box, li); + + // live resize + fr = elm_frame_add(box); + elm_object_text_set(fr, "live resize"); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.0); + elm_box_pack_end(box, fr); + evas_object_show(fr); + + hbox = elm_box_add(fr); + elm_object_content_set(fr, hbox); + evas_object_show(hbox); + + icon = elm_icon_add(hbox); + elm_icon_order_lookup_set(icon, ELM_ICON_LOOKUP_FDO_THEME); + elm_icon_standard_set(icon, "folder"); + evas_object_size_hint_min_set(icon, 16, 16); + elm_box_pack_end(hbox, icon); + evas_object_show(icon); + evas_object_data_set(li, "resize_icon", icon); + + sl = elm_slider_add(hbox); + elm_object_text_set(sl, "min_size"); + elm_slider_min_max_set(sl, 16, 256); + elm_slider_value_set(sl, 16); + elm_slider_unit_format_set(sl, "%.0f px"); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.0); + evas_object_smart_callback_add(sl, "changed", _slider_changed_cb, icon); + elm_box_pack_end(hbox, sl); + evas_object_show(sl); + + bt = elm_button_add(box); + elm_object_text_set(bt, "Another size test, without using min_size"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.0); + evas_object_smart_callback_add(bt, "clicked", _std_btn_clicked_cb, NULL); + elm_box_pack_end(box, bt); + evas_object_show(bt); + + // show the win + evas_object_resize(win, 300, 400); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_icon_animated.c b/src/bin/elementary/test_icon_animated.c new file mode 100644 index 0000000000..3ecfa26950 --- /dev/null +++ b/src/bin/elementary/test_icon_animated.c @@ -0,0 +1,57 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void +_icon_clicked_cb(void *data , Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *ic = data; + Eina_Bool play = EINA_FALSE; + + play = !elm_image_animated_play_get(ic); + printf("image clicked! play = %d\n", play); + elm_image_animated_play_set(ic, play); +} + +void +test_icon_animated(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *lbl, *ic; + char buf[PATH_MAX]; + + elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); + + win = elm_win_add(NULL, "icon-animated-gif", ELM_WIN_BASIC); + elm_win_title_set(win, "Icon Animated Gif"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + lbl = elm_label_add(bx); + elm_object_text_set(lbl, "Clicking the image will play/pause animation."); + elm_box_pack_end(bx, lbl); + evas_object_show(lbl); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/animated_logo.gif", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + if (elm_image_animated_available_get(ic)) + { + printf("animation is available for this image.\n"); + elm_image_animated_set(ic, EINA_TRUE); + elm_image_animated_play_set(ic, EINA_TRUE); + } + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(ic, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + evas_object_smart_callback_add(ic, "clicked", _icon_clicked_cb, ic); + + evas_object_show(win); +} diff --git a/src/bin/elementary/test_icon_desktops.c b/src/bin/elementary/test_icon_desktops.c new file mode 100644 index 0000000000..6ab9511162 --- /dev/null +++ b/src/bin/elementary/test_icon_desktops.c @@ -0,0 +1,106 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static Elm_Genlist_Item_Class *it_desk = NULL; + +static char * +desk_gl_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ +#ifdef ELM_EFREET + Efreet_Desktop *d = (Efreet_Desktop *)data; + return strdup(d->name); +#else + return NULL; + (void)data; +#endif +} +static Evas_Object * +desk_gl_content_get(void *data, Evas_Object *obj, const char *part) +{ +#ifdef ELM_EFREET + Efreet_Desktop *d = (Efreet_Desktop *)data; + Evas_Object *ic; + + ic = elm_icon_add(obj); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + if (!(!strcmp(part, "elm.swallow.icon"))) return ic; + if (!d->icon) return ic; + elm_icon_standard_set(ic, d->icon); + return ic; +#else + return NULL; + (void)data; + (void)obj; + (void)part; +#endif +} +static void +desk_gl_del(void *data, Evas_Object *obj EINA_UNUSED) +{ +#ifdef ELM_EFREET + Efreet_Desktop *d = (Efreet_Desktop *)data; + efreet_desktop_free(d); +#else + return; + (void)data; +#endif +} + +#ifdef ELM_EFREET +static void +desktop_sel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Efreet_Desktop *d = data; + if (!d) return; + printf("Selected Desktop Icon:\n"); + printf("\tname : %s\n", d->name); + printf("\ticon : %s\n", d->icon); + printf("\tgeneric_name : %s\n", d->generic_name); +} +#endif + +void +test_icon_desktops(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *gl; +#ifdef ELM_EFREET + Eina_List *desktops; +#endif + + win = elm_win_util_standard_add("icon-desktops", "Icon Desktops"); + elm_win_autodel_set(win, EINA_TRUE); + + it_desk = elm_genlist_item_class_new(); + it_desk->item_style = "default"; + it_desk->func.text_get = desk_gl_text_get; + it_desk->func.content_get = desk_gl_content_get; + it_desk->func.state_get = NULL; + it_desk->func.del = desk_gl_del; + + gl = elm_genlist_add(win); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, gl); + evas_object_show(gl); + +#ifdef ELM_EFREET + if (elm_need_efreet()) + { + desktops = efreet_util_desktop_name_glob_list("*"); + if (desktops) + { + Efreet_Desktop *d; + + EINA_LIST_FREE(desktops, d) + elm_genlist_item_append(gl, it_desk, d, + NULL, ELM_GENLIST_ITEM_NONE, + desktop_sel, d); + } + } +#endif + + elm_genlist_item_class_free(it_desk); + evas_object_resize(win, 320, 480); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_image.c b/src/bin/elementary/test_image.c new file mode 100644 index 0000000000..f8f3d859ca --- /dev/null +++ b/src/bin/elementary/test_image.c @@ -0,0 +1,193 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static const struct { + Evas_Image_Orient orient; + const char *name; +} images_orient[] = { + { EVAS_IMAGE_ORIENT_NONE, "None" }, + { EVAS_IMAGE_ORIENT_90, "Rotate 90" }, + { EVAS_IMAGE_ORIENT_180, "Rotate 180" }, + { EVAS_IMAGE_ORIENT_270, "Rotate 270" }, + { EVAS_IMAGE_FLIP_HORIZONTAL, "Horizontal Flip" }, + { EVAS_IMAGE_FLIP_VERTICAL, "Vertical Flip" }, + { EVAS_IMAGE_FLIP_TRANSPOSE, "Transpose" }, + { EVAS_IMAGE_FLIP_TRANSVERSE, "Transverse" }, + { 0, NULL } +}; + +static void +my_im_ch(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + Evas_Object *im = evas_object_data_get(win, "im"); + Evas_Object *rdg = evas_object_data_get(win, "rdg"); + Evas_Image_Orient v = elm_radio_value_get(rdg); + + elm_image_orient_set(im, v); + fprintf(stderr, "Set %i and got %i\n", + v, elm_image_orient_get(im)); +} + +void +test_image(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *box, *im, *rd, *rdg = NULL; + int i; + + win = elm_win_util_standard_add("image test", "Image Test"); + elm_win_autodel_set(win, EINA_TRUE); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + im = elm_image_add(win); + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get()); + elm_image_file_set(im, buf, NULL); + evas_object_size_hint_weight_set(im, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(im, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, im); + evas_object_show(im); + + evas_object_data_set(win, "im", im); + + for (i = 0; images_orient[i].name; ++i) + { + rd = elm_radio_add(win); + evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + elm_radio_state_value_set(rd, images_orient[i].orient); + elm_object_text_set(rd, images_orient[i].name); + elm_box_pack_end(box, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", my_im_ch, win); + if (!rdg) + { + rdg = rd; + evas_object_data_set(win, "rdg", rdg); + } + else + { + elm_radio_group_add(rd, rdg); + } + } + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} + +void +test_remote_image(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *box, *im, *rd, *rdg = NULL; + int i; + + win = elm_win_util_standard_add("image test", "Image Test"); + elm_win_autodel_set(win, EINA_TRUE); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + im = elm_image_add(win); + elm_image_file_set(im, "http://41.media.tumblr.com/29f1ecd4f98aaff73fb21f479b450d4c/tumblr_mqsxdciQmB1rrju89o1_1280.jpg", NULL); + evas_object_size_hint_weight_set(im, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(im, EVAS_HINT_FILL, EVAS_HINT_FILL); + + elm_box_pack_end(box, im); + evas_object_show(im); + + evas_object_data_set(win, "im", im); + + for (i = 0; images_orient[i].name; ++i) + { + rd = elm_radio_add(win); + evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + elm_radio_state_value_set(rd, images_orient[i].orient); + elm_object_text_set(rd, images_orient[i].name); + elm_box_pack_end(box, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", my_im_ch, win); + if (!rdg) + { + rdg = rd; + evas_object_data_set(win, "rdg", rdg); + } + else + { + elm_radio_group_add(rd, rdg); + } + } + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} + +static void +_img_clicked_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Elm_Transit *trans; + static int degree = 0; + + fprintf(stderr, "%p - clicked\n", obj); + + trans = elm_transit_add(); + elm_transit_object_add(trans, data); + if (degree == 0) + { + elm_transit_effect_rotation_add(trans, 0, 180); + degree = 180; + } + else + { + elm_transit_effect_rotation_add(trans, 180, 360); + degree = 0; + } + elm_transit_duration_set(trans, 3.0); + elm_transit_objects_final_state_keep_set(trans, EINA_TRUE); + elm_transit_go(trans); +} + +void +test_click_image(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *box, *im, *label; + + win = elm_win_util_standard_add("image test", "Image Test"); + elm_win_autodel_set(win, EINA_TRUE); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + im = elm_image_add(win); + elm_object_focus_allow_set(im, EINA_TRUE); + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get()); + elm_image_file_set(im, buf, NULL); + evas_object_size_hint_weight_set(im, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(im, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(im, "clicked", _img_clicked_cb, im); + elm_box_pack_end(box, im); + evas_object_show(im); + elm_object_focus_set(im, EINA_TRUE); + + label = elm_label_add(win); + elm_object_text_set(label, "<b>Press Return/Space/KP_Return key on image to transit.</b>"); + evas_object_size_hint_weight_set(label, 0.0, 0.0); + evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, label); + evas_object_show(label); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_index.c b/src/bin/elementary/test_index.c new file mode 100644 index 0000000000..085f8493db --- /dev/null +++ b/src/bin/elementary/test_index.c @@ -0,0 +1,585 @@ +#include "test.h" +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +struct _Idx_Data_Type +{ + Evas_Object *id; /* Pointer to Index */ + Elm_Object_Item *item; /* Item we use for search */ +}; +typedef struct _Idx_Data_Type Idx_Data_Type; + +struct _api_data +{ + unsigned int state; /* What state we are testing */ + Idx_Data_Type dt; +}; +typedef struct _api_data api_data; + +enum _api_state +{ + INDEX_LEVEL_SET, + INDEX_ACTIVE_SET, + INDEX_DELAY_CHANGE_TIME_SET, + INDEX_APPEND_RELATIVE, + INDEX_PREPEND, + INDEX_ITEM_DEL, + INDEX_ITEM_FIND, + INDEX_HORIZONTAL, + INDEX_INDICATOR_DISABLED, + INDEX_CLEAR, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + Idx_Data_Type *d = &api->dt; + switch(api->state) + { /* Put all api-changes under switch */ + case INDEX_LEVEL_SET: + elm_index_autohide_disabled_set(d->id, EINA_TRUE); + elm_index_item_level_set(d->id, (elm_index_item_level_get(d->id) ? 0 : 1)); + break; + + case INDEX_ACTIVE_SET: + elm_index_autohide_disabled_set(d->id, EINA_FALSE); + break; + + case INDEX_DELAY_CHANGE_TIME_SET: + elm_index_delay_change_time_set(d->id, 1.0); + break; + + case INDEX_APPEND_RELATIVE: + elm_index_item_insert_after(d->id, + elm_index_item_find(d->id, d->item), + "W", NULL, d->item); + elm_index_item_insert_before(d->id, + elm_index_item_find(d->id, d->item), + "V", NULL, d->item); + break; + + case INDEX_PREPEND: + elm_index_item_prepend(d->id, "D", NULL, d->item); + break; + + case INDEX_ITEM_DEL: + elm_object_item_del(elm_index_item_find(d->id, d->item)); + break; + + case INDEX_ITEM_FIND: + { + Elm_Object_Item *i = elm_index_item_find(d->id, d->item); + if (i) + { + printf("Item Find - Found Item.\n"); + elm_object_item_del(i); + } + } + break; + + case INDEX_HORIZONTAL: + elm_index_horizontal_set(d->id, EINA_TRUE); + break; + + case INDEX_INDICATOR_DISABLED: + elm_index_indicator_disabled_set(d->id, EINA_TRUE); + break; + + case INDEX_CLEAR: + elm_index_item_clear(d->id); + break; + + case API_STATE_LAST: + break; + + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(obj, str); + elm_object_disabled_set(obj, a->state == API_STATE_LAST); +} + +static Elm_Genlist_Item_Class itci; +static char * +_gli_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + char buf[256]; + int j = (uintptr_t)data; + snprintf(buf, sizeof(buf), "%c%c", + 'A' + ((j >> 4) & 0xf), + 'a' + ((j ) & 0xf) + ); + return strdup(buf); +} + +static void +_index_delay_changed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + // called on a change but delayed in case multiple changes happen in a + // short timespan + elm_genlist_item_bring_in(elm_object_item_data_get(event_info), + ELM_GENLIST_ITEM_SCROLLTO_TOP); +} + +static void +_index_changed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + // this is called on every change, no matter how often + // elm_genlist_item_bring_in(event_info); +} + +static void +_index_selected_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + // called on final select + elm_genlist_item_bring_in(elm_object_item_data_get(event_info), + ELM_GENLIST_ITEM_SCROLLTO_TOP); +} + +static void +_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + free(data); +} + +static void +_id_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("Current Index : %s\n", elm_index_item_letter_get((const Elm_Object_Item *)event_info)); +} + +static void +_omit_check_changed_cb(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Evas_Object *id = data; + Eina_Bool omit = elm_check_state_get(obj); + if (!id) return; + + printf("Omit feature enabled : %d\n", omit); + elm_index_omit_enabled_set(id, omit); +} + +void +test_index(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bxx, *gl, *id, *bt, *tb, *ck; + Elm_Object_Item *glit; + int i, j; + api_data *api = calloc(1, sizeof(api_data)); + + win = elm_win_util_standard_add("index", "Index"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bxx = elm_box_add(win); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bxx); + evas_object_show(bxx); + + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(tb); + + gl = elm_genlist_add(win); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, gl, 0, 0, 1, 1); + evas_object_show(gl); + + api->dt.id = id = elm_index_add(win); + evas_object_size_hint_weight_set(id, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(id, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_index_autohide_disabled_set(id, EINA_FALSE); + elm_table_pack(tb, id, 0, 0, 1, 1); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Next API function"); + evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, bt); + elm_object_disabled_set(bt, api->state == API_STATE_LAST); + evas_object_show(bt); + + ck = elm_check_add(win); + elm_object_text_set(ck, "Omit mode : "); + elm_object_style_set(ck, "toggle"); + elm_box_pack_end(bxx, ck); + evas_object_smart_callback_add(ck, "changed", _omit_check_changed_cb, id); + evas_object_show(ck); + + elm_box_pack_end(bxx, tb); + + evas_object_show(id); + + itci.item_style = "default"; + itci.func.text_get = _gli_text_get; + itci.func.content_get = NULL; + itci.func.state_get = NULL; + itci.func.del = NULL; + + j = 0; + for (i = 0; i < 100; i++) + { + glit = elm_genlist_item_append(gl, &itci, + (void *)(uintptr_t)j/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_NONE, + NULL/* func */, NULL/* func data */); + if (!(j & 0xf)) + { + char buf[32]; + + snprintf(buf, sizeof(buf), "%c", 'A' + ((j >> 4) & 0xf)); + elm_index_item_append(id, buf, _id_cb, glit); + if (*buf == 'G') /* Just init dt->item later used in API test */ + api->dt.item = glit; + } + j += 2; + } + evas_object_smart_callback_add(id, "delay,changed", _index_delay_changed_cb, NULL); + evas_object_smart_callback_add(id, "changed", _index_changed_cb, NULL); + evas_object_smart_callback_add(id, "selected", _index_selected_cb, NULL); + elm_index_level_go(id, 0); + + evas_object_resize(win, 320, 270); + evas_object_show(win); +} + +/***********/ + +typedef struct _Test_Index2_Elements +{ + Evas_Object *entry, *lst, *id; +} Test_Index2_Elements; + +static void +_test_index2_del(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + /* FIXME it won't be called if elm_test main window is closed */ + free(data); +} + +static int +_test_index2_cmp(const void *data1, const void *data2) +{ + const char *label1, *label2; + const Elm_Object_Item *li_it1 = data1; + const Elm_Object_Item *li_it2 = data2; + + label1 = elm_object_item_text_get(li_it1); + label2 = elm_object_item_text_get(li_it2); + + return strcasecmp(label1, label2); +} + +static int +_test_index2_icmp(const void *data1, const void *data2) +{ + const char *label1, *label2; + const Elm_Object_Item *index_it1 = data1; + const Elm_Object_Item *index_it2 = data2; + + label1 = elm_index_item_letter_get(index_it1); + label2 = elm_index_item_letter_get(index_it2); + + return strcasecmp(label1, label2); +} + +static void +_test_index2_it_add(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Test_Index2_Elements *gui = data; + Elm_Object_Item *list_it; + const char *label; + char letter[2]; + + label = elm_object_text_get(gui->entry); + snprintf(letter, sizeof(letter), "%c", label[0]); + list_it = elm_list_item_sorted_insert(gui->lst, label, NULL, NULL, NULL, + NULL, _test_index2_cmp); + elm_index_item_sorted_insert(gui->id, letter, NULL, list_it, _test_index2_icmp, + _test_index2_cmp); + elm_index_level_go(gui->id, 0); + elm_list_go(gui->lst); + /* FIXME it's not showing the recently added item */ + elm_list_item_show(list_it); +} + +static void +_test_index2_clear(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Test_Index2_Elements *gui = data; + + elm_list_clear(gui->lst); + elm_index_item_clear(gui->id); +} + +static void +_test_index2_it_del(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Test_Index2_Elements *gui = data; + const char *label, *label_next; + Elm_Object_Item *list_it = event_info, *list_it_next, *iit; + + list_it_next = elm_list_item_next(list_it); + if (!list_it_next) + { + iit = elm_index_item_find(gui->id, list_it); + if (iit) elm_object_item_del(iit); + elm_object_item_del(list_it); + return; + } + + label = elm_object_item_text_get(list_it); + label_next = elm_object_item_text_get(list_it_next); + + iit = elm_index_item_find(gui->id, list_it); + if (iit) + { + if (label[0] == label_next[0]) + elm_object_item_data_set(iit, list_it_next); + else + elm_object_item_del(iit); + } + + elm_object_item_del(list_it); +} + +static void +_test_index2_id_changed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + elm_list_item_show(elm_object_item_data_get(event_info)); +} + +void +test_index2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *box, *bt; + Test_Index2_Elements *gui; + + gui = malloc(sizeof(*gui)); + + win = elm_win_util_standard_add("sorted-index-list", "Sorted Index and List"); + evas_object_smart_callback_add(win, "delete,request", _test_index2_del, gui); + elm_win_autodel_set(win, EINA_TRUE); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + gui->id = elm_index_add(win); + evas_object_size_hint_weight_set(gui->id, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, gui->id); + evas_object_smart_callback_add(gui->id, "delay,changed", + _test_index2_id_changed, NULL); + evas_object_show(gui->id); + + gui->entry = elm_entry_add(win); + elm_entry_scrollable_set(gui->entry, EINA_TRUE); + elm_object_text_set(gui->entry, "Label"); + elm_entry_single_line_set(gui->entry, EINA_TRUE); + evas_object_size_hint_weight_set(gui->entry, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_fill_set(gui->entry, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(gui->entry, "activated", _test_index2_it_add, gui); + elm_box_pack_end(box, gui->entry); + evas_object_show(gui->entry); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Add"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, bt); + evas_object_smart_callback_add(bt, "clicked", _test_index2_it_add, gui); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Clear"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, bt); + evas_object_smart_callback_add(bt, "clicked", _test_index2_clear, gui); + evas_object_show(bt); + + gui->lst = elm_list_add(win); + elm_box_pack_end(box, gui->lst); + evas_object_size_hint_weight_set(gui->lst, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(gui->lst, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(gui->lst, "selected", _test_index2_it_del, + gui); + elm_list_go(gui->lst); + evas_object_show(gui->lst); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} + +/***** Index 3 Mode ******/ + +static void +_index_priority_change_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *index = data; + int priority; + + priority = elm_index_standard_priority_get(index); + + if (priority == 0) + elm_index_standard_priority_set(index, 1); + else + elm_index_standard_priority_set(index, 0); + + printf("Priority changed to : %d\n", elm_index_standard_priority_get(index)); +} + +void +test_index3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *index, *bt; + Elm_Object_Item *it; + int i, j, len; + char *str; + char buf[PATH_MAX] = {0, }; + + win = elm_win_util_standard_add("Index-priority", "Index priority for multilingual"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + index = elm_index_add(win); + evas_object_size_hint_weight_set(index, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(index, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_index_autohide_disabled_set(index, EINA_TRUE); + elm_index_omit_enabled_set(index, EINA_TRUE); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Priority Change"); + evas_object_smart_callback_add(bt, "clicked", _index_priority_change_cb, index); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, index); + + evas_object_show(index); + + //1. Special character & Numbers + elm_index_item_append(index, "#", NULL, NULL); + + //2. Local language + str = "ㄱㄴㄷㄹㅁㅂㅅㅇㅈㅊㅍㅎ"; + len = strlen(str); + + i = 0; + while (i < len) + { + j = i; + eina_unicode_utf8_next_get(str, &i); + snprintf(buf, i - j + 1, "%s", str + j); + buf[i - j + 1] = 0; + + it = elm_index_item_append(index, buf, NULL, NULL); + elm_index_item_priority_set(it, 0); + } + + //3. English + str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + len = strlen(str); + + i = 0; + while (i < len) + { + j = i; + eina_unicode_utf8_next_get(str, &i); + snprintf(buf, i - j + 1, "%s", str + j); + buf[i - j + 1] = 0; + + it = elm_index_item_append(index, buf, NULL, NULL); + elm_index_item_priority_set(it, 1); + } + + elm_index_level_go(index, 0); + + evas_object_resize(win, 300, 300); + evas_object_show(win); +} + +/***** Index Horizontal Mode ******/ + +static void +_index_list_changed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + elm_list_item_bring_in(elm_object_item_data_get(event_info)); +} + +void +test_index_horizontal(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *list, *id, *tb; + Elm_Object_Item *lit; + int i; + char buf[30]; + + api_data *api = calloc(1, sizeof(api_data)); + + win = elm_win_util_standard_add("index-horizontal", "Index Horizontal"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, tb); + evas_object_show(tb); + + list = elm_list_add(win); + elm_list_horizontal_set(list, EINA_TRUE); + 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); + elm_table_pack(tb, list, 0, 0, 1, 1); + evas_object_show(list); + + api->dt.id = id = elm_index_add(win); + elm_index_horizontal_set(id, EINA_TRUE); + evas_object_size_hint_weight_set(id, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(id, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, id, 0, 0, 1, 1); + evas_object_show(id); + + for (i = 1; i < 15; i++) + { + sprintf(buf, "Item #%d", i); + lit = elm_list_item_append(list, buf, NULL, NULL, NULL, NULL); + sprintf(buf, "%d", i); + elm_index_item_append(id, buf, _id_cb, lit); + } + evas_object_smart_callback_add(id, "changed", _index_list_changed_cb, NULL); + elm_index_level_go(id, 0); + + evas_object_resize(win, 480, 320); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_inwin.c b/src/bin/elementary/test_inwin.c new file mode 100644 index 0000000000..9dae4c091d --- /dev/null +++ b/src/bin/elementary/test_inwin.c @@ -0,0 +1,129 @@ +#include "test.h" +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +struct _api_data +{ + unsigned int state; /* What state we are testing */ + void *inwin; +}; +typedef struct _api_data api_data; + +enum _api_state +{ + CONTENT_UNSET, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + Evas_Object *t; + switch(api->state) + { + case CONTENT_UNSET: + t = elm_win_inwin_content_unset(api->inwin); + evas_object_del(t); + t = elm_label_add(elm_object_parent_widget_get(api->inwin)); + elm_object_text_set(t, "Content was unset.<br>DONE!"); + elm_win_inwin_content_set(api->inwin, t); + evas_object_show(t); + + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(obj, str); + elm_object_disabled_set(obj, a->state == API_STATE_LAST); +} + +static void +_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + free(data); +} + +void +test_inwin(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *inwin, *lb, *bxx, *bt; + api_data *api = calloc(1, sizeof(api_data)); + + win = elm_win_util_standard_add("inwin", "InWin"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + inwin = elm_win_inwin_add(win); + api->inwin = inwin; + evas_object_show(inwin); + + bxx = elm_box_add(inwin); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bxx); + + bt = elm_button_add(inwin); + elm_object_text_set(bt, "Next API function"); + evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, bt); + elm_object_disabled_set(bt, api->state == API_STATE_LAST); + evas_object_show(bt); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "This is an \"inwin\" - a window in a<br/>" + "window. This is handy for quick popups<br/>" + "you want centered, taking over the window<br/>" + "until dismissed somehow. Unlike hovers they<br/>" + "don't hover over their target."); + elm_box_pack_end(bxx, lb); + elm_win_inwin_content_set(inwin, bxx); + evas_object_show(lb); + + evas_object_resize(win, 320, 240); + evas_object_show(win); +} + +void +test_inwin2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *inwin, *lb; + + win = elm_win_util_standard_add("inwin2", "InWin 2"); + elm_win_autodel_set(win, EINA_TRUE); + + inwin = elm_win_inwin_add(win); + elm_object_style_set(inwin, "minimal_vertical"); + evas_object_show(inwin); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "This is an \"inwin\" - a window in a<br/>" + "window. This is handy for quick popups<br/>" + "you want centered, taking over the window<br/>" + "until dismissed somehow. Unlike hovers they<br/>" + "don't hover over their target.<br/>" + "<br/>" + "This \"minimal_vertical\" inwin style compacts<br/>" + "itself vertically to the size of its contents<br/> " + "minimum size."); + elm_win_inwin_content_set(inwin, lb); + evas_object_show(lb); + + evas_object_resize(win, 320, 240); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_label.c b/src/bin/elementary/test_label.c new file mode 100644 index 0000000000..8aaf2ef72e --- /dev/null +++ b/src/bin/elementary/test_label.c @@ -0,0 +1,376 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +enum _slide_style +{ + SLIDE_SHORT, + SLIDE_LONG, + SLIDE_BOUNCE, + SLIDE_STYLE_LAST +}; + +/*** Label *******************************************************************/ +void +test_label(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *lb; + + win = elm_win_util_standard_add("label", "Label"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "<b>This is a small label</b>" + ); + evas_object_size_hint_weight_set(lb, 0.0, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "This is a larger label with newlines<br/>" + "to make it bigger, bit it won't expand or wrap<br/>" + "just be a block of text that can't change its<br/>" + "formatting as it's fixed based on text<br/>" + ); + evas_object_size_hint_weight_set(lb, 0.0, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + lb = elm_label_add(win); + elm_label_line_wrap_set(lb, ELM_WRAP_CHAR); + elm_object_text_set(lb, + "<b>" + "This is more text designed to line-wrap here as " + "This object is resized horizontally. As it is " + "resized vertically though, nothing should change. " + "The amount of space allocated vertically should " + "change as horizontal size changes." + "</b>" + ); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "This small label set to wrap" + ); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "You can also use all the default entry style tags, like " + "<hilight>hilight</hilight>, <success>success</success>, " + "<bigger>bigger</bigger>, <smaller>smaller</smaller>, etc..." + ); + elm_label_line_wrap_set(lb, ELM_WRAP_WORD); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + evas_object_resize(win, 320, 300); + + evas_object_show(bx); + evas_object_show(win); + elm_win_resize_object_add(win, bx); +} + +/*** Label Slide *************************************************************/ +static void +_cb_size_radio_changed(void *data, Evas_Object *obj, void *event EINA_UNUSED) +{ + Evas_Object *lb = data; + int style = elm_radio_value_get((Evas_Object *)obj); + switch (style) + { + case SLIDE_SHORT: + elm_object_style_set(lb, "slide_short"); + break; + + case SLIDE_LONG: + elm_object_style_set(lb, "slide_long"); + break; + + case SLIDE_BOUNCE: + elm_object_style_set(lb, "slide_bounce"); + break; + + default: + return; + } +} + +static void +_duration_change_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *lb = data; + double val = elm_slider_value_get(obj); + + elm_label_slide_duration_set(lb, val); + elm_label_slide_go(lb); + + Evas_Object *sl = evas_object_data_get(lb, "speed_slider"); + elm_slider_value_set(sl, elm_label_slide_speed_get(lb)); +} + +static void +_speed_change_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *lb = data; + double val = elm_slider_value_get(obj); + + elm_label_slide_speed_set(lb, val); + elm_label_slide_go(lb); + + Evas_Object *sl = evas_object_data_get(lb, "duration_slider"); + elm_slider_value_set(sl, elm_label_slide_duration_get(lb)); +} + +static void +_label_resize_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Evas_Object *speed_slider = evas_object_data_get(obj, "speed_slider"); + Evas_Object *duration_slider = evas_object_data_get(obj, "duration_slider"); + + elm_slider_value_set(duration_slider, elm_label_slide_duration_get(obj)); + elm_slider_value_set(speed_slider, elm_label_slide_speed_get(obj)); +} + +static void +_label_slide_stop_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Eina_List *lbs = data, *itr; + Evas_Object *lb; + EINA_LIST_FOREACH(lbs, itr, lb) + { + elm_label_slide_speed_set(lb, 0.01); + elm_label_slide_go(lb); + } +} + +void +test_label_slide(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *gd, *rect, *lb, *lb1, *lb2, *rd, *rdg, *sl, *bt; + Eina_List *lbs = NULL; + + win = elm_win_util_standard_add("label-slide", "Label Slide"); + elm_win_autodel_set(win, EINA_TRUE); + + gd = elm_grid_add(win); + elm_grid_size_set(gd, 100, 100); + evas_object_size_hint_weight_set(gd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, gd); + evas_object_show(gd); + + /* Test Label Slide */ + lb = elm_label_add(win); + elm_object_text_set(lb, "<b>Test Label Slide:</b>"); + elm_grid_pack(gd, lb, 5, 0, 90, 10); + evas_object_show(lb); + + rect = evas_object_rectangle_add(evas_object_evas_get(win)); + elm_grid_pack(gd, rect, 5, 10, 90, 10); + evas_object_color_set(rect, 255, 125, 125, 255); + evas_object_show(rect); + + lb = elm_label_add(win); + elm_object_style_set(lb, "slide_short"); + elm_object_text_set(lb, + "This is a label set to slide. " + "If set slide to true the text of the label " + "will slide/scroll through the length of label." + "This only works with the themes \"slide_short\", " + "\"slide_long\" and \"slide_bounce\"." + ); + elm_label_slide_mode_set(lb, ELM_LABEL_SLIDE_MODE_AUTO); + elm_label_slide_speed_set(lb, 40.0); + elm_label_slide_go(lb); + elm_grid_pack(gd, lb, 5, 10, 90, 10); + evas_object_show(lb); + lbs = eina_list_append(lbs, lb); + + /* The speed or the duration of the slide animation will change when the + * label change size, so we need to update the sliders on resize. */ + evas_object_event_callback_add(lb, EVAS_CALLBACK_RESIZE, _label_resize_cb, NULL); + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, SLIDE_SHORT); + elm_object_text_set(rd, "slide_short"); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_smart_callback_add(rd, "changed", _cb_size_radio_changed, lb); + elm_grid_pack(gd, rd, 5, 20, 30, 10); + evas_object_show(rd); + rdg = rd; + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, SLIDE_LONG); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "slide_long"); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_smart_callback_add(rd, "changed", _cb_size_radio_changed, lb); + elm_grid_pack(gd, rd, 35, 20, 30, 10); + evas_object_show(rd); + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, SLIDE_BOUNCE); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "slide_bounce"); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_smart_callback_add(rd, "changed", _cb_size_radio_changed, lb); + elm_grid_pack(gd, rd, 65, 20, 30, 10); + evas_object_show(rd); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "Slide Duration"); + elm_slider_unit_format_set(sl, "%1.1f sec"); + elm_slider_min_max_set(sl, 3, 40); + elm_slider_value_set(sl, elm_label_slide_duration_get(lb)); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_smart_callback_add(sl, "changed", _duration_change_cb, lb); + evas_object_data_set(lb, "duration_slider", sl); + elm_grid_pack(gd, sl, 5, 30, 90, 10); + evas_object_show(sl); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "Slide Speed"); + elm_slider_unit_format_set(sl, "%1.1f px/sec"); + elm_slider_min_max_set(sl, 40, 300); + elm_slider_value_set(sl, elm_label_slide_speed_get(lb)); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_smart_callback_add(sl, "changed", _speed_change_cb, lb); + evas_object_data_set(lb, "speed_slider", sl); + elm_grid_pack(gd, sl, 5, 40, 90, 10); + evas_object_show(sl); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Stop sliding"); + elm_grid_pack(gd, bt, 40, 50, 20, 10); + evas_object_show(bt); + + /* Test 2 label at the same speed */ + lb = elm_label_add(win); + elm_object_text_set(lb, "<b>Test 2 label with the same speed:</b>"); + elm_grid_pack(gd, lb, 5, 60, 90, 10); + evas_object_show(lb); + + rect = evas_object_rectangle_add(evas_object_evas_get(win)); + elm_grid_pack(gd, rect, 5, 70, 90, 20); + evas_object_color_set(rect, 255, 125, 125, 255); + evas_object_show(rect); + + lb1 = elm_label_add(win); + elm_object_style_set(lb1, "slide_short"); + elm_object_text_set(lb1, "This is a label set to slide with a fixed speed," + " should match the speed with the below label." + " This label has few extra char for testing."); + elm_label_slide_mode_set(lb1, ELM_LABEL_SLIDE_MODE_ALWAYS); + elm_label_slide_speed_set(lb1, 40.0); + elm_label_slide_go(lb1); + elm_grid_pack(gd, lb1, 5, 70, 90, 10); + evas_object_show(lb1); + lbs = eina_list_append(lbs, lb1); + + lb2 = elm_label_add(win); + elm_object_style_set(lb2, "slide_long"); + elm_object_text_set(lb2, "This is a label set to slide and will" + " match the speed of the upper label."); + elm_label_slide_mode_set(lb2, ELM_LABEL_SLIDE_MODE_ALWAYS); + elm_label_slide_speed_set(lb2, 40.0); + elm_label_slide_go(lb2); + elm_grid_pack(gd, lb2, 5, 80, 90, 10); + evas_object_show(lb2); + lbs = eina_list_append(lbs, lb2); + + evas_object_smart_callback_add(bt, "clicked", _label_slide_stop_cb, lbs); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} + +/*** Label Wrap **************************************************************/ +void +test_label_wrap(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *lb; + + win = elm_win_util_standard_add("label-wrap", "Label Wrap"); + elm_win_autodel_set(win, EINA_TRUE); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "This is text for our label, that is long but " + "not too long. The label is designed to have line-wrap." + ); + elm_label_line_wrap_set(lb, ELM_WRAP_CHAR); + elm_label_wrap_width_set(lb, ELM_SCALE_SIZE(200)); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, lb); + evas_object_show(lb); + + evas_object_show(win); +} + + +/*** Label Ellipsis **********************************************************/ +void +test_label_ellipsis(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *lb; + + win = elm_win_util_standard_add("label-ellipsis", "Label Ellipsis"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + elm_box_padding_set(bx, 0, ELM_SCALE_SIZE(10)); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "This is a label set to ellipsis. " + "If set ellipsis to true and the text doesn't fit " + "in the label an ellipsis(\"...\") will be shown " + "at the end of the widget." + ); + elm_label_ellipsis_set(lb, EINA_TRUE); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, 0.0); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "<big>" + "This label also have <b>markups</b>, " + "<hilight>hilight</hilight>, " + "<success>success</success>, " + "<failure>failure</failure>." + "</big>" + ); + elm_label_ellipsis_set(lb, EINA_TRUE); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, 0.0); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + evas_object_resize(win, 300, 100); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_launcher.c b/src/bin/elementary/test_launcher.c new file mode 100644 index 0000000000..910fa6998f --- /dev/null +++ b/src/bin/elementary/test_launcher.c @@ -0,0 +1,921 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void +mode_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + Evas_Object *mb; + Eina_List *mbs, *l; + + mbs = evas_object_data_get(win, "mbs"); + EINA_LIST_FOREACH(mbs, l, mb) + { + if (elm_mapbuf_enabled_get(mb)) + elm_mapbuf_enabled_set(mb, EINA_FALSE); + else + elm_mapbuf_enabled_set(mb, EINA_TRUE); + } +} + +static void +full_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + elm_win_fullscreen_set(win, !elm_win_fullscreen_get(win)); +} + +static void +alpha_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + Evas_Object *mb; + Eina_List *mbs, *l; + + mbs = evas_object_data_get(win, "mbs"); + EINA_LIST_FOREACH(mbs, l, mb) + { + elm_mapbuf_alpha_set(mb, elm_check_state_get(obj)); + } +} + +static void +smooth_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + Evas_Object *mb; + Eina_List *mbs, *l; + + mbs = evas_object_data_get(win, "mbs"); + EINA_LIST_FOREACH(mbs, l, mb) + { + elm_mapbuf_smooth_set(mb, elm_check_state_get(obj)); + } +} + +static void +close_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + evas_object_del(data); +} + +static Eina_Bool +tim_cb(void *data) +{ + Evas_Object *tb, *sc, *mb; + Eina_List *list, *l; + + evas_object_data_del(data, "timer"); + tb = evas_object_data_get(data, "tb"); + sc = evas_object_data_get(data, "sc"); + elm_object_scroll_freeze_push(sc); + evas_object_data_set(data, "dragging", (void *)(long)(1)); + evas_object_color_set(data, 255, 255, 255, 255); + list = (Eina_List *)evas_object_data_get + (elm_object_top_widget_get(data), "mbs"); + EINA_LIST_FOREACH(list, l, mb) + evas_object_color_set(mb, 128, 128, 128, 128); + elm_table_unpack(tb, data); + return EINA_FALSE; +} + +static void +ic_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Ecore_Timer *tim; + + tim = evas_object_data_get(obj, "timer"); + if (tim) + { + evas_object_data_del(obj, "timer"); + ecore_timer_del(tim); + } +} + +static void +ic_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Down *ev = event_info; + Ecore_Timer *tim; + Evas_Coord x, y, w, h; + + evas_object_color_set(data, 128, 0, 0, 128); + + tim = evas_object_data_get(obj, "timer"); + if (tim) evas_object_data_del(obj, "timer"); + tim = ecore_timer_add(1.0, tim_cb, obj); + evas_object_data_set(obj, "timer", tim); + + evas_object_geometry_get(data, &x, &y, &w, &h); + evas_object_data_set(obj, "x", (void *)(uintptr_t)(ev->canvas.x)); + evas_object_data_set(obj, "y", (void *)(uintptr_t)(ev->canvas.y)); + evas_object_data_set(obj, "px", (void *)(uintptr_t)(x)); + evas_object_data_set(obj, "py", (void *)(uintptr_t)(y)); + + if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK) + { + printf("double click %p\n", obj); + } +} + +static void +ic_up_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Up *ev = event_info; + Ecore_Timer *tim; + + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return; + evas_object_color_set(data, 255, 255, 255, 255); + tim = evas_object_data_get(obj, "timer"); + if (tim) + { + evas_object_data_del(obj, "timer"); + ecore_timer_del(tim); + } + if (evas_object_data_get(obj, "dragging")) + { + Evas_Object *tb, *sc, *mb; + Eina_List *list, *l; + int tbx, tby; + + evas_object_data_del(obj, "dragging"); + tb = evas_object_data_get(obj, "tb"); + sc = evas_object_data_get(obj, "sc"); + elm_object_scroll_freeze_pop(sc); + tbx = (int)(uintptr_t)evas_object_data_get(obj, "tbx"); + tby = (int)(uintptr_t)evas_object_data_get(obj, "tby"); + elm_table_pack(tb, obj, tbx, tby, 1, 1); + list = (Eina_List *)evas_object_data_get + (elm_object_top_widget_get(obj), "mbs"); + EINA_LIST_FOREACH(list, l, mb) + evas_object_color_set(mb, 255, 255, 255, 255); + } +} + +static void +ic_move_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Move *ev = event_info; + if (evas_object_data_get(obj, "dragging")) + { + Evas_Coord x, y, px, py; + + x = (Evas_Coord)(uintptr_t)evas_object_data_get(obj, "x"); + y = (Evas_Coord)(uintptr_t)evas_object_data_get(obj, "y"); + px = (Evas_Coord)(uintptr_t)evas_object_data_get(obj, "px"); + py = (Evas_Coord)(uintptr_t)evas_object_data_get(obj, "py"); + evas_object_move(obj, + px + ev->cur.canvas.x - x, + py + ev->cur.canvas.y - y); + } + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) + { + Ecore_Timer *tim; + + tim = evas_object_data_get(obj, "timer"); + if (tim) + { + evas_object_data_del(obj, "timer"); + ecore_timer_del(tim); + } + evas_object_color_set(data, 255, 255, 255, 255); + return; + } +} + +void +test_launcher(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bg, *sc, *tb, *pad, *bt, *ic, *lb, *tb2, *mb, *ck, *bx, *bx2; + int i, j, k, n, m; + char buf[PATH_MAX]; + const char *names[] = + { + "Hello", "World", "Spam", "Egg", + "Ham", "Good", "Bad", "Milk", + "Smell", "Of", "Sky", "Gold", + "Hole", "Pig", "And", "Calm" + }; + Eina_List *mbs = NULL; + + win = elm_win_add(NULL, "launcher", ELM_WIN_BASIC); + elm_win_title_set(win, "Launcher"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/sky_04.jpg", elm_app_data_dir_get()); + elm_bg_file_set(bg, buf, NULL); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + bx = elm_box_add(win); + elm_box_homogeneous_set(bx, EINA_TRUE); + elm_box_horizontal_set(bx, EINA_TRUE); + + sc = elm_scroller_add(win); + elm_scroller_bounce_set(sc, EINA_TRUE, EINA_FALSE); + elm_scroller_policy_set(sc, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL); + + n = 0; m = 0; + for (k = 0 ; k < 8; k++) + { + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, 0.0, 0.0); + evas_object_size_hint_align_set(tb, 0.5, 0.5); + + pad = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_min_set(pad, 470, 4); + evas_object_size_hint_weight_set(pad, 0.0, 0.0); + evas_object_size_hint_align_set(pad, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, pad, 1, 0, 5, 1); + + pad = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_min_set(pad, 470, 4); + evas_object_size_hint_weight_set(pad, 0.0, 0.0); + evas_object_size_hint_align_set(pad, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, pad, 1, 11, 5, 1); + + pad = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_min_set(pad, 4, 4); + evas_object_size_hint_weight_set(pad, 0.0, 0.0); + evas_object_size_hint_align_set(pad, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, pad, 0, 1, 1, 10); + + pad = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_min_set(pad, 4, 4); + evas_object_size_hint_weight_set(pad, 0.0, 0.0); + evas_object_size_hint_align_set(pad, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, pad, 6, 1, 1, 10); + + mb = elm_mapbuf_add(win); + elm_object_content_set(mb, tb); + evas_object_show(tb); + + for (j = 0; j < 5; j++) + { + for (i = 0; i < 5; i++) + { + ic = elm_icon_add(win); + elm_object_scale_set(ic, 0.5); + snprintf(buf, sizeof(buf), "%s/images/icon_%02i.png", elm_app_data_dir_get(), n); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ic, 0.5, 0.5); + elm_table_pack(tb, ic, 1 + i, 1 + (j * 2), 1, 1); + evas_object_show(ic); + + lb = elm_label_add(win); + elm_object_style_set(lb, "marker"); + elm_object_text_set(lb, names[m]); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(lb, 0.5, 0.5); + elm_table_pack(tb, lb, 1 + i, 1 + (j * 2) + 1, 1, 1); + evas_object_show(lb); + + evas_object_event_callback_add(ic, EVAS_CALLBACK_DEL, ic_del_cb, ic); + + evas_object_event_callback_add(ic, EVAS_CALLBACK_MOUSE_DOWN, ic_down_cb, ic); + evas_object_event_callback_add(ic, EVAS_CALLBACK_MOUSE_UP, ic_up_cb, ic); + evas_object_event_callback_add(ic, EVAS_CALLBACK_MOUSE_MOVE, ic_move_cb, ic); + + evas_object_data_set(ic, "lb", lb); + evas_object_data_set(ic, "tb", tb); + evas_object_data_set(ic, "sc", sc); + evas_object_data_set(ic, "bx", bx); + evas_object_data_set(ic, "mb", mb); + evas_object_data_set(ic, "tbx", (void *)(uintptr_t)(1 + i)); + evas_object_data_set(ic, "tby", (void *)(uintptr_t)(1 + (j * 2))); + + n++; if (n > 23) n = 0; + m++; if (m > 15) m = 0; + } + } + + elm_box_pack_end(bx, mb); + evas_object_show(mb); + + mbs = eina_list_append(mbs, mb); + } + + // fixme: free mbs + evas_object_data_set(win, "mbs", mbs); + + bx2 = elm_box_add(win); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_horizontal_set(bx2, EINA_FALSE); + elm_win_resize_object_add(win, bx2); + evas_object_show(bx2); + + elm_object_content_set(sc, bx); + evas_object_show(bx); + + elm_scroller_page_relative_set(sc, 1.0, 1.0); + evas_object_show(sc); + + tb2 = elm_table_add(win); + evas_object_size_hint_weight_set(tb2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(tb2, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx2, tb2); + + elm_box_pack_end(bx2, sc); + + ck = elm_check_add(win); + elm_object_text_set(ck, "Map"); + elm_check_state_set(ck, EINA_FALSE); + evas_object_smart_callback_add(ck, "changed", mode_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.05, 0.99); + elm_table_pack(tb2, ck, 0, 0, 1, 1); + evas_object_show(ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "A"); + elm_check_state_set(ck, EINA_TRUE); + evas_object_smart_callback_add(ck, "changed", alpha_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.20, 0.99); + elm_table_pack(tb2, ck, 1, 0, 1, 1); + evas_object_show(ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "Smo"); + elm_check_state_set(ck, EINA_TRUE); + evas_object_smart_callback_add(ck, "changed", smooth_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.40, 0.99); + elm_table_pack(tb2, ck, 2, 0, 1, 1); + evas_object_show(ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "FS"); + elm_check_state_set(ck, EINA_FALSE); + evas_object_smart_callback_add(ck, "changed", full_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.5, 0.99); + elm_table_pack(tb2, ck, 3, 0, 1, 1); + evas_object_show(ck); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", close_cb, win); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.95, 0.99); + elm_table_pack(tb2, bt, 4, 0, 1, 1); + evas_object_show(bt); + + evas_object_show(tb2); + + evas_object_resize(win, 480, 400); + evas_object_show(win); +} + +void +test_launcher2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bg, *sc, *bt, *tb2, *mb, *ck, *bx, *ly; + int k; + char buf[PATH_MAX]; + Eina_List *mbs = NULL; + + win = elm_win_add(NULL, "launcher2", ELM_WIN_BASIC); + elm_win_title_set(win, "Launcher 2"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/sky_03.jpg", elm_app_data_dir_get()); + elm_bg_file_set(bg, buf, NULL); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + bx = elm_box_add(win); + elm_box_homogeneous_set(bx, EINA_TRUE); + elm_box_horizontal_set(bx, EINA_TRUE); + + for (k = 0 ; k < 8; k++) + { + ly = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "layout"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 1"); + elm_object_part_content_set(ly, "element1", bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 2"); + elm_object_part_content_set(ly, "element2", bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 3"); + elm_object_part_content_set(ly, "element3", bt); + evas_object_show(bt); + + mb = elm_mapbuf_add(win); + elm_object_content_set(mb, ly); + evas_object_show(ly); + + elm_box_pack_end(bx, mb); + evas_object_show(mb); + + mbs = eina_list_append(mbs, mb); + } + + // fixme: free mbs + evas_object_data_set(win, "mbs", mbs); + + sc = elm_scroller_add(win); + elm_scroller_bounce_set(sc, EINA_TRUE, EINA_FALSE); + elm_scroller_policy_set(sc, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, sc); + + elm_object_content_set(sc, bx); + evas_object_show(bx); + + //content size of one page is 550 x 410 + elm_scroller_page_size_set(sc, 555, 410); + evas_object_show(sc); + + tb2 = elm_table_add(win); + evas_object_size_hint_weight_set(tb2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, tb2); + + ck = elm_check_add(win); + elm_object_text_set(ck, "Map"); + elm_check_state_set(ck, EINA_FALSE); + evas_object_smart_callback_add(ck, "changed", mode_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.05, 0.99); + elm_table_pack(tb2, ck, 0, 0, 1, 1); + evas_object_show(ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "A"); + elm_check_state_set(ck, EINA_TRUE); + evas_object_smart_callback_add(ck, "changed", alpha_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.20, 0.99); + elm_table_pack(tb2, ck, 1, 0, 1, 1); + evas_object_show(ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "Smo"); + elm_check_state_set(ck, EINA_TRUE); + evas_object_smart_callback_add(ck, "changed", smooth_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.40, 0.99); + elm_table_pack(tb2, ck, 2, 0, 1, 1); + evas_object_show(ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "FS"); + elm_check_state_set(ck, EINA_FALSE); + evas_object_smart_callback_add(ck, "changed", full_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.5, 0.99); + elm_table_pack(tb2, ck, 3, 0, 1, 1); + evas_object_show(ck); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", close_cb, win); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.95, 0.99); + elm_table_pack(tb2, bt, 4, 0, 1, 1); + evas_object_show(bt); + + evas_object_show(tb2); + + evas_object_resize(win, 555, 410); + evas_object_show(win); +} + +static void +l3_mode_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + Evas_Object *mb; + Eina_List *mbs, *l; + + mbs = evas_object_data_get(win, "mbs"); + EINA_LIST_FOREACH(mbs, l, mb) + { + if (elm_mapbuf_enabled_get(mb)) + elm_mapbuf_enabled_set(mb, EINA_FALSE); + else + elm_mapbuf_enabled_set(mb, EINA_TRUE); + } +} + +static void +l3_full_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + elm_win_fullscreen_set(win, !elm_win_fullscreen_get(win)); +} + +static void +l3_alpha_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + Evas_Object *mb; + Eina_List *mbs, *l; + + mbs = evas_object_data_get(win, "mbs"); + EINA_LIST_FOREACH(mbs, l, mb) + { + elm_mapbuf_alpha_set(mb, elm_check_state_get(obj)); + } +} + +static void +l3_smooth_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + Evas_Object *mb; + Eina_List *mbs, *l; + + mbs = evas_object_data_get(win, "mbs"); + EINA_LIST_FOREACH(mbs, l, mb) + { + elm_mapbuf_smooth_set(mb, elm_check_state_get(obj)); + } +} + +static void +l3_hidden_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + Evas_Object *mb; + Eina_List *mbs, *l; + + mbs = evas_object_data_get(win, "mbs"); + EINA_LIST_FOREACH(mbs, l, mb) + { + if (evas_object_visible_get(mb)) evas_object_hide(mb); + else evas_object_show(mb); + } +} + +static void +l3_close_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + evas_object_del(data); +} + +static Eina_Bool +l3_tim_cb(void *data) +{ + Evas_Object *ly, *ly2, *sc, *mb; + Eina_List *list, *l; + char buf[256]; + int slx, sly; + + evas_object_data_del(data, "timer"); + ly = evas_object_data_get(data, "ly"); + ly2 = evas_object_data_get(data, "ly2"); + sc = evas_object_data_get(data, "sc"); + elm_object_scroll_freeze_push(sc); + evas_object_data_set(data, "dragging", (void *)(long)1); + evas_object_color_set(data, 255, 255, 255, 255); + list = (Eina_List *)evas_object_data_get + (elm_object_top_widget_get(data), "mbs"); + EINA_LIST_FOREACH(list, l, mb) + evas_object_color_set(mb, 128, 128, 128, 128); + slx = (int)(uintptr_t)evas_object_data_get(data, "slx"); + sly = (int)(uintptr_t)evas_object_data_get(data, "sly"); + snprintf(buf, sizeof(buf), "slot.%i.%i", slx, sly); + elm_object_part_content_unset(ly, buf); + elm_layout_signal_emit(ly2, "drag", "app"); + return EINA_FALSE; +} + +static void +l3_ic_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Ecore_Timer *tim; + + tim = evas_object_data_get(obj, "timer"); + if (tim) + { + evas_object_data_del(obj, "timer"); + ecore_timer_del(tim); + } +} + +static void +l3_ic_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Down *ev = event_info; + Ecore_Timer *tim; + Evas_Coord x, y, w, h; + Evas_Object *ly2; + + tim = evas_object_data_get(obj, "timer"); + if (tim) evas_object_data_del(obj, "timer"); + tim = ecore_timer_add(1.0, l3_tim_cb, obj); + evas_object_data_set(obj, "timer", tim); + + ly2 = evas_object_data_get(obj, "ly2"); + evas_object_geometry_get(ly2, &x, &y, &w, &h); + evas_object_data_set(obj, "x", (void *)(uintptr_t)(ev->canvas.x)); + evas_object_data_set(obj, "y", (void *)(uintptr_t)(ev->canvas.y)); + evas_object_data_set(obj, "px", (void *)(uintptr_t)(x)); + evas_object_data_set(obj, "py", (void *)(uintptr_t)(y)); + + elm_layout_signal_emit(ly2, "click", "app"); + + if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK) + { + printf("double click %p\n", obj); + } +} + +static void +l3_ic_up_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Up *ev = event_info; + Ecore_Timer *tim; + Evas_Object *ly2; + + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return; + + ly2 = evas_object_data_get(obj, "ly2"); + tim = evas_object_data_get(obj, "timer"); + if (tim) + { + evas_object_data_del(obj, "timer"); + ecore_timer_del(tim); + } + if (evas_object_data_get(obj, "dragging")) + { + Evas_Object *ly, *sc, *mb; + Eina_List *list, *l; + int slx, sly; + char buf[256]; + + evas_object_data_del(obj, "dragging"); + ly = evas_object_data_get(obj, "ly"); + sc = evas_object_data_get(obj, "sc"); + elm_object_scroll_freeze_pop(sc); + slx = (int)(uintptr_t)evas_object_data_get(obj, "slx"); + sly = (int)(uintptr_t)evas_object_data_get(obj, "sly"); + snprintf(buf, sizeof(buf), "slot.%i.%i", slx, sly); + elm_object_part_content_set(ly, buf, ly2); + list = (Eina_List *)evas_object_data_get + (elm_object_top_widget_get(obj), "mbs"); + EINA_LIST_FOREACH(list, l, mb) + evas_object_color_set(mb, 255, 255, 255, 255); + elm_layout_signal_emit(ly2, "drop", "app"); + } + else + elm_layout_signal_emit(ly2, "unclick", "app"); +} + +static void +l3_ic_move_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Move *ev = event_info; + Evas_Object *ly2; + + ly2 = evas_object_data_get(obj, "ly2"); + + if (evas_object_data_get(obj, "dragging")) + { + Evas_Coord x, y, px, py; + + x = (Evas_Coord)(uintptr_t)evas_object_data_get(obj, "x"); + y = (Evas_Coord)(uintptr_t)evas_object_data_get(obj, "y"); + px = (Evas_Coord)(uintptr_t)evas_object_data_get(obj, "px"); + py = (Evas_Coord)(uintptr_t)evas_object_data_get(obj, "py"); + evas_object_move(ly2, + px + ev->cur.canvas.x - x, + py + ev->cur.canvas.y - y); + } + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) + { + Ecore_Timer *tim; + + tim = evas_object_data_get(obj, "timer"); + if (tim) + { + evas_object_data_del(obj, "timer"); + ecore_timer_del(tim); + } + elm_layout_signal_emit(ly2, "cancel", "app"); + return; + } +} + +void +test_launcher3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bg, *sc, *tb, *pad, *bt, *ic, *tb2, *mb, *ck, *bx, *bx2, *ly, *ly2; + int i, j, k, n, m; + char buf[PATH_MAX]; + const char *names[] = + { + "Hello", "World", "Spam", "Egg", + "Ham", "Good", "Bad", "Milk", + "Smell", "Of", "Sky", "Gold", + "Hole", "Pig", "And", "Calm" + }; + Eina_List *mbs = NULL; + + win = elm_win_add(NULL, "launcher", ELM_WIN_BASIC); + elm_win_title_set(win, "Launcher"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/sky_04.jpg", elm_app_data_dir_get()); + elm_bg_file_set(bg, buf, NULL); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_homogeneous_set(bx, EINA_TRUE); + elm_box_horizontal_set(bx, EINA_TRUE); + + sc = elm_scroller_add(win); + elm_scroller_bounce_set(sc, EINA_TRUE, EINA_FALSE); + elm_scroller_policy_set(sc, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL); + + n = 0; m = 0; + for (k = 0 ; k < 8; k++) + { + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + pad = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_min_set(pad, 450, 10); + elm_table_pack(tb, pad, 1, 0, 1, 1); + + pad = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_min_set(pad, 450, 10); + elm_table_pack(tb, pad, 1, 2, 1, 1); + + pad = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_min_set(pad, 10, 450); + elm_table_pack(tb, pad, 0, 1, 1, 1); + + pad = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_min_set(pad, 10, 450); + elm_table_pack(tb, pad, 2, 1, 1, 1); + + mb = elm_mapbuf_add(win); + mbs = eina_list_append(mbs, mb); + + elm_object_content_set(mb, tb); + evas_object_show(tb); + elm_box_pack_end(bx, mb); + evas_object_show(mb); + + ly = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "launcher_page"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, ly, 1, 1, 1, 1); + evas_object_show(ly); + + for (j = 0; j < 4; j++) + { + for (i = 0; i < 4; i++) + { + ly2 = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly2, buf, "launcher_icon"); + evas_object_size_hint_weight_set(ly2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly2, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_layout_text_set(ly2, "label", names[m]); + + ic = elm_icon_add(win); + elm_object_scale_set(ic, 0.5); + snprintf(buf, sizeof(buf), "%s/images/icon_%02i.png", elm_app_data_dir_get(), n); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ic, 0.5, 0.5); + elm_object_part_content_set(ly2, "slot", ic); + evas_object_show(ic); + + evas_object_event_callback_add(ic, EVAS_CALLBACK_DEL, l3_ic_del_cb, ic); + + evas_object_event_callback_add(ic, EVAS_CALLBACK_MOUSE_DOWN, l3_ic_down_cb, ic); + evas_object_event_callback_add(ic, EVAS_CALLBACK_MOUSE_UP, l3_ic_up_cb, ic); + evas_object_event_callback_add(ic, EVAS_CALLBACK_MOUSE_MOVE, l3_ic_move_cb, ic); + + evas_object_data_set(ic, "ly", ly); + evas_object_data_set(ic, "ly2", ly2); + evas_object_data_set(ic, "sc", sc); + evas_object_data_set(ic, "bx", bx); + evas_object_data_set(ic, "mb", mb); + evas_object_data_set(ic, "slx", (void *)(uintptr_t)(i)); + evas_object_data_set(ic, "sly", (void *)(uintptr_t)(j)); + + snprintf(buf, sizeof(buf), "slot.%i.%i", i, j); + elm_object_part_content_set(ly, buf, ly2); + evas_object_show(ly2); + + n++; if (n > 23) n = 0; + m++; if (m > 15) m = 0; + } + } + } + + // fixme: free mbs + evas_object_data_set(win, "mbs", mbs); + + bx2 = elm_box_add(win); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_horizontal_set(bx2, EINA_FALSE); + elm_win_resize_object_add(win, bx2); + evas_object_show(bx2); + + elm_object_content_set(sc, bx); + evas_object_show(bx); + + elm_scroller_page_relative_set(sc, 1.0, 1.0); + evas_object_show(sc); + + tb2 = elm_table_add(win); + evas_object_size_hint_weight_set(tb2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(tb2, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx2, tb2); + + elm_box_pack_end(bx2, sc); + + ck = elm_check_add(win); + elm_object_text_set(ck, "Map"); + elm_check_state_set(ck, EINA_FALSE); + evas_object_smart_callback_add(ck, "changed", l3_mode_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.05, 0.99); + elm_table_pack(tb2, ck, 0, 0, 1, 1); + evas_object_show(ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "A"); + elm_check_state_set(ck, EINA_TRUE); + evas_object_smart_callback_add(ck, "changed", l3_alpha_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.20, 0.99); + elm_table_pack(tb2, ck, 1, 0, 1, 1); + evas_object_show(ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "Smo"); + elm_check_state_set(ck, EINA_TRUE); + evas_object_smart_callback_add(ck, "changed", l3_smooth_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.40, 0.99); + elm_table_pack(tb2, ck, 2, 0, 1, 1); + evas_object_show(ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "FS"); + elm_check_state_set(ck, EINA_FALSE); + evas_object_smart_callback_add(ck, "changed", l3_full_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.5, 0.99); + elm_table_pack(tb2, ck, 3, 0, 1, 1); + evas_object_show(ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "Hid"); + elm_check_state_set(ck, EINA_FALSE); + evas_object_smart_callback_add(ck, "changed", l3_hidden_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.5, 0.99); + elm_table_pack(tb2, ck, 4, 0, 1, 1); + evas_object_show(ck); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", l3_close_cb, win); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.95, 0.99); + elm_table_pack(tb2, bt, 5, 0, 1, 1); + evas_object_show(bt); + + evas_object_show(tb2); + + evas_object_resize(win, 480, 400); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_layout.c b/src/bin/elementary/test_layout.c new file mode 100644 index 0000000000..fce1b93cd1 --- /dev/null +++ b/src/bin/elementary/test_layout.c @@ -0,0 +1,271 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +#include <Elementary_Cursor.h> + +struct _api_data +{ + unsigned int state; /* What state we are testing */ + Evas_Object *box_layout; + Evas_Object *table_layout; + Evas_Object *ref; + Evas_Object *ref2; +}; +typedef struct _api_data api_data; + +enum _api_state +{ + LAYOUT_BOX_INSERT_AT, + LAYOUT_BOX_INSERT_BEFORE, + LAYOUT_BOX_PREPEND, + LAYOUT_BOX_REMOVE, + LAYOUT_BOX_REMOVE_ALL, + LAYOUT_TABLE_UNPACK, + LAYOUT_TABLE_CLEAR, + API_STATE_LAST +}; + +typedef enum _api_state api_state; +static void +_clicked_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + elm_object_part_text_set(data, "text", elm_object_text_get(obj)); +} + +static void +_cb_signal(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *emission, const char *source) +{ + printf("signal: '%s' '%s'\n", emission, source); +} + +void +test_layout(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *box, *ly, *bt; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("layout", "Layout"); + elm_win_autodel_set(win, EINA_TRUE); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + ly = elm_layout_add(box); + + if (!elm_layout_theme_set( + ly, "layout", "application", "titlebar")) + fprintf(stderr, "Failed to set layout"); + + elm_object_part_text_set(ly, "elm.text", "Some title"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, ly); + evas_object_show(ly); + + bt = elm_icon_add(ly); + elm_icon_standard_set(bt, "chat"); + evas_object_size_hint_min_set(bt, 20, 20); + elm_layout_icon_set(ly, bt); + + bt = elm_icon_add(ly); + elm_icon_standard_set(bt, "close"); + evas_object_size_hint_min_set(bt, 20, 20); + elm_layout_end_set(ly, bt); + + ly = elm_layout_add(box); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "layout"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(box, ly); + evas_object_show(ly); + + elm_layout_signal_callback_add(ly, "*", "*", _cb_signal, NULL); + + bt = elm_button_add(ly); + elm_object_text_set(bt, "Button 1"); + elm_object_part_content_set(ly, "element1", bt); + evas_object_smart_callback_add(bt, "clicked", _clicked_cb, ly); + + bt = elm_button_add(ly); + elm_object_text_set(bt, "Button 2"); + elm_object_part_content_set(ly, "element2", bt); + evas_object_smart_callback_add(bt, "clicked", _clicked_cb, ly); + + bt = elm_button_add(ly); + elm_object_text_set(bt, "Button 3"); + elm_object_part_content_set(ly, "element3", bt); + evas_object_smart_callback_add(bt, "clicked", _clicked_cb, ly); + + elm_layout_part_cursor_set(ly, "text", ELM_CURSOR_WATCH); + + evas_object_show(win); +} + +static void +set_api_state(api_data *api) +{ + Evas_Object *box_layout = api->box_layout; + Evas_Object *table_layout = api->table_layout; + Evas_Object *obj; + + /* use elm_box_children_get() to get list of children */ + switch (api->state) + { /* Put all api-changes under switch */ + case LAYOUT_BOX_INSERT_AT: + { + obj = elm_label_add(box_layout); + elm_object_text_set(obj, "elm_layout_box_insert_at(); is called"); + evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + elm_layout_box_insert_at(box_layout, "elm.box.content", obj, 0); + evas_object_show(obj); + break; + } + + case LAYOUT_BOX_INSERT_BEFORE: + { + obj = elm_label_add(box_layout); + elm_object_text_set(obj, "elm_layout_box_insert_before(); is called"); + evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + elm_layout_box_insert_before(box_layout, "elm.box.content", + obj, api->ref); + evas_object_show(obj); + break; + } + + case LAYOUT_BOX_PREPEND: + { + obj = elm_label_add(box_layout); + elm_object_text_set(obj, "elm_layout_box_prepend(); is called"); + evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + elm_layout_box_prepend(box_layout, "elm.box.content", obj); + evas_object_show(obj); + break; + } + + case LAYOUT_BOX_REMOVE: + { + elm_layout_box_remove(box_layout, "elm.box.content", api->ref); + evas_object_del(api->ref); + break; + } + + case LAYOUT_BOX_REMOVE_ALL: + { + elm_layout_box_remove_all(box_layout, "elm.box.content", EINA_TRUE); + break; + } + + case LAYOUT_TABLE_UNPACK: + { + elm_layout_table_unpack(table_layout, "elm.table.content", api->ref2); + evas_object_del(api->ref2); + break; + } + + case LAYOUT_TABLE_CLEAR: + { + elm_layout_table_clear(table_layout, "elm.table.content", EINA_TRUE); + break; + } + + default: return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(obj, str); + elm_object_disabled_set(obj, a->state == API_STATE_LAST); +} + +static void +_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + free(data); +} + +void +test_layout2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *box, *bt, *ly, *lb; + api_data *api = calloc(1, sizeof(api_data)); + + win = elm_win_util_standard_add("layout2", "Layout 2"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Next API function"); + evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, + (void *)api); + elm_box_pack_end(box, bt); + elm_object_disabled_set(bt, api->state == API_STATE_LAST); + evas_object_show(bt); + + /* Layout Box Test */ + api->box_layout = ly = elm_layout_add(win); + + if (!elm_layout_theme_set( + ly, "layout", "application", "toolbar-vbox")) + fprintf(stderr, "Failed to set layout"); + + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, ly); + evas_object_show(ly); + + api->ref = lb = elm_label_add(win); + elm_object_text_set(lb, "This is a label for the box content"); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(lb); + + elm_layout_box_append(ly, "elm.box.content", lb); + + /* Layout Table Test */ + api->table_layout = ly = elm_layout_add(win); + + if (!elm_layout_theme_set( + ly, "layout", "application", "toolbar-table")) + fprintf(stderr, "Failed to set layout"); + + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, ly); + evas_object_show(ly); + + lb = elm_label_add(win); + elm_object_text_set(lb, "This is a label for the table content"); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(lb); + elm_layout_table_pack(ly, "elm.table.content", lb, 0, 0, 1, 1); + + api->ref2 = lb = elm_label_add(win); + elm_object_text_set(lb, "col = 0, row = 1"); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(lb); + elm_layout_table_pack(ly, "elm.table.content", lb, 0, 1, 1, 1); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_list.c b/src/bin/elementary/test_list.c new file mode 100644 index 0000000000..f02df5c4a1 --- /dev/null +++ b/src/bin/elementary/test_list.c @@ -0,0 +1,1953 @@ +#include "test.h" +#include <Elementary_Cursor.h> +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +Evas_Object * _focus_autoscroll_mode_frame_create(Evas_Object *parent); + +struct _api_data +{ + unsigned int state; /* What state we are testing */ + void *list; +}; +typedef struct _api_data api_data; + +enum _api_state +{ + ITEM_PREPEND, /* 0 */ + ITEM_INSERT_BEFORE, /* 1 */ + ITEM_INSERT_AFTER, /* 2 */ + ITEM_SEPARATOR_SET, /* 3 */ + LIST_ITEM_DEL, /* 4 */ + SCROLLER_POLICY_SET_ON, + SCROLLER_POLICY_SET_OFF, /* Back to AUTO next */ + TOOLTIP_TEXT_SET, /* 7 */ + TOOLTIP_UNSET, /* 8 */ + ITEM_CURSOR_SET, /* 9 */ + ITEM_CURSOR_STYLE_SET, + DISABLED_SET, /* 11 */ + MODE_SET_COMPRESS, /* 12 */ + MODE_SET_LIMIT, /* 13 */ + MODE_SET_EXPAND, /* 14 */ + HORIZONTAL_SET, /* 15 */ + BOUNCE_SET, /* 16 */ + LIST_CLEAR, /* 17 */ + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ +/** HOW TO TEST ************************ +0 ITEM PREPEND +Scroll to end +1 INSERT BEFORE +Scroll to end +2 INSERT AFTER +3 INSERT SEPARATOR +Scroll to end +4 ITEM DEL +5 POLICY ON, BOUNCE_SET(TRUE, TRUE) +6 POLICY OFF +Scroll to end +7 TOOLTIP last-item +8 Cancel tootip +9 Curosr set on last item +10 Cursor style set last item +11 DISABLE last item +12 MODE COMPRESS +13 MODE LIMIT +14 MODE EXPAND +15 HORIZ SET +16 VERT MODE, BOUNCE(TRUE, FALSE) try to bounce on Y-axis +17 List clear +*** HOW TO TEST ***********************/ + Evas_Object *li = api->list; + + switch(api->state) + { /* Put all api-changes under switch */ + case ITEM_PREPEND: /* 0 */ + { + const Eina_List *items = elm_list_items_get(li); + elm_list_item_prepend(li, "PREPEND", NULL, NULL, NULL, NULL); + elm_list_go(li); + elm_list_item_bring_in(eina_list_nth(items, 0)); + } + break; + + case ITEM_INSERT_BEFORE: /* 1 */ + { + const Eina_List *items = elm_list_items_get(li); + if (eina_list_count(items)) + { + elm_list_item_insert_before(li, + eina_list_nth(items, eina_list_count(items)-1), + "1-before-last", NULL, NULL, NULL, NULL); + elm_list_go(li); + elm_list_item_bring_in(eina_list_data_get(eina_list_last(items))); + } + } + break; + + case ITEM_INSERT_AFTER: /* 2 */ + { + const Eina_List *items = elm_list_items_get(li); + if (eina_list_count(items)) + { + elm_list_item_insert_after(li, + eina_list_nth(items, eina_list_count(items)-2), + "insert-after", NULL, NULL, NULL, NULL); + elm_list_go(li); + elm_list_item_bring_in(eina_list_data_get(eina_list_last(items))); + } + } + break; + + case ITEM_SEPARATOR_SET: /* 3 */ + { + const Eina_List *items = elm_list_items_get(li); + if (eina_list_count(items)) + { + elm_list_item_separator_set(eina_list_nth(items, eina_list_count(items)-3), EINA_TRUE); + elm_list_item_bring_in(eina_list_nth(items, eina_list_count(items)-3)); + elm_list_go(li); + } + } + break; + + case LIST_ITEM_DEL: /* 4 */ + { + const Eina_List *items = elm_list_items_get(li); + if (eina_list_count(items)) + { + elm_object_item_del(eina_list_data_get(eina_list_last(items))); + } + } + break; + + case SCROLLER_POLICY_SET_ON: /* 5 */ + elm_scroller_bounce_set(li, EINA_TRUE, EINA_TRUE); + elm_scroller_policy_set(li, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON); + break; + + case SCROLLER_POLICY_SET_OFF: /* Back to AUTO next (6) */ + elm_scroller_policy_set(li, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + break; + + case TOOLTIP_TEXT_SET: /* 7 */ + { + const Eina_List *items = elm_list_items_get(li); + if (eina_list_count(items)) + { + elm_object_item_tooltip_text_set(eina_list_data_get(eina_list_last(items)), "Tooltip set from API"); + } + elm_scroller_policy_set(li, ELM_SCROLLER_POLICY_AUTO, ELM_SCROLLER_POLICY_AUTO); + } + break; + + case TOOLTIP_UNSET: /* 8 */ + { + const Eina_List *items = elm_list_items_get(li); + if (eina_list_count(items)) + { + elm_object_item_tooltip_unset(eina_list_data_get(eina_list_last(items))); + } + } + break; + + case ITEM_CURSOR_SET: /* 9 */ + { + const Eina_List *items = elm_list_items_get(li); + if (eina_list_count(items)) + { + elm_object_item_cursor_set(eina_list_data_get(eina_list_last(items)), ELM_CURSOR_HAND2); + } + } + break; + + case ITEM_CURSOR_STYLE_SET: /* 10 */ + { + const Eina_List *items = elm_list_items_get(li); + if (eina_list_count(items)) + { + elm_object_item_cursor_style_set(eina_list_data_get(eina_list_last(items)), "transparent"); + } + } + break; + + case DISABLED_SET: /* 11 */ + { + const Eina_List *items = elm_list_items_get(li); + if (eina_list_count(items)) + { + elm_object_item_disabled_set(eina_list_data_get(eina_list_last(items)), EINA_TRUE); + } + } + break; + + case MODE_SET_COMPRESS: /* 12 */ + elm_list_mode_set(li, ELM_LIST_COMPRESS); + break; + + case MODE_SET_LIMIT: /* 13 */ + elm_list_mode_set(li, ELM_LIST_LIMIT); + break; + + case MODE_SET_EXPAND: /* 14 */ + elm_list_mode_set(li, ELM_LIST_EXPAND); + break; + + case HORIZONTAL_SET: /* 15 */ + elm_list_mode_set(li, ELM_LIST_SCROLL); /* return to default mode */ + elm_list_horizontal_set(li, EINA_TRUE); + break; + + case BOUNCE_SET: /* 16 */ + elm_list_horizontal_set(li, EINA_FALSE); + elm_scroller_bounce_set(li, EINA_TRUE, EINA_FALSE); + break; + + case LIST_CLEAR: /* 17 */ + elm_list_clear(li); + break; + + case API_STATE_LAST: + break; + + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(obj, str); + elm_object_disabled_set(obj, a->state == API_STATE_LAST); +} + +static void +my_show_it(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + elm_list_item_show(data); +} + +static void +scroll_top(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("Top edge!\n"); +} + +static void +scroll_bottom(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("Bottom edge!\n"); +} + +static void +clicked_right(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("Clicked right!\n"); +} + +static void +scroll_left(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("Left edge!\n"); +} + +static void +scroll_right(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("Right edge!\n"); +} + +static void +_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + free(data); +} + +void +test_list(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *li, *ic, *ic2, *bx, *tb2, *bt, *bxx; + char buf[PATH_MAX]; + Elm_Object_Item *list_it1, *list_it2, *list_it3, *list_it4, *list_it5; + api_data *api = calloc(1, sizeof(api_data)); + + win = elm_win_util_standard_add("list", "List"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bxx = elm_box_add(win); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bxx); + evas_object_show(bxx); + + li = elm_list_add(win); + elm_list_mode_set(li, ELM_LIST_LIMIT); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL); + api->list = li; + + bt = elm_button_add(win); + elm_object_text_set(bt, "Next API function"); + evas_object_smart_callback_add(bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, bt); + elm_object_disabled_set(bt, api->state == API_STATE_LAST); + evas_object_show(bt); + + elm_box_pack_end(bxx, li); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + list_it1 = elm_list_item_append(li, "Hello", ic, NULL, NULL, NULL); + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + elm_image_file_set(ic, buf, NULL); + elm_list_item_append(li, "world", ic, NULL, NULL, NULL); + ic = elm_icon_add(win); + elm_icon_standard_set(ic, "edit"); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + elm_list_item_append(li, ".", ic, NULL, NULL, NULL); + + ic = elm_icon_add(win); + elm_icon_standard_set(ic, "delete"); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + ic2 = elm_icon_add(win); + elm_icon_standard_set(ic2, "clock"); + elm_image_resizable_set(ic2, EINA_FALSE, EINA_FALSE); + list_it2 = elm_list_item_append(li, "How", ic, ic2, NULL, NULL); + + bx = elm_box_add(win); + elm_box_horizontal_set(bx, EINA_TRUE); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_align_set(ic, 0.5, 0.5); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_align_set(ic, 0.5, 0.0); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_align_set(ic, 0.0, 1.0); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + elm_list_item_append(li, "are", bx, NULL, NULL, NULL); + + elm_list_item_append(li, "you", NULL, NULL, NULL, NULL); + list_it3 = elm_list_item_append(li, "doing", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "out", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "there", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "today", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "?", NULL, NULL, NULL, NULL); + list_it4 = elm_list_item_append(li, "Here", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "are", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "some", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "more", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "items", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Is this label long enough?", NULL, NULL, NULL, NULL); + list_it5 = elm_list_item_append(li, "Maybe this one is even longer so we can test long long items.", NULL, NULL, NULL, NULL); + + elm_list_go(li); + + evas_object_show(li); + + tb2 = elm_table_add(win); + evas_object_size_hint_weight_set(tb2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, tb2); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Hello"); + evas_object_smart_callback_add(bt, "clicked", my_show_it, list_it1); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.9, 0.5); + elm_table_pack(tb2, bt, 0, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "How"); + evas_object_smart_callback_add(bt, "clicked", my_show_it, list_it2); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.9, 0.5); + elm_table_pack(tb2, bt, 0, 1, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "doing"); + evas_object_smart_callback_add(bt, "clicked", my_show_it, list_it3); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.9, 0.5); + elm_table_pack(tb2, bt, 0, 2, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Here"); + evas_object_smart_callback_add(bt, "clicked", my_show_it, list_it4); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.9, 0.5); + elm_table_pack(tb2, bt, 0, 3, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Maybe this..."); + evas_object_smart_callback_add(bt, "clicked", my_show_it, list_it5); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.9, 0.5); + elm_table_pack(tb2, bt, 0, 4, 1, 1); + evas_object_show(bt); + + evas_object_show(tb2); + + evas_object_resize(win, 320, 300); + evas_object_show(win); + + evas_object_smart_callback_add(li, "edge,top", scroll_top, NULL); + evas_object_smart_callback_add(li, "edge,bottom", scroll_bottom, NULL); + evas_object_smart_callback_add(li, "clicked,right", clicked_right, NULL); +} + +void +test_list_horizontal(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *li, *ic, *ic2, *bx, *tb2, *bt; + char buf[PATH_MAX]; + Elm_Object_Item *list_it1, *list_it2, *list_it3, *list_it4; + + win = elm_win_util_standard_add("list-horizontal", "List Horizontal"); + elm_win_autodel_set(win, EINA_TRUE); + + li = elm_list_add(win); + elm_list_horizontal_set(li, EINA_TRUE); + elm_list_mode_set(li, ELM_LIST_LIMIT); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, li); + + evas_object_smart_callback_add(li, "edge,left", scroll_left, NULL); + evas_object_smart_callback_add(li, "edge,right", scroll_right, NULL); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + list_it1 = elm_list_item_append(li, "Hello", ic, NULL, NULL, NULL); + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + elm_image_file_set(ic, buf, NULL); + elm_list_item_append(li, "world", ic, NULL, NULL, NULL); + ic = elm_icon_add(win); + elm_icon_standard_set(ic, "edit"); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + elm_list_item_append(li, ".", ic, NULL, NULL, NULL); + + ic = elm_icon_add(win); + elm_icon_standard_set(ic, "delete"); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + ic2 = elm_icon_add(win); + elm_icon_standard_set(ic2, "clock"); + elm_image_resizable_set(ic2, EINA_FALSE, EINA_FALSE); + list_it2 = elm_list_item_append(li, "How", ic, ic2, NULL, NULL); + + bx = elm_box_add(win); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_align_set(ic, 0.5, 0.5); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_align_set(ic, 0.5, 0.0); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + elm_list_item_append(li, "are", bx, NULL, NULL, NULL); + + elm_list_item_append(li, "you", NULL, NULL, NULL, NULL); + list_it3 = elm_list_item_append(li, "doing", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "out", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "there", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "today", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "?", NULL, NULL, NULL, NULL); + + list_it4 = elm_list_item_append(li, "And", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "here", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "we", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "are", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "done", NULL, NULL, NULL, NULL); + elm_object_item_disabled_set(elm_list_item_append(li, "with", NULL, NULL, NULL, NULL), EINA_TRUE); + elm_object_item_disabled_set(elm_list_item_append(li, "items.", NULL, NULL, NULL, NULL), EINA_TRUE); + + elm_list_go(li); + + evas_object_show(li); + + tb2 = elm_table_add(win); + evas_object_size_hint_weight_set(tb2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, tb2); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Hello"); + evas_object_smart_callback_add(bt, "clicked", my_show_it, list_it1); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.5, 0.9); + elm_table_pack(tb2, bt, 0, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "How"); + evas_object_smart_callback_add(bt, "clicked", my_show_it, list_it2); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.5, 0.9); + elm_table_pack(tb2, bt, 1, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "doing"); + evas_object_smart_callback_add(bt, "clicked", my_show_it, list_it3); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.5, 0.9); + elm_table_pack(tb2, bt, 2, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "And"); + evas_object_smart_callback_add(bt, "clicked", my_show_it, list_it4); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.5, 0.9); + elm_table_pack(tb2, bt, 3, 0, 1, 1); + evas_object_show(bt); + + evas_object_show(tb2); + + evas_object_resize(win, 320, 300); + evas_object_show(win); +} + +/***********/ + +static void +my_li2_clear(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + elm_list_clear(data); +} + +static void +my_li2_sel(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Elm_Object_Item *list_it = elm_list_selected_item_get(obj); + elm_list_item_selected_set(list_it, EINA_FALSE); + printf("item selected\n"); +} + +void +test_list2(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bg, *li, *ic, *ic2, *bx, *bx2, *bt; + char buf[PATH_MAX]; + Elm_Object_Item *list_it; + + win = elm_win_add(NULL, "list2", ELM_WIN_BASIC); + elm_win_title_set(win, "List 2"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_bg_file_set(bg, buf, NULL); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + li = elm_list_add(bx); + evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_list_mode_set(li, ELM_LIST_LIMIT); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_list_item_append(li, "Unselect on selected", ic, NULL, my_li2_sel, NULL); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + elm_image_file_set(ic, buf, NULL); + list_it = elm_list_item_append(li, "world", ic, NULL, NULL, NULL); + elm_list_item_selected_set(list_it, EINA_TRUE); + + ic = elm_icon_add(win); + elm_icon_standard_set(ic, "edit"); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + elm_list_item_append(li, ".", ic, NULL, NULL, NULL); + + ic = elm_icon_add(win); + elm_icon_standard_set(ic, "delete"); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + ic2 = elm_icon_add(win); + elm_icon_standard_set(ic2, "clock"); + elm_image_resizable_set(ic2, EINA_FALSE, EINA_FALSE); + elm_list_item_append(li, "How", ic, ic2, NULL, NULL); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_align_set(ic, 0.5, 0.5); + elm_box_pack_end(bx2, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_align_set(ic, 0.5, 0.0); + elm_box_pack_end(bx2, ic); + evas_object_show(ic); + elm_list_item_append(li, "are", bx2, NULL, NULL, NULL); + + elm_list_item_append(li, "you", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "doing", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "out", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "there", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "today", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "?", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Here", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "are", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "some", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "more", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "items", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Longer label.", NULL, NULL, NULL, NULL); + + elm_list_go(li); + + elm_box_pack_end(bx, li); + evas_object_show(li); + + bt = elm_button_add(bx); + elm_object_text_set(bt, "Clear"); + evas_object_smart_callback_add(bt, "clicked", my_li2_clear, li); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + evas_object_resize(win, 320, 500); + evas_object_show(win); +} + +/***********/ + +static void +_bt_clicked(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("button was clicked\n"); +} + +static void +_it_clicked(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("item was clicked\n"); + if (!data) return; + Evas_Object *li = data; + Evas_Object *lb; + char str[128]; + + Elm_Object_Item *lit = elm_list_selected_item_get(li); + if (!lit) return; + sprintf(str, "%s is selected", elm_object_item_text_get(lit)); + + lb = evas_object_data_get(li, "label"); + elm_object_text_set(lb, str); +} + +void +test_list3(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *li, *ic, *ic2, *bx; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("list3", "List 3"); + elm_win_autodel_set(win, EINA_TRUE); + + li = elm_list_add(win); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, li); + elm_list_mode_set(li, ELM_LIST_COMPRESS); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + elm_image_file_set(ic, buf, NULL); + ic2 = elm_button_add(win); + elm_object_text_set(ic2, "Click me"); + evas_object_smart_callback_add(ic2, "clicked", _bt_clicked, NULL); + evas_object_propagate_events_set(ic2, EINA_FALSE); + elm_list_item_append(li, "Hello", ic, ic2, _it_clicked, NULL); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + elm_image_file_set(ic, buf, NULL); + ic2 = elm_button_add(win); + elm_object_text_set(ic2, "Click me"); + evas_object_smart_callback_add(ic2, "clicked", _bt_clicked, NULL); + elm_list_item_append(li, "world", ic, ic2, _it_clicked, NULL); + + ic = elm_icon_add(win); + elm_icon_standard_set(ic, "edit"); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + elm_list_item_append(li, ".", ic, NULL, NULL, NULL); + + ic = elm_icon_add(win); + elm_icon_standard_set(ic, "delete"); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + ic2 = elm_icon_add(win); + elm_icon_standard_set(ic2, "clock"); + elm_image_resizable_set(ic2, EINA_FALSE, EINA_FALSE); + elm_list_item_append(li, "How", ic, ic2, NULL, NULL); + + bx = elm_box_add(win); + elm_box_horizontal_set(bx, EINA_TRUE); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_align_set(ic, 0.5, 0.5); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_align_set(ic, 0.5, 0.0); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_align_set(ic, 0.0, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + elm_list_item_append(li, "are", bx, NULL, NULL, NULL); + elm_list_item_append(li, "you", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "doing", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "out", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "there", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "today", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "?", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Here", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "are", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "some", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "more", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "items", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Is this label long enough?", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Maybe this one is even longer so we can test long long items.", NULL, NULL, NULL, NULL); + + elm_list_go(li); + + evas_object_show(li); + + evas_object_resize(win, 320, 300); + evas_object_show(win); +} + +/////////////////////////////////////////////////////////////////////////////////////// + +struct Pginfo +{ + Evas_Object *naviframe, *win; +}; + +static void +test_list4_back_cb(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + struct Pginfo *info = data; + if (!info) return; + + elm_naviframe_item_pop(info->naviframe); +} + +static void +test_list4_swipe(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + Evas_Object *box, *entry, *button; + struct Pginfo *info = data; + char *item_data; + if ((!event_info) || (!data)) return; + + item_data = elm_object_item_data_get(event_info); + + box = elm_box_add(info->win); + elm_box_horizontal_set(box, EINA_FALSE); + elm_box_homogeneous_set(box, EINA_FALSE); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(box); + + entry = elm_entry_add(info->win); + elm_entry_scrollable_set(entry, EINA_TRUE); + elm_entry_editable_set(entry, EINA_FALSE); + elm_object_text_set(entry, item_data); + evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(entry); + + button = elm_button_add(info->win); + elm_object_text_set(button, "back"); + evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 0); + evas_object_smart_callback_add(button, "clicked", test_list4_back_cb, info); + evas_object_show(button); + + elm_box_pack_start(box, entry); + elm_box_pack_end(box, button); + + elm_naviframe_item_simple_push(info->naviframe, box); +} + +void +test_list4(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *li, *ic, *ic2, *naviframe; + static struct Pginfo info = {NULL, NULL}; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("list4", "List 4"); + elm_win_autodel_set(win, EINA_TRUE); + info.win = win; + + naviframe = elm_naviframe_add(win); + evas_object_size_hint_weight_set(naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, naviframe); + evas_object_show(naviframe); + info.naviframe = naviframe; + + li = elm_list_add(win); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_list_mode_set(li, ELM_LIST_COMPRESS); + evas_object_smart_callback_add(li, "swipe", test_list4_swipe, &info); + elm_naviframe_item_simple_push(naviframe, li); + + static char pf_data[] = "Pink Floyd were formed in 1965, and originally consisted of university" \ + "students Roger Waters, Nick Mason, Richard Wright, and Syd Barrett. The group were a popular" \ + "fixture on London's underground music scene, and under Barrett's leadership released two " \ + "charting singles, \"Arnold Layne\" and \"See Emily Play\", and a successful debut album, " \ + "ThePiper at the Gates of Dawn. In 1968, guitarist and singer David Gilmour joined the " \ + "line-up. Barrett was soon removed, due to his increasingly erratic behaviour. Following " \ + "Barrett's departure, bass player and singer Roger Waters became the band's lyricist and " \ + "conceptual leader, with Gilmour assuming lead guitar and much of the vocals. With this " \ + "line-up, Floyd went on to achieve worldwide critical and commercial success with the " \ + "conceptalbums The Dark Side of the Moon, Wish You Were Here, Animals, and The Wall."; + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/mystrale.jpg", elm_app_data_dir_get()); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + elm_image_file_set(ic, buf, NULL); + elm_list_item_append(li, "Pink Floyd", ic, NULL, NULL, &pf_data); + + static char ds_data[] = "Dire Straits were a British rock band, formed by Mark Knopfler " \ + "(lead vocals and lead guitar), his younger brother David Knopfler (rhythm guitar and " \ + "backing vocals), John Illsley (bass guitar and backing vocals), and Pick Withers (drums " \ + "and percussion), and managed by Ed Bicknell, active between 1977 and 1995. Although the " \ + "band was formed in an era when punk rock was at the forefront, Dire Straits played a more " + "bluesy style, albeit with a stripped-down sound that appealed to audiences weary of the " \ + "overproduced stadium rock of the 1970s.[citation needed] In their early days, Mark and " \ + "David requested that pub owners turn down their sound so that patrons could converse " \ + "while the band played, an indication of their unassuming demeanor. Despite this oddly " \ + "self-effacing approach to rock and roll, Dire Straits soon became hugely successful, with " \ + "their first album going multi-platinum globally."; + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/mystrale_2.jpg", elm_app_data_dir_get()); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + elm_image_file_set(ic, buf, NULL); + elm_list_item_append(li, "Dire Straits", ic, NULL, NULL, &ds_data); + + static char uh_data[] = "Uriah Heep are an English hard rock band. The band released several " \ + "commercially successful albums in the 1970s such as Uriah Heep Live (1973), but their " \ + "audience declined by the 1980s, to the point where they became essentially a cult band in " \ + "the United States and United Kingdom. Uriah Heep maintain a significant following in " \ + "Germany, the Netherlands, Scandinavia, the Balkans, Japan and Russia, where they still " \ + "perform at stadium-sized venues."; + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/icon_17.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_list_item_append(li, "Uriah Heep", ic, NULL, NULL, &uh_data); + + static char r_data[] = "Rush is a Canadian rock band formed in August 1968, in the Willowdale " \ + "neighbourhood of Toronto, Ontario. The band is composed of bassist, keyboardist, and lead " \ + "vocalist Geddy Lee, guitarist Alex Lifeson, and drummer and lyricist Neil Peart. The band " \ + "and its membership went through a number of re-configurations between 1968 and 1974, " \ + "achieving their current form when Peart replaced original drummer John Rutsey in July 1974, " \ + "two weeks before the group's first United States tour."; + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/icon_21.png", elm_app_data_dir_get()); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + elm_image_file_set(ic, buf, NULL); + ic2 = elm_icon_add(win); + elm_icon_standard_set(ic2, "clock"); + elm_image_resizable_set(ic2, EINA_FALSE, EINA_FALSE); + elm_list_item_append(li, "Rush", ic, ic2, NULL, &r_data); + + elm_list_go(li); + + evas_object_show(li); + evas_object_resize(win, 320, 300); + evas_object_show(win); +} + +///////////////////////////////////////////////////////////////////////////////////////// +struct list5_data_cb +{ + Evas_Object *win, *list; +}; + +static void +test_list5_item_del(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + elm_object_item_del(data); +} + +static void +test_list5_swipe(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + Evas_Object *button; + struct list5_data_cb *info = elm_object_item_data_get(event_info); + + if (elm_object_item_part_content_get(event_info, "end")) return; + + button = elm_button_add(info->win); + elm_object_text_set(button, "delete"); + evas_object_propagate_events_set(button, EINA_FALSE); + evas_object_smart_callback_add(button, "clicked", test_list5_item_del, + event_info); + elm_object_item_part_content_set(event_info, "end", button); + elm_object_item_part_text_set(event_info, "default", "Enlightenment"); +} + +void +test_list5(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *li; + static struct list5_data_cb info; + + win = elm_win_util_standard_add("list5", "List 5"); + elm_win_autodel_set(win, EINA_TRUE); + info.win = win; + + li = elm_list_add(win); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_list_mode_set(li, ELM_LIST_COMPRESS); + evas_object_smart_callback_add(li, "swipe", test_list5_swipe, NULL); + elm_win_resize_object_add(win, li); + evas_object_show(li); + info.list = li; + + elm_list_item_append(li, "Network", NULL, NULL, NULL, &info); + elm_list_item_append(li, "Audio", NULL, NULL, NULL, &info); + + elm_list_go(li); + evas_object_resize(win, 320, 300); + evas_object_show(win); +} + +static void +_first_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + char str[128]; + Evas_Object *li = data, *lb; + Elm_Object_Item *lit = elm_list_first_item_get(li); + if (!lit) return; + + sprintf(str, "%s is selected", elm_object_item_text_get(lit)); + elm_list_item_bring_in(lit); + elm_list_item_selected_set(lit, EINA_TRUE); + + lb = evas_object_data_get(li, "label"); + elm_object_text_set(lb, str); +} + +static void +_prev_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + char str[128]; + Evas_Object *li = data, *lb; + + Elm_Object_Item *lit = elm_list_selected_item_get(li); + if (!lit) return; + lit = elm_list_item_prev(lit); + if (!lit) return; + + sprintf(str, "%s is selected", elm_object_item_text_get(lit)); + elm_list_item_bring_in(lit); + elm_list_item_selected_set(lit, EINA_TRUE); + + lb = evas_object_data_get(li, "label"); + elm_object_text_set(lb, str); +} + +static void +_next_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + char str[128]; + Evas_Object *li = data, *lb; + + Elm_Object_Item *lit = elm_list_selected_item_get(li); + if (!lit) return; + lit = elm_list_item_next(lit); + if (!lit) return; + + sprintf(str, "%s is selected", elm_object_item_text_get(lit)); + elm_list_item_bring_in(lit); + elm_list_item_selected_set(lit, EINA_TRUE); + + lb = evas_object_data_get(li, "label"); + elm_object_text_set(lb, str); +} + +static void +_last_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + char str[128]; + Evas_Object *li = data, *lb; + Elm_Object_Item *lit = elm_list_last_item_get(li); + if (!lit) return; + + sprintf(str, "%s is selected", elm_object_item_text_get(lit)); + elm_list_item_bring_in(lit); + elm_list_item_selected_set(lit, EINA_TRUE); + + lb = evas_object_data_get(li, "label"); + elm_object_text_set(lb, str); +} + +void +test_list6(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *gd, *bt, *li, *lb; + + win = elm_win_util_standard_add("list6", "List 6"); + elm_win_autodel_set(win, EINA_TRUE); + + gd = elm_grid_add(win); + elm_grid_size_set(gd, 100, 100); + evas_object_size_hint_weight_set(gd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, gd); + + li = elm_list_add(win); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_list_mode_set(li, ELM_LIST_COMPRESS); + elm_grid_pack(gd, li, 4, 4, 92, 72); + evas_object_show(li); + + elm_list_item_append(li, "Eina", NULL, NULL, _it_clicked, li); + elm_list_item_append(li, "Eet", NULL, NULL, _it_clicked, li); + elm_list_item_append(li, "Evas", NULL, NULL, _it_clicked, li); + elm_list_item_append(li, "Ecore", NULL, NULL, _it_clicked, li); + elm_list_item_append(li, "Embryo", NULL, NULL, _it_clicked, li); + elm_list_item_append(li, "Edje", NULL, NULL, _it_clicked, li); + elm_list_item_append(li, "Efreet", NULL, NULL, _it_clicked, li); + elm_list_item_append(li, "E_dbus", NULL, NULL, _it_clicked, li); + elm_list_item_append(li, "Eeze", NULL, NULL, _it_clicked, li); + elm_list_item_append(li, "Expedite", NULL, NULL, _it_clicked, li); + elm_list_item_append(li, "Emotion", NULL, NULL, _it_clicked, li); + elm_list_item_append(li, "Ethumb", NULL, NULL, _it_clicked, li); + elm_list_item_append(li, "Elementary", NULL, NULL, _it_clicked, li); + elm_list_go(li); + + bt = elm_button_add(win); + elm_object_text_set(bt, "First"); + evas_object_smart_callback_add(bt, "clicked", _first_bt_clicked, li); + elm_grid_pack(gd, bt, 4, 80, 20, 10); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Prev"); + evas_object_smart_callback_add(bt, "clicked", _prev_bt_clicked, li); + elm_grid_pack(gd, bt, 28, 80, 20, 10); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Next"); + evas_object_smart_callback_add(bt, "clicked", _next_bt_clicked, li); + elm_grid_pack(gd, bt, 52, 80, 20, 10); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Last"); + evas_object_smart_callback_add(bt, "clicked", _last_bt_clicked, li); + elm_grid_pack(gd, bt, 76, 80, 20, 10); + evas_object_show(bt); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Nothing is selected"); + elm_grid_pack(gd, lb, 4, 90, 92, 10); + evas_object_show(lb); + + evas_object_data_set(li, "label", lb); + + evas_object_show(gd); + evas_object_resize(win, 480, 480); + evas_object_show(win); +} + +static void +_it_clicked_cb(void *data EINA_UNUSED, Evas_Object *li, + void *event_info EINA_UNUSED) +{ + Elm_Object_Item *lit = elm_list_selected_item_get(li); + printf("Item clicked. %s is selected\n", elm_object_item_text_get(lit)); +} + +void +test_list7(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bg, *li; + char buf[PATH_MAX]; + + win = elm_win_add(NULL, "list7", ELM_WIN_BASIC); + elm_win_title_set(win, "List Always Select Mode"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_bg_file_set(bg, buf, NULL); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + li = elm_list_add(win); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, li); + elm_list_select_mode_set(li, ELM_OBJECT_SELECT_MODE_ALWAYS); + + elm_list_item_append(li, "Items", NULL, NULL, _it_clicked_cb, NULL); + elm_list_item_append(li, "callbacks", NULL, NULL, _it_clicked_cb, NULL); + elm_list_item_append(li, "should be called", NULL, NULL, _it_clicked_cb, + NULL); + elm_list_item_append(li, "only once, each time", NULL, NULL, _it_clicked_cb, + NULL); + elm_list_item_append(li, "an item is clicked.", NULL, NULL, _it_clicked_cb, + NULL); + elm_list_item_append(li, "Including already", NULL, NULL, _it_clicked_cb, + NULL); + elm_list_item_append(li, "selected ones.", NULL, NULL, _it_clicked_cb, NULL); + + elm_list_go(li); + evas_object_show(li); + + evas_object_resize(win, 320, 300); + evas_object_show(win); +} + +static const char *_list_focus_names[] = {"None", "Square", "Button", "Check", "Box"}; +static const int _list_focus_combo[] = { 1, 0, 2, 33, 43, 44, 10, 30, 22, 11, 10, -1 }; + +static Evas_Object * +test_list_focus_content_get(Evas_Object *obj, unsigned type, Eina_Bool horiz) +{ + Evas_Object *cnt = NULL; + + switch(type) + { + case 1: + cnt = elm_bg_add(obj); + evas_object_color_set(cnt, 128, 18, 128, 255); + evas_object_size_hint_min_set(cnt, 50, 50); + break; + case 2: + cnt = elm_button_add(obj); + break; + case 3: + cnt = elm_check_add(obj); + break; + case 4: + cnt = elm_box_add(obj); + elm_box_horizontal_set(cnt, !horiz); + evas_object_size_hint_align_set(cnt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(cnt, test_list_focus_content_get(obj, 2, horiz)); + elm_box_pack_end(cnt, test_list_focus_content_get(obj, 3, horiz)); + elm_box_pack_end(cnt, test_list_focus_content_get(obj, 2, horiz)); + break; + default: + break; + + } + + if (cnt) + { + evas_object_size_hint_weight_set(cnt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(cnt); + } + + return cnt; +} + +static void +test_list_focus_focus_on_selection_set(Evas_Object *gl, + Evas_Object *chk, Eina_Bool focus) +{ + elm_list_focus_on_selection_set(gl, focus); + elm_check_state_set(chk, focus); + printf("list_focus_on_selection = %s\n", (focus) ? "true" : "false"); +} + +static void +test_list_focus_focus_check_changed(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Eina_Bool nextstate = !elm_list_focus_on_selection_get(data); + test_list_focus_focus_on_selection_set(data, obj, nextstate); +} + +static void +test_list_focus_win_auto_focus_enable_check_changed(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_config_window_auto_focus_enable_set(elm_check_state_get(obj)); +} + +static void +test_list_focus_win_auto_focus_animate_check_changed(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_config_window_auto_focus_animate_set(elm_check_state_get(obj)); +} + +static void +test_list_focus_focus_highlight_check_changed(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_win_focus_highlight_enabled_set((Evas_Object *)data, + elm_check_state_get(obj)); +} + +static void +test_list_focus_focus_animate_check_changed(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_win_focus_highlight_animate_set((Evas_Object *)data, + elm_check_state_get(obj)); +} + +static void +test_list_focus_focus_move_policy_changed(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + int val = elm_radio_value_get(obj); + + if (val == 0) + elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_CLICK); + else if (val == 1) + elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_IN); +} + +static void +test_list_focus_item_loop_enable_check_changed(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Evas_Object *li = data; + elm_object_scroll_item_loop_enabled_set(li, elm_check_state_get(obj)); +} + +static void +test_list_focus_item_select_on_focus_disable_changed(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_config_item_select_on_focus_disabled_set(elm_check_state_get(obj)); +} + +static void +test_list_first_item_focus_on_first_focus_in_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_config_first_item_focus_on_first_focusin_set(elm_check_state_get(obj)); +} + +static void +_item_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("%s: %p\n", (char *)data, event_info); +} + +static void +_list_key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Evas_Event_Key_Down *ev = event_info; + printf("\n=== Key Down : %s ===\n", ev->keyname); +} + +static Ecore_Timer *timer = NULL; +static void +_test_list_focus_win_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + ecore_timer_del(timer); + timer = NULL; +} + +static Eina_Bool +_focus_timer_cb(void *data) +{ + elm_object_item_focus_set(data, EINA_TRUE); + timer = NULL; + + return ECORE_CALLBACK_CANCEL; +} + +static Eina_Bool +_select_timer_cb(void *data) +{ + elm_list_item_selected_set(data, EINA_TRUE); + timer = NULL; + + return ECORE_CALLBACK_CANCEL; +} + +static void +_focus_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + ecore_timer_del(timer); + timer = ecore_timer_add(1.5, _focus_timer_cb, data); +} + +static void +_sel_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + ecore_timer_del(timer); + timer = ecore_timer_add(1.5, _select_timer_cb, data); +} + +static void +_dis_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + elm_object_item_disabled_set(data, EINA_TRUE); +} + +static void +_focus_button_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("Button clicked: %s\n", (char *)data); +} + +static void +_test_list_focus(const char *name, const char *title, Eina_Bool horiz) +{ + Evas_Object *win, *li, *btn, *bx, *bx2, *fr, *bx_opt, *chk, *bx_btn; + Evas_Object *btn_focus, *btn_sel, *btn_dis, *bx_mv, *rd, *rdg; + unsigned int lhand, rhand, idx; + char buf[256]; + Elm_Object_Item *it = NULL, *it_0 = NULL, *it_3 = NULL; + + win = elm_win_util_standard_add(name, title); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, + _test_list_focus_win_del_cb, NULL); + + elm_config_window_auto_focus_enable_set(EINA_TRUE); + elm_config_window_auto_focus_animate_set(EINA_TRUE); + elm_win_focus_highlight_enabled_set(win, EINA_FALSE); + elm_win_focus_highlight_animate_set(win, EINA_FALSE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + btn = elm_button_add(bx); + elm_object_text_set(btn, "Up"); + elm_box_pack_end(bx, btn); + evas_object_smart_callback_add(btn, "clicked", + _focus_button_clicked_cb, "Up"); + evas_object_show(btn); + + bx2 = elm_box_add(bx); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + btn = elm_button_add(bx2); + elm_object_text_set(btn, "Left"); + elm_box_pack_end(bx2, btn); + evas_object_smart_callback_add(btn, "clicked", + _focus_button_clicked_cb, "Left"); + evas_object_show(btn); + + li = elm_list_add(win); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_list_horizontal_set(li, horiz); + elm_list_select_mode_set(li, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_box_pack_end(bx2, li); + evas_object_show(li); + evas_object_smart_callback_add(li, "item,focused", _item_cb, "item,focused"); + evas_object_smart_callback_add(li, "item,unfocused", _item_cb, "item,unfocused"); + evas_object_smart_callback_add(li, "selected", _item_cb, "selected"); + evas_object_smart_callback_add(li, "unselected", _item_cb, "unselected"); + evas_object_smart_callback_add(li, "activated", _item_cb, "activated"); + evas_object_smart_callback_add(li, "highlighted", _item_cb, "highlighted"); + evas_object_smart_callback_add(li, "unhighlighted", _item_cb, "unhighlighted"); + evas_object_event_callback_add(li, EVAS_CALLBACK_KEY_DOWN, _list_key_down_cb, NULL); + + btn = elm_button_add(bx2); + elm_object_text_set(btn, "Right"); + elm_box_pack_end(bx2, btn); + evas_object_smart_callback_add(btn, "clicked", + _focus_button_clicked_cb, "Right"); + evas_object_show(btn); + + btn = elm_button_add(bx); + elm_object_text_set(btn, "Down"); + elm_box_pack_end(bx, btn); + evas_object_smart_callback_add(btn, "clicked", + _focus_button_clicked_cb, "Down"); + evas_object_show(btn); + + // Options + fr = elm_frame_add(bx); + elm_object_text_set(fr, "Options"); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + bx_opt = elm_box_add(fr); + elm_box_horizontal_set(bx_opt, EINA_TRUE); + elm_object_content_set(fr, bx_opt); + evas_object_show(bx_opt); + + chk = elm_check_add(bx_opt); + elm_object_text_set(chk, "Window Auto Focus Enable"); + elm_check_state_set(chk, EINA_TRUE); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(chk, "changed", + test_list_focus_win_auto_focus_enable_check_changed, + NULL); + elm_box_pack_end(bx_opt, chk); + evas_object_show(chk); + + chk = elm_check_add(bx_opt); + elm_object_text_set(chk, "Window Auto Focus Animate"); + elm_check_state_set(chk, EINA_TRUE); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(chk, "changed", + test_list_focus_win_auto_focus_animate_check_changed, + NULL); + elm_box_pack_end(bx_opt, chk); + evas_object_show(chk); + + chk = elm_check_add(bx_opt); + elm_object_text_set(chk, "Focus Highlight"); + elm_check_state_set(chk, EINA_FALSE); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(chk, "changed", + test_list_focus_focus_highlight_check_changed, + win); + elm_box_pack_end(bx_opt, chk); + evas_object_show(chk); + + chk = elm_check_add(bx_opt); + elm_object_text_set(chk, "Focus Animation"); + elm_check_state_set(chk, EINA_FALSE); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(chk, "changed", + test_list_focus_focus_animate_check_changed, + win); + elm_box_pack_end(bx_opt, chk); + evas_object_show(chk); + + chk = elm_check_add(bx_opt); + elm_object_text_set(chk, "Focus on selection"); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(chk, "changed", + test_list_focus_focus_check_changed, li); + elm_box_pack_end(bx_opt, chk); + evas_object_show(chk); + + test_list_focus_focus_on_selection_set(li, chk, EINA_FALSE); + + chk = elm_check_add(bx_opt); + elm_object_text_set(chk, "Item Looping Enable"); + elm_check_state_set(chk, elm_object_scroll_item_loop_enabled_get(li)); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(chk, "changed", + test_list_focus_item_loop_enable_check_changed, + li); + elm_box_pack_end(bx_opt, chk); + evas_object_show(chk); + + chk = elm_check_add(bx_opt); + elm_object_text_set(chk, "Item Select on Focus disable"); + elm_check_state_set(chk, elm_config_item_select_on_focus_disabled_get()); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(chk, "changed", + test_list_focus_item_select_on_focus_disable_changed, + NULL); + elm_box_pack_end(bx_opt, chk); + evas_object_show(chk); + + chk = elm_check_add(bx_opt); + elm_object_text_set(chk, "First item focus on first focus in"); + elm_check_state_set(chk, elm_config_first_item_focus_on_first_focusin_get()); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(chk, "changed", + test_list_first_item_focus_on_first_focus_in_cb, + NULL); + elm_box_pack_end(bx_opt, chk); + evas_object_show(chk); + + // Focus Autoscroll Mode + fr = _focus_autoscroll_mode_frame_create(bx); + elm_box_pack_end(bx, fr); + + // Focus Movement Policy + fr = elm_frame_add(bx); + elm_object_text_set(fr, "Focus Movement Policy"); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + bx_mv = elm_box_add(fr); + elm_box_horizontal_set(bx_mv, EINA_TRUE); + elm_object_content_set(fr, bx_mv); + evas_object_show(bx_mv); + + rdg = rd = elm_radio_add(bx_mv); + elm_object_text_set(rd, "Focus Move by Click"); + elm_radio_state_value_set(rd, 0); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(rd, "changed", + test_list_focus_focus_move_policy_changed, + NULL); + elm_box_pack_end(bx_mv, rd); + evas_object_show(rd); + + rd = elm_radio_add(bx_mv); + elm_object_text_set(rd, "Focus Move by Mouse-In"); + elm_radio_group_add(rd, rdg); + elm_radio_state_value_set(rd, 1); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(rd, "changed", + test_list_focus_focus_move_policy_changed, + NULL); + elm_box_pack_end(bx_mv, rd); + evas_object_show(rd); + + // Focus/Selection + fr = elm_frame_add(bx); + elm_object_text_set(fr, "Focus/Selection"); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + bx_btn = elm_box_add(fr); + elm_object_content_set(fr, bx_btn); + evas_object_show(bx_btn); + + btn_focus = elm_button_add(bx_btn); + elm_object_text_set(btn_focus, "Focus 3rd Item after 1.5 seconds."); + evas_object_size_hint_weight_set(btn_focus, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn_focus, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx_btn, btn_focus); + evas_object_show(btn_focus); + + btn_sel = elm_button_add(bx_btn); + elm_object_text_set(btn_sel, "Select 3rd Item after 1.5 seconds."); + evas_object_size_hint_weight_set(btn_sel, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn_sel, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx_btn, btn_sel); + evas_object_show(btn_sel); + + btn_dis = elm_button_add(bx_btn); + elm_object_text_set(btn_dis, "Disable 1st Item."); + evas_object_size_hint_weight_set(btn_dis, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn_dis, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx_btn, btn_dis); + evas_object_show(btn_dis); + + for (idx = 0; _list_focus_combo[idx] >= 0; idx++) + { + lhand = _list_focus_combo[idx] / 10; + rhand = _list_focus_combo[idx] % 10; + + if (lhand > 4) lhand = 4; + if (rhand > 4) rhand = 4; + snprintf(buf, sizeof(buf), " %s / %s ", + _list_focus_names[lhand], + _list_focus_names[rhand]); + + it = elm_list_item_append(li, buf, + test_list_focus_content_get(li, lhand, horiz), + test_list_focus_content_get(li, rhand, horiz), + NULL, NULL); + if (idx == 0) + it_0 = it; + if (idx == 4) + elm_object_item_disabled_set(it, EINA_TRUE); + if (idx == 2) + it_3 = it; + } + + evas_object_smart_callback_add(btn_focus, "clicked", _focus_btn_cb, it_3); + evas_object_smart_callback_add(btn_sel, "clicked", _sel_btn_cb, it_3); + evas_object_smart_callback_add(btn_dis, "clicked", _dis_btn_cb, it_0); + + elm_list_go(li); + evas_object_show(li); + + evas_object_resize(win, 420, 600); + evas_object_show(win); +} + +void +test_list_focus(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + _test_list_focus("list-focus", "List Focus", EINA_FALSE); +} + +void +test_list_horiz_focus(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + _test_list_focus("list-focus-horizontal", "List Focus Horizontal", EINA_TRUE); +} + +void +test_list_separator(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *li, *ic, *ic2, *bx, *bxx; + char buf[PATH_MAX]; + Elm_Object_Item *list_it_sep; + + win = elm_win_util_standard_add("list", "List Separator"); + elm_win_autodel_set(win, EINA_TRUE); + + bxx = elm_box_add(win); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bxx); + evas_object_show(bxx); + + li = elm_list_add(win); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bxx, li); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_list_item_append(li, "Hello", ic, NULL, NULL, NULL); + + list_it_sep = elm_list_item_append(li, NULL, NULL, NULL, NULL, NULL); + elm_list_item_separator_set(list_it_sep, EINA_TRUE); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + elm_image_file_set(ic, buf, NULL); + elm_list_item_append(li, "world", ic, NULL, NULL, NULL); + + list_it_sep = elm_list_item_append(li, NULL, NULL, NULL, NULL, NULL); + elm_list_item_separator_set(list_it_sep, EINA_TRUE); + + ic = elm_icon_add(win); + elm_icon_standard_set(ic, "edit"); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + elm_list_item_append(li, ".", ic, NULL, NULL, NULL); + + list_it_sep = elm_list_item_append(li, NULL, NULL, NULL, NULL, NULL); + elm_list_item_separator_set(list_it_sep, EINA_TRUE); + + ic = elm_icon_add(win); + elm_icon_standard_set(ic, "delete"); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + ic2 = elm_icon_add(win); + elm_icon_standard_set(ic2, "clock"); + elm_image_resizable_set(ic2, EINA_FALSE, EINA_FALSE); + elm_list_item_append(li, "How", ic, ic2, NULL, NULL); + + list_it_sep = elm_list_item_append(li, NULL, NULL, NULL, NULL, NULL); + elm_list_item_separator_set(list_it_sep, EINA_TRUE); + + bx = elm_box_add(win); + elm_box_horizontal_set(bx, EINA_TRUE); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_align_set(ic, 0.5, 0.5); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_align_set(ic, 0.5, 0.0); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_align_set(ic, 0.0, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + elm_list_item_append(li, "are", bx, NULL, NULL, NULL); + + list_it_sep = elm_list_item_append(li, NULL, NULL, NULL, NULL, NULL); + elm_list_item_separator_set(list_it_sep, EINA_TRUE); + + elm_list_item_append(li, "you", NULL, NULL, NULL, NULL); + + list_it_sep = elm_list_item_append(li, NULL, NULL, NULL, NULL, NULL); + elm_list_item_separator_set(list_it_sep, EINA_TRUE); + + elm_list_item_append(li, "doing", NULL, NULL, NULL, NULL); + + list_it_sep = elm_list_item_append(li, NULL, NULL, NULL, NULL, NULL); + elm_list_item_separator_set(list_it_sep, EINA_TRUE); + + elm_list_item_append(li, "?", NULL, NULL, NULL, NULL); + + elm_list_go(li); + + evas_object_show(li); + + evas_object_resize(win, 320, 300); + evas_object_show(win); +} + +/***********/ + +typedef struct _List_Multi_Data List_Multi_Data; +struct _List_Multi_Data +{ + Evas_Object *list; + Evas_Object *rd1; + Evas_Object *rd2; +}; + +static void +_multi_select_changed_cb(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Eina_Bool multi = elm_check_state_get(obj); + List_Multi_Data *ld = data; + if (!ld) return; + + elm_list_multi_select_set(ld->list, multi); + elm_object_disabled_set(ld->rd1, !multi); + elm_object_disabled_set(ld->rd2, !multi); +} + +static void +_multi_select_mode_changed_cb(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_list_multi_select_mode_set(data, elm_radio_value_get(obj)); +} + +static void +_multi_select_frame_create(Evas_Object *bx, List_Multi_Data *ld) +{ + Evas_Object *fr, *bx2, *bx3, *tg, *rd, *rdg; + if (!ld) return; + + fr = elm_frame_add(bx); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.5); + elm_object_text_set(fr, "Multi Select Option"); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + bx2 = elm_box_add(fr); + elm_object_content_set(fr, bx2); + evas_object_show(bx2); + + tg = elm_check_add(bx2); + elm_object_style_set(tg, "toggle"); + elm_object_text_set(tg, "Multi Select Mode"); + elm_box_pack_end(bx2, tg); + evas_object_show(tg); + + bx3 = elm_box_add(bx2); + elm_box_horizontal_set(bx3, EINA_TRUE); + elm_box_pack_end(bx2, bx3); + evas_object_show(bx3); + + ld->rd1 = rdg = rd = elm_radio_add(bx3); + elm_radio_state_value_set(rd, ELM_OBJECT_MULTI_SELECT_MODE_DEFAULT); + elm_object_text_set(rd, "Default Mode"); + elm_box_pack_end(bx3, rd); + evas_object_show(rd); + elm_object_disabled_set(rd, EINA_TRUE); + evas_object_smart_callback_add(rd, "changed", + _multi_select_mode_changed_cb, ld->list); + + ld->rd2 = rd = elm_radio_add(bx3); + elm_radio_state_value_set(rd, ELM_OBJECT_MULTI_SELECT_MODE_WITH_CONTROL); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "With Control Mode"); + elm_box_pack_end(bx3, rd); + evas_object_show(rd); + elm_object_disabled_set(rd, EINA_TRUE); + evas_object_smart_callback_add(rd, "changed", + _multi_select_mode_changed_cb, ld->list); + + evas_object_smart_callback_add(tg, "changed", + _multi_select_changed_cb, ld); +} + +void +test_list_multi_select(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *li, *bx; + List_Multi_Data *ld = calloc(1, sizeof(List_Multi_Data)); + + win = elm_win_util_standard_add("list-multi-select", "List Multi Select"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, ld); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + ld->list = li = elm_list_add(bx); + _multi_select_frame_create(bx, ld); + + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, li); + evas_object_show(li); + + elm_list_item_append(li, "you", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "doing", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "out", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "there", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "today", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "?", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Here", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "are", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "some", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "more", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "items", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Longer label.", NULL, NULL, NULL, NULL); + + elm_list_go(li); + + evas_object_resize(win, 320, 500); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_main_menu.c b/src/bin/elementary/test_main_menu.c new file mode 100644 index 0000000000..507a138709 --- /dev/null +++ b/src/bin/elementary/test_main_menu.c @@ -0,0 +1,77 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> +static void +_click_me(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Elm_Object_Item *it = data; + Eina_Bool disabled = elm_object_item_disabled_get(it); + printf("The first item is now %s\n", disabled ? "enabled" : "disabled"); + elm_object_item_disabled_set(it, !disabled); +} + +void +test_main_menu(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *menu, *label, *bx; + Elm_Object_Item *menu_it, *menu_it1; + char *s; + Eina_Bool enabled = EINA_TRUE; + + elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); + + win = elm_win_util_standard_add("menu", "Menu"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + label = elm_label_add(win); + elm_object_text_set(label, "Note: the D-Bus menu example requires support from the " + "desktop environment to display the application menu"); + evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + elm_box_pack_end(bx, label); + evas_object_show(label); + + s = getenv("ELM_DISABLE_EXTERNAL_MENU"); + if (s) + enabled = !atoi(s); + + if (!enabled) + { + label = elm_label_add(win); + elm_object_text_set(label, "(ELM_DISABLE_EXTERNAL_MENU environment " + "variable is set. Using local menu instead)"); + evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + elm_box_pack_end(bx, label); + evas_object_show(label); + } + + menu = elm_win_main_menu_get(win); + + menu_it = elm_menu_item_add(menu, NULL, NULL, "first item", NULL, NULL); + elm_menu_item_add(menu, menu_it, "elementary", "first item", NULL, NULL); + menu_it1 = elm_menu_item_add(menu, menu_it, NULL, "submenu", NULL, NULL); + elm_menu_item_add(menu, menu_it1, NULL, "first item", NULL, NULL); + elm_menu_item_add(menu, menu_it1, "gimp", "second item", NULL, NULL); + + menu_it = elm_menu_item_add(menu, NULL, NULL, "second item", NULL, NULL); + menu_it1 = elm_menu_item_add(menu, menu_it, NULL, "disabled item", NULL, NULL); + elm_object_item_disabled_set(menu_it1, EINA_TRUE); + elm_menu_item_separator_add(menu, menu_it); + elm_menu_item_add(menu, menu_it, NULL, "click me :-)", _click_me, menu_it1); + elm_menu_item_add(menu, menu_it, "applications-email-panel", "third item", NULL, NULL); + menu_it1 = elm_menu_item_add(menu, menu_it, NULL, "sub menu", NULL, NULL); + elm_menu_item_add(menu, menu_it1, NULL, "first item", NULL, NULL); + + evas_object_resize(win, 250, 350); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_map.c b/src/bin/elementary/test_map.c new file mode 100644 index 0000000000..69f03a957e --- /dev/null +++ b/src/bin/elementary/test_map.c @@ -0,0 +1,1208 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +#define SOURCE_MAX 10 +#define MARKER_MAX 1000 +#define NAME_ENTRY_TEXT "Enter freeform address" + +typedef struct Overlay_Data +{ + char file[PATH_MAX]; +} Overlay_Data; + +typedef struct Map_Source +{ + Evas_Object *map; + Elm_Map_Source_Type type; + char *source_name; +} Map_Source; + + +static Elm_Map_Overlay *route_start, *route_end, *route_clas; +static Elm_Map_Overlay *bubble_img; +static Elm_Map_Overlay *bubble_parking; +static Elm_Map_Overlay *route_ovl; +static Elm_Map_Overlay *line_start, *line_end, *line; +static Elm_Map_Overlay *poly; +static Elm_Map_Overlay *circle; +static Elm_Map_Overlay *scale; +static Eina_List *poly_points; + +static Evas_Object *menu, *fs_win; +static Elm_Map_Route *route; +static Elm_Map_Name *name; +static Evas_Object *track; +static Evas_Coord down_x, down_y; +static Evas_Coord old_x, old_y, old_d; +static Map_Source ts[SOURCE_MAX]; +static Map_Source rs[SOURCE_MAX]; +static Map_Source ns[SOURCE_MAX]; + +static void +#ifdef ELM_EMAP +my_map_gpx_fileselector_done(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +#else +my_map_gpx_fileselector_done(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +#endif +{ + const char *selected = event_info; + + if (selected) + { + printf("Selected file: %s\n", selected); +#ifdef ELM_EMAP + EMap_Route *emap = emap_route_gpx_new(selected); + track = elm_map_track_add(data, emap); +#else + printf("libEMap is required !\n"); +#endif + } + evas_object_del(fs_win); +} + +static Evas_Object * +_route_icon_get(Evas_Object *obj) +{ + Evas_Object *icon = elm_icon_add(obj); + elm_image_file_set(icon, PACKAGE_DATA_DIR"/images/bubble.png", NULL); + evas_object_show(icon); + + return icon; +} + +static Evas_Object * +_box_get(Evas_Object *obj, Overlay_Data *data, Elm_Map_Overlay *ovl) +{ + Evas_Object *bx, *img, *label; + double lon, lat; + char buf[256]; + bx = elm_box_add(obj); + evas_object_show(bx); + + img = evas_object_image_add(evas_object_evas_get(obj)); + evas_object_image_file_set(img, data->file, NULL); + evas_object_image_filled_set(img, EINA_TRUE); + evas_object_size_hint_min_set(img, 64, 64); + evas_object_show(img); + elm_box_pack_end(bx, img); + + label = elm_label_add(bx); + elm_map_overlay_region_get(ovl, &lon, &lat); + snprintf(buf, sizeof(buf), "%0.4lf %0.4lf", lon, lat); + elm_object_text_set(label, buf); + evas_object_show(label); + elm_box_pack_end(bx, label); + return bx; +} + +static Evas_Object * +_label_get(Evas_Object *obj) +{ + Evas_Object *label; + label = elm_label_add(obj); + elm_object_text_set(label, "Here is a parking lot."); + evas_object_show(label); + return label; +} + +static Evas_Object * +_icon_get(Evas_Object *obj, Overlay_Data *data) +{ + Evas_Object *icon = elm_icon_add(obj); + elm_image_file_set(icon, data->file, NULL); + evas_object_show(icon); + + return icon; +} + +static void +_overlay_hide(void *data, Evas_Object *obj EINA_UNUSED, void *ev EINA_UNUSED) +{ + elm_map_overlay_hide_set(data, EINA_TRUE); +} + +static void +_overlay_pause(void *data, Evas_Object *obj EINA_UNUSED, void *ev EINA_UNUSED) +{ + elm_map_overlay_paused_set(data, EINA_TRUE); +} + +static void +_overlay_unpause(void *data, Evas_Object *obj EINA_UNUSED, void *ev EINA_UNUSED) +{ + elm_map_overlay_paused_set(data, EINA_FALSE); +} + +static void +_overlay_show(void *data, Evas_Object *obj EINA_UNUSED, void *ev EINA_UNUSED) +{ + elm_map_overlay_show(data); +} + +static Evas_Object * +_btn_box_get(Evas_Object *obj, Elm_Map_Overlay *ovl) +{ + Evas_Object *bx, *btn, *btn2, *btn3, *btn4; + bx = elm_box_add(obj); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + btn = elm_button_add(bx); + elm_object_text_set(btn, "Hide"); + evas_object_smart_callback_add(btn, "clicked", _overlay_hide, ovl); + evas_object_show(btn); + elm_box_pack_end(bx, btn); + + btn2 = elm_button_add(bx); + elm_object_text_set(btn2, "Pause"); + evas_object_smart_callback_add(btn2, "clicked", _overlay_pause, ovl); + evas_object_show(btn2); + elm_box_pack_end(bx, btn2); + + btn3 = elm_button_add(bx); + elm_object_text_set(btn3, "Unpause"); + evas_object_smart_callback_add(btn3, "clicked", _overlay_unpause, ovl); + evas_object_show(btn3); + elm_box_pack_end(bx, btn3); + + btn4 = elm_button_add(bx); + elm_object_text_set(btn4, "Show"); + evas_object_smart_callback_add(btn4, "clicked", _overlay_show, ovl); + evas_object_show(btn4); + elm_box_pack_end(bx, btn4); + + return bx; +} + +static void +_bubble_parking_follow(Evas_Object *map) +{ + double lon, lat; + Evas_Coord x, y; + + if (bubble_parking) + { + Elm_Map_Overlay *ovl = elm_map_overlay_data_get(bubble_parking); + elm_map_overlay_region_get(ovl, &lon, &lat); + elm_map_region_to_canvas_convert(map, lon, lat, &x, &y); + elm_map_canvas_to_region_convert(map, x+40, y+50, &lon, &lat); + elm_map_overlay_region_set(bubble_parking, lon, lat); + } +} + +static void +_overlays_num_check(Evas_Object *obj) +{ + Evas_Coord x, y, w, h; + double lon, lat, max_lon, max_lat, min_lon, min_lat; + Eina_List *overlays, *l; + Elm_Map_Overlay *ovl; + int cnt = 0; + int cnt_visible = 0; + + overlays = elm_map_overlays_get(obj); + evas_object_geometry_get(obj, &x, &y, &w, &h); + elm_map_canvas_to_region_convert(obj, x, y, &min_lon, &max_lat); + elm_map_canvas_to_region_convert(obj, x + w, y + h, &max_lon, &min_lat); + + EINA_LIST_FOREACH(overlays, l, ovl) + { + if (elm_map_overlay_type_get(ovl) == ELM_MAP_OVERLAY_TYPE_CLASS) + continue; + elm_map_overlay_region_get(ovl, &lon, &lat); + if ((min_lon <= lon) && (lon <= max_lon) && + (min_lat <= lat) && (lat <= max_lat)) + { + if (elm_map_overlay_visible_get(ovl)) cnt_visible++; + cnt++; + } + } + printf("Number of (visible/total) overlays in viewport: %d/%d\n", + cnt_visible, cnt); +} + +static void +_map_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("clicked\n"); +} + +static void +_map_clicked_double(void *data EINA_UNUSED, Evas_Object *obj, void *event_info) +{ + printf("clicked,double\n"); + double lon, lat; + Evas_Event_Mouse_Down *ev = event_info; + if (!ev) return; + if (elm_map_zoom_get(obj) < 5) return; + + elm_map_canvas_to_region_convert(obj, ev->canvas.x, ev->canvas.y, &lon, &lat); + printf("x:%d, y:%d, lon:%lf, lat:%lf\n", ev->canvas.x, ev->canvas.y, lon, lat); + + if (!route_clas) + { + route_clas = elm_map_overlay_class_add(obj); + elm_map_overlay_icon_set(route_clas, _route_icon_get(obj)); + elm_map_overlay_displayed_zoom_min_set(route_clas, 5); + } + + if (route_start && route_end) + { + elm_map_overlay_del(route_start); + elm_map_overlay_del(route_end); + elm_map_route_del(route); + route_start = NULL; + route_end = NULL; + route = NULL; + } + + if (!route_start) route_start = elm_map_overlay_add(obj, lon, lat); + else route_end = elm_map_overlay_add(obj, lon, lat); + + if (route_start && route_end) + { + double start_lon, start_lat, end_lon, end_lat; + elm_map_overlay_class_append(route_clas, route_start); + elm_map_overlay_class_append(route_clas, route_end); + elm_map_overlay_region_get(route_start, &start_lon, &start_lat); + elm_map_overlay_region_get(route_end, &end_lon, &end_lat); + route = elm_map_route_add(obj, ELM_MAP_ROUTE_TYPE_MOTOCAR, + ELM_MAP_ROUTE_METHOD_FASTEST, + start_lon, start_lat, end_lon, end_lat, + NULL, NULL); + } +} + +static void +_map_press(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("press\n"); +} + +static void +_map_longpressed(void *data EINA_UNUSED, Evas_Object *obj, void *event_info) +{ + if (!event_info) return; + double lon, lat; + Evas_Event_Mouse_Down *ev = event_info; + elm_map_canvas_to_region_convert(obj, ev->canvas.x, ev->canvas.y, &lon, &lat); + printf("longpressed, x:%d, y:%d, lon:%lf, lat:%lf\n", ev->canvas.x, ev->canvas.y, lon, lat); + + if (elm_map_zoom_get(obj) < 8) return; + if (name) elm_map_name_del(name); + name = elm_map_name_add(obj, NULL, lon, lat, NULL, NULL); +} + +static void +_map_scroll(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + double lon, lat; + elm_map_region_get(obj, &lon, &lat); + printf("scroll, longitude: %f latitude: %f\n", lon, lat); + _bubble_parking_follow(obj); +} + +static void +_map_drag_start(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("scroll,drag,start\n"); + evas_object_smart_callback_del(data, "longpressed", _map_longpressed); +} + +static void +_map_drag_stop(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("scroll,drag,stop\n"); + evas_object_smart_callback_add(data, "longpressed", _map_longpressed, data); + _overlays_num_check(obj); +} + +static void +_map_anim_start(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("scroll,anim,start\n"); +} + +static void +_map_anim_stop(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("scroll,anim,stop\n"); +} + +static void +_map_zoom_start(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("zoom,start\n"); +} + +static void +_map_zoom_stop(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("zoom,stop\n"); + _overlays_num_check(obj); +} + +static void +_map_zoom_change(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("zoom,change\n"); + _bubble_parking_follow(obj); +} + +static void +_map_loaded(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("loaded\n"); +} + +static void +_map_tile_load(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("tile,load\n"); +} + +static void +_map_tile_loaded(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + int try_num, finish_num; + elm_map_tile_load_status_get(data, &try_num, &finish_num); + printf("tile,loaded: %d / %d\n", finish_num, try_num); +} + +static void +_map_tile_loaded_fail(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + int try_num, finish_num; + elm_map_tile_load_status_get(data, &try_num, &finish_num); + printf("tile,loaded,fail: %d / %d\n", finish_num, try_num); +} + +static void +_map_route_load(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("route,load\n"); +} + +static void +_map_route_loaded(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + printf("route,loaded\n"); + double d; + const char *w, *n; + + d = elm_map_route_distance_get(route); + printf("route distance = %lf km\n", d); + + w = elm_map_route_waypoint_get(route); + if (w) printf("[waypoints]\n%s\n", w); + + n = elm_map_route_node_get(route); + if (n) printf("[nodes]\n%s\n", n); + + if (route_ovl) elm_map_overlay_del(route_ovl); + route_ovl = elm_map_overlay_route_add(obj, route); +} + +static void +_map_route_loaded_fail(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("route,loaded,fail\n"); +} + +static void +_map_name_load(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("name,load\n"); +} + +static void +_map_name_loaded(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("name,loaded\n"); + if (!name) return; + double lon, lat; + const char *addr = elm_map_name_address_get(name); + elm_map_name_region_get(name, &lon, &lat); + if (addr) + { + printf("name of [lon = %lf, lat = %lf] is %s\n", lon, lat, addr); + if ((lon != 0.0) && (lat !=0.0)) + { + Eina_Bool b = elm_map_paused_get(data); + elm_map_paused_set(data, EINA_TRUE); + elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL); + elm_map_zoom_set(data, elm_map_zoom_max_get(data)); + elm_map_region_show(data, lon, lat); + elm_map_paused_set(data, b); + } + } + + elm_map_name_del(name); + name = NULL; +} + +static void +_map_name_loaded_fail(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("name,loaded,fail\n"); +} + +static void +_src_set(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Map_Source *s = data; + + if (!s) return; + elm_map_source_set(s->map, s->type, s->source_name); +} + +static void +_show_urmatt(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL); + if (elm_map_zoom_get(data) < 12) elm_map_zoom_set(data, 12); + elm_map_region_show(data,7.325201, 48.526813); +} + +static void +_bring_seoul(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL); + if (elm_map_zoom_get(data) < 12) elm_map_zoom_set(data, 12); + elm_map_region_bring_in(data, 126.977969, 37.566535); +} + +static void +_bring_zoom_suwon(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_map_region_zoom_bring_in(data, 16, 126.977969, 37.566535); +} + +static void +_paused_set(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_map_paused_set(data, EINA_TRUE); +} + +static void +_paused_unset(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_map_paused_set(data, EINA_FALSE); +} + +static void +_zoom_in(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + int zoom; + + zoom = elm_map_zoom_get(data) + 1; + elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL); + elm_map_zoom_set(data, zoom); +} + +static void +_zoom_out(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + int zoom; + + zoom = elm_map_zoom_get(data) - 1; + elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL); + elm_map_zoom_set(data, zoom); +} + +static void +_zoom_fit(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_AUTO_FIT); +} + +static void +_zoom_fill(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_AUTO_FILL); +} + +static void +_zoom_manual(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL); +} + +static void +_track_add(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *fs, *vbox, *hbox, *sep; + const char *path = NULL; + + fs_win = elm_win_util_standard_add("fileselector", "File Selector"); + elm_win_autodel_set(fs_win, EINA_TRUE); + + vbox = elm_box_add(fs_win); + evas_object_size_hint_weight_set(vbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(fs_win, vbox); + evas_object_show(vbox); + + fs = elm_fileselector_add(fs_win); + elm_fileselector_is_save_set(fs, EINA_TRUE); + elm_fileselector_expandable_set(fs, EINA_FALSE); + path = eina_environment_home_get(); + //if "HOME" is not available, set current dir. path + if (!path) + path = "."; + elm_fileselector_path_set(fs, path); + evas_object_size_hint_weight_set(fs, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fs, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(vbox, fs); + evas_object_show(fs); + + evas_object_smart_callback_add(fs, "done", my_map_gpx_fileselector_done, data); + + sep = elm_separator_add(fs_win); + elm_separator_horizontal_set(sep, EINA_TRUE); + elm_box_pack_end(vbox, sep); + evas_object_show(sep); + + hbox = elm_box_add(fs_win); + elm_box_horizontal_set(hbox, EINA_TRUE); + elm_box_pack_end(vbox, hbox); + evas_object_show(hbox); + + evas_object_resize(fs_win, 240, 350); + evas_object_show(fs_win); +} + + +static void +_track_remove(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_map_track_remove(data, track); +} + +static void +_rotate_cw(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + double d; + Evas_Coord x, y, w, h; + float half_w, half_h; + evas_object_geometry_get(data, &x, &y, &w, &h); + half_w = (float)w * 0.5; + half_h = (float)h * 0.5; + + elm_map_rotate_get(data, &d, NULL, NULL); + d += 15.0; + elm_map_rotate_set(data, d, x + half_w, y + half_h); +} + +static void +_rotate_ccw(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + double d; + Evas_Coord x, y, w, h; + float half_w, half_h; + evas_object_geometry_get(data, &x, &y, &w, &h); + half_w = (float)w * 0.5; + half_h = (float)h * 0.5; + + elm_map_rotate_get(data, &d, NULL, NULL); + d -= 15.0; + elm_map_rotate_set(data, d, x + half_w, y + half_h); +} + +static void +_rotate_reset(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Coord x, y, w, h; + float half_w, half_h; + evas_object_geometry_get(data, &x, &y, &w, &h); + half_w = (float)w * 0.5; + half_h = (float)h * 0.5; + + elm_map_rotate_set(data, 0.0, x + half_w, y + half_h); +} + +static void +_wheel_disable(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_map_wheel_disabled_set(data, EINA_TRUE); +} + +static void +_wheel_enable(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_map_wheel_disabled_set(data, EINA_FALSE); +} + +static void +_zoom_min_set(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_map_zoom_min_set(data, 1); +} + +static void +_zoom_max_set(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_map_zoom_max_set(data, 10); +} + +static void +_line_add(void *data, Evas_Object *obj EINA_UNUSED, void *ei EINA_UNUSED) +{ + double lon, lat; + + elm_map_canvas_to_region_convert(data, down_x, down_y, &lon, &lat); + printf("line marker: %d %d %lf %lf\n", down_x, down_y, lon, lat); + if (line_start && line_end) + { + elm_map_overlay_del(line_start); + elm_map_overlay_del(line_end); + elm_map_overlay_del(line); + line_start = NULL; + line_end = NULL; + line = NULL; + } + if (!line_start) line_start = elm_map_overlay_add(data, lon, lat); + else if (!line_end) line_end = elm_map_overlay_add(data, lon, lat); + + if (line_start && line_end) + { + double flon, flat, tlon, tlat; + elm_map_overlay_region_get(line_start, &flon, &flat); + elm_map_overlay_region_get(line_end, &tlon, &tlat); + line = elm_map_overlay_line_add(data, flon, flat, tlon, tlat); + printf("line add: (%lf, %lf) --> (%lf, %lf)\n", flon, flat, tlon, tlat); + } +} + +static void +_poly_add(void *data, Evas_Object *obj EINA_UNUSED, void *ei EINA_UNUSED) +{ + double lon, lat; + + elm_map_canvas_to_region_convert(data, down_x, down_y, &lon, &lat); + printf("%d %d %lf %lf\n", down_x, down_y, lon, lat); + + if (!poly) poly = elm_map_overlay_polygon_add(data); + poly_points = eina_list_append(poly_points, + elm_map_overlay_add(data, lon, lat)); + elm_map_overlay_polygon_region_add(poly, lon, lat); +} + +static void +_poly_clear(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *ei EINA_UNUSED) +{ + Elm_Map_Overlay *ovl; + if (poly) elm_map_overlay_del(poly); + EINA_LIST_FREE(poly_points, ovl) elm_map_overlay_del(ovl); + poly = NULL; + poly_points = NULL; +} + +static void +_circle_add(void *data, Evas_Object *obj EINA_UNUSED, void *ei EINA_UNUSED) +{ + double radius = 100; + double lon, lat; + + if (circle) elm_map_overlay_del(circle); + elm_map_canvas_to_region_convert(data, down_x, down_y, &lon, &lat); + circle = elm_map_overlay_circle_add(data, lon, lat, radius); +} + +static void +_scale_add(void *data, Evas_Object *obj EINA_UNUSED, void *ei EINA_UNUSED) +{ + if (scale) elm_map_overlay_del(scale); + scale = elm_map_overlay_scale_add(data, down_x, down_y); +} + +static void +_submenu_src_add(void *data, Elm_Object_Item *parent) +{ + int idx; + const char **tile_srcs; + const char **route_srcs; + const char **name_srcs; + + if ((!data) || (!parent)) return; + + tile_srcs = elm_map_sources_get(data, ELM_MAP_SOURCE_TYPE_TILE); + route_srcs = elm_map_sources_get(data, ELM_MAP_SOURCE_TYPE_ROUTE); + name_srcs = elm_map_sources_get(data, ELM_MAP_SOURCE_TYPE_NAME); + + for (idx = 0; tile_srcs[idx]; idx++) + { + if (idx >= SOURCE_MAX) break; + ts[idx].map = data; + ts[idx].type = ELM_MAP_SOURCE_TYPE_TILE; + ts[idx].source_name = strdup(tile_srcs[idx]); + elm_menu_item_add(menu, parent, "", tile_srcs[idx], _src_set, &ts[idx]); + } + for (idx = 0; route_srcs[idx]; idx++) + { + if (idx >= SOURCE_MAX) break; + rs[idx].map = data; + rs[idx].type = ELM_MAP_SOURCE_TYPE_ROUTE; + rs[idx].source_name = strdup(route_srcs[idx]); + elm_menu_item_add(menu, parent, "", route_srcs[idx], _src_set, &rs[idx]); + } + for (idx = 0; name_srcs[idx]; idx++) + { + if (idx >= SOURCE_MAX) break; + ns[idx].map = data; + ns[idx].type = ELM_MAP_SOURCE_TYPE_NAME; + ns[idx].source_name = strdup(name_srcs[idx]); + elm_menu_item_add(menu, parent, "", name_srcs[idx], _src_set, &ns[idx]); + } +} + +static void +_submenu_move_add(void *data, Elm_Object_Item *parent) +{ + if ((!data) || (!parent)) return; + elm_menu_item_add(menu, parent, NULL, "Show Urmatt", _show_urmatt, data); + elm_menu_item_add(menu, parent, NULL, "Bring Seoul", _bring_seoul, data); + elm_menu_item_add(menu, parent, NULL, "Zoom & Bring Suwon", _bring_zoom_suwon, data); + +} + +static void +_submenu_zoom_add(void *data, Elm_Object_Item *parent) +{ + if ((!data) || (!parent)) return; + elm_menu_item_add(menu, parent, NULL, "Zoom +", _zoom_in, data); + elm_menu_item_add(menu, parent, NULL, "Zoom -", _zoom_out, data); + elm_menu_item_add(menu, parent, NULL, "Zoom Fit", _zoom_fit, data); + elm_menu_item_add(menu, parent, NULL, "Zoom Fill", _zoom_fill, data); + elm_menu_item_add(menu, parent, NULL, "Zoom Manual", _zoom_manual, data); + elm_menu_item_add(menu, parent, NULL, "Zoom Min to 1", _zoom_min_set, data); + elm_menu_item_add(menu, parent, NULL, "Zoom Max to 10", _zoom_max_set, data); +} + +static void +_submenu_prop_add(void *data, Elm_Object_Item *parent) +{ + if ((!data) || (!parent)) return; + elm_menu_item_add(menu, parent, NULL, "Paused Set", _paused_set, data); + elm_menu_item_add(menu, parent, NULL, "Paused Unset", _paused_unset, data); + elm_menu_item_add(menu, parent, NULL, "Rotate CW", _rotate_cw, data); + elm_menu_item_add(menu, parent, NULL, "Rotate CCW", _rotate_ccw, data); + elm_menu_item_add(menu, parent, NULL, "Reset Rotate", _rotate_reset, data); + elm_menu_item_add(menu, parent, NULL, "Disable Wheel", _wheel_disable, data); + elm_menu_item_add(menu, parent, NULL, "Enable Wheel", _wheel_enable, data); +} + +static void +_submenu_track_add(void *data, Elm_Object_Item *parent) +{ + if ((!data) || (!parent)) return; + elm_menu_item_add(menu, parent, NULL, "Add Track", _track_add, data); + elm_menu_item_add(menu, parent, NULL, "Remove Track", _track_remove, data); +} + +static void +_submenu_ovl_add(void *data, Elm_Object_Item *parent) +{ + if ((!data) || (!parent)) return; + elm_menu_item_add(menu, parent, NULL, "Add line", _line_add, data); + elm_menu_item_add(menu, parent, NULL, "Add polygon", _poly_add, data); + elm_menu_item_add(menu, parent, NULL, "Clear polygon", _poly_clear, data); + elm_menu_item_add(menu, parent, NULL, "Add circle", _circle_add, data); + elm_menu_item_add(menu, parent, NULL, "Add scale", _scale_add, data); +} + +static void +_submenu_info_add(Evas_Object *map, Elm_Object_Item *parent) +{ + if (!map || !parent) return; + char buf[PATH_MAX] = { 0 }; + double lon = 0.0, lat = 0.0; + + elm_map_canvas_to_region_convert(map, + down_x, down_y, + &lon, &lat); + + snprintf(buf, PATH_MAX, "Longitude : %f", lon); + elm_menu_item_add(menu, parent, NULL, buf, NULL, NULL); + + snprintf(buf, PATH_MAX, "Latitude : %f", lat); + elm_menu_item_add(menu, parent, NULL, buf, NULL, NULL); +} + +static void +_map_mouse_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Down *ev = event_info; + Elm_Object_Item *menu_it; + static Elm_Object_Item *info_it = NULL; + + if (!ev) return; + + if (ev->button == 2) + { + old_x = ev->canvas.x; + old_y = ev->canvas.y; + old_d = 0.0; + } + else if (ev->button == 3) + { + down_x = ev->canvas.x; + down_y = ev->canvas.y; + if (!menu) + { + menu = elm_menu_add(obj); + elm_menu_parent_set(menu, obj); + menu_it = elm_menu_item_add(menu, NULL, "", "Source", NULL, NULL); + _submenu_src_add(data, menu_it); + menu_it = elm_menu_item_add(menu, NULL, "", "Move", NULL, NULL); + _submenu_move_add(data, menu_it); + menu_it = elm_menu_item_add(menu, NULL, "", "Zoom", NULL, NULL); + _submenu_zoom_add(data, menu_it); + menu_it = elm_menu_item_add(menu, NULL, "", "Prop", NULL, NULL); + _submenu_prop_add(data, menu_it); + menu_it = elm_menu_item_add(menu, NULL, "", "Track", NULL, NULL); + _submenu_track_add(data, menu_it); + menu_it = elm_menu_item_add(menu, NULL, "", "Overlay", NULL, NULL); + _submenu_ovl_add(data, menu_it); + + info_it = elm_menu_item_add(menu, NULL, "", "Info", NULL, NULL); + } + + elm_menu_item_subitems_clear(info_it); + _submenu_info_add(obj, info_it); + + elm_menu_move(menu, ev->canvas.x, ev->canvas.y); + evas_object_show(menu); + } +} + +static void +_map_mouse_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Evas_Event_Mouse_Move *move = event_info; + Evas_Coord x, y, w, h; + float half_w, half_h; + int d, d_diff; + double cur_d; + if (!move) return; + + if (move->buttons == 2) + { + evas_object_geometry_get(data, &x, &y, &w, &h); + half_w = (float)w * 0.5; + half_h = (float)h * 0.5; + elm_map_rotate_get(data, &cur_d, NULL, NULL); + + d = move->cur.canvas.x - old_x; + if (!old_d) old_d = d; + else + { + d_diff = old_d - d; + if (d_diff > 0) + { + old_d --; + cur_d += 1.0; + } + else if (d_diff < 0) + { + old_d ++; + cur_d -= 1.0; + } + old_d = d; + elm_map_rotate_set(data, cur_d, x + half_w, y + half_h); + } + } +} + +static void +_map_mouse_up(void *data EINA_UNUSED, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Evas_Event_Mouse_Up *up = event_info; + if (!up) return; + + if (up->button == 2) + { + old_x = 0; + old_y = 0; + } +} + +static void +_overlay_cb(void *data EINA_UNUSED, Evas_Object *map, void *ev) +{ + printf("Overlay clicked: "); + Elm_Map_Overlay *overlay = ev; + Overlay_Data *od; + Elm_Map_Overlay_Type type = elm_map_overlay_type_get(overlay); + + if (type != ELM_MAP_OVERLAY_TYPE_GROUP && + type != ELM_MAP_OVERLAY_TYPE_DEFAULT) return; + + if (!bubble_img) bubble_img = elm_map_overlay_bubble_add(map); + elm_map_overlay_bubble_follow(bubble_img, overlay); + elm_map_overlay_bubble_content_clear(bubble_img); + + if (type == ELM_MAP_OVERLAY_TYPE_GROUP) + { + Eina_List *l; + Elm_Map_Overlay *memb; + Eina_List *members = elm_map_overlay_group_members_get(overlay); + printf("Group Members Num: %d\n", eina_list_count(members)); + EINA_LIST_FOREACH(members, l, memb) + { + od = elm_map_overlay_data_get(memb); + if (od) + elm_map_overlay_bubble_content_append(bubble_img, + _box_get(map, od, memb)); + } + } + else + { + od = elm_map_overlay_data_get(overlay); + if (od) + elm_map_overlay_bubble_content_append(bubble_img, + _box_get(map, od, overlay)); + elm_map_overlay_bubble_content_append(bubble_img, + _btn_box_get(map, overlay)); + } +} + +static void +_parking_cb(void *data EINA_UNUSED, Evas_Object *map, Elm_Map_Overlay *ovl) +{ + double lon, lat; + Evas_Coord x, y; + elm_map_overlay_region_get(ovl, &lon, &lat); + elm_map_region_to_canvas_convert(map, lon, lat, &x, &y); + printf("Parking clicked: %lf %lf %d %d\n", lon, lat, x, y); + + elm_map_canvas_to_region_convert(map, x+40, y+50, &lon, &lat); + if (!bubble_parking) + { + Evas_Object *bubble, *label; + bubble = elm_bubble_add(map); + elm_bubble_pos_set(bubble, ELM_BUBBLE_POS_TOP_LEFT); + elm_object_text_set(bubble, "Overlay object"); + elm_object_part_text_set(bubble, "info", "Bubble is overlayed"); + + label = elm_label_add(bubble); + elm_object_text_set(label, "Parking Here !!"); + evas_object_show(label); + elm_object_content_set(bubble, label); + + evas_object_resize(bubble, 125, 50); + evas_object_show(bubble); + + bubble_parking = elm_map_overlay_add(map, lon, lat); + elm_map_overlay_content_set(bubble_parking, bubble); + } + else elm_map_overlay_region_set(bubble_parking, lon, lat); + elm_map_overlay_data_set(bubble_parking, ovl); +} + +static void +_del_map(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *ei EINA_UNUSED) +{ + if (route_start) elm_map_overlay_del(route_start); + if (route_end) elm_map_overlay_del(route_end); + if (route_clas) elm_map_overlay_del(route_clas); + if (bubble_img) elm_map_overlay_del(bubble_img); + if (bubble_parking) elm_map_overlay_del(bubble_parking); + if (route_ovl) elm_map_overlay_del(route_ovl); + route_start = NULL; + route_end = NULL; + route_clas = NULL; + bubble_img = NULL; + bubble_parking = NULL; + route_ovl = NULL; + + if (route) elm_map_route_del(route); + if (name) elm_map_name_del(name); + if (menu) evas_object_del(menu); + route = NULL; + name = NULL; + menu = NULL; +} + +void +test_map(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *map; + int idx = 0; + const char **tile_srcs; + const char **route_srcs; + const char **name_srcs; + Overlay_Data data1; + Overlay_Data data2; + Overlay_Data data3; + Overlay_Data data4; + Overlay_Data data5; + Overlay_Data data6; + Overlay_Data data7; + Overlay_Data data8; + Overlay_Data data9; + Overlay_Data data10; + Overlay_Data data11; + Overlay_Data parking; + Overlay_Data icon_data; + + snprintf(data1.file, PATH_MAX, "%s/images/logo.png", elm_app_data_dir_get()); + snprintf(data2.file, PATH_MAX, "%s/images/logo_small.png", elm_app_data_dir_get()); + snprintf(data3.file, PATH_MAX, "%s/images/panel_01.png", elm_app_data_dir_get()); + snprintf(data4.file, PATH_MAX, "%s/images/plant_01.png", elm_app_data_dir_get()); + snprintf(data5.file, PATH_MAX, "%s/images/rock_01.png", elm_app_data_dir_get()); + snprintf(data6.file, PATH_MAX, "%s/images/rock_02.png", elm_app_data_dir_get()); + snprintf(data7.file, PATH_MAX, "%s/images/sky_01.png", elm_app_data_dir_get()); + snprintf(data8.file, PATH_MAX, "%s/images/sky_02.png", elm_app_data_dir_get()); + snprintf(data9.file, PATH_MAX, "%s/images/sky_03.png", elm_app_data_dir_get()); + snprintf(data10.file, PATH_MAX, "%s/images/sky_03.png", elm_app_data_dir_get()); + snprintf(data11.file, PATH_MAX, "%s/images/wood_01.png", elm_app_data_dir_get()); + snprintf(parking.file, PATH_MAX, "%s/images/parking.png", elm_app_data_dir_get()); + snprintf(icon_data.file, PATH_MAX, "%s/images/icon_14.png", elm_app_data_dir_get()); + + win = elm_win_util_standard_add("map", "Map"); + elm_win_autodel_set(win, EINA_TRUE); + + map = elm_map_add(win); + if (map) + { + Elm_Map_Overlay *ovl_1, *ovl_2, *ovl_3, *ovl_4, *ovl_5, *ovl_6; + Elm_Map_Overlay *ovl_7, *ovl_8, *ovl_9, *ovl_10, *ovl_11; + Elm_Map_Overlay *parking1, *parking2, *parking3, *parking4, *parking5; + Elm_Map_Overlay *grp1, *grp2, *grp_parking; + + evas_object_event_callback_add(map, EVAS_CALLBACK_DEL, _del_map, NULL); + + srand(time(NULL)); + + tile_srcs = elm_map_sources_get(map, ELM_MAP_SOURCE_TYPE_TILE); + route_srcs = elm_map_sources_get(map, ELM_MAP_SOURCE_TYPE_ROUTE); + name_srcs = elm_map_sources_get(map, ELM_MAP_SOURCE_TYPE_NAME); + + if (!tile_srcs) return; + printf("Tile sources [ "); + for (idx = 0; tile_srcs[idx] ; idx++) printf("%s, ", tile_srcs[idx]); + printf("]\n"); + if (!route_srcs) return; + printf("Route sources [ "); + for (idx = 0; route_srcs[idx] ; idx++) printf("%s, ", route_srcs[idx]); + printf("]\n"); + if (!name_srcs) return; + printf("Name sources [ "); + for (idx = 0; name_srcs[idx] ; idx++) printf("%s, ", name_srcs[idx]); + printf("]\n"); + + evas_object_size_hint_weight_set(map, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, map); + evas_object_data_set(map, "window", win); + + evas_object_event_callback_add(map, EVAS_CALLBACK_MOUSE_DOWN, + _map_mouse_down, map); + evas_object_event_callback_add(map, EVAS_CALLBACK_MOUSE_MOVE, + _map_mouse_move, map); + evas_object_event_callback_add(map, EVAS_CALLBACK_MOUSE_UP, + _map_mouse_up, map); + + evas_object_smart_callback_add(map, "clicked", _map_clicked, map); + evas_object_smart_callback_add(map, "clicked,double", _map_clicked_double, map); + evas_object_smart_callback_add(map, "press", _map_press, map); + evas_object_smart_callback_add(map, "longpressed", _map_longpressed, map); + evas_object_smart_callback_add(map, "scroll", _map_scroll, map); + evas_object_smart_callback_add(map, "scroll,drag,start", _map_drag_start, map); + evas_object_smart_callback_add(map, "scroll,drag,stop", _map_drag_stop, map); + evas_object_smart_callback_add(map, "scroll,anim,start", _map_anim_start, map); + evas_object_smart_callback_add(map, "scroll,anim,stop", _map_anim_stop, map); + evas_object_smart_callback_add(map, "zoom,start", _map_zoom_start, map); + evas_object_smart_callback_add(map, "zoom,stop", _map_zoom_stop, map); + evas_object_smart_callback_add(map, "zoom,change", _map_zoom_change, map); + evas_object_smart_callback_add(map, "loaded", _map_loaded, map); + evas_object_smart_callback_add(map, "tile,load", _map_tile_load, map); + evas_object_smart_callback_add(map, "tile,loaded", _map_tile_loaded, map); + evas_object_smart_callback_add(map, "tile,loaded,fail", _map_tile_loaded_fail, map); + evas_object_smart_callback_add(map, "route,load", _map_route_load, map); + evas_object_smart_callback_add(map, "route,loaded", _map_route_loaded, map); + evas_object_smart_callback_add(map, "route,loaded,fail", _map_route_loaded_fail, map); + evas_object_smart_callback_add(map, "name,load", _map_name_load, map); + evas_object_smart_callback_add(map, "name,loaded", _map_name_loaded, map); + evas_object_smart_callback_add(map, "name,loaded,fail", _map_name_loaded_fail, map); + evas_object_smart_callback_add(map, "overlay,clicked", _overlay_cb, map); + + // Create Overlays + ovl_1 = elm_map_overlay_add(map, 2.352, 48.857); + elm_map_overlay_color_set(ovl_1, 0x00, 0xfa, 0x9a, 0xff); + elm_map_overlay_displayed_zoom_min_set(ovl_1, 5); + ovl_2 = elm_map_overlay_add(map, 3, 48.857); + elm_map_overlay_color_set(ovl_2, 0xff, 0xd7, 0x00, 0xff); + elm_map_overlay_displayed_zoom_min_set(ovl_2, 4); + ovl_3 = elm_map_overlay_add(map, 2.352, 49); + elm_map_overlay_displayed_zoom_min_set(ovl_3, 3); + ovl_4 = elm_map_overlay_add(map, 7.31451, 48.857127); + ovl_5 = elm_map_overlay_add(map, 7.314704, 48.857119); + ovl_6 = elm_map_overlay_add(map, 7.31432, 48.856785); + ovl_7 = elm_map_overlay_add(map, 7.3148, 48.85725); + ovl_8 = elm_map_overlay_add(map, 7.316445, 48.8572210000694); + ovl_9 = elm_map_overlay_add(map, 7.316527000125, 48.85609); + ovl_10 = elm_map_overlay_add(map, 7.3165409990833, 48.856078); + ovl_11 = elm_map_overlay_add(map, 7.319812, 48.856561); + elm_map_overlay_data_set(ovl_1, &data1); + elm_map_overlay_data_set(ovl_2, &data2); + elm_map_overlay_data_set(ovl_3, &data3); + elm_map_overlay_data_set(ovl_4, &data4); + elm_map_overlay_data_set(ovl_5, &data5); + elm_map_overlay_data_set(ovl_6, &data6); + elm_map_overlay_data_set(ovl_7, &data7); + elm_map_overlay_data_set(ovl_8, &data8); + elm_map_overlay_data_set(ovl_9, &data9); + elm_map_overlay_data_set(ovl_10, &data10); + elm_map_overlay_data_set(ovl_11, &data11); + + // Append overlays to groups + grp1 = elm_map_overlay_class_add(map); + elm_map_overlay_class_zoom_max_set(grp1, 6); + elm_map_overlay_class_append(grp1, ovl_1); + elm_map_overlay_class_append(grp1, ovl_2); + elm_map_overlay_class_append(grp1, ovl_3); + elm_map_overlay_class_append(grp1, ovl_4); + elm_map_overlay_class_append(grp1, ovl_5); + elm_map_overlay_class_append(grp1, ovl_6); + + // Append overlays to groups + grp2 = elm_map_overlay_class_add(map); + elm_map_overlay_displayed_zoom_min_set(grp2, 9); + elm_map_overlay_class_append(grp2, ovl_7); + elm_map_overlay_class_append(grp2, ovl_8); + elm_map_overlay_class_append(grp2, ovl_9); + elm_map_overlay_class_append(grp2, ovl_10); + elm_map_overlay_class_append(grp2, ovl_11); + + // Create overlays + parking1 = elm_map_overlay_add(map, 127.04871, 37.25730); + parking2 = elm_map_overlay_add(map, 127.05578, 37.25545); + parking3 = elm_map_overlay_add(map, 127.05515, 37.25439); + parking4 = elm_map_overlay_add(map, 127.05328, 37.25721); + elm_map_overlay_icon_set(parking4, _icon_get(map, &icon_data)); + parking5 = elm_map_overlay_add(map, 127.05431, 37.25873); + elm_map_overlay_content_set(parking5, _label_get(map)); + elm_map_overlay_get_cb_set(parking1, _parking_cb, NULL); + elm_map_overlay_get_cb_set(parking2, _parking_cb, NULL); + elm_map_overlay_get_cb_set(parking3, _parking_cb, NULL); + elm_map_overlay_get_cb_set(parking4, _parking_cb, NULL); + elm_map_overlay_get_cb_set(parking5, _parking_cb, NULL); + + // Append overlays to groups + grp_parking = elm_map_overlay_class_add(map); + elm_map_overlay_icon_set(grp_parking, _icon_get(map, &parking)); + elm_map_overlay_get_cb_set(grp_parking, _parking_cb, NULL); + elm_map_overlay_class_append(grp_parking, parking1); + elm_map_overlay_class_append(grp_parking, parking2); + elm_map_overlay_class_append(grp_parking, parking3); + elm_map_overlay_class_append(grp_parking, parking4); + elm_map_overlay_class_append(grp_parking, parking5); + + evas_object_show(map); + } + + evas_object_resize(win, 800, 800); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_menu.c b/src/bin/elementary/test_menu.c new file mode 100644 index 0000000000..ec084e68a4 --- /dev/null +++ b/src/bin/elementary/test_menu.c @@ -0,0 +1,312 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void +_menu_dismissed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("menu dismissed callback is called!\n"); +} + +static void +_menu_show_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + Evas_Event_Mouse_Down *ev = event_info; + elm_menu_move(data, ev->canvas.x, ev->canvas.y); + evas_object_show(data); +} + +static void +_populate_4(Evas_Object *menu, Elm_Object_Item *menu_it) +{ + Elm_Object_Item *menu_it2; + + elm_menu_item_add(menu, menu_it, "go-bottom", "menu 2", NULL, NULL); + elm_menu_item_add(menu, menu_it, "go-first", "menu 3", NULL, NULL); + elm_menu_item_separator_add(menu, menu_it); + menu_it2 = elm_menu_item_add(menu, menu_it, "go-last", "Disabled item", NULL, + NULL); + elm_object_item_disabled_set(menu_it2, EINA_TRUE); + menu_it2 = elm_menu_item_add(menu, menu_it, "go-next", "Disabled item", NULL, + NULL); + elm_object_item_disabled_set(menu_it2, EINA_TRUE); + menu_it2 = elm_menu_item_add(menu, menu_it, "go-up", "Disabled item", NULL, + NULL); + elm_object_item_disabled_set(menu_it2, EINA_TRUE); +} + +static void +_populate_3(Evas_Object *menu, Elm_Object_Item *menu_it) +{ + Elm_Object_Item *menu_it2; + + elm_menu_item_add(menu, menu_it, "media-eject", "menu 2", NULL, NULL); + elm_menu_item_add(menu, menu_it, "media-playback-start", "menu 3", NULL, + NULL); + elm_menu_item_separator_add(menu, menu_it); + menu_it2 = elm_menu_item_add(menu, menu_it, "media-playback-stop", + "Disabled item", NULL, NULL); + elm_object_item_disabled_set(menu_it2, EINA_TRUE); +} + +static void +_populate_2(Evas_Object *menu, Elm_Object_Item *menu_it) +{ + Elm_Object_Item *menu_it2, *menu_it3; + + elm_menu_item_add(menu, menu_it, "system-reboot", "menu 2", NULL, NULL); + menu_it2 = elm_menu_item_add(menu, menu_it, "system-shutdown", "menu 3", + NULL, NULL); + _populate_3(menu, menu_it2); + + elm_menu_item_separator_add(menu, menu_it); + elm_menu_item_separator_add(menu, menu_it); + elm_menu_item_separator_add(menu, menu_it); + elm_menu_item_separator_add(menu, menu_it); + elm_menu_item_separator_add(menu, menu_it); + elm_menu_item_separator_add(menu, menu_it); + elm_menu_item_separator_add(menu, menu_it); + + menu_it2 = elm_menu_item_add(menu, menu_it, "system-lock-screen", "menu 2", + NULL, NULL); + elm_menu_item_separator_add(menu, menu_it); + + menu_it3 = elm_menu_item_add(menu, menu_it, "system-run", "Disabled item", + NULL, NULL); + elm_object_item_disabled_set(menu_it3, EINA_TRUE); + + _populate_4(menu, menu_it2); +} + +static void +_populate_1(Evas_Object *menu, Elm_Object_Item *menu_it) +{ + Elm_Object_Item *menu_it2, *menu_it3; + Evas_Object *radio; + + radio = elm_radio_add(menu); + elm_radio_state_value_set(radio, 0); + elm_radio_value_set(radio, 0); + elm_object_text_set(radio, "radio in menu"); + menu_it2 = elm_menu_item_add(menu, menu_it, "object-rotate-left", "menu 1", + NULL, NULL); + menu_it3 = elm_menu_item_add(menu, menu_it, NULL, NULL, NULL, NULL); + elm_object_item_content_set(menu_it3, radio); + + _populate_2(menu, menu_it2); +} + +void +test_menu(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *rect, *lbl, *menu; + Elm_Object_Item *menu_it; + + win = elm_win_util_standard_add("menu", "Menu"); + elm_win_autodel_set(win, EINA_TRUE); + + lbl = elm_label_add(win); + elm_object_text_set(lbl, "Click background to populate menu!"); + evas_object_size_hint_weight_set(lbl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, lbl); + evas_object_show(lbl); + + rect = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, rect); + evas_object_color_set(rect, 0, 0, 0, 0); + evas_object_show(rect); + + menu = elm_menu_add(win); + evas_object_smart_callback_add(menu, "dismissed", _menu_dismissed_cb, NULL); + + elm_menu_item_add(menu, NULL, NULL, "first item", NULL, NULL); + + menu_it = elm_menu_item_add(menu, NULL, "mail-reply-all", "second item", + NULL, NULL); + _populate_1(menu, menu_it); + + elm_menu_item_add(menu, menu_it, "window-new", "sub menu", NULL, NULL); + + evas_object_event_callback_add(rect, EVAS_CALLBACK_MOUSE_DOWN, + _menu_show_cb, menu); + + evas_object_resize(win, 350, 200); + evas_object_show(win); +} + +static void +_parent_set_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *mn = data; + if (!mn) return; + + Evas_Object *parent = evas_object_data_get(mn, "parent_1"); + if (elm_menu_parent_get(mn) == parent) + { + parent = evas_object_data_get(mn, "parent_2"); + } + + elm_menu_parent_set(mn, parent); +} + +static void +_icon_set_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Elm_Object_Item *menu_it = data; + const char *icon_name = NULL; + if (!menu_it) return; + + icon_name = elm_menu_item_icon_name_get(menu_it); + if ((icon_name) && !strcmp(icon_name, "home")) + { + elm_menu_item_icon_name_set(menu_it, "file"); + return; + } + elm_menu_item_icon_name_set(menu_it, "home"); +} + +static void +_item_select_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Elm_Object_Item *menu_it = data; + if (!menu_it) return; + + elm_menu_item_selected_set(menu_it, !elm_menu_item_selected_get(menu_it)); +} + +static void +_separators_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + const Eina_List *sis = NULL; + const Eina_List *l = NULL; + Elm_Object_Item *si; + int separators = 0; + + Elm_Object_Item *menu_it = data; + if (!menu_it) return; + + sis = elm_menu_item_subitems_get(menu_it); + + EINA_LIST_FOREACH(sis, l, si) + if (elm_menu_item_is_separator(si)) separators++; + + printf("The number of separators: %d\n", separators); +} + +static void +_open_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *mn = data; + if (!mn) return; + + evas_object_show(mn); +} + +static void +_close_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *mn = data; + if (!mn) return; + + elm_menu_close(mn); +} + +void +test_menu2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *o_bg, *rect, *rect2, *mn, *bt, *vbx; + Elm_Object_Item *menu_it, *menu_it2; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("menu2", "Menu 2"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + o_bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/twofish.jpg", elm_app_data_dir_get()); + elm_bg_file_set(o_bg, buf, NULL); + evas_object_size_hint_weight_set(o_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(o_bg, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, o_bg); + evas_object_show(o_bg); + + rect = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_move(rect, 0, 0); + evas_object_resize(rect, 124, 320); + evas_object_color_set(rect, 0, 0, 0, 0); + evas_object_show(rect); + + rect2 = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_move(rect2, 124, 0); + evas_object_resize(rect2, 124, 320); + evas_object_color_set(rect2, 0, 0, 0, 0); + evas_object_show(rect2); + + mn = elm_menu_add(win); + elm_menu_item_add(mn, NULL, NULL, "first item", NULL, NULL); + menu_it = elm_menu_item_add(mn, NULL, NULL, "second item", NULL, NULL); + elm_menu_item_add(mn, menu_it, NULL, "item 1", NULL, NULL); + elm_menu_item_separator_add(mn, menu_it); + elm_menu_item_add(mn, menu_it, NULL, "item 2", NULL, NULL); + menu_it2 = elm_menu_item_add(mn, NULL, NULL, "third item", NULL, NULL); + evas_object_data_set(mn, "parent_1", rect); + evas_object_data_set(mn, "parent_2", rect2); + + vbx = elm_box_add(win); + evas_object_show(vbx); + elm_box_pack_end(bx, vbx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Menu Open"); + elm_box_pack_end(vbx, bt); + evas_object_smart_callback_add(bt, "clicked", _open_bt_clicked, mn); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Icon Set"); + elm_box_pack_end(vbx, bt); + evas_object_smart_callback_add(bt, "clicked", _icon_set_bt_clicked, menu_it); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Parent Set"); + elm_box_pack_end(vbx, bt); + evas_object_smart_callback_add(bt, "clicked", _parent_set_bt_clicked, mn); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Item Select"); + elm_box_pack_end(vbx, bt); + evas_object_smart_callback_add(bt, "clicked", _item_select_bt_clicked, menu_it2); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Separators"); + elm_box_pack_end(vbx, bt); + evas_object_smart_callback_add(bt, "clicked", _separators_bt_clicked, menu_it); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Menu Close"); + elm_box_pack_end(vbx, bt); + evas_object_smart_callback_add(bt, "clicked", _close_bt_clicked, mn); + evas_object_show(bt); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_multi.c b/src/bin/elementary/test_multi.c new file mode 100644 index 0000000000..5608cc8563 --- /dev/null +++ b/src/bin/elementary/test_multi.c @@ -0,0 +1,132 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +#define IND_NUM 20 + +static Evas_Object *indicator[IND_NUM]; + +static void +_mouse_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info) +{ + Evas_Event_Mouse_Down *ev = event_info; + + if (ev->button != 1) return; + printf("MOUSE: down @ %4i %4i\n", ev->canvas.x, ev->canvas.y); + evas_object_move(indicator[0], ev->canvas.x, ev->canvas.y); + evas_object_resize(indicator[0], 1, 1); + evas_object_show(indicator[0]); +} + +static void +_mouse_up(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info) +{ + Evas_Event_Mouse_Up *ev = event_info; + if (ev->button != 1) return; + printf("MOUSE: up @ %4i %4i\n", ev->canvas.x, ev->canvas.y); + evas_object_hide(indicator[0]); +} + +static void +_mouse_move(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info) +{ + Evas_Event_Mouse_Move *ev = event_info; + printf("MOUSE: move @ %4i %4i\n", ev->cur.canvas.x, ev->cur.canvas.y); + evas_object_move(indicator[0], ev->cur.canvas.x, ev->cur.canvas.y); + evas_object_resize(indicator[0], 1, 1); +} + +static void +_multi_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info) +{ + Evas_Event_Multi_Down *ev = event_info; + printf("MULTI: down @ %4i %4i | dev: %i\n", ev->canvas.x, ev->canvas.y, ev->device); + if (ev->device >= IND_NUM) return; + evas_object_move(indicator[ev->device], ev->canvas.x, ev->canvas.y); + evas_object_resize(indicator[ev->device], 1, 1); + evas_object_show(indicator[ev->device]); +} + +static void +_multi_up(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info) +{ + Evas_Event_Multi_Up *ev = event_info; + printf("MULTI: up @ %4i %4i | dev: %i\n", ev->canvas.x, ev->canvas.y, ev->device); + if (ev->device >= IND_NUM) return; + evas_object_hide(indicator[ev->device]); +} + +static void +_multi_move(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info) +{ + Evas_Event_Multi_Move *ev = event_info; + printf("MULTI: move @ %4i %4i | dev: %i\n", ev->cur.canvas.x, + ev->cur.canvas.y, ev->device); + if (ev->device >= IND_NUM) return; + evas_object_move(indicator[ev->device], ev->cur.canvas.x, ev->cur.canvas.y); + evas_object_resize(indicator[ev->device], 1, 1); +} + +void +my_bt_rot(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + elm_win_rotation_set(win, elm_win_rotation_get(win) + 90); +} + +void +test_multi(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bg, *r, *bx, *bt; + int i; + + win = elm_win_add(NULL, "multi-touch", ELM_WIN_BASIC); + elm_win_title_set(win, "Multi touch"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + r = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_weight_set(r, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_color_set(r, 0, 0, 0, 0); + elm_win_resize_object_add(win, r); + evas_object_show(r); + + for (i = 0; i < IND_NUM; i++) + { + char buf[PATH_MAX]; + + snprintf(buf, sizeof(buf), "%s/objects/multip.edj", elm_app_data_dir_get()); + indicator[i] = edje_object_add(evas_object_evas_get(win)); + edje_object_file_set(indicator[i], buf, "point"); + } + + evas_object_event_callback_add(r, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down, win); + evas_object_event_callback_add(r, EVAS_CALLBACK_MOUSE_UP, _mouse_up, win); + evas_object_event_callback_add(r, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move, win); + evas_object_event_callback_add(r, EVAS_CALLBACK_MULTI_DOWN, _multi_down, win); + evas_object_event_callback_add(r, EVAS_CALLBACK_MULTI_UP, _multi_up, win); + evas_object_event_callback_add(r, EVAS_CALLBACK_MULTI_MOVE, _multi_move, win); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Rotate"); + evas_object_smart_callback_add(bt, "clicked", my_bt_rot, win); + evas_object_size_hint_align_set(bt, 0.0, 0.0); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + evas_object_size_hint_min_set(bg, 160, 160); + evas_object_resize(win, 480, 800); + + evas_object_show(win); +} diff --git a/src/bin/elementary/test_multibuttonentry.c b/src/bin/elementary/test_multibuttonentry.c new file mode 100644 index 0000000000..f66fc8c3fb --- /dev/null +++ b/src/bin/elementary/test_multibuttonentry.c @@ -0,0 +1,254 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static Elm_Multibuttonentry_Format_Cb format_func = NULL; + +static char * +_custom_format(int count, void *data EINA_UNUSED) +{ + char buf[32]; + + if (!snprintf(buf, sizeof(buf), "+ %d rabbits", count)) return NULL; + return strdup(buf); +} + +static void +_item_selected_cb(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + Elm_Object_Item *mbe_it = event_info; + printf("selected item = %s\n", elm_object_item_text_get(mbe_it)); +} + +// "item,added" smart callback of multibuttonentry. +static void +_item_added_cb(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + Elm_Object_Item *mbe_it = event_info; + printf("added item = %s\n", elm_object_item_text_get(mbe_it)); +} + +// "item,deleted" smart callback +static void +_item_deleted_cb(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("deleted item\n"); +} + +// "item,clicked" smart callback +static void +_item_clicked_cb(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info ) +{ + Elm_Object_Item *mbe_it = event_info; + printf("clicked item = %s\n", elm_object_item_text_get(mbe_it)); +} + +static void +_mbe_clicked_cb(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED ) +{ + //Unset the multibuttonentry to contracted mode of single line + elm_multibuttonentry_expanded_set(obj, EINA_TRUE); + printf("A multibuttonentry is clicked!\n"); + Evas_Object *entry; + entry = elm_multibuttonentry_entry_get(obj); + if (!entry) + { + printf("%s entry is NULL\n", __func__); + } + + Evas_Coord x, y, w, h; + Evas_Coord mbe_x, mbe_y, mbe_w, mbe_h; + evas_object_geometry_get(obj, &mbe_x, &mbe_y, &mbe_w, &mbe_h); + evas_object_geometry_get(entry, &x, &y, &w, &h); + printf("%s mbe x :%d y:%d w :%d h:%d\n", __func__, mbe_x, mbe_y, mbe_w, mbe_h); + printf("%s wd->entry x :%d y:%d w :%d h:%d\n", __func__, x, y, w, h); +} + +static void +_mbe_unfocused_cb(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED ) +{ + //Set the multibuttonentry to contracted mode of single line + elm_multibuttonentry_expanded_set(obj, EINA_FALSE); + printf("multibuttonentry unfocused!\n"); +} + +static void +_mbe_focused_cb(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED ) +{ + printf("multibuttonentry focused!\n"); +} + +// "expanded" smart callback +static void +_expanded_cb(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("expanded!\n"); +} + +// "contracted" smart callback +static void +_contracted_cb(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("contracted!\n"); +} + +// "contracted,state,changed" smart callback +static void +_shrink_state_changed_cb(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("contracted state changed! \n"); +} + +// "longpressed" smart callback +static void +_longpressed_cb(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + printf("item = %p longpressed! \n", event_info); +} + + +// "item verified" confirm callback +static Eina_Bool +_item_filter_cb(Evas_Object *obj EINA_UNUSED, + const char* item_label, + void *item_data EINA_UNUSED, + void *data EINA_UNUSED) +{ + printf("%s, label: %s\n", __func__, item_label); + + return EINA_TRUE; +} + +static void +_format_change_cb(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *mbe = data; + + if (format_func) format_func = NULL; + else format_func = _custom_format; + + elm_multibuttonentry_format_function_set(mbe, format_func, NULL); + + printf("Changing format function to %p\n", format_func); +} + +static Evas_Object* +_format_change_btn_add(Evas_Object *mbe) +{ + Evas_Object *btn; + + btn = elm_button_add(mbe); + evas_object_smart_callback_add(btn, "clicked", _format_change_cb, mbe); + elm_object_text_set(btn, "Change format function"); + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + + return btn; +} + +void +_select_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *it = (Elm_Object_Item *)event_info; + printf("select function called, item = %s\n", elm_object_item_text_get(it)); +} + +static Evas_Object* +_add_multibuttonentry(Evas_Object *parent) +{ + Evas_Object *scr = NULL; + Evas_Object *mbe = NULL; + Evas_Object *btn = NULL; + void *data = NULL; + + scr = elm_scroller_add(parent); + elm_scroller_bounce_set(scr, EINA_FALSE, EINA_TRUE); + elm_scroller_policy_set(scr, ELM_SCROLLER_POLICY_OFF,ELM_SCROLLER_POLICY_AUTO); + evas_object_show(scr); + + mbe = elm_multibuttonentry_add(parent); + elm_object_text_set(mbe, "To: "); + elm_object_part_text_set(mbe, "guide", "Tap to add recipient"); + evas_object_size_hint_weight_set(mbe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(mbe, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_content_set(scr, mbe); + elm_multibuttonentry_item_append(mbe, "mbe", _select_cb, NULL); + + // Add item verify callback to Multibuttonentry + elm_multibuttonentry_item_filter_append(mbe, _item_filter_cb, data); + + // Add "item,selected","item,added", "item,deleted", "clicked", "unfocused", + // "expanded", "contracted" and "contracted,state,changed" smart callback + evas_object_smart_callback_add(mbe, "item,selected", _item_selected_cb, NULL); + evas_object_smart_callback_add(mbe, "item,added", _item_added_cb, NULL); + evas_object_smart_callback_add(mbe, "item,deleted", _item_deleted_cb, NULL); + evas_object_smart_callback_add(mbe, "item,clicked", _item_clicked_cb, NULL); + + evas_object_smart_callback_add(mbe, "clicked", _mbe_clicked_cb, NULL); + evas_object_smart_callback_add(mbe, "focused", _mbe_focused_cb, NULL); + evas_object_smart_callback_add(mbe, "unfocused", _mbe_unfocused_cb, NULL); + + evas_object_smart_callback_add(mbe, "expanded", _expanded_cb, NULL); + evas_object_smart_callback_add(mbe, "contracted", _contracted_cb, NULL); + evas_object_smart_callback_add(mbe, "shrink,state,changed", _shrink_state_changed_cb, NULL); + evas_object_smart_callback_add(mbe, "item,longpressed", _longpressed_cb, NULL); + + btn = _format_change_btn_add(mbe); + elm_object_part_content_set(parent, "box", btn); + + evas_object_resize(mbe, 220, 300); + elm_object_focus_set(mbe, EINA_TRUE); + + return scr; +} + +void +test_multibuttonentry(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *sc; + Evas_Object *ly; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("multibuttonentry", "MultiButtonEntry"); + elm_win_autodel_set(win, EINA_TRUE); + + ly = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/multibuttonentry.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "multibuttonentry_test"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, ly); + evas_object_show(ly); + + sc = _add_multibuttonentry(ly); + elm_object_part_content_set(ly, "multibuttonentry", sc); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_naviframe.c b/src/bin/elementary/test_naviframe.c new file mode 100644 index 0000000000..222b450e61 --- /dev/null +++ b/src/bin/elementary/test_naviframe.c @@ -0,0 +1,388 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +#define BUTTON_TEXT_SET(BT, TEXT) \ + elm_object_text_set((BT), (TEXT)); \ + elm_object_tooltip_text_set((BT), (TEXT)); \ + elm_object_tooltip_window_mode_set((BT), EINA_TRUE) + +static char img1[PATH_MAX]; +static char img2[PATH_MAX]; +static char img3[PATH_MAX]; +static char img4[PATH_MAX]; +static char img5[PATH_MAX]; +static char img6[PATH_MAX]; +static char img7[PATH_MAX]; + +Evas_Object * +_content_new(Evas_Object *parent, const char *img) +{ + Evas_Object *photo = elm_photo_add(parent); + elm_photo_file_set(photo, img); + elm_photo_fill_inside_set(photo, EINA_TRUE); + elm_object_style_set(photo, "shadow"); + return photo; +} + +void +_navi_pop(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_naviframe_item_pop(data); +} + +void +_navi_it_del(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_object_item_del(data); +} + +void +_title_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("Title Clicked!\n"); +} + +void +_title_visible(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_naviframe_item_title_enabled_set(data, + !elm_naviframe_item_title_enabled_get(data), + EINA_TRUE); +} + +void +_promote(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_naviframe_item_promote(data); +} + +void +_page8(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *bt, *bt2, *content, *nf = data; + Elm_Object_Item *it; + + snprintf(img6, sizeof(img6), "%s/images/sky_02.jpg", elm_app_data_dir_get()); + bt = elm_button_add(nf); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + BUTTON_TEXT_SET(bt, "Page 7"); + + bt2 = elm_button_add(nf); + evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL); + BUTTON_TEXT_SET(bt2, "Page 1"); + evas_object_smart_callback_add(bt2, "clicked", _promote, + evas_object_data_get(nf, "page1")); + content = _content_new(nf, img6); + it = elm_naviframe_item_push(nf, "Page 8", bt, bt2, content, NULL); + elm_object_item_part_text_set(it, "subtitle", "Overlap style!"); + + evas_object_smart_callback_add(bt, "clicked", _navi_pop, nf); +} + +static void +_page7_btn_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + evas_object_color_set(obj, 100, 0, 0, 100); + _page8(data, NULL, NULL); +} + +static void +_page7_btn_up_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + evas_object_color_set(obj, 255, 255, 255, 255); + printf("Page7 Button Mouse Up!\n"); +} + +Evas_Object * +_page7_content_new(Evas_Object *nf) +{ + Evas_Object *bt; + + bt = elm_button_add(nf); + elm_object_text_set(bt, "Page 8"); + evas_object_event_callback_add(bt, EVAS_CALLBACK_MOUSE_DOWN, + _page7_btn_down_cb, nf); + evas_object_event_callback_add(bt, EVAS_CALLBACK_MOUSE_UP, + _page7_btn_up_cb, NULL); + + return bt; +} + +void +_page7(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *bt, *bt2, *content, *nf = data; + Elm_Object_Item *it; + + bt = elm_button_add(nf); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + BUTTON_TEXT_SET(bt, "Page 6"); + + bt2 = elm_button_add(nf); + evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL); + BUTTON_TEXT_SET(bt2, "Page 8"); + evas_object_smart_callback_add(bt2, "clicked", _page8, nf); + content = _page7_content_new(nf); + it = elm_naviframe_item_push(nf, "Page 7", bt, bt2, content, "overlap"); + elm_object_item_part_text_set(it, "subtitle", "Overlap style!"); + + evas_object_smart_callback_add(bt, "clicked", _navi_pop, nf); +} + +void +_page6(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *bt, *bt2, *content, *nf = data; + Elm_Object_Item *it; + + snprintf(img7, sizeof(img7), "%s/images/sky_03.jpg", elm_app_data_dir_get()); + bt = elm_button_add(nf); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + BUTTON_TEXT_SET(bt, "Page 5"); + + bt2 = elm_button_add(nf); + evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL); + BUTTON_TEXT_SET(bt2, "Page 7"); + evas_object_smart_callback_add(bt2, "clicked", _page7, nf); + + content = _content_new(nf, img7); + it = elm_naviframe_item_push(nf, "Page 6", bt, bt2, content, "overlap"); + elm_object_item_part_text_set(it, "subtitle", "Overlap style!"); + + evas_object_smart_callback_add(bt, "clicked", _navi_pop, nf); +} + +void +_page5(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *bt, *bt2, *content, *nf = data; + Elm_Object_Item *it; + + snprintf(img5, sizeof(img5), "%s/images/sky_01.jpg", elm_app_data_dir_get()); + bt = elm_button_add(nf); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + BUTTON_TEXT_SET(bt, "Page 4"); + + bt2 = elm_button_add(nf); + evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL); + BUTTON_TEXT_SET(bt2, "Page 6"); + evas_object_smart_callback_add(bt2, "clicked", _page6, nf); + + content = _content_new(nf, img5); + it = elm_naviframe_item_insert_after(nf, + elm_naviframe_top_item_get(nf), + "Page 5", + bt, + bt2, + content, + NULL); + elm_object_item_part_text_set(it, "subtitle", "This page is inserted after top item without transition"); + evas_object_smart_callback_add(bt, "clicked", _navi_it_del, it); +} + +void +_page4(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *bt, *ic, *content, *nf = data; + char buf[PATH_MAX]; + Elm_Object_Item *it; + + snprintf(img4, sizeof(img4), "%s/images/rock_02.jpg", elm_app_data_dir_get()); + ic = elm_icon_add(nf); + elm_icon_standard_set(ic, "arrow_right"); + + bt = elm_button_add(nf); + evas_object_smart_callback_add(bt, "clicked", _page5, nf); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_layout_content_set(bt, "icon", ic); + + content = _content_new(nf, img4); + + it = elm_naviframe_item_push(nf, + "Page 4", + NULL, + bt, + content, + NULL); + elm_object_item_part_text_set(it, "subtitle", "Title area visibility test"); + + ic = elm_icon_add(nf); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", + elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_object_item_part_content_set(it, "icon", ic); + elm_naviframe_item_title_enabled_set(it, EINA_FALSE, EINA_FALSE); + evas_object_smart_callback_add(content, "clicked", _title_visible, it); +} + +void +_page3(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *bt2, *content, *nf = data; + + snprintf(img3, sizeof(img3), "%s/images/rock_01.jpg", elm_app_data_dir_get()); + bt2 = elm_button_add(nf); + evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL); + BUTTON_TEXT_SET(bt2, "Next"); + evas_object_smart_callback_add(bt2, "clicked", _page4, nf); + + content = _content_new(nf, img3); + + elm_naviframe_item_push(nf, + "Page 3", + NULL, + bt2, + content, + NULL); +} + +void +_page2(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *bt, *content, *ic, *nf = data; + Elm_Object_Item *it; + + snprintf(img2, sizeof(img2), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + bt = elm_button_add(nf); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(bt, "clicked", _page3, nf); + + ic = elm_icon_add(nf); + elm_icon_standard_set(ic, "arrow_right"); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_layout_content_set(bt, "icon", ic); + + content = _content_new(nf, img2); + + it = elm_naviframe_item_push(nf, "Page 2 - Long Title Here", + NULL, bt, content, NULL); + elm_object_item_part_text_set(it, "subtitle", "Here is sub-title part!"); +} + +void +test_naviframe(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *nf, *btn, *content; + Elm_Object_Item *it; + + snprintf(img1, sizeof(img1), "%s/images/logo.png", elm_app_data_dir_get()); + win = elm_win_util_standard_add("naviframe", "Naviframe"); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + elm_win_autodel_set(win, EINA_TRUE); + + nf = elm_naviframe_add(win); + evas_object_size_hint_weight_set(nf, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, nf); + evas_object_show(nf); + evas_object_smart_callback_add(nf, "title,clicked", _title_clicked, 0); + + btn = elm_button_add(nf); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(btn, "clicked", _page2, nf); + BUTTON_TEXT_SET(btn, "Next"); + evas_object_show(btn); + + content = _content_new(nf, img1); + it = elm_naviframe_item_push(nf, "Page 1", NULL, btn, content, NULL); + evas_object_data_set(nf, "page1", it); + + evas_object_resize(win, 400, 400); + evas_object_show(win); +} + +void +test_naviframe2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *nf, *sc, *btn, *ico, *content; + Elm_Object_Item *it; + + snprintf(img1, sizeof(img1), "%s/images/logo.png", elm_app_data_dir_get()); + win = elm_win_util_standard_add("naviframe", "Naviframe"); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + elm_win_autodel_set(win, EINA_TRUE); + + nf = elm_naviframe_add(win); + evas_object_size_hint_weight_set(nf, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, nf); + evas_object_show(nf); + + sc = elm_segment_control_add(nf); + elm_segment_control_item_add(sc, NULL, "Show All"); + elm_segment_control_item_add(sc, NULL, "Just Filtered"); + + btn = elm_button_add(nf); + ico = elm_icon_add(btn); + elm_icon_standard_set(ico, "refresh"); + elm_layout_content_set(btn, "icon", ico); + + content = _content_new(nf, img1); + it = elm_naviframe_item_push(nf, NULL, NULL, btn, content, NULL); + evas_object_data_set(nf, "page1", it); + + elm_object_item_part_content_set(it, "icon", sc); + + evas_object_resize(win, 400, 400); + evas_object_show(win); +} + +static void +_bt_pop_all(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Elm_Object_Item *it = evas_object_data_get(obj, "root"); + + while (elm_naviframe_top_item_get(data) != it) + elm_naviframe_item_pop(data); +} + +void +test_naviframe3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *tb, *bxh, *nf, *btn, *content; + Elm_Object_Item *it; + + snprintf(img1, sizeof(img1), "%s/images/logo.png", elm_app_data_dir_get()); + win = elm_win_util_standard_add("naviframe", "Naviframe"); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + elm_win_autodel_set(win, EINA_TRUE); + + bxh = elm_box_add(win); + evas_object_size_hint_weight_set(bxh, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_horizontal_set(bxh, EINA_TRUE); + elm_win_resize_object_add(win, bxh); + evas_object_show(bxh); + + tb = elm_toolbar_add(win); + evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_toolbar_horizontal_set(tb, EINA_FALSE); + elm_toolbar_select_mode_set(tb, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_box_pack_end(bxh, tb); + evas_object_show(tb); + + nf = elm_naviframe_add(win); + evas_object_size_hint_weight_set(nf, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(nf, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bxh, nf); + evas_object_show(nf); + + btn = elm_button_add(nf); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(btn, "clicked", _page2, nf); + BUTTON_TEXT_SET(btn, "Next"); + evas_object_show(btn); + + content = _content_new(nf, img1); + it = elm_naviframe_item_push(nf, "Page 1", NULL, btn, content, NULL); + evas_object_data_set(nf, "page1", it); + + evas_object_data_set(tb, "root", it); + elm_toolbar_item_append(tb, NULL, "Pop all", _bt_pop_all, nf); + + evas_object_resize(win, 400, 400); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_naviframe_complex.c b/src/bin/elementary/test_naviframe_complex.c new file mode 100644 index 0000000000..63539c7009 --- /dev/null +++ b/src/bin/elementary/test_naviframe_complex.c @@ -0,0 +1,367 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +#define BUTTON_TEXT_SET(BT, TEXT) \ + elm_object_text_set((BT), (TEXT)); \ + elm_object_tooltip_text_set((BT), (TEXT)); \ + elm_object_tooltip_window_mode_set((BT), EINA_TRUE) + +static char * +gl_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + char buf[256]; + snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data); + return strdup(buf); +} + +static Evas_Object * +gl_content_get(void *data EINA_UNUSED, Evas_Object *obj, const char *part) +{ + char buf[PATH_MAX]; + Evas_Object *ic = elm_icon_add(obj); + if (!strcmp(part, "elm.swallow.end")) + snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get()); + else + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + return ic; +} + +static Elm_Genlist_Item_Class itc = +{ + .version = ELM_GENLIST_ITEM_CLASS_VERSION, + .item_style = "default", + .func = + { + .text_get = gl_text_get, + .content_get = gl_content_get, + .state_get = NULL, + .del = NULL + } +}; + +static Evas_Object * +_content_image_new(Evas_Object *parent, const char *img) +{ + Evas_Object *ic; + + ic = elm_icon_add(parent); + elm_image_file_set(ic, img, NULL); + elm_image_fill_outside_set(ic, EINA_FALSE); + return ic; +} + +static void +_gl_selected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("selected: %p\n", event_info); +} + +static void +_gl_double_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("double clicked: %p\n", event_info); +} + +static void +_gl_longpress(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("longpress %p\n", event_info); +} + +static void +_content_list_populate_cb(Evas_Object *gl) +{ + int i; + for (i = 0; i < 10; i++) + elm_genlist_item_append(gl, &itc, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + if (elm_genlist_items_count(gl) < 500) + ecore_job_add((Ecore_Cb)_content_list_populate_cb, gl); +} + +static Evas_Object * +_content_list_new(Evas_Object *parent) +{ + Evas_Object *gl; + + gl = elm_genlist_add(parent); + evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL); + evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL); + evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL); + // FIXME: This causes genlist to resize the horiz axis very slowly :( + // Reenable this and resize the window horizontally, then try to resize it back + //elm_genlist_mode_set(gl, ELM_LIST_LIMIT); + + ecore_job_add((Ecore_Cb)_content_list_populate_cb, gl); + return gl; +} + +static void +_navi_pop(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_naviframe_item_pop(data); +} + +static void +_navi_it_del(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_object_item_del(data); +} + +static void +_title_visible(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_naviframe_item_title_enabled_set(data, + !elm_naviframe_item_title_enabled_get(data), + EINA_TRUE); +} + +static void +_promote(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_naviframe_item_promote(data); +} + +static void +_page7(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *bt, *bt2, *content, *nf = data; + Elm_Object_Item *it; + char img6[PATH_MAX]; + + snprintf(img6, sizeof(img6), "%s/images/sky_02.jpg", elm_app_data_dir_get()); + bt = elm_button_add(nf); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + BUTTON_TEXT_SET(bt, "Page 6"); + + bt2 = elm_button_add(nf); + evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL); + BUTTON_TEXT_SET(bt2, "Page 1"); + evas_object_smart_callback_add(bt2, "clicked", _promote, + evas_object_data_get(nf, "page1")); + content = _content_image_new(nf, img6); + it = elm_naviframe_item_push(nf, "Page 7", bt, bt2, content, "overlap"); + elm_object_item_part_text_set(it, "subtitle", "Overlap style!"); + + evas_object_smart_callback_add(bt, "clicked", _navi_pop, nf); +} + +static void +_page6(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *bt, *bt2, *content, *nf = data; + Elm_Object_Item *it; + char img7[PATH_MAX]; + + snprintf(img7, sizeof(img7), "%s/images/sky_03.jpg", elm_app_data_dir_get()); + bt = elm_button_add(nf); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + BUTTON_TEXT_SET(bt, "Page 5"); + + bt2 = elm_button_add(nf); + evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL); + BUTTON_TEXT_SET(bt2, "Page 7"); + evas_object_smart_callback_add(bt2, "clicked", _page7, nf); + + content = _content_image_new(nf, img7); + it = elm_naviframe_item_push(nf, "Page 6", bt, bt2, content, "overlap"); + elm_object_item_part_text_set(it, "subtitle", "Overlap style!"); + + evas_object_smart_callback_add(bt, "clicked", _navi_pop, nf); +} + +static void +_page5(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *bt, *bt2, *content, *nf = data; + Elm_Object_Item *it; + char img5[PATH_MAX]; + + snprintf(img5, sizeof(img5), "%s/images/sky_01.jpg", elm_app_data_dir_get()); + bt = elm_button_add(nf); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + BUTTON_TEXT_SET(bt, "Page 4"); + + bt2 = elm_button_add(nf); + evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL); + BUTTON_TEXT_SET(bt2, "Page 6"); + evas_object_smart_callback_add(bt2, "clicked", _page6, nf); + + content = _content_image_new(nf, img5); + it = elm_naviframe_item_insert_after(nf, + elm_naviframe_top_item_get(nf), + "Page 5", + bt, + bt2, + content, + NULL); + elm_object_item_part_text_set(it, "subtitle", "This page is inserted without transition"); + evas_object_smart_callback_add(bt, "clicked", _navi_it_del, it); +} + +static void +_page4(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *bt, *ic, *content, *nf = data; + char buf[PATH_MAX]; + char img4[PATH_MAX]; + Elm_Object_Item *it; + + snprintf(img4, sizeof(img4), "%s/images/rock_02.jpg", elm_app_data_dir_get()); + ic = elm_icon_add(nf); + snprintf(buf, sizeof(buf), "%s/images/icon_right_arrow.png", + elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + + bt = elm_button_add(nf); + evas_object_smart_callback_add(bt, "clicked", _page5, nf); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_part_content_set(bt, "icon", ic); + + content = _content_image_new(nf, img4); + + it = elm_naviframe_item_push(nf, + "Page 4", + NULL, + bt, + content, + NULL); + elm_object_item_part_text_set(it, "subtitle", "Title area visibility test"); + + ic = elm_icon_add(nf); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", + elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_object_item_part_content_set(it, "icon", ic); + elm_naviframe_item_title_enabled_set(it, EINA_FALSE, EINA_FALSE); + evas_object_smart_callback_add(content, "clicked", _title_visible, it); +} + +static void +_page3(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *bt, *bt2, *ic, *content, *nf = data; + char buf[PATH_MAX]; + char img3[PATH_MAX]; + Elm_Object_Item *it; + + snprintf(img3, sizeof(img3), "%s/images/rock_01.jpg", elm_app_data_dir_get()); + bt = elm_button_add(nf); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + BUTTON_TEXT_SET(bt, "Prev"); + evas_object_smart_callback_add(bt, "clicked", _navi_pop, nf); + + bt2 = elm_button_add(nf); + evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL); + BUTTON_TEXT_SET(bt2, "Next"); + evas_object_smart_callback_add(bt2, "clicked", _page4, nf); + + content = _content_image_new(nf, img3); + + it = elm_naviframe_item_push(nf, + "Page 3", + bt, + bt2, + content, + NULL); + ic = elm_icon_add(nf); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + + elm_object_item_part_content_set(it, "icon", ic); +} + +static void +_page2(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *bt, *content, *ic, *nf = data; + char buf[PATH_MAX]; + char img2[PATH_MAX]; + Elm_Object_Item *it; + + snprintf(img2, sizeof(img2), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + bt = elm_button_add(nf); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(bt, "clicked", _page3, nf); + + ic = elm_icon_add(nf); + snprintf(buf, sizeof(buf), "%s/images/icon_right_arrow.png", + elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_object_part_content_set(bt, "icon", ic); + + content = _content_image_new(nf, img2); + + it = elm_naviframe_item_push(nf, "Page 2", NULL, bt, content, NULL); + elm_object_item_part_text_set(it, "subtitle", "Here is sub-title part!"); +} + +void +test_naviframe_complex(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *nf, *btn, *box, *content, *tb, *o; + Elm_Object_Item *it; + int x; + + char img1[PATH_MAX]; + snprintf(img1, sizeof(img1), "%s/images/logo.png", elm_app_data_dir_get()); + + win = elm_win_util_standard_add("naviframe", "Naviframe"); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + elm_win_autodel_set(win, EINA_TRUE); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_horizontal_set(box, EINA_TRUE); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + tb = elm_toolbar_add(win); + evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_toolbar_horizontal_set(tb, EINA_FALSE); + elm_toolbar_select_mode_set(tb, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_box_pack_end(box, tb); + evas_object_show(tb); + + nf = elm_naviframe_add(win); + evas_object_size_hint_weight_set(nf, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(nf, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_naviframe_prev_btn_auto_pushed_set(nf, EINA_FALSE); + elm_box_pack_end(box, nf); + evas_object_show(nf); + + for (x = 0; x < 4; x++) + { + const char *label[] = { "View 1", "View 2", "View 3", "View 4" }; + o = elm_naviframe_add(win); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + btn = elm_button_add(o); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(btn, "clicked", _page2, o); + BUTTON_TEXT_SET(btn, "Next"); + evas_object_show(btn); + + if (x % 2) + content = _content_image_new(o, img1); + else + content = _content_list_new(o); + evas_object_data_set(o, "page1", elm_naviframe_item_push(o, "Page 1", NULL, btn, content, NULL)); + + it = elm_naviframe_item_simple_push(nf, o); + elm_toolbar_item_append(tb, NULL, label[x], _promote, it); + evas_object_show(o); + } + + elm_toolbar_item_selected_set(elm_toolbar_last_item_get(tb), EINA_TRUE); + evas_object_resize(win, 400, 400); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_notify.c b/src/bin/elementary/test_notify.c new file mode 100644 index 0000000000..3d00006886 --- /dev/null +++ b/src/bin/elementary/test_notify.c @@ -0,0 +1,448 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void +_bt(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *notify = data; + evas_object_show(notify); + elm_object_focus_set(notify, EINA_TRUE); +} + +static void +_bt_close(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *notify = data; + evas_object_hide(notify); +} + +static void +_bt_timer_close(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *notify = data; + elm_notify_timeout_set(notify, 2.0); +} + +static void +_notify_timeout(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("Notify timed out!\n"); +} + +static void +_notify_block(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("Notify block area clicked!!\n"); +} + +static void +_notify_key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Evas_Event_Key_Down *ev = event_info; + + printf("Key down: %s\n", ev->keyname); +} + +void +test_notify(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *tb, *notify, *bt, *lb; + + win = elm_win_util_standard_add("notify", "Notify"); + elm_win_autodel_set(win, EINA_TRUE); + + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, tb); + evas_object_show(tb); + + // Notify top + notify = elm_notify_add(win); + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_notify_align_set(notify, 0.5, 0.0); + + bx = elm_box_add(win); + elm_object_content_set(notify, bx); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_label_line_wrap_set(lb, ELM_WRAP_MIXED); + elm_label_wrap_width_set(lb, ELM_SCALE_SIZE(140)); + elm_object_text_set(lb, "This position is the default. This is multiline text."); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", _bt_close, notify); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(bt, "Top"); + evas_object_smart_callback_add(bt, "clicked", _bt, notify); + elm_table_pack(tb, bt, 2, 1, 1, 1); + evas_object_show(bt); + + // Notify bottom + notify = elm_notify_add(win); + elm_notify_allow_events_set(notify, EINA_FALSE); + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_notify_align_set(notify, 0.5, 1.0); + + elm_notify_timeout_set(notify, 5.0); + evas_object_smart_callback_add(notify, "timeout", _notify_timeout, NULL); + evas_object_smart_callback_add(notify, "block,clicked", _notify_block, NULL); + evas_object_event_callback_add(notify, EVAS_CALLBACK_KEY_DOWN, + _notify_key_down_cb, NULL); + + bx = elm_box_add(win); + elm_object_content_set(notify, bx); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Bottom position. This notify uses a timeout of 5 sec.<br/>" + "<b>The events outside the window are blocked.</b>"); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", _bt_close, notify); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(bt, "Bottom"); + evas_object_smart_callback_add(bt, "clicked", _bt, notify); + elm_table_pack(tb, bt, 2, 3, 1, 1); + evas_object_show(bt); + + // Notify left + notify = elm_notify_add(win); + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_notify_align_set(notify, 0.0, 0.5); + elm_notify_timeout_set(notify, 10.0); + evas_object_smart_callback_add(notify, "timeout", _notify_timeout, NULL); + + bx = elm_box_add(win); + elm_object_content_set(notify, bx); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Left position. This notify uses a timeout of 10 sec."); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", _bt_close, notify); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(bt, "Left"); + evas_object_smart_callback_add(bt, "clicked", _bt, notify); + elm_table_pack(tb, bt, 1, 2, 1, 1); + evas_object_show(bt); + + // Notify center + notify = elm_notify_add(win); + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_notify_align_set(notify, 0.5, 0.5); + elm_notify_timeout_set(notify, 10.0); + evas_object_smart_callback_add(notify, "timeout", _notify_timeout, NULL); + + bx = elm_box_add(win); + elm_object_content_set(notify, bx); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Center position. This notify uses a timeout of 10 sec."); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", _bt_close, notify); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(bt, "Center"); + evas_object_smart_callback_add(bt, "clicked", _bt, notify); + elm_table_pack(tb, bt, 2, 2, 1, 1); + evas_object_show(bt); + + // Notify right + notify = elm_notify_add(win); + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_notify_align_set(notify, 1.0, 0.5); + + bx = elm_box_add(win); + elm_object_content_set(notify, bx); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Right position."); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", _bt_close, notify); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(bt, "Right"); + evas_object_smart_callback_add(bt, "clicked", _bt, notify); + elm_table_pack(tb, bt, 3, 2, 1, 1); + evas_object_show(bt); + + // Notify top left + notify = elm_notify_add(win); + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_notify_align_set(notify, 0.0, 0.0); + + bx = elm_box_add(win); + elm_object_content_set(notify, bx); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Top Left position."); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", _bt_close, notify); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(bt, "Top Left"); + evas_object_smart_callback_add(bt, "clicked", _bt, notify); + elm_table_pack(tb, bt, 1, 1, 1, 1); + evas_object_show(bt); + + // Notify top right + notify = elm_notify_add(win); + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_notify_align_set(notify, 1.0, 0.0); + + bx = elm_box_add(win); + elm_object_content_set(notify, bx); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Top Right position."); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", _bt_close, notify); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(bt, "Top Right"); + evas_object_smart_callback_add(bt, "clicked", _bt, notify); + elm_table_pack(tb, bt, 3, 1, 1, 1); + evas_object_show(bt); + + // Notify bottom left + notify = elm_notify_add(win); + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_notify_align_set(notify, 0.0, 1.0); + + bx = elm_box_add(win); + elm_object_content_set(notify, bx); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Bottom Left position."); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", _bt_close, notify); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(bt, "Bottom Left"); + evas_object_smart_callback_add(bt, "clicked", _bt, notify); + elm_table_pack(tb, bt, 1, 3, 1, 1); + evas_object_show(bt); + + // Notify bottom right + notify = elm_notify_add(win); + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_notify_align_set(notify, 1.0, 1.0); + + bx = elm_box_add(win); + elm_object_content_set(notify, bx); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Bottom Right position."); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close in 2s"); + evas_object_smart_callback_add(bt, "clicked", _bt_timer_close, notify); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(bt, "Bottom Right"); + evas_object_smart_callback_add(bt, "clicked", _bt, notify); + elm_table_pack(tb, bt, 3, 3, 1, 1); + evas_object_show(bt); + + // Notify top fill + notify = elm_notify_add(win); + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_notify_align_set(notify, ELM_NOTIFY_ALIGN_FILL, 0.0); + elm_notify_timeout_set(notify, 5.0); + + bx = elm_box_add(win); + elm_object_content_set(notify, bx); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Fill top. This notify fills horizontal area.<br/>" + "<b>elm_notify_align_set(notify, ELM_NOTIFY_ALIGN_FILL, 0.0); </b>"); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", _bt_close, notify); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5); + elm_object_text_set(bt, "Top fill"); + evas_object_smart_callback_add(bt, "clicked", _bt, notify); + elm_table_pack(tb, bt, 1, 0, 3, 1); + evas_object_show(bt); + + // Notify bottom fill + notify = elm_notify_add(win); + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_notify_align_set(notify, ELM_NOTIFY_ALIGN_FILL, 1.0); + elm_notify_timeout_set(notify, 5.0); + + bx = elm_box_add(win); + elm_object_content_set(notify, bx); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + lb = elm_label_add(win); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(lb, 0.0, 0.5); + elm_object_text_set(lb, "Fill Bottom. This notify fills horizontal area.<br/>" + "<b>elm_notify_align_set(notify, ELM_NOTIFY_ALIGN_FILL, 1.0); </b>"); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", _bt_close, notify); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5); + elm_object_text_set(bt, "Bottom fill"); + evas_object_smart_callback_add(bt, "clicked", _bt, notify); + elm_table_pack(tb, bt, 1, 4, 3, 1); + evas_object_show(bt); + + // Notify left fill + notify = elm_notify_add(win); + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_notify_align_set(notify, 0.0, EVAS_HINT_FILL); + elm_notify_timeout_set(notify, 5.0); + + bx = elm_box_add(win); + elm_object_content_set(notify, bx); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Left fill."); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", _bt_close, notify); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + evas_object_size_hint_align_set(bt, 0.5, EVAS_HINT_FILL); + elm_object_text_set(bt, "Left fill"); + evas_object_smart_callback_add(bt, "clicked", _bt, notify); + elm_table_pack(tb, bt, 0, 1, 1, 3); + evas_object_show(bt); + + // Notify right fill + notify = elm_notify_add(win); + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_notify_align_set(notify, 1.0, EVAS_HINT_FILL); + elm_notify_timeout_set(notify, 5.0); + + bx = elm_box_add(win); + elm_object_content_set(notify, bx); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Right fill."); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", _bt_close, notify); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + evas_object_size_hint_align_set(bt, 0.5, EVAS_HINT_FILL); + elm_object_text_set(bt, "Right fill"); + evas_object_smart_callback_add(bt, "clicked", _bt, notify); + elm_table_pack(tb, bt, 4, 1, 1, 3); + evas_object_show(bt); + + evas_object_resize(win, 400, 400); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_panel.c b/src/bin/elementary/test_panel.c new file mode 100644 index 0000000000..9c8d4eb2c8 --- /dev/null +++ b/src/bin/elementary/test_panel.c @@ -0,0 +1,369 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> +#include <dirent.h> + +#define LIST_ITEM_MAX 20 + +static void _bstatus(void *data, Evas_Object *obj, void *event_info); +static void _tstatus(void *data, Evas_Object *obj, void *event_info); +static char *_text_get(void *data, Evas_Object *obj, const char *source); +static Evas_Object *_content_get(void *data, Evas_Object *obj, const char *source); +static Eina_Bool _state_get(void *data, Evas_Object *obj, const char *source); +static void _item_del(void *data, Evas_Object *obj); +static void _fill_list(Evas_Object *obj, Elm_Genlist_Item_Class *itc); +static Eina_Bool _dir_has_subs(const char *path); + +static Eina_List *dirs = NULL; + +static void +_tstatus(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Elm_Object_Item *tb_it; + const char *status; + + if (elm_panel_hidden_get((Evas_Object*)data)) + status = "hidden"; + else + status = "shown"; + printf("The top panel is currently %s\n", status); + tb_it = elm_toolbar_selected_item_get(obj); + elm_toolbar_item_selected_set(tb_it, EINA_FALSE); +} + +static void +_bstatus(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Elm_Object_Item *tb_it; + const char *status; + + if (elm_panel_hidden_get((Evas_Object*)data)) + status = "hidden"; + else + status = "shown"; + printf("The bottom panel is currently %s\n", status); + tb_it = elm_toolbar_selected_item_get(obj); + elm_toolbar_item_selected_set(tb_it, EINA_FALSE); +} + +static char * +_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *source EINA_UNUSED) +{ + return strdup(ecore_file_file_get(data)); +} + +static Evas_Object * +_content_get(void *data, Evas_Object *obj, const char *source) +{ + if (!strcmp(source, "elm.swallow.icon")) + { + Evas_Object *ic; + + ic = elm_icon_add(obj); + if (ecore_file_is_dir((char *)data)) + elm_icon_standard_set(ic, "folder"); + 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 Eina_Bool +_state_get(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *source EINA_UNUSED) +{ + return EINA_FALSE; +} + +static void +_item_del(void *data, Evas_Object *obj EINA_UNUSED) +{ + eina_stringshare_del(data); +} + +static void +_fill_list(Evas_Object *obj, Elm_Genlist_Item_Class *itc) +{ + DIR *d; + struct dirent *de; + Eina_List *l; + char *real; + const char *home_env = NULL; + unsigned int x = 0; + + if (!dirs) + { + home_env = eina_environment_home_get(); + if (!home_env) return; + if (!(d = opendir(home_env))) return; + while ((de = readdir(d)) && (x < LIST_ITEM_MAX)) + { + char buff[PATH_MAX]; + + if (de->d_name[0] == '.') continue; + snprintf(buff, sizeof(buff), "%s/%s", home_env, de->d_name); + + if (!ecore_file_is_dir(buff)) continue; + x++; + real = ecore_file_realpath(buff); + dirs = eina_list_sorted_insert(dirs, EINA_COMPARE_CB(strcoll), real); + } + closedir(d); + } + EINA_LIST_FOREACH(dirs, l, real) + { + Eina_Bool result = EINA_FALSE; + + result = _dir_has_subs(real); + if (!result) + elm_genlist_item_append(obj, itc, eina_stringshare_add(real), + NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + else + elm_genlist_item_append(obj, itc, eina_stringshare_add(real), + NULL, ELM_GENLIST_ITEM_TREE, + NULL, NULL); + } +} + +static Eina_Bool +_dir_has_subs(const char *path) +{ + DIR *d; + struct dirent *de; + Eina_Bool result = EINA_FALSE; + + if (!path) return result; + if (!(d = opendir(path))) return result; + while ((de = readdir(d))) + { + char buff[PATH_MAX]; + + if (de->d_name[0] == '.') continue; + snprintf(buff, sizeof(buff), "%s/%s", path, de->d_name); + if (ecore_file_is_dir(buff)) + { + result = EINA_TRUE; + break; + } + } + closedir(d); + return result; +} + +static void +_free_dirs(void) +{ + char *dir; + EINA_LIST_FREE(dirs, dir) + free(dir); +} + +void +test_panel(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *panel, *tb, *vbx, *toolbar, *photo; + Evas_Object *list; + Elm_Genlist_Item_Class *itc = NULL; + char buf[PATH_MAX] = { 0 }; + + win = elm_win_util_standard_add("panel", "Panel"); + elm_win_autodel_set(win, EINA_TRUE); + + vbx = elm_box_add(win); + evas_object_size_hint_weight_set(vbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, vbx); + evas_object_show(vbx); + + // top panel + panel = elm_panel_add(vbx); + elm_panel_orient_set(panel, ELM_PANEL_ORIENT_TOP); + evas_object_size_hint_weight_set(panel, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(panel, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(vbx, panel); + evas_object_show(panel); + + toolbar = elm_toolbar_add(panel); + elm_toolbar_homogeneous_set(toolbar, EINA_FALSE); + elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_NONE); + elm_toolbar_item_append(toolbar, "home", "Hello", _tstatus, panel); + elm_object_content_set(panel, toolbar); + evas_object_show(toolbar); + + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(vbx, tb); + evas_object_show(tb); + + photo = elm_photo_add(tb); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(photo, buf); + elm_photo_fill_inside_set(photo, EINA_TRUE); + elm_object_style_set(photo, "shadow"); + evas_object_size_hint_weight_set(photo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(photo, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, photo, 0, 0, 4, 5); + evas_object_show(photo); + + // left panel + panel = elm_panel_add(tb); + elm_panel_orient_set(panel, ELM_PANEL_ORIENT_LEFT); + evas_object_size_hint_weight_set(panel, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(panel, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, panel, 0, 0, 2, 4); + evas_object_show(panel); + + itc = elm_genlist_item_class_new(); + itc->item_style = "default"; + itc->func.text_get = _text_get; + itc->func.content_get = _content_get; + itc->func.state_get = _state_get; + itc->func.del = _item_del; + + list = elm_genlist_add(panel); + 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); + elm_object_content_set(panel, list); + evas_object_show(list); + + _fill_list(list, itc); + + // right panel + panel = elm_panel_add(tb); + elm_panel_orient_set(panel, ELM_PANEL_ORIENT_RIGHT); + evas_object_size_hint_weight_set(panel, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(panel, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_panel_hidden_set(panel, EINA_TRUE); + elm_table_pack(tb, panel, 2, 0, 2, 4); + evas_object_show(panel); + + list = elm_genlist_add(panel); + 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); + elm_object_content_set(panel, list); + evas_object_show(list); + + _fill_list(list, itc); + elm_genlist_item_class_free(itc); + + _free_dirs(); + + // bottom panel + panel = elm_panel_add(vbx); + elm_panel_orient_set(panel, ELM_PANEL_ORIENT_BOTTOM); + evas_object_size_hint_weight_set(panel, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(panel, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_panel_hidden_set(panel, EINA_TRUE); + elm_table_pack(tb, panel, 0, 4, 4, 1); + evas_object_show(panel); + + toolbar = elm_toolbar_add(panel); + elm_toolbar_homogeneous_set(toolbar, EINA_FALSE); + elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_NONE); + evas_object_size_hint_weight_set(toolbar, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(toolbar, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_toolbar_item_append(toolbar, "home", "Hello", _bstatus, panel); + elm_object_content_set(panel, toolbar); + evas_object_show(toolbar); + + evas_object_resize(win, 320, 400); + evas_object_show(win); +} + +static void +_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *panel = data; + elm_panel_toggle(panel); +} + +static void +_changed_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + elm_config_scroll_thumbscroll_enabled_set(elm_check_state_get(obj)); +} + +void +test_panel2(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *box, *label, *check, *table, *panel, *list, *button; + int i; + + // Left Panel + win = elm_win_util_standard_add("panel", "Left Panel"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_resize(win, 320, 400); + evas_object_show(win); + + // box for button and table + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(box); + elm_win_resize_object_add(win, box); + + // label + label = elm_label_add(box); + elm_object_text_set(label, "You should enable thumb scroll to use scrollable panel.<br/>" + "Check below or enable thumb scroll in elementary_config."); + evas_object_show(label); + elm_box_pack_end(box, label); + + // check + check = elm_check_add(box); + elm_check_state_set(check, elm_config_scroll_thumbscroll_enabled_get()); + elm_object_text_set(check, "Enable thumb scroll (temporarily)"); + evas_object_show(check); + elm_box_pack_end(box, check); + + evas_object_smart_callback_add(check, "changed", _changed_cb, NULL); + + // toggle button + button = elm_button_add(box); + evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(button); + elm_object_text_set(button, "Toggle"); + elm_box_pack_end(box, button); + + // table for panel and center content + table = elm_table_add(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); + elm_box_pack_end(box, table); + + // center content + list = elm_list_add(table); + 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); + for (i = 0; i < 20; i++) + elm_list_item_append(list, "center list item", NULL, NULL, NULL, NULL); + elm_table_pack(table, list, 0, 0, 1, 1); + + // panel + panel = elm_panel_add(table); + evas_object_size_hint_weight_set(panel, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(panel, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(panel); + elm_table_pack(table, panel, 0, 0, 1, 1); + + elm_panel_scrollable_set(panel, EINA_TRUE); + elm_panel_orient_set(panel, ELM_PANEL_ORIENT_LEFT); + elm_panel_hidden_set(panel, EINA_TRUE); + elm_panel_scrollable_content_size_set(panel, 0.75); + + list = elm_list_add(panel); + 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); + for (i = 0; i < 7; i++) + elm_list_item_append(list, "panel list item", NULL, NULL, NULL, NULL); + elm_object_content_set(panel, list); + + evas_object_smart_callback_add(button, "clicked", _clicked_cb, panel); +} diff --git a/src/bin/elementary/test_panes.c b/src/bin/elementary/test_panes.c new file mode 100644 index 0000000000..27d9535045 --- /dev/null +++ b/src/bin/elementary/test_panes.c @@ -0,0 +1,105 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void +_press(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("press\n"); +} + +static void +_unpress(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + printf("unpress, size : %f\n", elm_panes_content_left_size_get(obj)); +} + +static void +_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("clicked\n"); +} + +static void +_clicked_double(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + double *size = data; + double tmp_size = 0.0; + + tmp_size = elm_panes_content_left_size_get(obj); + printf("clicked double\n"); + if (tmp_size > 0) + { + elm_panes_content_left_size_set(obj, 0.0); + *size = tmp_size; + } + else + elm_panes_content_left_size_set(obj, *size); +} + +void +test_panes(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bg, *panes, *panes_h, *bt; + static double vbar_size = 0.0; + static double hbar_size = 0.0; + + win = elm_win_add(NULL, "panes", ELM_WIN_BASIC); + elm_win_title_set(win, "Panes"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + evas_object_show(bg); + + panes = elm_panes_add(win); + evas_object_size_hint_weight_set(panes, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_panes_content_left_min_size_set(panes, 100); + elm_panes_content_left_size_set(panes, 0.7); + elm_win_resize_object_add(win, panes); + evas_object_show(panes); + + evas_object_smart_callback_add(panes, "clicked", _clicked, panes); + evas_object_smart_callback_add(panes, "clicked,double", _clicked_double, &vbar_size); + + evas_object_smart_callback_add(panes, "press", _press, panes); + evas_object_smart_callback_add(panes, "unpress", _unpress, panes); + + // add left button + bt = elm_button_add(win); + elm_object_text_set(bt, "Left - min size 100 - size 70%"); + evas_object_show(bt); + elm_object_part_content_set(panes, "left", bt); + + // add panes + panes_h = elm_panes_add(win); + elm_panes_horizontal_set(panes_h, EINA_TRUE); + elm_panes_content_right_min_size_set(panes_h, 100); + elm_panes_content_right_size_set(panes_h, 0.3); + evas_object_show(panes_h); + + evas_object_smart_callback_add(panes_h, "clicked", _clicked, panes_h); + evas_object_smart_callback_add(panes_h, "clicked,double", _clicked_double, &hbar_size); + + evas_object_smart_callback_add(panes_h, "press", _press, panes_h); + evas_object_smart_callback_add(panes_h, "unpress", _unpress, panes_h); + elm_object_part_content_set(panes, "right", panes_h); + + // add up button + bt = elm_button_add(win); + elm_object_text_set(bt, "Up"); + evas_object_show(bt); + elm_object_part_content_set(panes_h, "top", bt); + + // add down button + bt = elm_button_add(win); + elm_object_text_set(bt, "Down - min size 100 size 30%"); + evas_object_show(bt); + elm_object_part_content_set(panes_h, "bottom", bt); + + evas_object_resize(win, 320, 400); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_photo.c b/src/bin/elementary/test_photo.c new file mode 100644 index 0000000000..7a6e0baf53 --- /dev/null +++ b/src/bin/elementary/test_photo.c @@ -0,0 +1,100 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void +_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("photo clicked\n"); +} + +static void +drag_start_cb(void *mydata EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *evdata EINA_UNUSED) +{ + printf("Drag start.\n"); +} + +static void +drag_end_cb(void *mydata EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *evdata EINA_UNUSED) +{ + printf("Drag end.\n"); +} + +void +test_photo(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *sc, *tb, *ph; + int i, j, n; + char buf[PATH_MAX]; + + const char *img[9] = + { + "panel_01.jpg", + "mystrale.jpg", + "mystrale_2.jpg", + "rock_02.jpg", + "sky_01.jpg", + "sky_02.jpg", + "sky_03.jpg", + "sky_04.jpg", + "wood_01.jpg" + }; + + elm_need_ethumb(); + + win = elm_win_util_standard_add("photo", "Photo"); + elm_win_autodel_set(win, EINA_TRUE); + + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + n = 0; + for (j = 0; j < 12; j++) + { + for (i = 0; i < 12; i++) + { + ph = elm_photo_add(win); + evas_object_smart_callback_add(ph, "clicked", _clicked_cb, NULL); + snprintf(buf, sizeof(buf), "%s/images/%s", + elm_app_data_dir_get(), img[n]); + n++; + if (n >= 9) n = 0; + elm_photo_aspect_fixed_set(ph, EINA_FALSE); + elm_photo_size_set(ph, 80); + if (n == 8) + elm_photo_thumb_set(ph, buf, NULL); + else + elm_photo_file_set(ph, buf); + elm_photo_editable_set(ph, EINA_TRUE); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_smart_callback_add(ph, "drag,start", + drag_start_cb, NULL); + evas_object_smart_callback_add(ph, "drag,end", + drag_end_cb, NULL); + + if ((n == 2) || (n == 3)) + { + elm_photo_fill_inside_set(ph, EINA_TRUE); + elm_object_style_set(ph, "shadow"); + } + elm_table_pack(tb, ph, i, j, 1, 1); + evas_object_show(ph); + } + } + + sc = elm_scroller_add(win); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, sc); + + elm_object_content_set(sc, tb); + evas_object_show(tb); + evas_object_show(sc); + + evas_object_resize(win, 300, 300); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_photocam.c b/src/bin/elementary/test_photocam.c new file mode 100644 index 0000000000..be6a1724b1 --- /dev/null +++ b/src/bin/elementary/test_photocam.c @@ -0,0 +1,616 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static const struct { + Evas_Image_Orient orient; + const char *name; +} photocam_orient[] = { + { EVAS_IMAGE_ORIENT_NONE, "None" }, + { EVAS_IMAGE_ORIENT_90, "Rotate 90" }, + { EVAS_IMAGE_ORIENT_180, "Rotate 180" }, + { EVAS_IMAGE_ORIENT_270, "Rotate 270" }, + { EVAS_IMAGE_FLIP_HORIZONTAL, "Horizontal Flip" }, + { EVAS_IMAGE_FLIP_VERTICAL, "Vertical Flip" }, + { EVAS_IMAGE_FLIP_TRANSPOSE, "Transpose" }, + { EVAS_IMAGE_FLIP_TRANSVERSE, "Transverse" }, + { 0, NULL } +}; + +static void +my_ph_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("clicked\n"); +} + +static void +my_ph_ch(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *photocam = data; + Evas_Image_Orient orient = elm_radio_value_get(obj); + + elm_photocam_image_orient_set(photocam, orient); + fprintf(stderr, "Set %i and got %i\n", + orient, elm_photocam_image_orient_get(photocam)); +} + +static void +my_ph_press(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("press\n"); +} + +static void +my_ph_longpressed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("longpressed\n"); +} + +static void +my_ph_clicked_double(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("clicked,double\n"); +} + +static void +my_ph_load(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("load\n"); +} + +static void +my_ph_loaded(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("loaded\n"); +} + +static void +my_ph_load_details(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("load,details\n"); +} + +static void +my_ph_loaded_details(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("loaded,details\n"); +} + +static void +my_ph_zoom_start(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("zoom,start\n"); +} + +static void +my_ph_zoom_stop(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("zoom,stop\n"); +} + +static void +my_ph_zoom_change(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("zoom,change\n"); +} + +static void +my_ph_anim_start(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("anim,start\n"); +} + +static void +my_ph_anim_stop(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("anim,stop\n"); +} + +static void +my_ph_drag_start(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("drag,start\n"); +} + +static void +my_ph_drag_stop(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("drag_stop\n"); +} + +static void +my_ph_scroll(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + int x, y, w, h; + elm_photocam_image_region_get(obj, &x, &y, &w, &h); + printf("scroll %i %i %ix%i\n", x, y, w, h); +} + +static void +my_bt_open(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Evas_Object *ph = data; + const char *file = event_info; + + if (file) + elm_photocam_file_set(ph, file); +} + +static void +my_bt_show_reg(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_photocam_image_region_show(data, 30, 50, 500, 300); +} + +static void +my_bt_bring_reg(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) + +{ + elm_photocam_image_region_bring_in(data, 800, 300, 500, 300); +} + +static void +my_bt_zoom_in(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + double zoom; + + zoom = elm_photocam_zoom_get(data); + if (zoom > 1.5) + zoom -= 0.5; + else if ((zoom > 1.0) && (zoom <= 1.5)) + zoom = 1.0; + else if (zoom == 1.0) + zoom = 0.8; + else + zoom = zoom * zoom; + + elm_photocam_zoom_mode_set(data, ELM_PHOTOCAM_ZOOM_MODE_MANUAL); + if (zoom >= (1.0 / 32.0)) + { + printf("zoom %f\n", zoom); + elm_photocam_zoom_set(data, zoom); + } +} + +static void +my_bt_zoom_out(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + double zoom; + + zoom = elm_photocam_zoom_get(data); + zoom += 0.5; + elm_photocam_zoom_mode_set(data, ELM_PHOTOCAM_ZOOM_MODE_MANUAL); + if (zoom <= 256.0) + { + printf("zoom %f\n", zoom); + elm_photocam_zoom_set(data, zoom); + } +} + +static void +my_bt_pause(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_photocam_paused_set(data, !elm_photocam_paused_get(data)); +} + +static void +my_bt_zoom_fit_in(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_photocam_zoom_mode_set(data, ELM_PHOTOCAM_ZOOM_MODE_AUTO_FIT_IN); +} + +static void +my_bt_zoom_fit(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_photocam_zoom_mode_set(data, ELM_PHOTOCAM_ZOOM_MODE_AUTO_FIT); +} + +static void +my_bt_zoom_fill(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_photocam_zoom_mode_set(data, ELM_PHOTOCAM_ZOOM_MODE_AUTO_FILL); +} + +static void +my_bt_gesture(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_photocam_gesture_enabled_set(data, !elm_photocam_gesture_enabled_get(data)); +} + +static void +my_ph_download_progress(void *data EINA_UNUSED, Evas_Object *obj, void *event_info) +{ + Elm_Photocam_Progress *info = (Elm_Photocam_Progress *) event_info; + Evas_Object *pb = evas_object_data_get(obj, "progressbar"); + + if (info->total > 0.0) + elm_progressbar_value_set(pb, info->now / info->total); +} + +static void +my_ph_download_done(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *pb = evas_object_data_get(obj, "progressbar"); + + evas_object_hide(pb); +} + +static void +_photocam_mouse_wheel_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Evas_Object *photocam = data; + Evas_Event_Mouse_Wheel *ev = (Evas_Event_Mouse_Wheel*) event_info; + int zoom; + double val; + + //unset the mouse wheel + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; + + zoom = elm_photocam_zoom_get(photocam); + if ((ev->z>0) && (zoom == 1)) return; + + if (ev->z > 0) + zoom /= 2; + else + zoom *= 2; + + val = 1; + int _zoom = zoom; + while (_zoom>1) + { + _zoom /= 2; + val++; + } + + elm_photocam_zoom_mode_set(photocam, ELM_PHOTOCAM_ZOOM_MODE_MANUAL); + if (zoom >= 1) elm_photocam_zoom_set(photocam, zoom); +} + +static void +_photocam_move_resize_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + int x, y, w, h; + + evas_object_geometry_get(obj, &x, &y, &w, &h); + evas_object_resize(data, w, h); + evas_object_move(data, x, y); +} + +void +test_photocam(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + char buf[PATH_MAX]; + Evas_Object *win, *ph, *tb2, *bt, *box, *rd, *rdg = NULL; + int i; + Evas_Object *rect = NULL; + win = elm_win_util_standard_add("photocam", "PhotoCam"); + elm_win_autodel_set(win, EINA_TRUE); + + ph = elm_photocam_add(win); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + snprintf(buf, sizeof(buf), "%s/images/rock_01.jpg", elm_app_data_dir_get()); + elm_photocam_file_set(ph, buf); + elm_win_resize_object_add(win, ph); + + // this rectangle hooks the event prior to scroller + rect = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(rect, 0, 0, 0, 0); + evas_object_repeat_events_set(rect, EINA_TRUE); + evas_object_show(rect); + evas_object_event_callback_add(rect, EVAS_CALLBACK_MOUSE_WHEEL, _photocam_mouse_wheel_cb, ph); + evas_object_raise(rect); + + // add move/resize callbacks to resize rect manually + evas_object_event_callback_add(ph, EVAS_CALLBACK_RESIZE, _photocam_move_resize_cb, rect); + evas_object_event_callback_add(ph, EVAS_CALLBACK_MOVE, _photocam_move_resize_cb, rect); + + evas_object_smart_callback_add(ph, "clicked", my_ph_clicked, win); + evas_object_smart_callback_add(ph, "press", my_ph_press, win); + evas_object_smart_callback_add(ph, "longpressed", my_ph_longpressed, win); + evas_object_smart_callback_add(ph, "clicked,double", my_ph_clicked_double, win); + evas_object_smart_callback_add(ph, "load", my_ph_load, win); + evas_object_smart_callback_add(ph, "loaded", my_ph_loaded, win); + evas_object_smart_callback_add(ph, "load,details", my_ph_load_details, win); + evas_object_smart_callback_add(ph, "loaded,details", my_ph_loaded_details, win); + evas_object_smart_callback_add(ph, "zoom,start", my_ph_zoom_start, win); + evas_object_smart_callback_add(ph, "zoom,stop", my_ph_zoom_stop, win); + evas_object_smart_callback_add(ph, "zoom,change", my_ph_zoom_change, win); + evas_object_smart_callback_add(ph, "scroll,anim,start", my_ph_anim_start, win); + evas_object_smart_callback_add(ph, "scroll,anim,stop", my_ph_anim_stop, win); + evas_object_smart_callback_add(ph, "scroll,drag,start", my_ph_drag_start, win); + evas_object_smart_callback_add(ph, "scroll,drag,stop", my_ph_drag_stop, win); + evas_object_smart_callback_add(ph, "scroll", my_ph_scroll, win); + + evas_object_show(ph); + + tb2 = elm_table_add(win); + evas_object_size_hint_weight_set(tb2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, tb2); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Z -"); + evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_out, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.1, 0.1); + elm_table_pack(tb2, bt, 0, 0, 1, 1); + evas_object_show(bt); + + bt = elm_fileselector_button_add(win); + elm_object_text_set(bt, "Select Photo"); + evas_object_smart_callback_add(bt, "file,chosen", my_bt_open, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.5, 0.1); + elm_table_pack(tb2, bt, 1, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Z +"); + evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_in, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.9, 0.1); + elm_table_pack(tb2, bt, 2, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Show 30,50 500x300"); + evas_object_smart_callback_add(bt, "clicked", my_bt_show_reg, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.1, 0.5); + elm_table_pack(tb2, bt, 0, 1, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Bring 800,300 500x300"); + evas_object_smart_callback_add(bt, "clicked", my_bt_bring_reg, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.9, 0.5); + elm_table_pack(tb2, bt, 2, 1, 1, 1); + evas_object_show(bt); + + box = elm_box_add(win); + elm_box_horizontal_set(box, EINA_TRUE); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, 0.0, 0.9); + elm_table_pack(tb2, box, 0, 2, 1, 1); + evas_object_show(box); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Pause On/Off"); + evas_object_smart_callback_add(bt, "clicked", my_bt_pause, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(box, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Gesture On/Off"); + evas_object_smart_callback_add(bt, "clicked", my_bt_gesture, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(box, bt); + evas_object_show(bt); + + box = elm_box_add(win); + elm_box_horizontal_set(box, EINA_TRUE); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, 0.9, 0.9); + elm_table_pack(tb2, box, 2, 2, 1, 1); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Fit"); + evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_fit, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(box, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Fit_In"); + evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_fit_in, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(box, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Fill"); + evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_fill, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(box, bt); + evas_object_show(bt); + + box = elm_box_add(tb2); + elm_box_horizontal_set(box, EINA_TRUE); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, 0.9, 0.9); + elm_table_pack(tb2, box, 1, 2, 1, 1); + evas_object_show(box); + + for (i = 0; photocam_orient[i].name; ++i) + { + rd = elm_radio_add(win); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_radio_state_value_set(rd, photocam_orient[i].orient); + elm_object_text_set(rd, photocam_orient[i].name); + elm_box_pack_end(box, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", my_ph_ch, ph); + if (!rdg) + rdg = rd; + else + elm_radio_group_add(rd, rdg); + } + evas_object_show(box); + evas_object_show(tb2); + + evas_object_resize(win, 800, 800); + evas_object_show(win); +} + +void +test_photocam_remote(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *ph, *tb2, *bt, *box, *pb, *rd; + Evas_Object *rdg = NULL; + Evas_Object *rect = NULL; + // these were just testing - use the "select photo" browser to select one + static const char *url = "http://eoimages.gsfc.nasa.gov/images/imagerecords/73000/73751/world.topo.bathy.200407.3x21600x10800.jpg"; + int i; + + win = elm_win_util_standard_add("photocam", "PhotoCam"); + elm_win_autodel_set(win, EINA_TRUE); + + ph = elm_photocam_add(win); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, ph); + + // this rectangle hooks the event prior to scroller + rect = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(rect, 0, 0, 0, 0); + evas_object_repeat_events_set(rect, EINA_TRUE); + evas_object_show(rect); + evas_object_event_callback_add(rect, EVAS_CALLBACK_MOUSE_WHEEL, _photocam_mouse_wheel_cb, ph); + evas_object_raise(rect); + + // add move/resize callbacks to resize rect manually + evas_object_event_callback_add(ph, EVAS_CALLBACK_RESIZE, _photocam_move_resize_cb, rect); + evas_object_event_callback_add(ph, EVAS_CALLBACK_MOVE, _photocam_move_resize_cb, rect); + + evas_object_smart_callback_add(ph, "clicked", my_ph_clicked, win); + evas_object_smart_callback_add(ph, "press", my_ph_press, win); + evas_object_smart_callback_add(ph, "longpressed", my_ph_longpressed, win); + evas_object_smart_callback_add(ph, "clicked,double", my_ph_clicked_double, win); + evas_object_smart_callback_add(ph, "load", my_ph_load, win); + evas_object_smart_callback_add(ph, "loaded", my_ph_loaded, win); + evas_object_smart_callback_add(ph, "load,details", my_ph_load_details, win); + evas_object_smart_callback_add(ph, "loaded,details", my_ph_loaded_details, win); + evas_object_smart_callback_add(ph, "zoom,start", my_ph_zoom_start, win); + evas_object_smart_callback_add(ph, "zoom,stop", my_ph_zoom_stop, win); + evas_object_smart_callback_add(ph, "zoom,change", my_ph_zoom_change, win); + evas_object_smart_callback_add(ph, "scroll,anim,start", my_ph_anim_start, win); + evas_object_smart_callback_add(ph, "scroll,anim,stop", my_ph_anim_stop, win); + evas_object_smart_callback_add(ph, "scroll,drag,start", my_ph_drag_start, win); + evas_object_smart_callback_add(ph, "scroll,drag,stop", my_ph_drag_stop, win); + evas_object_smart_callback_add(ph, "scroll", my_ph_scroll, win); + evas_object_smart_callback_add(ph, "download,progress", my_ph_download_progress, win); + evas_object_smart_callback_add(ph, "download,done", my_ph_download_done, win); + + elm_photocam_file_set(ph, url); + evas_object_show(ph); + + tb2 = elm_table_add(win); + evas_object_size_hint_weight_set(tb2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, tb2); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Z -"); + evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_out, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.1, 0.1); + elm_table_pack(tb2, bt, 0, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Z +"); + evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_in, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.9, 0.1); + elm_table_pack(tb2, bt, 2, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Show 30,50 500x300"); + evas_object_smart_callback_add(bt, "clicked", my_bt_show_reg, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.1, 0.5); + elm_table_pack(tb2, bt, 0, 1, 1, 1); + evas_object_show(bt); + + pb = elm_progressbar_add(win); + elm_progressbar_unit_format_set(pb, "Loading %.2f %%"); + evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb2, pb, 1, 1, 1, 1); + evas_object_show(pb); + evas_object_data_set(ph, "progressbar", pb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Bring 800,300 500x300"); + evas_object_smart_callback_add(bt, "clicked", my_bt_bring_reg, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.9, 0.5); + elm_table_pack(tb2, bt, 2, 1, 1, 1); + evas_object_show(bt); + + box = elm_box_add(win); + elm_box_horizontal_set(box, EINA_TRUE); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, 0.0, 0.9); + elm_table_pack(tb2, box, 0, 2, 1, 1); + evas_object_show(box); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Pause On/Off"); + evas_object_smart_callback_add(bt, "clicked", my_bt_pause, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(box, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Gesture On/Off"); + evas_object_smart_callback_add(bt, "clicked", my_bt_gesture, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(box, bt); + evas_object_show(bt); + + box = elm_box_add(win); + elm_box_horizontal_set(box, EINA_TRUE); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, 0.9, 0.9); + elm_table_pack(tb2, box, 2, 2, 1, 1); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Fit"); + evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_fit, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(box, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Fit_In"); + evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_fit_in, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(box, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Fill"); + evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_fill, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(box, bt); + evas_object_show(bt); + + box = elm_box_add(tb2); + elm_box_horizontal_set(box, EINA_TRUE); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, 0.9, 0.9); + elm_table_pack(tb2, box, 1, 2, 1, 1); + evas_object_show(box); + + for (i = 0; photocam_orient[i].name; ++i) + { + rd = elm_radio_add(win); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_radio_state_value_set(rd, photocam_orient[i].orient); + elm_object_text_set(rd, photocam_orient[i].name); + elm_box_pack_end(box, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", my_ph_ch, ph); + if (!rdg) + rdg = rd; + else + elm_radio_group_add(rd, rdg); + } + evas_object_show(box); + evas_object_show(tb2); + + evas_object_resize(win, 800, 800); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_popup.c b/src/bin/elementary/test_popup.c new file mode 100644 index 0000000000..3ab08e1722 --- /dev/null +++ b/src/bin/elementary/test_popup.c @@ -0,0 +1,934 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +#define POPUP_POINT_MAX 8 + +typedef struct +{ + double x; + double y; +} Evas_Rel_Coord_Point; + +static Evas_Object *g_popup = NULL; +static int times = 0; +static Eina_Bool is_popup_scroll; +static Evas_Rel_Coord_Point _popup_point[POPUP_POINT_MAX] = +{ + { 0.01, 0.01 }, + { 0.2, 0.2 }, + { 0.5, 0.5 }, + { 0.99, 0.01 }, + { 0.01, 0.99 }, + { 0.99, 0.99 }, + { 0.0, 0.0 }, + { 1.5, 1.5 } +}; + +static void +_response_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + evas_object_del(obj); +} + +static void +_popup_close_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + evas_object_del(data); +} + +static void +_popup_dismiss_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + elm_popup_dismiss(data); +} + +static void +_popup_align_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + static int k = 0; + double h = -1, v = -1; + + elm_popup_align_set(data, _popup_point[k].x, _popup_point[k].y); + elm_popup_align_get(data, &h, &v); + + printf("elm_popup_align_get :: Aligned: %lf %lf\n", h, v); + + k++; + if (k >= POPUP_POINT_MAX) + k = 0; +} + +static void +_g_popup_response_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + evas_object_hide(data); +} + +static void +_restack_block_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + // remove restacked image if there is any + Evas_Object *popup_data = evas_object_data_get(obj, "im"); + if (popup_data) evas_object_del(popup_data); + evas_object_del(obj); +} + +static void +_restack_popup_close_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup_data = evas_object_data_get(data, "im"); + if (popup_data) evas_object_del(popup_data); + evas_object_del(data); +} + +static void +_block_clicked_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + if (data) + evas_object_del(data); + evas_object_del(obj); +} + +static void +_item_selected_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + printf("popup item selected: %s\n", elm_object_item_text_get(event_info)); +} + +static void +_list_click(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Elm_Object_Item *it = elm_list_selected_item_get(obj); + if (!it) return; + elm_list_item_selected_set(it, EINA_FALSE); +} + +static void +_popup_key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Evas_Event_Key_Down *ev = event_info; + + printf("Key: %s\n", ev->keyname); +} + +static void +_popup_center_text_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup; + + popup = elm_popup_add(data); + elm_popup_scrollable_set(popup, is_popup_scroll); + elm_object_text_set(popup, "This Popup has content area and " + "timeout value is 3 seconds"); + elm_popup_timeout_set(popup, 3.0); + evas_object_smart_callback_add(popup, "timeout", _response_cb, popup); + evas_object_event_callback_add(popup, EVAS_CALLBACK_KEY_DOWN, + _popup_key_down_cb, NULL); + + // popup show should be called after adding all the contents and the buttons + // of popup to set the focus into popup's contents correctly. + evas_object_show(popup); +} + +static void +_popup_center_text_1button_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup; + Evas_Object *btn; + + popup = elm_popup_add(data); + elm_popup_scrollable_set(popup, is_popup_scroll); + elm_object_text_set(popup, "This Popup has content area and " + "action area set, action area has one button Close"); + + // popup buttons + btn = elm_button_add(popup); + elm_object_text_set(btn, "Close"); + elm_object_part_content_set(popup, "button1", btn); + evas_object_smart_callback_add(btn, "clicked", _popup_close_cb, popup); + + // popup show should be called after adding all the contents and the buttons + // of popup to set the focus into popup's contents correctly. + evas_object_show(popup); +} + +static void +_popup_center_title_text_1button_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup; + Evas_Object *btn; + + popup = elm_popup_add(data); + elm_popup_scrollable_set(popup, is_popup_scroll); + + // popup text + elm_object_text_set(popup, "This Popup has title area, content area and " + "action area set, action area has one button Close"); + // popup title + elm_object_part_text_set(popup, "title,text", "Title"); + + // popup buttons + btn = elm_button_add(popup); + elm_object_text_set(btn, "Close"); + elm_object_part_content_set(popup, "button1", btn); + evas_object_smart_callback_add(btn, "clicked", _popup_close_cb, popup); + + // popup show should be called after adding all the contents and the buttons + // of popup to set the focus into popup's contents correctly. + evas_object_show(popup); +} + +static void +_popup_center_title_text_block_clicked_event_cb(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup; + + popup = elm_popup_add(data); + elm_popup_scrollable_set(popup, is_popup_scroll); + evas_object_smart_callback_add(popup, "block,clicked", _block_clicked_cb, + NULL); + + // popup text + elm_object_text_set(popup, "This Popup has title area and content area. " + "When clicked on blocked event region, popup gets " + "deleted"); + // popup title + elm_object_part_text_set(popup, "title,text", "Title"); + + // popup show should be called after adding all the contents and the buttons + // of popup to set the focus into popup's contents correctly. + evas_object_show(popup); +} + +static void +_popup_center_title_text_block_clicked_event_with_parent_cb(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *bg, *popup; + + bg = elm_bg_add(data); + elm_bg_color_set(bg, 255, 0, 0); + evas_object_resize(bg, 350, 200); + evas_object_move(bg, 100, 100); + evas_object_show(bg); + + popup = elm_popup_add(bg); + elm_popup_scrollable_set(popup, is_popup_scroll); + evas_object_smart_callback_add(popup, "block,clicked", + _block_clicked_cb, bg); + + // popup text + elm_object_text_set(popup, "This Popup has title area and content area. " + "Its blocked event region is a small rectangle. " + "When clicked on blocked event region, popup gets " + "deleted"); + // popup title + elm_object_part_text_set(popup, "title,text", "Title"); + + // popup show should be called after adding all the contents and the buttons + // of popup to set the focus into popup's contents correctly. + evas_object_show(popup); +} + +static void +_popup_bottom_title_text_3button_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup; + Evas_Object *icon, *btn1, *btn2, *btn3; + char buf[256]; + + popup = elm_popup_add(data); + elm_popup_scrollable_set(popup, is_popup_scroll); + elm_popup_orient_set(popup, ELM_POPUP_ORIENT_BOTTOM); + + // popup text + elm_object_text_set(popup, "This Popup has title area, content area and " + "action area set with content being character wrapped. " + "action area has three buttons OK, Cancel and Close"); + elm_popup_content_text_wrap_type_set(popup, ELM_WRAP_CHAR); + + // popup title + elm_object_part_text_set(popup, "title,text", "Title"); + + // popup title icon + icon = elm_icon_add(popup); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", + elm_app_data_dir_get()); + elm_image_file_set(icon, buf, NULL); + elm_object_part_content_set(popup, "title,icon", icon); + + // popup buttons + btn1 = elm_button_add(popup); + elm_object_text_set(btn1, "OK"); + elm_object_part_content_set(popup, "button1", btn1); + evas_object_smart_callback_add(btn1, "clicked", _popup_close_cb, popup); + + btn2 = elm_button_add(popup); + elm_object_text_set(btn2, "Cancel"); + elm_object_part_content_set(popup, "button2", btn2); + evas_object_smart_callback_add(btn2, "clicked", _popup_close_cb, popup); + + btn3 = elm_button_add(popup); + elm_object_text_set(btn3, "Close"); + elm_object_part_content_set(popup, "button3", btn3); + evas_object_smart_callback_add(btn3, "clicked", _popup_close_cb, popup); + + // popup show should be called after adding all the contents and the buttons + // of popup to set the focus into popup's contents correctly. + evas_object_show(popup); +} + +static void +_popup_center_title_content_3button_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup; + Evas_Object *icon, *btn, *btn1, *btn2, *btn3; + char buf[256]; + + popup = elm_popup_add(data); + if (is_popup_scroll) + elm_popup_scrollable_set(popup, is_popup_scroll); + + // popup title + elm_object_part_text_set(popup, "title,text", "Title"); + + // popup content + btn = elm_button_add(popup); + elm_object_text_set(btn, "Content"); + icon = elm_icon_add(btn); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", + elm_app_data_dir_get()); + elm_image_file_set(icon, buf, NULL); + elm_object_content_set(btn, icon); + elm_object_content_set(popup, btn); + + // popup buttons + btn1 = elm_button_add(popup); + elm_object_text_set(btn1, "OK"); + elm_object_part_content_set(popup, "button1", btn1); + evas_object_smart_callback_add(btn1, "clicked", _popup_close_cb, popup); + + btn2 = elm_button_add(popup); + elm_object_text_set(btn2, "Cancel"); + elm_object_part_content_set(popup, "button2", btn2); + evas_object_smart_callback_add(btn2, "clicked", _popup_close_cb, popup); + + btn3 = elm_button_add(popup); + elm_object_text_set(btn3, "Close"); + elm_object_part_content_set(popup, "button3", btn3); + evas_object_smart_callback_add(btn3, "clicked", _popup_close_cb, popup); + + // popup show should be called after adding all the contents and the buttons + // of popup to set the focus into popup's contents correctly. + evas_object_show(popup); +} + +static void +_item_focused_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *it = event_info; + + printf("item,focused:%p\n", it); +} + +static void +_item_unfocused_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *it = event_info; + + printf("item,unfocused:%p\n", it); +} + +static void +_popup_center_title_item_3button_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + char buf[256]; + unsigned int i; + Evas_Object *popup, *icon1, *btn1, *btn2, *btn3; + + popup = elm_popup_add(data); + if (is_popup_scroll) + elm_popup_scrollable_set(popup, is_popup_scroll); + + // popup title + elm_object_part_text_set(popup, "title,text", "Title"); + + // popup items + icon1 = elm_icon_add(popup); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", + elm_app_data_dir_get()); + elm_image_file_set(icon1, buf, NULL); + for (i = 0; i < 20; i++) + { + snprintf(buf, sizeof(buf), "Item%u", i+1); + if (i == 3) + elm_popup_item_append(popup, buf, icon1, _item_selected_cb, NULL); + else + elm_popup_item_append(popup, buf, NULL, _item_selected_cb, NULL); + } + + // popup buttons + btn1 = elm_button_add(popup); + elm_object_text_set(btn1, "OK"); + elm_object_part_content_set(popup, "button1", btn1); + evas_object_smart_callback_add(btn1, "clicked", _popup_close_cb, popup); + + btn2 = elm_button_add(popup); + elm_object_text_set(btn2, "Cancel"); + elm_object_part_content_set(popup, "button2", btn2); + evas_object_smart_callback_add(btn2, "clicked", _popup_close_cb, popup); + + btn3 = elm_button_add(popup); + elm_object_text_set(btn3, "Close"); + elm_object_part_content_set(popup, "button3", btn3); + evas_object_smart_callback_add(btn3, "clicked", _popup_close_cb, popup); + + // popup show should be called after adding all the contents and the buttons + // of popup to set the focus into popup's contents correctly. + evas_object_show(popup); + evas_object_smart_callback_add(popup, "item,focused", _item_focused_cb, NULL); + evas_object_smart_callback_add(popup, "item,unfocused", _item_unfocused_cb, NULL); +} + +static void +_restack_btn_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *im; + char buf[PATH_MAX]; + void *popup_data; + + popup_data = evas_object_data_get(data, "im"); + if (popup_data) return; + + im = evas_object_image_filled_add(evas_object_evas_get(obj)); + snprintf(buf, sizeof(buf), "%s/images/%s", + elm_app_data_dir_get(), "twofish.jpg"); + evas_object_image_file_set(im, buf, NULL); + evas_object_move(im, 40, 40); + evas_object_resize(im, 320, 320); + evas_object_show(im); + evas_object_data_set((Evas_Object *)data, "im", im); + + evas_object_raise((Evas_Object *)data); +} + +static void +_popup_center_title_text_2button_restack_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup; + Evas_Object *btn, *btn2; + + popup = elm_popup_add(data); + if (is_popup_scroll) + elm_popup_scrollable_set(popup, is_popup_scroll); + evas_object_smart_callback_add(popup, "block,clicked", + _restack_block_clicked_cb, NULL); + + // popup text + elm_object_text_set(popup, "When you click the 'Restack' button, " + "an image will be located under this popup"); + // popup title + elm_object_part_text_set(popup, "title,text", "Title"); + + // popup buttons + btn = elm_button_add(popup); + elm_object_text_set(btn, "Restack"); + elm_object_part_content_set(popup, "button1", btn); + evas_object_smart_callback_add(btn, "clicked", _restack_btn_clicked, popup); + + btn2 = elm_button_add(popup); + elm_object_text_set(btn2, "Close"); + elm_object_part_content_set(popup, "button2", btn2); + evas_object_smart_callback_add(btn2, "clicked", + _restack_popup_close_cb, popup); + + // popup show should be called after adding all the contents and the buttons + // of popup to set the focus into popup's contents correctly. + evas_object_show(popup); +} + +static void +_popup_center_text_1button_hide_show_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *btn; + char str[128]; + + times++; + if (g_popup) + { + sprintf(str, "You have checked this popup %d times.", times); + elm_object_text_set(g_popup, str); + evas_object_show(g_popup); + return; + } + + g_popup = elm_popup_add(data); + if (is_popup_scroll) + elm_popup_scrollable_set(g_popup, is_popup_scroll); + elm_object_text_set(g_popup, "Hide this popup by using the button." + "When you click list item again, you can see this popup."); + + // popup buttons + btn = elm_button_add(g_popup); + elm_object_text_set(btn, "Hide"); + elm_object_part_content_set(g_popup, "button1", btn); + evas_object_smart_callback_add(btn, "clicked", _g_popup_response_cb, g_popup); + + // popup show should be called after adding all the contents and the buttons + // of popup to set the focus into popup's contents correctly. + evas_object_show(g_popup); +} + +static void +_toggle_button_cb(void *data, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Evas_Object *btn = data; + char buf[] = "button0"; + int i; + + i = (int)(uintptr_t)evas_object_data_get(btn, "index"); + + buf[6] = '0' + i + 1; + if (evas_object_visible_get(btn)) + { + elm_object_part_content_unset(obj, buf); + evas_object_hide(btn); + } + else + elm_object_part_content_set(obj, buf, btn); +} + +static void +_popup_center_text_3button_add_remove_button_cb(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup; + Evas_Object *btns[3]; + + char buf[256]; + int i; + + popup = elm_popup_add(data); + if (is_popup_scroll) + elm_popup_scrollable_set(popup, is_popup_scroll); + + // popup title + elm_object_part_text_set(popup, "title,text", + "Click the item to toggle button"); + + // popup buttons + for (i = 0; i < 3; ++i) + { + snprintf(buf, sizeof(buf), "Btn #%d", i + 1); + btns[i] = elm_button_add(popup); + evas_object_data_set(btns[i], "index", (void*)(uintptr_t)i); + elm_object_text_set(btns[i], buf); + + elm_popup_item_append(popup, buf, NULL, _toggle_button_cb, btns[i]); + + snprintf(buf, sizeof(buf), "button%d", i + 1); + elm_object_part_content_set(popup, buf, btns[i]); + evas_object_smart_callback_add(btns[i], "clicked", + _popup_close_cb, popup); + } + + // popup show should be called after adding all the contents and the buttons + // of popup to set the focus into popup's contents correctly. + evas_object_show(popup); +} + +static void +_popup_transparent_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup; + Evas_Object *btn; + + popup = elm_popup_add(data); + if (is_popup_scroll) + elm_popup_scrollable_set(popup, is_popup_scroll); + elm_object_style_set(popup, "transparent"); + elm_object_text_set(popup, "This Popup has transparent background"); + + // popup buttons + btn = elm_button_add(popup); + elm_object_text_set(btn, "Close"); + elm_object_part_content_set(popup, "button1", btn); + evas_object_smart_callback_add(btn, "clicked", _popup_close_cb, popup); + + // popup show should be called after adding all the contents and the buttons + // of popup to set the focus into popup's contents correctly. + evas_object_show(popup); +} + +static void +_popup_transparent_align_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup; + Evas_Object *btn, *btn1; + + popup = elm_popup_add(data); + if (is_popup_scroll) + elm_popup_scrollable_set(popup, is_popup_scroll); + elm_object_style_set(popup, "transparent"); + elm_object_text_set(popup, "This Popup has transparent background"); + + // popup buttons + btn = elm_button_add(popup); + elm_object_text_set(btn, "Move"); + elm_object_part_content_set(popup, "button1", btn); + evas_object_smart_callback_add(btn, "clicked", _popup_align_cb, popup); + + btn1 = elm_button_add(popup); + elm_object_text_set(btn1, "Close"); + elm_object_part_content_set(popup, "button2", btn1); + evas_object_smart_callback_add(btn1, "clicked", _popup_close_cb, popup); + + // popup show should be called after adding all the contents and the buttons + // of popup to set the focus into popup's contents correctly. + evas_object_show(popup); +} + +static void +_list_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + evas_object_del(data); +} + +char * +gl_popup_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part EINA_UNUSED) +{ + char buf[256]; + snprintf(buf, sizeof(buf), "Item # %i", (int)(uintptr_t)data); + return strdup(buf); +} + +static void +_popup_center_title_list_content_1button_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup, *list; + Evas_Object *btn; + + popup = elm_popup_add(data); + if (is_popup_scroll) + elm_popup_scrollable_set(popup, is_popup_scroll); + elm_object_part_text_set(popup, "title,text", "Title"); + + // list as a popup content + list = elm_list_add(popup); + elm_list_mode_set(list, ELM_LIST_EXPAND); + elm_list_item_append(list, "List Item #1", NULL, NULL, _list_cb, popup); + elm_list_item_append(list, "List Item #2", NULL, NULL, _list_cb, popup); + elm_list_item_append(list, "List Item #3", NULL, NULL, _list_cb, popup); + elm_object_content_set(popup, list); + + // popup buttons + btn = elm_button_add(popup); + elm_object_text_set(btn, "OK"); + elm_object_part_content_set(popup, "button1", btn); + evas_object_smart_callback_add(btn, "clicked", _popup_close_cb, popup); + + // popup show should be called after adding all the contents and the buttons + // of popup to set the focus into popup's contents correctly. + evas_object_show(popup); +} + +static void +_popup_center_title_genlist_content_1button_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup, *genlist; + Evas_Object *btn; + int i; + + popup = elm_popup_add(data); + if (is_popup_scroll) + elm_popup_scrollable_set(popup, is_popup_scroll); + elm_object_part_text_set(popup, "title,text", "Title"); + + Elm_Genlist_Item_Class *itc1 = elm_genlist_item_class_new(); + itc1->item_style = "default"; + itc1->func.text_get = gl_popup_text_get; + itc1->func.content_get = NULL; + itc1->func.state_get = NULL; + itc1->func.del = NULL; + + // genlist as a popup content + genlist = elm_genlist_add(popup); + elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS); + elm_scroller_content_min_limit(genlist, EINA_FALSE, EINA_TRUE); + + for (i = 0; i < 10; i++) + { + elm_genlist_item_append(genlist, + itc1, + (void *)(uintptr_t)i/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_NONE, + NULL, + NULL); + } + elm_genlist_item_class_free(itc1); + elm_object_content_set(popup, genlist); + + // popup buttons + btn = elm_button_add(popup); + elm_object_text_set(btn, "OK"); + elm_object_part_content_set(popup, "button1", btn); + evas_object_smart_callback_add(btn, "clicked", _popup_close_cb, popup); + + // popup show should be called after adding all the contents and the buttons + // of popup to set the focus into popup's contents correctly. + evas_object_show(popup); +} + +static void +_subpopup_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup; + Evas_Object *btn, *btnclose; + + popup = elm_popup_add(data); + if (is_popup_scroll) + elm_popup_scrollable_set(popup, is_popup_scroll); + elm_object_style_set(popup, "subpopup"); + elm_object_part_text_set(popup, "title,text", "Title"); + + // button as a popup content + btn = elm_button_add(popup); + elm_object_text_set(btn, "content"); + elm_object_content_set(popup, btn); + + // popup buttons + btn = elm_button_add(popup); + elm_object_text_set(btn, "OK"); + elm_object_part_content_set(popup, "button1", btn); + evas_object_smart_callback_add(btn, "clicked", _popup_close_cb, popup); + + //popup-base close button + btnclose = elm_button_add(popup); + //TODO: write a X style button theme + elm_object_text_set(btnclose, "x"); + elm_object_part_content_set(popup, "elm.swallow.closebtn", btnclose); + evas_object_smart_callback_add(btnclose, "clicked", _popup_close_cb, popup); + + // popup show should be called after adding all the contents and the buttons + // of popup to set the focus into popup's contents correctly. + evas_object_show(popup); +} + +static void +_popup_content_only_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup, *bx, *hbx, *lbl, *btn; + Evas_Object *win = data; + + popup = elm_popup_add(win); + if (is_popup_scroll) + elm_popup_scrollable_set(popup, is_popup_scroll); + + bx = elm_box_add(popup); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.0); + elm_object_content_set(popup, bx); + + lbl = elm_label_add(popup); + elm_object_text_set(lbl, + "<align=center>This popup contains content area only.<br>" + "The buttons below are the part of content area, not action area"); + evas_object_size_hint_weight_set(lbl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(lbl, EVAS_HINT_FILL, 0.0); + elm_box_pack_end(bx, lbl); + evas_object_show(lbl); + + hbx = elm_box_add(bx); + elm_box_horizontal_set(hbx, EINA_TRUE); + evas_object_size_hint_weight_set(hbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(hbx, EVAS_HINT_FILL, 0.0); + elm_box_pack_end(bx, hbx); + evas_object_show(hbx); + + btn = elm_button_add(hbx); + elm_object_text_set(btn, "Save"); + evas_object_smart_callback_add(btn, "clicked", _popup_close_cb, popup); + elm_box_pack_end(hbx, btn); + evas_object_show(btn); + + btn = elm_button_add(hbx); + elm_object_text_set(btn, "Discard"); + evas_object_smart_callback_add(btn, "clicked", _popup_close_cb, popup); + elm_box_pack_end(hbx, btn); + evas_object_show(btn); + + btn = elm_button_add(hbx); + elm_object_text_set(btn, "Cancel"); + evas_object_smart_callback_add(btn, "clicked", _popup_close_cb, popup); + elm_box_pack_end(hbx, btn); + evas_object_show(btn); + + // popup show should be called after adding all the contents and the buttons + // of popup to set the focus into popup's contents correctly. + evas_object_show(popup); + elm_object_focus_set(btn, EINA_TRUE); +} + +static void +_popup_center_title_text_1button_hide_effect_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *popup; + Evas_Object *btn; + + popup = elm_popup_add(data); + elm_popup_scrollable_set(popup, is_popup_scroll); + + // popup text + elm_object_text_set(popup, "This Popup has title area, content area and " + "action area set, action area has one button Close"); + // popup title + elm_object_part_text_set(popup, "title,text", "Title"); + + // popup buttons + btn = elm_button_add(popup); + elm_object_text_set(btn, "Close"); + elm_object_part_content_set(popup, "button1", btn); + evas_object_smart_callback_add(popup, "dismissed", _response_cb, NULL); + evas_object_smart_callback_add(btn, "clicked", _popup_dismiss_btn_cb, popup); + + // popup show should be called after adding all the contents and the buttons + // of popup to set the focus into popup's contents correctly. + evas_object_show(popup); +} + +static void +_focus_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Eina_Bool check = elm_check_state_get(obj); + elm_win_focus_highlight_enabled_set(data, check); + elm_win_focus_highlight_animate_set(data, check); +} + +static void +_popup_scroll_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + is_popup_scroll = elm_check_state_get(obj); +} + +void +test_popup(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *box, *list, *check; + + win = elm_win_util_standard_add("popup", "Popup"); + elm_win_autodel_set(win, EINA_TRUE); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + list = elm_list_add(box); + 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); + elm_box_pack_end(box, list); + elm_list_mode_set(list, ELM_LIST_LIMIT); + evas_object_smart_callback_add(list, "selected", _list_click, NULL); + + elm_list_item_append(list, "popup-center-text", NULL, NULL, + _popup_center_text_cb, win); + elm_list_item_append(list, "popup-center-text + 1 button", NULL, NULL, + _popup_center_text_1button_cb, win); + elm_list_item_append(list, "popup-center-title + text + 1 button", NULL, + NULL, _popup_center_title_text_1button_cb, win); + + elm_list_item_append(list, + "popup-center-title + text (block,clicked handling)", + NULL, NULL, + _popup_center_title_text_block_clicked_event_cb, win); + elm_list_item_append(list, + "popup-center-title + text (block,clicked handling with parent)", + NULL, NULL, + _popup_center_title_text_block_clicked_event_with_parent_cb, win); + elm_list_item_append(list, "popup-bottom-title-icon + text + 3 buttons", NULL, + NULL, _popup_bottom_title_text_3button_cb, win); + elm_list_item_append(list, "popup-center-title + content + 3 buttons", NULL, + NULL, _popup_center_title_content_3button_cb, win); + elm_list_item_append(list, "popup-center-title + items + 3 buttons", NULL, + NULL, _popup_center_title_item_3button_cb, win); + elm_list_item_append(list, "popup-center-title + text + 2 buttons (check restacking)", NULL, NULL, + _popup_center_title_text_2button_restack_cb, win); + elm_list_item_append(list, "popup-center-text + 1 button (check hide, show)", NULL, NULL, + _popup_center_text_1button_hide_show_cb, win); + elm_list_item_append(list, "popup-center-text + 3 button (check add, remove buttons)", NULL, NULL, + _popup_center_text_3button_add_remove_button_cb, win); + elm_list_item_append(list, "popup-transparent", NULL, NULL, + _popup_transparent_cb, win); + elm_list_item_append(list, "popup-transparent-align", NULL, NULL, + _popup_transparent_align_cb, win); + elm_list_item_append(list, "popup-center-title + list content + 1 button", + NULL, NULL, _popup_center_title_list_content_1button_cb, + win); + elm_list_item_append(list, "popup-center-title + genlist content + 1 button", + NULL, NULL, _popup_center_title_genlist_content_1button_cb, + win); + elm_list_item_append(list, "subpopup + X button", + NULL, NULL, _subpopup_cb, + win); + elm_list_item_append(list, "popup with content only", + NULL, NULL, _popup_content_only_cb, + win); + elm_list_item_append(list, "popup-center-title + text + 1 button + hide effect", NULL, + NULL, _popup_center_title_text_1button_hide_effect_cb, win); + elm_list_go(list); + evas_object_show(list); + + check = elm_check_add(box); + elm_object_text_set(check, "Enable Focus Highlight"); + evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, check); + evas_object_show(check); + evas_object_smart_callback_add(check, "changed", _focus_changed_cb, win); + + check = elm_check_add(box); + elm_object_text_set(check, "Enable popup scroll"); + evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, check); + evas_object_show(check); + evas_object_smart_callback_add(check, "changed", _popup_scroll_cb, NULL); + + evas_object_resize(win, 480, 400); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_prefs.c b/src/bin/elementary/test_prefs.c new file mode 100644 index 0000000000..591aa095c1 --- /dev/null +++ b/src/bin/elementary/test_prefs.c @@ -0,0 +1,119 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +#define WIDTH (500) +#define HEIGHT (1000) +#define MSG_ID_VEL (1) + +static void +_update_animation(Evas_Object *prefs, Evas_Object *layout) +{ + Eina_Value value; + Eina_Bool animation; + + elm_prefs_item_value_get(prefs, "main:animation", &value); + eina_value_get(&value, &animation); + if (animation) + elm_layout_signal_emit(layout, "start", "animation"); + else + elm_layout_signal_emit(layout, "stop", "animation"); +} + +static void +_update_animation_time(Evas_Object *prefs, Evas_Object *layout) +{ + Eina_Value value; + float animation_time; + Edje_Message_Float msg; + + elm_prefs_item_value_get(prefs, "main:animation_time", &value); + eina_value_get(&value, &animation_time); + msg.val = animation_time; + edje_object_message_send(elm_layout_edje_get(layout), EDJE_MESSAGE_FLOAT, + MSG_ID_VEL, &msg); +} + +static void +_update(Evas_Object *prefs, Evas_Object *layout) +{ + _update_animation(prefs, layout); + _update_animation_time(prefs, layout); +} + +static void +_page_loaded_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *layout = data; + + _update(obj, layout); +} + +static void +_item_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + const char *item = event_info; + Evas_Object *layout = data; + + if (!strcmp(item, "main:animation_time")) + _update_animation_time(obj, layout); + else if (!strcmp(item, "main:animation")) + _update_animation(obj, layout); +} + +void +test_prefs(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bg, *prefs, *layout; + Elm_Prefs_Data *prefs_data; + char buf[PATH_MAX]; + + win = elm_win_add(NULL, "Prefs", ELM_WIN_BASIC); + elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); + elm_win_title_set(win, "Prefs"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_min_set(bg, WIDTH, HEIGHT); + evas_object_size_hint_max_set(bg, WIDTH, HEIGHT); + evas_object_show(bg); + + layout = elm_layout_add(win); + snprintf(buf, sizeof(buf), + "%s/objects/test_prefs.edj", elm_app_data_dir_get()); + elm_layout_file_set(layout, buf, "prefs_edje"); + + prefs = elm_prefs_add(win); + evas_object_size_hint_weight_set(prefs, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_resize(prefs, WIDTH, HEIGHT); + evas_object_show(prefs); + + evas_object_smart_callback_add(prefs, "page,loaded", _page_loaded_cb, + layout); + evas_object_smart_callback_add(prefs, "item,changed", _item_changed_cb, + layout); + + elm_prefs_autosave_set(prefs, EINA_TRUE); + + prefs_data = + elm_prefs_data_new("./test_prefs.cfg", NULL, EET_FILE_MODE_READ_WRITE); + + snprintf(buf, sizeof(buf), + "%s/objects/test_prefs.epb", elm_app_data_dir_get()); + + elm_prefs_file_set(prefs, buf, NULL); + elm_prefs_data_set(prefs, prefs_data); + + elm_prefs_item_swallow(prefs, "main:swal", layout); + + _update_animation_time(prefs, layout); + _update_animation(prefs, layout); + + evas_object_resize(win, WIDTH, HEIGHT); + evas_object_show(win); + + elm_prefs_data_unref(prefs_data); +} diff --git a/src/bin/elementary/test_progressbar.c b/src/bin/elementary/test_progressbar.c new file mode 100644 index 0000000000..91282c0cde --- /dev/null +++ b/src/bin/elementary/test_progressbar.c @@ -0,0 +1,397 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +typedef struct Progressbar_Data +{ + Evas_Object *pb1; + Evas_Object *pb2; + Evas_Object *pb3; + Evas_Object *pb4; + Evas_Object *pb5; + Evas_Object *pb6; + Evas_Object *pb7; + Ecore_Timer *timer; + Evas_Object *btn_start; + Evas_Object *btn_stop; +} Progressbar_Data; + +static Eina_Bool +_my_progressbar_value_set(void *data) +{ + double progress; + Progressbar_Data *pd = data; + + progress = elm_progressbar_value_get (pd->pb1); + if (progress < 1.0) progress += 0.0123; + else progress = 0.0; + elm_progressbar_value_set(pd->pb1, progress); + elm_progressbar_value_set(pd->pb4, progress); + elm_progressbar_value_set(pd->pb3, progress); + elm_progressbar_value_set(pd->pb6, progress); + + if (progress < 1.0) return ECORE_CALLBACK_RENEW; + + pd->timer = NULL; + return ECORE_CALLBACK_CANCEL; +} + +static void +my_progressbar_test_start(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Progressbar_Data *pd = data; + if (!pd) return; + + fprintf(stderr, "s1\n"); + elm_progressbar_pulse(pd->pb2, EINA_TRUE); + fprintf(stderr, "s2\n"); + elm_progressbar_pulse(pd->pb5, EINA_TRUE); + fprintf(stderr, "s3 %p\n", pd->pb7); + elm_progressbar_pulse(pd->pb7, EINA_TRUE); + fprintf(stderr, "s4\n"); + + elm_object_disabled_set(pd->btn_start, EINA_TRUE); + elm_object_disabled_set(pd->btn_stop, EINA_FALSE); + + if (!pd->timer) + pd->timer = ecore_timer_add(0.1, _my_progressbar_value_set, pd); +} + +static void +my_progressbar_test_stop(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Progressbar_Data *pd = data; + if (!pd) return; + + elm_progressbar_pulse(pd->pb2, EINA_FALSE); + elm_progressbar_pulse(pd->pb5, EINA_FALSE); + elm_progressbar_pulse(pd->pb7, EINA_FALSE); + elm_object_disabled_set(pd->btn_start, EINA_FALSE); + elm_object_disabled_set(pd->btn_stop, EINA_TRUE); + + if (pd->timer) + { + ecore_timer_del(pd->timer); + pd->timer = NULL; + } +} + +static void +_progressbar_destroy_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Progressbar_Data *pd = data; + if (!pd) return; + + ecore_timer_del(pd->timer); + free(pd); + my_progressbar_test_stop(NULL, NULL, NULL); + evas_object_del(obj); +} + +static char * +my_progressbar_format_cb(double val) +{ + char buf[1024]; + int files; + + files = (1-val)*14000; + if(snprintf(buf, 30, "%i files left", files) > 0) + return strdup(buf); + return NULL; +} + +void +test_progressbar(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *pb, *bx, *hbx, *bt, *bt_bx, *ic1, *ic2; + char buf[PATH_MAX]; + Progressbar_Data *pd; + + pd = (Progressbar_Data *)calloc(1, sizeof(Progressbar_Data)); + + win = elm_win_util_standard_add("progressbar", "Progressbar"); + evas_object_smart_callback_add(win, "delete,request", + _progressbar_destroy_cb, pd); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + pb = elm_progressbar_add(win); + evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, pb); + //elm_progressbar_horizontal_set(pb, EINA_TRUE); + //elm_object_text_set(pb, "Progression %"); + elm_progressbar_unit_format_function_set(pb, my_progressbar_format_cb, + (void (*)(char *)) free); + evas_object_show(pb); + pd->pb1 = pb; + + pb = elm_progressbar_add(win); + evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5); + elm_object_text_set(pb, "Infinite bounce"); + elm_progressbar_pulse_set(pb, EINA_TRUE); + elm_box_pack_end(bx, pb); + evas_object_show(pb); + pd->pb2 = pb; + + ic1 = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic1, buf, NULL); + evas_object_size_hint_aspect_set(ic1, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + + pb = elm_progressbar_add(win); + elm_object_text_set(pb, "Label"); + elm_object_part_content_set(pb, "icon", ic1); + elm_progressbar_inverted_set(pb, EINA_TRUE); + elm_progressbar_unit_format_set(pb, "%1.1f units"); + elm_progressbar_span_size_set(pb, ELM_SCALE_SIZE(200)); + evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, pb); + evas_object_show(ic1); + evas_object_show(pb); + pd->pb3 = pb; + + hbx = elm_box_add(win); + elm_box_horizontal_set(hbx, EINA_TRUE); + evas_object_size_hint_weight_set(hbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(hbx, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, hbx); + evas_object_show(hbx); + + pb = elm_progressbar_add(win); + elm_progressbar_horizontal_set(pb, EINA_FALSE); + evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(hbx, pb); + elm_object_text_set(pb, "percent"); + evas_object_show(pb); + pd->pb4 = pb; + + pb = elm_progressbar_add(win); + elm_progressbar_horizontal_set(pb, EINA_FALSE); + evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5); + elm_progressbar_span_size_set(pb, ELM_SCALE_SIZE(80)); + elm_progressbar_pulse_set(pb, EINA_TRUE); + elm_progressbar_unit_format_set(pb, NULL); + elm_object_text_set(pb, "Infinite bounce"); + elm_box_pack_end(hbx, pb); + evas_object_show(pb); + pd->pb5 = pb; + + ic2 = elm_icon_add(win); + elm_image_file_set(ic2, buf, NULL); + evas_object_size_hint_aspect_set(ic2, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1); + + pb = elm_progressbar_add(win); + elm_progressbar_horizontal_set(pb, EINA_FALSE); + elm_object_text_set(pb, "Label"); + elm_object_part_content_set(pb, "icon", ic2); + elm_progressbar_inverted_set(pb, EINA_TRUE); + elm_progressbar_unit_format_set(pb, "%1.2f%%"); + elm_progressbar_span_size_set(pb, ELM_SCALE_SIZE(200)); + evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(hbx, pb); + evas_object_show(ic2); + evas_object_show(pb); + pd->pb6 = pb; + + pb = elm_progressbar_add(win); + elm_object_style_set(pb, "wheel"); + elm_object_text_set(pb, "Style: wheel"); + elm_progressbar_pulse_set(pb, EINA_TRUE); + evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, pb); + evas_object_show(pb); + pd->pb7 = pb; + + bt_bx = elm_box_add(win); + elm_box_horizontal_set(bt_bx, EINA_TRUE); + evas_object_size_hint_weight_set(bt_bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, bt_bx); + evas_object_show(bt_bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Start"); + evas_object_smart_callback_add(bt, "clicked", my_progressbar_test_start, pd); + elm_box_pack_end(bt_bx, bt); + evas_object_show(bt); + pd->btn_start = bt; + + bt = elm_button_add(win); + elm_object_text_set(bt, "Stop"); + elm_object_disabled_set(bt, EINA_TRUE); + evas_object_smart_callback_add(bt, "clicked", my_progressbar_test_stop, pd); + elm_box_pack_end(bt_bx, bt); + evas_object_show(bt); + pd->btn_stop = bt; + + evas_object_show(win); +} + +static Eina_Bool +_set_progress_val(Evas_Object *pb, double inc_value, char *part_name) +{ + double progress; + + progress = elm_progressbar_part_value_get(pb, part_name); + + if (progress < 1.0) + progress += inc_value; + else + return EINA_TRUE; + + elm_progressbar_part_value_set(pb, part_name, progress); + + return EINA_FALSE; +} + +static Eina_Bool +_progressbar2_timer_cb(void *data) +{ + Progressbar_Data *pd = data; + double progress; + + if (!pd) return ECORE_CALLBACK_CANCEL; + + progress = elm_progressbar_value_get (pd->pb1); + + if (progress < 1.0) + { + progress += 0.0123; + elm_progressbar_part_value_set(pd->pb1, "elm.cur.progressbar", progress); + elm_progressbar_part_value_set(pd->pb2, "elm.cur.progressbar1", progress); + elm_progressbar_part_value_set(pd->pb3, "elm.cur.progressbar1", progress); + elm_progressbar_part_value_set(pd->pb4, "elm.cur.progressbar1", progress); + } + + _set_progress_val(pd->pb2, 0.00723, "elm.cur.progressbar"); + _set_progress_val(pd->pb3, 0.00523, "elm.cur.progressbar"); + + if (!_set_progress_val(pd->pb4, 0.00423, "elm.cur.progressbar")) + return ECORE_CALLBACK_RENEW; + + pd->timer = NULL; + + return ECORE_CALLBACK_CANCEL; +} + +static void +_pg2_start_btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Progressbar_Data *pd = data; + if (!pd) return; + + fprintf(stderr, "s1\n"); + + elm_object_disabled_set(pd->btn_start, EINA_TRUE); + elm_object_disabled_set(pd->btn_stop, EINA_FALSE); + + if (!pd->timer) + pd->timer = ecore_timer_add(0.1, _progressbar2_timer_cb, pd); +} + +static void +_pg2_stop_btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Progressbar_Data *pd = data; + if (!pd) return; + + elm_object_disabled_set(pd->btn_start, EINA_FALSE); + elm_object_disabled_set(pd->btn_stop, EINA_TRUE); + + if (pd->timer) + { + ecore_timer_del(pd->timer); + pd->timer = NULL; + } +} + +void +test_progressbar2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *pb, *bx, *bt, *bt_bx; + Progressbar_Data *pd; + + pd = (Progressbar_Data *)calloc(1, sizeof(Progressbar_Data)); + + win = elm_win_util_standard_add("progressbar", "Progressbar2"); + evas_object_smart_callback_add(win, "delete,request", + _progressbar_destroy_cb, pd); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + pb = elm_progressbar_add(win); + elm_object_text_set(pb, "Style: default"); + evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5); + elm_progressbar_span_size_set(pb, ELM_SCALE_SIZE(200)); + elm_box_pack_end(bx, pb); + evas_object_show(pb); + pd->pb1 = pb; + + pb = elm_progressbar_add(win); + elm_object_style_set(pb, "double"); + elm_object_text_set(pb, "Style: double"); + evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5); + elm_progressbar_span_size_set(pb, ELM_SCALE_SIZE(200)); + elm_box_pack_end(bx, pb); + evas_object_show(pb); + pd->pb2 = pb; + + pb = elm_progressbar_add(win); + elm_object_style_set(pb, "double"); + elm_object_text_set(pb, "Style: double 2"); + evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5); + elm_progressbar_span_size_set(pb, ELM_SCALE_SIZE(200)); + elm_box_pack_end(bx, pb); + evas_object_show(pb); + pd->pb3 = pb; + + pb = elm_progressbar_add(win); + elm_object_style_set(pb, "double"); + elm_progressbar_horizontal_set(pb, EINA_FALSE); + elm_object_text_set(pb, "Style: Vertical"); + evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5); + elm_progressbar_span_size_set(pb, ELM_SCALE_SIZE(200)); + elm_box_pack_end(bx, pb); + evas_object_show(pb); + pd->pb4 = pb; + + bt_bx = elm_box_add(win); + elm_box_horizontal_set(bt_bx, EINA_TRUE); + evas_object_size_hint_weight_set(bt_bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, bt_bx); + evas_object_show(bt_bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Start"); + evas_object_smart_callback_add(bt, "clicked", _pg2_start_btn_clicked_cb, pd); + elm_box_pack_end(bt_bx, bt); + evas_object_show(bt); + pd->btn_start = bt; + + bt = elm_button_add(win); + elm_object_text_set(bt, "Stop"); + elm_object_disabled_set(bt, EINA_TRUE); + evas_object_smart_callback_add(bt, "clicked", _pg2_stop_btn_clicked_cb, pd); + elm_box_pack_end(bt_bx, bt); + evas_object_show(bt); + pd->btn_stop = bt; + + evas_object_show(win); +} diff --git a/src/bin/elementary/test_radio.c b/src/bin/elementary/test_radio.c new file mode 100644 index 0000000000..99eadfafca --- /dev/null +++ b/src/bin/elementary/test_radio.c @@ -0,0 +1,189 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void +_rd_changed_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + printf("radio value : %d\n", elm_radio_value_get(obj)); +} + +static void +_rdg_changed_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + printf("radio group value : %d\n", elm_radio_value_get(obj)); +} + +static void +_group_1_create(Evas_Object *bx) +{ + Evas_Object *bx2, *fr, *ic, *rd, *rdg; + char buf[PATH_MAX]; + + fr = elm_frame_add(bx); + elm_object_text_set(fr, "Radio Group 1"); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + bx2 = elm_box_add(fr); + elm_object_content_set(fr, bx2); + evas_object_show(bx2); + + // radio 1 + ic = elm_icon_add(bx2); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + + rd = elm_radio_add(bx2); + elm_radio_state_value_set(rd, 0); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, 0.5); + elm_object_text_set(rd, "Icon sized to radio"); + elm_object_part_content_set(rd, "icon", ic); + elm_box_pack_end(bx2, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, NULL); + + // rdg radio group + rdg = rd; + evas_object_smart_callback_add(rdg, "changed", _rdg_changed_cb, NULL); + + ic = elm_icon_add(bx2); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + + rd = elm_radio_add(bx2); + elm_radio_state_value_set(rd, 1); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "Icon no scale"); + elm_object_part_content_set(rd, "icon", ic); + elm_box_pack_end(bx2, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, NULL); + + rd = elm_radio_add(bx2); + elm_radio_state_value_set(rd, 2); + elm_radio_group_add(rd, rdg); // add a radio button rd to a radio group rdg. + elm_object_text_set(rd, "Label Only"); + elm_box_pack_end(bx2, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, NULL); + + rd = elm_radio_add(bx2); + elm_radio_state_value_set(rd, 3); + elm_radio_group_add(rd, rdg); // add a radio button rd to a radio group rdg. + elm_object_text_set(rd, "Disabled"); + elm_object_disabled_set(rd, EINA_TRUE); + elm_box_pack_end(bx2, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, NULL); + + ic = elm_icon_add(bx2); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + + rd = elm_radio_add(bx2); + elm_radio_state_value_set(rd, 4); + elm_radio_group_add(rd, rdg); // add a radio button rd to a radio group rdg. + elm_object_part_content_set(rd, "icon", ic); + elm_box_pack_end(bx2, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, NULL); + + ic = elm_icon_add(bx2); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + + rd = elm_radio_add(bx2); + elm_radio_state_value_set(rd, 5); + elm_radio_group_add(rd, rdg); // add a radio button rd to a radio group rdg. + elm_object_part_content_set(rd, "icon", ic); + elm_object_disabled_set(rd, EINA_TRUE); + elm_box_pack_end(bx2, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", _rd_changed_cb, NULL); + + elm_radio_value_set(rdg, 2); +} + +static void +_group_2_create(Evas_Object *bx) +{ + Evas_Object *bx2, *fr, *rd, *rdg; + + fr = elm_frame_add(bx); + elm_object_text_set(fr, "Radio Group 2"); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + bx2 = elm_box_add(fr); + elm_object_content_set(fr, bx2); + elm_box_align_set(bx2, 0.0, 0.0); + evas_object_show(bx2); + + // radio 1 + rd = elm_radio_add(bx2); + elm_radio_state_value_set(rd, 1); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, 0.5); + elm_object_text_set(rd, "Radio Group Test #1"); + elm_box_pack_end(bx2, rd); + evas_object_show(rd); + + // rdg radio group + rdg = rd; + // this works only for the first radio object + evas_object_smart_callback_add(rdg, "changed", _rdg_changed_cb, NULL); + + // radio 2 + rd = elm_radio_add(bx2); + elm_radio_state_value_set(rd, 2); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, 0.5); + elm_object_text_set(rd, "Radio Group Test #2"); + elm_radio_group_add(rd, rdg); + elm_box_pack_end(bx2, rd); + evas_object_show(rd); + + // radio 2 + rd = elm_radio_add(bx2); + elm_radio_state_value_set(rd, 3); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, 0.5); + elm_object_text_set(rd, "Radio Group Test #3"); + elm_radio_group_add(rd, rdg); + elm_box_pack_end(bx2, rd); + evas_object_show(rd); +} + +void +test_radio(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx; + + win = elm_win_util_standard_add("radios", "Radios"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + _group_1_create(bx); + _group_2_create(bx); + + evas_object_show(win); +} diff --git a/src/bin/elementary/test_scaling.c b/src/bin/elementary/test_scaling.c new file mode 100644 index 0000000000..84b20c6130 --- /dev/null +++ b/src/bin/elementary/test_scaling.c @@ -0,0 +1,119 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +void +test_scaling(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bt; + + win = elm_win_util_standard_add("scaling", "Scaling"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Scale: 0.5"); + elm_object_scale_set(bt, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Scale: 0.75"); + elm_object_scale_set(bt, 0.75); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Scale: 1.0"); + elm_object_scale_set(bt, 1.0); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Scale: 1.5"); + elm_object_scale_set(bt, 1.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Scale: 2.0"); + elm_object_scale_set(bt, 2.0); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Scale: 3.0"); + elm_object_scale_set(bt, 3.0); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} + +void +test_scaling2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bg, *bx, *fr, *lb; + + win = elm_win_add(NULL, "scaling2", ELM_WIN_BASIC); + elm_win_title_set(win, "Scaling 2"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + fr = elm_frame_add(win); + elm_object_text_set(fr, "Scale: 0.5"); + lb = elm_label_add(win); + elm_object_text_set(lb, + "Parent frame scale<br/>" + "is 0.5. Child should<br/>" + "inherit it."); + elm_object_content_set(fr, lb); + elm_object_scale_set(fr, 0.5); + evas_object_show(lb); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + fr = elm_frame_add(win); + elm_object_text_set(fr, "Scale: 1.0"); + lb = elm_label_add(win); + elm_object_text_set(lb, + "Parent frame scale<br/>" + "is 1.0. Child should<br/>" + "inherit it."); + elm_object_content_set(fr, lb); + evas_object_show(lb); + elm_object_scale_set(fr, 1.0); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + fr = elm_frame_add(win); + elm_object_text_set(fr, "Scale: 2.0"); + lb = elm_label_add(win); + elm_object_text_set(lb, + "Parent frame scale<br/>" + "is 2.0. Child should<br/>" + "inherit it."); + elm_object_content_set(fr, lb); + evas_object_show(lb); + elm_object_scale_set(fr, 2.0); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_scroller.c b/src/bin/elementary/test_scroller.c new file mode 100644 index 0000000000..eb00f25946 --- /dev/null +++ b/src/bin/elementary/test_scroller.c @@ -0,0 +1,730 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void +_my_bt_go_300_300(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_scroller_region_bring_in((Evas_Object *)data, 300, 300, 318, 318); +} + +static void +_my_bt_go_900_300(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_scroller_region_bring_in((Evas_Object *)data, 900, 300, 318, 318); +} + +static void +_my_bt_go_300_900(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_scroller_region_bring_in((Evas_Object *)data, 300, 900, 318, 318); +} + +static void +_my_bt_go_900_900(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_scroller_region_bring_in((Evas_Object *)data, 900, 900, 318, 318); +} + +static void +_my_bt_prev_page(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *sc = (Evas_Object *)data; + int page_x = 0, page_y = 0; + elm_scroller_current_page_get(sc, &page_x, &page_y); + elm_scroller_page_bring_in(sc, --page_x, page_y); +} + +static void +_my_bt_next_page(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *sc = (Evas_Object *)data; + int page_x = 0, page_y = 0; + elm_scroller_current_page_get(sc, &page_x, &page_y); + elm_scroller_page_bring_in(sc, ++page_x, page_y); +} + +static void +_my_bt_freeze_toggle(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + if (elm_check_state_get(obj)) + elm_object_scroll_freeze_push((Evas_Object *)data); + else + elm_object_scroll_freeze_pop((Evas_Object *)data); +} + +static void +_my_bt_hold_toggle(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + if (elm_check_state_get(obj)) + elm_object_scroll_hold_push((Evas_Object *)data); + else + elm_object_scroll_hold_pop((Evas_Object *)data); +} + +static void +_my_bt_block_movements_x_axis(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Elm_Scroller_Movement_Block block; + + block = elm_scroller_movement_block_get((Evas_Object *)data); + + if (elm_check_state_get(obj)) + { + elm_scroller_movement_block_set((Evas_Object *)data, + ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL | + block); + } + else if (block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) + { + elm_scroller_movement_block_set((Evas_Object *)data, + ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL); + } + else + { + elm_scroller_movement_block_set((Evas_Object *)data, + ELM_SCROLLER_MOVEMENT_NO_BLOCK); + } +} + +static void +_my_bt_snap_to_pages(void *data, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + if (elm_check_state_get(obj)) + { + elm_scroller_page_snap_set(data, EINA_TRUE, EINA_TRUE); + } + else + { + elm_scroller_page_snap_set(data, EINA_FALSE, EINA_FALSE); + } +} + +static void +_my_bt_block_movements_y_axis(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Elm_Scroller_Movement_Block block; + + block = elm_scroller_movement_block_get((Evas_Object *)data); + + if (elm_check_state_get(obj)) + { + elm_scroller_movement_block_set((Evas_Object *)data, + ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL | + block); + } + else if (block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL) + { + elm_scroller_movement_block_set((Evas_Object *)data, + ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL); + } + else + { + elm_scroller_movement_block_set((Evas_Object *)data, + ELM_SCROLLER_MOVEMENT_NO_BLOCK); + } +} + +static void +_my_bt_loop_x_axis(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Eina_Bool loop_h, loop_v; + Evas_Object *scroller = (Evas_Object *)data; + + elm_scroller_loop_get(scroller, &loop_h, &loop_v); + elm_scroller_loop_set(scroller, !loop_h, loop_v); +} + +static void +_my_bt_loop_y_axis(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Eina_Bool loop_h, loop_v; + Evas_Object *scroller = (Evas_Object *)data; + + elm_scroller_loop_get(scroller, &loop_h, &loop_v); + elm_scroller_loop_set(scroller, loop_h, !loop_v); +} + +static void +_my_bt_wheel_disable_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *scroller = (Evas_Object *)data; + + elm_scroller_wheel_disabled_set(scroller, elm_check_state_get(obj)); +} + +static void +_page_change_cb(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + int page_x = 0, page_y = 0; + + elm_scroller_current_page_get(obj, &page_x, &page_y); + + printf("Page changed to %d, %d\n", page_x, page_y); +} + +static void +_sc_move_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Coord x = 0, y = 0; + evas_object_geometry_get(obj, &x, &y, NULL, NULL); + evas_object_move(data, x, y); +} + +static void +_sc_resize_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Coord w = 0, h = 0; + evas_object_geometry_get(obj, NULL, NULL, &w, &h); + evas_object_resize(data, w, h); +} + +static void +_size_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *sc = data; + int size = elm_spinner_value_get(obj); + elm_scroller_step_size_set(sc, ELM_SCALE_SIZE(size), ELM_SCALE_SIZE(size)); +} + +void +test_scroller(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bg2, *tb, *tb2, *sc, *bt, *ck1, *ck2, *bx, *bx2, *fr, + *ck3, *ck4, *ck5, *ck6, *ck7, *ck8; + int i, j, n; + char buf[PATH_MAX]; + Evas_Coord x = 0, y = 0, w = 0, h = 0; + const char *img[9] = + { + "panel_01.jpg", + "plant_01.jpg", + "rock_01.jpg", + "rock_02.jpg", + "sky_01.jpg", + "sky_02.jpg", + "sky_03.jpg", + "sky_04.jpg", + "wood_01.jpg" + }; + + win = elm_win_util_standard_add("scroller", "Scroller"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + fr = elm_frame_add(win); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0.0); + elm_object_text_set(fr, "Options"); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + bx2 = elm_box_add(win); + elm_object_content_set(fr, bx2); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_show(bx2); + + ck1 = elm_check_add(win); + elm_object_text_set(ck1, "Freeze"); + elm_box_pack_end(bx2, ck1); + evas_object_show(ck1); + + ck2 = elm_check_add(win); + elm_object_text_set(ck2, "Hold"); + elm_box_pack_end(bx2, ck2); + evas_object_show(ck2); + + ck3 = elm_check_add(win); + elm_object_text_set(ck3, "Block movements in X axis"); + elm_box_pack_end(bx2, ck3); + evas_object_show(ck3); + + ck4 = elm_check_add(win); + elm_object_text_set(ck4, "Block movements in Y axis"); + elm_box_pack_end(bx2, ck4); + evas_object_show(ck4); + + ck5 = elm_check_add(win); + elm_object_text_set(ck5, "Snap to pages"); + elm_box_pack_end(bx2, ck5); + evas_object_show(ck5); + + ck6 = elm_check_add(win); + elm_object_text_set(ck6, "Loop in X axis"); + elm_box_pack_end(bx2, ck6); + evas_object_show(ck6); + + ck7 = elm_check_add(win); + elm_object_text_set(ck7, "Loop in Y axis"); + elm_box_pack_end(bx2, ck7); + evas_object_show(ck7); + + ck8 = elm_check_add(win); + elm_object_text_set(ck8, "Wheel Disable"); + elm_box_pack_end(bx2, ck8); + evas_object_show(ck8); + + sc = elm_scroller_add(win); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, sc); + + tb = elm_table_add(win); + + n = 0; + for (j = 0; j < 12; j++) + { + for (i = 0; i < 12; i++) + { + bg2 = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/%s", + elm_app_data_dir_get(), img[n]); + n++; + if (n >= 9) n = 0; + elm_bg_file_set(bg2, buf, NULL); + evas_object_size_hint_weight_set(bg2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bg2, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_min_set(bg2, 318, 318); + elm_table_pack(tb, bg2, i, j, 1, 1); + evas_object_show(bg2); + } + } + + elm_object_content_set(sc, tb); + evas_object_show(tb); + + elm_scroller_page_size_set(sc, 318, 318); + evas_object_show(sc); + + evas_object_smart_callback_add + (sc, "scroll,page,changed", _page_change_cb, sc); + + evas_object_smart_callback_add(ck1, "changed", _my_bt_freeze_toggle, tb); + evas_object_smart_callback_add(ck2, "changed", _my_bt_hold_toggle, tb); + evas_object_smart_callback_add(ck3, "changed", _my_bt_block_movements_x_axis, + sc); + evas_object_smart_callback_add(ck4, "changed", _my_bt_block_movements_y_axis, + sc); + evas_object_smart_callback_add(ck5, "changed", _my_bt_snap_to_pages, sc); + evas_object_smart_callback_add(ck6, "changed", _my_bt_loop_x_axis, sc); + evas_object_smart_callback_add(ck7, "changed", _my_bt_loop_y_axis, sc); + evas_object_smart_callback_add(ck8, "changed", _my_bt_wheel_disable_cb, sc); + + bt = elm_spinner_add(win); + elm_spinner_min_max_set(bt, 0, 500); + elm_scroller_step_size_get(sc, &x, &y); + elm_spinner_value_set(bt, x); + elm_spinner_editable_set(bt, EINA_TRUE); + elm_spinner_label_format_set(bt, "Step size: %.0f"); + evas_object_smart_callback_add(bt, "changed", _size_changed, sc); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + tb2 = elm_table_add(win); + + bt = elm_button_add(win); + elm_object_text_set(bt, "to 300 300"); + evas_object_smart_callback_add(bt, "clicked", _my_bt_go_300_300, sc); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.1, 0.1); + elm_table_pack(tb2, bt, 0, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "to 900 300"); + evas_object_smart_callback_add(bt, "clicked", _my_bt_go_900_300, sc); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.9, 0.1); + elm_table_pack(tb2, bt, 2, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "to 300 900"); + evas_object_smart_callback_add(bt, "clicked", _my_bt_go_300_900, sc); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.1, 0.9); + elm_table_pack(tb2, bt, 0, 2, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "to 900 900"); + evas_object_smart_callback_add(bt, "clicked", _my_bt_go_900_900, sc); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.9, 0.9); + elm_table_pack(tb2, bt, 2, 2, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "prev page"); + evas_object_smart_callback_add(bt, "clicked", _my_bt_prev_page, sc); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.1, 0.5); + elm_table_pack(tb2, bt, 0, 1, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "next page"); + evas_object_smart_callback_add(bt, "clicked", _my_bt_next_page, sc); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.9, 0.5); + elm_table_pack(tb2, bt, 2, 1, 1, 1); + evas_object_show(bt); + + evas_object_event_callback_add(sc, EVAS_CALLBACK_MOVE, _sc_move_cb, tb2); + evas_object_event_callback_add(sc, EVAS_CALLBACK_RESIZE, _sc_resize_cb, tb2); + evas_object_geometry_get(sc, &x, &y, &w, &h); + evas_object_move(tb2, x, y); + evas_object_resize(tb2, w, h); + evas_object_show(tb2); + + evas_object_resize(win, 320, 420); + evas_object_show(win); +} + +static void +_click_through(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + printf("click went through on %p\n", obj); +} + +void +test_scroller2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bt, *bx, *bx2, *sc, *tb, *tb2, *rc; + int i, j; + + win = elm_win_util_standard_add("scroller2", "Scroller 2"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.0); + + /* { */ + for (i = 0; i < 3; i++) + { + bt = elm_button_add(win); + elm_object_text_set(bt, "Vertical"); + evas_object_smart_callback_add(bt, "clicked", _click_through, NULL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + } + /* } */ + + /* { */ + sc = elm_scroller_add(win); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, 0.5); + elm_scroller_bounce_set(sc, EINA_TRUE, EINA_FALSE); + elm_scroller_content_min_limit(sc, 0, 1); + elm_box_pack_end(bx, sc); + evas_object_show(sc); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + + for (i = 0; i < 10; i++) + { + bt = elm_button_add(win); + elm_object_text_set(bt, "... Horizontal scrolling ..."); + evas_object_smart_callback_add(bt, "clicked", _click_through, NULL); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + } + + elm_object_content_set(sc, bx2); + evas_object_show(bx2); + /* } */ + + /* { */ + for (i = 0; i < 3; i++) + { + bt = elm_button_add(win); + elm_object_text_set(bt, "Vertical"); + evas_object_smart_callback_add(bt, "clicked", _click_through, NULL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + } + /* } */ + + /* { */ + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + rc = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_min_set(rc, 200, 120); + elm_table_pack(tb, rc, 0, 0, 1, 1); + + sc = elm_scroller_add(win); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, sc, 0, 0, 1, 1); + evas_object_show(sc); + + tb2 = elm_table_add(win); + + for (j = 0; j < 16; j++) + { + for (i = 0; i < 16; i++) + { + bt = elm_button_add(win); + elm_object_text_set(bt, "Both"); + evas_object_smart_callback_add(bt, "clicked", _click_through, NULL); + elm_table_pack(tb2, bt, i, j, 1, 1); + evas_object_show(bt); + } + } + + elm_object_content_set(sc, tb2); + evas_object_show(tb2); + /* } */ + + for (i = 0; i < 24; i++) + { + bt = elm_button_add(win); + elm_object_text_set(bt, "Vertical"); + evas_object_smart_callback_add(bt, "clicked", _click_through, NULL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + } + + sc = elm_scroller_add(win); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE); + elm_win_resize_object_add(win, sc); + elm_object_content_set(sc, bx); + evas_object_show(bx); + evas_object_show(sc); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} + +static Ecore_Timer *_timer = NULL; +static int _append = 0; +static int _count = 0; + +static void +_del_item(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + evas_object_del(obj); +} + +static void +_append_item(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *bx = data, *bt; + char buf[PATH_MAX]; + + bt = elm_button_add(bx); + snprintf(buf, sizeof(buf), "Item %d", ++_count); + elm_object_text_set(bt, buf); + elm_box_pack_end(bx, bt); + evas_object_smart_callback_add(bt, "clicked", _del_item, NULL); + evas_object_show(bt); +} + +static void +_prepend_item(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *bx = data, *bt; + char buf[PATH_MAX]; + + bt = elm_button_add(bx); + snprintf(buf, sizeof(buf), "Item %d", ++_count); + elm_object_text_set(bt, buf); + elm_box_pack_start(bx, bt); + evas_object_smart_callback_add(bt, "clicked", _del_item, NULL); + evas_object_show(bt); +} + +static Eina_Bool +_append_cb(void *data) +{ + Evas_Object *bx = data, *bt; + char buf[PATH_MAX]; + + bt = elm_button_add(bx); + snprintf(buf, sizeof(buf), "Item %d", ++_count); + elm_object_text_set(bt, buf); + elm_box_pack_end(bx, bt); + evas_object_smart_callback_add(bt, "clicked", _del_item, NULL); + evas_object_show(bt); + + _append--; + + if (_append <= 0) + { + _timer = NULL; + return ECORE_CALLBACK_CANCEL; + } + else + return ECORE_CALLBACK_RENEW; +} + +static void +_append_items(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + _append += 10; + _timer = ecore_timer_add(0.3, _append_cb, data); +} + +static void +_win_del_cb(void *data EINA_UNUSED, + Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + ecore_timer_del(_timer); + _timer = NULL; +} + +void +test_scroller3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bt, *bt2, *bt3, *bx, *bx2, *bx3, *bx4, *sc; + _count = 0; + + win = elm_win_util_standard_add("scroller3", "Scroller 3"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _win_del_cb, NULL); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + bx2 = elm_box_add(bx); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.1); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bt = elm_button_add(bx2); + elm_object_text_set(bt, "Append Item"); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt2 = elm_button_add(bx2); + elm_object_text_set(bt2, "Prepend Item"); + elm_box_pack_end(bx2, bt2); + evas_object_show(bt2); + + bt3 = elm_button_add(bx2); + elm_object_text_set(bt3, "Append 10 Items in 3s"); + elm_box_pack_end(bx2, bt3); + evas_object_show(bt3); + + bx3 = elm_box_add(bx); + evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx3, EVAS_HINT_EXPAND, 0.9); + elm_box_pack_end(bx, bx3); + evas_object_show(bx3); + + sc = elm_scroller_add(bx3); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx3, sc); + evas_object_show(sc); + + bx4 = elm_box_add(sc); + elm_box_padding_set(bx4, 0, 5); + evas_object_size_hint_weight_set(bx4, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_content_set(sc, bx4); + evas_object_show(bx4); + + evas_object_smart_callback_add(bt, "clicked", _append_item, bx4); + evas_object_smart_callback_add(bt2, "clicked", _prepend_item, bx4); + evas_object_smart_callback_add(bt3, "clicked", _append_items, bx4); + + evas_object_resize(win, 500, 500); + evas_object_show(win); +} + +void +test_scroller4(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *sc, *bx, *ly, *sc2, *rect, *rect2; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("scroller3", "Scroller 3"); + elm_win_autodel_set(win, EINA_TRUE); + + sc = elm_scroller_add(win); + elm_scroller_loop_set(sc, EINA_TRUE, EINA_FALSE); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_scroller_page_relative_set(sc, 1.0, 0.0); + elm_scroller_policy_set(sc, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_scroller_page_scroll_limit_set(sc, 1, 0); + elm_win_resize_object_add(win, sc); + evas_object_show(sc); + + bx = elm_box_add(sc); + elm_box_horizontal_set(bx, EINA_TRUE); + elm_object_content_set(sc, bx); + evas_object_show(bx); + + ly = elm_layout_add(bx); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "page_layout"); + elm_object_part_text_set(ly, "text", "Page1"); + elm_box_pack_end(bx, ly); + evas_object_show(ly); + + sc2 = elm_scroller_add(ly); + elm_object_part_content_set(ly, "page", sc2); + evas_object_show(sc2); + + rect2 = evas_object_rectangle_add(evas_object_evas_get(sc2)); + evas_object_color_set(rect2, 50, 0, 0, 50); + evas_object_size_hint_min_set(rect2, 0, 2000); + elm_object_content_set(sc2, rect2); + evas_object_show(rect2); + + ly = elm_layout_add(bx); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "page_layout"); + rect = evas_object_rectangle_add(evas_object_evas_get(ly)); + evas_object_color_set(rect, 0, 50, 0, 50); + elm_object_part_content_set(ly, "page", rect); + elm_object_part_text_set(ly, "text", "Page2"); + elm_box_pack_end(bx, ly); + evas_object_show(ly); + + ly = elm_layout_add(bx); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "page_layout"); + rect = evas_object_rectangle_add(evas_object_evas_get(ly)); + evas_object_color_set(rect, 0, 0, 50, 50); + elm_object_part_content_set(ly, "page", rect); + elm_object_part_text_set(ly, "text", "Page3"); + elm_box_pack_end(bx, ly); + evas_object_show(ly); + + evas_object_resize(win, 400, 550); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_segment_control.c b/src/bin/elementary/test_segment_control.c new file mode 100644 index 0000000000..9f5d674013 --- /dev/null +++ b/src/bin/elementary/test_segment_control.c @@ -0,0 +1,156 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void +changed_cb(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event) +{ + Elm_Object_Item *it = event; + printf("Segment Item (%p) %s\n", it, elm_object_item_text_get(it)); +} + +void +test_segment_control(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *sc, *ic; + Elm_Object_Item *seg_it; + unsigned int i; + char buf[PATH_MAX]; + + struct exp_mode { + struct { + double w, h; + } weight; + struct { + double x, y; + } align; + } exp_modes[2] = { + {{EVAS_HINT_EXPAND, 0.0}, {EVAS_HINT_FILL, EVAS_HINT_FILL}}, + {{0.0, 0.0}, {0.5, 0.5}} + }; + + win = elm_win_util_standard_add("segmentcontrol", "Segment Control"); + elm_win_autodel_set(win, EINA_TRUE); + + //box + bx = elm_box_add(win); + elm_box_padding_set(bx, 0, 5); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", + elm_app_data_dir_get()); + + for (i = 0; i < EINA_C_ARRAY_LENGTH(exp_modes); i++) + { + const struct exp_mode *em = exp_modes + i; + + //segment control + sc = elm_segment_control_add(bx); + evas_object_size_hint_weight_set(sc, em->weight.w, em->weight.h); + evas_object_size_hint_align_set(sc, em->align.x, em->align.y); + elm_segment_control_item_add(sc, NULL, "Text Only"); + + //icon + ic = elm_icon_add(sc); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_BOTH, 1, 1); + + seg_it = elm_segment_control_item_add(sc, ic, NULL); + elm_segment_control_item_selected_set(seg_it, EINA_TRUE); + + //icon + ic = elm_icon_add(sc); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, + 1); + elm_segment_control_item_add(sc, ic, "Text + Icon"); + evas_object_smart_callback_add(sc, "changed", changed_cb, NULL); + evas_object_show(sc); + elm_box_pack_end(bx, sc); + + //segment control 2 + sc = elm_segment_control_add(bx); + evas_object_size_hint_weight_set(sc, em->weight.w, em->weight.h); + evas_object_size_hint_align_set(sc, em->align.x, em->align.y); + elm_segment_control_item_add(sc, NULL, "Segment Control Item"); + seg_it = elm_segment_control_item_add(sc, NULL, "Segment Control Item"); + elm_segment_control_item_selected_set(seg_it, EINA_TRUE); + elm_segment_control_item_add(sc, NULL, "Segment Control Item"); + elm_segment_control_item_add(sc, NULL, "Segment Control Item"); + evas_object_smart_callback_add(sc, "changed", changed_cb, NULL); + evas_object_show(sc); + elm_box_pack_end(bx, sc); + + //segment control 3 (icon only) + sc = elm_segment_control_add(bx); + evas_object_size_hint_weight_set(sc, em->weight.w, em->weight.h); + evas_object_size_hint_align_set(sc, em->align.x, em->align.y); + + //icon + ic = elm_icon_add(sc); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_BOTH, 1, 1); + elm_segment_control_item_add(sc, ic, NULL); + + //icon + ic = elm_icon_add(sc); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_BOTH, 1, 1); + seg_it = elm_segment_control_item_add(sc, ic, NULL); + elm_segment_control_item_selected_set(seg_it, EINA_TRUE); + + //icon + ic = elm_icon_add(sc); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_BOTH, 1, 1); + elm_segment_control_item_add(sc, ic, NULL); + + evas_object_smart_callback_add(sc, "changed", changed_cb, NULL); + evas_object_show(sc); + elm_box_pack_end(bx, sc); + + //segment control 4 (text only disabled) + sc = elm_segment_control_add(bx); + evas_object_size_hint_weight_set(sc, em->weight.w, em->weight.h); + evas_object_size_hint_align_set(sc, em->align.x, em->align.y); + elm_segment_control_item_add(sc, NULL, "Disabled"); + + //icon + ic = elm_icon_add(sc); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_BOTH, 1, 1); + + seg_it = elm_segment_control_item_add(sc, ic, "Disabled"); + elm_segment_control_item_selected_set(seg_it, EINA_TRUE); + elm_segment_control_item_add(sc, NULL, "Disabled"); + elm_object_disabled_set(sc, EINA_TRUE); + evas_object_smart_callback_add(sc, "changed", changed_cb, NULL); + evas_object_show(sc); + elm_box_pack_end(bx, sc); + + //segment control 5 (single) + sc = elm_segment_control_add(bx); + evas_object_size_hint_weight_set(sc, em->weight.w, em->weight.h); + evas_object_size_hint_align_set(sc, em->align.x, em->align.y); + elm_segment_control_item_add(sc, NULL, "Single"); + evas_object_smart_callback_add(sc, "changed", changed_cb, NULL); + evas_object_show(sc); + elm_box_pack_end(bx, sc); + + //segment control 6 (single disabled) + sc = elm_segment_control_add(bx); + evas_object_size_hint_weight_set(sc, em->weight.w, em->weight.h); + evas_object_size_hint_align_set(sc, em->align.x, em->align.y); + elm_segment_control_item_add(sc, NULL, "Single Disabled"); + elm_object_disabled_set(sc, EINA_TRUE); + evas_object_smart_callback_add(sc, "changed", changed_cb, NULL); + evas_object_show(sc); + elm_box_pack_end(bx, sc); + } + + evas_object_resize(win, 400, 300); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_separator.c b/src/bin/elementary/test_separator.c new file mode 100644 index 0000000000..00d9985c42 --- /dev/null +++ b/src/bin/elementary/test_separator.c @@ -0,0 +1,67 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +void +test_separator(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx0, *bx, *bt, *sp; + + win = elm_win_util_standard_add("separators", "Separators"); + elm_win_autodel_set(win, EINA_TRUE); + + bx0 = elm_box_add(win); + evas_object_size_hint_weight_set(bx0, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_horizontal_set(bx0, EINA_TRUE); + elm_win_resize_object_add(win, bx0); + evas_object_show(bx0); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx0, bx); + evas_object_show(bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Left upper corner"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + sp = elm_separator_add(win); + elm_separator_horizontal_set(sp, EINA_TRUE); // by default, separator is vertical, we must set it horizontal + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Left lower corner"); + elm_object_disabled_set(bt, EINA_TRUE); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + sp = elm_separator_add(win); // now we need vertical separator + elm_box_pack_end(bx0, sp); + evas_object_show(sp); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx0, bx); + evas_object_show(bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Right upper corner"); + elm_object_disabled_set(bt, EINA_TRUE); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + sp = elm_separator_add(win); + elm_separator_horizontal_set(sp, EINA_TRUE); + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Right lower corner"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + evas_object_show(win); +} diff --git a/src/bin/elementary/test_slider.c b/src/bin/elementary/test_slider.c new file mode 100644 index 0000000000..c613da6266 --- /dev/null +++ b/src/bin/elementary/test_slider.c @@ -0,0 +1,307 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +void +_delay_change_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + printf("delay,changed! slider value : %d\n", (int)round(elm_slider_value_get(obj))); +} + +void +_change_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + elm_slider_value_set(data, val); +} + +void +_change_print_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + double val = elm_slider_value_get(obj); + printf("change to %3.3f\n", val); +} + +void +_bt_0(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_slider_value_set(data, 0.0); +} + +void +_bt_1(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_slider_value_set(data, 1.0); +} + +void +_bt_p1(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_slider_value_set(data, elm_slider_value_get(data) + 0.1); +} + +void +_bt_m1(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_slider_value_set(data, elm_slider_value_get(data) - 0.1); +} + +static double +_step_size_calculate(double min, double max) +{ + double step = 0.0; + int steps = 0; + + steps = max - min; + if (steps) step = (1.0 / steps); + return step; +} + +void +test_slider(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *fr, *bx, *sl, *ic, *sl1, *bx2, *bt; + double step; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("slider", "Slider"); + elm_win_autodel_set(win, EINA_TRUE); + + fr = elm_frame_add(win); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, fr); + elm_object_style_set(fr, "pad_large"); + evas_object_show(fr); + + bx = elm_box_add(fr); + elm_object_content_set(fr, bx); + evas_object_show(bx); + + // disabled horizontal slider + ic = elm_icon_add(bx); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + evas_object_show(ic); + + sl = elm_slider_add(bx); + elm_object_text_set(sl, "Disabled"); + elm_object_part_content_set(sl, "icon", ic); + elm_slider_unit_format_set(sl, "%1.1f units"); + elm_slider_span_size_set(sl, 120); + elm_slider_min_max_set(sl, 50, 150); + elm_slider_value_set(sl, 80); + elm_object_disabled_set(sl, EINA_TRUE); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + sl = elm_slider_add(bx); + elm_slider_unit_format_set(sl, "%1.0f units"); + elm_slider_indicator_format_set(sl, "%1.0f"); + elm_slider_span_size_set(sl, 120); + elm_slider_min_max_set(sl, 0, 9); + elm_object_text_set(sl, "Manual step"); + step = _step_size_calculate(0, 9); + elm_slider_step_set(sl, step); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + sl = elm_slider_add(bx); + elm_slider_unit_format_set(sl, "%1.0f units"); + elm_slider_indicator_format_set(sl, "%1.0f"); + elm_slider_span_size_set(sl, 120); + elm_slider_min_max_set(sl, 0, 100); + elm_object_text_set(sl, "Show Indicator on Focus: "); + step = _step_size_calculate(0, 9); + elm_slider_step_set(sl, step); + elm_slider_indicator_show_on_focus_set(sl, EINA_TRUE); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + // normal horizontal slider + ic = elm_icon_add(bx); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + + sl1 = sl = elm_slider_add(bx); + elm_object_text_set(sl, "Horizontal"); + elm_object_part_content_set(sl, "icon", ic); + elm_slider_unit_format_set(sl, "%1.1f units"); + elm_slider_indicator_format_set(sl, "%1.1f"); + elm_slider_span_size_set(sl, 120); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx, sl); + evas_object_show(ic); + evas_object_show(sl); + + // horizontally inverted slider + ic = elm_icon_add(bx); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + evas_object_show(ic); + + sl = elm_slider_add(bx); + elm_object_text_set(sl, "Horizontal inverted"); + elm_object_part_content_set(sl, "end", ic); + elm_slider_unit_format_set(sl, "%3.0f units"); + elm_slider_span_size_set(sl, 80); + elm_slider_indicator_format_set(sl, "%3.0f"); + elm_slider_min_max_set(sl, 50, 150); + elm_slider_value_set(sl, 80); + elm_slider_inverted_set(sl, EINA_TRUE); + evas_object_size_hint_align_set(sl, 0.5, 0.5); + evas_object_size_hint_weight_set(sl, 0.0, 0.0); + evas_object_smart_callback_add(sl, "delay,changed", _delay_change_cb, NULL); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + // disabled horizontally inverted slider + ic = elm_icon_add(bx); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + evas_object_show(ic); + + sl = elm_slider_add(bx); + elm_object_text_set(sl, "Disabled inverted"); + elm_object_part_content_set(sl, "end", ic); + elm_slider_span_size_set(sl, 80); + elm_slider_indicator_format_set(sl, "%3.0f"); + elm_slider_min_max_set(sl, 50, 150); + elm_slider_value_set(sl, 80); + elm_slider_inverted_set(sl, EINA_TRUE); + elm_object_disabled_set(sl, EINA_TRUE); + evas_object_size_hint_align_set(sl, 0.5, 0.5); + evas_object_size_hint_weight_set(sl, 0.0, 0.0); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + // scale doubled slider + sl = elm_slider_add(bx); + elm_slider_indicator_show_set(sl, EINA_FALSE); + elm_object_text_set(sl, "Scale doubled"); + elm_slider_unit_format_set(sl, "%3.0f units"); + elm_slider_span_size_set(sl, 40); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + elm_slider_indicator_format_set(sl, "%3.0f"); + elm_slider_min_max_set(sl, 50, 150); + elm_slider_value_set(sl, 80); + elm_slider_inverted_set(sl, EINA_TRUE); + elm_object_scale_set(sl, 2.0); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + // horizontal box + bx2 = elm_box_add(bx); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx2, 0.5, EVAS_HINT_FILL); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + // vertical inverted slider + ic = elm_icon_add(bx2); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1); + evas_object_show(ic); + + sl = elm_slider_add(bx2); + elm_object_part_content_set(sl, "icon", ic); + elm_object_text_set(sl, "Vertical inverted"); + elm_slider_inverted_set(sl, EINA_TRUE); + elm_slider_unit_format_set(sl, "%1.1f units"); + elm_slider_span_size_set(sl, 60); + evas_object_size_hint_align_set(sl, 0.5, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(sl, 0.0, EVAS_HINT_EXPAND); + elm_slider_indicator_format_set(sl, "%1.1f"); + elm_slider_value_set(sl, 0.2); + elm_object_scale_set(sl, 1.0); + elm_slider_horizontal_set(sl, EINA_FALSE); + elm_box_pack_end(bx2, sl); + evas_object_show(sl); + + evas_object_smart_callback_add(sl1, "changed", _change_cb, sl); + + // disabled vertical slider + ic = elm_icon_add(bx2); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1); + evas_object_show(ic); + + sl = elm_slider_add(bx2); + elm_object_part_content_set(sl, "icon", ic); + elm_object_text_set(sl, "Disabled vertical"); + elm_slider_inverted_set(sl, EINA_TRUE); + elm_slider_unit_format_set(sl, "%1.1f units"); + elm_slider_span_size_set(sl, 100); + evas_object_size_hint_align_set(sl, 0.5, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(sl, 0.0, EVAS_HINT_EXPAND); + elm_slider_indicator_format_set(sl, "%1.1f"); + elm_slider_value_set(sl, 0.2); + elm_object_scale_set(sl, 1.0); + elm_slider_horizontal_set(sl, EINA_FALSE); + elm_object_disabled_set(sl, EINA_TRUE); + elm_box_pack_end(bx2, sl); + evas_object_show(sl); + + // normal vertical slider + sl = elm_slider_add(bx2); + elm_object_text_set(sl, "Vertical"); + elm_slider_unit_format_set(sl, "%1.1f units"); + elm_slider_span_size_set(sl, 60); + evas_object_size_hint_align_set(sl, 0.5, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(sl, 0.0, EVAS_HINT_EXPAND); + elm_slider_indicator_show_set(sl, EINA_FALSE); + elm_slider_value_set(sl, 0.2); + elm_object_scale_set(sl, 1.0); + elm_slider_horizontal_set(sl, EINA_FALSE); + evas_object_smart_callback_add(sl, "changed", _change_print_cb, sl); + elm_box_pack_end(bx2, sl); + evas_object_show(sl); + + // box for bottom buttons + bx2 = elm_box_add(win); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bt = elm_button_add(win); + elm_object_text_set(bt, "0"); + evas_object_smart_callback_add(bt, "clicked", _bt_0, sl); + evas_object_show(bt); + elm_box_pack_end(bx2, bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "1"); + evas_object_smart_callback_add(bt, "clicked", _bt_1, sl); + evas_object_show(bt); + elm_box_pack_end(bx2, bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "+0.1"); + evas_object_smart_callback_add(bt, "clicked", _bt_p1, sl); + evas_object_show(bt); + elm_box_pack_end(bx2, bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "-0.1"); + evas_object_smart_callback_add(bt, "clicked", _bt_m1, sl); + evas_object_show(bt); + elm_box_pack_end(bx2, bt); + + evas_object_show(win); +} diff --git a/src/bin/elementary/test_slideshow.c b/src/bin/elementary/test_slideshow.c new file mode 100644 index 0000000000..449d0164cc --- /dev/null +++ b/src/bin/elementary/test_slideshow.c @@ -0,0 +1,236 @@ +#include "elementary_config.h" +#include <Elementary.h> + +static Evas_Object *slideshow, *bt_start, *bt_stop; +static Elm_Slideshow_Item_Class itc; + +static void +_notify_show(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + evas_object_show(data); +} + +static void +_next(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_slideshow_next(data); +} + +static void +_previous(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_slideshow_previous(data); +} + +static void +_mouse_in(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_notify_timeout_set(data, 0.0); + evas_object_show(data); +} + +static void +_mouse_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_notify_timeout_set(data, 3.0); +} + +static void +_hv_select(void *data, Evas_Object *obj, void *event_info) +{ + elm_slideshow_transition_set(slideshow, data); + elm_object_text_set(obj, elm_object_item_text_get(event_info)); +} + +static void +_layout_select(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + elm_slideshow_layout_set(slideshow, data); + elm_object_text_set(obj, data); +} + +static void +_start(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_slideshow_timeout_set(slideshow, elm_spinner_value_get(data)); + + elm_object_disabled_set(bt_start, EINA_TRUE); + elm_object_disabled_set(bt_stop, EINA_FALSE); +} + +static void +_stop(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_slideshow_timeout_set(slideshow, 0.0); + elm_object_disabled_set(bt_start, EINA_FALSE); + elm_object_disabled_set(bt_stop, EINA_TRUE); +} + +static void +_spin(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + if (elm_slideshow_timeout_get(slideshow) > 0) + elm_slideshow_timeout_set(slideshow, elm_spinner_value_get(data)); +} + +static Evas_Object * +_get(void *data, Evas_Object *obj) +{ + //Evas_Object *photo = elm_photocam_add(obj); + //elm_photocam_file_set(photo, data); + //elm_photocam_zoom_mode_set(photo, ELM_PHOTOCAM_ZOOM_MODE_AUTO_FIT); + + printf("_get (item data: '%s')\n", (char*)data); + Evas_Object *photo = elm_image_add(obj); + elm_image_file_set(photo, data, NULL); + elm_image_fill_outside_set(photo, EINA_FALSE); + + return photo; +} + +static void +_del(void *data, Evas_Object *obj EINA_UNUSED) +{ + printf("_del (item data: '%s')\n", (char*)data); +} + + +static void +_changed_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *slide_it = (Elm_Object_Item *) event_info; + printf("CHANGED (item data: '%s')\n", + (char*)elm_object_item_data_get(slide_it)); +} + +static void +_transition_end_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Elm_Object_Item *slide_it = (Elm_Object_Item *) event_info; + printf("TRANSITION,END (item data: '%s')\n", + (char*)elm_object_item_data_get(slide_it)); + if (data == slide_it) + printf("Reaches to End of slides\n"); +} + +void +test_slideshow(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *notify, *bx, *bt, *hv, *spin; + const Eina_List *l; + const char *transition, *layout; + Elm_Object_Item *slide_last_it = NULL; + unsigned long i; + + const char *imgs[] = { + "logo.png", + "rock_01.jpg", + "rock_02.jpg", + "sky_01.jpg", + "sky_04.jpg", + "wood_01.jpg", + "mystrale.jpg", + "mystrale_2.jpg", + NULL + }; + + + win = elm_win_util_standard_add("slideshow", "Slideshow"); + elm_win_autodel_set(win, EINA_TRUE); + + slideshow = elm_slideshow_add(win); + elm_slideshow_loop_set(slideshow, EINA_TRUE); + evas_object_size_hint_weight_set(slideshow, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_smart_callback_add(slideshow, "changed", _changed_cb, NULL); + elm_win_resize_object_add(win, slideshow); + evas_object_show(slideshow); + + itc.func.get = _get; + itc.func.del = _del; + + for (i = 0; imgs[i]; i++) + { + const char *img = eina_stringshare_printf("%s/images/%s", elm_app_data_dir_get(), imgs[i]); + slide_last_it = elm_slideshow_item_add(slideshow, &itc, img); + } + + evas_object_smart_callback_add(slideshow, "transition,end", + _transition_end_cb, slide_last_it); + + notify = elm_notify_add(win); + elm_notify_align_set(notify, 0.5, 1.0); + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, notify); + elm_notify_timeout_set(notify, 3.0); + + bx = elm_box_add(win); + elm_box_horizontal_set(bx, EINA_TRUE); + elm_object_content_set(notify, bx); + evas_object_show(bx); + + evas_object_event_callback_add(bx, EVAS_CALLBACK_MOUSE_IN, _mouse_in, + notify); + evas_object_event_callback_add(bx, EVAS_CALLBACK_MOUSE_OUT, _mouse_out, + notify); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Previous"); + evas_object_smart_callback_add(bt, "clicked", _previous, slideshow); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Next"); + evas_object_smart_callback_add(bt, "clicked", _next, slideshow); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + hv = elm_hoversel_add(win); + elm_box_pack_end(bx, hv); + elm_hoversel_hover_parent_set(hv, win); + EINA_LIST_FOREACH(elm_slideshow_transitions_get(slideshow), l, transition) + elm_hoversel_item_add(hv, transition, NULL, 0, _hv_select, transition); + elm_hoversel_item_add(hv, "None", NULL, 0, _hv_select, NULL); + elm_object_text_set(hv, eina_list_data_get(elm_slideshow_transitions_get(slideshow))); + evas_object_show(hv); + + hv = elm_hoversel_add(win); + elm_box_pack_end(bx, hv); + elm_hoversel_hover_parent_set(hv, win); + EINA_LIST_FOREACH(elm_slideshow_layouts_get(slideshow), l, layout) + elm_hoversel_item_add(hv, layout, NULL, 0, _layout_select, layout); + elm_object_text_set(hv, elm_slideshow_layout_get(slideshow)); + evas_object_show(hv); + + spin = elm_spinner_add(win); + elm_spinner_label_format_set(spin, "%2.0f secs."); + evas_object_smart_callback_add(spin, "changed", _spin, spin); + elm_spinner_step_set(spin, 1); + elm_spinner_min_max_set(spin, 1, 30); + elm_spinner_value_set(spin, 3); + elm_box_pack_end(bx, spin); + evas_object_show(spin); + + bt = elm_button_add(win); + bt_start = bt; + elm_object_text_set(bt, "Start"); + evas_object_smart_callback_add(bt, "clicked", _start, spin); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + bt_stop = bt; + elm_object_text_set(bt, "Stop"); + evas_object_smart_callback_add(bt, "clicked", _stop, spin); + elm_box_pack_end(bx, bt); + elm_object_disabled_set(bt, EINA_TRUE); + evas_object_show(bt); + + evas_object_event_callback_add(slideshow, EVAS_CALLBACK_MOUSE_UP, + _notify_show, notify); + evas_object_event_callback_add(slideshow, EVAS_CALLBACK_MOUSE_MOVE, + _notify_show, notify); + + evas_object_resize(win, 500, 400); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_spinner.c b/src/bin/elementary/test_spinner.c new file mode 100644 index 0000000000..41eb63f48e --- /dev/null +++ b/src/bin/elementary/test_spinner.c @@ -0,0 +1,113 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void +_spinner_drag_start_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event EINA_UNUSED) +{ + printf("spinner drag started\n"); +} + +static void +_spinner_drag_stop_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event EINA_UNUSED) +{ + printf("spinner drag stopped\n"); +} + +void +test_spinner(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *sp; + + win = elm_win_util_standard_add("spinner", "Spinner"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + sp = elm_spinner_add(win); + elm_spinner_editable_set(sp, EINA_TRUE); + elm_spinner_label_format_set(sp, "%1.1f units"); + elm_spinner_step_set(sp, 1.3); + elm_spinner_wrap_set(sp, EINA_TRUE); + elm_spinner_min_max_set(sp, -5000.0, 5000.0); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_smart_callback_add(sp, "spinner,drag,start", + _spinner_drag_start_cb, NULL); + evas_object_smart_callback_add(sp, "spinner,drag,stop", + _spinner_drag_stop_cb, NULL); + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + sp = elm_spinner_add(win); + elm_spinner_label_format_set(sp, "Base 5.5, Round 2 : %1.1f"); + elm_spinner_min_max_set(sp, -100.0, 100.0); + elm_spinner_round_set(sp, 2); + elm_spinner_base_set(sp, 5.5); + elm_spinner_value_set(sp, 5.5); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + sp = elm_spinner_add(win); + elm_spinner_label_format_set(sp, "Percentage %%%1.2f something"); + elm_spinner_step_set(sp, 5.0); + elm_spinner_min_max_set(sp, 0.0, 100.0); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + sp = elm_spinner_add(win); + elm_spinner_label_format_set(sp, "%1.1f units"); + elm_spinner_step_set(sp, 1.3); + elm_spinner_wrap_set(sp, EINA_TRUE); + elm_object_style_set (sp, "vertical"); + elm_spinner_min_max_set(sp, -50.0, 250.0); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + sp = elm_spinner_add(win); + elm_spinner_label_format_set(sp, "Disabled %.0f"); + elm_object_disabled_set(sp, EINA_TRUE); + elm_spinner_min_max_set(sp, -50.0, 250.0); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + sp = elm_spinner_add(win); + elm_spinner_wrap_set(sp, EINA_TRUE); + elm_spinner_min_max_set(sp, 1, 12); + elm_spinner_value_set(sp, 1); + elm_spinner_label_format_set(sp, "%.0f"); + elm_spinner_editable_set(sp, EINA_FALSE); + elm_spinner_special_value_add(sp, 1, "January"); + elm_spinner_special_value_add(sp, 2, "February"); + elm_spinner_special_value_add(sp, 3, "March"); + elm_spinner_special_value_add(sp, 4, "April"); + elm_spinner_special_value_add(sp, 5, "May"); + elm_spinner_special_value_add(sp, 6, "June"); + elm_spinner_special_value_add(sp, 7, "July"); + elm_spinner_special_value_add(sp, 8, "August"); + elm_spinner_special_value_add(sp, 9, "September"); + elm_spinner_special_value_add(sp, 10, "October"); + elm_spinner_special_value_add(sp, 11, "November"); + elm_spinner_special_value_add(sp, 12, "December"); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + evas_object_resize(win, 300, 300); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_store.c b/src/bin/elementary/test_store.c new file mode 100644 index 0000000000..95beb8b387 --- /dev/null +++ b/src/bin/elementary/test_store.c @@ -0,0 +1,267 @@ +/* NOTE : Before testing elm_store, + email data files should exist in your local storage. + And you can just get example files in enlightenment website. + Use wget to obtain it. It almost 50 Megabytes. + http://www.enlightenment.org/~raster/store.tar.gz + */ + +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +typedef struct _My_Item My_Item; + +struct _My_Item +{ + char *from, *subject, *date, *head_content; +}; + +// callbacks just to see user interacting with genlist +static void +_st_selected(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("selected: %p\n", event_info); +} + +static void +_st_double_clicked(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("double clicked: %p\n", event_info); +} + +static void +_st_longpress(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("longpress %p\n", event_info); +} + +// store callbacks to handle loading/parsing/freeing of store items from src +static Elm_Genlist_Item_Class *itc1; + +static const Elm_Store_Item_Mapping it1_mapping[] = +{ + { + ELM_STORE_ITEM_MAPPING_LABEL, + "elm.title.1", ELM_STORE_ITEM_MAPPING_OFFSET(My_Item, from), + { .empty = { + EINA_TRUE + } } }, + { + ELM_STORE_ITEM_MAPPING_LABEL, + "elm.title.2", ELM_STORE_ITEM_MAPPING_OFFSET(My_Item, subject), + { .empty = { + EINA_TRUE + } } }, + { + ELM_STORE_ITEM_MAPPING_LABEL, + "elm.text", ELM_STORE_ITEM_MAPPING_OFFSET(My_Item, head_content), + { .empty = { + EINA_TRUE + } } }, + { + ELM_STORE_ITEM_MAPPING_ICON, + "elm.swallow.icon", 0, + { .icon = { + 48, 48, + ELM_ICON_LOOKUP_THEME_FDO, + EINA_TRUE, EINA_FALSE, + EINA_TRUE, + EINA_FALSE, EINA_FALSE, + } } }, + { + ELM_STORE_ITEM_MAPPING_CUSTOM, + "elm.swallow.end", 0, + { .custom = { + NULL + } } }, + ELM_STORE_ITEM_MAPPING_END +}; + +////// **** WARNING *********************************************************** +//// * This function runs inside a thread outside efl mainloop. Be careful! * +// ************************************************************************ +static Eina_Bool +_st_store_list(void *data EINA_UNUSED, Elm_Store_Item_Info *item_info) +{ + Elm_Store_Item_Info_Filesystem *info = (Elm_Store_Item_Info_Filesystem *)item_info; + int id; + char sort_id[7]; + + // create a sort id based on the filename itself assuming it is a numeric + // value like the id number in mh mail folders which is what this test + // uses as a data source + char *file = strrchr(info->path, '/'); + if (file) file++; + else file = info->path; + id = atoi(file); + sort_id[0] = ((id >> 30) & 0x3f) + 32; + sort_id[1] = ((id >> 24) & 0x3f) + 32; + sort_id[2] = ((id >> 18) & 0x3f) + 32; + sort_id[3] = ((id >> 12) & 0x3f) + 32; + sort_id[4] = ((id >> 6) & 0x3f) + 32; + sort_id[5] = ((id >> 0) & 0x3f) + 32; + sort_id[6] = 0; + info->base.sort_id = strdup(sort_id); + // choose the item genlist item class to use (only item style should be + // provided by the app, store will fill everything else in, so it also + // has to be writable + info->base.item_class = itc1; // based on item info - return the item class wanted (only style field used - rest reset to internal funcs store sets up to get label/icon etc) + info->base.mapping = it1_mapping; + info->base.data = NULL; // if we can already parse and load all of item here and want to - set this + return EINA_TRUE; // return true to include this, false not to +} +// ************************************************************************ +//// * End of separate thread function. * +////// ************************************************************************ + +////// **** WARNING *********************************************************** +//// * This function runs inside a thread outside efl mainloop. Be careful! * +// ************************************************************************ +static void +_st_store_fetch(void *data EINA_UNUSED, Elm_Store_Item *sti) +{ + const char *path = elm_store_item_filesystem_path_get(sti); + My_Item *myit; + FILE *f; + char buf[4096], *p; + Eina_Bool have_content = EINA_FALSE; + char *content = NULL, *content_pos = NULL, *content_end = NULL; + + // if we already have my item data - skip + if (elm_store_item_data_get(sti)) return; + // open the mail file and parse it + f = fopen(path, "rb"); + if (!f) return; + + // alloc my item in memory that holds data to show in the list + myit = calloc(1, sizeof(My_Item)); + if (!myit) + { + fclose(f); + return; + } + while (fgets(buf, sizeof(buf), f)) + { + if (!have_content) + { + if (!isblank(buf[0])) + { + // get key: From:, Subject: etc. + if (!strncmp(buf, "From:", 5)) + { + p = buf + 5; + while ((*p) && (isblank(*p))) p++; + p = strdup(p); + if (p) + { + myit->from = p; + p = strchr(p, '\n'); + if (p) *p = 0; + } + } + else if (!strncmp(buf, "Subject:", 8)) + { + p = buf + 8; + while ((*p) && (isblank(*p))) p++; + p = strdup(p); + if (p) + { + myit->subject = p; + p = strchr(p, '\n'); + if (p) *p = 0; + } + } + else if (!strncmp(buf, "Date:", 5)) + { + p = buf + 5; + while ((*p) && (isblank(*p))) p++; + p = strdup(p); + if (p) + { + myit->date = p; + p = strchr(p, '\n'); + if (p) *p = 0; + } + } + else if (buf[0] == '\n') // begin of content + have_content = EINA_TRUE; + } + } + else + { + // get first 320 bytes of content/body + if (!content) + { + content = calloc(1, 320); + content_pos = content; + content_end = content + 319; + } + strncat(content_pos, buf, content_end - content_pos - 1); + content_pos = content + strlen(content); + } + } + fclose(f); + myit->head_content = elm_entry_utf8_to_markup(content); + free(content); + elm_store_item_data_set(sti, myit); +} +// ************************************************************************ +//// * End of separate thread function. * +////// ************************************************************************ + +static void +_st_store_unfetch(void *data EINA_UNUSED, Elm_Store_Item *sti) +{ + My_Item *myit = elm_store_item_data_get(sti); + if (!myit) return; + if (myit->from) free(myit->from); + if (myit->subject) free(myit->subject); + if (myit->date) free(myit->date); + if (myit->head_content) free(myit->head_content); + free(myit); +} + +void +test_store(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *gl, *bx; + Elm_Store *st; + + win = elm_win_util_standard_add("store", "Store"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + gl = elm_genlist_add(win); + elm_genlist_mode_set(gl, ELM_LIST_COMPRESS); + evas_object_smart_callback_add(gl, "selected", _st_selected, NULL); + evas_object_smart_callback_add(gl, "clicked,double", _st_double_clicked, NULL); + evas_object_smart_callback_add(gl, "longpressed", _st_longpress, NULL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, gl); + evas_object_show(gl); + + itc1 = elm_genlist_item_class_new(); + itc1->item_style = "message"; + + st = elm_store_filesystem_new(); + elm_store_list_func_set(st, _st_store_list, NULL); + elm_store_fetch_func_set(st, _st_store_fetch, NULL); + //elm_store_fetch_thread_set(st, EINA_FALSE); + elm_store_unfetch_func_set(st, _st_store_unfetch, NULL); + elm_store_sorted_set(st, EINA_TRUE); + elm_store_target_genlist_set(st, gl); + elm_store_filesystem_directory_set(st, "./store"); + + /* item_class_ref is needed for itc1. some items can be added in callbacks */ + elm_genlist_item_class_ref(itc1); + elm_genlist_item_class_free(itc1); + + evas_object_resize(win, 480, 800); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_sys_notify.c b/src/bin/elementary/test_sys_notify.c new file mode 100644 index 0000000000..92cbdd1753 --- /dev/null +++ b/src/bin/elementary/test_sys_notify.c @@ -0,0 +1,148 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +#define WIDTH 320 +#define HEIGHT 160 + +struct _Sys_Notify_Data { + Evas_Object *l; + Evas_Object *n; + Ecore_Event_Handler *handlers[2]; +}; +typedef struct _Sys_Notify_Data Sys_Notify_Data; + +static Eina_Bool +_ev_handler(void *data EINA_UNUSED, + int type, + void *event) +{ + Elm_Sys_Notify_Notification_Closed *closed; + Elm_Sys_Notify_Action_Invoked *action; + + if (type == ELM_EVENT_SYS_NOTIFY_NOTIFICATION_CLOSED) + { + closed = event; + printf("Notification Closed Event: %u %d.\n", + closed->id, closed->reason); + } + else if (type == ELM_EVENT_SYS_NOTIFY_ACTION_INVOKED) + { + action = event; + printf("Notification Action Event: %u %s.\n", + action->id, action->action_key); + } + else + return ECORE_CALLBACK_PASS_ON; + + return ECORE_CALLBACK_DONE; +} + +static void _sys_notify_cb(void *data, unsigned int id EINA_UNUSED) +{ + Sys_Notify_Data *notify_data = data; + + elm_object_text_set(notify_data->l, "notify is done"); + evas_object_show(notify_data->n); +} + +static void +_bt_clicked(void *data, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Evas_Object *s, *b; + s = evas_object_data_get(obj, "summary"); + b = evas_object_data_get(obj, "body"); + + elm_sys_notify_send(0, "", elm_entry_entry_get(s), elm_entry_entry_get(b), + ELM_SYS_NOTIFY_URGENCY_NORMAL, + -1, _sys_notify_cb, data); +} + +static void +_test_sys_notify_win_del_cb(void *data, + Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Sys_Notify_Data *notify_data = data; + ecore_event_handler_del(notify_data->handlers[0]); + ecore_event_handler_del(notify_data->handlers[1]); + + free(notify_data); +} + +void +test_sys_notify(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *it, *btn; + Evas_Object *s, *b, *n, *l; + Sys_Notify_Data *notify_data; + + elm_need_sys_notify(); + + notify_data = malloc(sizeof(Sys_Notify_Data)); + + win = elm_win_add(NULL, "Sys Notify", ELM_WIN_BASIC); + elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); + elm_win_title_set(win, "System Notification"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, + _test_sys_notify_win_del_cb, notify_data); + + it = elm_bg_add(win); + elm_win_resize_object_add(win, it); + evas_object_size_hint_min_set(it, WIDTH, HEIGHT); + evas_object_size_hint_max_set(it, WIDTH, HEIGHT); + evas_object_show(it); + + notify_data->n = n = elm_notify_add(win); + evas_object_size_hint_weight_set(n, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_notify_align_set(n, 0.5, 0.0); + elm_notify_timeout_set(n, 2.0); + + notify_data->l = l = elm_label_add(win); + elm_object_content_set(n, l); + evas_object_show(l); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + s = elm_entry_add(win); + elm_entry_single_line_set(s, EINA_TRUE); + elm_entry_scrollable_set(s, EINA_TRUE); + elm_entry_entry_set(s, "Summary"); + evas_object_size_hint_align_set(s, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, s); + evas_object_show(s); + + b = elm_entry_add(win); + elm_entry_single_line_set(b, EINA_TRUE); + elm_entry_scrollable_set(b, EINA_TRUE); + elm_entry_entry_set(b, "Body long description."); + evas_object_size_hint_align_set(b, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, b); + evas_object_show(b); + + btn = elm_button_add(win); + elm_object_text_set(btn, "Send Notification"); + evas_object_smart_callback_add(btn, "clicked", _bt_clicked, notify_data); + evas_object_data_set(btn, "summary", s); + evas_object_data_set(btn, "body", b); + elm_box_pack_end(bx, btn); + evas_object_show(btn); + + evas_object_resize(win, WIDTH, HEIGHT); + evas_object_show(win); + + notify_data->handlers[0] = ecore_event_handler_add(ELM_EVENT_SYS_NOTIFY_NOTIFICATION_CLOSED, + _ev_handler, notify_data); + notify_data->handlers[1] = ecore_event_handler_add(ELM_EVENT_SYS_NOTIFY_ACTION_INVOKED, + _ev_handler, notify_data); +} diff --git a/src/bin/elementary/test_systray.c b/src/bin/elementary/test_systray.c new file mode 100644 index 0000000000..1271242d54 --- /dev/null +++ b/src/bin/elementary/test_systray.c @@ -0,0 +1,192 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +#define WIDTH 320 +#define HEIGHT 160 + +static Evas_Object *ai = NULL; +static Evas_Object *i = NULL; +static Evas_Object *r = NULL; +static Eo *item = NULL; + +static Eina_Bool +_ev_handler(void *data EINA_UNUSED, + int type EINA_UNUSED, + void *event EINA_UNUSED) +{ + Eina_Bool ret = EINA_FALSE; + + printf("systray ready event\n"); + + ret = elm_obj_systray_register(item); + + printf("Item Registration: "); + if (ret) + printf("OK!\n"); + else + printf("Failed!\n"); + + return ECORE_CALLBACK_DONE; +} + +static void +_bt_clicked(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + elm_obj_systray_icon_name_set(item, elm_entry_entry_get(i)); + elm_obj_systray_att_icon_name_set(item, elm_entry_entry_get(ai)); +} + +static void + _r_clicked(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + elm_obj_systray_status_set(item, elm_radio_value_get(r)); +} + +static void +_menu_clicked(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("Menu Item Clicked: %s\n", (const char *) data); +} + +void +test_systray(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *it; + Elm_Object_Item *it2; + int st = 1; + + Eina_Bool init_ok = elm_need_systray(); + + ecore_event_handler_add(ELM_EVENT_SYSTRAY_READY, + _ev_handler, NULL); + + win = elm_win_add(NULL, "Systray", ELM_WIN_BASIC); + elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); + elm_win_title_set(win, "Systemtray - Status Notifier Item"); + elm_win_autodel_set(win, EINA_TRUE); + + it = elm_menu_add(win); + elm_menu_item_add(it, NULL, NULL, "root 1", _menu_clicked, "root 1"); + it2 = elm_menu_item_add(it, NULL, NULL, "root 2", _menu_clicked, "root 2"); + elm_menu_item_add(it, it2, NULL, "item 1", _menu_clicked, "item 1"); + elm_menu_item_add(it, it2, NULL, "item 2", _menu_clicked, "item 2"); + + // Status Notifier Item Handler + item = eo_add(ELM_SYSTRAY_CLASS, win); + elm_obj_systray_icon_name_set(item, "elementary"); + elm_obj_systray_att_icon_name_set(item, "elementary"); + elm_obj_systray_menu_set(item, it); + + it = elm_bg_add(win); + elm_win_resize_object_add(win, it); + evas_object_size_hint_min_set(it, WIDTH, HEIGHT); + evas_object_size_hint_max_set(it, WIDTH, HEIGHT); + evas_object_show(it); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + if (!init_ok) + { + it = elm_label_add(win); + evas_object_size_hint_align_set(it, 0, EVAS_HINT_FILL); + elm_object_text_set(it, "Systray initialization failed. " + "This test will do nothing."); + elm_box_pack_end(bx, it); + evas_object_show(it); + } + + it = elm_label_add(win); + evas_object_size_hint_align_set(it, 0, EVAS_HINT_FILL); + elm_object_text_set(it, "Icon:"); + elm_box_pack_end(bx, it); + evas_object_show(it); + + i = elm_entry_add(win); + elm_entry_single_line_set(i, EINA_TRUE); + elm_entry_scrollable_set(i, EINA_TRUE); + elm_entry_entry_set(i, "elementary"); + evas_object_size_hint_align_set(i, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, i); + evas_object_show(i); + + it = elm_label_add(win); + evas_object_size_hint_align_set(it, 0, EVAS_HINT_FILL); + elm_object_text_set(it, "Attention Icon:"); + elm_box_pack_end(bx, it); + evas_object_show(it); + + ai = elm_entry_add(win); + elm_entry_single_line_set(ai, EINA_TRUE); + elm_entry_scrollable_set(ai, EINA_TRUE); + elm_entry_entry_set(ai, "elementary"); + evas_object_size_hint_align_set(ai, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, ai); + evas_object_show(ai); + + it = elm_button_add(win); + elm_object_text_set(it, "Update"); + evas_object_smart_callback_add(it, "clicked", _bt_clicked, NULL); + elm_box_pack_end(bx, it); + evas_object_show(it); + + it = elm_separator_add(win); + elm_separator_horizontal_set(it, EINA_TRUE); + elm_box_pack_end(bx, it); + evas_object_show(it); + + it = elm_label_add(win); + evas_object_size_hint_align_set(it, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(it, "Status:"); + elm_box_pack_end(bx, it); + evas_object_show(it); + + it = elm_box_add(win); + elm_box_horizontal_set(it, EINA_TRUE); + elm_box_homogeneous_set(it, EINA_TRUE); + elm_box_pack_end(bx, it); + evas_object_show(it); + bx = it; + + r = elm_radio_add(win); + evas_object_size_hint_align_set(r, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(r, "changed", _r_clicked, NULL); + elm_radio_value_pointer_set(r, &st); + elm_radio_state_value_set(r, 0); + elm_object_text_set(r, "Passive"); + elm_box_pack_end(bx, r); + evas_object_show(r); + + it = elm_radio_add(win); + evas_object_size_hint_align_set(it, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(it, "changed", _r_clicked, NULL); + elm_radio_state_value_set(it, 1); + elm_radio_group_add(it, r); + elm_object_text_set(it, "Active"); + elm_box_pack_end(bx, it); + evas_object_show(it); + + it = elm_radio_add(win); + evas_object_size_hint_align_set(it, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(it, "changed", _r_clicked, NULL); + elm_radio_state_value_set(it, 2); + elm_radio_group_add(it, r); + elm_object_text_set(it, "Needs Attention"); + elm_box_pack_end(bx, it); + evas_object_show(it); + + evas_object_resize(win, WIDTH, HEIGHT); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_table.c b/src/bin/elementary/test_table.c new file mode 100644 index 0000000000..76aa89f276 --- /dev/null +++ b/src/bin/elementary/test_table.c @@ -0,0 +1,539 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +void +test_table(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *tb, *bt; + + win = elm_win_util_standard_add("table", "Table"); + elm_win_autodel_set(win, EINA_TRUE); + + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, tb); + evas_object_show(tb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 1"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 0, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 2"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 1, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 3"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 2, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 4"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 0, 1, 2, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 5"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 2, 1, 1, 2); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button a"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 0, 2, 2, 1); + evas_object_show(bt); + + evas_object_show(win); +} + +void +test_table2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *tb, *bt; + + win = elm_win_util_standard_add("table2", "Table Homogeneous"); + elm_win_autodel_set(win, EINA_TRUE); + + tb = elm_table_add(win); + elm_table_homogeneous_set(tb, EINA_TRUE); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, tb); + evas_object_show(tb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "A"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 1, 1, 2, 2); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Blah blah blah"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 3, 0, 2, 3); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Hallow"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 0, 3, 10, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "B"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 2, 5, 2, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "C"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 8, 8, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Wide"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 1, 7, 7, 2); + evas_object_show(bt); + + evas_object_show(win); +} + +static void +my_tb_ch(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + Evas_Object *tb = evas_object_data_get(win, "tb"); + Evas_Object *b2 = evas_object_data_get(win, "b2"); + + elm_table_unpack(tb, b2); + elm_table_pack(tb, b2, 1, 0, 1, 2); +} + +void +test_table3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *tb, *bt; + + win = elm_win_util_standard_add("table3", "Table 3"); + elm_win_autodel_set(win, EINA_TRUE); + + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, tb); + evas_object_data_set(win, "tb", tb); + evas_object_show(tb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 1"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 0, 0, 1, 1); + evas_object_data_set(win, "b1", bt); + evas_object_smart_callback_add(bt, "clicked", my_tb_ch, win); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 2"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 1, 0, 1, 1); + evas_object_data_set(win, "b2", bt); + evas_object_smart_callback_add(bt, "clicked", my_tb_ch, win); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 3"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 0, 1, 1, 1); + evas_object_data_set(win, "b3", bt); + evas_object_smart_callback_add(bt, "clicked", my_tb_ch, win); + evas_object_show(bt); + + evas_object_show(win); +} + +void +test_table4(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *tb, *bt; + + win = elm_win_util_standard_add("table4", "Table 4"); + elm_win_autodel_set(win, EINA_TRUE); + + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, tb); + evas_object_data_set(win, "tb", tb); + evas_object_show(tb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 1"); + evas_object_size_hint_weight_set(bt, 0.25, 0.25); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 0, 0, 1, 1); + evas_object_data_set(win, "b1", bt); + evas_object_smart_callback_add(bt, "clicked", my_tb_ch, win); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 2"); + evas_object_size_hint_weight_set(bt, 0.75, 0.25); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 1, 0, 1, 1); + evas_object_data_set(win, "b2", bt); + evas_object_smart_callback_add(bt, "clicked", my_tb_ch, win); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 3"); + evas_object_size_hint_weight_set(bt, 0.25, 0.75); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 0, 1, 1, 1); + evas_object_data_set(win, "b3", bt); + evas_object_smart_callback_add(bt, "clicked", my_tb_ch, win); + evas_object_show(bt); + + evas_object_show(win); +} + +void +test_table5(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *tb, *bt; + + win = elm_win_util_standard_add("table5", "Table 5"); + elm_win_autodel_set(win, EINA_TRUE); + + tb = elm_table_add(win); + elm_table_homogeneous_set(tb, EINA_TRUE); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, tb); + evas_object_show(tb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "A"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 33, 0, 34, 33); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "B"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 67, 33, 33, 34); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "C"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 33, 67, 34, 33); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "D"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 0, 33, 33, 34); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "X"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 33, 33, 34, 34); + evas_object_show(bt); + + evas_object_show(win); +} + +void +test_table6(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *tb, *bt; + + win = elm_win_util_standard_add("table6", "Table 6"); + elm_win_autodel_set(win, EINA_TRUE); + + tb = elm_table_add(win); + elm_table_homogeneous_set(tb, EINA_TRUE); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, tb); + evas_object_show(tb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "C"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 1, 1, 2, 2); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "A"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 1, 1, 2, 2); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Blah blah blah"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 3, 0, 2, 3); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Hallow"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 0, 3, 10, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "B"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 1, 1, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Wide"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 1, 7, 7, 2); + evas_object_show(bt); + + evas_object_show(win); +} + +void +test_table7(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *tb, *bt; + + win = elm_win_util_standard_add("table7", "Table 7"); + elm_win_autodel_set(win, EINA_TRUE); + + tb = elm_table_add(win); + elm_table_padding_set(tb, 10, 20); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, tb); + evas_object_show(tb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "C"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 1, 1, 2, 2); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "A"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 1, 1, 2, 2); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Blah blah blah"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 3, 0, 2, 3); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Hallow"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 0, 3, 10, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "B"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 1, 1, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Wide"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 1, 7, 7, 2); + evas_object_show(bt); + + evas_object_show(win); +} + +static void +_hor_sl_delay_changed_cb(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Evas_Coord h = 0; + + elm_table_padding_get(data, NULL, &h); + elm_table_padding_set(data, elm_slider_value_get(obj), h); +} + +static void +_vert_sl_delay_changed_cb(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Evas_Coord w = 0; + + elm_table_padding_get(data, &w, NULL); + elm_table_padding_set(data, w, elm_slider_value_get(obj)); +} + +void +test_table8(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *tb_out, *tb, *bt, *bg, *sl; + + win = elm_win_util_standard_add("table8", "Table Padding"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + // outer table for the table alignment and background + tb_out = elm_table_add(bx); + evas_object_size_hint_weight_set(tb_out, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(tb_out, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, tb_out); + evas_object_show(tb_out); + + // table background + bg = elm_bg_add(tb_out); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb_out, bg, 0, 0, 1, 1); + elm_bg_color_set(bg, 255, 255, 0); + evas_object_show(bg); + + // actual table for a padding test + tb = elm_table_add(tb_out); + elm_table_padding_set(tb, 10, 10); + evas_object_size_hint_align_set(tb_out, 0.5, 0.5); + elm_table_pack(tb_out, tb, 0, 0, 1, 1); + evas_object_show(tb); + + // first row + bt = elm_button_add(tb); + elm_object_text_set(bt, "colspan 1"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 0, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(tb); + elm_object_text_set(bt, "colspan 1"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 1, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(tb); + elm_object_text_set(bt, "colspan 1"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 2, 0, 1, 1); + evas_object_show(bt); + + // second row + bt = elm_button_add(tb); + elm_object_text_set(bt, "colspan 3"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 0, 1, 3, 1); + evas_object_show(bt); + + // third row + bt = elm_button_add(tb); + elm_object_text_set(bt, "rowspan 1"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 0, 2, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(tb); + elm_object_text_set(bt, "rowspan 1"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 1, 2, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(tb); + elm_object_text_set(bt, "rowspan 2"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 2, 2, 1, 2); + evas_object_show(bt); + + // fourth row + bt = elm_button_add(tb); + elm_object_text_set(bt, "rowspan 1"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 0, 3, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(tb); + elm_object_text_set(bt, "rowspan 1"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 1, 3, 1, 1); + evas_object_show(bt); + + // horizontal padding sliders + sl = elm_slider_add(bx); + elm_object_text_set(sl, "Horizontal Padding"); + elm_slider_unit_format_set(sl, "%1.0f pixel"); + elm_slider_min_max_set(sl, 0, 100); + elm_slider_value_set(sl, 10); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.0); + evas_object_smart_callback_add(sl, "delay,changed", _hor_sl_delay_changed_cb, tb); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + // vertical padding sliders + sl = elm_slider_add(bx); + elm_object_text_set(sl, "Vertical Padding"); + elm_slider_unit_format_set(sl, "%1.0f pixel"); + elm_slider_min_max_set(sl, 0, 100); + elm_slider_value_set(sl, 10); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.0); + evas_object_smart_callback_add(sl, "delay,changed", _vert_sl_delay_changed_cb, tb); + elm_box_pack_end(bx, sl); + evas_object_show(sl); + + evas_object_show(win); +} diff --git a/src/bin/elementary/test_task_switcher.c b/src/bin/elementary/test_task_switcher.c new file mode 100644 index 0000000000..fae686edef --- /dev/null +++ b/src/bin/elementary/test_task_switcher.c @@ -0,0 +1,400 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> +#include <Eina.h> + +#define APPS_COL 0 +#define VIEWS_COL 1 +#define PROPS_VIEW_COL 2 + +static Evas_Object *table = NULL; +static Elm_App_Client *app_selected = NULL; +static Eina_List *apps_list = NULL; + +static void _app_view_clicked(void *data, Evas_Object *obj, void *event_info); +static void _apps_list_update(void); + +static void _btn_close_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Elm_App_Client_View *view = data; + elm_app_client_view_close(view, NULL, NULL); +} + +static void _btn_pause_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Elm_App_Client_View *view = data; + elm_app_client_view_pause(view, NULL, NULL); +} + +static void _btn_resume_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Elm_App_Client_View *view = data; + elm_app_client_view_resume(view, NULL, NULL); +} + +static Eina_Bool +_app_view_prop_changed_cb(void *data EINA_UNUSED, const Eo_Event *event) +{ + Elm_App_View_State state = ELM_APP_VIEW_STATE_UNKNOWN; + + state = elm_app_client_view_state_get(event->obj); + + if (state == ELM_APP_VIEW_STATE_CLOSED) + { + Evas_Object *props = elm_table_child_get(table, PROPS_VIEW_COL, 0); + elm_table_unpack(table, props); + evas_object_del(props); + } + else + _app_view_clicked(event->obj, NULL, NULL); + + return EINA_TRUE; +} + +static void +_app_view_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Elm_App_Client_View *view = data; + Evas_Object *view_props, *close_btn, *resume_btn, *pause_btn; + const char *title = NULL, *icon = NULL; + int new_events = 0, window = 0; + unsigned short progress = 0; + Elm_App_View_State state = ELM_APP_VIEW_STATE_UNKNOWN; + char buffer[1024]; + + view_props = elm_table_child_get(table, PROPS_VIEW_COL, 0); + if (view_props) + { + Elm_App_Client_View *old_view; + + old_view = evas_object_data_del(view_props, "view"); + eo_event_callback_del(old_view, ELM_APP_CLIENT_VIEW_EVENT_PROPERTY_CHANGED, _app_view_prop_changed_cb, table); + elm_list_clear(view_props); + } + else + { + view_props = elm_list_add(table); + evas_object_size_hint_align_set(view_props, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_show(view_props); + elm_table_pack(table, view_props, PROPS_VIEW_COL, 0, 1, 1); + } + + evas_object_data_set(view_props, "view", view); + + title = elm_app_client_view_title_get(view); + icon = elm_app_client_view_icon_get(view); + progress = elm_app_client_view_progress_get(view); + new_events = elm_app_client_view_new_events_get(view); + window = elm_app_client_view_window_get(view); + eo_event_callback_add(view, ELM_APP_CLIENT_VIEW_EVENT_PROPERTY_CHANGED, _app_view_prop_changed_cb, table); + + snprintf(buffer, sizeof(buffer), "Title=%s", title); + elm_list_item_append(view_props, buffer, NULL, NULL, NULL, NULL); + + snprintf(buffer, sizeof(buffer), "Icon=%s", icon); + elm_list_item_append(view_props, buffer, NULL, NULL, NULL, NULL); + + snprintf(buffer, sizeof(buffer), "Progress=%d", progress); + elm_list_item_append(view_props, buffer, NULL, NULL, NULL, NULL); + + snprintf(buffer, sizeof(buffer), "New events=%d", new_events); + elm_list_item_append(view_props, buffer, NULL, NULL, NULL, NULL); + + snprintf(buffer, sizeof(buffer), "WindowID=%d", window); + elm_list_item_append(view_props, buffer, NULL, NULL, NULL, NULL); + + state = elm_app_client_view_state_get(view); + if (state == ELM_APP_VIEW_STATE_LIVE) + snprintf(buffer, sizeof(buffer), "State=alive"); + else if (state == ELM_APP_VIEW_STATE_PAUSED) + snprintf(buffer, sizeof(buffer), "State=paused"); + else if (state == ELM_APP_VIEW_STATE_CLOSED) + snprintf(buffer, sizeof(buffer), "State=closed"); + else if (state == ELM_APP_VIEW_STATE_SHALLOW) + snprintf(buffer, sizeof(buffer), "State=shallow"); + else + snprintf(buffer, sizeof(buffer), "State=unknown"); + elm_list_item_append(view_props, buffer, NULL, NULL, NULL, NULL); + + close_btn = elm_button_add(view_props); + elm_object_text_set(close_btn, "Close view"); + evas_object_smart_callback_add(close_btn, "clicked", _btn_close_cb, view); + elm_list_item_append(view_props, NULL, close_btn, NULL, NULL, NULL); + + pause_btn = elm_button_add(view_props); + elm_object_text_set(pause_btn, "Pause view"); + evas_object_smart_callback_add(pause_btn, "clicked", _btn_pause_cb, view); + elm_list_item_append(view_props, NULL, pause_btn, NULL, NULL, NULL ); + + resume_btn = elm_button_add(view_props); + elm_object_text_set(resume_btn, "Resume view"); + evas_object_smart_callback_add(resume_btn, "clicked", _btn_resume_cb, view); + elm_list_item_append(view_props, NULL, resume_btn, NULL, NULL, NULL ); + + elm_list_go(view_props); +} + +static void +_popup_close_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + evas_object_del(data); +} + +static void app_client_view_open_cb(void *data EINA_UNUSED, Elm_App_Client_View *view, const char *error, const char *error_message) +{ + Evas_Object *popup, *btn_ok; + char buf[1024]; + + popup = elm_popup_add(table); + + if (view) + { + _app_view_clicked(view, NULL, NULL); + return; + } + + snprintf(buf, sizeof(buf), "Some error happen opening view: %s %s", error, error_message); + elm_object_part_text_set(popup, "default", buf); + + btn_ok = elm_button_add(popup); + elm_object_text_set(btn_ok, "Ok"); + elm_object_part_content_set(popup, "button1", btn_ok); + evas_object_smart_callback_add(btn_ok, "clicked", _popup_close_cb, popup); + + elm_popup_orient_set(popup, ELM_POPUP_ORIENT_TOP); + evas_object_show(popup); +} + +static void _popup_btn_open_view_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *popup = data; + Eina_Value *args = NULL;//TODO fill with args of popup + Elm_App_Client *app = evas_object_data_get(popup, "app"); + + elm_app_client_view_open(app, args, app_client_view_open_cb, NULL); + + evas_object_del(popup); +} + +static void +_app_view_open(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Elm_App_Client *app = data; + Evas_Object *popup, *btn_open, *btn_cancel, *args_box; + + popup = elm_popup_add(table); + elm_object_part_text_set(popup, "title,text", "Open a view"); + + btn_open = elm_button_add(popup); + elm_object_text_set(btn_open, "Open"); + elm_object_part_content_set(popup, "button1", btn_open); + evas_object_smart_callback_add(btn_open, "clicked", _popup_btn_open_view_cb, popup); + evas_object_show(btn_open); + + btn_cancel = elm_button_add(popup); + elm_object_text_set(btn_cancel, "Cancel"); + elm_object_part_content_set(popup, "button2", btn_cancel); + evas_object_smart_callback_add(btn_cancel, "clicked", _popup_close_cb, popup); + evas_object_show(btn_cancel); + + args_box = elm_box_add(popup); + elm_object_part_content_set(popup, "default", args_box); + elm_object_part_text_set(popup, "default", "TODO: add some entrys to add some parameters to view."); + + evas_object_data_set(popup, "app", app); + elm_popup_orient_set(popup, ELM_POPUP_ORIENT_TOP); + evas_object_show(popup); +} + +static void _app_close_all_views_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Elm_App_Client *app = data; + elm_app_client_view_all_close(app); +} + +static void +_app_terminate_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Elm_App_Client *app = data; + elm_app_client_terminate(app); +} + +static void +_app_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *views, *btn_close_all, *btn_terminate, *btn_open_view; + Eina_Iterator *views_iter = NULL; + Elm_App_Client_View *client_view; + Elm_App_Client *app = data; + + app_selected = app; + + views = elm_table_child_get(table, VIEWS_COL, 0); + if (!views) + { + views = elm_list_add(table); + evas_object_size_hint_align_set(views, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(views); + elm_table_pack(table, views, VIEWS_COL, 0, 1, 1); + } + else + elm_list_clear(views); + + btn_open_view = elm_button_add(views); + elm_object_text_set(btn_open_view, "Open a view"); + evas_object_smart_callback_add(btn_open_view, "clicked", _app_view_open, app); + elm_list_item_append(views, NULL, btn_open_view, NULL, NULL, NULL); + + views_iter = elm_app_client_views_get(app); + EINA_ITERATOR_FOREACH(views_iter, client_view) + { + const char *path = NULL; + + path = elm_app_client_view_path_get(client_view); + elm_list_item_append(views, path, NULL, NULL, _app_view_clicked, client_view); + } + eina_iterator_free(views_iter); + + btn_close_all = elm_button_add(views); + elm_object_text_set(btn_close_all, "Close all views"); + evas_object_smart_callback_add(btn_close_all, "clicked", _app_close_all_views_cb, app); + elm_list_item_append(views, NULL, btn_close_all, NULL, NULL, NULL); + + btn_terminate = elm_button_add(views); + elm_object_text_set(btn_terminate, "Terminate application"); + evas_object_smart_callback_add(btn_terminate, "clicked", _app_terminate_cb, app); + elm_list_item_append(views, NULL, btn_terminate, NULL, NULL, NULL); + + elm_list_go(views); +} + +static Eina_Bool +_view_list_update_cb(void *data EINA_UNUSED, const Eo_Event *event) +{ + if (app_selected == event->obj) + _app_clicked(event->obj, NULL, NULL); + return EINA_TRUE; +} + +static void +_win_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) +{ + Elm_App_Client *app; + EINA_LIST_FREE(apps_list, app) + eo_del(app); +} + +static void +_app_open(const char *package) +{ + Elm_App_Client *app; + Eina_List *l; + + EINA_LIST_FOREACH(apps_list, l, app) + { + const char *app_package = NULL; + + app_package = elm_app_client_package_get(app); + if (!app_package) + return; + if (!strcmp(package, app_package)) + return; + } + + app = eo_add(ELM_APP_CLIENT_CLASS, NULL, elm_app_client_constructor(eo_self, package)); + eo_event_callback_add(app, ELM_APP_CLIENT_EVENT_VIEW_LIST_LOADED, _view_list_update_cb, table); + eo_event_callback_add(app, ELM_APP_CLIENT_EVENT_VIEW_CREATED, _view_list_update_cb, table); + eo_event_callback_add(app, ELM_APP_CLIENT_EVENT_VIEW_DELETED, _view_list_update_cb, table); + apps_list = eina_list_append(apps_list, app); +} + +static void +_btn_app_open_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *entry = data; + const char *pkg = elm_object_text_get(entry); + + if (!pkg || !pkg[0]) + return; + + _app_open(pkg); + _apps_list_update(); +} + +static void +_open_custom_app_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + elm_list_item_selected_set(event_info, EINA_FALSE); + elm_object_focus_set(data, EINA_TRUE); +} + +static void +_apps_list_update(void) +{ + Evas_Object *entry, *btn_open, *apps; + Elm_App_Client *app; + Eina_List *l; + + apps = elm_table_child_get(table, APPS_COL, 0); + elm_list_clear(apps); + + EINA_LIST_FOREACH(apps_list, l, app) + { + const char *app_package = NULL; + app_package = elm_app_client_package_get(app); + elm_list_item_append(apps, app_package, NULL, NULL, _app_clicked, app); + } + + entry = elm_entry_add(apps); + elm_entry_single_line_set(entry, EINA_TRUE); + evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, 0.5); + + btn_open = elm_button_add(apps); + elm_object_text_set(btn_open, "Open"); + evas_object_smart_callback_add(btn_open, "clicked", _btn_app_open_cb, entry); + elm_list_item_append(apps, NULL, entry, btn_open, _open_custom_app_cb, entry); + + elm_list_go(apps); +} + +void +test_task_switcher(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *apps; + + if (apps_list) + { + printf("Task switcher already open.\n"); + return; + } + + win = elm_win_util_standard_add("task switcher", "Task switcher"); + elm_win_autodel_set(win, EINA_TRUE); + + evas_object_smart_callback_add(win, "delete,request", _win_del, NULL); + + table = elm_table_add(win); + elm_win_resize_object_add(win, table); + elm_table_padding_set(table, 0, 0); + elm_table_homogeneous_set(table, EINA_TRUE); + 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); + + _app_open("org.enlightenment.message"); + _app_open("org.enlightenment.phone"); + + apps = elm_list_add(table); + evas_object_size_hint_align_set(apps, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(apps); + elm_table_pack(table, apps, APPS_COL, 0, 1, 1); + _apps_list_update(); + + evas_object_show(table); + evas_object_resize(win, 1024, 768); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_thumb.c b/src/bin/elementary/test_thumb.c new file mode 100644 index 0000000000..9d4a33ed28 --- /dev/null +++ b/src/bin/elementary/test_thumb.c @@ -0,0 +1,63 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +void +test_thumb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *sc, *tb, *th; + int i, j; + char buf[PATH_MAX]; + const char *img[] = + { + "panel_01.jpg", + "plant_01.jpg", + "rock_01.jpg", + "rock_02.jpg", + "sky_01.jpg", + "sky_02.jpg", + "sky_03.jpg", + "sky_04.jpg", + "wood_01.jpg", + "mystrale.jpg", + "mystrale_2.jpg" + }; + + elm_need_ethumb(); + + win = elm_win_util_standard_add("thumb", "Thumb"); + elm_win_autodel_set(win, EINA_TRUE); + + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + for (j = 0; j < (int)EINA_C_ARRAY_LENGTH(img); j++) + { + for (i = 0; i < (int)EINA_C_ARRAY_LENGTH(img); i++) + { + th = elm_thumb_add(win); + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), + img[i]); + elm_thumb_file_set(th, buf, NULL); + evas_object_size_hint_weight_set(th, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(th, EVAS_HINT_FILL, + EVAS_HINT_FILL); + elm_table_pack(tb, th, i, j, 1, 1); + elm_thumb_editable_set(th, EINA_TRUE); + evas_object_show(th); + } + } + + sc = elm_scroller_add(win); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, sc); + + elm_object_content_set(sc, tb); + evas_object_show(tb); + evas_object_show(sc); + + evas_object_resize(win, 600, 600); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_toolbar.c b/src/bin/elementary/test_toolbar.c new file mode 100644 index 0000000000..11c07578e8 --- /dev/null +++ b/src/bin/elementary/test_toolbar.c @@ -0,0 +1,1314 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +Evas_Object * _focus_autoscroll_mode_frame_create(Evas_Object *parent); + +static void +_selected_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + const char *str = elm_object_item_text_get(event_info); + printf("item %p is %s.", event_info, (char *)data); + if (str) + printf(" string is \"%s\"\n", str); + else + printf("\n"); +} + +static void +_tb_sel1_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/images/panel_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(data, buf); +} + +static void +_tb_sel2_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/images/rock_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(data, buf); +} + +static void +_tb_sel3_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/images/wood_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(data, buf); +} + +static void +_tb_sel3a_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + _tb_sel3_cb(data, obj, event_info); + elm_toolbar_item_state_set(event_info, elm_toolbar_item_state_next(event_info)); +} + +static void +_tb_sel3b_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + _tb_sel3_cb(data, obj, event_info); + elm_toolbar_item_state_unset(event_info); +} + +static void +_tb_sel4_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/images/sky_03.jpg", elm_app_data_dir_get()); + elm_photo_file_set(data, buf); +} + +static void +_tb_sel4a_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_toolbar_item_state_set(event_info, elm_toolbar_item_state_prev(event_info)); +} + +static void +_tb_sel5_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_photo_file_set(data, NULL); +} + +static void +toolbar_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info) +{ + Elm_Object_Item *more_it = elm_toolbar_more_item_get(obj); + + printf("toolbar item %p is clicked\n", event_info); + + if (!strcmp(elm_object_item_text_get(more_it), "Open") && + (more_it == elm_toolbar_selected_item_get(obj))) + { + elm_toolbar_item_icon_set(more_it, "arrow_up"); + elm_object_item_text_set(more_it, "Close"); + } + else if (!strcmp(elm_object_item_text_get(more_it), "Close")) + { + elm_toolbar_item_icon_set(more_it, "arrow_down"); + elm_object_item_text_set(more_it, "Open"); + } +} + +void +test_toolbar(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *tb, *ph, *menu; + Evas_Object *ph1, *ph2, *ph3, *ph4; + Elm_Object_Item *tb_it; + Elm_Object_Item *menu_it; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("toolbar", "Toolbar"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + tb = elm_toolbar_add(win); + evas_object_smart_callback_add(tb, "selected", _selected_cb, "selected"); + evas_object_smart_callback_add(tb, "unselected", _selected_cb, "unselected"); + elm_toolbar_shrink_mode_set(tb, ELM_TOOLBAR_SHRINK_MENU); + evas_object_size_hint_weight_set(tb, 0.0, 0.0); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, 0.0); +// elm_object_scale_set(tb, 0.9); + + ph1 = elm_photo_add(win); + ph2 = elm_photo_add(win); + ph3 = elm_photo_add(win); + ph4 = elm_photo_add(win); + + tb_it = elm_toolbar_item_append(tb, "document-print", "Hello", _tb_sel1_cb, ph1); + elm_object_item_disabled_set(tb_it, EINA_TRUE); + elm_toolbar_item_priority_set(tb_it, 100); + + tb_it = elm_toolbar_item_append(tb, "folder-new", "World", _tb_sel2_cb, ph1); + elm_toolbar_item_priority_set(tb_it, -100); + + tb_it = elm_toolbar_item_append(tb, "object-rotate-right", "H", _tb_sel3_cb, ph4); + elm_toolbar_item_priority_set(tb_it, 150); + + tb_it = elm_toolbar_item_append(tb, "mail-send", "Comes", _tb_sel4_cb, ph4); + elm_toolbar_item_priority_set(tb_it, 0); + + tb_it = elm_toolbar_item_append(tb, "clock", "Elementary", _tb_sel5_cb, ph4); + elm_toolbar_item_priority_set(tb_it, -200); + + tb_it = elm_toolbar_item_append(tb, "refresh", "Menu", NULL, NULL); + elm_toolbar_item_menu_set(tb_it, EINA_TRUE); + elm_toolbar_item_priority_set(tb_it, -9999); + elm_toolbar_menu_parent_set(tb, win); + menu = elm_toolbar_item_menu_get(tb_it); + + elm_menu_item_add(menu, NULL, "edit-cut", "Shrink", _tb_sel3_cb, ph4); + menu_it = elm_menu_item_add(menu, NULL, "edit-copy", "Mode", _tb_sel4_cb, ph4); + elm_menu_item_add(menu, menu_it, "edit-paste", "is set to", _tb_sel4_cb, ph4); + elm_menu_item_add(menu, NULL, "edit-delete", "Menu", _tb_sel5_cb, ph4); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + tb = elm_table_add(win); + //elm_table_homogeneous_set(tb, EINA_TRUE); + evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ph = ph1; + elm_photo_size_set(ph, 40); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 0, 1, 1); + evas_object_show(ph); + + ph = ph2; + elm_photo_size_set(ph, 80); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 0, 1, 1); + evas_object_show(ph); + + ph = ph3; + elm_photo_size_set(ph, 20); + snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 1, 1, 1); + evas_object_show(ph); + + ph = ph4; + elm_photo_size_set(ph, 60); + snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 1, 1, 1); + evas_object_show(ph); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + evas_object_resize(win, 320, 300); + evas_object_show(win); +} + +void +test_toolbar2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *tb, *ph, *menu; + Evas_Object *ph1, *ph2, *ph3, *ph4; + Elm_Object_Item *tb_it; + Elm_Object_Item *menu_it; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("toolbar2", "Toolbar 2"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + tb = elm_toolbar_add(win); + elm_toolbar_homogeneous_set(tb, EINA_FALSE); + elm_toolbar_shrink_mode_set(tb, ELM_TOOLBAR_SHRINK_SCROLL); + evas_object_size_hint_weight_set(tb, 0.0, 0.0); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, 0.0); + + ph1 = elm_photo_add(win); + ph2 = elm_photo_add(win); + ph3 = elm_photo_add(win); + ph4 = elm_photo_add(win); + + tb_it = elm_toolbar_item_append(tb, "document-print", "Hello", _tb_sel1_cb, ph1); + elm_object_item_disabled_set(tb_it, EINA_TRUE); + elm_toolbar_item_priority_set(tb_it, -100); + + tb_it = elm_toolbar_item_append(tb, "folder-new", "World", _tb_sel2_cb, ph1); + elm_toolbar_item_priority_set(tb_it, 100); + + tb_it = elm_toolbar_item_append(tb, "object-rotate-right", "H", _tb_sel3_cb, ph4); + elm_toolbar_item_priority_set(tb_it, -150); + + tb_it = elm_toolbar_item_append(tb, "mail-send", "Comes", _tb_sel4_cb, ph4); + elm_toolbar_item_priority_set(tb_it, -200); + + tb_it = elm_toolbar_item_append(tb, "clock", "Elementary", _tb_sel5_cb, ph4); + elm_toolbar_item_priority_set(tb_it, 0); + + tb_it = elm_toolbar_item_append(tb, "refresh", "Menu", NULL, NULL); + elm_toolbar_item_menu_set(tb_it, EINA_TRUE); + elm_toolbar_item_priority_set(tb_it, -9999); + elm_toolbar_menu_parent_set(tb, win); + menu = elm_toolbar_item_menu_get(tb_it); + + elm_menu_item_add(menu, NULL, "edit-cut", "Shrink", _tb_sel3_cb, ph4); + menu_it = elm_menu_item_add(menu, NULL, "edit-copy", "Mode", _tb_sel4_cb, ph4); + elm_menu_item_add(menu, menu_it, "edit-paste", "is set to", _tb_sel4_cb, ph4); + elm_menu_item_add(menu, NULL, "edit-delete", "Scroll", _tb_sel5_cb, ph4); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + tb = elm_table_add(win); + //elm_table_homogeneous_set(tb, EINA_TRUE); + evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ph = ph1; + elm_photo_size_set(ph, 40); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 0, 1, 1); + evas_object_show(ph); + + ph = ph2; + elm_photo_size_set(ph, 80); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 0, 1, 1); + evas_object_show(ph); + + ph = ph3; + elm_photo_size_set(ph, 20); + snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 1, 1, 1); + evas_object_show(ph); + + ph = ph4; + elm_photo_size_set(ph, 60); + snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 1, 1, 1); + evas_object_show(ph); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + evas_object_resize(win, 320, 300); + evas_object_show(win); +} + +void +test_toolbar3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *tb, *ph, *menu; + Evas_Object *ph1, *ph2, *ph3, *ph4; + Elm_Object_Item *tb_it; + Elm_Object_Item *menu_it; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("toolbar3", "Toolbar 3"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + tb = elm_toolbar_add(win); + elm_toolbar_homogeneous_set(tb, EINA_FALSE); + elm_toolbar_shrink_mode_set(tb, ELM_TOOLBAR_SHRINK_NONE); + evas_object_size_hint_weight_set(tb, 0.0, 0.0); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, 0.0); + + ph1 = elm_photo_add(win); + ph2 = elm_photo_add(win); + ph3 = elm_photo_add(win); + ph4 = elm_photo_add(win); + + tb_it = elm_toolbar_item_append(tb, "document-print", "Hello", _tb_sel1_cb, ph1); + elm_object_item_disabled_set(tb_it, EINA_TRUE); + elm_toolbar_item_priority_set(tb_it, EINA_FALSE); + + tb_it = elm_toolbar_item_append(tb, "folder-new", "World", _tb_sel2_cb, ph1); + elm_toolbar_item_priority_set(tb_it, -200); + + tb_it = elm_toolbar_item_append(tb, "object-rotate-right", "H", _tb_sel3_cb, ph4); + elm_toolbar_item_priority_set(tb_it, EINA_TRUE); + + tb_it = elm_toolbar_item_append(tb, "mail-send", "Comes", _tb_sel4_cb, ph4); + elm_toolbar_item_priority_set(tb_it, -10); + + tb_it = elm_toolbar_item_append(tb, "clock", "Elementary", _tb_sel5_cb, ph4); + elm_toolbar_item_priority_set(tb_it, 50); + + tb_it = elm_toolbar_item_append(tb, "refresh", "Menu", NULL, NULL); + elm_toolbar_item_menu_set(tb_it, EINA_TRUE); + elm_toolbar_item_priority_set(tb_it, 9999); + elm_toolbar_menu_parent_set(tb, win); + menu = elm_toolbar_item_menu_get(tb_it); + + elm_menu_item_add(menu, NULL, "edit-cut", "Shrink", _tb_sel3_cb, ph4); + menu_it = elm_menu_item_add(menu, NULL, "edit-copy", "Mode", _tb_sel4_cb, ph4); + elm_menu_item_add(menu, menu_it, "edit-paste", "is set to", _tb_sel4_cb, ph4); + elm_menu_item_add(menu, NULL, "edit-delete", "None", _tb_sel5_cb, ph4); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ph = ph1; + elm_photo_size_set(ph, 40); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 0, 1, 1); + evas_object_show(ph); + + ph = ph2; + elm_photo_size_set(ph, 80); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 0, 1, 1); + evas_object_show(ph); + + ph = ph3; + elm_photo_size_set(ph, 20); + snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 1, 1, 1); + evas_object_show(ph); + + ph = ph4; + elm_photo_size_set(ph, 60); + snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 1, 1, 1); + evas_object_show(ph); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + evas_object_resize(win, 320, 300); + evas_object_show(win); +} + +/* The same test of toolbar, but using hide shrink mode instead of menu */ +void +test_toolbar4(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *tb, *ph, *menu; + Evas_Object *ph1, *ph2, *ph3, *ph4; + Elm_Object_Item *tb_it; + Elm_Object_Item *menu_it; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("toolbar4", "Toolbar 4"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + tb = elm_toolbar_add(win); + elm_toolbar_homogeneous_set(tb, EINA_FALSE); + elm_toolbar_shrink_mode_set(tb, ELM_TOOLBAR_SHRINK_HIDE); + evas_object_size_hint_weight_set(tb, 0.0, 0.0); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, 0.0); + + ph1 = elm_photo_add(win); + ph2 = elm_photo_add(win); + ph3 = elm_photo_add(win); + ph4 = elm_photo_add(win); + + tb_it = elm_toolbar_item_append(tb, "document-print", "Hello", _tb_sel1_cb, ph1); + elm_object_item_disabled_set(tb_it, EINA_TRUE); + elm_toolbar_item_priority_set(tb_it, 100); + + tb_it = elm_toolbar_item_append(tb, "folder-new", "World", _tb_sel2_cb, ph1); + elm_toolbar_item_priority_set(tb_it, -100); + + tb_it = elm_toolbar_item_append(tb, "object-rotate-right", "H", _tb_sel3_cb, ph4); + elm_toolbar_item_priority_set(tb_it, 150); + + tb_it = elm_toolbar_item_append(tb, "mail-send", "Comes", _tb_sel4_cb, ph4); + elm_toolbar_item_priority_set(tb_it, 0); + + tb_it = elm_toolbar_item_append(tb, "clock", "Elementary", _tb_sel5_cb, ph4); + elm_toolbar_item_priority_set(tb_it, -200); + + tb_it = elm_toolbar_item_append(tb, "refresh", "Menu", NULL, NULL); + elm_toolbar_item_menu_set(tb_it, EINA_TRUE); + elm_toolbar_item_priority_set(tb_it, -9999); + elm_toolbar_menu_parent_set(tb, win); + menu = elm_toolbar_item_menu_get(tb_it); + + elm_menu_item_add(menu, NULL, "edit-cut", "Shrink", _tb_sel3_cb, ph4); + menu_it = elm_menu_item_add(menu, NULL, "edit-copy", "Mode", _tb_sel4_cb, ph4); + elm_menu_item_add(menu, menu_it, "edit-paste", "is set to", _tb_sel4_cb, ph4); + elm_menu_item_add(menu, NULL, "edit-delete", "Menu", _tb_sel5_cb, ph4); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ph = ph1; + elm_photo_size_set(ph, 40); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 0, 1, 1); + evas_object_show(ph); + + ph = ph2; + elm_photo_size_set(ph, 80); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 0, 1, 1); + evas_object_show(ph); + + ph = ph3; + elm_photo_size_set(ph, 20); + snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 1, 1, 1); + evas_object_show(ph); + + ph = ph4; + elm_photo_size_set(ph, 60); + snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 1, 1, 1); + evas_object_show(ph); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + evas_object_resize(win, 320, 300); + evas_object_show(win); +} + +/* Toolbar with multiple state buttons */ +void +test_toolbar5(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *tb, *ph, *menu; + Evas_Object *ph1, *ph2, *ph3, *ph4; + Elm_Object_Item *tb_it; + Elm_Object_Item *menu_it; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("toolbar5", "Toolbar 5"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + tb = elm_toolbar_add(win); + elm_toolbar_homogeneous_set(tb, EINA_FALSE); + elm_toolbar_shrink_mode_set(tb, ELM_TOOLBAR_SHRINK_MENU); + evas_object_size_hint_weight_set(tb, 0.0, 0.0); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, 0.0); + elm_toolbar_select_mode_set(tb, ELM_OBJECT_SELECT_MODE_NONE); + + ph1 = elm_photo_add(win); + ph2 = elm_photo_add(win); + ph3 = elm_photo_add(win); + ph4 = elm_photo_add(win); + + tb_it = elm_toolbar_item_append(tb, "document-print", "Hello", _tb_sel1_cb, ph1); + elm_object_item_disabled_set(tb_it, EINA_TRUE); + elm_toolbar_item_priority_set(tb_it, 100); + + snprintf(buf, sizeof(buf), "%s/images/icon_04.png", elm_app_data_dir_get()); + tb_it = elm_toolbar_item_append(tb, buf, "World", _tb_sel2_cb, ph1); + elm_toolbar_item_priority_set(tb_it, -100); + + tb_it = elm_toolbar_item_append(tb, "object-rotate-right", "H", _tb_sel3a_cb, ph4); + elm_toolbar_item_state_add(tb_it, "object-rotate-left", "H2", _tb_sel3b_cb, ph4); + elm_toolbar_item_priority_set(tb_it, 150); + + tb_it = elm_toolbar_item_append(tb, "mail-send", "Comes", _tb_sel4a_cb, ph4); + elm_toolbar_item_state_add(tb_it, "emptytrash", "Comes2", _tb_sel4a_cb, ph4); + elm_toolbar_item_state_add(tb_it, "trashcan_full", "Comes3", _tb_sel4a_cb, ph4); + elm_toolbar_item_priority_set(tb_it, 0); + + tb_it = elm_toolbar_item_append(tb, "clock", "Elementary", _tb_sel5_cb, ph4); + elm_toolbar_item_priority_set(tb_it, -200); + + tb_it = elm_toolbar_item_append(tb, "refresh", "Menu", NULL, NULL); + elm_toolbar_item_menu_set(tb_it, EINA_TRUE); + elm_toolbar_item_priority_set(tb_it, -9999); + elm_toolbar_menu_parent_set(tb, win); + menu = elm_toolbar_item_menu_get(tb_it); + + elm_menu_item_add(menu, NULL, "edit-cut", "Shrink", _tb_sel3_cb, ph4); + menu_it = elm_menu_item_add(menu, NULL, "edit-copy", "Mode", _tb_sel4_cb, ph4); + elm_menu_item_add(menu, menu_it, "edit-paste", "is set to", _tb_sel4_cb, ph4); + elm_menu_item_add(menu, NULL, "edit-delete", "Menu", _tb_sel5_cb, ph4); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ph = ph1; + elm_photo_size_set(ph, 40); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 0, 1, 1); + evas_object_show(ph); + + ph = ph2; + elm_photo_size_set(ph, 80); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 0, 1, 1); + evas_object_show(ph); + + ph = ph3; + elm_photo_size_set(ph, 20); + snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 1, 1, 1); + evas_object_show(ph); + + ph = ph4; + elm_photo_size_set(ph, 60); + snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 1, 1, 1); + evas_object_show(ph); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + evas_object_resize(win, 320, 300); + evas_object_show(win); +} + +void +test_toolbar_vertical(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *tb, *ph, *menu; + Evas_Object *ph1, *ph2, *ph3, *ph4; + Elm_Object_Item *tb_it; + Elm_Object_Item *menu_it; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("toolbar-vertical", "Toolbar Vertical"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + tb = elm_toolbar_add(win); + elm_toolbar_horizontal_set(tb, EINA_FALSE); + elm_toolbar_shrink_mode_set(tb, ELM_TOOLBAR_SHRINK_MENU); + evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ph1 = elm_photo_add(win); + ph2 = elm_photo_add(win); + ph3 = elm_photo_add(win); + ph4 = elm_photo_add(win); + + tb_it = elm_toolbar_item_append(tb, "document-print", "Hello", _tb_sel1_cb, ph1); + elm_object_item_disabled_set(tb_it, EINA_TRUE); + elm_toolbar_item_priority_set(tb_it, 100); + + tb_it = elm_toolbar_item_append(tb, "folder-new", "World", _tb_sel2_cb, ph1); + elm_toolbar_item_priority_set(tb_it, -100); + + tb_it = elm_toolbar_item_append(tb, "object-rotate-right", "H", _tb_sel3_cb, ph4); + elm_toolbar_item_priority_set(tb_it, 150); + + tb_it = elm_toolbar_item_append(tb, "mail-send", "Comes", _tb_sel4_cb, ph4); + elm_toolbar_item_priority_set(tb_it, 0); + + tb_it = elm_toolbar_item_append(tb, "clock", "Elementary", _tb_sel5_cb, ph4); + elm_toolbar_item_priority_set(tb_it, -200); + + tb_it = elm_toolbar_item_append(tb, "refresh", "Menu", NULL, NULL); + elm_toolbar_item_menu_set(tb_it, EINA_TRUE); + elm_toolbar_item_priority_set(tb_it, -9999); + elm_toolbar_menu_parent_set(tb, win); + menu = elm_toolbar_item_menu_get(tb_it); + + elm_menu_item_add(menu, NULL, "edit-cut", "Shrink", _tb_sel3_cb, ph4); + menu_it = elm_menu_item_add(menu, NULL, "edit-copy", "Mode", _tb_sel4_cb, ph4); + elm_menu_item_add(menu, menu_it, "edit-paste", "is set to", _tb_sel4_cb, ph4); + elm_menu_item_add(menu, NULL, "edit-delete", "Menu", _tb_sel5_cb, ph4); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ph = ph1; + elm_photo_size_set(ph, 40); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 0, 1, 1); + evas_object_show(ph); + + ph = ph2; + elm_photo_size_set(ph, 80); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 0, 1, 1); + evas_object_show(ph); + + ph = ph3; + elm_photo_size_set(ph, 20); + snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 1, 1, 1); + evas_object_show(ph); + + ph = ph4; + elm_photo_size_set(ph, 60); + snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 1, 1, 1); + evas_object_show(ph); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + evas_object_resize(win, 320, 300); + evas_object_show(win); +} + +void +test_toolbar6(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *tb, *ph, *menu; + Evas_Object *ph1, *ph2, *ph3, *ph4; + Elm_Object_Item *tb_it; + Elm_Object_Item *menu_it; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("toolbar6", "Toolbar 6"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + tb = elm_toolbar_add(win); + elm_object_style_set(tb, "item_horizontal"); + elm_toolbar_homogeneous_set(tb, EINA_FALSE); + elm_toolbar_shrink_mode_set(tb, ELM_TOOLBAR_SHRINK_MENU); + evas_object_size_hint_weight_set(tb, 0.0, 0.0); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, 0.0); + + ph1 = elm_photo_add(win); + ph2 = elm_photo_add(win); + ph3 = elm_photo_add(win); + ph4 = elm_photo_add(win); + + tb_it = elm_toolbar_item_append(tb, "document-print", "Hello", _tb_sel1_cb, ph1); + elm_object_item_disabled_set(tb_it, EINA_TRUE); + elm_toolbar_item_priority_set(tb_it, 100); + + tb_it = elm_toolbar_item_append(tb, "folder-new", "World", _tb_sel2_cb, ph1); + elm_toolbar_item_priority_set(tb_it, -100); + + tb_it = elm_toolbar_item_append(tb, "object-rotate-right", "H", _tb_sel3_cb, ph4); + elm_toolbar_item_priority_set(tb_it, 150); + + tb_it = elm_toolbar_item_append(tb, "mail-send", "Comes", _tb_sel4_cb, ph4); + elm_toolbar_item_priority_set(tb_it, 0); + + tb_it = elm_toolbar_item_append(tb, "clock", "Elementary", _tb_sel5_cb, ph4); + elm_toolbar_item_priority_set(tb_it, -200); + + tb_it = elm_toolbar_item_append(tb, "refresh", "Menu", NULL, NULL); + elm_toolbar_item_menu_set(tb_it, EINA_TRUE); + elm_toolbar_item_priority_set(tb_it, -9999); + elm_toolbar_menu_parent_set(tb, win); + menu = elm_toolbar_item_menu_get(tb_it); + + elm_menu_item_add(menu, NULL, "edit-cut", "Shrink", _tb_sel3_cb, ph4); + menu_it = elm_menu_item_add(menu, NULL, "edit-copy", "Mode", _tb_sel4_cb, ph4); + elm_menu_item_add(menu, menu_it, "edit-paste", "is set to", _tb_sel4_cb, ph4); + elm_menu_item_add(menu, NULL, "edit-delete", "Menu", _tb_sel5_cb, ph4); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + tb = elm_table_add(win); + //elm_table_homogeneous_set(tb, EINA_TRUE); + evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ph = ph1; + elm_photo_size_set(ph, 40); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 0, 1, 1); + evas_object_show(ph); + + ph = ph2; + elm_photo_size_set(ph, 80); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 0, 1, 1); + evas_object_show(ph); + + ph = ph3; + elm_photo_size_set(ph, 20); + snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 1, 1, 1); + evas_object_show(ph); + + ph = ph4; + elm_photo_size_set(ph, 60); + snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 1, 1, 1); + evas_object_show(ph); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + evas_object_resize(win, 320, 300); + evas_object_show(win); +} + +void +test_toolbar7(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *tb, *ph, *sl; + Evas_Object *ph1, *ph2, *ph3, *ph4; + Elm_Object_Item *tb_it; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("toolbar7", "Toolbar 7"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + tb = elm_toolbar_add(win); + elm_toolbar_homogeneous_set(tb, EINA_FALSE); + elm_toolbar_shrink_mode_set(tb, ELM_TOOLBAR_SHRINK_EXPAND); + elm_toolbar_transverse_expanded_set(tb, EINA_TRUE); + elm_toolbar_standard_priority_set(tb, 0); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ph1 = elm_photo_add(win); + ph2 = elm_photo_add(win); + ph3 = elm_photo_add(win); + ph4 = elm_photo_add(win); + + tb_it = elm_toolbar_item_append(tb, "document-print", "Hello", _tb_sel1_cb, ph1); + elm_object_item_disabled_set(tb_it, EINA_TRUE); + elm_toolbar_item_priority_set(tb_it, -100); + + elm_toolbar_item_separator_set(elm_toolbar_item_append(tb, NULL, NULL, NULL, NULL), EINA_TRUE); + + tb_it = elm_toolbar_item_append(tb, "folder-new", "World", _tb_sel2_cb, ph1); + elm_toolbar_item_priority_set(tb_it, 100); + + elm_toolbar_item_separator_set(elm_toolbar_item_append(tb, NULL, NULL, NULL, NULL), EINA_TRUE); + + tb_it = elm_toolbar_item_append(tb, "object-rotate-right", "H", _tb_sel3_cb, ph4); + elm_toolbar_item_priority_set(tb_it, -150); + + elm_toolbar_item_separator_set(elm_toolbar_item_append(tb, NULL, NULL, NULL, NULL), EINA_TRUE); + + sl = elm_slider_add(win); + evas_object_size_hint_min_set(sl, 100, 50); + tb_it = elm_toolbar_item_append(tb, NULL, NULL, NULL, NULL); + elm_object_item_part_content_set(tb_it, "object", sl); + + elm_toolbar_item_priority_set(tb_it, 500); + + elm_toolbar_item_separator_set(elm_toolbar_item_append(tb, NULL, NULL, NULL, NULL), EINA_TRUE); + + tb_it = elm_toolbar_item_append(tb, "mail-send", "Comes", _tb_sel4_cb, ph4); + elm_toolbar_item_priority_set(tb_it, -200); + + elm_toolbar_item_separator_set(elm_toolbar_item_append(tb, NULL, NULL, NULL, NULL), EINA_TRUE); + + tb_it = elm_toolbar_item_append(tb, "edit-cut", "Shrink", _tb_sel4_cb, ph4); + elm_toolbar_item_priority_set(tb_it, -200); + + elm_toolbar_item_separator_set(elm_toolbar_item_append(tb, NULL, NULL, NULL, NULL), EINA_TRUE); + + tb_it = elm_toolbar_item_append(tb, "edit-copy", "Mode", _tb_sel4_cb, ph4); + elm_toolbar_item_priority_set(tb_it, -200); + + elm_toolbar_item_separator_set(elm_toolbar_item_append(tb, NULL, NULL, NULL, NULL), EINA_TRUE); + + tb_it = elm_toolbar_item_append(tb, "edit-paste", "is set to", _tb_sel4_cb, ph4); + elm_toolbar_item_priority_set(tb_it, -200); + + elm_toolbar_item_separator_set(elm_toolbar_item_append(tb, NULL, NULL, NULL, NULL), EINA_TRUE); + + tb_it = elm_toolbar_item_append(tb, "edit-delete", "Menu", _tb_sel4_cb, ph4); + elm_toolbar_item_priority_set(tb_it, 200); + + elm_toolbar_item_separator_set(elm_toolbar_item_append(tb, NULL, NULL, NULL, NULL), EINA_TRUE); + + tb_it = elm_toolbar_item_append(tb, "mail-send", "Comes", _tb_sel4_cb, ph4); + elm_toolbar_item_priority_set(tb_it, 200); + + elm_toolbar_item_separator_set(elm_toolbar_item_append(tb, NULL, NULL, NULL, NULL), EINA_TRUE); + + tb_it = elm_toolbar_item_append(tb, "clock", "Elementary", _tb_sel5_cb, ph4); + elm_toolbar_item_priority_set(tb_it, -300); + + elm_object_item_text_set(elm_toolbar_more_item_get(tb), "Open"); + + evas_object_smart_callback_add(tb, "clicked", toolbar_clicked_cb, NULL); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ph = ph1; + elm_photo_size_set(ph, 80); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 0, 1, 1); + evas_object_show(ph); + + ph = ph2; + elm_photo_size_set(ph, 160); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 0, 1, 1); + evas_object_show(ph); + + ph = ph3; + elm_photo_size_set(ph, 40); + snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 1, 1, 1); + evas_object_show(ph); + + ph = ph4; + elm_photo_size_set(ph, 120); + snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 1, 1, 1); + evas_object_show(ph); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + evas_object_resize(win, 420, 250); + evas_object_show(win); +} + +void +test_toolbar8(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *tb, *ph; + Evas_Object *ph1, *ph2, *ph3, *ph4; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("toolbar8", "Toolbar 8"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + elm_win_resize_object_add(win, bx); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx); + + tb = elm_toolbar_add(win); + elm_toolbar_homogeneous_set(tb, EINA_FALSE); + elm_toolbar_shrink_mode_set(tb, ELM_TOOLBAR_SHRINK_EXPAND); + elm_toolbar_transverse_expanded_set(tb, EINA_TRUE); + elm_toolbar_reorder_mode_set(tb, EINA_TRUE); + elm_toolbar_select_mode_set(tb, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_object_style_set(tb, "item_centered"); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ph1 = elm_photo_add(win); + ph2 = elm_photo_add(win); + ph3 = elm_photo_add(win); + ph4 = elm_photo_add(win); + + elm_toolbar_item_append(tb, "document-print", "Hello", _tb_sel1_cb, ph1); + elm_toolbar_item_append(tb, "folder-new", "World", _tb_sel2_cb, ph1); + elm_toolbar_item_append(tb, "object-rotate-right", "H", _tb_sel3_cb, ph4); + elm_toolbar_item_append(tb, "mail-send", "Comes", _tb_sel4_cb, ph4); + elm_toolbar_item_append(tb, "edit-cut", "Shrink", _tb_sel4_cb, ph4); + elm_toolbar_item_append(tb, "edit-copy", "Mode", _tb_sel4_cb, ph4); + elm_toolbar_item_append(tb, "edit-paste", "is set to", _tb_sel4_cb, ph4); + elm_toolbar_item_append(tb, "edit-delete", "Menu", _tb_sel4_cb, ph4); + elm_toolbar_item_append(tb, "clock", "Elementary", _tb_sel5_cb, ph4); + + evas_object_smart_callback_add(tb, "clicked", toolbar_clicked_cb, NULL); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ph = ph1; + elm_photo_size_set(ph, 80); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 0, 1, 1); + evas_object_show(ph); + + ph = ph2; + elm_photo_size_set(ph, 160); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 0, 1, 1); + evas_object_show(ph); + + ph = ph3; + elm_photo_size_set(ph, 40); + snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 1, 1, 1); + evas_object_show(ph); + + ph = ph4; + elm_photo_size_set(ph, 120); + snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 1, 1, 1); + evas_object_show(ph); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + evas_object_resize(win, 420, 250); + evas_object_show(win); +} + +static void +_item_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + printf("%s: %p\n", (char *)data, event_info); +} + +static void +_test_toolbar_focus_focus_highlight_check_changed(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_win_focus_highlight_enabled_set(data, + elm_check_state_get(obj)); +} + +static void +_test_toolbar_focus_focus_animate_check_changed(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_win_focus_highlight_animate_set(data, + elm_check_state_get(obj)); +} + +static void +_test_toolbar_first_item_focus_on_first_focus_in_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_config_first_item_focus_on_first_focusin_set(elm_check_state_get(obj)); +} + +static void +_toolbar_focus_key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Evas_Event_Key_Down *ev = event_info; + printf("\n=== Key Down : %s ===\n", ev->keyname); +} + +static Ecore_Timer *timer = NULL; +static void +_test_toolbar_focus_win_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + ecore_timer_del(timer); + timer = NULL; +} + +static Eina_Bool +_focus_timer_cb(void *data) +{ + Elm_Object_Item *it = data; + elm_object_item_focus_set(it, EINA_TRUE); + timer = NULL; + + return ECORE_CALLBACK_CANCEL; +} + +static void +_test_toolbar_focus_item_set_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + ecore_timer_del(timer); + timer = ecore_timer_add(1.5, _focus_timer_cb, data); +} + +static void +_test_toolbar_focus_disable_item_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + elm_object_item_disabled_set(data, EINA_TRUE); +} + +static void +test_toolbar_focus_focus_move_policy_changed(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + int val = elm_radio_value_get(obj); + + if (val == 0) + elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_CLICK); + else if (val == 1) + elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_IN); +} + +void +test_toolbar_focus(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *toolbar, *fr, *btn, *bx_opt, *chk, *bx_mv, *rd, *rdg; + Elm_Object_Item *tb_it, *it_0, *it_3; + + win = elm_win_util_standard_add("toolbar-focus", "Toolbar Focus"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, + _test_toolbar_focus_win_del_cb, NULL); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + elm_win_focus_highlight_animate_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + btn = elm_button_add(win); + elm_object_text_set(btn, "Up"); + elm_box_pack_end(bx, btn); + evas_object_show(btn); + + toolbar = elm_toolbar_add(win); + elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_SCROLL); + evas_object_size_hint_align_set(toolbar, EVAS_HINT_FILL, 0.0); + it_0 = elm_toolbar_item_append(toolbar, "document-print", "Print", NULL, NULL); + elm_toolbar_item_append(toolbar, "folder-new", "Folder", NULL, NULL); + it_3 = elm_toolbar_item_append(toolbar, "clock", "Clock", NULL, NULL); + elm_toolbar_item_append(toolbar, "refresh", "Update", NULL, NULL); + elm_toolbar_item_append(toolbar, "folder-new", "Folder", NULL, NULL); + elm_toolbar_item_append(toolbar, "clock", "Clock", NULL, NULL); + tb_it = elm_toolbar_item_append(toolbar, "document-print", "Print", NULL, NULL); + elm_object_item_disabled_set(tb_it, EINA_TRUE); + elm_toolbar_item_append(toolbar, "folder-new", "Folder", NULL, NULL); + elm_toolbar_item_append(toolbar, "refresh", "Update", NULL, NULL); + elm_toolbar_item_append(toolbar, "folder-new", "Folder", NULL, NULL); + elm_toolbar_item_append(toolbar, "clock", "Clock", NULL, NULL); + elm_toolbar_item_append(toolbar, "document-print", "Print", NULL, NULL); + elm_toolbar_item_append(toolbar, "folder-new", "Folder", NULL, NULL); + elm_toolbar_item_append(toolbar, "refresh", "Update", NULL, NULL); + elm_toolbar_item_append(toolbar, "folder-new", "Folder", NULL, NULL); + elm_box_pack_end(bx, toolbar); + evas_object_show(toolbar); + evas_object_smart_callback_add(toolbar, "clicked", _item_cb, "clicked"); + evas_object_smart_callback_add(toolbar, "item,focused", _item_cb, "item,focused"); + evas_object_smart_callback_add(toolbar, "item,unfocused", _item_cb, "item,unfcoused"); + evas_object_event_callback_add(toolbar, EVAS_CALLBACK_KEY_DOWN, _toolbar_focus_key_down_cb, NULL); + + btn = elm_button_add(win); + elm_object_text_set(btn, "Down"); + elm_box_pack_end(bx, btn); + evas_object_show(btn); + + //Options + fr = elm_frame_add(bx); + elm_object_text_set(fr, "Options"); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + bx_opt = elm_box_add(fr); + elm_box_horizontal_set(bx_opt, EINA_TRUE); + elm_object_content_set(fr, bx_opt); + evas_object_show(bx_opt); + + chk = elm_check_add(bx_opt); + elm_object_text_set(chk, "Focus Highlight"); + elm_check_state_set(chk, EINA_TRUE); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx_opt, chk); + evas_object_show(chk); + evas_object_smart_callback_add(chk, "changed", + _test_toolbar_focus_focus_highlight_check_changed, + win); + + chk = elm_check_add(bx_opt); + elm_object_text_set(chk, "Focus Animation"); + elm_check_state_set(chk, EINA_TRUE); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx_opt, chk); + evas_object_show(chk); + evas_object_smart_callback_add(chk, "changed", + _test_toolbar_focus_focus_animate_check_changed, + win); + + chk = elm_check_add(bx_opt); + elm_object_text_set(chk, "First item focus on first focus in"); + elm_check_state_set(chk, elm_config_first_item_focus_on_first_focusin_get()); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx_opt, chk); + evas_object_show(chk); + evas_object_smart_callback_add(chk, "changed", + _test_toolbar_first_item_focus_on_first_focus_in_cb, + win); + + // Focus Autoscroll Mode + fr = _focus_autoscroll_mode_frame_create(bx); + elm_box_pack_end(bx, fr); + + // Focus movement policy + fr = elm_frame_add(bx); + elm_object_text_set(fr, "Focus Movement Policy"); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + bx_mv = elm_box_add(fr); + elm_box_horizontal_set(bx_mv, EINA_TRUE); + elm_object_content_set(fr, bx_mv); + evas_object_show(bx_mv); + + rdg = rd = elm_radio_add(bx_mv); + elm_object_text_set(rd, "Focus Move by Click"); + elm_radio_state_value_set(rd, 0); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(rd, "changed", + test_toolbar_focus_focus_move_policy_changed, + NULL); + elm_box_pack_end(bx_mv, rd); + evas_object_show(rd); + + rd = elm_radio_add(bx_mv); + elm_object_text_set(rd, "Focus Move by Mouse-In"); + elm_radio_group_add(rd, rdg); + elm_radio_state_value_set(rd, 1); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(rd, "changed", + test_toolbar_focus_focus_move_policy_changed, + NULL); + elm_box_pack_end(bx_mv, rd); + evas_object_show(rd); + + fr = elm_frame_add(bx); + elm_object_text_set(fr, "Focus"); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + bx_opt = elm_box_add(fr); + elm_object_content_set(fr, bx_opt); + evas_object_show(bx_opt); + + btn = elm_button_add(bx_opt); + elm_object_text_set(btn, "Set focus to 3rd toolbar item after 1.5 seconds."); + evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx_opt, btn); + evas_object_show(btn); + evas_object_smart_callback_add(btn, "clicked", + _test_toolbar_focus_item_set_btn_cb, + it_3); + + btn = elm_button_add(bx_opt); + elm_object_text_set(btn, "Disable 1st item."); + evas_object_size_hint_weight_set(btn, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx_opt, btn); + evas_object_show(btn); + evas_object_smart_callback_add(btn, "clicked", + _test_toolbar_focus_disable_item_btn_cb, + it_0); + + evas_object_resize(win, 420, 200); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_tooltip.c b/src/bin/elementary/test_tooltip.c new file mode 100644 index 0000000000..23290671e8 --- /dev/null +++ b/src/bin/elementary/test_tooltip.c @@ -0,0 +1,745 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +typedef struct _Testitem +{ + Elm_Object_Item *item; + const char *path; + int mode; + int onoff; +} Testitem; + +static Elm_Gengrid_Item_Class gic; + +char * +grdt_lbl_get(void *data, + Evas_Object *obj EINA_UNUSED, + const char *part EINA_UNUSED) +{ + const Testitem *ti = data; + char buf[256]; + snprintf(buf, sizeof(buf), "Photo %s", ti->path); + return strdup(buf); +} + +Evas_Object * +grdt_content_get(void *data, + Evas_Object *obj, + const char *part) +{ + const Testitem *ti = data; + if (!strcmp(part, "elm.swallow.icon")) + { + Evas_Object *icon = elm_bg_add(obj); + elm_bg_file_set(icon, ti->path, NULL); + evas_object_size_hint_aspect_set(icon, + EVAS_ASPECT_CONTROL_VERTICAL, + 1, 1); + evas_object_show(icon); + return icon; + } + return NULL; +} + +static Elm_Genlist_Item_Class itct; + +static void +gltt_exp(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + Elm_Object_Item *glit = event_info; + Evas_Object *gl = elm_object_item_widget_get(glit); + int val = (int)(uintptr_t) elm_object_item_data_get(glit); + Elm_Object_Item *glit1, *glit2, *glit3; + + val *= 10; + glit1 = elm_genlist_item_append(gl, &itct, (void *)(uintptr_t) (val + 1), glit, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + glit2 = elm_genlist_item_append(gl, &itct, (void *)(uintptr_t) (val + 2), glit, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + glit3 = elm_genlist_item_append(gl, &itct, (void *)(uintptr_t) (val + 3), glit, + ELM_GENLIST_ITEM_TREE, NULL, NULL); + + elm_genlist_item_tooltip_text_set(glit1, "Testing A"); + elm_genlist_item_tooltip_text_set(glit2, "Testing B"); + elm_genlist_item_tooltip_text_set(glit3, "Testing C"); +} + +static void +gltt_con(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + Elm_Object_Item *glit = event_info; + elm_genlist_item_subitems_clear(glit); +} + +static void +gltt_exp_req(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + Elm_Object_Item *glit = event_info; + elm_genlist_item_expanded_set(glit, EINA_TRUE); +} + +static void +gltt_con_req(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + Elm_Object_Item *glit = event_info; + elm_genlist_item_expanded_set(glit, EINA_FALSE); +} + +char * +gltt_text_get(void *data, + Evas_Object *obj EINA_UNUSED, + const char *part EINA_UNUSED) +{ + char buf[256]; + snprintf(buf, sizeof(buf), "Item mode %i", (int)(uintptr_t)data); + return strdup(buf); +} + +static Evas_Object * +_tt_item_icon(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + Evas_Object *tt, + void *item EINA_UNUSED) +{ + Evas_Object *ic = elm_icon_add(tt); + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", + elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_resize(ic, 64, 64); + return ic; +} + +static Evas_Object * +_tt_item_icon2(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + Evas_Object *tt, + void *item EINA_UNUSED) +{ + Evas_Object *ic = elm_icon_add(tt); + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + return ic; +} + +static Evas_Object * +_tt_item_icon3(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + Evas_Object *tt, + void *item EINA_UNUSED) +{ + int w, h, sw, sh; + Evas_Object *ic = elm_icon_add(tt); + + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/images/insanely_huge_test_image.jpg", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_object_size_get(ic, &w, &h); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + elm_win_screen_size_get(tt, NULL, NULL, &sw, &sh); + if ((w > sw) || (h > sh)) + { + float sc = 0; + if ((float)w / (float)sw >= 0.8) + sc = ((float)sw * 0.8) / (float)w; + else if ((float)h / (float)sh >= 0.8) + sc = ((float)sh * 0.8) / (float)h; + if (sc) elm_object_scale_set(ic, sc); + } + return ic; +} + +static Evas_Object * +_tt_item_label(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + Evas_Object *tt, + void *item EINA_UNUSED) +{ + Evas_Object *l = elm_label_add(tt); + elm_object_text_set(l, "Something useful here?<ps/>" + "No probably not, but this is a super long label<ps/>" + "which probably breaks on your system, now doesn't it?<ps/>" + "Yeah, I thought so."); + elm_label_line_wrap_set(l, ELM_WRAP_MIXED); + return l; +} + +static void +_tt_item_icon_del(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + // test to check for del_cb behavior! + printf("_tt_icon_del: data=%ld (== 456?), event_info=%p\n", + (long)(uintptr_t)data, event_info); +} + +static void +_tt_text_replace(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + static int count = 0; + char buf[64]; + snprintf(buf, sizeof(buf), "count=%d", count); + count++; + elm_object_tooltip_text_set(obj, buf); +} + +static void +_tt_move_freeze(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + if (elm_object_tooltip_move_freeze_get(obj) == 0) + { + elm_object_tooltip_move_freeze_push(obj); + elm_object_tooltip_text_set(obj, "Fronzen"); + } + else + { + elm_object_tooltip_move_freeze_pop(obj); + elm_object_tooltip_text_set(obj, "Free"); + } +} + +static void +_tt_orient_text_replace(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + static Elm_Tooltip_Orient orient; + + orient = elm_object_tooltip_orient_get(obj); + orient++; + if (orient >= ELM_TOOLTIP_ORIENT_LAST) + orient = ELM_TOOLTIP_ORIENT_TOP_LEFT; + switch(orient) + { + case ELM_TOOLTIP_ORIENT_TOP_LEFT: + { + elm_object_tooltip_text_set(obj, "Top Left"); + elm_object_tooltip_orient_set(obj, ELM_TOOLTIP_ORIENT_TOP_LEFT); + printf("elm_object_tooltip_orient_get :: Orientation: ELM_TOOLTIP_ORIENT_TOP_LEFT\n"); + break; + } + case ELM_TOOLTIP_ORIENT_TOP: + { + elm_object_tooltip_text_set(obj, "Top"); + elm_object_tooltip_orient_set(obj, ELM_TOOLTIP_ORIENT_TOP); + printf("elm_object_tooltip_orient_get :: Orientation: ELM_TOOLTIP_ORIENT_TOP\n"); + break; + } + case ELM_TOOLTIP_ORIENT_TOP_RIGHT: + { + elm_object_tooltip_text_set(obj, "Top Right"); + elm_object_tooltip_orient_set(obj, ELM_TOOLTIP_ORIENT_TOP_RIGHT); + printf("elm_object_tooltip_orient_get :: Orientation: ELM_TOOLTIP_ORIENT_TOP_RIGHT\n"); + break; + } + case ELM_TOOLTIP_ORIENT_LEFT: + { + elm_object_tooltip_text_set(obj, "Left"); + elm_object_tooltip_orient_set(obj, ELM_TOOLTIP_ORIENT_LEFT); + printf("elm_object_tooltip_orient_get :: Orientation: ELM_TOOLTIP_ORIENT_LEFT\n"); + break; + } + case ELM_TOOLTIP_ORIENT_CENTER: + { + elm_object_tooltip_text_set(obj, "Center"); + elm_object_tooltip_orient_set(obj, ELM_TOOLTIP_ORIENT_CENTER); + printf("elm_object_tooltip_orient_get :: Orientation: ELM_TOOLTIP_ORIENT_CENTER\n"); + break; + } + case ELM_TOOLTIP_ORIENT_RIGHT: + { + elm_object_tooltip_text_set(obj, "Right"); + elm_object_tooltip_orient_set(obj, ELM_TOOLTIP_ORIENT_RIGHT); + printf("elm_object_tooltip_orient_get :: Orientation: ELM_TOOLTIP_ORIENT_RIGHT\n"); + break; + } + case ELM_TOOLTIP_ORIENT_BOTTOM_LEFT: + { + elm_object_tooltip_text_set(obj, "Bottom Left"); + elm_object_tooltip_orient_set(obj, ELM_TOOLTIP_ORIENT_BOTTOM_LEFT); + printf("elm_object_tooltip_orient_get :: Orientation: ELM_TOOLTIP_ORIENT_BOTTOM_LEFT\n"); + break; + } + case ELM_TOOLTIP_ORIENT_BOTTOM: + { + elm_object_tooltip_text_set(obj, "Bottom"); + elm_object_tooltip_orient_set(obj, ELM_TOOLTIP_ORIENT_BOTTOM); + printf("elm_object_tooltip_orient_get :: Orientation: ELM_TOOLTIP_ORIENT_BOTTOM\n"); + break; + } + case ELM_TOOLTIP_ORIENT_BOTTOM_RIGHT: + { + elm_object_tooltip_text_set(obj, "Bottom Right"); + elm_object_tooltip_orient_set(obj, ELM_TOOLTIP_ORIENT_BOTTOM_RIGHT); + printf("elm_object_tooltip_orient_get :: Orientation: ELM_TOOLTIP_ORIENT_BOTTOM_RIGHT\n"); + break; + } + default: + { + elm_object_tooltip_text_set(obj, "No Orientation"); + elm_object_tooltip_orient_set(obj, ELM_TOOLTIP_ORIENT_NONE); + printf("elm_object_tooltip_orient_get :: Orientation: ELM_TOOLTIP_ORIENT_NONE\n"); + } + }; +} + +static void +_tt_timer_del(void *data EINA_UNUSED, + Evas *e EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Ecore_Timer *timer = evas_object_data_del(obj, "test-timer"); + if (!timer) return; + ecore_timer_del(timer); +} + +static Eina_Bool +_tt_text_replace_timer_cb(void *data) +{ + _tt_text_replace(NULL, data, NULL); + return EINA_TRUE; +} + +static void +_tt_text_replace_timed(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Ecore_Timer *timer = evas_object_data_get(obj, "test-timer"); + if (timer) + { + ecore_timer_del(timer); + evas_object_data_del(obj, "test-timer"); + elm_object_text_set(obj, "Simple text tooltip, click to start" + " changed timed"); + return; + } + + timer = ecore_timer_add(1.5, _tt_text_replace_timer_cb, obj); + evas_object_data_set(obj, "test-timer", timer); + elm_object_text_set(obj, "Simple text tooltip, click to stop changed" + " timed"); +} + +static Evas_Object * +_tt_icon(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + Evas_Object *tt) +{ + Evas_Object *ic = elm_icon_add(tt); + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", + elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_resize(ic, 64, 64); + return ic; +} + +static Evas_Object * +_tt_icon2(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + Evas_Object *tt) +{ + Evas_Object *ic = elm_icon_add(tt); + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/images/icon_00.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_resize(ic, 64, 64); + return ic; +} + +static void +_tt_icon_del(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + // test to check for del_cb behavior! + printf("_tt_icon_del: data=%ld (== 123?), event_info=%p\n", + (long)(uintptr_t)data, event_info); +} + +static Eina_Bool +_tt_icon_replace_timer_cb(void *data) +{ + static int current = 0; + + elm_object_tooltip_content_cb_set + (data, current ? _tt_icon2 : _tt_icon, NULL, NULL); + + current = !current; + return EINA_TRUE; +} + +static void +_tt_icon_replace_timed(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Ecore_Timer *timer = evas_object_data_get(obj, "test-timer"); + if (timer) + { + ecore_timer_del(timer); + evas_object_data_del(obj, "test-timer"); + elm_object_text_set(obj, "Icon tooltip, click to start changed" + " timed"); + return; + } + + timer = ecore_timer_add(1.5, _tt_icon_replace_timer_cb, obj); + evas_object_data_set(obj, "test-timer", timer); + elm_object_text_set(obj, "Icon tooltip, click to stop changed timed"); +} + +static Eina_Bool +_tt_style_replace_timer_cb(void *data) +{ + static int current = 0; + elm_object_tooltip_style_set(data, current ? NULL : "transparent"); + current = !current; + return EINA_TRUE; +} + +static void +_tt_style_replace_timed(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Ecore_Timer *timer = evas_object_data_get(obj, "test-timer"); + if (timer) + { + ecore_timer_del(timer); + evas_object_data_del(obj, "test-timer"); + elm_object_text_set(obj, "Icon tooltip style, click to start" + " changed timed"); + return; + } + + timer = ecore_timer_add(1.5, _tt_style_replace_timer_cb, obj); + evas_object_data_set(obj, "test-timer", timer); + elm_object_text_set(obj, "Icon tooltip style, click to stop changed" + " timed"); +} + +static void +_tt_visible_lock_toggle(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + static int locked = 0; + + locked = !locked; + if (locked) + { + elm_object_text_set(obj, "Locked tooltip visibility"); + elm_object_tooltip_text_set(obj, "This tooltip is locked" + " visible,<br/> click the button" + " to unlock!"); + elm_object_tooltip_show(obj); + } + else + { + elm_object_text_set(obj, "Unlocked tooltip visibility"); + elm_object_tooltip_text_set(obj, "This tooltip is unlocked" + " visible,<br/> click the button" + " to lock!"); + elm_object_tooltip_hide(obj); + } +} + +void +test_tooltip(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *tb, *bt, *se, *lst; + Elm_Object_Item *tb_it; + Elm_Object_Item *lit; + + win = elm_win_util_standard_add("tooltip", "Tooltip"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + tb = elm_toolbar_add(win); + elm_toolbar_homogeneous_set(tb, EINA_FALSE); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, 0.0); + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + tb_it = elm_toolbar_item_append(tb, NULL, "Open", NULL, NULL); + elm_object_item_tooltip_text_set(tb_it, "Opens a file"); + + tb_it = elm_toolbar_item_append(tb, NULL, "Icon", NULL, NULL); + elm_object_item_tooltip_content_cb_set + (tb_it, _tt_item_icon, (void *)456L, _tt_item_icon_del); + elm_object_item_tooltip_style_set(tb_it, "transparent"); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Simple text tooltip"); + elm_object_tooltip_text_set(bt, "Simple text tooltip"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Movement Freeze Tooltip, click to change"); + elm_object_tooltip_text_set(bt, "Free"); + evas_object_smart_callback_add(bt, "clicked", _tt_move_freeze, NULL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Orient Tooltip, click to change"); + elm_object_tooltip_text_set(bt, "Top Left"); + elm_object_tooltip_orient_set(bt, ELM_TOOLTIP_ORIENT_TOP_LEFT); + evas_object_smart_callback_add(bt, "clicked", _tt_orient_text_replace, NULL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Simple text tooltip, click to change"); + elm_object_tooltip_text_set(bt, "Initial"); + evas_object_smart_callback_add(bt, "clicked", _tt_text_replace, NULL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Simple text tooltip, click to start" + " changed timed"); + elm_object_tooltip_text_set(bt, "Initial"); + evas_object_smart_callback_add(bt, "clicked", _tt_text_replace_timed, + NULL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_event_callback_add(bt, EVAS_CALLBACK_DEL, _tt_timer_del, + NULL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Icon tooltip"); + elm_object_tooltip_content_cb_set(bt, _tt_icon, (void *)123L, + _tt_icon_del); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Icon tooltip, click to start changed timed"); + elm_object_tooltip_content_cb_set(bt, _tt_icon, NULL, NULL); + evas_object_smart_callback_add(bt, "clicked", _tt_icon_replace_timed, + NULL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_event_callback_add(bt, EVAS_CALLBACK_DEL, _tt_timer_del, + NULL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Transparent Icon tooltip"); + elm_object_tooltip_content_cb_set(bt, _tt_icon, NULL, NULL); + elm_object_tooltip_style_set(bt, "transparent"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Icon tooltip style, click to start changed" + " timed"); + elm_object_tooltip_content_cb_set(bt, _tt_icon, NULL, NULL); + evas_object_smart_callback_add(bt, "clicked", _tt_style_replace_timed, + NULL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_event_callback_add(bt, EVAS_CALLBACK_DEL, _tt_timer_del, + NULL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Unlocked tooltip visibility"); + elm_object_tooltip_text_set(bt, "This tooltip is unlocked visible,<br/>" + " click the button to lock!"); + evas_object_smart_callback_add(bt, "clicked", _tt_visible_lock_toggle, + NULL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + se = elm_entry_add(win); + elm_entry_scrollable_set(se, EINA_TRUE); + evas_object_size_hint_weight_set(se, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(se, EVAS_HINT_FILL, 0.5); + elm_scroller_policy_set(se, ELM_SCROLLER_POLICY_OFF, + ELM_SCROLLER_POLICY_OFF); + elm_object_text_set(se, "Hello, some entry here!"); + elm_object_tooltip_text_set(se, "Type something here!"); + elm_entry_single_line_set(se, EINA_TRUE); + elm_box_pack_end(bx, se); + evas_object_show(se); + + lst = elm_list_add(win); + lit = elm_list_item_append(lst, "Hello", NULL, NULL, NULL, NULL); + elm_object_item_tooltip_content_cb_set(lit, _tt_item_label, NULL, NULL); + elm_object_item_tooltip_window_mode_set(lit, EINA_TRUE); + lit = elm_list_item_append(lst, "Icon Tooltip", NULL, NULL, NULL, NULL); + elm_object_item_tooltip_content_cb_set(lit, _tt_item_icon, NULL, NULL); + lit = elm_list_item_append(lst, "Big Icon Tooltip", NULL, NULL, NULL, NULL); + elm_object_item_tooltip_content_cb_set(lit, _tt_item_icon2, NULL, NULL); + elm_object_item_tooltip_style_set(lit, "transparent"); + elm_object_item_tooltip_window_mode_set(lit, EINA_TRUE); + lit = elm_list_item_append(lst, "Insanely Big Icon Tooltip", NULL, NULL, NULL, NULL); + elm_object_item_tooltip_content_cb_set(lit, _tt_item_icon3, NULL, NULL); + elm_object_item_tooltip_style_set(lit, "transparent"); + elm_object_item_tooltip_window_mode_set(lit, EINA_TRUE); + evas_object_size_hint_weight_set(lst, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(lst, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_min_set(lst, 100, 100); + elm_list_go(lst); + elm_box_pack_end(bx, lst); + evas_object_show(lst); + + evas_object_resize(win, 320, 580); + evas_object_show(win); +} + +void +test_tooltip2(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *grid, *gl; + Elm_Object_Item *glit1, *glit2, *glit3; + static Testitem ti[144]; + int i, n; + char buf[PATH_MAX]; + const char *img[9] = + { + "panel_01.jpg", + "plant_01.jpg", + "rock_01.jpg", + "rock_02.jpg", + "sky_01.jpg", + "sky_02.jpg", + "sky_03.jpg", + "sky_04.jpg", + "wood_01.jpg", + }; + + win = elm_win_util_standard_add("tooltip2", "Tooltip 2"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + grid = elm_gengrid_add(win); + elm_gengrid_item_size_set(grid, 100, 100); + elm_gengrid_horizontal_set(grid, EINA_FALSE); + elm_gengrid_multi_select_set(grid, EINA_TRUE); + evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + + gic.item_style = "default"; + gic.func.text_get = grdt_lbl_get; + gic.func.content_get = grdt_content_get; + + n = 0; + for (i = 0; i < 9; i++) + { + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), + img[n]); + n++; + ti[i].mode = i; + ti[i].path = eina_stringshare_add(buf); + ti[i].item = elm_gengrid_item_append(grid, &gic, &(ti[i]), NULL, + NULL); + if (n % 2) + elm_gengrid_item_tooltip_text_set(ti[i].item, "Testing X"); + else + elm_gengrid_item_tooltip_text_set(ti[i].item, "Testing Y"); + if (!(i % 5)) + elm_gengrid_item_selected_set(ti[i].item, EINA_TRUE); + } + + elm_box_pack_end(bx, grid); + evas_object_show(grid); + + gl = elm_genlist_add(win); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + + itct.item_style = "default"; + itct.func.text_get = gltt_text_get; + + glit1 = elm_genlist_item_append(gl, &itct, (void *)1, NULL, + ELM_GENLIST_ITEM_TREE, NULL, NULL); + glit2 = elm_genlist_item_append(gl, &itct, (void *)2, NULL, + ELM_GENLIST_ITEM_TREE, NULL, NULL); + glit3 = elm_genlist_item_append(gl, &itct, (void *)3, NULL, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + + elm_genlist_item_tooltip_text_set(glit1, "Testing 1"); + elm_genlist_item_tooltip_text_set(glit2, "Testing 2"); + elm_genlist_item_tooltip_text_set(glit3, "Testing 3"); + + evas_object_smart_callback_add(gl, "expand,request", gltt_exp_req, gl); + evas_object_smart_callback_add(gl, "contract,request", gltt_con_req, + gl); + evas_object_smart_callback_add(gl, "expanded", gltt_exp, gl); + evas_object_smart_callback_add(gl, "contracted", gltt_con, gl); + + elm_box_pack_end(bx, gl); + evas_object_show(gl); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} + +void +test_tooltip3(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bt, *rect; + + win = elm_win_util_standard_add("tooltip3", "Tooltip 3"); + elm_win_autodel_set(win, EINA_TRUE); + + bt = elm_button_add(win); + elm_object_text_set(bt, "I have layer 200, below rect has layer 100."); + elm_object_tooltip_text_set(bt, "Can you see me?"); + evas_object_resize(bt, 250, 30); + evas_object_move(bt, 25, 135); + evas_object_layer_set(bt, 200); + evas_object_show(bt); + + rect = evas_object_rectangle_add(evas_object_evas_get(bt)); + evas_object_resize(rect, 150, 300); + evas_object_move(rect, 0, 0); + evas_object_show(rect); + evas_object_layer_set(rect, 100); + + evas_object_resize(win, 300, 300); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_transit.c b/src/bin/elementary/test_transit.c new file mode 100644 index 0000000000..17b3911d39 --- /dev/null +++ b/src/bin/elementary/test_transit.c @@ -0,0 +1,770 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +#define TWEEN_NUM 7 +#define BTN_NUM (TWEEN_NUM + 1) +#define BTN_W 50 +#define BTN_H 50 +#define WIN_H (BTN_NUM * BTN_H) +#define WIN_W WIN_H +#define TRANSIT_DURATION 1.0 + +typedef struct _Custom_Effect Custom_Effect; + +struct _Custom_Effect +{ + struct _size + { + Evas_Coord w, h; + } from, to; +}; + +static void +_transit_revert(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Elm_Transit *trans = (Elm_Transit*)data; + elm_transit_revert(trans); +} + +static void +_transit_rev_cb_del(void *data, Elm_Transit *trans EINA_UNUSED) +{ + Evas_Object *rev_bt = (Evas_Object*)data; + evas_object_smart_callback_del(rev_bt, "clicked", _transit_revert); + elm_object_disabled_set(rev_bt, EINA_TRUE); +} + +static void +_custom_op(Elm_Transit_Effect *effect, Elm_Transit *transit, double progress) +{ + if (!effect) return; + Evas_Coord w, h; + Evas_Object *obj; + const Eina_List *elist; + + Custom_Effect *custom_effect = effect; + const Eina_List *objs = elm_transit_objects_get(transit); + + if (progress < 0.5) + { + h = custom_effect->from.h + (custom_effect->to.h * progress * 2); + w = custom_effect->from.w; + } + else + { + h = custom_effect->from.h + custom_effect->to.h; + w = custom_effect->from.w + \ + (custom_effect->to.w * (progress - 0.5) * 2); + } + + EINA_LIST_FOREACH(objs, elist, obj) + evas_object_resize(obj, w, h); +} + +static Elm_Transit_Effect * +_custom_context_new(Evas_Coord from_w, Evas_Coord from_h, Evas_Coord to_w, Evas_Coord to_h) +{ + Custom_Effect *custom_effect; + + custom_effect = calloc(1, sizeof(Custom_Effect)); + if (!custom_effect) return NULL; + + custom_effect->from.w = from_w; + custom_effect->from.h = from_h; + custom_effect->to.w = to_w - from_w; + custom_effect->to.h = to_h - from_h; + + return custom_effect; +} + +static void +_custom_context_free(Elm_Transit_Effect *effect, Elm_Transit *transit EINA_UNUSED) +{ + Custom_Effect *custom_effect = effect; + free(custom_effect); +} + +static void +_transit_rotation_color(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Elm_Transit *trans; + + trans = elm_transit_add(); + elm_transit_object_add(trans, obj); + elm_transit_auto_reverse_set(trans, EINA_TRUE); + elm_transit_repeat_times_set(trans, 2); + + /* Color Effect */ + elm_transit_effect_color_add(trans, 100, 255, 100, 255, 50, 30, 50, 50); + + /* Rotation Effect */ + elm_transit_effect_rotation_add(trans, 0.0, 135.0); + + elm_transit_duration_set(trans, 5.0); + elm_transit_go(trans); +} + +static void +_transit_wipe(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Elm_Transit *trans; + + trans = elm_transit_add(); + elm_transit_object_add(trans, obj); + elm_transit_auto_reverse_set(trans, EINA_TRUE); + + elm_transit_effect_wipe_add(trans, + ELM_TRANSIT_EFFECT_WIPE_TYPE_HIDE, + ELM_TRANSIT_EFFECT_WIPE_DIR_RIGHT); + + elm_transit_duration_set(trans, 5.0); + elm_transit_go(trans); +} + +static void +_transit_del_cb(void *data, Elm_Transit *transit EINA_UNUSED) +{ + evas_object_freeze_events_set(data, EINA_FALSE); +} + +static void +_transit_image_animation(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Eina_List *images = NULL; + char buf[PATH_MAX]; + Elm_Transit *trans; + Evas_Object *ic = data; + + snprintf(buf, sizeof(buf), "%s/images/icon_19.png", elm_app_data_dir_get()); + images = eina_list_append(images, eina_stringshare_add(buf)); + + snprintf(buf, sizeof(buf), "%s/images/icon_00.png", elm_app_data_dir_get()); + images = eina_list_append(images, eina_stringshare_add(buf)); + + snprintf(buf, sizeof(buf), "%s/images/icon_11.png", elm_app_data_dir_get()); + images = eina_list_append(images, eina_stringshare_add(buf)); + + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + images = eina_list_append(images, eina_stringshare_add(buf)); + + trans = elm_transit_add(); + elm_transit_del_cb_set(trans, _transit_del_cb, obj); + elm_transit_object_add(trans, ic); + elm_transit_effect_image_animation_add(trans, images); + elm_transit_duration_set(trans, 5.0); + elm_transit_go(trans); + + evas_object_freeze_events_set(obj, EINA_TRUE); +} + +static void +_transit_resizing(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Elm_Transit *trans; + Evas_Object *rev_bt = (Evas_Object*)data; + elm_object_disabled_set(rev_bt, EINA_FALSE); + trans = elm_transit_add(); + elm_transit_object_add(trans, obj); + elm_transit_del_cb_set(trans, _transit_rev_cb_del, rev_bt); + + evas_object_smart_callback_add(rev_bt, "clicked", _transit_revert, trans); + elm_transit_effect_resizing_add(trans, 100, 50, 300, 150); + + elm_transit_duration_set(trans, 5.0); + elm_transit_go(trans); +} + +static void +_transit_flip(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Elm_Transit *trans; + Evas_Object *obj2 = data; + Evas_Object *rev_bt = (Evas_Object*)evas_object_data_get(obj, "revert"); + elm_object_disabled_set(rev_bt, EINA_FALSE); + + trans = elm_transit_add(); + elm_transit_object_add(trans, obj); + elm_transit_object_add(trans, obj2); + elm_transit_del_cb_set(trans, _transit_rev_cb_del, rev_bt); + + evas_object_smart_callback_add(rev_bt, "clicked", _transit_revert, trans); + elm_transit_effect_flip_add(trans, ELM_TRANSIT_EFFECT_FLIP_AXIS_X, EINA_TRUE); + + elm_transit_duration_set(trans, 5.0); + elm_transit_go(trans); +} + +static void +_transit_zoom(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Elm_Transit *trans; + + trans = elm_transit_add(); + Evas_Object *rev_bt = (Evas_Object*)data; + elm_object_disabled_set(rev_bt, EINA_FALSE); + elm_transit_object_add(trans, obj); + elm_transit_del_cb_set(trans, _transit_rev_cb_del, rev_bt); + + evas_object_smart_callback_add(rev_bt, "clicked", _transit_revert, trans); + elm_transit_effect_zoom_add(trans, 1.0, 3.0); + + elm_transit_duration_set(trans, 5.0); + elm_transit_go(trans); +} + +static void +_transit_blend(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Elm_Transit *trans; + Evas_Object *obj2 = data; + Evas_Object *rev_bt = (Evas_Object*)evas_object_data_get(obj, "revert"); + elm_object_disabled_set(rev_bt, EINA_FALSE); + + trans = elm_transit_add(); + elm_transit_object_add(trans, obj); + elm_transit_object_add(trans, obj2); + elm_transit_del_cb_set(trans, _transit_rev_cb_del, rev_bt); + + evas_object_smart_callback_add(rev_bt, "clicked", _transit_revert, trans); + + elm_transit_effect_blend_add(trans); + + elm_transit_duration_set(trans, 5.0); + elm_transit_go(trans); +} + +static void +_transit_fade(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Elm_Transit *trans; + Evas_Object *obj2 = data; + Evas_Object *rev_bt = (Evas_Object*)evas_object_data_get(obj, "revert"); + elm_object_disabled_set(rev_bt, EINA_FALSE); + + trans = elm_transit_add(); + elm_transit_object_add(trans, obj); + elm_transit_object_add(trans, obj2); + elm_transit_del_cb_set(trans, _transit_rev_cb_del, rev_bt); + + evas_object_smart_callback_add(rev_bt, "clicked", _transit_revert, trans); + + elm_transit_effect_fade_add(trans); + + elm_transit_duration_set(trans, 5.0); + elm_transit_go(trans); +} + +static void +_transit_resizable_flip(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Elm_Transit *trans; + Evas_Object *obj2 = data; + + trans = elm_transit_add(); + elm_transit_object_add(trans, obj); + elm_transit_object_add(trans, obj2); + + elm_transit_effect_resizable_flip_add(trans, ELM_TRANSIT_EFFECT_FLIP_AXIS_Y, EINA_TRUE); + + elm_transit_duration_set(trans, 5.0); + elm_transit_go(trans); +} + +static void +_transit_tween_del_cb(void *data, Elm_Transit *trans EINA_UNUSED) +{ + Evas_Object *btn = data; + int disabled = (int)(uintptr_t)evas_object_data_get(btn, "disabled"); + if (disabled > 0) + evas_object_data_set(btn, "disabled", (void *)(uintptr_t)(--disabled)); + if (disabled == 0) elm_object_disabled_set(btn, EINA_FALSE); +} + +static void +_transit_tween(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Elm_Transit_Tween_Mode ettm; + Elm_Transit *trans; + Evas_Coord x; + Evas_Object *bt_all = data; + int disabled; + + evas_object_geometry_get(obj, &x, NULL, NULL, NULL); + ettm = (Elm_Transit_Tween_Mode) evas_object_data_get(obj, "tween"); + + trans = elm_transit_add(); + elm_transit_tween_mode_set(trans, ettm); + elm_transit_effect_translation_add(trans, 0, 0, + ((x ? -1 : 1) * (WIN_W - BTN_W)), 0); + elm_transit_object_add(trans, obj); + elm_transit_duration_set(trans, TRANSIT_DURATION); + elm_transit_objects_final_state_keep_set(trans, EINA_TRUE); + elm_transit_del_cb_set(trans, _transit_tween_del_cb, bt_all); + elm_transit_go(trans); + + disabled = (int)(uintptr_t)evas_object_data_get(bt_all, "disabled"); + evas_object_data_set(bt_all, "disabled", (void *)(uintptr_t)(++disabled)); + elm_object_disabled_set(bt_all, EINA_TRUE); +} + +static void +_transit_tween_all(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object **bt = data; + Elm_Transit *trans; + Evas_Coord x; + int i; + + for (i = 0; i < TWEEN_NUM; i++) + { + evas_object_geometry_get(bt[i], &x, NULL, NULL, NULL); + + trans = elm_transit_add(); + elm_transit_tween_mode_set(trans, i); + elm_transit_effect_translation_add(trans, 0, 0, + ((x ? -1 : 1) * (WIN_W - BTN_W)), 0); + elm_transit_object_add(trans, bt[i]); + elm_transit_duration_set(trans, TRANSIT_DURATION); + elm_transit_objects_final_state_keep_set(trans, EINA_TRUE); + elm_transit_del_cb_set(trans, _transit_tween_del_cb, obj); + elm_transit_go(trans); + } + + elm_object_disabled_set(obj, EINA_TRUE); +} + +static void +_win_delete_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object **bt = data; + free(bt); +} + +/* Translation, Rotation, Color, Wipe, ImagemAnimation Effect */ +void +test_transit(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bt, *ic; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("transit", "Transit"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + ic = elm_image_add(win); + snprintf(buf, sizeof(buf), "%s/images/icon_11.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Image Animation"); + elm_object_part_content_set(bt, "icon", ic); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_show(ic); + evas_object_smart_callback_add(bt, "clicked", _transit_image_animation, ic); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Rotation + Color"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_smart_callback_add(bt, "clicked", + _transit_rotation_color, NULL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Wipe Effect"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_smart_callback_add(bt, "clicked", _transit_wipe, NULL); + + evas_object_resize(win, 300, 300); + evas_object_show(win); +} + +/* Resizing Effect */ +void +test_transit_resizing(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bt, *rev_bt; + + win = elm_win_util_standard_add("transit2", "Transit Resizing"); + elm_win_autodel_set(win, EINA_TRUE); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Resizing Effect"); + evas_object_show(bt); + evas_object_move(bt, 50, 100); + evas_object_resize(bt, 100, 50); + + rev_bt = elm_button_add(win); + elm_object_text_set(rev_bt, "Revert"); + evas_object_resize(rev_bt, 100, 50); + evas_object_move(rev_bt, 50, 300); + evas_object_show(rev_bt); + elm_object_disabled_set(rev_bt, EINA_TRUE); + + evas_object_smart_callback_add(bt, "clicked", _transit_resizing, rev_bt); + + evas_object_resize(win, 400, 400); + evas_object_show(win); +} + +/* Flip Effect */ +void +test_transit_flip(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bt, *bt2, *rev_bt; + + win = elm_win_util_standard_add("transit3", "Transit Flip"); + elm_win_autodel_set(win, EINA_TRUE); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Front Button - Flip Effect"); + evas_object_show(bt); + evas_object_move(bt, 50, 50); + evas_object_resize(bt, 200, 200); + + bt2 = elm_button_add(win); + elm_object_text_set(bt2, "Back Button - Flip Effect"); + evas_object_move(bt2, 50, 50); + evas_object_resize(bt2, 200, 200); + + rev_bt = elm_button_add(win); + elm_object_text_set(rev_bt, "Revert"); + evas_object_resize(rev_bt, 100, 50); + evas_object_move(rev_bt, 50, 300); + evas_object_show(rev_bt); + elm_object_disabled_set(rev_bt, EINA_TRUE); + evas_object_data_set(bt, "revert", rev_bt); + evas_object_data_set(bt2, "revert", rev_bt); + + evas_object_resize(win, 400, 400); + evas_object_show(win); + + evas_object_smart_callback_add(bt, "clicked", _transit_flip, bt2); + evas_object_smart_callback_add(bt2, "clicked", _transit_flip, bt); +} + +/* Zoom Effect */ +void +test_transit_zoom(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bt, *rev_bt; + + win = elm_win_util_standard_add("transit4", "Transit Zoom"); + elm_win_autodel_set(win, EINA_TRUE); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Zoom Effect"); + evas_object_resize(bt, 100, 50); + evas_object_move(bt, 100, 125); + evas_object_show(bt); + + rev_bt = elm_button_add(win); + elm_object_text_set(rev_bt, "Revert"); + evas_object_resize(rev_bt, 100, 50); + evas_object_move(rev_bt, 100, 250); + evas_object_show(rev_bt); + elm_object_disabled_set(rev_bt, EINA_TRUE); + + evas_object_smart_callback_add(bt, "clicked", _transit_zoom, rev_bt); + + evas_object_resize(win, 300, 300); + evas_object_show(win); +} + +/* Blend Effect */ +void +test_transit_blend(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bt, *bt2, *ic, *rev_bt; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("transit5", "Transit Blend"); + elm_win_autodel_set(win, EINA_TRUE); + + ic = elm_image_add(win); + snprintf(buf, sizeof(buf), "%s/images/rock_01.jpg", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_max_set(ic, 50, 50); + + bt = elm_button_add(win); + elm_object_part_content_set(bt, "icon", ic); + elm_object_text_set(bt, "Before Button - Blend Effect"); + evas_object_move(bt, 25, 125); + evas_object_resize(bt, 250, 50); + evas_object_show(bt); + + ic = elm_image_add(win); + snprintf(buf, sizeof(buf), "%s/images/rock_02.jpg", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_max_set(ic, 50, 50); + + bt2 = elm_button_add(win); + elm_object_part_content_set(bt2, "icon", ic); + elm_object_text_set(bt2, "After Button - Blend Effect"); + evas_object_move(bt2, 25, 125); + evas_object_resize(bt2, 250, 50); + + rev_bt = elm_button_add(win); + elm_object_text_set(rev_bt, "Revert"); + evas_object_resize(rev_bt, 100, 50); + evas_object_move(rev_bt, 50, 300); + evas_object_show(rev_bt); + elm_object_disabled_set(rev_bt, EINA_TRUE); + evas_object_data_set(bt, "revert", rev_bt); + evas_object_data_set(bt2, "revert", rev_bt); + + evas_object_resize(win, 300, 400); + evas_object_show(win); + + evas_object_smart_callback_add(bt, "clicked", _transit_blend, bt2); + evas_object_smart_callback_add(bt2, "clicked", _transit_blend, bt); +} + +/* Fade Effect */ +void +test_transit_fade(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bt, *bt2, *ic, *rev_bt; + char buf[PATH_MAX]; + + win = elm_win_util_standard_add("transit6","Transit Fade"); + elm_win_autodel_set(win, EINA_TRUE); + + ic = elm_image_add(win); + snprintf(buf, sizeof(buf), "%s/images/rock_01.jpg", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_max_set(ic, 50, 50); + + bt = elm_button_add(win); + elm_object_part_content_set(bt, "icon", ic); + elm_object_text_set(bt, "Before Button - Fade Effect"); + evas_object_move(bt, 25, 125); + evas_object_resize(bt, 250, 50); + evas_object_show(bt); + + ic = elm_image_add(win); + snprintf(buf, sizeof(buf), "%s/images/rock_02.jpg", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_max_set(ic, 50, 50); + + bt2 = elm_button_add(win); + elm_object_part_content_set(bt2, "icon", ic); + elm_object_text_set(bt2, "After Button - Fade Effect"); + evas_object_move(bt2, 25, 125); + evas_object_resize(bt2, 250, 50); + + rev_bt = elm_button_add(win); + elm_object_text_set(rev_bt, "Revert"); + evas_object_resize(rev_bt, 100, 50); + evas_object_move(rev_bt, 50, 300); + evas_object_show(rev_bt); + elm_object_disabled_set(rev_bt, EINA_TRUE); + evas_object_data_set(bt, "revert", rev_bt); + evas_object_data_set(bt2, "revert", rev_bt); + + evas_object_resize(win, 300, 400); + evas_object_show(win); + + evas_object_smart_callback_add(bt, "clicked", _transit_fade, bt2); + evas_object_smart_callback_add(bt2, "clicked", _transit_fade, bt); +} + +/* Resizable Flip Effect */ +void +test_transit_resizable_flip(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bt, *bt2; + + win = elm_win_util_standard_add("transit7", "Transit Resizable Flip"); + elm_win_autodel_set(win, EINA_TRUE); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Front Button - Resizable Flip Effect"); + evas_object_show(bt); + evas_object_move(bt, 50, 100); + evas_object_resize(bt, 250, 30); + + bt2 = elm_button_add(win); + elm_object_text_set(bt2, "Back Button - Resizable Flip Effect"); + evas_object_move(bt2, 50, 100); + evas_object_resize(bt2, 300, 200); + + evas_object_resize(win, 400, 400); + evas_object_show(win); + + evas_object_smart_callback_add(bt, "clicked", _transit_resizable_flip, bt2); + evas_object_smart_callback_add(bt2, "clicked", _transit_resizable_flip, bt); +} + +/* Custom Effect */ +void +test_transit_custom(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bt; + Elm_Transit *trans; + Elm_Transit_Effect *effect_context; + + win = elm_win_util_standard_add("transit8", "Transit Custom"); + elm_win_autodel_set(win, EINA_TRUE); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button - Custom Effect"); + evas_object_show(bt); + evas_object_move(bt, 50, 50); + evas_object_resize(bt, 150, 150); + + /* Adding Transit */ + trans = elm_transit_add(); + elm_transit_auto_reverse_set(trans, EINA_TRUE); + elm_transit_tween_mode_set(trans, ELM_TRANSIT_TWEEN_MODE_DECELERATE); + effect_context = _custom_context_new(150, 150, 50, 50); + elm_transit_object_add(trans, bt); + elm_transit_effect_add(trans, + _custom_op, effect_context, + _custom_context_free); + elm_transit_duration_set(trans, 5.0); + elm_transit_repeat_times_set(trans, -1); + elm_transit_go(trans); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Revert"); + evas_object_resize(bt, 150, 50); + evas_object_move(bt, 50, 250); + evas_object_show(bt); + evas_object_smart_callback_add(bt, "clicked", _transit_revert, trans); + + evas_object_resize(win, 400, 400); + evas_object_show(win); +} + +/* Chain Transit Effect */ +void +test_transit_chain(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bt, *bt2, *bt3, *bt4; + Elm_Transit *trans, *trans2, *trans3, *trans4; + + win = elm_win_util_standard_add("transit9", "Transit Chain"); + elm_win_autodel_set(win, EINA_TRUE); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Chain 1"); + evas_object_resize(bt, 100, 100); + evas_object_move(bt, 0, 0); + evas_object_show(bt); + + bt2 = elm_button_add(win); + elm_object_text_set(bt2, "Chain 2"); + evas_object_resize(bt2, 100, 100); + evas_object_move(bt2, 300, 0); + evas_object_show(bt2); + + bt3 = elm_button_add(win); + elm_object_text_set(bt3, "Chain 3"); + evas_object_resize(bt3, 100, 100); + evas_object_move(bt3, 300, 300); + evas_object_show(bt3); + + bt4 = elm_button_add(win); + elm_object_text_set(bt4, "Chain 4"); + evas_object_resize(bt4, 100, 100); + evas_object_move(bt4, 0, 300); + evas_object_show(bt4); + + trans = elm_transit_add(); + elm_transit_tween_mode_set(trans, ELM_TRANSIT_TWEEN_MODE_ACCELERATE); + elm_transit_effect_translation_add(trans, 0, 0, 300, 0); + elm_transit_object_add(trans, bt); + elm_transit_duration_set(trans, 1); + elm_transit_objects_final_state_keep_set(trans, EINA_TRUE); + elm_transit_go(trans); + + trans2 = elm_transit_add(); + elm_transit_tween_mode_set(trans2, ELM_TRANSIT_TWEEN_MODE_ACCELERATE); + elm_transit_effect_translation_add(trans2, 0, 0, 0, 300); + elm_transit_object_add(trans2, bt2); + elm_transit_duration_set(trans2, 1); + elm_transit_objects_final_state_keep_set(trans2, EINA_TRUE); + elm_transit_chain_transit_add(trans, trans2); + + trans3 = elm_transit_add(); + elm_transit_tween_mode_set(trans3, ELM_TRANSIT_TWEEN_MODE_ACCELERATE); + elm_transit_effect_translation_add(trans3, 0, 0, -300, 0); + elm_transit_object_add(trans3, bt3); + elm_transit_duration_set(trans3, 1); + elm_transit_objects_final_state_keep_set(trans3, EINA_TRUE); + elm_transit_chain_transit_add(trans2, trans3); + + trans4 = elm_transit_add(); + elm_transit_tween_mode_set(trans4, ELM_TRANSIT_TWEEN_MODE_ACCELERATE); + elm_transit_effect_translation_add(trans4, 0, 0, 0, -300); + elm_transit_object_add(trans4, bt4); + elm_transit_duration_set(trans4, 1); + elm_transit_objects_final_state_keep_set(trans4, EINA_TRUE); + elm_transit_chain_transit_add(trans3, trans4); + + evas_object_resize(win, 400, 400); + evas_object_show(win); +} + +/* Transit Tween Mode */ +void +test_transit_tween(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bg, *label; + Evas_Object **bt = malloc(sizeof(Evas_Object *) * BTN_NUM); + int i; + + char *modes[] = {"LINEAR", "SINUSOIDAL", "DECELERATE", "ACCELERATE", + "DIVISOR_INTERP", "BOUNCE", "SPRING"}; + + win = elm_win_add(NULL, "transit10", ELM_WIN_BASIC); + elm_win_title_set(win, "Transit Tween"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_smart_callback_add(win, "delete,request", _win_delete_cb, bt); + + bg = elm_bg_add(win); + evas_object_size_hint_min_set(bg, WIN_W, WIN_H); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + bt[TWEEN_NUM] = elm_button_add(win); + elm_object_text_set(bt[TWEEN_NUM], "Go All"); + evas_object_resize(bt[TWEEN_NUM], WIN_W, BTN_H); + evas_object_move(bt[TWEEN_NUM], 0, (WIN_H - BTN_H)); + evas_object_show(bt[TWEEN_NUM]); + evas_object_smart_callback_add(bt[TWEEN_NUM], "clicked", _transit_tween_all, + bt); + + for (i = 0; i < TWEEN_NUM; i++) + { + label = elm_label_add(win); + elm_object_text_set(label, modes[i]); + evas_object_resize(label, WIN_W, BTN_H); + evas_object_move(label, 0, (i * BTN_H)); + evas_object_show(label); + + bt[i] = elm_button_add(win); + evas_object_data_set(bt[i], "tween", (void *)(uintptr_t)i); + elm_object_text_set(bt[i], "Go"); + evas_object_resize(bt[i], BTN_W, BTN_H); + evas_object_move(bt[i], 0, (i * BTN_H)); + evas_object_show(bt[i]); + evas_object_smart_callback_add(bt[i], "clicked", _transit_tween, + bt[TWEEN_NUM]); + } + + evas_object_resize(win, WIN_W, WIN_H); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_transit_bezier.c b/src/bin/elementary/test_transit_bezier.c new file mode 100644 index 0000000000..d448666327 --- /dev/null +++ b/src/bin/elementary/test_transit_bezier.c @@ -0,0 +1,315 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +#define SEGMENT_MAX 200 +#define WIN_W 400 +#define BTN_SIZE 50 +#define WIN_H (400 + BTN_SIZE) +#define CTRL_W 15 +#define CTRL_H 15 + +typedef struct +{ + Evas *e; + Evas_Object *win; + Evas_Object *rev_btn; + Evas_Object *ctrl_pt1; + Evas_Object *ctrl_pt2; + Evas_Object *ctrl_pt1_line; + Evas_Object *ctrl_pt2_line; + Evas_Object *label; + Evas_Object *line[SEGMENT_MAX]; + Eina_Bool ctrl_pt1_down; + Eina_Bool ctrl_pt2_down; +} transit_data; + +static void +_transit_revert(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Elm_Transit *trans = (Elm_Transit*)data; + elm_transit_revert(trans); +} + +static void +v_get(transit_data *td, double *v1, double *v2, double *v3, double *v4) +{ + Evas_Coord x, w, y, h; + + //update control points values + evas_object_geometry_get(td->ctrl_pt1, &x, &y, &w, &h); + *v1 = (double) (x - (w/2)) / WIN_W; + *v2 = 1 - (double) (y - (h/2)) / (WIN_H - BTN_SIZE); + + evas_object_geometry_get(td->ctrl_pt2, &x, &y, &w, &h); + *v3 = (double) (x - (w/2)) / WIN_W; + *v4 = 1 - (double) (y - (h/2)) / (WIN_H - BTN_SIZE); +} + +static void +update_curve(transit_data *td) +{ + double v[4]; + int i = 0; + double progress; + Evas_Coord prev_x = 0, prev_y = (WIN_H - BTN_SIZE - 1); + Evas_Coord cur_x, cur_y; + double tx, ty; + char buf[256]; + + v_get(td, &v[0], &v[1], &v[2], &v[3]); + + for (i = 0; i < SEGMENT_MAX; i++) + { + progress = (((double) i) / (SEGMENT_MAX - 1)); + + tx = (pow((1 - progress), 3) * 0) + + (3 * progress * pow((1 - progress), 2) * v[0]) + + (3 * pow(progress, 2) * (1 - progress) * v[2]) + + (pow(progress, 3) * 1); + ty = (pow((1 - progress), 3) * 0) + + (3 * progress * pow((1 - progress), 2) * v[1]) + + (3 * pow(progress, 2) * (1 - progress) * v[3]) + + (pow(progress, 3) * 1); + + cur_x = (int)(tx * WIN_W); + cur_y = ((WIN_H - BTN_SIZE - 1) - ((int)(ty * (WIN_H - BTN_SIZE)))); + evas_object_line_xy_set(td->line[i], prev_x, prev_y, cur_x, cur_y); + evas_object_anti_alias_set(td->line[i], EINA_TRUE); + evas_object_color_set(td->line[i], 255, 50, 50, 255); + prev_x = cur_x; + prev_y = cur_y; + } + snprintf(buf, sizeof(buf), + "<align=left><b>Control Points:</b></br>" + "x1: %0.2f y1: %0.2f</br>" + "x2: %0.2f y2: %0.2f</align>", + v[0], v[1], v[2], v[3]); + elm_object_text_set(td->label, buf); +} + +static void +ctrl_pt1_mouse_move_cb(void *data, Evas *e EINA_UNUSED, + Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Move *ev = event_info; + transit_data *td = data; + Evas_Coord x, y, w, h; + + if (!td->ctrl_pt1_down) return; + + evas_object_geometry_get(obj, NULL, NULL, &w, &h); + + x = (ev->cur.canvas.x - (w/2)); + y = (ev->cur.canvas.y - (h/2)); + if (x < -(w/2)) x = -(w/2); + if (y < -(h/2)) y = -(h/2); + if (x > WIN_W) x = WIN_W - (w/2); + if (y > WIN_H) y = WIN_H - (h/2); + evas_object_move(obj, x, y); + evas_object_line_xy_set(td->ctrl_pt1_line, + (x + (w/2)), (y + (h/2)), 0, WIN_W); + update_curve(td); +} + +static void +ctrl_pt2_mouse_move_cb(void *data, Evas *e EINA_UNUSED, + Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Move *ev = event_info; + transit_data *td = data; + Evas_Coord x, y, w, h; + + if (!td->ctrl_pt2_down) return; + + evas_object_geometry_get(obj, NULL, NULL, &w, &h); + + x = (ev->cur.canvas.x - (w/2)); + y = (ev->cur.canvas.y - (h/2)); + if (x < -(w/2)) x = -(w/2); + if (y < -(h/2)) y = -(h/2); + if (x > WIN_W) x = WIN_W - (w/2); + if (y > WIN_H) y = WIN_H - (h/2); + evas_object_move(obj, x, y); + evas_object_line_xy_set(td->ctrl_pt2_line, + (x + (w/2)), (y + (h/2)), WIN_W, 0); + update_curve(td); +} + +static void +ctrl_pt1_mouse_down_cb(void *data, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + transit_data *td = data; + td->ctrl_pt1_down = EINA_TRUE; +} + +static void +ctrl_pt1_mouse_up_cb(void *data, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + transit_data *td = data; + td->ctrl_pt1_down = EINA_FALSE; +} + +static void +ctrl_pt2_mouse_down_cb(void *data, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + transit_data *td = data; + td->ctrl_pt2_down = EINA_TRUE; +} + +static void +ctrl_pt2_mouse_up_cb(void *data, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + transit_data *td = data; + td->ctrl_pt2_down = EINA_FALSE; +} + +static void +transit_del_cb(void *data, Elm_Transit *transit EINA_UNUSED) +{ + transit_data *td = data; + evas_object_show(td->ctrl_pt1); + evas_object_show(td->ctrl_pt2); + evas_object_show(td->ctrl_pt1_line); + evas_object_show(td->ctrl_pt2_line); + evas_object_smart_callback_del(td->rev_btn, "clicked", _transit_revert); + elm_object_disabled_set(td->rev_btn, EINA_TRUE); +} + +static void +btn_clicked_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + double v[4]; + transit_data *td = data; + v_get(td, &v[0], &v[1], &v[2], &v[3]); + + Elm_Transit *transit = elm_transit_add(); + elm_transit_object_add(transit, obj); + elm_transit_tween_mode_set(transit, ELM_TRANSIT_TWEEN_MODE_BEZIER_CURVE); + elm_transit_tween_mode_factor_n_set(transit, 4, v); + elm_transit_effect_translation_add(transit, 0, 0, (WIN_W - BTN_SIZE), 0); + elm_transit_auto_reverse_set(transit, EINA_TRUE); + elm_transit_del_cb_set(transit, transit_del_cb, td); + elm_transit_duration_set(transit, 1); + elm_transit_go(transit); + evas_object_smart_callback_add(td->rev_btn, "clicked", _transit_revert, transit); + elm_object_disabled_set(td->rev_btn, EINA_FALSE); + + evas_object_hide(td->ctrl_pt1); + evas_object_hide(td->ctrl_pt2); + evas_object_hide(td->ctrl_pt1_line); + evas_object_hide(td->ctrl_pt2_line); +} + +void +test_transit_bezier(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + static transit_data td; + char buf[PATH_MAX]; + Evas_Object *bg; + int i; + + memset(&td, 0x0, sizeof(td)); + + //Win + td.win = elm_win_add(NULL, "test", ELM_WIN_BASIC); + elm_win_title_set(td.win, "Transit Bezier"); + elm_win_autodel_set(td.win, EINA_TRUE); + + td.e = evas_object_evas_get(td.win); + + //BG. Fix window size + bg = elm_bg_add(td.win); + evas_object_size_hint_min_set(bg, WIN_W, WIN_H); + elm_win_resize_object_add(td.win, bg); + evas_object_show(bg); + + snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get()); + + //Create Lines + for (i = 0; i < SEGMENT_MAX; i++) + { + td.line[i] = evas_object_line_add(td.e); + evas_object_resize(td.line[i], WIN_W, (WIN_H - BTN_SIZE)); + evas_object_show(td.line[i]); + } + + //Control Point 1 Line + td.ctrl_pt1_line = evas_object_line_add(td.e); + evas_object_pass_events_set(td.ctrl_pt1_line, EINA_TRUE); + evas_object_resize(td.ctrl_pt1_line, WIN_W, WIN_H); + evas_object_anti_alias_set(td.ctrl_pt1_line, EINA_TRUE); + evas_object_color_set(td.ctrl_pt1_line, 0, 174, 219, 255); + evas_object_line_xy_set(td.ctrl_pt1_line, 0, WIN_W, + (100 + (CTRL_W/2)) , (300 + (CTRL_H/2))); + evas_object_show(td.ctrl_pt1_line); + + //Control Point 1 + td.ctrl_pt1 = evas_object_image_filled_add(td.e); + evas_object_image_file_set(td.ctrl_pt1, buf, NULL); + evas_object_resize(td.ctrl_pt1, CTRL_W, CTRL_H); + evas_object_move(td.ctrl_pt1, 100, 300); + evas_object_event_callback_add(td.ctrl_pt1, EVAS_CALLBACK_MOUSE_MOVE, + ctrl_pt1_mouse_move_cb, &td); + evas_object_event_callback_add(td.ctrl_pt1, EVAS_CALLBACK_MOUSE_DOWN, + ctrl_pt1_mouse_down_cb, &td); + evas_object_event_callback_add(td.ctrl_pt1, EVAS_CALLBACK_MOUSE_UP, + ctrl_pt1_mouse_up_cb, &td); + evas_object_show(td.ctrl_pt1); + + //Control Point 2 Line + td.ctrl_pt2_line = evas_object_line_add(td.e); + evas_object_pass_events_set(td.ctrl_pt2_line, EINA_TRUE); + evas_object_resize(td.ctrl_pt2_line, WIN_W, WIN_H); + evas_object_anti_alias_set(td.ctrl_pt2_line, EINA_TRUE); + evas_object_color_set(td.ctrl_pt2_line, 219, 174, 0, 255); + evas_object_line_xy_set(td.ctrl_pt2_line, WIN_W, 0, + (300 + (CTRL_W/2)), (100 + (CTRL_H/2))); + evas_object_show(td.ctrl_pt2_line); + + //Control Point 2 + td.ctrl_pt2 = evas_object_image_filled_add(td.e); + evas_object_image_file_set(td.ctrl_pt2, buf, NULL); + evas_object_resize(td.ctrl_pt2, CTRL_W, CTRL_H); + evas_object_move(td.ctrl_pt2, 300, 100); + evas_object_event_callback_add(td.ctrl_pt2, EVAS_CALLBACK_MOUSE_MOVE, + ctrl_pt2_mouse_move_cb, &td); + evas_object_event_callback_add(td.ctrl_pt2, EVAS_CALLBACK_MOUSE_DOWN, + ctrl_pt2_mouse_down_cb, &td); + evas_object_event_callback_add(td.ctrl_pt2, EVAS_CALLBACK_MOUSE_UP, + ctrl_pt2_mouse_up_cb, &td); + evas_object_show(td.ctrl_pt2); + + //Label + td.label = elm_label_add(td.win); + evas_object_resize(td.label, WIN_W, 50); + evas_object_pass_events_set(td.label, EINA_TRUE); + evas_object_show(td.label); + + td.rev_btn = elm_button_add(td.win); + elm_object_text_set(td.rev_btn, "Revert"); + evas_object_resize(td.rev_btn, 50, 50); + evas_object_move(td.rev_btn, 100, 0); + evas_object_show(td.rev_btn); + elm_object_disabled_set(td.rev_btn, EINA_TRUE); + + //Button + Evas_Object *btn = elm_button_add(td.win); + elm_object_text_set(btn, "Go"); + evas_object_smart_callback_add(btn, "clicked", btn_clicked_cb, &td); + evas_object_resize(btn, BTN_SIZE, BTN_SIZE); + evas_object_move(btn, 0, (WIN_H - BTN_SIZE)); + evas_object_show(btn); + + update_curve(&td); + + evas_object_resize(td.win, WIN_W, WIN_H); + evas_object_show(td.win); +} diff --git a/src/bin/elementary/test_video.c b/src/bin/elementary/test_video.c new file mode 100644 index 0000000000..0dfca3e7ea --- /dev/null +++ b/src/bin/elementary/test_video.c @@ -0,0 +1,58 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void +my_bt_open(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Evas_Object *video = data; + const char *file = event_info; + + if (file) + { + elm_video_file_set(video, file); + elm_video_play(video); + } +} + +void +test_video(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bg, *video, *bt, *tb, *player; + + win = elm_win_add(NULL, "video", ELM_WIN_BASIC); + elm_win_title_set(win, "Video"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + video = elm_video_add(win); + evas_object_size_hint_weight_set(video, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(video); + + player = elm_player_add(win); + evas_object_size_hint_weight_set(player, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_content_set(player, video); + elm_win_resize_object_add(win, player); + evas_object_show(player); + + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, tb); + evas_object_show(tb); + + bt = elm_fileselector_button_add(win); + elm_object_text_set(bt, "Select Video"); + evas_object_smart_callback_add(bt, "file,chosen", my_bt_open, video); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.5, 0.1); + elm_table_pack(tb, bt, 0, 0, 1, 1); + evas_object_show(bt); + + evas_object_resize(win, 800, 500); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_weather.c b/src/bin/elementary/test_weather.c new file mode 100644 index 0000000000..332770bb4e --- /dev/null +++ b/src/bin/elementary/test_weather.c @@ -0,0 +1,168 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +#ifdef HAVE_ELEMENTARY_EWEATHER +# include "EWeather_Smart.h" +#endif + +#ifdef HAVE_ELEMENTARY_EWEATHER +static Evas_Object *en, *hv, *fl; +static Evas_Object *weather[2]; +static int current = 0; +static Eina_Module *module[2]; + +static void +_first_city_cb(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info EINA_UNUSED) +{ + if (!current) return; + current = 0; + elm_flip_go(fl, ELM_FLIP_ROTATE_YZ_CENTER_AXIS); +} + +static void +_second_city_cb(void *dat EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info EINA_UNUSED) +{ + if (current) return; + current = 1; + elm_flip_go(fl, ELM_FLIP_ROTATE_XZ_CENTER_AXIS); +} + +static void _apply_cb(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info EINA_UNUSED) +{ + EWeather *eweather = eweather_object_eweather_get(weather[current]); + + if (module[current]) + eweather_plugin_set(eweather, module[current]); + eweather_code_set(eweather, elm_object_text_get(en)); + printf("CURRENT %d, module[current] %p, eweather %p, city : %s\n", + current, module[current], eweather, elm_object_text_get(en)); +} + +static void +_hover_select_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + EWeather *eweather = eweather_object_eweather_get(weather[0]); + module[0] = eweather_plugin_search(eweather, elm_object_item_text_get(event_info)); + + eweather = eweather_object_eweather_get(weather[1]); + module[1] = eweather_plugin_search(eweather, elm_object_item_text_get(event_info)); + printf("%p %p\n", module[0], module[1]); +} +#endif + +void +test_weather(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win; +#ifdef HAVE_ELEMENTARY_EWEATHER + Evas_Object *bx, *bx0, *bt; + EWeather *eweather; + Eina_Array_Iterator it; + Eina_Array *array; + Eina_Module *m; + unsigned int i; +#endif + + win = elm_win_util_standard_add("weather", "Weather"); + elm_win_autodel_set(win, EINA_TRUE); + +#ifdef HAVE_ELEMENTARY_EWEATHER + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + fl = elm_flip_add(win); + evas_object_size_hint_align_set(fl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(fl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, fl); + + current = 0; + + module[0] = NULL; + weather[0] = eweather_object_add(evas_object_evas_get(win)); + evas_object_size_hint_weight_set(weather[0], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(weather[0], EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_part_content_set(fl, "front", weather[0]); + evas_object_show(weather[0]); + + module[1] = NULL; + weather[1] = eweather_object_add(evas_object_evas_get(win)); + eweather = eweather_object_eweather_get(weather[1]); + evas_object_size_hint_weight_set(weather[1], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(weather[1], EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_part_content_set(fl, "back", weather[1]); + evas_object_show(weather[1]); + + evas_object_show(fl); + + // + bx0 = elm_box_add(win); + elm_box_horizontal_set(bx0, EINA_TRUE); + evas_object_size_hint_weight_set(bx0, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx, bx0); + evas_object_show(bx0); + + bt = elm_button_add(win); + elm_object_text_set(bt, "First city"); + evas_object_show(bt); + elm_box_pack_end(bx0, bt); + evas_object_smart_callback_add(bt, "clicked", _first_city_cb, NULL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Second city"); + evas_object_show(bt); + elm_box_pack_end(bx0, bt); + evas_object_smart_callback_add(bt, "clicked", _second_city_cb, NULL); + // + + // + bx0 = elm_box_add(win); + elm_box_horizontal_set(bx0, EINA_TRUE); + evas_object_size_hint_weight_set(bx0, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx, bx0); + evas_object_show(bx0); + + hv = elm_hoversel_add(win); + elm_hoversel_hover_parent_set(hv, win); + elm_object_text_set(hv, "data source"); + evas_object_size_hint_weight_set(hv, 0.0, 0.0); + evas_object_size_hint_align_set(hv, 0.5, 0.5); + elm_box_pack_end(bx0, hv); + evas_object_show(hv); + + array = eweather_plugins_list_get(eweather); + + EINA_ARRAY_ITER_NEXT(array, i, m, it) + elm_hoversel_item_add(hv, eweather_plugin_name_get(eweather, i), NULL, ELM_ICON_NONE, _hover_select_cb, NULL); + + en = elm_entry_add(win); + elm_entry_line_wrap_set(en, ELM_WRAP_NONE); + elm_entry_single_line_set(en, EINA_TRUE); + elm_object_text_set(en, "Paris"); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(en, "activated", _apply_cb, NULL); + elm_box_pack_end(bx0, en); + evas_object_show(en); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Apply"); + evas_object_show(bt); + elm_box_pack_end(bx0, bt); + evas_object_smart_callback_add(bt, "clicked", _apply_cb, NULL); +#else + Evas_Object *lbl; + + lbl = elm_label_add(win); + evas_object_size_hint_weight_set(lbl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, lbl); + elm_object_text_set(lbl, "libeweather is required to display the forecast."); + evas_object_show(lbl); +#endif + + evas_object_resize(win, 244, 388); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_web.c b/src/bin/elementary/test_web.c new file mode 100644 index 0000000000..5cc4b85169 --- /dev/null +++ b/src/bin/elementary/test_web.c @@ -0,0 +1,693 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +typedef struct +{ + Evas_Object *web; + Evas_Object *btn_back; + Evas_Object *btn_fwd; + Evas_Object *url_entry; + Evas_Object *bx; + Evas_Object *hoversel; + Eina_List *sub_wins; + Eina_Bool js_hooks : 1; +} Web_Test; + +static void +_btn_back_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *web = data; + + elm_web_back(web); +} + +static void +_btn_fwd_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *web = data; + + elm_web_forward(web); +} + +static void +_btn_reload_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *web = data; + + elm_web_reload(web); +} + +static void +_url_entry_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *web = data; + const char *url = elm_object_text_get(obj); + + elm_web_url_set(web, url); +} + +static void +_toggle_inwin_mode_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + elm_web_inwin_mode_set(data, !elm_web_inwin_mode_get(data)); +} + +static void +_title_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + char buf[512]; + snprintf(buf, sizeof(buf), "Web - %s", (const char *)event_info); + elm_win_title_set(data, buf); +} + +static void +_url_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Web_Test *wt = data; + + elm_object_text_set(wt->url_entry, event_info); + + elm_object_disabled_set(wt->btn_back, !elm_web_back_possible_get(wt->web)); + elm_object_disabled_set(wt->btn_fwd, !elm_web_forward_possible_get(wt->web)); +} + +static void +_new_win_del_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Web_Test *wt = data; + wt->sub_wins = eina_list_remove(wt->sub_wins, obj); +} + +static void +_web_win_close_request_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + evas_object_del(data); +} + +static Evas_Object * +_new_window_hook(void *data, Evas_Object *obj, Eina_Bool js EINA_UNUSED, const Elm_Web_Window_Features *wf EINA_UNUSED) +{ + Web_Test *wt = data; + Evas_Object *new_win, *new_web; + + new_win = elm_win_util_standard_add("elm-web-test-popup", "Elm Web Test Popup"); + elm_win_autodel_set(new_win, EINA_TRUE); + evas_object_resize(new_win, 300, 300); + evas_object_show(new_win); + + new_web = elm_web_add(new_win); + elm_web_useragent_set(new_web, elm_web_useragent_get(obj)); + evas_object_size_hint_weight_set(new_web, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(new_win, new_web); + evas_object_show(new_web); + + evas_object_smart_callback_add(new_win, "delete,request", _new_win_del_cb, + wt); + evas_object_smart_callback_add(new_web, "windows,close,request", + _web_win_close_request_cb, new_win); + wt->sub_wins = eina_list_append(wt->sub_wins, new_win); + + return new_web; +} + +static void +_alert_del(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + evas_object_del(obj); +} + +static Evas_Object * +_alert_hook(void *data EINA_UNUSED, Evas_Object *obj, const char *message) +{ + Evas_Object *popup, *label; + + popup = elm_notify_add(obj); + elm_notify_align_set(popup, 0.5, 0.5); + // Using the timeout doesn't seem to go well with the second main loop + //elm_notify_timeout_set(popup, 2.0); + elm_notify_allow_events_set(popup, EINA_FALSE); + evas_object_show(popup); + + evas_object_smart_callback_add(popup, "block,clicked", _alert_del, NULL); + + label = elm_label_add(obj); + elm_object_text_set(label, message); + elm_object_content_set(popup, label); + evas_object_show(label); + + return popup; +} + +static void +_confirm_ok_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Eina_Bool *response = data; + *response = EINA_TRUE; +} + +static void +_confirm_cancel_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Eina_Bool *response = data; + *response = EINA_FALSE; +} + +static void +_confirm_dismiss_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + evas_object_del(data); +} + +static Evas_Object * +_confirm_hook(void *data EINA_UNUSED, Evas_Object *obj, const char *message, Eina_Bool *response) +{ + Evas_Object *popup, *box, *box2, *label, *btn_ok, *btn_cancel; + + popup = elm_notify_add(obj); + elm_notify_align_set(popup, 0.5, 0.5); + elm_notify_allow_events_set(popup, EINA_FALSE); + evas_object_show(popup); + + box = elm_box_add(obj); + elm_object_content_set(popup, box); + evas_object_show(box); + + label = elm_label_add(obj); + elm_object_text_set(label, message); + elm_box_pack_end(box, label); + evas_object_show(label); + + box2 = elm_box_add(obj); + elm_box_horizontal_set(box2, EINA_TRUE); + elm_box_pack_end(box, box2); + evas_object_show(box2); + + btn_ok = elm_button_add(obj); + elm_object_text_set(btn_ok, "Ok"); + elm_box_pack_end(box2, btn_ok); + evas_object_show(btn_ok); + + btn_cancel = elm_button_add(obj); + elm_object_text_set(btn_cancel, "Cancel"); + elm_box_pack_end(box2, btn_cancel); + evas_object_show(btn_cancel); + + evas_object_smart_callback_add(btn_ok, "clicked", _confirm_dismiss_cb, + popup); + evas_object_smart_callback_add(btn_cancel, "clicked", _confirm_dismiss_cb, + popup); + evas_object_smart_callback_add(btn_ok, "clicked", _confirm_ok_cb, response); + evas_object_smart_callback_add(btn_cancel, "clicked", _confirm_cancel_cb, + response); + + return popup; +} + +static Evas_Object * +_prompt_hook(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *message EINA_UNUSED, const char *default_value, const char **value, Eina_Bool *response) +{ + *response = EINA_TRUE; + *value = default_value ? strdup(default_value) : "No default!"; + return NULL; +} + +static Evas_Object * +_file_selector_hook(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, Eina_Bool allow_multiple EINA_UNUSED, Eina_List *accept_types EINA_UNUSED, Eina_List **selected_files, Eina_Bool *response) +{ + *selected_files = eina_list_append(NULL, + strdup("/path/to/non_existing_file")); + *response = EINA_TRUE; + return NULL; +} + +static void +_console_message_hook(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *message, unsigned int line_number, const char *source_id) +{ + printf("CONSOLE: %s:%u:%s\n", source_id, line_number, message); +} + +static void +_js_popup_hooks_set(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Web_Test *wt = data; + + wt->js_hooks = !wt->js_hooks; + if (wt->js_hooks) + { + elm_web_dialog_alert_hook_set(wt->web, _alert_hook, NULL); + elm_web_dialog_confirm_hook_set(wt->web, _confirm_hook, NULL); + elm_web_dialog_prompt_hook_set(wt->web, _prompt_hook, NULL); + elm_web_dialog_file_selector_hook_set(wt->web, _file_selector_hook, + NULL); + elm_web_console_message_hook_set(wt->web, _console_message_hook, NULL); + } + else + { + elm_web_dialog_alert_hook_set(wt->web, NULL, NULL); + elm_web_dialog_confirm_hook_set(wt->web, NULL, NULL); + elm_web_dialog_prompt_hook_set(wt->web, NULL, NULL); + elm_web_dialog_file_selector_hook_set(wt->web, NULL, NULL); + elm_web_console_message_hook_set(wt->web, NULL, NULL); + } +} + +static void +_zoom_out_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Web_Test *wt = data; + double zoom; + + zoom = elm_web_zoom_get(wt->web); + if (zoom > 1) + zoom -= .5; + else + zoom /= 2; + if (zoom < .05) + zoom = .05; + elm_web_zoom_set(wt->web, zoom); +} + +static void +_zoom_in_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Web_Test *wt = data; + double zoom; + + zoom = elm_web_zoom_get(wt->web); + + if (zoom < 1) + zoom *= 2; + else + zoom += .5; + if (zoom > 4) + zoom = 4; + elm_web_zoom_set(wt->web, zoom); +} + +static void +_zoom_mode_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Web_Test *wt = data; + Elm_Object_Item *hoversel_it = event_info; + const char *lbl = elm_object_item_text_get(hoversel_it); + + if (!strcmp(lbl, "Manual")) + elm_web_zoom_mode_set(wt->web, ELM_WEB_ZOOM_MODE_MANUAL); + else if (!strcmp(lbl, "Fit")) + elm_web_zoom_mode_set(wt->web, ELM_WEB_ZOOM_MODE_AUTO_FIT); + else + elm_web_zoom_mode_set(wt->web, ELM_WEB_ZOOM_MODE_AUTO_FILL); +} + +static void +_show_region_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Web_Test *wt = data; + elm_web_region_show(wt->web, 300, 300, 1, 1); +} + +static void +_bring_in_region_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Web_Test *wt = data; + elm_web_region_bring_in(wt->web, 50, 0, 1, 1); +} + +static void +_on_fullscreen_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Web_Test *wt = data; + elm_box_unpack(wt->bx, wt->hoversel); + evas_object_hide(wt->hoversel); +} + +static void +_on_unfullscreen_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Web_Test *wt = data; + elm_box_pack_start(wt->bx, wt->hoversel); + evas_object_show(wt->hoversel); +} + +typedef struct +{ + const char* name; + const char* useragent; +} User_Agent; + +static User_Agent ua[] = { + {"Default", NULL}, + {"Mobile/Iphone", "Mozilla/5.0 (iPhone; CPU iPhone OS 6_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B142 Safari/8536.25"}, + {"Mobile/Android(Chrome)", "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"}, + {"Mobile/Android", "Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30"}, + {"Desktop/Firefox", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:25.0) Gecko/20100101 Firefox/25.0"}, + {"Desktop/Chrome", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17"} +}; + +static void +_useragent_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Web_Test *wt = data; + Elm_Object_Item *hoversel_it = event_info; + const char *lbl = elm_object_item_text_get(hoversel_it); + unsigned i; + + for (i = 0; i < sizeof(ua) / sizeof(ua[0]); ++i) + if (!strcmp(lbl, ua[i].name)) + { + printf("New user agent : %s\n", ua[i].useragent ? ua[i].useragent : "Default"); + elm_web_useragent_set(wt->web, ua[i].useragent); + } +} + +static void +_dialog_test_cb(void *data, Evas_Object *obj, void *event_info) +{ + Web_Test *wt = data; + const char *selected = elm_object_item_text_get(event_info); + const char dialog_html[] = "<!doctype html><body>" + "<script>" + "var confirm_test = function() {" + " if (window.confirm('confirm') == true) {" + " document.getElementById('r').innerHTML = 'You pressed OK';" + " } else {" + " document.getElementById('r').innerHTML = 'You pressed Cancel';" + " }" + "};" + "var prompt_test = function() {" + " document.getElementById('r').innerHTML = window.prompt('Enter your name', 'EFL');" + "};" + "</script>" + "Result: <div id='r'> </div>" + "<input type='button' value='alert' onclick=\"window.alert('alert pressed');\">" + "<input type='button' value='confirm' onclick=\"confirm_test();\">" + "<input type='button' value='prompt' onclick=\"prompt_test();\">" + "</body>"; + + printf("selected test : %s\n", selected); + elm_object_text_set(obj, selected); + + elm_web_html_string_load(wt->web, dialog_html, NULL, NULL); +} + +static void +_select_tag_test_cb(void *data, Evas_Object *obj, void *event_info) +{ + Web_Test *wt = data; + const char *selected = elm_object_item_text_get(event_info); + const char select_html[] = "<!doctype html><body>" + "<select>" + "<option>eina</option>" + "<option>ecore</option>" + "<option>evas</option>" + "<option>edje</option>" + "<option>eet</option>" + "<option>emotion</option>" + "<option>elementary</option>" + "</select>" + "</body>"; + + printf("selected test : %s\n", selected); + elm_object_text_set(obj, selected); + + elm_web_html_string_load(wt->web, select_html, NULL, NULL); +} + +static void +_new_window_test_cb(void *data, Evas_Object *obj, void *event_info) +{ + Web_Test *wt = data; + const char *selected = elm_object_item_text_get(event_info); + const char new_window_html[] = "<!doctype html><body>" + "<script>" + "var h = null;" + "var test = function() {" + " if (!h) {" + " h = window.open('http://www.enlightenment.org','','width=400,height=300');" + " document.getElementById('btn').value='close window';" + " } else {" + " h.close();" + " h = null;" + " document.getElementById('btn').value='open new window';" + " }" + "}" + "</script>" + "<input type='button' id='btn' onclick='test();' value='open new window'>" + "</body>"; + + printf("selected test : %s\n", selected); + elm_object_text_set(obj, selected); + + elm_web_html_string_load(wt->web, new_window_html, NULL, NULL); +} + +static void +_fullscreen_test_cb(void *data, Evas_Object *obj, void *event_info) +{ + Web_Test *wt = data; + const char *selected = elm_object_item_text_get(event_info); + const char fullscreen_html[] = "<!doctype html><body>" + "<script>" + "var launch = function(obj) {" + " var f = document.webkitFullscreenElement;" + " if (f) document.webkitExitFullscreen();" + " if (f != obj) obj.webkitRequestFullscreen();" + "}\n" + "var test_full = function() { launch(document.documentElement); }\n" + "var test_small = function() { launch(document.getElementById('box')); }\n" + "</script>" + "<input type='button' onclick='test_full();' value='request fullscreen'>" + "<div id='box' style='width:100px;height:100px;background-color:blue;' onclick='test_small();'>small box</div>" + "<input type='button' onclick='test_small();' value='request fullscreen of box'>" + "</body>"; + + printf("selected test : %s\n", selected); + elm_object_text_set(obj, selected); + + elm_web_html_string_load(wt->web, fullscreen_html, NULL, NULL); +} + +static void +_main_web_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Web_Test *wt = data; + Evas_Object *sub_win; + + EINA_LIST_FREE(wt->sub_wins, sub_win) + evas_object_del(sub_win); + + free(wt); +} + +void +test_web(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bx2, *bt, *web, *url; + Web_Test *wt; + unsigned i; + + elm_need_web(); + + wt = calloc(1, sizeof(*wt)); + win = elm_win_util_standard_add("web", "Web"); + + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0.0); + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + web = elm_web_add(win); + evas_object_size_hint_weight_set(web, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(web, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, web); + evas_object_show(web); + + bt = elm_button_add(win); + elm_object_text_set(bt, "<"); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + evas_object_smart_callback_add(bt, "clicked", _btn_back_cb, web); + wt->btn_back = bt; + + bt = elm_button_add(win); + elm_object_text_set(bt, "R"); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + evas_object_smart_callback_add(bt, "clicked", _btn_reload_cb, web); + + bt = elm_button_add(win); + elm_object_text_set(bt, ">"); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + evas_object_smart_callback_add(bt, "clicked", _btn_fwd_cb, web); + wt->btn_fwd = bt; + + url = elm_entry_add(win); + elm_entry_single_line_set(url, EINA_TRUE); + elm_entry_scrollable_set(url, EINA_TRUE); + evas_object_size_hint_weight_set(url, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(url, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx2, url); + evas_object_show(url); + + evas_object_smart_callback_add(url, "activated", _url_entry_changed_cb, web); + wt->url_entry = url; + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0); + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Inwin Mode"); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + evas_object_smart_callback_add(bt, "clicked", _toggle_inwin_mode_cb, web); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Custom Hooks"); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + evas_object_smart_callback_add(bt, "clicked", _js_popup_hooks_set, wt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "-"); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + evas_object_smart_callback_add(bt, "clicked", _zoom_out_cb, wt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "+"); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + evas_object_smart_callback_add(bt, "clicked", _zoom_in_cb, wt); + + bt = elm_hoversel_add(win); + elm_object_text_set(bt, "Zoom Mode"); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_hoversel_item_add(bt, "Manual", NULL, ELM_ICON_NONE, _zoom_mode_cb, wt); + elm_hoversel_item_add(bt, "Fit", NULL, ELM_ICON_NONE, _zoom_mode_cb, wt); + elm_hoversel_item_add(bt, "Fill", NULL, ELM_ICON_NONE, _zoom_mode_cb, wt); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0); + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Show 300, 300"); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + evas_object_smart_callback_add(bt, "clicked", _show_region_cb, wt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Bring in 50, 0"); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + evas_object_smart_callback_add(bt, "clicked", _bring_in_region_cb, wt); + + bt = elm_hoversel_add(win); + elm_object_text_set(bt, "User agent"); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + for (i = 0; i < sizeof(ua) / sizeof(ua[0]); ++i) + elm_hoversel_item_add(bt, ua[i].name, NULL, ELM_ICON_NONE, _useragent_cb, wt); + + evas_object_smart_callback_add(web, "title,changed", _title_changed_cb, win); + evas_object_smart_callback_add(web, "url,changed", _url_changed_cb, wt); + + evas_object_event_callback_add(web, EVAS_CALLBACK_DEL, _main_web_del_cb, wt); + + wt->web = web; + + elm_web_url_set(web, "http://www.enlightenment.org"); + + elm_web_window_create_hook_set(web, _new_window_hook, wt); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} + +void +test_web_ui(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *web, *hoversel; + Web_Test *wt; + + elm_need_web(); + + wt = calloc(1, sizeof(*wt)); + win = elm_win_util_standard_add("web", "Web"); + + evas_object_smart_callback_add(win, "fullscreen", _on_fullscreen_cb, wt); + evas_object_smart_callback_add(win, "unfullscreen", _on_unfullscreen_cb, wt); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + hoversel = elm_hoversel_add(bx); + elm_hoversel_hover_parent_set(hoversel, win); + elm_object_text_set(hoversel, "Test cases"); + + elm_hoversel_item_add(hoversel, "alert/confirm/prompt", NULL, ELM_ICON_NONE, + _dialog_test_cb, wt); + elm_hoversel_item_add(hoversel, "<select> tag", NULL, ELM_ICON_NONE, + _select_tag_test_cb, wt); + elm_hoversel_item_add(hoversel, "new window", NULL, ELM_ICON_NONE, + _new_window_test_cb, wt); + elm_hoversel_item_add(hoversel, "fullscreen", NULL, ELM_ICON_NONE, + _fullscreen_test_cb, wt); + elm_box_pack_end(bx, hoversel); + evas_object_show(hoversel); + + web = elm_web_add(win); + evas_object_size_hint_weight_set(web, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(web, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, web); + evas_object_show(web); + + elm_web_window_create_hook_set(web, _new_window_hook, wt); + + evas_object_event_callback_add(web, EVAS_CALLBACK_DEL, _main_web_del_cb, wt); + wt->web = web; + wt->bx = bx; + wt->hoversel = hoversel; + + + elm_web_html_string_load(wt->web, + "<!doctype html><body>Hello, WebKit/Efl</body>", + NULL, NULL); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_win_dialog.c b/src/bin/elementary/test_win_dialog.c new file mode 100644 index 0000000000..aa155b188e --- /dev/null +++ b/src/bin/elementary/test_win_dialog.c @@ -0,0 +1,48 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + + + +void +_bt_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *dia, *lb; + Evas_Object *parent = data; + + dia = elm_win_util_dialog_add(parent, "window-dia", "A Dialog Window"); + elm_win_autodel_set(dia, EINA_TRUE); + + lb = elm_label_add(dia); + elm_object_text_set(lb, "This is a Dialog Window"); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(dia, lb); + evas_object_show(lb); + + evas_object_resize(dia, 200, 150); + evas_object_show(dia); +} + +void +test_win_dialog(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *box, *bt; + + win = elm_win_util_standard_add("window-dia", "A Standard Window"); + elm_win_autodel_set(win, EINA_TRUE); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Create a new dialog"); + evas_object_smart_callback_add(bt, "clicked", _bt_clicked_cb, win); + elm_box_pack_end(box, bt); + evas_object_show(bt); + + evas_object_resize(win, 400, 400); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_win_inline.c b/src/bin/elementary/test_win_inline.c new file mode 100644 index 0000000000..b9e08ef739 --- /dev/null +++ b/src/bin/elementary/test_win_inline.c @@ -0,0 +1,254 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void +fill(Evas_Object *win, Eina_Bool do_bg) +{ + Evas_Object *bg, *sc, *bx, *ic, *bb, *av, *en; + char buf[PATH_MAX]; + + if (do_bg) + { + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + } + + sc = elm_scroller_add(win); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, sc); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_object_text_set(en, "This is a single line"); + elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_single_line_set(en, EINA_TRUE); + evas_object_show(en); + elm_box_pack_end(bx, en); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_object_text_set(en, "Entry 2"); + elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_single_line_set(en, EINA_TRUE); + evas_object_show(en); + elm_box_pack_end(bx, en); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1); + + bb = elm_bubble_add(win); + elm_object_text_set(bb, "Message 3"); + elm_object_part_text_set(bb, "info", "10:32 4/11/2008"); + elm_object_part_content_set(bb, "icon", ic); + evas_object_show(ic); + evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL); + av = elm_entry_add(win); + elm_entry_anchor_hover_style_set(av, "popout"); + elm_entry_anchor_hover_parent_set(av, win); + elm_object_text_set(av, + "Hi there. This is the most recent message in the " + "list of messages. It has one <a href=tel:+614321234>+61 432 1234</a> " + "(phone number) to click on."); + elm_object_content_set(bb, av); + evas_object_show(av); + elm_box_pack_end(bx, bb); + evas_object_show(bb); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + + bb = elm_bubble_add(win); + elm_object_text_set(bb, "Message 2"); + elm_object_part_text_set(bb, "info", "7:16 27/10/2008"); + elm_object_part_content_set(bb, "icon", ic); + evas_object_show(ic); + evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL); + av = elm_entry_add(win); + elm_entry_anchor_hover_style_set(av, "popout"); + elm_entry_anchor_hover_parent_set(av, win); + elm_object_text_set(av, + "Hey what are you doing? This is the second last message " + "Hi there. This is the most recent message in the " + "list. It's a longer one so it can wrap more and " + "contains a <a href=contact:john>John</a> contact " + "link in it to test popups on links. The idea is that " + "all SMS's are scanned for things that look like phone " + "numbers or names that are in your contacts list, and " + "if they are, they become clickable links that pop up " + "a menus of obvious actions to perform on this piece " + "of information. This of course can be later explicitly " + "done by links maybe running local apps or even being " + "web URL's too that launch the web browser and point it " + "to that URL. <item relsize=16x16 vsize=full href=emoticon/omg></item>"); + elm_object_content_set(bb, av); + evas_object_show(av); + elm_box_pack_end(bx, bb); + evas_object_show(bb); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1); + + bb = elm_bubble_add(win); + elm_object_text_set(bb, "Message 1"); + elm_object_part_text_set(bb, "info", "20:47 18/6/2008"); + elm_object_part_content_set(bb, "icon", ic); + evas_object_show(ic); + evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + av = elm_entry_add(win); + elm_entry_anchor_hover_style_set(av, "popout"); + elm_entry_anchor_hover_parent_set(av, win); + elm_object_text_set(av, "This is a short message. <item relsize=16x16 vsize=full href=emoticon/haha></item>"); + elm_object_content_set(bb, av); + evas_object_show(av); + elm_box_pack_end(bx, bb); + evas_object_show(bb); + + elm_object_content_set(sc, bx); + evas_object_show(bx); + + evas_object_show(sc); +} + +static void +cb_mouse_down(void *data EINA_UNUSED, Evas *evas EINA_UNUSED, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Down *ev = event_info; + + if (ev->button == 1) elm_object_focus_set(obj, EINA_TRUE); +} + +static void +cb_mouse_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Move *ev = event_info; + Evas_Object *orig = data; + Evas_Coord x, y; + Evas_Map *p; + int i, w, h; + + if (!ev->buttons) return; + evas_object_geometry_get(obj, &x, &y, NULL, NULL); + evas_object_move(obj, + x + (ev->cur.canvas.x - ev->prev.output.x), + y + (ev->cur.canvas.y - ev->prev.output.y)); + evas_object_image_size_get(orig, &w, &h); + p = evas_map_new(4); + evas_object_map_enable_set(orig, EINA_TRUE); + evas_object_raise(orig); + for (i = 0; i < 4; i++) + { + Evas_Object *hand; + char key[32]; + + snprintf(key, sizeof(key), "h-%i\n", i); + hand = evas_object_data_get(orig, key); + evas_object_raise(hand); + evas_object_geometry_get(hand, &x, &y, NULL, NULL); + x += 15; + y += 15; + evas_map_point_coord_set(p, i, x, y, 0); + if (i == 0) evas_map_point_image_uv_set(p, i, 0, 0); + else if (i == 1) evas_map_point_image_uv_set(p, i, w, 0); + else if (i == 2) evas_map_point_image_uv_set(p, i, w, h); + else if (i == 3) evas_map_point_image_uv_set(p, i, 0, h); + } + evas_object_map_set(orig, p); + evas_map_free(p); +} + +static void +create_handles(Evas_Object *obj) +{ + int i; + Evas_Coord x, y, w, h; + + evas_object_geometry_get(obj, &x, &y, &w, &h); + for (i = 0; i < 4; i++) + { + Evas_Object *hand; + char buf[PATH_MAX]; + char key[32]; + + hand = evas_object_image_filled_add(evas_object_evas_get(obj)); + evas_object_resize(hand, 31, 31); + snprintf(buf, sizeof(buf), "%s/images/pt.png", elm_app_data_dir_get()); + evas_object_image_file_set(hand, buf, NULL); + if (i == 0) evas_object_move(hand, x - 15, y - 15); + else if (i == 1) evas_object_move(hand, x + w - 15, y - 15); + else if (i == 2) evas_object_move(hand, x + w - 15, y + h - 15); + else if (i == 3) evas_object_move(hand, x - 15, y + h - 15); + evas_object_event_callback_add(hand, EVAS_CALLBACK_MOUSE_MOVE, cb_mouse_move, obj); + evas_object_show(hand); + snprintf(key, sizeof(key), "h-%i\n", i); + evas_object_data_set(obj, key, hand); + } +} + +void +test_win_inline(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bg, *win2, *win3; + char buf[PATH_MAX]; + + win = elm_win_add(NULL, "window-inline", ELM_WIN_BASIC); + elm_win_title_set(win, "Window Inline"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_bg_file_set(bg, buf, NULL); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + win2 = elm_win_add(win, "inlined", ELM_WIN_INLINED_IMAGE); + evas_object_event_callback_add(elm_win_inlined_image_object_get(win2), EVAS_CALLBACK_MOUSE_DOWN, cb_mouse_down, NULL); + fill(win2, EINA_TRUE); + + evas_object_move(win2, 20, 60); + evas_object_resize(win2, 300, 200); + // image object for win2 is unlinked to its pos/size - so manual control + // this allows also for using map and other things with it. + evas_object_move(elm_win_inlined_image_object_get(win2), 20, 40); + evas_object_resize(elm_win_inlined_image_object_get(win2), 200, 320); + evas_object_show(win2); + + win3 = elm_win_add(win, "inlined", ELM_WIN_INLINED_IMAGE); + evas_object_event_callback_add(elm_win_inlined_image_object_get(win3), EVAS_CALLBACK_MOUSE_DOWN, cb_mouse_down, NULL); + elm_win_alpha_set(win3, EINA_TRUE); + fill(win3, EINA_FALSE); + + evas_object_resize(win3, 300, 200); + evas_object_move(elm_win_inlined_image_object_get(win3), 80, 180); + evas_object_resize(elm_win_inlined_image_object_get(win3), 300, 200); + evas_object_show(win3); + + create_handles(elm_win_inlined_image_object_get(win3)); + + evas_object_resize(win, 400, 400); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_win_keygrab.c b/src/bin/elementary/test_win_keygrab.c new file mode 100644 index 0000000000..9032e9fbb1 --- /dev/null +++ b/src/bin/elementary/test_win_keygrab.c @@ -0,0 +1,243 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + + +struct _api_data +{ + Evas_Object *win; + Elm_Win_Keygrab_Mode mode; /* Mode of keygr */ + char keyname[PATH_MAX]; /* Keyname */ +}; + +typedef struct _api_data api_data; + +static void +_rdg_changed_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + int mode = -1; + Elm_Win_Keygrab_Mode keygrab_mode = ELM_WIN_KEYGRAB_UNKNOWN; + api_data *api = data; + + mode = elm_radio_value_get(obj); + printf("radio group value : %d\n", mode); + + if (mode == 1) + { + keygrab_mode = ELM_WIN_KEYGRAB_SHARED; + printf("keygrab mode = ELM_WIN_KEYGRAB_SHARED\n"); + } + else if (mode == 2) + { + keygrab_mode = ELM_WIN_KEYGRAB_TOPMOST; + printf("keygrab mode = ELM_WIN_KEYGRAB_TOPMOST\n"); + } + else if (mode == 3) + { + keygrab_mode = ELM_WIN_KEYGRAB_EXCLUSIVE; + printf("keygrab mode = ELM_WIN_KEYGRAB_EXCLUSIVE\n"); + } + else if (mode == 4) + { + keygrab_mode = ELM_WIN_KEYGRAB_OVERRIDE_EXCLUSIVE; + printf("keygrab mode = ELM_WIN_KEYGRAB_OVERRIDE_EXCLUSIVE\n"); + } + else + { + keygrab_mode = ELM_WIN_KEYGRAB_UNKNOWN; + printf("keygrab mode = ELM_WIN_KEYGRAB_UNKNOWN\n"); + } + api->mode = keygrab_mode; +} + +static void +_entry_changed_cb(void *data , Evas_Object *obj, void *event_info EINA_UNUSED) +{ + api_data *api = data; + const char *str = elm_entry_entry_get(obj); + if (!str) return; + strncpy(api->keyname, str, PATH_MAX - 1); + printf("entry: %s\n",str); +} + +static void +_cleanup_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + if (data) + free(data); +} + +static void +_set_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Eina_Bool ret = EINA_FALSE; + api_data *api = data; + + ret = elm_win_keygrab_set(api->win, api->keyname, 0, 0, 0, api->mode); + printf("Keyname:\"%s\" mode:\"%d\" keygrab set. ret=%d\n", api->keyname, api->mode, ret); +} + +static void +_unset_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Eina_Bool ret = EINA_FALSE; + api_data *api = data; + + ret = elm_win_keygrab_unset(api->win, api->keyname, 0, 0); + printf("Keyname:\"%s\" mode:\"%d\" keygrab unset. ret=%d.\n", api->keyname, api->mode, ret); +} + +static void +_group_1_create(Evas_Object *bx, api_data *api) +{ + Evas_Object *bx2, *fr, *lb, *en; + + fr = elm_frame_add(bx); + elm_object_text_set(fr, "Keygrab Keyname"); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + bx2 = elm_box_add(fr); + elm_object_content_set(fr, bx2); + evas_object_show(bx2); + + lb = elm_label_add(bx2); + elm_object_text_set(lb, " Keyname :"); + evas_object_size_hint_weight_set(lb, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(lb, 0.0, EVAS_HINT_FILL); + elm_box_pack_end(bx2, lb); + evas_object_show(lb); + + en = elm_entry_add(bx2); + elm_entry_single_line_set(en, EINA_TRUE); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(en, "changed,user", _entry_changed_cb, api); + elm_box_pack_end(bx2, en); + evas_object_show(en); + elm_object_focus_set(en, EINA_TRUE); + + +} + +static void +_group_2_create(Evas_Object *bx, api_data *api) +{ + Evas_Object *bx2, *fr, *rd, *rd1, *rd2, *rd3; + + fr = elm_frame_add(bx); + elm_object_text_set(fr, "Keygrab Mode"); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + bx2 = elm_box_add(fr); + elm_object_content_set(fr, bx2); + elm_box_align_set(bx2, 0.0, 0.0); + evas_object_show(bx2); + + // Shared + rd = elm_radio_add(bx2); + elm_radio_state_value_set(rd, 1); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, 0.5); + elm_object_text_set(rd, "Keygrab Shared Mode"); + elm_box_pack_end(bx2, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", _rdg_changed_cb, api); + + // Topmost + rd1 = elm_radio_add(bx2); + elm_radio_state_value_set(rd1, 2); + evas_object_size_hint_weight_set(rd1, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(rd1, EVAS_HINT_FILL, 0.5); + elm_object_text_set(rd1, "Keygrab Topmost Mode"); + elm_radio_group_add(rd1, rd); + elm_box_pack_end(bx2, rd1); + evas_object_show(rd1); + evas_object_smart_callback_add(rd1, "changed", _rdg_changed_cb, api); + + // Exclusive + rd2 = elm_radio_add(bx2); + elm_radio_state_value_set(rd2, 3); + evas_object_size_hint_weight_set(rd2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(rd2, EVAS_HINT_FILL, 0.5); + elm_object_text_set(rd2, "Keygrab Exclusive Mode"); + elm_radio_group_add(rd2, rd); + elm_box_pack_end(bx2, rd2); + evas_object_show(rd2); + evas_object_smart_callback_add(rd2, "changed", _rdg_changed_cb, api); + + //Override Exclusive + rd3 = elm_radio_add(bx2); + elm_radio_state_value_set(rd3, 4); + evas_object_size_hint_weight_set(rd3, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(rd3, EVAS_HINT_FILL, 0.5); + elm_object_text_set(rd3, "Keygrab Override Exclusive Mode"); + elm_radio_group_add(rd3, rd); + elm_box_pack_end(bx2, rd3); + evas_object_show(rd3); + evas_object_smart_callback_add(rd3, "changed", _rdg_changed_cb, api); +} + +static void +_group_3_create(Evas_Object *bx, api_data *api) +{ + Evas_Object *bt; + + bt = elm_button_add(bx); + elm_object_text_set(bt, "Keygrab Set"); + elm_box_pack_end(bx, bt); + + evas_object_smart_callback_add(bt, "clicked", _set_bt_clicked, api); + evas_object_show(bt); + + + bt = elm_button_add(bx); + elm_object_text_set(bt, "Keygrab Unset"); + elm_box_pack_end(bx, bt); + evas_object_smart_callback_add(bt, "clicked", _unset_bt_clicked, api); + evas_object_show(bt); +} + +void +test_win_keygrab(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *bx1, *bx2; + + api_data *api = calloc(1, sizeof(api_data)); + + win = elm_win_util_standard_add("keygrab", "Keygrab"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _cleanup_cb, api); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + bx1 = elm_box_add(win); + evas_object_size_hint_weight_set(bx1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, bx1); + elm_box_horizontal_set(bx1, EINA_TRUE); + evas_object_show(bx1); + + bx2 = elm_box_add(win); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, bx2); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_show(bx2); + + _group_1_create(bx1, api); + _group_2_create(bx1, api); + _group_3_create(bx2, api); + + evas_object_show(win); +} diff --git a/src/bin/elementary/test_win_plug.c b/src/bin/elementary/test_win_plug.c new file mode 100644 index 0000000000..3e4226d47b --- /dev/null +++ b/src/bin/elementary/test_win_plug.c @@ -0,0 +1,211 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +#define MAX_TRY 40 + +static int try_num = 0; + +static void +_timer_del(void *data EINA_UNUSED, + Evas *e EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Ecore_Timer *timer = evas_object_data_del(obj, "test-timer"); + if (!timer) return; + ecore_timer_del(timer); +} + +static Eina_Bool +cb_plug_connect(void *data) +{ + Evas_Object *obj = data; + Ecore_Timer *timer; + + if (!obj) return ECORE_CALLBACK_CANCEL; + + try_num++; + if (try_num > MAX_TRY) return ECORE_CALLBACK_CANCEL; + + timer= evas_object_data_get(obj, "test-timer"); + if (!timer) return ECORE_CALLBACK_CANCEL; + + if (elm_plug_connect(obj, "ello", 0, EINA_FALSE)) + { + printf("plug connect to server[ello]\n"); + evas_object_data_del(obj, "test-timer"); + return ECORE_CALLBACK_CANCEL; + } + + ecore_timer_interval_set(timer, 1); + return ECORE_CALLBACK_RENEW; +} + +static void +cb_plug_disconnected(void *data EINA_UNUSED, + Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Ecore_Timer *timer = evas_object_data_get(obj, "test-timer"); + if (timer) + { + ecore_timer_del(timer); + evas_object_data_del(obj, "test-timer"); + } + + timer = ecore_timer_add(1, cb_plug_connect, obj); + evas_object_data_set(obj, "test-timer", timer); +} + +static void +cb_plug_resized(void *data EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + Evas_Coord_Size *size = event_info; + printf("server image resized to %dx%d\n", size->w, size->h); +} + +static void +cb_mouse_down(void *data EINA_UNUSED, Evas *evas EINA_UNUSED, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Down *ev = event_info; + + if (ev->button == 1) elm_object_focus_set(obj, EINA_TRUE); +} + +static void +cb_mouse_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Move *ev = event_info; + Evas_Object *orig = data; + Evas_Coord x, y; + Evas_Map *p; + int i, w, h; + + if (!ev->buttons) return; + evas_object_geometry_get(obj, &x, &y, NULL, NULL); + evas_object_move(obj, + x + (ev->cur.canvas.x - ev->prev.output.x), + y + (ev->cur.canvas.y - ev->prev.output.y)); + evas_object_image_size_get(orig, &w, &h); + p = evas_map_new(4); + evas_object_map_enable_set(orig, EINA_TRUE); + evas_object_raise(orig); + for (i = 0; i < 4; i++) + { + Evas_Object *hand; + char key[32]; + + snprintf(key, sizeof(key), "h-%i\n", i); + hand = evas_object_data_get(orig, key); + evas_object_raise(hand); + evas_object_geometry_get(hand, &x, &y, NULL, NULL); + x += 15; + y += 15; + evas_map_point_coord_set(p, i, x, y, 0); + if (i == 0) evas_map_point_image_uv_set(p, i, 0, 0); + else if (i == 1) evas_map_point_image_uv_set(p, i, w, 0); + else if (i == 2) evas_map_point_image_uv_set(p, i, w, h); + else if (i == 3) evas_map_point_image_uv_set(p, i, 0, h); + } + evas_object_map_set(orig, p); + evas_map_free(p); +} + +static void +create_handles(Evas_Object *obj) +{ + int i; + Evas_Coord x, y, w, h; + + evas_object_geometry_get(obj, &x, &y, &w, &h); + for (i = 0; i < 4; i++) + { + Evas_Object *hand; + char buf[PATH_MAX]; + char key[32]; + + hand = evas_object_image_filled_add(evas_object_evas_get(obj)); + evas_object_resize(hand, 31, 31); + snprintf(buf, sizeof(buf), "%s/images/pt.png", elm_app_data_dir_get()); + evas_object_image_file_set(hand, buf, NULL); + if (i == 0) evas_object_move(hand, x - 15, y - 15); + else if (i == 1) evas_object_move(hand, x + w - 15, y - 15); + else if (i == 2) evas_object_move(hand, x + w - 15, y + h - 15); + else if (i == 3) evas_object_move(hand, x - 15, y + h - 15); + evas_object_event_callback_add(hand, EVAS_CALLBACK_MOUSE_MOVE, cb_mouse_move, obj); + evas_object_show(hand); + snprintf(key, sizeof(key), "h-%i\n", i); + evas_object_data_set(obj, key, hand); + } +} + +static Eina_Bool +_notify_end(void *data EINA_UNUSED, const Eo_Event *event) +{ + eo_del(event->obj); + return EINA_FALSE; +} + +static inline void +_notify_error(Evas_Object *parent, const char *msg) +{ + Evas_Object *notif, *txt; + + printf("%s\n", msg); + + notif = elm_notify_add(parent); + evas_object_size_hint_weight_set(notif, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_notify_align_set(notif, 0.5, 1.0); + elm_notify_timeout_set(notif, 3.0); + eo_event_callback_add(notif, ELM_NOTIFY_EVENT_DISMISSED, _notify_end, NULL); + + txt = elm_label_add(notif); + elm_object_text_set(txt, msg); + elm_object_content_set(notif, txt); + + evas_object_show(txt); + evas_object_show(notif); +} + +void +test_win_plug(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bg, *plug; + char buf[PATH_MAX]; + + win = elm_win_add(NULL, "window-plug", ELM_WIN_BASIC); + elm_win_title_set(win, "Window Plug"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_bg_file_set(bg, buf, NULL); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + plug = elm_plug_add(win); + evas_object_event_callback_add(elm_plug_image_object_get(plug), EVAS_CALLBACK_MOUSE_DOWN, cb_mouse_down, NULL); + evas_object_event_callback_add(plug, EVAS_CALLBACK_DEL, _timer_del, NULL); + if (!elm_plug_connect(plug, "ello", 0, EINA_FALSE)) + { + _notify_error(data, "Unable to connect to the Window Socket!"); + return; + } + + evas_object_smart_callback_add(plug, "image,deleted", cb_plug_disconnected, NULL); + evas_object_smart_callback_add(plug, "image,resized", cb_plug_resized, NULL); + + evas_object_resize(plug, 380, 500); + evas_object_move(plug, 10, 10); + evas_object_show(plug); + + create_handles(elm_plug_image_object_get(plug)); + + evas_object_resize(win, 400, 600); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_win_socket.c b/src/bin/elementary/test_win_socket.c new file mode 100644 index 0000000000..664f097bde --- /dev/null +++ b/src/bin/elementary/test_win_socket.c @@ -0,0 +1,202 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +static void +_win_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *socket_win = data; + evas_object_del(socket_win); +} + +static void +fill(Evas_Object *win, Eina_Bool do_bg) +{ + Evas_Object *bg, *sc, *bx, *ic, *bb, *av, *en; + char buf[PATH_MAX]; + + if (do_bg) + { + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + } + + sc = elm_scroller_add(win); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, sc); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_object_text_set(en, "This is a single line"); + elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_single_line_set(en, EINA_TRUE); + evas_object_show(en); + elm_box_pack_end(bx, en); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_object_text_set(en, "Entry 2"); + elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_single_line_set(en, EINA_TRUE); + evas_object_show(en); + elm_box_pack_end(bx, en); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1); + + bb = elm_bubble_add(win); + elm_object_text_set(bb, "Message 3"); + elm_object_part_text_set(bb, "info", "10:32 4/11/2008"); + elm_object_part_content_set(bb, "icon", ic); + evas_object_show(ic); + evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL); + av = elm_entry_add(win); + elm_entry_anchor_hover_style_set(av, "popout"); + elm_entry_anchor_hover_parent_set(av, win); + elm_object_text_set(av, + "Hi there. This is the most recent message in the " + "list of messages. It has one <a href=tel:+614321234>+61 432 1234</a> " + "(phone number) to click on."); + elm_object_content_set(bb, av); + evas_object_show(av); + elm_box_pack_end(bx, bb); + evas_object_show(bb); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + + bb = elm_bubble_add(win); + elm_object_text_set(bb, "Message 2"); + elm_object_part_text_set(bb, "info", "7:16 27/10/2008"); + elm_object_part_content_set(bb, "icon", ic); + evas_object_show(ic); + evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL); + av = elm_entry_add(win); + elm_entry_anchor_hover_style_set(av, "popout"); + elm_entry_anchor_hover_parent_set(av, win); + elm_object_text_set(av, + "Hey what are you doing? This is the second last message " + "Hi there. This is the most recent message in the " + "list. It's a longer one so it can wrap more and " + "contains a <a href=contact:john>John</a> contact " + "link in it to test popups on links. The idea is that " + "all SMS's are scanned for things that look like phone " + "numbers or names that are in your contacts list, and " + "if they are, they become clickable links that pop up " + "a menus of obvious actions to perform on this piece " + "of information. This of course can be later explicitly " + "done by links maybe running local apps or even being " + "web URL's too that launch the web browser and point it " + "to that URL. <item relsize=16x16 vsize=full href=emoticon/omg></item>"); + elm_object_content_set(bb, av); + evas_object_show(av); + elm_box_pack_end(bx, bb); + evas_object_show(bb); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_image_file_set(ic, buf, NULL); + elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1); + + bb = elm_bubble_add(win); + elm_object_text_set(bb, "Message 1"); + elm_object_part_text_set(bb, "info", "20:47 18/6/2008"); + elm_object_part_content_set(bb, "icon", ic); + evas_object_show(ic); + evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + av = elm_entry_add(win); + elm_entry_anchor_hover_style_set(av, "popout"); + elm_entry_anchor_hover_parent_set(av, win); + elm_object_text_set(av, "This is a short message. <item relsize=16x16 vsize=full href=emoticon/haha></item>"); + elm_object_content_set(bb, av); + evas_object_show(av); + elm_box_pack_end(bx, bb); + evas_object_show(bb); + + elm_object_content_set(sc, bx); + evas_object_show(bx); + + evas_object_show(sc); +} + +void +test_win_socket(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bx, *lb; + Evas_Object *win_socket; + + /* for socket info window */ + win = elm_win_util_standard_add("win-socket", "Win Socket"); + elm_win_autodel_set(win, EINA_TRUE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "<b>This is a small label</b>" + ); + evas_object_size_hint_weight_set(lb, 0.0, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "If you run more than one Window Plug Program<br/>" + "you can see each plug programs shared same<br/>" + "canvas<br/>" + ); + evas_object_size_hint_weight_set(lb, 0.0, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + evas_object_resize(win, 320, 300); + + evas_object_show(bx); + evas_object_show(win); + elm_win_resize_object_add(win, bx); + + /* for socket window */ + win_socket = elm_win_add(NULL, "Window Socket", ELM_WIN_SOCKET_IMAGE); + + if (!elm_win_socket_listen(win_socket, "ello", 0, EINA_FALSE)) + { + printf("Fail to elm win socket listen \n"); + evas_object_del(win_socket); + evas_object_del(win); + return; + } + elm_win_title_set(win_socket, "Window Socket"); + elm_win_autodel_set(win_socket, EINA_TRUE); + + fill(win_socket, EINA_TRUE); + + evas_object_resize(win_socket, 400, 600); + evas_object_show(win_socket); + + evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _win_del, + win_socket); +} diff --git a/src/bin/elementary/test_win_state.c b/src/bin/elementary/test_win_state.c new file mode 100644 index 0000000000..c4b07f42c7 --- /dev/null +++ b/src/bin/elementary/test_win_state.c @@ -0,0 +1,630 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +typedef struct _Testitem +{ + Elm_Object_Item *item; + int mode, onoff; +} Testitem; + +static int rotate_with_resize = 0; +static Eina_Bool fullscreen = EINA_FALSE; + +static void +my_bt_38_alpha_on(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + Evas_Object *bg = evas_object_data_get(win, "bg"); + evas_object_hide(bg); + elm_win_alpha_set(win, EINA_TRUE); +} + +static void +my_bt_38_alpha_off(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + Evas_Object *bg = evas_object_data_get(win, "bg"); + evas_object_show(bg); + elm_win_alpha_set(win, EINA_FALSE); +} + +static Eina_Bool +_activate_timer_cb(void *data) +{ + printf("Activate window\n"); + elm_win_activate(data); + return ECORE_CALLBACK_CANCEL; +} + +static Eina_Bool +_deiconify_timer_cb(void *data) +{ + printf("Deiconify window\n"); + elm_win_iconified_set(data, EINA_FALSE); + return ECORE_CALLBACK_CANCEL; +} + +static Eina_Bool +_unwith(void *data) +{ + printf("show\n"); + evas_object_show(data); + elm_win_activate(data); + return EINA_FALSE; +} + +static void +my_bt_38_withdraw(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + printf("withdraw, current %i\n", elm_win_withdrawn_get(win)); + elm_win_withdrawn_set(win, EINA_TRUE); + ecore_timer_add(10.0, _unwith, win); +} + +static void +my_bt_38_massive(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + evas_object_resize(win, 4000, 2400); +} + +static void +my_ck_38_resize(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + rotate_with_resize = elm_check_state_get(obj); +} + +static void +my_bt_38_rot_0(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + if (rotate_with_resize) + elm_win_rotation_with_resize_set(win, 0); + else + elm_win_rotation_set(win, 0); +} + +static void +my_bt_38_rot_90(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + if (rotate_with_resize) + elm_win_rotation_with_resize_set(win, 90); + else + elm_win_rotation_set(win, 90); +} + +static void +my_bt_38_rot_180(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + if (rotate_with_resize) + elm_win_rotation_with_resize_set(win, 180); + else + elm_win_rotation_set(win, 180); +} + +static void +my_bt_38_rot_270(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + if (rotate_with_resize) + elm_win_rotation_with_resize_set(win, 270); + else + elm_win_rotation_set(win, 270); +} + +static void +my_ck_38_fullscreen(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + fullscreen = elm_check_state_get(obj); + elm_win_fullscreen_set(win, fullscreen); +} + +static void +my_ck_38_borderless(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + Eina_Bool borderless = elm_check_state_get(obj); + elm_win_borderless_set(win, borderless); +} + +static void +my_win_move(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Coord x, y; + elm_win_screen_position_get(obj, &x, &y); + printf("MOVE - win geom: %4i %4i\n", x, y); +} + +static void +_win_resize(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Coord w, h; + evas_object_geometry_get(obj, NULL, NULL, &w, &h); + printf("RESIZE - win geom: %4ix%4i\n", w, h); +} + +static void +_win_foc_in(void *data EINA_UNUSED, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("FOC IN\n"); +} + +static void +_win_foc_out(void *data EINA_UNUSED, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("FOC OUT\n"); +} + +static void +_close_win(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + evas_object_del(data); +} + +static void +_move_20_20(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + evas_object_move(data, 20, 20); +} + +static void +_move_0_0(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + evas_object_move(data, 0, 0); +} + +static void +_bt_win_lower(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("Lower window\n"); + elm_win_lower(data); +} + +static void +_bt_win_iconify_and_activate(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("Iconify window. (current status: %i)\n", elm_win_iconified_get(data)); + elm_win_iconified_set(data, EINA_TRUE); + + printf("This window will be activated in 5 seconds.\n"); + ecore_timer_add(5.0, _activate_timer_cb, data); +} + +static void +_bt_win_iconify_and_deiconify(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("Iconify window. (current status: %i)\n", elm_win_iconified_get(data)); + elm_win_iconified_set(data, EINA_TRUE); + + printf("This window will be deiconified in 5 seconds.\n"); + ecore_timer_add(5.0, _deiconify_timer_cb, data); +} + +static void +_bt_win_center_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + printf("Center window.\n"); + elm_win_center(data, EINA_TRUE, EINA_TRUE); +} + +static void +_win_state_print_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("WIN: %s\n", (char *)data); +} + +static void +_win_state_focus_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("WIN FOCUS: %s\n", (char *)data); +} + +static void +_win_show(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("win: show\n"); +} + +static void +_win_hide(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("win: hide\n"); +} + +void +test_win_state(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bg, *sl, *bx, *bx2, *bt, *ck; + + win = elm_win_add(NULL, "window-states", ELM_WIN_BASIC); + elm_win_title_set(win, "Window States"); + evas_object_smart_callback_add(win, "moved", my_win_move, NULL); + evas_object_event_callback_add(win, EVAS_CALLBACK_RESIZE, _win_resize, NULL); + evas_event_callback_add(evas_object_evas_get(win), EVAS_CALLBACK_CANVAS_FOCUS_IN, _win_foc_in, NULL); + evas_event_callback_add(evas_object_evas_get(win), EVAS_CALLBACK_CANVAS_FOCUS_OUT, _win_foc_out, NULL); + evas_object_event_callback_add(win, EVAS_CALLBACK_SHOW, _win_show, NULL); + evas_object_event_callback_add(win, EVAS_CALLBACK_HIDE, _win_hide, NULL); + evas_object_smart_callback_add(win, "withdrawn", _win_state_print_cb, "withdrawn"); + evas_object_smart_callback_add(win, "iconified", _win_state_print_cb, "iconified"); + evas_object_smart_callback_add(win, "normal", _win_state_print_cb, "normal"); + evas_object_smart_callback_add(win, "stick", _win_state_print_cb, "stick"); + evas_object_smart_callback_add(win, "unstick", _win_state_print_cb, "unstick"); + evas_object_smart_callback_add(win, "fullscreen", _win_state_print_cb, "fullscreen"); + evas_object_smart_callback_add(win, "unfullscreen", _win_state_print_cb, "unfullscreen"); + evas_object_smart_callback_add(win, "maximized", _win_state_print_cb, "maximized"); + evas_object_smart_callback_add(win, "unmaximized", _win_state_print_cb, "unmaximized"); + evas_object_smart_callback_add(win, "ioerr", _win_state_print_cb, "ioerr"); + evas_object_smart_callback_add(win, "indicator,prop,changed", _win_state_print_cb, "indicator,prop,changed"); + evas_object_smart_callback_add(win, "rotation,changed", _win_state_print_cb, "rotation,changed"); + evas_object_smart_callback_add(win, "profile,changed", _win_state_print_cb, "profile,changed"); + evas_object_smart_callback_add(win, "focused", _win_state_focus_cb, "focused"); + evas_object_smart_callback_add(win, "unfocused", _win_state_focus_cb, "unfocused"); + evas_object_smart_callback_add(win, "focus,out", _win_state_focus_cb, "focus,out"); + evas_object_smart_callback_add(win, "focus,in", _win_state_focus_cb, "focus,in"); + evas_object_smart_callback_add(win, "delete,request", _win_state_print_cb, "delete,request"); + evas_object_smart_callback_add(win, "wm,rotation,changed", _win_state_print_cb, "wm,rotation,changed"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + evas_object_data_set(win, "bg", bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Alpha On"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_alpha_on, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Alpha Off"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_alpha_off, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Withdraw"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_withdraw, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Massive"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_massive, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Move 20 20"); + evas_object_smart_callback_add(bt, "clicked", _move_20_20, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Lower"); + evas_object_smart_callback_add(bt, "clicked", _bt_win_lower, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Iconify and Activate"); + evas_object_smart_callback_add(bt, "clicked", + _bt_win_iconify_and_activate, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(bx2); + elm_object_text_set(bt, "Iconify and Deiconify"); + evas_object_smart_callback_add(bt, "clicked", + _bt_win_iconify_and_deiconify, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Center"); + evas_object_smart_callback_add(bt, "clicked", + _bt_win_center_cb, win); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "Test"); + elm_slider_span_size_set(sl, 100); + evas_object_size_hint_align_set(sl, 0.5, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_slider_indicator_format_set(sl, "%3.0f"); + elm_slider_min_max_set(sl, 50, 150); + elm_slider_value_set(sl, 50); + elm_slider_inverted_set(sl, EINA_TRUE); + elm_box_pack_end(bx2, sl); + evas_object_show(sl); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + ck = elm_check_add(win); + elm_object_text_set(ck, "resize"); + elm_check_state_set(ck, rotate_with_resize); + evas_object_smart_callback_add(ck, "changed", my_ck_38_resize, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.02, 0.99); + evas_object_show(ck); + elm_box_pack_end(bx, ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "fullscreen"); + elm_check_state_set(ck, fullscreen); + evas_object_smart_callback_add(ck, "changed", my_ck_38_fullscreen, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.02, 0.99); + evas_object_show(ck); + elm_box_pack_end(bx, ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "borderless"); + elm_check_state_set(ck, fullscreen); + evas_object_smart_callback_add(ck, "changed", my_ck_38_borderless, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.02, 0.99); + evas_object_show(ck); + elm_box_pack_end(bx, ck); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Rot 0"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_rot_0, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Rot 90"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_rot_90, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Rot 180"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_rot_180, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Rot 270"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_rot_270, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Move 0 0"); + evas_object_smart_callback_add(bt, "clicked", _move_0_0, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 280, 400); + evas_object_show(win); +} + +void +test_win_state2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win, *bg, *sl, *bx, *bx2, *bt, *ck; + char buf[PATH_MAX]; + + win = elm_win_add(NULL, "window-states2", ELM_WIN_BASIC); + elm_win_override_set(win, EINA_TRUE); + evas_object_smart_callback_add(win, "moved", my_win_move, NULL); + evas_object_event_callback_add(win, EVAS_CALLBACK_RESIZE, _win_resize, NULL); + elm_win_title_set(win, "Window States 2"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get()); + elm_bg_file_set(bg, buf, NULL); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + evas_object_data_set(win, "bg", bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Alpha On"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_alpha_on, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Alpha Off"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_alpha_off, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", _close_win, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Move 20 20"); + evas_object_smart_callback_add(bt, "clicked", _move_20_20, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "Override Redirect"); + elm_slider_span_size_set(sl, 100); + evas_object_size_hint_align_set(sl, 0.5, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_slider_indicator_format_set(sl, "%3.0f"); + elm_slider_min_max_set(sl, 50, 150); + elm_slider_value_set(sl, 50); + elm_slider_inverted_set(sl, EINA_TRUE); + elm_box_pack_end(bx2, sl); + evas_object_show(sl); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + ck = elm_check_add(win); + elm_object_text_set(ck, "resize"); + elm_check_state_set(ck, rotate_with_resize); + evas_object_smart_callback_add(ck, "changed", my_ck_38_resize, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.02, 0.99); + evas_object_show(ck); + elm_box_pack_end(bx, ck); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Rot 0"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_rot_0, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Rot 90"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_rot_90, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Rot 180"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_rot_180, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Rot 270"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_rot_270, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Move 0 0"); + evas_object_smart_callback_add(bt, "clicked", _move_0_0, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} diff --git a/src/bin/elementary/test_win_wm_rotation.c b/src/bin/elementary/test_win_wm_rotation.c new file mode 100644 index 0000000000..1a37961310 --- /dev/null +++ b/src/bin/elementary/test_win_wm_rotation.c @@ -0,0 +1,214 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include <Elementary.h> + +typedef struct _App_Data App_Data; + +struct _App_Data +{ + Eina_Bool wm_rot_supported; + Eina_List *chs; + int available_rots[4]; + Evas_Object *lb; + Evas_Object *rdg; +}; + +static void +_bt_available_rots_set(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + App_Data *ad = evas_object_data_get(win, "ad"); + Evas_Object *o; + Eina_List *l; + const char *str; + unsigned int i = 0; + + if (!ad->wm_rot_supported) return; + + EINA_LIST_FOREACH(ad->chs, l, o) + { + if (!elm_check_state_get(o)) continue; + str = elm_object_text_get(o); + if (!str) continue; + ad->available_rots[i] = atoi(str); + i++; + } + + elm_win_wm_rotation_available_rotations_set + (win, ad->available_rots, i); +} + +static void +_bt_preferred_rot_set(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = (Evas_Object *)(data); + App_Data *ad = evas_object_data_get(win, "ad"); + + if (!ad->wm_rot_supported) return; + + Evas_Object *rd = elm_radio_selected_object_get(ad->rdg); + if (rd) + { + const char *str = elm_object_text_get(rd); + int rot = 0; + + if (!strcmp(str, "Unset")) + rot = -1; + else + rot = atoi(str); + + elm_win_wm_rotation_preferred_rotation_set(win, rot); + } +} + +static void +_win_wm_rotation_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) +{ + Evas_Object *win = data; + App_Data *ad = evas_object_data_get(win, "ad"); + int rot = elm_win_rotation_get(win); + char buf[32]; + + if (!ad->wm_rot_supported) return; + + eina_convert_itoa(rot, buf); + elm_object_text_set(ad->lb, eina_stringshare_add(buf)); +} + +static void +_win_del_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + App_Data *ad = evas_object_data_get(obj, "ad"); + Evas_Object *o; + + if (ad->wm_rot_supported) + { + EINA_LIST_FREE(ad->chs, o) + evas_object_data_del(o, "rotation"); + } + + free(ad); +} + +void +test_win_wm_rotation(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + App_Data *ad; + Evas_Object *win, *bx, *bx2, *lb, *ch, *bt, *en, *rd, *rdg = NULL; + int i; + char buf[32]; + + if (!(ad = calloc(1, sizeof(App_Data)))) return; + + win = elm_win_util_standard_add("wmrotation", "WMRotation"); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_data_set(win, "ad", ad); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, "<b>Window manager rotation test</b>"); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + ad->wm_rot_supported = elm_win_wm_rotation_supported_get(win); + if (ad->wm_rot_supported) + { + int rots[] = { 0, 90, 270 }; + elm_win_wm_rotation_available_rotations_set(win, rots, (sizeof(rots) / sizeof(int))); + elm_win_wm_rotation_preferred_rotation_set(win, 90); + + bx2 = elm_box_add(win); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0.0); + elm_box_align_set(bx2, 0.0, 0.5); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + for (i = 0; i < 4; i++) + { + ch = elm_check_add(win); + eina_convert_itoa((i * 90), buf); + elm_object_text_set(ch, eina_stringshare_add(buf)); + evas_object_size_hint_weight_set(ch, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx2, ch); + evas_object_show(ch); + + if (i != 2) elm_check_state_set(ch, EINA_TRUE); + + ad->chs = eina_list_append(ad->chs, ch); + } + + bt = elm_button_add(win); + elm_object_text_set(bt, "Available rotations"); + evas_object_smart_callback_add(bt, "clicked", _bt_available_rots_set, win); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bx2 = elm_box_add(win); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0.0); + elm_box_align_set(bx2, 0.0, 0.5); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + for (i = 0; i < 5; i++) + { + rd = elm_radio_add(win); + if (!rdg) rdg = rd; + elm_radio_state_value_set(rd, i); + elm_radio_group_add(rd, rdg); + + if (i == 0) + elm_object_text_set(rd, "Unset"); + else + { + eina_convert_itoa(((i - 1) * 90), buf); + elm_object_text_set(rd, eina_stringshare_add(buf)); + } + + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx2, rd); + evas_object_show(rd); + } + + elm_radio_value_set(rdg, 2); + ad->rdg = rdg; + + bt = elm_button_add(win); + elm_object_text_set(bt, "Preferred rotation"); + evas_object_smart_callback_add(bt, "clicked", _bt_preferred_rot_set, win); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + evas_object_smart_callback_add(win, "wm,rotation,changed", _win_wm_rotation_changed_cb, win); + } + else + printf("Window manager doesn't support rotation\n"); + + en = elm_entry_add(win); + elm_entry_single_line_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, en); + evas_object_show(en); + + lb = elm_label_add(win); + elm_object_text_set(lb, "N/A"); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + ad->lb = lb; + + evas_object_smart_callback_add(win, "delete,request", _win_del_cb, NULL); + + evas_object_resize(win, 480, 400); + evas_object_show(bx); + evas_object_show(win); +} |