ecrire/src/bin/ui/settings.c

221 lines
6.1 KiB
C

#include "config.h"
#include <Elementary.h>
#include "../Ecrire.h"
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_hide(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
Ecrire_Editor *inst = data;
if (inst->settings_popup)
evas_object_hide(inst->settings_popup);
elm_object_focus_set(inst->win, 1);
}
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_Editor *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);
ecrire_editor_font_save(inst, inst->font.name, inst->font.size);
}
static void
_cb_spinner_delay_changed(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info)
{
Ecrire_Editor *inst = data;
inst->font.size = elm_spinner_value_get(obj);
if (inst->font.name)
ecrire_editor_font_save(inst, inst->font.name, inst->font.size);
}
static void
_cb_check_changed(void *data, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
Ecrire_Editor *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;
ecrire_editor_font_save(inst, NULL, 0);
}
else if (inst->font.name)
{
ecrire_editor_font_save(inst, inst->font.name, inst->font.size);
}
}
static void
_cb_btn_clicked(void *data, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
Ecrire_Editor *inst = data;
_cb_popup_hide(inst, NULL, NULL);
}
Evas_Object *
ui_settings_open(Evas_Object *parent, Ecrire_Editor *inst)
{
Evas_Object *pop, *tb, *rec, *bx, *hbx, *btn, *list, *lb, *sp, *ck;
if (inst->settings_popup)
{
evas_object_show(inst->settings_popup);
return inst->settings_popup;
}
inst->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_hide, 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;
}