enventor/src/bin/setting.c

554 lines
18 KiB
C

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "common.h"
#include "text_setting.h"
struct setting_s
{
Evas_Object *setting_layout;
Evas_Object *tabbar;
Evas_Object *general_layout;
Evas_Object *img_path_entry;
Evas_Object *snd_path_entry;
Evas_Object *fnt_path_entry;
Evas_Object *dat_path_entry;
Evas_Object *slider_view;
Evas_Object *view_size_w_entry;
Evas_Object *view_size_h_entry;
Evas_Object *toggle_view_size;
Evas_Object *toggle_highlight;
Evas_Object *toggle_swallow;
Evas_Object *toggle_stats;
Evas_Object *toggle_tools;
Evas_Object *toggle_console;
Evas_Object *apply_btn;
Evas_Object *reset_btn;
Evas_Object *cancel_btn;
};
typedef struct setting_s setting_data;
static setting_data *g_sd = NULL;
static void
img_path_entry_update(Evas_Object *entry, Eina_List *edc_img_paths)
{
elm_entry_entry_set(entry, NULL);
Eina_List *l;
char *edc_img_path;
EINA_LIST_FOREACH(edc_img_paths, l, edc_img_path)
{
elm_entry_entry_append(entry, edc_img_path);
elm_entry_entry_append(entry, ";");
}
}
static void
fnt_path_entry_update(Evas_Object *entry, Eina_List *edc_fnt_paths)
{
elm_entry_entry_set(entry, NULL);
Eina_List *l;
char *edc_fnt_path;
EINA_LIST_FOREACH(edc_fnt_paths, l, edc_fnt_path)
{
elm_entry_entry_append(entry, edc_fnt_path);
elm_entry_entry_append(entry, ";");
}
}
static void
dat_path_entry_update(Evas_Object *entry, Eina_List *edc_dat_paths)
{
elm_entry_entry_set(entry, NULL);
Eina_List *l;
char *edc_dat_path;
EINA_LIST_FOREACH(edc_dat_paths, l, edc_dat_path)
{
elm_entry_entry_append(entry, edc_dat_path);
elm_entry_entry_append(entry, ";");
}
}
static void
snd_path_entry_update(Evas_Object *entry, Eina_List *edc_snd_paths)
{
elm_entry_entry_set(entry, NULL);
Eina_List *l;
char *edc_snd_path;
EINA_LIST_FOREACH(edc_snd_paths, l, edc_snd_path)
{
elm_entry_entry_append(entry, edc_snd_path);
elm_entry_entry_append(entry, ";");
}
}
static void
setting_dismiss_done_cb(void *data, Evas_Object *obj EINA_UNUSED,
const char *emission EINA_UNUSED,
const char *source EINA_UNUSED)
{
setting_data *sd = data;
text_setting_term();
evas_object_del(sd->setting_layout);
sd->setting_layout = NULL;
menu_deactivate_request();
free(sd);
g_sd = NULL;
}
static void
setting_apply_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
setting_data *sd = data;
config_img_path_set(elm_object_text_get(sd->img_path_entry));
config_snd_path_set(elm_object_text_get(sd->snd_path_entry));
config_fnt_path_set(elm_object_text_get(sd->fnt_path_entry));
config_dat_path_set(elm_object_text_get(sd->dat_path_entry));
config_view_scale_set(elm_slider_value_get(sd->slider_view));
config_tools_set(elm_check_state_get(sd->toggle_tools));
config_console_set(elm_check_state_get(sd->toggle_console));
config_stats_bar_set(elm_check_state_get(sd->toggle_stats));
config_part_highlight_set(elm_check_state_get(sd->toggle_highlight));
config_dummy_swallow_set(elm_check_state_get(sd->toggle_swallow));
config_view_size_configurable_set(elm_check_state_get(sd->toggle_view_size));
text_setting_config_set();
Evas_Coord w = (Evas_Coord)atoi(elm_entry_entry_get(sd->view_size_w_entry));
Evas_Coord h = (Evas_Coord)atoi(elm_entry_entry_get(sd->view_size_h_entry));
config_view_size_set(w, h);
text_setting_syntax_color_save();
config_apply();
setting_close();
}
static void
setting_cancel_btn_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
setting_close();
}
static void
setting_reset_btn_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
setting_data *sd = data;
img_path_entry_update(sd->img_path_entry,
(Eina_List *)config_img_path_list_get());
snd_path_entry_update(sd->snd_path_entry,
(Eina_List *)config_snd_path_list_get());
fnt_path_entry_update(sd->fnt_path_entry,
(Eina_List *)config_fnt_path_list_get());
dat_path_entry_update(sd->dat_path_entry,
(Eina_List *)config_dat_path_list_get());
elm_slider_value_set(sd->slider_view, (double) config_view_scale_get());
elm_check_state_set(sd->toggle_console, config_console_get());
elm_check_state_set(sd->toggle_tools, config_tools_get());
elm_check_state_set(sd->toggle_stats, config_stats_bar_get());
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());
text_setting_auto_complete_set(config_auto_complete_get());
text_setting_syntax_color_reset();
}
static Evas_Object *
entry_create(Evas_Object *parent)
{
Evas_Object *entry = elm_entry_add(parent);
elm_entry_single_line_set(entry, EINA_TRUE);
elm_entry_scrollable_set(entry, EINA_TRUE);
evas_object_show(entry);
return entry;
}
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 *
toggle_create(Evas_Object *parent, const char *text, Eina_Bool state)
{
Evas_Object *toggle = elm_check_add(parent);
elm_object_style_set(toggle, "toggle");
elm_check_state_set(toggle, state);
evas_object_size_hint_weight_set(toggle, EVAS_HINT_EXPAND, 0);
evas_object_size_hint_align_set(toggle, EVAS_HINT_FILL, 0);
elm_object_text_set(toggle, text);
evas_object_show(toggle);
return toggle;
}
static void
toggle_view_size_changed_cb(void *data, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
setting_data *sd = data;
Eina_Bool toggle_on = elm_check_state_get(obj);
elm_object_disabled_set(sd->view_size_w_entry, !toggle_on);
elm_object_disabled_set(sd->view_size_h_entry, !toggle_on);
}
static Evas_Object *
general_layout_create(setting_data *sd, Evas_Object *parent)
{
static Elm_Entry_Filter_Accept_Set digits_filter_data;
static Elm_Entry_Filter_Limit_Size limit_filter_data;
//Layout
Evas_Object *layout = elm_layout_add(parent);
elm_layout_file_set(layout, EDJE_PATH, "general_layout");
evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_show(layout);
//Image Path Entry
Evas_Object *img_path_entry = entry_create(layout);
img_path_entry_update(img_path_entry,
(Eina_List *)config_img_path_list_get());
elm_object_focus_set(img_path_entry, EINA_TRUE);
elm_object_part_content_set(layout, "elm.swallow.img_path_entry",
img_path_entry);
//Sound Path Entry
Evas_Object *snd_path_entry = entry_create(layout);
snd_path_entry_update(snd_path_entry,
(Eina_List *)config_snd_path_list_get());
elm_object_part_content_set(layout, "elm.swallow.snd_path_entry",
snd_path_entry);
//Font Path Entry
Evas_Object *fnt_path_entry = entry_create(layout);
fnt_path_entry_update(fnt_path_entry,
(Eina_List *)config_fnt_path_list_get());
elm_object_part_content_set(layout, "elm.swallow.fnt_path_entry",
fnt_path_entry);
//Data Path Entry
Evas_Object *dat_path_entry = entry_create(layout);
dat_path_entry_update(dat_path_entry,
(Eina_List *)config_dat_path_list_get());
elm_object_part_content_set(layout, "elm.swallow.dat_path_entry",
dat_path_entry);
//Preference
Evas_Object *scroller = elm_scroller_add(layout);
elm_object_part_content_set(layout, "elm.swallow.preference", scroller);
//Box
Evas_Object *box = elm_box_add(scroller);
evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_show(box);
elm_object_content_set(scroller, box);
//View Scale (Slider)
Evas_Object *slider_view = elm_slider_add(box);
evas_object_size_hint_weight_set(slider_view, EVAS_HINT_EXPAND, 0);
evas_object_size_hint_align_set(slider_view, EVAS_HINT_FILL, 0);
elm_slider_span_size_set(slider_view, 190);
elm_slider_indicator_show_set(slider_view, EINA_FALSE);
elm_slider_unit_format_set(slider_view, "%1.2fx");
elm_slider_min_max_set(slider_view, MIN_VIEW_SCALE, MAX_VIEW_SCALE);
elm_slider_value_set(slider_view, (double) config_view_scale_get());
elm_object_text_set(slider_view, _("Live View Scale"));
evas_object_show(slider_view);
elm_box_pack_end(box, slider_view);
//View Size
//Box for View Size
Evas_Object *box2 = elm_box_add(box);
elm_box_horizontal_set(box2, EINA_TRUE);
elm_box_padding_set(box2, 5 * elm_config_scale_get(), 0);
evas_object_size_hint_weight_set(box2, EVAS_HINT_EXPAND, 0);
evas_object_size_hint_align_set(box2, EVAS_HINT_FILL, 0);
evas_object_show(box2);
elm_box_pack_end(box, box2);
//Label (View Size)
/* 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_view_size = label_create(layout_padding3, _("Fixed Live View Size"));
elm_object_part_content_set(layout_padding3, "elm.swallow.content",
label_view_size);
Evas_Coord w, h;
char w_str[5], h_str[5];
config_view_size_get(&w, &h);
snprintf(w_str, sizeof(w_str), "%d", w);
snprintf(h_str, sizeof(h_str), "%d", h);
//Entry (View Width)
Evas_Object *entry_view_size_w = entry_create(box2);
evas_object_size_hint_weight_set(entry_view_size_w, 0.15, 0);
evas_object_size_hint_align_set(entry_view_size_w, EVAS_HINT_FILL, 0);
digits_filter_data.accepted = "0123456789";
digits_filter_data.rejected = NULL;
elm_entry_markup_filter_append(entry_view_size_w,
elm_entry_filter_accept_set,
&digits_filter_data);
limit_filter_data.max_char_count = 4;
limit_filter_data.max_byte_count = 0;
elm_entry_markup_filter_append(entry_view_size_w,
elm_entry_filter_limit_size,
&limit_filter_data);
elm_object_text_set(entry_view_size_w, w_str);
elm_object_disabled_set(entry_view_size_w,
!config_view_size_configurable_get());
elm_box_pack_end(box2, entry_view_size_w);
//Label (X)
Evas_Object *label_view_size_x = label_create(box2, "X");
elm_box_pack_end(box2, label_view_size_x);
//Entry (View Height)
Evas_Object *entry_view_size_h = entry_create(box2);
evas_object_size_hint_weight_set(entry_view_size_h, 0.15, 0);
evas_object_size_hint_align_set(entry_view_size_h, EVAS_HINT_FILL, 0);
elm_entry_markup_filter_append(entry_view_size_h,
elm_entry_filter_accept_set,
&digits_filter_data);
elm_entry_markup_filter_append(entry_view_size_h,
elm_entry_filter_limit_size,
&limit_filter_data);
elm_object_text_set(entry_view_size_h, h_str);
elm_object_disabled_set(entry_view_size_h,
!config_view_size_configurable_get());
elm_box_pack_end(box2, entry_view_size_h);
//Toggle (View Size)
Evas_Object *toggle_view_size;
toggle_view_size = toggle_create(box2, NULL,
config_view_size_configurable_get());
evas_object_smart_callback_add(toggle_view_size, "changed",
toggle_view_size_changed_cb, sd);
elm_box_pack_end(box2, toggle_view_size);
//Toggle (Part Highlighting)
Evas_Object *toggle_highlight = toggle_create(box, _("Part Highlighting"),
config_part_highlight_get());
elm_box_pack_end(box, toggle_highlight);
//Toggle (Dummy Swallow)
Evas_Object *toggle_swallow = toggle_create(box, _("Dummy Swallow"),
config_dummy_swallow_get());
elm_box_pack_end(box, toggle_swallow);
//Toggle (Status)
Evas_Object *toggle_stats = toggle_create(box, _("Status"),
config_stats_bar_get());
elm_box_pack_end(box, toggle_stats);
//Toggle (Tools)
Evas_Object *toggle_tools = toggle_create(box, _("Tools"),
config_tools_get());
elm_box_pack_end(box, toggle_tools);
//Toggle (Console)
Evas_Object *toggle_console = toggle_create(box, _("Auto Hiding Console"),
config_console_get());
elm_box_pack_end(box, toggle_console);
sd->general_layout = layout;
sd->img_path_entry = img_path_entry;
sd->snd_path_entry = snd_path_entry;
sd->fnt_path_entry = fnt_path_entry;
sd->dat_path_entry = dat_path_entry;
sd->slider_view = slider_view;
sd->view_size_w_entry = entry_view_size_w;
sd->view_size_h_entry = entry_view_size_h;
sd->toggle_view_size = toggle_view_size;
sd->toggle_highlight = toggle_highlight;
sd->toggle_swallow = toggle_swallow;
sd->toggle_stats = toggle_stats;
sd->toggle_tools = toggle_tools;
sd->toggle_console = toggle_console;
return layout;
}
static void
general_tab_cb(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
setting_data *sd = data;
Evas_Object *content;
if (!sd->setting_layout) return;
content = elm_object_part_content_get(sd->setting_layout,
"elm.swallow.content");
if (content == sd->general_layout) return;
elm_object_part_content_unset(sd->setting_layout, "elm.swallow.content");
evas_object_hide(content);
elm_object_part_content_set(sd->setting_layout, "elm.swallow.content",
sd->general_layout);
elm_object_focus_set(sd->img_path_entry, EINA_TRUE);
//Set a custom chain to set the focus order.
Eina_List *custom_chain = NULL;
custom_chain = eina_list_append(custom_chain, sd->tabbar);
custom_chain = eina_list_append(custom_chain, sd->general_layout);
custom_chain = eina_list_append(custom_chain, sd->apply_btn);
custom_chain = eina_list_append(custom_chain, sd->reset_btn);
custom_chain = eina_list_append(custom_chain, sd->cancel_btn);
elm_object_focus_custom_chain_set(sd->setting_layout, custom_chain);
}
static void
text_setting_tab_cb(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
setting_data *sd = data;
text_setting_layout_show(sd->setting_layout, sd->tabbar, sd->apply_btn,
sd->reset_btn, sd->cancel_btn);
}
void
setting_open(void)
{
setting_data *sd = g_sd;
if (sd) return;
sd = calloc(1, sizeof(setting_data));
if (!sd)
{
EINA_LOG_ERR(_("Failed to allocate Memory!"));
return;
}
g_sd = sd;
text_setting_init();
search_close();
goto_close();
//Layout
Evas_Object *layout = elm_layout_add(base_win_get());
elm_layout_file_set(layout, EDJE_PATH, "setting_layout");
elm_object_signal_callback_add(layout, "elm,state,dismiss,done", "",
setting_dismiss_done_cb, sd);
evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_show(layout);
base_win_resize_object_add(layout);
//Tabbar
Evas_Object *tabbar = elm_toolbar_add(layout);
elm_toolbar_shrink_mode_set(tabbar, ELM_TOOLBAR_SHRINK_EXPAND);
elm_toolbar_select_mode_set(tabbar, ELM_OBJECT_SELECT_MODE_ALWAYS);
evas_object_size_hint_weight_set(tabbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_toolbar_item_append(tabbar, NULL, _("General"), general_tab_cb, sd);
elm_toolbar_item_append(tabbar, NULL, _("Text Editor"), text_setting_tab_cb, sd);
elm_object_part_content_set(layout, "elm.swallow.tabbar", tabbar);
//General layout
Evas_Object *general_layout = general_layout_create(sd, layout);
elm_object_part_content_set(layout, "elm.swallow.content", general_layout);
//Text setting layout
Evas_Object *text_setting_layout;
text_setting_layout = text_setting_layout_create(layout);
evas_object_hide(text_setting_layout);
//Apply Button
Evas_Object *apply_btn = elm_button_add(layout);
elm_object_text_set(apply_btn, _("Apply"));
evas_object_smart_callback_add(apply_btn, "clicked", setting_apply_btn_cb,
sd);
elm_object_part_content_set(layout, "elm.swallow.apply_btn", apply_btn);
//Reset Button
Evas_Object *reset_btn = elm_button_add(layout);
elm_object_text_set(reset_btn, _("Reset"));
evas_object_smart_callback_add(reset_btn, "clicked", setting_reset_btn_cb,
sd);
elm_object_part_content_set(layout, "elm.swallow.reset_btn", reset_btn);
//Cancel Button
Evas_Object *cancel_btn = elm_button_add(layout);
elm_object_text_set(cancel_btn, _("Cancel"));
evas_object_smart_callback_add(cancel_btn, "clicked", setting_cancel_btn_cb,
sd);
elm_object_part_content_set(layout, "elm.swallow.cancel_btn", cancel_btn);
sd->setting_layout = layout;
sd->tabbar = tabbar;
sd->apply_btn = apply_btn;
sd->reset_btn = reset_btn;
sd->cancel_btn = cancel_btn;
menu_activate_request();
}
void
setting_close()
{
setting_data *sd = g_sd;
if (!sd) return;
elm_object_signal_emit(sd->setting_layout, "elm,state,dismiss", "");
}
Eina_Bool
setting_is_opened(void)
{
setting_data *sd = g_sd;
if (!sd) return EINA_FALSE;
return EINA_TRUE;
}