elm-theme-viewer/src/gui.c

459 lines
13 KiB
C

#include <Elementary.h>
#include "common.h"
#include "log.h"
#include "theme.h"
#include "widget.h"
#define SIZE_WIDTH_MIN 40
#define SIZE_WIDTH_MAX 500
#define SIZE_WIDTH_DEFAULT 300
#define SIZE_HEIGHT_MIN 30
#define SIZE_HEIGHT_MAX 400
#define SIZE_HEIGHT_DEFAULT 100
Evas_Object *list, *win, *gui_layout, *preview_box, *preview_obj;
Evas_Object *description_frame, *option_frame;
Evas_Object *size_width_slider, *size_height_slider;
Evas_Object *option_force_resize;
typedef struct _Style_Data Style_Data;
struct _Style_Data
{
Widget_Type widget_type;
const char *style;
};
static void
_preview_create(Widget_Type widget, const char *style)
{
Evas_Object *o;
if (preview_obj)
{
evas_object_del(preview_obj);
preview_obj = NULL;
}
if (widget && style)
{
o = widget_create(widget, style);
elm_box_pack_end(preview_box, o);
preview_obj = o;
}
}
static void
_left_menu_create(Evas_Object *parent)
{
Evas_Object *nf;
nf = elm_naviframe_add(parent);
evas_object_show(nf);
list = elm_list_add(parent);
elm_list_select_mode_set(list, ELM_OBJECT_SELECT_MODE_ALWAYS);
evas_object_data_set(list, "nf", nf);
elm_naviframe_item_push(nf, "Widgets", NULL, NULL, list, NULL);
evas_object_show(list);
elm_layout_content_set(gui_layout, "left_menu", nf);
}
static void
_finger_size_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
double val = elm_slider_value_get(obj);
double v;
v = round(val);
if (v != val) elm_slider_value_set(obj, v);
elm_config_finger_size_set(v);
INF("finger size changed : %f %f", val, v);
}
static void
_scale_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
double val = elm_slider_value_get(obj);
double v;
v = (double)(int)round(val * 10.0) / 10.0;
if (v != val) elm_slider_value_set(obj, v);
elm_config_scale_set(v);
INF("scale changed : %f %f", val, v);
}
static void
_size_width_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
double val = elm_slider_value_get(obj);
double v;
v = round(val);
if (v != val) elm_slider_value_set(obj, v);
if (preview_obj)
widget_resize(preview_obj);
INF("size width changed : %f %f", val, v);
}
static void
_size_height_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
double val = elm_slider_value_get(obj);
double v;
v = round(val);
if (v != val) elm_slider_value_set(obj, v);
if (preview_obj)
widget_resize(preview_obj);
INF("size height changed : %f %f", val, v);
}
static void
_force_resize_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
Eina_Bool checked = elm_check_state_get(obj);
elm_object_disabled_set(size_width_slider, !checked);
elm_object_disabled_set(size_height_slider, !checked);
}
static void
_option_size_create(Evas_Object *box)
{
Evas_Object *o;
option_force_resize = o = elm_check_add(box);
elm_object_text_set(o, "Force resize");
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_smart_callback_add(o, "changed", _force_resize_changed_cb, NULL);
elm_box_pack_end(box, o);
evas_object_show(o);
o = elm_label_add(box);
elm_object_text_set(o, "Size Width");
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(box, o);
evas_object_show(o);
size_width_slider = o = elm_slider_add(box);
elm_slider_unit_format_set(o, "%1.0f");
elm_slider_indicator_format_set(o, "%1.0f");
elm_slider_min_max_set(o, SIZE_WIDTH_MIN, SIZE_WIDTH_MAX);
elm_slider_value_set(o, SIZE_WIDTH_DEFAULT);
elm_object_disabled_set(o, EINA_TRUE);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_smart_callback_add(o, "delay,changed", _size_width_changed_cb,
NULL);
elm_box_pack_end(box, o);
evas_object_show(o);
o = elm_label_add(box);
elm_object_text_set(o, "Size Height");
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(box, o);
evas_object_show(o);
size_height_slider = o = elm_slider_add(box);
elm_slider_unit_format_set(o, "%1.0f");
elm_slider_indicator_format_set(o, "%1.0f");
elm_slider_min_max_set(o, SIZE_HEIGHT_MIN, SIZE_HEIGHT_MAX);
elm_slider_value_set(o, SIZE_HEIGHT_DEFAULT);
elm_object_disabled_set(o, EINA_TRUE);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_smart_callback_add(o, "delay,changed", _size_height_changed_cb,
NULL);
elm_box_pack_end(box, o);
evas_object_show(o);
}
static void
_option_create(Evas_Object *parent)
{
Evas_Object *o, *box;
option_frame = o = elm_frame_add(parent);
elm_object_text_set(o, "Option");
evas_object_show(o);
elm_layout_content_set(gui_layout, "option", o);
// outer box
box = o = elm_box_add(option_frame);
elm_object_content_set(option_frame, o);
evas_object_show(o);
// finger size
o = elm_label_add(box);
elm_object_text_set(o, "Finger Size");
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(box, o);
evas_object_show(o);
o = elm_slider_add(box);
elm_slider_unit_format_set(o, "%1.0f");
elm_slider_indicator_format_set(o, "%1.0f");
elm_slider_min_max_set(o, 5, 200);
elm_slider_value_set(o, elm_config_finger_size_get());
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_smart_callback_add(o, "delay,changed", _finger_size_changed_cb, NULL);
elm_box_pack_end(box, o);
evas_object_show(o);
o = elm_separator_add(box);
elm_separator_horizontal_set(o, EINA_TRUE);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(box, o);
evas_object_show(o);
// scale
o = elm_label_add(box);
elm_object_text_set(o, "Scale");
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(box, o);
evas_object_show(o);
o = elm_slider_add(box);
elm_slider_unit_format_set(o, "%1.1f");
elm_slider_indicator_format_set(o, "%1.1f");
elm_slider_min_max_set(o, 0.25, 5.0);
elm_slider_value_set(o, elm_config_scale_get());
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_smart_callback_add(o, "delay,changed", _scale_changed_cb, NULL);
elm_box_pack_end(box, o);
evas_object_show(o);
o = elm_separator_add(box);
elm_separator_horizontal_set(o, EINA_TRUE);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(box, o);
evas_object_show(o);
_option_size_create(box);
// padding
o = elm_box_add(box);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(box, o);
evas_object_show(o);
}
void
gui_create(const char *edje_file)
{
Evas_Object *o, *preview_frame;
char path[PATH_MAX];
if (!edje_file) return;
elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
win = o = elm_win_util_standard_add("elm-theme-viewer", "Elm Theme Viewer");
elm_win_autodel_set(o, EINA_TRUE);
evas_object_resize(o, 600, 500);
evas_object_show(o);
gui_layout = o = elm_layout_add(win);
snprintf(path, sizeof(path), "%s/themes/layout.edj", elm_app_data_dir_get());
elm_layout_file_set(o, path, "etv/main/layout");
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_win_resize_object_add(win, o);
evas_object_show(o);
// title text
elm_layout_text_set(gui_layout, "edje_name_txt", edje_file);
// left menu
_left_menu_create(win);
// preview
preview_frame = o = elm_frame_add(win);
elm_object_text_set(o, "Preview");
evas_object_show(o);
elm_layout_content_set(gui_layout, "preview", o);
preview_box = o = elm_box_add(win);
elm_object_content_set(preview_frame, o);
evas_object_show(o);
// description
description_frame = o = elm_frame_add(win);
elm_object_text_set(o, "Description");
evas_object_show(o);
elm_layout_content_set(gui_layout, "description", o);
// option
_option_create(win);
INF("GUI Creation Done");
return;
}
void
gui_description_set(const char *txt)
{
Evas_Object *o;
o = elm_label_add(win);
elm_label_line_wrap_set(o, ELM_WRAP_MIXED);
elm_object_text_set(o, txt);
elm_object_content_set(description_frame, o);
evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_show(o);
}
static void
_style_list_sel_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
Style_Data *sd = data;
if (!data || !sd->widget_type || !sd->style) return;
INF("%s %s", widget_name_get_by_type(sd->widget_type), sd->style);
_preview_create(sd->widget_type, sd->style);
}
static void
_nf_prev_btn_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
_preview_create(ETV_ID_NONE, NULL);
gui_description_set(NULL);
elm_naviframe_item_pop(data);
}
static void
_style_list_gengrid_group_index_sel_cb(void *data EINA_UNUSED,
Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
_preview_create(ETV_ID_GENGRID, "h9 group-index-style");
}
static void
_style_list_gengrid_grid_check_sel_cb(void *data EINA_UNUSED,
Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
_preview_create(ETV_ID_GENGRID, "h9 grid-check-style");
}
static void
_custom_styles_add(Evas_Object *list, Widget_Type widget)
{
if (ETV_ID_GENGRID == widget)
{
elm_list_item_append(list, "(H9) Grid Check Style", NULL, NULL,
_style_list_gengrid_grid_check_sel_cb, NULL);
elm_list_item_append(list, "(H9) Group Index Style", NULL, NULL,
_style_list_gengrid_group_index_sel_cb, NULL);
}
}
static void
_widget_list_sel_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
{
Evas_Object *nf = evas_object_data_get(obj, "nf");
Evas_Object *li, *prev_btn;
Elm_Object_Item *it;
Eina_List *styles, *l;
char *style;
Style_Data *sd;
Widget_Type type = (Widget_Type)data;
if (!nf) return;
li = elm_list_add(nf);
elm_list_select_mode_set(li, ELM_OBJECT_SELECT_MODE_ALWAYS);
styles = theme_widget_styles_get(type);
EINA_LIST_FOREACH(styles, l, style)
{
// TODO: sd needs to be freed properly
sd = (Style_Data *)calloc(1, sizeof(Style_Data));
sd->widget_type = type;
sd->style = style;
elm_list_item_append(li, style, NULL, NULL, _style_list_sel_cb, sd);
}
// add additional hacky custom styles for special reasons
_custom_styles_add(li, sd->widget_type);
elm_list_item_selected_set(elm_list_first_item_get(li), EINA_TRUE);
elm_list_go(li);
prev_btn = elm_button_add(win);
elm_object_text_set(prev_btn, "< Back");
evas_object_smart_callback_add(prev_btn, "clicked",
_nf_prev_btn_clicked_cb, nf);
evas_object_show(prev_btn);
it = elm_naviframe_item_push(nf, "Styles", prev_btn, NULL, li, NULL);
elm_object_item_part_text_set(it, "subtitle", (char *)widget_name_get_by_type(type));
gui_description_set(widget_desc_get_by_type(type));
}
void
gui_widget_load(void)
{
Eina_List *l;
Widget_Data *wd;
EINA_LIST_FOREACH(widget_list, l, wd)
{
if (eina_list_count(wd->styles))
{
elm_list_item_append(list,
widget_name_get_by_type(wd->type),
NULL, NULL,
_widget_list_sel_cb, (void *)wd->type);
}
}
elm_list_go(list);
}
Eina_Bool
option_is_force_resize(void)
{
if (!option_force_resize)
return EINA_FALSE;
return elm_check_state_get(option_force_resize);
}
void
option_preview_size_get(Evas_Coord *w, Evas_Coord *h)
{
if (size_width_slider)
*w = elm_slider_value_get(size_width_slider);
else
*w = -1;
if (size_height_slider)
*h = elm_slider_value_get(size_height_slider);
else
*h = -1;
}