From 350ee8c413d8e1204b44276bc717b2e8caa40f14 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 22 Jan 2016 17:34:32 +0900 Subject: [PATCH] add live view scale slider onto status bar. @feature --- data/themes/default/images.edc | 2 + data/themes/default/images/Makefile.am | 3 +- data/themes/default/images/expand.png | Bin 0 -> 202 bytes data/themes/default/layout_common.edc | 90 +++++++++++++++++-- po/en.po | 5 -- po/ru.po | 5 -- src/bin/base_gui.c | 12 +++ src/bin/live_edit.c | 1 - src/bin/main.c | 9 +- src/bin/menu.c | 2 + src/bin/statusbar.c | 115 +++++++++++++++++++++++++ src/include/base_gui.h | 2 +- src/include/common.h | 2 + src/include/config_data.h | 2 +- src/include/statusbar.h | 2 + 15 files changed, 226 insertions(+), 26 deletions(-) create mode 100644 data/themes/default/images/expand.png diff --git a/data/themes/default/images.edc b/data/themes/default/images.edc index ab0b573..f48381f 100644 --- a/data/themes/default/images.edc +++ b/data/themes/default/images.edc @@ -19,6 +19,7 @@ images { image: "live_text.png" COMP; image: "live_textblock.png" COMP; image: "live_edit.png" COMP; + image: "expand.png" COMP; } #define ICON_GROUP(_group_name, _image_path) \ @@ -45,6 +46,7 @@ ICON_GROUP("live_edit", "live_edit.png") ICON_GROUP("save", "save.png") ICON_GROUP("undo", "undo.png") ICON_GROUP("redo", "redo.png") +ICON_GROUP("expand", "expand.png") ICON_GROUP("IMAGE", "live_image.png") ICON_GROUP("RECT", "live_rectangle.png") ICON_GROUP("SPACER", "live_spacer.png") diff --git a/data/themes/default/images/Makefile.am b/data/themes/default/images/Makefile.am index 177e9ef..c5f9571 100644 --- a/data/themes/default/images/Makefile.am +++ b/data/themes/default/images/Makefile.am @@ -67,4 +67,5 @@ EXTRA_DIST = \ redo.png \ undo.png \ white_bar_vert_glow.png \ - horizontal_separated_bar_small_glow.png + horizontal_separated_bar_small_glow.png \ + expand.png diff --git a/data/themes/default/images/expand.png b/data/themes/default/images/expand.png new file mode 100644 index 0000000000000000000000000000000000000000..6d9996c90b4b4569d88c264d12069062b6d4de58 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4u_bxCyDx`7I;J! zGca%qgD@k*tT_@uLG}_)Usv`AjACqxMwi@I07V!iOI#yLobz*YQ}ap~oQqNuOHxx5 z$}>wc6x=<11Hv2m#DR*8JY5_^BrYc>I57WT$PhcHv(e)~N1jxdin6luPqn0C@l7k2 n%f^>bP0l+XkKsQ5Vd literal 0 HcmV?d00001 diff --git a/data/themes/default/layout_common.edc b/data/themes/default/layout_common.edc index 562340a..4c1142a 100644 --- a/data/themes/default/layout_common.edc +++ b/data/themes/default/layout_common.edc @@ -1793,32 +1793,78 @@ group { name: "statusbar_layout"; color: 0 0 0 0; } } - part { name: "size_spacer"; + part { name: "scale_spacer"; type: SPACER; scale: 1; description { state: "default" 0.0; rel1.relative: 0 0; rel2.relative: 0 1; - min: 250 0; + min: 120 0; fixed: 1 0; } } + swallow { "scale_btn"; + clip_to: "base_clip"; + scale: 1; + description { state: "default" 0.0; + rel1.relative: 0.0 0.0; + rel2.relative: 0.0 1.0; + align: 0.0 0.5; + min: 18 18; + fixed: 1 0; + } + } + part { name: "elm.text.scale"; + type: TEXT; + clip_to: "base_clip"; + scale: 1; + effect: GLOW; + description { state: "default" 0.0; + rel1.to_x: "scale_btn"; + rel2.to_x: "scale_btn"; + rel1.relative: 1.0 0.0; + rel2.relative: 1.0 1.0; + align: 0 0.5; + fixed: 1 0; + color: COL_HI; + text { + size: 11; + align: 0 0.5; + min: 1 0; + ellipsis: -1; + text:"1.00x"; + } + } + } + part { name: "size_spacer"; + type: SPACER; + scale: 1; + description { state: "default" 0.0; + rel1.relative: 1 0; + rel2.relative: 1 1; + rel1.to: "scale_spacer"; + rel2.to: "scale_spacer"; + min: 120 0; + fixed: 1 0; + align: 0 0.5; + } + } part { name: "elm.text.size["; type: TEXT; clip_to: "base_clip"; scale: 1; effect: SHADOW BOTTOM; description { state: "default" 0.0; + rel1.to_x: "size_spacer"; + rel1.relative: 0.0 0.0; rel2.relative: 0.0 1.0; align: 0 0.5; - rel1.offset: 0 -2; - rel2.offset: -1 -3; fixed: 1 0; color: COL_NM; text { text: "Size ["; size: 11; - align: 0 0; + align: 0 0.5; min: 1 0; ellipsis: -1; } @@ -2130,6 +2176,19 @@ group { name: "statusbar_layout"; align: 1 0.5; } } + swallow { "group_btn"; + clip_to: "base_clip"; + scale: 1; + description { state: "default" 0.0; + rel1.to_x: "elm.text.group["; + rel2.to_x: "elm.text.group["; + rel1.relative: 0.0 0.0; + rel2.relative: 0.0 1.0; + align: 1 0.5; + min: 18 18; + fixed: 1 0; + } + } part { name: "elm.text.group["; type: TEXT; clip_to: "base_clip"; @@ -2147,6 +2206,7 @@ group { name: "statusbar_layout"; size: 11; align: 1 0.5; min: 1 0; + max: 1 0; ellipsis: -1; } } @@ -2204,6 +2264,19 @@ group { name: "statusbar_layout"; fixed: 1 0; } } + swallow { "line_btn"; + clip_to: "base_clip"; + scale: 1; + description { state: "default" 0.0; + rel1.to: "elm.text.line_["; + rel2.to: "elm.text.line_["; + rel1.relative: 0.0 0.0; + rel2.relative: 0.0 1.0; + align: 1 0.5; + min: 18 18; + fixed: 1 0; + } + } part { name: "elm.text.line_["; type: TEXT; clip_to: "base_clip"; @@ -2221,6 +2294,7 @@ group { name: "statusbar_layout"; size: 11; align: 1 0.5; min: 1 0; + max: 1 0; ellipsis: -1; } } @@ -2295,15 +2369,13 @@ group { name: "statusbar_layout"; effect: SHADOW BOTTOM; description { state: "default" 0.0; rel1.relative: 1 0; - rel1.offset: 0 -2; - rel2.offset: -1 -3; align: 1 0.5; fixed: 1 0; color: COL_NM; text { text: "]"; size: 11; - align: 1 0; + align: 1 0.5; min: 1 0; ellipsis: -1; } @@ -2441,7 +2513,7 @@ group { name: "main_layout"; rel1.relative: 0 1; rel2.relative: 1 1; align: 0.5 0; - min: 0 15; + min: 0 18; fixed: 0 1; } description { state: "visible" 0.0; diff --git a/po/en.po b/po/en.po index 264347e..5cb2ce3 100644 --- a/po/en.po +++ b/po/en.po @@ -131,11 +131,6 @@ msgstr "" msgid "Auto Indentation Disabled." msgstr "" -#: src/bin/main.c:180 -#, c-format -msgid "Live View Scale: %2.2fx" -msgstr "" - #: src/bin/main.c:206 #, c-format msgid "Font Size: %1.1fx" diff --git a/po/ru.po b/po/ru.po index 5e7237e..ce72a58 100644 --- a/po/ru.po +++ b/po/ru.po @@ -131,11 +131,6 @@ msgstr "Автовыравнивание Включено" msgid "Auto Indentation Disabled." msgstr "Автовыравнивание Выключено" -#: src/bin/main.c:180 -#, c-format -msgid "Live View Scale: %2.2fx" -msgstr "Масштаб предпросмотра: %2.2fx" - #: src/bin/main.c:206 #, c-format msgid "Font Size: %1.1fx" diff --git a/src/bin/base_gui.c b/src/bin/base_gui.c index 461c4a6..6a1722b 100644 --- a/src/bin/base_gui.c +++ b/src/bin/base_gui.c @@ -5,6 +5,7 @@ typedef struct base_s Evas_Object *win; Evas_Object *layout; Evas_Object *console; + Evas_Object *enventor; Eina_Bool console_msg : 1; } base_data; @@ -271,8 +272,19 @@ base_gui_show(void) evas_object_show(g_bd->win); } +Evas_Object * +base_enventor_get(void) +{ + base_data *bd = g_bd; + assert(bd); + return bd->enventor; +} + void base_enventor_set(Evas_Object *enventor) { + base_data *bd = g_bd; + assert(bd); + bd->enventor = enventor; panes_text_editor_set(enventor); } diff --git a/src/bin/live_edit.c b/src/bin/live_edit.c index 9e2b0d3..c44c939 100644 --- a/src/bin/live_edit.c +++ b/src/bin/live_edit.c @@ -7,7 +7,6 @@ #define CTRL_PT_LAYER 3 #define INFO_TEXT_LAYER (CTRL_PT_LAYER+1) -#define ROUNDING(x, dig) (floor((x) * pow(10, dig) + 0.5) / pow(10, dig)) typedef enum { diff --git a/src/bin/main.c b/src/bin/main.c index 43a6f2b..eed2b71 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -176,9 +176,7 @@ main_mouse_wheel_cb(void *data, int type EINA_UNUSED, void *ev) //Just in live edit mode case. live_edit_update(); - char buf[256]; - snprintf(buf, sizeof(buf), _("Live View Scale: %2.2fx"), scale); - stats_info_msg_update(buf); + stats_view_scale_update(scale); return ECORE_CALLBACK_PASS_ON; } @@ -699,6 +697,8 @@ keygrabber_key_down_cb(void *data, Evas *e EINA_UNUSED, //Main Menu if (!strcmp(ev->key, "Escape")) { + if (stats_ctxpopup_dismiss()) return; + if (live_edit_get()) { live_edit_cancel(); @@ -724,6 +724,7 @@ keygrabber_key_down_cb(void *data, Evas *e EINA_UNUSED, if (file_mgr_warning_is_opened()) return; enventor_object_ctxpopup_dismiss(ad->enventor); + stats_ctxpopup_dismiss(); if (ctrl_func(ad, ev)) return; if (alt_func(ad, ev)) return; @@ -804,6 +805,8 @@ statusbar_set() Evas_Object *obj = stats_init(base_layout_get()); elm_object_part_content_set(base_layout_get(), "elm.swallow.statusbar", obj); tools_status_update(NULL, EINA_FALSE); + + stats_view_scale_update(config_view_scale_get()); } static void diff --git a/src/bin/menu.c b/src/bin/menu.c index a4c8b1c..d621446 100644 --- a/src/bin/menu.c +++ b/src/bin/menu.c @@ -178,6 +178,8 @@ warning_open(menu_data *md, Evas_Smart_Cb yes_cb, Evas_Smart_Cb save_cb) { if (md->warning_layout) return; + stats_ctxpopup_dismiss(); + //Layout Evas_Object *layout = elm_layout_add(base_win_get()); elm_layout_file_set(layout, EDJE_PATH, "warning_layout"); diff --git a/src/bin/statusbar.c b/src/bin/statusbar.c index b7fc2b0..422534c 100644 --- a/src/bin/statusbar.c +++ b/src/bin/statusbar.c @@ -3,6 +3,7 @@ typedef struct statusbar_s { Evas_Object *layout; + Evas_Object *ctxpopup; Eina_Stringshare *group_name; int cur_line; int max_line; @@ -10,6 +11,94 @@ typedef struct statusbar_s stats_data *g_sd = NULL; +static void +slider_changed_cb(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + + stats_data *sd = data; + + double scale = elm_slider_value_get(obj); + double rounded = ROUNDING(scale, 1); + + if ((rounded - scale) > 0) rounded -= 0.05; + + config_view_scale_set(rounded); + scale = config_view_scale_get(); + enventor_object_live_view_scale_set(base_enventor_get(), scale); + stats_view_scale_update(scale); +} + +static void +ctxpopup_dismissed_cb(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + stats_data *sd = data; + evas_object_del(obj); + sd->ctxpopup = NULL; +} + +static void +view_scale_btn_cb(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + stats_data *sd = data; + + //Ctxpopup + Evas_Object *ctxpopup = elm_ctxpopup_add(base_layout_get()); + elm_object_style_set(ctxpopup, elm_app_name_get()); + + //Slider + Evas_Object *slider = elm_slider_add(ctxpopup); + elm_slider_span_size_set(slider, 150); + elm_slider_indicator_show_set(slider, EINA_FALSE); + double step = 0.05 / (double) (MAX_VIEW_SCALE - MIN_VIEW_SCALE); + elm_slider_step_set(slider, step); + elm_slider_horizontal_set(slider, EINA_FALSE); + 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(ctxpopup, "dismissed", ctxpopup_dismissed_cb, + sd); + elm_object_content_set(ctxpopup, slider); + + Evas_Coord x, y, w, h; + evas_object_geometry_get(obj, &x, &y, &w, &h); + evas_object_move(ctxpopup, x, y); + evas_object_show(ctxpopup); + + sd->ctxpopup = ctxpopup; +} + +static Evas_Object * +create_statusbar_btn(Evas_Object *layout, const char *tooltip_msg, + Evas_Smart_Cb func, void *data) +{ + Evas_Object *box = elm_box_add(layout); + + Evas_Object *btn = elm_button_add(box); + 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_object_scale_set(btn, 0.5); + evas_object_smart_callback_add(btn, "clicked", func, data); + evas_object_show(btn); + + Evas_Object *img = elm_image_add(btn); + elm_image_file_set(img, EDJE_PATH, "expand"); + elm_object_content_set(btn, img); + + elm_object_tooltip_text_set(box, tooltip_msg); + elm_object_tooltip_orient_set(box, ELM_TOOLTIP_ORIENT_TOP_RIGHT); + + elm_box_pack_end(box, btn); + elm_object_part_content_set(layout, "scale_btn", box); + + return btn; +} + void stats_line_num_update(int cur_line, int max_line) { @@ -47,6 +136,10 @@ stats_init(Evas_Object *parent) Evas_Object *layout = elm_layout_add(parent); elm_layout_file_set(layout, EDJE_PATH, "statusbar_layout"); + Evas_Object *btn; + btn = create_statusbar_btn(layout, + "View Scale (Ctrl + Mouse Wheel)", + view_scale_btn_cb, sd); sd->layout = layout; stats_cursor_pos_update(0, 0, 0, 0); @@ -79,6 +172,16 @@ stats_info_msg_update(const char *msg) elm_object_signal_emit(sd->layout, "elm,action,info_msg,show", ""); } +void +stats_view_scale_update(double scale) +{ + stats_data *sd = g_sd; + + char buf[10]; + snprintf(buf, sizeof(buf), "%0.2fx", scale); + elm_object_part_text_set(sd->layout, "elm.text.scale", buf); +} + void stats_view_size_update(Evas_Coord w, Evas_Coord h) { @@ -107,3 +210,15 @@ stats_cursor_pos_update(Evas_Coord x, Evas_Coord y, float rel_x, float rel_y) snprintf(buf, sizeof(buf), "%0.2f", rel_y); elm_object_part_text_set(sd->layout, "elm.text.cursor_rely", buf); } + +Eina_Bool +stats_ctxpopup_dismiss(void) +{ + stats_data *sd = g_sd; + if (sd->ctxpopup) + { + elm_ctxpopup_dismiss(sd->ctxpopup); + return EINA_TRUE; + } + return EINA_FALSE; +} diff --git a/src/include/base_gui.h b/src/include/base_gui.h index a32acbd..1a96cac 100644 --- a/src/include/base_gui.h +++ b/src/include/base_gui.h @@ -4,6 +4,7 @@ Eina_Bool base_gui_init(void); void base_gui_show(void); Evas_Object *base_win_get(void); Evas_Object *base_layout_get(void); +Evas_Object *base_enventor_get(void); void base_win_resize_object_add(Evas_Object *resize_obj); void base_title_set(const char *path); void base_statusbar_toggle(Eina_Bool config); @@ -20,4 +21,3 @@ void base_gui_term(void); void base_console_reset(void); void base_error_msg_set(const char *msg); void base_console_full_view(void); - diff --git a/src/include/common.h b/src/include/common.h index be6a06c..d0ba5ab 100644 --- a/src/include/common.h +++ b/src/include/common.h @@ -55,6 +55,8 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" #define REL2_X 0.75f #define REL2_Y 0.75f +#define ROUNDING(x, dig) (floor((x) * pow(10, dig) + 0.5) / pow(10, dig)) + #define ENVENTOR_CONFIG_VERSION 3 #define EVENT_KEY_MODIFIER_CHECK(NAME, MASK) \ diff --git a/src/include/config_data.h b/src/include/config_data.h index 5192150..b246740 100644 --- a/src/include/config_data.h +++ b/src/include/config_data.h @@ -1,6 +1,6 @@ #define MAX_FONT_SCALE 5.0 #define MIN_FONT_SCALE 0.5 -#define MAX_VIEW_SCALE 10.0 +#define MAX_VIEW_SCALE 5.0 #define MIN_VIEW_SCALE 0.1 void config_init(const char *input_path, const char *output_path, Eina_List *img_path, Eina_List *snd_path, Eina_List *fnt_path, Eina_List *dat_path); diff --git a/src/include/statusbar.h b/src/include/statusbar.h index 2b7105c..8732ccb 100644 --- a/src/include/statusbar.h +++ b/src/include/statusbar.h @@ -4,6 +4,8 @@ void stats_view_size_update(Evas_Coord w, Evas_Coord h); void stats_cursor_pos_update(Evas_Coord x, Evas_Coord y, float rel_x, float rel_y); void stats_info_msg_update(const char *msg); void stats_line_num_update(int cur_line, int max_line); +void stats_view_scale_update(double scale); Evas_Object *stats_obj_get(void); void stats_edc_group_update(const char *group_name); Eina_Stringshare *stats_group_name_get(void); +Eina_Bool stats_ctxpopup_dismiss(void);