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

-- 


Reply via email to