From b2a6f80ed70f49dcd56ae08f5104bda7fca61cbc Mon Sep 17 00:00:00 2001 From: Alastair Poole Date: Sat, 27 Feb 2021 14:56:42 +0000 Subject: [PATCH] settings: small change. --- src/bin/cfg.c | 1 - src/bin/main.c | 47 +++------ src/bin/meson.build | 2 +- src/bin/mess_header.h | 6 ++ src/bin/ui/alerts.c | 1 + src/bin/ui/font_dialog.c | 179 ------------------------------- src/bin/ui/settings.c | 221 +++++++++++++++++++++++++++++++++++++++ src/bin/ui/ui.h | 3 +- 8 files changed, 247 insertions(+), 213 deletions(-) delete mode 100644 src/bin/ui/font_dialog.c create mode 100644 src/bin/ui/settings.c diff --git a/src/bin/cfg.c b/src/bin/cfg.c index 1480626..35cf501 100644 --- a/src/bin/cfg.c +++ b/src/bin/cfg.c @@ -123,7 +123,6 @@ ecrire_cfg_save(void) if (!config_file) return EINA_FALSE; - ef = eet_open(config_file, EET_FILE_MODE_WRITE); if (!ef) { diff --git a/src/bin/main.c b/src/bin/main.c index bc76c30..34b86a3 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -19,7 +19,7 @@ static void _init_entry(Ecrire_Entry *inst) { Elm_Entry_Change_Info *inf; - editor_font_set(inst, _ent_cfg->font.name, _ent_cfg->font.size); + editor_font_set(inst, inst->font.name, inst->font.size); /* Init the undo stack */ EINA_LIST_FREE(inst->undo_stack, inf) @@ -484,7 +484,7 @@ _cb_new(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) } static void -_app_exit(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_cb_exit(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Ecrire_Entry *inst = data; _alert_if_need_saving(_win_del_do, inst); @@ -522,28 +522,22 @@ static void _cb_font_settings(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Ecrire_Entry *inst = data; - ui_font_dialog_open(elm_object_top_widget_get(inst->win), inst, _ent_cfg->font.name, _ent_cfg->font.size); + ui_settings_open(elm_object_top_widget_get(inst->win), inst); } - static void _cb_win_del(void *data, Evas_Object *obj, void *event_info) { Ecrire_Entry *inst = data; (void) data; - (void) obj; - (void) event_info; _alert_if_need_saving(_win_del_do, inst); } static void -_cb_win_focused(void *data, Evas_Object *obj, void *event_info) +_cb_win_focused(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Ecrire_Entry *inst = data; - (void) data; - (void) obj; - (void) event_info; - elm_object_focus_set(inst->entry, EINA_TRUE); + elm_object_focus_set(inst->entry, 1); } static void @@ -572,23 +566,17 @@ editor_font_set(Ecrire_Entry *inst, const char *font, int font_size) const Evas_Object *tb = elm_entry_textblock_get(inst->entry); Eina_Strbuf *sbuf; - eina_stringshare_replace(&_ent_cfg->font.name, font); - _ent_cfg->font.size = font_size; - sbuf = eina_strbuf_new(); - if (_ent_cfg->font.name) - { - eina_strbuf_append_printf(sbuf, "font=\\'%s\\'", _ent_cfg->font.name); - } + if (font) + eina_strbuf_append_printf(sbuf, "font=\\'%s\\'", font); - if (_ent_cfg->font.size > 0) - { - eina_strbuf_append_printf(sbuf, " font_size=\\'%d\\'", - _ent_cfg->font.size); - } + if (font_size > 0) + eina_strbuf_append_printf(sbuf, " font_size=\\'%d\\'", font_size); - if (eina_strbuf_length_get(sbuf) > 0) + if (!eina_strbuf_length_get(sbuf)) + evas_object_textblock_style_user_pop((Evas_Object *) tb); + else { Evas_Textblock_Style *ts = evas_textblock_style_new(); @@ -598,13 +586,8 @@ editor_font_set(Ecrire_Entry *inst, const char *font, int font_size) evas_object_textblock_style_user_push((Evas_Object *) tb, ts); } - else - { - evas_object_textblock_style_user_pop((Evas_Object *) tb); - } elm_entry_calc_force(inst->entry); - eina_strbuf_free(sbuf); } @@ -613,6 +596,8 @@ editor_font_choose(Ecrire_Entry *inst, const char *font, int size) { editor_font_set(inst, font, size); + eina_stringshare_replace(&_ent_cfg->font.name, font); + _ent_cfg->font.size = size; /* Save the font for future runs */ ecrire_cfg_save(); } @@ -631,7 +616,7 @@ _ecrire_menu_add(Ecrire_Entry *inst) elm_menu_item_add(menu, it, "document-save", _("Save"), _cb_save, inst); elm_menu_item_add(menu, it, "document-save-as", _("Save As"), _cb_save_as, inst); elm_menu_item_separator_add(menu, it); - elm_menu_item_add(menu, it, "application-exit", _("Exit"), _app_exit, inst); + elm_menu_item_add(menu, it, "application-exit", _("Exit"), _cb_exit, inst); it = elm_menu_item_add(menu, NULL, NULL, _("Edit"), NULL, NULL); inst->cut_item = @@ -715,6 +700,8 @@ elm_main(int argc, char **argv) inst->filename = NULL; inst->last_saved_stack_ptr = NULL; inst->undo_stack_can_merge = EINA_FALSE; + inst->font.name = _ent_cfg->font.name; + inst->font.size = _ent_cfg->font.size; if (optind < argc) { diff --git a/src/bin/meson.build b/src/bin/meson.build index 3f3570f..5e761e6 100644 --- a/src/bin/meson.build +++ b/src/bin/meson.build @@ -7,7 +7,7 @@ executable('ecrire', [ 'mess_header.h', 'ui/alerts.c', 'ui/file_related.c', - 'ui/font_dialog.c', + 'ui/settings.c', 'ui/goto_dialog.c', 'ui/search_dialog.c', 'ui/ui.h' diff --git a/src/bin/mess_header.h b/src/bin/mess_header.h index 98790ac..4f417a3 100644 --- a/src/bin/mess_header.h +++ b/src/bin/mess_header.h @@ -20,6 +20,12 @@ struct _Ecrire_Entry { int unsaved; Elm_Object_Item *copy_item, *cut_item, *save_item, *paste_item, *undo_item, *redo_item; + struct + { + const char *name; + int size; + } font; + /* Undo stack */ Eina_List *undo_stack; Eina_List *undo_stack_ptr; diff --git a/src/bin/ui/alerts.c b/src/bin/ui/alerts.c index 2247ec0..9104459 100644 --- a/src/bin/ui/alerts.c +++ b/src/bin/ui/alerts.c @@ -53,6 +53,7 @@ ui_alert_need_saving(Evas_Object *entry, void (*done)(void *data), void *data) done_data = data; elm_object_part_text_set(popup, "title,text", "Unsaved Changes"); + elm_object_style_set(popup, "transparent"); elm_object_text_set(popup, _("Would you like to save changes to document?
" "Any unsaved changes will be lost.")); diff --git a/src/bin/ui/font_dialog.c b/src/bin/ui/font_dialog.c deleted file mode 100644 index c18d080..0000000 --- a/src/bin/ui/font_dialog.c +++ /dev/null @@ -1,179 +0,0 @@ -#include "config.h" -#include - -#include "../mess_header.h" -Evas_Object *font_win, *list, *fsize, *dfont_check; - -void -my_win_del(void *data, Evas_Object *obj, void *event_info) -{ - (void) data; - (void) obj; - (void) event_info; - font_win = NULL; -} - -static Eina_List * -_font_list_get(const Evas *e) -{ - Eina_List *flist = evas_font_available_list(e); - Eina_List *itr, *nitr; - const char *font, *prev_font = NULL; - flist = eina_list_sort(flist, eina_list_count(flist), - (Eina_Compare_Cb) strcasecmp); - EINA_LIST_FOREACH_SAFE(flist, itr, nitr, font) - { - Elm_Font_Properties *efp; - - efp = elm_font_properties_get(font); - if (!efp) continue; - /* Remove dups */ - if (prev_font && !strcmp(efp->name, prev_font)) - { - flist = eina_list_remove_list(flist, itr); - } - else - { - eina_stringshare_replace(&font, efp->name); - prev_font = font; - eina_list_data_set(itr, font); - } - - elm_font_properties_free(efp); - } - - return flist; -} - -static void -_set_clicked(void *data, - Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) -{ - Ecrire_Entry *ent = data; - const char *selected = NULL; - Elm_Object_Item *list_it = elm_list_selected_item_get(list); - if (list_it) - selected = elm_object_item_text_get(list_it); - if (elm_check_state_get(dfont_check)) - editor_font_choose(ent, NULL, 0); - else - editor_font_choose(ent, selected, elm_spinner_value_get(fsize)); -} - -static void -_check_changed_cb(void *data EINA_UNUSED, Evas_Object *obj, - void *event_info EINA_UNUSED) -{ - elm_object_disabled_set(list, elm_check_state_get(obj)); - elm_object_disabled_set(fsize, elm_check_state_get(obj)); -} - - -Evas_Object * -ui_font_dialog_open(Evas_Object *parent, Ecrire_Entry *ent, const char *pfont, - int size) -{ - Evas_Object *entry = ent->entry; - Evas_Object *win, *bg, *bx, *btn, *hbx, *lbl; - - if (font_win) - { - evas_object_show(font_win); - return font_win; - } - - font_win = win = elm_win_add(parent, "font-select", ELM_WIN_TOOLBAR); - elm_win_autodel_set(win, EINA_TRUE); - elm_win_title_set(win, _("Select Font")); - evas_object_smart_callback_add(win, "delete,request", my_win_del, entry); - - bg = elm_bg_add(win); - elm_win_resize_object_add(win, bg); - evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_show(bg); - - bx = elm_box_add(win); - elm_win_resize_object_add(win, bx); - evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_show(bx); - - list = elm_list_add(win); - 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); - elm_box_pack_end(bx, list); - evas_object_show(list); - - hbx = elm_box_add(bx); - elm_box_horizontal_set(hbx, EINA_TRUE); - elm_box_pack_end(bx, hbx); - evas_object_show(hbx); - - lbl = elm_label_add(hbx); - elm_object_text_set(lbl, _("Font size:")); - elm_box_pack_end(hbx, lbl); - evas_object_show(lbl); - - fsize = elm_spinner_add(hbx); - elm_spinner_label_format_set(fsize, _("%.0f pts")); - elm_spinner_step_set(fsize, 1); - elm_spinner_wrap_set(fsize, EINA_FALSE); - elm_object_style_set (fsize, "vertical"); - elm_spinner_min_max_set(fsize, 0, 72); - elm_spinner_value_set(fsize, size); - evas_object_size_hint_align_set(fsize, 0.0, 0.5); - elm_box_pack_end(hbx, fsize); - evas_object_show(fsize); - - /* Populate list */ - { - Elm_Object_Item *cur_font = NULL; - const char *font; - Eina_List *flist, *itr; - - flist = _font_list_get(evas_object_evas_get(list)); - EINA_LIST_FOREACH(flist, itr, font) - { - Elm_Object_Item *tmp; - tmp = elm_list_item_append(list, font, NULL, NULL, NULL, NULL); - if (pfont && !strcmp(pfont, font)) - { - cur_font = tmp; - } - } - elm_list_go(list); - - EINA_LIST_FREE(flist, font) - eina_stringshare_del(font); - - if (cur_font) - { - elm_list_item_bring_in(cur_font); - elm_list_item_selected_set(cur_font, EINA_TRUE); - } - } - - dfont_check = elm_check_add(win); - elm_object_text_set(dfont_check, _("Use Default Font:")); - evas_object_smart_callback_add(dfont_check, "changed", _check_changed_cb, - NULL); - - elm_check_state_set(dfont_check, !pfont); - evas_object_show(dfont_check); - elm_box_pack_end(hbx, dfont_check); - - _check_changed_cb(NULL, dfont_check, NULL); - - btn = elm_button_add(win); - elm_object_text_set(btn, _("Set")); - evas_object_size_hint_align_set(btn, 1.0, 0.0); - evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_show(btn); - elm_box_pack_end(hbx, btn); - evas_object_smart_callback_add(btn, "clicked", _set_clicked, ent); - - /* Forcing it to be the min height. */ - evas_object_resize(win, 300, 500); - evas_object_show(win); - - return win; -} diff --git a/src/bin/ui/settings.c b/src/bin/ui/settings.c new file mode 100644 index 0000000..f162504 --- /dev/null +++ b/src/bin/ui/settings.c @@ -0,0 +1,221 @@ +#include "config.h" +#include + +#include "../mess_header.h" + +Evas_Object *_settings_popup; + +typedef struct +{ + Evas_Object *list; + Evas_Object *fsize; + Evas_Object *dfont_check; + Elm_Object_Item *cur_font; +} Settings; + +static Settings _settings; + +static void +_cb_popup_del(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Ecrire_Entry *inst = data; + + elm_object_focus_set(inst->win, 1); + if (_settings_popup) + evas_object_del(_settings_popup); + _settings_popup = NULL; +} + +static Eina_List * +_font_list_get(const Evas *e) +{ + Eina_List *fonts = evas_font_available_list(e); + Eina_List *itr, *nitr; + const char *font, *prev_font = NULL; + + fonts = eina_list_sort(fonts, eina_list_count(fonts), (Eina_Compare_Cb) strcasecmp); + EINA_LIST_FOREACH_SAFE(fonts, itr, nitr, font) + { + Elm_Font_Properties *efp; + + efp = elm_font_properties_get(font); + if (!efp) continue; + /* Remove dups */ + if (prev_font && !strcmp(efp->name, prev_font)) + fonts = eina_list_remove_list(fonts, itr); + else + { + eina_stringshare_replace(&font, efp->name); + prev_font = font; + eina_list_data_set(itr, font); + } + elm_font_properties_free(efp); + } + + return fonts; +} + +static void +_cb_font_selected(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + const char *selected; + Ecrire_Entry *inst; + Elm_Object_Item *it = event_info; + if (!it) return; + + inst = data; + selected = elm_object_item_text_get(it); + + if (elm_check_state_get(_settings.dfont_check)) + return; + + eina_stringshare_replace(&inst->font.name, selected); + editor_font_choose(inst, inst->font.name, inst->font.size); +} + +static void +_cb_spinner_delay_changed(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info) +{ + Ecrire_Entry *inst = data; + + inst->font.size = elm_spinner_value_get(obj); + + if (inst->font.name) + editor_font_choose(inst, inst->font.name, inst->font.size); +} + +static void +_cb_check_changed(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Ecrire_Entry *inst; + Eina_Bool enabled = elm_check_state_get(obj); + + inst = data; + + elm_object_disabled_set(_settings.list, enabled); + elm_object_disabled_set(_settings.fsize, enabled); + + if (enabled) + { + inst->font.name = NULL; + editor_font_choose(inst, NULL, 0); + } + else if (inst->font.name) + { + editor_font_choose(inst, inst->font.name, inst->font.size); + } +} + +static void +_cb_btn_clicked(void *data, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + Ecrire_Entry *inst = data; + _cb_popup_del(inst, NULL, NULL); +} + +Evas_Object * +ui_settings_open(Evas_Object *parent, Ecrire_Entry *inst) +{ + Evas_Object *entry = inst->entry; + Evas_Object *pop, *tb, *rec, *bx, *hbx, *btn, *list, *lb, *sp, *ck; + + if (_settings_popup) + return _settings_popup; + + _settings_popup = pop = elm_popup_add(parent); + elm_object_style_set(pop, "transparent"); + evas_object_size_hint_weight_set(pop, 1, 1); + evas_object_smart_callback_add(pop, "dismissed", _cb_popup_del, inst); + elm_object_part_text_set(pop, "title,text", _("Settings")); + + bx = elm_box_add(pop); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx); + elm_object_content_set(pop, bx); + + tb = elm_table_add(pop); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(tb); + elm_box_pack_end(bx, tb); + + rec = evas_object_rectangle_add(evas_object_evas_get(pop)); + evas_object_size_hint_min_set(rec, ELM_SCALE_SIZE(300), ELM_SCALE_SIZE(300)); + elm_table_pack(tb, rec, 0, 0, 1, 1); + + _settings.list = list = elm_list_add(pop); + 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); + elm_list_select_mode_set(list, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_list_multi_select_set(list, 0); + evas_object_show(list); + elm_table_pack(tb, list, 0, 0, 1, 1); + + hbx = elm_box_add(bx); + elm_box_horizontal_set(hbx, 1); + elm_box_pack_end(bx, hbx); + evas_object_show(hbx); + + lb = elm_label_add(hbx); + elm_object_text_set(lb, _("Font size:")); + elm_box_pack_end(hbx, lb); + evas_object_show(lb); + + _settings.fsize = sp = elm_spinner_add(hbx); + elm_spinner_label_format_set(sp, _("%.0f px")); + elm_spinner_step_set(sp, 1); + elm_spinner_wrap_set(sp, 0); + elm_spinner_min_max_set(sp, 10, 72); + elm_spinner_value_set(sp, inst->font.size); + evas_object_size_hint_align_set(sp, 0.0, 0.5); + elm_box_pack_end(hbx, sp); + evas_object_show(sp); + evas_object_smart_callback_add(sp, "delay,changed", _cb_spinner_delay_changed, inst); + + Eina_List *fonts, *l; + const char *font; + + fonts = _font_list_get(evas_object_evas_get(list)); + EINA_LIST_FOREACH(fonts, l, font) + { + Elm_Object_Item *it; + it = elm_list_item_append(list, font, NULL, NULL, NULL, NULL); + if (inst->font.name && !strcmp(inst->font.name, font)) + _settings.cur_font = it; + } + elm_list_go(list); + + if (_settings.cur_font) + { + elm_list_item_bring_in(_settings.cur_font); + elm_list_item_selected_set(_settings.cur_font, 1); + } + + EINA_LIST_FREE(fonts, font) + eina_stringshare_del(font); + + evas_object_smart_callback_add(list, "selected", _cb_font_selected, inst); + + _settings.dfont_check = ck = elm_check_add(pop); + elm_object_text_set(ck, _("Default Font?")); + elm_check_state_set(ck, !inst->font.name); + evas_object_show(ck); + elm_box_pack_end(hbx, ck); + evas_object_smart_callback_add(ck, "changed", _cb_check_changed, inst); + _cb_check_changed(inst, ck, NULL); + + btn = elm_button_add(pop); + evas_object_size_hint_weight_set(btn, 1.0, 0); + elm_object_text_set(btn, _("Close")); + evas_object_show(btn); + elm_box_pack_end(bx, btn); + evas_object_smart_callback_add(btn, "clicked", _cb_btn_clicked, inst); + + evas_object_show(pop); + + return pop; +} diff --git a/src/bin/ui/ui.h b/src/bin/ui/ui.h index db041b4..d35801b 100644 --- a/src/bin/ui/ui.h +++ b/src/bin/ui/ui.h @@ -7,8 +7,7 @@ void ui_file_open_save_dialog_open(Evas_Object *parent, Eina_Bool save, Evas_Sma Evas_Object *ui_find_dialog_open(Evas_Object *parent, Ecrire_Entry *ent); Evas_Object *ui_goto_dialog_open(Evas_Object *parent, Ecrire_Entry *ent); - -Evas_Object *ui_font_dialog_open(Evas_Object *parent, Ecrire_Entry *ent, const char *pfont, int size); +Evas_Object *ui_settings_open(Evas_Object *parent, Ecrire_Entry *ent); void ui_alert_need_saving(Evas_Object *entry, void (*done)(void *data), void *data);