express/src/bin/options.c

244 lines
7.4 KiB
C

#include "private.h"
#include "options.h"
#include "options_general.h"
#include "options_font.h"
#include "options_colors.h"
#include "options_video.h"
#include "options_networks.h"
#include "options_tools.h"
/* local variables */
static Evas_Object *o_win = NULL;
static Evas_Object *o_base = NULL;
static Evas_Object *o_frame = NULL;
static Evas_Object *o_dismiss = NULL;
static Evas_Object *o_box = NULL;
static Evas_Object *o_tbr = NULL;
static Ecore_Timer *_opts_del_timer = NULL;
static Eina_Bool _opts_out = EINA_FALSE;
static void (*_opts_cb_done)(void *data) = NULL;
static void *_opts_cb_data = NULL;
static enum _opt_mode
{
OPTION_NONE = 0,
OPTION_GENERAL,
OPTION_FONT,
OPTION_COLORS,
OPTION_VIDEO,
OPTION_NETWORKS
} _mode = 0;
/* local functions */
static void
_cb_dismiss_mouse_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
{
_options_tools(o_box, o_base, NULL);
_options_toggle(o_win, o_base, data, _opts_cb_done, _opts_cb_data);
}
static void
_cb_dismiss_del(void *data EINA_UNUSED, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
{
o_dismiss = NULL;
}
static Eina_Bool
_cb_del_delay(void *data EINA_UNUSED)
{
if (o_tbr) evas_object_del(o_tbr);
o_tbr = NULL;
if (o_frame) evas_object_del(o_frame);
o_frame = NULL;
if (o_box) evas_object_del(o_box);
o_box = NULL;
_opts_del_timer = NULL;
elm_cache_all_flush();
return EINA_FALSE;
}
static void
_cb_details_done(void *data, Evas_Object *obj EINA_UNUSED, const char *sig EINA_UNUSED, const char *src EINA_UNUSED)
{
Evas_Object *grid;
if (!(grid = data)) return;
_options_tools(o_box, o_base, NULL);
elm_box_clear(o_box);
switch (_mode)
{
case OPTION_NONE:
break;
case OPTION_GENERAL:
_options_general(o_box, grid);
break;
case OPTION_FONT:
_options_font(o_box, grid);
break;
case OPTION_COLORS:
_options_colors(o_box, grid);
break;
case OPTION_VIDEO:
_options_video(o_box, grid);
break;
case OPTION_NETWORKS:
_options_networks(o_box, o_base);
break;
default:
break;
}
edje_object_signal_emit(o_base, "options,details,show", PACKAGE_NAME);
}
static void
_cb_details_done2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, const char *sig EINA_UNUSED, const char *src EINA_UNUSED)
{
if (_opts_del_timer) ecore_timer_del(_opts_del_timer);
_opts_del_timer = NULL;
_cb_del_delay(NULL);
edje_object_signal_callback_del(o_base, "options,details,hide,done",
PACKAGE_NAME, _cb_details_done2);
}
static void
_cb_option(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
{
enum _opt_mode mode = (intptr_t)data;
if (_mode == mode) return;
_mode = mode;
edje_object_signal_emit(o_base, "options,details,hide", PACKAGE_NAME);
}
/* external functions */
void
_options_toggle(Evas_Object *win, Evas_Object *base, Evas_Object *grid, void (*cb_done)(void *data), void *data)
{
Elm_Object_Item *o_itm = NULL;
_mode = OPTION_NONE;
if ((win != o_win) && (o_frame))
{
evas_object_del(o_dismiss);
evas_object_del(o_tbr);
evas_object_del(o_frame);
evas_object_del(o_box);
o_dismiss = NULL;
o_tbr = NULL;
o_frame = NULL;
o_box = NULL;
}
o_win = win;
o_base = base;
if (!o_frame)
{
o_box = elm_box_add(win);
elm_box_align_set(o_box, 0.0, 0.0);
WEIGHT_SET(o_box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
ALIGN_SET(o_box, EVAS_HINT_FILL, EVAS_HINT_FILL);
edje_object_part_swallow(base, "option_details", o_box);
evas_object_show(o_box);
o_frame = elm_frame_add(win);
WEIGHT_SET(o_frame, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
ALIGN_SET(o_frame, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_object_text_set(o_frame, "Options");
o_tbr = elm_toolbar_add(win);
elm_toolbar_menu_parent_set(o_tbr, win);
elm_toolbar_horizontal_set(o_tbr, EINA_FALSE);
elm_toolbar_shrink_mode_set(o_tbr, ELM_TOOLBAR_SHRINK_SCROLL);
elm_toolbar_select_mode_set(o_tbr, ELM_OBJECT_SELECT_MODE_ALWAYS);
WEIGHT_SET(o_tbr, 0.0, EVAS_HINT_EXPAND);
ALIGN_SET(o_tbr, EVAS_HINT_FILL, EVAS_HINT_FILL);
#define TB_APPEND(_icon, _label, _opt_mode) \
elm_toolbar_item_append(o_tbr, _icon, _label, _cb_option, \
(void *) OPTION_##_opt_mode)
o_itm =
TB_APPEND("preferences-system", "General", GENERAL);
elm_toolbar_item_selected_set(o_itm, EINA_TRUE);
TB_APPEND("preferences-desktop-font", "Font", FONT);
TB_APPEND("preferences-desktop-theme", "Colors", COLORS);
/* TB_APPEND("video-display", "Video", VIDEO); */
TB_APPEND("preferences-system-network", "Networks", NETWORKS);
#undef TB_APPEND
elm_object_content_set(o_frame, o_tbr);
evas_object_show(o_tbr);
edje_object_part_swallow(base, "options_details", o_box);
edje_object_part_swallow(base, "options", o_frame);
evas_object_show(o_frame);
}
else if ((o_box) && (!_opts_out))
{
edje_object_part_swallow(base, "options_details", o_box);
edje_object_part_swallow(base, "options", o_frame);
edje_object_signal_emit(base, "options,details,show", PACKAGE_NAME);
edje_object_signal_emit(base, "options,show", PACKAGE_NAME);
}
if (!_opts_out)
{
edje_object_signal_callback_add(base, "options,details,hide,done",
PACKAGE_NAME, _cb_details_done, grid);
o_dismiss = evas_object_rectangle_add(evas_object_evas_get(win));
evas_object_color_set(o_dismiss, 0, 0, 0, 0);
evas_object_event_callback_add(o_dismiss, EVAS_CALLBACK_MOUSE_DOWN,
_cb_dismiss_mouse_down, grid);
evas_object_event_callback_add(o_dismiss, EVAS_CALLBACK_DEL,
_cb_dismiss_del, NULL);
edje_object_part_swallow(base, "dismiss", o_dismiss);
evas_object_show(o_dismiss);
_opts_cb_done = cb_done;
_opts_cb_data = data;
edje_object_signal_emit(base, "options,details,hide", PACKAGE_NAME);
edje_object_signal_emit(base, "options,show", PACKAGE_NAME);
elm_object_focus_set(o_tbr, EINA_TRUE);
_opts_out = EINA_TRUE;
if (_opts_del_timer) ecore_timer_del(_opts_del_timer);
_opts_del_timer = NULL;
}
else
{
edje_object_signal_callback_del(o_base, "options,details,hide,done",
PACKAGE_NAME, _cb_details_done);
edje_object_signal_callback_add(o_base, "options,details,hide,done",
PACKAGE_NAME, _cb_details_done2, NULL);
elm_object_focus_set(o_box, EINA_FALSE);
elm_object_focus_set(o_tbr, EINA_FALSE);
elm_object_focus_set(o_frame, EINA_FALSE);
if (_opts_cb_done) _opts_cb_done(_opts_cb_data);
if (o_dismiss) evas_object_del(o_dismiss);
o_dismiss = NULL;
edje_object_signal_emit(o_base, "options,hide", PACKAGE_NAME);
edje_object_signal_emit(o_base, "options,details,hide", PACKAGE_NAME);
_opts_out = EINA_FALSE;
if (_opts_del_timer) ecore_timer_del(_opts_del_timer);
_opts_del_timer = ecore_timer_add(10.0, _cb_del_delay, NULL);
}
}