elm-theme-viewer/src/bin/widget_option.c

655 lines
20 KiB
C

#include <Elementary.h>
#include "common.h"
#include "log.h"
#include "gui.h"
#include "widget.h"
#include "widget_option.h"
Widget_Option_Data *wod = NULL;
extern Gui_Data *gd;
#define WIDGET_OPTION_CHECK_ADD(text__, checked__, cb__) \
o = elm_check_add(box); \
WEIGHT(o, EVAS_HINT_EXPAND, 0.0); FILL(o); \
elm_object_text_set(o, text__); \
elm_check_state_set(o, checked__); \
elm_box_pack_end(box, o); \
evas_object_show(o); \
evas_object_smart_callback_add(o, "changed", cb__, NULL);
#define WIDGET_OPTION_RADIO_ADD(text__, value__, cb__) \
o = elm_radio_add(box); \
WEIGHT(o, EVAS_HINT_EXPAND, 0.0); FILL(o); \
elm_object_text_set(o, text__); \
elm_radio_state_value_set(o, value__); \
elm_box_pack_end(box, o); \
evas_object_show(o); \
evas_object_smart_callback_add(o, "changed", cb__, NULL);
#define WIDGET_OPTION_LABEL_ADD(text__) \
o = elm_label_add(box); \
WEIGHT(o, EVAS_HINT_EXPAND, 0.0); ALIGN(o, 0.0, 0.5); \
elm_object_text_set(o, text__); \
elm_box_pack_end(box, o); \
evas_object_show(o);
#define WIDGET_OPTION_SEPARATOR_ADD() \
o = elm_separator_add(box); \
WEIGHT(o, EVAS_HINT_EXPAND, 0.0); ALIGN(o, EVAS_HINT_FILL, 0.0); \
elm_separator_horizontal_set(o, EINA_TRUE); \
elm_box_pack_end(box, o); \
evas_object_show(o);
#define WIDGET_OPTION_HORIZ_PADDING_ADD() \
o = elm_box_add(box); \
WEIGHT(o, 0.0, EVAS_HINT_EXPAND; ALIGN(o, 0.0, EVAS_HINT_FILL); \
evas_object_size_hint_min_set(o, elm_config_scale_get() * 10, 10); \
elm_box_pack_end(box, o); \
evas_object_show(o);
#define WIDGET_OPTION_VERT_PADDING_ADD() \
o = elm_box_add(box); \
WEIGHT(o, EVAS_HINT_EXPAND, 0.0); ALIGN(o, EVAS_HINT_FILL, 0.0); \
evas_object_size_hint_min_set(o, 0, elm_config_scale_get() * 10); \
elm_box_pack_end(box, o); \
evas_object_show(o);
#define WIDGET_OPTION_PADDING_ADD() \
o = elm_box_add(box); \
EXPAND(o); FILL(o); \
elm_box_pack_end(box, o); \
evas_object_show(o);
#define WIDGET_OPTION_HORIZ_BOX_ADD() \
bx = o = elm_box_add(box); \
elm_box_horizontal_set(o, EINA_TRUE); \
WEIGHT(o, EVAS_HINT_EXPAND, 0.0); FILL(o); \
elm_box_pack_end(box, o); \
evas_object_show(o);
// button
static void
_btn_text_check_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
wod->btn_text = elm_check_state_get(obj);
gui_preview_update();
}
static void
_btn_image_check_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
wod->btn_image = elm_check_state_get(obj);
gui_preview_update();
}
static void
_widget_option_button_create(Evas_Object *box)
{
Evas_Object *o = NULL;
WIDGET_OPTION_CHECK_ADD("Text", wod->btn_text,
_btn_text_check_changed_cb);
WIDGET_OPTION_CHECK_ADD("Image", wod->btn_image,
_btn_image_check_changed_cb);
}
// check
static void
_check_text_selected_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
wod->chk_selected = elm_check_state_get(obj);
gui_preview_update();
}
static void
_check_text_check_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
wod->chk_text = elm_check_state_get(obj);
gui_preview_update();
}
static void
_check_image_check_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
wod->chk_image = elm_check_state_get(obj);
gui_preview_update();
}
static void
_widget_option_check_create(Evas_Object *box)
{
Evas_Object *o = NULL;
WIDGET_OPTION_CHECK_ADD("Selected", wod->chk_selected,
_check_text_selected_changed_cb);
WIDGET_OPTION_CHECK_ADD("Text", wod->chk_text,
_check_text_check_changed_cb);
WIDGET_OPTION_CHECK_ADD("Image", wod->chk_image,
_check_image_check_changed_cb);
}
// entry
static void
_entry_text_len_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
wod->entry_text_len = elm_radio_value_get(obj);
gui_preview_update();
}
static void
_entry_guide_text_check_changed_cb(void *data EINA_UNUSED,
Evas_Object *obj,
void *event_info EINA_UNUSED)
{
wod->entry_guide_text = elm_check_state_get(obj);
gui_preview_update();
}
static void
_widget_option_entry_create(Evas_Object *box)
{
Evas_Object *o = NULL, *rdg = NULL;
// text length
WIDGET_OPTION_LABEL_ADD(" &lt; Length of Text &gt; ");
WIDGET_OPTION_RADIO_ADD("Short", 0, _entry_text_len_changed_cb);
rdg = o;
WIDGET_OPTION_RADIO_ADD("Middle", 1, _entry_text_len_changed_cb);
elm_radio_group_add(o, rdg);
WIDGET_OPTION_RADIO_ADD("Long", 2, _entry_text_len_changed_cb);
elm_radio_group_add(o, rdg);
elm_radio_value_set(rdg, wod->entry_text_len);
WIDGET_OPTION_SEPARATOR_ADD();
WIDGET_OPTION_CHECK_ADD("Guide Text", wod->entry_guide_text,
_entry_guide_text_check_changed_cb);
}
// gengrid
Evas_Object *gengrid_width_entry = NULL;
Evas_Object *gengrid_height_entry = NULL;
static void
_gengrid_item_size_changed_cb(void *data EINA_UNUSED,
Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
wod->gengrid_item_width = atoi(elm_entry_entry_get(gengrid_width_entry));
wod->gengrid_item_height = atoi(elm_entry_entry_get(gengrid_height_entry));
gui_preview_update();
}
static void
_gengrid_text_len_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
wod->gengrid_text_len = elm_radio_value_get(obj);
gui_preview_update();
}
static void
_gengrid_entry_focused_cb(void *data EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
elm_entry_select_all(obj);
}
static void
_widget_option_gengrid_create(Evas_Object *box)
{
Evas_Object *o = NULL, *bx = NULL, *rdg = NULL;
char buf[PATH_MAX] = { 0 };
//struct _Gengrid_Option_Data data = { 0 };
WIDGET_OPTION_LABEL_ADD(" &lt; Gengrid Item Size &gt; ");
// width
WIDGET_OPTION_HORIZ_BOX_ADD();
o = elm_label_add(bx);
WEIGHT(o, 0.0, EVAS_HINT_EXPAND); FILL(o);
elm_object_text_set(o, "Width : ");
elm_box_pack_end(bx, o);
evas_object_show(o);
gengrid_width_entry = o = elm_entry_add(bx);
EXPAND(o); FILL(o);
elm_entry_single_line_set(o, EINA_TRUE);
elm_entry_scrollable_set(o, EINA_TRUE);
snprintf(buf, PATH_MAX, "%d", wod->gengrid_item_width);
elm_entry_entry_set(o, buf);
evas_object_smart_callback_add(o, "focused", _gengrid_entry_focused_cb, NULL);
evas_object_smart_callback_add(o, "activated",
_gengrid_item_size_changed_cb, NULL);
elm_box_pack_end(bx, o);
evas_object_show(o);
// height
WIDGET_OPTION_HORIZ_BOX_ADD();
o = elm_label_add(bx);
WEIGHT(o, 0.0, 0.0); FILL(o);
elm_object_text_set(o, "Height : ");
elm_box_pack_end(bx, o);
evas_object_show(o);
gengrid_height_entry = o = elm_entry_add(bx);
EXPAND(o); FILL(o);
elm_entry_single_line_set(o, EINA_TRUE);
elm_entry_scrollable_set(o, EINA_TRUE);
snprintf(buf, PATH_MAX, "%d", wod->gengrid_item_height);
elm_entry_entry_set(o, buf);
evas_object_smart_callback_add(o, "focused", _gengrid_entry_focused_cb, NULL);
evas_object_smart_callback_add(o, "activated",
_gengrid_item_size_changed_cb, NULL);
elm_box_pack_end(bx, o);
evas_object_show(o);
o = elm_button_add(box);
ALIGN(o, 0.0, EVAS_HINT_FILL);
elm_object_text_set(o, "Apply Item Size Change");
elm_box_pack_end(box, o);
evas_object_show(o);
evas_object_smart_callback_add(o, "clicked",
_gengrid_item_size_changed_cb, NULL);
WIDGET_OPTION_SEPARATOR_ADD();
// text length
WIDGET_OPTION_LABEL_ADD(" &lt; Length of Text &gt; ");
WIDGET_OPTION_RADIO_ADD("Short", 0, _gengrid_text_len_changed_cb);
rdg = o;
WIDGET_OPTION_RADIO_ADD("Middle", 1, _gengrid_text_len_changed_cb);
elm_radio_group_add(o, rdg);
WIDGET_OPTION_RADIO_ADD("Long", 2, _gengrid_text_len_changed_cb);
elm_radio_group_add(o, rdg);
elm_radio_value_set(rdg, wod->gengrid_text_len);
}
// genlist
static void
_genlist_text_len_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
wod->genlist_text_len = elm_radio_value_get(obj);
gui_preview_update();
}
static void
_genlist_content_type_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
wod->genlist_content_type = elm_radio_value_get(obj);
gui_preview_update();
}
static void
_widget_option_genlist_create(Evas_Object *box)
{
Evas_Object *o = NULL, *rdg = NULL;
// text length
WIDGET_OPTION_LABEL_ADD(" &lt; Length of Text &gt; ");
WIDGET_OPTION_RADIO_ADD("Short", 0, _genlist_text_len_changed_cb);
rdg = o;
WIDGET_OPTION_RADIO_ADD("Middle", 1, _genlist_text_len_changed_cb);
elm_radio_group_add(o, rdg);
WIDGET_OPTION_RADIO_ADD("Long", 2, _genlist_text_len_changed_cb);
elm_radio_group_add(o, rdg);
elm_radio_value_set(rdg, wod->genlist_text_len);
WIDGET_OPTION_SEPARATOR_ADD();
// content type
WIDGET_OPTION_LABEL_ADD(" &lt; Content Type &gt; ");
WIDGET_OPTION_RADIO_ADD("Icon", 0, _genlist_content_type_changed_cb);
rdg = o;
WIDGET_OPTION_RADIO_ADD("Check", 1, _genlist_content_type_changed_cb);
elm_radio_group_add(o, rdg);
WIDGET_OPTION_RADIO_ADD("Button", 2, _genlist_content_type_changed_cb);
elm_radio_group_add(o, rdg);
elm_radio_value_set(rdg, wod->genlist_content_type);
}
// popup
struct _Popup_Orient
{
const char *name;
Elm_Popup_Orient orient;
};
struct _Popup_Orient _popup_orient[ELM_POPUP_ORIENT_LAST] =
{
{ "Top", ELM_POPUP_ORIENT_TOP },
{ "Center", ELM_POPUP_ORIENT_CENTER },
{ "Bottom", ELM_POPUP_ORIENT_BOTTOM },
{ "Left", ELM_POPUP_ORIENT_LEFT },
{ "Right", ELM_POPUP_ORIENT_RIGHT },
{ "Top Left", ELM_POPUP_ORIENT_TOP_LEFT },
{ "Top Right", ELM_POPUP_ORIENT_TOP_RIGHT },
{ "Bottom Left", ELM_POPUP_ORIENT_BOTTOM_LEFT },
{ "Bottom Right", ELM_POPUP_ORIENT_BOTTOM_RIGHT }
};
static void
_popup_button_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
wod->pop_button = elm_radio_value_get(obj);
gui_preview_update();
}
static void
_popup_title_text_check_changed_cb(void *data EINA_UNUSED,
Evas_Object *obj,
void *event_info EINA_UNUSED)
{
wod->pop_title_text = elm_check_state_get(obj);
gui_preview_update();
}
static void
_popup_title_icon_check_changed_cb(void *data EINA_UNUSED,
Evas_Object *obj,
void *event_info EINA_UNUSED)
{
wod->pop_title_icon = elm_check_state_get(obj);
gui_preview_update();
}
static void
_popup_content_changed_cb(void *data EINA_UNUSED,
Evas_Object *obj,
void *event_info EINA_UNUSED)
{
wod->pop_content_type = elm_radio_value_get(obj);
gui_preview_update();
}
static void
_popup_orient_changed_cb(void *data, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
wod->pop_orient = (int)(uintptr_t)data;
gui_preview_update();
elm_object_text_set(obj, _popup_orient[wod->pop_orient].name);
}
static void
_widget_option_popup_create(Evas_Object *box)
{
Evas_Object *o = NULL, *rdg = NULL;
int i = 0;
// number of buttons
WIDGET_OPTION_LABEL_ADD(" &lt; Number of Buttons &gt; ");
WIDGET_OPTION_RADIO_ADD("0 Button", 0, _popup_button_changed_cb);
rdg = o;
WIDGET_OPTION_RADIO_ADD("1 Button", 1, _popup_button_changed_cb);
elm_radio_group_add(o, rdg);
WIDGET_OPTION_RADIO_ADD("2 Buttons", 2, _popup_button_changed_cb);
elm_radio_group_add(o, rdg);
WIDGET_OPTION_RADIO_ADD("3 Buttons", 3, _popup_button_changed_cb);
elm_radio_group_add(o, rdg);
elm_radio_value_set(rdg, wod->pop_button);
WIDGET_OPTION_SEPARATOR_ADD();
// title optoin
WIDGET_OPTION_LABEL_ADD(" &lt; Title Option &gt; ");
WIDGET_OPTION_CHECK_ADD("Title Text", wod->pop_title_text,
_popup_title_text_check_changed_cb);
WIDGET_OPTION_CHECK_ADD("Title Icon", wod->pop_title_icon,
_popup_title_icon_check_changed_cb);
WIDGET_OPTION_SEPARATOR_ADD();
// content option
WIDGET_OPTION_LABEL_ADD(" &lt; Content Option &gt; ");
WIDGET_OPTION_RADIO_ADD("Text as content", 0, _popup_content_changed_cb);
rdg = o;
WIDGET_OPTION_RADIO_ADD("Button as content", 1, _popup_content_changed_cb);
elm_radio_group_add(o, rdg);
WIDGET_OPTION_RADIO_ADD("200x50 Rectangle as content", 2,
_popup_content_changed_cb);
elm_radio_group_add(o, rdg);
WIDGET_OPTION_RADIO_ADD("500x200 Rectangle as content", 3,
_popup_content_changed_cb);
elm_radio_group_add(o, rdg);
elm_radio_value_set(rdg, wod->pop_content_type);
WIDGET_OPTION_SEPARATOR_ADD();
// orient set
WIDGET_OPTION_LABEL_ADD(" &lt; Popup Orient &gt; ");
o = elm_hoversel_add(box);
WEIGHT(o, EVAS_HINT_EXPAND, 0.0); ALIGN(o, 0.0, 0.0);
elm_hoversel_hover_parent_set(o, gd->win);
elm_object_text_set(o, _popup_orient[wod->pop_orient].name);
for (i = 0; i < ELM_POPUP_ORIENT_LAST; i++)
{
elm_hoversel_item_add(o, _popup_orient[i].name, NULL, ELM_ICON_NONE,
_popup_orient_changed_cb,
(void *)(uintptr_t)_popup_orient[i].orient);
}
elm_box_pack_end(box, o);
evas_object_show(o);
}
// progressbar
static void
_progressbar_pulse_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
wod->pg_pulse = elm_radio_value_get(obj);
gui_preview_update();
}
static void
_widget_option_progressbar_create(Evas_Object *box)
{
Evas_Object *o = NULL, *rdg = NULL;
rdg = o = elm_radio_add(box);
WEIGHT(o, EVAS_HINT_EXPAND, 0.0); FILL(o);
elm_object_text_set(o, "Pulse");
elm_radio_state_value_set(o, 1);
elm_box_pack_end(box, o);
evas_object_show(o);
evas_object_smart_callback_add(o, "changed",
_progressbar_pulse_changed_cb, NULL);
o = elm_radio_add(box);
WEIGHT(o, EVAS_HINT_EXPAND, 0.0); FILL(o);
elm_object_text_set(o, "Progress");
elm_radio_state_value_set(o, 0);
elm_radio_group_add(o, rdg);
elm_box_pack_end(box, o);
evas_object_show(o);
evas_object_smart_callback_add(o, "changed",
_progressbar_pulse_changed_cb, NULL);
elm_radio_value_set(rdg, wod->pg_pulse);
}
// radio
static void
_radio_text_check_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
wod->rd_text = elm_check_state_get(obj);
gui_preview_update();
}
static void
_radio_image_check_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
wod->rd_image = elm_check_state_get(obj);
gui_preview_update();
}
static void
_widget_option_radio_create(Evas_Object *box)
{
Evas_Object *o = NULL;
WIDGET_OPTION_CHECK_ADD("Text", wod->rd_text,
_radio_text_check_changed_cb);
WIDGET_OPTION_CHECK_ADD("Image", wod->rd_image,
_radio_image_check_changed_cb);
}
// slider
static void
_slider_text_check_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
wod->sl_text = elm_check_state_get(obj);
gui_preview_update();
}
static void
_slider_image_check_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
wod->sl_image = elm_check_state_get(obj);
gui_preview_update();
}
static void
_slider_indicator_check_changed_cb(void *data EINA_UNUSED, Evas_Object *obj,
void *event_info EINA_UNUSED)
{
wod->sl_indicator = elm_check_state_get(obj);
gui_preview_update();
}
static void
_widget_option_slider_create(Evas_Object *box)
{
Evas_Object *o = NULL;
WIDGET_OPTION_CHECK_ADD("Text", wod->sl_text,
_slider_text_check_changed_cb);
WIDGET_OPTION_CHECK_ADD("Image", wod->sl_image,
_slider_image_check_changed_cb);
WIDGET_OPTION_CHECK_ADD("Indicator", wod->sl_indicator,
_slider_indicator_check_changed_cb);
}
// not implemented
static void
_widget_option_not_implemented_create(Evas_Object *box)
{
Evas_Object *o = NULL;
o = elm_label_add(box);
WEIGHT(o, EVAS_HINT_EXPAND, 0.0); FILL(o);
elm_label_line_wrap_set(o, ELM_WRAP_MIXED);
elm_object_text_set(o, "Widget specific option is available here. But this widget does not support that feature now. Sorry.");
elm_box_pack_end(box, o);
evas_object_show(o);
}
static void
_wod_init(void)
{
wod = calloc(1, sizeof(Widget_Option_Data));
if (!wod)
{
CRI("Internal Widget_Option_Data is not created!");
return;
}
wod->btn_text = EINA_TRUE;
wod->chk_text = EINA_TRUE;
wod->entry_text_len = 2;
wod->gengrid_item_width = 168;
wod->gengrid_item_height = 168;
wod->genlist_text_len = 3;
wod->pop_button = 2;
wod->pop_title_text = 1;
wod->pop_orient = 1;
wod->pg_pulse = EINA_TRUE;
wod->rd_text = EINA_TRUE;
wod->sl_text = EINA_TRUE;
wod->sl_indicator = EINA_TRUE;
}
void
widget_option_content_update(Widget_Type type)
{
Evas_Object *o = NULL, *fr = NULL, *box = NULL;
char buf[PATH_MAX] = { 0 };
static Widget_Type prev_type = ETV_ID_NONE;
if (!gd) return;
if (!wod) _wod_init();
// optimization. do not create the same object again.
if (prev_type == type) return;
prev_type = type;
// option padding frame
fr = o = elm_frame_add(gd->widget_option_scr);
EXPAND(o); FILL(o);
elm_object_style_set(o, "pad_medium");
evas_object_show(o);
// option box
box = o = elm_box_add(fr);
EXPAND(o); FILL(o);
elm_box_padding_set(o, 0, elm_config_scale_get() * 5);
elm_object_content_set(fr, o);
evas_object_show(o);
// widget description label
o = elm_label_add(box);
WEIGHT(o, EVAS_HINT_EXPAND, 0.0); FILL(o);
elm_label_line_wrap_set(o, ELM_WRAP_MIXED);
sprintf(buf, "< %s widget specific options >", widget_name_get_by_type(type));
elm_object_text_set(o, buf);
elm_box_pack_end(box, o);
evas_object_show(o);
#define WIDGET_OPTION(name__, type__) \
else if (type == type__) \
_widget_option_##name__##_create(box); \
if (type == ETV_ID_NONE)
{
o = elm_object_content_unset(gd->widget_option_scr);
if (o) evas_object_del(o);
return;
}
WIDGET_OPTION(button, ETV_ID_BUTTON)
WIDGET_OPTION(check, ETV_ID_CHECK)
WIDGET_OPTION(entry, ETV_ID_ENTRY)
WIDGET_OPTION(gengrid, ETV_ID_GENGRID)
WIDGET_OPTION(genlist, ETV_ID_GENLIST)
WIDGET_OPTION(popup, ETV_ID_POPUP)
WIDGET_OPTION(progressbar, ETV_ID_PROGRESSBAR)
WIDGET_OPTION(radio, ETV_ID_RADIO)
WIDGET_OPTION(slider, ETV_ID_SLIDER)
else
_widget_option_not_implemented_create(box);
// padding
o = elm_box_add(box);
EXPAND(o); FILL(o);
elm_box_pack_end(box, o);
evas_object_show(o);
// set the frame into option scroller
elm_object_content_set(gd->widget_option_scr, fr);
}