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/src/bin/config_data.c b/src/bin/config_data.c index ac5c43e..f641897 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; @@ -217,6 +219,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) return cd->auto_complete; } +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) { diff --git a/src/bin/main.c b/src/bin/main.c index 7d5ad00..ec2881f 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -177,6 +177,11 @@ config_update_cb(void *data) config_edc_fnt_path_list_get()); enventor_object_path_set(enventor, ENVENTOR_RES_DATA, config_edc_dat_path_list_get()); + + 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_linenumber_set(enventor, config_linenumber_get()); enventor_object_dummy_swallow_set(enventor, config_dummy_swallow_get()); @@ -537,6 +542,10 @@ enventor_setup(app_data *ad) evas_object_smart_callback_add(enventor, "focused", enventor_focused_cb, ad); + 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()); 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 62dd5dd..1e72339 100644 --- a/src/bin/text_setting.c +++ b/src/bin/text_setting.c @@ -54,7 +54,7 @@ static text_setting_data *g_tsd = NULL; static void syntax_template_set(char *syntax_template_str, char *syntax_template_format, - double font_scale) + const char *font_tag, double font_scale) { if (!syntax_template_str || !syntax_template_format) return; @@ -98,6 +98,14 @@ syntax_template_set(char *syntax_template_str, char *syntax_template_format, color_val[color_type_list[70]], color_val[color_type_list[71]], color_val[color_type_list[72]], color_val[color_type_list[73]], color_val[color_type_list[74]], color_val[color_type_list[75]]); + + if (font_tag) + { + char *buf = strdup(syntax_template_str); + snprintf(syntax_template_str, SYNTAX_TEMPLATE_MAX_LEN, "%s%s", + font_tag, buf); + free(buf); + } } static void @@ -110,7 +118,7 @@ syntax_template_apply(void) Evas_Object *entry = elm_object_part_content_get(layout, "elm.swallow.text_setting"); syntax_template_set(tsd->syntax_template_str, tsd->syntax_template_format, - tsd->font_scale); + tsd->cur_font_tag, tsd->font_scale); elm_entry_entry_set(entry, tsd->syntax_template_str); } @@ -535,7 +543,7 @@ syntax_template_format_create_err: } static char * -syntax_template_create(double font_scale) +syntax_template_create(const char *font_tag, double font_scale) { text_setting_data *tsd = g_tsd; char *syntax_template_format = syntax_template_format_create(); @@ -545,7 +553,8 @@ syntax_template_create(double font_scale) syntax_template_str = calloc(1, sizeof(char) * SYNTAX_TEMPLATE_MAX_LEN); if (!syntax_template_str) goto syntax_template_create_err; - syntax_template_set(syntax_template_str, syntax_template_format, font_scale); + syntax_template_set(syntax_template_str, syntax_template_format, font_tag, + font_scale); color_keyword *color_keyword_list; color_keyword_list = color_keyword_list_create(syntax_template_str); @@ -614,6 +623,9 @@ text_setting_double_clicked_cb(void *data, Evas_Object *obj, int i; int pos; int x, y; + int orig_tag_len = 0; + int cur_tag_len = 0; + int tag_diff = 0; syntax_template_str = elm_entry_entry_get(obj); if (!syntax_template_str) return; @@ -623,11 +635,17 @@ text_setting_double_clicked_cb(void *data, Evas_Object *obj, pos = color_keyword_pos_get(syntax_template_str, selected_str); + /* Calculate the translated keyword position based on the difference of + the font tag lengths. */ + if (tsd->orig_font_tag) orig_tag_len = strlen(tsd->orig_font_tag); + if (tsd->cur_font_tag) cur_tag_len = strlen(tsd->cur_font_tag); + tag_diff = cur_tag_len - orig_tag_len; + for (i = 0; i < COLOR_KEYWORD_MAX_CNT; i++) { selected_color_keyword = tsd->color_keyword_list + i; - if ((pos >= selected_color_keyword->pos_begin) && - (pos <= selected_color_keyword->pos_end)) + if ((pos >= (selected_color_keyword->pos_begin + tag_diff)) && + (pos <= (selected_color_keyword->pos_end + tag_diff))) { ctxpopup = color_ctxpopup_create(tsd->text_setting_layout, selected_color_keyword); @@ -642,6 +660,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) { @@ -667,6 +706,89 @@ 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 char * +font_tag_create(const char *font_name, const char *font_style) +{ + text_setting_data *tsd = g_tsd; + + if (!font_name) return NULL; + + Eina_Strbuf *strbuf = eina_strbuf_new(); + eina_strbuf_append(strbuf, ""); + + char *font_tag = strdup(eina_strbuf_string_get(strbuf)); + eina_strbuf_free(strbuf); + + return font_tag; +} + Evas_Object * text_setting_layout_create(Evas_Object *parent) { @@ -687,8 +809,19 @@ 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); + eina_stringshare_replace(&tsd->font_name, font_name); + eina_stringshare_replace(&tsd->font_style, font_style); + eina_stringshare_replace(&tsd->orig_font_tag, + font_tag_create(tsd->font_name, tsd->font_style)); + eina_stringshare_replace(&tsd->cur_font_tag, tsd->orig_font_tag); tsd->font_scale = (double) config_font_scale_get(); - char *syntax_template_str = syntax_template_create(tsd->font_scale); + + char *syntax_template_str = + syntax_template_create(tsd->orig_font_tag, tsd->font_scale); elm_entry_entry_set(entry, syntax_template_str); evas_object_smart_callback_add(entry, "clicked,double", text_setting_double_clicked_cb, tsd); @@ -748,6 +881,90 @@ 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)) + { + 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->slider_font = slider_font; tsd->toggle_linenum = toggle_linenum; @@ -794,12 +1011,25 @@ 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)); } +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); + eina_stringshare_replace(&tsd->cur_font_tag, + font_tag_create(font_name, font_style)); + syntax_template_apply(); +} + void text_setting_font_scale_set(double font_scale) { @@ -859,6 +1089,10 @@ 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); + eina_stringshare_del(tsd->orig_font_tag); + eina_stringshare_del(tsd->cur_font_tag); free(tsd); g_tsd = NULL; } diff --git a/src/include/config_data.h b/src/include/config_data.h index 3ad50e2..8e74359 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 9ce57b1..8ee0d45 100644 --- a/src/include/text_setting.h +++ b/src/include/text_setting.h @@ -19,6 +19,10 @@ struct text_setting_s char *syntax_template_format; char *syntax_template_str; + const char *font_name; + const char *font_style; + const char *orig_font_tag; + const char *cur_font_tag; double font_scale; }; @@ -29,6 +33,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);