From 336af61ca23b7cb7035659922fd85a2189b068d4 Mon Sep 17 00:00:00 2001 From: Olliver Schinagl Date: Tue, 7 Jul 2015 08:33:59 +0200 Subject: archival commit --- Makefile.am | 34 +- configure.ac | 29 +- data/themes/Makefile.am | 2 +- data/themes/default/Makefile.am | 76 +- data/themes/default/colorclasses.edc | 15 +- data/themes/default/default.edc | 2 +- data/themes/default/deps.txt | 36 + data/themes/default/edc/elm/button.edc | 17 +- data/themes/default/edc/elm/check.edc | 9 +- data/themes/default/edc/elm/failure_slider_01.edc | 507 +++++ data/themes/default/edc/elm/label.edc | 35 +- data/themes/default/edc/elm/naviframe.edc | 113 +- data/themes/default/edc/elm/progress.edc | 12 +- data/themes/default/edc/elm/slider.edc | 1081 +-------- data/themes/default/fnt/10x20.pcf | Bin 0 -> 705368 bytes data/themes/default/fnt/4x6.pcf | Bin 0 -> 182056 bytes data/themes/default/fnt/5x7.pcf | Bin 0 -> 239800 bytes data/themes/default/fnt/5x8.pcf | Bin 0 -> 220992 bytes data/themes/default/fnt/6x12.pcf | Bin 0 -> 486116 bytes data/themes/default/fnt/6x9.pcf | Bin 0 -> 218148 bytes data/themes/default/fnt/7x13.pcf | Bin 0 -> 397192 bytes data/themes/default/fnt/8x13.pcf | Bin 0 -> 436328 bytes data/themes/default/fnt/9x15.pcf | Bin 0 -> 562732 bytes data/themes/default/fonts.edc | 22 +- data/themes/default/img/emo-very-sorry.png | Bin 6371 -> 160 bytes .../default/img/slider_indicator_knob_horiz.png | Bin 0 -> 163 bytes packaging/debian/Makefile.am | 3 - packaging/debian/changelog | 5 + packaging/debian/rules | 0 src/Makefile.am | 15 +- src/dbus_common.c | 84 +- src/dbus_common.h | 5 +- src/eulogium.c | 2287 ++++++++++++-------- src/eulogium.h | 55 +- src/eulogium_item_list.c | 17 +- src/eulogium_item_list.h | 2 +- src/eulogium_private.h | 23 - src/gettext.h | 291 +-- src/libgettext.h | 280 +++ src/network.c | 38 + src/network.h | 39 + src/print_data.c | 22 + src/print_data.h | 22 +- src/procedures.c | 950 +++++++- src/procedures.h | 159 +- src/settings_data.h | 35 + src/tests/Makefile.am | 4 +- src/tests/test_eulogium | Bin 0 -> 7664 bytes src/tests/test_eulogium.c | 118 +- src/ui_input.c | 40 + src/ui_input.h | 19 + src/ui_widgets.c | 621 ++++++ src/ui_widgets.h | 87 +- 53 files changed, 4547 insertions(+), 2664 deletions(-) create mode 100644 data/themes/default/deps.txt create mode 100644 data/themes/default/edc/elm/failure_slider_01.edc create mode 100644 data/themes/default/fnt/10x20.pcf create mode 100644 data/themes/default/fnt/4x6.pcf create mode 100644 data/themes/default/fnt/5x7.pcf create mode 100644 data/themes/default/fnt/5x8.pcf create mode 100644 data/themes/default/fnt/6x12.pcf create mode 100644 data/themes/default/fnt/6x9.pcf create mode 100644 data/themes/default/fnt/7x13.pcf create mode 100644 data/themes/default/fnt/8x13.pcf create mode 100644 data/themes/default/fnt/9x15.pcf create mode 100644 data/themes/default/img/slider_indicator_knob_horiz.png mode change 100755 => 100644 packaging/debian/rules delete mode 100644 src/eulogium_private.h create mode 100644 src/libgettext.h create mode 100644 src/network.c create mode 100644 src/network.h create mode 100644 src/print_data.c create mode 100644 src/settings_data.h create mode 100644 src/tests/test_eulogium create mode 100644 src/ui_input.c create mode 100644 src/ui_input.h create mode 100644 src/ui_widgets.c diff --git a/Makefile.am b/Makefile.am index 6f5bc92..563d902 100644 --- a/Makefile.am +++ b/Makefile.am @@ -18,6 +18,8 @@ MAINTAINERCLEANFILES = \ m4/ltsugar.m4 \ m4/ltversion.m4 \ m4/lt~obsolete.m4 \ + src/*~ src/lib/*~ src/bin/*~ \ + src/*.gcda src/*.gcno src/lib/*.gcda src/lib/*.gcno src/bin/*.gcda src/bin/*gcno \ po/boldquot.sed \ po/en@boldquot.header \ po/en@quot.header \ @@ -53,38 +55,6 @@ EXTRA_DIST = \ m4/efl_compiler_flag.m4 \ m4/efl_path_max.m4 -if EFL_HAVE_LCOV - -lcov-reset: - @rm -rf $(top_builddir)/coverage - @find $(top_builddir) -name "*.gcda" -delete - @lcov --zerocounters --directory $(top_builddir) - -lcov-report: - @mkdir $(top_builddir)/coverage - lcov --capture --compat-libtool --output-file $(top_builddir)/coverage/coverage.info --directory $(top_builddir)/src/lib --base-directory $(top_srcdir)/src/lib - lcov --remove $(top_builddir)/coverage/coverage.info '*.h' --output-file $(top_builddir)/coverage/coverage.cleaned.info - lcov --remove $(top_builddir)/coverage/coverage.cleaned.info '*/tests/*' --output-file $(top_builddir)/coverage/coverage.cleaned2.info - genhtml --branch-coverage -t "$(PACKAGE_STRING)" -o $(top_builddir)/coverage/html $(top_builddir)/coverage/coverage.cleaned2.info - @echo "Coverage Report at $(top_builddir)/coverage/html" - -endif - -if EFL_HAVE_TESTS - -TESTS = src/tests/eulogium_tests - -lcov-check: -if EFL_HAVE_LCOV - @$(MAKE) $(AM_MAKEFLAGS) lcov-reset -endif - @$(MAKE) $(AM_MAKEFLAGS) check -if EFL_HAVE_LCOV - @$(MAKE) $(AM_MAKEFLAGS) lcov-report -endif - -endif - # cleaning clean-local: diff --git a/configure.ac b/configure.ac index da5e488..05144d5 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ -EFL_VERSION([1], [8], [5]) -AC_INIT([eulogium], [m4_esyscmd_s([git describe --always --tags --abbrev=1 --dirty])], [support@ultimaker.com], [], [http://www.ultimaker.com]) +EFL_VERSION([1], [8], [5], [0]) +AC_INIT([eulogium], [m4_esyscmd_s([git describe --always --tags --dirty --abbrev=1])], [support@ultimaker.com], [], [http://www.ultimaker.com]) AC_PREREQ([2.65]) AC_CONFIG_SRCDIR([configure.ac]) @@ -30,25 +30,14 @@ EFL_CHECK_PATH_MAX # Check for EFL PKG_CHECK_MODULES([EFL], [ - ecore >= 1.8.0 - ecore-evas >= 1.8.0 - eina >= 1.8.0 - elementary >= 1.8.0 - evas >= 1.8.0 - eeze >= 1.8.0 + ecore >= 1.8.5 + ecore-evas >= 1.8.5 + eina >= 1.8.5 + elementary >= 1.8.5 + evas >= 1.8.5 + eeze >= 1.8.5 ]) -# Check for tests and coverage -AC_ARG_WITH([tests], - [AC_HELP_STRING( - [--with-tests=none|regular|coverage], - [choose testing method: regular, coverage or none. @<:@default=none@:>@])], - [build_tests=${withval}], - [build_tests=auto] -) - -EFL_TESTS([${build_tests}]) - # doxygen program for documentation building EFL_CHECK_DOXYGEN([build_doc="yes"], [build_doc="no"]) @@ -68,7 +57,6 @@ data/desktop/Makefile data/desktop/eulogium.desktop data/themes/Makefile data/themes/default/Makefile -data/themes/ulticontroller_2.0/Makefile doc/Makefile packaging/Makefile packaging/slackware/Makefile @@ -76,7 +64,6 @@ packaging/debian/Makefile packaging/pkgbuild/Makefile po/Makefile.in src/Makefile -src/tests/Makefile doc/eulogium.1 ]) AC_OUTPUT diff --git a/data/themes/Makefile.am b/data/themes/Makefile.am index 598c0fa..5f40636 100644 --- a/data/themes/Makefile.am +++ b/data/themes/Makefile.am @@ -1,3 +1,3 @@ MAINTAINERCLEANFILES = Makefile.in -SUBDIRS = default ulticontroller_2.0 +SUBDIRS = default diff --git a/data/themes/default/Makefile.am b/data/themes/default/Makefile.am index 8c9ea90..c67f0a1 100644 --- a/data/themes/default/Makefile.am +++ b/data/themes/default/Makefile.am @@ -5,30 +5,38 @@ include ../../../Makefile_Edje_Helper.am EDJE_CC_FLAGS += #-l $(top_srcdir)/COPYING -a $(top_srcdir)/AUTHORS -filesdir = $(datadir)/elementary/themes +filesdir = $(datadir)/$(PACKAGE)/themes files_DATA = default.edj +EDJE_CC_FLAGS += \ +-id ${top_srcdir}/data/themes/default/img \ +-fd ${top_srcdir}/data/themes/default/fnt \ +-sd ${top_srcdir}/data/themes/default/snd \ +-dd ${top_srcdir}/data/themes/default/data + default.edj: Makefile $(EXTRA_DIST) $(AM_V_EDJ)$(EDJE_CC) \ - $(EDJE_CC_FLAGS) -fastdecomp \ + $(EDJE_CC_FLAGS) -fastdecomp -w files.txt -deps deps.txt -v \ $(top_srcdir)/data/themes/default/default.edc \ $(top_builddir)/data/themes/default/default.edj clean-local: rm -f *.edj -EDJE_CC_FLAGS += \ --id ${top_srcdir}/data/themes/default/img \ --fd ${top_srcdir}/data/themes/default/fnt \ --sd ${top_srcdir}/data/themes/default/snd \ --dd ${top_srcdir}/data/themes/default/data - EXTRA_DIST = ${images} ${fonts} ${sounds} ${data} ${edjes} data = fonts = \ -fnt/5x7.pcf.gz +fnt/4x6.pcf \ +fnt/5x7.pcf \ +fnt/5x8.pcf \ +fnt/6x9.pcf \ +fnt/6x12.pcf \ +fnt/7x13.pcf \ +fnt/8x13.pcf \ +fnt/9x15.pcf \ +fnt/10x20.pcf sounds = \ snd/kbd-tap.wav \ @@ -38,6 +46,7 @@ snd/kbd-tap4.wav \ snd/kbd-tap5.wav edjes = \ +default.edc \ colorclasses.edc \ fonts.edc \ macros.edc \ @@ -98,4 +107,51 @@ edc/elm/tooltip.edc \ edc/elm/video.edc \ edc/elm/win.edc -images = +images = \ +img/slider_run_base_horiz.png \ +img/slider_run_bevel_horiz.png \ +img/slider_run_base_light_horiz.png \ +img/slider_indicator_knob_horiz.png \ +img/button_normal.png \ +img/button_outline.png \ +img/bevel_in.png \ +img/sym_check_alum.png \ +img/inset_bar_horiz_base.png \ +img/inset_bar_horiz_glow_base.png \ +img/inset_bar_horiz_glow_inv_base.png \ +img/inset_bar_horiz_glow_mid_base.png \ +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/knob_round_busy.png \ +img/glow_round_corners.png \ +img/bevel_in.png \ +img/bevel_out.png \ +img/runner_horiz.png \ +img/runner_vert.png \ +img/runner_glow_horiz.png \ +img/runner_glow_vert.png \ +img/holes_tiny_horiz.png \ +img/holes_tiny_vert.png \ +img/holes_tiny_glow_horiz.png \ +img/holes_tiny_glow_vert.png \ +img/vgrad_med_lighter.png \ +img/glow_small.png \ +img/sym_left_light_normal.png \ +img/sym_right_light_normal.png \ +img/sym_up_light_normal.png \ +img/sym_down_light_normal.png \ +img/sym_left_glow_normal.png \ +img/sym_right_glow_normal.png \ +img/sym_up_glow_normal.png \ +img/sym_down_glow_normal.png \ +img/sym_up_dark_normal.png \ +img/sym_down_dark_normal.png \ +img/sym_left_dark_normal.png \ +img/sym_right_dark_normal.png \ +img/icon_folder.png \ +img/icon_file.png \ +img/icon_home.png \ +img/icon_arrow_up.png \ +img/icon_arrow_left.png diff --git a/data/themes/default/colorclasses.edc b/data/themes/default/colorclasses.edc index 8ac944b..8118c65 100644 --- a/data/themes/default/colorclasses.edc +++ b/data/themes/default/colorclasses.edc @@ -23,6 +23,15 @@ color_classes { color_class { name: "check_text"; color: FN_COL_DEFAULT; } + color_class { name: "label_text"; + color: FN_COL_DEFAULT; + } + color_class { name: "label_text_title"; + color: WIN_COL_HIGHLIGHT; + } + color_class { name: "label_text_disabled"; + color: FN_COL_DISABLE; + } // widgets color_class { name: "button_text_focus"; @@ -61,12 +70,6 @@ color_classes { color_class { name: "entry_text_disabled"; color: FN_COL_DEFAULT_BASIC; } - color_class { name: "label_text"; - color: FN_COL_DEFAULT; - } - color_class { name: "label_text_disabled"; - color: FN_COL_DISABLE; - } color_class { name: "frame_base"; color: WIN_DEFAULT_BASIC; } diff --git a/data/themes/default/default.edc b/data/themes/default/default.edc index d13d9e9..725867a 100644 --- a/data/themes/default/default.edc +++ b/data/themes/default/default.edc @@ -21,7 +21,7 @@ collections { #include "edc/elm/label.edc" #include "edc/elm/separator.edc" #include "edc/elm/check.edc" -//#include "edc/elm/slider.edc" +#include "edc/elm/slider.edc" //#include "edc/elm/radio.edc" //#include "edc/elm/bubble.edc" //#include "edc/elm/panes.edc" diff --git a/data/themes/default/deps.txt b/data/themes/default/deps.txt new file mode 100644 index 0000000..3d5155b --- /dev/null +++ b/data/themes/default/deps.txt @@ -0,0 +1,36 @@ +../../../data/themes/default/default.edj: \ + ../../../data/themes/default/macros.edc \ + ../../../data/themes/default/fonts.edc \ + ../../../data/themes/default/colorclasses.edc \ + ../../../data/themes/default/edc/elm/bg.edc \ + ../../../data/themes/default/edc/elm/button.edc \ + ../../../data/themes/default/edc/elm/label.edc \ + ../../../data/themes/default/edc/elm/separator.edc \ + ../../../data/themes/default/edc/elm/check.edc \ + ../../../data/themes/default/edc/elm/slider.edc \ + ../../../data/themes/default/edc/elm/icon.edc \ + ../../../data/themes/default/edc/elm/progress.edc \ + ../../../data/themes/default/edc/elm/naviframe.edc \ + ../../../data/themes/default/img/button_normal.png \ + ../../../data/themes/default/img/button_outline.png \ + ../../../data/themes/default/img/bevel_in.png \ + ../../../data/themes/default/img/sym_check_alum.png \ + ../../../data/themes/default/img/slider_run_base_horiz.png \ + ../../../data/themes/default/img/slider_run_bevel_horiz.png \ + ../../../data/themes/default/img/slider_run_base_light_horiz.png \ + ../../../data/themes/default/img/slider_indicator_knob_horiz.png \ + ../../../data/themes/default/img/icon_folder.png \ + ../../../data/themes/default/img/icon_file.png \ + ../../../data/themes/default/img/icon_home.png \ + ../../../data/themes/default/img/icon_arrow_up.png \ + ../../../data/themes/default/img/icon_arrow_left.png \ + ../../../data/themes/default/img/inset_bar_horiz_base.png \ + ../../../data/themes/default/img/inset_bar_horiz_glow_base.png \ + ../../../data/themes/default/img/inset_bar_horiz_glow_inv_base.png \ + ../../../data/themes/default/img/inset_bar_horiz_glow_mid_base.png \ + ../../../data/themes/default/img/inset_bar_vert_base.png \ + ../../../data/themes/default/img/inset_bar_vert_glow_base.png \ + ../../../data/themes/default/img/inset_bar_vert_glow_inv_base.png \ + ../../../data/themes/default/img/inset_bar_vert_glow_mid_base.png \ + ../../../data/themes/default/img/knob_round_busy.png \ + ../../../data/themes/default/img/glow_round_corners.png \ No newline at end of file diff --git a/data/themes/default/edc/elm/button.edc b/data/themes/default/edc/elm/button.edc index e34f422..260093a 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="FN" font_size=8 text_class=tb_plain color=#ffffffff align=center"; + base: "font="FNBIG" text_class=tb_plain color=#ffffffff align=center"; FN_TAG_BR; } style { name: "button_style_focused"; - base: "font="FN" font_size=8 text_class=tb_plain color=#000000ff align=center"; + base: "font="FNBIG" text_class=tb_plain color=#000000ff align=center"; FN_TAG_BR; } style { name: "button_style_disabled"; - base: "font="FN" font_size=8 text_class=tb_plain color=#000000ff align=center"; + base: "font="FNBIG" 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: FN; size: 7; + text { font: FNBIG; min: 0 0; text_class: "button_text"; } @@ -428,15 +428,15 @@ group { name: "elm/button/base/list"; } styles { style { name: "button_list_style_default"; - base: "font="FN" font_size=8 text_class=tb_plain color=#ffffffff align=auto"; + base: "font="FN" text_class=tb_plain color=#ffffffff align=auto"; FN_TAG_BR; } style { name: "button_list_style_focused"; - base: "font="FN" font_size=8 text_class=tb_plain color=#000000ff align=auto"; + base: "font="FN" text_class=tb_plain color=#000000ff align=auto"; FN_TAG_BR; } style { name: "button_list_style_disabled"; - base: "font="FN" font_size=8 text_class=tb_plain color=#000000ff align=auto"; + base: "font="FN" text_class=tb_plain color=#000000ff align=auto"; FN_TAG_BR; } } @@ -492,7 +492,7 @@ group { name: "elm/button/base/list"; scale: 1; description { state: "default" 0.0; visible: 0; - text { font: FN; size: 7; + text { font: FN; min: 0 0; text_class: "button_text"; } @@ -529,6 +529,7 @@ group { name: "elm/button/base/list"; text { style: "button_list_style_default"; min: 0 1; + ellipsis: -1; } visible: 0; } diff --git a/data/themes/default/edc/elm/check.edc b/data/themes/default/edc/elm/check.edc index 355ea62..6b06cc1 100644 --- a/data/themes/default/edc/elm/check.edc +++ b/data/themes/default/edc/elm/check.edc @@ -71,15 +71,15 @@ group { name: "elm/check/base/default"; } styles { style { name: "check_style_default"; - base: "font="FN" font_size=8 text_class=tb_plain color=#ffffffff align=auto"; + base: "font="FN" text_class=tb_plain color=#ffffffff align=auto"; FN_TAG_BR; } style { name: "check_style_focused"; - base: "font="FN" font_size=8 text_class=tb_plain color=#000000ff align=auto"; + base: "font="FN" text_class=tb_plain color=#000000ff align=auto"; FN_TAG_BR; } style { name: "check_style_disabled"; - base: "font="FN" font_size=8 text_class=tb_plain color=#000000ff align=auto"; + base: "font="FN" text_class=tb_plain color=#000000ff align=auto"; FN_TAG_BR; } @@ -167,7 +167,7 @@ group { name: "elm/check/base/default"; scale: 1; description { state: "default" 0.0; visible: 0; - text { font: FN; size: 7; + text { font: FN; min: 0 0; text_class: "check_text"; } @@ -203,6 +203,7 @@ group { name: "elm/check/base/default"; rel2.to: "base"; text { style: "check_style_default"; + ellipsis: -1; min: 0 1; } visible: 0; diff --git a/data/themes/default/edc/elm/failure_slider_01.edc b/data/themes/default/edc/elm/failure_slider_01.edc new file mode 100644 index 0000000..5aae3ad --- /dev/null +++ b/data/themes/default/edc/elm/failure_slider_01.edc @@ -0,0 +1,507 @@ +group { name: "elm/slider/hidden/limit"; + parts { + part { name: "elm.units.min"; type: TEXT; mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + visible: 0; + align: 1.0 0.5; + text { font: FN; size: 10; + text_class: "slider_text"; + min: 1 1; + align: 0.0 0.5; + ellipsis: -1; + } + } + } + part { name: "elm.units.max"; type: TEXT; mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + visible: 0; + align: 1.0 0.5; + text { font: FN; size: 10; + text_class: "slider_text"; + min: 1 1; + align: 0.0 0.5; + ellipsis: -1; + } + } + } + } +} + +group { name: "elm/slider/horizontal/default"; + alias: "elm/slider/horizontal/disabled"; + images.image: "slider_run_base_horiz.png" COMP; + images.image: "slider_run_bevel_horiz.png" COMP; + images.image: "slider_run_base_light_horiz.png" COMP; + images.image: "slider_indicator_knob_horiz.png" COMP; +#define ICON 1 +#define LABEL 2 +#define END 4 +#define UNITS 8 +#define MASK 15 +#define INVERT 16 +#define DISABLE 32 + script { + public slmode; + public eval_mode(m) { + new ic = m & ICON; + new l = m & LABEL; + new e = m & END; + new u = m & UNITS; + new d = m & DISABLE; + new i = m & INVERT; + if (i) { + if (!d) { + set_state(PART:"base", "default", 0.0); + } else { + set_state(PART:"base", "disabled", 0.0); + } + } else { + if (!d) { + set_state(PART:"base", "default", 0.0); + } else { + set_state(PART:"base", "disabled", 0.0); + } + } + if (l) { + if (!d) { + set_state(PART:"elm.text", "visible", 0.0); + } else { + set_state(PART:"elm.text", "disabled_visible", 0.0); + } + } else { + set_state(PART:"elm.text", "default", 0.0); + } + if (u) { + if (!d) { + set_state(PART:"elm.units", "visible", 0.0); + set_state(PART:"limits", "visible", 0.0); + } else { + set_state(PART:"elm.units", "disabled_visible", 0.0); + set_state(PART:"limits", "disabled_visible", 0.0); + } + } else { + set_state(PART:"elm.units", "default", 0.0); + set_state(PART:"limits", "default", 0.0); + } + if (ic) { + set_state(PART:"elm.swallow.icon", "visible", 0.0); + set_state(PART:"sizer.content", "visible", 0.0); + } else { + set_state(PART:"elm.swallow.icon", "default", 0.0); + set_state(PART:"sizer.content", "default", 0.0); + } + if (e) { + set_state(PART:"elm.swallow.end", "visible", 0.0); + set_state(PART:"sizer.content.end", "visible", 0.0); + } else { + set_state(PART:"elm.swallow.end", "default", 0.0); + set_state(PART:"sizer.content.end", "default", 0.0); + } + if (!d) { + set_state(PART:"event", "default", 0.0); + set_state(PART:"dis_clip", "default", 0.0); + } else { + set_state(PART:"event", "disabled", 0.0); + set_state(PART:"dis_clip", "disabled", 0.0); + } + } + } + parts { + part { name: "elm.swallow.bar"; type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + min: 42 14; + max: 99999 14; + align: 1.0 0.5; + rel1.to_x: "elm.swallow.icon"; + rel1.relative: 1.0 0.0; + rel1.offset: 2 0; + rel2.to_x: "limits"; + rel2.relative: 0.0 1.0; + rel2.offset: -3 -1; + } + } + part { name: "base"; mouse_events: 0; + description { state: "default" 0.0; + rel1.to: "elm.swallow.bar"; + rel2.to: "elm.swallow.bar"; + image.normal: "slider_run_base_horiz.png"; + image.border: 4 4 0 0; + fill.smooth: 0; + min: 8 5; + max: 99999 5; + fixed: 0 1; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + image.normal: "slider_run_base_light_horiz.png"; + } + } + part { name: "bevel"; mouse_events: 0; + description { state: "default" 0.0; + rel1.to: "base"; + rel2.to: "base"; + image.normal: "slider_run_bevel_horiz.png"; + image.border: 5 5 0 0; + fill.smooth: 0; + } + } + part { name: "dis_clip"; type: RECT; + description { state: "default" 0.0; + rel1.to: "elm.swallow.icon"; + rel2.to: "elm.swallow.end"; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + color: 255 255 255 64; + } + } + part { name: "elm.swallow.icon"; type: SWALLOW; + clip_to: "dis_clip"; + description { state: "default" 0.0; + visible: 0; + align: 0.0 0.5; + rel1.offset: 0 2; + rel1.to_y: "elm.swallow.bar"; + rel2.offset: -1 -3; + rel2.relative: 0.0 1.0; + rel2.to_y: "elm.swallow.bar"; + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + aspect: 1.0 1.0; aspect_preference: VERTICAL; + rel1.offset: 2 2; + rel2.offset: 2 -3; + } + } + part { name: "sizer.content"; type: TEXT; mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + fixed: 1 1; + visible: 0; + text { font: FN; size: 10; + min: 0 0; + text_class: "slider_text"; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + rel1.to: "elm.swallow.icon"; + rel2.to: "elm.swallow.icon"; + text { + min: 1 1; + ellipsis: -1; + text: "M"; + } + } + } + part { name: "elm.text"; type: TEXT; mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + fixed: 1 1; + align: 0.0 0.5; + rel1.to_x: "elm.swallow.icon"; + rel1.relative: 1.0 0.0; + rel1.offset: -1 2; + rel2.to_x: "elm.swallow.icon"; + rel2.relative: 1.0 1.0; + rel2.offset: -1 -3; + color: FN_COL_DEFAULT; + color_class: "slider_text"; + text { font: FN; size: 8; + text_class: "slider"; + min: 0 0; + align: 0.0 0.5; + } + visible: 0; + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + fixed: 1 0; + visible: 1; + rel1.offset: 2 2; + rel2.offset: 2 -3; + text.min: 1 1; + text.ellipsis: -1; + } + description { state: "disabled_visible" 0.0; + inherit: "visible" 0.0; + color_class: "slider_text_disabled"; + color3: 255 255 255 255; + } + } + part { name: "elm.swallow.end"; type: SWALLOW; + clip_to: "dis_clip"; + description { state: "default" 0.0; + visible: 0; + align: 1.0 0.5; + rel1.offset: 0 2; + rel1.relative: 1.0 0.0; + rel2.offset: -1 -3; + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + rel1.offset: -3 2; + rel2.offset: -3 -3; + } + } + part { name: "sizer.content.end"; type: TEXT; mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + fixed: 1 1; + visible: 0; + text { font: FN; size: 10; + min: 0 0; + text_class: "slider_text"; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + rel1.to: "elm.swallow.end"; + rel2.to: "elm.swallow.end"; + text { + min: 1 1; + ellipsis: -1; + text: "M"; + } + } + } + alias: "elm.units.min" "limits:elm.units.min"; + alias: "elm.units.max" "limits:elm.units.max"; + part { name: "limits"; type: GROUP; mouse_events: 0; + source: "elm/slider/hidden/limit"; + scale: 1; + description { state: "default" 0.0; + visible: 0; + align: 1.0 0.5; + min: SOURCE; + fixed: 1 1; + rel1.to_x: "elm.swallow.end"; + rel1.relative: 0.0 0.0; + rel1.offset: 0 2; + rel2.to_x: "elm.swallow.end"; + rel2.relative: 0.0 1.0; + rel2.offset: -1 -3; + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + rel1.offset: -3 2; + rel2.offset: -3 -3; + } + } + part { name: "elm.units"; type: TEXT; mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + visible: 0; + fixed: 1 1; + rel1.to_x: "limits"; + rel2.to_x: "limits"; + color: FN_COL_DEFAULT; + color_class: "slider_text"; + text { font: FN; size: 8; + text_class: "slider"; + align: 1.0 0.5; + min: 1 1; + ellipsis: -1; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { state: "disabled_visible" 0.0; + inherit: "visible" 0.0; + color_class: "slider_text_disabled"; + color3: 255 255 255 255; + } + } + part { name: "elm.dragable.slider"; type: RECT; + scale: 0; + dragable.x: 1 1 0; + dragable.y: 0 0 0; + dragable.confine: "elm.swallow.bar"; + description { state: "default" 0.0; + color: 0 0 0 0; + min: 16 16; + max: 16 16; + fixed: 1 1; + rel1.relative: 0.5 0.0; + rel1.to_x: "elm.swallow.bar"; + rel2.relative: 0.5 1.0; + rel2.to_x: "elm.swallow.bar"; + } + } + part { name: "knob"; + scale: 0; + description { state: "default" 0.0; + image.normal: "slider_indicator_knob_horiz.png"; + fixed: 1 1; + rel1.to: "elm.dragable.slider"; + rel2.to: "elm.dragable.slider"; + } + description { state: "clicked" 0.0; + inherit: "default" 0.0; + } + } + part { name: "slideevent"; type: RECT; repeat_events: 1; + scale: 0; + ignore_flags: ON_HOLD; + dragable.events: "elm.dragable.slider"; + description { state: "default" 0.0; + fixed: 1 1; + rel1.to: "elm.dragable.slider"; + rel2.to: "elm.dragable.slider"; + color: 0 0 0 0; + } + } + part { name: "elm.track.slider"; type: SWALLOW; mouse_events: 0; + description { state: "default" 0.0; + max: 0 0; + rel1.to: "elm.dragable.slider"; + rel2.to: "elm.dragable.slider"; + } + } + part { name: "event"; type: RECT; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 0; + } + description { state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { + signal: "mouse,down,1"; source: "elm.dragable.slider"; + action: STATE_SET "clicked" 0.0; + target: "knob"; + } + program { + signal: "mouse,up,1"; source: "elm.dragable.slider"; + action: STATE_SET "default" 0.0; + target: "knob"; + } + program { + signal: "elm,state,text,visible"; source: "elm"; + script { + new m = get_int(slmode); + m |= LABEL; set_int(slmode, m); + eval_mode(m); + } + } + program { + signal: "elm,state,text,hidden"; source: "elm"; + script { + new m = get_int(slmode); + m &= ~LABEL; set_int(slmode, m); + eval_mode(m); + } + } + program { + signal: "elm,state,icon,visible"; source: "elm"; + script { + new m = get_int(slmode); + m |= ICON; set_int(slmode, m); + eval_mode(m); + } + } + program { + signal: "elm,state,icon,hidden"; source: "elm"; + script { + new m = get_int(slmode); + m &= ~ICON; set_int(slmode, m); + eval_mode(m); + } + } + program { name: "end_show"; + signal: "elm,state,end,visible"; source: "elm"; + script { + new m = get_int(slmode); + m |= END; set_int(slmode, m); + eval_mode(m); + } + } + program { name: "end_hide"; + signal: "elm,state,end,hidden"; source: "elm"; + script { + new m = get_int(slmode); + m &= ~END; set_int(slmode, m); + eval_mode(m); + } + } + program { + signal: "elm,state,units,visible"; source: "elm"; + script { + new m = get_int(slmode); + m |= UNITS; set_int(slmode, m); + eval_mode(m); + } + } +// program { +// signal: "elm,state,units,visible"; source: "elm"; +// action: SIGNAL_EMIT "limits,visible" "elm"; +// target: "limits"; +// } + program { + signal: "elm,state,units,hidden"; source: "elm"; + action: STATE_SET "default" 0.0; + script { + new m = get_int(slmode); + m &= ~UNITS; set_int(slmode, m); + eval_mode(m); + } + } +// program { +// signal: "elm,state,units,hidden"; source: "elm"; +// action: SIGNAL_EMIT "limits,hide" "elm"; +// target: "limits"; +// } + program { + signal: "elm,state,inverted,on"; source: "elm"; + script { + new m = get_int(slmode); + m |= INVERT; set_int(slmode, m); + eval_mode(m); + } + } + program { + signal: "elm,state,inverted,off"; source: "elm"; + script { + new m = get_int(slmode); + m &= ~INVERT; set_int(slmode, m); + eval_mode(m); + } + } + program { + signal: "elm,state,disabled"; source: "elm"; + script { + new m = get_int(slmode); + m |= DISABLE; set_int(slmode, m); + eval_mode(m); + } + } + program { + signal: "elm,state,enabled"; source: "elm"; + script { + new m = get_int(slmode); + m &= ~DISABLE; set_int(slmode, m); + eval_mode(m); + } + } + } +#undef ICON +#undef LABEL +#undef END +#undef UNITS +#undef MASK +#undef INVERT +#undef DISABLE +} diff --git a/data/themes/default/edc/elm/label.edc b/data/themes/default/edc/elm/label.edc index e51fac8..c3183e8 100644 --- a/data/themes/default/edc/elm/label.edc +++ b/data/themes/default/edc/elm/label.edc @@ -1,10 +1,8 @@ group { name: "elm/label/base/default"; styles { style { name: "label_style"; - base: "font="FN" font_size=7 text_class=tb_plain align=center color=#ffffffff style=shadow,bottom shadow_color=#00000080"; - tag: "br" "\n"; - tag: "hilight" "+ font="FNBD" text_class=tb_light"; - tag: "b" "+ font="FNBD" text_class=tb_light"; + base: "font="FN" text_class=tb_plain align=center color=#ffffffff"; + FN_TAG_BR; } } parts { @@ -27,10 +25,37 @@ group { name: "elm/label/base/default"; } } +group { name: "elm/label/base/title"; + styles { + style { name: "label_style_title"; + base: "font="FN" text_class=tb_plain align=center color=#000000ff"; + FN_TAG_BR; + } + } + parts { + part { name: "base"; type: RECT; + description { state: "default" 0.0; + color_class: "label_text_title"; + } + } + part { name: "elm.text"; type: TEXTBLOCK; + scale: 1; + description { state: "default" 0.0; + rel1.to: "base"; + rel2.to: "base"; + text { style: "label_style_title"; + min: 1 1; + ellipsis: -1; + } + } + } + } +} + group { name: "elm/label/base/marker"; styles { style { name: "label_style2"; - base: "font="FNBD" font_size=7 text_class=tb_plain align=center color=#ffffffff style=shadow,bottom shadow_color=#00000080"; + base: "font="FNBD" text_class=tb_plain align=center color=#ffffffff"; tag: "br" "\n"; tag: "hilight" "+ font="FNBD" color=#3399ff text_class=tb_light"; tag: "b" "+ font="FNBD" color=#3399ff text_class=tb_light"; diff --git a/data/themes/default/edc/elm/naviframe.edc b/data/themes/default/edc/elm/naviframe.edc index 52a62e3..7a8ed23 100644 --- a/data/themes/default/edc/elm/naviframe.edc +++ b/data/themes/default/edc/elm/naviframe.edc @@ -7,40 +7,20 @@ group { name: "elm/naviframe/item/basic/default"; part { name: "base"; type: SPACER; description { state: "default" 0.0; } - description { state: "prev" 0.0; - inherit: "default" 0.0; - rel1.relative: -1.0 0.0; - rel2.relative: 0.0 1.0; - } - description { state: "next" 0.0; - inherit: "default" 0.0; - rel1.relative: 1.0 0.0; - rel2.relative: 2.0 1.0; - } } part { name: "elm.swallow.content"; type: SWALLOW; clip_to: "clip"; description { state: "default" 0.0; - rel1.to: "top"; - rel1.relative: 0.0 1.0; - rel2.to: "base"; - fixed: 1 1; - } - description { state: "title-hidden" 0.0; - inherit: "default" 0.0; rel1.to: "base"; rel1.relative: 0.0 0.0; + rel2.to: "base"; + fixed: 1 1; } } part { name: "top"; type: RECT; clip_to: "clip"; description { state: "default" 0.0; rel1.to: "base"; - rel2.to_x: "base"; - visible: 0; - } - description { state: "title-hidden" 0.0; - inherit: "default" 0.0; rel2.to: "base"; rel2.relative: 1.0 0.0; visible: 0; @@ -49,51 +29,6 @@ group { name: "elm/naviframe/item/basic/default"; } programs { program { - signal: "elm,state,title,show"; source: "elm"; - action: STATE_SET "default" 0.0; - target: "top"; - target: "elm.swallow.content"; - } - program { - signal: "elm,action,title,show"; source: "elm"; - action: STATE_SET "default" 0.0; - transition: DECELERATE 0.5; - target: "top"; - target: "elm.swallow.content"; - after: "titleshow2"; - } - program { name: "titleshow2"; - action: STATE_SET "default" 0.0; - target: "top"; - after: "title_transition_finished"; - } - program { - signal: "elm,state,title,hide"; source: "elm"; - action: STATE_SET "title-hidden" 0.0; - target: "top"; - target: "elm.swallow.content"; - } - program { - signal: "elm,action,title,hide"; source: "elm"; - action: STATE_SET "title-hidden" 0.0; - target: "top"; - after: "titlehide2"; - } - program { name: "titlehide2"; - action: STATE_SET "title-hidden" 0.0; - transition: DECEL 0.5; - target: "top"; - target: "elm.swallow.content"; - after: "title_transition_finished"; - } - program { name: "title_transition_finished"; - action: SIGNAL_EMIT "elm,action,title,transition,finished" "elm"; - } - program { - signal: "mouse,clicked,1"; source: "top"; - action: SIGNAL_EMIT "elm,action,title,clicked" "elm"; - } - program { signal: "elm,state,visible"; source: "elm"; action: STATE_SET "default" 0.0; target: "elm.swallow.content"; @@ -102,68 +37,24 @@ group { name: "elm/naviframe/item/basic/default"; /* current page is being pushed: [previous]<----[current] */ program { signal: "elm,state,cur,pushed"; source: "elm"; - action: STATE_SET "default" 0.0; - target: "base"; - after: "pushed2"; - } - program { name: "pushed2"; - action: STATE_SET "prev" 0.0; - transition: DECEL 0.5; - target: "base"; - after: "pushed3"; - } - program { name: "pushed3"; action: SIGNAL_EMIT "elm,action,pushed,finished" "elm"; } /* current page is being popped: [current]---->[next] */ program { signal: "elm,state,cur,popped"; source: "elm"; - action: STATE_SET "default" 0.0; - target: "base"; - after: "popped2"; - } - program { name: "popped2"; - action: STATE_SET "next" 0.0; - transition: DECEL 0.5; - target: "base"; - after: "popped3"; - } - program { name: "popped3"; action: SIGNAL_EMIT "elm,action,popped,finished" "elm"; } /* new page is being pushed: [current]<----[next] */ program { signal: "elm,state,new,pushed"; source: "elm"; - action: STATE_SET "next" 0.0; - target: "base"; - after: "pushedb2"; - } - program { name: "pushedb2"; - action: STATE_SET "default" 0.0; - transition: DECELERATE 0.5; - target: "base"; - after: "pushedb3"; - } - program { name: "pushedb3"; action: SIGNAL_EMIT "elm,action,show,finished" "elm"; } /* previous page is being pushed: [previous]---->[current] */ program { signal: "elm,state,prev,popped"; source: "elm"; - action: STATE_SET "prev" 0.0; - target: "base"; - after: "poppedb2"; - } - program { name: "poppedb2"; - action: STATE_SET "default" 0.0; - transition: DECELERATE 0.5; - target: "base"; - after: "poppedb3"; - } - program { name: "poppedb3"; action: SIGNAL_EMIT "elm,action,show,finished" "elm"; } } diff --git a/data/themes/default/edc/elm/progress.edc b/data/themes/default/edc/elm/progress.edc index 94cb3f0..d8b2098 100644 --- a/data/themes/default/edc/elm/progress.edc +++ b/data/themes/default/edc/elm/progress.edc @@ -89,7 +89,7 @@ group { name: "elm/progressbar/horizontal/default"; description { state: "default" 0.0; fixed: 1 1; visible: 0; - text { font: FN; size: 6; + text { font: FN; min: 0 0; text_class: "progressbar_text"; } @@ -118,7 +118,7 @@ group { name: "elm/progressbar/horizontal/default"; rel2.offset: -1 -3; color: FN_COL_DEFAULT; color_class: "progressbar_text"; - text { font: FN; size: 6; + text { font: FN; text_class: "progressbar"; min: 0 0; align: 0.0 0.5; @@ -292,7 +292,7 @@ group { name: "elm/progressbar/horizontal/default"; rel2.to: "inside"; color_class: "progress_status"; align: 1.0 0.5; - text { font: FN; size: 6; + text { font: FN; min: 0 1; text_class: "progress_status"; align: 1.0 0.5; @@ -522,7 +522,7 @@ group { name: "elm/progressbar/vertical/default"; description { state: "default" 0.0; fixed: 1 1; visible: 0; - text { font: FN; size: 6; + text { font: FN; min: 0 0; text_class: "progressbar_text"; } @@ -551,7 +551,7 @@ group { name: "elm/progressbar/vertical/default"; rel2.offset: -3 -1; color: FN_COL_DEFAULT; color_class: "progressbar_text"; - text { font: FN; size: 6; + text { font: FN; text_class: "progressbar"; min: 0 0; align: 0.5 0.0; @@ -741,7 +741,7 @@ group { name: "elm/progressbar/vertical/default"; rel2.to: "statbox"; color_class: "progress_status"; align: 1.0 0.5; - text { font: FN; size: 6; + text { font: FN; min: 0 1; text_class: "progress_status"; align: 1.0 0.5; diff --git a/data/themes/default/edc/elm/slider.edc b/data/themes/default/edc/elm/slider.edc index b39a680..1b1c324 100644 --- a/data/themes/default/edc/elm/slider.edc +++ b/data/themes/default/edc/elm/slider.edc @@ -5,7 +5,7 @@ group { name: "elm/slider/hidden/limit"; description { state: "default" 0.0; visible: 0; align: 1.0 0.5; - text { font: FN; size: 10; + text { font: FN; text_class: "slider_text"; min: 1 1; align: 0.0 0.5; @@ -18,7 +18,7 @@ group { name: "elm/slider/hidden/limit"; description { state: "default" 0.0; visible: 0; align: 1.0 0.5; - text { font: FN; size: 10; + text { font: FN; text_class: "slider_text"; min: 1 1; align: 0.0 0.5; @@ -31,31 +31,10 @@ group { name: "elm/slider/hidden/limit"; group { name: "elm/slider/horizontal/default"; alias: "elm/slider/horizontal/disabled"; - alias: "elm/slider/horizontal/media_player/position/default"; - alias: "elm/slider/horizontal/media_player/position/flush"; - alias: "elm/slider/horizontal/media_player/volume/default"; - alias: "elm/slider/horizontal/media_player/volume/flush"; images.image: "slider_run_base_horiz.png" COMP; images.image: "slider_run_bevel_horiz.png" COMP; images.image: "slider_run_base_light_horiz.png" COMP; - images.image: "horiz_glow_run.png" COMP; - images.image: "horiz_glow_run_rev.png" COMP; - images.image: "knob_round_small_normal.png" COMP; - images.image: "knob_round_small_selected.png" COMP; - set { name: "knob"; - // XXX: add more sizes (at least up to 128x128) - image { image: "knob_sz_24.png" COMP; size: 31 31 32 32; } - image { image: "knob_sz_22.png" COMP; size: 29 29 30 30; } - image { image: "knob_sz_20.png" COMP; size: 27 27 28 28; } - image { image: "knob_sz_18.png" COMP; size: 25 25 26 26; } - image { image: "knob_sz_16.png" COMP; size: 23 23 24 24; } - image { image: "knob_sz_14.png" COMP; size: 21 21 22 22; } - image { image: "knob_sz_12.png" COMP; size: 19 19 20 20; } - image { image: "knob_sz_10.png" COMP; size: 17 17 18 18; } - image { image: "knob_sz_08.png" COMP; size: 15 15 16 16; } - image { image: "knob_sz_06.png" COMP; size: 13 13 14 14; } - image { image: "knob_sz_04.png" COMP; size: 0 0 12 12; } - } + images.image: "slider_indicator_knob_horiz.png" COMP; #define ICON 1 #define LABEL 2 #define END 4 @@ -75,18 +54,14 @@ group { name: "elm/slider/horizontal/default"; if (i) { if (!d) { set_state(PART:"base", "default", 0.0); - set_state(PART:"glow", "inverted", 0.0); } else { set_state(PART:"base", "disabled", 0.0); - set_state(PART:"glow", "disabled_inverted", 0.0); } } else { if (!d) { set_state(PART:"base", "default", 0.0); - set_state(PART:"glow", "default", 0.0); } else { set_state(PART:"base", "disabled", 0.0); - set_state(PART:"glow", "disabled", 0.0); } } if (l) { @@ -137,10 +112,10 @@ group { name: "elm/slider/horizontal/default"; part { name: "elm.swallow.bar"; type: SWALLOW; scale: 1; description { state: "default" 0.0; - min: 42 21; - max: 99999 21; + min: 42 14; + max: 99999 14; align: 1.0 0.5; - rel1.to_x: "elm.text"; + rel1.to_x: "elm.swallow.icon"; rel1.relative: 1.0 0.0; rel1.offset: 2 0; rel2.to_x: "limits"; @@ -164,36 +139,6 @@ group { name: "elm/slider/horizontal/default"; image.normal: "slider_run_base_light_horiz.png"; } } - part { name: "glow"; mouse_events: 0; - description { state: "default" 0.0; - image.normal: "horiz_glow_run.png"; - rel1.offset: 1 1; - rel1.to: "base"; - rel2.relative: 0.5 1.0; - rel2.offset: -1 -2; - rel2.to_x: "button"; - rel2.to_y: "base"; - image.border: 0 4 0 0; - } - description { state: "disabled" 0.0; - inherit: "default" 0.0; - color: 255 255 255 64; - } - description { state: "inverted" 0.0; - image.normal: "horiz_glow_run_rev.png"; - rel1.relative: 0.5 0.0; - rel1.offset: 0 1; - rel1.to_x: "button"; - rel1.to_y: "base"; - rel2.offset: -2 -2; - rel2.to: "base"; - image.border: 4 0 0 0; - } - description { state: "disabled_inverted" 0.0; - inherit: "inverted" 0.0; - color: 255 255 255 64; - } - } part { name: "bevel"; mouse_events: 0; description { state: "default" 0.0; rel1.to: "base"; @@ -220,8 +165,9 @@ group { name: "elm/slider/horizontal/default"; align: 0.0 0.5; rel1.offset: 0 2; rel1.to_y: "elm.swallow.bar"; + rel1.relative: 0.0 (1/3); rel2.offset: -1 -3; - rel2.relative: 0.0 1.0; + rel2.relative: 0.0 (2/3); rel2.to_y: "elm.swallow.bar"; } description { state: "visible" 0.0; @@ -237,7 +183,7 @@ group { name: "elm/slider/horizontal/default"; description { state: "default" 0.0; fixed: 1 1; visible: 0; - text { font: FN; size: 10; + text { font: FN; min: 0 0; text_class: "slider_text"; } @@ -254,20 +200,15 @@ group { name: "elm/slider/horizontal/default"; } } part { name: "elm.text"; type: TEXT; mouse_events: 0; - effect: SHADOW BOTTOM; scale: 1; description { state: "default" 0.0; fixed: 1 1; - align: 0.0 0.5; - rel1.to_x: "elm.swallow.icon"; - rel1.relative: 1.0 0.0; - rel1.offset: -1 2; - rel2.to_x: "elm.swallow.icon"; - rel2.relative: 1.0 1.0; - rel2.offset: -1 -3; + align: 0.0 0.0; + rel1.relative: 0.0 (0/3); + rel2.relative: 0.0 (1/3); color: FN_COL_DEFAULT; color_class: "slider_text"; - text { font: FN; size: 10; + text { font: FN; text_class: "slider"; min: 0 0; align: 0.0 0.5; @@ -289,45 +230,6 @@ group { name: "elm/slider/horizontal/default"; color3: 255 255 255 255; } } - part { name: "elm.swallow.end"; type: SWALLOW; - clip_to: "dis_clip"; - description { state: "default" 0.0; - visible: 0; - align: 1.0 0.5; - rel1.offset: 0 2; - rel1.relative: 1.0 0.0; - rel2.offset: -1 -3; - } - description { state: "visible" 0.0; - inherit: "default" 0.0; - visible: 1; - aspect: 1.0 1.0; - aspect_preference: VERTICAL; - rel1.offset: -3 2; - rel2.offset: -3 -3; - } - } - part { name: "sizer.content.end"; type: TEXT; mouse_events: 0; - scale: 1; - description { state: "default" 0.0; - fixed: 1 1; - visible: 0; - text { font: FN; size: 10; - min: 0 0; - text_class: "slider_text"; - } - } - description { state: "visible" 0.0; - inherit: "default" 0.0; - rel1.to: "elm.swallow.end"; - rel2.to: "elm.swallow.end"; - text { - min: 1 1; - ellipsis: -1; - text: "M"; - } - } - } alias: "elm.units.min" "limits:elm.units.min"; alias: "elm.units.max" "limits:elm.units.max"; part { name: "limits"; type: GROUP; mouse_events: 0; @@ -351,17 +253,32 @@ group { name: "elm/slider/horizontal/default"; rel2.offset: -3 -3; } } + part { name: "sizer.content.values"; type: TEXT; mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + visible: 0; + fixed: 1 1; + rel1.relative: 0.0 (2/3); + rel2.relative: 1.0 (3/3); + text { + min: 1 1; + ellipsis: -1; + text: "M"; + } + } + } part { name: "elm.units"; type: TEXT; mouse_events: 0; - effect: SHADOW BOTTOM; scale: 1; description { state: "default" 0.0; visible: 0; fixed: 1 1; - rel1.to_x: "limits"; - rel2.to_x: "limits"; + //rel1.to_x: "limits"; + //rel2.to_x: "limits"; + rel1.relative: 0.0 (2/3); + rel2.relative: 0.0 (3/3); color: FN_COL_DEFAULT; color_class: "slider_text"; - text { font: FN; size: 10; + text { font: FN; text_class: "slider"; align: 1.0 0.5; min: 1 1; @@ -378,20 +295,47 @@ group { name: "elm/slider/horizontal/default"; color3: 255 255 255 255; } } - part { name: "button"; type: GROUP; mouse_events: 0; - source: "elm/slider/horizontal/indicator/default"; + part { name: "elm.swallow.end"; type: SWALLOW; + clip_to: "dis_clip"; description { state: "default" 0.0; - fixed: 1 1; - rel1.to: "elm.dragable.slider"; - rel2.to: "elm.dragable.slider"; + visible: 0; + align: 1.0 0.5; + // TODO move this to hug the 'units' element + rel1.relative: 1.0 (2/3); + rel2.relative: 1.0 (3/3); } - description { state: "hidden" 0.0; + description { state: "visible" 0.0; inherit: "default" 0.0; + visible: 1; + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + rel1.offset: -3 2; + rel2.offset: -3 -3; + } + } + part { name: "sizer.content.end"; type: TEXT; mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + fixed: 1 1; visible: 0; + text { font: FN; + min: 0 0; + text_class: "slider_text"; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + rel1.to: "elm.swallow.end"; + rel2.to: "elm.swallow.end"; + text { + min: 1 1; + ellipsis: -1; + text: "M"; + } } } part { name: "elm.dragable.slider"; type: RECT; - scale: 1; + scale: 0; dragable.x: 1 1 0; dragable.y: 0 0 0; dragable.confine: "elm.swallow.bar"; @@ -407,23 +351,19 @@ group { name: "elm/slider/horizontal/default"; } } part { name: "knob"; + scale: 0; description { state: "default" 0.0; - image.normal: "knob"; + image.normal: "slider_indicator_knob_horiz.png"; fixed: 1 1; - min: 12 12; - step: 2 2; - max: 32 32; // XXX allow bigger sizes with more knob images rel1.to: "elm.dragable.slider"; - rel1.offset: -4 -4; rel2.to: "elm.dragable.slider"; - rel2.offset: 3 3; } description { state: "clicked" 0.0; inherit: "default" 0.0; } } part { name: "slideevent"; type: RECT; repeat_events: 1; - scale: 1; + scale: 0; ignore_flags: ON_HOLD; dragable.events: "elm.dragable.slider"; description { state: "default" 0.0; @@ -463,34 +403,6 @@ group { name: "elm/slider/horizontal/default"; target: "knob"; } program { - signal: "elm,state,indicator,show"; source: "elm"; - action: SIGNAL_EMIT "elm,popup,show" "elm"; - after: "popup_show2"; - } - program { - signal: "elm,state,indicator,hide"; source: "elm"; - action: SIGNAL_EMIT "elm,popup,hide" "elm"; - after: "popup_hide2"; - } - program { - signal: "mouse,down,1"; source: "slideevent"; - action: SIGNAL_EMIT "elm,popup,show" "elm"; - after: "popup_show2"; - } - program { name: "popup_show2"; - action: STATE_SET "hidden" 0.0; - target: "button"; - } - program { - signal: "mouse,up,1"; source: "slideevent"; - action: SIGNAL_EMIT "elm,popup,hide" "elm"; - after: "popup_hide2"; - } - program { name: "popup_hide2"; - action: STATE_SET "default" 0.0; - target: "button"; - } - program { signal: "elm,state,text,visible"; source: "elm"; script { new m = get_int(slmode); @@ -546,11 +458,11 @@ group { name: "elm/slider/horizontal/default"; eval_mode(m); } } - program { - signal: "elm,state,units,visible"; source: "elm"; - action: SIGNAL_EMIT "limits,visible" "elm"; - target: "limits"; - } +// program { +// signal: "elm,state,units,visible"; source: "elm"; +// action: SIGNAL_EMIT "limits,visible" "elm"; +// target: "limits"; +// } program { signal: "elm,state,units,hidden"; source: "elm"; action: STATE_SET "default" 0.0; @@ -560,11 +472,11 @@ group { name: "elm/slider/horizontal/default"; eval_mode(m); } } - program { - signal: "elm,state,units,hidden"; source: "elm"; - action: SIGNAL_EMIT "limits,hide" "elm"; - target: "limits"; - } +// program { +// signal: "elm,state,units,hidden"; source: "elm"; +// action: SIGNAL_EMIT "limits,hide" "elm"; +// target: "limits"; +// } program { signal: "elm,state,inverted,on"; source: "elm"; script { @@ -606,838 +518,3 @@ group { name: "elm/slider/horizontal/default"; #undef INVERT #undef DISABLE } - -group { name: "elm/slider/horizontal/indicator/default"; - alias: "elm/slider/horizontal/indicator/disabled"; - alias: "elm/slider/horizontal/popup/default"; - alias: "elm/slider/horizontal/indicator/media_player/position/default"; - alias: "elm/slider/horizontal/indicator/media_player/position/flush"; - alias: "elm/slider/horizontal/indicator/media_player/volume/default"; - alias: "elm/slider/horizontal/indicator/media_player/volume/flush"; - images.image: "darken_rounded_square.png" COMP; - parts { - part { name: "base"; type: SPACER; - scale: 1; - description { state: "default" 0.0; - fixed: 1 1; - min: 16 16; - } - } - part { name: "clip"; type: RECT; - description { state: "default" 0.0; - fixed: 1 1; - rel1.to: "elm.indicator"; - rel1.offset: -100 -100; - rel2.to: "elm.indicator"; - rel2.offset: 99 99; - visible: 0; - } - description { state: "visible" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - part { name: "bevel"; mouse_events: 0; - clip_to: "clip"; - description { state: "default" 0.0; - rel1.offset: -12 -12; - rel1.to: "elm.indicator"; - rel2.offset: 11 11; - rel2.to: "elm.indicator"; - image.normal: "darken_rounded_square.png"; - image.border: 15 15 15 15; - fill.smooth: 0; - visible: 0; - } - description { state: "visible" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - part { name: "elm.indicator"; type: TEXT; mouse_events: 0; - clip_to: "clip"; - effect: SHADOW BOTTOM; - scale: 1; - description { state: "default" 0.0; - fixed: 1 1; - align: 0.5 1.0; - rel1.to: "base"; - rel1.relative: 0.0 -0.1; - rel1.offset: 0 -12; - rel2.to: "base"; - rel2.relative: 1.0 -0.1; - rel2.offset: -1 -12; - color_class: "slider_indicator"; - color: FN_COL_DEFAULT; - text { font: FNBD; size: 10; - min: 1 1; - align: 0.5 1.0; - text_class: "slider_indicator"; - ellipsis: -1; - } - visible: 0; - } - description { state: "visible" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - } - programs { - program { - signal: "elm,popup,show"; source: "elm"; - action: STATE_SET "visible" 0.0; - target: "elm.indicator"; - target: "bevel"; - } - program { - signal: "elm,popup,hide"; source: "elm"; - action: STATE_SET "default" 0.0; - target: "elm.indicator"; - target: "bevel"; - } - program { - signal: "elm,popup,hide"; source: "elm"; - action: SIGNAL_EMIT "elm,popup,hide,done" "elm"; - } - program { - signal: "elm,state,val,show"; source: "elm"; - action: STATE_SET "visible" 0.0; - target: "clip"; - } - program { - signal: "elm,state,val,hide"; source: "elm"; - action: STATE_SET "default" 0.0; - target: "clip"; - } - program { - signal: "elm,state,indicator,show"; source: "elm"; - action: STATE_SET "visible" 0.0; - target: "elm.indicator"; - target: "bevel"; - } - program { - signal: "elm,state,indicator,hide"; source: "elm"; - action: STATE_SET "visible" 0.0; - target: "elm.indicator"; - target: "bevel"; - } - program { - signal: "elm,state,disabled"; source: "elm"; - action: STATE_SET "disabled" 0.0; - target: "base"; - } - program { - signal: "elm,state,enabled"; source: "elm"; - action: STATE_SET "default" 0.0; - target: "base"; - } - } -} - -group { name: "elm/slider/vertical/default"; - alias: "elm/slider/vertical/disabled"; - alias: "elm/slider/vertical/media_player/position/default"; - alias: "elm/slider/vertical/media_player/position/flush"; - alias: "elm/slider/vertical/media_player/volume/default"; - alias: "elm/slider/vertical/media_player/volume/flush"; - images.image: "slider_run_base_vert.png" COMP; - images.image: "slider_run_bevel_vert.png" COMP; - images.image: "slider_run_base_light_vert.png" COMP; - images.image: "vert_glow_run.png" COMP; - images.image: "vert_glow_run_rev.png" COMP; - images.image: "knob_round_small_normal.png" COMP; - images.image: "knob_round_small_selected.png" COMP; - set { name: "knob"; - // XXX: add more sizes (at least up to 128x128) - image { image: "knob_sz_24.png" COMP; size: 31 31 32 32; } - image { image: "knob_sz_22.png" COMP; size: 29 29 30 30; } - image { image: "knob_sz_20.png" COMP; size: 27 27 28 28; } - image { image: "knob_sz_18.png" COMP; size: 25 25 26 26; } - image { image: "knob_sz_16.png" COMP; size: 23 23 24 24; } - image { image: "knob_sz_14.png" COMP; size: 21 21 22 22; } - image { image: "knob_sz_12.png" COMP; size: 19 19 20 20; } - image { image: "knob_sz_10.png" COMP; size: 17 17 18 18; } - image { image: "knob_sz_08.png" COMP; size: 15 15 16 16; } - image { image: "knob_sz_06.png" COMP; size: 13 13 14 14; } - image { image: "knob_sz_04.png" COMP; size: 0 0 12 12; } - } -#define ICON 1 -#define LABEL 2 -#define END 4 -#define UNITS 8 -#define MASK 15 -#define INVERT 16 -#define DISABLE 32 - script { - public slmode; - public eval_mode(m) { - new ic = m & ICON; - new l = m & LABEL; - new e = m & END; - new u = m & UNITS; - new d = m & DISABLE; - new i = m & INVERT; - if (i) { - if (!d) { - set_state(PART:"base", "default", 0.0); - set_state(PART:"glow", "inverted", 0.0); - } else { - set_state(PART:"base", "disabled", 0.0); - set_state(PART:"glow", "disabled_inverted", 0.0); - } - } else { - if (!d) { - set_state(PART:"base", "default", 0.0); - set_state(PART:"glow", "default", 0.0); - } else { - set_state(PART:"base", "disabled", 0.0); - set_state(PART:"glow", "disabled", 0.0); - } - } - if (l) { - if (!d) { - set_state(PART:"elm.text", "visible", 0.0); - } else { - set_state(PART:"elm.text", "disabled_visible", 0.0); - } - } else { - set_state(PART:"elm.text", "default", 0.0); - } - if (u) { - if (!d) { - set_state(PART:"elm.units", "visible", 0.0); - set_state(PART:"limits", "visible", 0.0); - } else { - set_state(PART:"elm.units", "disabled_visible", 0.0); - set_state(PART:"limits", "disabled_visible", 0.0); - } - } else { - set_state(PART:"elm.units", "default", 0.0); - set_state(PART:"limits", "default", 0.0); - } - if (ic) { - set_state(PART:"elm.swallow.icon", "visible", 0.0); - set_state(PART:"sizer.content", "visible", 0.0); - } else { - set_state(PART:"elm.swallow.icon", "default", 0.0); - set_state(PART:"sizer.content", "default", 0.0); - } - if (e) { - set_state(PART:"elm.swallow.end", "visible", 0.0); - set_state(PART:"sizer.content.end", "visible", 0.0); - } else { - set_state(PART:"elm.swallow.end", "default", 0.0); - set_state(PART:"sizer.content.end", "default", 0.0); - } - if (!d) { - set_state(PART:"event", "default", 0.0); - set_state(PART:"dis_clip", "default", 0.0); - } else { - set_state(PART:"event", "disabled", 0.0); - set_state(PART:"dis_clip", "disabled", 0.0); - } - } - } - parts { - part { name: "elm.swallow.bar"; type: SWALLOW; - scale: 1; - description { state: "default" 0.0; - min: 21 42; - max: 21 99999; - align: 0.5 1.0; - rel1.to_y: "elm.text"; - rel1.relative: 0.0 1.0; - rel1.offset: 0 2; - rel2.to_y: "limits"; - rel2.relative: 1.0 0.0; - rel2.offset: -1 -3; - } - } - part { name: "base"; mouse_events: 0; - description { state: "default" 0.0; - rel1.to: "elm.swallow.bar"; - rel2.to: "elm.swallow.bar"; - image.normal: "slider_run_base_vert.png"; - image.border: 0 0 4 4; - fill.smooth: 0; - min: 5 8; - max: 5 99999; - fixed: 1 0; - } - description { state: "disabled" 0.0; - inherit: "default" 0.0; - image.normal: "slider_run_base_light_vert.png"; - } - } - part { name: "glow"; mouse_events: 0; - description { state: "default" 0.0; - image.normal: "vert_glow_run.png"; - rel1.offset: 1 1; - rel1.to: "base"; - rel2.relative: 1.0 0.5; - rel2.offset: -2 -1; - rel2.to_y: "button"; - rel2.to_x: "base"; - image.border: 0 0 0 4; - } - description { state: "disabled" 0.0; - inherit: "default" 0.0; - color: 255 255 255 64; - } - description { state: "inverted" 0.0; - image.normal: "vert_glow_run_rev.png"; - rel1.relative: 0.0 0.5; - rel1.offset: 1 0; - rel1.to_y: "button"; - rel1.to_x: "base"; - rel2.offset: -2 -2; - rel2.to: "base"; - image.border: 0 0 4 0; - } - description { state: "disabled_inverted" 0.0; - inherit: "inverted" 0.0; - color: 255 255 255 64; - } - } - part { name: "bevel"; mouse_events: 0; - description { state: "default" 0.0; - rel1.to: "base"; - rel2.to: "base"; - image.normal: "slider_run_bevel_vert.png"; - image.border: 0 0 5 5; - fill.smooth: 0; - } - } - part { name: "dis_clip"; type: RECT; - description { state: "default" 0.0; - rel1.to: "elm.swallow.icon"; - rel2.to: "elm.swallow.end"; - } - description { state: "disabled" 0.0; - inherit: "default" 0.0; - color: 255 255 255 64; - } - } - part { name: "elm.swallow.icon"; type: SWALLOW; - clip_to: "dis_clip"; - description { state: "default" 0.0; - visible: 0; - align: 0.5 0.0; - rel1.offset: 2 0; - rel1.to_x: "elm.swallow.bar"; - rel2.offset: -3 -1; - rel2.relative: 1.0 0.0; - rel2.to_x: "elm.swallow.bar"; - } - description { state: "visible" 0.0; - inherit: "default" 0.0; - visible: 1; - aspect: 1.0 1.0; aspect_preference: VERTICAL; - rel1.offset: 2 2; - rel2.offset: -3 2; - } - } - part { name: "sizer.content"; type: TEXT; mouse_events: 0; - scale: 1; - description { state: "default" 0.0; - fixed: 1 1; - visible: 0; - text { font: FN; size: 10; - min: 0 0; - text_class: "slider_text"; - } - } - description { state: "visible" 0.0; - inherit: "default" 0.0; - rel1.to: "elm.swallow.icon"; - rel2.to: "elm.swallow.icon"; - text { - min: 1 1; - ellipsis: -1; - text: "M"; - } - } - } - part { name: "elm.text"; type: TEXT; mouse_events: 0; - effect: SHADOW BOTTOM; - scale: 1; - description { state: "default" 0.0; - fixed: 0 1; - align: 0.5 0.0; - rel1.to_y: "elm.swallow.icon"; - rel1.relative: 0.0 1.0; - rel1.offset: 2 -1; - rel2.to_y: "elm.swallow.icon"; - rel2.relative: 1.0 1.0; - rel2.offset: -3 -1; - color: FN_COL_DEFAULT; - color_class: "slider_text"; - text { font: FN; size: 10; - text_class: "slider"; - min: 1 0; - ellipsis: -1; - align: 0.5 0.0; - } - visible: 0; - } - description { state: "visible" 0.0; - inherit: "default" 0.0; - visible: 1; - rel1.offset: 2 2; - rel2.offset: -3 2; - text.min: 1 1; - text.ellipsis: -1; - - } - description { state: "disabled_visible" 0.0; - inherit: "visible" 0.0; - color_class: "slider_text_disabled"; - color3: 255 255 255 255; - } - } - part { name: "elm.swallow.end"; type: SWALLOW; - clip_to: "dis_clip"; - description { state: "default" 0.0; - visible: 0; - align: 0.5 1.0; - rel1.offset: 2 0; - rel1.relative: 0.0 1.0; - rel2.offset: -3 -1; - } - description { state: "visible" 0.0; - inherit: "default" 0.0; - visible: 1; - aspect: 1.0 1.0; - aspect_preference: VERTICAL; - rel2.offset: 2 -3; - rel2.offset: -3 -3; - } - } - part { name: "sizer.content.end"; type: TEXT; mouse_events: 0; - scale: 1; - description { state: "default" 0.0; - fixed: 1 1; - visible: 0; - text { font: FN; size: 10; - min: 0 0; - text_class: "slider_text"; - } - } - description { state: "visible" 0.0; - inherit: "default" 0.0; - rel1.to: "elm.swallow.end"; - rel2.to: "elm.swallow.end"; - text { - min: 1 1; - ellipsis: -1; - text: "M"; - } - } - } - alias: "elm.units.min" "limits:elm.units.min"; - alias: "elm.units.max" "limits:elm.units.max"; - part { name: "limits"; type: GROUP; mouse_events: 0; - source: "elm/slider/hidden/limit"; - scale: 1; - description { state: "default" 0.0; - align: 0.5 1.0; - fixed: 1 1; - max: 0 0; - rel1.to_y: "elm.swallow.end"; - rel1.relative: 0.0 0.0; - rel1.offset: 2 1; - rel2.to_y: "elm.swallow.end"; - rel2.relative: 1.0 0.0; - rel2.offset: -3 0; - } - description { state: "visible" 0.0; - inherit: "default" 0.0; - min: SOURCE; - rel1.offset: 2 -3; - rel2.offset: -3 -3; - } - } - part { name: "elm.units"; type: TEXT; mouse_events: 0; - effect: SHADOW BOTTOM; - scale: 1; - description { state: "default" 0.0; - visible: 0; - fixed: 1 1; - rel1.to_y: "limits"; - rel2.to_y: "limits"; - color: FN_COL_DEFAULT; - color_class: "slider_text"; - text { font: FN; size: 10; - text_class: "slider"; - min: 0 0; - align: 0.5 1.0; - ellipsis: -1; - } - } - description { state: "visible" 0.0; - inherit: "default" 0.0; - visible: 1; - text.min: 1 1; - text.ellipsis: -1; - } - description { state: "disabled_visible" 0.0; - inherit: "visible" 0.0; - color_class: "slider_text_disabled"; - color3: 255 255 255 255; - } - } - part { name: "button"; type: GROUP; mouse_events: 0; - source: "elm/slider/vertical/indicator/default"; - description { state: "default" 0.0; - fixed: 1 1; - rel1.to: "elm.dragable.slider"; - rel2.to: "elm.dragable.slider"; - } - description { state: "hidden" 0.0; - inherit: "default" 0.0; - visible: 0; - } - } - part { name: "elm.dragable.slider"; type: RECT; - scale: 1; - dragable.x: 0 0 0; - dragable.y: 1 1 0; - dragable.confine: "elm.swallow.bar"; - description { state: "default" 0.0; - color: 0 0 0 0; - min: 16 16; - max: 16 16; - fixed: 1 1; - rel1.relative: 0.0 0.5; - rel1.to_x: "elm.swallow.bar"; - rel2.relative: 1.0 0.5; - rel2.to_x: "elm.swallow.bar"; - } - } - part { name: "knob"; - description { state: "default" 0.0; - image.normal: "knob"; - fixed: 1 1; - min: 12 12; - step: 2 2; - max: 32 32; // XXX allow bigger sizes with more knob images - rel1.to: "elm.dragable.slider"; - rel1.offset: -4 -4; - rel2.to: "elm.dragable.slider"; - rel2.offset: 3 3; - } - description { state: "clicked" 0.0; - inherit: "default" 0.0; - } - } - part { name: "slideevent"; type: RECT; repeat_events: 1; - scale: 1; - ignore_flags: ON_HOLD; - dragable.events: "elm.dragable.slider"; - description { state: "default" 0.0; - fixed: 1 1; - rel1.to: "elm.dragable.slider"; - rel2.to: "elm.dragable.slider"; - color: 0 0 0 0; - } - } - part { name: "elm.track.slider"; type: SWALLOW; mouse_events: 0; - description { state: "default" 0.0; - max: 0 0; - rel1.to: "elm.dragable.slider"; - rel2.to: "elm.dragable.slider"; - } - } - part { name: "event"; type: RECT; - description { state: "default" 0.0; - color: 0 0 0 0; - visible: 0; - } - description { state: "disabled" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - } - programs { - program { - signal: "mouse,down,1"; source: "elm.dragable.slider"; - action: STATE_SET "clicked" 0.0; - target: "knob"; - } - program { - signal: "mouse,up,1"; source: "elm.dragable.slider"; - action: STATE_SET "default" 0.0; - target: "knob"; - } - program { - signal: "elm,state,indicator,show"; source: "elm"; - action: SIGNAL_EMIT "elm,popup,show" "elm"; - after: "popup_show2"; - } - program { - signal: "elm,state,indicator,hide"; source: "elm"; - action: SIGNAL_EMIT "elm,popup,hide" "elm"; - after: "popup_hide2"; - } - program { - signal: "mouse,down,1"; source: "slideevent"; - action: SIGNAL_EMIT "elm,popup,show" "elm"; - after: "popup_show2"; - } - program { name: "popup_show2"; - action: STATE_SET "hidden" 0.0; - target: "button"; - } - program { - signal: "mouse,up,1"; source: "slideevent"; - action: SIGNAL_EMIT "elm,popup,hide" "elm"; - after: "popup_hide2"; - } - program { name: "popup_hide2"; - action: STATE_SET "default" 0.0; - target: "button"; - } - program { - signal: "elm,state,text,visible"; source: "elm"; - script { - new m = get_int(slmode); - m |= LABEL; set_int(slmode, m); - eval_mode(m); - } - } - program { - signal: "elm,state,text,hidden"; source: "elm"; - script { - new m = get_int(slmode); - m &= ~LABEL; set_int(slmode, m); - eval_mode(m); - } - } - program { - signal: "elm,state,icon,visible"; source: "elm"; - script { - new m = get_int(slmode); - m |= ICON; set_int(slmode, m); - eval_mode(m); - } - } - program { - signal: "elm,state,icon,hidden"; source: "elm"; - script { - new m = get_int(slmode); - m &= ~ICON; set_int(slmode, m); - eval_mode(m); - } - } - program { name: "end_show"; - signal: "elm,state,end,visible"; source: "elm"; - script { - new m = get_int(slmode); - m |= END; set_int(slmode, m); - eval_mode(m); - } - } - program { name: "end_hide"; - signal: "elm,state,end,hidden"; source: "elm"; - script { - new m = get_int(slmode); - m &= ~END; set_int(slmode, m); - eval_mode(m); - } - } - program { - signal: "elm,state,units,visible"; source: "elm"; - script { - new m = get_int(slmode); - m |= UNITS; set_int(slmode, m); - eval_mode(m); - } - } - program { - signal: "elm,state,units,visible"; source: "elm"; - action: SIGNAL_EMIT "limits:limits,visible" "elm"; - } - program { - signal: "elm,state,units,hidden"; source: "elm"; - action: STATE_SET "default" 0.0; - script { - new m = get_int(slmode); - m &= ~UNITS; set_int(slmode, m); - eval_mode(m); - } - } - program { - signal: "elm,state,units,hidden"; source: "elm"; - action: SIGNAL_EMIT "limits:limits,hide" "elm"; - } - program { - signal: "elm,state,inverted,on"; source: "elm"; - script { - new m = get_int(slmode); - m |= INVERT; set_int(slmode, m); - eval_mode(m); - } - } - program { - signal: "elm,state,inverted,off"; source: "elm"; - script { - new m = get_int(slmode); - m &= ~INVERT; set_int(slmode, m); - eval_mode(m); - } - } - program { - signal: "elm,state,disabled"; source: "elm"; - script { - new m = get_int(slmode); - m |= DISABLE; set_int(slmode, m); - eval_mode(m); - } - } - program { - signal: "elm,state,enabled"; source: "elm"; - script { - new m = get_int(slmode); - m &= ~DISABLE; set_int(slmode, m); - eval_mode(m); - } - } - } -#undef ICON -#undef LABEL -#undef END -#undef UNITS -#undef MASK -#undef INVERT -#undef DISABLE -} - -group { name: "elm/slider/vertical/indicator/default"; - alias: "elm/slider/vertical/indicator/disabled"; - alias: "elm/slider/vertical/popup/default"; - alias: "elm/slider/vertical/indicator/media_player/position/default"; - alias: "elm/slider/vertical/indicator/media_player/position/flush"; - alias: "elm/slider/vertical/indicator/media_player/volume/default"; - alias: "elm/slider/vertical/indicator/media_player/volume/flush"; - images.image: "darken_rounded_square.png" COMP; - parts { - part { name: "base"; type: SPACER; - scale: 1; - description { state: "default" 0.0; - fixed: 1 1; - min: 16 16; - } - } - part { name: "clip"; type: RECT; - description { state: "default" 0.0; - fixed: 1 1; - rel1.to: "elm.indicator"; - rel1.offset: -100 -100; - rel2.to: "elm.indicator"; - rel2.offset: 99 99; - visible: 0; - } - description { state: "visible" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - part { name: "bevel"; mouse_events: 0; - clip_to: "clip"; - description { state: "default" 0.0; - rel1.offset: -12 -12; - rel1.to: "elm.indicator"; - rel2.offset: 11 11; - rel2.to: "elm.indicator"; - image.normal: "darken_rounded_square.png"; - image.border: 15 15 15 15; - fill.smooth: 0; - visible: 0; - } - description { state: "visible" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - part { name: "elm.indicator"; type: TEXT; mouse_events: 0; - clip_to: "clip"; - effect: SHADOW BOTTOM; - scale: 1; - description { state: "default" 0.0; - fixed: 1 1; - align: 0.0 0.5; - rel1.to: "base"; - rel1.relative: 1.1 0.0; - rel1.offset: 11 0; - rel2.to: "base"; - rel2.relative: 1.1 1.0; - rel2.offset: 11 -1; - color_class: "slider_indicator"; - color: FN_COL_DEFAULT; - text { font: FNBD; size: 10; - min: 1 1; - align: 0.0 0.5; - text_class: "slider_indicator"; - ellipsis: -1; - } - visible: 0; - } - description { state: "visible" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - } - programs { - program { - signal: "elm,popup,show"; source: "elm"; - action: STATE_SET "visible" 0.0; - target: "elm.indicator"; - target: "bevel"; - } - program { - signal: "elm,popup,hide"; source: "elm"; - action: STATE_SET "default" 0.0; - target: "elm.indicator"; - target: "bevel"; - } - program { - signal: "elm,popup,hide"; source: "elm"; - action: SIGNAL_EMIT "elm,popup,hide,done" "elm"; - } - program { - signal: "elm,state,val,show"; source: "elm"; - action: STATE_SET "visible" 0.0; - target: "clip"; - } - program { - signal: "elm,state,val,hide"; source: "elm"; - action: STATE_SET "default" 0.0; - target: "clip"; - } - program { - signal: "elm,state,indicator,show"; source: "elm"; - action: STATE_SET "visible" 0.0; - target: "elm.indicator"; - target: "bevel"; - } - program { - signal: "elm,state,indicator,hide"; source: "elm"; - action: STATE_SET "visible" 0.0; - target: "elm.indicator"; - target: "bevel"; - } - program { - signal: "elm,state,disabled"; source: "elm"; - action: STATE_SET "disabled" 0.0; - target: "base"; - } - program { - signal: "elm,state,enabled"; source: "elm"; - action: STATE_SET "default" 0.0; - target: "base"; - } - } -} diff --git a/data/themes/default/fnt/10x20.pcf b/data/themes/default/fnt/10x20.pcf new file mode 100644 index 0000000..039010f Binary files /dev/null and b/data/themes/default/fnt/10x20.pcf differ diff --git a/data/themes/default/fnt/4x6.pcf b/data/themes/default/fnt/4x6.pcf new file mode 100644 index 0000000..bccd0a2 Binary files /dev/null and b/data/themes/default/fnt/4x6.pcf differ diff --git a/data/themes/default/fnt/5x7.pcf b/data/themes/default/fnt/5x7.pcf new file mode 100644 index 0000000..6da1702 Binary files /dev/null and b/data/themes/default/fnt/5x7.pcf differ diff --git a/data/themes/default/fnt/5x8.pcf b/data/themes/default/fnt/5x8.pcf new file mode 100644 index 0000000..06d74f2 Binary files /dev/null and b/data/themes/default/fnt/5x8.pcf differ diff --git a/data/themes/default/fnt/6x12.pcf b/data/themes/default/fnt/6x12.pcf new file mode 100644 index 0000000..a49ea7e Binary files /dev/null and b/data/themes/default/fnt/6x12.pcf differ diff --git a/data/themes/default/fnt/6x9.pcf b/data/themes/default/fnt/6x9.pcf new file mode 100644 index 0000000..0fc174b Binary files /dev/null and b/data/themes/default/fnt/6x9.pcf differ diff --git a/data/themes/default/fnt/7x13.pcf b/data/themes/default/fnt/7x13.pcf new file mode 100644 index 0000000..6b7e1ad Binary files /dev/null and b/data/themes/default/fnt/7x13.pcf differ diff --git a/data/themes/default/fnt/8x13.pcf b/data/themes/default/fnt/8x13.pcf new file mode 100644 index 0000000..4eb4752 Binary files /dev/null and b/data/themes/default/fnt/8x13.pcf differ diff --git a/data/themes/default/fnt/9x15.pcf b/data/themes/default/fnt/9x15.pcf new file mode 100644 index 0000000..8705640 Binary files /dev/null and b/data/themes/default/fnt/9x15.pcf differ diff --git a/data/themes/default/fonts.edc b/data/themes/default/fonts.edc index c89ece8..f913bf3 100644 --- a/data/themes/default/fonts.edc +++ b/data/themes/default/fonts.edc @@ -1,19 +1,9 @@ -/*fonts { - font: "PT_Sans-Web-Regular.ttf" "PTSans"; - font: "PT_Sans-Web-Bold.ttf" "PTSans-Bold"; - font: "PT_Sans-Web-Italic.ttf" "PTSans-Italic"; - font: "PT_Sans-Web-BoldItalic.ttf" "PTSans-BoldItalic"; -} - -#define FN "PTSans" -#define FNBD "PTSans-Bold" -#define FNIT "PTSans-Italic" -#define FNBDIT "PTSans-BoldItalic" -*/ -#define FN "6x9.pcf" -#define FNBD "Sans:style=Bold" -#define FNIT "Sans:style=Oblique" -#define FNBDIT "Sans:style=Bold Italic" +/* 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 FNBD "/usr/share/fonts/X11/misc/6x13B.pcf.gz" +#define FNIT "/usr/share/fonts/X11/misc/6x130.pcf.gz" #define FN_COL_DEFAULT_BASIC 0 0 0 255 /* fonts.edc not sure if this one is neccesary */ diff --git a/data/themes/default/img/emo-very-sorry.png b/data/themes/default/img/emo-very-sorry.png index 10c4736..667a30d 100644 Binary files a/data/themes/default/img/emo-very-sorry.png and b/data/themes/default/img/emo-very-sorry.png differ diff --git a/data/themes/default/img/slider_indicator_knob_horiz.png b/data/themes/default/img/slider_indicator_knob_horiz.png new file mode 100644 index 0000000..b619fb7 Binary files /dev/null and b/data/themes/default/img/slider_indicator_knob_horiz.png differ diff --git a/packaging/debian/Makefile.am b/packaging/debian/Makefile.am index 4c3ea39..cdf960e 100644 --- a/packaging/debian/Makefile.am +++ b/packaging/debian/Makefile.am @@ -1,6 +1,3 @@ MAINTAINERCLEANFILES = Makefile.in EXTRA_DIST = changelog compat control copyright Makefile.am rules source/format -dist-hook: - chmod u+w $(distdir)/changelog - printf "eulogium (${VERSION}) UNRELEASED; urgency=low\n\n * Initial release.\n\n -- Olliver Schinagl `date -R`\n" date -R > changelog diff --git a/packaging/debian/changelog b/packaging/debian/changelog index e69de29..b7d8483 100644 --- a/packaging/debian/changelog +++ b/packaging/debian/changelog @@ -0,0 +1,5 @@ +eulogium (0.0.1-0) UNRELEASED; urgency=low + + * Initial release. + + -- Olliver Schinagl Tue, 14 Jul 2015 09:54:16 +0200 diff --git a/packaging/debian/rules b/packaging/debian/rules old mode 100755 new mode 100644 diff --git a/src/Makefile.am b/src/Makefile.am index 824e23b..0d0174f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,18 +1,23 @@ MAINTAINERCLEANFILES = Makefile.in -SUBDIRS = tests +SUBDIRS = bin_PROGRAMS = eulogium AM_CPPFLAGS = -DPACKAGE_BIN_DIR=\"$(bindir)/\" \ -DPACKAGE_LIB_DIR=\"$(bindir)/\" \ -DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \ --I$(top_builddir)/src/ \ --I$(top_srcdir)/src/ \ -@EFL_CFLAGS@ + -I$(top_builddir)/src/ \ + -I$(top_srcdir)/src/ \ + @EFL_CFLAGS@ eulogium_SOURCES = eulogium.c eulogium_item_list.c procedures.c \ - dbus_common.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 \ + dbus_common.h print_data.h network.h ui_widgets.h \ + ui_input.h settings_data.h gettext.h + eulogium_LDADD = @EFL_LIBS@ localedir = $(datadir)/locale diff --git a/src/dbus_common.c b/src/dbus_common.c index dd3bae5..6e05524 100644 --- a/src/dbus_common.c +++ b/src/dbus_common.c @@ -12,40 +12,60 @@ #include "dbus_common.h" #include "eulogium.h" #include "eulogium_item_list.h" +#include "procedures.h" -void on_method_generic_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +void on_method_generic_ret(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) { + const char *errname, *errmsg; - struct list_item *item = data; + if (eldbus_message_error_get(msg, &errname, &errmsg)) { + EINA_LOG_ERR("%s %s", errname, errmsg); + return; + } +} + +void on_method_generic_bool_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +{ const char *errname, *errmsg; - Eina_Bool state; + Eina_Bool ret; if (eldbus_message_error_get(msg, &errname, &errmsg)) { EINA_LOG_ERR("%s %s", errname, errmsg); return; } + if (!eldbus_message_arguments_get(msg, "b", &ret)) { + EINA_LOG_ERR("Signature mismatch, \"b\"."); + return; + } + if (ret) + EINA_LOG_INFO("Ran %s successfully.", (char *)data); + else + EINA_LOG_WARN("%s failed to run.", (char *)data); } +#define _TECH_ETHERNET "ethernet" +#define _TECH_WIFI "wifi" void on_method_get_network_info_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) { struct eulogium_data *eulogium = data; /* TODO replace this by making networks direct via ** */ struct network_data *networks = NULL; const char *errname, *errmsg; - Eldbus_Message_Iter *array, *net_struct; - char *obj_path, *tech, *ipv4, *ipv6, *ssid, *dummy; + Eldbus_Message_Iter *array, *array_security, *net_struct; + char *obj_path, *state, *error, *ssid, *tech, *ipv4, *ipv6, *security; + uint8_t strength, favorite, immutable, autoconnect; uint_fast16_t i = 0; if (eldbus_message_error_get(msg, &errname, &errmsg)) { EINA_LOG_ERR("%s %s", errname, errmsg); return; } - if (!eldbus_message_arguments_get(msg, "a(osssss)", &array)) { - EINA_LOG_ERR("Message content does not match expected \"a(osssss)\" signature. (%s)", eldbus_message_signature_get(msg)); + if (!eldbus_message_arguments_get(msg, "a(ossssybbbssas)", &array)) { + EINA_LOG_ERR("Message content does not match expected \"a(ossssybbbssas)\" signature. (%s)", eldbus_message_signature_get(msg)); return; } - while (eldbus_message_iter_get_and_next(array, 'r', &net_struct)) - if (!eldbus_message_iter_arguments_get(net_struct, "osssss", &obj_path, &tech, &ipv4, &ipv6, &ssid, &dummy)) { - EINA_LOG_ERR("Message content does not match expected \"osssss\" signature. (%s)", eldbus_message_signature_get(msg)); + while (eldbus_message_iter_get_and_next(array, 'r', &net_struct)) { + if (!eldbus_message_iter_arguments_get(net_struct, "ossssybbbssas", &obj_path, &state, &error, &ssid, &tech, &strength, &favorite, &immutable, &autoconnect, &ipv4, &ipv6, &array_security)) { + EINA_LOG_ERR("Message content does not match expected \"ossssybbbssas\" signature. (%s)", eldbus_message_signature_get(msg)); break; } else { networks = realloc(networks, (i + 2) * sizeof(struct network_data)); @@ -60,25 +80,59 @@ void on_method_get_network_info_ret(void *data, const Eldbus_Message *msg, Eldbu else strncpy(networks[i].obj_path, obj_path, obj_pathsize); - networks[i].tech = UNKNOWN; - if (strcmp(tech, _TECH_ETHERNET)) + networks[i].tech = TECH_UNKNOWN; + if (!strcmp(tech, _TECH_ETHERNET)) networks[i].tech = TECH_ETHERNET; - if (strcmp(tech, _TECH_WIFI)) + if (!strcmp(tech, _TECH_WIFI)) networks[i].tech = TECH_WIFI; strncpy(networks[i].ipv4, ipv4, IPV4_MAX_LEN); strncpy(networks[i].ipv6, ipv6, IPV6_MAX_LEN); strncpy(networks[i].ssid, ssid, SSID_MAX_LEN); + while (eldbus_message_iter_get_and_next(array_security, 's', &security)) + /* noop */; } i++; } + } + if (i < 1) + return; + networks[i].obj_path = NULL; /* sentinel */ eulogium->networks = networks; } -void on_signal_network_info_changed_ret(void *data, const Eldbus_Message *msg) +void on_signal_network_info_changed_ret(void *data, const Eldbus_Message *msg EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + + /* XXX TODO: Right now we ignore the received message and just assume data + * has changed and we request a new array. The received object path is thus also ignored. + */ + eldbus_proxy_call(eulogium->dbus.proxy[NETWORK], "getNetworkServicesInfo", on_method_get_network_info_ret, eulogium, -1, "b", 1); +} + +void on_method_get_procedure_metadata_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +{ + const struct procedure_data *proc = data; + const char *errname, *errmsg; + Eldbus_Message_Iter *array; + + if (eldbus_message_error_get(msg, &errname, &errmsg)) { + EINA_LOG_ERR("%s %s", errname, errmsg); /* XXX do these need to be free'ed? FIXME! YES! They do */ + return; + } + if (!eldbus_message_arguments_get(msg, "a{sv}", &array)) { + EINA_LOG_ERR("Message content does not match expected \"a{sv}\" signature. (%s)", eldbus_message_signature_get(msg)); /* XXX this return value may need to be freed actually!! Yep they do.*/ + return; + } + eldbus_message_iter_dict_iterate(array, "sv", proc->parser, proc); +} + +/* XXX we are likely not getting a signal, but will deal with this on procedure start and procedure finished. */ +void on_signal_procedure_metadata_changed_ret(void *data, const Eldbus_Message *msg) { - on_method_get_network_info_ret(data, msg, NULL); + on_method_get_procedure_metadata_ret(data, msg, NULL); } void on_method_is_network_powered_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) diff --git a/src/dbus_common.h b/src/dbus_common.h index fc3af51..95f1e30 100644 --- a/src/dbus_common.h +++ b/src/dbus_common.h @@ -24,10 +24,13 @@ struct dbus_handle { void *set_data; }; -void on_method_generic_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED); +void on_method_generic_ret(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED); +void on_method_generic_bool_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED); void on_method_get_network_info_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED); void on_signal_network_info_changed_ret(void *data, const Eldbus_Message *msg); void on_method_is_network_powered_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED); void on_signal_network_power_changed_ret(void *data, const Eldbus_Message *msg); +void on_method_get_procedure_metadata_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED); +void on_signal_procedure_metadata_changed_ret(void *data, const Eldbus_Message *msg); #endif /* _DBUS_COMMON_H */ diff --git a/src/eulogium.c b/src/eulogium.c index 280e204..973965e 100644 --- a/src/eulogium.c +++ b/src/eulogium.c @@ -16,40 +16,26 @@ #include "dbus_common.h" #include "eulogium.h" #include "eulogium_item_list.h" -#include "eulogium_private.h" #include "gettext.h" +#include "network.h" +#include "print_data.h" #include "procedures.h" +#include "settings_data.h" +#include "ui_input.h" #include "ui_widgets.h" #define COPYRIGHT "Copyright © 2015 Olliver Schinagl and various contributors (see AUTHORS)." -#define SECOND 1UL -#define MINUTE (60UL * SECOND) -#define HOUR (60UL * MINUTE) -#define DAY (24UL * HOUR) -#define WEEK (7UL * DAY) -#define MONTH (4UL * WEEK) -#define YEAR (52UL * WEEK) - -int INPUT_MOUSE_WHEEL_UP = 0; /* For custom ecore_event handling */ -int INPUT_MOUSE_WHEEL_DOWN = 0; /* For custom ecore_event handling */ - -/* TODO this LUT can be much improved */ -char *griffin_print_status[] = { - gettext_noop("Unknown"), - gettext_noop("Disconnected"), - gettext_noop("Error"), - gettext_noop("First Run Wizard"), - gettext_noop("IDLE"), - gettext_noop("Slicing"), - gettext_noop("Heating"), - gettext_noop("Printing"), - gettext_noop("Cooling down"), - gettext_noop("Wait for Removal"), - gettext_noop("Paused"), -}; +#define SECOND 1L +#define MINUTE (60L * SECOND) +#define HOUR (60L * MINUTE) +#define DAY (24L * HOUR) +#define WEEK (7L * DAY) +#define MONTH (4L * WEEK) +#define YEAR (52L * WEEK) /* TODO Create def for a menu/screen to house all the buttons */ +/* BTN is better then but-sex. */ static void _on_print_abort_ret(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED); static void _cb_content_prev_set(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); @@ -82,6 +68,7 @@ static void _but_settings_hotend_2_cb(void *data, Evas_Object *object EINA_UNUSE static void _but_change_hotend_1_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED); static void _but_change_hotend_2_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED); static void _but_network_info_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_software_version_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED); static void _but_settings_network_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); static void _but_settings_language_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); static void _but_settings_hotend_1_offset_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); @@ -89,13 +76,39 @@ static void _but_settings_hotend_2_offset_cb(void *data, Evas_Object *obj EINA_U static void _but_material_customize_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); static void _but_print_tune_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); static void _but_settings_led_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_led_hue_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_led_saturation_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); static void _but_led_brightness_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_bed_heatup_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_hotend_heatup_0_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_hotend_heatup_1_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_print_speed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_fan_speed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_flow_rate_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_retraction_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_retraction_length_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_retraction_speed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_retraction_zhop_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_bed_level_auto_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_bed_raise_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_bed_move_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_bed_home_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_head_home_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_material_move_0_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_material_move_1_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_motion_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_jerk_xy_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_jerk_z_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_current_xy_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_current_z_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_current_e_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); +static void _but_hotend_active_set_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); /* Buttons */ static struct button_def but_return = { - .text = gettext_noop("RETURN"), + .text = N_("RETURN"), .cb = { - .func = _cb_content_prev_set, + .func = &_cb_content_prev_set, .data = NULL, .info = "return button pressed", }, @@ -105,7 +118,7 @@ static struct button_def but_return = { static struct button_def but_print_abort_confirm = { .text = "ABORT", .cb = { - .func = _print_abort_confirm_cb, + .func = &_print_abort_confirm_cb, .data = NULL, .info = "print abort confirm button pressed", }, @@ -115,7 +128,7 @@ static struct button_def but_print_abort_confirm = { static struct button_def but_print_abort = { .text = "Yes", .cb = { - .func = _print_abort_cb, + .func = &_print_abort_cb, .data = NULL, .info = "print abort button pressed", }, @@ -125,7 +138,7 @@ static struct button_def but_print_abort = { static struct button_def but_print_tune = { .text = "TUNE", .cb = { - .func = _but_print_tune_cb, + .func = &_but_print_tune_cb, .data = NULL, .info = "tune progress button pressed", }, @@ -135,7 +148,7 @@ static struct button_def but_print_tune = { static struct button_def but_main_print = { .text = "PRINT", .cb = { - .func = _cb_button_main_print, + .func = &_cb_button_main_print, .data = NULL, .info = "print button pressed", }, @@ -145,7 +158,7 @@ static struct button_def but_main_print = { static struct button_def but_print_ignore = { .text = "IGNORE THIS JOB", .cb = { - .func = _print_ignore_cb, + .func = &_print_ignore_cb, .data = NULL, .info = "print ignore button pressed", }, @@ -155,7 +168,7 @@ static struct button_def but_print_ignore = { static struct button_def but_print_local = { .text = "LOCAL", .cb = { - .func = _but_print_local_cb, + .func = &_but_print_local_cb, .data = NULL, .info = "local storage button pressed", }, @@ -165,7 +178,7 @@ static struct button_def but_print_local = { static struct button_def but_print_mmc = { .text = "SD", .cb = { - .func = _but_print_usb_cb, + .func = &_but_print_usb_cb, .data = NULL, .info = "usb storage button pressed", }, @@ -175,7 +188,7 @@ static struct button_def but_print_mmc = { static struct button_def but_print_usb = { .text = "USB", .cb = { - .func = _but_print_usb_cb, + .func = &_but_print_usb_cb, .data = NULL, .info = "usb storage button pressed", }, @@ -185,7 +198,7 @@ static struct button_def but_print_usb = { static struct button_def but_main_mathot = { .text = "MATERIAL
/HOT END", .cb = { - .func = _but_main_mathot_cb, + .func = &_but_main_mathot_cb, .data = NULL, .info = "material / hot-end button pressed", }, @@ -195,7 +208,7 @@ static struct button_def but_main_mathot = { static struct button_def but_mathot_material = { .text = "MATERIAL", .cb = { - .func = _but_mathot_material_cb, + .func = &_but_mathot_material_cb, .data = NULL, .info = "material button pressed", }, @@ -205,7 +218,7 @@ static struct button_def but_mathot_material = { static struct button_def but_mathot_hotend = { .text = "HOT END", .cb = { - .func = _but_mathot_hotend_cb, + .func = &_but_mathot_hotend_cb, .data = NULL, .info = "hot-end button pressed", }, @@ -215,7 +228,7 @@ static struct button_def but_mathot_hotend = { static struct button_def but_main_system = { .text = "SYSTEM", .cb = { - .func = _but_main_system_cb, + .func = &_but_main_system_cb, .data = NULL, .info = "system button pressed", }, @@ -225,7 +238,7 @@ static struct button_def but_main_system = { static struct button_def but_system_maintenance = { .text = "MAINTE-
NANCE", .cb = { - .func = _but_system_maintenance_cb, + .func = &_but_system_maintenance_cb, .data = NULL, .info = "maintenance button pressed", }, @@ -235,7 +248,7 @@ static struct button_def but_system_maintenance = { static struct button_def but_system_settings = { .text = "SETTINGS", .cb = { - .func = _but_system_settings_cb, + .func = &_but_system_settings_cb, .data = NULL, }, .data = NULL, @@ -244,7 +257,7 @@ static struct button_def but_system_settings = { static struct button_def but_material_change = { .text = "CHANGE", .cb = { - .func = _but_material_change_cb, + .func = &_but_material_change_cb, .data = NULL, }, .data = NULL, @@ -253,7 +266,7 @@ static struct button_def but_material_change = { static struct button_def but_material_settings = { .text = "SETTINGS", .cb = { - .func = _but_material_settings_cb, + .func = &_but_material_settings_cb, .data = NULL, }, .data = NULL, @@ -262,7 +275,7 @@ static struct button_def but_material_settings = { static struct button_def but_settings_material_1 = { .text = "MATERIAL 1", .cb = { - .func = _but_settings_material_1_cb, /* XXX we should make 1/2 a var */ + .func = &_but_settings_material_1_cb, /* XXX we should make 1/2 a var */ .data = NULL, }, .data = NULL, @@ -271,7 +284,7 @@ static struct button_def but_settings_material_1 = { static struct button_def but_settings_material_2 = { .text = "MATERIAL 2", .cb = { - .func = _but_settings_material_2_cb, /* XXX we should make 1/2 a var */ + .func = &_but_settings_material_2_cb, /* XXX we should make 1/2 a var */ .data = NULL, }, .data = NULL, @@ -280,7 +293,7 @@ static struct button_def but_settings_material_2 = { static struct button_def but_change_material_1 = { .text = "MATERIAL 1", .cb = { - .func = _but_change_material_1_cb, /* XXX we should make 1/2 a var */ + .func = &_but_change_material_1_cb, /* XXX we should make 1/2 a var */ .data = NULL, }, .data = NULL, @@ -289,7 +302,7 @@ static struct button_def but_change_material_1 = { static struct button_def but_change_material_2 = { .text = "MATERIAL 2", .cb = { - .func = _but_change_material_2_cb, /* XXX we should make 1/2 a var */ + .func = &_but_change_material_2_cb, /* XXX we should make 1/2 a var */ .data = NULL, }, .data = NULL, @@ -298,7 +311,7 @@ static struct button_def but_change_material_2 = { static struct button_def but_hotend_change = { .text = "CHANGE", .cb = { - .func = _but_hotend_change_cb, + .func = &_but_hotend_change_cb, .data = NULL, }, .data = NULL, @@ -307,7 +320,7 @@ static struct button_def but_hotend_change = { static struct button_def but_hotend_settings = { .text = "SETTINGS", .cb = { - .func = _but_hotend_settings_cb, + .func = &_but_hotend_settings_cb, .data = NULL, }, .data = NULL, @@ -316,7 +329,7 @@ static struct button_def but_hotend_settings = { static struct button_def but_settings_hotend_1 = { .text = "HOT END 1", .cb = { - .func = _but_settings_hotend_1_cb, /* XXX we should make 1/2 a var */ + .func = &_but_settings_hotend_1_cb, /* XXX we should make 1/2 a var */ .data = NULL, }, .data = NULL, @@ -325,7 +338,7 @@ static struct button_def but_settings_hotend_1 = { static struct button_def but_settings_hotend_2 = { .text = "HOT END 2", .cb = { - .func = _but_settings_hotend_2_cb, /* XXX we should make 1/2 a var */ + .func = &_but_settings_hotend_2_cb, /* XXX we should make 1/2 a var */ .data = NULL, }, .data = NULL, @@ -334,7 +347,7 @@ static struct button_def but_settings_hotend_2 = { static struct button_def but_change_hotend_1 = { .text = "HOT END 1", .cb = { - .func = _but_change_hotend_1_cb, /* XXX we should make 1/2 a var */ + .func = &_but_change_hotend_1_cb, /* XXX we should make 1/2 a var */ .data = NULL, }, .data = NULL, @@ -343,7 +356,7 @@ static struct button_def but_change_hotend_1 = { static struct button_def but_change_hotend_2 = { .text = "HOT END 2", .cb = { - .func = _but_change_hotend_2_cb, /* XXX we should make 1/2 a var */ + .func = &_but_change_hotend_2_cb, /* XXX we should make 1/2 a var */ .data = NULL, }, .data = NULL, @@ -355,11 +368,11 @@ static struct menu_def menu_system_settings = { .entry = { { .icon = "user-home", - .label = gettext_noop("Return"), + .label = N_("Return"), .item = {.type = LIST_ITEM_BUTTON}, - .footer = gettext_noop("Return to Main menu"), + .footer = N_("Return to Main menu"), .footer_alt = NULL, - .func = _cb_content_prev_set, + .func = &_cb_content_prev_set, .toggle_timer = NULL, .data = NULL, }, { @@ -368,7 +381,7 @@ static struct menu_def menu_system_settings = { .item = {.type = LIST_ITEM_BUTTON}, .footer = "Change language", .footer_alt = NULL, - .func = _but_settings_language_cb, + .func = &_but_settings_language_cb, .toggle_timer = NULL, .data = NULL, }, { @@ -377,7 +390,7 @@ static struct menu_def menu_system_settings = { .item = {.type = LIST_ITEM_BUTTON}, .footer = "Manage connectivity", .footer_alt = "WiFi & Ethernet", - .func = _but_settings_network_cb, + .func = &_but_settings_network_cb, .toggle_timer = NULL, .data = NULL, }, { @@ -386,7 +399,7 @@ static struct menu_def menu_system_settings = { .item = {.type = LIST_ITEM_BUTTON}, .footer = "Adjust offset", .footer_alt = NULL, - .func = _but_settings_hotend_1_offset_cb, + .func = &_but_settings_hotend_1_offset_cb, .toggle_timer = NULL, .data = NULL, /* hot end 1 pointer? */ }, { @@ -395,19 +408,10 @@ static struct menu_def menu_system_settings = { .end = NULL, .footer = "Adjust offset", .footer_alt = NULL, - .func = _but_settings_hotend_2_offset_cb, + .func = &_but_settings_hotend_2_offset_cb, .toggle_timer = NULL, .data = NULL, /* hot end 2 pointer? */ - }, { - .icon = NULL, - .label = "Feeder power", - .end = NULL, - .footer = "Adjust power ", - .footer_alt = NULL, - .func = NULL, - .toggle_timer = NULL, - .data = NULL, - }, { + }, {/* .icon = NULL, .label = "Filament detection", .end = NULL, @@ -416,16 +420,16 @@ static struct menu_def menu_system_settings = { .func = NULL, .toggle_timer = NULL, .data = NULL, - }, { + }, {*/ .icon = NULL, .label = "Camera", .end = NULL, .footer = NULL, .footer_alt = NULL, - .func = NULL, + .func = NULL, /* Menu to rfkill */ .toggle_timer = NULL, .data = NULL, - }, { + }, {/* .icon = NULL, .label = "Internal storage", .end = NULL, @@ -434,13 +438,13 @@ static struct menu_def menu_system_settings = { .func = NULL, .toggle_timer = NULL, .data = NULL, - }, { + }, {*/ .icon = NULL, .label = "LED settings", .end = NULL, .footer = NULL, .footer_alt = NULL, - .func = _but_settings_led_cb, + .func = &_but_settings_led_cb, .toggle_timer = NULL, .data = NULL, }, { @@ -449,16 +453,16 @@ static struct menu_def menu_system_settings = { .end = NULL, .footer = NULL, .footer_alt = NULL, - .func = NULL, + .func = &_but_retraction_cb, .toggle_timer = NULL, .data = NULL, }, { .icon = NULL, - .label = "Motion", + .label = "Motion settings", .end = NULL, .footer = NULL, .footer_alt = NULL, - .func = NULL, + .func = &_but_motion_cb, .data = NULL, }, { .icon = NULL, @@ -466,7 +470,7 @@ static struct menu_def menu_system_settings = { .end = NULL, .footer = NULL, .footer_alt = NULL, - .func = NULL, + .func = &_but_software_version_cb, .toggle_timer = NULL, .data = NULL, }, { @@ -493,25 +497,25 @@ static struct menu_def menu_settings_network = { .item = {.type = LIST_ITEM_BUTTON}, .footer = "Return to Main menu", .footer_alt = NULL, - .func = _cb_content_prev_set, + .func = &_cb_content_prev_set, .toggle_timer = NULL, .data = NULL, }, { .icon = NULL, .label = "Network info", - .end = NULL, + .item = {.type = LIST_ITEM_BUTTON}, .footer = NULL, .footer_alt = NULL, - .func = _but_network_info_cb, + .func = &_but_network_info_cb, .toggle_timer = NULL, .data = NULL, }, { .icon = NULL, .label = "Manage WiFi", - .end = NULL, + .item = {.type = LIST_ITEM_BUTTON}, .footer = "Connect or forget", .footer_alt = NULL, - .func = _network_wifi_manage_cb, + .func = &_network_wifi_manage_cb, .toggle_timer = NULL, .data = NULL, }, { @@ -525,16 +529,16 @@ static struct menu_def menu_settings_network = { .dbus = { /* .proxy = NULL; TODO keep a link to the proxy that is responsible for this item. */ .signal = "EthernetPowerChanged", - .sig_cb = on_signal_network_power_changed_ret, + .sig_cb = &on_signal_network_power_changed_ret, .get = "isEthernetPowered", - .get_cb = on_method_is_network_powered_ret, + .get_cb = &on_method_is_network_powered_ret, .set = "setEthernetPower", - .set_cb = on_method_generic_ret, + .set_cb = &on_method_generic_ret, }, .end = NULL, .footer = NULL, .footer_alt = NULL, - .func = _set_ethernet_power_cb, /* TODO _set_network_power can be possible */ + .func = &_set_ethernet_power_cb, /* TODO _set_network_power can be possible */ .toggle_timer = NULL, .data = NULL, }, { @@ -547,16 +551,16 @@ static struct menu_def menu_settings_network = { }, .dbus = { .signal = "WifiPowerChanged", - .sig_cb = on_signal_network_power_changed_ret, + .sig_cb = &on_signal_network_power_changed_ret, .get = "isWifiPowered", - .get_cb = on_method_is_network_powered_ret, + .get_cb = &on_method_is_network_powered_ret, .set = "setWifiPower", - .set_cb = on_method_generic_ret, + .set_cb = &on_method_generic_ret, }, .end = NULL, .footer = NULL, .footer_alt = NULL, - .func = _set_wifi_power_cb, + .func = &_set_wifi_power_cb, .toggle_timer = NULL, .data = NULL, }, { @@ -568,17 +572,17 @@ static struct menu_def menu_settings_network = { ._widget = NULL, }, .dbus = { - .signal = "HotspotPowerChanged", - .sig_cb = on_signal_network_power_changed_ret, - .get = "isHotspotPowered", - .get_cb = on_method_is_network_powered_ret, - .set = "setHotspotPower", - .set_cb = on_method_generic_ret, + .signal = "HotspotEnabledChanged", + .sig_cb = &on_signal_network_power_changed_ret, + .get = "isHotspotEnabled", + .get_cb = &on_method_is_network_powered_ret, + .set = "setHotspotEnable", + .set_cb = &on_method_generic_ret, }, .footer = NULL, .footer_alt = NULL, .end = NULL, - .func = _set_hotspot_power_cb, + .func = &_set_hotspot_power_cb, .toggle_timer = NULL, .data = NULL, }, { NULL }, /* sentinel */ @@ -594,21 +598,129 @@ static struct menu_def menu_settings_language = { { .icon = "user-home", .label = "Return", - .end = NULL, + .item = {.type = LIST_ITEM_BUTTON}, .footer = "Return to Main menu", .footer_alt = NULL, - .func = _cb_content_prev_set, + .func = &_cb_content_prev_set, .toggle_timer = NULL, .data = NULL, }, { .icon = NULL, .label = "English", - .end = NULL, + .item = {.type = LIST_ITEM_BUTTON}, .footer = "Welcome", .footer_alt = NULL, .func = NULL, .toggle_timer = NULL, .data = NULL, + }, { + .icon = NULL, + .label = "Nederlands", + .item = {.type = LIST_ITEM_BUTTON}, + .footer = "Welkom", + .footer_alt = NULL, + .func = NULL, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Turkish", + .item = {.type = LIST_ITEM_BUTTON}, + .footer = "Hoşgeldin", + .footer_alt = NULL, + .func = NULL, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Croatian", + .item = {.type = LIST_ITEM_BUTTON}, + .footer = "dobrodošli", + .footer_alt = NULL, + .func = NULL, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Hungarian", + .item = {.type = LIST_ITEM_BUTTON}, + .footer = "Üdvözöljük", + .footer_alt = NULL, + .func = NULL, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Russian", + .item = {.type = LIST_ITEM_BUTTON}, + .footer = "добро пожаловать", + .footer_alt = NULL, + .func = NULL, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Greek", + .item = {.type = LIST_ITEM_BUTTON}, + .footer = "καλωσόρισμα", + .footer_alt = NULL, + .func = NULL, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Hebrew", + .item = {.type = LIST_ITEM_BUTTON}, + .footer = "ברוכים הבאים", + .footer_alt = NULL, + .func = NULL, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Arabic", + .item = {.type = LIST_ITEM_BUTTON}, + .footer = "أهلا بك", + .footer_alt = NULL, + .func = NULL, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Hindi", + .item = {.type = LIST_ITEM_BUTTON}, + .footer = "स्वागत", + .footer_alt = NULL, + .func = NULL, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Chinese (traditional)", + .item = {.type = LIST_ITEM_BUTTON}, + .footer = "歡迎", + .footer_alt = NULL, + .func = NULL, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Thai", + .item = {.type = LIST_ITEM_BUTTON}, + .footer = "ยินดีต้อนรับ", + .footer_alt = NULL, + .func = NULL, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Georgian", + .item = {.type = LIST_ITEM_BUTTON}, + .footer = "კეთილი", + .footer_alt = NULL, + .func = NULL, + .toggle_timer = NULL, + .data = NULL, }, { NULL }, /* sentinel */ }, .data = NULL, @@ -624,7 +736,7 @@ static struct menu_def menu_settings_hotend_1_offset = { .end = NULL, .footer = "Return to Main menu", .footer_alt = NULL, - .func = _cb_content_prev_set, + .func = &_cb_content_prev_set, .toggle_timer = NULL, .data = NULL, }, { @@ -696,7 +808,7 @@ static struct menu_def menu_settings_hotend_2_offset = { .end = NULL, .footer = "Return to Main menu", .footer_alt = NULL, - .func = _cb_content_prev_set, + .func = &_cb_content_prev_set, .toggle_timer = NULL, .data = NULL, }, { @@ -768,7 +880,7 @@ static struct menu_def menu_system_maintenance = { .end = NULL, .footer = "Return to Main menu", .footer_alt = NULL, - .func = _cb_content_prev_set, + .func = &_cb_content_prev_set, .toggle_timer = NULL, .data = NULL, }, { @@ -782,11 +894,20 @@ static struct menu_def menu_system_maintenance = { .data = NULL, }, { .icon = NULL, - .label = "Level buildplate", + .label = "Speed", + .end = NULL, + .footer = "100 %", + .footer_alt = NULL, + .func = &_but_print_speed_cb, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Auto Level buildplate", .end = NULL, .footer = NULL, .footer_alt = NULL, - .func = NULL, + .func = &_but_bed_level_auto_cb, .toggle_timer = NULL, .data = NULL, }, { @@ -795,7 +916,7 @@ static struct menu_def menu_system_maintenance = { .end = NULL, .footer = NULL, .footer_alt = NULL, - .func = NULL, + .func = &_but_bed_heatup_cb, .toggle_timer = NULL, .data = NULL, }, { @@ -804,7 +925,7 @@ static struct menu_def menu_system_maintenance = { .end = NULL, .footer = NULL, .footer_alt = NULL, - .func = NULL, + .func = &_but_bed_home_cb, .toggle_timer = NULL, .data = NULL, }, { @@ -813,25 +934,25 @@ static struct menu_def menu_system_maintenance = { .end = NULL, .footer = NULL, .footer_alt = NULL, - .func = NULL, + .func = &_but_bed_raise_cb, .toggle_timer = NULL, .data = NULL, }, { .icon = NULL, - .label = "Home head", + .label = "Move buildplate", .end = NULL, .footer = NULL, .footer_alt = NULL, - .func = NULL, + .func = &_but_bed_move_cb, .toggle_timer = NULL, .data = NULL, }, { .icon = NULL, - .label = "Printhead tray", + .label = "Home head", .end = NULL, .footer = NULL, .footer_alt = NULL, - .func = NULL, + .func = &_but_head_home_cb, .toggle_timer = NULL, .data = NULL, }, { @@ -840,7 +961,7 @@ static struct menu_def menu_system_maintenance = { .end = NULL, .footer = NULL, .footer_alt = NULL, - .func = NULL, + .func = &_but_hotend_heatup_0_cb, .toggle_timer = NULL, .data = NULL, }, { @@ -849,25 +970,69 @@ static struct menu_def menu_system_maintenance = { .end = NULL, .footer = NULL, .footer_alt = NULL, - .func = NULL, + .func = &_but_hotend_heatup_1_cb, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Switch active hotend", + .end = NULL, + .footer = "Hotend 1 active", + .footer_alt = NULL, + .func = &_but_hotend_active_set_cb, .toggle_timer = NULL, .data = NULL, }, { .icon = NULL, - .label = "Set fan speed", + .label = "Fan speed", .end = NULL, .footer = NULL, .footer_alt = NULL, - .func = NULL, + .func = &_but_fan_speed_cb, .toggle_timer = NULL, .data = NULL, }, { .icon = NULL, - .label = "Move material", + .label = "Material flow", .end = NULL, .footer = NULL, .footer_alt = NULL, - .func = NULL, + .func = &_but_flow_rate_cb, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Retraction material", + .end = NULL, + .footer = "Length/Speed/ZHop", + .footer_alt = NULL, + .func = &_but_retraction_cb, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Motion settings", + .end = NULL, + .footer = NULL, + .footer_alt = NULL, + .func = &_but_motion_cb, + .data = NULL, + }, { + .icon = NULL, + .label = "Move material left feeder", + .end = NULL, + .footer = NULL, + .footer_alt = NULL, + .func = &_but_material_move_0_cb, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Move material right feeder", + .end = NULL, + .footer = NULL, + .footer_alt = NULL, + .func = &_but_material_move_1_cb, .toggle_timer = NULL, .data = NULL, }, { @@ -904,7 +1069,7 @@ static struct menu_def menu_material_1 = { .end = NULL, .footer = "Return to Main menu", .footer_alt = NULL, - .func = _cb_content_prev_set, + .func = &_cb_content_prev_set, .toggle_timer = NULL, .data = NULL, }, { @@ -994,7 +1159,7 @@ static struct menu_def menu_material_2 = { .end = NULL, .footer = "Return to Main menu", .footer_alt = NULL, - .func = _cb_content_prev_set, + .func = &_cb_content_prev_set, .toggle_timer = NULL, .data = NULL, }, { @@ -1084,7 +1249,7 @@ static struct menu_def menu_material_customize = { .end = NULL, .footer = "Return to Main menu", .footer_alt = NULL, - .func = _cb_content_prev_set, + .func = &_cb_content_prev_set, .toggle_timer = NULL, .data = NULL, }, { @@ -1174,7 +1339,7 @@ static struct menu_def menu_settings_led = { .item = {.type = LIST_ITEM_BUTTON}, .footer = "Return to Main menu", .footer_alt = NULL, - .func = _cb_content_prev_set, + .func = &_cb_content_prev_set, .toggle_timer = NULL, .data = NULL, }, { @@ -1183,7 +1348,7 @@ static struct menu_def menu_settings_led = { .item = {.type = LIST_ITEM_BUTTON}, .footer = "100%", .footer_alt = NULL, - .func = _but_led_brightness_cb, + .func = _but_led_hue_cb, .toggle_timer = NULL, .data = NULL, }, { @@ -1192,7 +1357,7 @@ static struct menu_def menu_settings_led = { .item = {.type = LIST_ITEM_BUTTON}, .footer = "100%", .footer_alt = NULL, - .func = _but_led_brightness_cb, + .func = _but_led_saturation_cb, .toggle_timer = NULL, .data = NULL, }, { @@ -1255,19 +1420,19 @@ static struct menu_def menu_print_tune = { { .icon = "user-home", .label = "Return", - .end = NULL, + .item = {.type = LIST_ITEM_BUTTON}, .footer = "Return to print", .footer_alt = NULL, - .func = _cb_content_prev_set, + .func = &_cb_content_prev_set, .toggle_timer = NULL, .data = NULL, }, { .icon = NULL, .label = "Networking", - .end = NULL, + .item = {.type = LIST_ITEM_BUTTON}, .footer = "IP: ", .footer_alt = NULL, - .func = _but_settings_network_cb, + .func = &_but_settings_network_cb, .toggle_timer = NULL, .data = NULL, }, { @@ -1276,16 +1441,25 @@ static struct menu_def menu_print_tune = { .end = NULL, .footer = "100 %", .footer_alt = NULL, - .func = NULL, + .func = &_but_print_speed_cb, .toggle_timer = NULL, .data = NULL, }, { .icon = NULL, - .label = "Hotend temperature", + .label = "Hotend 1 temperature", .end = NULL, .footer = "210 °C", .footer_alt = NULL, - .func = NULL, + .func = &_but_hotend_heatup_0_cb, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Hotend 2 temperature", + .end = NULL, + .footer = "210 °C", + .footer_alt = NULL, + .func = &_but_hotend_heatup_1_cb, .toggle_timer = NULL, .data = NULL, }, { @@ -1294,7 +1468,7 @@ static struct menu_def menu_print_tune = { .end = NULL, .footer = "60 °C", .footer_alt = NULL, - .func = NULL, + .func = &_but_bed_heatup_cb, .toggle_timer = NULL, .data = NULL, }, { @@ -1303,7 +1477,7 @@ static struct menu_def menu_print_tune = { .end = NULL, .footer = "100 %", .footer_alt = NULL, - .func = NULL, + .func = &_but_fan_speed_cb, .toggle_timer = NULL, .data = NULL, }, { @@ -1312,34 +1486,70 @@ static struct menu_def menu_print_tune = { .end = NULL, .footer = "100 %", .footer_alt = NULL, - .func = NULL, + .func = &_but_flow_rate_cb, .toggle_timer = NULL, .data = NULL, }, { .icon = NULL, - .label = "Retraction hotend", + .label = "Retraction material", .end = NULL, - .footer = "Up", + .footer = "Length/Speed", .footer_alt = NULL, - .func = NULL, + .func = &_but_retraction_cb, .toggle_timer = NULL, .data = NULL, }, { .icon = NULL, - .label = "LED Brightness", + .label = "LED Settings", .end = NULL, - .footer = "100 %", + .footer = "Change led settings", .footer_alt = NULL, - .func = NULL, + .func = &_but_settings_led_cb, + .toggle_timer = NULL, + .data = NULL, + }, { NULL }, /* sentinel */ + }, + .data = NULL, +}; + +static struct menu_def menu_retraction = { + .title = "RETRACTION", + .type = LIST_MENU, + .entry = { + { + .icon = "user-home", + .label = "Return", + .end = NULL, + .footer = "Return to Main menu", + .footer_alt = NULL, + .func = &_cb_content_prev_set, .toggle_timer = NULL, .data = NULL, }, { .icon = NULL, - .label = "Material/Nozzle", + .label = "Retraction length", .end = NULL, - .footer = "PLA | PVA", - .footer_alt = "RVS | Bronze", - .func = NULL, + .footer = " mm", + .footer_alt = NULL, + .func = &_but_retraction_length_cb, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Retraction speed", + .end = NULL, + .footer = " mm / sec", + .footer_alt = NULL, + .func = &_but_retraction_speed_cb, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Retraction Z-hop", + .end = NULL, + .footer = " mm", + .footer_alt = NULL, + .func = &_but_retraction_zhop_cb, .toggle_timer = NULL, .data = NULL, }, { NULL }, /* sentinel */ @@ -1347,10 +1557,8 @@ static struct menu_def menu_print_tune = { .data = NULL, }; -#if 0 -menu template; TODO make nice macro for entries -static struct menu_def menu_ = { - .title = "", +static struct menu_def menu_motion = { + .title = "MOTION", .type = LIST_MENU, .entry = { { @@ -1359,45 +1567,415 @@ static struct menu_def menu_ = { .end = NULL, .footer = "Return to Main menu", .footer_alt = NULL, - .func = _cb_content_prev_set, + .func = &_cb_content_prev_set, .toggle_timer = NULL, .data = NULL, }, { .icon = NULL, - .label = "", + .label = "X/Y Jerk", .end = NULL, - .footer = NULL, + .footer = " mm", .footer_alt = NULL, - .func = NULL, + .func = &_but_jerk_xy_cb, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Z Jerk", + .end = NULL, + .footer = " mm", + .footer_alt = NULL, + .func = &_but_jerk_z_cb, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "X/Y axis current", + .end = NULL, + .footer = " mA", + .footer_alt = NULL, + .func = &_but_current_xy_cb, /* TODO needs bitwise id for x/y/z */ + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Z axis current", + .end = NULL, + .footer = " mA", + .footer_alt = NULL, + .func = &_but_current_z_cb, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "Extruder current", + .end = NULL, + .footer = " mA", + .footer_alt = NULL, + .func = &_but_current_e_cb, /* XXX needs field with bitwise id for hotend/extruder */ .toggle_timer = NULL, .data = NULL, }, { NULL }, /* sentinel */ }, .data = NULL, }; -#endif - -static void eulogium_print_data_clear(struct eulogium_data *eulogium) -{ - if (eulogium->progress_data_refresh) - ecore_timer_del(eulogium->progress_data_refresh); - eulogium->progress_data_refresh = NULL; - eulogium->progress = NULL; /* XXX memleak here? when or how is this freed by efl */ - eulogium->status = NULL; /* XXX memleak here too? how does efl do it */ - eulogium->time = NULL; /* XXX memleak here too? how does efl do it */ - eulogium->name = NULL; /* XXX memleak here too? how does efl do it */ -// if (eulogium->print.name) -// free(eulogium->print.name); - eulogium->print.name = NULL; - eulogium->print.name_changed = EINA_FALSE; -// if (eulogium->print.file) +#if 0 +menu template; TODO make nice macro for entries +static struct menu_def menu_ = { + .title = "", + .type = LIST_MENU, + .entry = { + { + .icon = "user-home", + .label = "Return", + .end = NULL, + .footer = "Return to Main menu", + .footer_alt = NULL, + .func = &_cb_content_prev_set, + .toggle_timer = NULL, + .data = NULL, + }, { + .icon = NULL, + .label = "", + .end = NULL, + .footer = NULL, + .footer_alt = NULL, + .func = NULL, + .toggle_timer = NULL, + .data = NULL, + }, { NULL }, /* sentinel */ + }, + .data = NULL, +}; +#endif + +static struct settings_dial_data dial_led_hue = { + .label = N_("Hue"), + .step = 1.0, + .min = 0.0, + .max = 100.0, + .value = 12.3, + .value_end = 25.0, + .format = "%1.0f", + .format_end = " | %1.0f%s", + .unit = "%", + //.method_set = "SetHue", + //.method_get = "GetHue", +}; + +static struct settings_dial_data dial_led_saturation = { + .label = N_("Saturation"), + .step = 1.0, + .min = 0.0, + .max = 100.0, + .value = 4.56, + .value_end = 25.0, + .format = "%1.0f", + .format_end = " | %1.0f%s", + .unit = "%", + //.method_set = "SetSaturation", + //.method_get = "GetSaturation", +}; + +static struct settings_dial_data dial_led_brightness = { + .label = N_("Brightness"), + .step = 1.0, + .min = 0.0, + .max = 100.0, + .value = 7.89, + .value_end = 25.0, + .format = "%1.0f", + .format_end = " | %1.0f%s", + .unit = "%", + //.method_set = "SetBrightness", + //.method_get = "GetBrightness", +}; + +static struct print_data progressbars[] = { + [PROC_PRINT] = { + .title = LABEL_PROC_PRINT, + .status = NULL, + .jobname = NULL, + .time = 0, + .total_time = 0, + .value = 0.0, + .proc_key = PROC_PRINT, + }, + [PROC_FIRMWARE_UPDATE] = { + .title = LABEL_PROC_FIRMWARE_UPDATE, + .status = NULL, + .jobname = NULL, + .time = 0, + .total_time = 0, + .value = 0.0, + .proc_key = PROC_FIRMWARE_UPDATE, + }, +}; + +static struct settings_dial_data dials[] = { + /* TODO maybe use a title and label, where label is generally NULL */ + [PROC_BED_MOVE] = { + .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 */ + .value = 0.0, + .value_end = 0.0, /* Unused with this dial */ + .format = "", /* Unused with this dial */ + .format_end = "", /* Unused with this dial */ + .unit = "", /* Unused with this dial */ + .method_set = &procedure_target_set, + .method_get = &procedure_metadata_key_get, + .proc_key = PROC_BED_MOVE, + }, + [PROC_BED_HEATUP] = { + .label = N_("Buildplate temperature"), + .step = 1.0, + .min = 0.0, + .max = 60.0, + .value = 0.0, + .value_end = 0.0, + .format = "%1.1f", + .format_end = " | %1.0f%s", + .unit = " °C", + .method_set = &procedure_target_set, + .method_get = &procedure_metadata_key_get, + .proc_key = PROC_BED_HEATUP, + }, + [PROC_HOTEND_HEATUP_0] = { + .label = N_("Hotend 1 temperature"), + .step = 1.0, + .min = 0.0, + .max = 300.0, + .value = 0.0, + .value_end = 0.0, + .format = "%1.1f", + .format_end = " | %1.0f%s", + .unit = " °C", + .method_set = &procedure_target_set, /* XXX use ampersant improve of functions */ + .method_get = &procedure_metadata_key_get, + .proc_key = PROC_HOTEND_HEATUP_0, + }, + [PROC_HOTEND_HEATUP_1] = { + .label = N_("Hotend 2 temperature"), + .step = 1.0, + .min = 0.0, + .max = 300.0, + .value = 0.0, + .value_end = 0.0, + .format = "%1.1f", + .format_end = " | %1.0f%s", + .unit = " °C", + .method_set = &procedure_target_set, /* XXX use ampersant improve of functions */ + .method_get = &procedure_metadata_key_get, + .proc_key = PROC_HOTEND_HEATUP_1, + }, + [PROC_PRINT_SPEED] = { + .label = N_("Print speed"), + .step = 10.0, + .min = 10.0, + .max = 1000.0, + .value = 0.0, + .value_end = 0.0, + .format = "%1.1f", + .format_end = " | %1.0f%s", + .unit = "%", + .method_set = &procedure_target_set, + .method_get = &procedure_metadata_key_get, + .proc_key = PROC_PRINT_SPEED, + }, + [PROC_FAN_SPEED] = { + .label = N_("Fan speed"), + .step = 1.0, + .min = 0.0, + .max = 100.0, + .value = 0.0, + .value_end = 0.0, + .format = "%1.0f", + .format_end = " | %1.0f%s", + .unit = "%", + .method_set = &procedure_target_set, + .method_get = &procedure_metadata_key_get, + .proc_key = PROC_FAN_SPEED, + }, + [PROC_FLOW_RATE] = { + .label = N_("Material flow rate"), + .step = 1.0, + .min = 0.0, + .max = 100.0, + .value = 0.0, + .value_end = 0.0, + .format = "%1.0f", + .format_end = " | %1.0f%s", + .unit = "%", + .method_set = &procedure_target_set, + .method_get = &procedure_metadata_key_get, + .proc_key = PROC_FLOW_RATE, + }, + [PROC_RETRACTION_LENGTH] = { + .label = N_("Retraction length"), + .step = 0.1, + .min = 3.0, + .max = 20.0, + .value = 0.0, + .value_end = 0.0, + .format = "%1.1f", + .format_end = " | %1.0f%s", + .unit = " mm", + .method_set = &procedure_target_set, + .method_get = &procedure_metadata_key_get, + .proc_key = PROC_RETRACTION_LENGTH, + }, + [PROC_RETRACTION_SPEED] = { + .label = N_("Retraction speed"), + .step = 1.0, + .min = 1.0, + .max = 150.0, + .value = 0.0, + .value_end = 0.0, + .format = "%1.1f", + .format_end = " | %1.0f%s", + .unit = " mm / s", + .method_set = &procedure_target_set, + .method_get = &procedure_metadata_key_get, + .proc_key = PROC_RETRACTION_SPEED, + }, + [PROC_RETRACTION_ZHOP] = { + .label = N_("Retraction Z-hop"), + .step = 0.1, + .min = 0.0, + .max = 10.0, + .value = 0.0, + .value_end = 0.0, + .format = "%1.1f", + .format_end = " | %1.0f%s", + .unit = " mm", + .method_set = &procedure_target_set, + .method_get = &procedure_metadata_key_get, + .proc_key = PROC_RETRACTION_ZHOP, + }, + [PROC_MATERIAL_MOVE_0] = { + /* TODO maybe use a title and label, where label is generally NULL */ + .label = N_("Move material
Rotate the knob
CW to feed
CCW to retract"), + .step = 1.0, + .min = 0.0, /* Unused with this dial */ + .max = 0.0, /* Unused with this dial */ + .value = 0.0, + .value_end = 0.0, /* Unused with this dial */ + .format = "", /* Unused with this dial */ + .format_end = "", /* Unused with this dial */ + .unit = "", /* Unused with this dial */ + .method_set = &procedure_target_set, + .method_get = NULL, + .proc_key = PROC_MATERIAL_MOVE_0, + }, + [PROC_MATERIAL_MOVE_1] = { + /* TODO maybe use a title and label, where label is generally NULL */ + .label = N_("Move material
Rotate the knob
CW to feed
CCW to retract"), + .step = 1.0, + .min = 0.0, /* Unused with this dial */ + .max = 0.0, /* Unused with this dial */ + .value = 0.0, + .value_end = 0.0, /* Unused with this dial */ + .format = "", /* Unused with this dial */ + .format_end = "", /* Unused with this dial */ + .unit = "", /* Unused with this dial */ + .method_set = &procedure_target_set, + .method_get = NULL, + .proc_key = PROC_MATERIAL_MOVE_1, + }, + [PROC_JERK_XY] = { + .label = N_("X/Y jerk"), + .step = 1.0, + .min = 0.0, + .max = 100.0, + .value = 0.0, + .value_end = 0.0, + .format = "%1.0f", + .format_end = " | %1.0f%s", + .unit = " mm", + .method_set = &procedure_target_set, + .method_get = &procedure_metadata_key_get, + .proc_key = PROC_JERK_XY, + }, + [PROC_JERK_Z] = { + .label = N_("Z jerk"), + .step = 1.0, + .min = 0.0, + .max = 100.0, + .value = 0.0, + .value_end = 0.0, + .format = "%1.0f", + .format_end = " | %1.0f%s", + .unit = " mm", + .method_set = &procedure_target_set, + .method_get = &procedure_metadata_key_get, + .proc_key = PROC_JERK_Z, + }, + [PROC_CURRENT_XY] = { + .label = N_("X/Y axis current"), + .step = 1.0, + .min = 0.0, + .max = 100.0, + .value = 0.0, + .value_end = 0.0, + .format = "%1.0f", + .format_end = " | %1.0f%s", + .unit = " mm", + .method_set = &procedure_target_set, + .method_get = &procedure_metadata_key_get, + .proc_key = PROC_CURRENT_XY, + }, + [PROC_CURRENT_Z] = { + .label = N_("Z axis current"), + .step = 1.0, + .min = 0.0, + .max = 100.0, + .value = 0.0, + .value_end = 0.0, + .format = "%1.0f", + .format_end = " | %1.0f%s", + .unit = " mm", + .method_set = &procedure_target_set, + .method_get = &procedure_metadata_key_get, + .proc_key = PROC_CURRENT_Z, + }, + [PROC_CURRENT_E] = { + .label = N_("Extruder current"), + .step = 1.0, + .min = 0.0, + .max = 100.0, + .value = 0.0, + .value_end = 0.0, + .format = "%1.0f", + .format_end = " | %1.0f%s", + .unit = " mm", + .method_set = &procedure_target_set, + .method_get = &procedure_metadata_key_get, + .proc_key = PROC_CURRENT_E, + }, { NULL }, /* sentinel */ +}; + +void eulogium_print_data_clear(struct eulogium_data *eulogium) +{ + if (eulogium->progress_data_refresh) + ecore_timer_del(eulogium->progress_data_refresh); + eulogium->progress_data_refresh = NULL; + eulogium->progress = NULL; /* XXX memleak here? when or how is this freed by efl */ + eulogium->status = NULL; /* XXX memleak here too? how does efl do it */ + eulogium->time = NULL; /* XXX memleak here too? how does efl do it */ + eulogium->name = NULL; /* XXX memleak here too? how does efl do it */ + +// if (eulogium->print.name) +// free(eulogium->print.name); + eulogium->print.jobname = NULL; + print_clear(eulogium->procedures[PROC_PRINT].meta); +// if (eulogium->print.file) // free(eulogium->print.file); eulogium->print.url = NULL; - eulogium->print.time = 0; - eulogium->print.material = 0; - eulogium->print.progress = 0; eulogium->print.flags = ""; } @@ -1425,15 +2003,7 @@ 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) { - struct eulogium_data *eulogium = data; - uint_fast8_t list_size; - - printf("prev ret\n"); - list_size = eina_list_count(elm_naviframe_items_get(eulogium->navi)); - if (list_size < 2) - printf("Not popping last item cowboy\n"); /* TODO, use proper debug construct */ - else - elm_naviframe_item_pop(eulogium->navi); + ui_stack_pop_cb(data, 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) @@ -1441,10 +2011,8 @@ static void _print_abort_confirm_cb(void *data, Evas_Object *obj EINA_UNUSED, vo struct eulogium_data *eulogium = data; Evas_Object *content; - content = eulogium_menu_confirm(eulogium->navi, gettext_noop("
Abort the print?"), "No", &but_print_abort); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + content = eulogium_menu_confirm(eulogium->navi, N_("
Abort the print?"), "No", &but_print_abort); + ui_stack_push(eulogium, content, PAGE_NORMAL); } static void _print_abort_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1470,9 +2038,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); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_NORMAL); } static void _but_material_change_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1482,9 +2048,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); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_NORMAL); } static void _but_material_settings_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1494,9 +2058,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); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_NORMAL); } static void _but_hotend_change_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1506,9 +2068,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); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_NORMAL); } static void _but_hotend_settings_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1518,9 +2078,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); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_NORMAL); } static void _but_main_system_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1530,45 +2088,38 @@ 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); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); -} - -static void menu_widget_list_push(struct eulogium_data *eulogium, struct menu_def *file) -{ - Evas_Object *content; - - content = menu_widget_list(eulogium, eulogium->navi, file); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_NORMAL); } static void menu_wifi_list(struct eulogium_data *eulogium) { + Evas_Object *content; struct menu_def *wifi_list; wifi_list = malloc(sizeof(struct menu_def)); /* XXX memleak here. free on pop */ wifi_list->title = _("Wifi Networks"); wifi_list->type = LIST_WIFI; - menu_widget_list_push(eulogium, wifi_list); + content = menu_widget_list(eulogium, eulogium->navi, wifi_list); + ui_stack_push(eulogium, content, PAGE_NORMAL); } static void menu_internal_storage(struct eulogium_data *eulogium) { + Evas_Object *content; struct menu_def *menu_internal_storage; menu_internal_storage = malloc(sizeof(struct menu_def)); /* XXX meamleak here. This needs to be free-ed when we pop this screen */ menu_internal_storage->title = "Internal storage"; menu_internal_storage->type = LIST_FILE; menu_internal_storage->dir.path = "/home"; /* TODO, use variable for internal storage */ - menu_widget_list_push(eulogium, menu_internal_storage); + content = menu_widget_list(eulogium, eulogium->navi, menu_internal_storage); + ui_stack_push(eulogium, content, PAGE_NORMAL); } static void menu_usb_storage(struct eulogium_data *eulogium) { + Evas_Object *content; struct menu_def *menu_usb_storage; struct mount_data *mount; char *mount_point; @@ -1589,7 +2140,8 @@ static void menu_usb_storage(struct eulogium_data *eulogium) menu_usb_storage->type = LIST_FILE; menu_usb_storage->dir.path = malloc(mount_len); strncpy(menu_usb_storage->dir.path, mount_point, mount_len); - menu_widget_list_push(eulogium, menu_usb_storage); + content = menu_widget_list(eulogium, eulogium->navi, menu_usb_storage); + ui_stack_push(eulogium, content, PAGE_USB); } static void _network_wifi_manage_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1625,9 +2177,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); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_NORMAL); } } @@ -1639,9 +2189,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); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_NORMAL); } static void _but_system_settings_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1651,9 +2199,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); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_NORMAL); } static void _but_settings_hotend_1_offset_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1663,9 +2209,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); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_NORMAL); } static void _but_settings_hotend_2_offset_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1675,9 +2219,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); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_NORMAL); } static void _but_settings_language_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1687,9 +2229,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); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_NORMAL); } static void _but_settings_led_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1702,13 +2242,253 @@ static void _but_settings_led_cb(void *data, Evas_Object *obj EINA_UNUSED, void ui_stack_push(eulogium, content, PAGE_NORMAL); } +static void _but_led_hue_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + Evas_Object *content; + + printf("Button led_hue pressed\n"); + content = ui_widget_dial(eulogium->navi, eulogium, &dial_led_hue); + ui_stack_push(eulogium, content, PAGE_NORMAL); +} + +static void _but_led_saturation_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + Evas_Object *content; + + printf("Button led_saturation pressed\n"); + content = ui_widget_dial(eulogium->navi, eulogium, &dial_led_saturation); + ui_stack_push(eulogium, content, PAGE_NORMAL); +} + static void _but_led_brightness_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) { struct eulogium_data *eulogium = data; Evas_Object *content; printf("Button led_brightness pressed\n"); - content = eulogium_settings_dial(eulogium->navi, eulogium); + content = ui_widget_dial(eulogium->navi, eulogium, &dial_led_brightness); + ui_stack_push(eulogium, content, PAGE_PRINTING); +} + +static void _but_bed_heatup_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + Evas_Object *content; + + printf("Button bed temperature pressed\n"); + content = ui_widget_dial(eulogium->navi, eulogium, &dials[PROC_BED_HEATUP]); + ui_stack_push(eulogium, content, PAGE_NORMAL); +} + +static void _but_hotend_heatup_0_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + Evas_Object *content; + + printf("Button hotend 1 temperature pressed\n"); + content = ui_widget_dial(eulogium->navi, eulogium, &dials[PROC_HOTEND_HEATUP_0]); + ui_stack_push(eulogium, content, PAGE_NORMAL); +} + +static void _but_hotend_heatup_1_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + Evas_Object *content; + + printf("Button hotend 2 temperature pressed\n"); + content = ui_widget_dial(eulogium->navi, eulogium, &dials[PROC_HOTEND_HEATUP_1]); + ui_stack_push(eulogium, content, PAGE_NORMAL); +} + +static void _but_hotend_active_set_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("But hotend_active_set\n"); + procedure_start_simple(PROC_HOTEND_ACTIVE_SET); +} + +static void _but_print_speed_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + Evas_Object *content; + + printf("Button print speed pressed\n"); + content = ui_widget_dial(eulogium->navi, eulogium, &dials[PROC_PRINT_SPEED]); + ui_stack_push(eulogium, content, PAGE_PRINTING); +} + +static void _but_fan_speed_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + Evas_Object *content; + + printf("Button fan speed pressed\n"); + content = ui_widget_dial(eulogium->navi, eulogium, &dials[PROC_FAN_SPEED]); + ui_stack_push(eulogium, content, PAGE_NORMAL); +} + +static void _but_flow_rate_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + Evas_Object *content; + + printf("Button material flow pressed\n"); + content = ui_widget_dial(eulogium->navi, eulogium, &dials[PROC_FLOW_RATE]); + ui_stack_push(eulogium, content, PAGE_NORMAL); +} + +static void _but_retraction_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + Evas_Object *content = NULL; + + printf("But menu retraction\n"); + content = menu_widget_list(eulogium, eulogium->navi, &menu_retraction); + ui_stack_push(eulogium, content, PAGE_NORMAL); +} + +static void _but_retraction_length_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + Evas_Object *content = NULL; + + printf("But retraction length\n"); + content = ui_widget_dial(eulogium->navi, eulogium, &dials[PROC_RETRACTION_LENGTH]); + ui_stack_push(eulogium, content, PAGE_NORMAL); +} + +static void _but_retraction_speed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + Evas_Object *content = NULL; + + printf("But retraction speed\n"); + content = ui_widget_dial(eulogium->navi, eulogium, &dials[PROC_RETRACTION_SPEED]); + ui_stack_push(eulogium, content, PAGE_NORMAL); +} + +static void _but_retraction_zhop_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + Evas_Object *content = NULL; + + printf("But retraction zhop\n"); + content = ui_widget_dial(eulogium->navi, eulogium, &dials[PROC_RETRACTION_ZHOP]); + ui_stack_push(eulogium, content, PAGE_NORMAL); +} + +static void _but_bed_level_auto_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("But bed level auto\n"); + procedure_start_simple(PROC_BED_LEVEL_AUTO); +} + +static void _but_bed_raise_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("But bed raise\n"); + procedure_start_simple(PROC_BED_RAISE); +} + +static void _but_bed_home_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("But bed home\n"); + procedure_start_simple(PROC_BED_HOME); +} + +static void _but_head_home_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + printf("But head home\n"); + procedure_start_simple(PROC_HEAD_HOME); +} + +static void _but_bed_move_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + Evas_Object *content = NULL; + + printf("But bed move\n"); + content = ui_widget_rotator(eulogium->navi, eulogium, &dials[PROC_BED_MOVE]); + ui_stack_push(eulogium, content, PAGE_NORMAL); +} + +static void _but_material_move_0_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + Evas_Object *content = NULL; + + printf("But move material 0\n"); + content = ui_widget_rotator(eulogium->navi, eulogium, &dials[PROC_MATERIAL_MOVE_0]); + ui_stack_push(eulogium, content, PAGE_NORMAL); +} + +static void _but_material_move_1_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + Evas_Object *content = NULL; + + printf("But move material 1\n"); + content = ui_widget_rotator(eulogium->navi, eulogium, &dials[PROC_MATERIAL_MOVE_1]); + ui_stack_push(eulogium, content, PAGE_NORMAL); +} + +static void _but_motion_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + Evas_Object *content = NULL; + + printf("But menu motion\n"); + content = menu_widget_list(eulogium, eulogium->navi, &menu_motion); + ui_stack_push(eulogium, content, PAGE_NORMAL); +} + +static void _but_jerk_xy_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + Evas_Object *content = NULL; + + printf("But jerk xy\n"); + content = ui_widget_dial(eulogium->navi, eulogium, &dials[PROC_JERK_XY]); + ui_stack_push(eulogium, content, PAGE_NORMAL); +} + +static void _but_jerk_z_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + Evas_Object *content = NULL; + + printf("But jerk z\n"); + content = ui_widget_dial(eulogium->navi, eulogium, &dials[PROC_JERK_Z]); + ui_stack_push(eulogium, content, PAGE_NORMAL); +} + +static void _but_current_xy_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + Evas_Object *content = NULL; + + printf("But current xy\n"); + content = ui_widget_dial(eulogium->navi, eulogium, &dials[PROC_CURRENT_XY]); + ui_stack_push(eulogium, content, PAGE_NORMAL); +} + +static void _but_current_z_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + Evas_Object *content = NULL; + + printf("But current z\n"); + content = ui_widget_dial(eulogium->navi, eulogium, &dials[PROC_CURRENT_Z]); + ui_stack_push(eulogium, content, PAGE_NORMAL); +} + +static void _but_current_e_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + Evas_Object *content = NULL; + + printf("But current e\n"); + content = ui_widget_dial(eulogium->navi, eulogium, &dials[PROC_CURRENT_E]); ui_stack_push(eulogium, content, PAGE_NORMAL); } @@ -1721,10 +2501,11 @@ static char *parse_networks_for_display(struct network_data *networks) if (!networks) return NULL; - for (i = 0; networks[i].obj_path; i++) { - buf = realloc(buf, pos + 34 * sizeof(char *)); - pos += sprintf(buf + pos, "%s%s IP: %s", i == 0 ? "": "
", (networks[i].tech == TECH_ETHERNET) ? "Ethernet" : (networks[i].tech == TECH_WIFI) ? "WiFi" : "", networks[i].ipv4); - } + for (i = 0; networks[i].obj_path; i++) + if (networks[i].ipv4) { // TODO || networks[i].ipv6) /* XXX if ipv4 exists, but is '', this will still print an empty field. */ + buf = realloc(buf, pos + 34 * sizeof(char *)); + pos += sprintf(buf + pos, "%s%s IP: %s", i == 0 ? "": "
", (networks[i].tech == TECH_ETHERNET) ? "Ethernet" : (networks[i].tech == TECH_WIFI) ? "WiFi" : "", networks[i].ipv4); + } return buf; } @@ -1735,11 +2516,7 @@ static void _but_network_info_cb(void *data, Evas_Object *obj EINA_UNUSED, void Evas_Object *content, *_top, *_bottom; char *buf; - /* XXX Quick hack to make the adv feature a little more useful, this needs to be made much better! */ - _top = elm_box_add(eulogium->navi); - evas_object_show(_top); - - _top = elm_label_add(eulogium->navi); /* TODO, dynamically update IPs */ + _top = elm_label_add(eulogium->navi); /* TODO, dynamically update IPs, requires 'redrawing' of some sort */ buf = parse_networks_for_display(eulogium->networks); elm_object_text_set(_top, buf); free(buf); @@ -1750,10 +2527,26 @@ static void _but_network_info_cb(void *data, Evas_Object *obj EINA_UNUSED, void evas_object_smart_callback_add(_bottom, "clicked", but_return.cb.func, but_return.cb.data); evas_object_show(_bottom); -// elm_naviframe_item_simple_push(eulogium->navi, box); content = eulogium_split_screen(eulogium->navi, _top, _bottom); - if (content) - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_NORMAL); +} + +static void _but_software_version_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct eulogium_data *eulogium = data; + Evas_Object *content, *_top, *_bottom; + + _top = elm_label_add(eulogium->navi); /* TODO, dynamically update IPs, requires 'redrawing' of some sort */ + elm_object_text_set(_top, PACKAGE_VERSION); + evas_object_show(_top); + + _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); } static void _but_main_mathot_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1764,9 +2557,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); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_NORMAL); } static void _but_settings_material_1_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1777,9 +2568,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); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_NORMAL); } static void _but_settings_material_2_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1790,9 +2579,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); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_NORMAL); } static void _but_material_customize_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1803,9 +2590,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); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_NORMAL); } static void _but_print_tune_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1816,9 +2601,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); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_PRINTING); } static void _but_change_material_1_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1829,9 +2612,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); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_NORMAL); } static void _but_change_material_2_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1842,9 +2623,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); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_NORMAL); } static void _but_mathot_material_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1855,9 +2634,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); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_NORMAL); } static void _but_mathot_hotend_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1868,9 +2645,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); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_NORMAL); } static void _but_settings_hotend_1_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1881,9 +2656,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); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_NORMAL); } static void _but_settings_hotend_2_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1894,9 +2667,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); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_NORMAL); } static void _but_change_hotend_1_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1907,9 +2678,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); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_NORMAL); } static void _but_change_hotend_2_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1920,9 +2689,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); - if (!content) - return; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_NORMAL); } void eulogium_button_cb_set(struct button_def *button, struct button_cb *cb) @@ -1955,29 +2722,12 @@ void eulogium_print_data_set(struct eulogium_data *eulogium, char *filepath) buf = malloc(buf_size); /* TODO: remember to free this later! */ snprintf(buf, buf_size, "file://%s", filepath); eulogium->print.url = buf; - eulogium->print.name = ecore_file_strip_ext(ecore_file_file_get(filepath)); + eulogium->print.jobname = ecore_file_strip_ext(ecore_file_file_get(filepath)); eulogium->print.flags = ""; eulogium->print.material = 100.23; /* TODO */ eulogium->print.time = 12; } -/* Function to make the Z-axis of any wheel focus the next/previous focusable widget */ -static void _cb_eulogium_input_wheel(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) -{ - Evas_Event_Mouse_Wheel *ev = event_info; - Ecore_Event *event = NULL; - - if (ev->z > 0) { - elm_object_focus_next((Evas_Object *)data, ELM_FOCUS_NEXT); - event = ecore_event_add(INPUT_MOUSE_WHEEL_DOWN, NULL, NULL, NULL); - } else { - elm_object_focus_next((Evas_Object *)data, ELM_FOCUS_PREVIOUS); - event = ecore_event_add(INPUT_MOUSE_WHEEL_UP, NULL, NULL, NULL); - } - if (!event) - EINA_LOG_ERR("Wheel event failed to queue."); -} - static void _cb_eulogium_exit(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { elm_exit(); @@ -2015,117 +2765,33 @@ struct _status_msg { char *s; }; -static void eulogium_printer_status_set(struct eulogium_data *eulogium, struct _status_msg *status); - -static void _on_get_status_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) -{ - const char *errname, *errmsg; - struct eulogium_data *eulogium = data; - char *state; - struct _status_msg status; - - if (eldbus_message_error_get(msg, &errname, &errmsg)) { - EINA_LOG_ERR("%s %s", errname, errmsg); - status.i = ERROR; - status.s = griffin_print_status[ERROR]; - } else if (!eldbus_message_arguments_get(msg, "s", &state)) { - EINA_LOG_ERR("Message content does not match expected \"s\" signature."); - status.i = ERROR; - status.s = griffin_print_status[ERROR]; - } else if (!strncmp(state, "DISCONNECTED", 12)) { /* XXX replace this with something better and maintainable, function, LUT etc */ - status.i = DISCONNECTED; - status.s = griffin_print_status[DISCONNECTED]; - } else if (!strncmp(state, "ERROR", 5)) { - status.i = ERROR; - status.s = griffin_print_status[ERROR]; - } else if (!strncmp(state, "FIRST_RUN_WIZZARD", 17)) { - status.i = FIRST_RUN_WIZZARD; - status.s = griffin_print_status[FIRST_RUN_WIZZARD]; - } else if (!strncmp(state, "IDLE", 4)) { - status.i = IDLE; - status.s = griffin_print_status[IDLE]; - } else if (!strncmp(state, "SLICING", 7)) { - status.i = SLICING; - status.s = griffin_print_status[SLICING]; - } else if (!strncmp(state, "HEATING", 7)) { - status.i = HEATING; - status.s = griffin_print_status[HEATING]; - } else if (!strncmp(state, "PRINTING", 8)) { - status.i = PRINTING; - status.s = griffin_print_status[PRINTING]; - } else if (!strncmp(state, "COOLING", 7)) { - status.i = COOLING; - status.s = griffin_print_status[COOLING]; - } else if (!strncmp(state, "WAIT_FOR_REMOVAL", 16)) { - status.i = WAIT_FOR_REMOVAL; - status.s = griffin_print_status[WAIT_FOR_REMOVAL]; - } else if (!strncmp(state, "PAUSED", 6)) { - status.i = PAUSED; - status.s = griffin_print_status[PAUSED]; - } else { - status.i = UNKNOWN; - status.s = griffin_print_status[UNKNOWN]; - } - eulogium_printer_status_set(eulogium, &status); -} - -static void _on_get_progress_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) -{ - const char *errname, *errmsg; - double *progress = data; - - if (eldbus_message_error_get(msg, &errname, &errmsg)) { - EINA_LOG_ERR("%s %s", errname, errmsg); - return; - } - if (!eldbus_message_arguments_get(msg, "d", progress)) { - EINA_LOG_ERR("Failed to get print progress."); - return; - } -} - -static void _on_get_time_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) -{ - const char *errname, *errmsg; - uint_fast32_t *time = data; - - if (eldbus_message_error_get(msg, &errname, &errmsg)) { - EINA_LOG_ERR("%s %s", errname, errmsg); - return; - } - if (!eldbus_message_arguments_get(msg, "u", time)) { - EINA_LOG_ERR("Failed to get remaining print time."); - return; - } -} - static Eina_Bool _timer_progress_data_update_cb(void *data) { struct eulogium_data *eulogium = data; static enum printer_status status = -1; - static double progress = 0; + static double value = 0; static double time = -1; - //eldbus_proxy_call(eulogium->dbus.proxy[PRINTER], "getProgress", _on_get_progress_ret, &eulogium->print.progress, 2, ""); - //eldbus_proxy_call(eulogium->dbus.proxy[PRINTER], "getTime", _on_get_time_ret, &eulogium->print.time, 2, ""); + procedure_metadata_key_get(PROC_PRINT); + /* XXX This is an ugly hack that doesn't even work to abort the timer, we need to refactor this into something sensible + * Basically we want to stop this time whenever the item gets removed from the stack via the + * clean/free callback. */ + if ((!eulogium->status) && (!eulogium->progress) && (!eulogium->name) && (!eulogium->time)) + return ECORE_CALLBACK_CANCEL; if (eulogium->printer.status != status) { - elm_object_text_set(eulogium->status, _(griffin_print_status[eulogium->printer.status])); + elm_object_text_set(eulogium->status, "TODO (step key)"); if (eulogium->printer.status == COOLING) elm_progressbar_inverted_set(eulogium->progress, EINA_TRUE); status = eulogium->printer.status; } - if (eulogium->print.progress != progress) { - elm_progressbar_value_set(eulogium->progress, eulogium->print.progress); - progress = eulogium->print.progress; - } - if (eulogium->print.name_changed == EINA_TRUE) { - elm_object_text_set(eulogium->name, _(eulogium->print.name)); - eulogium->print.name_changed = EINA_FALSE; + if (eulogium->print.value != value) { + elm_progressbar_value_set(eulogium->progress, eulogium->print.value); + value = eulogium->print.value; } if (eulogium->print.time != time) { char buf[255], *str; - uint_fast32_t time = 0; + int_fast32_t time = 0; if (eulogium->print.time < 1) { str = "Print time unknown"; @@ -2195,7 +2861,7 @@ static Eina_Bool _timer_print_unblock_cb(void *data) } } -Evas_Object *eulogium_print_ignore(struct eulogium_data *eulogium) +Evas_Object *eulogium_print_ignore(struct eulogium_data *eulogium) /* TODO pass print_data struct */ { Evas_Object *_top, *_bottom; @@ -2218,7 +2884,7 @@ Evas_Object *eulogium_print_ignore(struct eulogium_data *eulogium) evas_object_show(eulogium->time); elm_box_pack_end(_top, eulogium->time); - eulogium->progress = elm_progressbar_add(_top); /* TODO: depending on i18n sig, change inverted */ + eulogium->progress = elm_progressbar_add(_top); elm_progressbar_horizontal_set(eulogium->progress, EINA_TRUE); elm_progressbar_pulse_set(eulogium->progress, EINA_FALSE); elm_progressbar_pulse(eulogium->progress, EINA_FALSE); @@ -2238,17 +2904,52 @@ Evas_Object *eulogium_print_ignore(struct eulogium_data *eulogium) return eulogium_split_screen(eulogium->navi, _top, _bottom); } -Evas_Object *eulogium_print_progress(struct eulogium_data *eulogium) +Evas_Object *eulogium_pre_print(Evas_Object *parent, struct eulogium_data *eulogium) +{ + Evas_Object *_top, *_bottom, *obj; + + _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); + elm_box_homogeneous_set(_top, EINA_FALSE); + evas_object_show(_top); + + obj = elm_label_add(_top); + elm_object_text_set(obj, _("Preparing printer ...")); + elm_label_slide_mode_set(obj, ELM_LABEL_SLIDE_MODE_NONE); + evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(obj); + elm_box_pack_end(_top, obj); + + /* Pulse progress */ + + _bottom = eulogium_dual_button_add(eulogium->navi, &but_print_tune, &but_print_abort_confirm); + _bottom = elm_button_add(parent); + 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); + elm_object_text_set(_bottom, _(but_print_abort_confirm.text)); + evas_object_smart_callback_add(_bottom, "clicked", but_print_abort_confirm.cb.func, but_print_abort_confirm.cb.data); + evas_object_show(obj); + evas_object_show(_bottom); + + return eulogium_split_screen(eulogium->navi, _top, _bottom); +} + +Evas_Object *eulogium_print_progress(Evas_Object *parent, struct eulogium_data *eulogium, const struct print_data *print) /* TODO pass timer var to store timer in */ { Evas_Object *_top, *_bottom; + /* TODO maybe this timer needs to be split into twofold update the widgets locally here, + * emit a signal/tell the metadata cb to start gathering meta data */ + /* this needs to be done, so that we can pass the proper parameters. For now, just hackishly split them. + */ eulogium->progress_data_refresh = ecore_timer_add(0.5, _timer_progress_data_update_cb, eulogium); if (!eulogium->progress_data_refresh) { /* TODO make define for the timeout */ EINA_LOG_CRIT("Unable to create progress update timer"); return NULL; } - _top = elm_box_add(eulogium->navi); + _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); elm_box_homogeneous_set(_top, EINA_FALSE); @@ -2269,7 +2970,7 @@ Evas_Object *eulogium_print_progress(struct eulogium_data *eulogium) elm_box_pack_end(_top, eulogium->status); eulogium->name = elm_label_add(_top); - elm_object_text_set(eulogium->name, eulogium->print.name); + elm_object_text_set(eulogium->name, print->jobname); elm_label_slide_mode_set(eulogium->name, ELM_LABEL_SLIDE_MODE_AUTO); //elm_label_slide_speed_set(object, 2); elm_label_slide_go(eulogium->name); @@ -2282,74 +2983,57 @@ Evas_Object *eulogium_print_progress(struct eulogium_data *eulogium) elm_progressbar_horizontal_set(eulogium->progress, EINA_TRUE); elm_progressbar_pulse_set(eulogium->progress, EINA_FALSE); /* TODO: pulse = time-unknown/pause */ elm_progressbar_pulse(eulogium->progress, EINA_FALSE); - elm_progressbar_value_set(eulogium->progress, eulogium->print.progress); + elm_progressbar_value_set(eulogium->progress, print->value); elm_progressbar_unit_format_set(eulogium->progress, "%1.1f %%"); evas_object_size_hint_align_set(eulogium->progress, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(eulogium->progress); elm_box_pack_end(_top, eulogium->progress); - _bottom = eulogium_dual_button_add(eulogium->navi, &but_print_tune, &but_print_abort_confirm); + _bottom = eulogium_dual_button_add(parent, &but_print_tune, &but_print_abort_confirm); evas_object_show(_bottom); - return eulogium_split_screen(eulogium->navi, _top, _bottom); + return eulogium_split_screen(parent, _top, _bottom); } -Evas_Object *eulogium_generic_error(struct eulogium_data *eulogium, uint8_t eulogium_error) +void eulogium_generic_error(struct eulogium_data *eulogium, uint_fast16_t error_code, const char *error_msg) { - Evas_Object *box, *object; - char buf[] = "Printer error -255.
Please contact support via
http://ultimaker.com/support."; + Evas_Object *content, *object; + char buf[250]; /* 250 characters should be enough for everyone XXX (find the max number of chars we can actually print) */ /* TODO, replace with define of strings to collect all strings centrally */ - box = elm_box_add(eulogium->navi); - evas_object_show(box); + content = elm_box_add(eulogium->navi); + evas_object_show(content); object = elm_label_add(eulogium->navi); - snprintf(buf, sizeof(buf), "Printer error %d.
Please contact support via
http://ultimaker.com/support.", eulogium_error); + snprintf(buf, sizeof(buf), "Printer error %u.
%s", (unsigned int)error_code, + strlen(error_msg) > 0 ? error_msg : "Please contact support via
http://ultimaker.com/support."); elm_object_text_set(object, _(buf)); evas_object_show(object); - elm_box_pack_end(box, object); + elm_box_pack_end(content, object); -#if 0 +#if 1 /* XXX what to do here, reboot? make support notice via wget? */ object = elm_button_add(eulogium->navi); - elm_object_text_set(object, _("ABORT")); /* TODO create abort button */ - evas_object_size_hint_align_set(object, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(object, _("IGNORE")); /* TODO create abort button */ + evas_object_size_hint_align_set(object, EVAS_HINT_FILL, 1.0); evas_object_size_hint_weight_set(object, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_smart_callback_add(object, "clicked", _print_abort_cb, eulogium); /* TODO what button to use here? */ + evas_object_smart_callback_add(object, "clicked", &_cb_content_prev_set, eulogium); /* TODO what button to use here? */ evas_object_show(object); - elm_box_pack_end(box, object); + elm_box_pack_end(content, object); #endif - return box; + ui_stack_push(eulogium, content, PAGE_ERROR); } -static void _on_cleared_printer_ret(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) -{ - const char *errname, *errmsg; - Eina_Bool cleared_bed = EINA_FALSE; - - if (eldbus_message_error_get(msg, &errname, &errmsg)) { - EINA_LOG_ERR("%s %s", errname, errmsg); - return; - } - if (!eldbus_message_arguments_get(msg, "b", &cleared_bed)) { - EINA_LOG_ERR("Failed to get bed clear status."); - return; - } - if (cleared_bed == EINA_TRUE) - EINA_LOG_INFO("Bed has been successfully Cleared"); - else - EINA_LOG_WARN("Unable to clear printer bed"); -} - -static void _cleared_bed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +static void _cleaned_bed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { struct eulogium_data *eulogium = data; - //eldbus_proxy_call(eulogium->dbus.proxy[PRINTER], "clearedPrinter", _on_cleared_printer_ret, eulogium, -1, ""); + procedure_print_printer_cleaned(); + _cb_content_prev_set(eulogium, obj, event_info); /* replace with ui_pop_stack */ } -Evas_Object *eulogium_clear_print_bed(struct eulogium_data *eulogium) +Evas_Object *eulogium_clean_print_bed(struct eulogium_data *eulogium) { Evas_Object *_top, *_bottom, *obj; @@ -2363,21 +3047,59 @@ Evas_Object *eulogium_clear_print_bed(struct eulogium_data *eulogium) _bottom = elm_button_add(eulogium->navi); elm_object_text_set(_bottom, _("Print removed")); - evas_object_smart_callback_add(_bottom, "clicked", _cleared_bed_cb, eulogium); + evas_object_smart_callback_add(_bottom, "clicked", _cleaned_bed_cb, eulogium); evas_object_show(_bottom); return eulogium_split_screen(eulogium->navi, _top, _bottom); } +struct _wifilist_data { + struct eulogium_data *eulogium; + struct network_data *network; +}; + struct _filelist_data { struct eulogium_data *eulogium; struct dir_entry_def *dir; Evas_Object *list; }; -struct _filelist_entry_data { - struct _filelist_data *filelist; - char *filepath; +struct _filelist_entry_data { + struct _filelist_data *filelist; + char *filepath; +}; + +static void _cb_select_wifi(void *data, Evas_Object *eo EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct eulogium_data *eulogium = ((struct _wifilist_data *)data)->eulogium; + Evas_Object *navi = eulogium->navi; + const struct network_data *network = ((struct _wifilist_data *)data)->network; + Evas_Object *content, *_top, *_bottom, *obj; + + /* TODO replace with generic dialog code */ + _top = elm_box_add(navi); + evas_object_show(_top); + + obj = elm_label_add(_top); + elm_object_text_set(obj, _("Attempting to connect to Wifi:")); + evas_object_show(obj); + elm_box_pack_end(_top, obj); + + obj = elm_label_add(_top); + elm_object_text_set(obj, network->ssid); + evas_object_show(obj); + elm_box_pack_end(_top, obj); + /* TODO add animation and 'connection finished' signal handler */ + + _bottom = elm_button_add(navi); + elm_object_text_set(_bottom, _("Ok")); + evas_object_smart_callback_add(_bottom, "clicked", _cb_content_prev_set, eulogium); + evas_object_show(_bottom); + + content = eulogium_split_screen(navi, _top, _bottom); + ui_stack_push(eulogium, content, PAGE_NORMAL); + + network_connect_wifi(network); }; static void _cb_select_file(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -2387,6 +3109,7 @@ static void _cb_select_file(void *data, Evas_Object *obj EINA_UNUSED, void *even if (filepath) { if (ecore_file_is_dir(filepath)) { + Evas_Object *content; struct menu_def *new_dir; uint_fast16_t new_dir_len; @@ -2396,10 +3119,15 @@ static void _cb_select_file(void *data, Evas_Object *obj EINA_UNUSED, void *even new_dir->type = LIST_FILE; 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); - menu_widget_list_push(eulogium, new_dir); + 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 */ } else { + Evas_Object *content; + eulogium_print_data_set(eulogium, filepath); - procedure_start_print(eulogium->dbus.proxy[PRINTER], &eulogium->print); + procedure_print_start(&eulogium->print); + content = eulogium_pre_print(eulogium->navi, eulogium); + ui_stack_push(eulogium, content, PAGE_PRINTING); } } } @@ -2465,10 +3193,10 @@ static void _cb_populate_filelist(const char *name, const char *path, void *data ext = ecore_file_ext_get(name); if (!ext) return; - if (!filelist->eulogium->printer.file_handlers) - return; - for (i = 0; filelist->eulogium->printer.file_handlers[i] != NULL; i++) - if (strncmp(ext, filelist->eulogium->printer.file_handlers[i], strlen(ext)) == 0) +// if (!filelist->eulogium->printer.file_handlers) +// return; +// for (i = 0; filelist->eulogium->printer.file_handlers[i] != NULL; i++) + if (strncmp(ext, /*filelist->eulogium->printer.file_handlers[i] */"gcode", strlen(ext)) == 0) valid_ext++; if (!valid_ext) return; @@ -2483,7 +3211,7 @@ static void _cb_populate_filelist(const char *name, const char *path, void *data elm_image_resizable_set(icon, EINA_FALSE, EINA_FALSE); evas_object_show(icon); - filelist_entry = malloc(sizeof(struct _filelist_entry_data)); + filelist_entry = malloc(sizeof(struct _filelist_entry_data)); /* XXX free on destroy */ filelist_entry->filelist = filelist; filelist_entry->filepath = filepath; eulogium_item_list_sorted_insert(filelist->list, icon, name, NULL, _cb_select_file, filelist_entry, _cb_dirfile_sort); @@ -2555,13 +3283,39 @@ static void _set_hotspot_power_cb(void *data, Evas_Object *obj, void *event_info { struct eulogium_data *eulogium = data; - eldbus_proxy_call(eulogium->dbus.proxy[NETWORK], "setHotspotPower", on_method_generic_ret, NULL, -1, "b", elm_check_state_get(obj)); + eldbus_proxy_call(eulogium->dbus.proxy[NETWORK], "setHotspotEnabled", on_method_generic_ret, NULL, -1, "b", elm_check_state_get(obj)); +} + +static void network_wifi_list(struct eulogium_data *eulogium, Evas_Object *list, struct network_data *networks) +{ + Evas_Object *icon; + uint_fast16_t i = 0; + + if (!networks) + return; + + + icon = elm_icon_add(list); + elm_icon_standard_set(icon, "wifi-wpa-icon"); + evas_object_show(icon); + for (i = 0; networks[i].obj_path; i++) + if (networks[i].tech == TECH_WIFI) { + struct _wifilist_data *wifilist; + + wifilist = malloc(sizeof(struct _wifilist_data)); /* XXX free on destroy */ + wifilist->eulogium = eulogium; + wifilist->network = &networks[i]; + + eulogium_item_list_append(list, NULL, networks[i].ssid, NULL, _cb_select_wifi, wifilist); + } } -static void _menu_generate_wifilist(struct eulogium_data *eulogium, Evas_Object *list, struct wifi_def *wifi) +static void _menu_generate_wifilist(struct eulogium_data *eulogium, Evas_Object *list, struct network_data *networks) { Evas_Object *icon; + network_wifi_list(eulogium, list, networks); + icon = elm_icon_add(list); elm_icon_standard_set(icon, "user-home"); evas_object_show(icon); @@ -2621,6 +3375,8 @@ Evas_Object *menu_widget_list(struct eulogium_data *eulogium, Evas_Object *paren obj = elm_label_add(box); elm_object_text_set(obj, _(menu->title)); /* XXX THIS IS NOT ALWAYS IN DATA! */ + elm_object_style_set(obj, "title"); + evas_object_anti_alias_set(obj, EINA_FALSE); evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(obj); elm_box_pack_start(box, obj); @@ -2637,7 +3393,7 @@ Evas_Object *menu_widget_list(struct eulogium_data *eulogium, Evas_Object *paren if (menu->type == LIST_FILE) _menu_generate_filelist(eulogium, list, &menu->dir); if (menu->type == LIST_WIFI) - _menu_generate_wifilist(eulogium, list, NULL); + _menu_generate_wifilist(eulogium, list, eulogium->networks); eulogium_item_list_go(list); evas_object_show(list); elm_box_pack_end(box, list); @@ -2657,157 +3413,11 @@ Evas_Object *menu_widget_list(struct eulogium_data *eulogium, Evas_Object *paren return box; } -struct _multi_screen_next_cb_data { - struct eulogium_data *eulogium; - struct multi_screen_data *screen_data; - uint_fast8_t pagenum; - Eina_Bool pageindex; -}; - -static void _eulogium_multi_screen_next_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) -{ - Evas_Object *content; - struct eulogium_data *eulogium = ((struct _multi_screen_next_cb_data *)data)->eulogium; - uint_fast8_t pagenum = ((struct _multi_screen_next_cb_data *)data)->pagenum; - Eina_Bool pageindex = ((struct _multi_screen_next_cb_data *)data)->pageindex; - struct multi_screen_data *screen_data = ((struct _multi_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 = eulogium_multi_screen_menu(eulogium, eulogium->navi, screen_data, pagenum, pageindex); - if (content) - elm_naviframe_item_simple_push(eulogium->navi, content); - /* XXX what else? */ - } - free(data); -} - static void _cb_material_set(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { printf("Material: %s selected\n", (char *)data); } -Evas_Object *eulogium_multi_screen_menu(struct eulogium_data *eulogium, Evas_Object *parent, struct multi_screen_data *screen_data, uint_fast8_t pagenum, Eina_Bool pageindex) /* TODO swap parent/eulogium */ -{ - Evas_Object *object; - Evas_Object *_top, *_bottom; - struct _multi_screen_next_cb_data *multi_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->screen[pagenum].text) { - object = elm_label_add(_top); - elm_object_text_set(object, _(screen_data->screen[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->screen[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); - - multi_screen_next_cb_data = malloc(sizeof(struct _multi_screen_next_cb_data)); - multi_screen_next_cb_data->eulogium = eulogium; - multi_screen_next_cb_data->screen_data = screen_data; - multi_screen_next_cb_data->pagenum = pagenum + 1; - multi_screen_next_cb_data->pageindex = EINA_TRUE; - - if (screen_data->screen[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->screen[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->screen[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->screen[pagenum].next_button)); - evas_object_smart_callback_add(object, "clicked", _eulogium_multi_screen_next_cb, multi_screen_next_cb_data); - evas_object_show(object); - elm_box_pack_end(_bottom, object); - } - - return eulogium_split_screen(parent, _top, _bottom); -} - Evas_Object *eulogium_menu_confirm(Evas_Object *parent, const char *msg, const char *prev, const struct button_def *next) { @@ -2911,130 +3521,6 @@ Evas_Object *eulogium_tripple_button_menu(Evas_Object *parent, const struct butt return eulogium_split_screen(parent, _top, _bottom); } -static Eina_Bool _dial_change_delay(void *data) -{ - Evas_Object *dial = data; - Ecore_Timer *delay; - - evas_object_data_set(dial, "delay", NULL); - evas_object_smart_callback_call(dial, "delay,changed", NULL); - - return ECORE_CALLBACK_CANCEL; -} - -static Eina_Bool _dial_change(void *data, int type, void *event_info EINA_UNUSED) -{ - Evas_Object *dial = data; - Ecore_Timer *delay; - double value, step; - -/* TODO XXX we call this dirty little hack because debian's v1.8 of elm does not offer us to actually call drag,left - * evas_object_smart_callback_call(dial, "drag,left", NULL); would have been much cleaner and we didn't need to do - * the val+step get/set thing and thus also benefit from delay,changed which we now 'fake' badly. - */ - value = elm_slider_value_get(dial); - step = elm_slider_step_get(dial); - if (type == INPUT_MOUSE_WHEEL_UP) - elm_slider_value_set(dial, value + step); - if (type == INPUT_MOUSE_WHEEL_DOWN) - elm_slider_value_set(dial, value - step); - evas_object_smart_callback_call(dial, "changed", NULL); - delay = evas_object_data_get(dial, "delay"); - ecore_timer_del(delay); - delay = ecore_timer_add(0.5, _dial_change_delay, dial); /* TODO make define for delay */ - evas_object_data_set(dial, "delay", delay); - - return ECORE_CALLBACK_PASS_ON; -} - -static void _dial_send_update(void *data, Evas_Object *eo, void *event_info EINA_UNUSED) -{ - Eldbus_Proxy *proxy = data; - - eldbus_proxy_call(proxy, "setBrightness", NULL, NULL, -1, "d", elm_slider_value_get(eo)); -} - -Evas_Object *eulogium_settings_dial(Evas_Object *parent, struct eulogium_data *eulogium) -{ - Evas_Object *_top, *_bottom, *obj; - - /* if type is tar/cur do something different TODO */ - _top = elm_slider_add(parent); - elm_object_text_set(_top, "Brightness:"); - elm_object_focus_allow_set(_top, EINA_FALSE); - elm_slider_unit_format_set(_top, "%1.0f%"); - elm_slider_min_max_set(_top, 0, 100); - elm_slider_step_set(_top, 1.0); - evas_object_size_hint_weight_set(_top, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(_top, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_smart_callback_add(_top, "delay,changed", _dial_send_update, eulogium->dbus.proxy[LED]); - eulogium->event_inc = ecore_event_handler_add(INPUT_MOUSE_WHEEL_UP, _dial_change, _top); - eulogium->event_dec = ecore_event_handler_add(INPUT_MOUSE_WHEEL_DOWN, _dial_change, _top); - evas_object_show(_top); - - obj = elm_label_add(_top); - elm_object_text_set(obj, "100%"); - evas_object_show(obj); - elm_object_part_content_set(_top, "end", obj); - - _bottom = elm_button_add(parent); - elm_object_text_set(_bottom, _("Click when done")); /* TODO, make define for this text */ - evas_object_size_hint_weight_set(_bottom, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(_bottom, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_smart_callback_add(_bottom, "clicked", _cb_content_prev_set, eulogium); - evas_object_show(_bottom); - - return eulogium_split_screen(parent, _top, _bottom); -} - -static struct multi_screen screen[] = { - { - .type = NONE, - .text = "Welcome
to your new Ultimaker", - .func = NULL, - .data = NULL, - .prev_button = "Skip Wizzard!", - .next_button = "Continue", - }, - { - .type = MATERIAL, - .text = "Choose material", - .func = NULL, - .data = NULL, - .prev_button = "Skip Wizzard!", - .next_button = "Continue", - }, - { - .type = FUNC, - .text = "Level bed", - .func = NULL, - .data = "Bed leveling call", - .prev_button = "Skip Wizzard!", - .next_button = "Continue", - }, - { - .type = PROGRESS, - .text = "Heating ...", - .func = NULL, - .data = "progress object", - .prev_button = "Skip Wizzard!", - .next_button = "Continue", - }, - { - .type = NONE, - .text = "Lets print!", - .func = NULL, - .data = NULL, - .prev_button = NULL, - .next_button = "Let's Print!", - }, - { .type = END, /* sentinel */ }, -}; - -static struct multi_screen_data screen_data = { - .screen = &screen[0], -}; - Evas_Object *eulogium_main_menu(Evas_Object *window, struct eulogium_data *eulogium) { Evas_Object *content; @@ -3042,74 +3528,25 @@ Evas_Object *eulogium_main_menu(Evas_Object *window, struct eulogium_data *eulog eulogium->navi = elm_naviframe_add(window); if (!eulogium->navi) return NULL; - elm_naviframe_prev_btn_auto_pushed_set(eulogium->navi, EINA_FALSE); /* We removed this from the theme, enabling it causes errors */ + /* We removed the prev button from the theme, enabling it causes errors */ + elm_naviframe_prev_btn_auto_pushed_set(eulogium->navi, EINA_FALSE); + /* Except the first frame, never safe any frames after pop */ + 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 */ content = eulogium_tripple_button_menu(eulogium->navi, &but_main_print, &but_main_mathot, &but_main_system); - if (!content) - return NULL; - elm_naviframe_item_simple_push(eulogium->navi, content); + ui_stack_push(eulogium, content, PAGE_BOTTOM); return eulogium->navi; } -static void eulogium_setup(struct eulogium_data *eulogium) -{ - while (screen_data.screen[screen_data.count].type != END) - screen_data.count++; - - /* This is silly, barding redonkylous and will get fixed in the refactoring */ - eulogium->procedures = procedures_init(); - eulogium_button_cb_data_set(&but_return, eulogium); - eulogium_button_cb_data_set(&but_print_abort_confirm, eulogium); - eulogium_button_cb_data_set(&but_print_abort, eulogium); - eulogium_button_cb_data_set(&but_print_tune, eulogium); - eulogium_button_cb_data_set(&but_main_print, eulogium); - eulogium_button_cb_data_set(&but_print_ignore, eulogium); - eulogium_button_cb_data_set(&but_print_local, eulogium); - eulogium_button_cb_data_set(&but_print_usb, eulogium); - eulogium_button_cb_data_set(&but_main_mathot, eulogium); - eulogium_button_cb_data_set(&but_main_system, eulogium); - eulogium_button_cb_data_set(&but_system_maintenance, eulogium); - eulogium_button_cb_data_set(&but_system_settings, eulogium); - eulogium_button_cb_data_set(&but_material_change, eulogium); - eulogium_button_cb_data_set(&but_material_settings, eulogium); - eulogium_button_cb_data_set(&but_settings_material_1, eulogium); - eulogium_button_cb_data_set(&but_settings_material_2, eulogium); - eulogium_button_cb_data_set(&but_change_material_1, eulogium); - eulogium_button_cb_data_set(&but_change_material_2, eulogium); - eulogium_button_cb_data_set(&but_mathot_material, eulogium); - eulogium_button_cb_data_set(&but_mathot_hotend, eulogium); - eulogium_button_cb_data_set(&but_hotend_change, eulogium); - eulogium_button_cb_data_set(&but_hotend_settings, eulogium); - eulogium_button_cb_data_set(&but_settings_hotend_1, eulogium); - eulogium_button_cb_data_set(&but_settings_hotend_2, eulogium); - eulogium_button_cb_data_set(&but_change_hotend_1, eulogium); - eulogium_button_cb_data_set(&but_change_hotend_2, eulogium); -} - -static void _on_get_print_name_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) -{ - struct eulogium_data *eulogium = data; - const char *errname, *errmsg; - - if (eldbus_message_error_get(msg, &errname, &errmsg)) { - EINA_LOG_ERR("%s %s", errname, errmsg); - return; - } - if (!eldbus_message_arguments_get(msg, "s", &eulogium->print.name)) { - EINA_LOG_ERR("Failed to get printName message."); - return; - } - eulogium->print.name_changed = EINA_TRUE; - EINA_LOG_INFO("Printer name updated"); - /* TODO Call generic error screen in case of trouble here? */ -} - +#if 0 static void eulogium_printer_status_set(struct eulogium_data *eulogium, struct _status_msg *status) { Evas_Object *content = NULL; - EINA_LOG_WARN("Printer status: %s", status->s); + EINA_LOG_ERR("Printer status: %s", status->s); if (eulogium->printer.status != status->i) { switch (status->i) { @@ -3180,6 +3617,7 @@ static void eulogium_printer_status_set(struct eulogium_data *eulogium, struct _ eulogium->printer.status = status->i; } } +#endif static void _on_get_file_handlers_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) { @@ -3212,14 +3650,10 @@ static void _on_get_file_handlers_ret(void *data, const Eldbus_Message *msg, Eld strncpy(file_handlers[i], file_handler, fhandler_size); } file_handlers[i] = NULL; /* sentinel */ - eulogium->printer.file_handlers = file_handlers; -} - -static void _on_status_changed_ret(void *data, const Eldbus_Message *msg) -{ - _on_get_status_ret(data, msg, NULL); + eulogium->printer.file_handlers = file_handlers; /* TODO do directly, only pass **file_handlers as data */ } +/* XXX TODO: this is being called somewhere where it shouldn't, making only hotplug usb events work */ static void eulogium_disk_free(struct mount_data *mount) { eeze_disk_free(mount->disk); @@ -3227,7 +3661,6 @@ static void eulogium_disk_free(struct mount_data *mount) free(mount->id); eldbus_proxy_unref(mount->proxy); free(mount); - mount = NULL; } static void _on_where_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) @@ -3253,18 +3686,17 @@ static void _on_where_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending return; /* Never use a medium that is mounted under dev, proc, run or sys. */ - if (!(strncmp(where, "/dev/", 5) && - strncmp(where, "/proc/", 6) && - strncmp(where, "/run/", 5) && - strncmp(where, "/sys/", 5))) + if (!(strncmp(where, "/dev/", sizeof("/dev/") - 1) && + strncmp(where, "/proc/", sizeof("/proc/") - 1) && + strncmp(where, "/run/", sizeof("/run/") - 1) && + strncmp(where, "/sys/", sizeof("/sys/") - 1))) return; mount->disk = eeze_disk_new_from_mount(where); eeze_disk_scan(mount->disk); EINA_LOG_ERR("Medium mounted at %s of type %d", where, eeze_disk_type_get(mount->disk)); - if (eeze_disk_type_get(mount->disk) == EEZE_DISK_TYPE_USB) - *mount->mounts = eina_list_append(*mount->mounts, mount); - if ((eeze_disk_type_get(mount->disk) == EEZE_DISK_TYPE_FLASH) && + if (((eeze_disk_type_get(mount->disk) == EEZE_DISK_TYPE_USB) || + (eeze_disk_type_get(mount->disk) == EEZE_DISK_TYPE_FLASH)) && (!strstr(eeze_disk_devpath_get(mount->disk), "mmcblk0"))) /* XXX skip using mmcblk0 as that is our root fs for now. This may be handled by udev making it invisible. */ *mount->mounts = eina_list_append(*mount->mounts, mount); else @@ -3316,7 +3748,7 @@ static void _on_unit_new_ret(void *data, const Eldbus_Message *msg) return; } ext = ecore_file_ext_get(id); - if (strncmp(ext, "mount", 5)) + if (strcmp(ext, "mount")) return; obj = eldbus_object_get(eulogium->dbus.conn, "org.freedesktop.systemd1", unit); @@ -3338,13 +3770,14 @@ static void _on_unit_new_ret(void *data, const Eldbus_Message *msg) } strncpy(mount->id, id, id_len); mount->proxy = eldbus_proxy_get(obj, "org.freedesktop.systemd1.Mount"); - mount->mounts = &eulogium->mounts; if (!mount->proxy) { EINA_LOG_WARN("Could not get dbus proxy for (%s).", id); free(mount->id); free(mount); return; } + eldbus_proxy_ref(mount->proxy); + mount->mounts = &eulogium->mounts; EINA_LOG_ERR("Medium inserted (%s)", id); eldbus_proxy_property_get(mount->proxy, "Result", _on_result_ret, mount); } @@ -3397,6 +3830,7 @@ static void _on_list_units_ret(void *data, const Eldbus_Message *msg, Eldbus_Pen free(mount); break; } + eldbus_proxy_ref(mount->proxy); mount->mounts = &eulogium->mounts; EINA_LOG_ERR("Medium detected (%s)", id); eldbus_proxy_property_get(mount->proxy, "Result", _on_result_ret, mount); @@ -3432,7 +3866,7 @@ static void _on_unit_removed_ret(void *data, const Eldbus_Message *msg) return; } ext = ecore_file_ext_get(id); - if (strncmp(ext, "mount", 5)) + if (strcmp(ext, "mount")) return; obj = eldbus_object_get(eulogium->dbus.conn, "org.freedesktop.systemd1", unit); @@ -3449,6 +3883,12 @@ static void _on_unit_removed_ret(void *data, const Eldbus_Message *msg) eulogium_disk_free(mount); eulogium->mounts = eina_list_remove_list(eulogium->mounts, list); } + /* XXX if usb/local selection screen is up, pop it from stack and show a 'media removed' popup, + * and show the local without popup instead. + * If we are in the file-selection list, pop the whole stack up until the selection dialog. + * Use PAGE_USB for example to indicate what to pop from the stack. + * ui_stack_page_invalidate(eulogium->navi, PAGE_USB); // XXX Yes, we only support 1 usb mount at a time + */ /* TODO: UI Stuff/signals */ } @@ -3472,8 +3912,8 @@ static void _on_get_available_procedures_ret(void *data, const Eldbus_Message *m if (eldbus_message_iter_arguments_get(avail_proc_struct, "sb", &key, &executable)) { uint_fast16_t i; - for (i = 0; eulogium->procedures[i].key ; i++) { - if (strncmp(key, eulogium->procedures[i].key, eulogium->procedures[i].keylen)) { + for (i = 0; eulogium->procedures[i].key ; i++) { /* XXX use enum/null rather then i to iterate over array */ + if (strcmp(key, eulogium->procedures[i].key)) { eulogium->procedures[i].executable = executable; eulogium->procedures[i].available = EINA_TRUE; } else { @@ -3484,10 +3924,9 @@ static void _on_get_available_procedures_ret(void *data, const Eldbus_Message *m } } -static void _on_get_active_procedures_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +static void _on_get_active_procedures_ret(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) { const char *errname, *errmsg; - struct eulogium_data *eulogium = data; Eldbus_Message_Iter *array, *act_proc_struct; char *key, *step; @@ -3496,28 +3935,36 @@ static void _on_get_active_procedures_ret(void *data, const Eldbus_Message *msg, return; } if (!eldbus_message_arguments_get(msg, "a(ss)", &array)) { - EINA_LOG_ERR("Message content does not match expected \"a(ss)\" signature."); + EINA_LOG_ERR("Message content does not match expected \"a(ss)\" signature."); /* TODO make macro/function of this as we re-use it often */ return; } while (eldbus_message_iter_get_and_next(array, 'r', &act_proc_struct)) { if (eldbus_message_iter_arguments_get(act_proc_struct, "ss", &key, &step)) { - uint_fast16_t i; + struct procedure_data *procedure; - for (i = 0; eulogium->procedures[i].key ; i++) { - if (strncmp(key, eulogium->procedures[i].key, eulogium->procedures[i].keylen)) { - printf("Step: %s\n", step); - } else { - EINA_LOG_WARN("Procedure not found: '%s'", key); - } + EINA_LOG_ERR("Key '%s' step '%s'", key, step); + procedure = procedure_get(key); + if (!procedure) { + EINA_LOG_ERR("Unknown procedure %s", key); + return; } + procedure->status = PROC_ACTIVE; + procedure->step_active = procedure_step_get(procedure, step); + + if (!procedure->step_active) { + EINA_LOG_ERR("Unknown step %s in procedure %s", step, key); + return; + } + procedure_process_step(data, procedure); } } } -static void _on_procedure_start_ret(void *data EINA_UNUSED, const Eldbus_Message *msg) +static void _on_procedure_start_ret(void *data, const Eldbus_Message *msg) { const char *errname, *errmsg; const char *key, *step; + struct procedure_data *procedure; if (eldbus_message_error_get(msg, &errname, &errmsg)) { EINA_LOG_ERR("%s %s", errname, errmsg); @@ -3527,13 +3974,27 @@ static void _on_procedure_start_ret(void *data EINA_UNUSED, const Eldbus_Message EINA_LOG_ERR("Message content does not match expected \"ss\" signature. (%s)", eldbus_message_signature_get(msg)); return; } - EINA_LOG_ERR("Key '%s' step %s", key, step); + EINA_LOG_ERR("Key '%s' step '%s'", key, step); + procedure = procedure_get(key); + if (!procedure) { + EINA_LOG_ERR("Unknown procedure %s", key); + return; + } + procedure->status = PROC_ACTIVE; + procedure->step_active = procedure_step_get(procedure, step); + + if (!procedure->step_active) { + EINA_LOG_ERR("Unknown step %s in procedure %s", step, key); + return; + } + procedure_process_step(data, procedure); } static void _on_procedure_next_step_ret(void *data EINA_UNUSED, const Eldbus_Message *msg) { const char *errname, *errmsg; const char *key, *step; + struct procedure_data *procedure; if (eldbus_message_error_get(msg, &errname, &errmsg)) { EINA_LOG_ERR("%s %s", errname, errmsg); @@ -3543,13 +4004,25 @@ static void _on_procedure_next_step_ret(void *data EINA_UNUSED, const Eldbus_Mes EINA_LOG_ERR("Message content does not match expected \"ss\" signature. (%s)", eldbus_message_signature_get(msg)); return; } - EINA_LOG_ERR("next: Key '%s' step %s", key, step); + EINA_LOG_ERR("next: Key '%s' step '%s'", key, step); + procedure = procedure_get(key); + if (!procedure) { + EINA_LOG_WARN("Unknown procedure, %s.", key); + return; + } + procedure->step_active = procedure_step_get(procedure, step); + if (!procedure->step_active) { + EINA_LOG_ERR("Unknown step %s in procedure %s", step, key); + return; + } + procedure_process_step(data, procedure); } static void _on_procedure_finished_ret(void *data EINA_UNUSED, const Eldbus_Message *msg) { const char *errname, *errmsg; const char *key; + struct procedure_data *procedure; if (eldbus_message_error_get(msg, &errname, &errmsg)) { EINA_LOG_ERR("%s %s", errname, errmsg); @@ -3560,22 +4033,37 @@ static void _on_procedure_finished_ret(void *data EINA_UNUSED, const Eldbus_Mess return; } EINA_LOG_ERR("finshed Key '%s'", key); + procedure = procedure_get(key); + if (!procedure) { + EINA_LOG_ERR("Unknown procedure %s", key); + return; + } + procedure->status = PROC_FINISHED; + procedure->step_active = NULL; + procedure_process_step(data, procedure); + // XXX procedure_metadata_key_get(key) } -static void _on_get_error_ret(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +static void _on_get_error_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) { - const char *errname, *errmsg, *errormsg; + struct eulogium_data *eulogium = data; + const char *errname, *errmsg, *error_msg; + uint8_t error_level; + uint16_t error_code; if (eldbus_message_error_get(msg, &errname, &errmsg)) { EINA_LOG_ERR("%s %s", errname, errmsg); return; } - if (!eldbus_message_arguments_get(msg, "s", &errormsg)) { - EINA_LOG_ERR("Message content does not match expected \"s\" signature. (%s)", eldbus_message_signature_get(msg)); + if (!eldbus_message_arguments_get(msg, "yqs", &error_level, &error_code, &error_msg)) { + EINA_LOG_ERR("Message content does not match expected \"yqs\" signature. (%s)", eldbus_message_signature_get(msg)); return; } - if (strlen(errormsg) > 0) - EINA_LOG_ERR("Printer Error '%s' received", errormsg); + EINA_LOG_ERR("Printer Error %u '%s' received (level %u)", error_code, error_msg, error_level); + if (error_level > 254) /* TODO: enum */ + return; + + eulogium_generic_error(eulogium, error_code, error_msg); /* TODO Call generic error screen in case of trouble here? */ } @@ -3598,6 +4086,7 @@ static uint_fast16_t _dbus_members_map(Eldbus_Proxy *proxy, struct menu_entry_de return i; } +/* move this to dbus_common */ static int eulogium_dbus_init(struct eulogium_data *eulogium) { Eldbus_Object *obj; @@ -3657,10 +4146,35 @@ static int eulogium_dbus_init(struct eulogium_data *eulogium) EINA_LOG_WARN("Could not get dbus network proxy."); return -EFAULT; } + + /* Find a nice home for these */ + eldbus_proxy_signal_handler_add(proxy, "UnitNew", _on_unit_new_ret, eulogium); + eldbus_proxy_signal_handler_add(proxy, "UnitRemoved", _on_unit_removed_ret, eulogium); + msg = eldbus_proxy_method_call_new(proxy, "ListUnitsFiltered"); + iter = eldbus_message_iter_get(msg); + array = eldbus_message_iter_container_new(iter, 'a', "s"); + if (!array) + EINA_LOG_ERR("Empty container"); + eldbus_message_iter_basic_append(array, 's', "mounted"); + eldbus_message_iter_container_close(iter, array); + eldbus_proxy_send(proxy, msg, _on_list_units_ret, eulogium, -1); + /* eldbus_proxy_call(proxy, "ListUnitsFiltered", _on_list_units_ret, eulogium, -1, "as", "{mounted}"); */ + + return 0; +} + +static void eulogium_setup(struct eulogium_data *eulogium) +{ + /* This is silly, barding redonkylous and will get fixed in the refactoring */ + if (eulogium_dbus_init(eulogium)) + EINA_LOG_CRIT("Griffin D-Bus initialization failed!"); + eulogium->procedures = procedures_init(eulogium->dbus.proxy[PRINTER]); + network_init(eulogium->dbus.proxy[NETWORK]); + _dbus_members_map(eulogium->dbus.proxy[NETWORK], menu_settings_network.entry); /* TODO: put signal/method name strings in macro/LUT */ - eldbus_proxy_call(eulogium->dbus.proxy[NETWORK], "getNetworkInfo", on_method_get_network_info_ret, eulogium, -1, ""); - eldbus_proxy_signal_handler_add(eulogium->dbus.proxy[NETWORK], "NetworkInfoChanged", on_signal_network_info_changed_ret, eulogium); + eldbus_proxy_call(eulogium->dbus.proxy[NETWORK], "getNetworkServicesInfo", on_method_get_network_info_ret, eulogium, -1, "b", 1); + eldbus_proxy_signal_handler_add(eulogium->dbus.proxy[NETWORK], "networkServiceInfoChanged", on_signal_network_info_changed_ret, eulogium); eldbus_proxy_call(eulogium->dbus.proxy[PRINTER], "getError", _on_get_error_ret, eulogium, -1, ""); eldbus_proxy_signal_handler_add(eulogium->dbus.proxy[PRINTER], "onError", _on_error_ret, eulogium); @@ -3672,26 +4186,61 @@ static int eulogium_dbus_init(struct eulogium_data *eulogium) //eldbus_proxy_call(eulogium->dbus.proxy[PRINTER], "getFileHandlers", _on_get_file_handlers_ret, eulogium, -1, ""); //eldbus_proxy_call(eulogium->dbus.proxy[PRINTER], "getStatus", _on_get_status_ret, eulogium, -1, ""); //eldbus_proxy_call(eulogium->dbus.proxy[PRINTER], "getPrintName", _on_get_print_name_ret, eulogium, -1, ""); - //eldbus_proxy_signal_handler_add(eulogium->dbus.proxy[PRINTER], "statusChanged", _on_status_changed_ret, eulogium); + eldbus_proxy_call(eulogium->dbus.proxy[PRINTER], "getProcedureMetaData", on_method_get_procedure_metadata_ret, &eulogium->procedures[PROC_PRINT], -1, "s", eulogium->procedures[PROC_PRINT].key); - eldbus_proxy_signal_handler_add(proxy, "UnitNew", _on_unit_new_ret, eulogium); - eldbus_proxy_signal_handler_add(proxy, "UnitRemoved", _on_unit_removed_ret, eulogium); - msg = eldbus_proxy_method_call_new(proxy, "ListUnitsFiltered"); - iter = eldbus_message_iter_get(msg); - array = eldbus_message_iter_container_new(iter, 'a', "s"); - if (!array) - EINA_LOG_ERR("Empty container"); - eldbus_message_iter_basic_append(array, 's', "mounted"); - eldbus_message_iter_container_close(iter, array); - eldbus_proxy_send(proxy, msg, _on_list_units_ret, eulogium, -1); - /* eldbus_proxy_call(proxy, "ListUnitsFiltered", _on_list_units_ret, eulogium, -1, "as", "{mounted}"); */ + eulogium_button_cb_data_set(&but_return, eulogium); + eulogium_button_cb_data_set(&but_print_abort_confirm, eulogium); + eulogium_button_cb_data_set(&but_print_abort, eulogium); + eulogium_button_cb_data_set(&but_print_tune, eulogium); + eulogium_button_cb_data_set(&but_main_print, eulogium); + eulogium_button_cb_data_set(&but_print_ignore, eulogium); + eulogium_button_cb_data_set(&but_print_local, eulogium); + eulogium_button_cb_data_set(&but_print_usb, eulogium); + eulogium_button_cb_data_set(&but_main_mathot, eulogium); + eulogium_button_cb_data_set(&but_main_system, eulogium); + eulogium_button_cb_data_set(&but_system_maintenance, eulogium); + eulogium_button_cb_data_set(&but_system_settings, eulogium); + eulogium_button_cb_data_set(&but_material_change, eulogium); + eulogium_button_cb_data_set(&but_material_settings, eulogium); + eulogium_button_cb_data_set(&but_settings_material_1, eulogium); + eulogium_button_cb_data_set(&but_settings_material_2, eulogium); + eulogium_button_cb_data_set(&but_change_material_1, eulogium); + eulogium_button_cb_data_set(&but_change_material_2, eulogium); + eulogium_button_cb_data_set(&but_mathot_material, eulogium); + eulogium_button_cb_data_set(&but_mathot_hotend, eulogium); + eulogium_button_cb_data_set(&but_hotend_change, eulogium); + eulogium_button_cb_data_set(&but_hotend_settings, eulogium); + eulogium_button_cb_data_set(&but_settings_hotend_1, eulogium); + eulogium_button_cb_data_set(&but_settings_hotend_2, eulogium); + eulogium_button_cb_data_set(&but_change_hotend_1, eulogium); + eulogium_button_cb_data_set(&but_change_hotend_2, eulogium); - return 0; + 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_getall(); } EAPI_MAIN int elm_main(int argc, char **argv) { Eina_Bool quit_option = EINA_FALSE; + Eina_Bool verbose = EINA_FALSE; static const Ecore_Getopt optdesc = { PACKAGE_NAME, "%prog [options]", @@ -3701,6 +4250,7 @@ EAPI_MAIN int elm_main(int argc, char **argv) "eulogium program", 0, { + ECORE_GETOPT_STORE_TRUE('v', "verbose", "Enable debug output"), ECORE_GETOPT_LICENSE('L', "license"), ECORE_GETOPT_COPYRIGHT('C', "copyright"), ECORE_GETOPT_VERSION('V', "version"), @@ -3709,6 +4259,7 @@ EAPI_MAIN int elm_main(int argc, char **argv) } }; Ecore_Getopt_Value values[] = { + ECORE_GETOPT_VALUE_BOOL(verbose), ECORE_GETOPT_VALUE_BOOL(quit_option), ECORE_GETOPT_VALUE_BOOL(quit_option), ECORE_GETOPT_VALUE_BOOL(quit_option), @@ -3717,39 +4268,40 @@ 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, - .print = { - .name = NULL, - .url = NULL, - .block = EINA_TRUE, - .block_active = EINA_FALSE, - }, .printer = { .status = DISCONNECTED, .file_handlers = NULL, }, + .networks = NULL, .footer = NULL, }; Evas_Object *window, *object; // Evas_Object *splash_window; // Eina_List *engines, *l; - eeze_init(); - eeze_disk_function(); - if (!(eeze_disk_can_mount() && eeze_disk_can_unmount())) - EINA_LOG_ERR("No disk (u)mount support available"); - elm_need_eldbus(); - args = ecore_getopt_parse(&optdesc, values, argc, argv); if (args < 0) { EINA_LOG_CRIT("Could not parse arguments."); return EXIT_FAILURE; } - INPUT_MOUSE_WHEEL_UP = ecore_event_type_new(); - INPUT_MOUSE_WHEEL_DOWN = ecore_event_type_new(); + /* TODO: Fix logging domain stuff */ + if (verbose) + eina_log_domain_level_set(PACKAGE_NAME, EINA_LOG_LEVEL_DBG); + else + eina_log_domain_level_set(PACKAGE_NAME, EINA_LOG_LEVEL_INFO); + + eeze_init(); + eeze_disk_function(); + elm_need_eldbus(); + + input_init(); // elm_prefs_data_new(); /* TODO */ elm_policy_set(ELM_POLICY_QUIT, /* ELM_POLICY_QUIT_NONE */ ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); @@ -3766,10 +4318,13 @@ EAPI_MAIN int elm_main(int argc, char **argv) textdomain(PACKAGE); #endif elm_app_info_set(NULL, PACKAGE, NULL); /* TODO */ -#if (ELM_VERSION_MAJOR > 1) || (ELM_VERSION_MINOR >= 10) - elm_config_accel_preference_set("accel"); -#endif - elm_theme_overlay_add(NULL, "./default.edj"); +// elm_app_info_set(elm_main, PACKAGE, "themes/default.edj"); + + 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); + free(buf); #if 0 /* TODO make icon */ icon = evas_object_image_add(evas_object_evas_get(win)); @@ -3777,12 +4332,14 @@ EAPI_MAIN int elm_main(int argc, char **argv) evas_object_image_file_set(o, buf, NULL); elm_win_icon_object_set(win, o); #endif +#if (ELM_VERSION_MAJOR > 1) || (ELM_VERSION_MINOR >= 10) + elm_config_accel_preference_set("accel"); +#endif elm_config_focus_highlight_enabled_set(EINA_FALSE); elm_config_focus_highlight_animate_set(EINA_FALSE); elm_config_softcursor_mode_set(ELM_SOFTCURSOR_MODE_OFF); - if (eulogium_dbus_init(&eulogium)) - EINA_LOG_CRIT("Griffin D-Bus initialization failed!"); + ui_init(); /* TODO: move into its own init */ window = elm_win_add(NULL, PACKAGE_NAME, ELM_WIN_BASIC); @@ -3793,6 +4350,8 @@ EAPI_MAIN int elm_main(int argc, char **argv) evas_object_repeat_events_set(window, EINA_TRUE); elm_win_autodel_set(window, EINA_TRUE); evas_object_smart_callback_add(window, "delete,request", _cb_eulogium_exit, NULL); + elm_win_focus_highlight_enabled_set(window, EINA_FALSE); + elm_win_focus_highlight_animate_set(window, EINA_FALSE); object = elm_bg_add(window); if (!object) @@ -3821,7 +4380,7 @@ EAPI_MAIN int elm_main(int argc, char **argv) evas_object_size_hint_weight_set(object, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_color_set(object, 0, 0, 0, 0); evas_object_repeat_events_set(object, EINA_TRUE); - evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_WHEEL, _cb_eulogium_input_wheel, window); /* TODO elm_obj_ev? event propagation issues? */ + evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_WHEEL, input_mouse_wheel_cb, window); /* TODO elm_obj_ev? event propagation issues? */ /* TODO: don't these two input events repeat/fall through, everything else, may/should. */ evas_object_show(object); elm_win_resize_object_add(window, object); @@ -3829,6 +4388,10 @@ 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); @@ -3838,6 +4401,8 @@ EAPI_MAIN int elm_main(int argc, char **argv) free(eulogium.printer.file_handlers[i]); free(eulogium.printer.file_handlers); /* TODO: Cleanup function? */ + procedures_shutdown(); + elm_shutdown(); eeze_shutdown(); diff --git a/src/eulogium.h b/src/eulogium.h index ea16cbd..fa11711 100644 --- a/src/eulogium.h +++ b/src/eulogium.h @@ -16,21 +16,12 @@ #include #include "eulogium_item_list.h" +#include "network.h" +#include "print_data.h" #include "procedures.h" - -#define IPV4_MAX_LEN 16 /* 255.255.255.255\0 */ -#define IPV6_MAX_LEN 40 /* ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\0 */ -#define SSID_MAX_LEN 33 /* Section 7.3.2.1 SSID element of IEE802.11-2007 + \0 */ +#include "settings_data.h" #include "ui_widgets.h" -enum screen_type { - NONE, - FUNC, - MATERIAL, - PROGRESS, - END, /* sentinel */ -}; - struct printer_data { enum printer_status status; char **file_handlers; @@ -61,22 +52,6 @@ struct mount_data { Eina_List **mounts; }; -#define _TECH_ETHERNET "ethernet" -#define _TECH_WIFI "wifi" - -enum network_tech { - ETHERNET, - WIFI, -}; - -struct network_data { - char *obj_path; - enum network_tech tech; - char ipv4[IPV4_MAX_LEN]; - char ipv6[IPV6_MAX_LEN]; - char ssid[SSID_MAX_LEN]; -}; - struct eulogium_data { Evas_Object *navi; Evas_Object *time; @@ -100,22 +75,7 @@ struct multi_text { const char *text[]; }; -struct multi_screen { - enum screen_type type; - char *text; - void (*func)(void *data); - void *data; - char *prev_button; - char *next_button; - /* TODO consider adding a button_def for the buttons */ -}; - -struct multi_screen_data { - uint_fast8_t count; - struct multi_screen *screen; -}; - -Evas_Object *eulogium_generic_error(struct eulogium_data *eulogium, uint8_t eulogium_error); +void eulogium_generic_error(struct eulogium_data *eulogium, uint_fast16_t error_code, const char *error_msg); void eulogium_print_data_set(struct eulogium_data *eulogium, char *filepath); @@ -125,10 +85,13 @@ Evas_Object *eulogium_tripple_button_menu(Evas_Object *parent, const struct butt Evas_Object *eulogium_dual_button_add(Evas_Object *parent, const struct button_def *left, const struct button_def *right); Evas_Object *eulogium_print_menu(struct eulogium_data *eulogium, char *filepath); Evas_Object *eulogium_print_ignore(struct eulogium_data *eulogium); -Evas_Object *eulogium_print_progress(struct eulogium_data *eulogium); +Evas_Object *eulogium_print_progress(Evas_Object *parent, struct eulogium_data *eulogium, const struct print_data *print); +Evas_Object *eulogium_pre_print(Evas_Object *parent, struct eulogium_data *eulogium); +Evas_Object *eulogium_settings_dial(Evas_Object *parent, struct eulogium_data *eulogium, struct settings_dial_data *dial_data); Evas_Object *eulogium_multi_text_menu(struct eulogium_data *eulogium, Evas_Object *parent, struct button_def *button, struct multi_text *data, const uint_fast8_t pagenum, Eina_Bool pageindex); Evas_Object *menu_widget_list(struct eulogium_data *eulogium, Evas_Object *parent, struct menu_def *menu); -Evas_Object *eulogium_multi_screen_menu(struct eulogium_data *eulogium, Evas_Object *parent, struct multi_screen_data *screen_data, const uint_fast8_t pagenum, Eina_Bool pageindex); Evas_Object *eulogium_menu_confirm(Evas_Object *parent, const char *msg, const char *prev, const struct button_def *next); +Evas_Object *eulogium_clean_print_bed(struct eulogium_data *eulogium); +void eulogium_print_data_clear(struct eulogium_data *eulogium); #endif /* _EULOGIUM_H */ diff --git a/src/eulogium_item_list.c b/src/eulogium_item_list.c index 2cf62a1..8d25e55 100644 --- a/src/eulogium_item_list.c +++ b/src/eulogium_item_list.c @@ -11,7 +11,6 @@ #include #include "eulogium_item_list.h" -#include "eulogium_private.h" #include "gettext.h" @@ -39,7 +38,8 @@ static void _item_destroy_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj E } static Evas_Object *_item_new(Evas_Object *parent, Evas_Object *icon, char const *label, - struct list_item *item, Evas_Smart_Cb func, const void *data) + struct list_item *item, Evas_Object *item_group, + Evas_Smart_Cb func, const void *data) { Evas_Object *it; const char *cb = "changed"; @@ -51,8 +51,11 @@ static Evas_Object *_item_new(Evas_Object *parent, Evas_Object *icon, char const switch (item->type) { case LIST_ITEM_RADIO: it = elm_radio_add(parent); - /* elm_radio_pointer_set(it, &item->state); */ - /* elm_object_style_set(it, "list"); */ + if (item_group) + elm_radio_group_add(it, item_group); + elm_radio_value_pointer_set(it, &item->radio_value); + elm_object_style_set(it, "list"); + break; case LIST_ITEM_CHECK: it = elm_check_add(parent); elm_check_state_pointer_set(it, &item->state); @@ -103,7 +106,7 @@ Evas_Object *eulogium_item_list_prepend(Evas_Object *list, Evas_Object *icon, if ((!box) && (!list)) return NULL; - it = _item_new(box, icon, label, item, func, data); + it = _item_new(box, icon, label, item, NULL, func, data); if (!it) return NULL; @@ -127,7 +130,7 @@ Evas_Object *eulogium_item_list_append(Evas_Object *list, Evas_Object *icon, if ((!box) && (!list)) return NULL; - it = _item_new(box, icon, label, item, func, data); + it = _item_new(box, icon, label, item, NULL, func, data); if (!it) return NULL; @@ -152,7 +155,7 @@ Evas_Object *eulogium_item_list_sorted_insert(Evas_Object *list, Evas_Object *ic if ((!box) && (!list)) return NULL; - it = _item_new(box, icon, label, item, func, data); + it = _item_new(box, icon, label, item, NULL, func, data); if (!it) return NULL; diff --git a/src/eulogium_item_list.h b/src/eulogium_item_list.h index 77e40d8..23125e2 100644 --- a/src/eulogium_item_list.h +++ b/src/eulogium_item_list.h @@ -22,7 +22,7 @@ struct list_item { enum item_type type; union { Eina_Bool state; - int value; + int radio_value; }; Evas_Object *_widget; }; diff --git a/src/eulogium_private.h b/src/eulogium_private.h deleted file mode 100644 index 3735b70..0000000 --- a/src/eulogium_private.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * eulogium_private, some common private helpers - * - * Copyright (c) 2015 Ultimaker B.V. - * Author: Olliver Schinagl - * - * SPDX-License-Identifier: AGPL-3.0+ - */ - -#ifndef _EULOGIUM_PRIVATE_H -#define _EULOGIUM_PRIVATE_H - -#include - -#include "gettext.h" - -#if HAVE_GETTEXT && ENABLE_NLS -#define _(string) gettext(string) -#else -#define _(string) (string) -#endif - -#endif /* _EULOGIUM_PRIVATE_H */ diff --git a/src/gettext.h b/src/gettext.h index e76b592..549565c 100644 --- a/src/gettext.h +++ b/src/gettext.h @@ -1,280 +1,25 @@ -/* Convenience header for conditional use of GNU . - Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009 Free Software Foundation, Inc. +/* + * gettext helpers + * + * Copyright (c) 2015 Ultimaker B.V. + * Author: Olliver Schinagl + * + * SPDX-License-Identifier: AGPL-3.0+ + */ - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published - by the Free Software Foundation; either version 3, or (at your option) - any later version. +#ifndef _GETTEXT_H +#define _GETTEXT_H - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. +#include - You should have received a copy of the GNU General Public - License along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, - USA. */ +#include "libgettext.h" -#ifndef _LIBGETTEXT_H -#define _LIBGETTEXT_H 1 - -/* NLS can be disabled through the configure --disable-nls option. */ -#if ENABLE_NLS - -/* Get declarations of GNU message catalog functions. */ -# include - -/* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by - the gettext() and ngettext() macros. This is an alternative to calling - textdomain(), and is useful for libraries. */ -# ifdef DEFAULT_TEXT_DOMAIN -# undef gettext -# define gettext(Msgid) \ - dgettext (DEFAULT_TEXT_DOMAIN, Msgid) -# undef ngettext -# define ngettext(Msgid1, Msgid2, N) \ - dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N) -# endif - -#else - -/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which - chokes if dcgettext is defined as a macro. So include it now, to make - later inclusions of a NOP. We don't include - as well because people using "gettext.h" will not include , - and also including would fail on SunOS 4, whereas - is OK. */ -#if defined(__sun) -# include -#endif - -/* Many header files from the libstdc++ coming with g++ 3.3 or newer include - , which chokes if dcgettext is defined as a macro. So include - it now, to make later inclusions of a NOP. */ -#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) -# include -# if (__GLIBC__ >= 2) || _GLIBCXX_HAVE_LIBINTL_H -# include -# endif -#endif - -/* Disabled NLS. - The casts to 'const char *' serve the purpose of producing warnings - for invalid uses of the value returned from these functions. - On pre-ANSI systems without 'const', the config.h file is supposed to - contain "#define const". */ -# undef gettext -# define gettext(Msgid) ((const char *) (Msgid)) -# undef dgettext -# define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid)) -# undef dcgettext -# define dcgettext(Domainname, Msgid, Category) \ - ((void) (Category), dgettext (Domainname, Msgid)) -# undef ngettext -# define ngettext(Msgid1, Msgid2, N) \ - ((N) == 1 \ - ? ((void) (Msgid2), (const char *) (Msgid1)) \ - : ((void) (Msgid1), (const char *) (Msgid2))) -# undef dngettext -# define dngettext(Domainname, Msgid1, Msgid2, N) \ - ((void) (Domainname), ngettext (Msgid1, Msgid2, N)) -# undef dcngettext -# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ - ((void) (Category), dngettext(Domainname, Msgid1, Msgid2, N)) -# undef textdomain -# define textdomain(Domainname) ((const char *) (Domainname)) -# undef bindtextdomain -# define bindtextdomain(Domainname, Dirname) \ - ((void) (Domainname), (const char *) (Dirname)) -# undef bind_textdomain_codeset -# define bind_textdomain_codeset(Domainname, Codeset) \ - ((void) (Domainname), (const char *) (Codeset)) - -#endif - -/* A pseudo function call that serves as a marker for the automated - extraction of messages, but does not call gettext(). The run-time - translation is done at a different place in the code. - The argument, String, should be a literal string. Concatenated strings - and other string expressions won't work. - The macro's expansion is not parenthesized, so that it is suitable as - initializer for static 'char[]' or 'const char[]' variables. */ -#define gettext_noop(String) String - -/* The separator between msgctxt and msgid in a .mo file. */ -#define GETTEXT_CONTEXT_GLUE "\004" - -/* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a - MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be - short and rarely need to change. - The letter 'p' stands for 'particular' or 'special'. */ -#ifdef DEFAULT_TEXT_DOMAIN -# define pgettext(Msgctxt, Msgid) \ - pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) -#else -# define pgettext(Msgctxt, Msgid) \ - pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) -#endif -#define dpgettext(Domainname, Msgctxt, Msgid) \ - pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) -#define dcpgettext(Domainname, Msgctxt, Msgid, Category) \ - pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category) -#ifdef DEFAULT_TEXT_DOMAIN -# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ - npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) -#else -# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ - npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) -#endif -#define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ - npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) -#define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \ - npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category) - -#ifdef __GNUC__ -__inline -#else -#ifdef __cplusplus -inline -#endif -#endif -static const char * -pgettext_aux (const char *domain, - const char *msg_ctxt_id, const char *msgid, - int category) -{ - const char *translation = dcgettext (domain, msg_ctxt_id, category); - if (translation == msg_ctxt_id) - return msgid; - else - return translation; -} - -#ifdef __GNUC__ -__inline -#else -#ifdef __cplusplus -inline -#endif -#endif -static const char * -npgettext_aux (const char *domain, - const char *msg_ctxt_id, const char *msgid, - const char *msgid_plural, unsigned long int n, - int category) -{ - const char *translation = - dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); - if (translation == msg_ctxt_id || translation == msgid_plural) - return (n == 1 ? msgid : msgid_plural); - else - return translation; -} - -/* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID - can be arbitrary expressions. But for string literals these macros are - less efficient than those above. */ - -#include - -#define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS \ - (((__GNUC__ >= 3 || __GNUG__ >= 2) && !__STRICT_ANSI__) \ - /* || __STDC_VERSION__ >= 199901L */ ) - -#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS -#include -#endif - -#define pgettext_expr(Msgctxt, Msgid) \ - dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES) -#define dpgettext_expr(Domainname, Msgctxt, Msgid) \ - dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES) - -#ifdef __GNUC__ -__inline +#if HAVE_GETTEXT && ENABLE_NLS +#define _(string) gettext(string) +#define N_(string) gettext_noop(string) #else -#ifdef __cplusplus -inline -#endif -#endif -static const char * -dcpgettext_expr (const char *domain, - const char *msgctxt, const char *msgid, - int category) -{ - size_t msgctxt_len = strlen (msgctxt) + 1; - size_t msgid_len = strlen (msgid) + 1; - const char *translation; -#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS - char msg_ctxt_id[msgctxt_len + msgid_len]; -#else - char buf[1024]; - char *msg_ctxt_id = - (msgctxt_len + msgid_len <= sizeof (buf) - ? buf - : (char *) malloc (msgctxt_len + msgid_len)); - if (msg_ctxt_id != NULL) -#endif - { - memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); - msg_ctxt_id[msgctxt_len - 1] = '\004'; - memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); - translation = dcgettext (domain, msg_ctxt_id, category); -#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS - if (msg_ctxt_id != buf) - free (msg_ctxt_id); -#endif - if (translation != msg_ctxt_id) - return translation; - } - return msgid; -} - -#define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \ - dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) -#define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ - dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) - -#ifdef __GNUC__ -__inline -#else -#ifdef __cplusplus -inline -#endif -#endif -static const char * -dcnpgettext_expr (const char *domain, - const char *msgctxt, const char *msgid, - const char *msgid_plural, unsigned long int n, - int category) -{ - size_t msgctxt_len = strlen (msgctxt) + 1; - size_t msgid_len = strlen (msgid) + 1; - const char *translation; -#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS - char msg_ctxt_id[msgctxt_len + msgid_len]; -#else - char buf[1024]; - char *msg_ctxt_id = - (msgctxt_len + msgid_len <= sizeof (buf) - ? buf - : (char *) malloc (msgctxt_len + msgid_len)); - if (msg_ctxt_id != NULL) -#endif - { - memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); - msg_ctxt_id[msgctxt_len - 1] = '\004'; - memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); - translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); -#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS - if (msg_ctxt_id != buf) - free (msg_ctxt_id); +#define _(string) (string) +#define N_(string) (string) #endif - if (!(translation == msg_ctxt_id || translation == msgid_plural)) - return translation; - } - return (n == 1 ? msgid : msgid_plural); -} -#endif /* _LIBGETTEXT_H */ +#endif /* _GETTEXT_H */ diff --git a/src/libgettext.h b/src/libgettext.h new file mode 100644 index 0000000..e76b592 --- /dev/null +++ b/src/libgettext.h @@ -0,0 +1,280 @@ +/* Convenience header for conditional use of GNU . + Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + USA. */ + +#ifndef _LIBGETTEXT_H +#define _LIBGETTEXT_H 1 + +/* NLS can be disabled through the configure --disable-nls option. */ +#if ENABLE_NLS + +/* Get declarations of GNU message catalog functions. */ +# include + +/* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by + the gettext() and ngettext() macros. This is an alternative to calling + textdomain(), and is useful for libraries. */ +# ifdef DEFAULT_TEXT_DOMAIN +# undef gettext +# define gettext(Msgid) \ + dgettext (DEFAULT_TEXT_DOMAIN, Msgid) +# undef ngettext +# define ngettext(Msgid1, Msgid2, N) \ + dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N) +# endif + +#else + +/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which + chokes if dcgettext is defined as a macro. So include it now, to make + later inclusions of a NOP. We don't include + as well because people using "gettext.h" will not include , + and also including would fail on SunOS 4, whereas + is OK. */ +#if defined(__sun) +# include +#endif + +/* Many header files from the libstdc++ coming with g++ 3.3 or newer include + , which chokes if dcgettext is defined as a macro. So include + it now, to make later inclusions of a NOP. */ +#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) +# include +# if (__GLIBC__ >= 2) || _GLIBCXX_HAVE_LIBINTL_H +# include +# endif +#endif + +/* Disabled NLS. + The casts to 'const char *' serve the purpose of producing warnings + for invalid uses of the value returned from these functions. + On pre-ANSI systems without 'const', the config.h file is supposed to + contain "#define const". */ +# undef gettext +# define gettext(Msgid) ((const char *) (Msgid)) +# undef dgettext +# define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid)) +# undef dcgettext +# define dcgettext(Domainname, Msgid, Category) \ + ((void) (Category), dgettext (Domainname, Msgid)) +# undef ngettext +# define ngettext(Msgid1, Msgid2, N) \ + ((N) == 1 \ + ? ((void) (Msgid2), (const char *) (Msgid1)) \ + : ((void) (Msgid1), (const char *) (Msgid2))) +# undef dngettext +# define dngettext(Domainname, Msgid1, Msgid2, N) \ + ((void) (Domainname), ngettext (Msgid1, Msgid2, N)) +# undef dcngettext +# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ + ((void) (Category), dngettext(Domainname, Msgid1, Msgid2, N)) +# undef textdomain +# define textdomain(Domainname) ((const char *) (Domainname)) +# undef bindtextdomain +# define bindtextdomain(Domainname, Dirname) \ + ((void) (Domainname), (const char *) (Dirname)) +# undef bind_textdomain_codeset +# define bind_textdomain_codeset(Domainname, Codeset) \ + ((void) (Domainname), (const char *) (Codeset)) + +#endif + +/* A pseudo function call that serves as a marker for the automated + extraction of messages, but does not call gettext(). The run-time + translation is done at a different place in the code. + The argument, String, should be a literal string. Concatenated strings + and other string expressions won't work. + The macro's expansion is not parenthesized, so that it is suitable as + initializer for static 'char[]' or 'const char[]' variables. */ +#define gettext_noop(String) String + +/* The separator between msgctxt and msgid in a .mo file. */ +#define GETTEXT_CONTEXT_GLUE "\004" + +/* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a + MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be + short and rarely need to change. + The letter 'p' stands for 'particular' or 'special'. */ +#ifdef DEFAULT_TEXT_DOMAIN +# define pgettext(Msgctxt, Msgid) \ + pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) +#else +# define pgettext(Msgctxt, Msgid) \ + pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) +#endif +#define dpgettext(Domainname, Msgctxt, Msgid) \ + pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) +#define dcpgettext(Domainname, Msgctxt, Msgid, Category) \ + pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category) +#ifdef DEFAULT_TEXT_DOMAIN +# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ + npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) +#else +# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ + npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) +#endif +#define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ + npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) +#define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \ + npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category) + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static const char * +pgettext_aux (const char *domain, + const char *msg_ctxt_id, const char *msgid, + int category) +{ + const char *translation = dcgettext (domain, msg_ctxt_id, category); + if (translation == msg_ctxt_id) + return msgid; + else + return translation; +} + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static const char * +npgettext_aux (const char *domain, + const char *msg_ctxt_id, const char *msgid, + const char *msgid_plural, unsigned long int n, + int category) +{ + const char *translation = + dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); + if (translation == msg_ctxt_id || translation == msgid_plural) + return (n == 1 ? msgid : msgid_plural); + else + return translation; +} + +/* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID + can be arbitrary expressions. But for string literals these macros are + less efficient than those above. */ + +#include + +#define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS \ + (((__GNUC__ >= 3 || __GNUG__ >= 2) && !__STRICT_ANSI__) \ + /* || __STDC_VERSION__ >= 199901L */ ) + +#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS +#include +#endif + +#define pgettext_expr(Msgctxt, Msgid) \ + dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES) +#define dpgettext_expr(Domainname, Msgctxt, Msgid) \ + dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES) + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static const char * +dcpgettext_expr (const char *domain, + const char *msgctxt, const char *msgid, + int category) +{ + size_t msgctxt_len = strlen (msgctxt) + 1; + size_t msgid_len = strlen (msgid) + 1; + const char *translation; +#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS + char msg_ctxt_id[msgctxt_len + msgid_len]; +#else + char buf[1024]; + char *msg_ctxt_id = + (msgctxt_len + msgid_len <= sizeof (buf) + ? buf + : (char *) malloc (msgctxt_len + msgid_len)); + if (msg_ctxt_id != NULL) +#endif + { + memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); + msg_ctxt_id[msgctxt_len - 1] = '\004'; + memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); + translation = dcgettext (domain, msg_ctxt_id, category); +#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS + if (msg_ctxt_id != buf) + free (msg_ctxt_id); +#endif + if (translation != msg_ctxt_id) + return translation; + } + return msgid; +} + +#define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \ + dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) +#define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ + dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static const char * +dcnpgettext_expr (const char *domain, + const char *msgctxt, const char *msgid, + const char *msgid_plural, unsigned long int n, + int category) +{ + size_t msgctxt_len = strlen (msgctxt) + 1; + size_t msgid_len = strlen (msgid) + 1; + const char *translation; +#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS + char msg_ctxt_id[msgctxt_len + msgid_len]; +#else + char buf[1024]; + char *msg_ctxt_id = + (msgctxt_len + msgid_len <= sizeof (buf) + ? buf + : (char *) malloc (msgctxt_len + msgid_len)); + if (msg_ctxt_id != NULL) +#endif + { + memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); + msg_ctxt_id[msgctxt_len - 1] = '\004'; + memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); + translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); +#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS + if (msg_ctxt_id != buf) + free (msg_ctxt_id); +#endif + if (!(translation == msg_ctxt_id || translation == msgid_plural)) + return translation; + } + return (n == 1 ? msgid : msgid_plural); +} + +#endif /* _LIBGETTEXT_H */ diff --git a/src/network.c b/src/network.c new file mode 100644 index 0000000..639b8d0 --- /dev/null +++ b/src/network.c @@ -0,0 +1,38 @@ +/* + * functions and data types for networking calls + * + * Copyright (c) 2015 Ultimaker B.V. + * Author: Olliver Schinagl + * + * SPDX-License-Identifier: AGPL-3.0+ + */ + +#include + +#include "dbus_common.h" +#include "network.h" + +#define _TECH_ETHERNET "ethernet" +#define _TECH_WIFI "wifi" + +static Eldbus_Proxy *__proxy; + +Eldbus_Pending *network_connect_wifi(const struct network_data *network) +{ + if (!network) + return NULL; + if (!network->obj_path) + return NULL; + + return eldbus_proxy_call(__proxy, "connectWifiNetwork", on_method_generic_bool_ret, "connectWifiNetwork", -1, "os", network->obj_path, ""); +} + +void network_init(Eldbus_Proxy *proxy) +{ + __proxy = proxy; +}; + +void network_shutdown(void) +{ + eldbus_proxy_unref(__proxy); +}; diff --git a/src/network.h b/src/network.h new file mode 100644 index 0000000..db95412 --- /dev/null +++ b/src/network.h @@ -0,0 +1,39 @@ +/* + * functions and data types for networking calls + * + * Copyright (c) 2015 Ultimaker B.V. + * Author: Olliver Schinagl + * + * SPDX-License-Identifier: AGPL-3.0+ + */ + +#ifndef _NETWORK_H +#define _NETWORK_H + +#include +#include +#include + +#define IPV4_MAX_LEN 16 /* 255.255.255.255\0 */ +#define IPV6_MAX_LEN 40 /* ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\0 */ +#define SSID_MAX_LEN 33 /* Section 7.3.2.1 SSID element of IEE802.11-2007 + \0 */ + +enum network_tech { + TECH_UNKNOWN, + TECH_ETHERNET, + TECH_WIFI, +}; + +struct network_data { + char *obj_path; + enum network_tech tech; + char ipv4[IPV4_MAX_LEN]; + char ipv6[IPV6_MAX_LEN]; + char ssid[SSID_MAX_LEN]; +}; + +Eldbus_Pending *network_connect_wifi(const struct network_data *network); +void network_init(Eldbus_Proxy *proxy); +void network_shutdown(void); + +#endif /* _NETWORK_H */ diff --git a/src/print_data.c b/src/print_data.c new file mode 100644 index 0000000..0a88610 --- /dev/null +++ b/src/print_data.c @@ -0,0 +1,22 @@ +/* + * function and data types for print information + * + * Copyright (c) 2015 Ultimaker B.V. + * Author: Olliver Schinagl + * + * SPDX-License-Identifier: AGPL-3.0+ + */ + +#include + +#include "print_data.h" + +void print_clear(struct print_data *print) +{ + free(print->jobname); + print->jobname = NULL; + + print->time = 0; + print->total_time = 0; + print->value = 0.0; +} diff --git a/src/print_data.h b/src/print_data.h index adebb20..5d901f3 100644 --- a/src/print_data.h +++ b/src/print_data.h @@ -11,18 +11,28 @@ #define _PRINT_DATA_H #include +#include #include -struct print_data { - uint_fast32_t time; - double progress; +#include "procedures.h" +#include "settings_data.h" +#include "ui_widgets.h" + +struct print_data { /* XXX progress data or the like, strip non-progress data */ + const char *title; + const char *status; + char *jobname; char *url; - char *name; - Eina_Bool name_changed; + int_fast32_t time; + int_fast32_t total_time; + double value; /* progress */ char *flags; double material; Eina_Bool block; Eina_Bool block_active; + Eldbus_Pending *(*method_set)(struct settings_dial_data *dial_data); + Eldbus_Pending *(*method_get)(struct procedure_data *procedure); + enum procedure_key proc_key; }; enum printer_status { @@ -39,4 +49,6 @@ enum printer_status { PAUSED, }; +void print_clear(struct print_data *print); + #endif /* _PRINT_DATA_H */ diff --git a/src/procedures.c b/src/procedures.c index be3ab5e..f4ce6f5 100644 --- a/src/procedures.c +++ b/src/procedures.c @@ -1,4 +1,5 @@ /* + * TODO: rename this to dbus_procedures.c * eulogium_procedures, available procedures * * Copyright (c) 2015 Ultimaker B.V. @@ -11,57 +12,194 @@ #include #include -#include "procedures.h" - #include "dbus_common.h" +#include "eulogium.h" #include "print_data.h" +#include "procedures.h" +#include "settings_data.h" +#include "ui_widgets.h" + +#define _PROC_FIRMWARE_UPDATE "FIRMWARE_UPDATE" #define _PROC_PRINT "PRINT" -#define _PROC_HEATUP_HOTEND "HEATUP_HOTEND" +#define _META_PROGRESS_JOBNAME "jobname" +#define _META_PROGRESS_TIME "time" +#define _META_PROGRESS_TIME_TOTAL "time_total" +#define _META_PROGRESS "progress" + #define _PROC_POST_PRINT "POST_PRINT" #define _PROC_PRE_PRINT_SETUP "PRE_PRINT_SETUP" +#define _PROC_RUN_PRE_PRINT_SETUP "RUN_PRE_PRINT_SETUP" +#define _PROC_WAIT_FOR_CLEANUP "WAIT_FOR_CLEANUP" + +#define _PROC_BED_HEATUP "HEATUP_BED" +#define _PROC_BED_MOVE "MOVE_BED" +#define _PROC_HOTEND_HEATUP_0 "HEATUP_HOTEND_0" +#define _PROC_HOTEND_HEATUP_1 "HEATUP_HOTEND_1" +#define _PROC_HOTEND_ACTIVE_SET "SWITCH_ACTIVE_HOTEND" +#define _PROC_PRINT_SPEED "PRINT_SPEED" +#define _PROC_FAN_SPEED "FAN_SPEED" +#define _PROC_FLOW_RATE "MATERIAL_FLOW" +#define _PROC_RETRACTION_LENGTH "RETRACTION_LENGTH" +#define _PROC_RETRACTION_SPEED "RETRACTION_SPEED" +#define _PROC_RETRACTION_ZHOP "RETRACTION_ZHOP" +#define _PROC_BED_LEVEL_AUTO "AUTO_LEVEL_BED" +#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_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 _META_CURRENT "current" +#define _META_TARGET "target" + +#define _STEP_FIRMWARE_UPDATE_CHECKING "FIRMWARE_UPDATE_CHECKING" +#define _STEP_FIRMWARE_UPDATE_WRITING "FIRMWARE_UPDATE_WRITING" +#define _STEP_FIRMWARE_UPDATE_VERIFYING "FIRMWARE_UPDATE_VERIFYING" +#define _STEP_WAITING "WAITING" +#define _STEP_PRINTING "PRINTING" +#define _STEP_PRINT_SPEEDING "PRINT_SPEEDING" +#define _STEP_MOVING "MOVING" +#define _STEP_HOMEING "HOMEING" +#define _STEP_HOTEND_HEATING "HOTEND_HEATING" +#define _STEP_BED_HEATING "BED_HEATING" +#define _STEP_FAN_SPEEDING "FAN_SPEEDING" +#define _STEP_MATERIAL_FLOWING "MATERIAL_FLOWING" +#define _STEP_RETRACTION_SPEEDING "RETRACTION_SPEEDING" +#define _STEP_RETRACTION_LENGTHENING "RETRACTION_LENGTHENING" +#define _STEP_RETRACTION_HOPPING "RETRACTION_HOPPING" +#define _STEP_AUTOMATIC_BED_LEVELING "AUTOMATIC_BED_LEVELING" +#define _STEP_RAISING "RAISING" +#define _STEP_CURRENTING "CURRENTING" +#define _STEP_JERKING "JERKING" +#define _STEP_SWITCHING "SWITCHING" + +#define _PROC_MSG_PRINTER_CLEANED "PRINTER_CLEANED" -void _container_basic_variant(Eldbus_Message_Iter *parent, const char type, void *data) +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, ...) { Eldbus_Message_Iter *child; + va_list value; char sig[2] = { '\0' }; sig[0] = type; child = eldbus_message_iter_container_new(parent, 'v', sig); - eldbus_message_iter_basic_append(child, type, data); + va_start(value, type); + eldbus_message_iter_arguments_vappend(child, sig, value); + va_end(value); eldbus_message_iter_container_close(parent, child); } -static struct procedure_data procedures[] = { - { - .key = _PROC_PRINT, - .keylen = sizeof(_PROC_PRINT), - .executable = EINA_FALSE, - .available = EINA_FALSE, - }, { - .key = _PROC_HEATUP_HOTEND, - .keylen = sizeof(_PROC_HEATUP_HOTEND), - .executable = EINA_FALSE, - .available = EINA_FALSE, - }, { - .key = _PROC_POST_PRINT, - .keylen = sizeof(_PROC_POST_PRINT), - .executable = EINA_FALSE, - .available = EINA_FALSE, - }, { - .key = _PROC_PRE_PRINT_SETUP, - .keylen = sizeof(_PROC_PRE_PRINT_SETUP), - .executable = EINA_FALSE, - .available = EINA_FALSE, - }, { - NULL /* sentinel */ +static void _container_dict_basic_variant_append(Eldbus_Message_Iter *array, int type, const char *key, ...) /* TODO rename something key/value */ +{ + Eldbus_Message_Iter *value, *dict; + va_list ap; + char sig[2] = { '\0' }; + + sig[0] = type; + + dict = eldbus_message_iter_container_new(array, 'e', NULL); /* { */ + eldbus_message_iter_basic_append(dict, 's', key); /* s (key) */ + value = eldbus_message_iter_container_new(dict, 'v', sig); /* start variant */ + va_start(ap, key); + eldbus_message_iter_arguments_vappend(value, sig, ap); /* v (value) */ + va_end(ap); + eldbus_message_iter_container_close(dict, value); /* end variant */ + eldbus_message_iter_container_close(array, dict); /* } */ +} + +static void _get_meta_progress(void *data, const void *key, Eldbus_Message_Iter *var) +{ + struct procedure_data *procedure = data; + struct print_data *progress = procedure->meta; /* XXX rename to progress data | check meta_type if it is the correct type. */ + const char *skey = key; + char *var_sig; + + if (!progress) { + EINA_LOG_ERR("dial_data should not be null"); + return; } -}; -struct procedure_data *procedures_init(void) + var_sig = eldbus_message_iter_signature_get(var); + if (!strcmp(skey, _META_PROGRESS_JOBNAME)) { + char *value = NULL; + + if (!eldbus_message_iter_arguments_get(var, "s", &value)) {/* TODO: check if value is leaking mem here */ + EINA_LOG_ERR("Message signature does not match \"s\", got %s", var_sig); + } else { + uint_fast16_t value_size = strlen(value) + 1; + + progress->jobname = realloc(progress->jobname, value_size); + strncpy(progress->jobname, value, value_size); + } + + } else if (!strcmp(skey, _META_PROGRESS_TIME)) { + int32_t value = 0; + + if (!eldbus_message_iter_arguments_get(var, "i", &value)) + EINA_LOG_ERR("Message signature does not match \"i\", got %s", var_sig); + else + progress->time = value; + } else if (!strcmp(skey, _META_PROGRESS_TIME_TOTAL)) { + int32_t value = 0; + + if (!eldbus_message_iter_arguments_get(var, "i", &value)) + EINA_LOG_ERR("Message signature does not match \"i\", got %s", var_sig); + else + progress->total_time = value; + } + if (!strcmp(skey, _META_PROGRESS)) { + double value = 0.0; + + if (!eldbus_message_iter_arguments_get(var, "d", &value)) + EINA_LOG_ERR("Message signature does not match \"d\", got %s", var_sig); + else + progress->value = value; + } + free(var_sig); + + ecore_event_add(procedure->poll.event, NULL, NULL, procedure); +} + +static void _get_meta_cur_tar(void *data, const void *key, Eldbus_Message_Iter *var) { - return procedures; -}; + struct procedure_data *procedure = data; + struct settings_dial_data *dial_data = procedure->meta; + const char *skey = key; + char *var_sig; + double value; + + if (!dial_data) { + EINA_LOG_ERR("dial_data should not be null"); + return; + } + + var_sig = eldbus_message_iter_signature_get(var); + if (!strcmp(skey, _META_TARGET)) { + if (!eldbus_message_iter_arguments_get(var, "d", &value)) + EINA_LOG_ERR("Message signature does not match \"d\", got %s", var_sig); + else + dial_data->value = value; + } else if (!strcmp(skey, _META_CURRENT)) { + if (!eldbus_message_iter_arguments_get(var, "d", &value)) + EINA_LOG_ERR("Message signature does not match \"d\", got %s", var_sig); + else + dial_data->value_end = value; + } + free(var_sig); + + //ecore_event_add(); +} static void _on_start_print_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) { @@ -74,7 +212,7 @@ static void _on_start_print_ret(void *data, const Eldbus_Message *msg, Eldbus_Pe return; } if (!eldbus_message_arguments_get(msg, "b", &print_started)) { - EINA_LOG_ERR("Failed to start print."); + EINA_LOG_ERR("Signature mistmatch, \"b\"."); return; } if (print_started == EINA_TRUE) { @@ -82,32 +220,754 @@ static void _on_start_print_ret(void *data, const Eldbus_Message *msg, Eldbus_Pe print->block = EINA_FALSE; } else { EINA_LOG_ERR("Unable to start print"); + /* TODO, if print start failed, invalidate all PRINTING pages */ + //ui_stack_page_invalidate(eulogium->navi, PAGE_PRINTING); + } +} + +static void _on_start_dial_ret(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +{ + char *label = data; + const char *errname, *errmsg; + Eina_Bool procedure_started = EINA_FALSE; + + if (eldbus_message_error_get(msg, &errname, &errmsg)) { + EINA_LOG_ERR("%s %s", errname, errmsg); + return; + } + if (!eldbus_message_arguments_get(msg, "b", &procedure_started)) { + EINA_LOG_ERR("Signature mistmatch, \"b\"."); + return; + } + if (procedure_started == EINA_TRUE) { + EINA_LOG_INFO("Procedure %s has been successfully started", label); + } else { + EINA_LOG_ERR("Unable to start procedure %s", label); + /* TODO, if tuning failed .. */ + } +} + +Eina_Bool _print_progress_cleanup(void *data, Elm_Object_Item *eoi EINA_UNUSED) +{ + eulogium_print_data_clear(data); + + return EINA_TRUE; +} + +void procedure_process_step(struct eulogium_data *eulogium, struct procedure_data *procedure) +{ + Evas_Object *content = NULL; + Elm_Object_Item *navi_item = NULL; + enum navi_page_state page_state = PAGE_NORMAL; + + if (!procedure) + return; + if (!procedure->step_active) + return; + + /* XXX TODO build 'remember previous screen so we don't redraw the same' */ + 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); + page_state = PAGE_NORMAL; + } + if (procedure->step_active->step == STEP_PRINTING) { + content = eulogium_print_progress(eulogium->navi, eulogium, (struct print_data *)procedure->meta); + page_state = PAGE_PRINTING; + } + if (procedure->step_active->step == PROC_WAIT_FOR_CLEANUP) { + ui_stack_page_invalidate(eulogium->navi, PAGE_PRINTING); + content = eulogium_clean_print_bed(eulogium); + } + + if (!content) + return; + + navi_item = elm_naviframe_item_simple_push(eulogium->navi, content); + elm_object_item_data_set(navi_item, (void *)page_state); + if (page_state == PAGE_PRINTING) + elm_naviframe_item_pop_cb_set(navi_item, _print_progress_cleanup, eulogium); +} + +static struct procedure_msg print_msgs[] = { + { + .key = _PROC_MSG_PRINTER_CLEANED, + .msg = PROC_MSG_PRINTER_CLEANED, + }, { NULL }, /* sentinel */ +}; + +static struct procedure_step steps_firmware_update[] = { + { + .key = _STEP_FIRMWARE_UPDATE_CHECKING, + .step = STEP_FIRMWARE_UPDATE_CHECKING, + }, { + .key = _STEP_FIRMWARE_UPDATE_WRITING, + .step = STEP_FIRMWARE_UPDATE_WRITING, + }, { + .key = _STEP_FIRMWARE_UPDATE_VERIFYING, + .step = STEP_FIRMWARE_UPDATE_VERIFYING, + }, { NULL }, /* sentinel */ +}; + +static struct procedure_step steps_print[] = { + { + .key = _PROC_RUN_PRE_PRINT_SETUP, + .step = PROC_RUN_PRE_PRINT_SETUP, + }, { + .key = _STEP_PRINTING, + .step = STEP_PRINTING, + }, { + .key = _PROC_POST_PRINT, + .step = PROC_POST_PRINT, + }, { + .key = _PROC_WAIT_FOR_CLEANUP, + .step = PROC_WAIT_FOR_CLEANUP, + }, { NULL }, /* sentinel */ +}; + +static struct procedure_step steps_bed_temp_set[] = { + { + .key = _STEP_BED_HEATING, + .step = STEP_HEATING, + }, { NULL }, /* sentinel */ +}; + +static struct procedure_step steps_hotend_temp_set[] = { + { + .key = _STEP_HOTEND_HEATING, + .step = STEP_HEATING, + }, { NULL }, /* sentinel */ +}; + +static struct procedure_step steps_fan_speed_set[] = { + { + .key = _STEP_FAN_SPEEDING, + .step = STEP_SPEEDING, + }, { NULL }, /* sentinel */ +}; + +static struct procedure_step steps_flow_rate_set[] = { + { + .key = _STEP_MATERIAL_FLOWING, + .step = STEP_SPEEDING, + }, { NULL }, /* sentinel */ +}; + +static struct procedure_step steps_print_speed_set[] = { + { + .key = _STEP_PRINT_SPEEDING, + .step = STEP_SPEEDING, + }, { NULL }, /* sentinel */ +}; + +static struct procedure_step steps_retraction_length_set[] = { + { + .key = _STEP_RETRACTION_LENGTHENING, + .step = STEP_LENGTHENING, + }, { NULL }, /* sentinel */ +}; + +static struct procedure_step steps_retraction_speed_set[] = { + { + .key = _STEP_RETRACTION_SPEEDING, + .step = STEP_SPEEDING, + }, { NULL }, /* sentinel */ +}; + +static struct procedure_step steps_retraction_zhop_set[] = { + { + .key = _STEP_RETRACTION_HOPPING, + .step = STEP_HOPPING, + }, { NULL }, /* sentinel */ +}; + +static struct procedure_step steps_bed_level_auto[] = { + { + .key = _STEP_HOMEING, + .step = STEP_HOMEING, + }, { + .key = _STEP_AUTOMATIC_BED_LEVELING, + .step = STEP_AUTOMATIC_BED_LEVELING, + }, { + .key = _STEP_WAITING, + .step = STEP_WAITING, + }, { NULL }, /* sentinel */ +}; + +static struct procedure_step steps_bed_raise[] = { + { + .key = _STEP_HOMEING, + .step = STEP_HOMEING, + }, { + .key = _STEP_RAISING, + .step = STEP_RAISING, + }, { + .key = _STEP_WAITING, + .step = STEP_WAITING, + }, { NULL }, /* sentinel */ +}; + +static struct procedure_step steps_bed_home[] = { + { + .key = _STEP_HOMEING, + .step = STEP_HOMEING, + }, { + .key = _STEP_WAITING, + .step = STEP_WAITING, + }, { NULL }, /* sentinel */ +}; + +static struct procedure_step steps_head_home[] = { + { + .key = _STEP_HOMEING, + .step = STEP_HOMEING, + }, { + .key = _STEP_WAITING, + .step = STEP_WAITING, + }, { NULL }, /* sentinel */ +}; + +static struct procedure_step steps_move[] = { + { + .key = _STEP_MOVING, + .step = STEP_MOVING, + }, { + .key = _STEP_WAITING, + .step = STEP_WAITING, + }, { NULL }, /* sentinel */ +}; + +static struct procedure_step steps_jerk_xyz_set[] = { + { + .key = _STEP_JERKING, + .step = STEP_JERKING, + }, { NULL }, /* sentinel */ +}; + +static struct procedure_step steps_current_xyze_set[] = { + { + .key = _STEP_CURRENTING, + .step = STEP_CURRENTING, + }, { NULL }, /* sentinel */ +}; + +static struct procedure_step steps_hotend_active_set[] = { + { + .key = _STEP_SWITCHING, + .step = STEP_SWITCHING, + }, { NULL }, /* sentinel */ +}; + +static struct procedure_data procedures[] = { + [PROC_FIRMWARE_UPDATE] = { + .key = _PROC_FIRMWARE_UPDATE, + .status = PROC_READY, + .parser = _get_meta_progress, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_firmware_update, + .step_active = NULL, + .meta = NULL, /* struct progress_data */ + .poll = { + .in = 0.5, + .timer = NULL, + }, + }, + [PROC_PRINT] = { + .key = _PROC_PRINT, + .status = PROC_READY, + .parser = _get_meta_progress, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_print, + .step_active = NULL, + .meta = NULL, /* struct print_data */ + .poll = { + .in = 0.0, + .timer = NULL + }, + }, + [PROC_BED_HEATUP] = { + .key = _PROC_BED_HEATUP, + .status = PROC_READY, + .parser = _get_meta_cur_tar, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_bed_temp_set, + .step_active = NULL, + .meta = NULL, + .poll = { + .in = 0.0, + .timer = NULL + }, + }, + [PROC_HOTEND_HEATUP_0] = { + .key = _PROC_HOTEND_HEATUP_0, + .status = PROC_READY, + .parser = _get_meta_cur_tar, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_hotend_temp_set, + .step_active = NULL, + .meta = NULL, + .poll = { + .in = 0.0, + .timer = NULL + }, + }, + [PROC_HOTEND_HEATUP_1] = { + .key = _PROC_HOTEND_HEATUP_1, + .status = PROC_READY, + .parser = _get_meta_cur_tar, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_hotend_temp_set, + .step_active = NULL, + .meta = NULL, + .poll = { + .in = 0.0, + .timer = NULL + }, + }, + [PROC_HOTEND_ACTIVE_SET] = { + .key = _PROC_HOTEND_ACTIVE_SET, + .status = PROC_READY, + .parser = _get_meta_cur_tar, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_hotend_active_set, + .step_active = NULL, + .meta = NULL, + .poll = { + .in = 0.0, + .timer = NULL + }, + }, + [PROC_PRINT_SPEED] = { + .key = _PROC_PRINT_SPEED, + .status = PROC_READY, + .parser = _get_meta_cur_tar, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_print_speed_set, + .step_active = NULL, + .meta = NULL, + .poll = { + .in = 0.0, + .timer = NULL + }, + }, + [PROC_FAN_SPEED] = { + .key = _PROC_FAN_SPEED, + .status = PROC_READY, + .parser = _get_meta_cur_tar, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_fan_speed_set, + .step_active = NULL, + .meta = NULL, + .poll = { + .in = 0.0, + .timer = NULL + }, + }, + [PROC_FLOW_RATE] = { + .key = _PROC_FLOW_RATE, + .status = PROC_READY, + .parser = _get_meta_cur_tar, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_flow_rate_set, + .step_active = NULL, + .meta = NULL, + .poll = { + .in = 0.0, + .timer = NULL + }, + }, + [PROC_RETRACTION_LENGTH] = { + .key = _PROC_RETRACTION_LENGTH, + .status = PROC_READY, + .parser = _get_meta_cur_tar, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_retraction_length_set, + .step_active = NULL, + .meta = NULL, + .poll = { + .in = 0.0, + .timer = NULL + }, + }, + [PROC_RETRACTION_SPEED] = { + .key = _PROC_RETRACTION_SPEED, + .status = PROC_READY, + .parser = _get_meta_cur_tar, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_retraction_speed_set, + .step_active = NULL, + .meta = NULL, + .poll = { + .in = 0.0, + .timer = NULL + }, + }, + [PROC_RETRACTION_ZHOP] = { + .key = _PROC_RETRACTION_ZHOP, + .status = PROC_READY, + .parser = _get_meta_cur_tar, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_retraction_zhop_set, + .step_active = NULL, + .meta = NULL, + .poll = { + .in = 0.0, + .timer = NULL + }, + }, + [PROC_BED_LEVEL_AUTO] = { + .key = _PROC_BED_LEVEL_AUTO, + .status = PROC_READY, + .parser = _get_meta_cur_tar, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_bed_level_auto, + .step_active = NULL, + .meta = NULL, + .poll = { + .in = 0.0, + .timer = NULL + }, + }, + [PROC_BED_RAISE] = { + .key = _PROC_BED_RAISE, + .status = PROC_READY, + .parser = _get_meta_cur_tar, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_bed_raise, + .step_active = NULL, + .meta = NULL, + .poll = { + .in = 0.0, + .timer = NULL + }, + }, + [PROC_BED_HOME] = { + .key = _PROC_BED_HOME, + .status = PROC_READY, + .parser = _get_meta_cur_tar, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_bed_home, + .step_active = NULL, + .meta = NULL, + .poll = { + .in = 0.0, + .timer = NULL + }, + }, + [PROC_BED_MOVE] = { + .key = _PROC_BED_MOVE, + .status = PROC_READY, + .parser = NULL, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_move, + .step_active = NULL, + .meta = NULL, + .poll = { + .in = 0.0, + .timer = NULL + }, + }, + [PROC_HEAD_HOME] = { + .key = _PROC_HEAD_HOME, + .status = PROC_READY, + .parser = _get_meta_cur_tar, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_head_home, + .step_active = NULL, + .meta = NULL, + .poll = { + .in = 0.0, + .timer = NULL + }, + }, + [PROC_MATERIAL_MOVE_0] = { + .key = _PROC_MATERIAL_MOVE_0, + .status = PROC_READY, + .parser = NULL, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_move, + .step_active = NULL, + .meta = NULL, + .poll = { + .in = 0.0, + .timer = NULL + }, + }, + [PROC_MATERIAL_MOVE_1] = { + .key = _PROC_MATERIAL_MOVE_1, + .status = PROC_READY, + .parser = NULL, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_move, + .step_active = NULL, + .meta = NULL, + .poll = { + .in = 0.0, + .timer = NULL + }, + }, + [PROC_JERK_XY] = { + .key = _PROC_JERK_XY, + .status = PROC_READY, + .parser = _get_meta_cur_tar, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_jerk_xyz_set, + .step_active = NULL, + .meta = NULL, + .poll = { + .in = 0.0, + .timer = NULL + }, + }, + [PROC_JERK_Z] = { + .key = _PROC_JERK_Z, + .status = PROC_READY, + .parser = _get_meta_cur_tar, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_jerk_xyz_set, + .step_active = NULL, + .meta = NULL, + .poll = { + .in = 0.0, + .timer = NULL + }, + }, + [PROC_CURRENT_XY] = { + .key = _PROC_CURRENT_XY, + .status = PROC_READY, + .parser = _get_meta_cur_tar, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_current_xyze_set, + .step_active = NULL, + .meta = NULL, + .poll = { + .in = 0.0, + .timer = NULL + }, + }, + [PROC_CURRENT_Z] = { + .key = _PROC_CURRENT_Z, + .status = PROC_READY, + .parser = _get_meta_cur_tar, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_current_xyze_set, + .step_active = NULL, + .meta = NULL, + .poll = { + .in = 0.0, + .timer = NULL + }, + }, + [PROC_CURRENT_E] = { + .key = _PROC_CURRENT_E, + .status = PROC_READY, + .parser = _get_meta_cur_tar, + .executable = EINA_FALSE, + .available = EINA_FALSE, + ._steps = steps_current_xyze_set, + .step_active = NULL, + .meta = NULL, + .poll = { + .in = 0.0, + .timer = NULL + }, + }, +}; + +void procedure_meta_set(struct procedure_data *procedure, void *data) +{ + procedure->meta = data; +} + +void *procedure_meta_get(struct procedure_data *procedure) +{ + return procedure->meta; +} + +const struct procedure_step *procedure_step_get(const struct procedure_data *proc, const char *key) +{ + uint_fast16_t i; + + if (!proc) + return NULL; + + for (i = 0; proc->_steps[i].key; i++) { + if (!strcmp(proc->_steps[i].key, key)) + return &proc->_steps[i]; + } + + return NULL; +}; + +struct procedure_data *procedure_get(const char *key) +{ + enum procedure_key i; + + for (i = PROC_PRINT; procedures[i].key; i++) { + if (!strcmp(procedures[i].key, key)) + return &procedures[i]; } + + return NULL; +}; + +Eldbus_Pending *procedure_message(const struct procedure_data *proc, const struct procedure_msg *msg) +{ + return eldbus_proxy_call(__proxy, "messageProcedure", NULL, NULL, -1, "ss", proc->key, msg->key); +} + +Eldbus_Pending *procedure_led_brightness_set(const Evas_Object *dial) +{ + //struct settings_dial_data *dial_data; + +// dial_data = evas_object_data_get(dial, "dial_data"); +// eldbus_proxy_call(dial_data->proxy, "SetBrightness", _on_dial_units_update_ret, dial, -1, ""); +} + +Eldbus_Pending *procedure_print_printer_cleaned(void) /* XXX pass procedure step? */ +{ + return eldbus_proxy_call(__proxy, "messageProcedure", on_method_generic_bool_ret, NULL, -1, "ss", _PROC_PRINT, _PROC_MSG_PRINTER_CLEANED); +} + +Eldbus_Pending *procedure_start_simple(const enum procedure_key proc_key) +{ + Eldbus_Message *msg; + Eldbus_Message_Iter *iter, *array; + + msg = eldbus_proxy_method_call_new(__proxy, "startProcedure"); + iter = eldbus_message_iter_get(msg); + + /* Compose msg sa{sv} */ + eldbus_message_iter_basic_append(iter, 's', procedures[proc_key].key); + array = eldbus_message_iter_container_new(iter, 'a', "{sv}"); + + _container_dict_basic_variant_append(array, 's', "dummy", ""); + + eldbus_message_iter_container_close(iter, array); + + return eldbus_proxy_send(__proxy, msg, on_method_generic_bool_ret, NULL, -1); } -Eldbus_Pending *procedure_start_print(Eldbus_Proxy *proxy, struct print_data *print) +/* TODO half of the content of this procedure is generic and could be gotten from the procedure if it where a parameter. This can be made much more generic. */ +Eldbus_Pending *procedure_print_start(const struct print_data *print) { Eldbus_Message *msg; - Eldbus_Message_Iter *iter, *dict, *array; + Eldbus_Message_Iter *iter, *array; - msg = eldbus_proxy_method_call_new(proxy, "startProcedure"); + msg = eldbus_proxy_method_call_new(__proxy, "startProcedure"); iter = eldbus_message_iter_get(msg); /* Compose msg sa{sv} */ eldbus_message_iter_basic_append(iter, 's', "PRINT"); array = eldbus_message_iter_container_new(iter, 'a', "{sv}"); - dict = eldbus_message_iter_container_new(array, 'e', NULL); - eldbus_message_iter_basic_append(dict, 's', "name"); - _container_basic_variant(dict, 's', print->name); - eldbus_message_iter_container_close(array, dict); + _container_dict_basic_variant_append(array, 's', "name", print->jobname); + _container_dict_basic_variant_append(array, 's', "url", print->url); + + eldbus_message_iter_container_close(iter, array); + + return eldbus_proxy_send(__proxy, msg, _on_start_print_ret, print, -1); +} + +/* TODO, add resend/retry if actual value does not match current value */ +// XXX procedure_start_target(const enum procedure_key proc_key); +Eldbus_Pending *procedure_target_set(const enum procedure_key proc_key) +{ + Eldbus_Message *msg; + Eldbus_Message_Iter *iter, *array; + struct procedure_data *procedure = &procedures[proc_key]; + struct settings_dial_data *dial_data = procedure->meta; + + msg = eldbus_proxy_method_call_new(__proxy, "startProcedure"); + iter = eldbus_message_iter_get(msg); + + /* Compose msg sa{sv} */ + printf("Prockey: %s\n", procedure->key); + eldbus_message_iter_basic_append(iter, 's', procedure->key); + array = eldbus_message_iter_container_new(iter, 'a', "{sv}"); - dict = eldbus_message_iter_container_new(array, 'e', NULL); - eldbus_message_iter_basic_append(dict, 's', "url"); - _container_basic_variant(dict, 's', print->url); - eldbus_message_iter_container_close(array, dict); + _container_dict_basic_variant_append(array, 'd', "target", dial_data->value); eldbus_message_iter_container_close(iter, array); - return eldbus_proxy_send(proxy, msg, &_on_start_print_ret, print, -1); + return eldbus_proxy_send(__proxy, msg, _on_start_dial_ret, dial_data->label, -1); +} + +void procedure_metadata_poll(struct procedure_data *procedure, Eina_Bool polling) +{ + if (polling) + if (procedure->poll.timer) + return; /* Timer already running */ + // procedure->poll.timer = ecore_timer_add(procedure->poll.in, procedure->poll.func, procedure); + if (!procedure->poll.timer) { + EINA_LOG_CRIT("Unable to create metadata polling timer"); + } else { + if (procedure->poll.timer) + ecore_timer_del(procedure->poll.timer); + else + EINA_LOG_CRIT("Unable to delete non-existing timer"); + } +} + +Eldbus_Pending *procedure_metadata_get(const struct procedure_data *procedure) +{ + return eldbus_proxy_call(__proxy, "getProcedureMetaData", on_method_get_procedure_metadata_ret, procedure, -1, "s", procedure->key); } + +Eldbus_Pending *procedure_metadata_key_get(enum procedure_key proc_key) +{ + return eldbus_proxy_call(__proxy, "getProcedureMetaData", on_method_get_procedure_metadata_ret, &procedures[proc_key], -1, "s", procedures[proc_key].key); +} + +void procedure_meta_getall(void) +{ + enum procedure_key i; + + for (i = PROC_NONE; i < PROC_LAST; i++) + if (procedures[i].meta) + procedure_metadata_key_get(i); +}; + +struct procedure_data *procedures_init(Eldbus_Proxy *proxy) +{ + enum procedure_key i; + + __proxy = proxy; + + 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. + */ + return procedures; +}; + +void procedures_shutdown(void) +{ + eldbus_proxy_unref(__proxy); +}; diff --git a/src/procedures.h b/src/procedures.h index 79e23eb..44d1498 100644 --- a/src/procedures.h +++ b/src/procedures.h @@ -1,5 +1,5 @@ /* - * eulogium_procedures, available procedures + * procedures, available procedures * * Copyright (c) 2015 Ultimaker B.V. * Author: Olliver Schinagl @@ -7,23 +7,164 @@ * SPDX-License-Identifier: AGPL-3.0+ */ -#ifndef _EULOGIUM_PROCEDURES_H -#define _EULOGIUM_PROCEDURES_H +#ifndef _PROCEDURES_H +#define _PROCEDURES_H +#include #include #include #include -#include "print_data.h" +#include "gettext.h" + +#define LABEL_PROC_NONE N_("None") +#define LABEL_PROC_BED_MOVE N_("Moving buildplate") +#define LABEL_PROC_BED_HEATUP N_("Heating buildplate") +#define LABEL_PROC_HOTEND_HEATUP_0 N_("Heating left hotend") +#define LABEL_PROC_HOTEND_HEATUP_1 N_("Heating right hotend") +#define LABEL_PROC_HOTEND_ACTIVE_SET N_("Switching active hotend") +#define LABEL_PROC_PRINT_SPEED N_("Print speed") +#define LABEL_PROC_FAN_SPEED N_("Fan speed") +#define LABEL_PROC_FLOW_RATE N_("Flow rate") +#define LABEL_PROC_RETRACTION_LENGTH N_("Retraction length") +#define LABEL_PROC_RETRACTION_SPEED N_("Retraction speed") +#define LABEL_PROC_RETRACTION_ZHOP N_("Retraction Z-Hop") +#define LABEL_PROC_BED_LEVEL_AUTO N_("Autolevel buildplate") +#define LABEL_PROC_BED_RAISE N_("Raise buildplate") +#define LABEL_PROC_BED_HOME N_("Lower buildplate") +#define LABEL_PROC_MATERIAL_MOVE_0 N_("Move material left") +#define LABEL_PROC_MATERIAL_MOVE_1 N_("Move material right") +#define LABEL_PROC_JERK_XY N_("Jerk X/Y") +#define LABEL_PROC_JERK_Z N_("Jerk Z") +#define LABEL_PROC_CURRENT_XY N_("Current X/Y") +#define LABEL_PROC_CURRENT_Z N_("Current Z") +#define LABEL_PROC_CURRENT_E N_("Current E") +#define LABEL_PROC_PRINT N_("Printing") +#define LABEL_PROC_FIRMWARE_UPDATE N_("Updating firmware") +#define LABEL_PROC_LAST N_("Unknown") + +enum procedure_status { + PROC_READY, + PROC_ACTIVE, + PROC_FINISHED, +}; + +enum procedure_key { + PROC_NONE, + PROC_BED_MOVE, + PROC_BED_HEATUP, + PROC_HOTEND_HEATUP_0, + PROC_HOTEND_HEATUP_1, + PROC_HOTEND_ACTIVE_SET, + PROC_PRINT_SPEED, + PROC_FAN_SPEED, + PROC_FLOW_RATE, + PROC_RETRACTION_LENGTH, + PROC_RETRACTION_SPEED, + PROC_RETRACTION_ZHOP, + PROC_BED_LEVEL_AUTO, + PROC_BED_RAISE, + PROC_BED_HOME, + PROC_HEAD_HOME, + PROC_MATERIAL_MOVE_0, + PROC_MATERIAL_MOVE_1, + PROC_JERK_XY, + PROC_JERK_Z, + PROC_CURRENT_XY, + PROC_CURRENT_Z, + PROC_CURRENT_E, + PROC_PRINT, + PROC_FIRMWARE_UPDATE, + PROC_LAST, /* sentinel */ +}; + +enum steps { + PROC_RUN_PRE_PRINT_SETUP, + STEP_PRINTING, + PROC_POST_PRINT, + PROC_WAIT_FOR_CLEANUP, + STEP_HEATING, + STEP_MOVING, + STEP_SPEEDING, + STEP_FLOWING, + STEP_HOMEING, + STEP_LENGTHENING, + STEP_HOPPING, + STEP_RAISING, + STEP_AUTOMATIC_BED_LEVELING, + STEP_CURRENTING, + STEP_JERKING, + STEP_WAITING, + STEP_SWITCHING, + STEP_FIRMWARE_UPDATE_CHECKING, + STEP_FIRMWARE_UPDATE_WRITING, + STEP_FIRMWARE_UPDATE_VERIFYING, +}; + +struct procedure_step { + const char *key; + const enum steps step; +}; + +enum msgs { + PROC_MSG_PRINTER_CLEANED, +}; + +struct procedure_msg { + const char *key; + const enum msgs msg; +}; + +enum meta_type { + PROC_META_NONE, + PROC_META_PRINT, + PROC_META_DIAL, +}; + +struct poll_data { + double in; + Ecore_Timer *timer; + int event; +}; struct procedure_data { - char *key; - uint_fast16_t keylen; + const char *key; + enum procedure_status status; + 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); + 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 */ + const struct procedure_step *step_active; + struct poll_data poll; }; -struct procedure_data *procedures_init(void); -Eldbus_Pending *procedure_start_print(Eldbus_Proxy *proxy, struct print_data *print); +struct eulogium_data; /* XXX remove later when struct eulogium gets refactored. */ + +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); +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 */ +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); + +Eldbus_Pending *procedure_start_simple(const enum procedure_key proc_key); +Eldbus_Pending *procedure_metadata_get(const struct procedure_data *procedure); +Eldbus_Pending *procedure_metadata_key_get(enum procedure_key proc_key); +void procedure_metadata_poll(struct procedure_data *procedure, Eina_Bool polling); +Eldbus_Pending *procedure_target_set(const enum procedure_key proc_key); + +void procedures_shutdown(void); -#endif /* _EULOGIUM_PRIVATE_H */ +#endif /* _PROCEDURES_H */ diff --git a/src/settings_data.h b/src/settings_data.h new file mode 100644 index 0000000..6cbb086 --- /dev/null +++ b/src/settings_data.h @@ -0,0 +1,35 @@ +/* + * function and data types for settings information + * + * Copyright (c) 2015 Ultimaker B.V. + * Author: Olliver Schinagl + * + * SPDX-License-Identifier: AGPL-3.0+ + */ + +#ifndef _SETTINGS_DATA_H +#define _SETTINGS_DATA_H + +#include + +#include "procedures.h" + +struct settings_dial_data { + const char *label; + const char *help; + double step; + double min; + double max; + double value; + double value_end; + char *(*indicator_func)(double value); + void (*free_func)(char *str); + const char *format; + const char *format_end; + const char *unit; + Eldbus_Pending *(*method_set)(enum procedure_key proc_key); + Eldbus_Pending *(*method_get)(enum procedure_key proc_key); + enum procedure_key proc_key; +}; + +#endif /* _SETTINGS_DATA_H */ diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am index 8ae8c20..d0c93ee 100644 --- a/src/tests/Makefile.am +++ b/src/tests/Makefile.am @@ -9,8 +9,8 @@ eulogium_tests_CPPFLAGS = -I$(top_builddir)/src/lib/ \ -DPACKAGE_BUILD_DIR=\"`pwd`/$(top_builddir)/src/tests/\" \ @EFL_CFLAGS@ \ @CHECK_CFLAGS@ -eulogium_tests_LDADD = @CHECK_LIBS@ $(top_builddir)/src/lib/libeulogium.la -eulogium_tests_DEPENDENCIES = $(top_builddir)/src/lib/libeulogium.la +eulogium_tests_LDADD = @CHECK_LIBS@ @EFL_LIBS@ +#eulogium_tests_DEPENDENCIES = $(top_builddir)/src/lib/libeulogium.la endif diff --git a/src/tests/test_eulogium b/src/tests/test_eulogium new file mode 100644 index 0000000..d1c89e3 Binary files /dev/null and b/src/tests/test_eulogium differ diff --git a/src/tests/test_eulogium.c b/src/tests/test_eulogium.c index 2fce00c..4c51b42 100644 --- a/src/tests/test_eulogium.c +++ b/src/tests/test_eulogium.c @@ -5,120 +5,6 @@ #include #include -#include "Eulogium.h" - -#define COPYRIGHT "Copyright © 2013 oliver and various contributors (see AUTHORS)." - -static void eulogium_test_basic(TCase *tc); - -static const struct { - const char *name; - void (*build)(TCase *tc); -} tests[] = { - { "basic", eulogium_test_basic } -}; - -START_TEST(eulogium_initialization) -{ - fail_if(eulogium_init() != 1); - - eulogium_library_call(); - - fail_if(eulogium_shutdown() != 0); -} -END_TEST - -static void -eulogium_test_basic(TCase *tc) -{ - tcase_add_test(tc, eulogium_initialization); -} - -static const Ecore_Getopt optdesc = { - "eulogium", - "%prog [options]", - PACKAGE_VERSION, - COPYRIGHT, - "BSD with advertisement clause", - "An EFL eulogium program", - 0, - { - ECORE_GETOPT_STORE_TRUE('l', "list", "list available tests"), - ECORE_GETOPT_STORE_STR('t', "test", "test to run"), - ECORE_GETOPT_LICENSE('L', "license"), - ECORE_GETOPT_COPYRIGHT('C', "copyright"), - ECORE_GETOPT_VERSION('V', "version"), - ECORE_GETOPT_HELP('h', "help"), - ECORE_GETOPT_SENTINEL - } -}; - -int -main(int argc EINA_UNUSED, char **argv EINA_UNUSED) -{ - Suite *s; - SRunner *sr; - TCase *tc = NULL; - char *test = NULL; - unsigned int i; - int failed_count = -1; - int args; - Eina_Bool quit_option = EINA_FALSE; - Eina_Bool list_option = EINA_FALSE; - - Ecore_Getopt_Value values[] = { - ECORE_GETOPT_VALUE_BOOL(list_option), - ECORE_GETOPT_VALUE_STR(test), - ECORE_GETOPT_VALUE_BOOL(quit_option), - ECORE_GETOPT_VALUE_BOOL(quit_option), - ECORE_GETOPT_VALUE_BOOL(quit_option), - ECORE_GETOPT_VALUE_BOOL(quit_option), - ECORE_GETOPT_VALUE_NONE - }; - - eina_init(); - - args = ecore_getopt_parse(&optdesc, values, argc, argv); - if (args < 0) - { - EINA_LOG_CRIT("Could not parse arguments."); - goto end; - } - else if (quit_option) - { - goto end; - } - else if (list_option) - { - fprintf(stdout, "Available tests :\n"); - for (i = 0; i < sizeof (tests) / sizeof (tests[0]); i++) - fprintf(stdout, "\t%s\n", tests[i].name); - goto end; - } - - s = suite_create("Eulogium"); - - for (i = 0; i < sizeof (tests) / sizeof (tests[0]); i++) - { - if (test && strcmp(tests[i].name, test)) - continue ; - - tc = tcase_create(tests[i].name); - tcase_set_timeout(tc, 0); - - tests[i].build(tc); - suite_add_tcase(s, tc); - } - - sr = srunner_create(s); - srunner_set_xml(sr, PACKAGE_BUILD_DIR "/check-results.xml"); - - srunner_run_all(sr, CK_ENV); - failed_count = srunner_ntests_failed(sr); - srunner_free(sr); - - end: - eina_shutdown(); - - return (failed_count == 0) ? 0 : 255; +int main(void) { + return 0; } diff --git a/src/ui_input.c b/src/ui_input.c new file mode 100644 index 0000000..1de5e4e --- /dev/null +++ b/src/ui_input.c @@ -0,0 +1,40 @@ +/* + * functions, callbacks and data types for user input + * + * Copyright (c) 2015 Ultimaker B.V. + * Author: Olliver Schinagl + * + * SPDX-License-Identifier: AGPL-3.0+ + */ + +#include +#include +#include + +#include "ui_input.h" + +int INPUT_MOUSE_WHEEL_UP = 0; /* For custom ecore_event handling */ +int INPUT_MOUSE_WHEEL_DOWN = 0; /* For custom ecore_event handling */ + +/* Function to make the Z-axis of any wheel focus the next/previous focusable widget */ +void input_mouse_wheel_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Evas_Event_Mouse_Wheel *ev = event_info; + Ecore_Event *event = NULL; + + if (ev->z > 0) { + elm_object_focus_next((Evas_Object *)data, ELM_FOCUS_NEXT); + event = ecore_event_add(INPUT_MOUSE_WHEEL_DOWN, NULL, NULL, NULL); + } else { + elm_object_focus_next((Evas_Object *)data, ELM_FOCUS_PREVIOUS); + event = ecore_event_add(INPUT_MOUSE_WHEEL_UP, NULL, NULL, NULL); + } + if (!event) + EINA_LOG_ERR("Wheel event failed to queue."); +} + +void input_init() +{ + INPUT_MOUSE_WHEEL_UP = ecore_event_type_new(); + INPUT_MOUSE_WHEEL_DOWN = ecore_event_type_new(); +} diff --git a/src/ui_input.h b/src/ui_input.h new file mode 100644 index 0000000..d036055 --- /dev/null +++ b/src/ui_input.h @@ -0,0 +1,19 @@ +/* + * functions, callbacks and data types for user input + * + * Copyright (c) 2015 Ultimaker B.V. + * Author: Olliver Schinagl + * + * SPDX-License-Identifier: AGPL-3.0+ + */ + +#ifndef _UI_INPUT_H +#define _UI_INPUT_H + +extern int INPUT_MOUSE_WHEEL_UP; +extern int INPUT_MOUSE_WHEEL_DOWN; + +void input_mouse_wheel_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info); +void input_init(void); + +#endif /* _UI_INPUT_H */ diff --git a/src/ui_widgets.c b/src/ui_widgets.c new file mode 100644 index 0000000..8e38227 --- /dev/null +++ b/src/ui_widgets.c @@ -0,0 +1,621 @@ +/* + * functions, callbacks and data types for widgets + * + * Copyright (c) 2015 Ultimaker B.V. + * Author: Olliver Schinagl + * + * SPDX-License-Identifier: AGPL-3.0+ + */ + +#include +#include +#include + +#include "eulogium.h" +#include "gettext.h" +#include "ui_input.h" +#include "ui_widgets.h" + +static struct multi_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 multi_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 *navi_item; + if ((!eulogium->navi) || (!content)) { + EINA_LOG_CRIT("navi or content where NULL"); + return NULL; + } + + navi_item = elm_naviframe_item_simple_push(eulogium->navi, content); + if (!navi_item) { + EINA_LOG_CRIT("Unable to push item onto navistack"); + return NULL; + } + + elm_object_item_data_set(navi_item, (void *)(uintptr_t)page_state); + + return navi_item; +} + +/* 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 + * (the tail) gets popped immediately. Additionally there is a safeguard in + * 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_List *navi_list, *l; + Elm_Object_Item *navi_item; + enum navi_page_state page_state; + + if (!eulogium->navi) { + EINA_LOG_CRIT("Naviframe was NULL"); + return EINA_FALSE; + } + + /* 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); + 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); + l = eina_list_last(navi_list); + l = eina_list_prev(l); + /* Skip the top entry, it is the currently displayed window and thus + * always valid, we also know the last item is not the bottom of the + * stack. Because we are looking 1 item ahead, if l becomes NULL, we + * must be on the bottom page, which may never be invalid by + * definition. */ + /* XXX TODO: if page_state is PAGE_ERROR, we should treat it specially */ + for (; l; l = eina_list_prev(l)) { + navi_item = eina_list_data_get(l); + if (!navi_item) { + EINA_LOG_ERR("No item in list?!"); + continue; + } + page_state = (enum navi_page_state)(uintptr_t)elm_object_item_data_get(navi_item); + if (page_state == PAGE_INVALID) { + EINA_LOG_WARN("Page on stack invalid, skipping"); + continue; + } + /* All other page_states, PAGE_NORMAL, PAGE_PRINTING */ + elm_naviframe_item_pop_to(navi_item); + eina_list_free(navi_list); + return EINA_TRUE; + + } + eina_list_free(navi_list); + + return EINA_FALSE; +} + +void ui_stack_page_invalidate(Evas_Object *navi, const enum navi_page_state page_state) +{ + Eina_List *navi_list, *l; + Elm_Object_Item *navi_item; + enum navi_page_state page; + + navi_list = elm_naviframe_items_get(navi); + EINA_LIST_FOREACH(navi_list, l, navi_item) { + page = (enum navi_page_state)(uintptr_t)elm_object_item_data_get(navi_item); + if (page == page_state) + elm_object_item_data_set(navi_item, (void *)PAGE_INVALID); + } + 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 */ + + ui_stack_pop(eulogium); /* XXX replace with just the navi */ +} + +static void _dial_send_update(void *data, Evas_Object *eo, void *event_info EINA_UNUSED) +{ + struct settings_dial_data *dial_data = data; + + dial_data->value = elm_slider_value_get(eo); + if (dial_data->method_set) + dial_data->method_set(dial_data->proc_key); +} + +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); + + return ECORE_CALLBACK_CANCEL; +} + +static Eina_Bool _rotator_change(void *data, int type, void *event_info EINA_UNUSED) +{ + struct settings_dial_data *dial_data = data; + + /* TODO we now jus 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. + */ + //value = elm_slider_value_get(dial); + //step = elm_slider_step_get(dial); + if (type == INPUT_MOUSE_WHEEL_UP) + dial_data->value = -1.0 * dial_data->step; + if (type == INPUT_MOUSE_WHEEL_DOWN) + dial_data->value = +1.0 * dial_data->step; + if (dial_data->method_set) + dial_data->method_set(dial_data->proc_key); + + return ECORE_CALLBACK_PASS_ON; +} + +static Eina_Bool _dial_change(void *data, int type, void *event_info EINA_UNUSED) +{ + Evas_Object *dial = data; + Ecore_Timer *delay; + double value, step; + +/* TODO XXX we call this dirty little hack because debian's v1.8 of elm does not offer us to actually call drag,left + * evas_object_smart_callback_call(dial, "drag,left", NULL); would have been much cleaner and we didn't need to do + * the val+step get/set thing and thus also benefit from delay,changed which we now 'fake' badly. Also a common user,changed + * signal handler on the other end would help on making it less ugly. + */ + value = elm_slider_value_get(dial); + step = elm_slider_step_get(dial); + if (type == INPUT_MOUSE_WHEEL_UP) + elm_slider_value_set(dial, value - step); + if (type == INPUT_MOUSE_WHEEL_DOWN) + elm_slider_value_set(dial, value + step); + evas_object_smart_callback_call(dial, "changed", NULL); + delay = evas_object_data_get(dial, "delay"); + ecore_timer_del(delay); + delay = ecore_timer_add(0.25, _dial_change_delay, dial); /* TODO make define for delay */ + evas_object_data_set(dial, "delay", delay); + + return ECORE_CALLBACK_PASS_ON; +} + +/* HACK for some reason elm_slider_units_format_function_set does not supply us with any other variables + * other then the value. Doing anything fancy thus becomes impossible. We therefore create these local + * pointers which we set whenever a dial screen is generated. This brings us to the big caveat. Right + * now, we only support one single active dial (unit/format) because of this XXX */ +static const char *__dial_units_format = NULL; + +static char *_dial_units_format(double val) +{ + char *buf; + uint_fast32_t buf_size; + + buf_size = DIAL_MAX_FORMAT_SIZE; + buf = malloc(buf_size); + snprintf(buf, buf_size, __dial_units_format, val); + + return buf; +} + +static void _dial_units_format_free(char *buf) +{ + free(buf); +} + +static void _dial_units_end_object_text_set(Evas_Object *end, struct settings_dial_data *dial_data) +{ + char *buf; + + buf = malloc(DIAL_MAX_FORMAT_SIZE * sizeof(char)); + if (dial_data->value_end < 0) + snprintf(buf, DIAL_MAX_FORMAT_SIZE, "%s", dial_data->unit); + else + snprintf(buf, DIAL_MAX_FORMAT_SIZE, dial_data->format_end, dial_data->value_end, dial_data->unit); + elm_object_text_set(end, buf); + free(buf); +} + +static Eina_Bool _timer_dial_units_update(void *data) +{ + Evas_Object *dial = data; + struct settings_dial_data *dial_data; + + dial_data = evas_object_data_get(dial, "dial_data"); + if (dial_data->proc_key > PROC_NONE) + procedure_metadata_key_get(dial_data->proc_key); + _dial_units_end_object_text_set(dial, dial_data); + + return ECORE_CALLBACK_RENEW; +} + +static void _timer_del(void *data, Evas *e EINA_UNUSED, Evas_Object *eo EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Ecore_Timer *timer = data; + + if (timer) + ecore_timer_del(timer); +} + +Evas_Object *ui_widget_rotator(Evas_Object *parent, struct eulogium_data *eulogium, struct settings_dial_data *dial_data) +{ + Evas_Object *_top, *_bottom; + Ecore_Event_Handler *handler; + + _top = elm_label_add(parent); + elm_object_text_set(_top, _(dial_data->label)); + 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); + handler = ecore_event_handler_add(INPUT_MOUSE_WHEEL_UP, _rotator_change, dial_data); + evas_object_data_set(parent, "event_inc", handler); + handler = ecore_event_handler_add(INPUT_MOUSE_WHEEL_DOWN, _rotator_change, dial_data); + evas_object_data_set(parent, "event_dec", handler); /* XXX do this better (via dial_data?) */ + evas_object_show(_top); + + _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, eulogium); + evas_object_show(_bottom); + + return eulogium_split_screen(parent, _top, _bottom); +} + +Evas_Object *ui_widget_dial(Evas_Object *parent, struct eulogium_data *eulogium, struct settings_dial_data *dial_data) +{ + Evas_Object *_top, *_bottom, *obj; + Ecore_Timer *timer_value_end = NULL; + Ecore_Event_Handler *handler; + + _top = elm_slider_add(parent); + elm_object_text_set(_top, _(dial_data->label)); + elm_object_focus_allow_set(_top, EINA_FALSE); + __dial_units_format = dial_data->format; + elm_slider_units_format_function_set(_top, _dial_units_format, _dial_units_format_free); + elm_slider_min_max_set(_top, dial_data->min, dial_data->max); + elm_slider_step_set(_top, dial_data->step); + 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); + 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); + evas_object_data_set(parent, "event_dec", handler); + evas_object_show(_top); + + /* if type is tar/cur do something different TODO */ + obj = elm_label_add(_top); + evas_object_data_set(obj, "dial_data", dial_data); + _dial_units_end_object_text_set(obj, dial_data); + elm_object_part_content_set(_top, "end", obj); + evas_object_show(obj); + timer_value_end = ecore_timer_add(0.5, _timer_dial_units_update, obj); /* XXX replace with signal? */ + /* XXX also we only want to pass the obj (dial) to the screen update timer */ + evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _timer_del, timer_value_end); + +/* XXX TODO add box to put this in */ +#if 0 + obj = elm_label_add(_top); + elm_object_text_set(obj, _(dial_data->help); + 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_object_show(obj); + elm_box_pack_end(_top, obj); +#endif + + _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, eulogium); + evas_object_show(_bottom); + + return eulogium_split_screen(parent, _top, _bottom); +} + +struct _progress_screen_data { + Evas_Object *title; + Evas_Object *status; + Evas_Object *jobname; + Evas_Object *progressbar; + const struct print_data *progress_data; + Ecore_Event_Handler *handler; +}; + +static void _widget_progress_del(void *data, Evas *e EINA_UNUSED, Evas_Object *eo EINA_UNUSED, void *event_info EINA_UNUSED) +{ + struct _progress_screen_data *screen = data; + + if (screen->handler) + ecore_event_handler_del(screen->handler); + screen->handler = NULL; + + free(screen); +} + +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; + + elm_object_text_set(screen->jobname, _(progress->jobname)); + elm_object_text_set(screen->status, _(progress->status)); + elm_progressbar_value_set(screen->progressbar, progress->value); + + return ECORE_CALLBACK_PASS_ON; +} + +Evas_Object *ui_widget_progress(Evas_Object *parent, struct eulogium_data *eulogium, 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; + Ecore_Event_Handler *handler; + struct _progress_screen_data *screen; + + screen = calloc(1, sizeof(struct _progress_screen_data)); + screen->progress_data = progress; + + _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); + elm_box_homogeneous_set(_top, EINA_FALSE); + evas_object_show(_top); + + screen->title = elm_label_add(_top); + elm_object_text_set(screen->title, _(progress->title)); + elm_label_slide_mode_set(screen->title, ELM_LABEL_SLIDE_MODE_NONE); + evas_object_size_hint_align_set(screen->title, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(screen->title); + elm_box_pack_end(_top, screen->title); + + screen->status = elm_label_add(_top); + elm_object_text_set(screen->status, _("Unknown status")); + elm_label_slide_mode_set(screen->status, ELM_LABEL_SLIDE_MODE_NONE); + evas_object_size_hint_align_set(screen->status, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(screen->status); + elm_box_pack_end(_top, screen->status); + + screen->jobname = elm_label_add(_top); + elm_object_text_set(screen->jobname, progress->jobname); + elm_label_slide_mode_set(screen->jobname, ELM_LABEL_SLIDE_MODE_AUTO); + //elm_label_slide_speed_set(object, 2); + elm_object_style_set(screen->jobname, "slide_bounce"); + elm_label_slide_go(screen->jobname); /* XXX only slide when strlen > 20? as a workaround to this not working automatically. */ + evas_object_size_hint_align_set(screen->jobname, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(screen->jobname); + elm_box_pack_end(_top, screen->jobname); + + screen->progressbar = elm_progressbar_add(_top); + elm_progressbar_horizontal_set(screen->progressbar, EINA_TRUE); + elm_progressbar_pulse_set(screen->progressbar, EINA_FALSE); /* TODO: pulse = time-unknown/pause */ + elm_progressbar_pulse(screen->progressbar, EINA_FALSE); + elm_progressbar_value_set(screen->progressbar, progress->value); /* get this from the procedure meta data */ + elm_progressbar_unit_format_set(screen->progressbar, "%1.1f %%"); + evas_object_size_hint_align_set(screen->progressbar, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(screen->progressbar); + elm_box_pack_end(_top, screen->progressbar); + + handler = ecore_event_handler_add(procedure->poll.event, _widget_progress_update, screen); + +// _bottom = eulogium_dual_button_add(parent, &but_print_tune, &but_print_abort_confirm); +// evas_object_show(_bottom); + + content = eulogium_split_screen(parent, _top, _bottom); + evas_object_event_callback_add(content, EVAS_CALLBACK_DEL, _widget_progress_del, screen); + + return content; +} + +struct _multi_screen_next_cb_data { + struct eulogium_data *eulogium; + struct multi_screen_data *screen_data; + uint_fast8_t pagenum; + Eina_Bool pageindex; +}; + +static void _eulogium_multi_screen_next_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *content; + struct eulogium_data *eulogium = ((struct _multi_screen_next_cb_data *)data)->eulogium; + uint_fast8_t pagenum = ((struct _multi_screen_next_cb_data *)data)->pagenum; + Eina_Bool pageindex = ((struct _multi_screen_next_cb_data *)data)->pageindex; + struct multi_screen_data *screen_data = ((struct _multi_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 = eulogium_multi_screen_menu(eulogium, eulogium->navi, screen_data, pagenum, pageindex); + ui_stack_push(eulogium, content, PAGE_NORMAL); + /* XXX what else? */ + } + free(data); +} + +Evas_Object *eulogium_multi_screen_menu(struct eulogium_data *eulogium, Evas_Object *parent, struct multi_screen_data *screen_data, uint_fast8_t pagenum, Eina_Bool pageindex) /* TODO swap parent/eulogium */ +{ + Evas_Object *object; + Evas_Object *_top, *_bottom; + struct _multi_screen_next_cb_data *multi_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); + + multi_screen_next_cb_data = malloc(sizeof(struct _multi_screen_next_cb_data)); + multi_screen_next_cb_data->eulogium = eulogium; + multi_screen_next_cb_data->screen_data = screen_data; + multi_screen_next_cb_data->pagenum = pagenum + 1; + multi_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", _eulogium_multi_screen_next_cb, multi_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++; +} diff --git a/src/ui_widgets.h b/src/ui_widgets.h index a32eea3..e6a5f56 100644 --- a/src/ui_widgets.h +++ b/src/ui_widgets.h @@ -1,5 +1,5 @@ /* - * function and data types for widgets + * functions, callbacks and data types for widgets * * Copyright (c) 2015 Ultimaker B.V. * Author: Olliver Schinagl @@ -7,8 +7,8 @@ * SPDX-License-Identifier: AGPL-3.0+ */ -#ifndef _WIDGET_DATA_H -#define _WIDGET_DATA_H +#ifndef _UI_WIDGETS_H +#define _UI_WIDGETS_H #include #include @@ -17,6 +17,9 @@ #include "dbus_common.h" #include "eulogium_item_list.h" +#include "settings_data.h" + +#define DIAL_MAX_FORMAT_SIZE 10 /* Maximally allowed characters on a dial, inc comma and \0 */ struct button_cb { void (*func)(void *data, Evas_Object *object, void *event_info); @@ -25,7 +28,8 @@ struct button_cb { }; struct button_def { - const char *text; + const char *label; + const char *text; /* TODO remove */ struct button_cb cb; void *data; }; @@ -35,11 +39,6 @@ struct dir_entry_def { char *path; }; -struct wifi_entry_def { - void *data; - char *ssid; -}; - struct menu_entry_def { const char *icon; const char *label; @@ -48,7 +47,7 @@ struct menu_entry_def { Eina_Bool *end; /* remove me */ const char *footer; /* Primary footer */ const char *footer_alt; /* Alternating footer */ - Ecore_Timer *toggle_timer; + Ecore_Timer *toggle_timer; /*TODO, this may better go one level up into the menu */ void (*func)(void *data, Evas_Object *object, void *event_info); void *data; }; @@ -63,35 +62,65 @@ struct menu_def { const char *title; enum list_type type; void *data; - struct dir_entry_def dir; - struct wifi_entry_def wifi; /* TODO see if we can put this into a union somehow */ + struct dir_entry_def dir; /* TODO check if we need this here at all */ struct menu_entry_def entry[]; }; -struct settings_dial_data { - const char *label; - double step; - double min; - double max; - double value; - double value_actual; - char *(*indicator_func)(double value); - void (*free_func)(char *str); - const char *format; - Evas_Object *slider; -}; - struct screen_def { const char *title; Evas_Object *widget; - struct settings_dial_data screen[]; }; -extern int INPUT_MOUSE_WHEEL_UP; -extern int INPUT_MOUSE_WHEEL_UP; +/* WARNING! This enum is stored in a void * via an (uintptr_t) typecast. + * Always make sure that it fits into that. At birth, this enum was intended + * to never have more then a handful of states. + */ +enum navi_page_state { + PAGE_NORMAL, + PAGE_BOTTOM, + PAGE_USB, + PAGE_FLASH, + PAGE_PRINTING, + PAGE_INVALID, + PAGE_ERROR, +}; + +enum screen_type { + NONE, + FUNC, + MATERIAL, + PROGRESS, + END, /* sentinel */ +}; + +struct multi_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[]; +}; 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); -#endif /* _WIDGET_DATA_H */ +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); +void ui_stack_pop_cb(void *data, Evas_Object *eo EINA_UNUSED, void *event_info EINA_UNUSED); +Evas_Object *ui_widget_dial(Evas_Object *parent, struct eulogium_data *eulogium, struct settings_dial_data *dial_data); +Evas_Object *ui_widget_rotator(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); + +void ui_init(void); + +#endif /* _UI_WIDGETS_H */ -- cgit v0.12