From 185a5010ed7f20b3835cd54c813a4a1f1de525b3 Mon Sep 17 00:00:00 2001 From: Olliver Schinagl Date: Wed, 29 Jul 2015 08:15:10 +0200 Subject: moar moar! Signed-off-by: Olliver Schinagl --- configure.ac | 1 + data/Makefile.am | 5 + data/etc/systemd/system/griffin.hmi.service | 15 ++ data/themes/default/Makefile.am | 3 +- data/themes/default/edc/elm/button.edc | 8 +- data/themes/default/edc/elm/label.edc | 2 +- data/themes/default/edc/elm/slider.edc | 22 +- data/themes/default/fonts.edc | 8 +- packaging/debian/Makefile.am | 5 +- packaging/debian/changelog | 2 +- packaging/debian/changelog.in | 5 + src/Makefile.am | 7 +- src/eulogium.c | 268 ++++++++++++-------- src/print_data.h | 5 + src/procedures.c | 197 ++++++++++++--- src/procedures.h | 26 +- src/ui_widgets.c | 307 ++++++----------------- src/ui_widgets.h | 43 +--- src/ui_wizards.c | 373 ++++++++++++++++++++++++++++ src/ui_wizards.h | 49 ++++ 20 files changed, 916 insertions(+), 435 deletions(-) create mode 100644 data/etc/systemd/system/griffin.hmi.service create mode 100644 packaging/debian/changelog.in create mode 100644 src/ui_wizards.c create mode 100644 src/ui_wizards.h diff --git a/configure.ac b/configure.ac index 05144d5..ee29025 100644 --- a/configure.ac +++ b/configure.ac @@ -61,6 +61,7 @@ doc/Makefile packaging/Makefile packaging/slackware/Makefile packaging/debian/Makefile +packaging/debian/changelog packaging/pkgbuild/Makefile po/Makefile.in src/Makefile diff --git a/data/Makefile.am b/data/Makefile.am index 2d4e6c1..b72f1fa 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -1,3 +1,8 @@ MAINTAINERCLEANFILES = Makefile.in SUBDIRS = themes desktop + +etcdir = $(destdir)/ +etc_DATA = etc/systemd/system/griffin.hmi.service + +EXTRA_DIST = $(etc_DATA) diff --git a/data/etc/systemd/system/griffin.hmi.service b/data/etc/systemd/system/griffin.hmi.service new file mode 100644 index 0000000..ed952dd --- /dev/null +++ b/data/etc/systemd/system/griffin.hmi.service @@ -0,0 +1,15 @@ +[Unit] +Description=Griffin Human Machine Interface service +Requires=griffin.target +After=griffin.target + +[Service] +Environment="EULOGIUM_USER=ultimaker EULOGIUM_GROUP=ultimaker" +ExecStart=/usr/bin/eulogium_start.sh +ExecStop=/usr/bin/clearscreen.sh +Type=simple +Restart=always +User=root + +[Install] +WantedBy=griffin.target diff --git a/data/themes/default/Makefile.am b/data/themes/default/Makefile.am index 369a986..65eb085 100644 --- a/data/themes/default/Makefile.am +++ b/data/themes/default/Makefile.am @@ -99,8 +99,6 @@ edc/elm/scroller.edc \ edc/elm/segment_control.edc \ edc/elm/separator.edc \ edc/elm/slider.edc \ -edc/elm/slider.edc \ -edc/elm/spinner.edc \ edc/elm/spinner.edc \ edc/elm/thumb.edc \ edc/elm/toolbar.edc \ @@ -125,6 +123,7 @@ img/inset_bar_vert_base.png \ img/inset_bar_vert_glow_base.png \ img/inset_bar_vert_glow_inv_base.png \ img/inset_bar_vert_glow_mid_base.png \ +img/vert_bar_inset.png \ img/knob_round_busy.png \ img/glow_round_corners.png \ img/bevel_in.png \ diff --git a/data/themes/default/edc/elm/button.edc b/data/themes/default/edc/elm/button.edc index 260093a..22205d2 100644 --- a/data/themes/default/edc/elm/button.edc +++ b/data/themes/default/edc/elm/button.edc @@ -71,15 +71,15 @@ group { name: "elm/button/base/default"; } styles { style { name: "button_style_default"; - base: "font="FNBIG" text_class=tb_plain color=#ffffffff align=center"; + base: "font="FNL" text_class=tb_plain color=#ffffffff align=center"; FN_TAG_BR; } style { name: "button_style_focused"; - base: "font="FNBIG" text_class=tb_plain color=#000000ff align=center"; + base: "font="FNL" text_class=tb_plain color=#000000ff align=center"; FN_TAG_BR; } style { name: "button_style_disabled"; - base: "font="FNBIG" text_class=tb_plain color=#000000ff align=center"; + base: "font="FNL" text_class=tb_plain color=#000000ff align=center"; FN_TAG_BR; } } @@ -142,7 +142,7 @@ group { name: "elm/button/base/default"; description { state: "default" 0.0; // fixed: 1 1; visible: 0; - text { font: FNBIG; + text { font: FNL; min: 0 0; text_class: "button_text"; } diff --git a/data/themes/default/edc/elm/label.edc b/data/themes/default/edc/elm/label.edc index c3183e8..2ceb517 100644 --- a/data/themes/default/edc/elm/label.edc +++ b/data/themes/default/edc/elm/label.edc @@ -38,7 +38,7 @@ group { name: "elm/label/base/title"; color_class: "label_text_title"; } } - part { name: "elm.text"; type: TEXTBLOCK; + part { name: "elm.text"; type: TEXTBLOCK; /* TODO: fixed size title? */ scale: 1; description { state: "default" 0.0; rel1.to: "base"; diff --git a/data/themes/default/edc/elm/slider.edc b/data/themes/default/edc/elm/slider.edc index f1b3e18..5dcd853 100644 --- a/data/themes/default/edc/elm/slider.edc +++ b/data/themes/default/edc/elm/slider.edc @@ -53,15 +53,15 @@ group { name: "elm/slider/horizontal/default"; new i = m & INVERT; if (i) { if (!d) { - set_state(PART:"basebar", "default", 0.0); + set_state(PART:"base", "default", 0.0); } else { - set_state(PART:"basebar", "disabled", 0.0); + set_state(PART:"base", "disabled", 0.0); } } else { if (!d) { - set_state(PART:"basebar", "default", 0.0); + set_state(PART:"base", "default", 0.0); } else { - set_state(PART:"basebar", "disabled", 0.0); + set_state(PART:"base", "disabled", 0.0); } } if (l) { @@ -124,10 +124,6 @@ group { name: "elm/slider/horizontal/default"; } } part { name: "base"; mouse_events: 0; - description { state: "default" 0.0; - } - } - part { name: "basebar"; mouse_events: 0; description { state: "default" 0.0; rel1.to: "elm.swallow.bar"; rel2.to: "elm.swallow.bar"; @@ -145,8 +141,8 @@ group { name: "elm/slider/horizontal/default"; } part { name: "bevel"; mouse_events: 0; description { state: "default" 0.0; - rel1.to: "basebar"; - rel2.to: "basebar"; + rel1.to: "base"; + rel2.to: "base"; image.normal: "slider_run_bevel_horiz.png"; image.border: 5 5 0 0; fill.smooth: 0; @@ -284,7 +280,7 @@ group { name: "elm/slider/horizontal/default"; color_class: "slider_text"; text { font: FN; text_class: "slider"; - align: 0.25 0.5; + align: 0.4 0.5; /* XXX quick hack to align text within the content.values */ min: 1 1; ellipsis: -1; } @@ -306,8 +302,8 @@ group { name: "elm/slider/horizontal/default"; align: 1.0 0.5; rel1.to: "elm.content.values"; rel2.to: "elm.content.values"; - rel1.relative: 0.75 0.5; /* TODO 'align to 0.5' */ - rel2.relative: 0.75 0.5; + rel1.relative: 0.8 0.5; /* XXX quick hack to align text within the content.values */ + rel2.relative: 0.8 0.5; } description { state: "visible" 0.0; inherit: "default" 0.0; diff --git a/data/themes/default/fonts.edc b/data/themes/default/fonts.edc index f913bf3..d354f2d 100644 --- a/data/themes/default/fonts.edc +++ b/data/themes/default/fonts.edc @@ -1,9 +1,11 @@ /* XXX HACK! We shouldn't need full pathed fonts. */ -#define FNSML "/usr/share/fonts/X11/misc/4x6.pcf.gz" -#define FN "/usr/share/fonts/X11/misc/5x7.pcf.gz" -#define FNBIG "/usr/share/fonts/X11/misc/6x10.pcf.gz" +#define FNXS "/usr/share/fonts/X11/misc/4x6.pcf.gz" +#define FNS "/usr/share/fonts/X11/misc/5x7.pcf.gz" +#define FN "/usr/share/fonts/X11/misc/6x9.pcf.gz" #define FNBD "/usr/share/fonts/X11/misc/6x13B.pcf.gz" #define FNIT "/usr/share/fonts/X11/misc/6x130.pcf.gz" +#define FNL "/usr/share/fonts/X11/misc/6x10.pcf.gz" +#define FNXL "/usr/share/fonts/X11/misc/12x24.pcf.gz" #define FN_COL_DEFAULT_BASIC 0 0 0 255 /* fonts.edc not sure if this one is neccesary */ diff --git a/packaging/debian/Makefile.am b/packaging/debian/Makefile.am index cdf960e..faf23fc 100644 --- a/packaging/debian/Makefile.am +++ b/packaging/debian/Makefile.am @@ -1,3 +1,6 @@ MAINTAINERCLEANFILES = Makefile.in -EXTRA_DIST = changelog compat control copyright Makefile.am rules source/format +debiandir = $(srcdir)/debian +debian_DATA = changelog compat control copyright Makefile.am rules source/format + +EXTRA_DIST = $(debian_DATA) diff --git a/packaging/debian/changelog b/packaging/debian/changelog index b7d8483..aa94cb5 100644 --- a/packaging/debian/changelog +++ b/packaging/debian/changelog @@ -1,4 +1,4 @@ -eulogium (0.0.1-0) UNRELEASED; urgency=low +eulogium (v0.1-4-g97b1-dirty) UNRELEASED; urgency=low * Initial release. diff --git a/packaging/debian/changelog.in b/packaging/debian/changelog.in new file mode 100644 index 0000000..ffaa44c --- /dev/null +++ b/packaging/debian/changelog.in @@ -0,0 +1,5 @@ +@PACKAGE_NAME@ (@VERSION@) UNRELEASED; urgency=low + + * Initial release. + + -- Olliver Schinagl Tue, 14 Jul 2015 09:54:16 +0200 diff --git a/src/Makefile.am b/src/Makefile.am index 0d0174f..46772f6 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -13,10 +13,11 @@ AM_CPPFLAGS = -DPACKAGE_BIN_DIR=\"$(bindir)/\" \ eulogium_SOURCES = eulogium.c eulogium_item_list.c procedures.c \ dbus_common.c print_data.c network.c ui_widgets.c \ - ui_input.c \ - eulogium.h eulogium_private.h eulogium_item_list.h procedures.h \ + ui_input.c ui_wizards.c \ + eulogium.h eulogium_item_list.h procedures.h \ dbus_common.h print_data.h network.h ui_widgets.h \ - ui_input.h settings_data.h gettext.h + ui_input.h ui_wizards.h settings_data.h \ + libgettext.h gettext.h eulogium_LDADD = @EFL_LIBS@ diff --git a/src/eulogium.c b/src/eulogium.c index 663f1ff..10c6ac6 100644 --- a/src/eulogium.c +++ b/src/eulogium.c @@ -2,16 +2,20 @@ # include "config.h" #endif +#include #include #include #include #include #include #include +#include #include #include #include #include +#include +#include #include "dbus_common.h" #include "eulogium.h" @@ -23,6 +27,7 @@ #include "settings_data.h" #include "ui_input.h" #include "ui_widgets.h" +#include "ui_wizards.h" #define COPYRIGHT "Copyright © 2015 Olliver Schinagl and various contributors (see AUTHORS)." @@ -1719,11 +1724,11 @@ static struct settings_dial_data dials[] = { .label = LABEL_PROC_BED_MOVE, .help = N_("Rotate the knob
CW to down
CCW to go up"), .step = 1.0, - .min = 0.0, /* Unused with this dial */ - .max = 0.0, /* Unused with this dial */ + .min = 1.0, + .max = 1.0, .value = 0.0, .value_end = 0.0, /* Unused with this dial */ - .format = "", /* Unused with this dial */ + .format = "", .format_end = "", /* Unused with this dial */ .unit = "", /* Unused with this dial */ .method_set = &procedure_target_set, @@ -1737,7 +1742,7 @@ static struct settings_dial_data dials[] = { .max = 60.0, .value = 0.0, .value_end = 0.0, - .format = "%1.1f", + .format = "%1.0f", .format_end = " | %1.0f%s", .unit = " °C", .method_set = &procedure_target_set, @@ -1751,7 +1756,7 @@ static struct settings_dial_data dials[] = { .max = 300.0, .value = 0.0, .value_end = 0.0, - .format = "%1.1f", + .format = "%1.0f", .format_end = " | %1.0f%s", .unit = " °C", .method_set = &procedure_target_set, /* XXX use ampersant improve of functions */ @@ -1765,7 +1770,7 @@ static struct settings_dial_data dials[] = { .max = 300.0, .value = 0.0, .value_end = 0.0, - .format = "%1.1f", + .format = "%1.0f", .format_end = " | %1.0f%s", .unit = " °C", .method_set = &procedure_target_set, /* XXX use ampersant improve of functions */ @@ -1774,12 +1779,12 @@ static struct settings_dial_data dials[] = { }, [PROC_PRINT_SPEED] = { .label = N_("Print speed"), - .step = 10.0, + .step = 15.0, .min = 10.0, .max = 1000.0, .value = 0.0, .value_end = 0.0, - .format = "%1.1f", + .format = "%1.0f", .format_end = " | %1.0f%s", .unit = "%", .method_set = &procedure_target_set, @@ -1822,7 +1827,7 @@ static struct settings_dial_data dials[] = { .value = 0.0, .value_end = 0.0, .format = "%1.1f", - .format_end = " | %1.0f%s", + .format_end = " | %1.1f%s", .unit = " mm", .method_set = &procedure_target_set, .method_get = &procedure_metadata_key_get, @@ -1835,7 +1840,7 @@ static struct settings_dial_data dials[] = { .max = 150.0, .value = 0.0, .value_end = 0.0, - .format = "%1.1f", + .format = "%1.0f", .format_end = " | %1.0f%s", .unit = " mm / s", .method_set = &procedure_target_set, @@ -1850,7 +1855,7 @@ static struct settings_dial_data dials[] = { .value = 0.0, .value_end = 0.0, .format = "%1.1f", - .format_end = " | %1.0f%s", + .format_end = " | %1.1f%s", .unit = " mm", .method_set = &procedure_target_set, .method_get = &procedure_metadata_key_get, @@ -2003,7 +2008,9 @@ static void _on_print_abort_ret(void *data, const Eldbus_Message *msg, Eldbus_Pe static void _cb_content_prev_set(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { - ui_stack_pop_cb(data, obj, event_info); /* XXX replace content_prev calls with ui_stack_pop */ + struct eulogium_data *eulogium = data; + + ui_stack_pop_cb(eulogium->navi, obj, event_info); /* XXX replace content_prev calls with ui_stack_pop */ } static void _print_abort_confirm_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2012,7 +2019,7 @@ static void _print_abort_confirm_cb(void *data, Evas_Object *obj EINA_UNUSED, vo Evas_Object *content; content = eulogium_menu_confirm(eulogium->navi, N_("
Abort the print?"), "No", &but_print_abort); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _print_abort_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2038,7 +2045,7 @@ static void _but_system_maintenance_cb(void *data, Evas_Object *obj EINA_UNUSED, printf("But sys maint\n"); content = menu_widget_list(eulogium, eulogium->navi, &menu_system_maintenance); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_material_change_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2048,7 +2055,7 @@ static void _but_material_change_cb(void *data EINA_UNUSED, Evas_Object *obj EIN printf("But material change\n"); content = eulogium_tripple_button_menu(eulogium->navi, &but_change_material_1, &but_change_material_2, &but_return); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_material_settings_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2058,7 +2065,7 @@ static void _but_material_settings_cb(void *data EINA_UNUSED, Evas_Object *obj E printf("But material settings\n"); content = eulogium_tripple_button_menu(eulogium->navi, &but_settings_material_1, &but_settings_material_2, &but_return); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_hotend_change_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2068,7 +2075,7 @@ static void _but_hotend_change_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_ printf("But hotend change\n"); content = eulogium_tripple_button_menu(eulogium->navi, &but_change_hotend_1, &but_change_hotend_2, &but_return); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_hotend_settings_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2078,7 +2085,7 @@ static void _but_hotend_settings_cb(void *data EINA_UNUSED, Evas_Object *obj EIN printf("But hotend settings\n"); content = eulogium_tripple_button_menu(eulogium->navi, &but_settings_hotend_1, &but_settings_hotend_2, &but_return); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_main_system_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2088,7 +2095,7 @@ static void _but_main_system_cb(void *data, Evas_Object *object EINA_UNUSED, voi printf("Button system pressed\n"); content = eulogium_tripple_button_menu(eulogium->navi, &but_system_settings, &but_system_maintenance, &but_return); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void menu_wifi_list(struct eulogium_data *eulogium) @@ -2101,7 +2108,7 @@ static void menu_wifi_list(struct eulogium_data *eulogium) wifi_list->type = LIST_WIFI; content = menu_widget_list(eulogium, eulogium->navi, wifi_list); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void menu_internal_storage(struct eulogium_data *eulogium) @@ -2114,7 +2121,7 @@ static void menu_internal_storage(struct eulogium_data *eulogium) menu_internal_storage->type = LIST_FILE; menu_internal_storage->dir.path = "/home"; /* TODO, use variable for internal storage */ content = menu_widget_list(eulogium, eulogium->navi, menu_internal_storage); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void menu_usb_storage(struct eulogium_data *eulogium) @@ -2141,7 +2148,7 @@ static void menu_usb_storage(struct eulogium_data *eulogium) menu_usb_storage->dir.path = malloc(mount_len); strncpy(menu_usb_storage->dir.path, mount_point, mount_len); content = menu_widget_list(eulogium, eulogium->navi, menu_usb_storage); - ui_stack_push(eulogium, content, PAGE_USB); + ui_stack_push(eulogium->navi, content, PAGE_USB); } static void _network_wifi_manage_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2177,7 +2184,7 @@ static void _cb_button_main_print(void *data, Evas_Object *object EINA_UNUSED, v content = eulogium_tripple_button_menu(eulogium->navi, &but_print_local, &but_print_mmc, &but_return); if (eeze_disk_type_get(mount->disk) == EEZE_DISK_TYPE_USB) content = eulogium_tripple_button_menu(eulogium->navi, &but_print_local, &but_print_usb, &but_return); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } } @@ -2189,7 +2196,7 @@ static void _but_settings_network_cb(void *data, Evas_Object *obj EINA_UNUSED, v printf("But settings network settings\n"); content = menu_widget_list(eulogium, eulogium->navi, &menu_settings_network); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_system_settings_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2199,7 +2206,7 @@ static void _but_system_settings_cb(void *data, Evas_Object *obj EINA_UNUSED, vo printf("But system settings settings\n"); content = menu_widget_list(eulogium, eulogium->navi, &menu_system_settings); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_settings_hotend_1_offset_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2209,7 +2216,7 @@ static void _but_settings_hotend_1_offset_cb(void *data, Evas_Object *obj EINA_U printf("But settings hotend 1 offset settings\n"); content = menu_widget_list(eulogium, eulogium->navi, &menu_settings_hotend_1_offset); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_settings_hotend_2_offset_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2219,7 +2226,7 @@ static void _but_settings_hotend_2_offset_cb(void *data, Evas_Object *obj EINA_U printf("But settings hotend 2 offset settings\n"); content = menu_widget_list(eulogium, eulogium->navi, &menu_settings_hotend_2_offset); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_settings_language_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2229,7 +2236,7 @@ static void _but_settings_language_cb(void *data, Evas_Object *obj EINA_UNUSED, printf("But menu language settings\n"); content = menu_widget_list(eulogium, eulogium->navi, &menu_settings_language); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_settings_led_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2239,7 +2246,7 @@ static void _but_settings_led_cb(void *data, Evas_Object *obj EINA_UNUSED, void printf("But menu led settings\n"); content = menu_widget_list(eulogium, eulogium->navi, &menu_settings_led); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_led_hue_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2249,7 +2256,7 @@ static void _but_led_hue_cb(void *data, Evas_Object *object EINA_UNUSED, void *e printf("Button led_hue pressed\n"); content = ui_widget_slider(eulogium->navi, eulogium, &dial_led_hue); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_led_saturation_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2259,7 +2266,7 @@ static void _but_led_saturation_cb(void *data, Evas_Object *object EINA_UNUSED, printf("Button led_saturation pressed\n"); content = ui_widget_slider(eulogium->navi, eulogium, &dial_led_saturation); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_led_brightness_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2269,7 +2276,7 @@ static void _but_led_brightness_cb(void *data, Evas_Object *object EINA_UNUSED, printf("Button led_brightness pressed\n"); content = ui_widget_slider(eulogium->navi, eulogium, &dial_led_brightness); - ui_stack_push(eulogium, content, PAGE_PRINTING); + ui_stack_push(eulogium->navi, content, PAGE_PRINTING); } static void _but_bed_heatup_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2279,7 +2286,7 @@ static void _but_bed_heatup_cb(void *data, Evas_Object *object EINA_UNUSED, void printf("Button bed temperature pressed\n"); content = ui_widget_slider(eulogium->navi, eulogium, &dials[PROC_BED_HEATUP]); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_hotend_heatup_0_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2289,7 +2296,7 @@ static void _but_hotend_heatup_0_cb(void *data, Evas_Object *object EINA_UNUSED, printf("Button hotend 1 temperature pressed\n"); content = ui_widget_slider(eulogium->navi, eulogium, &dials[PROC_HOTEND_HEATUP_0]); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_hotend_heatup_1_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2299,7 +2306,7 @@ static void _but_hotend_heatup_1_cb(void *data, Evas_Object *object EINA_UNUSED, printf("Button hotend 2 temperature pressed\n"); content = ui_widget_slider(eulogium->navi, eulogium, &dials[PROC_HOTEND_HEATUP_1]); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_hotend_active_set_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2315,7 +2322,7 @@ static void _but_print_speed_cb(void *data, Evas_Object *object EINA_UNUSED, voi printf("Button print speed pressed\n"); content = ui_widget_slider(eulogium->navi, eulogium, &dials[PROC_PRINT_SPEED]); - ui_stack_push(eulogium, content, PAGE_PRINTING); + ui_stack_push(eulogium->navi, content, PAGE_PRINTING); } static void _but_fan_speed_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2325,7 +2332,7 @@ static void _but_fan_speed_cb(void *data, Evas_Object *object EINA_UNUSED, void printf("Button fan speed pressed\n"); content = ui_widget_slider(eulogium->navi, eulogium, &dials[PROC_FAN_SPEED]); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_flow_rate_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2335,7 +2342,7 @@ static void _but_flow_rate_cb(void *data, Evas_Object *object EINA_UNUSED, void printf("Button material flow pressed\n"); content = ui_widget_slider(eulogium->navi, eulogium, &dials[PROC_FLOW_RATE]); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_retraction_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2345,7 +2352,7 @@ static void _but_retraction_cb(void *data, Evas_Object *obj EINA_UNUSED, void *e printf("But menu retraction\n"); content = menu_widget_list(eulogium, eulogium->navi, &menu_retraction); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_retraction_length_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2355,7 +2362,7 @@ static void _but_retraction_length_cb(void *data, Evas_Object *obj EINA_UNUSED, printf("But retraction length\n"); content = ui_widget_slider(eulogium->navi, eulogium, &dials[PROC_RETRACTION_LENGTH]); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_retraction_speed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2365,7 +2372,7 @@ static void _but_retraction_speed_cb(void *data, Evas_Object *obj EINA_UNUSED, v printf("But retraction speed\n"); content = ui_widget_slider(eulogium->navi, eulogium, &dials[PROC_RETRACTION_SPEED]); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_retraction_zhop_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2375,7 +2382,7 @@ static void _but_retraction_zhop_cb(void *data, Evas_Object *obj EINA_UNUSED, vo printf("But retraction zhop\n"); content = ui_widget_slider(eulogium->navi, eulogium, &dials[PROC_RETRACTION_ZHOP]); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_bed_level_auto_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2408,8 +2415,8 @@ static void _but_bed_move_cb(void *data, Evas_Object *obj EINA_UNUSED, void *eve Evas_Object *content = NULL; printf("But bed move\n"); - content = ui_widget_spinner(eulogium->navi, eulogium, &dials[PROC_BED_MOVE]); - ui_stack_push(eulogium, content, PAGE_NORMAL); + content = ui_widget_spinner_add(eulogium->navi, &dials[PROC_BED_MOVE]); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_material_move_0_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2419,7 +2426,7 @@ static void _but_material_move_0_cb(void *data, Evas_Object *obj EINA_UNUSED, vo printf("But move material 0\n"); content = ui_widget_spinner(eulogium->navi, eulogium, &dials[PROC_MATERIAL_MOVE_0]); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_material_move_1_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2429,7 +2436,7 @@ static void _but_material_move_1_cb(void *data, Evas_Object *obj EINA_UNUSED, vo printf("But move material 1\n"); content = ui_widget_spinner(eulogium->navi, eulogium, &dials[PROC_MATERIAL_MOVE_1]); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_motion_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2439,7 +2446,7 @@ static void _but_motion_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event printf("But menu motion\n"); content = menu_widget_list(eulogium, eulogium->navi, &menu_motion); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_jerk_xy_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2449,7 +2456,7 @@ static void _but_jerk_xy_cb(void *data, Evas_Object *obj EINA_UNUSED, void *even printf("But jerk xy\n"); content = ui_widget_slider(eulogium->navi, eulogium, &dials[PROC_JERK_XY]); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_jerk_z_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2459,7 +2466,7 @@ static void _but_jerk_z_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event printf("But jerk z\n"); content = ui_widget_slider(eulogium->navi, eulogium, &dials[PROC_JERK_Z]); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_current_xy_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2469,7 +2476,7 @@ static void _but_current_xy_cb(void *data, Evas_Object *obj EINA_UNUSED, void *e printf("But current xy\n"); content = ui_widget_slider(eulogium->navi, eulogium, &dials[PROC_CURRENT_XY]); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_current_z_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2479,7 +2486,7 @@ static void _but_current_z_cb(void *data, Evas_Object *obj EINA_UNUSED, void *ev printf("But current z\n"); content = ui_widget_slider(eulogium->navi, eulogium, &dials[PROC_CURRENT_Z]); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_current_e_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2489,7 +2496,7 @@ static void _but_current_e_cb(void *data, Evas_Object *obj EINA_UNUSED, void *ev printf("But current e\n"); content = ui_widget_slider(eulogium->navi, eulogium, &dials[PROC_CURRENT_E]); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static char *parse_networks_for_display(struct network_data *networks) @@ -2528,25 +2535,44 @@ static void _but_network_info_cb(void *data, Evas_Object *obj EINA_UNUSED, void evas_object_show(_bottom); content = eulogium_split_screen(eulogium->navi, _top, _bottom); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } -static void _but_software_version_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +static void _but_software_version_cb(void *data, Evas_Object *eo EINA_UNUSED, void *event_info EINA_UNUSED) { struct eulogium_data *eulogium = data; - Evas_Object *content, *_top, *_bottom; + Evas_Object *content, *obj, *_top, *_bottom; + char hostname[HOST_NAME_MAX]; - _top = elm_label_add(eulogium->navi); /* TODO, dynamically update IPs, requires 'redrawing' of some sort */ - elm_object_text_set(_top, PACKAGE_VERSION); + if (gethostname(hostname, HOST_NAME_MAX) == ENAMETOOLONG) + EINA_LOG_WARN("Hostname too long."); + + _top = elm_box_add(eulogium->navi); + 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_show(_top); + obj = elm_label_add(_top); + elm_object_text_set(obj, hostname); + elm_object_style_set(obj, "slide_bounce"); + elm_label_slide_mode_set(obj, ELM_LABEL_SLIDE_MODE_AUTO); + //elm_label_slide_speed_set(obj, 2); + evas_object_show(obj); + elm_label_slide_go(obj); /* only bounce on len > width? */ + elm_box_pack_end(_top, obj); + + obj = elm_label_add(_top); + elm_object_text_set(obj, PACKAGE_VERSION); + evas_object_show(obj); + elm_box_pack_end(_top, obj); + _bottom = elm_button_add(eulogium->navi); elm_object_text_set(_bottom, _(but_return.text)); /* not pretty using the global XXX */ evas_object_smart_callback_add(_bottom, "clicked", but_return.cb.func, but_return.cb.data); evas_object_show(_bottom); content = eulogium_split_screen(eulogium->navi, _top, _bottom); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_main_mathot_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2557,7 +2583,7 @@ static void _but_main_mathot_cb(void *data, Evas_Object *object EINA_UNUSED, voi printf("Button matts pressed\n"); content = eulogium_tripple_button_menu(eulogium->navi, &but_mathot_material, &but_mathot_hotend, &but_return); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_settings_material_1_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2568,7 +2594,7 @@ static void _but_settings_material_1_cb(void *data, Evas_Object *object EINA_UNU printf("Button matts settings 1 pressed\n"); content = menu_widget_list(eulogium, eulogium->navi, &menu_material_1); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_settings_material_2_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2579,7 +2605,7 @@ static void _but_settings_material_2_cb(void *data, Evas_Object *object EINA_UNU printf("Button matts settings 2 pressed\n"); content = menu_widget_list(eulogium, eulogium->navi, &menu_material_2); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_material_customize_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2590,7 +2616,7 @@ static void _but_material_customize_cb(void *data, Evas_Object *object EINA_UNUS printf("Button matts customize pressed\n"); content = menu_widget_list(eulogium, eulogium->navi, &menu_material_customize); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_print_tune_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2601,7 +2627,7 @@ static void _but_print_tune_cb(void *data, Evas_Object *object EINA_UNUSED, void printf("Button print tune pressed\n"); content = menu_widget_list(eulogium, eulogium->navi, &menu_print_tune); - ui_stack_push(eulogium, content, PAGE_PRINTING); + ui_stack_push(eulogium->navi, content, PAGE_PRINTING); } static void _but_change_material_1_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2612,7 +2638,7 @@ static void _but_change_material_1_cb(void *data, Evas_Object *object EINA_UNUSE printf("Button matts change 1 pressed\n"); content = eulogium_tripple_button_menu(eulogium->navi, &but_return, &but_return, &but_return); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_change_material_2_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2623,7 +2649,7 @@ static void _but_change_material_2_cb(void *data, Evas_Object *object EINA_UNUSE printf("Button matts change 2 pressed\n"); content = eulogium_tripple_button_menu(eulogium->navi, &but_return, &but_return, &but_return); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_mathot_material_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2634,7 +2660,7 @@ static void _but_mathot_material_cb(void *data, Evas_Object *object EINA_UNUSED, printf("Button mathot material pressed\n"); content = eulogium_tripple_button_menu(eulogium->navi, &but_material_change, &but_material_settings, &but_return); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_mathot_hotend_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2645,7 +2671,7 @@ static void _but_mathot_hotend_cb(void *data, Evas_Object *object EINA_UNUSED, v printf("Button mathot hotend pressed\n"); content = eulogium_tripple_button_menu(eulogium->navi, &but_hotend_change, &but_hotend_settings, &but_return); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_settings_hotend_1_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2656,7 +2682,7 @@ static void _but_settings_hotend_1_cb(void *data, Evas_Object *object EINA_UNUSE printf("Button hotend settings 1 pressed\n"); content = menu_widget_list(eulogium, eulogium->navi, &menu_settings_hotend_1_offset); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_settings_hotend_2_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2667,7 +2693,7 @@ static void _but_settings_hotend_2_cb(void *data, Evas_Object *object EINA_UNUSE printf("Button hotend settings 2 pressed\n"); content = menu_widget_list(eulogium, eulogium->navi, &menu_settings_hotend_1_offset); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_change_hotend_1_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2678,7 +2704,7 @@ static void _but_change_hotend_1_cb(void *data, Evas_Object *object EINA_UNUSED, printf("Button hotend change 1 pressed\n"); content = eulogium_tripple_button_menu(eulogium->navi, &but_return, &but_return, &but_return); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } static void _but_change_hotend_2_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2689,7 +2715,7 @@ static void _but_change_hotend_2_cb(void *data, Evas_Object *object EINA_UNUSED, printf("Button matts change 2 pressed\n"); content = eulogium_tripple_button_menu(eulogium->navi, &but_return, &but_return, &but_return); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); } void eulogium_button_cb_set(struct button_def *button, struct button_cb *cb) @@ -3022,7 +3048,7 @@ void eulogium_generic_error(struct eulogium_data *eulogium, uint_fast16_t error_ elm_box_pack_end(content, object); #endif - ui_stack_push(eulogium, content, PAGE_ERROR); + ui_stack_push(eulogium->navi, content, PAGE_ERROR); } static void _cleaned_bed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -3097,7 +3123,7 @@ static void _cb_select_wifi(void *data, Evas_Object *eo EINA_UNUSED, void *event evas_object_show(_bottom); content = eulogium_split_screen(navi, _top, _bottom); - ui_stack_push(eulogium, content, PAGE_NORMAL); + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); network_connect_wifi(network); }; @@ -3120,14 +3146,14 @@ 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, content, PAGE_NORMAL); /* XXX We need to set the correct page type here */ + ui_stack_push(eulogium->navi, content, PAGE_NORMAL); /* XXX We need to set the correct page type here */ } else { Evas_Object *content; eulogium_print_data_set(eulogium, filepath); procedure_print_start(&eulogium->print); content = eulogium_pre_print(eulogium->navi, eulogium); - ui_stack_push(eulogium, content, PAGE_PRINTING); + ui_stack_push(eulogium->navi, content, PAGE_PRINTING); } } } @@ -3534,9 +3560,13 @@ Evas_Object *eulogium_main_menu(Evas_Object *window, struct eulogium_data *eulog elm_naviframe_content_preserve_on_pop_set(eulogium->navi, EINA_FALSE); /* The main menu should be drawn first, consider changing this to 'get bottom, insert before bottom, pop_to - * instead of assuming the stack is empty */ + * instead of assuming the stack is empty | don't be stupid, we just created the navi here, so it IS empty. + * we need to ensure this is always initialized first (ui_init()?) */ content = eulogium_tripple_button_menu(eulogium->navi, &but_main_print, &but_main_mathot, &but_main_system); - ui_stack_push(eulogium, content, PAGE_BOTTOM); + ui_stack_push(eulogium->navi, content, PAGE_BOTTOM); + /* XXX Test: pop a wizard at the start dev it */ + content = wizard_add(eulogium->navi, &material_unload, 0, EINA_TRUE); + ui_stack_push(eulogium->navi, content, PAGE_WIZARD); return eulogium->navi; } @@ -3955,7 +3985,7 @@ static void _on_get_active_procedures_ret(void *data EINA_UNUSED, const Eldbus_M EINA_LOG_ERR("Unknown step %s in procedure %s", step, key); return; } - procedure_process_step(data, procedure); + procedure_process_step(procedure, data); } } } @@ -3987,7 +4017,7 @@ static void _on_procedure_start_ret(void *data, const Eldbus_Message *msg) EINA_LOG_ERR("Unknown step %s in procedure %s", step, key); return; } - procedure_process_step(data, procedure); + procedure_process_step(procedure, data); } static void _on_procedure_next_step_ret(void *data EINA_UNUSED, const Eldbus_Message *msg) @@ -4015,7 +4045,7 @@ static void _on_procedure_next_step_ret(void *data EINA_UNUSED, const Eldbus_Mes EINA_LOG_ERR("Unknown step %s in procedure %s", step, key); return; } - procedure_process_step(data, procedure); + procedure_process_step(procedure, data); } static void _on_procedure_finished_ret(void *data EINA_UNUSED, const Eldbus_Message *msg) @@ -4040,7 +4070,7 @@ static void _on_procedure_finished_ret(void *data EINA_UNUSED, const Eldbus_Mess } procedure->status = PROC_FINISHED; procedure->step_active = NULL; - procedure_process_step(data, procedure); + procedure_process_step(procedure, data); // XXX procedure_metadata_key_get(key) } @@ -4215,28 +4245,56 @@ static void eulogium_setup(struct eulogium_data *eulogium) eulogium_button_cb_data_set(&but_change_hotend_1, eulogium); eulogium_button_cb_data_set(&but_change_hotend_2, eulogium); - procedure_meta_set(&eulogium->procedures[PROC_FIRMWARE_UPDATE], &progressbars[PROC_FIRMWARE_UPDATE]); - procedure_meta_set(&eulogium->procedures[PROC_PRINT], &progressbars[PROC_PRINT]); - procedure_meta_set(&eulogium->procedures[PROC_BED_MOVE], &dials[PROC_BED_MOVE]); - procedure_meta_set(&eulogium->procedures[PROC_BED_HEATUP], &dials[PROC_BED_HEATUP]); - procedure_meta_set(&eulogium->procedures[PROC_HOTEND_HEATUP_0], &dials[PROC_HOTEND_HEATUP_0]); - procedure_meta_set(&eulogium->procedures[PROC_HOTEND_HEATUP_1], &dials[PROC_HOTEND_HEATUP_1]); - procedure_meta_set(&eulogium->procedures[PROC_PRINT_SPEED], &dials[PROC_PRINT_SPEED]); - procedure_meta_set(&eulogium->procedures[PROC_FAN_SPEED], &dials[PROC_FAN_SPEED]); - procedure_meta_set(&eulogium->procedures[PROC_FLOW_RATE], &dials[PROC_FLOW_RATE]); - procedure_meta_set(&eulogium->procedures[PROC_RETRACTION_LENGTH], &dials[PROC_RETRACTION_LENGTH]); - procedure_meta_set(&eulogium->procedures[PROC_RETRACTION_SPEED], &dials[PROC_RETRACTION_SPEED]); - procedure_meta_set(&eulogium->procedures[PROC_RETRACTION_ZHOP], &dials[PROC_RETRACTION_ZHOP]); - procedure_meta_set(&eulogium->procedures[PROC_MATERIAL_MOVE_0], &dials[PROC_MATERIAL_MOVE_0]); - procedure_meta_set(&eulogium->procedures[PROC_MATERIAL_MOVE_1], &dials[PROC_MATERIAL_MOVE_1]); - procedure_meta_set(&eulogium->procedures[PROC_JERK_XY], &dials[PROC_JERK_XY]); - procedure_meta_set(&eulogium->procedures[PROC_JERK_Z], &dials[PROC_JERK_Z]); - procedure_meta_set(&eulogium->procedures[PROC_CURRENT_XY], &dials[PROC_CURRENT_XY]); - procedure_meta_set(&eulogium->procedures[PROC_CURRENT_Z], &dials[PROC_CURRENT_Z]); - procedure_meta_set(&eulogium->procedures[PROC_CURRENT_E], &dials[PROC_CURRENT_E]); + procedure_meta_set(&eulogium->procedures[PROC_FIRMWARE_UPDATE], PROC_META_PROGRESS, &progressbars[PROC_FIRMWARE_UPDATE]); + procedure_meta_set(&eulogium->procedures[PROC_PRINT], PROC_META_PROGRESS, &progressbars[PROC_PRINT]); + procedure_meta_set(&eulogium->procedures[PROC_BED_MOVE], PROC_META_SPINNER, &dials[PROC_BED_MOVE]); + procedure_meta_set(&eulogium->procedures[PROC_BED_HEATUP], PROC_META_SLIDER, &dials[PROC_BED_HEATUP]); + procedure_meta_set(&eulogium->procedures[PROC_HOTEND_HEATUP_0], PROC_META_SLIDER, &dials[PROC_HOTEND_HEATUP_0]); + procedure_meta_set(&eulogium->procedures[PROC_HOTEND_HEATUP_1], PROC_META_SLIDER, &dials[PROC_HOTEND_HEATUP_1]); + procedure_meta_set(&eulogium->procedures[PROC_PRINT_SPEED], PROC_META_SLIDER, &dials[PROC_PRINT_SPEED]); + procedure_meta_set(&eulogium->procedures[PROC_FAN_SPEED], PROC_META_SLIDER, &dials[PROC_FAN_SPEED]); + procedure_meta_set(&eulogium->procedures[PROC_FLOW_RATE], PROC_META_SLIDER, &dials[PROC_FLOW_RATE]); + procedure_meta_set(&eulogium->procedures[PROC_RETRACTION_LENGTH], PROC_META_SLIDER, &dials[PROC_RETRACTION_LENGTH]); + procedure_meta_set(&eulogium->procedures[PROC_RETRACTION_SPEED], PROC_META_SLIDER, &dials[PROC_RETRACTION_SPEED]); + procedure_meta_set(&eulogium->procedures[PROC_RETRACTION_ZHOP], PROC_META_SLIDER, &dials[PROC_RETRACTION_ZHOP]); + procedure_meta_set(&eulogium->procedures[PROC_MATERIAL_MOVE_0], PROC_META_SPINNER, &dials[PROC_MATERIAL_MOVE_0]); + procedure_meta_set(&eulogium->procedures[PROC_MATERIAL_MOVE_1], PROC_META_SPINNER, &dials[PROC_MATERIAL_MOVE_1]); + procedure_meta_set(&eulogium->procedures[PROC_JERK_XY], PROC_META_SLIDER, &dials[PROC_JERK_XY]); + procedure_meta_set(&eulogium->procedures[PROC_JERK_Z], PROC_META_SLIDER, &dials[PROC_JERK_Z]); + 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(); } +void _priviledges_drop(void) +{ + char *env; + struct passwd *pwd; + + if (getuid() != 0) { + EINA_LOG_CRIT("No privileges to drop"); + return; + } + + env = getenv("EULOGIUM_GROUP"); + if (env) { + pwd = getpwnam(env); + if (setgid(pwd->pw_gid) != 0) + EINA_LOG_CRIT("Unable to change group privileges %s", strerror(errno)); + } else { + EINA_LOG_CRIT("EULOGIUM_GROUP not set, not dropping group privileges"); + } + env = getenv("EULOGIUM_USER"); + if (env) { + pwd = getpwnam(env); + if (setuid(pwd->pw_uid) != 0) + EINA_LOG_CRIT("Unable to change user privileges %s", strerror(errno)); + } else { + EINA_LOG_CRIT("EULOGIUM_USER not set, not dropping user privileges"); + } +} + EAPI_MAIN int elm_main(int argc, char **argv) { Eina_Bool quit_option = EINA_FALSE; @@ -4269,8 +4327,6 @@ EAPI_MAIN int elm_main(int argc, char **argv) int args; uint_fast8_t i; char *buf; - Eina_List *flist, *fl; - char *font; struct eulogium_data eulogium = { .mounts = NULL, .progress_data_refresh = NULL, @@ -4285,6 +4341,8 @@ EAPI_MAIN int elm_main(int argc, char **argv) // Evas_Object *splash_window; // Eina_List *engines, *l; + _priviledges_drop(); /* XXX hack until we no longer need root, this may be needed elsewhere. */ + args = ecore_getopt_parse(&optdesc, values, argc, argv); if (args < 0) { EINA_LOG_CRIT("Could not parse arguments."); @@ -4323,7 +4381,7 @@ EAPI_MAIN int elm_main(int argc, char **argv) buf = malloc((strlen(elm_app_data_dir_get()) + 20) * sizeof(char)); snprintf(buf, strlen(elm_app_data_dir_get()) + 20, "%s/themes/default.edj", elm_app_data_dir_get()); elm_theme_overlay_add(NULL, buf); /* TODO let preprocessor at work here with theme subdir and theme name */ - printf("app data dir: %s\n", buf); + EINA_LOG_DBG("app data dir: %s", buf); free(buf); #if 0 /* TODO make icon */ @@ -4388,10 +4446,6 @@ EAPI_MAIN int elm_main(int argc, char **argv) evas_object_show(window); - flist = evas_font_available_list(evas_object_evas_get(window)); - EINA_LIST_FOREACH(flist, fl, font) - printf("font: %s\n", font); - elm_run(); eldbus_connection_unref(eulogium.dbus.conn); diff --git a/src/print_data.h b/src/print_data.h index 5d901f3..b51252a 100644 --- a/src/print_data.h +++ b/src/print_data.h @@ -35,6 +35,11 @@ struct print_data { /* XXX progress data or the like, strip non-progress data */ enum procedure_key proc_key; }; +struct extrusion_train_data { + uint_fast8_t id; + double temperature; +}; + enum printer_status { UNKNOWN, DISCONNECTED, diff --git a/src/procedures.c b/src/procedures.c index f4ce6f5..5bf686f 100644 --- a/src/procedures.c +++ b/src/procedures.c @@ -47,13 +47,18 @@ #define _PROC_BED_RAISE "RAISE_BED" #define _PROC_BED_HOME "HOME_BED" #define _PROC_HEAD_HOME "HOME_HEAD" -#define _PROC_MATERIAL_MOVE_0 "MOVE_MATERIAL_0" -#define _PROC_MATERIAL_MOVE_1 "MOVE_MATERIAL_1" +#define __PROC_MATERIAL_MOVE(x) "MOVE_MATERIAL_" #x +#define _PROC_MATERIAL_MOVE(x) "MOVE_MATERIAL_%u" +#define _PROC_MATERIAL_MOVE_0 __PROC_MATERIAL_MOVE(0) +#define _PROC_MATERIAL_MOVE_1 __PROC_MATERIAL_MOVE(0) #define _PROC_JERK_XY "JERK_XY" #define _PROC_JERK_Z "JERK_Z" #define _PROC_CURRENT_XY "XY_MAX_CURRENT" #define _PROC_CURRENT_Z "Z_MAX_CURRENT" #define _PROC_CURRENT_E "E_CURRENT" +#define _PROC_MATERIAL_UNLOAD "REMOVE_MATERIAL" +#define _PROC_MATERIAL_LOAD "INSERT_MATERIAL" +#define _PROC_MATERIAL_CHANGE "CHANGE_MATERIAL" #define _META_CURRENT "current" #define _META_TARGET "target" @@ -81,9 +86,6 @@ #define _PROC_MSG_PRINTER_CLEANED "PRINTER_CLEANED" -int EVENT_PROC_PROGRESS_PRINT = 0; -int EVENT_PROC_PROGRESS_FIRMWARE_UPDATE = 0; - static Eldbus_Proxy *__proxy = NULL; static void _container_basic_variant(Eldbus_Message_Iter *parent, int type, ...) @@ -168,7 +170,7 @@ static void _get_meta_progress(void *data, const void *key, Eldbus_Message_Iter } free(var_sig); - ecore_event_add(procedure->poll.event, NULL, NULL, procedure); + ecore_event_add(procedure->poll.event, progress, NULL, NULL); } static void _get_meta_cur_tar(void *data, const void *key, Eldbus_Message_Iter *var) @@ -198,7 +200,7 @@ static void _get_meta_cur_tar(void *data, const void *key, Eldbus_Message_Iter * } free(var_sig); - //ecore_event_add(); + ecore_event_add(procedure->poll.event, dial_data, NULL, NULL); } static void _on_start_print_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) @@ -254,7 +256,7 @@ Eina_Bool _print_progress_cleanup(void *data, Elm_Object_Item *eoi EINA_UNUSED) return EINA_TRUE; } -void procedure_process_step(struct eulogium_data *eulogium, struct procedure_data *procedure) +void procedure_process_step(struct procedure_data *procedure, struct eulogium_data *eulogium) { Evas_Object *content = NULL; Elm_Object_Item *navi_item = NULL; @@ -269,7 +271,7 @@ void procedure_process_step(struct eulogium_data *eulogium, struct procedure_dat EINA_LOG_CRIT("%s", 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, eulogium, procedure); + content = ui_widget_progress(eulogium->navi, procedure); page_state = PAGE_NORMAL; } if (procedure->step_active->step == STEP_PRINTING) { @@ -459,9 +461,31 @@ static struct procedure_step steps_hotend_active_set[] = { }, { NULL }, /* sentinel */ }; +static struct procedure_step steps_material_unload[] = { + { + .key = _STEP_SWITCHING, + .step = STEP_SWITCHING, + }, { NULL }, /* sentinel */ +}; + +static struct procedure_step steps_material_load[] = { + { + .key = _STEP_SWITCHING, + .step = STEP_SWITCHING, + }, { NULL }, /* sentinel */ +}; + +static struct procedure_step steps_material_change[] = { + { + .key = _STEP_SWITCHING, + .step = STEP_SWITCHING, + }, { NULL }, /* sentinel */ +}; + static struct procedure_data procedures[] = { [PROC_FIRMWARE_UPDATE] = { .key = _PROC_FIRMWARE_UPDATE, + .wizard = EINA_FALSE, .status = PROC_READY, .parser = _get_meta_progress, .executable = EINA_FALSE, @@ -472,10 +496,12 @@ static struct procedure_data procedures[] = { .poll = { .in = 0.5, .timer = NULL, + .event = 0, }, }, [PROC_PRINT] = { .key = _PROC_PRINT, + .wizard = EINA_FALSE, .status = PROC_READY, .parser = _get_meta_progress, .executable = EINA_FALSE, @@ -485,11 +511,13 @@ static struct procedure_data procedures[] = { .meta = NULL, /* struct print_data */ .poll = { .in = 0.0, - .timer = NULL + .timer = NULL, + .event = 0, }, }, [PROC_BED_HEATUP] = { .key = _PROC_BED_HEATUP, + .wizard = EINA_FALSE, .status = PROC_READY, .parser = _get_meta_cur_tar, .executable = EINA_FALSE, @@ -499,11 +527,13 @@ static struct procedure_data procedures[] = { .meta = NULL, .poll = { .in = 0.0, - .timer = NULL + .timer = NULL, + .event = 0, }, }, [PROC_HOTEND_HEATUP_0] = { .key = _PROC_HOTEND_HEATUP_0, + .wizard = EINA_FALSE, .status = PROC_READY, .parser = _get_meta_cur_tar, .executable = EINA_FALSE, @@ -518,6 +548,7 @@ static struct procedure_data procedures[] = { }, [PROC_HOTEND_HEATUP_1] = { .key = _PROC_HOTEND_HEATUP_1, + .wizard = EINA_FALSE, .status = PROC_READY, .parser = _get_meta_cur_tar, .executable = EINA_FALSE, @@ -527,11 +558,13 @@ static struct procedure_data procedures[] = { .meta = NULL, .poll = { .in = 0.0, - .timer = NULL + .timer = NULL, + .event = 0, }, }, [PROC_HOTEND_ACTIVE_SET] = { .key = _PROC_HOTEND_ACTIVE_SET, + .wizard = EINA_FALSE, .status = PROC_READY, .parser = _get_meta_cur_tar, .executable = EINA_FALSE, @@ -541,11 +574,13 @@ static struct procedure_data procedures[] = { .meta = NULL, .poll = { .in = 0.0, - .timer = NULL + .timer = NULL, + .event = 0, }, }, [PROC_PRINT_SPEED] = { .key = _PROC_PRINT_SPEED, + .wizard = EINA_FALSE, .status = PROC_READY, .parser = _get_meta_cur_tar, .executable = EINA_FALSE, @@ -555,11 +590,13 @@ static struct procedure_data procedures[] = { .meta = NULL, .poll = { .in = 0.0, - .timer = NULL + .timer = NULL, + .event = 0, }, }, [PROC_FAN_SPEED] = { .key = _PROC_FAN_SPEED, + .wizard = EINA_FALSE, .status = PROC_READY, .parser = _get_meta_cur_tar, .executable = EINA_FALSE, @@ -569,11 +606,13 @@ static struct procedure_data procedures[] = { .meta = NULL, .poll = { .in = 0.0, - .timer = NULL + .timer = NULL, + .event = 0, }, }, [PROC_FLOW_RATE] = { .key = _PROC_FLOW_RATE, + .wizard = EINA_FALSE, .status = PROC_READY, .parser = _get_meta_cur_tar, .executable = EINA_FALSE, @@ -583,11 +622,13 @@ static struct procedure_data procedures[] = { .meta = NULL, .poll = { .in = 0.0, - .timer = NULL + .timer = NULL, + .event = 0, }, }, [PROC_RETRACTION_LENGTH] = { .key = _PROC_RETRACTION_LENGTH, + .wizard = EINA_FALSE, .status = PROC_READY, .parser = _get_meta_cur_tar, .executable = EINA_FALSE, @@ -597,11 +638,13 @@ static struct procedure_data procedures[] = { .meta = NULL, .poll = { .in = 0.0, - .timer = NULL + .timer = NULL, + .event = 0, }, }, [PROC_RETRACTION_SPEED] = { .key = _PROC_RETRACTION_SPEED, + .wizard = EINA_FALSE, .status = PROC_READY, .parser = _get_meta_cur_tar, .executable = EINA_FALSE, @@ -611,11 +654,13 @@ static struct procedure_data procedures[] = { .meta = NULL, .poll = { .in = 0.0, - .timer = NULL + .timer = NULL, + .event = 0, }, }, [PROC_RETRACTION_ZHOP] = { .key = _PROC_RETRACTION_ZHOP, + .wizard = EINA_FALSE, .status = PROC_READY, .parser = _get_meta_cur_tar, .executable = EINA_FALSE, @@ -625,11 +670,13 @@ static struct procedure_data procedures[] = { .meta = NULL, .poll = { .in = 0.0, - .timer = NULL + .timer = NULL, + .event = 0, }, }, [PROC_BED_LEVEL_AUTO] = { .key = _PROC_BED_LEVEL_AUTO, + .wizard = EINA_FALSE, .status = PROC_READY, .parser = _get_meta_cur_tar, .executable = EINA_FALSE, @@ -639,11 +686,13 @@ static struct procedure_data procedures[] = { .meta = NULL, .poll = { .in = 0.0, - .timer = NULL + .timer = NULL, + .event = 0, }, }, [PROC_BED_RAISE] = { .key = _PROC_BED_RAISE, + .wizard = EINA_FALSE, .status = PROC_READY, .parser = _get_meta_cur_tar, .executable = EINA_FALSE, @@ -653,11 +702,13 @@ static struct procedure_data procedures[] = { .meta = NULL, .poll = { .in = 0.0, - .timer = NULL + .timer = NULL, + .event = 0, }, }, [PROC_BED_HOME] = { .key = _PROC_BED_HOME, + .wizard = EINA_FALSE, .status = PROC_READY, .parser = _get_meta_cur_tar, .executable = EINA_FALSE, @@ -667,11 +718,13 @@ static struct procedure_data procedures[] = { .meta = NULL, .poll = { .in = 0.0, - .timer = NULL + .timer = NULL, + .event = 0, }, }, [PROC_BED_MOVE] = { .key = _PROC_BED_MOVE, + .wizard = EINA_FALSE, .status = PROC_READY, .parser = NULL, .executable = EINA_FALSE, @@ -681,11 +734,13 @@ static struct procedure_data procedures[] = { .meta = NULL, .poll = { .in = 0.0, - .timer = NULL + .timer = NULL, + .event = 0, }, }, [PROC_HEAD_HOME] = { .key = _PROC_HEAD_HOME, + .wizard = EINA_FALSE, .status = PROC_READY, .parser = _get_meta_cur_tar, .executable = EINA_FALSE, @@ -695,11 +750,13 @@ static struct procedure_data procedures[] = { .meta = NULL, .poll = { .in = 0.0, - .timer = NULL + .timer = NULL, + .event = 0, }, }, [PROC_MATERIAL_MOVE_0] = { .key = _PROC_MATERIAL_MOVE_0, + .wizard = EINA_FALSE, .status = PROC_READY, .parser = NULL, .executable = EINA_FALSE, @@ -709,11 +766,13 @@ static struct procedure_data procedures[] = { .meta = NULL, .poll = { .in = 0.0, - .timer = NULL + .timer = NULL, + .event = 0, }, }, [PROC_MATERIAL_MOVE_1] = { .key = _PROC_MATERIAL_MOVE_1, + .wizard = EINA_FALSE, .status = PROC_READY, .parser = NULL, .executable = EINA_FALSE, @@ -723,11 +782,13 @@ static struct procedure_data procedures[] = { .meta = NULL, .poll = { .in = 0.0, - .timer = NULL + .timer = NULL, + .event = 0, }, }, [PROC_JERK_XY] = { .key = _PROC_JERK_XY, + .wizard = EINA_FALSE, .status = PROC_READY, .parser = _get_meta_cur_tar, .executable = EINA_FALSE, @@ -737,11 +798,13 @@ static struct procedure_data procedures[] = { .meta = NULL, .poll = { .in = 0.0, - .timer = NULL + .timer = NULL, + .event = 0, }, }, [PROC_JERK_Z] = { .key = _PROC_JERK_Z, + .wizard = EINA_FALSE, .status = PROC_READY, .parser = _get_meta_cur_tar, .executable = EINA_FALSE, @@ -751,11 +814,13 @@ static struct procedure_data procedures[] = { .meta = NULL, .poll = { .in = 0.0, - .timer = NULL + .timer = NULL, + .event = 0, }, }, [PROC_CURRENT_XY] = { .key = _PROC_CURRENT_XY, + .wizard = EINA_FALSE, .status = PROC_READY, .parser = _get_meta_cur_tar, .executable = EINA_FALSE, @@ -765,11 +830,13 @@ static struct procedure_data procedures[] = { .meta = NULL, .poll = { .in = 0.0, - .timer = NULL + .timer = NULL, + .event = 0, }, }, [PROC_CURRENT_Z] = { .key = _PROC_CURRENT_Z, + .wizard = EINA_FALSE, .status = PROC_READY, .parser = _get_meta_cur_tar, .executable = EINA_FALSE, @@ -779,11 +846,13 @@ static struct procedure_data procedures[] = { .meta = NULL, .poll = { .in = 0.0, - .timer = NULL + .timer = NULL, + .event = 0, }, }, [PROC_CURRENT_E] = { .key = _PROC_CURRENT_E, + .wizard = EINA_FALSE, .status = PROC_READY, .parser = _get_meta_cur_tar, .executable = EINA_FALSE, @@ -793,19 +862,74 @@ static struct procedure_data procedures[] = { .meta = NULL, .poll = { .in = 0.0, - .timer = NULL + .timer = NULL, + .event = 0, + }, + }, + [PROC_MATERIAL_UNLOAD] = { + .key = _PROC_MATERIAL_UNLOAD, + .wizard = EINA_TRUE, + .status = PROC_READY, + .parser = _get_meta_progress, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_material_unload, + .step_active = NULL, + .meta = NULL, + .poll = { + .in = 0.0, + .timer = NULL, + .event = 0, + }, + }, + [PROC_MATERIAL_LOAD] = { + .key = _PROC_MATERIAL_LOAD, + .wizard = EINA_TRUE, + .status = PROC_READY, + .parser = _get_meta_progress, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_material_load, + .step_active = NULL, + .meta = NULL, + .poll = { + .in = 0.0, + .timer = NULL, + .event = 0, + }, + }, + [PROC_MATERIAL_CHANGE] = { + .key = _PROC_MATERIAL_CHANGE, + .wizard = EINA_TRUE, + .status = PROC_READY, + .parser = _get_meta_progress, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_material_change, + .step_active = NULL, + .meta = NULL, + .poll = { + .in = 0.0, + .timer = NULL, + .event = 0, }, }, }; -void procedure_meta_set(struct procedure_data *procedure, void *data) +void *procedure_meta_data_get(struct procedure_data *procedure) { - procedure->meta = data; + return procedure->meta; } -void *procedure_meta_get(struct procedure_data *procedure) +enum meta_type procedure_meta_type_get(struct procedure_data *procedure) { - return procedure->meta; + return procedure->type; +} + +void procedure_meta_set(struct procedure_data *procedure, enum meta_type type, void *data) +{ + procedure->type = type; + procedure->meta = data; } const struct procedure_step *procedure_step_get(const struct procedure_data *proc, const char *key) @@ -958,8 +1082,9 @@ struct procedure_data *procedures_init(Eldbus_Proxy *proxy) __proxy = proxy; - for (i = PROC_NONE; i < PROC_LAST; i++) + for (i = PROC_NONE; i < PROC_LAST; i++) { procedures[i].poll.event = ecore_event_type_new(); + } /* TODO: we probably should do something here to prepare all procedures and their meta data * so that we can do the getall here and drop the function altogether. diff --git a/src/procedures.h b/src/procedures.h index 44d1498..4f6f48a 100644 --- a/src/procedures.h +++ b/src/procedures.h @@ -49,8 +49,8 @@ enum procedure_status { PROC_FINISHED, }; -enum procedure_key { - PROC_NONE, +enum procedure_key { /* XXX this will cause problems and has to change */ + PROC_NONE = 0, PROC_BED_MOVE, PROC_BED_HEATUP, PROC_HOTEND_HEATUP_0, @@ -75,6 +75,9 @@ enum procedure_key { PROC_CURRENT_E, PROC_PRINT, PROC_FIRMWARE_UPDATE, + PROC_MATERIAL_UNLOAD, + PROC_MATERIAL_LOAD, + PROC_MATERIAL_CHANGE, PROC_LAST, /* sentinel */ }; @@ -117,8 +120,9 @@ struct procedure_msg { enum meta_type { PROC_META_NONE, - PROC_META_PRINT, - PROC_META_DIAL, + PROC_META_PROGRESS, + PROC_META_SLIDER, + PROC_META_SPINNER, }; struct poll_data { @@ -127,14 +131,21 @@ struct poll_data { int event; }; +struct meta_data { + enum meta_type type; + void *data; +}; + struct procedure_data { const char *key; enum procedure_status status; + Eina_Bool wizard; const char *sig; const char *para; /* TODO va_list to go with sig? */ Eina_Bool available; Eina_Bool executable; 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; const struct procedure_step *_steps; /* TODO optional? maybe we don't even have to know the list */ @@ -148,7 +159,7 @@ struct procedure_data *procedures_init(Eldbus_Proxy *proxy); void procedure_meta_getall(void); struct procedure_data *procedure_get(const char *key); const struct procedure_step *procedure_step_get(const struct procedure_data *proc, const char *key); -void procedure_process_step(struct eulogium_data *eulogium, struct procedure_data *procedure); +void procedure_process_step(struct procedure_data *procedure, struct eulogium_data *eulogium); Eldbus_Pending *procedure_message(const struct procedure_data *proc, const struct procedure_msg *msg); struct print_data; /* XXX only here until print_start gets simplified */ @@ -156,8 +167,9 @@ Eldbus_Pending *procedure_print_start(const struct print_data *print); Eldbus_Pending *procedure_print_printer_cleaned(void); Eldbus_Pending *procedure_print_progress_get(struct procedure_data *procedure); -void *procedure_meta_get(struct procedure_data *procedure); -void procedure_meta_set(struct procedure_data *procedure, void *data); +void *procedure_meta_data_get(struct procedure_data *procedure); +enum meta_type procedure_meta_type_get(struct procedure_data *procedure); +void procedure_meta_set(struct procedure_data *procedure, enum meta_type type, void *data); Eldbus_Pending *procedure_start_simple(const enum procedure_key proc_key); Eldbus_Pending *procedure_metadata_get(const struct procedure_data *procedure); diff --git a/src/ui_widgets.c b/src/ui_widgets.c index 468b082..f690fb6 100644 --- a/src/ui_widgets.c +++ b/src/ui_widgets.c @@ -8,65 +8,24 @@ */ #include -#include #include #include "eulogium.h" #include "gettext.h" +#include "procedures.h" #include "ui_input.h" #include "ui_widgets.h" +#include "ui_wizards.h" -static struct wizard_screen_data material_unload = { - .count = 0, - .screens = { - { - .type = NONE, - .text = "To remove material
we need to do stuff", - .data = NULL, - .prev_button = "Skip Wizzard!", - .next_button = "Continue", - }, { - .type = NONE, /* .type = BUTTON? */ - .text = "Choose a nozzle
to remove material from", - .data = NULL, - .prev_button = "Left", - .next_button = "Right", - //.prev_func = , - //.next_func = , - }, { .type = END, }, /* sentinel */ - }, -}; - -static struct wizard_screen_data material_load = { - .count = 0, - .screens = { - { - .type = NONE, - .text = "To remove material
we need to do stuff", - .data = NULL, - .prev_button = "Skip Wizzard!", - .next_button = "Continue", - }, { - .type = NONE, /* .type = BUTTON? */ - .text = "Choose a nozzle
to remove material from", - .data = NULL, - .prev_button = "Left", - .next_button = "Right", - //.prev_func = , - //.next_func = , - }, { .type = END, }, /* sentinel */ - }, -}; - -Elm_Object_Item *ui_stack_push(const struct eulogium_data *eulogium, Evas_Object *content, const enum navi_page_state page_state) /* TODO replace with just the navi pointer */ +Elm_Object_Item *ui_stack_push(Evas_Object *navi, Evas_Object *content, const enum navi_page_state page_state) /* TODO replace with just the navi pointer */ { Elm_Object_Item *navi_item; - if ((!eulogium->navi) || (!content)) { + if ((!navi) || (!content)) { EINA_LOG_CRIT("navi or content where NULL"); return NULL; } - navi_item = elm_naviframe_item_simple_push(eulogium->navi, content); + navi_item = elm_naviframe_item_simple_push(navi, content); if (!navi_item) { EINA_LOG_CRIT("Unable to push item onto navistack"); return NULL; @@ -77,6 +36,15 @@ Elm_Object_Item *ui_stack_push(const struct eulogium_data *eulogium, Evas_Object return navi_item; } +void _event_handler_from_navi_del(const Evas_Object *navi, const char *str) +{ + Ecore_Event_Handler *event; + + event = evas_object_data_get(navi, str); + if (event) + ecore_event_handler_del(event); +} + /* Search through the navistack in reverse order. This loop is almost always * aborted very early on. We basically 'abuse' the loop to skip over invalid * pages, which is actually unlikely and thus the first item of the stack @@ -84,31 +52,35 @@ Elm_Object_Item *ui_stack_push(const struct eulogium_data *eulogium, Evas_Object * 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 struct eulogium_data *eulogium) /* TODO replace with just the navi pointer */ +Eina_Bool ui_stack_pop(const Evas_Object *navi) /* TODO replace with just the navi pointer */ { Eina_List *navi_list, *l; Elm_Object_Item *navi_item; enum navi_page_state page_state; - if (!eulogium->navi) { + if (!navi) { EINA_LOG_CRIT("Naviframe was NULL"); return EINA_FALSE; } + /* clean navi page event handlers */ + _event_handler_from_navi_del(navi, "event_inc"); /* TODO possibly use an array of event handlers if we get more then 3 */ + _event_handler_from_navi_del(navi, "event_dec"); /* TODO possibly use an array of event handlers if we get more then 3 */ + /* FIXME: bug here, when we start eulogium and start a print job, * eulogium restarts midway the print job, the dialog with the * print cleaned pops up, but apparently no bottom has been generated * yet. Make sure to call eulogium_main_menu (new name) first before * process handling. Call moved, but we may still have init issues. */ - navi_item = elm_naviframe_top_item_get(eulogium->navi); + navi_item = elm_naviframe_top_item_get(navi); page_state = (enum navi_page_state)(uintptr_t)elm_object_item_data_get(navi_item); if (page_state == PAGE_BOTTOM) { EINA_LOG_WARN("Not popping bottom frame cowboy"); return EINA_TRUE; } - navi_list = elm_naviframe_items_get(eulogium->navi); + navi_list = elm_naviframe_items_get(navi); l = eina_list_last(navi_list); l = eina_list_prev(l); /* Skip the top entry, it is the currently displayed window and thus @@ -123,7 +95,7 @@ Eina_Bool ui_stack_pop(const struct eulogium_data *eulogium) /* TODO replace wit EINA_LOG_ERR("No item in list?!"); continue; } - page_state = (enum navi_page_state)(uintptr_t)elm_object_item_data_get(navi_item); + page_state = (enum navi_page_state)(uintptr_t)elm_object_item_data_get(navi_item); /* XXX toto, use pointer of _navi_page_state */ if (page_state == PAGE_INVALID) { EINA_LOG_WARN("Page on stack invalid, skipping"); continue; @@ -154,24 +126,11 @@ void ui_stack_page_invalidate(Evas_Object *navi, const enum navi_page_state page eina_list_free(navi_list); } -void _event_handler_from_navi_del(Evas_Object *navi, const char *str) -{ - Ecore_Event_Handler *event; - - event = evas_object_data_get(navi, str); - if (event) - ecore_event_handler_del(event); -} - void ui_stack_pop_cb(void *data, Evas_Object *eo EINA_UNUSED, void *event_info EINA_UNUSED) { - struct eulogium_data *eulogium = data; /* XXX replace this with passing just the navi and event handlers */ - Evas_Object *navi = eulogium->navi; - - _event_handler_from_navi_del(navi, "event_inc"); /* TODO possibly use an array of event handlers if we get more then 3 */ - _event_handler_from_navi_del(navi, "event_dec"); /* TODO possibly use an array of event handlers if we get more then 3 */ + Evas_Object *navi = data; - ui_stack_pop(eulogium); /* XXX replace with just the navi */ + ui_stack_pop(navi); } static void _dial_send_update(void *data, Evas_Object *eo, void *event_info EINA_UNUSED) @@ -188,7 +147,7 @@ static Eina_Bool _dial_change_delay(void *data) Evas_Object *dial = data; evas_object_data_set(dial, "delay", NULL); - evas_object_smart_callback_call(dial, "delay,changed", NULL); + evas_object_smart_callback_call(dial, "changed", NULL); return ECORE_CALLBACK_CANCEL; } @@ -197,7 +156,7 @@ static Eina_Bool _spinner_change(void *data, int type, void *event_info EINA_UNU { struct settings_dial_data *dial_data = data; - /* TODO we now jus tell the backend that there is a change of + or - 1 * step size. + /* TODO we now just tell the backend that there is a change of + or - 1 * step size. * ideally the event_info is filled with the step size/speed of the mouse_wheel events * giving us the step size directly. */ @@ -233,7 +192,7 @@ static Eina_Bool _dial_change(void *data, int type, void *event_info EINA_UNUSED evas_object_smart_callback_call(dial, "changed", NULL); delay = evas_object_data_get(dial, "delay"); ecore_timer_del(delay); - delay = ecore_timer_add(0.25, _dial_change_delay, dial); /* TODO make define for 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; @@ -315,7 +274,45 @@ Evas_Object *ui_widget_spinner(Evas_Object *parent, struct eulogium_data *eulogi 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", ui_stack_pop_cb, eulogium); + evas_object_smart_callback_add(_bottom, "clicked", ui_stack_pop_cb, eulogium->navi); + evas_object_show(_bottom); + /* remove handler on window destroy? */ + + return eulogium_split_screen(parent, _top, _bottom); +} + +Evas_Object *ui_widget_spinner_add(Evas_Object *parent, struct settings_dial_data *dial_data) +{ + Evas_Object *obj, *_top, *_bottom; + Ecore_Event_Handler *handler; + + _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); + evas_object_show(_top); + + obj = elm_label_add(_top); /* TODO make label sit inverted at the top */ + elm_object_text_set(obj, "test"); + evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + 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_spinner_add(parent); + evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL); + //handler = ecore_event_handler_add(INPUT_MOUSE_WHEEL_UP, _spinner_change, dial_data); + //evas_object_data_set(parent, "event_inc", handler); + //handler = ecore_event_handler_add(INPUT_MOUSE_WHEEL_DOWN, _spinner_change, dial_data); + //evas_object_data_set(parent, "event_dec", handler); /* XXX do this better (via dial_data?) */ + evas_object_show(obj); + elm_box_pack_end(_top, 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", ui_stack_pop_cb, parent); evas_object_show(_bottom); /* remove handler on window destroy? */ @@ -338,7 +335,7 @@ Evas_Object *ui_widget_slider(Evas_Object *parent, struct eulogium_data *eulogiu elm_slider_value_set(_top, dial_data->value); 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, dial_data); + evas_object_smart_callback_add(_top, "changed", _dial_send_update, dial_data); handler = ecore_event_handler_add(INPUT_MOUSE_WHEEL_UP, _dial_change, _top); evas_object_data_set(parent, "event_inc", handler); handler = ecore_event_handler_add(INPUT_MOUSE_WHEEL_DOWN, _dial_change, _top); @@ -369,7 +366,7 @@ Evas_Object *ui_widget_slider(Evas_Object *parent, struct eulogium_data *eulogiu 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", ui_stack_pop_cb, eulogium); + evas_object_smart_callback_add(_bottom, "clicked", ui_stack_pop_cb, eulogium->navi); evas_object_show(_bottom); return eulogium_split_screen(parent, _top, _bottom); @@ -398,7 +395,7 @@ static void _widget_progress_del(void *data, Evas *e EINA_UNUSED, Evas_Object *e static Eina_Bool _widget_progress_update(void *data, int type EINA_UNUSED, void *event_info EINA_UNUSED) { struct _progress_screen_data *screen = data; - struct print_data *progress = screen->progress_data; + const struct print_data *progress = screen->progress_data; elm_object_text_set(screen->jobname, _(progress->jobname)); elm_object_text_set(screen->status, _(progress->status)); @@ -407,7 +404,7 @@ static Eina_Bool _widget_progress_update(void *data, int type EINA_UNUSED, void return ECORE_CALLBACK_PASS_ON; } -Evas_Object *ui_widget_progress(Evas_Object *parent, struct eulogium_data *eulogium, const struct procedure_data *procedure) +Evas_Object *ui_widget_progress(Evas_Object *parent, const struct procedure_data *procedure) { 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; @@ -423,7 +420,7 @@ Evas_Object *ui_widget_progress(Evas_Object *parent, struct eulogium_data *eulog elm_box_homogeneous_set(_top, EINA_FALSE); evas_object_show(_top); - screen->title = elm_label_add(_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); @@ -449,8 +446,13 @@ Evas_Object *ui_widget_progress(Evas_Object *parent, struct eulogium_data *eulog screen->progressbar = elm_progressbar_add(_top); elm_progressbar_horizontal_set(screen->progressbar, EINA_TRUE); - elm_progressbar_pulse_set(screen->progressbar, EINA_FALSE); /* TODO: pulse = time-unknown/pause */ - elm_progressbar_pulse(screen->progressbar, EINA_FALSE); + 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); @@ -458,6 +460,7 @@ Evas_Object *ui_widget_progress(Evas_Object *parent, struct eulogium_data *eulog elm_box_pack_end(_top, screen->progressbar); handler = ecore_event_handler_add(procedure->poll.event, _widget_progress_update, screen); + /* XXX handler add to something?; this is broken atm */ // _bottom = eulogium_dual_button_add(parent, &but_print_tune, &but_print_abort_confirm); // evas_object_show(_bottom); @@ -468,155 +471,7 @@ Evas_Object *ui_widget_progress(Evas_Object *parent, struct eulogium_data *eulog return content; } -struct _wizard_screen_next_cb_data { - struct eulogium_data *eulogium; - struct wizard_screen_data *screen_data; - uint_fast8_t pagenum; - Eina_Bool pageindex; -}; - -static void _wizard_screen_next_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) -{ - Evas_Object *content; - struct eulogium_data *eulogium = ((struct _wizard_screen_next_cb_data *)data)->eulogium; - uint_fast8_t pagenum = ((struct _wizard_screen_next_cb_data *)data)->pagenum; - Eina_Bool pageindex = ((struct _wizard_screen_next_cb_data *)data)->pageindex; - struct wizard_screen_data *screen_data = ((struct _wizard_screen_next_cb_data *)data)->screen_data; - - if (pagenum >= screen_data->count) { - Elm_Object_Item *item; - - item = elm_naviframe_bottom_item_get(eulogium->navi); - if (item) - elm_naviframe_item_pop_to(item); - /* XXX what else? */ - } else { - // content = ui_window_wizard(eulogium->navi, eulogium, screen_data, pagenum, pageindex); - ui_stack_push(eulogium, content, PAGE_NORMAL); - /* XXX what else? */ - } - free(data); -} - -Evas_Object *ui_window_wizard(Evas_Object *parent, struct eulogium_data *eulogium, struct wizard_screen_data *screen_data, uint_fast8_t pagenum, Eina_Bool pageindex) -{ - Evas_Object *object; - Evas_Object *_top, *_bottom; - struct _wizard_screen_next_cb_data *wizard_screen_next_cb_data; - char buf[6]; - - _top = elm_box_add(parent); - evas_object_show(_top); - - if (screen_data->count == 0) { - EINA_LOG_WARN("Tut tut, we can't have a count of 0!\n"); - return NULL; - } - - if (pagenum >= screen_data->count) - pagenum = screen_data->count - 1; - - if (pageindex) { - object = elm_label_add(_top); - snprintf(buf, sizeof(buf), "%d/%d", pagenum + 1, screen_data->count); - elm_object_text_set(object, _(buf)); - evas_object_show(object); - evas_object_size_hint_weight_set(object, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(object, 1.0, 0); - elm_box_pack_end(_top, object); - } - - if (screen_data->screens[pagenum].text) { - object = elm_label_add(_top); - elm_object_text_set(object, _(screen_data->screens[pagenum].text)); - evas_object_size_hint_align_set(object, 0.5, 0.5); - evas_object_show(object); - elm_box_pack_end(_top, object); - } - - switch (screen_data->screens[pagenum].type) { - Evas_Object *box; /* TODO rename to 'type' or something */ - - case MATERIAL: - box = elm_box_add(_top); - elm_box_horizontal_set(box, EINA_TRUE); - evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_show(box); - - object = elm_button_add(box); - evas_object_size_hint_align_set(object, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_weight_set(object, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_object_text_set(object, "PLA"); /* Materials need to be handled differently */ - //evas_object_smart_callback_add(object, "clicked", _cb_material_set, "PLA"); - evas_object_show(object); - elm_box_pack_end(box, object); - - object = elm_button_add(box); - evas_object_size_hint_align_set(object, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_weight_set(object, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_object_text_set(object, "ABS"); - //evas_object_smart_callback_add(object, "clicked", _cb_material_set, "ABS"); - evas_object_show(object); - elm_box_pack_end(box, object); - - elm_box_pack_end(_top, box); - break; - case PROGRESS: - box = elm_progressbar_add(_top); - elm_progressbar_horizontal_set(box, EINA_TRUE); - elm_progressbar_pulse_set(box, EINA_FALSE); /* TODO: pulse = time-unknown/pause */ - elm_progressbar_pulse(box, EINA_FALSE); - elm_progressbar_value_set(box, 0.5); - elm_progressbar_unit_format_set(box, "%1.0f%%"); - evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_show(box); - elm_box_pack_end(_top, box); - break; - case FUNC: - /* call function pointer from screen_data.func */ - break; - case END: /* fall through */ - default: - break; - } - - _bottom = elm_box_add(parent); - elm_box_horizontal_set(_bottom, EINA_TRUE); - evas_object_show(_bottom); - - wizard_screen_next_cb_data = malloc(sizeof(struct _wizard_screen_next_cb_data)); - wizard_screen_next_cb_data->eulogium = eulogium; - wizard_screen_next_cb_data->screen_data = screen_data; - wizard_screen_next_cb_data->pagenum = pagenum + 1; - wizard_screen_next_cb_data->pageindex = EINA_TRUE; - - if (screen_data->screens[pagenum].prev_button) { - object = elm_button_add(parent); - evas_object_size_hint_align_set(object, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_weight_set(object, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_object_text_set(object, _(screen_data->screens[pagenum].prev_button)); - // evas_object_smart_callback_add(object, "clicked", _cb_content_prev_set, eulogium); - evas_object_show(object); - elm_box_pack_end(_bottom, object); - } - if (screen_data->screens[pagenum].next_button) { - object = elm_button_add(parent); - evas_object_size_hint_align_set(object, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_weight_set(object, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_object_text_set(object, _(screen_data->screens[pagenum].next_button)); - evas_object_smart_callback_add(object, "clicked", _wizard_screen_next_cb, wizard_screen_next_cb_data); - evas_object_show(object); - elm_box_pack_end(_bottom, object); - } - - return eulogium_split_screen(parent, _top, _bottom); -} - void ui_init(void) { - while (material_load.screens[material_load.count].type != END) - material_load.count++; - while (material_unload.screens[material_unload.count].type != END) - material_unload.count++; + wizard_init_all(); } diff --git a/src/ui_widgets.h b/src/ui_widgets.h index d4b1524..2e4fc9d 100644 --- a/src/ui_widgets.h +++ b/src/ui_widgets.h @@ -23,7 +23,10 @@ struct button_cb { void (*func)(void *data, Evas_Object *object, void *event_info); - void *data; + union { + void *data; + uint_fast32_t nr; + }; const char *info; }; @@ -76,50 +79,28 @@ struct screen_def { * to never have more then a handful of states. */ enum navi_page_state { - PAGE_NORMAL, PAGE_BOTTOM, + PAGE_NORMAL, + PAGE_WIZARD, PAGE_USB, PAGE_FLASH, PAGE_PRINTING, PAGE_INVALID, PAGE_ERROR, -}; - -enum screen_type { - NONE, - FUNC, - MATERIAL, - PROGRESS, - END, /* sentinel */ -}; - -struct wizard_screen_data { - uint_fast8_t count; - struct { - enum screen_type type; - char *text; - void (*func)(void *data); - void *data; - char *prev_button; - char *next_button; - void (*prev_func)(void *data); - void (*next_func)(void *data); - /* TODO consider adding a button_def for the buttons */ - } screens[]; -}; +} _navi_page_state; /* Kind of a hack, to pass a pointer to the enum so we can pass it to functions that only take void* */ 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); -struct eulogium_data; /* XXX remove when we pass a navi */ -Elm_Object_Item *ui_stack_push(const struct eulogium_data *eulogium, Evas_Object *content, const enum navi_page_state page_state); -Eina_Bool ui_stack_pop(const struct eulogium_data *eulogium); -void ui_stack_page_invalidate(Evas_Object *navi, const enum navi_page_state page_state); +Elm_Object_Item *ui_stack_push(Evas_Object *navi, Evas_Object *content, const enum navi_page_state page_state); +Eina_Bool ui_stack_pop(const Evas_Object *navi); void ui_stack_pop_cb(void *data, Evas_Object *eo EINA_UNUSED, void *event_info EINA_UNUSED); +void ui_stack_page_invalidate(Evas_Object *navi, const enum navi_page_state page_state); 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_progress(Evas_Object *parent, struct eulogium_data *eulogium, const struct procedure_data *procedure); +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); void ui_init(void); diff --git a/src/ui_wizards.c b/src/ui_wizards.c new file mode 100644 index 0000000..5ef0b3b --- /dev/null +++ b/src/ui_wizards.c @@ -0,0 +1,373 @@ +/* + * functions, callbacks and data types for wizards + * + * Copyright (c) 2015 Ultimaker B.V. + * Author: Olliver Schinagl + * + * SPDX-License-Identifier: AGPL-3.0+ + */ + +#include +#include + +#include "eulogium.h" +#include "gettext.h" +#include "procedures.h" +#include "ui_wizards.h" + +struct _wizard_next_cb_data { + Evas_Object *navi; + struct wizard_data *wizard; + uint_fast8_t pagenum; + Eina_Bool pageindex; + uint_fast32_t nr; /* XXX passed now as number, replace with 'extrusion-train'-object later */ +}; + +static void _wizard_next_cb(void *data, Evas_Object *eo EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *content; + Evas_Object *navi = ((struct _wizard_next_cb_data *)data)->navi; + uint_fast8_t pagenum = ((struct _wizard_next_cb_data *)data)->pagenum; + Eina_Bool pageindex = ((struct _wizard_next_cb_data *)data)->pageindex; + uint_fast32_t nr = ((struct _wizard_next_cb_data *)data)->nr; + struct wizard_data *wizard = ((struct _wizard_next_cb_data *)data)->wizard; + + if (pagenum >= wizard->count) { + Elm_Object_Item *item; + + item = elm_naviframe_bottom_item_get(navi); + if (item) + elm_naviframe_item_pop_to(item); + } else { + wizard->screens[pagenum].nr = nr; + content = wizard_add(navi, wizard, pagenum, pageindex); + ui_stack_push(navi, content, PAGE_WIZARD); + } + free(data); +} + +static void _wizard_skip_cb(void *data, Evas_Object *eo EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *navi = ((struct _wizard_next_cb_data *)data)->navi; + + ui_stack_page_invalidate(navi, PAGE_WIZARD); + ui_stack_pop(navi); +} + +static void _wizard_next_del(void *data, Evas *e EINA_UNUSED, Evas_Object *eo EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct _wizard_next_cb_data *wizard_next_cb_data = data; + + //free(wizard_next_cb_data); /* XXX double free?! */ +} + +static Eina_Bool _wizard_progress_update(void *data, int type EINA_UNUSED, void *event_info) +{ + Evas_Object *widget = data; + struct print_data *progress = event_info; + + printf("\n\n\n%f\n", progress->value); + printf("%d\n", progress->time); + printf("%d\n\n\n", progress->total_time); + + return ECORE_CALLBACK_PASS_ON; +} + +static void _wizard_widget_del(void *data, Evas *e EINA_UNUSED, Evas_Object *eo EINA_UNUSED, void *event_info EINA_UNUSED) +{ +// Evas_Object *widget = data; + Ecore_Event_Handler *handler = data; +// struct _wizard_data *wizard = data; + +// handler = evas_object_data_get(widget, "handler"); + + if (handler) + ecore_event_handler_del(handler); + +// free(screen); +} + +Evas_Object *wizard_add(Evas_Object *navi, struct wizard_data *wizard, uint_fast8_t pagenum, Eina_Bool pageindex) +{ + Evas_Object *obj; + Evas_Object *_top, *_bottom; + Evas_Object *widget; + Ecore_Event_Handler *handler = NULL; + + _top = elm_box_add(navi); + evas_object_show(_top); + + if (wizard->count == 0) { + EINA_LOG_WARN("Tut tut, we can't have 0 wizard screens!\n"); + return NULL; + } + + if (pagenum >= wizard->count) + pagenum = wizard->count - 1; + + if (pageindex || wizard->title) { + char buf[30]; + Evas_Object *box; + + box = elm_box_add(_top); + elm_box_horizontal_set(box, EINA_TRUE); + evas_object_size_hint_weight_set(box, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0.0); + evas_object_show(box); + + if (wizard->title) { + obj = elm_label_add(box); + elm_object_text_set(obj, _(wizard->title)); /* optionally do the same as the index, but left */ + elm_object_style_set(obj, "title"); + evas_object_show(obj); + evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_start(box, obj); + } + if (pageindex) { + obj = elm_label_add(box); + snprintf(buf, sizeof(buf), "%d/%d", pagenum + 1, wizard->count); + elm_object_text_set(obj, buf); + elm_object_style_set(obj, "title"); + evas_object_show(obj); + evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, obj); + } + + elm_box_pack_end(_top, box); + } + + if (wizard->screens[pagenum].text) { + obj = elm_label_add(_top); + elm_object_text_set(obj, _(wizard->screens[pagenum].text)); + evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(obj, 0.5, 0.5); + evas_object_show(obj); + elm_box_pack_end(_top, obj); + } + + switch (wizard->screens[pagenum].type) { + case WIZARD_PROGRESS: + widget = elm_progressbar_add(_top); + elm_progressbar_pulse_set(widget, EINA_TRUE); + elm_progressbar_pulse(widget, EINA_TRUE); + elm_progressbar_horizontal_set(widget, EINA_TRUE); + elm_progressbar_unit_format_set(widget, "%1.0f%%"); + evas_object_size_hint_align_set(widget, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(widget); + elm_box_pack_end(_top, widget); + //handler = ecore_event_handler_add(event, _wizard_progress_update, widget); + evas_object_data_set(widget, "handler", handler); + break; + case WIZARD_END: /* fall through */ + default: + break; + } + if (handler) + evas_object_event_callback_add(widget, EVAS_CALLBACK_DEL, _wizard_widget_del, handler); + + if (wizard->screens[pagenum].func) + wizard->screens[pagenum].func(wizard->screens[pagenum].nr); + + _bottom = elm_box_add(navi); + elm_box_horizontal_set(_bottom, EINA_TRUE); + evas_object_show(_bottom); + + if (!wizard->screens[pagenum].prev_button.label && !wizard->screens[pagenum].next_button.label) + EINA_LOG_ERR("Both buttons empty, need to add an empty button here"); + if (wizard->screens[pagenum].prev_button.label) { + struct _wizard_next_cb_data *wizard_next_cb_data; + + wizard_next_cb_data = malloc(sizeof(struct _wizard_next_cb_data)); + wizard_next_cb_data->navi = navi; + wizard_next_cb_data->wizard = wizard; + wizard_next_cb_data->pagenum = pagenum + 1; + wizard_next_cb_data->pageindex = EINA_TRUE; + wizard_next_cb_data->nr = wizard->screens[pagenum].prev_button.cb.nr; + + obj = elm_button_add(_bottom); + evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(obj, _(wizard->screens[pagenum].prev_button.label)); + evas_object_smart_callback_add(obj, "clicked", wizard->screens[pagenum].prev_button.cb.func, wizard_next_cb_data); + evas_object_show(obj); + elm_box_pack_end(_bottom, obj); + + evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _wizard_next_del, wizard_next_cb_data); + } + if (wizard->screens[pagenum].next_button.label) { + struct _wizard_next_cb_data *wizard_next_cb_data; + + wizard_next_cb_data = malloc(sizeof(struct _wizard_next_cb_data)); + wizard_next_cb_data->navi = navi; + wizard_next_cb_data->wizard = wizard; + wizard_next_cb_data->pagenum = pagenum + 1; + wizard_next_cb_data->pageindex = EINA_TRUE; + wizard_next_cb_data->nr = wizard->screens[pagenum].next_button.cb.nr; + + obj = elm_button_add(_bottom); + evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(obj, _(wizard->screens[pagenum].next_button.label)); + evas_object_smart_callback_add(obj, "clicked", wizard->screens[pagenum].next_button.cb.func, wizard_next_cb_data); + evas_object_show(obj); + elm_box_pack_end(_bottom, obj); + + evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _wizard_next_del, wizard_next_cb_data); + } + + return eulogium_split_screen(navi, _top, _bottom); +} + +void __wizard_count(struct wizard_data *wizard) +{ + while (wizard->screens[wizard->count].type != WIZARD_END) + wizard->count++; +} + +void wizard_init(struct wizard_data *wizard) +{ + __wizard_count(wizard); +} + +void wizard_init_all(void) +{ + wizard_init(&material_load); + wizard_init(&material_unload); +} + +struct wizard_data material_load = { + .count = 0, + .title = N_("Insert Material"), + .screens = { + { + .type = WIZARD_NONE, + .func = NULL, + .text = N_("To insert material
we need to do stuff"), + .prev_button = { + .label = N_("Skip Wiz."), + .cb = { + .func = _wizard_skip_cb, + }, + }, + .next_button = { + .label = N_("Continue"), + .cb = { + .func = _wizard_next_cb, + }, + }, + }, { + .type = WIZARD_NONE, + .func = NULL, + .text = N_("Choose a nozzle
to insert
material into"), + .prev_button = { + .label = N_("Left"), + .cb = { + .func = _wizard_next_cb, + }, + }, + .next_button = { + .label = N_("Right"), + .cb = { + .func = _wizard_next_cb, + }, + }, + }, { + .type = WIZARD_PROGRESS, + .func = NULL, + .text = N_("Heating nozzle
for insertion."), + .prev_button = { + .label = N_("Abort Wiz."), + .cb = { + .func = _wizard_skip_cb, + }, + }, + .next_button = { + .label = NULL, + }, + }, { + .type = WIZARD_NONE, + .func = NULL, + .text = N_("Material has
been inserted."), + .prev_button = { + .label = NULL, + }, + .next_button = { + .label = N_("Continue"), + .cb = { + .func = _wizard_next_cb, + }, + }, + }, { .type = WIZARD_END, }, /* sentinel */ + }, +}; + +struct wizard_data material_unload = { + .count = 0, + .title = N_("Remove Material"), + .proc_key = PROC_MATERIAL_UNLOAD, + .screens = { + { + .type = WIZARD_NONE, + //.func = &_wizard_procedure_start, + .text = N_("To remove material
we need to do stuff"), + .prev_button = { + .label = N_("Skip Wiz."), + .cb = { + .func = _wizard_skip_cb, + }, + }, + .next_button = { + .label = N_("Continue"), + .cb = { + .func = _wizard_next_cb, + }, + }, + }, { + .type = WIZARD_NONE, + //.func = &_wizard_procedure_message, + .text = N_("Choose a nozzle
to remove
material from"), + .prev_button = { + .label = N_("Left"), + .cb = { + .func = _wizard_next_cb, + .nr = 0, + }, + }, + .next_button = { + .label = N_("Right"), + .cb = { + .func = _wizard_next_cb, + .nr = 1, + }, + }, + }, { + .type = WIZARD_PROGRESS, + //.func = &_wizard_procedure_message, + .text = N_("Heating nozzle
for removal."), + .prev_button = { + .label = N_("Skip Wiz."), + .cb = { + .func = _wizard_skip_cb, + }, + }, + .next_button = { + .label = NULL, + }, + }, { + .type = WIZARD_NONE, + .func = NULL, + .text = N_("Material has
been removed."), + .prev_button = { + .label = NULL, + }, + .next_button = { + .label = N_("Continue"), + .cb = { + .func = _wizard_next_cb, + }, + }, + }, { .type = WIZARD_END, }, /* sentinel */ + }, +}; diff --git a/src/ui_wizards.h b/src/ui_wizards.h new file mode 100644 index 0000000..87a43fd --- /dev/null +++ b/src/ui_wizards.h @@ -0,0 +1,49 @@ +/* + * functions, callbacks and data types for wizards + * + * Copyright (c) 2015 Ultimaker B.V. + * Author: Olliver Schinagl + * + * SPDX-License-Identifier: AGPL-3.0+ + */ + +#ifndef _UI_WIZARDS_H +#define _UI_WIZARDS_H + +#include + +#include "procedures.h" + +enum wizard_type { + WIZARD_NONE, + WIZARD_PROGRESS, + WIZARD_END, /* sentinel */ +}; + +struct wizard_data { + uint_fast8_t count; /* Calculated using wizard_init */ + const char *title; + enum procedure_key proc_key; + struct { + enum wizard_type type; + char *text; + struct button_def prev_button; + struct button_def next_button; + void (*func)(uint_fast32_t nr); + union { + void *data; + uint_fast32_t nr; /* XXX hack until we have a extrude-train object */ + }; + /* TODO consider adding a button_def for the buttons */ + } screens[]; +}; + +extern struct wizard_data material_load; +extern struct wizard_data material_unload; + +void wizard_init(struct wizard_data *wizard); +void wizard_init_all(void); + +Evas_Object *wizard_add(Evas_Object *navi, struct wizard_data *wizard, uint_fast8_t pagenum, Eina_Bool pageindex); + +#endif /* _UI_WIZARDS_H */ -- cgit v0.12