hermet pushed a commit to branch master. http://git.enlightenment.org/tools/enventor.git/commit/?id=ab0dab409c8b987758d9b4408d6937e48d3193c3
commit ab0dab409c8b987758d9b4408d6937e48d3193c3 Author: Hermet Park <her...@hermet.pe.kr> Date: Tue Feb 9 17:19:23 2016 +0900 stats: add a function to resize a live view. previously, editor ctxpopup had inc/dec buttons to control values elaboratly. I removed them because user could control them using mouse wheel. I believe it's cleaner and nicer ui for enventor. @feature --- data/themes/default/layout_common.edc | 43 ++++------- src/bin/statusbar.c | 136 ++++++++++++++++++++++++++++++++-- src/lib/ctxpopup.c | 77 +++---------------- src/lib/edj_viewer.c | 37 ++++----- 4 files changed, 172 insertions(+), 121 deletions(-) diff --git a/data/themes/default/layout_common.edc b/data/themes/default/layout_common.edc index 9b0bec7..3a9fdd4 100644 --- a/data/themes/default/layout_common.edc +++ b/data/themes/default/layout_common.edc @@ -1595,7 +1595,7 @@ group { name: "slider_layout"; type: RECT; scale: 1; description { state: "default" 0.0; - min: 215 1; + min: 235 1; color: 56 56 56 255; } description { state: "odd" 0.0; @@ -1696,7 +1696,7 @@ group { name: "slider_layout"; rel2.to: "padding1"; rel2.relative: 1.0 1.0; align: 0 0; - min: 125 0; + min: 185 0; fixed: 1 0; } } @@ -1713,30 +1713,6 @@ group { name: "slider_layout"; fixed: 1 0; } } - part { name: "elm.swallow.down"; - type: SWALLOW; - scale: 1; - description { state: "default" 0.0; - min: 20 20; - fixed: 1 1; - align: 1.0 0.5; - rel1.to: "elm.swallow.up"; - rel1.relative: 0.0 0.5; - rel2.to: "elm.swallow.up"; - rel2.relative: 0.0 0.5; - } - } - part { name: "elm.swallow.up"; - type: SWALLOW; - scale: 1; - description { state: "default" 0.0; - min: 20 20; - fixed: 1 1; - align: 1.0 0.5; - rel1.relative: 1.0 0.5; - rel2.relative: 1.0 0.5; - } - } } programs { program { name: "odd_item_set"; @@ -1817,7 +1793,7 @@ group { name: "statusbar_layout"; align: 0 0.5; } } - swallow { "invert_btn"; + swallow { "resize_btn"; clip_to: "base_clip"; scale: 1; desc { @@ -1830,6 +1806,19 @@ group { name: "statusbar_layout"; min: 15 15; } } + swallow { "invert_btn"; + clip_to: "base_clip"; + scale: 1; + desc { + rel1.to_x: "resize_btn"; + rel1.relative: 1.0 0; + rel2.relative: 0.0 1; + rel1.offset: 3 -3; + align: 0 0; + fixed: 1 0; + min: 15 15; + } + } part { name: "elm.text.size_w"; type: TEXT; clip_to: "base_clip"; diff --git a/src/bin/statusbar.c b/src/bin/statusbar.c index 489f9ce..564c1f8 100644 --- a/src/bin/statusbar.c +++ b/src/bin/statusbar.c @@ -1,5 +1,8 @@ #include "common.h" +#define VIEW_RESIZE_TYPE_W "W" +#define VIEW_RESIZE_TYPE_H "H" + typedef struct statusbar_s { Evas_Object *layout; @@ -19,9 +22,13 @@ typedef struct invert_transit_data_s stats_data *g_sd = NULL; +/*****************************************************************************/ +/* Internal method implementation */ +/*****************************************************************************/ + static void -slider_changed_cb(void *data, Evas_Object *obj, - void *event_info EINA_UNUSED) +view_scale_slider_changed_cb(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) { stats_data *sd = data; @@ -58,7 +65,8 @@ ctxpopup_dismissed_cb(void *data, Evas_Object *obj, } static void -transit_op_invert(void *data, Elm_Transit *transit EINA_UNUSED, double progress) +view_invert_transit_op(void *data, Elm_Transit *transit EINA_UNUSED, + double progress) { invert_data *id = data; Evas_Coord w, h; @@ -72,7 +80,7 @@ transit_op_invert(void *data, Elm_Transit *transit EINA_UNUSED, double progress) } static void -transit_op_end(void *data, Elm_Transit *transit EINA_UNUSED) +view_invert_transit_end(void *data, Elm_Transit *transit EINA_UNUSED) { invert_data *id = data; config_view_size_set((id->orig_w + id->diff_w), (id->orig_h + id->diff_h)); @@ -94,16 +102,119 @@ view_invert_btn_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) id->diff_h = w - h; Elm_Transit *transit = elm_transit_add(); - elm_transit_effect_add(transit, transit_op_invert, id, transit_op_end); + elm_transit_effect_add(transit, view_invert_transit_op, id, + view_invert_transit_end); elm_transit_tween_mode_set(transit, ELM_TRANSIT_TWEEN_MODE_DECELERATE); elm_transit_duration_set(transit, TRANSIT_TIME); elm_transit_go(transit); } static void +view_resize_slider_changed_cb(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Evas_Object *layout = data; + Eina_Bool horizontal; + const char *type = elm_object_part_text_get(layout, "elm.text.type"); + if (type && !strcmp(type, VIEW_RESIZE_TYPE_W)) + horizontal = EINA_TRUE; + else + horizontal = EINA_FALSE; + + Evas_Object *slider = elm_object_part_content_get(layout, + "elm.swallow.slider"); + int val = elm_slider_value_get(slider); + int w, h; + config_view_size_get(&w, &h); + if (horizontal) + { + config_view_size_set(val, h); + enventor_object_live_view_size_set(base_enventor_get(), val, h); + } + else + { + config_view_size_set(w, val); + enventor_object_live_view_size_set(base_enventor_get(), w, val); + } +} + +static Evas_Object * +view_resize_slider_layout_create(Evas_Object *parent, const char *type, + int slider_val) +{ + //Layout + Evas_Object *layout = elm_layout_add(parent); + elm_layout_file_set(layout, EDJE_PATH, "slider_layout"); + evas_object_show(layout); + + //Type + elm_object_part_text_set(layout, "elm.text.type", type); + + //Slider + Evas_Object *slider = elm_slider_add(layout); + elm_slider_span_size_set(slider, 120); + elm_slider_indicator_show_set(slider, EINA_FALSE); + double step = 1 / (double) (3840 - 1); + elm_slider_step_set(slider, step); + elm_slider_min_max_set(slider, 1, 3840); + elm_slider_value_set(slider, slider_val); + evas_object_smart_callback_add(slider, "changed", + view_resize_slider_changed_cb, layout); + elm_object_part_text_set(layout, "elm.text.slider_min", "1"); + elm_object_part_text_set(layout, "elm.text.slider_max", "3840"); + elm_object_part_content_set(layout, "elm.swallow.slider", slider); + + return layout; +} + +static void +view_resize_btn_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + stats_data *sd = data; + evas_object_del(sd->ctxpopup); + + //Ctxpopup + Evas_Object *ctxpopup = elm_ctxpopup_add(base_layout_get()); + if (!ctxpopup) return; + + elm_object_style_set(ctxpopup, elm_app_name_get()); + elm_ctxpopup_direction_priority_set(ctxpopup, ELM_CTXPOPUP_DIRECTION_UP, + ELM_CTXPOPUP_DIRECTION_RIGHT, + ELM_CTXPOPUP_DIRECTION_LEFT, + ELM_CTXPOPUP_DIRECTION_DOWN); + //Slider Layout + Evas_Object *box = elm_box_add(ctxpopup); + 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); + elm_object_content_set(ctxpopup, box); + + Evas_Object *slider; + Evas_Coord w, h; + config_view_size_get(&w, &h); + + //Slider 1 + slider = view_resize_slider_layout_create(box, VIEW_RESIZE_TYPE_W, w); + elm_box_pack_end(box, slider); + + //Slider 2 + slider = view_resize_slider_layout_create(box, VIEW_RESIZE_TYPE_H, h); + elm_object_signal_emit(slider, "odd,item,set", ""); + elm_box_pack_end(box, slider); + + //Ctxpopup Position + Evas_Coord x, y; + evas_object_geometry_get(obj, &x, &y, &w, &h); + evas_object_move(ctxpopup, x + (w/2), y); + evas_object_show(ctxpopup); + + sd->ctxpopup = ctxpopup; +} + +static void view_scale_btn_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { stats_data *sd = data; + evas_object_del(sd->ctxpopup); //Ctxpopup Evas_Object *ctxpopup = elm_ctxpopup_add(base_layout_get()); @@ -119,13 +230,14 @@ view_scale_btn_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) elm_slider_inverted_set(slider, EINA_TRUE); elm_slider_min_max_set(slider, MIN_VIEW_SCALE, MAX_VIEW_SCALE); elm_slider_value_set(slider, (double) config_view_scale_get()); - evas_object_smart_callback_add(slider, "changed", slider_changed_cb, - sd); + evas_object_smart_callback_add(slider, "changed", + view_scale_slider_changed_cb, sd); evas_object_smart_callback_add(ctxpopup, "dismissed", ctxpopup_dismissed_cb, sd); elm_object_content_set(ctxpopup, slider); + //Ctxpopup Position Evas_Coord x, y, w, h; evas_object_geometry_get(obj, &x, &y, &w, &h); evas_object_move(ctxpopup, x, y); @@ -163,6 +275,10 @@ create_statusbar_btn(Evas_Object *layout, const char *image, return btn; } +/*****************************************************************************/ +/* Externally accessible calls */ +/*****************************************************************************/ + void stats_line_num_update(int cur_line, int max_line) { @@ -204,7 +320,11 @@ stats_init(Evas_Object *parent) create_statusbar_btn(layout, "expand", "scale_btn", "View Scale (Ctrl + Mouse Wheel)", view_scale_btn_cb, sd); - + //View Resize Button + create_statusbar_btn(layout, "expand", "resize_btn", + "Resize View Size", + view_resize_btn_cb, sd); + //View Invert Button create_statusbar_btn(layout, "invert", "invert_btn", "Invert View Size", view_invert_btn_cb, sd); diff --git a/src/lib/ctxpopup.c b/src/lib/ctxpopup.c index 3791c58..768afa5 100644 --- a/src/lib/ctxpopup.c +++ b/src/lib/ctxpopup.c @@ -15,8 +15,6 @@ typedef struct ctxpopup_data_s { attr_value *attr; char candidate[256]; - /* These 2 variables are used for lazy update for slider button. */ - Evas_Object *slider; Ecore_Animator *animator; Eina_Bool integer : 1; @@ -105,36 +103,6 @@ slider_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) } static void -btn_up_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) -{ - ctxpopup_data *ctxdata = data; - Evas_Object *layout = (Evas_Object *)evas_object_data_get(obj, "layout"); - Evas_Object *slider = elm_object_part_content_get(layout, - "elm.swallow.slider"); - double value = elm_slider_value_get(slider); - - if (ctxdata->attr->type & ATTR_VALUE_INTEGER) value += 1; - else value += 0.01; - elm_slider_value_set(slider, value); - slider_changed_cb(ctxdata, ctxdata->slider, NULL); -} - -static void -btn_down_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) -{ - ctxpopup_data *ctxdata = data; - Evas_Object *layout = (Evas_Object *)evas_object_data_get(obj, "layout"); - Evas_Object *slider = elm_object_part_content_get(layout, - "elm.swallow.slider"); - double value = elm_slider_value_get(slider); - - if (ctxdata->attr->type & ATTR_VALUE_INTEGER) value -= 1; - else value -= 0.01; - elm_slider_value_set(slider, value); - slider_changed_cb(ctxdata, ctxdata->slider, NULL); -} - -static void entry_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { ctxpopup_data *ctxdata = data; @@ -279,53 +247,27 @@ slider_layout_create(Evas_Object *parent, ctxpopup_data *ctxdata, ctxdata); char slider_min[16]; char slider_max[16]; + double step_size; + if (ctxdata->integer) { snprintf(slider_min, sizeof(slider_min), "%1.0f", attr->min); snprintf(slider_max, sizeof(slider_max), "%1.0f", attr->max); + step_size = 1 / (double) (attr->max - attr->min); + elm_slider_step_set(slider, step_size); } else { snprintf(slider_min, sizeof(slider_min), "%1.2f", attr->min); snprintf(slider_max, sizeof(slider_max), "%1.2f", attr->max); + step_size = 1 / (double) (attr->max * 100 - attr->min); + elm_slider_step_set(slider, step_size); } + elm_object_part_text_set(layout, "elm.text.slider_min", slider_min); elm_object_part_text_set(layout, "elm.text.slider_max", slider_max); elm_object_part_content_set(layout, "elm.swallow.slider", slider); - Evas_Object *btn; - Evas_Object *img; - - //Down Button - btn = elm_button_add(layout); - elm_button_autorepeat_set(btn, EINA_TRUE); - elm_button_autorepeat_initial_timeout_set(btn, 0.5); - elm_button_autorepeat_gap_timeout_set(btn, 0.1); - evas_object_data_set(btn, "layout", layout); - evas_object_smart_callback_add(btn, "clicked", btn_down_cb, ctxdata); - evas_object_smart_callback_add(btn, "repeated", btn_down_cb, ctxdata); - elm_object_part_content_set(layout, "elm.swallow.down", btn); - - //Down Image - img = elm_image_add(btn); - elm_image_file_set(img, EDJE_PATH, "down"); - elm_object_content_set(btn, img); - - //Up Button - btn = elm_button_add(layout); - elm_button_autorepeat_set(btn, EINA_TRUE); - elm_button_autorepeat_initial_timeout_set(btn, 0.5); - elm_button_autorepeat_gap_timeout_set(btn, 0.1); - evas_object_data_set(btn, "layout", layout); - evas_object_smart_callback_add(btn, "clicked", btn_up_cb, ctxdata); - evas_object_smart_callback_add(btn, "repeated", btn_up_cb, ctxdata); - elm_object_part_content_set(layout, "elm.swallow.up", btn); - - //Up Image - img = elm_image_add(btn); - elm_image_file_set(img, EDJE_PATH, "up"); - elm_object_content_set(btn, img); - return layout; } @@ -342,10 +284,8 @@ slider_layout_set(Evas_Object *ctxpopup, ctxpopup_data *ctxdata) //Box Evas_Object *box = elm_box_add(ctxpopup); - evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, - EVAS_HINT_EXPAND); + 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); //Layout Evas_Object *layout = NULL; @@ -361,6 +301,7 @@ slider_layout_set(Evas_Object *ctxpopup, ctxpopup_data *ctxdata) Evas_Object *edje = elm_layout_edje_get(layout); edje_object_size_min_calc(edje, &layout_w, NULL); + //Check if the ctxpopup is useless due to it's space. if (edit_w <= layout_w + CTXPOPUP_BORDER_SIZE) evas_object_del(ctxpopup); } diff --git a/src/lib/edj_viewer.c b/src/lib/edj_viewer.c index 55f7827..1222f27 100644 --- a/src/lib/edj_viewer.c +++ b/src/lib/edj_viewer.c @@ -97,12 +97,14 @@ static void view_obj_min_update(view_data *vd) { double scale = edj_mgr_view_scale_get(); - evas_object_size_hint_min_set(vd->layout, - ((double)vd->view_config_size.w * scale), - ((double)vd->view_config_size.h * scale)); - evas_object_size_hint_max_set(vd->layout, - ((double)vd->view_config_size.w * scale), - ((double)vd->view_config_size.h * scale)); + + double min_w = (double) vd->view_config_size.w * scale; + if (1 > min_w) min_w = 1; + double min_h = (double) vd->view_config_size.h * scale; + if (1 > min_h) min_h = 1; + + evas_object_size_hint_min_set(vd->layout, min_w, min_h); + evas_object_size_hint_max_set(vd->layout, min_w, min_h); } static void @@ -406,16 +408,6 @@ layout_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, evas_object_del(rect); } -static void -layout_resize_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) -{ - static Enventor_Live_View_Size size; - view_data *vd = data; - view_size_get(vd, &size.w, &size.h); - evas_object_smart_callback_call(vd->enventor, SIG_LIVE_VIEW_RESIZED, &size); -} - static Evas_Object * base_create(Evas_Object *parent) { @@ -448,8 +440,6 @@ view_obj_create(view_data *vd) evas_object_size_hint_weight_set(vd->layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_event_callback_add(vd->layout, EVAS_CALLBACK_RESIZE, - layout_resize_cb, vd); evas_object_smart_callback_add(vd->layout, "dummy,clicked", dummy_clicked_cb, vd); @@ -709,11 +699,22 @@ view_scale_set(view_data *vd, double scale) void view_size_set(view_data *vd, Evas_Coord w, Evas_Coord h) { + static Enventor_Live_View_Size size; + if (!vd) return; + double scale = edj_mgr_view_scale_get(); + int prev_w = vd->view_config_size.w; + int prev_h = vd->view_config_size.h; + vd->view_config_size.w = w; vd->view_config_size.h = h; view_obj_min_update(vd); + + if ((prev_w == w) && (prev_h == h)) return; + + view_size_get(vd, &size.w, &size.h); + evas_object_smart_callback_call(vd->enventor, SIG_LIVE_VIEW_RESIZED, &size); } void --