settings: small change.

This commit is contained in:
Alastair Poole 2021-02-27 14:56:42 +00:00
parent e5cf942255
commit b2a6f80ed7
8 changed files with 247 additions and 213 deletions

View File

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

View File

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

View File

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

View File

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

View File

@ -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,
_("<align=center>Would you like to save changes to document?<br>"
"Any unsaved changes will be lost."));

View File

@ -1,179 +0,0 @@
#include "config.h"
#include <Elementary.h>
#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;
}

221
src/bin/ui/settings.c Normal file
View File

@ -0,0 +1,221 @@
#include "config.h"
#include <Elementary.h>
#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;
}

View File

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