From 7d9482dfa3636633e50303ba22059dbdc42c6164 Mon Sep 17 00:00:00 2001 From: Olliver Schinagl Date: Thu, 30 Jul 2015 13:17:56 +0200 Subject: make progress screens generic Signed-off-by: Olliver Schinagl --- src/eulogium.c | 50 +++++++------ src/eulogium.h | 6 +- src/print_data.h | 1 + src/procedures.c | 222 ++++++++++++++++++++++++++++++++----------------------- src/procedures.h | 22 +++--- src/ui_widgets.c | 133 +++++++++++++++------------------ src/ui_widgets.h | 4 +- 7 files changed, 240 insertions(+), 198 deletions(-) diff --git a/src/eulogium.c b/src/eulogium.c index e34f748..e4b8338 100644 --- a/src/eulogium.c +++ b/src/eulogium.c @@ -120,7 +120,7 @@ static struct button_def but_return = { .data = NULL, }; -static struct button_def but_print_abort_confirm = { +struct button_def but_print_abort_confirm = { .text = "ABORT", .cb = { .func = &_print_abort_confirm_cb, @@ -140,7 +140,7 @@ static struct button_def but_print_abort = { .data = NULL, }; -static struct button_def but_print_tune = { +struct button_def but_print_tune = { .text = "TUNE", .cb = { .func = &_but_print_tune_cb, @@ -1704,7 +1704,8 @@ static struct print_data progressbars[] = { .jobname = NULL, .time = 0, .total_time = 0, - .value = 0.0, + .value = -1.0, + .format = "%1.1f %%", .proc_key = PROC_PRINT, }, [PROC_FIRMWARE_UPDATE] = { @@ -1713,7 +1714,8 @@ static struct print_data progressbars[] = { .jobname = NULL, .time = 0, .total_time = 0, - .value = 0.0, + .value = -1.0, + .format = "%1.1f %%", .proc_key = PROC_FIRMWARE_UPDATE, }, }; @@ -2511,7 +2513,7 @@ static char *parse_networks_for_display(struct network_data *networks) for (i = 0; networks[i].obj_path; i++) if (networks[i].ipv4) { // TODO || networks[i].ipv6) /* XXX if ipv4 exists, but is '', this will still print an empty field. */ buf = realloc(buf, pos + 34 * sizeof(char *)); - pos += sprintf(buf + pos, "%s%s IP: %s", i == 0 ? "": "
", (networks[i].tech == TECH_ETHERNET) ? "Ethernet" : (networks[i].tech == TECH_WIFI) ? "WiFi" : "", networks[i].ipv4); + pos += sprintf(buf + pos, "%s%s IP: %s", i == 0 ? "": "
", (networks[i].tech == TECH_ETHERNET) ? "LAN" : (networks[i].tech == TECH_WIFI) ? "WiFi" : "", networks[i].ipv4); } return buf; @@ -2736,7 +2738,7 @@ void eulogium_button_data_set(struct button_def *button, void *data) button->data = data; } -void eulogium_print_data_set(struct eulogium_data *eulogium, char *filepath) +void eulogium_print_data_set(struct print_data *print, char *filepath) { char *buf; size_t buf_size; @@ -2747,11 +2749,8 @@ void eulogium_print_data_set(struct eulogium_data *eulogium, char *filepath) buf_size = strlen("file://") + strlen(filepath) + 1; buf = malloc(buf_size); /* TODO: remember to free this later! */ snprintf(buf, buf_size, "file://%s", filepath); - eulogium->print.url = buf; - eulogium->print.jobname = ecore_file_strip_ext(ecore_file_file_get(filepath)); - eulogium->print.flags = ""; - eulogium->print.material = 100.23; /* TODO */ - eulogium->print.time = 12; + print->url = buf; + print->jobname = ecore_file_strip_ext(ecore_file_file_get(filepath)); } static void _cb_eulogium_exit(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2808,7 +2807,6 @@ static Eina_Bool _timer_progress_data_update_cb(void *data) elm_progressbar_inverted_set(eulogium->progress, EINA_TRUE); status = eulogium->printer.status; } -#endif if (progress->value != value) { elm_progressbar_value_set(eulogium->progress, progress->value); value = progress->value; @@ -2855,6 +2853,7 @@ static Eina_Bool _timer_progress_data_update_cb(void *data) progress->time = time; } +#endif return ECORE_CALLBACK_RENEW; } @@ -2973,6 +2972,8 @@ Evas_Object *eulogium_print_progress(Evas_Object *parent, struct eulogium_data * return NULL; } + return ui_widget_progress(parent, eulogium->procedures[PROC_PRINT].meta, &eulogium->procedures[PROC_PRINT].event); +#if 0 _top = elm_box_add(parent); 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); @@ -2993,7 +2994,6 @@ Evas_Object *eulogium_print_progress(Evas_Object *parent, struct eulogium_data * evas_object_show(eulogium->status); elm_box_pack_end(_top, eulogium->status); - printf("jobname: %s\n", progress->jobname); eulogium->name = elm_label_add(_top); elm_object_text_set(eulogium->name, progress->jobname); elm_label_slide_mode_set(eulogium->name, ELM_LABEL_SLIDE_MODE_AUTO); @@ -3018,6 +3018,7 @@ Evas_Object *eulogium_print_progress(Evas_Object *parent, struct eulogium_data * evas_object_show(_bottom); return eulogium_split_screen(parent, _top, _bottom); +#endif } void eulogium_generic_error(struct eulogium_data *eulogium, uint_fast16_t error_code, const char *error_msg) @@ -3145,12 +3146,13 @@ static void _cb_select_file(void *data, Evas_Object *obj EINA_UNUSED, void *even new_dir->dir.path = malloc(new_dir_len); /* XXX memleak, but by copying we can free _filelist_data without worry */ strncpy(new_dir->dir.path, filepath, new_dir_len); content = menu_widget_list(eulogium, eulogium->navi, new_dir); - ui_stack_push(eulogium->navi, content, PAGE_NORMAL); /* XXX We need to set the correct page type here */ + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } else { Evas_Object *content; + struct print_data *progress = eulogium->procedures[PROC_PRINT].meta; /* XXX hack, fix me soon! */ - eulogium_print_data_set(eulogium, filepath); - procedure_print_start(&eulogium->print); + eulogium_print_data_set(progress, filepath); + procedure_print_start(progress); content = eulogium_pre_print(eulogium->navi, eulogium); ui_stack_push(eulogium->navi, content, PAGE_PRINTING); } @@ -3968,7 +3970,9 @@ static void _on_get_active_procedures_ret(void *data EINA_UNUSED, const Eldbus_M return; } while (eldbus_message_iter_get_and_next(array, 'r', &act_proc_struct)) { - if (eldbus_message_iter_arguments_get(act_proc_struct, "ss", &key, &step)) { + if (!(eldbus_message_iter_arguments_get(act_proc_struct, "ss", &key, &step))) { + EINA_LOG_ERR("Message content does not match expected \"ss\" signature. (%s)", eldbus_message_signature_get(msg)); + } else { struct procedure_data *procedure; EINA_LOG_ERR("Key '%s' step '%s'", key, step); @@ -4003,10 +4007,10 @@ static void _on_procedure_start_ret(void *data, const Eldbus_Message *msg) EINA_LOG_ERR("Message content does not match expected \"ss\" signature. (%s)", eldbus_message_signature_get(msg)); return; } - EINA_LOG_ERR("Key '%s' step '%s'", key, step); +// EINA_LOG_ERR("Key '%s' step '%s'", key, step); procedure = procedure_get(key); if (!procedure) { - EINA_LOG_ERR("Unknown procedure %s", key); +// EINA_LOG_ERR("Unknown procedure %s", key); return; } procedure->status = PROC_ACTIVE; @@ -4061,15 +4065,15 @@ static void _on_procedure_finished_ret(void *data EINA_UNUSED, const Eldbus_Mess EINA_LOG_ERR("Message content does not match expected \"s\" signature. (%s)", eldbus_message_signature_get(msg)); return; } - EINA_LOG_ERR("finshed Key '%s'", key); +// EINA_LOG_ERR("finshed Key '%s'", key); procedure = procedure_get(key); if (!procedure) { - EINA_LOG_ERR("Unknown procedure %s", key); +// EINA_LOG_ERR("Unknown procedure %s", key); return; } procedure->status = PROC_FINISHED; procedure->step_active = NULL; - procedure_process_step(procedure, data); + procedure_process_finish(procedure, data); } static void _on_get_error_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) @@ -4262,7 +4266,7 @@ static void eulogium_setup(struct eulogium_data *eulogium) procedure_meta_set(&eulogium->procedures[PROC_CURRENT_XY], PROC_META_SLIDER, &dials[PROC_CURRENT_XY]); procedure_meta_set(&eulogium->procedures[PROC_CURRENT_Z], PROC_META_SLIDER, &dials[PROC_CURRENT_Z]); procedure_meta_set(&eulogium->procedures[PROC_CURRENT_E], PROC_META_SLIDER, &dials[PROC_CURRENT_E]); - procedure_meta_getall(); + procedure_meta_getall(); /* XXX do we really want to get all metadata at start? Not only of active and special procedures? */ } void _priviledges_drop(void) diff --git a/src/eulogium.h b/src/eulogium.h index 61cbaa2..2420276 100644 --- a/src/eulogium.h +++ b/src/eulogium.h @@ -75,9 +75,13 @@ struct multi_text { const char *text[]; }; +/* XXX this does not belong here, temporary here for print_progress migration */ +struct button_def but_print_abort_confirm; +struct button_def but_print_tune; + void eulogium_generic_error(struct eulogium_data *eulogium, uint_fast16_t error_code, const char *error_msg); -void eulogium_print_data_set(struct eulogium_data *eulogium, char *filepath); +void eulogium_print_data_set(struct print_data *print, char *filepath); Evas_Object *eulogium_main_menu(Evas_Object *window, struct eulogium_data *eulogium); Evas_Object *eulogium_split_screen(Evas_Object *parent, Evas_Object *top, Evas_Object *bottom); diff --git a/src/print_data.h b/src/print_data.h index b51252a..7a4dd0e 100644 --- a/src/print_data.h +++ b/src/print_data.h @@ -26,6 +26,7 @@ struct print_data { /* XXX progress data or the like, strip non-progress data */ int_fast32_t time; int_fast32_t total_time; double value; /* progress */ + const char *format; char *flags; double material; Eina_Bool block; diff --git a/src/procedures.c b/src/procedures.c index 916367f..21ef87e 100644 --- a/src/procedures.c +++ b/src/procedures.c @@ -120,7 +120,14 @@ static void _container_dict_basic_variant_append(Eldbus_Message_Iter *array, int eldbus_message_iter_container_close(array, dict); /* } */ } -static void _get_meta_progress(void *data, const void *key, Eldbus_Message_Iter *var) +void _meta_progress_free(void *meta EINA_UNUSED, void *data EINA_UNUSED) +{ + /* This is a dummy function, we dont' need to free anything, as there was no malloced data. + * If however we do not supply this function to ecore_event_add() ecore tries to free + * the meta that's not free-able */ +} + +static void _meta_progress_get(void *data, const void *key, Eldbus_Message_Iter *var) { struct procedure_data *procedure = data; struct print_data *progress = procedure->meta; /* XXX rename to progress data | check meta_type if it is the correct type. */ @@ -170,11 +177,10 @@ static void _get_meta_progress(void *data, const void *key, Eldbus_Message_Iter } free(var_sig); - - ecore_event_add(procedure->poll.event, NULL, NULL, NULL); + ecore_event_add(procedure->event.type, procedure->meta, &_meta_progress_free, NULL); } -static void _get_meta_cur_tar(void *data, const void *key, Eldbus_Message_Iter *var) +static void _meta_cur_tar_get(void *data, const void *key, Eldbus_Message_Iter *var) { struct procedure_data *procedure = data; struct settings_dial_data *dial_data = procedure->meta; @@ -201,7 +207,7 @@ static void _get_meta_cur_tar(void *data, const void *key, Eldbus_Message_Iter * } free(var_sig); -// ecore_event_add(procedure->poll.event, dial_data, NULL, NULL); +// ecore_event_add(procedure->event.type, dial_data, NULL, NULL); } static void _on_start_print_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) @@ -269,10 +275,10 @@ void procedure_process_step(struct procedure_data *procedure, struct eulogium_da return; /* XXX TODO build 'remember previous screen so we don't redraw the same' */ - EINA_LOG_CRIT("%s", procedure->step_active->key); + EINA_LOG_CRIT("processing key %s step %s", procedure->key, procedure->step_active->key); if (procedure->step_active->step == STEP_FIRMWARE_UPDATE_WRITING) { procedure_metadata_poll(procedure, EINA_TRUE); - content = ui_widget_progress(eulogium->navi, procedure); + content = ui_widget_progress(eulogium->navi, procedure->meta, &procedure->event); page_state = PAGE_FIRMWARE; } if (procedure->step_active->step == STEP_PRINTING) { @@ -280,7 +286,7 @@ void procedure_process_step(struct procedure_data *procedure, struct eulogium_da page_state = PAGE_PRINTING; } if (procedure->step_active->step == PROC_WAIT_FOR_CLEANUP) { - ui_stack_page_invalidate(eulogium->navi, PAGE_PRINTING); + ui_stack_page_invalidate(eulogium->navi, PAGE_PRINTING); /* XXX Probably move to process_finished */ content = eulogium_clean_print_bed(eulogium); } @@ -288,16 +294,23 @@ void procedure_process_step(struct procedure_data *procedure, struct eulogium_da return; navi_item = elm_naviframe_item_simple_push(eulogium->navi, content); - elm_object_item_data_set(navi_item, (void *)page_state); + elm_object_item_data_set(navi_item, (void *)page_state); /* TODO remove? why is this still here */ if (page_state == PAGE_PRINTING) elm_naviframe_item_pop_cb_set(navi_item, _print_progress_cleanup, eulogium); } -void procedure_procedure_finish(struct procedure_data *procedure, struct eulogium_data *eulogium) +void procedure_process_finish(struct procedure_data *procedure, struct eulogium_data *eulogium) { if (!procedure) return; - + + EINA_LOG_CRIT("finishing key %s", procedure->key); + if (procedure->proc_key == PROC_FIRMWARE_UPDATE) { + ui_stack_page_invalidate(eulogium->navi, PAGE_FIRMWARE); + ui_stack_pop(eulogium->navi); + } + if (procedure->proc_key == PROC_PRINT) { + }; } static struct procedure_msg print_msgs[] = { @@ -493,245 +506,261 @@ static struct procedure_step steps_material_change[] = { static struct procedure_data procedures[] = { [PROC_FIRMWARE_UPDATE] = { .key = _PROC_FIRMWARE_UPDATE, + .proc_key = PROC_FIRMWARE_UPDATE, .wizard = EINA_FALSE, .status = PROC_READY, - .parser = _get_meta_progress, + .parser = _meta_progress_get, .executable = EINA_FALSE, .available = EINA_FALSE, ._steps = steps_firmware_update, .step_active = NULL, .meta = NULL, /* struct progress_data */ - .poll = { + .event = { .in = 0.5, .timer = NULL, - .event = 0, + .type = 0, }, }, [PROC_PRINT] = { .key = _PROC_PRINT, + .proc_key = PROC_PRINT, .wizard = EINA_FALSE, .status = PROC_READY, - .parser = _get_meta_progress, + .parser = _meta_progress_get, .executable = EINA_FALSE, .available = EINA_FALSE, ._steps = steps_print, .step_active = NULL, .meta = NULL, /* struct print_data */ - .poll = { + .event = { .in = 0.0, .timer = NULL, - .event = 0, + .type = 0, }, }, [PROC_BED_HEATUP] = { .key = _PROC_BED_HEATUP, + .proc_key = PROC_BED_HEATUP, .wizard = EINA_FALSE, .status = PROC_READY, - .parser = _get_meta_cur_tar, + .parser = _meta_cur_tar_get, .executable = EINA_FALSE, .available = EINA_FALSE, ._steps = steps_bed_temp_set, .step_active = NULL, .meta = NULL, - .poll = { + .event = { .in = 0.0, .timer = NULL, - .event = 0, + .type = 0, }, }, [PROC_HOTEND_HEATUP_0] = { .key = _PROC_HOTEND_HEATUP_0, + .proc_key = PROC_HOTEND_HEATUP_0, .wizard = EINA_FALSE, .status = PROC_READY, - .parser = _get_meta_cur_tar, + .parser = _meta_cur_tar_get, .executable = EINA_FALSE, .available = EINA_FALSE, ._steps = steps_hotend_temp_set, .step_active = NULL, .meta = NULL, - .poll = { + .event = { .in = 0.0, .timer = NULL }, }, [PROC_HOTEND_HEATUP_1] = { .key = _PROC_HOTEND_HEATUP_1, + .proc_key = PROC_HOTEND_HEATUP_1, .wizard = EINA_FALSE, .status = PROC_READY, - .parser = _get_meta_cur_tar, + .parser = _meta_cur_tar_get, .executable = EINA_FALSE, .available = EINA_FALSE, ._steps = steps_hotend_temp_set, .step_active = NULL, .meta = NULL, - .poll = { + .event = { .in = 0.0, .timer = NULL, - .event = 0, + .type = 0, }, }, [PROC_HOTEND_ACTIVE_SET] = { .key = _PROC_HOTEND_ACTIVE_SET, + .proc_key = PROC_HOTEND_ACTIVE_SET, .wizard = EINA_FALSE, .status = PROC_READY, - .parser = _get_meta_cur_tar, + .parser = _meta_cur_tar_get, .executable = EINA_FALSE, .available = EINA_FALSE, ._steps = steps_hotend_active_set, .step_active = NULL, .meta = NULL, - .poll = { + .event = { .in = 0.0, .timer = NULL, - .event = 0, + .type = 0, }, }, [PROC_PRINT_SPEED] = { .key = _PROC_PRINT_SPEED, + .proc_key = PROC_PRINT_SPEED, .wizard = EINA_FALSE, .status = PROC_READY, - .parser = _get_meta_cur_tar, + .parser = _meta_cur_tar_get, .executable = EINA_FALSE, .available = EINA_FALSE, ._steps = steps_print_speed_set, .step_active = NULL, .meta = NULL, - .poll = { + .event = { .in = 0.0, .timer = NULL, - .event = 0, + .type = 0, }, }, [PROC_FAN_SPEED] = { .key = _PROC_FAN_SPEED, + .proc_key = PROC_FAN_SPEED, .wizard = EINA_FALSE, .status = PROC_READY, - .parser = _get_meta_cur_tar, + .parser = _meta_cur_tar_get, .executable = EINA_FALSE, .available = EINA_FALSE, ._steps = steps_fan_speed_set, .step_active = NULL, .meta = NULL, - .poll = { + .event = { .in = 0.0, .timer = NULL, - .event = 0, + .type = 0, }, }, [PROC_FLOW_RATE] = { .key = _PROC_FLOW_RATE, + .proc_key = PROC_FLOW_RATE, .wizard = EINA_FALSE, .status = PROC_READY, - .parser = _get_meta_cur_tar, + .parser = _meta_cur_tar_get, .executable = EINA_FALSE, .available = EINA_FALSE, ._steps = steps_flow_rate_set, .step_active = NULL, .meta = NULL, - .poll = { + .event = { .in = 0.0, .timer = NULL, - .event = 0, + .type = 0, }, }, [PROC_RETRACTION_LENGTH] = { .key = _PROC_RETRACTION_LENGTH, + .proc_key = PROC_RETRACTION_LENGTH, .wizard = EINA_FALSE, .status = PROC_READY, - .parser = _get_meta_cur_tar, + .parser = _meta_cur_tar_get, .executable = EINA_FALSE, .available = EINA_FALSE, ._steps = steps_retraction_length_set, .step_active = NULL, .meta = NULL, - .poll = { + .event = { .in = 0.0, .timer = NULL, - .event = 0, + .type = 0, }, }, [PROC_RETRACTION_SPEED] = { .key = _PROC_RETRACTION_SPEED, + .proc_key = PROC_RETRACTION_SPEED, .wizard = EINA_FALSE, .status = PROC_READY, - .parser = _get_meta_cur_tar, + .parser = _meta_cur_tar_get, .executable = EINA_FALSE, .available = EINA_FALSE, ._steps = steps_retraction_speed_set, .step_active = NULL, .meta = NULL, - .poll = { + .event = { .in = 0.0, .timer = NULL, - .event = 0, + .type = 0, }, }, [PROC_RETRACTION_ZHOP] = { .key = _PROC_RETRACTION_ZHOP, + .proc_key = PROC_RETRACTION_ZHOP, .wizard = EINA_FALSE, .status = PROC_READY, - .parser = _get_meta_cur_tar, + .parser = _meta_cur_tar_get, .executable = EINA_FALSE, .available = EINA_FALSE, ._steps = steps_retraction_zhop_set, .step_active = NULL, .meta = NULL, - .poll = { + .event = { .in = 0.0, .timer = NULL, - .event = 0, + .type = 0, }, }, [PROC_BED_LEVEL_AUTO] = { .key = _PROC_BED_LEVEL_AUTO, + .proc_key = PROC_BED_LEVEL_AUTO, .wizard = EINA_FALSE, .status = PROC_READY, - .parser = _get_meta_cur_tar, + .parser = _meta_cur_tar_get, .executable = EINA_FALSE, .available = EINA_FALSE, ._steps = steps_bed_level_auto, .step_active = NULL, .meta = NULL, - .poll = { + .event = { .in = 0.0, .timer = NULL, - .event = 0, + .type = 0, }, }, [PROC_BED_RAISE] = { .key = _PROC_BED_RAISE, + .proc_key = PROC_BED_RAISE, .wizard = EINA_FALSE, .status = PROC_READY, - .parser = _get_meta_cur_tar, + .parser = _meta_cur_tar_get, .executable = EINA_FALSE, .available = EINA_FALSE, ._steps = steps_bed_raise, .step_active = NULL, .meta = NULL, - .poll = { + .event = { .in = 0.0, .timer = NULL, - .event = 0, + .type = 0, }, }, [PROC_BED_HOME] = { .key = _PROC_BED_HOME, + .proc_key = PROC_BED_HOME, .wizard = EINA_FALSE, .status = PROC_READY, - .parser = _get_meta_cur_tar, + .parser = _meta_cur_tar_get, .executable = EINA_FALSE, .available = EINA_FALSE, ._steps = steps_bed_home, .step_active = NULL, .meta = NULL, - .poll = { + .event = { .in = 0.0, .timer = NULL, - .event = 0, + .type = 0, }, }, [PROC_BED_MOVE] = { .key = _PROC_BED_MOVE, + .proc_key = PROC_BED_MOVE, .wizard = EINA_FALSE, .status = PROC_READY, .parser = NULL, @@ -740,30 +769,32 @@ static struct procedure_data procedures[] = { ._steps = steps_move, .step_active = NULL, .meta = NULL, - .poll = { + .event = { .in = 0.0, .timer = NULL, - .event = 0, + .type = 0, }, }, [PROC_HEAD_HOME] = { .key = _PROC_HEAD_HOME, + .proc_key = PROC_HEAD_HOME, .wizard = EINA_FALSE, .status = PROC_READY, - .parser = _get_meta_cur_tar, + .parser = _meta_cur_tar_get, .executable = EINA_FALSE, .available = EINA_FALSE, ._steps = steps_head_home, .step_active = NULL, .meta = NULL, - .poll = { + .event = { .in = 0.0, .timer = NULL, - .event = 0, + .type = 0, }, }, [PROC_MATERIAL_MOVE_0] = { .key = _PROC_MATERIAL_MOVE_0, + .proc_key = PROC_MATERIAL_MOVE_0, .wizard = EINA_FALSE, .status = PROC_READY, .parser = NULL, @@ -772,14 +803,15 @@ static struct procedure_data procedures[] = { ._steps = steps_move, .step_active = NULL, .meta = NULL, - .poll = { + .event = { .in = 0.0, .timer = NULL, - .event = 0, + .type = 0, }, }, [PROC_MATERIAL_MOVE_1] = { .key = _PROC_MATERIAL_MOVE_1, + .proc_key = PROC_MATERIAL_MOVE_1, .wizard = EINA_FALSE, .status = PROC_READY, .parser = NULL, @@ -788,94 +820,100 @@ static struct procedure_data procedures[] = { ._steps = steps_move, .step_active = NULL, .meta = NULL, - .poll = { + .event = { .in = 0.0, .timer = NULL, - .event = 0, + .type = 0, }, }, [PROC_JERK_XY] = { .key = _PROC_JERK_XY, + .proc_key = PROC_JERK_XY, .wizard = EINA_FALSE, .status = PROC_READY, - .parser = _get_meta_cur_tar, + .parser = _meta_cur_tar_get, .executable = EINA_FALSE, .available = EINA_FALSE, ._steps = steps_jerk_xyz_set, .step_active = NULL, .meta = NULL, - .poll = { + .event = { .in = 0.0, .timer = NULL, - .event = 0, + .type = 0, }, }, [PROC_JERK_Z] = { .key = _PROC_JERK_Z, + .proc_key = PROC_JERK_Z, .wizard = EINA_FALSE, .status = PROC_READY, - .parser = _get_meta_cur_tar, + .parser = _meta_cur_tar_get, .executable = EINA_FALSE, .available = EINA_FALSE, ._steps = steps_jerk_xyz_set, .step_active = NULL, .meta = NULL, - .poll = { + .event = { .in = 0.0, .timer = NULL, - .event = 0, + .type = 0, }, }, [PROC_CURRENT_XY] = { .key = _PROC_CURRENT_XY, + .proc_key = PROC_CURRENT_XY, .wizard = EINA_FALSE, .status = PROC_READY, - .parser = _get_meta_cur_tar, + .parser = _meta_cur_tar_get, .executable = EINA_FALSE, .available = EINA_FALSE, ._steps = steps_current_xyze_set, .step_active = NULL, .meta = NULL, - .poll = { + .event = { .in = 0.0, .timer = NULL, - .event = 0, + .type = 0, }, }, [PROC_CURRENT_Z] = { .key = _PROC_CURRENT_Z, + .proc_key = PROC_CURRENT_Z, .wizard = EINA_FALSE, .status = PROC_READY, - .parser = _get_meta_cur_tar, + .parser = _meta_cur_tar_get, .executable = EINA_FALSE, .available = EINA_FALSE, ._steps = steps_current_xyze_set, .step_active = NULL, .meta = NULL, - .poll = { + .event = { .in = 0.0, .timer = NULL, - .event = 0, + .type = 0, }, }, [PROC_CURRENT_E] = { .key = _PROC_CURRENT_E, + .proc_key = PROC_CURRENT_E, .wizard = EINA_FALSE, .status = PROC_READY, - .parser = _get_meta_cur_tar, + .parser = _meta_cur_tar_get, .executable = EINA_FALSE, .available = EINA_FALSE, ._steps = steps_current_xyze_set, .step_active = NULL, .meta = NULL, - .poll = { + .event = { .in = 0.0, .timer = NULL, - .event = 0, + .type = 0, }, }, [PROC_MATERIAL_UNLOAD] = { .key = _PROC_MATERIAL_UNLOAD, + .proc_key = PROC_MATERIAL_UNLOAD, .wizard = EINA_TRUE, .status = PROC_READY, .parser = NULL, @@ -884,14 +922,15 @@ static struct procedure_data procedures[] = { ._steps = steps_material_unload, .step_active = NULL, .meta = NULL, - .poll = { + .event = { .in = 0.0, .timer = NULL, - .event = 0, + .type = 0, }, }, [PROC_MATERIAL_LOAD] = { .key = _PROC_MATERIAL_LOAD, + .proc_key = PROC_MATERIAL_LOAD, .wizard = EINA_TRUE, .status = PROC_READY, .parser = NULL, @@ -900,14 +939,15 @@ static struct procedure_data procedures[] = { ._steps = steps_material_load, .step_active = NULL, .meta = NULL, - .poll = { + .event = { .in = 0.0, .timer = NULL, - .event = 0, + .type = 0, }, }, [PROC_MATERIAL_CHANGE] = { .key = _PROC_MATERIAL_CHANGE, + .proc_key = PROC_MATERIAL_CHANGE, .wizard = EINA_TRUE, .status = PROC_READY, .parser = NULL, @@ -916,10 +956,10 @@ static struct procedure_data procedures[] = { ._steps = steps_material_change, .step_active = NULL, .meta = NULL, - .poll = { + .event = { .in = 0.0, .timer = NULL, - .event = 0, + .type = 0, }, }, }; @@ -1052,14 +1092,14 @@ Eldbus_Pending *procedure_target_set(const enum procedure_key proc_key) void procedure_metadata_poll(struct procedure_data *procedure, Eina_Bool polling) { if (polling) - if (procedure->poll.timer) + if (procedure->event.timer) return; /* Timer already running */ - // procedure->poll.timer = ecore_timer_add(procedure->poll.in, procedure->poll.func, procedure); - if (!procedure->poll.timer) { + // procedure->event.timer = ecore_timer_add(procedure->event.in, procedure->event.func, procedure); + if (!procedure->event.timer) { EINA_LOG_CRIT("Unable to create metadata polling timer"); } else { - if (procedure->poll.timer) - ecore_timer_del(procedure->poll.timer); + if (procedure->event.timer) + ecore_timer_del(procedure->event.timer); else EINA_LOG_CRIT("Unable to delete non-existing timer"); } @@ -1092,7 +1132,7 @@ struct procedure_data *procedures_init(Eldbus_Proxy *proxy) for (i = PROC_NONE; i < PROC_LAST; i++) { if (procedures[i].key) - procedures[i].poll.event = ecore_event_type_new(); + procedures[i].event.type = ecore_event_type_new(); } /* TODO: we probably should do something here to prepare all procedures and their meta data diff --git a/src/procedures.h b/src/procedures.h index 4f6f48a..40b032f 100644 --- a/src/procedures.h +++ b/src/procedures.h @@ -49,7 +49,7 @@ enum procedure_status { PROC_FINISHED, }; -enum procedure_key { /* XXX this will cause problems and has to change */ +enum procedure_key { /* XXX this will cause problems and has to change as we want to iterate over this list */ PROC_NONE = 0, PROC_BED_MOVE, PROC_BED_HEATUP, @@ -125,10 +125,10 @@ enum meta_type { PROC_META_SPINNER, }; -struct poll_data { +struct event_info { double in; Ecore_Timer *timer; - int event; + int type; }; struct meta_data { @@ -138,19 +138,21 @@ struct meta_data { struct procedure_data { const char *key; + enum procedure_key proc_key; enum procedure_status status; Eina_Bool wizard; - const char *sig; + const char *sig; /* XXX can go */ const char *para; /* TODO va_list to go with sig? */ - Eina_Bool available; - Eina_Bool executable; + Eina_Bool available; /* XXX can go */ + Eina_Bool executable; /* XXX can go */ void (*parser)(void *data, const void *key, Eldbus_Message_Iter *variant); - enum meta_type type; - void *meta; /* TODO every proc. has meta data, some needs to be periodically updated (print_data), others on signal changes. needs enum guard to identify which meta we have. */ - const struct procedure_msg *msgs; + enum meta_type type; /* TODO remove in favor of meta \/ */ + void *meta; /* TODO remove in favor of meta \/. */ +// struct meta_data meta; + const struct procedure_msg *msgs; /* XXX can go */ const struct procedure_step *_steps; /* TODO optional? maybe we don't even have to know the list */ const struct procedure_step *step_active; - struct poll_data poll; + struct event_info event; }; struct eulogium_data; /* XXX remove later when struct eulogium gets refactored. */ diff --git a/src/ui_widgets.c b/src/ui_widgets.c index f690fb6..fdd5f24 100644 --- a/src/ui_widgets.c +++ b/src/ui_widgets.c @@ -52,7 +52,7 @@ void _event_handler_from_navi_del(const Evas_Object *navi, const char *str) * place to not pop the very first page of the stack, as that is our * 'main-menu'. TODO Improve doc, this is just an early note. */ -Eina_Bool ui_stack_pop(const Evas_Object *navi) /* TODO replace with just the navi pointer */ +Eina_Bool ui_stack_pop(const Evas_Object *navi) { Eina_List *navi_list, *l; Elm_Object_Item *navi_item; @@ -284,7 +284,7 @@ Evas_Object *ui_widget_spinner(Evas_Object *parent, struct eulogium_data *eulogi Evas_Object *ui_widget_spinner_add(Evas_Object *parent, struct settings_dial_data *dial_data) { Evas_Object *obj, *_top, *_bottom; - Ecore_Event_Handler *handler; +// Ecore_Event_Handler *handler; _top = elm_box_add(parent); evas_object_size_hint_weight_set(_top, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); @@ -372,47 +372,51 @@ Evas_Object *ui_widget_slider(Evas_Object *parent, struct eulogium_data *eulogiu return eulogium_split_screen(parent, _top, _bottom); } -struct _progress_screen_data { - Evas_Object *title; - Evas_Object *status; - Evas_Object *jobname; - Evas_Object *progressbar; - const struct print_data *progress_data; - Ecore_Event_Handler *handler; -}; - static void _widget_progress_del(void *data, Evas *e EINA_UNUSED, Evas_Object *eo EINA_UNUSED, void *event_info EINA_UNUSED) { - struct _progress_screen_data *screen = data; - - if (screen->handler) - ecore_event_handler_del(screen->handler); - screen->handler = NULL; + Ecore_Event_Handler *handler = data; - free(screen); + if (handler) + ecore_event_handler_del(handler); } -static Eina_Bool _widget_progress_update(void *data, int type EINA_UNUSED, void *event_info EINA_UNUSED) +static Eina_Bool _widget_progress_update(void *data, int type EINA_UNUSED, void *ev) { - struct _progress_screen_data *screen = data; - const struct print_data *progress = screen->progress_data; + Evas_Object *progressbar = data; + const struct print_data *progress = ev; - elm_object_text_set(screen->jobname, _(progress->jobname)); - elm_object_text_set(screen->status, _(progress->status)); - elm_progressbar_value_set(screen->progressbar, progress->value); + if (progress->value < 0) { + elm_progressbar_pulse_set(progressbar, EINA_TRUE); + elm_progressbar_pulse(progressbar, EINA_TRUE); + } else { + elm_progressbar_pulse_set(progressbar, EINA_FALSE); + elm_progressbar_pulse(progressbar, EINA_FALSE); + elm_progressbar_value_set(progressbar, progress->value); + } return ECORE_CALLBACK_PASS_ON; } -Evas_Object *ui_widget_progress(Evas_Object *parent, const struct procedure_data *procedure) +Evas_Object *widgets_progressbar_add(Evas_Object *parent, const struct print_data *progress, const struct event_info *event) { - struct print_data *progress = procedure->meta; /* XXX rename to progress data | check meta_type if it is the correct type. */ - Evas_Object *_top, *_bottom, *content; + Evas_Object *obj; Ecore_Event_Handler *handler; - struct _progress_screen_data *screen; - screen = calloc(1, sizeof(struct _progress_screen_data)); - screen->progress_data = progress; + obj = elm_progressbar_add(parent); + elm_progressbar_horizontal_set(obj, EINA_TRUE); + elm_progressbar_unit_format_set(obj, progress->format); + evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL); + _widget_progress_update((void *)obj, event->type, (void *)progress); + handler = ecore_event_handler_add(event->type, _widget_progress_update, obj); + evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _widget_progress_del, handler); + evas_object_show(obj); + + return obj; +} + +Evas_Object *ui_widget_progress(Evas_Object *parent, const struct print_data *progress, const struct event_info *event) +{ + Evas_Object *_top, *_bottom, *content, *obj; _top = elm_box_add(parent); evas_object_size_hint_weight_set(_top, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); @@ -420,58 +424,43 @@ Evas_Object *ui_widget_progress(Evas_Object *parent, const struct procedure_data elm_box_homogeneous_set(_top, EINA_FALSE); evas_object_show(_top); - screen->title = elm_label_add(_top); /* TODO make label sit inverted at the top */ - elm_object_text_set(screen->title, _(progress->title)); - elm_label_slide_mode_set(screen->title, ELM_LABEL_SLIDE_MODE_NONE); - evas_object_size_hint_align_set(screen->title, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_show(screen->title); - elm_box_pack_end(_top, screen->title); - - screen->status = elm_label_add(_top); - elm_object_text_set(screen->status, _("Unknown status")); - elm_label_slide_mode_set(screen->status, ELM_LABEL_SLIDE_MODE_NONE); - evas_object_size_hint_align_set(screen->status, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_show(screen->status); - elm_box_pack_end(_top, screen->status); - - screen->jobname = elm_label_add(_top); - elm_object_text_set(screen->jobname, progress->jobname); - elm_label_slide_mode_set(screen->jobname, ELM_LABEL_SLIDE_MODE_AUTO); + obj = elm_label_add(_top); + elm_object_style_set(obj, "title"); + elm_object_text_set(obj, _(progress->title)); /* TODO move title outside of the ui element when splitting widgets further */ + elm_label_slide_mode_set(obj, ELM_LABEL_SLIDE_MODE_NONE); + evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(obj); + elm_box_pack_end(_top, obj); + + obj = elm_label_add(_top); + elm_object_text_set(obj, _("Unknown status")); + elm_label_slide_mode_set(obj, ELM_LABEL_SLIDE_MODE_NONE); + evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(obj); + elm_box_pack_end(_top, obj); + + obj = elm_label_add(_top); + elm_object_text_set(obj, progress->jobname); + elm_label_slide_mode_set(obj, ELM_LABEL_SLIDE_MODE_AUTO); //elm_label_slide_speed_set(object, 2); - elm_object_style_set(screen->jobname, "slide_bounce"); - elm_label_slide_go(screen->jobname); /* XXX only slide when strlen > 20? as a workaround to this not working automatically. */ - evas_object_size_hint_align_set(screen->jobname, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_show(screen->jobname); - elm_box_pack_end(_top, screen->jobname); - - screen->progressbar = elm_progressbar_add(_top); - elm_progressbar_horizontal_set(screen->progressbar, EINA_TRUE); - if (progress->value < 0) { - elm_progressbar_pulse_set(screen->progressbar, EINA_TRUE); - elm_progressbar_pulse(screen->progressbar, EINA_TRUE); - } else { - elm_progressbar_pulse_set(screen->progressbar, EINA_FALSE); - elm_progressbar_pulse(screen->progressbar, EINA_FALSE); - } - elm_progressbar_value_set(screen->progressbar, progress->value); /* get this from the procedure meta data */ - elm_progressbar_unit_format_set(screen->progressbar, "%1.1f %%"); - evas_object_size_hint_align_set(screen->progressbar, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_show(screen->progressbar); - elm_box_pack_end(_top, screen->progressbar); + elm_object_style_set(obj, "slide_bounce"); + elm_label_slide_go(obj); /* XXX only slide when strlen > 20? as a workaround to this not working automatically. */ + evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(obj); + elm_box_pack_end(_top, obj); - handler = ecore_event_handler_add(procedure->poll.event, _widget_progress_update, screen); - /* XXX handler add to something?; this is broken atm */ + obj = widgets_progressbar_add(_top, progress, event); + elm_box_pack_end(_top, obj); -// _bottom = eulogium_dual_button_add(parent, &but_print_tune, &but_print_abort_confirm); -// evas_object_show(_bottom); + _bottom = eulogium_dual_button_add(parent, &but_print_tune, &but_print_abort_confirm); + evas_object_show(_bottom); content = eulogium_split_screen(parent, _top, _bottom); - evas_object_event_callback_add(content, EVAS_CALLBACK_DEL, _widget_progress_del, screen); return content; } void ui_init(void) { - wizard_init_all(); + wizard_init_all(); /* XXX this does not belong here! init from main/init */ } diff --git a/src/ui_widgets.h b/src/ui_widgets.h index 1620f6c..1298ecc 100644 --- a/src/ui_widgets.h +++ b/src/ui_widgets.h @@ -78,6 +78,7 @@ struct screen_def { * Always make sure that it fits into that. At birth, this enum was intended * to never have more then a handful of states. */ +/* TODO investigate if this can't be replace with the PROC enum */ enum navi_page_state { PAGE_BOTTOM, PAGE_NORMAL, @@ -101,7 +102,8 @@ void ui_stack_page_invalidate(Evas_Object *navi, const enum navi_page_state page Evas_Object *ui_widget_slider(Evas_Object *parent, struct eulogium_data *eulogium, struct settings_dial_data *dial_data); Evas_Object *ui_widget_spinner(Evas_Object *parent, struct eulogium_data *eulogium, struct settings_dial_data *dial_data); Evas_Object *ui_widget_spinner_add(Evas_Object *parent, struct settings_dial_data *dial_data); -Evas_Object *ui_widget_progress(Evas_Object *parent, const struct procedure_data *procedure); +Evas_Object *ui_widget_progress(Evas_Object *parent, const struct print_data *progress, const struct event_info *event); +Evas_Object *widgets_progressbar_add(Evas_Object *parent, const struct print_data *progress, const struct event_info *event); void ui_init(void); -- cgit v0.12