jaehyun pushed a commit to branch master. http://git.enlightenment.org/tools/enventor.git/commit/?id=4439ca4d75af8ac0bee95cbed2144b213f33f6fa
commit 4439ca4d75af8ac0bee95cbed2144b213f33f6fa Author: Jaehyun Cho <[email protected]> Date: Thu Feb 26 20:40:58 2015 +0900 text_setting: Add font name/style settings. --- data/themes/default/layout_setting.edc | 19 ++- data/themes/default/theme_ext.edc | 60 +++++++++ src/bin/config_data.c | 24 ++++ src/bin/main.c | 5 + src/bin/setting.c | 4 + src/bin/text_setting.c | 230 +++++++++++++++++++++++++++++++++ src/include/config_data.h | 2 + src/include/text_setting.h | 4 + 8 files changed, 347 insertions(+), 1 deletion(-) diff --git a/data/themes/default/layout_setting.edc b/data/themes/default/layout_setting.edc index 44e1ba9..1dd6a9d 100644 --- a/data/themes/default/layout_setting.edc +++ b/data/themes/default/layout_setting.edc @@ -580,7 +580,7 @@ group { name: "text_setting_layout"; rel1 {to: "base_frame"; relative: 0.5 0; offset: 5 0;} rel2 {to: "base_frame"; relative: 1 0;} align: 0.5 0; - min: 0 90; + min: 0 120; fixed: 0 1; } } @@ -592,5 +592,22 @@ group { name: "text_setting_layout"; rel2.to: "preference_frame"; } } + part { name: "font_frame"; + type: SPACER; + scale: 1; + description { + rel1 {to: "preference_frame"; relative: 0 1; offset: 0 5;} + rel2 {to: "base_frame";} + } + } + part { name: "elm.swallow.font"; + type: SWALLOW; + scale: 1; + description { + rel1.to: "font_frame"; + rel2.to: "font_frame"; + } + } + } } diff --git a/data/themes/default/theme_ext.edc b/data/themes/default/theme_ext.edc index 5ea427e..fb8807f 100644 --- a/data/themes/default/theme_ext.edc +++ b/data/themes/default/theme_ext.edc @@ -1812,3 +1812,63 @@ group { name: "elm/entry/base-nowrap-noedit/enventor"; } } +group { name: "elm/entry/base/enventor_setting"; + inherit: "elm/entry/base/enventor"; + styles { + style { name: "setting_entry_style"; + base: "font="FN" font_size=10 color=#ffffff style=shadow,bottom shadow_color=#00000080 wrap=word text_class=enventor_setting_entry color_class=enventor_setting_entry left_margin=2 right_margin=2"; + ENABLED_TEXTBLOCK_TAGS + } + style { name: "setting_entry_disabled_style"; + base: "font="FN" font_size=10 color=#151515 style=shadow,bottom shadow_color=#ffffff19 wrap=word text_class=enventor_setting_entry color_class=enventor_setting_entry_disabled left_margin=2 right_margin=2"; + DISABLED_TEXTBLOCK_TAGS + } + style { name: "setting_entry_guide_style"; + base: "font="FN" font_size=10 color=#000000 style=shadow,bottom shadow_color=#ffffff19 wrap=word text_class=enventor_setting_entry color_class=enventor_setting_entry_guide left_margin=2 right_margin=2 ellipsis=0.0"; + DISABLED_TEXTBLOCK_TAGS + } + } +// data.item: "context_menu_orientation" "horizontal"; + parts { + part { name: "elm.guide"; type: TEXTBLOCK; mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + rel1.to: "elm.text"; + rel2.to: "elm.text"; + text { style: "setting_entry_guide_style"; + min: 0 1; + align: 0.0 0.0; + } + } + description { state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } +} + +group { name: "elm/entry/base-nowrap-noedit/enventor_setting"; + inherit: "elm/entry/base/enventor_setting"; + parts { + part { name: "elm.text"; + entry_mode: PLAIN; + source: "elm/entry/selection/enventor"; // selection under + source4: ""; // cursorover + source6: "elm/entry/anchor/enventor"; // anchor under + description { state: "default" 0.0; + text { style: "setting_entry_style"; + min: 1 1; + ellipsis: -1; + align: 0.0 0.0; + } + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + text { style: "setting_entry_disabled_style"; + } + } + } + } +} + diff --git a/src/bin/config_data.c b/src/bin/config_data.c index dd62b96..daf21d9 100644 --- a/src/bin/config_data.c +++ b/src/bin/config_data.c @@ -4,6 +4,8 @@ typedef struct config_s { const char *edc_path; const char *edj_path; + const char *font_name; + const char *font_style; Eina_List *edc_img_path_list; Eina_List *edc_snd_path_list; @@ -216,6 +218,10 @@ eddc_init(void) "edc_dat_path_list", edc_dat_path_list); EET_DATA_DESCRIPTOR_ADD_LIST_STRING(edd_base, config_data, "syntax_color_list", syntax_color_list); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "font_name", font_name, + EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "font_style", font_style, + EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "font_scale", font_scale, EET_T_FLOAT); EET_DATA_DESCRIPTOR_ADD_BASIC(edd_base, config_data, "view_scale", @@ -653,6 +659,24 @@ config_auto_complete_get(void) } void +config_font_set(const char *font_name, const char *font_style) +{ + config_data *cd = g_cd; + + eina_stringshare_replace(&cd->font_name, font_name); + eina_stringshare_replace(&cd->font_style, font_style); +} + +void +config_font_get(const char **font_name, const char **font_style) +{ + config_data *cd = g_cd; + + if (font_name) *font_name = cd->font_name; + if (font_style) *font_style = cd->font_style; +} + +void config_font_scale_set(float font_scale) { config_data *cd = g_cd; diff --git a/src/bin/main.c b/src/bin/main.c index 4f7131a..a8f47dd 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -53,6 +53,10 @@ auto_indent_toggle(app_data *ad) static void enventor_common_setup(Evas_Object *enventor) { + const char *font_name; + const char *font_style; + config_font_get(&font_name, &font_style); + enventor_object_font_set(enventor, font_name, font_style); enventor_object_font_scale_set(enventor, config_font_scale_get()); enventor_object_live_view_scale_set(enventor, config_view_scale_get()); enventor_object_linenumber_set(enventor, config_linenumber_get()); @@ -535,6 +539,7 @@ enventor_setup(app_data *ad) enventor_ctxpopup_dismissed_cb, ad); evas_object_smart_callback_add(enventor, "focused", enventor_focused_cb, ad); + evas_object_size_hint_expand_set(enventor, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_fill_set(enventor, EVAS_HINT_FILL, EVAS_HINT_FILL); diff --git a/src/bin/setting.c b/src/bin/setting.c index 64c27cd..c87813b 100644 --- a/src/bin/setting.c +++ b/src/bin/setting.c @@ -166,6 +166,10 @@ setting_reset_btn_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, elm_check_state_set(sd->toggle_highlight, config_part_highlight_get()); elm_check_state_set(sd->toggle_swallow, config_dummy_swallow_get()); + const char *font_name; + const char *font_style; + config_font_get(&font_name, &font_style); + text_setting_font_set(font_name, font_style); text_setting_font_scale_set((double) config_font_scale_get()); text_setting_linenumber_set(config_linenumber_get()); text_setting_auto_indent_set(config_auto_indent_get()); diff --git a/src/bin/text_setting.c b/src/bin/text_setting.c index f5e7c85..a5434ca 100644 --- a/src/bin/text_setting.c +++ b/src/bin/text_setting.c @@ -1,11 +1,23 @@ #include "common.h" #include "text_setting.h" +#define UNSUPPORTED_FONT_CNT 28 +#define UNSUPPORTED_FONT_MAX_LEN 32 #define COLOR_KEYWORD_MAX_CNT 76 #define SYNTAX_TEMPLATE_MAX_LEN 3072 #define SYNTAX_TEMPLATE_FONT_SIZE 10 #define SYNTAX_COLOR_LEN 7 +static char unsupported_font_list[UNSUPPORTED_FONT_CNT][UNSUPPORTED_FONT_MAX_LEN] = +{ + "Dingbats", "KacstArt", "KacstBook", "KacstDecorative", "KacstDigital", + "KacstFarsi", "KacstLetter", "KacstNaskh", "KacstOffice", "KacstPen", + "KacstPoster", "KacstQurn", "KacstScreen", "KacstTitle", "KacstTitleL", + "LKLUG", "Lohit Bengali", "Lohit Gujarati", "Lohit Punjabi", "Lohit Tamil", + "OpenSymbol", "Pothana2000", "Saab", "Standard Symbols L", "Symbol", + "Vemana2000", "ori1Uni", "mry_KacstQurn" +}; + static char color_val[ENVENTOR_SYNTAX_COLOR_LAST][SYNTAX_COLOR_LEN] = {{0}}; static int color_type_list[COLOR_KEYWORD_MAX_CNT] = @@ -642,6 +654,27 @@ text_setting_double_clicked_cb(void *data, Evas_Object *obj, } static Evas_Object * +label_create(Evas_Object *parent, const char *text) +{ + Evas_Object *label = elm_label_add(parent); + elm_object_text_set(label, text); + evas_object_show(label); + + return label; +} + +static Evas_Object * +list_create(Evas_Object *parent) +{ + Evas_Object *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); + evas_object_show(list); + + return list; +} + +static Evas_Object * toggle_create(Evas_Object *parent, const char *text, Eina_Bool state) { Evas_Object *toggle = elm_check_add(parent); @@ -666,6 +699,81 @@ font_scale_slider_changed_cb(void *data, Evas_Object *obj, syntax_template_apply(); } +static int +font_cmp_cb(const void *data1, + const void *data2) +{ + if (!data1) return 1; + if (!data2) return -1; + return strcmp(data1, data2); +} + +static void +font_style_selected_cb(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Evas_Object *list_font_name = data; + Elm_Object_Item *font_name_it = elm_list_selected_item_get(list_font_name); + Elm_Object_Item *font_style_it = elm_list_selected_item_get(obj); + const char *font_name = elm_object_item_text_get(font_name_it); + const char *font_style = elm_object_item_text_get(font_style_it); + + text_setting_font_set(font_name, font_style); +} + +static void +font_name_selected_cb(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Evas_Object *list_font_style = data; + Elm_Object_Item *it = elm_list_selected_item_get(obj); + const char *font_name = elm_object_item_text_get(it); + elm_list_clear(list_font_style); + + //Append Items of Font Style List + Elm_Font_Properties *efp; + Eina_List *font_list; + Eina_List *l, *ll; + char *font, *style; + font_list = evas_font_available_list(evas_object_evas_get(obj)); + font_list = eina_list_sort(font_list, eina_list_count(font_list), + font_cmp_cb); + EINA_LIST_FOREACH(font_list, l, font) + { + efp = elm_font_properties_get(font); + if (efp) + { + if (!strcmp(font_name, efp->name)) + { + EINA_LIST_FOREACH(efp->styles, ll, style) + { + elm_list_item_append(list_font_style, style, NULL, NULL, + font_style_selected_cb, obj); + } + } + elm_font_properties_free(efp); + } + } + elm_list_go(list_font_style); + + text_setting_font_set(font_name, NULL); +} + +static Eina_Bool +is_supported_font(const char *font_name) +{ + if (!font_name) return EINA_FALSE; + + int i; + for (i = 0; i < UNSUPPORTED_FONT_CNT; i++) + { + if (!strcmp(font_name, unsupported_font_list[i])) + return EINA_FALSE; + } + + return EINA_TRUE; +} + Evas_Object * text_setting_layout_create(Evas_Object *parent) { @@ -679,6 +787,9 @@ text_setting_layout_create(Evas_Object *parent) //Text Editor Evas_Object *entry = elm_entry_add(layout); + char style_name[128]; + snprintf(style_name, sizeof(style_name), "%s_setting", elm_app_name_get()); + elm_object_style_set(entry, style_name); elm_entry_context_menu_disabled_set(entry, EINA_TRUE); elm_entry_line_wrap_set(entry, ELM_WRAP_NONE); elm_entry_scrollable_set(entry, EINA_TRUE); @@ -686,6 +797,12 @@ text_setting_layout_create(Evas_Object *parent) 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); + //Font information + const char *font_name; + const char *font_style; + config_font_get(&font_name, &font_style); + text_setting_font_set(font_name, font_style); + tsd->font_scale = (double) config_font_scale_get(); char *syntax_template_str = syntax_template_create(tsd->font_scale); elm_entry_entry_set(entry, syntax_template_str); @@ -747,7 +864,91 @@ text_setting_layout_create(Evas_Object *parent) config_auto_complete_get()); elm_box_pack_end(box, toggle_autocomp); + //Font Name and Style (Box) + box = elm_box_add(layout); + elm_box_horizontal_set(box, EINA_TRUE); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(layout, "elm.swallow.font", box); + + //Font Name (Box) + box2 = elm_box_add(box); + evas_object_size_hint_weight_set(box2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box2, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(box2); + + elm_box_pack_end(box, box2); + + //Font Name (Label) + + /* This layout is intended to put the label aligned to left side + far from 3 pixels. */ + Evas_Object *layout_padding3 = elm_layout_add(box2); + elm_layout_file_set(layout_padding3, EDJE_PATH, "padding3_layout"); + evas_object_show(layout_padding3); + + elm_box_pack_end(box2, layout_padding3); + + Evas_Object *label_font_name = label_create(layout_padding3, "Font Name"); + elm_object_part_content_set(layout_padding3, "elm.swallow.content", + label_font_name); + + //Font Name (List) + Evas_Object *list_font_name = list_create(box2); + elm_box_pack_end(box2, list_font_name); + + //Font Style (Box) + box2 = elm_box_add(box); + evas_object_size_hint_weight_set(box2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box2, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(box2); + + elm_box_pack_end(box, box2); + + //Font Style (Label) + + /* This layout is intended to put the label aligned to left side + far from 3 pixels. */ + layout_padding3 = elm_layout_add(box2); + elm_layout_file_set(layout_padding3, EDJE_PATH, "padding3_layout"); + evas_object_show(layout_padding3); + + elm_box_pack_end(box2, layout_padding3); + + Evas_Object *label_font_style = label_create(layout_padding3, "Font Style"); + elm_object_part_content_set(layout_padding3, "elm.swallow.content", + label_font_style); + + //Font Style (List) + Evas_Object *list_font_style = list_create(box2); + elm_box_pack_end(box2, list_font_style); + + //Append Items of Font Name List + Elm_Font_Properties *efp; + Eina_List *font_list; + Eina_List *l; + char *font; + char prev_font[128] = {0}; + font_list = evas_font_available_list(evas_object_evas_get(parent)); + font_list = eina_list_sort(font_list, eina_list_count(font_list), + font_cmp_cb); + EINA_LIST_FOREACH(font_list, l, font) + { + efp = elm_font_properties_get(font); + if (efp) + { + if (strcmp(prev_font, efp->name) && is_supported_font(efp->name)) + { + elm_list_item_append(list_font_name, efp->name, NULL, NULL, + font_name_selected_cb, list_font_style); + snprintf(prev_font, sizeof(prev_font), "%s", efp->name); + } + elm_font_properties_free(efp); + } + } + elm_list_go(list_font_name); + tsd->text_setting_layout = layout; + tsd->text_edit_entry = entry; tsd->slider_font = slider_font; tsd->toggle_linenum = toggle_linenum; tsd->toggle_indent = toggle_indent; @@ -793,12 +994,39 @@ text_setting_config_set(void) { text_setting_data *tsd = g_tsd; + config_font_set(tsd->font_name, tsd->font_style); config_font_scale_set((float) elm_slider_value_get(tsd->slider_font)); config_linenumber_set(elm_check_state_get(tsd->toggle_linenum)); config_auto_indent_set(elm_check_state_get(tsd->toggle_indent)); config_auto_complete_set(elm_check_state_get(tsd->toggle_autocomp)); } +static void +text_setting_font_apply(const char *font_name, const char *font_style) +{ + text_setting_data *tsd = g_tsd; + + char text_class_name[32]; + snprintf(text_class_name, sizeof(text_class_name), "%s_setting_entry", + elm_app_name_get()); + + char *font = elm_font_fontconfig_name_get(font_name, font_style); + edje_text_class_set(text_class_name, font, -100); + elm_font_fontconfig_name_free(font); + + elm_entry_calc_force(tsd->text_edit_entry); +} + +void +text_setting_font_set(const char *font_name, const char *font_style) +{ + text_setting_data *tsd = g_tsd; + + eina_stringshare_replace(&tsd->font_name, font_name); + eina_stringshare_replace(&tsd->font_style, font_style); + text_setting_font_apply(font_name, font_style); +} + void text_setting_font_scale_set(double font_scale) { @@ -858,6 +1086,8 @@ text_setting_term(void) free(tsd->syntax_template_format); if (tsd->syntax_template_str) free(tsd->syntax_template_str); + eina_stringshare_del(tsd->font_name); + eina_stringshare_del(tsd->font_style); free(tsd); g_tsd = NULL; } diff --git a/src/include/config_data.h b/src/include/config_data.h index ffbafe6..a2de4c8 100644 --- a/src/include/config_data.h +++ b/src/include/config_data.h @@ -40,6 +40,8 @@ void config_auto_indent_set(Eina_Bool auto_indent); Eina_Bool config_auto_indent_get(void); void config_auto_complete_set(Eina_Bool auto_complete); Eina_Bool config_auto_complete_get(void); +void config_font_set(const char *font_name, const char *font_style); +void config_font_get(const char **font_name, const char **font_style); void config_font_scale_set(float font_scale); float config_font_scale_get(void); void config_view_scale_set(double view_scale); diff --git a/src/include/text_setting.h b/src/include/text_setting.h index 41d43b6..5e37be2 100644 --- a/src/include/text_setting.h +++ b/src/include/text_setting.h @@ -8,6 +8,7 @@ typedef struct color_keyword_s struct text_setting_s { Evas_Object *text_setting_layout; + Evas_Object *text_edit_entry; Evas_Object *color_ctxpopup; Evas_Object *slider_font; @@ -19,6 +20,8 @@ struct text_setting_s char *syntax_template_format; char *syntax_template_str; + const char *font_name; + const char *font_style; double font_scale; }; @@ -29,6 +32,7 @@ void text_setting_layout_show(Evas_Object *setting_layout, Evas_Object *tabbar, void text_setting_syntax_color_reset(void); void text_setting_syntax_color_save(void); void text_setting_config_set(void); +void text_setting_font_set(const char *font_name, const char *font_style); void text_setting_font_scale_set(double font_scale); void text_setting_linenumber_set(Eina_Bool enabled); void text_setting_auto_indent_set(Eina_Bool enabled); --
