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
This commit is contained in:
Hermet Park 2016-02-09 17:19:23 +09:00
parent c5c352c917
commit ab0dab409c
4 changed files with 172 additions and 121 deletions

View File

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

View File

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

View File

@ -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;
@ -104,36 +102,6 @@ slider_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
ctxdata->animator = ecore_animator_add(changed_animator_cb, ctxdata);
}
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)
{
@ -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);
}

View File

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