From f217213dccab10e8af0953f48a7671855326c871 Mon Sep 17 00:00:00 2001 From: Olliver Schinagl Date: Mon, 29 Jun 2015 12:13:48 +0200 Subject: add concept tune screen Signed-off-by: Olliver Schinagl --- src/eulogium.c | 202 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- src/ui_widgets.h | 22 ++++++ 2 files changed, 220 insertions(+), 4 deletions(-) diff --git a/src/eulogium.c b/src/eulogium.c index 606743d..280e204 100644 --- a/src/eulogium.c +++ b/src/eulogium.c @@ -31,6 +31,9 @@ #define MONTH (4UL * WEEK) #define YEAR (52UL * WEEK) +int INPUT_MOUSE_WHEEL_UP = 0; /* For custom ecore_event handling */ +int INPUT_MOUSE_WHEEL_DOWN = 0; /* For custom ecore_event handling */ + /* TODO this LUT can be much improved */ char *griffin_print_status[] = { gettext_noop("Unknown"), @@ -85,6 +88,8 @@ static void _but_settings_hotend_1_offset_cb(void *data, Evas_Object *obj EINA_U static void _but_settings_hotend_2_offset_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); static void _but_material_customize_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); static void _but_print_tune_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_settings_led_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_led_brightness_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); /* Buttons */ static struct button_def but_return = { @@ -435,7 +440,7 @@ static struct menu_def menu_system_settings = { .end = NULL, .footer = NULL, .footer_alt = NULL, - .func = NULL, + .func = _but_settings_led_cb, .toggle_timer = NULL, .data = NULL, }, { @@ -1159,6 +1164,90 @@ static struct menu_def menu_material_customize = { .data = NULL, }; +static struct menu_def menu_settings_led = { + .title = "LED SETTINGS", + .type = LIST_MENU, + .entry = { + { + .icon = "user-home", + .label = "Return", + .item = {.type = LIST_ITEM_BUTTON}, + .footer = "Return to Main menu", + .footer_alt = NULL, + .func = _cb_content_prev_set, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Hue", + .item = {.type = LIST_ITEM_BUTTON}, + .footer = "100%", + .footer_alt = NULL, + .func = _but_led_brightness_cb, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Saturation", + .item = {.type = LIST_ITEM_BUTTON}, + .footer = "100%", + .footer_alt = NULL, + .func = _but_led_brightness_cb, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Brightness", + .item = {.type = LIST_ITEM_BUTTON}, + .footer = "100%", + .footer_alt = NULL, + .func = _but_led_brightness_cb, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Always On", + .item = { + .type = LIST_ITEM_CHECK, + .state = EINA_FALSE, + ._widget = NULL, + }, + .footer = "Always On", + .footer_alt = NULL, + .func = NULL, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Always Off", + .item = { + .type = LIST_ITEM_CHECK, + .state = EINA_FALSE, + ._widget = NULL, + }, + .footer = "Always Off", + .footer_alt = NULL, + .func = NULL, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Glow on completion", + .item = { + .type = LIST_ITEM_CHECK, + .state = EINA_FALSE, + ._widget = NULL, + }, + .footer = "Glow on completion", + .footer_alt = NULL, + .func = NULL, + .toggle_timer = NULL, + .data = NULL, + }, { NULL }, /* sentinel */ + }, + .data = NULL, +}; + static struct menu_def menu_print_tune = { .title = "TUNE", .type = LIST_MENU, @@ -1603,6 +1692,26 @@ static void _but_settings_language_cb(void *data, Evas_Object *obj EINA_UNUSED, elm_naviframe_item_simple_push(eulogium->navi, content); } +static void _but_settings_led_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + Evas_Object *content = NULL; + + printf("But menu led settings\n"); + content = menu_widget_list(eulogium, eulogium->navi, &menu_settings_led); + ui_stack_push(eulogium, content, PAGE_NORMAL); +} + +static void _but_led_brightness_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + Evas_Object *content; + + printf("Button led_brightness pressed\n"); + content = eulogium_settings_dial(eulogium->navi, eulogium); + ui_stack_push(eulogium, content, PAGE_NORMAL); +} + static char *parse_networks_for_display(struct network_data *networks) { char *buf = NULL; @@ -1856,11 +1965,17 @@ void eulogium_print_data_set(struct eulogium_data *eulogium, char *filepath) static void _cb_eulogium_input_wheel(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Evas_Event_Mouse_Wheel *ev = event_info; + Ecore_Event *event = NULL; - if (ev->z > 0) + if (ev->z > 0) { elm_object_focus_next((Evas_Object *)data, ELM_FOCUS_NEXT); - else + event = ecore_event_add(INPUT_MOUSE_WHEEL_DOWN, NULL, NULL, NULL); + } else { elm_object_focus_next((Evas_Object *)data, ELM_FOCUS_PREVIOUS); + event = ecore_event_add(INPUT_MOUSE_WHEEL_UP, NULL, NULL, NULL); + } + if (!event) + EINA_LOG_ERR("Wheel event failed to queue."); } static void _cb_eulogium_exit(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2796,6 +2911,82 @@ Evas_Object *eulogium_tripple_button_menu(Evas_Object *parent, const struct butt return eulogium_split_screen(parent, _top, _bottom); } +static Eina_Bool _dial_change_delay(void *data) +{ + Evas_Object *dial = data; + Ecore_Timer *delay; + + evas_object_data_set(dial, "delay", NULL); + evas_object_smart_callback_call(dial, "delay,changed", NULL); + + return ECORE_CALLBACK_CANCEL; +} + +static Eina_Bool _dial_change(void *data, int type, void *event_info EINA_UNUSED) +{ + Evas_Object *dial = data; + Ecore_Timer *delay; + double value, step; + +/* TODO XXX we call this dirty little hack because debian's v1.8 of elm does not offer us to actually call drag,left + * evas_object_smart_callback_call(dial, "drag,left", NULL); would have been much cleaner and we didn't need to do + * the val+step get/set thing and thus also benefit from delay,changed which we now 'fake' badly. + */ + value = elm_slider_value_get(dial); + step = elm_slider_step_get(dial); + if (type == INPUT_MOUSE_WHEEL_UP) + elm_slider_value_set(dial, value + step); + if (type == INPUT_MOUSE_WHEEL_DOWN) + elm_slider_value_set(dial, value - step); + evas_object_smart_callback_call(dial, "changed", NULL); + delay = evas_object_data_get(dial, "delay"); + ecore_timer_del(delay); + delay = ecore_timer_add(0.5, _dial_change_delay, dial); /* TODO make define for delay */ + evas_object_data_set(dial, "delay", delay); + + return ECORE_CALLBACK_PASS_ON; +} + +static void _dial_send_update(void *data, Evas_Object *eo, void *event_info EINA_UNUSED) +{ + Eldbus_Proxy *proxy = data; + + eldbus_proxy_call(proxy, "setBrightness", NULL, NULL, -1, "d", elm_slider_value_get(eo)); +} + +Evas_Object *eulogium_settings_dial(Evas_Object *parent, struct eulogium_data *eulogium) +{ + Evas_Object *_top, *_bottom, *obj; + + /* if type is tar/cur do something different TODO */ + _top = elm_slider_add(parent); + elm_object_text_set(_top, "Brightness:"); + elm_object_focus_allow_set(_top, EINA_FALSE); + elm_slider_unit_format_set(_top, "%1.0f%"); + elm_slider_min_max_set(_top, 0, 100); + elm_slider_step_set(_top, 1.0); + evas_object_size_hint_weight_set(_top, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(_top, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(_top, "delay,changed", _dial_send_update, eulogium->dbus.proxy[LED]); + eulogium->event_inc = ecore_event_handler_add(INPUT_MOUSE_WHEEL_UP, _dial_change, _top); + eulogium->event_dec = ecore_event_handler_add(INPUT_MOUSE_WHEEL_DOWN, _dial_change, _top); + evas_object_show(_top); + + obj = elm_label_add(_top); + elm_object_text_set(obj, "100%"); + evas_object_show(obj); + elm_object_part_content_set(_top, "end", obj); + + _bottom = elm_button_add(parent); + elm_object_text_set(_bottom, _("Click when done")); /* TODO, make define for this text */ + evas_object_size_hint_weight_set(_bottom, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(_bottom, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(_bottom, "clicked", _cb_content_prev_set, eulogium); + evas_object_show(_bottom); + + return eulogium_split_screen(parent, _top, _bottom); +} + static struct multi_screen screen[] = { { .type = NONE, @@ -3557,6 +3748,9 @@ EAPI_MAIN int elm_main(int argc, char **argv) return EXIT_FAILURE; } + INPUT_MOUSE_WHEEL_UP = ecore_event_type_new(); + INPUT_MOUSE_WHEEL_DOWN = ecore_event_type_new(); + // elm_prefs_data_new(); /* TODO */ elm_policy_set(ELM_POLICY_QUIT, /* ELM_POLICY_QUIT_NONE */ ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); elm_app_compile_bin_dir_set(PACKAGE_BIN_DIR); @@ -3627,7 +3821,7 @@ EAPI_MAIN int elm_main(int argc, char **argv) evas_object_size_hint_weight_set(object, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_color_set(object, 0, 0, 0, 0); evas_object_repeat_events_set(object, EINA_TRUE); - evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_WHEEL, _cb_eulogium_input_wheel, window); + evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_WHEEL, _cb_eulogium_input_wheel, window); /* TODO elm_obj_ev? event propagation issues? */ /* TODO: don't these two input events repeat/fall through, everything else, may/should. */ evas_object_show(object); elm_win_resize_object_add(window, object); diff --git a/src/ui_widgets.h b/src/ui_widgets.h index 2cab4bc..a32eea3 100644 --- a/src/ui_widgets.h +++ b/src/ui_widgets.h @@ -68,6 +68,28 @@ struct menu_def { struct menu_entry_def entry[]; }; +struct settings_dial_data { + const char *label; + double step; + double min; + double max; + double value; + double value_actual; + char *(*indicator_func)(double value); + void (*free_func)(char *str); + const char *format; + Evas_Object *slider; +}; + +struct screen_def { + const char *title; + Evas_Object *widget; + struct settings_dial_data screen[]; +}; + +extern int INPUT_MOUSE_WHEEL_UP; +extern int INPUT_MOUSE_WHEEL_UP; + void eulogium_button_cb_set(struct button_def *button, struct button_cb *cb); void eulogium_button_cb_data_set(struct button_def *button, void *data); void eulogium_button_data_set(struct button_def *button, void *data); -- cgit v0.12