From e820a4033dce2294bd15eeed17fb565487234a4c Mon Sep 17 00:00:00 2001 From: Aharon Hillel Date: Tue, 6 Dec 2011 16:05:14 +0000 Subject: [PATCH] Exactness: initial commit. (Commit message by TAsn): Exactness is a pixel perfect test suite for elm/evas/edje. Exactness lets you write tests, and then record a specific interaction with them, while taking windowshots in the process. The tests can later be played back (windowshots will be automatically taken) and the pictures will be compared for differences (usage of fail_if is also supported). There is a premade set of tests and recordings for all (most?) of the elementary widgets in various scenarios. Because of the nature of this test suite, it doesn't handle well any tests with continued running animations/viedos (timing can never be 100% right). But you can use it to test widgets with transition animations. Bottom line: just give it a go. Read the README for more inforamtion. I hope it'll be deployed on our servers soon, as we really need automatic testing. Signed-off-by: Aharon Hillel SVN revision: 65961 --- AUTHORS | 1 + COPYING | 25 + ChangeLog | 0 INSTALL | 365 ++++ Makefile.am | 18 + NEWS | 0 README | 103 + autogen.sh | 18 + configure.ac | 48 + data/recording/test_3d.rec | Bin 0 -> 9274 bytes data/recording/test_actionslider.rec | Bin 0 -> 15401 bytes data/recording/test_anchorblock.rec | Bin 0 -> 5118 bytes data/recording/test_anchorview.rec | Bin 0 -> 3604 bytes data/recording/test_bg_image.rec | Bin 0 -> 1470 bytes data/recording/test_bg_options.rec | Bin 0 -> 3529 bytes data/recording/test_bg_plain.rec | Bin 0 -> 782 bytes data/recording/test_box_horiz.rec | Bin 0 -> 2243 bytes data/recording/test_box_vert.rec | Bin 0 -> 1664 bytes data/recording/test_bubble.rec | Bin 0 -> 2098 bytes data/recording/test_button.rec | Bin 0 -> 5666 bytes data/recording/test_calendar.rec | Bin 0 -> 3308 bytes data/recording/test_check.rec | Bin 0 -> 5131 bytes data/recording/test_colorselector.rec | Bin 0 -> 4593 bytes data/recording/test_conformant.rec | Bin 0 -> 2287 bytes data/recording/test_conformant2.rec | Bin 0 -> 3311 bytes data/recording/test_ctxpopup.rec | Bin 0 -> 4951 bytes data/recording/test_diskselector.rec | Bin 0 -> 15698 bytes data/recording/test_fileselector.rec | Bin 0 -> 2359 bytes data/recording/test_fileselector_button.rec | Bin 0 -> 8534 bytes data/recording/test_fileselector_entry.rec | Bin 0 -> 12914 bytes data/recording/test_focus.rec | Bin 0 -> 8796 bytes data/recording/test_gengrid.rec | Bin 0 -> 12404 bytes data/recording/test_genlist.rec | Bin 0 -> 10553 bytes data/recording/test_genlist10.rec | Bin 0 -> 4912 bytes data/recording/test_genlist11.rec | Bin 0 -> 4483 bytes data/recording/test_genlist2.rec | Bin 0 -> 12330 bytes data/recording/test_genlist3.rec | Bin 0 -> 5336 bytes data/recording/test_genlist4.rec | Bin 0 -> 6231 bytes data/recording/test_genlist6.rec | Bin 0 -> 7685 bytes data/recording/test_genlist8.rec | Bin 0 -> 6598 bytes data/recording/test_grid.rec | Bin 0 -> 2507 bytes data/recording/test_hover.rec | Bin 0 -> 2338 bytes data/recording/test_hover2.rec | Bin 0 -> 2657 bytes data/recording/test_hoversel.rec | Bin 0 -> 16572 bytes data/recording/test_index.rec | Bin 0 -> 10514 bytes data/recording/test_inwin.rec | Bin 0 -> 2176 bytes data/recording/test_inwin2.rec | Bin 0 -> 1814 bytes data/recording/test_label.rec | Bin 0 -> 1262 bytes data/recording/test_list.rec | Bin 0 -> 19189 bytes data/recording/test_notify.rec | Bin 0 -> 8980 bytes data/recording/test_pager_slide.rec | Bin 0 -> 4030 bytes data/recording/test_panel.rec | Bin 0 -> 6873 bytes data/recording/test_panes.rec | Bin 0 -> 4721 bytes data/recording/test_progressbar.rec | Bin 0 -> 4391 bytes data/recording/test_radio.rec | Bin 0 -> 3967 bytes data/recording/test_scaling.rec | Bin 0 -> 1468 bytes data/recording/test_scaling2.rec | Bin 0 -> 1843 bytes data/recording/test_scroller.rec | Bin 0 -> 4725 bytes data/recording/test_scroller2.rec | Bin 0 -> 8406 bytes data/recording/test_segment_control.rec | Bin 0 -> 5407 bytes data/recording/test_separator.rec | Bin 0 -> 1383 bytes data/recording/test_slider.rec | Bin 0 -> 8348 bytes data/recording/test_spinner.rec | Bin 0 -> 6602 bytes data/recording/test_table.rec | Bin 0 -> 1520 bytes data/recording/test_table2.rec | Bin 0 -> 1955 bytes data/recording/test_table3.rec | Bin 0 -> 1930 bytes data/recording/test_table4.rec | Bin 0 -> 1726 bytes data/recording/test_table5.rec | Bin 0 -> 2874 bytes data/recording/test_table6.rec | Bin 0 -> 3375 bytes data/recording/test_toggle.rec | Bin 0 -> 10436 bytes data/recording/test_toolbar.rec | Bin 0 -> 4180 bytes data/recording/test_toolbar2.rec | Bin 0 -> 3727 bytes data/recording/test_toolbar3.rec | Bin 0 -> 4574 bytes data/recording/test_toolbar4.rec | Bin 0 -> 4915 bytes data/recording/test_toolbar5.rec | Bin 0 -> 6374 bytes data/recording/test_tooltip.rec | Bin 0 -> 11066 bytes data/recording/test_tooltip2.rec | Bin 0 -> 6275 bytes data/recording/test_win_state.rec | Bin 0 -> 7725 bytes src/Makefile.am | 4 + src/bin/Makefile.am | 80 + src/bin/test_3d.c | 338 ++++ src/bin/test_actionslider.c | 175 ++ src/bin/test_anchorblock.c | 275 +++ src/bin/test_anchorview.c | 148 ++ src/bin/test_bg.c | 194 ++ src/bin/test_box.c | 393 ++++ src/bin/test_bubble.c | 155 ++ src/bin/test_button.c | 206 ++ src/bin/test_calendar.c | 306 +++ src/bin/test_check.c | 76 + src/bin/test_clock.c | 239 +++ src/bin/test_colorselector.c | 89 + src/bin/test_conform.c | 200 ++ src/bin/test_ctxpopup.c | 240 +++ src/bin/test_cursor.c | 450 +++++ src/bin/test_diskselector.c | 333 ++++ src/bin/test_entry.c | 1673 ++++++++++++++++ src/bin/test_fileselector.c | 281 +++ src/bin/test_fileselector_button.c | 227 +++ src/bin/test_fileselector_entry.c | 236 +++ src/bin/test_flip.c | 611 ++++++ src/bin/test_flip_page.c | 914 +++++++++ src/bin/test_flipselector.c | 107 + src/bin/test_floating.c | 102 + src/bin/test_focus.c | 371 ++++ src/bin/test_focus2.c | 148 ++ src/bin/test_focus3.c | 107 + src/bin/test_gengrid.c | 539 +++++ src/bin/test_genlist.c | 1997 +++++++++++++++++++ src/bin/test_glview.c | 626 ++++++ src/bin/test_glview_simple.c | 282 +++ src/bin/test_grid.c | 176 ++ src/bin/test_hover.c | 162 ++ src/bin/test_hoversel.c | 190 ++ src/bin/test_icon.c | 31 + src/bin/test_icon_desktops.c | 98 + src/bin/test_index.c | 349 ++++ src/bin/test_inwin.c | 114 ++ src/bin/test_label.c | 68 + src/bin/test_launcher.c | 906 +++++++++ src/bin/test_layout.c | 74 + src/bin/test_list.c | 1000 ++++++++++ src/bin/test_map.c | 798 ++++++++ src/bin/test_menu.c | 121 ++ src/bin/test_naviframe.c | 241 +++ src/bin/test_notify.c | 295 +++ src/bin/test_pager.c | 320 +++ src/bin/test_panel.c | 253 +++ src/bin/test_panes.c | 107 + src/bin/test_photo.c | 100 + src/bin/test_photocam.c | 333 ++++ src/bin/test_progressbar.c | 199 ++ src/bin/test_radio.c | 94 + src/bin/test_scaling.c | 114 ++ src/bin/test_scroller.c | 260 +++ src/bin/test_segment_control.c | 96 + src/bin/test_separator.c | 66 + src/bin/test_slider.c | 190 ++ src/bin/test_slideshow.c | 204 ++ src/bin/test_spinner.c | 81 + src/bin/test_table.c | 340 ++++ src/bin/test_thumb.c | 64 + src/bin/test_toggle.c | 85 + src/bin/test_toolbar.c | 699 +++++++ src/bin/test_tooltip.c | 600 ++++++ src/bin/test_transit.c | 590 ++++++ src/bin/test_weather.c | 167 ++ src/bin/test_win_inline.c | 237 +++ src/bin/test_win_state.c | 357 ++++ src/bin/tsuite.c | 851 ++++++++ src/bin/tsuite.h | 113 ++ src/lib/Makefile.am | 23 + src/lib/tsuite_evas_hook.c | 313 +++ src/lib/tsuite_file_data.c | 586 ++++++ src/lib/tsuite_file_data.h | 143 ++ src/scripts/Makefile.am | 8 + src/scripts/write.sh | 329 +++ tasn_is_a_lazy_bastard | 2 +- 158 files changed, 25246 insertions(+), 1 deletion(-) create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 INSTALL create mode 100644 Makefile.am create mode 100644 NEWS create mode 100644 README create mode 100755 autogen.sh create mode 100644 configure.ac create mode 100644 data/recording/test_3d.rec create mode 100644 data/recording/test_actionslider.rec create mode 100644 data/recording/test_anchorblock.rec create mode 100644 data/recording/test_anchorview.rec create mode 100644 data/recording/test_bg_image.rec create mode 100644 data/recording/test_bg_options.rec create mode 100644 data/recording/test_bg_plain.rec create mode 100644 data/recording/test_box_horiz.rec create mode 100644 data/recording/test_box_vert.rec create mode 100644 data/recording/test_bubble.rec create mode 100644 data/recording/test_button.rec create mode 100644 data/recording/test_calendar.rec create mode 100644 data/recording/test_check.rec create mode 100644 data/recording/test_colorselector.rec create mode 100644 data/recording/test_conformant.rec create mode 100644 data/recording/test_conformant2.rec create mode 100644 data/recording/test_ctxpopup.rec create mode 100644 data/recording/test_diskselector.rec create mode 100644 data/recording/test_fileselector.rec create mode 100644 data/recording/test_fileselector_button.rec create mode 100644 data/recording/test_fileselector_entry.rec create mode 100644 data/recording/test_focus.rec create mode 100644 data/recording/test_gengrid.rec create mode 100644 data/recording/test_genlist.rec create mode 100644 data/recording/test_genlist10.rec create mode 100644 data/recording/test_genlist11.rec create mode 100644 data/recording/test_genlist2.rec create mode 100644 data/recording/test_genlist3.rec create mode 100644 data/recording/test_genlist4.rec create mode 100644 data/recording/test_genlist6.rec create mode 100644 data/recording/test_genlist8.rec create mode 100644 data/recording/test_grid.rec create mode 100644 data/recording/test_hover.rec create mode 100644 data/recording/test_hover2.rec create mode 100644 data/recording/test_hoversel.rec create mode 100644 data/recording/test_index.rec create mode 100644 data/recording/test_inwin.rec create mode 100644 data/recording/test_inwin2.rec create mode 100644 data/recording/test_label.rec create mode 100644 data/recording/test_list.rec create mode 100644 data/recording/test_notify.rec create mode 100644 data/recording/test_pager_slide.rec create mode 100644 data/recording/test_panel.rec create mode 100644 data/recording/test_panes.rec create mode 100644 data/recording/test_progressbar.rec create mode 100644 data/recording/test_radio.rec create mode 100644 data/recording/test_scaling.rec create mode 100644 data/recording/test_scaling2.rec create mode 100644 data/recording/test_scroller.rec create mode 100644 data/recording/test_scroller2.rec create mode 100644 data/recording/test_segment_control.rec create mode 100644 data/recording/test_separator.rec create mode 100644 data/recording/test_slider.rec create mode 100644 data/recording/test_spinner.rec create mode 100644 data/recording/test_table.rec create mode 100644 data/recording/test_table2.rec create mode 100644 data/recording/test_table3.rec create mode 100644 data/recording/test_table4.rec create mode 100644 data/recording/test_table5.rec create mode 100644 data/recording/test_table6.rec create mode 100644 data/recording/test_toggle.rec create mode 100644 data/recording/test_toolbar.rec create mode 100644 data/recording/test_toolbar2.rec create mode 100644 data/recording/test_toolbar3.rec create mode 100644 data/recording/test_toolbar4.rec create mode 100644 data/recording/test_toolbar5.rec create mode 100644 data/recording/test_tooltip.rec create mode 100644 data/recording/test_tooltip2.rec create mode 100644 data/recording/test_win_state.rec create mode 100644 src/Makefile.am create mode 100644 src/bin/Makefile.am create mode 100644 src/bin/test_3d.c create mode 100644 src/bin/test_actionslider.c create mode 100644 src/bin/test_anchorblock.c create mode 100644 src/bin/test_anchorview.c create mode 100644 src/bin/test_bg.c create mode 100644 src/bin/test_box.c create mode 100644 src/bin/test_bubble.c create mode 100644 src/bin/test_button.c create mode 100644 src/bin/test_calendar.c create mode 100644 src/bin/test_check.c create mode 100644 src/bin/test_clock.c create mode 100644 src/bin/test_colorselector.c create mode 100644 src/bin/test_conform.c create mode 100644 src/bin/test_ctxpopup.c create mode 100644 src/bin/test_cursor.c create mode 100644 src/bin/test_diskselector.c create mode 100644 src/bin/test_entry.c create mode 100644 src/bin/test_fileselector.c create mode 100644 src/bin/test_fileselector_button.c create mode 100644 src/bin/test_fileselector_entry.c create mode 100644 src/bin/test_flip.c create mode 100644 src/bin/test_flip_page.c create mode 100644 src/bin/test_flipselector.c create mode 100644 src/bin/test_floating.c create mode 100644 src/bin/test_focus.c create mode 100644 src/bin/test_focus2.c create mode 100644 src/bin/test_focus3.c create mode 100644 src/bin/test_gengrid.c create mode 100644 src/bin/test_genlist.c create mode 100644 src/bin/test_glview.c create mode 100644 src/bin/test_glview_simple.c create mode 100644 src/bin/test_grid.c create mode 100644 src/bin/test_hover.c create mode 100644 src/bin/test_hoversel.c create mode 100644 src/bin/test_icon.c create mode 100644 src/bin/test_icon_desktops.c create mode 100644 src/bin/test_index.c create mode 100644 src/bin/test_inwin.c create mode 100644 src/bin/test_label.c create mode 100644 src/bin/test_launcher.c create mode 100644 src/bin/test_layout.c create mode 100644 src/bin/test_list.c create mode 100644 src/bin/test_map.c create mode 100644 src/bin/test_menu.c create mode 100644 src/bin/test_naviframe.c create mode 100644 src/bin/test_notify.c create mode 100644 src/bin/test_pager.c create mode 100644 src/bin/test_panel.c create mode 100644 src/bin/test_panes.c create mode 100644 src/bin/test_photo.c create mode 100644 src/bin/test_photocam.c create mode 100644 src/bin/test_progressbar.c create mode 100644 src/bin/test_radio.c create mode 100644 src/bin/test_scaling.c create mode 100644 src/bin/test_scroller.c create mode 100644 src/bin/test_segment_control.c create mode 100644 src/bin/test_separator.c create mode 100644 src/bin/test_slider.c create mode 100644 src/bin/test_slideshow.c create mode 100644 src/bin/test_spinner.c create mode 100644 src/bin/test_table.c create mode 100644 src/bin/test_thumb.c create mode 100644 src/bin/test_toggle.c create mode 100644 src/bin/test_toolbar.c create mode 100644 src/bin/test_tooltip.c create mode 100644 src/bin/test_transit.c create mode 100644 src/bin/test_weather.c create mode 100644 src/bin/test_win_inline.c create mode 100644 src/bin/test_win_state.c create mode 100644 src/bin/tsuite.c create mode 100644 src/bin/tsuite.h create mode 100644 src/lib/Makefile.am create mode 100644 src/lib/tsuite_evas_hook.c create mode 100644 src/lib/tsuite_file_data.c create mode 100644 src/lib/tsuite_file_data.h create mode 100644 src/scripts/Makefile.am create mode 100755 src/scripts/write.sh diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..0f71bf7 --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +Aharon Hillel diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..99e4ae6 --- /dev/null +++ b/COPYING @@ -0,0 +1,25 @@ +Copyright notice for exactness: + +Copyright (C) 2011 by various contributors (see AUTHORS) + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..e69de29 diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..7d1c323 --- /dev/null +++ b/INSTALL @@ -0,0 +1,365 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, +2006, 2007, 2008, 2009 Free Software Foundation, Inc. + + Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. This file is offered as-is, +without warranty of any kind. + +Basic Installation +================== + + Briefly, the shell commands `./configure; make; make install' should +configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. Some packages provide this +`INSTALL' file but do not implement all of the features documented +below. The lack of an optional feature in a given package is not +necessarily a bug. More recommendations for GNU packages can be found +in *note Makefile Conventions: (standards)Makefile Conventions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + + The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package, generally using the just-built uninstalled binaries. + + 4. Type `make install' to install the programs and any data files and + documentation. When installing into a prefix owned by root, it is + recommended that the package be configured and built as a regular + user, and only the `make install' phase executed with root + privileges. + + 5. Optionally, type `make installcheck' to repeat any self-tests, but + this time using the binaries in their final installed location. + This target does not install anything. Running this target as a + regular user, particularly if the prior `make install' required + root privileges, verifies that the installation completed + correctly. + + 6. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 7. Often, you can also type `make uninstall' to remove the installed + files again. In practice, not all packages have tested that + uninstallation works correctly, even though it is required by the + GNU Coding Standards. + + 8. Some packages, particularly those that use Automake, provide `make + distcheck', which can by used by developers to test that all other + targets like `make install' and `make uninstall' work correctly. + This target is generally not run by end users. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. This +is known as a "VPATH" build. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + + On MacOS X 10.5 and later systems, you can create libraries and +executables that work on multiple system types--known as "fat" or +"universal" binaries--by specifying multiple `-arch' options to the +compiler but only a single `-arch' option to the preprocessor. Like +this: + + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CPP="gcc -E" CXXCPP="g++ -E" + + This is not guaranteed to produce working output in all cases, you +may have to build one architecture at a time and combine the results +using the `lipo' tool if you have problems. + +Installation Names +================== + + By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX', where PREFIX must be an +absolute file name. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. In general, the +default for these options is expressed in terms of `${prefix}', so that +specifying just `--prefix' will affect all of the other directory +specifications that were not explicitly provided. + + The most portable way to affect installation locations is to pass the +correct locations to `configure'; however, many packages provide one or +both of the following shortcuts of passing variable assignments to the +`make install' command line to change installation locations without +having to reconfigure or recompile. + + The first method involves providing an override variable for each +affected directory. For example, `make install +prefix=/alternate/directory' will choose an alternate location for all +directory configuration variables that were expressed in terms of +`${prefix}'. Any directories that were specified during `configure', +but not in terms of `${prefix}', must each be overridden at install +time for the entire installation to be relocated. The approach of +makefile variable overrides for each directory variable is required by +the GNU Coding Standards, and ideally causes no recompilation. +However, some platforms have known limitations with the semantics of +shared libraries that end up requiring recompilation when using this +method, particularly noticeable in packages that use GNU Libtool. + + The second method involves providing the `DESTDIR' variable. For +example, `make install DESTDIR=/alternate/directory' will prepend +`/alternate/directory' before all installation names. The approach of +`DESTDIR' overrides is not required by the GNU Coding Standards, and +does not work on platforms that have drive letters. On the other hand, +it does better at avoiding recompilation issues, and works well even +when some directory options were not specified in terms of `${prefix}' +at `configure' time. + +Optional Features +================= + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + + Some packages offer the ability to configure how verbose the +execution of `make' will be. For these packages, running `./configure +--enable-silent-rules' sets the default to minimal output, which can be +overridden with `make V=1'; while running `./configure +--disable-silent-rules' sets the default to verbose, which can be +overridden with `make V=0'. + +Particular systems +================== + + On HP-UX, the default C compiler is not ANSI C compatible. If GNU +CC is not installed, it is recommended to use the following options in +order to use an ANSI C compiler: + + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its `' header file. The option `-nodtk' can be used as +a workaround. If GNU CC is not installed, it is therefore recommended +to try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + + On Solaris, don't put `/usr/ucb' early in your `PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in `/usr/bin'. So, if you need `/usr/ucb' +in your `PATH', put it _after_ `/usr/bin'. + + On Haiku, software installed for all users goes in `/boot/common', +not `/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS + KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf bug. Until the bug is fixed you can use this workaround: + + CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of all of the options to `configure', and exit. + +`--help=short' +`--help=recursive' + Print a summary of the options unique to this package's + `configure', and exit. The `short' variant lists options used + only in the top level, while the `recursive' variant lists options + also present in any nested packages. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--prefix=DIR' + Use DIR as the installation prefix. *note Installation Names:: + for more details, including other options available for fine-tuning + the installation locations. + +`--no-create' +`-n' + Run the configure checks, but stop before creating any output + files. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..6958a53 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,18 @@ + +MAINTAINERCLEANFILES = \ +Makefile.in \ +aclocal.m4 \ +config.guess \ +config.h.in \ +config.sub \ +configure \ +install-sh \ +depcomp \ +libtool \ +missing + +EXTRA_DIST = README AUTHORS COPYING + +SUBDIRS = src + +ACLOCAL_AMFLAGS = -I m4 diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..e69de29 diff --git a/README b/README new file mode 100644 index 0000000..9c3d31a --- /dev/null +++ b/README @@ -0,0 +1,103 @@ +exactness is a software package aimed to automate Elementary testing +after updating elm code. +The testing process is composed of running widget test, +cycling through API functions, and screenshot are taken on each stage of test. +(on user request with F2 key). + +Next, these screenshots are compared with screenshots of widget test +done before the code update. +When exactness detects difference in screenshot comparison, +it means widget layout was changed. +Unexpected layout changes may reveal that something is broken +in the new implementation. + +Testing with exactness composed of the following stages: +1. Test Recording. + Done once and exactness user most likely does not need to do this. + A set of pre-recorded tests already resides under 'data/recording' folder. + + To record a test just issue the command: + exactness -r + + Example: + exactness -r test_hover + + The record file will be produced in the current-working-directory as: + test_hover.rec + + In case you tried to run exactness with specific TestName + and nothing happens, this means you misspelled the test name. + You may review test names as it appears in tsuite.c source file. + + NOTE: omitting the test name causes recording all tests one after another. + Do this if you only mean it. + This rule applies to ALL proceeding stages as well. + + As widget test run you may press F2 at any point to set a screenshot. + (screenshot procduced in 'play' stage, set timing of screenshot here) + However, don't do this while animation is ongoing + or you get inconsistent PNG output each time test played. + + NOTE: You may change screenshot key from F2 to any other key + with TSUITE_SHOT_KEY env var. + +2. Test Initiation. + The final stage of testing process is based on PNG image comparison + of original screenshots with current screenshots produced after code change. + + To start you need to produce original screenshot set before code change. + To do that just issue the command: + exactness -i TestName1 [TestName2 ...] + + This command will play the test (TestName.rec file) and place PNG files + under 'orig' folders created in current-working-directory. + You need to do this just once. + Again, omitting the TestName will play and produce PNG files for all tests. + + Example: + exactness -i test_hover + This will produce PNG files such orig/test_hover_1.png + +3. Test playing, producing current state PNG files. + After doing Test Initiation (2) and updating elementary code, + you may run tests for current state of elm: + + exactness -p [-d DestDir] TestName1 [TestName2 ...] + Omitting DestDir param will cause exactness place all PNG files + under (default) folder named 'current'. + +4. Comparing PNG files. + This is the final stage of testing in which we compare output + before code update and after the update. + Matching PNG files from 'orig' and 'current' folder are compared. + When all comparisons done you get final report of (N) files did not match. + In case difference was found, you may look at comp_*.png files in DestDir. + + To run a comparison: + exactness -c [-d DestDir] TestName1 [TestName2 ...] + All comp_*.png files will reside in DestDir. + Omitting DestDir cause exactness to use default of 'current' folder name. + + Optional: + You may also do play and compare in a single command: + exactness -p -c [-d DestDir] TestName1 [TestName2 ...] + +5. fail_if(expr) macro: + You may use fail_if(expr); macro to verify variable value on-the-fly. + For example, if your code contains: + + char *p; + ... + fail_if(p == NULL); + + In case (p == NULL), a "fail_TestName.txt" file is crated + current working directory with a comment specifying the expr/line failed. + + fail_*.txt files are produced only for when expr fails when running. + When tests completed, the user gets notification message if any tests failed. + In such case, please review the fail_*.txt files. + +6. To view exactness help issue the command: + exactness --help + or + exactness -h diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..b6d9e4b --- /dev/null +++ b/autogen.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +rm -rf autom4te.cache +rm -f aclocal.m4 ltmain.sh +rm -f config.cache + +touch README +touch ABOUT-NLS + +echo "Running aclocal..." ; aclocal $ACLOCAL_FLAGS || exit 1 +echo "Running autoheader..." ; autoheader || exit 1 +echo "Running autoconf..." ; autoconf || exit 1 +echo "Running libtoolize..." ; (libtoolize --copy --automake || glibtoolize --automake) || exit 1 +echo "Running automake..." ; automake --add-missing --copy --gnu || exit 1 + +if [ -z "$NOCONFIGURE" ]; then + ./configure "$@" +fi diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..a2f33d8 --- /dev/null +++ b/configure.ac @@ -0,0 +1,48 @@ +dnl Process this file with autoconf to produce a configure script. + +AC_INIT([exactness], [0.1.0], [enlightenment-devel@lists.sourceforge.net]) +AC_PREREQ([2.52]) +AC_CONFIG_SRCDIR([configure.ac]) +AC_CANONICAL_BUILD +AC_CANONICAL_HOST +AC_CANONICAL_TARGET + +AM_INIT_AUTOMAKE([1.6 dist-bzip2]) +AM_CONFIG_HEADER([config.h]) + +AC_ISC_POSIX +AC_PROG_CC +AM_PROG_CC_STDC +AC_HEADER_STDC +AC_C_CONST + +PKG_PROG_PKG_CONFIG +AC_PROG_LIBTOOL + +dnl Checking for __attribute__ support +AC_MSG_CHECKING([for __attribute__]) +AC_CACHE_VAL([_cv_have___attribute__], + [ + AC_TRY_COMPILE([#include ], + [int func(int x); int foo(int x __attribute__ ((unused))) { exit(1); }], + [_cv_have___attribute__="yes"], + [_cv_have___attribute__="no"]) + ]) + +if test "x${_cv_have___attribute__}" = "xyes" ; then + AC_DEFINE([HAVE___ATTRIBUTE__], [1], [Define to 1 if your compiler has __attribute__]) +fi +AC_MSG_RESULT([${_cv_have___attribute__}]) + +PKG_CHECK_MODULES([EFL], + [ + elementary >= 0.7.0 + ]) + +AC_OUTPUT([ +Makefile +src/Makefile +src/bin/Makefile +src/lib/Makefile +src/scripts/Makefile +]) diff --git a/data/recording/test_3d.rec b/data/recording/test_3d.rec new file mode 100644 index 0000000000000000000000000000000000000000..7312db9960f06df11d99f007aa299ab0ff9116b9 GIT binary patch literal 9274 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 D$3d{V literal 0 HcmV?d00001 diff --git a/data/recording/test_actionslider.rec b/data/recording/test_actionslider.rec new file mode 100644 index 0000000000000000000000000000000000000000..66950b7bd8e1e9dfcda377160e5b18e5f7c80493 GIT binary patch literal 15401 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 Y{A%3cxykike3BbOvaM5EOK_L}2DX9ZIsgCw literal 0 HcmV?d00001 diff --git a/data/recording/test_anchorview.rec b/data/recording/test_anchorview.rec new file mode 100644 index 0000000000000000000000000000000000000000..a23bdef45a23cd5bc426efed61758c6f7c8eaa19 GIT binary patch literal 3604 zcmaKu3s_S}7J#EvSrir(1PXK7lZePaxo#1j6L^0hK}|it2JU~;=qU_F z((nEM4n98VRh;ojuhLF}k&Nt|9%GI(6ABznZjlbvqwiI~JvJo!(ZZ zNej}oWDm@SKXpy&T%GdGlxvH-(JSJG@bZ>?_X5_*rJEi<(l>eE&!2+7mhhH+SM9wN z`ylU@+--G7cCjjJ#^8|r+<5xa*5_vj1j450G|8tx-%|8Zz-8*V?6XHtjFmr^sFicG zif7f0v9XuugB0|x>Vq$m`+8Ktih824&l(%5l<~q-v6q+16t|~SEIB?h{S+ePP+vzP zjIx3XLrYDHj9Xkyd+}^nc-L5TKl6k?Q|QOc<2TF3hBqm+tIn+)O&+Q-##H!!gpZ1g z*^klIWYk4%`HZ^y99dZuJo<7{cvs2UES22TL|xS*qBNoRMFM4-l1$u|>!hGtIjp zd5*dpV;!=lLM$cv4s=<+NQBI>+%lwv!qgn~6my}}`nGJL%u9*-=`$qerU%G)(1%JCvGnPe9>l-WN4T<2YTBoY8?`}4tnRWE z5^IPNEbR|P-7cFAS6Qw#q25pxjU8+xGtEg2i8J7$xf5R^c_$_s(W!R@N;LLp`UdRL zyOFct{@O?{_|e`Hq{5!H+m#rNmG|&I#>x$#iEtBtf|d93)?($|wsK8bx9y~+?D6m( ztlZH=+|JC`*g}Uk&4e3lfu@$)uhSJZCiy_0dYNArKaZ!|k6fXa6hybJSZzMMm8`nY z+a|C7qxMeQz)5Y@)+sD2x^?`w+RAQp>&AoIj442b@-mWH6L0hvjU=-K3;V0TNM^~G zAl)@LOY(;;;I&LHLj%+}{4i#Y8kasyOvMLDvWrsd?uLF2?(K^%mnh`9!Ag|Y(4UuR z`uGW`MkEvRDMnm9*gtCFdzPcc$gGC>TzsPkvGkETh6e3cq6>}|JiI1~E-f%&S-)7G zi;$FtAP%1IOOZ⪚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 literal 0 HcmV?d00001 diff --git a/data/recording/test_bg_options.rec b/data/recording/test_bg_options.rec new file mode 100644 index 0000000000000000000000000000000000000000..e17675bfab19d36f5602a3298504bc258cabdce0 GIT binary patch literal 3529 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 literal 0 HcmV?d00001 diff --git a/data/recording/test_box_horiz.rec b/data/recording/test_box_horiz.rec new file mode 100644 index 0000000000000000000000000000000000000000..5dbf82a383545de888d89b8a9f78df4d7ab248a0 GIT binary patch literal 2243 zcmaKr4^&gv9mijS{Iw`zLj-DA4;4H^if%=;Ak3Z~*IHY)xsf?XLI_VtF?mYgLWtRYif2#U**oXH zdw-w%`~B|s_kQ;Y+$&#!AczA-Is`?XgP`bK2y)O6#QhOqF<>xzJYeqt^P0%w1J=`k ziNGAqVklrzz_=`?117wLodm2JumqOhJ-`kEww%SD1?-(AEC|>!z!F)0z~-I>>{%9z z1*{XWSQdK^FbuFb7Gq*9fGuMfvj;{ZU{)}*>sSX&5-@f?rnZlnn8nyAu-*;WCtyxu zov{Gemw@qE4CLqfm-t-*Jz#RAu>5`kSSnzvSu6>#4S=!xQ3=?qfUz|X1IF|%h81fD zY!_hcZ)FFp0xU5PRQ7XLV(R3fc`A(c`sQ^8_b11nTwIigm=;H`n7 zDv3%0p^y$z$>gw7C6OP1Si5DCI++9nC{>VVak*axj3=_y!aA|~0Q56hrLI#zz*0!$ zFf)T5DOGhcMKvTv$`{wPi(ie d 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 literal 0 HcmV?d00001 diff --git a/data/recording/test_button.rec b/data/recording/test_button.rec new file mode 100644 index 0000000000000000000000000000000000000000..7756095b8bd6fcf53ddc82be0f335e71a17a9fa0 GIT binary patch literal 5666 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 NJT^MKcXp*N`akvl%Y^^{ literal 0 HcmV?d00001 diff --git a/data/recording/test_calendar.rec b/data/recording/test_calendar.rec new file mode 100644 index 0000000000000000000000000000000000000000..cace51d284d319eeaef70688d1c7c7045205130c GIT binary patch literal 3308 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 XH40AK@eie9dhbP{%5~|Qa`XQJC-S1G literal 0 HcmV?d00001 diff --git a/data/recording/test_check.rec b/data/recording/test_check.rec new file mode 100644 index 0000000000000000000000000000000000000000..1c67abacdddbc19cf38df7528319ff3c724f955f GIT binary patch literal 5131 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 literal 0 HcmV?d00001 diff --git a/data/recording/test_colorselector.rec b/data/recording/test_colorselector.rec new file mode 100644 index 0000000000000000000000000000000000000000..b3da6fcaf6e10426785a755ff118b428f46307c2 GIT binary patch literal 4593 zcmb`Kdt6gT_P~Q^5Cl;X0UtzAR90xJf>6Vw;tH+7YH<-2NsJ^S@`%Xm!sQ|2W0eYm z3au2-Wf4{j!Bh-FLI_j=5l|3AcwAy#$kqfBh`A9%VCMqvC+%-PzrU8xC(O)u=A1cm z=A1K$wZzm5hr{WC&ng^FKNp8v9Ej7qmW0F2`w}ob_+WG9VC)TA%jvm4&>sSf0@?*S z3<4||uz5Nx0Sp;`VBY~20+^A`x_5v@0k%koEe8zP@;jym>=IxmI_toA-VMN(>o5br z$^bLaVSfXR1=vCzhRJdOn~yPU4tz`is|Bs@IqblY2biut>}DmYGLO%{LU0Xn`=wAiQ@RPn^TJT8*E+#rQG=@QC#4#dcs1eNA zXa@Kn$H38PF*F>6OTfj1MlhmdXc4DzI#A#;q45ZST@sZRyncwM|-8VFH&VbO!IXjuL zf7mdF7RI1PpJW0&(+fVsU_{Q2|L-ZW?Qq9&C&FnV(Q}$-ESTL5*!^E@`0o_6!xx-B z8gmEKJ2C)==XS3#P;k~h>^B-Z_~*18qige)&X2KOv$ovU!q9f*)?>7J(Z$vF|GF5~ zwxV^b&rb59Gxioi_U9iReVSp`cjiH*A=fUe3EJY471FJ|`#L$?WEyGzj&uB7X5dj$Bt=~-y6VYK>7SPw*sYB`EO$j; zKR7a#PbIe9pD+K*s}W?(+=ctkM5H)g(cAC#O_`*MrLnZAQSwW*Dwz1anxx1)8=oU9 z&?6cnR_yo{Ty;Ik2W?N|tmbAkAX0JAQj{{E<=vC7N9p1`MiwXv^@zDLts(boaqN1y z$ckG*m)k;S0_kq_vve0dZW>)q#4{~Ln)?FSw+A-jI?$MIkn{p?V|}YRnj>i42p6Th zEatj5AcquJnvubJ%?_x9E;oXTD~qyurxeytQoPZMbL!90ZEUrv;$pDpI(T|Ma}zcs zD(bFizmp~FAvjqGT|OvQHKw48h4=MXrce}}wSrsN)6q-;r>4Y%dDa%l5E~y*)Eom! zUWx}U0pTZSg@zg{Q5c?Lpm>_i8x~g?Fl|L)dXzxLT|+oZoSZJJn$L2Eh}U=r@k~8Y zhBK6Lo_9!*vR+ozpfP6)d&NUJyzO{mk*vxYf}1HM#gSjNMxroN$|5e+23})~M6rc0 z#Rco(F|l(KCSk}u0r9=i(FH`joN%6ZlAF2&y>*=5enUHPhqLJbI=wLw-pc6ke7|QK zgGzltDzw*pyo|IwKh{C)OKDNI#wjMpWA4gSc>dJ3AK1bJ@7uF^u8q>BC%&STbCj-| z?1?FjFKdvr4h6;~7)3 z*)E@xz86lBxgQcKmjYAcwAF9d3{NjmJybs6s`Pl@{9P_dBr6}kD_HJ9_?uU}BvcZd z(0H(=(DZ}W_+6+Zy1SKX2YWaz9w;a+$QpXW%5^6wG*+*=+9mh$s*Z4ojKjCGhPr=x zJwkTQ9ggmX-vkZREeF$0<9i0XN5~}@lva6jh_hSn4vW!r+F~1;m%kh#@6H_#PS`7a zhnCzfjPnTKMTNy`I$g=imro5asKTT-2i@<>+vC{QG+tBDHA3F$K9W?Cxajq7Xvu=y z;o_@u3{GGRYpcKE5Q82%5n30qgr62Z_<}9jRs3Qgp?BgC^2=(GQjcF`=GZ2=$8qrC z5FLMZB8+@2Ebh;904N~8xG(RNW1A1`-gmn%?_6T<#8DN}f16bI{%#2nFEOckOP*Qj z5?&lhH3I$#PWWwAtj4dV1gy;2{#&6bW}X8v_WJ0=wNs(sM9mw3KOQ&{B2var3{4>U zBhQ=ALmHcKn2Ji9RL`F9uc=OJr)V@&b?N1WaCNGmok$wdLoB}{Q!QYvgCrN+`#lxQ zMADF+tOrMW8nupLElB#eCUT3F1)HVr3n^hV=Gr>zMR2-+yaYY%*@rYBOBDEQo*r0Z z>UOjTUMTlzM!r;BOjG|5RLq0%My7x6OF_u|J3Ce*}b&N$=fH z-u8P0?sYjC1n0Skn&f}fcY?d_?u*g*0X>Hh#Yj!EeOYNihd+@~8%f;*{MwqI&-x_H zR>pQ*3de+%&m@frSd_(XelZ&f4~0L^8>n*e(>VlD@nKER;=0K^o1* z_t&*RBnN1e3`T;TA2|{Ff=4*x8h5tluv?~doB9mTLu?n!@84WYXu0m1QX3G*ziH@7 z-Px0WUXy)|S18^qn8>BG44?y1NxOUUFA6!Pbe`n2=Q0`-UqM)bp7=G%jKAeLB_C5v^28e0&p*zu{9 zAd-eFa+)b_5bIZL1}AssPG$2@JadC6LtkzHY1hFI#M&i7%{5-G*ioQ;+DzG&p0@|R zWyy_UTWp1_=<-u#G-AFiXe;yuU2cje=E(}SLKoR z$QI}(oj4%&&*s_TW$vLxUw$wUwhHJXE_Vy)6GbiO{2D`@{+piGM&j5kZs}X#zljBZ%T zeN1Pb6Oe7-eHT_*vjTn5LMMoMjknRuBrEmqbsjxEZzq~#OxZ446{a}TjGRo*Bct9{ z+<9!ZGiLfa%=A^KFw<=?)A6ggd)O|`nCWSl>8p+@{5);t{K#tS^0lzm1o;zN*zscH znPv)g7vZ@boNP?d1LZ@}KxgF%NI%I`pLGW9TRKyXJ2P$!@?T@opKUv!TD}y^l5d~X zNbP5`bTLz)Vu*2AuwqLo`2htHYl)eikGZsL~N`|GYi^ zp>rn*q^Y9^$i9alB_ECrq=O<0%zON9H(@SW9GJs4Aa}d4{jDy6VsH^8hOjv6KL&gV z9vZX5PV~A22+wBFOQ2EWQ!ne&hv`iCK}P?5l06;JqdNjBqQ$v{WYf3Pk zl_7vBJ$(j<15LgTQ*Hj{V;qfT$#tT!=5rmNQO3U=7|X<-#oi8i*(lVs0`p0b>pc<@ zB>=UHIlg6XK7cpW6eH#7ca=D{B#ska!R9=Uk|pkR+< z#Vh`fFL-k+!7DnYJ^x7|nRKTwuhRi2{H6eu$WqWl4=Ek_AIe9Slm0_&<=z*4`#&Rj z8uHv|rjp?0xvlNQ#)%DZ3!;BbsgvG{-h<7fO?>OY)M_tO zYw}t=*>5CLGn=2P2^H6pQ;mKkcz!Q4F_1fQ2{v$+^p#*Wrp`&<^%Tiyha)9qBGs+<+DY)HFrPW3Z1ML0?`< zXWBrfZ;}?UIhNcMXxazutS8rNJlUM(T;z2o~Y=_#$rm|$^`Yc0aI-9pw z+$~m;*?9)YV3dc6X!Csew$+4nFip{ZPHivRtS5K!pss~|>PcxzQVV51mzo}bQ|5n` zL*Tynx*~pMQ(k?B4eak~eXc{;f*f8=#Iejonsrd1fV>t?#mkcwAFuH`qO_kw=`D!A z;@}(Qc6NY1V$@%BQRbXkGoZ1mFkJ_?)oTnZENnm#E_svW&K54_+PO}r%bujGjUZ(+ z#X{j%ANUoTc-Do$6*hyf1a+4?LR!GLjuU4&H)QU{h|`Z*`%v$5E(^H+bfyzzR^O*c e9rx`Bk!y1#KS$*zY5(6JTx#w#j(PNF{J#O&-;1{Z literal 0 HcmV?d00001 diff --git a/data/recording/test_conformant.rec b/data/recording/test_conformant.rec new file mode 100644 index 0000000000000000000000000000000000000000..d42c5a4218e63122b966b05383a28833f4ec83f3 GIT binary patch literal 2287 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 IicVGhAI|i{MF0Q* literal 0 HcmV?d00001 diff --git a/data/recording/test_ctxpopup.rec b/data/recording/test_ctxpopup.rec new file mode 100644 index 0000000000000000000000000000000000000000..2da770706118c4c0fb943fa2bac7d306e3580c52 GIT binary patch literal 4951 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 literal 0 HcmV?d00001 diff --git a/data/recording/test_diskselector.rec b/data/recording/test_diskselector.rec new file mode 100644 index 0000000000000000000000000000000000000000..3413015fa6dc82ec2dd83fd12b64955304ef097d GIT binary patch literal 15698 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 Bo2CE& literal 0 HcmV?d00001 diff --git a/data/recording/test_fileselector_entry.rec b/data/recording/test_fileselector_entry.rec new file mode 100644 index 0000000000000000000000000000000000000000..719b169817c1dbc0e830f8d633090c1bc6c0ca5d GIT binary patch literal 12914 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 literal 0 HcmV?d00001 diff --git a/data/recording/test_gengrid.rec b/data/recording/test_gengrid.rec new file mode 100644 index 0000000000000000000000000000000000000000..37d61b1bc18eae22549b60d58e26f2b89f066ac7 GIT binary patch literal 12404 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 z%0AEWmLnv*BbC_E1k=G{^~z-5_D=TkM| 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 literal 0 HcmV?d00001 diff --git a/data/recording/test_genlist10.rec b/data/recording/test_genlist10.rec new file mode 100644 index 0000000000000000000000000000000000000000..cdc3d4899933faca78dd46add3da6b8505fdd6a0 GIT binary patch literal 4912 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 literal 0 HcmV?d00001 diff --git a/data/recording/test_genlist11.rec b/data/recording/test_genlist11.rec new file mode 100644 index 0000000000000000000000000000000000000000..093a060411ab2ebc9f38957cc8f3129b2fde36dd GIT binary patch literal 4483 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 paf&SNl1-$SI^Ij$R}sjwj7J@X|4ofv literal 0 HcmV?d00001 diff --git a/data/recording/test_genlist3.rec b/data/recording/test_genlist3.rec new file mode 100644 index 0000000000000000000000000000000000000000..939ae3b71107fc0267b802dcf7a8a79d91293392 GIT binary patch literal 5336 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 gbkYJjP5JKLG_I)1O|MR|io}HQBXJ&pgJ2U&+ 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 bwL$-PJ_ffAbeR$QhoB=i={bHkoh1JQj4w2$ literal 0 HcmV?d00001 diff --git a/data/recording/test_genlist6.rec b/data/recording/test_genlist6.rec new file mode 100644 index 0000000000000000000000000000000000000000..2902ab13361129e0c49925aaf764b9814781999a GIT binary patch literal 7685 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 literal 0 HcmV?d00001 diff --git a/data/recording/test_genlist8.rec b/data/recording/test_genlist8.rec new file mode 100644 index 0000000000000000000000000000000000000000..25203e86e6a1503ca757256dbab1619deefaf22d GIT binary patch literal 6598 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 literal 0 HcmV?d00001 diff --git a/data/recording/test_grid.rec b/data/recording/test_grid.rec new file mode 100644 index 0000000000000000000000000000000000000000..67009dd874b201aab75fa291c5602833f80e752d GIT binary patch literal 2507 zcmaKs3s6&68i220c|QfEh~T!k*cy-mVq6JfyY}I1Yg=_CR>}<_TtcKtgd}j`0tH;e zQqXY`5D~E2+TDVLs5I3i8i*4g5SguGlNGp-wT22IHyTYQ%WF@R&RlSI@65UX`M>}C zuY2+*V%+~v5Ckm)D-42M8zIOo5n2}92|+G@1k4RAr)?$B-vjd1`Gp7U9|8sg`3i}l zfUyB{A+aK$B1>2;U>v}_NarR1%LB}t#DW1US;FjqRRiWrItO%@%!9<7zB0g;JDJl4mM>s(Ajy6F9;iyd$nl)LU3dB{__~7qZomeB3?Sv00c;qs z5E29NU93yaodtK`jIoMz?i0X50Sh9r0KlRFBi~0RVDA7%uK6xt&UH;Ik->h?R>lg*gHc{`robk0AUP`pd<0`3rS&`3vm` z#7pXW(T6h~lnG^j&f*9cT%K3(!V2nMRKx$H&IBKV?uE|Jf!?1Q;pH?SYi>Lam;K>8 zekwmf>-a<)!TIx*)5g8c@xkxjbl<=^l>I69?Kjs&Ir;)?lFREaoLhBgUGqNUHviPW zWS_kI&1cK+L}XN)#_I2Xby93}2Z{f ztRUojzl)j}Fm8?6*Y^h22H5 zZ%~ODVh$A!>%;sBPxM(EhFG%IxgPo!FQRrFUycTiwR-C*Rk~j;Qv=~Z#nbv9@O5aF zD7*Nv^^vNtk__l@#EYgsuXu)EL)pD0(JwQPtq zh96=ereqHyK(T*N*=+Gsb;Q|j8>Xsd{X*h3l&Koxn6$<+NHN=n`Kzaw!{?<`cf8ti z1T$-^WbUw1O7+J-LVepXtASTtsL^99@Kki1W?z;6g%4aWwQo}FM<1n3PsLQq0^vrf zeT_nF$xpU7_N95pj_T9=h&|{lZP-dnYAU}e!wwex*UPeMU5F}; zWh(U%(3~L#$40c^@bn5e&Z$bqMtXso1Q7+sV{O=|Dy)|lpFwOk9t*S{N;vAHr({Ju zx?C85pC5>w%_PWu(O|fmw5cdf4%|aeOE07{FX?Zt=u1 z@)RgGPBhFno@%;Vp_6DG!XQa{r}e(0tTRj5t>Zl06ZI&a_te^HIy1R=WL_E~#SvP^ z{3xSv!>~h;6mFg?z5wedt@m=bhMUXEc88?5FBuqe4gbR=r_nm5skkF@*a0Rt*5FI0 zJRje=qdIis@bugD&-&o@2I@@7k9JPfWR;TsQc;TnJ05(RoH03+|INp}MMbV?dqpM}OzQtV8Y?0bK)k8c}Odi_48tXSatFZS-83xOd zSFw&UMBR~KgY(e!b;?9bv3hz$k7*5wt1<8&W7Xg-mf~J{K({Ukwr@(4c)?K$8e5=L zQ{ru#Rg=AQ91~B3w$v$Q2BdpF6l)n1bLJCl-y6QY2(+}ZZ>2yGTNRNSxXzj82lWRC zu;T}Hb+dzdY}A=&?ejc*G|qNblqQg<`#0O@l{Y3+p42K!EpuO{Y`hhjbW8Y9Hk))) Q;Ba&$80TZVf{qRS7mXF^egFUf literal 0 HcmV?d00001 diff --git a/data/recording/test_hover.rec b/data/recording/test_hover.rec new file mode 100644 index 0000000000000000000000000000000000000000..ac4206de84d187422a4ff7888a370620336325d1 GIT binary patch literal 2338 zcmaKq3s6(p8G!Ewg(3x9L_ngUtBY1aGANG`L>$*gS732%F0liUCj9##Y`Q@Ok@u#B?hl`xo_4FS^=WoNE-+BW)GIlw;b5Jf%LL2d_aE*7#GOJG$scO z28=;tS-=#0z-;w}fGwfLjRAHHFee&w2Q2#oW&$i1FlSmEuo=aGxzm^fU{!!Q(Aal? zsQ~*8joEVR09#~ZHXm5dfT@9`&*2M9958x4+iW^p&O)vo(EkWnJCI9hXUqZC511#7 zf%=S@58^7p9oTAk(Bk$1wgRwaG`18lf57PXkp$RI!00`90cN{5ds=Q0V9|il|5YPk z2LYp>3+}=$6EJ$u;H}sd0Ot5>J(v%t2q38>LnIaO1epS{l$VBNNCaTd6hMdgQa&Vy zvLLA_O(2o-(~d$k?*V?ghz}AZQYdplJt6|ed(~0}S-gy+(0+k5BV7yuOUzFb*d(|k zi8Ng#7D6zRb`+7kg}g(EOw3!zd9RL?pDN%x7tp=wH1mbu0e>X1@FZ3xAFN}j^ ze9+gsIcNl@|;zEHA|^0tF_UeNb@J^VjvJ0KcNFR}d&dGF*vRCIrwd+YSg?NR)_ zyzL1){oVK8ERHYN1ylu|-VhVmn^WNE6q8qWzTE%$@(Te~qUE6%6TR{ed|AD}`oveY z&kl#b_Kh!y895UaC<@hjoWJFwYB)iT*TXt0PU4%{8SNKiBG>l0wtv5F@Y)|%N&dzY#%d9A z!g9N}r)Kh8(d4&1KcG`Tj$Z#Co6Je$`A^N%7LDd>YDC0M7<=e7%6w4OzPHwCZJ+th z=%atv$JRPM;}#!p>FPaKGuhS>*)`aPmjtPfxgd|D(Tp-qaacgJnL5x%DLiNEw~X&r zr6eZL^D>Lxu$50wXsaxGvVJDyk>4^j*l<@zCK|??xsI9~!Y`-$_moFNst4L*h;Jq{ z{?gg2BYB42X0pN%rXy8`ux2t?o|vTfln*2!E4fO{v|3X!Y`ln93>jCT>fywkZZ_32 zRJRp_|cCz83(V>HV}qwMSReScCPDl}F^<5jJ~m$k`1-w&GInqaLQ zk#t6w`e~bC%l>$7igYX=DR(kknuJ9-b9+C*v3g+4M0 zu-4hvEEw_Mrx^63w6A9WPK=ziM+kFLbaeDjk1DsJ(ivJ0{A9XK!I9J55bL zFpgQT1j72(Q?kz|%7t6m)I)3ZcfRrL9=FNk$flpBo9lL|xn*}e!JHA*=B%bQKg`#! ze8^IIqa4O`cPVB{IHA*Ee5K6C_sf-yeFrD5Hug2j+X%nhx&reW ztXnsCndoEa`7jc!dD`xC0bew;Cka`mSyzBBkvq3@F5qFWs&(9rGjT0kUyV1=$#}V1 z#|;L6^p?jNxSnY05Wb$;@MqUgs12n)o2k1D@=L6)%p8buI_Az2>Y|xQjMFk#N~rC~ zIE?cTb19Lqm@UhFk>IHMYU2J-_O6Mm4b>iK^S7!ze6>75$5O;5S7RJ!WW}g!lG5B5 zg4N|r*J5=ZEJftqCq(sWPTMcNM1lkI@klDhX#jflxoe#^arRoP&Etw}8%c##EN%c0 zh@Iw$+#w&gm(O_dm?(2t(8vs=rq0VEj1NE2YIku{A`Zv-*9;1y-o$QW|N6dS$LF0b I!ot}902jxay8r+H literal 0 HcmV?d00001 diff --git a/data/recording/test_hover2.rec b/data/recording/test_hover2.rec new file mode 100644 index 0000000000000000000000000000000000000000..d035139ca8d3dd059373f5e3f69f622fc1bf8121 GIT binary patch literal 2657 zcmaKs4_H!J7QhKhEjLZeLQSnq-OY^6Otu=eZ7S=VT5X!5seA-PMh>7M^7NV5A9Bjf z>5pYo=1y&ysYBExwnF~HXP;I!+l;(YUl6I=fPpc>AfbCn=liJrcHj5ich32pd(J)g zp8H-(r2n7b2m#L57h=wJ>X7*heO1JZdPp}D$HJk|y1n*n-T~GP z*eoXo@)J!T&ASSE;K(u4X>LfI0f+>J)nhunmAY zpH(AZy8v@u7xcm<6ENqR!Ci4F1Z?u}`IvO(UKSyPFJNb|Xsk>YH-pCE3HU7V&SVjG z(=+Gr{qSfD@Ts;ryj}OeLQCt~JA9;wyR1XdwE@gI|U8k+4=cGQZ)d;kVuAk7> zzyL_~omJ3}23~AU_D4&( zFqI@M?5T^66LGtzYJbHPNI`m0UwZfB`q!}bO>d1ctmb9%v*;kKNjJR<65Fo@J_!;9 zofI+JtoYe)YXU_QkJ%!_I-RY+GFYdIG5igluHHBc5jF;RkUOyUgOsOOfGe4%@0rST zmlK&hf;DJ&_5DWT?}~`;*JZA`&#g3V`g)~aYce=;0QI` z+}CLHffN|>2iy~`aJ!3ZjWx}>Mdq0eHh1VKh7j?5<8380S8ma;3KU{vO+&jklGt3C zM}hRQF1#i3^$f!@Sf}X;Gedcn7&)6^2!(l#7w4Lxqq5ofLaB^|N5NKxVGI13#+QVA zrhZg#hnjYS1C@Ee_U-!ktJZsb?fvS9hPyu(SgaND+cDYpHSry{GqZEY8Wk#Qh1nyT zS8qw8nPIh-?Q<@ZeGo}=#9`{C-9aX)kCZxv=c}7A`HjN+L3z6pzi8}ih)9f*TpIF} z$|mB=J6HI0@9;07-Sk1))tp@i*61ViWv7OU=bK_0E4`5jBE&hJb?HT6SS{7n5ZK8- zS=*2I>ZG|}e6u@9mo8r4r)YmiZd4Q-app+4dFv#(k5sl?T^v>`3riA_rz5Ev4l6Fq z+~xv_u^qFF3tI5uJZhvlW}-Y6#oZnTD{(Y$mM?OV2$f=8vyH#B;OFwr45nZfyVE9>oDo0ZE z&ORgXj$*`QP+*vL=<2JIf&M>9TCcUfv{{q)=+oo=-i>K<62#J0YyARdk*VTmG^oGa zLaHC#7JPHDd4$SaV%|nB^hc`VRenfSzbXLH7p;rs>ZGF~_Sykkkv-ZE#rHjSBO&_4 zwixr)D2QUlXfZg(9PR#xw#MZ3>va+mQ4*|t7V#JF{vk^EqDR(>x2MEE{uU(C7zUF& zo^B=M{qMg~75)kO>FaP#EUNRH{6_q?x9UudNmQju3BS;4MQ2Mbk@AiU!Sicnv!JCW zZ>h`+U(^@EFd#7UW!Z)(Uc4!iX_!+lnb)YW8$G3Xsy=W}?)lw8^@&waVlCbLj#$g0 zPkAF1zdcTrja|H(n+Ho1zu#9rw!G7S0@@GX%$1anbOwz!u2fuq`2)C7H$+>GE1o}S z87)gF#%z8#b!XxnbM8TE%g{sy*?(Kd<`8qPN0nQJFB0xzH*Atx5?;N05x+g$JaR-< zqMNM5X-4Q(_94*^;A38+&-X!6)RDVHr?JX>i@WWN5}Mze!}GL>l~6crxkX#27l?&! zHlY&of}djbA?EDHx>EZJhJ-BNfhC5Rhnwpz*rOTb>G(vm>}y4;rjRKrkW$Xs!%%!< zRl+gFLYTQNaR#EAB%jCRMXQ7X$kp2WU0Azjn9JnNSM3NuC{Z+T#Dxgml~N8_4`Tr& z;}sN7Lrn}`QbQ%he01^UQK~N4%ixNdP&^5(L!lULGLz@7O_owf_%5`L0e)S7Js~Vq zOgJHI!IR)G9eOIsa9lw*M)?7uF%B=reUT9L5KA6mUfZN=hN=4A23-pfg@;coDvZfoAsI HZpwcE36oMR literal 0 HcmV?d00001 diff --git a/data/recording/test_hoversel.rec b/data/recording/test_hoversel.rec new file mode 100644 index 0000000000000000000000000000000000000000..c72de1c4b97fdde61ef23c4969ddce4d9ed04b4f GIT binary patch literal 16572 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�iyel9$ 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 literal 0 HcmV?d00001 diff --git a/data/recording/test_index.rec b/data/recording/test_index.rec new file mode 100644 index 0000000000000000000000000000000000000000..b6b87fe1f65d917e479449f50cf9f7d06356e2a0 GIT binary patch literal 10514 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 vbiC4ObPeLxBO#WYCiDv0hotggwKVvYs literal 0 HcmV?d00001 diff --git a/data/recording/test_inwin.rec b/data/recording/test_inwin.rec new file mode 100644 index 0000000000000000000000000000000000000000..41e5f1aa0334dc7b8419f823cc6d021c3cecc27f GIT binary patch literal 2176 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 literal 0 HcmV?d00001 diff --git a/data/recording/test_label.rec b/data/recording/test_label.rec new file mode 100644 index 0000000000000000000000000000000000000000..eb08f3d9f9108f936a2cce05aa6ce579c2004faa GIT binary patch literal 1262 zcmZY6c}x>a7y$6Gs6`QMv>d@BF~t{&0xAjhDDem;CMptNLgU4{lvN6}Tf19Wtnm(@ zzUN=>Sy2+BXx=jj1d)KURiG$%5KN4CFRce9TA|Xg1WK*n)|#x?WcHi+&CEC7Oy@gi zu15$>f)<64q#xQ;gyQ}JdIJXiz+5DRchHaV2Y=B22sQ?BipUr+KbS;h#V{1|iw*Ki zLcper)_npC2MZIK94uynjese@!bR&!!Ipx_MJ5GH1CxsEGT0`tP>~6H{{)*Xm@o$o z>X4`*ifdj7!|h<=e8S!KfCchF6z&AMB)Je}qBAPN;B8Qp$TGmrfXx=!IM^kyXpuF8 zHBHF3AFOl2I`|(Yy4)ioeg3$jM|9(qh_hzV>5-!2K z`toAg#((g+9bc8bH=1i|hUm_-a|&d;)BY<6jrj1PM0Rh(l-96?JJXb8)zY%qylHtS zU(?Bw1^-`aY29FmpC?b(W*B6#c~6|fsZEVZr=rI*PWZ!S`kftK_rY&Ttj)`o7bN;` zKJdhz+R3Ge-27nhwNQcw29ue|X#GQX5sB(TiWI zJdcyRe|}bXaGo;tini1LdJOHKso_<;d9=R2xgvBZQu)r|vsJ9U(|7;b#`MggYpI8C zVdd%&Qp)vi>n9YPRl&~rSaF6KuHjUB?>-&qWk0boEao2HQf)b*K4y7weZW_>y3e-> zzk8+0FCW87EwjvxcHfbrovy2n1Y7X+Pn4Pe9owN?R2im-g__Ou~n|BGHX>Vxr{=sKD z-X3j?<5TQc9o1#l1miVzgtG4#2N7uZ+KBf%3>!9BnGOufS)OXzwOoIRb literal 0 HcmV?d00001 diff --git a/data/recording/test_list.rec b/data/recording/test_list.rec new file mode 100644 index 0000000000000000000000000000000000000000..17fee075f34a08a14c429393678354c0bfbb3579 GIT binary patch literal 19189 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 z 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 literal 0 HcmV?d00001 diff --git a/data/recording/test_notify.rec b/data/recording/test_notify.rec new file mode 100644 index 0000000000000000000000000000000000000000..65c04323398c69e326c8a90099a68eedbdcd497f GIT binary patch literal 8980 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 Tw)khko6qWL4jyb(m;Cf!OhIsx literal 0 HcmV?d00001 diff --git a/data/recording/test_panel.rec b/data/recording/test_panel.rec new file mode 100644 index 0000000000000000000000000000000000000000..05b8c540b022a5913934c0c7ac30e6543ca6f744 GIT binary patch literal 6873 zcmdUzYgiM<-oUvCs0fJ4tq9m!q<|U`5i6IpUTUi-tsX>0f^I~rTvh~0WPzYqK`!E@ ziWY%tt5y+Xq!2E<5Db?px1%Ci2rQupQM0hoNFv50@5FkZhtqT35AVk}&$BZ-znS^Z zOlJ0f8E2{0Dgy%pL-05n7#N>7FtA%~U^Eb9U|{qGV5Z>F*V%ybS0K07efWX*VZaz5 zH<`rPfH46xn#2x+V&vagE?`lBO`p{61z_=jnNMPK089BBQvsFHm zV3XJJ7_e}_Oec+T7BKz3P5%EH0Am3*dCuUh80P^t?O%PFyP4ld8YCth+Lss^5t$Sj zmlzQXA4-S>X;P%Yp52MN4cG>U4HEaoMkXZgjy+&7sdnq`gZp-a4he|{NgrNg_JP8` zNsEp=9C7G?!RE-sLkHswKq+o_Y@|L1dz6rPa9>=M0TYfr04KbM5qn@(T*QYy|0d_J zarec2n83cc5A%c%{cXU%8vX}P+#MYmk?=hXTEBl|9*m5P`>Xt)i`UP>05aGcvpXu` z!+`H6_Lpq1oc}U4K!d>Q6ZC%vyLYsITH=!@6)i81eVG+h-M0H%BM-*WRo~7&YB~!F zyFyI_mBikET-kX2{5H=urL!{kcWu2==2KC&Cf20vhZX%lJ3HTYeXIqT-3f z-t5y&KAZgK?2tRQ8%~VMG%f8rZpkC=ysGy7RHy3^_FVtI`^Y*{w}=0uwY$6f+H%Wx z9eoxqNbEa>b!P0FDq%C-r5_Qtbp4oDABZl-6E%bNVo)x2)b(kE98s*IUj3{_JtF(v zii^b5C3Oa<`V#&hB+J?6eEBBL6t3!;?DH^oX3U!v1|{5E;&)vZqSQc?h!;}7=W%oo z54r4AiRHDFtw`e=;YMoUWNfTjT8#YPlW(LU4Sv4kL&Uv0M{Ii-Tb+8epze8cn=K)+ zaACTayqlP%dD|~u34e^PXWM0AAF&e#7tKQKglbc?34*7g+vVp^V3G2JgNy7Ckx=YJ zOy{v2(TDP}nFvehI0Zh3*IF@Pw$%x20h=01!*-AXrj!Lc_yp!A!Hg&qo@yB?9W0xT z&;((|R4h+4opR};cL&R`DO5ZgYa&|ZKMgkJVl5I2JA^Axd!k+tya=rqh{MUU4Am0! zK15Zd`-YI1A@woa1fmwPRl-77rFI$>$TrKtSdxBYxDrRKh$8t&7G@>sw}fxwVOG>u zwxWr#|3wQ%zZW)7S<_HEjc|ateyGeLI0q}1zZeXkr%Xy`Ekf5qGz(%gJEw^_DPNq) z4YR=IR=W18i@5 zoddGPL7zyR<|)4tv_e4gX!Dz3GVhr0c_3RnjhLzzJF}Ss!BOnzxw>2|P@gb>1jYi? zSubcCyI(Kp7MHeM8Mv)JP1Evcedm4iCknH;$NS0K+TC$=Y-K8{s%?sN&x>lqO}w`q)#nWb*GvO%!H zai;%5Wpab8Q;M`zYFERX+A8bTf=!Yc<||H1TViBCytW0+FTd_sqO_-Ixjo$l&%x$w zmUuC?&nYhxSv^g@k2^MwpTQCORYgkIs|&H5mTzwtK$RL#VKpPWM=4!WQnjAMronSW z8z8O)VgJ68J+uvs-`S8;?(Cr~KI%J-QHVz$=Ud4xL)31z`mXcJZ)HCB3hyWXhDWEf z3;>2rQ0`sO_`Fc<(!II~oQidKKrzh%cGh>2_R$-`#uS-zvtJH;F{Ih1|Lcv|^eC{o zCx1{ygB_y2X1ChwPGCZbrWkCV8fNvxT@tG;m+&)0<5qA%H^ zb`GFRyj*)9NFSZTbyTg+#%8cnt6ese7JJ{dXih;iC&mIjt&=Y}K>rn&S-`Zh%sEKE zWMd|O2Z`150(CIgp4d`y_WBDeytmW$*_Ob8T`6@JGh(HS+JvGZ$;Z8E8JyI*HT7w# zKyjz;p?t6YGdOw7H!5pXlW2)nLtHCVC~3DtG?Mn?{4Yq0bkv(Kh>fFlA@61eMQn38)I@j*f-u3Vw*V#h; zn|G^yb^Yr^!oc0d!69er=;uQD=NQMI$+j2#O8u`En%0A!HD+kOSDoo$YN%;SPR)B` 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 L=?n!8Yd-xSO190V literal 0 HcmV?d00001 diff --git a/data/recording/test_panes.rec b/data/recording/test_panes.rec new file mode 100644 index 0000000000000000000000000000000000000000..3bb6fd4441313b15d3af11bd8f8b6032c985b081 GIT binary patch literal 4721 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 literal 0 HcmV?d00001 diff --git a/data/recording/test_progressbar.rec b/data/recording/test_progressbar.rec new file mode 100644 index 0000000000000000000000000000000000000000..b07d1a719dce815d71db95694856285cb8847fe5 GIT binary patch literal 4391 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 X7tuTEi$ARWK^z>iYP0q;)uVp_!pXGW literal 0 HcmV?d00001 diff --git a/data/recording/test_scaling2.rec b/data/recording/test_scaling2.rec new file mode 100644 index 0000000000000000000000000000000000000000..ec6e8204e4f65952f8e581f4ac5b21b1765489d3 GIT binary patch literal 1843 zcmZY83rtg27zgl6k?{}#}+Z41uC{hTHrzjl&3tD zIpUBpA?l0|B((yok6U?^;u4EQ7oMjb^9t*f2pPM$+b+M|sfss9F-5!Aea=qEK;aiU5J0fXzp# zg!d;Br|<*`2v^8Y7K+{>>##6gz?z@)QJwee@&xl6;0fmUDNJ3kpqQP6vP6kO;CC%< z3W^He_y2!NYIY>-SwtNI>l^Ej-MOFb)iLp;@yDQjf31~AR;V{NB&x3MJQ(0x9KdLa zcEAHlJnmilns)J&N6GKLrI%D5jDSGjz+7KDd&j2EfVPsjzV63gezQBLY+`6r=HwE` z!Hg>9%!Rw&HAO~s`vA`-{p#k=o;Ve8Ipd9npqovlvv=Z7Hl?NcNF8oRZz-BJ{3;4- z7{&F^K7AEF{svjN{Cy86o|O|WgFy5ozQiL!*SVec;NL$i0tJtL!jx zH=|5)lc>n-p=tm1TSvzVU*>zRGnrau?dS)Iv4UwQCa&psmabsl=+s7FRU9LNhhn`P zqYHin8*XRXvla96fe4 zt1zTsZV$0Zzl&pbm9X@?;vfcfhFj)hg^}!NfbbzZWDvDv2Zbzh2ZcMZ%Nlb#(-l8U z7EIWstk%3HgRvr-qE8o|HLDpT^UxvLcD8+{*TBKU3x`Il?zB)0DR}!|?C{p{vB6 z%xv)KB~&t>sqV~TGE?SLtnkBR#CIGi9rrS=mQ~WEYi7@CA__cJP~fTVSo2p5VydVo zZ*C`XML9g#4L>Oad#>+vlX#P_@$4GSay$BOS=$M;Z84X%RFbDJ*w9s~SVe9-FI8#x zVy)^Pj?fEV`QlKuVx9W_M#+V{gR4xpbv7GV{e;bWxXp-~mGNEWGkx*p=9rW|BA6k~ i`6uD~huDLfgwi9!=F6cYZ%@zvDMu5HA#<*g!v6p^la)yT literal 0 HcmV?d00001 diff --git a/data/recording/test_scroller.rec b/data/recording/test_scroller.rec new file mode 100644 index 0000000000000000000000000000000000000000..4ba26ebf6c679e2da85018d3d8ec0a644b94fb03 GIT binary patch literal 4725 zcmds(dsI`$y1>&?q$rfCAO%$FQSpI@4_=CpYI{IIK?OviBtXQ-b0Y+@VFS6xHz0Bm z#qtQgi%2mdB51Nn5dx=Hf`FQY$3}v}kpwm|O(KMlGojvfQ}0^$-@DeGwRUE{-+Zr` zZ)RsN9WmQMAP_zSj}3ufP(&bnH9+{h^hW~W^X~wg10LO+1(3Z!|Bd!z1LL=Vkw9;# z$6&xHfPJpV(tsHC2|EWE6|lK_dZU0H18kliGY2f=6Q%;}3}B{udO-gCB4Flv%m}dC zfEnqr>wvKU`%;hTZ0iC0LdSG-;4uY^4SM}`tOOzon7%*V+FEorA8if5H~_F`p#NGg z#x!7kfLZD>;Qw>^CwezP4Rk&h>FMnS%nGoDdhBb!)&Ztpk4V6N08BsUZoqVPo1uyDZi-d4L)Jmp@7bsOMG#;@8i5uaAC*jth)*Qw%^rwIijDvV$uvUh$6;JF5dPvVHY$yrl1SJe zMN3IaAOI;LB0fsjgBm5%lA;r+1PTld+7eBO!*eG)HQ3$x79Z`~^ zq7wd;|7Y^i2_N%}PWZSSDCLv9{#=JH93hf$BrbxQ{Ly4KgFk0M-havAf1|npyTR&{ zb=v{=jP=ip3p%x=P3AelL&vJGUf*C*8L-ClGqS_#uF9SB-(EW^DLkGpE*uTKvw8o> z;;?5sY8`5hWM617ykND=&gO8a7xl+q8w~r(uKTSSeJvhtxaD`J;cqKm`}bWrtks73 zPr5{pdqgJ_N1Ps%Y2^p}Zx=hG)wjbFw{PFBI9XB(y-VA6bVPng@W-~L4f3?+CXf76 zhVI1F#reG{oFTQBYTMF#@-*3b+`dPXNnUJ;dwL#jJI3vAga2Q&%q}Fu3~xeVBYbOP zgc+3HLGdE7KD1As@@T7E(xyQ?%|w$5$MXS6KX%EBv7rW<>KJyHA(+Ir0qtib&i$~q z?^P3DNz%3jl33Bre1Uwcc6-tcWiD503PS^Y#;<}h?XSmCE~&A@78>AO6Ep3wa4OUQ zx8=G%6WOf9!ewjA&>HcjY}YOk`yj`FS4C6)d{$LC-Iz~T#_)d6cI_0EI$(CPpSL3P zv#RrO9UsdSYyQqD=3~pn=sMDg+WPM}m&ENU%0)RUU)k^$#6L$>2Fsaf1rIsEG2~+% zJj91{ijO6WH9I-0n5bn7vV%h{L*I%$?662G?ke_JhwZ0Aw_sIneV+)~#bLLEzLQoj z!Vky}Y(W?cpdvW73?=5$nK0yru(E^gv2-e)BD-r271q}KaqL@q#Zq()Mw30 zdxmfo1+5e-=t^u6l+)VH$K1tX>%qeDFqxfh;gYYR3$O(rL&ST`p_{d;f54Wx!SAH; z=J<|0Z5g^p927fkDa{jn=n(y$>`dGvPR_6OKP|M4ELT&vyeAdvoYEupkw{ZMtX{x%6{7k=PuYsQl_{{HV^tz!V~t zqdfJ$mMEREa?QLm_)L#wo4529`N%Ox)YB2tc&2-A)oc@}x+Km2-6ZOA3;*D_XHaAK zit^Y-YUC4-&5YB6Ds)G4tniys{{v8ht=x&x|3;cgnixP0ja3gCuPe@g%2Q7ZPOFG% zA*_&+L_DB5wyn8&p8T;Xbnulx{R1Z{ukC(~W?2t;!zN+(Otue|_4`CCm7+%co_|Z;TiK9dUWc^+Qj`#c{7IecRhxmECt#;Vuu!a0A>f5@sD8qlf;K z$MoKd{}w0BIFk;_!nMKP$4NQo(!nWGnc}8Y=mfm{0ol#QoqP)`ijz+Nl-^s0a;-?6 z!@^0TVhTFXgaV=0!@{(Eia9_y6U16zrq>|udyZ1!*Rueb*=ox)Rnp3{eD77Lw?8yQ z9y?a7wv@cfx;4{8V)7YANG;E1fwaF;(G?Drzw$kSdh={9<+itJ_G&%nAn_rN?Y!Xt z#?OkbAElmkBXy*b+;%SOd3yBvRPG`6E8pZA#Wj}HjL&=3OL__D!>q|7K4TWi6p#}|lEZoQjj@4$umQ1m@|18jfXBa?Xi zQWLgOTs>EL-U5oh=NiayJ&q2wgxX3?7dqNVFXaaJS@jYtaHCCbLig>QBq~m6uKL%x zF~+uC1B{!SA6^MWpN4~%$IuCMuI%U3)^S&xW!N*maAv5GSK4jWOU}Fl=P_&Ku2VB! zdz!F!VrP0QKQ_;tb!&4fmT(cS26HDz>kN@8`Lj6)^=!R^u$ys(7fL}{9PYt;6%6v) z<7hxj)mO?t@Ray+^iims?U;}-dnVt#njX&$?eS%qnK{~)V`SD`rBl|y6SK$9e%$9_ zh3rIYx548`mE&#K6@ysna@+lw1>5mEH0LC8#TvVPSD0}&J;+$)#HC#y?syz2r3vCHIa-`;E z?5+ku1Y8|fBkvroTiJ*7-ag|vnlsiG2pxNZa;-HczU;^W{E*tY$Q_9_WqAx@*3F?~ zQcdS5{*HomimQ{Ar1`jwIAuj2a)`4`9G|2-V1*T(L>L>UjMz-{a*Ml5g>RV2i2vq2^ecGAjn&!^iwhSRxVfWFn*tZ8KrL6d}Tio-$Nz z3Ki7S>jxc|bmV0DV}?nX`upHw}V;)Vpdi6O|t6_jf}As@29+JZUHk1tjhTHI#|&IxQHMhDH8i zwk}Dz-i5Q0kDc=3{s!W4IvI6OL^f1-jE|+AuI~}qP~cc5>eC!LB4x(HHf3nCiK9fy zjEA>S@pV<&jUA*t5y>Rg6=~IFTq1v8qUx0QFuMA5$K}uFNG?wy5-V1_cy@h2Hx80+ z4LWZ@g1lyKJzDLO70g;Wh)tdrj7r18;doyK6dlOup2_RB2k{8k4_8TNS&=o$xl$kgazs$m)j~m)_D1 z+lh;>D^3N*Wxf5j+VN(j+*{)`a3!Zb-{NQ^(V|qV-kqhj4yc)Y;olNFSNU)>dPVL);|$dSwfYd zyyfE~X$LqjD}^)p6)m9>>AS|V1F~0!h=VxgW~BPsaPDPO%}!dcSG{Tc|L8*wt;U+mul(7ut3rX z{xP@8M!Ra{=A+;$T+X3a!}S#u)t0auvVHgHb*>k-t+Rq>Lu)a$)>z~U=I~Kd-}AEYfEm*_H9kgk}c3F#mMZAW?Veq52Y5&dg_ju z)#X^u(h3(pj%gE?rt?nW*?@>!Q)k#dLpQ=%Akqclq$b(fb8U9Nf8zO8?PLY=O=)&~)nP-aGKXl*n3a!?;Na^5@uPX78Bit8diT*g{V=vd7FG1xoCVRdzNSlefjftjaYZ9lILnk2)RG0`(Zu1P z5Zigm2e!Z14VEkC31U3fFJzO0)sv%BKUHW76ve{K#-4$#s|GQX8{~$K3*Bw6Y6N?X zRkSPky7u}bkt6Oj&#Nm3Nz9E1 zRv>EI#^jFiTgK-Fvl@PZ((+?G@2^WGK1v7Y6pv|KFGP0BsZE&5iLprPad+~U`@+nn zqd`W`^zs{bg^R)Lqa zjiMx)kC~mDA~9=Klp9zWF7LGv zmwsL8?S?E7FS((a%g4@$O}nxTsVra4XFbH%(s)bOZnaSv8m4|j$7==YjkUpcBx3c5 sJ945$%^4Z;RVcKD)PA!i3TM^#26e=6;$+(3|9u;~f-wk*Q4u0Spw(6@inLNhK>>*n-c#g}#{fA;Y7l{< zwc;a&6e*%m2$V;VWIzr9EJ~sxBnS*8)*vJ>#E{8>kmT<4^nM@r+^5Lrz}{ZOOk;U~Ej2MyANW}V#s}xc*Rc^a5x^GPGhLg|H0F=7 zOMn~%*kf>BzG#jzz=i>{Tg1Kq>z2$&y0c`Q}hyv_W zz!v-52bk%(SuC=51+c?_ExuRnfJFkf*gx8a7+KO@@g%;~h#W>hnpSz26DbZXk^q_52u^&UHYHtsYSkeX(e z@rRfg2O9syT0%4}BK>Q#qtR*UXOqo9EBSO%wCN0!2}=4JO8p&1oPj9G z5r2&NFLwSpZ(Q;p4#Xw@;U|>-FB7JnPKb_3jfDXIT_T;0j!yn(`@dhMX*#ngvzWxw zaGR zFOiHRRvCAeOs#!4V@X2T*Bfi{Tz|D_{#(KW^K*_V<|p5cU7gtY*F%5u_W!Z#)9Sa< z58mC<{$ek?iRroIYU+=EQ(0$YN?fLNm?YI_%*ktRxy>(G46%{MAwT)G)W!EGFSUle z?V95*>g&xF$@*r6uFY5Vy4smSGfMjTNqXs4t-)_7oROkaB(-6+pd;HTi5|+1(As2= za>B1=&Cs<;T*~~f9!~#%{Qn&=-2v42h)=hK{(gYUPhw;(yoX*6^PAqv;l>XtMtH3? zQoJQo(Z+8xjv8lM_J(8kHKW7~Dk8Du@|B8F!+5{|YYRG=%$R<4tqrqA+r1Yy2(p^m ze5sb)?tvnm+;?7`uHiUyQ_)_T$3;osAZs(aQ$_cNQ#;|qf>sflsd8G*{Z&cageI!y zz2U$MA#Ui$WatJpsMArVB)X!(GV4^_LCF7HutJ0eb~?JEACkET1rDl8He%oD{fXeI z2z?}5w-Mb<#)4I?AEBR;p{vvgJFcfxcaGY33*qEzy;LzvVRKcC1{3# zZoc-Q%FY6IwucVZQhuO5Vj~3MP=w%4BsZ7pnuGYOLeC*tokPo&Q(MtHk&v6Jg&?HE z7ebtr!Ld$Oc#lVsIm}N0QbwPTopP#@wnaMhnfiDwuU=jk3Ayx=+QV-EiOT|iZWW+c zm-Adv=@=z;o01h~;Ni9yMOK(_frz!bqQXe%3bnBv^_B%#;hq->8>C?_=;KJJkeYf9 zxW&Sh)dTa5RI3~$L>MMhRXr)YVZP z9ikMR{LZ1@lpYtgcd3{;Ty#OAzkeJ%t?FSTY(_6cV(+Q;dvukw zB}?YNtfjC9if$qHLRP7!ED}3b?d;JdzZ}+3(zk}iOCFf_CnXwl>FOMWHR~f?!@AZV z_H512=-ILoOGlEzrcVQ4Sj3l5G%1mBi2XYxO(w+_RJR58(GQT6>ht&LXi`B|_U&-3 zeI`P%<_-@g><|d*B_E;IvUR^Ht9J-c5$d*#%dOWIkFCCiq%$R>gJEu{MrNIYzgPxc zujf6T*>4U@CgxrY!b3A%UU1tkK`0qp*TIr2^`U}<&MFG-xfVT4#t2M8_aGc1*nHFZ z7Gm5XI4?pWYlvnKJKo$guK9-*YVgi96lKkf8fNKjMa_Yd6WppcUv8V5p2f#?r!Um= z24|Qa-3Ff^=+jiCE{9%rlQcToUzPkVkrObW{-&OHOb|*8+|@0&)NJzXmiuYqStK=| z-glFvSU=hO`7qo$6XV%EVA;>Q(kwYcwYo{-IN#%KPvN%D6z_(`YtT1Bq{14knXo9T ztF5+Vm%xsUrF0BkYUVwh@$~2xxqN{U$=Hexg(2z%+QAGdY1aNQ_KJED{y5 z)lR#cb}o?_^7$|;nyP0bd}}CDhO(K2=Y#x?8Ro|6k!0$ITgcEd=qnkztfMLePxcTz z&4USHnor2srYhg-&4iK41AE}UpXg^~sP!@8vq8S7^1!C)fV#=cqVVdm-oRmgk4YmW zRP#`X_YAwpgQ+v&0z>9ayTkG`B zlGg%DGS^>F)#%r{vB`PTe<}pZniWZ?bSqrqjMPJkeiNTgIRh+4zS7+X_`ciI z?CD}@cDe>E((wzF%V-6Zhd|pu(N%>-VL=6b+2h4h-DdkqJsyd@HN{QNL$K6Vlt95n zwwTWp_dQ&+8v3%9uwTap`elU!+2fJe`$UF0OjcyQ0zmr_5rDGb`k{aZFbl)qKySyp`g`zWH_Cp_gB}co#JOR<;qhr)J75d zK?iGvGFUO!ImjQLu>;R}O?Xg(GV@yBtRWylDR^Jwxf>2~44-p|z#KXh$fgYRGChlp z{KAwl0+fP}G|Z*&ygsCLK*ArO`t?}C^pe;2Ju_Nwlu&Hm!FO?It?{l&8bR9UGvX)h zn-@Na3{(*Jog-FrtgY|{gV$fA{JmmHI~q)HeGi|dJ$T)C%A1>VvbI9o>tX@VFI0i- z@x=FGWS}-z^fsPmR6GWvt@s^0jiXrr;$^pGcv_ooB^jGPIic4)0@29>vVeK<=rTMe zHVXv30CiF=g+Fjb(j_9b292*@3RChVS*Ly?1gRrx31Q%m!j-p0V%gQXyWyZtR@t1J zlvM%#;4cInIY{mF%-UU0f>>+=PBC9!4>I;G6cbup=q zM5su;jCOQqFGCTfEn4{0G_FAIN57$24;=7{m)zbLv47PPl0t=$syZP5UY?rCj8 z-@>?ZB$|rkAUu=3Hj{69e~w8USm60)jJ}F7c?Jm`r%Fdkt(*K3n06iGPid=?@X4`kf=f9C_*S4eB?3}ZcQ}{JnD8#l^#_8$V zT|QZc+U?T5aj!!=gTZ6vhpMcXRngue1c z0nP6Tod!05D(1}NK3$RDeUSo4@}+vDq6V)X$FSQ|&&NkWOCMPRZ2 zE{>SQG=q>?K%>MGcS`%_)??9+t0eT_hU&E4X{`aYE+4l2_cnN%(@`;xgb^k)@1bke zY2hKGk%8l!)ho5Lty~dT;jEnSdGI&T!FhfOsO2ga9-am*M*jt{=Ryj5u2-nTs&WvU zsVhC#DRl!Ia)@jdr%Om; zl0FIYbgx_mO$;f$;OIM z?xXA4Q`H=Ec=YM~i7o+@Ky;OQ`zsEuRkxOFN(yKP;`QM1eO;Y<=CR`)4S0N`&*`57 zz1Xb3kWfiu_{@e|49)Piikg$uHgqtE(0V%V#J!F;6q=dpa7du}@%=T2o*x!GXllq)+p6msjmBa(Q?a|c|?$D(2)JLf1 zX7?>5Kec>(2b6(tx)4%9dpzjqh8D`M>f0s!?ICnu+Gn*DYKbcwQFpRR=fs2Ffr24Z z2ySuyfm2UOu9?lwyaG9yE2HM72#J`tf_vfcp@N!eRb zQF#k-Pc7Fv_V0$tzxiYN4lkALZRiq{l7p%h6zYRjqN^y`(@P2;2eF$H3MOc#ld-Q< zcCm(3{KyJyg(=GZa{rmm%6>QO^2#5}Ir*EC{UJ({ZB4~1g}TciPe5M*Kg2O)Y^lo5 zlo8UL6RPSdnKiSmgPvsUxT@qiaBdxmIweA%%82E2SWzqb@Z?0+!_^}60yvAWicm^t zSS7d{x+7rJbhZfPSwkP!Y8&LM$=F?>q6h|P8FbVh&e;R1;jeE>o|?+vR-$Gl=6<%W4r9z`^Bc+%#J1KVG^K0qr~4c5g}LSu zig%P)O-E1ltzZ?+`iu^&U>Tne4X zEj;}^;$j{g$}#?}WSosW-LFsl0+fjzj+06@nc88i-L`#_zk!XU?ANz^lmeYo`TWo| z$QM%49h*|1+p2|FL4Ae(kWD=DV36N4v&m(;-$CrCSgEb?C>b5_h9!>T3bHpGR5*^M z+G-~YvYF;0w2;aBFa?WIP4~@%Vm1G%@!6&33a$6_Q+iQ7g*8^~Kg{oVEsjser+3ba zU#!%|TqFc3PKeMgWsF*43e-fU#OZ%xaVgxV#uJyDDQ#5BYjqqM`gTm?Kg=S}x@c2y zr`q{aTdmWs`A2>V)B7DVu)$Vqw?@0fV&k;_K{K>tco6r$v#aFv+oJP(( zc5%4Tto?Zh7I#>NiiP~W3R@BC$|QKDV8JA(6YP54GmuL;&Agr&xdm+77!F=(_Jq(4 zzdjQp97pscGUlP$*6&l?tZf+!{=SpGr>K5s3TEA*SPha+f0PVmF$sT`@;~Q3 zf+Y9nuCLUZQCD2d)h~&LyXnr874P5;jG6jI z2%=EVIU?fbwF`(n9e_f$^W7LfZuv_AwHHD{-FN)AG5L%8{0OS|*1wbiG z3(y-&1>*OW=ZGVL!7r87y;o7KhcC#qF;@VRcn%JRU2{c>YJ8=zKgIzAMw{9P!ysy} z2({=KTB)4K?)o_^3-Roz0t(whfAI$N%_uK`0MB;%dcd2ry`@UYqnv5o-N z|LNI;hH;X%=yi76&pi#u`TcDHpG7NuOZW{=U~ON2>egSiGsC$U&(Rzl4vU1J@DSwcq_*h;Ur3v;4mwJ3bwg?jUM$7q1v-uzAZvT zSD39=iO{UBtZxopt<#-LHxB$(Kx=WU6bh9TrSNOQ$?yyPa$Z4u|9?Szdqar>7pR|U8!5jU{?0AqH5!Hq#(r)v_$CMRrvjRNECMd`@r>P>$KDZ&bP-z4qUu*_kGKo|lm}NhpqJOGMbFjAGITRj z0=_EzY|04U2LPd*h6y?xx)lNZFmmt1cduG^?9yu;pa@JS9 z+FOyXk>vjG$F*+>R7-58Xy(mOgtH)rmsD{QeDaIS0xuv6jzu`{GY!BgZbV1Ajo3dzC)74(l9du%SMtJ|1GGfRDcDH70uMNO42ja6o6pAVw@644h_l}rh-E@ApPQAXZbgq4n z-#*g>EF@*0Qt#W5kv$>V<+qA7F3t}Ay;)1QTumC^;9NRay2iT=zALvRV;L%DZ1#s; zBC+uzHP@b`-MVZ*aI|2=@;17nQ<~*tEZ4r1U#I*2xi|Pk_=UhN0o066E3rc|c6h-E z$MbV_#EuN-k&k;BKp8gP12vnjbSwa*YY)Lhr&M1Mu?oYZl!k*E`D&7uX2=C~Ds*{l z>$a}x1Hll;t<6+p4XCW(qXM^BC)ciNjCfLgd`E`yjae^AgdSD-a!tLV0ST;LgItumYd_P`fZKNCh*VnL>&xKXArGdZ3^%{2{1 z?XW8*OcCn7G2tszXUTYq2<6Mx{V0BU3mLsA2?F)17FNCY1k{#|`8c}p?-LNx3&?!Rw vE=cM$9KT04jE&-!h_qiLnj?N3N1_=n#+u8QX-gA_U6$b1Yf}yAs`zNm9_~c2-z`)BzMx|{XS0b{q7$(U-mqHGqYyR zS~F|UcABu>P9PABz~e|Dn0!MZ*qk94oj6Az7;gp43_OOmWuU$b^NW+bJ$YAGXKU@fE55{HK!k_8~+QirE{1$ zVAlXMpTlYZ;{rB+4l|7917>PqhBok60oDrgx$AHPRTQwf@(gS1GK_gY)&!If0Co@L zi{{KR3)nNj?B*~a-+20O{jLBX7-ZPa>GuU-_JA#!!xjOy4zRiYhyZK{U~_eT44A=h zW^=}t0k#LQxwh&A>Dd7YrA)SyCmk^bl5}uGmn9~{@ej+X$3`kBPq`fa5ivyMakQN`6 zPEAcB?2k%GJ&{NNwZ!m*C_@f>l$>%RE-{7>Nl!?kC;tVhG&&=Z`hLuR$Vmy0kD?~W z(t-HDN|7g`q7wgI|DVdoCBD})F7f?x=&66x>)-1zOh~)}Nq#@%FAe_P3iSRD z9sVzBm|zcBeX_wE%)!aw50c7XE;Ac_7IEn0M`y$LnH;icI@M&*u&1M?P}U`Kv)*>=<_#dRR~@})JKFWDyD*qXn= zq^BkS;NH-vW6KV`Q=dtbISlbUBs!*g=+Z>kSK6r)Z?j3~Ufj~}i`C!c$l=wyp4MwaX18jp{J(yy z@fpq*YedNI(Vc#sN_HM;IdYXo-@s(#+Xdogd3F|%r37A%^p7^LhP9pX^PzPTn1GCL zXiHfMqaD5kXoaNJ93hY1E=21`l}lj9j(|llJ-^};JUEXOEJH0J-T>@`*hdhpwr~fk zte{^9sun_52jB(BF&=}|y=1h0DIAo?|4ybP&{r_G@$Ag8PZSG!v9M7qbM6kATVBX2 z+{v7~T}EcBYX%(6Fuz99Qp6;JKA-7-8#|(?*%gnPDk5%UThB3WW3J0tXVC&r-N!J) z0je2*=Z^;!pjoLi4YNkvm+2#vchB0hRL`CpD{p0m4^qCdBVSE~+#j(-zh>-J6;C$) zc{8~ueuzRqgsYpU+%opjxV2+D%TT7Ea3!2&#U)GNE=5H3lYY7;l6+oPv;o=7BXujD z_hP03sXxxyh?w$7cNL3!Id+J-r;`gjZAtuA7PTC+QryJ9cSvm}oD0xv~J95EvvU&M6&a22evl7Ax6{HEAjf>P|E z7qkXdjG!=WpsrGOjC|Q;4^ZBvc5|rpwYrHE{eV-QQy+6JUrRl#%;c%;>Nr7o8}Cmw zO&)J3ZgIK-(i%(RXZT@9Xr)AYgy}|;M;k0MY{ku!k&iITY4nn@Nmuv`n~@_c@KgRZW z&D7k6inQr#2301n{fh!0w&|1f>0h74wdXbJ@dHg$0Y%d$T~3_hl9HMtbMx>ml{H0- zDdbG!nn9)$`eJE9TOMZFSTJ#ld7w${obgA5wTRlg=i#fzzt21Hi}DF^;^|D|k z#F8hrM!p0TvQ|85)V+S%u)6oRcljZ$&?-l%9Gc9y95R(P{QA^| zc~qtT$D{HCUoC*z2JUvw2FcW(dRN$b=MzqQMJZ}D>d~3GM~3F9O9hzX(-^V;lc&kQ zvewa4zq=`Q4K9cSTRy%m`q7q2joA>@JIImsJtK*;3G$aKwj^X1V4ghEQ^Uz=VcYpo zL#f-ie`HRkbAE6B2<+21*QGs$9k1sJCcU#5APH7N+ z$C6koD|duS1&}@^W?b@DSbG`uqpzbV`jkNhcTU0^W4?Ci9L_j=?Nap)uDhh}Q{=Tp z^F-nI;zHSnyl!iriXm{^gSUAiV>G!xXAnJ3lkZp9=90dZd6STDEt;iKeF1K;C!3!m zYxYLg6`-#RFBTR2`KQk?<(rCMg%ai`-r$_!ho<_@u1nOgjy16^7E4o`x>-C%nYXSC z9jezm3!$L++0`&wKQ&StMnM*Bp-3EKnMT!VYJYr}J>(||*oe4Pr)m8%s)SgI zz+Dw5@(Lwj>#Nh+%`@Q4!Rga|buO^T9@|!p&$`Z>f7>+S{5|7d?Qro)YeK$1y|uEdL9F7rs+=#AGNjEWcCy{#-U@5Md~nv|v%mw-17)T3hD+SGnmpdv|HO%Q%(oqQtWQb%a9 zbm#2gyDy9y>{i0}J2ZsxmF;P|%cjV}>`C43nSYd`CZh@6YTtI;uVztyelM0LknY6& zOz9R6MoLj?P6&INL8E&!hmv&XW%U~nVDx2*v?JPYWFDqm<7u0AT$eGkzn3Fc*p{F% z9h#+5J`nuH%q)%m>)5<5Eb+$31vHLb5rlI#Ayx}vujCaC+!rTf^oO8*=LO304U^78 zkxxUOha6Rz9MJ?_K<(Kfln!OIBXodA>QNjnL6-{Rm-Kb7{ylYmtccs8Vyxz=E{>&I z#j5Hqi!aI0SSBijZrOkdg;i# zCQang7Yw7xcbPLh<3Y`fhtuXw%C$4bMw42lcXoCQK=HG)Cz@6D;tWQRI`k*$h`UtWWKkNYQ zvFunj_Y;t^KzBb+qyq6~i_6eI9`^|P2& zFPPYU!%C!U+@e1mGfrlKtp#2rXtuOzeA%m!mo#}s(B!mds}O<}egc)1q}3J?b!zft zVI~-qIZ}egD)2E)^rcPNy2T?TX_NB1_UE%3B^uj5ss2gXKG(?BFRC}UuXw^?yzzcO zEJN2S+HSx5K%!ZJ+*CDQtfH=heLJUf#A~iyDsC}F8fbD?g+rd0d@W2gG#~M!aR(G; zrp?o36?vpXGH)}wsYF9SR*e?9!g5E9)@U~m+r#4&*+#B3J*Yh~*&%)T^Mr_T%jq@a7uG@bgZ|pO_51aQl+Ulo<5=xKYp>56oN{JW z+bxY9sZH2G`NXhA)xA*L*t`WzQ%)J_^9JAAqcz3}x_s=aaYEZU`Qtan30d>TPleIA zT?%|@thDI&Nn&3^Z4Xm^B==T!;gqb@c=BD^%=u-pqFR6X$A+7Y(xQ3V;`gv!IPL&h z@KnC;BQ7v&1G4bcpk`j5^y_Pv^xHwC9HKMHLd=dWz8g-wB9vs-H8|C=;KGad`8f20 zuJKKMSJ5+E|1egsD;k`x>GR!z>!O*|geMKGt@5|KCbQSh>@7uE_E3Jrq^{m!YIkFr z-nLunQP`~U>5C7&F(w6;-9~(TDfvEJ8)*#$tG3ZSjN?ld5prbz?E`U2*`N)VoFi?qMgZXeV*9;c+{?|+jn98ECi+DpJ^#~P+bK(p#VqA9n20JcWX z)9CA&@*Hu?moRm}aWvKaDOPaH7;*Y>P(#v=Dp$ewqaJ2-f&_fJ*mXE=$8B>}E10fA z$dG+!#G(U&nzI)}F6kQZ`4LT+=fM~F$;;>M!!!|Mp=@w-srN!`3;`ER&nOycUqj>eDWXeJRne4Jku2*7QoK=!?Gj9%K~2w5 zg;3+N_7Zflf*mot9p99zTHZ~h(Qn$w6F-8Tb4iQG?HWlAz`jINZ1cGaA+XMPW3~sr zDnff$<`xN(z|MEg1F(Zs96?{(&%KR(dV|Wkq5N5Q!d^0DjP1EWEkwVnbUuSh4h5wR z1h^-sp->n(Sl|CIpH_$-2tuM#Q}Shl^5_%BZKw0qH@lqLiXVZ5?$w2Te6P66ssCykWjF7Lt$XyIGo@bU1w3=x6 zfzsjg+9fc5Y_@Vh%ASsl;93|u1p}2Z55sz@Jb@yV9wsCkJ~_2T;%@K{*Q;9`!ClfV zrg5Js@Iv&^Ic_f&Ebv{ACw4I_WC*Zx7wY4qym>Xmp+lHWgN-rchW zGOYu$t5Sa&HLKK@prYgL8yi$EaQWy{L1ut#EK>*Z_~xp}5WN~|OD)|Jza>#?GVXa^ YzL!slE|9ix{Hq)$ literal 0 HcmV?d00001 diff --git a/data/recording/test_separator.rec b/data/recording/test_separator.rec new file mode 100644 index 0000000000000000000000000000000000000000..411d398243b008c1f45df9c32044521fd13a1089 GIT binary patch literal 1383 zcmZY64@?_X7y$4C6dbPBQU=?~=72GDbE^nCMP}WQ5d%0yCNA6B)pCVe+OqaauREc0 ziTp{n!7x&@p%5^WIHrb-0MZl4fYuR4G7}p9N{!fAQ4U<|OQX%-2#b%S}q;=vfSyh^Z_z#?fD2KF{s7|oi&vcR6Ang8qu zU{CnXzXt>Q2+oI@-g5$kC&1|S{C7J8wpI^j|DB*#a1qSU(*9!=4BibAO|u@bnhkj^ zV2xl=w7mDgI>6X8I}2voP!GOiumx<>e|aLIs0c+cm0E(K0<;vBV*;5%twP~hiXsI< zOo-r!7QrMkRD}s;B?xWzL!nY4gaaxJDGe-(B@nEuCPlRZbqSJ-Vrr!vfk-Ztq5c`( zp9)h-U%`dT^hE!Vn|BJ?YlrT07>Q@o=ri&`=}9#RKM!)VW| zdT%0k&KdrBkg?nP+Ph=Jzl&9U>+N(UiO?9EBG5O1Ri@D{_P!nafXqwMi z`102KVqRmLcyWMzEN%V6@Uv&n5o)q5t+URUPSx(6Y$E4eI%A%E(IZj65@vBZqf9qv zQ`vV4Z*+@C1rHP>hq#WV1^eK>*S9@P&C@C2e$J&*szten&R9rTE&dyDA! zqZiNgRP=LV32q-Jkw~|0`IS<+`CpKQRx*~*x~VJVch;O*^0525iDJ9O3?j?w?7J3E z)byWBAa>%?0v8MC6u4q>o{1l2$Z7W?hW+hkCdF;nJZIolkP b)l9dtP6D{|CBHL zESZ8I81G^58|IhJ>vs{IeOcR=>-&2)@uSDHKGVNEfAhR1#E>#R7s^dv{$YBhYX0=# zV%5CbhDRp3!Y^mCJO}J}imbD{2`@+ zZ+GtZzWIrv*-071zuY?0?LCofIo&a}Pco*HR*>AQk1jB7Q~4w1ren9MgCpgm*M+X0 zp~*Nx(?7X~_|pdsztL6x)%3ZpUPs-bPc8Q3DQ}QBJ)(eVto+tVrQ-UM@*PR8xVt~b z-=EetV*_c?W+uz?u~p0R{8K;d^o?a29S`mb)G^De$G=|X+o}`4!EM#~3W|3{Bb)sf D#}k90 literal 0 HcmV?d00001 diff --git a/data/recording/test_slider.rec b/data/recording/test_slider.rec new file mode 100644 index 0000000000000000000000000000000000000000..06385dbdce5ae2d4fb5027e3543815e46b8cb154 GIT binary patch literal 8348 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 literal 0 HcmV?d00001 diff --git a/data/recording/test_spinner.rec b/data/recording/test_spinner.rec new file mode 100644 index 0000000000000000000000000000000000000000..74b2c0c51451dcbbed49535ef266ed9ce9c2a106 GIT binary patch literal 6602 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 literal 0 HcmV?d00001 diff --git a/data/recording/test_table.rec b/data/recording/test_table.rec new file mode 100644 index 0000000000000000000000000000000000000000..2b8c51c8cb80afa248fb9e1f790cad1a11d3c976 GIT binary patch literal 1520 zcmZY74NMbf7y#g-wiH^SBELgq5$V`qv8Zzp0cH3X#*cF(HY!}{=qX)o4``v+6&SK0 zIB;Yv!bFArxUfHLcDOLcp>|s`2q9!6Sla1Pw_%5r^)|LLp@zK$mYl4~_5Hr*``-6^ zziXo%q6`ENM zF!k1FTN6yzfeBdq9)Jaa30W2b7O}?W!M1`0u=dr1C4z;pj1RUSjL)(Uz_P&nSmw>m z1LJzly9N*R!I45__bi6#F)(&L@7)T)mg_a3ir)T}n3)U5W2m#;ZcCs$!IZ7~kKJSr-~ zFwM&R|F`sJXG70g? zs4+9>=>9`P$A1{U`m`{nv7z9#>5tmbifOD3{XO0jeA`6?I{$jFQvXMB;Z5^BeRM@~ zXHV(28>1Dzd0YGPJLT6S&TfABp#OCcarMnfi0V!n~5J(Hly?)SPfsUaERz`)p*c z#u9+u`h2#!7FrEzOIoL0Jk%j$&JLmJ%#RAmdin^nLm?5+ zK@6#o_@d#2feh!n5{X|FrW_`l?A=7=G6IEU3vqz7_@I1Zr@|zp-ms6f3}~3Z8flF2 zd-G2sI?6f|N*PFf1`{?&KVv=-YwY5=;;b{ll$g{XWLlFZRD4smdx3}7Ij@9L0&7Yf zkrSLR@kcoh6`6$4dzg(17iHfZV+`k->YW8#T;dKTlel!WGeLnzPz4jxL0W9idS_tR zKKtE`4EMDf%h{?rXF({HYVG$$6JU3n56*|6-vL^1%9E*{n?-Ls)3~M}*ly&aArN+&RfsFxdI^!#K5B602+)hp zG#^QmckGYWIn#I&F6xN27@s0CN$CdaIjeCS@dP=a0dLYJCSJI_cZg0fZ;CUTc%!jK z{Fcz}$#lP2D~&ad)h6w8)3ws(xj3saju4acD06?1<};q;*INdfYkSk(d(KGfVRdnR zhsbf5oIk*{4$@MF@~-3G%%u-2T>bV7L$rvAfAF`(^RPK}`e7?^el(@q6F1qm{O3~h LTq6G7#@qh_Idi)- literal 0 HcmV?d00001 diff --git a/data/recording/test_table2.rec b/data/recording/test_table2.rec new file mode 100644 index 0000000000000000000000000000000000000000..472a94925989699efceae9c36eac069ba12c05a4 GIT binary patch literal 1955 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 LmC-m|Yd!t};LEj< literal 0 HcmV?d00001 diff --git a/data/recording/test_table4.rec b/data/recording/test_table4.rec new file mode 100644 index 0000000000000000000000000000000000000000..4bfcd8f69e7f46e1537f41a5ec93731084fe3775 GIT binary patch literal 1726 zcmaLV4NMbP902g6U{Oc`hl&Jr$^cQYgs(M>IVNMc51a#{ECQ`9oTaPn0oOt+I<=ro z5jMkD6ot(1$+i;`*DP(NSP8NZR8ZRbQD8!vKp91(HGr`HVNDK}?2^0p-tWEtd;j;| ztu=clAPC|FuOEUq*TNfuARiq-5ZZ@eba=_WmC#Ota`l|!f%*^_8_FdVlYwP}(I_T| zCc4N@g7LxJDC35~^1<9GwgL=tSzvasGB5^Z9JFcGU@Iu*3U(FDm15_?2(YCTBV(0d zE~Jrt@G`(uP*V311WgSXbv|-$x5*estTWWp!2X2Ni?YTH*b^`xioyJ}iACcs!1bh_j&V^vqoZ(+_ zt^iy1X1;80b}ouYaH&9oa?nClEa8YSDUQOo5Jhsh5-uV`7u+|?}JKVVg=zx=#4)Wtt^M8|R7bw8Y$sbH%n>V%mg9l}y{2fg5=TL`I>)o?^M7 z6_zRmM&V&)kZm`^^ealNHC3YF9vGoz=iP7giP!xxx8=u<13PpZC+fb@B=j}@{`t!n zXAZ4^HJj{(9q~CB{BPj97?A~9*FkLpNTnWYG zofaSTpjUAe9n-g@cTKIc{i7?t{=rwaTR(a7u-^VP-)drIDAdQC)TzC$%`8u%baJa@ zvo>@uM3q|;$gT)=KyMkUTH8l#Yd3kz;?<*dlTEFiQGXRhPtU~fvc${T@DFmvHY8T> G?D`ihlO{I+ literal 0 HcmV?d00001 diff --git a/data/recording/test_table5.rec b/data/recording/test_table5.rec new file mode 100644 index 0000000000000000000000000000000000000000..66fc4a90ddef6b88bbc41969b7ca9cd28c8bf411 GIT binary patch literal 2874 zcmaKs3se(l7Jvs()DlXqXt1nMwNMo_$D*bb5L^n@qV4)Xd`=qUh>^!A0Wx8DxIAnZ zR9xjD^6H9GTaaL^MPx<^N@GF8Q7Qq!kSve14KSoJ88LzEAIqMTy65biGyi|@cmI3; zd*{yoduUw#3PF$^c-UL0+=Ist+x3<4+pcGW%>c~5MVHvXWB3f zFdks`HcSLm^B2Vj27W)Cx9 zeSk4-7>IALe{EeA=z%rH0-JSz18gB+^K95#fcXMu+m8c)eGHgw&Ygf+`{roldk(P8 zfZ2X4DPUg!X1g!wg+nr6wmE};#o-iSbN(BT$K@SHphQ6uKM~;|$w+)6Ck{;#AYe>J zpo82*E`&iMD3KqB2okw*Mf zBHfyG{D7SJ*#(lQFt=lN%%ja$s+O&J9OC7BcfIe~f5hxRp6Oc^Qaktikb<{2e0TAO zuXi`<)-ZZ92Xyx3e|T+-W@dds?x7XXm9x!Qi?Q2*#d zpZ#h+JYL(umTUA6mzP_f`{@Q$b+SjFm_NLt)d~D{yc1$=4bOa-zBxc=>UhbDf!fpk z?IRPU{MgQp4;y$R)WU!ckz7!rFVh5S{DC;{xzQWD1`}mtx|cIpe+hoGbwX~|;o+%e z{j2498JgrtLQs~kJM%)gq2Nea#KAyq)Igee72QHTS*kUefM^LK5W%xJh!a2B;I?b6?J5rv>+-m%+ zId26nQy2Q+GF9YkJWsXg1arIb&6b)SMx(T5n{kCY(g}}Hjb=tI9a)*v-~eBhG|Yra zNyA(vpNlReH0rg>@Xw_&uEw3sy%1Fe4ExTqIVIDVmkygYs(hkP==KpL~v*rvMi z20jjy;!qTv+dGcV1Cc1oJEBTx{Yal8r3z%CTyDxoCpRE4HTvq&!5;HpZ(rzvb^y!yI zR#(<-@}ssJTX5YWKHx+e05 zBkRh@v$mJr&hT%knxzJ7~l|2cNf z#Q7l)1-%(bA0#Y;S2Kl7MdjrZA$uUEJ*ZC8^riOts&9&AhKN?V01j5J`B7hl`!L`} z3A=nUos0StCO6h{d_z||OIuf2DaAJRl>YSchD2t#da5{y-W%BbvaX(af_|5twG4Mz z4R15v^tiRV2S0CeC?Gf93=ZiTNHMNMsMTXGhZTmpr=DMrJXB9Xh&Wr9Cy`AqvO~~S zR@Xk(ydB2jYp}8o5B~R5)!PVar`3<%qUoHI!a}mOmg9p*+^hio_p3k^r-a4Um8HS8 zUrgTG&-Sc}dNMXT_3#LS&R2kBYf3ytBVl5!sbbyk4(-Gyk#iKW|MT867xemIM|=d3A+mlbamT>U#DgRnDse%i2OzzZdjv%7*Q^a&UOH zCyPH=h3%m>b?H;m<=UXz)y(ffm|LF6FT)MbKlP;#EhIkRq7_o7y<;oc*jz4}CC%G2 zR_IP7aM4m}O?@B!Ox2oAuE>hwHwwE|k#lev1HLh&JQg~6J-pl0t$G6P2#5Qod#d>d zpN>Ac@Y25pUPL4q1-|rWZp3kYS#b*-R^4D2%yliV)R!q5J$yTRQxZb0**V;;@w=C` zvdu&P>(2I|9~EYzb{&HHDVmU;(bd6E+sw-%*!_KS^Zf*BDHc%TIR{^Rdn!1e^+ls_ zhSGf>r}*+-bV$Q?TuCc)gvTeha4Cp5Vsu|g8>InlQ`PmfBjM7Gx*ClyURna5el?`5 z8DEdw+1lM}N4;k{RfO+Vr~R0^y}Q?*a@U9+S@Vf^Z8+uh?pguPuH}=^i7G z)7|StxzYo>$433I8!gJcj$&m36_=$@5e3HY7;xT@GCfP-J+f#GHnkxcr`!m8E_Fug zBk2o>wfBzLGla8C$d#Tij04&TzMA1e&yTtsvdMGf>kp={8cB1aX6pr9ia~@vD9#~08K&jm<&YePDeOo#$x%ms zkP&H2_N#O?%3FFJspm<*Zx-kCOjz1q{*^jurWd-P2jK(-=lr0-B3LgL_lqnY?yady zKBo=hGdfbjE-<;|kl|RUTfYxJak8P1+-KBela*@c;g_2cR;f;0PtOYsHVN8bZxhl6 qI}RM^jyw&^y;9ygQLBje1VQ0?~L>i+|OGsdU@ literal 0 HcmV?d00001 diff --git a/data/recording/test_table6.rec b/data/recording/test_table6.rec new file mode 100644 index 0000000000000000000000000000000000000000..535a9c502deb3901bc7554b4ed11efba9264d558 GIT binary patch literal 3375 zcmZve4OA0X7JyR~EGoo*5Cp0g-AZW$K}7yqt9U$AT(y8;O-N#(h$KRQ3=9xgDuM{s zT1AS6{%p5a)EJeflosajBtD?nY23)7}Tn8GLr%B4Eb==`lI=1NvjY=s-F-FbFU< zVAC8}J}^12vEzWH0XEB_-&4S{0GsW=76MlI8nXa)6fjqZe!!mgC1493*i67K05;Qs zeG8Zvus0o;eXJC)8Fps(fzK7NCLkT>;Rj3}S*t>u^?gtC7O@KMpd>=6TzBxO@I|bNB zfH|&J3t%aLIo1dEVtO86j!}W^(Kj>=8dFJDrK%^7tgOqNE;RrtzmDzpUU@HcWubRRkpob*)HT^IIU)`;@PU5|`l$qwDc7LJbj zqOXDlb$yS0Ea=}+i{3O*7(MX3{o>wO;mK3{9dU7S`J8yx_Q7=ma^lL<4#R^Mt0nGE zUre^M(78=bt(+;62J>NDW4k?FRU15x+}GWf>3*B8dq<|zIMJY%*>v)-JMv1!KNsx# z%tHPJzwynps(JXCj?5@JZ}4v7ikd9E8HyPcjA?W~DDyp39pg7M<-d<>vwEt8PizJH zZHL_}kcWCG`(O1-wU<2=wIRXp`Di;k`?|W8*ha3|CQ3r1c+N-zxj}(1g&vc?$Z}Aqs$Ol5 zN`VYjXkBxxuP@_fEx)u-@CMyj`NIw4WR%VpT9mBs=RpB1UY)k#7)oum1|sVu7N#u2 z9k#mC0?bjy;dBY5*?bqLpw%ALIrIV8f*tUC5%vM`|53Q1`SJAE&r|0ZZN$sLmDdGTU zUh(6%_0=&_ld$pwvY#jpu8f%`$pIa1t$~(ZCpHqHmkeH1~EEY$Z;&_TB~};IOpB=A^{W6SOk)2zgQ4 zeGGLXx$J0}MCy$%Q_|1bj<1yJSKxPwOW8dCA+a~SXT8vX^>&PADDjvsMg{8s^Te@H zl|(SxREO14#dcj<1)9X$<3m_|$^@V2?*Q5!8EE{|e1O>;aVA^8S5^3LtRl!a%zTAS z&mu0T+8Y*qYoo1r_wDh|v#mw3G*R{*>b?4HjhBah3;Dip@bscf)jPQ+Uv!;Bijj|Y zaZSPK4Xo)Axj~Nal<7ZeJTLr4eLA~IR7)4M8wwYrJ`%xY?Z`j+x~R`5lZ5StF{q$% zdj=X`3RW(`YrwcU$^3=x#h|Fg-{aYssnj<-^5(%WO`Ts1J$d#cawV(a$hWHN`lXRK z!Ts~{F)>!t`!xwgoooXvWooS%yo#T zL{P8wi?ICUX>w{{(YVl76>2C=TxI4;2dg727hR2K*(XdVw~1hZ2fmhNjFV-U`sxFb zJQeC46a7|zInUE}x++y_UG==MJx+ywcGp+GKd-578Ol|mXxr%3$WE>$EhV}^%@_Bq zACQV48YVnnj73_0jvny-7 zZ*-A`FE>{uTfdtD9>wqs{Kc+^dsS=bv|gncf)1loz=Auv z@z|4C#vy5?scAunZanu#EIhSCRh>WV9Xb}aNCejfA!jkT{mG;v(&AZJyuT8IACdD# zaA#?vzd3G+J@a+@0*clmD?~734dN`ZAli`p;i89RvK*gXss@wTCd*g=r^_-deehlK z9?R$_)02JH@3pzdP=*)1dI;ya8c(o{mYAac73N=D#cIBhTB=@Up4bQ3M6ht(^UUG3 z$wp3w?S~evvp+XOO4F)U7Z$&WLR+w=FgS$zV2%Zc^ ze#WfTcc~ZV!Qv(KjfAb2+^?Y5Y5f$qaE>^Ru&K$X3S3{Re#<PL5p1nj(VCBUBcPSGyIa|FeClVXIl5P*}IhpLhPY%b{F2;?(V>zVFtw4`zI@w^*Oid@pF0>L~aDt-tLpE@&$n0qGNR%_r z&2$nApTS#)Y?N5uM3Oq#RcPU0pv00T^Uo#DtH3 A0RR91 literal 0 HcmV?d00001 diff --git a/data/recording/test_toggle.rec b/data/recording/test_toggle.rec new file mode 100644 index 0000000000000000000000000000000000000000..578b611d2eb33a385b02ed7a6a600807939dca8f GIT binary patch literal 10436 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 kp1uQw@{_;yglr|!V-)511W9uK)l5 literal 0 HcmV?d00001 diff --git a/data/recording/test_toolbar.rec b/data/recording/test_toolbar.rec new file mode 100644 index 0000000000000000000000000000000000000000..de28714bbeffbd0d9670e366f7e91b349cf754c8 GIT binary patch literal 4180 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 HV~76-5~+>T literal 0 HcmV?d00001 diff --git a/data/recording/test_toolbar2.rec b/data/recording/test_toolbar2.rec new file mode 100644 index 0000000000000000000000000000000000000000..ce9274b270c99d13a51576748e59f4cb9102780b GIT binary patch literal 3727 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 IXL0$z0i+u+X#fBK literal 0 HcmV?d00001 diff --git a/data/recording/test_toolbar5.rec b/data/recording/test_toolbar5.rec new file mode 100644 index 0000000000000000000000000000000000000000..23f58d6eb81317b6cdaaf3c22672a6ff1b5bbda3 GIT binary patch literal 6374 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�4U$%9Q_Xj%A^x~553d)Uwl=(fKMp?&} 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 +#include "tsuite.h" + +typedef struct _Point +{ + Evas_Coord x, y, z, u, v; +} Point; + +typedef struct _Side +{ + Evas_Object *o; + Point pt[4]; +} Side; + +typedef struct _Cube +{ + Side side[6]; +} Cube; + +static Cube *cube; +static double rotx = 0.0, roty = 0.0, rotz = 0.0; +static double cxo = 0.0, cyo = 0.0, focv = 256.0, z0v = 0.0; +#define POINT(n, p, xx, yy, zz, uu, vv) \ + c->side[n].pt[p].x = xx; \ + c->side[n].pt[p].y = yy; \ + c->side[n].pt[p].z = zz; \ + c->side[n].pt[p].u = uu; \ + c->side[n].pt[p].v = vv + +static Cube * +_cube_new(Evas *evas, Evas_Coord w, Evas_Coord h, Evas_Coord d) +{ + Cube *c; + int i; + + w -= (w / 2); + h -= (h / 2); + d -= (d / 2); + c = calloc(1, sizeof(Cube)); + for (i = 0; i < 6; i++) + { + Evas_Object *o; + char buf[PATH_MAX]; + o = evas_object_image_add(evas); + c->side[i].o = o; + snprintf(buf, sizeof(buf), "%s/images/%s", + elm_app_data_dir_get(), "twofish.jpg"); + evas_object_image_file_set(o, buf, NULL); + evas_object_image_fill_set(o, 0, 0, 256, 256); + evas_object_resize(o, 256, 256); + evas_object_image_smooth_scale_set(o, 0); + evas_object_show(o); + } + POINT(0, 0, -w, -h, -d, 0, 0); + POINT(0, 1, w, -h, -d, 256, 0); + POINT(0, 2, w, h, -d, 256, 256); + POINT(0, 3, -w, h, -d, 0, 256); + + POINT(1, 0, w, -h, -d, 0, 0); + POINT(1, 1, w, -h, d, 256, 0); + POINT(1, 2, w, h, d, 256, 256); + POINT(1, 3, w, h, -d, 0, 256); + + POINT(2, 0, w, -h, d, 0, 0); + POINT(2, 1, -w, -h, d, 256, 0); + POINT(2, 2, -w, h, d, 256, 256); + POINT(2, 3, w, h, d, 0, 256); + + POINT(3, 0, -w, -h, d, 0, 0); + POINT(3, 1, -w, -h, -d, 256, 0); + POINT(3, 2, -w, h, -d, 256, 256); + POINT(3, 3, -w, h, d, 0, 256); + + POINT(4, 0, -w, -h, d, 0, 0); + POINT(4, 1, w, -h, d, 256, 0); + POINT(4, 2, w, -h, -d, 256, 256); + POINT(4, 3, -w, -h, -d, 0, 256); + + POINT(5, 0, -w, h, -d, 0, 0); + POINT(5, 1, w, h, -d, 256, 0); + POINT(5, 2, w, h, d, 256, 256); + POINT(5, 3, -w, h, d, 0, 256); + + return c; +} + +static void +_cube_pos(Cube *c, + Evas_Coord x, Evas_Coord y, Evas_Coord z, + double dx, double dy, double dz, + Evas_Coord cx, Evas_Coord cy, Evas_Coord foc, Evas_Coord z0) +{ + Evas_Map *m; + int i, j, order[6], sorted; + Evas_Coord mz[6]; + + m = evas_map_new(4); + evas_map_smooth_set(m, 0); + + for (i = 0; i < 6; i++) + { + Evas_Coord tz[4]; + + for (j = 0; j < 4; j++) + { + evas_map_point_coord_set(m, j, + c->side[i].pt[j].x + x, + c->side[i].pt[j].y + y, + c->side[i].pt[j].z + z); + evas_map_point_image_uv_set(m, j, + c->side[i].pt[j].u, + c->side[i].pt[j].v); + evas_map_point_color_set(m, j, 255, 255, 255, 255); + } + evas_map_util_3d_rotate(m, dx, dy, dz, x, y, z); + evas_map_util_3d_lighting(m, -1000, -1000, -1000, + 255, 255, 255, + 20, 20, 20); + evas_map_util_3d_perspective(m, cx, cy, foc, z0); + if (evas_map_util_clockwise_get(m)) + { + evas_object_map_enable_set(c->side[i].o, 1); + evas_object_map_set(c->side[i].o, m); + evas_object_show(c->side[i].o); + } + else + evas_object_hide(c->side[i].o); + + order[i] = i; + for (j = 0; j < 4; j++) + evas_map_point_coord_get(m, j, NULL, NULL, &(tz[j])); + mz[i] = (tz[0] + tz[1] + tz[2] + tz[3]) / 4; + } + sorted = 0; + do + { + sorted = 1; + for (i = 0; i < 5; i++) + { + if (mz[order[i]] > mz[order[i + 1]]) + { + j = order[i]; + order[i] = order[i + 1]; + order[i + 1] = j; + sorted = 0; + } + } + } + while (!sorted); + + evas_object_raise(c->side[order[0]].o); + for (i = 1; i < 6; i++) + evas_object_stack_below(c->side[order[i]].o, c->side[order[i - 1]].o); + evas_map_free(m); +} + +/* +static void +_cube_free(Cube *c) +{ + int i; + + for (i = 0; i < 6; i++) evas_object_del(c->side[i].o); + free(c); +} +*/ + +static void +_cube_update(Evas_Object *win, Cube *c) +{ + Evas_Coord w, h; + + evas_object_geometry_get(win, NULL, NULL, &w, &h); + _cube_pos(c, + (w / 2), (h / 2), 512, + rotx, roty, rotz, + (w / 2) + cxo, (h / 2) + cyo, z0v, focv); +} + +void +_ch_rot_x(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + rotx = elm_slider_value_get(obj); + _cube_update(win, cube); +} + +void +_ch_rot_y(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + roty = elm_slider_value_get(obj); + _cube_update(win, cube); +} + +void +_ch_rot_z(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + rotz = elm_slider_value_get(obj); + _cube_update(win, cube); +} + +void +_ch_cx(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + cxo = elm_slider_value_get(obj); + _cube_update(win, cube); +} + +void +_ch_cy(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + cyo = elm_slider_value_get(obj); + _cube_update(win, cube); +} + +void +_ch_foc(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + focv = elm_slider_value_get(obj); + _cube_update(win, cube); +} + +void +_ch_z0(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + z0v = elm_slider_value_get(obj); + _cube_update(win, cube); +} + +TEST_START(test_3d) +{ + Evas_Object *bg, *bx, *sl; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + cube = _cube_new(evas_object_evas_get(win), 240, 240, 240); + + bx = elm_box_add(win); + evas_object_layer_set(bx, 10); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "Rot X"); + elm_slider_unit_format_set(sl, "%1.0f units"); + elm_slider_span_size_set(sl, 360); + elm_slider_min_max_set(sl, 0, 360); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sl); + evas_object_smart_callback_add(sl, "changed", _ch_rot_x, win); + evas_object_show(sl); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "Rot Y"); + elm_slider_unit_format_set(sl, "%1.0f units"); + elm_slider_span_size_set(sl, 360); + elm_slider_min_max_set(sl, 0, 360); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sl); + evas_object_smart_callback_add(sl, "changed", _ch_rot_y, win); + evas_object_show(sl); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "Rot Z"); + elm_slider_unit_format_set(sl, "%1.0f units"); + elm_slider_span_size_set(sl, 360); + elm_slider_min_max_set(sl, 0, 360); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sl); + evas_object_smart_callback_add(sl, "changed", _ch_rot_z, win); + evas_object_show(sl); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "CX Off"); + elm_slider_unit_format_set(sl, "%1.0f units"); + elm_slider_span_size_set(sl, 360); + elm_slider_min_max_set(sl, -320, 320); + elm_slider_value_set(sl, cxo); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sl); + evas_object_smart_callback_add(sl, "changed", _ch_cx, win); + evas_object_show(sl); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "CY Off"); + elm_slider_unit_format_set(sl, "%1.0f units"); + elm_slider_span_size_set(sl, 360); + elm_slider_min_max_set(sl, -320, 320); + elm_slider_value_set(sl, cyo); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sl); + evas_object_smart_callback_add(sl, "changed", _ch_cy, win); + evas_object_show(sl); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "Foc"); + elm_slider_unit_format_set(sl, "%1.0f units"); + elm_slider_span_size_set(sl, 360); + elm_slider_min_max_set(sl, 1, 2000); + elm_slider_value_set(sl, focv); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sl); + evas_object_smart_callback_add(sl, "changed", _ch_foc, win); + evas_object_show(sl); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "Z0"); + elm_slider_unit_format_set(sl, "%1.0f units"); + elm_slider_span_size_set(sl, 360); + elm_slider_min_max_set(sl, -2000, 2000); + elm_slider_value_set(sl, z0v); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sl); + evas_object_smart_callback_add(sl, "changed", _ch_z0, win); + evas_object_show(sl); + + evas_object_resize(win, 480, 480); + _cube_update(win, cube); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_actionslider.c b/src/bin/test_actionslider.c new file mode 100644 index 0000000..15454e5 --- /dev/null +++ b/src/bin/test_actionslider.c @@ -0,0 +1,175 @@ +#include +#include "tsuite.h" + +static void _pos_selected_cb(void *data __UNUSED__, Evas_Object *obj, void *event_info) +{ + printf("Selection: %s\n", (char *)event_info); + printf("Label selected: %s\n", elm_actionslider_selected_label_get(obj)); +} + +static void +_position_change_magnetic_cb(void *data __UNUSED__, Evas_Object * obj, void *event_info) +{ + if (!strcmp((char *)event_info, "left")) + elm_actionslider_magnet_pos_set(obj, ELM_ACTIONSLIDER_LEFT); + else if (!strcmp((char *)event_info, "right")) + elm_actionslider_magnet_pos_set(obj, ELM_ACTIONSLIDER_RIGHT); +} + +static void +_magnet_enable_disable_cb(void *data __UNUSED__, Evas_Object *obj, void *event_info) +{ + if (!strcmp((char *)event_info, "left")) + elm_actionslider_magnet_pos_set(obj, ELM_ACTIONSLIDER_CENTER); + else if (!strcmp((char *)event_info, "right")) + elm_actionslider_magnet_pos_set(obj, ELM_ACTIONSLIDER_NONE); +} + +enum _api_state +{ + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + switch(api->state) + { /* Put all api-changes under switch */ + case API_STATE_LAST: + break; + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + a->state++; + set_api_state(a); + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(a->bt, str); + elm_object_disabled_set(a->bt, a->state == API_STATE_LAST); +} + +TEST_START(test_actionslider) +{ + Evas_Object *bg, *bx, *as; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, 0); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + api->bt = elm_button_add(win); + elm_object_text_set(api->bt, "Next API function"); + evas_object_smart_callback_add(api->bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bx, api->bt); + elm_object_disabled_set(api->bt, api->state == API_STATE_LAST); + evas_object_show(api->bt); + + as = elm_actionslider_add(win); + evas_object_size_hint_weight_set(as, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(as, EVAS_HINT_FILL, 0); + elm_actionslider_indicator_pos_set(as, ELM_ACTIONSLIDER_RIGHT); + elm_actionslider_magnet_pos_set(as, ELM_ACTIONSLIDER_RIGHT); + elm_object_part_text_set(as, "left", "Snooze"); + elm_object_part_text_set(as, "center", NULL); + elm_object_part_text_set(as, "right", "Stop"); + elm_actionslider_enabled_pos_set(as, ELM_ACTIONSLIDER_LEFT | + ELM_ACTIONSLIDER_RIGHT); + evas_object_smart_callback_add(as, "pos_changed", + _position_change_magnetic_cb, NULL); + evas_object_smart_callback_add(as, "selected", _pos_selected_cb, NULL); + evas_object_show(as); + elm_box_pack_end(bx, as); + + as = elm_actionslider_add(win); + evas_object_size_hint_weight_set(as, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(as, EVAS_HINT_FILL, 0); + elm_actionslider_indicator_pos_set(as, ELM_ACTIONSLIDER_CENTER); + elm_actionslider_magnet_pos_set(as, ELM_ACTIONSLIDER_CENTER); + elm_object_part_text_set(as, "left", "Snooze"); + elm_object_part_text_set(as, "center", NULL); + elm_object_part_text_set(as, "right", "Stop"); + elm_actionslider_enabled_pos_set(as, ELM_ACTIONSLIDER_LEFT | + ELM_ACTIONSLIDER_RIGHT); + evas_object_smart_callback_add(as, "selected", _pos_selected_cb, NULL); + evas_object_show(as); + elm_box_pack_end(bx, as); + + as = elm_actionslider_add(win); + elm_object_style_set(as, "bar"); + evas_object_size_hint_weight_set(as, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(as, EVAS_HINT_FILL, 0); + elm_actionslider_indicator_pos_set(as, ELM_ACTIONSLIDER_LEFT); + elm_actionslider_magnet_pos_set(as, ELM_ACTIONSLIDER_CENTER| + ELM_ACTIONSLIDER_RIGHT); + elm_actionslider_enabled_pos_set(as, ELM_ACTIONSLIDER_CENTER | + ELM_ACTIONSLIDER_RIGHT); + elm_object_part_text_set(as, "left", NULL); + elm_object_part_text_set(as, "center", "Accept"); + elm_object_part_text_set(as, "right", "Reject"); + evas_object_smart_callback_add(as, "selected", _pos_selected_cb, NULL); + evas_object_show(as); + elm_box_pack_end(bx, as); + + as = elm_actionslider_add(win); + elm_object_style_set(as, "bar"); + evas_object_size_hint_weight_set(as, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(as, EVAS_HINT_FILL, 0); + elm_actionslider_indicator_pos_set(as, ELM_ACTIONSLIDER_LEFT); + elm_actionslider_magnet_pos_set(as, ELM_ACTIONSLIDER_LEFT); + elm_object_part_text_set(as, "left", NULL); + elm_object_part_text_set(as, "center", "Accept"); + elm_object_part_text_set(as, "right", "Reject"); + elm_object_text_set(as, "Go"); + evas_object_smart_callback_add(as, "pos_changed", + _position_change_magnetic_cb, NULL); + evas_object_smart_callback_add(as, "selected", _pos_selected_cb, NULL); + evas_object_show(as); + elm_box_pack_end(bx, as); + + + as = elm_actionslider_add(win); + evas_object_size_hint_weight_set(as, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(as, EVAS_HINT_FILL, 0); + elm_actionslider_indicator_pos_set(as, ELM_ACTIONSLIDER_LEFT); + elm_actionslider_magnet_pos_set(as, ELM_ACTIONSLIDER_ALL); + elm_object_part_text_set(as, "left", "Left"); + elm_object_part_text_set(as, "center", "Center"); + elm_object_part_text_set(as, "right", "Right"); + elm_object_text_set(as, "Go"); + evas_object_smart_callback_add(as, "selected", _pos_selected_cb, NULL); + evas_object_show(as); + elm_box_pack_end(bx, as); + + as = elm_actionslider_add(win); + evas_object_size_hint_weight_set(as, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(as, EVAS_HINT_FILL, 0); + elm_actionslider_indicator_pos_set(as, ELM_ACTIONSLIDER_CENTER); + elm_actionslider_magnet_pos_set(as, ELM_ACTIONSLIDER_CENTER); + elm_object_part_text_set(as, "left", "Enable"); + elm_object_part_text_set(as, "center", "Magnet"); + elm_object_part_text_set(as, "right", "Disable"); + evas_object_smart_callback_add(as, "pos_changed", + _magnet_enable_disable_cb, NULL); + evas_object_smart_callback_add(as, "selected", _pos_selected_cb, NULL); + evas_object_show(as); + elm_box_pack_end(bx, as); + + evas_object_resize(win, 320, 400); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_anchorblock.c b/src/bin/test_anchorblock.c new file mode 100644 index 0000000..ce21aeb --- /dev/null +++ b/src/bin/test_anchorblock.c @@ -0,0 +1,275 @@ +#include +#include "tsuite.h" + +static void +_print_clicked(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("bubble clicked\n"); +} + +static void +my_anchorblock_bt(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *av = data; + elm_anchorblock_hover_end(av); +} + +static void +my_anchorblock_anchor(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *av = data; + Elm_Entry_Anchorblock_Info *ei = event_info; + Evas_Object *bt, *bx; + + bt = elm_button_add(obj); + elm_object_text_set(bt, ei->name); + elm_hover_content_set(ei->hover, "middle", bt); + evas_object_show(bt); + + // hints as to where we probably should put hover contents (buttons etc.). + if (ei->hover_top) + { + bx = elm_box_add(obj); + bt = elm_button_add(obj); + elm_object_text_set(bt, "Top 1"); + elm_box_pack_end(bx, bt); + evas_object_smart_callback_add(bt, "clicked", my_anchorblock_bt, av); + evas_object_show(bt); + bt = elm_button_add(obj); + elm_object_text_set(bt, "Top 2"); + elm_box_pack_end(bx, bt); + evas_object_smart_callback_add(bt, "clicked", my_anchorblock_bt, av); + evas_object_show(bt); + bt = elm_button_add(obj); + elm_object_text_set(bt, "Top 3"); + elm_box_pack_end(bx, bt); + evas_object_smart_callback_add(bt, "clicked", my_anchorblock_bt, av); + evas_object_show(bt); + elm_hover_content_set(ei->hover, "top", bx); + evas_object_show(bx); + } + if (ei->hover_bottom) + { + bt = elm_button_add(obj); + elm_object_text_set(bt, "Bot"); + elm_hover_content_set(ei->hover, "bottom", bt); + evas_object_smart_callback_add(bt, "clicked", my_anchorblock_bt, av); + evas_object_show(bt); + } + if (ei->hover_left) + { + bt = elm_button_add(obj); + elm_object_text_set(bt, "Left"); + elm_hover_content_set(ei->hover, "left", bt); + evas_object_smart_callback_add(bt, "clicked", my_anchorblock_bt, av); + evas_object_show(bt); + } + if (ei->hover_right) + { + bt = elm_button_add(obj); + elm_object_text_set(bt, "Right"); + elm_hover_content_set(ei->hover, "right", bt); + evas_object_smart_callback_add(bt, "clicked", my_anchorblock_bt, av); + evas_object_show(bt); + } +} + +static void +my_anchorblock_edge_left(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("left\n"); +} + +static void +my_anchorblock_edge_right(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("right\n"); +} + +static void +my_anchorblock_edge_top(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("top\n"); +} + +static void +my_anchorblock_edge_bottom(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("bottom\n"); +} + +static void +my_anchorblock_scroll(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Coord x, y, w, h, vw, vh; + + elm_scroller_region_get(obj, &x, &y, &w, &h); + elm_scroller_child_size_get(obj, &vw, &vh); + printf("scroll %ix%i +%i+%i in %ix%i\n", w, h, x, y, vw, vh); +} + +enum _api_state +{ + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + switch(api->state) + { /* Put all api-changes under switch */ + case API_STATE_LAST: + break; + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + a->state++; + set_api_state(a); + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(a->bt, str); + elm_object_disabled_set(a->bt, a->state == API_STATE_LAST); +} + +TEST_START(test_anchorblock) +{ + Evas_Object *bg, *av, *sc, *bx, *bb, *ic; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + sc = elm_scroller_add(win); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, sc); + + evas_object_smart_callback_add(sc, "edge_left", my_anchorblock_edge_left, NULL); + evas_object_smart_callback_add(sc, "edge_right", my_anchorblock_edge_right, NULL); + evas_object_smart_callback_add(sc, "edge_top", my_anchorblock_edge_top, NULL); + evas_object_smart_callback_add(sc, "edge_bottom", my_anchorblock_edge_bottom, NULL); + evas_object_smart_callback_add(sc, "scroll", my_anchorblock_scroll, NULL); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + + api->bt = elm_button_add(win); + elm_object_text_set(api->bt, "Next API function"); + evas_object_smart_callback_add(api->bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bx, api->bt); + elm_object_disabled_set(api->bt, api->state == API_STATE_LAST); + evas_object_show(api->bt); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1); + + bb = elm_bubble_add(win); + elm_object_text_set(bb, "Message 3"); + elm_object_part_text_set(bb, "info", "10:32 4/11/2008"); + elm_bubble_icon_set(bb, ic); + evas_object_smart_callback_add(bb, "clicked", _print_clicked, NULL); + evas_object_show(ic); + evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL); + av = elm_anchorblock_add(win); + elm_anchorblock_hover_style_set(av, "popout"); + elm_anchorblock_hover_parent_set(av, win); + elm_object_text_set(av, + "Hi there. This is the most recent message in the " + "list of messages. It has one +61 432 1234 " + "(phone number) to click on."); + evas_object_smart_callback_add(av, "anchor,clicked", + my_anchorblock_anchor, av); + elm_object_content_set(bb, av); + evas_object_show(av); + elm_box_pack_end(bx, bb); + evas_object_show(bb); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + + bb = elm_bubble_add(win); + elm_object_text_set(bb, "Message 2"); + elm_object_part_text_set(bb, "info", "7:16 27/10/2008"); + elm_bubble_icon_set(bb, ic); + evas_object_smart_callback_add(bb, "clicked", _print_clicked, NULL); + evas_object_show(ic); + evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL); + av = elm_anchorblock_add(win); + elm_anchorblock_hover_style_set(av, "popout"); + elm_anchorblock_hover_parent_set(av, win); + elm_object_text_set(av, + "Hey what are you doing? This is the second last message " + "Hi there. This is the most recent message in the " + "list. It's a longer one so it can wrap more and " + "contains a John contact " + "link in it to test popups on links. The idea is that " + "all SMS's are scanned for things that look like phone " + "numbers or names that are in your contacts list, and " + "if they are, they become clickable links that pop up " + "a menus of obvious actions to perform on this piece " + "of information. This of course can be later explicitly " + "done by links maybe running local apps or even being " + "web URL's too that launch the web browser and point it " + "to that URL. "); + evas_object_smart_callback_add(av, "anchor,clicked", my_anchorblock_anchor, av); + elm_object_content_set(bb, av); + evas_object_show(av); + elm_box_pack_end(bx, bb); + evas_object_show(bb); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1); + + bb = elm_bubble_add(win); + elm_object_text_set(bb, "Message 1"); + elm_object_part_text_set(bb, "info", "20:47 18/6/2008"); + elm_bubble_icon_set(bb, ic); + evas_object_smart_callback_add(bb, "clicked", _print_clicked, NULL); + evas_object_show(ic); + evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + av = elm_anchorblock_add(win); + elm_anchorblock_hover_style_set(av, "popout"); + elm_anchorblock_hover_parent_set(av, win); + elm_object_text_set(av, "This is a short message. "); + evas_object_smart_callback_add(av, "anchor,clicked", + my_anchorblock_anchor, av); + elm_object_content_set(bb, av); + evas_object_show(av); + elm_box_pack_end(bx, bb); + evas_object_show(bb); + + elm_object_content_set(sc, bx); + evas_object_show(bx); + + evas_object_show(sc); + + evas_object_resize(win, 320, 520); + + elm_object_focus_set(win, EINA_TRUE); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_anchorview.c b/src/bin/test_anchorview.c new file mode 100644 index 0000000..4037574 --- /dev/null +++ b/src/bin/test_anchorview.c @@ -0,0 +1,148 @@ +#include +#include "tsuite.h" + +static void +my_anchorview_bt(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *av = data; + elm_anchorview_hover_end(av); +} + +static void +my_anchorview_anchor(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *av = data; + Elm_Entry_Anchorview_Info *ei = event_info; + Evas_Object *bt, *bx; + + bt = elm_button_add(obj); + elm_object_text_set(bt, ei->name); + elm_hover_content_set(ei->hover, "middle", bt); + evas_object_show(bt); + + // hints as to where we probably should put hover contents (buttons etc.). + if (ei->hover_top) + { + bx = elm_box_add(obj); + bt = elm_button_add(obj); + elm_object_text_set(bt, "Top 1"); + elm_box_pack_end(bx, bt); + evas_object_smart_callback_add(bt, "clicked", my_anchorview_bt, av); + evas_object_show(bt); + bt = elm_button_add(obj); + elm_object_text_set(bt, "Top 2"); + elm_box_pack_end(bx, bt); + evas_object_smart_callback_add(bt, "clicked", my_anchorview_bt, av); + evas_object_show(bt); + bt = elm_button_add(obj); + elm_object_text_set(bt, "Top 3"); + elm_box_pack_end(bx, bt); + evas_object_smart_callback_add(bt, "clicked", my_anchorview_bt, av); + evas_object_show(bt); + elm_hover_content_set(ei->hover, "top", bx); + evas_object_show(bx); + } + if (ei->hover_bottom) + { + bt = elm_button_add(obj); + elm_object_text_set(bt, "Bot"); + elm_hover_content_set(ei->hover, "bottom", bt); + evas_object_smart_callback_add(bt, "clicked", my_anchorview_bt, av); + evas_object_show(bt); + } + if (ei->hover_left) + { + bt = elm_button_add(obj); + elm_object_text_set(bt, "Left"); + elm_hover_content_set(ei->hover, "left", bt); + evas_object_smart_callback_add(bt, "clicked", my_anchorview_bt, av); + evas_object_show(bt); + } + if (ei->hover_right) + { + bt = elm_button_add(obj); + elm_object_text_set(bt, "Right"); + elm_hover_content_set(ei->hover, "right", bt); + evas_object_smart_callback_add(bt, "clicked", my_anchorview_bt, av); + evas_object_show(bt); + } +} + +enum _api_state +{ + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + switch(api->state) + { /* Put all api-changes under switch */ + case API_STATE_LAST: + break; + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + a->state++; + set_api_state(a); + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(a->bt, str); + elm_object_disabled_set(a->bt, a->state == API_STATE_LAST); +} + +TEST_START(test_anchorview) +{ + Evas_Object *bg, *bx, *av; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + elm_win_resize_object_add(win, bx); /* Resize BOX to size of window */ + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + + api->bt = elm_button_add(win); + elm_object_text_set(api->bt, "Next API function"); + evas_object_smart_callback_add(api->bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bx, api->bt); + elm_object_disabled_set(api->bt, api->state == API_STATE_LAST); + evas_object_show(api->bt); + + av = elm_anchorview_add(win); + elm_anchorview_hover_style_set(av, "popout"); + elm_anchorview_hover_parent_set(av, win); + elm_object_text_set(av, + "This is an entry widget in this window that
" + "uses markup like this for styling and
" + "formatting like this, as well as
" + "links in the text, so enter text
" + "in here to edit it. By the way, links are
" + "called Anchors so you will need
" + "to refer to them this way. "); + evas_object_size_hint_weight_set(av, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(av, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(av, "anchor,clicked", my_anchorview_anchor, av); + elm_box_pack_end(bx, av); + evas_object_show(av); + evas_object_show(bx); + + evas_object_resize(win, 320, 300); + + elm_object_focus_set(win, EINA_TRUE); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_bg.c b/src/bin/test_bg.c new file mode 100644 index 0000000..e26b618 --- /dev/null +++ b/src/bin/test_bg.c @@ -0,0 +1,194 @@ +#include +#include "tsuite.h" + +static void +_cb_radio_changed(void *data, Evas_Object *obj, void *event __UNUSED__) +{ + Evas_Object *o_bg = data; + + elm_bg_option_set(o_bg, elm_radio_value_get((Evas_Object *)obj)); +} + +static void +_cb_overlay_changed(void *data, Evas_Object *obj, void *event __UNUSED__) +{ + Evas_Object *o_bg = data; + + if (elm_check_state_get(obj)) + { + Evas_Object *parent, *over; + char buff[PATH_MAX]; + + snprintf(buff, sizeof(buff), "%s/objects/test.edj", elm_app_data_dir_get()); + parent = elm_object_parent_widget_get(o_bg); + over = edje_object_add(evas_object_evas_get(parent)); + edje_object_file_set(over, buff, "bg_overlay"); + elm_object_content_set(o_bg, over); + } + else + elm_object_content_set(o_bg, NULL); +} + +static void +_cb_color_changed(void *data, Evas_Object *obj, void *event __UNUSED__) +{ + Evas_Object *o_bg = data; + double val = 0.0; + + val = elm_spinner_value_get(obj); + if (val == 1.0) + elm_bg_color_set(o_bg, 255, 255, 255); + else if (val == 2.0) + elm_bg_color_set(o_bg, 255, 0, 0); + else if (val == 3.0) + elm_bg_color_set(o_bg, 0, 0, 255); + else if (val == 4.0) + elm_bg_color_set(o_bg, 0, 255, 0); +} + +TEST_START(test_bg_plain) +{ + Evas_Object *bg; + + bg = elm_bg_add(win); + /* allow bg to expand in x & y */ + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + /* set size hints. a minimum size for the bg. this should propagate back + * to the window thus limiting its size based off the bg as the bg is one + * of the window's resize objects. */ + evas_object_size_hint_min_set(bg, 160, 160); + /* and set a maximum size. not needed very often. normally used together + * with evas_object_size_hint_min_set() at the same size to make a + * window not resizable */ + evas_object_size_hint_max_set(bg, 640, 640); + /* and now just resize the window to a size you want. normally widgets + * will determine the initial size though */ + evas_object_resize(win, 320, 320); + /* and show the window */ + evas_object_show(win); +} +TEST_END + +TEST_START(test_bg_image) +{ + Evas_Object *bg; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_bg_file_set(bg, buf, NULL); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + evas_object_size_hint_min_set(bg, 160, 160); + evas_object_size_hint_max_set(bg, 640, 640); + evas_object_resize(win, 320, 320); + evas_object_show(win); +} +TEST_END + +TEST_START(test_bg_options) +{ + Evas_Object *bg; + Evas_Object *box, *hbox, *o_bg; + Evas_Object *rd, *rdg; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + o_bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_bg_file_set(o_bg, buf, NULL); + evas_object_size_hint_weight_set(o_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(o_bg, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, o_bg); + evas_object_show(o_bg); + + hbox = elm_box_add(win); + elm_box_horizontal_set(hbox, EINA_TRUE); + evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_size_hint_align_set(hbox, EVAS_HINT_FILL, EVAS_HINT_FILL); + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, ELM_BG_OPTION_CENTER); + elm_object_text_set(rd, "Center"); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_smart_callback_add(rd, "changed", _cb_radio_changed, o_bg); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + rdg = rd; + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, ELM_BG_OPTION_SCALE); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "Scale"); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_smart_callback_add(rd, "changed", _cb_radio_changed, o_bg); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, ELM_BG_OPTION_STRETCH); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "Stretch"); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_smart_callback_add(rd, "changed", _cb_radio_changed, o_bg); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, ELM_BG_OPTION_TILE); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "Tile"); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_smart_callback_add(rd, "changed", _cb_radio_changed, o_bg); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + + elm_radio_value_set(rdg, ELM_BG_OPTION_SCALE); + + rd = elm_check_add(win); + elm_object_text_set(rd, "Show Overlay"); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_smart_callback_add(rd, "changed", _cb_overlay_changed, o_bg); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + + /* color choices ... this is ghetto, but we don't have a 'colorpicker' + * widget yet :( */ + rd = elm_spinner_add(win); + elm_object_style_set(rd, "vertical"); + elm_spinner_min_max_set(rd, 1, 4); + elm_spinner_label_format_set(rd, "%.0f"); + elm_spinner_editable_set(rd, EINA_FALSE); + elm_spinner_special_value_add(rd, 1, "White"); + elm_spinner_special_value_add(rd, 2, "Red"); + elm_spinner_special_value_add(rd, 3, "Blue"); + elm_spinner_special_value_add(rd, 4, "Green"); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(rd, "changed", _cb_color_changed, o_bg); + elm_box_pack_end(hbox, rd); + evas_object_show(rd); + + elm_box_pack_end(box, hbox); + evas_object_show(hbox); + + evas_object_size_hint_min_set(bg, 160, 160); + evas_object_size_hint_max_set(bg, 640, 640); + evas_object_resize(win, 320, 320); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_box.c b/src/bin/test_box.c new file mode 100644 index 0000000..e2db82a --- /dev/null +++ b/src/bin/test_box.c @@ -0,0 +1,393 @@ +#include +#include "tsuite.h" + +enum _api_state +{ + BOX_PACK_START, + BOX_PACK_BEFORE, + BOX_PACK_AFTER, + BOX_PADDING_SET, + BOX_ALIGN_SET, + BOX_HOMOGENEOUS_SET, + BOX_UNPACK_ALL, + BOX_CLEAR, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + const Eina_List *items = elm_box_children_get(api->data); + if(!eina_list_count(items)) + return; + + /* use elm_box_children_get() to get list of children */ + switch(api->state) + { /* Put all api-changes under switch */ + case BOX_PACK_START: /* Move last item to begining */ + elm_box_unpack(api->data, eina_list_data_get(eina_list_last(items))); + elm_box_pack_start(api->data, eina_list_data_get(eina_list_last(items))); + break; + + case BOX_PACK_BEFORE: + if(eina_list_count(items) > 1) + { /* Put last item before the one preceeding it */ + elm_box_unpack(api->data, eina_list_data_get(eina_list_last(items))); + elm_box_pack_before(api->data, + eina_list_data_get(eina_list_last(items)), + eina_list_nth(items, eina_list_count(items)-2)); + } + break; + + case BOX_PACK_AFTER: + if(eina_list_count(items) > 1) + { /* Put item before last to last */ + elm_box_unpack(api->data, eina_list_nth(items, + eina_list_count(items)-2)); + elm_box_pack_after(api->data, + eina_list_nth(items, eina_list_count(items)-2), + eina_list_data_get(eina_list_last(items))); + } + break; + + case BOX_PADDING_SET: + elm_box_padding_set(api->data, 30, 15); + break; + + case BOX_ALIGN_SET: + elm_box_align_set(api->data, 0.25, 0.75); + break; + + case BOX_HOMOGENEOUS_SET: + elm_box_homogeneous_set(api->data, EINA_TRUE); + break; + + case BOX_UNPACK_ALL: + { + Eina_List *l; + Evas_Object *data; + elm_box_unpack_all(api->data); + EINA_LIST_REVERSE_FOREACH(items, l, data) + elm_box_pack_end(api->data, data); + } + break; + + case BOX_CLEAR: + elm_box_clear(api->data); + break; + + case API_STATE_LAST: + + break; + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(a->bt, str); + elm_object_disabled_set(a->bt, a->state == API_STATE_LAST); +} + +TEST_START(test_box_vert) +{ + Evas_Object *bg, *bx, *bxx, *ic; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bxx = elm_box_add(win); + elm_win_resize_object_add(win, bxx); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bxx); + + bx = elm_box_add(win); + api->data = bx; + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx); + + api->bt = elm_button_add(win); + elm_object_text_set(api->bt, "Next API function"); + evas_object_smart_callback_add(api->bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, api->bt); + elm_object_disabled_set(api->bt, api->state == API_STATE_LAST); + evas_object_show(api->bt); + + elm_box_pack_end(bxx, bx); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/icon_01.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_align_set(ic, 0.5, 0.5); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/icon_02.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_align_set(ic, 0.0, 0.5); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/icon_03.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_align_set(ic, EVAS_HINT_EXPAND, 0.5); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + evas_object_show(win); +} +TEST_END + +static void +_del_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + elm_box_unpack(data, obj); + evas_object_move(obj, 0, 0); + evas_object_color_set(obj, 128, 64, 0, 128); +// evas_object_del(obj); +} + +TEST_START(test_box_vert2) +{ + Evas_Object *bg, *bx, *bt; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + elm_win_resize_object_add(win, bx); + elm_box_padding_set(bx, 10, 10); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 1"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_smart_callback_add(bt, "clicked", _del_cb, bx); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 2"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_smart_callback_add(bt, "clicked", _del_cb, bx); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 3"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_smart_callback_add(bt, "clicked", _del_cb, bx); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 4"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_smart_callback_add(bt, "clicked", _del_cb, bx); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 5"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_smart_callback_add(bt, "clicked", _del_cb, bx); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + evas_object_show(win); +} +TEST_END + +TEST_START(test_box_horiz) +{ + Evas_Object *bg, *bx, *bxx, *ic; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bxx = elm_box_add(win); + elm_win_resize_object_add(win, bxx); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bxx); + + bx = elm_box_add(win); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + api->data = bx; + evas_object_show(bx); + + api->bt = elm_button_add(win); + elm_object_text_set(api->bt, "Next API function"); + evas_object_smart_callback_add(api->bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, api->bt); + elm_object_disabled_set(api->bt, api->state == API_STATE_LAST); + evas_object_show(api->bt); + + elm_box_pack_end(bxx, bx); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/icon_01.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_align_set(ic, 0.5, 0.5); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/icon_02.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_align_set(ic, 0.5, 0.0); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/icon_03.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_align_set(ic, 0.0, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + evas_object_show(win); +} +TEST_END + +typedef struct +{ + Eina_List *transitions; + Evas_Object *box; + Evas_Object_Box_Layout last_layout; +} Transitions_Data; + +static void +_test_box_transition_change(void *data) +{ + Transitions_Data *tdata = data; + Elm_Box_Transition *layout_data; + Evas_Object_Box_Layout next_layout; + + if (!data) return; + next_layout = eina_list_data_get(tdata->transitions); + layout_data = elm_box_transition_new(2.0, tdata->last_layout, + NULL, NULL, next_layout, NULL, NULL, + _test_box_transition_change, tdata); + elm_box_layout_set(tdata->box, elm_box_layout_transition, layout_data, elm_box_transition_free); + tdata->last_layout = next_layout; + + tdata->transitions = eina_list_demote_list(tdata->transitions, tdata->transitions); +} + +static void +_win_del(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Transitions_Data *tdata = data; + if (!data) return; + free(tdata); +} + +void +test_box_transition(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *win, *bg, *bx, *bt; + Transitions_Data *tdata; + + win = elm_win_add(NULL, "box-transition", ELM_WIN_BASIC); + elm_win_title_set(win, "Box Transition"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, 1.0, 1.0); + evas_object_show(bg); + + bx = elm_box_add(win); + elm_win_resize_object_add(win, bx); + evas_object_size_hint_weight_set(bx, 1.0, 1.0); + + evas_object_show(bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 1"); + evas_object_size_hint_weight_set(bt, 1.0, 1.0); + evas_object_size_hint_align_set(bt, -1.0, -1.0); + evas_object_smart_callback_add(bt, "clicked", _del_cb, bx); + elm_box_pack_end(bx, bt); + evas_object_resize(bt, 100, 100); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 2"); + evas_object_size_hint_weight_set(bt, 1.0, 1.0); + evas_object_size_hint_align_set(bt, -1.0, -1.0); + evas_object_smart_callback_add(bt, "clicked", _del_cb, bx); + elm_box_pack_end(bx, bt); + evas_object_resize(bt, 100, 100); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 3"); + evas_object_size_hint_weight_set(bt, 1.0, 1.0); + evas_object_size_hint_align_set(bt, -1.0, -1.0); + evas_object_smart_callback_add(bt, "clicked", _del_cb, bx); + elm_box_pack_end(bx, bt); + evas_object_resize(bt, 100, 100); + evas_object_show(bt); + + tdata = calloc(1, sizeof(Transitions_Data)); + tdata->box = bx; + tdata->last_layout = evas_object_box_layout_horizontal; + tdata->transitions = eina_list_append(tdata->transitions, + evas_object_box_layout_vertical); + tdata->transitions = eina_list_append(tdata->transitions, + evas_object_box_layout_horizontal); + tdata->transitions = eina_list_append(tdata->transitions, + evas_object_box_layout_stack); + tdata->transitions = eina_list_append(tdata->transitions, + evas_object_box_layout_homogeneous_vertical); + tdata->transitions = eina_list_append(tdata->transitions, + evas_object_box_layout_homogeneous_horizontal); + tdata->transitions = eina_list_append(tdata->transitions, + evas_object_box_layout_flow_vertical); + tdata->transitions = eina_list_append(tdata->transitions, + evas_object_box_layout_flow_horizontal); + tdata->transitions = eina_list_append(tdata->transitions, + evas_object_box_layout_stack); + + evas_object_resize(win, 300, 300); + evas_object_resize(bx, 300, 300); + evas_object_smart_callback_add(win, "delete,request", _win_del, tdata); + evas_object_show(win); + elm_box_layout_set(bx, evas_object_box_layout_horizontal, NULL, NULL); + _test_box_transition_change(tdata); +} diff --git a/src/bin/test_bubble.c b/src/bin/test_bubble.c new file mode 100644 index 0000000..fad2520 --- /dev/null +++ b/src/bin/test_bubble.c @@ -0,0 +1,155 @@ +#include +#include "tsuite.h" + +static void +_print_clicked(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("bubble clicked\n"); +} + +enum _api_state +{ + BUBBLE_SET_CORNER_1, + BUBBLE_SET_CORNER_2, + BUBBLE_SET_ICON_CONTENT, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + const Eina_List *items = elm_box_children_get(api->data); + if(!eina_list_count(items)) + return; + + switch(api->state) + { /* Put all api-changes under switch */ + case BUBBLE_SET_CORNER_1: + elm_bubble_corner_set(eina_list_nth(items, 0), "bottom_left"); + elm_object_text_set(elm_object_content_get(eina_list_nth(items, 0)), + "Corner: base (bottom-left) - with icon"); + elm_bubble_corner_set(eina_list_nth(items, 1), "top_right"); + elm_object_text_set(elm_object_content_get(eina_list_nth(items, 1)), + "Corner: base (top-right) - no icon"); + break; + + case BUBBLE_SET_CORNER_2: + elm_bubble_corner_set(eina_list_nth(items, 0), "top_right"); + elm_object_text_set(elm_object_content_get(eina_list_nth(items, 0)), + "Corner: base (top-right) - with icon"); + elm_bubble_corner_set(eina_list_nth(items, 1), "bottom_left"); + elm_object_text_set(elm_object_content_get(eina_list_nth(items, 1)), + "Corner: base (bottom-left) - no icon"); + break; + + case BUBBLE_SET_ICON_CONTENT: + { + char buf[PATH_MAX]; + Evas_Object *ct, *ic = elm_icon_add(api->win); + + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + elm_object_content_set(eina_list_nth(items, 0), ic); + ct = elm_label_add(api->win); + elm_object_text_set(ct, "Using icon as top-bubble content"); + elm_object_content_set(eina_list_nth(items, 1), ct); + evas_object_size_hint_align_set(ic, 0.5, 0.5); + evas_object_show(ic); + } + break; + + case API_STATE_LAST: + + break; + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(a->bt, str); + elm_object_disabled_set(a->bt, a->state == API_STATE_LAST); +} + +TEST_START(test_bubble) +{ + Evas_Object *bg, *bx, *bxx, *ic, *bb, *ct; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bxx = elm_box_add(win); + elm_win_resize_object_add(win, bxx); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bxx); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + api->data = bx; + evas_object_show(bx); + + api->bt = elm_button_add(win); + elm_object_text_set(api->bt, "Next API function"); + evas_object_smart_callback_add(api->bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, api->bt); + elm_object_disabled_set(api->bt, api->state == API_STATE_LAST); + evas_object_show(api->bt); + + elm_box_pack_end(bxx, bx); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1); + + bb = elm_bubble_add(win); + elm_object_text_set(bb, "Message 1"); + elm_object_part_text_set(bb, "info", "Corner: bottom_right"); + elm_bubble_icon_set(bb, ic); + elm_bubble_corner_set(bb, "bottom_right"); + evas_object_smart_callback_add(bb, "clicked", _print_clicked, NULL); + evas_object_show(ic); + evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ct = elm_label_add(win); + elm_object_text_set(ct, + "\"The future of the art: R or G or B?\", by Rusty"); + elm_object_content_set(bb, ct); + + elm_box_pack_end(bx, bb); + evas_object_show(bb); + + bb = elm_bubble_add(win); + elm_object_text_set(bb, "Message 2"); + elm_object_part_text_set(bb, "info", "10:32 4/11/2008"); + evas_object_smart_callback_add(bb, "clicked", _print_clicked, NULL); + evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ct = elm_label_add(win); + elm_object_text_set(ct, "Corner: base (top-left) - no icon"); + elm_object_content_set(bb, ct); + + elm_box_pack_end(bx, bb); + evas_object_show(bb); + + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_button.c b/src/bin/test_button.c new file mode 100644 index 0000000..74c7298 --- /dev/null +++ b/src/bin/test_button.c @@ -0,0 +1,206 @@ +#include +#include "tsuite.h" + +static void +_bt_repeated(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + static int count; + char buf[16]; + + snprintf(buf, sizeof(buf), "count=%d", count++); + if (count >= 10000) + count = 0; + elm_object_text_set(obj, buf); +} + +static void +_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + int param = (int)(data); + + printf("clicked event on Button:%d\n", param); +} + +static void +_bt_unpressed(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + int param = (int)(data); + + printf("unpressed event on Button:%d\n", param); +} + +enum _api_state +{ + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api __UNUSED__) +{ + return; +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(a->bt, str); + elm_object_disabled_set(a->bt, a->state == API_STATE_LAST); +} + +TEST_START(test_button) +{ + Evas_Object *bg, *bx, *bxx, *scr,*ic, *bt; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bxx = elm_box_add(win); + elm_win_resize_object_add(win, bxx); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bxx); + scr = elm_scroller_add(win); + elm_scroller_bounce_set(scr, EINA_FALSE, EINA_TRUE); + elm_scroller_policy_set(scr, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO); + evas_object_show(scr); + evas_object_size_hint_weight_set(scr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_content_set(scr, bx); + api->data = bx; + evas_object_show(bx); + + api->bt = elm_button_add(win); + elm_object_text_set(api->bt, "Next API function"); + evas_object_smart_callback_add(api->bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, api->bt); + elm_object_disabled_set(api->bt, api->state == API_STATE_LAST); + evas_object_show(api->bt); + + elm_box_pack_end(bxx, bx); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + bt = elm_button_add(win); + elm_object_text_set(bt, "Icon sized to button"); + elm_object_content_set(bt, ic); + evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)1); + evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)1); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_show(ic); + + ic = elm_icon_add(bx); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + bt = elm_button_add(win); + elm_object_text_set(bt, "Icon no scale"); + elm_object_content_set(bt, ic); + evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)2); + evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)2); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + bt = elm_button_add(win); + elm_object_text_set(bt, "Disabled Button"); + elm_object_content_set(bt, ic); + elm_object_disabled_set(bt, 1); + evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)3); + evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)3); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + bt = elm_button_add(win); + elm_object_content_set(bt, ic); + elm_object_disabled_set(bt, 1); + evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)4); + evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)4); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_show(ic); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Label Only"); + evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)5); + evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)5); + elm_box_pack_end(bx, bt); + evas_object_smart_callback_add(bt, "repeated", _bt_repeated, NULL); + elm_button_autorepeat_set(bt, 1); + elm_button_autorepeat_initial_timeout_set(bt, 2.0); + elm_button_autorepeat_gap_timeout_set(bt, 0.5); + evas_object_show(bt); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + bt = elm_button_add(win); + elm_object_content_set(bt, ic); + evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)6); + evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)6); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_show(ic); + + bt = elm_button_add(win); + elm_object_style_set(bt, "anchor"); + elm_object_text_set(bt, "Anchor style"); + evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)7); + evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)7); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + bt = elm_button_add(win); + elm_object_style_set(bt, "anchor"); + elm_object_content_set(bt, ic); + evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)8); + evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)8); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + bt = elm_button_add(win); + elm_object_access_info_set(bt, "This is some custom text describing this widget"); + elm_object_style_set(bt, "anchor"); + elm_object_content_set(bt, ic); + elm_object_disabled_set(bt, 1); + evas_object_smart_callback_add(bt, "clicked", _bt_clicked, (void *)9); + evas_object_smart_callback_add(bt, "unpressed", _bt_unpressed, (void *)9); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_show(ic); +} +TEST_END diff --git a/src/bin/test_calendar.c b/src/bin/test_calendar.c new file mode 100644 index 0000000..8c5998b --- /dev/null +++ b/src/bin/test_calendar.c @@ -0,0 +1,306 @@ +#include +#include "tsuite.h" + +enum _api_state +{ + STATE_MARK_MONTHLY, + STATE_MARK_WEEKLY, + STATE_SUNDAY_HIGHLIGHT, + STATE_SELECT_DATE_DISABLED_WITH_MARKS, + STATE_SELECT_DATE_DISABLED_NO_MARKS, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + const Eina_List *items = elm_box_children_get(api->data); + static Elm_Calendar_Mark *m = NULL; + if(!eina_list_count(items)) + return; + + switch(api->state) + { /* Put all api-changes under switch */ + case STATE_MARK_MONTHLY: + { + Evas_Object *cal = eina_list_nth(items, 0); + time_t sec_per_day = (60*60*24); + time_t sec_per_year = sec_per_day * 365; + time_t the_time = (sec_per_year * 41) + (sec_per_day * 9); /* Set date to DEC 31, 2010 */ + elm_calendar_min_max_year_set(cal, 2010, 2011); + m = elm_calendar_mark_add(cal, "checked", gmtime(&the_time), ELM_CALENDAR_MONTHLY); + elm_calendar_selected_time_set(cal, gmtime(&the_time)); + } + break; + case STATE_MARK_WEEKLY: + { + Evas_Object *cal = eina_list_nth(items, 0); + time_t sec_per_day = (60*60*24); + time_t sec_per_year = sec_per_day * 365; + time_t the_time = (sec_per_year * 41) + (sec_per_day * 4); /* Set date to DEC 26, 2010 */ + elm_calendar_mark_del(m); + m = elm_calendar_mark_add(cal, "checked", gmtime(&the_time), ELM_CALENDAR_WEEKLY); + elm_calendar_selected_time_set(cal, gmtime(&the_time)); + } + break; + case STATE_SUNDAY_HIGHLIGHT: + { + Evas_Object *cal = eina_list_nth(items, 0); + time_t sec_per_day = (60*60*24); + time_t sec_per_year = sec_per_day * 365; + time_t the_time = (sec_per_year * 41) + (sec_per_day * 3); /* Set date to DEC 25, 2010 */ + /* elm_calendar_mark_del(m); */ + m = elm_calendar_mark_add(cal, "holiday", gmtime(&the_time), ELM_CALENDAR_WEEKLY); + elm_calendar_selected_time_set(cal, gmtime(&the_time)); + } + break; + case STATE_SELECT_DATE_DISABLED_WITH_MARKS: + { + Evas_Object *cal = eina_list_nth(items, 0); + time_t sec_per_day = (60*60*24); + time_t sec_per_year = sec_per_day * 365; + time_t the_time = (sec_per_year * 41) + (sec_per_day * 10); /* Set date to JAN 01, 2011 */ + elm_calendar_day_selection_enabled_set(cal, EINA_FALSE); + elm_calendar_selected_time_set(cal, gmtime(&the_time)); + } + break; + case STATE_SELECT_DATE_DISABLED_NO_MARKS: + { + Evas_Object *cal = eina_list_nth(items, 0); + time_t sec_per_day = (60*60*24); + time_t sec_per_year = sec_per_day * 365; + time_t the_time = (sec_per_year * 41) + (sec_per_day * 40); /* Set date to FEB 01, 2011 */ + elm_calendar_marks_clear(cal); + elm_calendar_day_selection_enabled_set(cal, EINA_FALSE); + elm_calendar_selected_time_set(cal, gmtime(&the_time)); + } + break; + case API_STATE_LAST: + break; + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(a->bt, str); + elm_object_disabled_set(a->bt, a->state == API_STATE_LAST); +} + +/* A simple test, just displaying calendar in it's default state */ +TEST_START(test_calendar) +{ + Evas_Object *bg, *bx, *bxx, *cal; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bxx = elm_box_add(win); + elm_win_resize_object_add(win, bxx); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bxx); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + api->data = bx; + evas_object_show(bx); + + api->bt = elm_button_add(win); + elm_object_text_set(api->bt, "Next API function"); + evas_object_smart_callback_add(api->bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, api->bt); + elm_object_disabled_set(api->bt, api->state == API_STATE_LAST); + evas_object_show(api->bt); + + elm_box_pack_end(bxx, bx); + + cal = elm_calendar_add(win); + evas_object_size_hint_weight_set(cal, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, cal); + + time_t sec_per_day = (60*60*24); + time_t sec_per_year = sec_per_day * 365; + time_t the_time = (sec_per_year * 41) + (sec_per_day * 9); /* Set date to DEC 31, 2010 */ + elm_calendar_selected_time_set(cal, gmtime(&the_time)); + elm_calendar_min_max_year_set(cal, 2010, 2010); + + evas_object_show(cal); + + evas_object_show(win); +} +TEST_END + +void +_print_cal_info(Evas_Object *cal, Evas_Object *en) +{ + char info[1024]; + double interval; + int year_min, year_max; + Eina_Bool sel_enabled; + const char **wds; + struct tm stime; + + if (!elm_calendar_selected_time_get(cal, &stime)) + return; + + interval = elm_calendar_interval_get(cal); + elm_calendar_min_max_year_get(cal, &year_min, &year_max); + sel_enabled = elm_calendar_day_selection_enabled_get(cal); + wds = elm_calendar_weekdays_names_get(cal); + + snprintf(info, sizeof(info), + " Day: %i, Mon: %i, Year %i, WeekDay: %i
" + " Interval: %0.2f, Year_Min: %i, Year_Max %i, Sel Enabled : %i
" + " Weekdays: %s, %s, %s, %s, %s, %s, %s
", + stime.tm_mday, stime.tm_mon, stime.tm_year + 1900, stime.tm_wday, + interval, year_min, year_max, sel_enabled, + wds[0], wds[1], wds[2], wds[3], wds[4], wds[5], wds[6]); + + elm_entry_entry_set(en, info); +} + +static void +_print_cal_info_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + _print_cal_info(obj, data); +} + +static char * +_format_month_year(struct tm *stime) +{ + char buf[32]; + if (!strftime(buf, sizeof(buf), "%b %y", stime)) return NULL; + return strdup(buf); +} + +/* A test intended to cover all the calendar api and much use cases as + possible */ +TEST_START(test_calendar2) +{ + Evas_Object *bg, *bx, *bxh, *bxx, *cal, *cal2, *cal3, *en; + Elm_Calendar_Mark *mark; + struct tm selected_time; + time_t current_time; + const char *weekdays[] = + { + "Sunday", "Monday", "Tuesday", "Wednesday", + "Thursday", "Friday", "Saturday" + }; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bxx = elm_box_add(win); + elm_win_resize_object_add(win, bxx); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bxx); + + api->bt = elm_button_add(win); + elm_object_text_set(api->bt, "Next API function"); + evas_object_smart_callback_add(api->bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, api->bt); + elm_object_disabled_set(api->bt, EINA_TRUE); /* NOT USED at the Moment */ + evas_object_show(api->bt); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx); + api->data = bx; + elm_box_pack_end(bxx, bx); + + bxh = elm_box_add(win); + elm_box_horizontal_set(bxh, EINA_TRUE); + evas_object_size_hint_weight_set(bxh, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bxh, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(bxh); + elm_box_pack_end(bx, bxh); + + cal = elm_calendar_add(win); + evas_object_size_hint_weight_set(cal, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(cal, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(cal); + elm_box_pack_end(bx, cal); + + cal2 = elm_calendar_add(win); + evas_object_size_hint_weight_set(cal2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(cal2, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_calendar_day_selection_enabled_set(cal2, EINA_FALSE); + evas_object_show(cal2); + elm_box_pack_end(bxh, cal2); + + cal3 = elm_calendar_add(win); + evas_object_size_hint_weight_set(cal3, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(cal3, EVAS_HINT_FILL, EVAS_HINT_FILL); + current_time = time(NULL) + 34 * 84600; + localtime_r(¤t_time, &selected_time); + elm_calendar_selected_time_set(cal3, &selected_time); + current_time = time(NULL) + 1 * 84600; + localtime_r(¤t_time, &selected_time); + elm_calendar_mark_add(cal3, "checked", &selected_time, ELM_CALENDAR_UNIQUE); + elm_calendar_marks_clear(cal3); + current_time = time(NULL); + localtime_r(¤t_time, &selected_time); + elm_calendar_mark_add(cal3, "checked", &selected_time, ELM_CALENDAR_DAILY); + elm_calendar_mark_add(cal3, "holiday", &selected_time, ELM_CALENDAR_DAILY); + elm_calendar_marks_draw(cal3); + evas_object_show(cal3); + elm_box_pack_end(bxh, cal3); + + en = elm_entry_add(win); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(en); + elm_box_pack_end(bx, en); + elm_entry_editable_set(en, EINA_FALSE); + evas_object_show(win); + + elm_calendar_min_max_year_set(cal3, -1, -1); + + elm_calendar_weekdays_names_set(cal, weekdays); + elm_calendar_interval_set(cal, 0.4); + elm_calendar_format_function_set(cal, _format_month_year); + elm_calendar_min_max_year_set(cal, 2010, 2020); + + current_time = time(NULL) + 4 * 84600; + localtime_r(¤t_time, &selected_time); + elm_calendar_mark_add(cal, "holiday", &selected_time, ELM_CALENDAR_ANNUALLY); + + current_time = time(NULL) + 1 * 84600; + localtime_r(¤t_time, &selected_time); + elm_calendar_mark_add(cal, "checked", &selected_time, ELM_CALENDAR_UNIQUE); + + current_time = time(NULL) - 363 * 84600; + localtime_r(¤t_time, &selected_time); + elm_calendar_mark_add(cal, "checked", &selected_time, ELM_CALENDAR_MONTHLY); + + current_time = time(NULL) - 5 * 84600; + localtime_r(¤t_time, &selected_time); + mark = elm_calendar_mark_add(cal, "holiday", &selected_time, + ELM_CALENDAR_WEEKLY); + + current_time = time(NULL) + 1 * 84600; + localtime_r(¤t_time, &selected_time); + elm_calendar_mark_add(cal, "holiday", &selected_time, ELM_CALENDAR_WEEKLY); + + elm_calendar_mark_del(mark); + elm_calendar_marks_draw(cal); + + _print_cal_info(cal, en); + evas_object_smart_callback_add(cal, "changed", _print_cal_info_cb, en); +} +TEST_END diff --git a/src/bin/test_check.c b/src/bin/test_check.c new file mode 100644 index 0000000..c7edca2 --- /dev/null +++ b/src/bin/test_check.c @@ -0,0 +1,76 @@ +#include +#include "tsuite.h" + +TEST_START(test_check) +{ + Evas_Object *bg, *bx, *ic, *ck; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + ck = elm_check_add(win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, 0.5); + elm_object_text_set(ck, "Icon sized to check"); + elm_object_content_set(ck, ic); + elm_check_state_set(ck, 1); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + ck = elm_check_add(win); + elm_object_text_set(ck, "Icon no scale"); + elm_object_content_set(ck, ic); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + evas_object_show(ic); + + ck = elm_check_add(win); + elm_object_text_set(ck, "Label Only"); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + ck = elm_check_add(win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, 0.5); + elm_object_text_set(ck, "Disabled check"); + elm_object_content_set(ck, ic); + elm_check_state_set(ck, 1); + elm_box_pack_end(bx, ck); + elm_object_disabled_set(ck, 1); + evas_object_show(ck); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + ck = elm_check_add(win); + elm_object_content_set(ck, ic); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + evas_object_show(ic); + + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_clock.c b/src/bin/test_clock.c new file mode 100644 index 0000000..0666887 --- /dev/null +++ b/src/bin/test_clock.c @@ -0,0 +1,239 @@ +#include +#include "tsuite.h" + +enum _api_state +{ + CLOCK_HIDE_SEC, + CLOCK_SHOW_AM_PM, + CLOCK_SHOW_SEC, + CLOCK_EDIT_MIN, + CLOCK_EDIT_HOUR, + CLOCK_EDIT_ALL, + CLOCK_EDIT_ALL_ARMY, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + const Eina_List *items = elm_box_children_get(api->data); + Evas_Object *ck = eina_list_nth(items, 0); + if(!eina_list_count(items)) + return; + + /* use elm_box_children_get() to get list of children */ + switch(api->state) + { /* Put all api-changes under switch */ + case CLOCK_HIDE_SEC: + elm_clock_show_seconds_set(ck, EINA_FALSE); + break; + + case CLOCK_SHOW_AM_PM: + elm_clock_show_am_pm_set(ck, EINA_TRUE); + break; + + case CLOCK_SHOW_SEC: + elm_clock_show_seconds_set(ck, EINA_TRUE); + break; + + case CLOCK_EDIT_MIN: + elm_clock_edit_set(ck, ELM_CLOCK_MIN_DECIMAL | ELM_CLOCK_MIN_UNIT); + break; + + case CLOCK_EDIT_HOUR: + elm_clock_edit_set(ck, ELM_CLOCK_NONE); + elm_clock_edit_set(ck, ELM_CLOCK_HOUR_DECIMAL | ELM_CLOCK_HOUR_UNIT); + break; + + case CLOCK_EDIT_ALL: + elm_clock_edit_set(ck, ELM_CLOCK_ALL); + break; + + case CLOCK_EDIT_ALL_ARMY: + elm_clock_show_am_pm_set(ck, EINA_FALSE); + break; + + case API_STATE_LAST: + + break; + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(a->bt, str); + elm_object_disabled_set(a->bt, a->state == API_STATE_LAST); +} + +TEST_START(test_clock) +{ + Evas_Object *bg, *bx, *bxx, *ck; + unsigned int digedit; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bxx = elm_box_add(win); + elm_win_resize_object_add(win, bxx); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bxx); + + bx = elm_box_add(win); + elm_win_resize_object_add(win, bx); + api->data = bx; + evas_object_show(bx); + + api->bt = elm_button_add(win); + elm_object_text_set(api->bt, "Next API function"); + evas_object_smart_callback_add(api->bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, api->bt); + elm_object_disabled_set(api->bt, EINA_TRUE); + evas_object_show(api->bt); + + elm_box_pack_end(bxx, bx); + + ck = elm_clock_add(win); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + ck = elm_clock_add(win); + elm_clock_show_am_pm_set(ck, 1); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + ck = elm_clock_add(win); + elm_clock_show_seconds_set(ck, 1); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + ck = elm_clock_add(win); + elm_clock_show_seconds_set(ck, 1); + elm_clock_show_am_pm_set(ck, 1); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + ck = elm_clock_add(win); + elm_clock_show_seconds_set(ck, 1); + elm_clock_show_am_pm_set(ck, 0); + elm_clock_time_set(ck, 23, 59, 57); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + ck = elm_clock_add(win); + elm_clock_edit_set(ck, 1); + elm_clock_show_seconds_set(ck, 1); + elm_clock_show_am_pm_set(ck, 1); + elm_clock_time_set(ck, 10, 11, 12); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + ck = elm_clock_add(win); + elm_clock_show_seconds_set(ck, 1); + elm_clock_edit_set(ck, 1); + digedit = ELM_CLOCK_HOUR_UNIT | ELM_CLOCK_MIN_UNIT | ELM_CLOCK_SEC_UNIT; + elm_clock_digit_edit_set(ck, digedit); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + evas_object_show(win); +} +TEST_END + +static void +_edit_bt_clicked(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *ck = data; + + if (!elm_clock_edit_get(ck)) { + elm_object_text_set(obj, "Done"); + elm_clock_edit_set(ck, 1); + return; + } + elm_object_text_set(obj, "Edit"); + elm_clock_edit_set(ck, 0); +} + +static void +_hmode_bt_clicked(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *ck = data; + + if (!elm_clock_show_am_pm_get(ck)) { + elm_object_text_set(obj, "24h"); + elm_clock_show_am_pm_set(ck, 1); + return; + } + elm_object_text_set(obj, "12h"); + elm_clock_show_am_pm_set(ck, 0); +} + +TEST_START(test_clock2) +{ + Evas_Object *bg, *bx, *bxx, *hbx, *ck, *bt; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bxx = elm_box_add(win); + elm_win_resize_object_add(win, bxx); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bxx); + + bx = elm_box_add(win); + elm_win_resize_object_add(win, bx); + api->data = bx; + evas_object_show(bx); + + api->bt = elm_button_add(win); + elm_object_text_set(api->bt, "Next API function"); + evas_object_smart_callback_add(api->bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, api->bt); + elm_object_disabled_set(api->bt, api->state == API_STATE_LAST); + evas_object_show(api->bt); + + elm_box_pack_end(bxx, bx); + + ck = elm_clock_add(win); + elm_clock_time_set(ck, 0, 15, 3); + elm_clock_digit_edit_set(ck, ELM_CLOCK_NONE); + elm_clock_show_seconds_set(ck, 1); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + hbx = elm_box_add(win); + evas_object_size_hint_weight_set(hbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_horizontal_set(hbx, EINA_TRUE); + elm_box_pack_end(bx, hbx); + evas_object_show(hbx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Edit"); + evas_object_smart_callback_add(bt, "clicked", _edit_bt_clicked, ck); + elm_box_pack_end(hbx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "24h"); + evas_object_smart_callback_add(bt, "clicked", _hmode_bt_clicked, ck); + elm_box_pack_end(hbx, bt); + evas_object_show(bt); + + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_colorselector.c b/src/bin/test_colorselector.c new file mode 100644 index 0000000..301d76d --- /dev/null +++ b/src/bin/test_colorselector.c @@ -0,0 +1,89 @@ +#include +#include "tsuite.h" + +static void +_colorselector_clicked_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *re = data; + int r, g, b, a; + + elm_colorselector_color_get(obj, &r, &g, &b, &a); + printf("Current Color [r=%d g=%d b=%d a=%d]\n",r, g, b, a); + + /* Fix Alpha pre multiplication by edje */ + r = (r * a) / 255; + g = (g * a) / 255; + b = (b * a) / 255; + + evas_object_color_set(re, r, g, b, a); +} + +TEST_START(test_colorselector) +{ + Evas_Object *bg, *bx, *cp, *fr, *ly, *re; + char buf[PATH_MAX]; + int r, g, b, a; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_color_set(bg, 255, 255, 255, 255); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + fr = elm_frame_add(win); + evas_object_size_hint_weight_set(fr, 1.0, 0.5); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(fr, "Color View"); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + ly = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/colorpreview.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "main"); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_content_set(fr, ly); + evas_object_show(ly); + + re = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_show(re); + elm_object_part_content_set(ly, "ColorPreview", re); + + fr = elm_frame_add(win); + evas_object_size_hint_weight_set(fr, 1.0, 0); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, 0); + elm_object_text_set(fr, "Color Selector"); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + cp = elm_colorselector_add(win); + + a = 180; + r = 255; + g = 160; + b = 132; + + elm_colorselector_color_set(cp, r, g, b, a); + evas_object_size_hint_weight_set(cp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(cp, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_content_set(fr, cp); + evas_object_show(cp); + evas_object_smart_callback_add(cp, "changed", _colorselector_clicked_cb, re); + + elm_colorselector_color_get(cp, &r, &g, &b, &a); + /* Fix Alpha pre multiplication by edje */ + r = (r * a) / 255; + g = (g * a) / 255; + b = (b * a) / 255; + evas_object_color_set(re, r, g, b, a); + + evas_object_resize(win, 320, 480); + evas_object_show(win); + +} +TEST_END diff --git a/src/bin/test_conform.c b/src/bin/test_conform.c new file mode 100644 index 0000000..b2b9230 --- /dev/null +++ b/src/bin/test_conform.c @@ -0,0 +1,200 @@ +#include +#include "tsuite.h" + +TEST_START(test_conformant) +{ + Evas_Object *bg, *conform, *btn, *bx, *en; + + elm_win_conformant_set(win, 1); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + conform = elm_conformant_add(win); + elm_win_resize_object_add(win, conform); + evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(conform); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_single_line_set(en, 1); + elm_entry_bounce_set(en, 1, 0); + elm_entry_entry_set(en, "This is the top entry here"); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + evas_object_show(en); + elm_box_pack_end(bx, en); + + btn = elm_button_add(win); + elm_object_text_set(btn, "Test Conformant"); + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn); + evas_object_show(btn); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_single_line_set(en, 1); + elm_entry_bounce_set(en, 1, 0); + elm_entry_entry_set(en, "This is the middle entry here"); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + evas_object_show(en); + elm_box_pack_end(bx, en); + + btn = elm_button_add(win); + elm_object_text_set(btn, "Test Conformant"); + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn); + evas_object_show(btn); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_bounce_set(en, 0, 1); + elm_entry_entry_set(en, + "This is a multi-line entry at the bottom
" + "This can contain more than 1 line of text and be " + "scrolled around to allow for entering of lots of " + "content. It is also to test to see that autoscroll " + "moves to the right part of a larger multi-line " + "text entry that is inside of a scroller than can be " + "scrolled around, thus changing the expected position " + "as well as cursor changes updating auto-scroll when " + "it is enabled."); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(en); + elm_box_pack_end(bx, en); + + elm_object_content_set(conform, bx); + evas_object_show(bx); + + evas_object_resize(win, 240, 240); + evas_object_show(win); +} +TEST_END + +static void +popobj(void *data, Evas_Object *obj __UNUSED__, void *event __UNUSED__) +{ + elm_pager_content_pop(data); +} + +TEST_START(test_conformant2) +{ + Evas_Object *bg, *conform, *btn, *bx, *en, *pg; + + elm_win_conformant_set(win, 1); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_single_line_set(en, 1); + elm_entry_bounce_set(en, 1, 0); + elm_entry_entry_set(en, "This is the top entry here"); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, en); + evas_object_show(en); + + btn = elm_button_add(win); + elm_object_focus_allow_set(btn, 0); + elm_object_text_set(btn, "Delete Below"); + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn); + evas_object_show(btn); + + pg = elm_pager_add(win); + evas_object_size_hint_weight_set(pg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(pg, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, pg); + evas_object_show(pg); + + evas_object_smart_callback_add(btn, "clicked", popobj, pg); + + conform = elm_conformant_add(win); + evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(conform, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_pager_content_push(pg, conform); + evas_object_show(conform); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_bounce_set(en, 0, 1); + elm_entry_entry_set(en, "This entry and button below get deleted."); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(en); + elm_box_pack_end(bx, en); + + btn = elm_button_add(win); + elm_object_focus_allow_set(btn, 0); + elm_object_text_set(btn, "Delete this bottom bit 1"); + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn); + evas_object_show(btn); + + evas_object_smart_callback_add(btn, "clicked", popobj, pg); + + elm_object_content_set(conform, bx); + evas_object_show(bx); + + conform = elm_conformant_add(win); + evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(conform, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_pager_content_push(pg, conform); + evas_object_show(conform); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_bounce_set(en, 0, 1); + elm_entry_entry_set(en, "This entry and button below get deleted."); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(en); + elm_box_pack_end(bx, en); + + btn = elm_button_add(win); + elm_object_focus_allow_set(btn, 0); + elm_object_text_set(btn, "Delete this bottom bit 2"); + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, btn); + evas_object_show(btn); + + evas_object_smart_callback_add(btn, "clicked", popobj, pg); + + elm_object_content_set(conform, bx); + evas_object_show(bx); + + evas_object_resize(win, 240, 480); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_ctxpopup.c b/src/bin/test_ctxpopup.c new file mode 100644 index 0000000..9757a4f --- /dev/null +++ b/src/bin/test_ctxpopup.c @@ -0,0 +1,240 @@ +#include +#include "tsuite.h" +static void +_dismissed(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + evas_object_del(obj); +} + +static void +_print_current_dir(Evas_Object *obj) +{ + Elm_Ctxpopup_Direction dir; + dir = elm_ctxpopup_direction_get(obj); + + switch(dir) + { + case ELM_CTXPOPUP_DIRECTION_LEFT: + printf("ctxpopup direction: left!\n"); + break; + case ELM_CTXPOPUP_DIRECTION_RIGHT: + printf("ctxpopup direction: right!\n"); + break; + case ELM_CTXPOPUP_DIRECTION_UP: + printf("ctxpopup direction: up!\n"); + break; + case ELM_CTXPOPUP_DIRECTION_DOWN: + printf("ctxpopup direction: down!\n"); + break; + case ELM_CTXPOPUP_DIRECTION_UNKNOWN: + printf("ctxpopup direction: unknow!\n"); + break; + } +} + +static void +_ctxpopup_item_cb(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + printf("ctxpopup item selected: %s\n", + elm_ctxpopup_item_label_get(event_info)); +} + +#define ITEM_NEW(_hov, _label, _icon) \ + if(_icon) \ + { \ + ic = elm_icon_add(obj); \ + elm_icon_standard_set(ic, _icon); \ + elm_icon_scale_set(ic, EINA_FALSE, EINA_FALSE); \ + } \ + else \ + ic = NULL; \ + it = elm_ctxpopup_item_append(_hov, _label, ic, _ctxpopup_item_cb, NULL); \ + +static void +_list_item_cb(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *ctxpopup, *ic; + Elm_Object_Item *it; + Evas_Coord x,y; + + ctxpopup = elm_ctxpopup_add(obj); + evas_object_smart_callback_add(ctxpopup, + "dismissed", + _dismissed, + NULL); + + ITEM_NEW(ctxpopup, "Go to home folder", "home"); + ITEM_NEW(ctxpopup, "Save file", "file"); + ITEM_NEW(ctxpopup, "Delete file", "delete"); + ITEM_NEW(ctxpopup, "Navigate to folder", "folder"); + elm_object_item_disabled_set(it, EINA_TRUE); + ITEM_NEW(ctxpopup, "Edit entry", "edit"); + ITEM_NEW(ctxpopup, "Set date and time", "clock"); + elm_object_item_disabled_set(it, EINA_TRUE); + + evas_pointer_canvas_xy_get(evas_object_evas_get(obj), &x, &y); + evas_object_size_hint_max_set(ctxpopup, 240, 240); + evas_object_move(ctxpopup, x, y); + evas_object_show(ctxpopup); + _print_current_dir(ctxpopup); +} + +static void +_list_item_cb2(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *ctxpopup, *ic; + Elm_Object_Item *it; + Evas_Coord x,y; + + ctxpopup = elm_ctxpopup_add(obj); + evas_object_smart_callback_add(ctxpopup, + "dismissed", + _dismissed, + NULL); + + ITEM_NEW(ctxpopup, NULL, "home"); + ITEM_NEW(ctxpopup, NULL, "file"); + ITEM_NEW(ctxpopup, NULL, "delete"); + ITEM_NEW(ctxpopup, NULL, "folder"); + ITEM_NEW(ctxpopup, NULL, "edit"); + elm_object_item_disabled_set(it, EINA_TRUE); + ITEM_NEW(ctxpopup, NULL, "clock"); + + evas_pointer_canvas_xy_get(evas_object_evas_get(obj), &x, &y); + evas_object_size_hint_max_set(ctxpopup, 240, 240); + evas_object_move(ctxpopup, x, y); + evas_object_show(ctxpopup); + _print_current_dir(ctxpopup); +} + +static void +_list_item_cb3(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *ctxpopup, *ic; + Elm_Object_Item *it; + Evas_Coord x,y; + + ctxpopup = elm_ctxpopup_add(obj); + evas_object_smart_callback_add(ctxpopup, + "dismissed", + _dismissed, + NULL); + + ITEM_NEW(ctxpopup, "Eina", NULL); + ITEM_NEW(ctxpopup, "Eet", NULL); + ITEM_NEW(ctxpopup, "Evas", NULL); + ITEM_NEW(ctxpopup, "Ecore", NULL); + elm_object_item_disabled_set(it, EINA_TRUE); + ITEM_NEW(ctxpopup, "Embryo", NULL); + ITEM_NEW(ctxpopup, "Edje", NULL); + + evas_pointer_canvas_xy_get(evas_object_evas_get(obj), &x, &y); + evas_object_move(ctxpopup, x, y); + evas_object_show(ctxpopup); + _print_current_dir(ctxpopup); +} + +static void +_list_item_cb4(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *ctxpopup, *ic; + Elm_Object_Item *it; + Evas_Coord x,y; + + ctxpopup = elm_ctxpopup_add(obj); + evas_object_smart_callback_add(ctxpopup, + "dismissed", + _dismissed, + NULL); + elm_ctxpopup_horizontal_set(ctxpopup, EINA_TRUE); + + ITEM_NEW(ctxpopup, NULL, "home"); + ITEM_NEW(ctxpopup, NULL, "file"); + ITEM_NEW(ctxpopup, NULL, "delete"); + ITEM_NEW(ctxpopup, NULL, "folder"); + ITEM_NEW(ctxpopup, NULL, "edit"); + ITEM_NEW(ctxpopup, NULL, "clock"); + + evas_pointer_canvas_xy_get(evas_object_evas_get(obj), &x, &y); + evas_object_size_hint_max_set(ctxpopup, 240, 240); + evas_object_move(ctxpopup, x, y); + evas_object_show(ctxpopup); + _print_current_dir(ctxpopup); +} + + +static void +_list_item_cb5(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *ctxpopup, *btn, *sc, *bx; + Evas_Coord x,y; + + bx = elm_box_add(obj); + evas_object_size_hint_min_set(bx, 150, 150); + + sc = elm_scroller_add(bx); + elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE); + evas_object_size_hint_fill_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(sc); + + btn = elm_button_add(sc); + elm_object_text_set(btn, "Enlightenment"); + evas_object_size_hint_min_set(btn, 140, 140); + + elm_object_content_set(sc, btn); + + elm_box_pack_end(bx, sc); + + ctxpopup = elm_ctxpopup_add(obj); + evas_object_smart_callback_add(ctxpopup, + "dismissed", + _dismissed, + NULL); + elm_object_content_set(ctxpopup, bx); + + evas_pointer_canvas_xy_get(evas_object_evas_get(obj), &x, &y); + evas_object_move(ctxpopup, x, y); + evas_object_show(ctxpopup); + _print_current_dir(ctxpopup); +} + + +static void _list_clicked(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + elm_list_item_selected_set(event_info, EINA_FALSE); +} + +TEST_START(test_ctxpopup) +{ + Evas_Object *bg, *list; + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + list = elm_list_add(win); + elm_win_resize_object_add(win, list); + evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_list_mode_set(list, ELM_LIST_COMPRESS); + evas_object_smart_callback_add(list, "selected", _list_clicked, NULL); + +#undef ITEM_NEW + elm_list_item_append(list, "Ctxpopup with icons and labels", NULL, NULL, + _list_item_cb, NULL); + elm_list_item_append(list, "Ctxpopup with icons only", NULL, NULL, + _list_item_cb2, NULL); + elm_list_item_append(list, "Ctxpopup with labels only", NULL, NULL, + _list_item_cb3, NULL); + elm_list_item_append(list, "Ctxpopup at horizontal mode", NULL, NULL, + _list_item_cb4, NULL); + elm_list_item_append(list, "Ctxpopup with user content", NULL, NULL, + _list_item_cb5, NULL); + evas_object_show(list); + elm_list_go(list); + + evas_object_resize(win, 400, 400); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_cursor.c b/src/bin/test_cursor.c new file mode 100644 index 0000000..8ba3463 --- /dev/null +++ b/src/bin/test_cursor.c @@ -0,0 +1,450 @@ +#include +#include +#include "tsuite.h" + +typedef struct _Testitem +{ + Elm_Gengrid_Item *item; + const char *path; + int mode; + int onoff; +} Testitem; + +static Elm_Gengrid_Item_Class gic; + +char * +grd_lbl_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__) +{ + const Testitem *ti = data; + char buf[256]; + snprintf(buf, sizeof(buf), "Photo %s", ti->path); + return strdup(buf); +} + +Evas_Object * +grd_content_get(void *data, Evas_Object *obj, const char *part) +{ + const Testitem *ti = data; + if (!strcmp(part, "elm.swallow.icon")) + { + Evas_Object *icon = elm_bg_add(obj); + elm_bg_file_set(icon, ti->path, NULL); + evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, + 1, 1); + evas_object_show(icon); + return icon; + } + return NULL; +} + +static Elm_Genlist_Item_Class itct; + +static void +glt_exp(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Elm_Genlist_Item *it = event_info; + Evas_Object *gl = elm_genlist_item_genlist_get(it); + int val = (int)(long)elm_genlist_item_data_get(it); + Elm_Genlist_Item *it1, *it2, *it3; + + val *= 10; + it1 = elm_genlist_item_append(gl, &itct, (void *)(long)(val + 1), it, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + it2 = elm_genlist_item_append(gl, &itct, (void *)(long)(val + 2), it, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + it3 = elm_genlist_item_append(gl, &itct, (void *)(long)(val + 3), it, + ELM_GENLIST_ITEM_SUBITEMS, NULL, NULL); + + elm_genlist_item_cursor_set(it1, ELM_CURSOR_HAND2); + elm_genlist_item_cursor_set(it2, ELM_CURSOR_HAND2); + elm_genlist_item_cursor_set(it3, ELM_CURSOR_HAND1); + +} + +static void +glt_con(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Elm_Genlist_Item *it = event_info; + elm_genlist_item_subitems_clear(it); +} + +static void +glt_exp_req(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Elm_Genlist_Item *it = event_info; + elm_genlist_item_expanded_set(it, 1); +} + +static void +glt_con_req(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Elm_Genlist_Item *it = event_info; + elm_genlist_item_expanded_set(it, 0); +} + +char * +glt_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__) +{ + char buf[256]; + snprintf(buf, sizeof(buf), "Item mode %i", (int)(long)data); + return strdup(buf); +} + +TEST_START(test_cursor) +{ + Evas_Object *bg, *bx, *bt, *list, *entry, *ck; + Elm_List_Item *lit; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + elm_object_cursor_set(bg, ELM_CURSOR_CIRCLE); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + ck = elm_clock_add(win); + elm_object_cursor_set(ck, ELM_CURSOR_CLOCK); + elm_box_pack_end(bx, ck); + evas_object_show(ck); + + bt = elm_button_add(win); + elm_object_cursor_set(bt, ELM_CURSOR_COFFEE_MUG); + elm_object_text_set(bt, "Coffee Mug"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_cursor_set(bt, ELM_CURSOR_CLOCK); + elm_object_text_set(bt, "Cursor unset"); + elm_object_cursor_unset(bt); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + list = elm_list_add(win); + elm_box_pack_end(bx, list); + evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_cursor_set(list, ELM_CURSOR_WATCH); + lit = elm_list_item_append(list, "watch over list | hand1", NULL, NULL, NULL, + NULL); + elm_list_item_cursor_set(lit, ELM_CURSOR_HAND1); + lit = elm_list_item_append(list, "watch over list | hand2", NULL, NULL, NULL, + NULL); + elm_list_item_cursor_set(lit, ELM_CURSOR_HAND2); + elm_list_go(list); + evas_object_show(list); + + entry = elm_entry_add(win); + elm_entry_scrollable_set(entry, EINA_TRUE); + elm_entry_entry_set(entry, "Xterm cursor"); + elm_entry_single_line_set(entry, EINA_TRUE); + evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_fill_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, entry); + evas_object_show(entry); + elm_object_cursor_set(entry, ELM_CURSOR_XTERM); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} +TEST_END + +TEST_START(test_cursor2) +{ + Evas_Object *bg, *bx, *o, *grid, *gl; + Elm_Genlist_Item *it1, *it2, *it3; + Elm_Object_Item *tb_it; + Elm_List_Item *lit; + char buf[PATH_MAX]; + static Testitem ti[144]; + int i, n; + const char *img[9] = + { + "panel_01.jpg", + "plant_01.jpg", + "rock_01.jpg", + "rock_02.jpg", + "sky_01.jpg", + "sky_02.jpg", + "sky_03.jpg", + "sky_04.jpg", + "wood_01.jpg", + }; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + o = elm_toolbar_add(win); + elm_toolbar_homogeneous_set(o, 0); + evas_object_size_hint_weight_set(o, 0.0, 0.0); + evas_object_size_hint_align_set(o, EVAS_HINT_FILL, 0.0); + tb_it = elm_toolbar_item_append(o, NULL, "Bogosity", NULL, NULL); + elm_toolbar_item_cursor_set(tb_it, ELM_CURSOR_BOGOSITY); + tb_it = elm_toolbar_item_append(o, NULL, "Unset", NULL, NULL); + elm_toolbar_item_cursor_set(tb_it, ELM_CURSOR_BOGOSITY); + elm_toolbar_item_cursor_unset(tb_it); + tb_it = elm_toolbar_item_append(o, NULL, "Xterm", NULL, NULL); + elm_toolbar_item_cursor_set(tb_it, ELM_CURSOR_XTERM); + elm_box_pack_end(bx, o); + evas_object_show(o); + + o = elm_list_add(win); + elm_box_pack_end(bx, o); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + lit = elm_list_item_append(o, "cursor bogosity", NULL, NULL, NULL, NULL); + elm_list_item_cursor_set(lit, ELM_CURSOR_BOGOSITY); + lit = elm_list_item_append(o, "cursor unset", NULL, NULL, NULL, NULL); + elm_list_item_cursor_set(lit, ELM_CURSOR_BOGOSITY); + elm_list_item_cursor_unset(lit); + lit = elm_list_item_append(o, "cursor xterm", NULL, NULL, NULL, NULL); + elm_list_item_cursor_set(lit, ELM_CURSOR_XTERM); + elm_list_go(o); + evas_object_show(o); + + gl = elm_genlist_add(win); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(gl); + + itct.item_style = "default"; + itct.func.text_get = glt_text_get; + + it1 = elm_genlist_item_append(gl, &itct, (void *) 1, NULL, + ELM_GENLIST_ITEM_SUBITEMS, NULL, NULL); + it2 = elm_genlist_item_append(gl, &itct, (void *) 2, NULL, + ELM_GENLIST_ITEM_SUBITEMS, NULL, NULL); + it3 = elm_genlist_item_append(gl, &itct, (void *) 3, NULL, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + + elm_genlist_item_cursor_set(it1, ELM_CURSOR_HAND1); + elm_genlist_item_cursor_set(it2, ELM_CURSOR_HAND1); + elm_genlist_item_cursor_set(it3, ELM_CURSOR_CROSS); + + evas_object_smart_callback_add(gl, "expand,request", glt_exp_req, gl); + evas_object_smart_callback_add(gl, "contract,request", glt_con_req, gl); + evas_object_smart_callback_add(gl, "expanded", glt_exp, gl); + evas_object_smart_callback_add(gl, "contracted", glt_con, gl); + + elm_box_pack_end(bx, gl); + + grid = elm_gengrid_add(win); + elm_gengrid_item_size_set(grid, 130, 130); + elm_gengrid_horizontal_set(grid, EINA_FALSE); + elm_gengrid_multi_select_set(grid, EINA_TRUE); + evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL); + + gic.item_style = "default"; + gic.func.text_get = grd_lbl_get; + gic.func.content_get = grd_content_get; + + n = 0; + for (i = 0; i < 3 * 3; i++) + { + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]); + n = (n + 1) % 9; + ti[i].mode = i; + ti[i].path = eina_stringshare_add(buf); + ti[i].item = elm_gengrid_item_append(grid, &gic, &(ti[i]), NULL, NULL); + if (n % 2) + elm_gengrid_item_cursor_set(ti[i].item, ELM_CURSOR_HAND1); + else + elm_gengrid_item_cursor_set(ti[i].item, ELM_CURSOR_CLOCK); + if (!(i % 5)) + elm_gengrid_item_selected_set(ti[i].item, EINA_TRUE); + } + elm_box_pack_end(bx, grid); + evas_object_show(grid); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} +TEST_END + +TEST_START(test_cursor3) +{ + Evas_Object *bg, *bx, *o; + Elm_List_Item *lit; + char buf[PATH_MAX]; + + snprintf(buf, sizeof(buf), "%s/objects/cursors.edj", elm_app_data_dir_get()); + elm_theme_extension_add(NULL, buf); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + o = elm_button_add(win); + elm_object_cursor_set(o, ELM_CURSOR_HAND1); + elm_object_cursor_engine_only_set(o, EINA_FALSE); + elm_object_text_set(o, "hand1"); + elm_box_pack_end(bx, o); + evas_object_show(o); + + o = elm_button_add(win); + elm_object_cursor_set(o, ELM_CURSOR_HAND2); + elm_object_text_set(o, "hand2 x"); + elm_box_pack_end(bx, o); + evas_object_show(o); + + o = elm_button_add(win); + elm_object_cursor_set(o, ELM_CURSOR_HAND2); + elm_object_cursor_engine_only_set(o, EINA_FALSE); + elm_object_text_set(o, "hand2"); + elm_box_pack_end(bx, o); + evas_object_show(o); + + o = elm_button_add(win); + elm_object_cursor_set(o, "hand3"); + elm_object_cursor_engine_only_set(o, EINA_FALSE); + elm_object_text_set(o, "hand3"); + elm_box_pack_end(bx, o); + evas_object_show(o); + + o = elm_button_add(win); + elm_object_cursor_set(o, "hand3"); + elm_object_cursor_engine_only_set(o, EINA_FALSE); + elm_object_cursor_style_set(o, "transparent"); + elm_object_text_set(o, "hand3 transparent"); + elm_box_pack_end(bx, o); + evas_object_show(o); + + o = elm_button_add(win); + elm_object_cursor_set(o, "hand3"); + elm_object_cursor_engine_only_set(o, EINA_FALSE); + elm_object_cursor_unset(o); + elm_object_text_set(o, "unset"); + elm_box_pack_end(bx, o); + evas_object_show(o); + + o = elm_button_add(win); + elm_object_cursor_set(o, "hand4"); + elm_object_text_set(o, "not existent"); + elm_box_pack_end(bx, o); + evas_object_show(o); + + elm_cursor_engine_only_set(0); + o = elm_button_add(win); + elm_object_cursor_set(o, "hand2"); + elm_object_text_set(o, "hand 2 engine only config false"); + elm_box_pack_end(bx, o); + evas_object_show(o); + + elm_cursor_engine_only_set(1); + o = elm_button_add(win); + elm_object_cursor_set(o, "hand2"); + elm_object_text_set(o, "hand 2 engine only config true"); + elm_box_pack_end(bx, o); + evas_object_show(o); + + o = elm_list_add(win); + elm_box_pack_end(bx, o); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + lit = elm_list_item_append(o, "cursor hand2 x", NULL, NULL, NULL, NULL); + elm_list_item_cursor_set(lit, ELM_CURSOR_HAND2); + lit = elm_list_item_append(o, "cursor hand2", NULL, NULL, NULL, NULL); + elm_list_item_cursor_set(lit, ELM_CURSOR_HAND2); + elm_list_item_cursor_engine_only_set(lit, EINA_FALSE); + lit = elm_list_item_append(o, "cursor hand3", NULL, NULL, NULL, NULL); + elm_list_item_cursor_set(lit, "hand3"); + elm_list_item_cursor_engine_only_set(lit, EINA_FALSE); + lit = elm_list_item_append(o, "cursor hand3 transparent", NULL, NULL, + NULL, NULL); + elm_list_item_cursor_set(lit, "hand3"); + elm_list_item_cursor_style_set(lit, "transparent"); + elm_list_item_cursor_engine_only_set(lit, EINA_FALSE); + elm_list_go(o); + evas_object_show(o); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} +TEST_END + +TEST_START(test_cursor4) +{ + Evas_Object *win, *bg, *bx, *ly, *bt; + char buf[PATH_MAX]; + + win = elm_win_add(NULL, "cursor layout", ELM_WIN_BASIC); + elm_win_title_set(win, "Cursor Layout"); + elm_win_autodel_set(win, EINA_TRUE); + + snprintf(buf, sizeof(buf), "%s/objects/cursors.edj", elm_app_data_dir_get()); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + ly = elm_layout_add(win); + elm_layout_file_set(ly, buf, "test/layout/events"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_cursor_set(ly, ELM_CURSOR_HAND1); + elm_box_pack_end(bx, ly); + evas_object_show(ly); + + ly = elm_layout_add(win); + elm_layout_file_set(ly, buf, "test/layout/noevents"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_cursor_set(ly, ELM_CURSOR_XTERM); + elm_layout_part_cursor_set(ly, "top-left", ELM_CURSOR_CROSS); + elm_layout_part_cursor_set(ly, "bottom-left", ELM_CURSOR_PIRATE); + elm_box_pack_end(bx, ly); + evas_object_show(ly); + + ly = elm_layout_add(win); + elm_layout_file_set(ly, buf, "test/layout/parts2"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_layout_part_cursor_set(ly, "top-left", ELM_CURSOR_CROSS); + elm_layout_part_cursor_set(ly, "bottom-left", ELM_CURSOR_PIRATE); + elm_layout_file_set(ly, buf, "test/layout/parts"); + elm_box_pack_end(bx, ly); + evas_object_show(ly); + + ly = elm_layout_add(win); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_layout_file_set(ly, buf, "test/layout/swallow"); + bt = elm_button_add(win); + elm_object_text_set(bt, "Cursor over obj"); + elm_object_part_content_set(ly, "swallow1", bt); + elm_object_cursor_set(bt, ELM_CURSOR_PIRATE); + bt = elm_button_add(win); + elm_object_text_set(bt, "Cursor over part"); + elm_object_part_content_set(ly, "swallow2", bt); + elm_layout_part_cursor_set(ly, "swallow2", ELM_CURSOR_PIRATE); + elm_box_pack_end(bx, ly); + evas_object_show(ly); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} +TEST_END \ No newline at end of file diff --git a/src/bin/test_diskselector.c b/src/bin/test_diskselector.c new file mode 100644 index 0000000..a513cef --- /dev/null +++ b/src/bin/test_diskselector.c @@ -0,0 +1,333 @@ +#include +#include +#include "tsuite.h" + +static void +_disk_sel(void *data __UNUSED__, Evas_Object * obj __UNUSED__, void *event_info) +{ + Elm_Diskselector_Item *it = event_info; + printf("Equinox: %s\n", elm_diskselector_item_label_get(it)); +} + +static void +_disk_next(void *data __UNUSED__, Evas_Object * obj __UNUSED__, void *event_info) +{ + Elm_Diskselector_Item *next, *prev, *it = event_info; + prev = elm_diskselector_item_prev_get(it); + next = elm_diskselector_item_next_get(it); + printf("Prev: %s, Next: %s\n", elm_diskselector_item_label_get(prev), + elm_diskselector_item_label_get(next)); +} + +static void +_print_disk_info_cb(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Elm_Diskselector_Item *it = event_info; + printf("Selected label: %s\n", elm_diskselector_item_label_get(it)); +} + +static Evas_Object * +_disk_create(Evas_Object *win, Eina_Bool round) +{ + Elm_Diskselector_Item *it; + Evas_Object *di; + + di = elm_diskselector_add(win); + + elm_diskselector_item_append(di, "January", NULL, NULL, NULL); + elm_diskselector_item_append(di, "February", NULL, _disk_next, NULL); + elm_diskselector_item_append(di, "March", NULL, _disk_sel, NULL); + elm_diskselector_item_append(di, "April", NULL, NULL, NULL); + elm_diskselector_item_append(di, "May", NULL, NULL, NULL); + elm_diskselector_item_append(di, "June", NULL, NULL, NULL); + elm_diskselector_item_append(di, "July", NULL, NULL, NULL); + it = elm_diskselector_item_append(di, "August", NULL, NULL, NULL); + elm_diskselector_item_append(di, "September", NULL, _disk_sel, NULL); + elm_diskselector_item_append(di, "October", NULL, NULL, NULL); + elm_diskselector_item_append(di, "November", NULL, NULL, NULL); + elm_diskselector_item_append(di, "December", NULL, NULL, NULL); + + elm_diskselector_item_selected_set(it, EINA_TRUE); + elm_diskselector_round_set(di, round); + + return di; +} + +enum _api_state +{ + SCROLLER_POLICY_SET_ON, + SCROLLER_POLICY_SET_OFF, + BOUNCE_SET, + ITEM_LABEL_SET, + TOOLTIP_TEXT_SET, + ITEM_TOOLTIP_UNSET, + ITEM_CURSOR_SET, + ITEM_CURSOR_UNSET, + ITEM_ICON_SET, + SELECTED_SET, + ITEM_PREV_GET, + ITEM_DEL_NOT_SELECTED, + ITEM_DEL, /* delete when selected */ + CLEAR, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + const Eina_List *disks = elm_box_children_get(api->data); + if(!eina_list_count(disks)) + return; + + switch(api->state) + { /* Put all api-changes under switch */ + case SCROLLER_POLICY_SET_ON: /* 0 */ + { /* Get first disk */ + Evas_Object *disk = eina_list_nth(disks, 0); + elm_diskselector_scroller_policy_set(disk, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON); + } + break; + + case SCROLLER_POLICY_SET_OFF: /* 1 */ + { /* Get first disk */ + Evas_Object *disk = eina_list_nth(disks, 0); + elm_diskselector_scroller_policy_set(disk, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + } + break; + + case BOUNCE_SET: /* 2 */ + { /* Get second disk, cancel bounce */ + Evas_Object *disk = eina_list_nth(disks, 1); + elm_diskselector_bounce_set(disk, EINA_FALSE, EINA_FALSE); + } + break; + + case ITEM_LABEL_SET: /* 3 */ + elm_diskselector_item_label_set(elm_diskselector_selected_item_get(eina_list_nth(disks, 0)), "Label from API"); + break; + + case TOOLTIP_TEXT_SET: /* 4 */ + elm_diskselector_item_tooltip_text_set(elm_diskselector_selected_item_get(eina_list_nth(disks, 0)), "Tooltip from API"); + break; + + case ITEM_TOOLTIP_UNSET: /* 5 */ + elm_diskselector_item_tooltip_unset(elm_diskselector_selected_item_get(eina_list_nth(disks, 0))); + break; + + case ITEM_CURSOR_SET: /* 6 */ + elm_diskselector_item_cursor_set(elm_diskselector_selected_item_get(eina_list_nth(disks, 0)), ELM_CURSOR_HAND2); + break; + + case ITEM_CURSOR_UNSET: /* 7 */ + elm_diskselector_item_cursor_unset(elm_diskselector_selected_item_get(eina_list_nth(disks, 0))); + break; + + case ITEM_ICON_SET: /* 8 */ + { /* Set icon of selected item in first disk */ + char buf[PATH_MAX]; + Evas_Object *ic = elm_icon_add(elm_object_parent_widget_get(eina_list_nth(disks, 0))); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_diskselector_item_icon_set(elm_diskselector_selected_item_get(eina_list_nth(disks, 0)), ic); + evas_object_show(ic); + } + break; + + case SELECTED_SET: /* 9 */ + { /* Select NEXT item of first disk */ + elm_diskselector_item_selected_set(elm_diskselector_item_next_get(elm_diskselector_selected_item_get(eina_list_nth(disks, 0))), EINA_TRUE); + } + break; + + case ITEM_PREV_GET: /* 10 */ + { /* Select PREV item of first disk */ + elm_diskselector_item_selected_set(elm_diskselector_item_prev_get(elm_diskselector_selected_item_get(eina_list_nth(disks, 0))), EINA_TRUE); + } + break; + + case ITEM_DEL_NOT_SELECTED: /* 11 */ + { /* Remove selected item of first disk */ + elm_diskselector_item_del(elm_diskselector_item_prev_get(elm_diskselector_selected_item_get(eina_list_nth(disks, 0)))); + } + break; + + case ITEM_DEL: /* 12 */ + { /* Remove selected item of first disk */ + elm_diskselector_item_del(elm_diskselector_selected_item_get(eina_list_nth(disks, 0))); + } + break; + + case CLEAR: /* 13 */ + elm_diskselector_clear(eina_list_nth(disks, 0)); + break; + + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(a->bt, str); + elm_object_disabled_set(a->bt, a->state == API_STATE_LAST); +} + +TEST_START(test_diskselector) +{ + Evas_Object *bg, *bx, *bxx, *disk, *ic; + Elm_Diskselector_Item *it; + char buf[PATH_MAX]; + int idx = 0; + + char *month_list[] = { + "Jan", "Feb", "Mar", + "Apr", "May", "Jun", + "Jul", "Aug", "Sep", + "Oct", "Nov", "Dec" + }; + char date[3]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(bg); + + bxx = elm_box_add(win); + elm_win_resize_object_add(win, bxx); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bxx); + + bx = elm_box_add(win); + elm_win_resize_object_add(win, bx); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + api->data = bx; + evas_object_show(bx); + + api->bt = elm_button_add(win); + elm_object_text_set(api->bt, "Next API function"); + evas_object_smart_callback_add(api->bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, api->bt); + elm_object_disabled_set(api->bt, api->state == API_STATE_LAST); + evas_object_show(api->bt); + + elm_box_pack_end(bxx, bx); + + disk = _disk_create(win, EINA_TRUE); + evas_object_size_hint_weight_set(disk, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(disk, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, disk); + evas_object_show(disk); + evas_object_smart_callback_add(disk, "selected", _print_disk_info_cb, NULL); + it = elm_diskselector_selected_item_get(disk); + elm_diskselector_item_selected_set(it, EINA_FALSE); + + disk = _disk_create(win, EINA_FALSE); + evas_object_size_hint_weight_set(disk, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(disk, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, disk); + evas_object_show(disk); + evas_object_smart_callback_add(disk, "selected", _print_disk_info_cb, NULL); + it = elm_diskselector_first_item_get(disk); + it = elm_diskselector_item_next_get(it); + elm_diskselector_item_selected_set(it, EINA_TRUE); + + disk = _disk_create(win, EINA_FALSE); + evas_object_size_hint_weight_set(disk, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(disk, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, disk); + evas_object_show(disk); + evas_object_smart_callback_add(disk, "selected", _print_disk_info_cb, NULL); + elm_diskselector_side_label_length_set(disk, 4); + + disk = elm_diskselector_add(win); + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 1, 1); + elm_diskselector_item_append(disk, "Sunday", ic, NULL, NULL); + elm_diskselector_item_append(disk, "Monday", NULL, NULL, NULL); + elm_diskselector_item_append(disk, "Tuesday", NULL, NULL, NULL); + elm_diskselector_item_append(disk, "Wednesday", NULL, NULL, NULL); + elm_diskselector_item_append(disk, "Thursday", NULL, NULL, NULL); + elm_diskselector_item_append(disk, "Friday", NULL, NULL, NULL); + elm_diskselector_item_append(disk, "Saturday", NULL, NULL, NULL); + elm_diskselector_round_set(disk, EINA_TRUE); + evas_object_size_hint_weight_set(disk, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(disk, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, disk); + evas_object_show(disk); + evas_object_smart_callback_add(disk, "selected", _print_disk_info_cb, NULL); + + disk = elm_diskselector_add(win); + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 1, 1); + elm_diskselector_item_append(disk, "머리스타일", ic, NULL, NULL); + elm_diskselector_item_append(disk, "プロが伝授する", NULL, NULL, NULL); + elm_diskselector_item_append(disk, "生上访要求政府", NULL, NULL, NULL); + elm_diskselector_item_append(disk, "English", NULL, NULL, NULL); + elm_diskselector_item_append(disk, "والشريعة", NULL, NULL, NULL); + elm_diskselector_item_append(disk, "עִבְרִית", NULL, NULL, NULL); + elm_diskselector_item_append(disk, "Grüßen", NULL, NULL, NULL); + elm_diskselector_round_set(disk, EINA_TRUE); + evas_object_size_hint_weight_set(disk, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(disk, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, disk); + evas_object_show(disk); + evas_object_smart_callback_add(disk, "selected", _print_disk_info_cb, NULL); + + // displayed item number setting example + disk = elm_diskselector_add(win); + elm_diskselector_display_item_num_set(disk, 5); + printf("Number of Items in DiskSelector : %d\n", elm_diskselector_display_item_num_get(disk)); + + for (idx = 0; idx < (int)(sizeof(month_list) / sizeof(month_list[0])); idx++) + { + it = elm_diskselector_item_append(disk, month_list[idx], NULL, NULL, NULL); + } + + elm_diskselector_item_selected_set(it, EINA_TRUE); + elm_diskselector_round_set(disk, EINA_TRUE); + evas_object_size_hint_weight_set(disk, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(disk, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, disk); + evas_object_show(disk); + evas_object_smart_callback_add(disk, "selected", _print_disk_info_cb, NULL); + + // displayed item number setting example + disk = elm_diskselector_add(win); + elm_diskselector_display_item_num_set(disk, 7); + printf("Number of Items in DiskSelector : %d\n", elm_diskselector_display_item_num_get(disk)); + + for (idx = 1; idx < 31; idx++) + { + snprintf(date, sizeof(date), "%d", idx); + it = elm_diskselector_item_append(disk, date, NULL, NULL, NULL); + } + + elm_diskselector_item_selected_set(it, EINA_TRUE); + elm_diskselector_round_set(disk, EINA_TRUE); + evas_object_size_hint_weight_set(disk, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(disk, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, disk); + evas_object_show(disk); + evas_object_smart_callback_add(disk, "selected", _print_disk_info_cb, NULL); + + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_entry.c b/src/bin/test_entry.c new file mode 100644 index 0000000..501805a --- /dev/null +++ b/src/bin/test_entry.c @@ -0,0 +1,1673 @@ +#include +#include "tsuite.h" + +static void +my_entry_bt_1(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + elm_entry_entry_set(en, ""); +} + +static void +my_entry_bt_2(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + const char *s = elm_entry_entry_get(en); + printf("ENTRY:\n"); + if (s) printf("%s\n", s); + printf("ENTRY PLAIN UTF8:\n"); + if (s) + { + s = elm_entry_markup_to_utf8(s); + if (s) + { + printf("%s\n", s); + free((char *)s); + } + } +} + +static void +my_entry_bt_3(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + const char *s = elm_entry_selection_get(en); + printf("SELECTION:\n"); + if (s) printf("%s\n", s); + printf("SELECTION PLAIN UTF8:\n"); + if (s) + { + s = elm_entry_markup_to_utf8(s); + if (s) + { + printf("%s\n", s); + free((char *)s); + } + } +} + +static void +my_entry_bt_4(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + elm_entry_entry_insert(en, "Insert some BOLD text"); +} + +static void +my_entry_bt_5(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + elm_entry_scrollable_set(en, !elm_entry_scrollable_get(en)); +} + +static void +my_entry_bt_6(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + static Elm_Wrap_Type wr = ELM_WRAP_NONE; + + wr++; + if (wr == ELM_WRAP_LAST) wr = ELM_WRAP_NONE; + printf("wr: %i\n", wr); + elm_entry_line_wrap_set(en, wr); +} + +TEST_START(test_entry) +{ + Evas_Object *bg, *bx, *bx2, *bt, *en; + char buf[4096]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + en = elm_entry_add(win); + elm_entry_line_wrap_set(en, ELM_WRAP_NONE); + snprintf(buf, sizeof(buf), + "This is an entry widget in this window that
" + "uses markup like this for styling and
" + "formatting like this, as well as
" + "links in the text, so enter text
" + "in here to edit it. By the way, links are
" + "called Anchors so you will need
" + "to refer to them this way.
" + "
" + + "Also you can stick in items with (relsize + ascent): " + "" + " (full) " + "" + " (to the left)
" + + "Also (size + ascent): " + "" + " (full) " + "" + " (before this)
" + + "And as well (absize + ascent): " + "" + " (full) " + "" + " or even paths to image files on disk too like: " + "" + " ... end." + , elm_app_data_dir_get() + ); + elm_entry_entry_set(en, buf); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, en); + evas_object_show(en); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Clr"); + evas_object_smart_callback_add(bt, "clicked", my_entry_bt_1, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Prnt"); + evas_object_smart_callback_add(bt, "clicked", my_entry_bt_2, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Sel"); + evas_object_smart_callback_add(bt, "clicked", my_entry_bt_3, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Ins"); + evas_object_smart_callback_add(bt, "clicked", my_entry_bt_4, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Scrl"); + evas_object_smart_callback_add(bt, "clicked", my_entry_bt_5, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Wr"); + evas_object_smart_callback_add(bt, "clicked", my_entry_bt_6, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + elm_object_focus_set(en, EINA_TRUE); + evas_object_show(win); +} +TEST_END + +static void +my_scrolled_entry_bt_1(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + elm_entry_entry_set(en, ""); +} + +static void +my_scrolled_entry_bt_2(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + const char *s = elm_entry_entry_get(en); + printf("ENTRY:\n"); + if (s) printf("%s\n", s); + printf("ENTRY PLAIN UTF8:\n"); + if (s) + { + s = elm_entry_markup_to_utf8(s); + if (s) + { + printf("%s\n", s); + free((char *)s); + } + } +} + +static void +my_scrolled_entry_bt_3(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + const char *s = elm_entry_selection_get(en); + printf("SELECTION:\n"); + if (s) printf("%s\n", s); + printf("SELECTION PLAIN UTF8:\n"); + if (s) + { + s = elm_entry_markup_to_utf8(s); + if (s) + { + printf("%s\n", s); + free((char *)s); + } + } +} + +static void +my_scrolled_entry_bt_4(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + elm_entry_entry_insert(en, "Insert some BOLD text"); +} + +static void +my_scrolled_entry_bt_5(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + const char *s = elm_entry_entry_get(en); + printf("PASSWORD: '%s'\n", s ? s : ""); +} + +static void +scrolled_anchor_test(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + elm_entry_entry_insert(en, "ANCHOR CLICKED"); +} + +TEST_START(test_entry_scrolled) +{ + Evas_Object *bg, *bx, *bx2, *bt, *en, *en_p, *sp; + static Elm_Entry_Filter_Accept_Set digits_filter_data, digits_filter_data2; + static Elm_Entry_Filter_Limit_Size limit_filter_data, limit_filter_data2; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + /* disabled entry */ + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_entry_set(en, "Disabled entry"); + elm_entry_single_line_set(en, 1); + elm_object_disabled_set(en, 1); + evas_object_show(en); + elm_box_pack_end(bx, en); + + /* password entry */ + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_password_set(en, 1); + elm_entry_single_line_set(en, 1); + elm_entry_entry_set(en, "Access denied, give up!"); + elm_object_disabled_set(en, 1); + evas_object_show(en); + elm_box_pack_end(bx, en); + + /* multi-line disable entry */ + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON); + elm_object_disabled_set(en, 1); + elm_entry_context_menu_item_add(en, "Hello", NULL, ELM_ICON_NONE, NULL, NULL); + elm_entry_context_menu_item_add(en, "World", NULL, ELM_ICON_NONE, NULL, NULL); + elm_entry_entry_set(en, + "Multi-line disabled entry widget :)
" + "We can use markup like this for styling and
" + "formatting like this, as well as
" + "links in the text," + "but it won't be editable or clickable."); + evas_object_show(en); + elm_box_pack_end(bx, en); + + sp = elm_separator_add(win); + elm_separator_horizontal_set(sp, 1); + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + /* Single line selected entry */ + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_entry_entry_set(en, "This is a single line"); + elm_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_single_line_set(en, 1); + elm_entry_select_all(en); + evas_object_show(en); + elm_box_pack_end(bx, en); + + /* Only digits entry */ + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_entry_entry_set(en, "01234"); + elm_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_single_line_set(en, 1); + evas_object_show(en); + elm_box_pack_end(bx, en); + + digits_filter_data.accepted = "0123456789"; + digits_filter_data.rejected = NULL; + elm_entry_text_filter_append(en, elm_entry_filter_accept_set, &digits_filter_data); + + /* No digits entry */ + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_entry_entry_set(en, "No numbers here"); + elm_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_single_line_set(en, 1); + evas_object_show(en); + elm_box_pack_end(bx, en); + + digits_filter_data2.accepted = NULL; + digits_filter_data2.rejected = "0123456789"; + elm_entry_text_filter_append(en, elm_entry_filter_accept_set, &digits_filter_data2); + + /* Size limited entry */ + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_entry_entry_set(en, "Just 20 chars"); + elm_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_single_line_set(en, 1); + evas_object_show(en); + elm_box_pack_end(bx, en); + + limit_filter_data.max_char_count = 20; + limit_filter_data.max_byte_count = 0; + elm_entry_text_filter_append(en, elm_entry_filter_limit_size, &limit_filter_data); + + /* Byte size limited entry */ + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_entry_entry_set(en, "And now only 30 bytes"); + elm_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_single_line_set(en, 1); + evas_object_show(en); + elm_box_pack_end(bx, en); + + limit_filter_data2.max_char_count = 0; + limit_filter_data2.max_byte_count = 30; + elm_entry_text_filter_append(en, elm_entry_filter_limit_size, &limit_filter_data2); + + /* Single line password entry */ + en_p = elm_entry_add(win); + elm_entry_scrollable_set(en_p, EINA_TRUE); + evas_object_size_hint_weight_set(en_p, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en_p, EVAS_HINT_FILL, 0.5); + elm_entry_scrollbar_policy_set(en_p, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_entry_set(en_p, "Password here"); + elm_entry_single_line_set(en_p, 1); + elm_entry_password_set(en_p, 1); + evas_object_show(en_p); + elm_box_pack_end(bx, en_p); + + /* scrolled entry with icon/end widgets*/ + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_single_line_set(en, 1); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + bt = elm_icon_add(win); + elm_icon_standard_set(bt, "home"); + evas_object_size_hint_min_set(bt, 48, 48); + evas_object_color_set(bt, 255, 0, 0, 128); + evas_object_show(bt); + elm_entry_icon_set(en, bt); + bt = elm_icon_add(win); + elm_icon_standard_set(bt, "delete"); + evas_object_color_set(bt, 255, 0, 0, 128); + evas_object_size_hint_min_set(bt, 48, 48); + evas_object_show(bt); + elm_entry_end_set(en, bt); + elm_entry_entry_set(en, "scrolled entry with icon and end objects"); + evas_object_show(en); + elm_box_pack_end(bx, en); + + /* markup scrolled entry */ + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON); + elm_entry_entry_set(en, + "This is an entry widget in this window that
" + "uses markup like this for styling and
" + "formatting like this, as well as
" + "links in the text, so enter text
" + "in here to edit it. By them way, links are
" + "called Anchors so you will need
" + "to refer to them this way. At the end here is a really long " + "line to test line wrapping to see if it works. But just in " + "case this line is not long enough I will add more here to " + "really test it out, as Elementary really needs some " + "good testing to see if entry widgets work as advertised."); + evas_object_smart_callback_add(en, "anchor,clicked", scrolled_anchor_test, en); + evas_object_show(en); + elm_box_pack_end(bx, en); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Clear"); + evas_object_smart_callback_add(bt, "clicked", my_scrolled_entry_bt_1, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Print"); + evas_object_smart_callback_add(bt, "clicked", my_scrolled_entry_bt_2, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Print pwd"); + evas_object_smart_callback_add(bt, "clicked", my_scrolled_entry_bt_5, en_p); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Selection"); + evas_object_smart_callback_add(bt, "clicked", my_scrolled_entry_bt_3, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Insert"); + evas_object_smart_callback_add(bt, "clicked", my_scrolled_entry_bt_4, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 320, 300); + + elm_object_focus_set(win, EINA_TRUE); + evas_object_show(win); +} +TEST_END + +static void +my_ent_bt_clr(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + elm_entry_entry_set(en, ""); +} + +static void +my_ent_bt_pri(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + const char *s = elm_entry_entry_get(en); + printf("ENTRY:\n"); + if (s) printf("%s\n", s); + printf("ENTRY PLAIN UTF8:\n"); + if (s) + { + s = elm_entry_markup_to_utf8(s); + if (s) + { + printf("%s\n", s); + free((char *)s); + } + } +} + +static void +my_ent_bt_sel(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + const char *s = elm_entry_selection_get(en); + printf("SELECTION:\n"); + if (s) printf("%s\n", s); + printf("SELECTION PLAIN UTF8:\n"); + if (s) + { + s = elm_entry_markup_to_utf8(s); + if (s) + { + printf("%s\n", s); + free((char *)s); + } + } +} + +static void +my_ent_bt_all(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + elm_entry_select_all(en); +} + +static void +my_ent_bt_non(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + elm_entry_select_none(en); +} + +static void +my_ent_bt_ins(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + elm_entry_entry_insert(en, "Insert text"); +} + +static void +my_ent_bt_lef(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + elm_entry_cursor_prev(en); +} + +static void +my_ent_bt_rig(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + elm_entry_cursor_next(en); +} + +static void +my_ent_bt_up_(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + elm_entry_cursor_up(en); +} + +static void +my_ent_bt_dow(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + elm_entry_cursor_down(en); +} + +static void +my_ent_bt_beg(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + elm_entry_cursor_begin_set(en); +} + +static void +my_ent_bt_end(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + elm_entry_cursor_end_set(en); +} + +static void +my_ent_bt_lbe(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + elm_entry_cursor_line_begin_set(en); +} + +static void +my_ent_bt_len(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + elm_entry_cursor_line_end_set(en); +} + +static void +my_ent_bt_sbe(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + elm_entry_cursor_selection_begin(en); +} + +static void +my_ent_bt_sen(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + elm_entry_cursor_selection_end(en); +} + +static void +my_ent_bt_fmt(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + printf("IS FORMAT: %i\n", + (int)elm_entry_cursor_is_format_get(en)); +} + +static void +my_ent_bt_vfm(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + printf("IS VISIBLE FORMAT %i\n", + (int)elm_entry_cursor_is_visible_format_get(en)); +} + +static void +my_ent_bt_chr(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + printf("CHAR '%s'\n", elm_entry_cursor_content_get(en)); +} + +static void +my_ent_bt_cut(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + elm_entry_selection_cut(en); +} + +static void +my_ent_bt_cop(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + elm_entry_selection_copy(en); +} + +static void +my_ent_bt_pas(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + elm_entry_selection_paste(en); +} + +TEST_START(test_entry3) +{ + Evas_Object *bg, *bx, *bx2, *bt, *en; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + /* Single line selected entry */ + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_entry_set(en, "This is a single line"); + elm_entry_single_line_set(en, 1); + elm_box_pack_end(bx, en); + evas_object_show(en); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Clr"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_clr, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Pri"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_pri, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Sel"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sel, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "All"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_all, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Non"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_non, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Ins"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_ins, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Lef"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_lef, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Rig"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_rig, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Up "); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_up_, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Dow"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_dow, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Beg"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_beg, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "End"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_end, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "LBe"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_lbe, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "LEn"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_len, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "SBe"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sbe, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "SEn"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sen, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Fmt"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_fmt, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "VFm"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_vfm, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Chr"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_chr, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Cut"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_cut, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Cop"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_cop, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Pas"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_pas, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + /* markup scrolled entry */ + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_entry_entry_set(en, + "This is an entry widget in this window that
" + "uses markup like this for styling and
" + "formatting like this, as well as
" + "links in the text, so enter text
" + "in here to edit it. By them way, links are
" + "called Anchors so you will need
" + "to refer to them this way. At the end here is a really long " + "line to test line wrapping to see if it works. But just in " + "case this line is not long enough I will add more here to " + "really test it out, as Elementary really needs some " + "good testing to see if entry widgets work as advertised." + ); + evas_object_smart_callback_add(en, "anchor,clicked", scrolled_anchor_test, en); + elm_box_pack_end(bx, en); + evas_object_show(en); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Clr"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_clr, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Pri"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_pri, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Sel"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sel, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "All"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_all, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Non"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_non, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Ins"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_ins, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Lef"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_lef, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Rig"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_rig, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Up "); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_up_, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Dow"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_dow, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Beg"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_beg, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "End"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_end, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "LBe"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_lbe, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "LEn"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_len, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "SBe"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sbe, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "SEn"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sen, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Fmt"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_fmt, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "VFm"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_vfm, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Chr"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_chr, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Cut"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_cut, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Cop"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_cop, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Pas"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_pas, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 320, 480); + + elm_object_focus_set(win, EINA_TRUE); + evas_object_show(win); +} +TEST_END + +TEST_START(test_entry4) +{ + Evas_Object *bg, *ly, *en; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + ly = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "layout"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, ly); + evas_object_show(ly); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_entry_set(en, "This is a single line"); + elm_entry_single_line_set(en, 1); + elm_object_part_content_set(ly, "element1", en); + evas_object_show(en); + + en = elm_entry_add(win); + elm_entry_line_wrap_set(en, ELM_WRAP_NONE); + elm_entry_entry_set(en, + "This is an entry widget
" + "that uses markup
" + "like this and has
" + "no scroller, so you can
" + "use it more flexibly."); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_part_content_set(ly, "element2", en); + evas_object_show(en); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_entry_entry_set(en, + "This is an entry widget in this window that
" + "uses markup like this for styling and
" + "formatting like this, as well as
" + "links in the text, so enter text
" + "in here to edit it. By them way, links are
" + "called Anchors so you will need
" + "to refer to them this way. At the end here is a really long " + "line to test line wrapping to see if it works. But just in " + "case this line is not long enough I will add more here to " + "really test it out, as Elementary really needs some " + "good testing to see if entry widgets work as advertised." + ); + evas_object_smart_callback_add(en, "anchor,clicked", scrolled_anchor_test, en); + elm_object_part_content_set(ly, "element3", en); + evas_object_show(en); + + evas_object_show(win); +} +TEST_END + +TEST_START(test_entry5) +{ + Evas_Object *bg, *bx, *bx2, *bt, *en; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_line_wrap_set(en, ELM_WRAP_CHAR); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_entry_entry_set(en, + "This is an entry widget in this window that " + "uses markup like this for styling and " + "formatting like this, as well as " + "to refer to them this way. At the end here is a really long " + "line to test line wrapping to see if it works. But just in " + "case this line is not long enough I will add more here to " + "really test it out, as Elementary really needs some " + "good testing to see if entry widgets work as advertised." + ); + evas_object_smart_callback_add(en, "anchor,clicked", scrolled_anchor_test, en); + elm_box_pack_end(bx, en); + evas_object_show(en); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Clr"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_clr, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Pri"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_pri, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Sel"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sel, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "All"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_all, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Non"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_non, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Ins"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_ins, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Lef"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_lef, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Rig"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_rig, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Up "); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_up_, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Dow"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_dow, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Beg"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_beg, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "End"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_end, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "LBe"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_lbe, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "LEn"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_len, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "SBe"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sbe, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "SEn"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_sen, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Fmt"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_fmt, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "VFm"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_vfm, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Chr"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_chr, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Cut"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_cut, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Cop"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_cop, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Pas"); + evas_object_smart_callback_add(bt, "clicked", my_ent_bt_pas, en); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_propagate_events_set(bt, 0); + elm_object_focus_allow_set(bt, 0); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 320, 480); + + elm_object_focus_set(win, EINA_TRUE); + evas_object_show(win); +} +TEST_END + +static void +_scrolled_entry_clear(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *en = data; + elm_entry_entry_set(en, ""); +} + +TEST_START(test_entry_notepad) +{ + Evas_Object *bg, *bx, *bx2, *bt, *np; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + np = elm_entry_add(win); + elm_entry_scrollable_set(np, EINA_TRUE); + elm_entry_file_set(np, "note.txt", ELM_TEXT_FORMAT_PLAIN_UTF8); + evas_object_size_hint_weight_set(np, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(np, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, np); + evas_object_show(np); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Clear"); + evas_object_smart_callback_add(bt, "clicked", _scrolled_entry_clear, np); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 320, 300); + + elm_object_focus_set(win, EINA_TRUE); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_fileselector.c b/src/bin/test_fileselector.c new file mode 100644 index 0000000..61adb7c --- /dev/null +++ b/src/bin/test_fileselector.c @@ -0,0 +1,281 @@ +#include +#include "tsuite.h" + +static void +my_fileselector_done(void *data __UNUSED__, + Evas_Object *obj __UNUSED__, + void *event_info) +{ + /* event_info conatin the full path of the selected file + * or NULL if none is selected or cancel is pressed */ + const char *selected = event_info; + + if (selected) + printf("Selected file: %s\n", selected); +/* else test window deleted in tsuite_cleanup + evas_object_del(data); delete the test window */ +} + +static void +my_fileselector_selected(void *data __UNUSED__, + Evas_Object *obj, + void *event_info) +{ + /* event_info conatin the full path of the selected file */ + const char *selected = event_info; + printf("Selected file: %s\n", selected); + + /* or you can query the selection */ + printf("or: %s\n", elm_fileselector_selected_get(obj)); +} + +static void +_is_save_clicked(void *data, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + Evas_Object *fs = data; + printf("Toggle Is save\n"); + if (elm_fileselector_is_save_get(fs)) + elm_fileselector_is_save_set(fs, EINA_FALSE); + else + elm_fileselector_is_save_set(fs, EINA_TRUE); +} + +static void +_folder_only_clicked(void *data, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + Evas_Object *fs = data; + printf("Toggle Folder only\n"); + if (elm_fileselector_folder_only_get(fs)) + elm_fileselector_folder_only_set(fs, EINA_FALSE); + else + elm_fileselector_folder_only_set(fs, EINA_TRUE); +} + +static void +_expandable_clicked(void *data, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + Evas_Object *fs = data; + printf("Toggle Expandable\n"); + if (elm_fileselector_expandable_get(fs)) + elm_fileselector_expandable_set(fs, EINA_FALSE); + else + elm_fileselector_expandable_set(fs, EINA_TRUE); +} + +static void +_sel_get_clicked(void *data, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + Evas_Object *fs = data; + printf("Get Selected: %s\n", elm_fileselector_selected_get(fs)); +} + +static void +_path_get_clicked(void *data, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + Evas_Object *fs = data; + printf("Get Path: %s\n", elm_fileselector_path_get(fs)); +} + +static void +_mode_cycle_clicked(void *data, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + Evas_Object *fs = data; + Elm_Fileselector_Mode mode; + + mode = (elm_fileselector_mode_get(fs) + 1) % ELM_FILESELECTOR_LAST; + elm_fileselector_mode_set(fs, mode); + + printf("Setting mode to: %d\n", mode); +} + +enum _api_state +{ + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + const Eina_List *items = elm_box_children_get(api->data); + if(!eina_list_count(items)) + return; + + /* Get first item of list of vbox children + Evas_Object *fs_bt = eina_list_nth(items, 0); */ + + /* use elm_box_children_get() to get list of children */ + switch(api->state) + { /* Put all api-changes under switch */ + case API_STATE_LAST: + + break; + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(a->bt, str); + elm_object_disabled_set(a->bt, a->state == API_STATE_LAST); +} + +static void +create_dir_struct(void) +{ + FILE *fp; + mkdir("/tmp/test_fs_bt", S_IRWXU); + fp = fopen("/tmp/test_fs_bt/a_file.txt", "w"); + if (fp) fclose(fp); + fp = fopen("/tmp/test_fs_bt/k_file.txt", "w"); + if (fp) fclose(fp); + fp = fopen("/tmp/test_fs_bt/m_file.txt", "w"); + if (fp) fclose(fp); + + mkdir("/tmp/test_fs_bt/a_subdir", S_IRWXU); + fp = fopen("/tmp/test_fs_bt/a_subdir/d_sub_file.txt", "w"); + if (fp) fclose(fp); + fp = fopen("/tmp/test_fs_bt/a_subdir/j_sub_file.txt", "w"); + if (fp) fclose(fp); +} + +TEST_START(test_fileselector) +{ + Evas_Object *fs, *bg, *vbox, *hbox, *bxx, *bt, *sep; + + /* Set the locale according to the system pref. + * If you dont do so the file selector will order the files list in + * a case sensitive manner + */ + setlocale(LC_ALL, ""); + + elm_need_ethumb(); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bxx = elm_box_add(win); + elm_win_resize_object_add(win, bxx); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bxx); + + vbox = elm_box_add(win); + api->data = vbox; +// elm_win_resize_object_add(win, vbox); + evas_object_size_hint_align_set(vbox, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(vbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(vbox); + + api->bt = elm_button_add(win); + elm_object_text_set(api->bt, "Next API function"); + evas_object_smart_callback_add(api->bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, api->bt); + elm_object_disabled_set(api->bt, api->state == API_STATE_LAST); + evas_object_show(api->bt); + + elm_box_pack_end(bxx, vbox); + + create_dir_struct(); /* Create a dir struct in /tmp */ + + fs = elm_fileselector_add(win); + /* enable the fs file name entry */ + elm_fileselector_is_save_set(fs, EINA_TRUE); + /* make the file list a tree with dir expandable in place */ + elm_fileselector_expandable_set(fs, EINA_FALSE); + /* start the fileselector in the test dir */ + elm_fileselector_path_set(fs, "/tmp/test_fs_bt"); + /* allow fs to expand in x & y */ + evas_object_size_hint_weight_set(fs, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fs, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(vbox, fs); + evas_object_show(fs); // TODO fix this is the widget + + /* the 'done' cb is called when the user press ok/cancel */ + evas_object_smart_callback_add(fs, "done", my_fileselector_done, win); + /* the 'selected' cb is called when the user click on a file/dir */ + evas_object_smart_callback_add(fs, "selected", my_fileselector_selected, + win); + + /* test buttons */ + sep = elm_separator_add(win); + elm_separator_horizontal_set(sep, EINA_TRUE); + elm_box_pack_end(vbox, sep); + evas_object_show(sep); + + hbox = elm_box_add(win); + elm_box_horizontal_set(hbox, EINA_TRUE); + elm_box_pack_end(vbox, hbox); + evas_object_show(hbox); + + bt = elm_check_add(win); + elm_object_text_set(bt, "is save"); + elm_check_state_set(bt, elm_fileselector_is_save_get(fs)); + evas_object_smart_callback_add(bt, "changed", _is_save_clicked, fs); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + bt = elm_check_add(win); + elm_object_text_set(bt, "folder only"); + elm_check_state_set(bt, elm_fileselector_folder_only_get(fs)); + evas_object_smart_callback_add(bt, "changed", _folder_only_clicked, fs); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + bt = elm_check_add(win); + elm_object_text_set(bt, "expandable"); + elm_check_state_set(bt, elm_fileselector_expandable_get(fs)); + evas_object_smart_callback_add(bt, "changed", _expandable_clicked, fs); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + hbox = elm_box_add(win); + elm_box_horizontal_set(hbox, EINA_TRUE); + elm_box_pack_end(vbox, hbox); + evas_object_show(hbox); + + bt = elm_button_add(win); + elm_object_text_set(bt, "selected get"); + evas_object_smart_callback_add(bt, "clicked", _sel_get_clicked, fs); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "path get"); + evas_object_smart_callback_add(bt, "clicked", _path_get_clicked, fs); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "mode cycle"); + evas_object_smart_callback_add(bt, "clicked", _mode_cycle_clicked, fs); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + evas_object_resize(win, 240, 400); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_fileselector_button.c b/src/bin/test_fileselector_button.c new file mode 100644 index 0000000..94584ad --- /dev/null +++ b/src/bin/test_fileselector_button.c @@ -0,0 +1,227 @@ +#include +#include "tsuite.h" + +static void +_file_chosen(void *data, + Evas_Object *obj __UNUSED__, + void *event_info) +{ + Evas_Object *entry = data; + const char *file = event_info; + if (file) + { + elm_entry_entry_set(entry, file); + printf("File chosen: %s\n", file); + } + else + printf("File selection canceled.\n"); +} + +static void +_inwin_mode_toggle(void *data, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + Evas_Object *fs_bt = data; + Eina_Bool value = elm_fileselector_button_inwin_mode_get(fs_bt); + elm_fileselector_button_inwin_mode_set(fs_bt, !value); + printf("Inwin mode set to: %s\n", value ? "false" : "true"); +} + +static void +_current_sel_toggle(void *data, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + Evas_Object *fs_bt = data; + Eina_Bool value = elm_fileselector_button_is_save_get(fs_bt); + elm_fileselector_button_is_save_set(fs_bt, !value); + printf("Current selection editable entry set to: %s\n", + value ? "false" : "true"); +} + +static void +_folder_only_toggle(void *data, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + Evas_Object *fs_bt = data; + Eina_Bool value = elm_fileselector_button_folder_only_get(fs_bt); + elm_fileselector_button_folder_only_set(fs_bt, !value); + printf("Folder only flag set to: %s\n", value ? "false" : "true"); +} + +static void +_expandable_toggle(void *data, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + Evas_Object *fs_bt = data; + Eina_Bool value = elm_fileselector_button_expandable_get(fs_bt); + elm_fileselector_button_expandable_set(fs_bt, !value); + printf("Expandable flag set to: %s\n", value ? "false" : "true"); +} + +enum _api_state +{ + ICON_UNSET, + WINDOW_TITLE_SET, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + const Eina_List *items = elm_box_children_get(api->data); + if(!eina_list_count(items)) + return; + + /* Get first item of list of vbox children */ + Evas_Object *fs_bt = eina_list_nth(items, 0); + + /* use elm_box_children_get() to get list of children */ + switch(api->state) + { /* Put all api-changes under switch */ + case ICON_UNSET: + elm_fileselector_button_icon_unset(fs_bt); + break; + + case WINDOW_TITLE_SET: + elm_fileselector_button_window_title_set(fs_bt, "Custom title from API"); + break; + + case API_STATE_LAST: + + break; + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(a->bt, str); + elm_object_disabled_set(a->bt, a->state == API_STATE_LAST); +} + +static void +create_dir_struct(void) +{ + FILE *fp; + mkdir("/tmp/test_fs_bt", S_IRWXU); + fp = fopen("/tmp/test_fs_bt/a_file.txt", "w"); + if (fp) fclose(fp); + fp = fopen("/tmp/test_fs_bt/k_file.txt", "w"); + if (fp) fclose(fp); + fp = fopen("/tmp/test_fs_bt/m_file.txt", "w"); + if (fp) fclose(fp); + + mkdir("/tmp/test_fs_bt/a_subdir", S_IRWXU); + fp = fopen("/tmp/test_fs_bt/a_subdir/d_sub_file.txt", "w"); + if (fp) fclose(fp); + fp = fopen("/tmp/test_fs_bt/a_subdir/j_sub_file.txt", "w"); + if (fp) fclose(fp); +} + +TEST_START(test_fileselector_button) +{ + Evas_Object *bg, *vbox, *hbox, *bxx, *ic, *bt, *fs_bt, *en, *lb; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bxx = elm_box_add(win); + elm_win_resize_object_add(win, bxx); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bxx); + + vbox = elm_box_add(win); + api->data = vbox; + evas_object_show(vbox); + + api->bt = elm_button_add(win); + elm_object_text_set(api->bt, "Next API function"); + evas_object_smart_callback_add(api->bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, api->bt); + elm_object_disabled_set(api->bt, api->state == API_STATE_LAST); + evas_object_show(api->bt); + + elm_box_pack_end(bxx, vbox); + + create_dir_struct(); /* Create a dir struct in /tmp */ + /* file selector button */ + ic = elm_icon_add(win); + elm_icon_standard_set(ic, "file"); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + fs_bt = elm_fileselector_button_add(win); + elm_object_text_set(fs_bt, "Select a file"); + elm_fileselector_button_icon_set(fs_bt, ic); + elm_fileselector_button_path_set(fs_bt, "/tmp/test_fs_bt"); + + elm_box_pack_end(vbox, fs_bt); + evas_object_show(fs_bt); + evas_object_show(ic); + + /* attribute setting buttons */ + hbox = elm_box_add(win); + elm_box_horizontal_set(hbox, EINA_TRUE); + elm_box_pack_end(vbox, hbox); + evas_object_show(hbox); + + bt = elm_check_add(win); + elm_object_style_set(bt, "toggle"); + elm_object_text_set(bt, "current selection text entry"); + evas_object_smart_callback_add(bt, "changed", _current_sel_toggle, fs_bt); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + bt = elm_check_add(win); + elm_object_style_set(bt, "toggle"); + elm_object_text_set(bt, "Inwin mode"); + elm_check_state_set (bt, EINA_TRUE); + evas_object_smart_callback_add(bt, "changed", _inwin_mode_toggle, fs_bt); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + bt = elm_check_add(win); + elm_object_style_set(bt, "toggle"); + elm_object_text_set(bt, "Folder only mode"); + evas_object_smart_callback_add(bt, "changed", _folder_only_toggle, fs_bt); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + bt = elm_check_add(win); + elm_object_style_set(bt, "toggle"); + elm_object_text_set(bt, "Expandable mode"); + evas_object_smart_callback_add(bt, "changed", _expandable_toggle, fs_bt); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Last selection:"); + elm_box_pack_end(vbox, lb); + evas_object_show(lb); + + en = elm_entry_add(win); + elm_entry_line_wrap_set(en, ELM_WRAP_NONE); + elm_entry_editable_set(en, EINA_FALSE); + evas_object_smart_callback_add(fs_bt, "file,chosen", _file_chosen, en); + elm_box_pack_end(vbox, en); + evas_object_show(en); + + evas_object_resize(win, 400, 400); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_fileselector_entry.c b/src/bin/test_fileselector_entry.c new file mode 100644 index 0000000..535fa29 --- /dev/null +++ b/src/bin/test_fileselector_entry.c @@ -0,0 +1,236 @@ +#include +#include "tsuite.h" + +static void +_file_chosen(void *data, + Evas_Object *obj __UNUSED__, + void *event_info) +{ + Evas_Object *entry = data; + char *file = event_info; + elm_entry_entry_set(entry, file); + printf("File chosen: %s\n", file); +} + +static void +_inwin_mode_toggle(void *data, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + Evas_Object *fs_en = data; + Eina_Bool value = elm_fileselector_entry_inwin_mode_get(fs_en); + elm_fileselector_entry_inwin_mode_set(fs_en, !value); + printf("Inwin mode set to: %s\n", value ? "false" : "true"); +} + +static void +_folder_only_toggle(void *data, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + Evas_Object *fs_en = data; + Evas_Object *ic = elm_fileselector_entry_button_icon_get(fs_en); + Eina_Bool value = elm_fileselector_entry_folder_only_get(fs_en); + elm_fileselector_entry_folder_only_set(fs_en, !value); + printf("Folder only flag set to: %s\n", value ? "false" : "true"); + if (!value) + { + elm_icon_standard_set(ic, "folder"); + elm_object_text_set(fs_en, "Select a folder"); + } + else + { + elm_icon_standard_set(ic, "file"); + elm_object_text_set(fs_en, "Select a file"); + } +} + +static void +_expandable_toggle(void *data, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + Evas_Object *fs_en = data; + Eina_Bool value = elm_fileselector_entry_expandable_get(fs_en); + elm_fileselector_entry_expandable_set(fs_en, !value); + printf("Expandable flag set to: %s\n", value ? "false" : "true"); +} + +static void +_disabled_toggle(void *data, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + Evas_Object *fs_en = data; + Eina_Bool value = elm_object_disabled_get(fs_en); + elm_object_disabled_set(fs_en, !value); + printf("Disabled flag set to: %s\n", value ? "false" : "true"); +} + +enum _api_state +{ + ICON_UNSET, + WINDOW_TITLE_SET, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + const Eina_List *items = elm_box_children_get(api->data); + if(!eina_list_count(items)) + return; + + /* Get first item of list of vbox children */ + Evas_Object *fs_bt = eina_list_nth(items, 0); + + /* use elm_box_children_get() to get list of children */ + switch(api->state) + { /* Put all api-changes under switch */ + case ICON_UNSET: + elm_fileselector_entry_button_icon_unset(fs_bt); + break; + + case WINDOW_TITLE_SET: + elm_fileselector_entry_window_title_set(fs_bt, "Custom title from API"); + break; + + case API_STATE_LAST: + + break; + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(a->bt, str); + elm_object_disabled_set(a->bt, a->state == API_STATE_LAST); +} + +static void +create_dir_struct(void) +{ + FILE *fp; + mkdir("/tmp/test_fs_bt", S_IRWXU); + fp = fopen("/tmp/test_fs_bt/a_file.txt", "w"); + if (fp) fclose(fp); + fp = fopen("/tmp/test_fs_bt/k_file.txt", "w"); + if (fp) fclose(fp); + fp = fopen("/tmp/test_fs_bt/m_file.txt", "w"); + if (fp) fclose(fp); + + mkdir("/tmp/test_fs_bt/a_subdir", S_IRWXU); + fp = fopen("/tmp/test_fs_bt/a_subdir/d_sub_file.txt", "w"); + if (fp) fclose(fp); + fp = fopen("/tmp/test_fs_bt/a_subdir/j_sub_file.txt", "w"); + if (fp) fclose(fp); +} + +TEST_START(test_fileselector_entry) +{ + Evas_Object *bg, *vbox, *hbox, *bxx, *ic, *bt, *fs_en, *en, *lb; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bxx = elm_box_add(win); + elm_win_resize_object_add(win, bxx); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bxx); + + vbox = elm_box_add(win); + evas_object_size_hint_weight_set(vbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + api->data = vbox; + evas_object_show(vbox); + + api->bt = elm_button_add(win); + elm_object_text_set(api->bt, "Next API function"); + evas_object_smart_callback_add(api->bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, api->bt); + elm_object_disabled_set(api->bt, api->state == API_STATE_LAST); + evas_object_show(api->bt); + + elm_box_pack_end(bxx, vbox); + + create_dir_struct(); /* Create a dir struct in /tmp */ + + /* file selector entry */ + ic = elm_icon_add(win); + elm_icon_standard_set(ic, "file"); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + fs_en = elm_fileselector_entry_add(win); + elm_fileselector_entry_path_set(fs_en, "/tmp/test_fs_bt"); + elm_object_text_set(fs_en, "Select a file"); + elm_fileselector_entry_button_icon_set(fs_en, ic); + evas_object_size_hint_weight_set(fs_en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(fs_en, EVAS_HINT_FILL, EVAS_HINT_FILL); + + elm_box_pack_end(vbox, fs_en); + evas_object_show(fs_en); + evas_object_show(ic); + + /* attribute setting buttons */ + hbox = elm_box_add(win); + elm_box_horizontal_set(hbox, EINA_TRUE); + elm_box_pack_end(vbox, hbox); + evas_object_show(hbox); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Toggle inwin mode"); + evas_object_smart_callback_add(bt, "clicked", _inwin_mode_toggle, fs_en); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Toggle folder only mode"); + evas_object_smart_callback_add(bt, "clicked", _folder_only_toggle, fs_en); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Toggle expandable mode"); + evas_object_smart_callback_add(bt, "clicked", _expandable_toggle, fs_en); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Last selection:"); + elm_box_pack_end(vbox, lb); + evas_object_show(lb); + + hbox = elm_box_add(win); + elm_box_horizontal_set(hbox, EINA_TRUE); + elm_box_pack_end(vbox, hbox); + evas_object_show(hbox); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Toggle disabled"); + evas_object_smart_callback_add(bt, "clicked", _disabled_toggle, fs_en); + elm_box_pack_end(hbox, bt); + evas_object_show(bt); + + en = elm_entry_add(win); + elm_entry_line_wrap_set(en, ELM_WRAP_NONE); + elm_entry_editable_set(en, EINA_FALSE); + evas_object_smart_callback_add(fs_en, "file,chosen", _file_chosen, en); + elm_box_pack_end(vbox, en); + evas_object_show(en); + + evas_object_resize(win, 400, 500); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_flip.c b/src/bin/test_flip.c new file mode 100644 index 0000000..b449618 --- /dev/null +++ b/src/bin/test_flip.c @@ -0,0 +1,611 @@ +#include +#include "tsuite.h" + +void +my_fl_1(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *fl = data; + elm_flip_go(fl, ELM_FLIP_ROTATE_Y_CENTER_AXIS); +} + +void +my_fl_2(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *fl = data; + elm_flip_go(fl, ELM_FLIP_ROTATE_X_CENTER_AXIS); +} + +void +my_fl_3(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *fl = data; + elm_flip_go(fl, ELM_FLIP_ROTATE_XZ_CENTER_AXIS); +} + +void +my_fl_4(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *fl = data; + elm_flip_go(fl, ELM_FLIP_ROTATE_YZ_CENTER_AXIS); +} + +void +my_fl_5(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *fl = data; + elm_flip_go(fl, ELM_FLIP_CUBE_LEFT); +} + +void +my_fl_6(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *fl = data; + elm_flip_go(fl, ELM_FLIP_CUBE_RIGHT); +} + +void +my_fl_7(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *fl = data; + elm_flip_go(fl, ELM_FLIP_CUBE_UP); +} + +void +my_fl_8(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *fl = data; + elm_flip_go(fl, ELM_FLIP_CUBE_DOWN); +} + +TEST_START(test_flip) +{ + Evas_Object *bg, *bx, *bx2, *fl, *o, *bt, *ly; + char buf[PATH_MAX]; + + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + fl = elm_flip_add(win); + evas_object_size_hint_align_set(fl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(fl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, fl); + + o = elm_bg_add(win); + evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), "sky_01.jpg"); + elm_bg_file_set(o, buf, NULL); + elm_flip_content_front_set(fl, o); + evas_object_show(o); + + ly = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "layout"); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_flip_content_back_set(fl, ly); + evas_object_show(ly); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 1"); + elm_object_part_content_set(ly, "element1", bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 2"); + elm_object_part_content_set(ly, "element2", bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 3"); + elm_object_part_content_set(ly, "element3", bt); + evas_object_show(bt); + + evas_object_show(fl); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + + bt = elm_button_add(win); + elm_object_text_set(bt, "1"); + evas_object_smart_callback_add(bt, "clicked", my_fl_1, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "2"); + evas_object_smart_callback_add(bt, "clicked", my_fl_2, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "3"); + evas_object_smart_callback_add(bt, "clicked", my_fl_3, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "4"); + evas_object_smart_callback_add(bt, "clicked", my_fl_4, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + + bt = elm_button_add(win); + elm_object_text_set(bt, "5"); + evas_object_smart_callback_add(bt, "clicked", my_fl_5, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "6"); + evas_object_smart_callback_add(bt, "clicked", my_fl_6, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "7"); + evas_object_smart_callback_add(bt, "clicked", my_fl_7, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "8"); + evas_object_smart_callback_add(bt, "clicked", my_fl_8, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} +TEST_END + +TEST_START(test_flip2) +{ + Evas_Object *bg, *bx, *bx2, *fl, *o, *bt, *tb, *li, *en; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), "sky_01.jpg"); + elm_bg_file_set(bg, buf, NULL); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + fl = elm_flip_add(win); + evas_object_size_hint_align_set(fl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(fl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, fl); + + o = elm_box_add(win); + evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + tb = elm_toolbar_add(win); + elm_toolbar_homogeneous_set(tb, 0); + evas_object_size_hint_weight_set(tb, 0.0, 0.0); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, 0.0); + + elm_toolbar_item_append(tb, "arrow_left", "Hello", NULL, NULL); + elm_toolbar_item_append(tb, "arrow_right", "Out", NULL, NULL); + elm_toolbar_item_append(tb, "home", "There", NULL, NULL); + elm_toolbar_item_append(tb, "refresh", "World", NULL, NULL); + + elm_box_pack_end(o, tb); + evas_object_show(tb); + + li = elm_list_add(win); + evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + elm_list_item_append(li, "This is a list", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Second item", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "3rd", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Fourth", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Number five is alive!", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "The quick brown fox jumps over the lazy dog", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Booyah", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "And another item", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "More of them", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Get with it", NULL, NULL, NULL, NULL); + + elm_list_go(li); + + elm_box_pack_end(o, li); + evas_object_show(li); + + elm_flip_content_front_set(fl, o); + evas_object_show(o); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_line_wrap_set(en, ELM_WRAP_NONE); + snprintf(buf, sizeof(buf), + "This is an entry widget in this window that
" + "uses markup like this for styling and
" + "formatting like this, as well as
" + "links in the text, so enter text
" + "in here to edit it. By the way, links are
" + "called Anchors so you will need
" + "to refer to them this way.
" + "
" + + "Also you can stick in items with (relsize + ascent): " + "" + " (full) " + "" + " (to the left)
" + + "Also (size + ascent): " + "" + " (full) " + "" + " (before this)
" + + "And as well (absize + ascent): " + "" + " (full) " + "" + " or even paths to image files on disk too like: " + "" + " ... end." + , elm_app_data_dir_get() + ); + elm_entry_entry_set(en, buf); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + elm_flip_content_back_set(fl, en); + evas_object_show(en); + + evas_object_show(fl); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + + bt = elm_button_add(win); + elm_object_text_set(bt, "1"); + evas_object_smart_callback_add(bt, "clicked", my_fl_1, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "2"); + evas_object_smart_callback_add(bt, "clicked", my_fl_2, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "3"); + evas_object_smart_callback_add(bt, "clicked", my_fl_3, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "4"); + evas_object_smart_callback_add(bt, "clicked", my_fl_4, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "5"); + evas_object_smart_callback_add(bt, "clicked", my_fl_5, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "6"); + evas_object_smart_callback_add(bt, "clicked", my_fl_6, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} +TEST_END + +TEST_START(test_flip3) +{ + Evas_Object *bg, *bx, *bx2, *fl, *fl_f, *fl_b, *o, *bt, *fr; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + fl = elm_flip_add(win); + evas_object_size_hint_align_set(fl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(fl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, fl); + evas_object_show(fl); + + fr = elm_frame_add(win); + elm_object_text_set(fr, "Front"); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_flip_content_front_set(fl, fr); + evas_object_show(fr); + + fl_f = elm_flip_add(win); + evas_object_size_hint_align_set(fl_f, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(fl_f, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_content_set(fr, fl_f); + evas_object_show(fl_f); + + o = elm_bg_add(win); + evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), "sky_01.jpg"); + elm_bg_file_set(o, buf, NULL); + elm_flip_content_front_set(fl_f, o); + evas_object_show(o); + + o = elm_bg_add(win); + evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), "sky_02.jpg"); + elm_bg_file_set(o, buf, NULL); + elm_flip_content_back_set(fl_f, o); + evas_object_show(o); + + fr = elm_frame_add(win); + elm_object_text_set(fr, "Back"); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_flip_content_back_set(fl, fr); + evas_object_show(fr); + + fl_b = elm_flip_add(win); + evas_object_size_hint_align_set(fl_b, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(fl_b, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_content_set(fr, fl_b); + evas_object_show(fl_b); + + o = elm_bg_add(win); + evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), "sky_03.jpg"); + elm_bg_file_set(o, buf, NULL); + elm_flip_content_front_set(fl_b, o); + evas_object_show(o); + + o = elm_bg_add(win); + evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), "sky_04.jpg"); + elm_bg_file_set(o, buf, NULL); + elm_flip_content_back_set(fl_b, o); + evas_object_show(o); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Main Flip"); + evas_object_smart_callback_add(bt, "clicked", my_fl_6, fl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Front Flip"); + evas_object_smart_callback_add(bt, "clicked", my_fl_6, fl_f); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Back Flip"); + evas_object_smart_callback_add(bt, "clicked", my_fl_6, fl_b); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} +TEST_END + +static void +my_fl_go(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + Evas_Object *fl = evas_object_data_get(win, "fl"); + elm_flip_go(fl, ELM_FLIP_PAGE_LEFT); +} + +static void +my_fl_ch(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + Evas_Object *fl = evas_object_data_get(win, "fl"); + Evas_Object *rdg = evas_object_data_get(win, "rdg"); + elm_flip_interaction_set(fl, elm_radio_value_get(rdg)); +} + +TEST_START(test_flip4) +{ + Evas_Object *bg, *bx, *fl, *im, *li, *bt, *rd, *rdg; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + fl = elm_flip_add(win); + evas_object_size_hint_align_set(fl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(fl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, fl); + evas_object_data_set(win, "fl", fl); + + elm_flip_interaction_set(fl, ELM_FLIP_INTERACTION_NONE); + elm_flip_interacton_direction_enabled_set(fl, ELM_FLIP_DIRECTION_UP, EINA_TRUE); + elm_flip_interacton_direction_enabled_set(fl, ELM_FLIP_DIRECTION_DOWN, EINA_TRUE); + elm_flip_interacton_direction_enabled_set(fl, ELM_FLIP_DIRECTION_LEFT, EINA_TRUE); + elm_flip_interacton_direction_enabled_set(fl, ELM_FLIP_DIRECTION_RIGHT, EINA_TRUE); + elm_flip_interacton_direction_hitsize_set(fl, ELM_FLIP_DIRECTION_UP, 0.25); + elm_flip_interacton_direction_hitsize_set(fl, ELM_FLIP_DIRECTION_DOWN, 0.25); + elm_flip_interacton_direction_hitsize_set(fl, ELM_FLIP_DIRECTION_LEFT, 0.25); + elm_flip_interacton_direction_hitsize_set(fl, ELM_FLIP_DIRECTION_RIGHT, 0.25); + evas_object_show(fl); + + im = evas_object_image_filled_add(evas_object_evas_get(win)); + evas_object_size_hint_weight_set(im, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + snprintf(buf, sizeof(buf), "%s/images/%s", + elm_app_data_dir_get(), "twofish.jpg"); + evas_object_image_file_set(im, buf, NULL); + elm_flip_content_front_set(fl, im); + evas_object_show(im); + +#if 0 + im = evas_object_image_filled_add(evas_object_evas_get(win)); + evas_object_size_hint_weight_set(im, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + snprintf(buf, sizeof(buf), "%s/images/%s", + elm_app_data_dir_get(), "sky_04.jpg"); + evas_object_image_file_set(im, buf, NULL); + elm_flip_content_back_set(fl, im); + evas_object_show(im); +#else + li = elm_list_add(win); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_list_item_append(li, "Item 0", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Item 1", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Item 2", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Item 3 (Which is very long just for testing purposes)", NULL, NULL, NULL, NULL); + elm_list_go(li); + elm_flip_content_back_set(fl, li); + evas_object_show(li); +#endif + + rd = elm_radio_add(win); + evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + elm_radio_state_value_set(rd, ELM_FLIP_INTERACTION_NONE); + elm_object_text_set(rd, "None"); + elm_box_pack_end(bx, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", my_fl_ch, win); + rdg = rd; + evas_object_data_set(win, "rdg", rdg); + + rd = elm_radio_add(win); + evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + elm_radio_state_value_set(rd, ELM_FLIP_INTERACTION_ROTATE); + elm_object_text_set(rd, "Rotate"); + elm_radio_group_add(rd, rdg); + elm_box_pack_end(bx, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", my_fl_ch, win); + + rd = elm_radio_add(win); + evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + elm_radio_state_value_set(rd, ELM_FLIP_INTERACTION_CUBE); + elm_object_text_set(rd, "Cube"); + elm_radio_group_add(rd, rdg); + elm_box_pack_end(bx, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", my_fl_ch, win); + + rd = elm_radio_add(win); + evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, 0.0); + elm_radio_state_value_set(rd, ELM_FLIP_INTERACTION_PAGE); + elm_object_text_set(rd, "Page"); + elm_radio_group_add(rd, rdg); + elm_box_pack_end(bx, rd); + evas_object_show(rd); + evas_object_smart_callback_add(rd, "changed", my_fl_ch, win); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Go"); + evas_object_smart_callback_add(bt, "clicked", my_fl_go, win); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_flip_page.c b/src/bin/test_flip_page.c new file mode 100644 index 0000000..60034bf --- /dev/null +++ b/src/bin/test_flip_page.c @@ -0,0 +1,914 @@ +#include +#include "tsuite.h" + +typedef struct _State State; +typedef struct _Slice Slice; + +typedef struct _Vertex2 Vertex2; +typedef struct _Vertex3 Vertex3; + +struct _State +{ + Evas_Object *front, *back; + Evas_Coord down_x, down_y, x, y; + Eina_Bool down : 1; + Eina_Bool backflip : 1; + + Ecore_Animator *anim; + Ecore_Job *job; + Evas_Coord ox, oy, w, h; + int slices_w, slices_h; + Slice **slices, **slices2; + int dir; // 0 == left, 1 == right, 2 == up, 3 == down + int finish; +}; + +struct _Slice +{ + Evas_Object *obj; + // (0)---(1) + // | | + // | | + // (3)---(2) + double u[4], v[4], x[4], y[4], z[4]; +}; + +struct _Vertex2 +{ + double x, y; +}; + +struct _Vertex3 +{ + double x, y, z; +}; + +static State state = +{ + NULL, NULL, + 0, 0, 0, 0, + 0, + 0, + + NULL, + NULL, + 0, 0, 0, 0, + 0, 0, + NULL, NULL, + -1, + 0 +}; + +static Slice * +_slice_new(State *st __UNUSED__, Evas_Object *obj) +{ + Slice *sl; + + sl = calloc(1, sizeof(Slice)); + if (!sl) return NULL; + sl->obj = evas_object_image_add(evas_object_evas_get(obj)); + evas_object_image_smooth_scale_set(sl->obj, 0); + evas_object_pass_events_set(sl->obj, 1); + evas_object_image_source_set(sl->obj, obj); + return sl; +} + +static void +_slice_free(Slice *sl) +{ + evas_object_del(sl->obj); + free(sl); +} + +static void +_slice_apply(State *st, Slice *sl, + Evas_Coord x __UNUSED__, Evas_Coord y __UNUSED__, Evas_Coord w, Evas_Coord h __UNUSED__, + Evas_Coord ox, Evas_Coord oy, Evas_Coord ow, Evas_Coord oh) +{ + Evas_Map *m; + int i; + + m = evas_map_new(4); + if (!m) return; + evas_map_smooth_set(m, 0); + for (i = 0; i < 4; i++) + { + evas_map_point_color_set(m, i, 255, 255, 255, 255); + if (st->dir == 0) + { + int p[4] = { 0, 1, 2, 3 }; + evas_map_point_coord_set(m, i, ox + sl->x[p[i]], oy + sl->y[p[i]], sl->z[p[i]]); + evas_map_point_image_uv_set(m, i, sl->u[p[i]] , sl->v[p[i]]); + } + else if (st->dir == 1) + { + int p[4] = { 1, 0, 3, 2 }; + evas_map_point_coord_set(m, i, ox + (w - sl->x[p[i]]), oy + sl->y[p[i]], sl->z[p[i]]); + evas_map_point_image_uv_set(m, i, ow - sl->u[p[i]] , sl->v[p[i]]); + } + else if (st->dir == 2) + { + int p[4] = { 1, 0, 3, 2 }; + evas_map_point_coord_set(m, i, ox + sl->y[p[i]], oy + sl->x[p[i]], sl->z[p[i]]); + evas_map_point_image_uv_set(m, i, sl->v[p[i]] , sl->u[p[i]]); + } + else if (st->dir == 3) + { + int p[4] = { 0, 1, 2, 3 }; + evas_map_point_coord_set(m, i, ox + sl->y[p[i]], oy + (w - sl->x[p[i]]), sl->z[p[i]]); + evas_map_point_image_uv_set(m, i, sl->v[p[i]] , oh - sl->u[p[i]]); + } + } + evas_object_map_enable_set(sl->obj, EINA_TRUE); + evas_object_image_fill_set(sl->obj, 0, 0, ow, oh); + evas_object_map_set(sl->obj, m); + evas_map_free(m); +} + +static void +_slice_3d(State *st __UNUSED__, Slice *sl, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) +{ + Evas_Map *m = (Evas_Map *)evas_object_map_get(sl->obj); + int i; + + if (!m) return; + // vanishing point is center of page, and focal dist is 1024 + evas_map_util_3d_perspective(m, x + (w / 2), y + (h / 2), 0, 1024); + for (i = 0; i < 4; i++) + { + Evas_Coord x, y, z; + evas_map_point_coord_get(m, i, &x, &y, &z); + evas_map_point_coord_set(m, i, x, y, 0); + } + if (evas_map_util_clockwise_get(m)) evas_object_show(sl->obj); + else evas_object_hide(sl->obj); + evas_object_map_set(sl->obj, m); +} + +static void +_slice_light(State *st __UNUSED__, Slice *sl, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) +{ + Evas_Map *m = (Evas_Map *)evas_object_map_get(sl->obj); + int i; + + if (!m) return; + evas_map_util_3d_lighting(m, + // light position + // (centered over page 10 * h toward camera) + x + (w / 2) , y + (h / 2) , -10000, + 255, 255, 255, // light color + 0 , 0 , 0); // ambient minimum + // multiply brightness by 1.2 to make lightish bits all white so we dont + // add shading where we could otherwise be pure white + for (i = 0; i < 4; i++) + { + int r, g, b, a; + + evas_map_point_color_get(m, i, &r, &g, &b, &a); + r = (double)r * 1.2; if (r > 255) r = 255; + g = (double)g * 1.2; if (g > 255) g = 255; + b = (double)b * 1.2; if (b > 255) b = 255; + evas_map_point_color_set(m, i, r, g, b, a); + } + evas_object_map_set(sl->obj, m); +} + +static void +_slice_xyz(State *st __UNUSED__, Slice *sl, + double x1, double y1, double z1, + double x2, double y2, double z2, + double x3, double y3, double z3, + double x4, double y4, double z4) +{ + sl->x[0] = x1; sl->y[0] = y1; sl->z[0] = z1; + sl->x[1] = x2; sl->y[1] = y2; sl->z[1] = z2; + sl->x[2] = x3; sl->y[2] = y3; sl->z[2] = z3; + sl->x[3] = x4; sl->y[3] = y4; sl->z[3] = z4; +} + +static void +_slice_uv(State *st __UNUSED__, Slice *sl, + double u1, double v1, + double u2, double v2, + double u3, double v3, + double u4, double v4) +{ + sl->u[0] = u1; sl->v[0] = v1; + sl->u[1] = u2; sl->v[1] = v2; + sl->u[2] = u3; sl->v[2] = v3; + sl->u[3] = u4; sl->v[3] = v4; +} + +static void +_deform_point(Vertex2 *vi, Vertex3 *vo, double rho, double theta, double A) +{ + // ^Y + // | + // | X + // +----> + // theta == cone angle (0 -> PI/2) + // A == distance of cone apex from origin + // rho == angle of cone from vertical axis (...-PI/2 to PI/2...) + Vertex3 v1; + double d, r, b; + + d = sqrt((vi->x * vi->x) + pow(vi->y - A, 2)); + r = d * sin(theta); + b = asin(vi->x / d) / sin(theta); + + v1.x = r * sin(b); + v1.y = d + A - (r * (1 - cos(b)) * sin(theta)); + v1.z = r * (1 - cos(b)) * cos(theta); + + vo->x = (v1.x * cos(rho)) - (v1.z * sin(rho)); + vo->y = v1.y; + vo->z = (v1.x * sin(rho)) + (v1.z * cos(rho)); +} + +static void +_interp_point(Vertex3 *vi1, Vertex3 *vi2, Vertex3 *vo, double v) +{ + vo->x = (v * vi2->x) + ((1.0 - v) * vi1->x); + vo->y = (v * vi2->y) + ((1.0 - v) * vi1->y); + vo->z = (v * vi2->z) + ((1.0 - v) * vi1->z); +} + +static void +_state_slices_clear(State *st) +{ + int i, j, num; + + if (st->slices) + { + num = 0; + for (j = 0; j < st->slices_h; j++) + { + for (i = 0; i < st->slices_w; i++) + { + if (st->slices[num]) _slice_free(st->slices[num]); + if (st->slices2[num]) _slice_free(st->slices2[num]); + num++; + } + } + free(st->slices); + free(st->slices2); + st->slices = NULL; + st->slices2 = NULL; + } + st->slices_w = 0; + st->slices_h = 0; +} + +static int +_slice_obj_color_sum(Slice *s, int p, int *r, int *g, int *b, int *a) +{ + Evas_Map *m; + int rr = 0, gg = 0, bb = 0, aa = 0; + + if (!s) return 0; + m = (Evas_Map *)evas_object_map_get(s->obj); + if (!m) return 0; + evas_map_point_color_get(m, p, &rr, &gg, &bb, &aa); + *r += rr; *g += gg; *b += bb; *a += aa; + return 1; +} + +static void +_slice_obj_color_set(Slice *s, int p, int r, int g, int b, int a) +{ + Evas_Map *m; + + if (!s) return; + m = (Evas_Map *)evas_object_map_get(s->obj); + if (!m) return; + evas_map_point_color_set(m, p, r, g, b, a); + evas_object_map_set(s->obj, m); +} + +static void +_slice_obj_vert_color_merge(Slice *s1, int p1, Slice *s2, int p2, + Slice *s3, int p3, Slice *s4, int p4) +{ + int r = 0, g = 0, b = 0, a = 0, n = 0; + + n += _slice_obj_color_sum(s1, p1, &r, &g, &b, &a); + n += _slice_obj_color_sum(s2, p2, &r, &g, &b, &a); + n += _slice_obj_color_sum(s3, p3, &r, &g, &b, &a); + n += _slice_obj_color_sum(s4, p4, &r, &g, &b, &a); + + if (n < 1) return; + r /= n; g /= n; b /= n; a /= n; + + _slice_obj_color_set(s1, p1, r, g, b, a); + _slice_obj_color_set(s2, p2, r, g, b, a); + _slice_obj_color_set(s3, p3, r, g, b, a); + _slice_obj_color_set(s4, p4, r, g, b, a); +} + +static int +_state_update(State *st) +{ + Evas_Coord x1, y1, x2, y2, mx, my, dst, dx, dy; + Evas_Coord x, y, w, h, ox, oy, ow, oh; + int i, j, num, nn, jump, num2; + Slice *sl; + double b, minv = 0.0, minva, mgrad; + int gx, gy, gszw, gszh, gw, gh, col, row, nw, nh; + double rho, A, theta, perc, percm, n, rhol, Al, thetal; + Vertex3 *tvo, *tvol; + + st->backflip = 0; + + evas_object_geometry_get(st->front, &x, &y, &w, &h); + ox = x; oy = y; ow = w; oh = h; + x1 = st->down_x; + y1 = st->down_y; + x2 = st->x; + y2 = st->y; + + dx = x2 - x1; + dy = y2 - y1; + dst = sqrt((dx * dx) + (dy * dy)); + if (st->dir == -1) + { + if (dst < 20) // MAGIC: 20 == drag hysterisis + return 0; + } + if (st->dir == -1) + { + if ((x1 > (w / 2)) && (dx < 0) && (abs(dx) > abs(dy))) st->dir = 0; // left + else if ((x1 < (w / 2)) && (dx >= 0) && (abs(dx) > abs(dy))) st->dir = 1; // right + else if ((y1 > (h / 2)) && (dy < 0) && (abs(dy) >= abs(dx))) st->dir = 2; // up + else if ((y1 < (h / 2)) && (dy >= 0) && (abs(dy) >= abs(dx))) st->dir = 3; // down + if (st->dir == -1) return 0; + } + if (st->dir == 0) + { + // no nothing. left drag is standard + } + else if (st->dir == 1) + { + x1 = (w - 1) - x1; + x2 = (w - 1) - x2; + } + else if (st->dir == 2) + { + Evas_Coord tmp; + + tmp = x1; x1 = y1; y1 = tmp; + tmp = x2; x2 = y2; y2 = tmp; + tmp = w; w = h; h = tmp; + } + else if (st->dir == 3) + { + Evas_Coord tmp; + + tmp = x1; x1 = y1; y1 = tmp; + tmp = x2; x2 = y2; y2 = tmp; + tmp = w; w = h; h = tmp; + x1 = (w - 1) - x1; + x2 = (w - 1) - x2; + } + + if (x2 >= x1) x2 = x1 - 1; + mx = (x1 + x2) / 2; + my = (y1 + y2) / 2; + + if (mx < 0) mx = 0; + else if (mx >= w) mx = w - 1; + if (my < 0) my = 0; + else if (my >= h) my = h - 1; + + mgrad = (double)(y1 - y2) / (double)(x1 - x2); + + if (mx < 1) mx = 1; // quick hack to keep curl line visible + + if (mgrad == 0.0) // special horizontal case + mgrad = 0.001; // quick dirty hack for now + // else + { + minv = 1.0 / mgrad; + // y = (m * x) + b + b = my + (minv * mx); + } + if ((b >= -5) && (b <= (h + 5))) + { + if (minv > 0.0) // clamp to h + { + minv = (double)(h + 5 - my) / (double)(mx); + b = my + (minv * mx); + } + else // clamp to 0 + { + minv = (double)(-5 - my) / (double)(mx); + b = my + (minv * mx); + } + } + + perc = (double)x2 / (double)x1; + percm = (double)mx / (double)x1; + if (perc < 0.0) perc = 0.0; + else if (perc > 1.0) perc = 1.0; + if (percm < 0.0) percm = 0.0; + else if (percm > 1.0) percm = 1.0; + + minva = atan(minv) / (M_PI / 2); + if (minva < 0.0) minva = -minva; + + // A = apex of cone + if (b <= 0) A = b; + else A = h - b; + if (A < -(h * 20)) A = -h * 20; + //--// + Al = -5; + + // rho = is how much the page is turned + n = 1.0 - perc; + n = 1.0 - cos(n * M_PI / 2.0); + n = n * n; + rho = -(n * M_PI); + //--// + rhol = -(n * M_PI); + + // theta == curliness (how much page culrs in on itself + n = sin((1.0 - perc) * M_PI); + n = n * 1.2; + theta = 7.86 + n; + //--// + n = sin((1.0 - perc) * M_PI); + n = 1.0 - n; + n = n * n; + n = 1.0 - n; + thetal = 7.86 + n; + + nw = 16; + nh = 16; + if (nw < 1) nw = 1; + if (nh < 1) nh = 1; + gszw = w / nw; + gszh = h / nh; + if (gszw < 4) gszw = 4; + if (gszh < 4) gszh = 4; + + nw = (w + gszw - 1) / gszw; + nh = (h + gszh - 1) / gszh; + if ((st->slices_w != nw) || (st->slices_h != nh)) _state_slices_clear(st); + st->slices_w = nw; + st->slices_h = nh; + if (!st->slices) + { + st->slices = calloc(st->slices_w * st->slices_h, sizeof(Slice *)); + if (!st->slices) return 0; + st->slices2 = calloc(st->slices_w * st->slices_h, sizeof(Slice *)); + if (!st->slices2) + { + free(st->slices); + st->slices = NULL; + return 0; + } + } + + num = (st->slices_w + 1) * (st->slices_h + 1); + + tvo = alloca(sizeof(Vertex3) * num); + tvol = alloca(sizeof(Vertex3) * (st->slices_w + 1)); + + for (col = 0, gx = 0; gx <= (w + gszw - 1); gx += gszw, col++) + { + Vertex2 vil; + + vil.x = gx; + vil.y = h - gx; + _deform_point(&vil, &(tvol[col]), rhol, thetal, Al); + } + + n = minva * sin(perc * M_PI); + n = n * n; + + num = 0; + for (col = 0, gx = 0; gx <= (w + gszw - 1); gx += gszw, col++) + { + for (gy = 0; gy <= (h + gszh - 1); gy += gszh) + { + Vertex2 vi; + Vertex3 vo, tvo1; + + if (gx > w) vi.x = w; + else vi.x = gx; + if (gy > h) vi.y = h; + else vi.y = gy; + _deform_point(&vi, &vo, rho, theta, A); + tvo1 = tvol[col]; + if (gy > h) tvo1.y = h; + else tvo1.y = gy; + _interp_point(&vo, &tvo1, &(tvo[num]), n); + num++; + } + } + + jump = st->slices_h + 1; + for (col = 0, gx = 0; gx < w; gx += gszw, col++) + { + num = st->slices_h * col; + num2 = jump * col; + + gw = gszw; + if ((gx + gw) > w) gw = w - gx; + + for (row = 0, gy = 0; gy < h; gy += gszh, row++) + { + Vertex3 vo[4]; + + if (b > 0) nn = num + st->slices_h - row - 1; + else nn = num + row; + + gh = gszh; + if ((gy + gh) > h) gh = h - gy; + + vo[0] = tvo[num2 + row]; + vo[1] = tvo[num2 + row + jump]; + vo[2] = tvo[num2 + row + jump + 1]; + vo[3] = tvo[num2 + row + 1]; +#define SWP(a, b) do {typeof(a) vt; vt = (a); (a) = (b); (b) = vt;} while (0) + if (b > 0) + { + SWP(vo[0], vo[3]); + SWP(vo[1], vo[2]); + vo[0].y = h - vo[0].y; + vo[1].y = h - vo[1].y; + vo[2].y = h - vo[2].y; + vo[3].y = h - vo[3].y; + } + + // FRONT + sl = st->slices[nn]; + if (!sl) + { + sl = _slice_new(st, st->front); + st->slices[nn] = sl; + } + _slice_xyz(st, sl, + vo[0].x, vo[0].y, vo[0].z, + vo[1].x, vo[1].y, vo[1].z, + vo[2].x, vo[2].y, vo[2].z, + vo[3].x, vo[3].y, vo[3].z); + if (b <= 0) + _slice_uv(st, sl, + gx, gy, gx + gw, gy, + gx + gw, gy + gh, gx, gy + gh); + else + _slice_uv(st, sl, + gx, h - (gy + gh), gx + gw, h - (gy + gh), + gx + gw, h - gy, gx, h - gy); + + // BACK + sl = st->slices2[nn]; + if (!sl) + { + sl = _slice_new(st, st->back); + st->slices2[nn] = sl; + } + + _slice_xyz(st, sl, + vo[1].x, vo[1].y, vo[1].z, + vo[0].x, vo[0].y, vo[0].z, + vo[3].x, vo[3].y, vo[3].z, + vo[2].x, vo[2].y, vo[2].z); + if (st->backflip) + { + if (b <= 0) + _slice_uv(st, sl, + gx + gw, gy, gx, gy, + gx, gy + gh, gx + gw, gy + gh); + else + _slice_uv(st, sl, + gx + gw, h - (gy + gh), gx, h - (gy + gh), + gx, h - gy, gx + gw, h - gy); + } + else + { + if (b <= 0) + _slice_uv(st, sl, + w - (gx + gw), gy, w - (gx), gy, + w - (gx), gy + gh, w - (gx + gw), gy + gh); + else + _slice_uv(st, sl, + w - (gx + gw), h - (gy + gh), w - (gx), h - (gy + gh), + w - (gx), h - gy, w - (gx + gw), h - gy); + } + } + } + + num = 0; + for (j = 0; j < st->slices_h; j++) + { + for (i = 0; i < st->slices_w; i++) + { + _slice_apply(st, st->slices[num], x, y, w, h, ox, oy, ow, oh); + _slice_apply(st, st->slices2[num], x, y, w, h, ox, oy, ow, oh); + _slice_light(st, st->slices[num], ox, oy, ow, oh); + _slice_light(st, st->slices2[num], ox, oy, ow, oh); + num++; + } + } + + for (i = 0; i <= st->slices_w; i++) + { + num = i * st->slices_h; + for (j = 0; j <= st->slices_h; j++) + { + Slice *s[4]; + + s[0] = s[1] = s[2] = s[3] = NULL; + if ((i > 0) && (j > 0)) + s[0] = st->slices[num - 1 - st->slices_h]; + if ((i < st->slices_w) && (j > 0)) + s[1] = st->slices[num - 1]; + if ((i > 0) && (j < st->slices_h)) + s[2] = st->slices[num - st->slices_h]; + if ((i < st->slices_w) && (j < st->slices_h)) + s[3] = st->slices[num]; + if (st->dir == 0) + _slice_obj_vert_color_merge(s[0], 2, s[1], 3, + s[2], 1, s[3], 0); + else if (st->dir == 1) + _slice_obj_vert_color_merge(s[0], 3, s[1], 2, + s[2], 0, s[3], 1); + else if (st->dir == 2) + _slice_obj_vert_color_merge(s[0], 3, s[1], 2, + s[2], 0, s[3], 1); + else if (st->dir == 3) + _slice_obj_vert_color_merge(s[0], 2, s[1], 3, + s[2], 1, s[3], 0); + s[0] = s[1] = s[2] = s[3] = NULL; + if ((i > 0) && (j > 0)) + s[0] = st->slices2[num - 1 - st->slices_h]; + if ((i < st->slices_w) && (j > 0)) + s[1] = st->slices2[num - 1]; + if ((i > 0) && (j < st->slices_h)) + s[2] = st->slices2[num - st->slices_h]; + if ((i < st->slices_w) && (j < st->slices_h)) + s[3] = st->slices2[num]; + if (st->dir == 0) + _slice_obj_vert_color_merge(s[0], 3, s[1], 2, + s[2], 0, s[3], 1); + else if (st->dir == 1) + _slice_obj_vert_color_merge(s[0], 2, s[1], 3, + s[2], 1, s[3], 0); + else if (st->dir == 2) + _slice_obj_vert_color_merge(s[0], 2, s[1], 3, + s[2], 1, s[3], 0); + else if (st->dir == 3) + _slice_obj_vert_color_merge(s[0], 3, s[1], 2, + s[2], 0, s[3], 1); + num++; + } + } + + num = 0; + for (i = 0; i < st->slices_w; i++) + { + for (j = 0; j < st->slices_h; j++) + { + _slice_3d(st, st->slices[num], ox, oy, ow, oh); + _slice_3d(st, st->slices2[num], ox, oy, ow, oh); + num++; + } + } + + return 1; +} + +static void +_state_end(State *st) +{ + _state_slices_clear(st); +} + +static Eina_Bool +_state_anim(void *data, double pos) +{ + State *st = data; + double p; + + p = ecore_animator_pos_map(pos, ECORE_POS_MAP_ACCELERATE, 0.0, 0.0); + if (st->finish) + { + if (st->dir == 0) + st->x = st->ox * (1.0 - p); + else if (st->dir == 1) + st->x = st->ox + ((st->w - st->ox) * p); + else if (st->dir == 2) + st->y = st->oy * (1.0 - p); + else if (st->dir == 3) + st->y = st->oy + ((st->h - st->oy) * p); + } + else + { + if (st->dir == 0) + st->x = st->ox + ((st->w - st->ox) * p); + else if (st->dir == 1) + st->x = st->ox * (1.0 - p); + else if (st->dir == 2) + st->y = st->oy + ((st->h - st->oy) * p); + else if (st->dir == 3) + st->y = st->oy * (1.0 - p); + } + _state_update(st); + if (pos < 1.0) return EINA_TRUE; + evas_object_show(st->front); + evas_object_show(st->back); + _state_end(st); + st->anim = NULL; + return EINA_FALSE; +} + +static void +_update_curl_job(void *data) +{ + State *st = data; + st->job = NULL; + if (_state_update(st)) + { + evas_object_hide(st->front); + evas_object_hide(st->back); + } +} + +static void +im_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + State *st = &state; + Evas_Event_Mouse_Down *ev = event_info; + Evas_Coord x, y, w, h; + + if (ev->button != 1) return; + st->front = data; + st->back = evas_object_data_get(data, "im2"); + st->backflip = 1; + st->down = 1; + evas_object_geometry_get(st->front, &x, &y, &w, &h); + st->x = ev->canvas.x - x; + st->y = ev->canvas.y - y; + st->w = w; + st->h = h; + st->down_x = st->x; + st->down_y = st->y; + st->dir = -1; + if (_state_update(st)) + { + evas_object_hide(st->front); + evas_object_hide(st->back); + } +} + +static void +im_up_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + State *st = &state; + Evas_Event_Mouse_Up *ev = event_info; + Evas_Coord x, y, w, h; + double tm = 0.5; + + if (ev->button != 1) return; + st->down = 0; + evas_object_geometry_get(st->front, &x, &y, &w, &h); + st->x = ev->canvas.x - x; + st->y = ev->canvas.y - y; + st->w = w; + st->h = h; + st->ox = st->x; + st->oy = st->y; + if (st->job) + { + ecore_job_del(st->job); + st->job = NULL; + } + if (st->anim) ecore_animator_del(st->anim); + st->finish = 0; + if (st->dir == 0) + { + tm = (double)st->x / (double)st->w; + if (st->x < (st->w / 2)) st->finish = 1; + } + else if (st->dir == 1) + { + if (st->x > (st->w / 2)) st->finish = 1; + tm = 1.0 - ((double)st->x / (double)st->w); + } + else if (st->dir == 2) + { + if (st->y < (st->h / 2)) st->finish = 1; + tm = (double)st->y / (double)st->h; + } + else if (st->dir == 3) + { + if (st->y > (st->h / 2)) st->finish = 1; + tm = 1.0 - ((double)st->y / (double)st->h); + } + if (tm < 0.01) tm = 0.01; + else if (tm > 0.99) tm = 0.99; + if (!st->finish) tm = 1.0 - tm; + tm *= 0.5; + st->anim = ecore_animator_timeline_add(tm, _state_anim, st); + _state_anim(st, 0.0); +} + +static void +im_move_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + State *st = &state; + Evas_Event_Mouse_Move *ev = event_info; + Evas_Coord x, y, w, h; + + if (!st->down) return; + evas_object_geometry_get(st->front, &x, &y, &w, &h); + st->x = ev->cur.canvas.x - x; + st->y = ev->cur.canvas.y - y; + st->w = w; + st->h = h; + if (st->job) ecore_job_del(st->job); + st->job = ecore_job_add(_update_curl_job, st); +} + +TEST_START(test_flip_page) +{ + Evas_Object *bg, *im, *im2, *rc; + char buf[PATH_MAX]; + + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + im2 = evas_object_image_filled_add(evas_object_evas_get(win)); + snprintf(buf, sizeof(buf), "%s/images/%s", + elm_app_data_dir_get(), "sky_04.jpg"); + evas_object_image_file_set(im2, buf, NULL); + evas_object_move(im2, 40, 40); + evas_object_resize(im2, 400, 400); + evas_object_show(im2); + +#if 0 + im = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(im, buf, "layout"); +#else + im = evas_object_image_filled_add(evas_object_evas_get(win)); + snprintf(buf, sizeof(buf), "%s/images/%s", + elm_app_data_dir_get(), "twofish.jpg"); + evas_object_image_file_set(im, buf, NULL); +#endif + evas_object_move(im, 40, 40); + evas_object_resize(im, 400, 400); + evas_object_show(im); + + evas_object_data_set(im, "im2", im2); + + + rc = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(rc, 0, 0, 0, 0); + evas_object_move(rc, 40, 340); + evas_object_resize(rc, 400, 100); + evas_object_show(rc); + + evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_DOWN, im_down_cb, im); + evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_UP, im_up_cb, im); + evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_MOVE, im_move_cb, im); + + rc = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(rc, 0, 0, 0, 0); + evas_object_move(rc, 40, 40); + evas_object_resize(rc, 400, 100); + evas_object_show(rc); + + evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_DOWN, im_down_cb, im); + evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_UP, im_up_cb, im); + evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_MOVE, im_move_cb, im); + + rc = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(rc, 0, 0, 0, 0); + evas_object_move(rc, 340, 40); + evas_object_resize(rc, 100, 400); + evas_object_show(rc); + + evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_DOWN, im_down_cb, im); + evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_UP, im_up_cb, im); + evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_MOVE, im_move_cb, im); + + rc = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(rc, 0, 0, 0, 0); + evas_object_move(rc, 40, 40); + evas_object_resize(rc, 100, 400); + evas_object_show(rc); + + evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_DOWN, im_down_cb, im); + evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_UP, im_up_cb, im); + evas_object_event_callback_add(rc, EVAS_CALLBACK_MOUSE_MOVE, im_move_cb, im); + + evas_object_resize(win, 480, 480); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_flipselector.c b/src/bin/test_flipselector.c new file mode 100644 index 0000000..bf97ec1 --- /dev/null +++ b/src/bin/test_flipselector.c @@ -0,0 +1,107 @@ +#include +#include "tsuite.h" + +void +_sel_cb(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Elm_Flipselector_Item *it; + + it = event_info; + printf("label of selected item is: %s\n", elm_flipselector_item_label_get(it)); +} + +void +_unsel_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Elm_Flipselector_Item *it; + Evas_Object *fp = data; + it = elm_flipselector_selected_item_get(fp); + elm_flipselector_item_selected_set(it, EINA_FALSE); +} + +void +_third_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Elm_Flipselector_Item *it; + Evas_Object *fp = data; + it = elm_flipselector_first_item_get(fp); + it = elm_flipselector_item_next_get(it); + it = elm_flipselector_item_next_get(it); + elm_flipselector_item_selected_set(it, EINA_TRUE); +} + +void +_underflow_cb(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("underflow!\n"); +} + +void +_overflow_cb(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("overflow!\n"); +} + +TEST_START(test_flipselector) +{ + char buf[8]; + unsigned int i; + Evas_Object *bg, *bx, *fp, *bt; + static const char *lbl[] = { + "Elementary", + "Evas", + "Eina", + "Edje", + "Eet", + "Ecore", + "Efreet", + "Edbus" + }; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + fp = elm_flipselector_add(win); + evas_object_size_hint_weight_set(fp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_smart_callback_add(fp, "selected", _sel_cb, NULL); + evas_object_smart_callback_add(fp, "underflowed", _overflow_cb, NULL); + evas_object_smart_callback_add(fp, "overflowed", _underflow_cb, NULL); + for (i = 0; i < sizeof(lbl)/sizeof(char *); i++) + elm_flipselector_item_append(fp, lbl[i], NULL, NULL); + elm_box_pack_end(bx, fp); + evas_object_show(fp); + + fp = elm_flipselector_add(win); + evas_object_smart_callback_add(fp, "underflowed", _overflow_cb, NULL); + evas_object_smart_callback_add(fp, "overflowed", _underflow_cb, NULL); + evas_object_size_hint_weight_set(fp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + for (i = 2099; i >= 1990; i--) + { + snprintf(buf, 8, "%d", i); + elm_flipselector_item_append(fp, buf, _sel_cb, NULL); + } + elm_box_pack_end(bx, fp); + evas_object_show(fp); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Select 2097"); + evas_object_smart_callback_add(bt, "clicked", _third_cb, fp); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Unselect year"); + evas_object_smart_callback_add(bt, "clicked", _unsel_cb, fp); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_floating.c b/src/bin/test_floating.c new file mode 100644 index 0000000..927a14e --- /dev/null +++ b/src/bin/test_floating.c @@ -0,0 +1,102 @@ +#include +#include "tsuite.h" + +typedef struct _Testitem +{ + Elm_Genlist_Item *item; + int mode; + int onoff; +} Testitem; + + +static Elm_Genlist_Item_Class itc1; +static char *glf_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__) +{ + char buf[256]; + snprintf(buf, sizeof(buf), "Item # %i", (int)(long)data); + return strdup(buf); +} + +static Evas_Object *glf_content_get(void *data __UNUSED__, Evas_Object *obj, const char *part __UNUSED__) +{ + char buf[PATH_MAX]; + Evas_Object *ic = elm_icon_add(obj); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + return ic; +} +static Eina_Bool glf_state_get(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *part __UNUSED__) +{ + return EINA_FALSE; +} +static void glf_del(void *data __UNUSED__, Evas_Object *obj __UNUSED__) +{ +} + +static void +gl_sel(void *data, Evas_Object *obj, void *event_info) +{ + printf("sel item data [%p] on genlist obj [%p], item pointer [%p]\n", data, obj, event_info); +} + +static Eina_Bool +anim(void *data) +{ + Evas_Object *gl = data; + Evas_Coord x, y; + + y = 0; + x = (sin(ecore_loop_time_get()) * 500); + evas_object_move(gl, x, y); + return ECORE_CALLBACK_RENEW; +} + +static void +_del(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Ecore_Animator *ani = data; + + ecore_animator_del(ani); +} + +TEST_START(test_floating) +{ + Evas_Object *bg, *gl; + int i; + Ecore_Animator *ani; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + gl = elm_genlist_add(win); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_move(gl, 800, 0); + evas_object_resize(gl, 480, 800); + evas_object_show(gl); + + itc1.item_style = "default"; + itc1.func.text_get = glf_text_get; + itc1.func.content_get = glf_content_get; + itc1.func.state_get = glf_state_get; + itc1.func.del = glf_del; + + for (i = 0; i < 20; i++) + { + elm_genlist_item_append(gl, &itc1, + (void *)(long)i/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_NONE, + gl_sel/* func */, + (void *)(long)(i * 10)/* func data */); + } + evas_object_resize(win, 480, 800); + evas_object_show(win); + + ani = ecore_animator_add(anim, gl); + evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _del, ani); +} +TEST_END diff --git a/src/bin/test_focus.c b/src/bin/test_focus.c new file mode 100644 index 0000000..0633d6b --- /dev/null +++ b/src/bin/test_focus.c @@ -0,0 +1,371 @@ +#include +#include "tsuite.h" + +static Eina_Bool +_event(void *data __UNUSED__, Evas_Object *obj __UNUSED__, Evas_Object *src __UNUSED__, Evas_Callback_Type type, void *event_info) +{ + if (type == EVAS_CALLBACK_KEY_DOWN) + printf ("Key Down:"); + else if (type == EVAS_CALLBACK_KEY_UP) + printf ("Key Up:"); + else + return EINA_FALSE; + Evas_Event_Key_Down *ev = event_info; + printf("%s\n", ev->key); + + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; + return EINA_TRUE; +} + +static void +_on_key_down(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *einfo __UNUSED__) +{ + //Evas_Event_Key_Down *event = einfo; + //printf("%s %p Key %s Parent %p\n", evas_object_type_get(obj), + // obj, event->keyname, evas_object_smart_parent_get(obj)); +} + +static void +_disable(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *bt = data; + elm_object_disabled_set(bt, EINA_TRUE); +} + +static void +_enable(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *bt = data; + elm_object_disabled_set(bt, EINA_FALSE); +} + +static inline void +my_show(Evas_Object *obj) +{ + evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_DOWN, + _on_key_down, NULL); + evas_object_show(obj); +} + +TEST_START(test_focus) +{ + unsigned int i, j; + + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + evas_object_resize(win, 800, 600); + elm_object_event_callback_add(win, _event, NULL); + my_show(win); + + { + Evas_Object *bg; + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + my_show(bg); + } + + Evas_Object *mainbx = elm_box_add(win); + elm_box_horizontal_set(mainbx, EINA_TRUE); + elm_win_resize_object_add(win, mainbx); + evas_object_size_hint_weight_set(mainbx, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + my_show(mainbx); + + { //First Col + Evas_Object *bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + elm_box_pack_end(mainbx, bx); + my_show(bx); + + { + Evas_Object *lb = elm_label_add(win); + elm_object_text_set(lb, + "Use Tab, Shift+Tab, and
" + "Arrow Keys
" + ); + evas_object_size_hint_weight_set(lb, 0.0, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, + EVAS_HINT_FILL); + elm_box_pack_end(bx, lb); + my_show(lb); + } + + { + Evas_Object *tg = elm_check_add(win); + elm_object_style_set(tg, "toggle"); + elm_object_part_text_set(tg, "on", "Yes"); + elm_object_part_text_set(tg, "off", "No"); + elm_box_pack_end(bx, tg); + my_show(tg); + } + + { + Evas_Object *en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_entry_entry_set(en, "This is a single line"); + elm_entry_single_line_set(en, 1); + elm_box_pack_end(bx, en); + my_show(en); + } + + { + Evas_Object *bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx2, 0.0, 0.0); + elm_box_pack_end(bx, bx2); + + for (i = 2; i; i--) + { + Evas_Object *bt; + bt = elm_button_add(win); + elm_object_text_set(bt, "Box"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + if (i%2) + elm_object_disabled_set(bt, EINA_TRUE); + elm_box_pack_end(bx2, bt); + my_show(bt); + } + + { + Evas_Object *sc = elm_scroller_add(win); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, + EVAS_HINT_FILL); + elm_scroller_bounce_set(sc, 1, 1); + elm_scroller_content_min_limit(sc, 1, 1); + elm_box_pack_end(bx2, sc); + my_show(sc); + + { + Evas_Object *bt; + bt = elm_button_add(win); + elm_object_text_set(bt, "Scroller"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + elm_object_event_callback_add(bt, _event, NULL); + elm_object_content_set(sc, bt); + my_show(bt); + elm_object_event_callback_del(bt, _event, NULL); + } + } + + my_show(bx2); + } + + { + Evas_Object *bt; + bt = elm_button_add(win); + elm_object_text_set(bt, "Box"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + elm_box_pack_end(bx, bt); + my_show(bt); + } + + { + Evas_Object *bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx2, 0.0, 0.0); + elm_box_pack_end(bx, bx2); + my_show(bx2); + + for (i = 2; i; i--) + { + Evas_Object *bx3 = elm_box_add(win); + evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx3, 0.0, 0.0); + elm_box_pack_end(bx2, bx3); + my_show(bx3); + + for (j = 3; j; j--) + { + Evas_Object *bt; + bt = elm_button_add(win); + elm_object_text_set(bt, "Box"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + elm_box_pack_end(bx3, bt); + my_show(bt); + } + } + + { + Evas_Object *sc = elm_scroller_add(win); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, + EVAS_HINT_FILL); + elm_scroller_bounce_set(sc, 0, 1); + elm_scroller_content_min_limit(sc, 1, 0); + elm_box_pack_end(bx2, sc); + my_show(sc); + + Evas_Object *bx3 = elm_box_add(win); + evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx3, 0.0, 0.0); + elm_object_content_set(sc, bx3); + my_show(bx3); + + for (i = 5; i; i--) + { + Evas_Object *bt; + bt = elm_button_add(win); + elm_object_text_set(bt, "BX Scroller"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + elm_box_pack_end(bx3, bt); + my_show(bt); + } + } + } + } + + {//Second Col + char buf[PATH_MAX]; + Evas_Object *ly = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "twolines"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + elm_box_pack_end(mainbx, ly); + my_show(ly); + + { + Evas_Object *bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx2, 0.0, 0.0); + elm_object_part_content_set(ly, "element1", bx2); + my_show(bx2); + + for (i = 3; i; i--) + { + Evas_Object *bt; + bt = elm_button_add(win); + elm_object_text_set(bt, "Layout"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + elm_box_pack_end(bx2, bt); + my_show(bt); + elm_object_focus_custom_chain_prepend(bx2, bt, NULL); + } + } + + { + Evas_Object *bx2 = elm_box_add(win); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx2, 0.0, 0.0); + elm_object_part_content_set(ly, "element2", bx2); + my_show(bx2); + + { + Evas_Object *bt; + bt = elm_button_add(win); + elm_object_text_set(bt, "Disable"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_smart_callback_add(bt, "clicked", _disable, bt); + my_show(bt); + elm_object_focus_custom_chain_prepend(bx2, bt, NULL); + + Evas_Object *bt2; + bt2 = elm_button_add(win); + elm_object_text_set(bt2, "Enable"); + evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt2, 0.0, 0.0); + elm_box_pack_end(bx2, bt2); + evas_object_smart_callback_add(bt2, "clicked", _enable, bt); + my_show(bt2); + elm_object_focus_custom_chain_append(bx2, bt2, NULL); + } + + } + } + + {//Third Col + Evas_Object *bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + elm_box_pack_end(mainbx, bx); + my_show(bx); + + { + Evas_Object *fr = elm_frame_add(win); + elm_object_text_set(fr, "Frame"); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + { + Evas_Object *tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_content_set(fr, tb); + my_show(tb); + for (j = 0; j < 1; j++) + for (i = 0; i < 2; i++) + { + Evas_Object *bt; + bt = elm_button_add(win); + elm_object_text_set(bt, "Table"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_table_pack(tb, bt, i, j, 1, 1); + my_show(bt); + } + } + } + + { + Evas_Object *fr = elm_bubble_add(win); + elm_object_text_set(fr, "Bubble"); + evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, + EVAS_HINT_FILL); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + { + Evas_Object *tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_content_set(fr, tb); + my_show(tb); + for (j = 0; j < 2; j++) + for (i = 0; i < 1; i++) + { + Evas_Object *bt; + bt = elm_button_add(win); + elm_object_text_set(bt, "Table"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_table_pack(tb, bt, i, j, 1, 1); + my_show(bt); + } + } + } + } +} +TEST_END diff --git a/src/bin/test_focus2.c b/src/bin/test_focus2.c new file mode 100644 index 0000000..d90a5e5 --- /dev/null +++ b/src/bin/test_focus2.c @@ -0,0 +1,148 @@ +#include +#include "tsuite.h" + +static void +_focus_in(void *data __UNUSED__, Evas *e __UNUSED__, void *event_info) +{ + const char *type = evas_object_type_get(event_info); + if ((type) && (!strcmp(type, "elm_widget"))) + type = elm_object_widget_type_get(event_info); + printf("Evas_Object focus in: %p %s\n", event_info, type); +} + +static void +_focus_out(void *data __UNUSED__, Evas *e __UNUSED__, void *event_info) +{ + const char *type = evas_object_type_get(event_info); + if ((type) && (!strcmp(type, "elm_widget"))) + type = elm_object_widget_type_get(event_info); + printf("Evas_Object focus out: %p %s\n", event_info, type); +} + +static void +_focus_obj(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *newfocus = data; + const char *type = evas_object_type_get(newfocus); + if ((type) && (!strcmp(type, "elm_widget"))) + type = elm_object_widget_type_get(newfocus); + printf("elm_object_focus_set(%p, EINA_TRUE) %s\n", newfocus, type); + elm_object_focus_set(newfocus, EINA_TRUE); +} + +static void +_focus_layout_part(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *ed = elm_layout_edje_get(data); + + Evas_Object *newfocus = (Evas_Object *)edje_object_part_object_get(ed, "sky"); + const char *type = evas_object_type_get(newfocus); + printf("evas_object_focus_set(%p, 1) %s\n", newfocus, type); + evas_object_focus_set(newfocus, EINA_TRUE);; +} + + +TEST_START(test_focus2) +{ + Evas_Object *bg, *bx, *ly, *bt, *en, *bt1; + char buf[PATH_MAX]; + + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + + evas_event_callback_add + (evas_object_evas_get(win), EVAS_CALLBACK_CANVAS_OBJECT_FOCUS_IN, + _focus_in, NULL); + evas_event_callback_add + (evas_object_evas_get(win), EVAS_CALLBACK_CANVAS_OBJECT_FOCUS_OUT, + _focus_out, NULL); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + elm_win_resize_object_add(win, bx); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx); + +#define PARENT bx /* this is broken, but should work */ +//#define PARENT win + + en = elm_entry_add(PARENT); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_entry_set(en, "Scrolled Entry that should get focus"); + elm_entry_single_line_set(en, 1); + evas_object_show(en); + elm_box_pack_end(bx, en); + + bt = elm_button_add(PARENT); + elm_object_text_set(bt, "Give focus to scrolled entry"); + evas_object_smart_callback_add(bt, "clicked", _focus_obj, en); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + ly = elm_layout_add(PARENT); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "layout"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, ly); + evas_object_show(ly); + + bt1 = bt = elm_button_add(ly); + elm_object_text_set(bt, "Button 1"); + elm_object_part_content_set(ly, "element1", bt); + + en = elm_entry_add(ly); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_entry_set(en, "Scrolled Entry that should get focus"); + elm_entry_single_line_set(en, 1); + elm_object_part_content_set(ly, "element2", en); + + bt = elm_button_add(ly); + elm_object_text_set(bt, "Button 2"); + elm_object_part_content_set(ly, "element3", bt); + + bt = elm_button_add(PARENT); + elm_object_text_set(bt, "Give focus to layout"); + evas_object_smart_callback_add(bt, "clicked", _focus_obj, ly); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(PARENT); + elm_object_text_set(bt, "Give focus to layout part"); + evas_object_smart_callback_add(bt, "clicked", _focus_layout_part, ly); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(PARENT); + elm_object_text_set(bt, "Give focus to layout 'Button 1'"); + evas_object_smart_callback_add(bt, "clicked", _focus_obj, bt1); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(PARENT); + elm_object_text_set(bt, "Give focus to layout 'Entry'"); + evas_object_smart_callback_add(bt, "clicked", _focus_obj, en); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + evas_object_resize(win, 400, 400); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_focus3.c b/src/bin/test_focus3.c new file mode 100644 index 0000000..957c41d --- /dev/null +++ b/src/bin/test_focus3.c @@ -0,0 +1,107 @@ +/* Test for Focus Chain Linear*/ +#include +#include "tsuite.h" + +static Evas_Object *foc = NULL; + +static void +_foc(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + foc = obj; + printf("foc -> %p\n", foc); +} + +static void +_unfoc(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + foc = NULL; + printf("foc -> %p\n", foc); +} + +static void +_add(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *bx = data, *en; + + en = elm_entry_add(elm_object_top_widget_get(bx)); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_entry_set(en, "An entry"); + evas_object_smart_callback_add(en, "focused", _foc, NULL); + evas_object_smart_callback_add(en, "unfocused", _unfoc, NULL); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_entry_single_line_set(en, 1); + elm_box_pack_start(bx, en); + evas_object_show(en); +} + +static void +_del(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + if (foc) evas_object_del(foc); +} + +static void +_hide(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + if (foc) evas_object_hide(foc); +} + +TEST_START(test_focus3) +{ + Evas_Object *bg, *bx, *bt, *en; + + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + evas_object_resize(win, 320, 480); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_entry_set(en, "An entry"); + evas_object_smart_callback_add(en, "focused", _foc, NULL); + evas_object_smart_callback_add(en, "unfocused", _unfoc, NULL); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_entry_single_line_set(en, 1); + elm_box_pack_end(bx, en); + evas_object_show(en); + + bt = elm_button_add(win); + elm_object_focus_allow_set(bt, 0); + elm_object_text_set(bt, "Add"); + evas_object_smart_callback_add(bt, "clicked", _add, bx); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_focus_allow_set(bt, 0); + elm_object_text_set(bt, "Del"); + evas_object_smart_callback_add(bt, "clicked", _del, NULL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_focus_allow_set(bt, 0); + elm_object_text_set(bt, "Hide"); + evas_object_smart_callback_add(bt, "clicked", _hide, NULL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_gengrid.c b/src/bin/test_gengrid.c new file mode 100644 index 0000000..e61ed02 --- /dev/null +++ b/src/bin/test_gengrid.c @@ -0,0 +1,539 @@ +#include +#include "tsuite.h" + +typedef struct _Testitem +{ + Elm_Gengrid_Item *item; + const char *path; + int mode; + int onoff; +} Testitem; + +static const char *img[9] = +{ + "panel_01.jpg", + "plant_01.jpg", + "rock_01.jpg", + "rock_02.jpg", + "sky_01.jpg", + "sky_02.jpg", + "sky_03.jpg", + "sky_04.jpg", + "wood_01.jpg", +}; + +static Elm_Gengrid_Item_Class gic, ggic; + +static void +_horizontal_grid(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *grid = data; + elm_gengrid_horizontal_set(grid, elm_check_state_get(obj)); +} + +static void +grid_drag_up(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + printf("Drag up: %p\n", event_info); +} + +static void +grid_drag_right(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + printf("Drag right: %p\n", event_info); +} + +static void +grid_drag_down(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + printf("Drag down: %p\n", event_info); +} + +static void +grid_drag_left(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + printf("Drag left: %p\n", event_info); +} + +static void +grid_drag_stop(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + printf("Drag stop: %p\n", event_info); +} + +static void +grid_selected(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + printf("Selected: %p\n", event_info); +} + +static void +grid_double_clicked(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + printf("Double clicked: %p\n", event_info); +} + +static void +grid_longpress(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + printf("longpress %p\n", event_info); +} + +static void +grid_moved(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + printf("moved %p\n", event_info); +} + +static void +grid_item_check_changed(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Testitem *ti = data; + ti->onoff = elm_check_state_get(obj); + printf("item %p onoff = %i\n", ti, ti->onoff); +} + +char * +grid_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__) +{ + const Testitem *ti = data; + char buf[256]; + snprintf(buf, sizeof(buf), "Photo %s", ti->path); + return strdup(buf); +} + +Evas_Object * +grid_content_get(void *data, Evas_Object *obj, const char *part) +{ + const Testitem *ti = data; + if (!strcmp(part, "elm.swallow.icon")) + { + + Evas_Object *icon = elm_bg_add(obj); + elm_bg_file_set(icon, ti->path, NULL); + evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + evas_object_show(icon); + return icon; + } + else if (!strcmp(part, "elm.swallow.end")) + { + Evas_Object *ck; + ck = elm_check_add(obj); + evas_object_propagate_events_set(ck, 0); + elm_check_state_set(ck, ti->onoff); + evas_object_smart_callback_add(ck, "changed", grid_item_check_changed, data); + evas_object_show(ck); + return ck; + } + return NULL; +} + +Eina_Bool +grid_state_get(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *part __UNUSED__) +{ + return EINA_FALSE; +} + +void +grid_del(void *data __UNUSED__, Evas_Object *obj __UNUSED__) +{ +} + +static void +grid_sel(void *data, Evas_Object *obj, void *event_info) +{ + printf("sel item data [%p] on grid obj [%p], pointer [%p]\n", data, obj, event_info); +} + +enum _api_state +{ + GRID_ALIGN_SET, + GRID_BRING_IN, + GRID_NO_SELECT_MODE, + GRID_NO_BOUNCE, + GRID_PAGE_RELATIVE, + GRID_PAGE_SIZE, + GRID_TOOLTIP_SET_TEXT, + GRID_TOOLTIP_UNSET, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + Evas_Object *grid = api->data; + + /* use elm_box_children_get() to get list of children */ + switch(api->state) + { /* Put all api-changes under switch */ + case GRID_ALIGN_SET: /* 0 */ + elm_gengrid_align_set(grid, 0.2, 0.8); + break; + + case GRID_BRING_IN: /* 1 */ + elm_gengrid_item_bring_in(elm_gen_first_item_get(grid)); + break; + + case GRID_NO_SELECT_MODE: /* 2 */ + elm_gen_no_select_mode_set(grid, EINA_TRUE); + break; + + case GRID_NO_BOUNCE: /* 3 */ + elm_gen_bounce_set(grid, EINA_TRUE, EINA_FALSE); + break; + + case GRID_PAGE_RELATIVE: /* 4 */ + elm_gen_bounce_set(grid, EINA_TRUE, EINA_TRUE); + elm_gen_page_relative_set(grid, 0.5, 0.5); + break; + + case GRID_PAGE_SIZE: /* 5 */ + elm_gen_page_size_set(grid, 50, 25); + break; + + case GRID_TOOLTIP_SET_TEXT: /* 6 */ + { + Elm_Gengrid_Item *item = elm_gen_first_item_get(grid); + elm_gengrid_item_tooltip_text_set(item, "This is the first item"); + } + break; + + case GRID_TOOLTIP_UNSET: /* 7 */ + { + Elm_Gengrid_Item *item = elm_gen_first_item_get(grid); + elm_gengrid_item_tooltip_unset(item); + } + break; + + case API_STATE_LAST: + break; + + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(a->bt, str); + elm_object_disabled_set(a->bt, a->state == API_STATE_LAST); +} + +TEST_START(test_gengrid) +{ + Evas_Object *bg, *bxx, *grid; + static Testitem ti[144]; + int i, n; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + bxx = elm_box_add(win); + elm_win_resize_object_add(win, bxx); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bxx); + + grid = elm_gengrid_add(win); + elm_gengrid_item_size_set(grid, 150, 150); + elm_gengrid_horizontal_set(grid, EINA_FALSE); + elm_gengrid_multi_select_set(grid, EINA_TRUE); + elm_gengrid_reorder_mode_set(grid, EINA_TRUE); + evas_object_smart_callback_add(grid, "selected", grid_selected, NULL); + evas_object_smart_callback_add(grid, "clicked,double", grid_double_clicked, NULL); + evas_object_smart_callback_add(grid, "longpressed", grid_longpress, NULL); + evas_object_smart_callback_add(grid, "moved", grid_moved, NULL); + evas_object_smart_callback_add(grid, "drag,start,up", grid_drag_up, NULL); + evas_object_smart_callback_add(grid, "drag,start,right", grid_drag_right, NULL); + evas_object_smart_callback_add(grid, "drag,start,down", grid_drag_down, NULL); + evas_object_smart_callback_add(grid, "drag,start,left", grid_drag_left, NULL); + evas_object_smart_callback_add(grid, "drag,stop", grid_drag_stop, NULL); + evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL); + + api->data = grid; + api->bt = elm_button_add(win); + elm_object_text_set(api->bt, "Next API function"); + evas_object_smart_callback_add(api->bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, api->bt); + elm_object_disabled_set(api->bt, api->state == API_STATE_LAST); + evas_object_show(api->bt); + + elm_box_pack_end(bxx, grid); + + gic.item_style = "default"; + gic.func.text_get = grid_text_get; + gic.func.content_get = grid_content_get; + gic.func.state_get = grid_state_get; + gic.func.del = grid_del; + + n = 0; + for (i = 0; i < 12 * 12; i++) + { + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]); + n = (n + 1) % 9; + ti[i].mode = i; + ti[i].path = eina_stringshare_add(buf); + ti[i].item = elm_gengrid_item_append(grid, &gic, &(ti[i]), grid_sel, NULL); + if (!(i % 5)) + elm_gen_item_selected_set(ti[i].item, EINA_TRUE); + } + + evas_object_show(grid); + + evas_object_resize(win, 600, 600); + evas_object_show(win); +} +TEST_END + +static void +_before_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Testitem *ti; + Evas_Object *grid = data; + Elm_Gengrid_Item *sel; + char buf[PATH_MAX]; + + sel = elm_gengrid_selected_item_get(grid); + if (!sel) + return; + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[rand() % 9]); + ti = malloc(sizeof(*ti)); + ti->mode = 0; + ti->path = eina_stringshare_add(buf); + ti->item = elm_gengrid_item_insert_before(grid, &gic, ti, sel, grid_sel, + NULL); +} + +static void +_after_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Testitem *ti; + Evas_Object *grid = data; + Elm_Gengrid_Item *sel; + char buf[PATH_MAX]; + + sel = elm_gengrid_selected_item_get(grid); + if (!sel) + return; + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[rand() % 9]); + ti = malloc(sizeof(*ti)); + ti->mode = 0; + ti->path = eina_stringshare_add(buf); + ti->item = elm_gengrid_item_insert_after(grid, &gic, ti, sel, grid_sel, + NULL); +} + +static void +_delete_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *grid = data; + Eina_List *l, *l2, *l3; + Elm_Gengrid_Item *it; + + l = (Eina_List*)elm_gengrid_selected_items_get(grid); + if (!l) return; + EINA_LIST_FOREACH_SAFE(l, l2, l3, it) + elm_gengrid_item_del(it); +} + +static void +_prepend_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Testitem *ti; + Evas_Object *grid = data; + char buf[PATH_MAX]; + + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[rand() % 9]); + ti = malloc(sizeof(*ti)); + ti->mode = 0; + ti->path = eina_stringshare_add(buf); + ti->item = elm_gengrid_item_prepend(grid, &gic, ti, grid_sel, NULL); +} + +static void +_append_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Testitem *ti; + Evas_Object *grid = data; + char buf[PATH_MAX]; + + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[rand() % 9]); + ti = malloc(sizeof(*ti)); + ti->mode = 0; + ti->path = eina_stringshare_add(buf); + ti->item = elm_gengrid_item_append(grid, &gic, ti, grid_sel, NULL); +} + +static void +_size_changed(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *grid = data; + int size = elm_spinner_value_get(obj); + elm_gengrid_item_size_set(grid, size, size); +} + +TEST_START(test_gengrid2) +{ + Evas_Object *bg, *grid, *bx, *hbx, *bt, *ck; + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + grid = elm_gengrid_add(win); + elm_gengrid_item_size_set(grid, 150, 150); + elm_gengrid_horizontal_set(grid, EINA_FALSE); + elm_gengrid_multi_select_set(grid, EINA_FALSE); + evas_object_smart_callback_add(grid, "selected", grid_selected, NULL); + evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_min_set(grid, 600, 500); + elm_box_pack_end(bx, grid); + evas_object_show(grid); + + hbx = elm_box_add(win); + evas_object_size_hint_weight_set(hbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_horizontal_set(hbx, EINA_TRUE); + elm_box_pack_end(bx, hbx); + evas_object_show(hbx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Append"); + evas_object_smart_callback_add(bt, "clicked", _append_bt_clicked, grid); + elm_box_pack_end(hbx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Prepend"); + evas_object_smart_callback_add(bt, "clicked", _prepend_bt_clicked, grid); + elm_box_pack_end(hbx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Insert before"); + evas_object_smart_callback_add(bt, "clicked", _before_bt_clicked, grid); + elm_box_pack_end(hbx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Insert after"); + evas_object_smart_callback_add(bt, "clicked", _after_bt_clicked, grid); + elm_box_pack_end(hbx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Delete"); + evas_object_smart_callback_add(bt, "clicked", _delete_bt_clicked, grid); + elm_box_pack_end(hbx, bt); + evas_object_show(bt); + + bt = elm_spinner_add(win); + elm_spinner_min_max_set(bt, 10, 1024); + elm_spinner_value_set(bt, 150); + elm_spinner_label_format_set(bt, "Item size: %.0f"); + evas_object_smart_callback_add(bt, "changed", _size_changed, grid); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(hbx, bt); + evas_object_show(bt); + + ck = elm_check_add(win); + elm_object_text_set(ck, "Horizontal Mode"); + evas_object_smart_callback_add(ck, "changed", _horizontal_grid, grid); + elm_box_pack_end(hbx, ck); + evas_object_show(ck); + + gic.item_style = "default"; + gic.func.text_get = grid_text_get; + gic.func.content_get = grid_content_get; + gic.func.state_get = grid_state_get; + gic.func.del = grid_del; + + evas_object_resize(win, 600, 600); + evas_object_show(win); +} +TEST_END + +TEST_START(test_gengrid3) +{ + Evas_Object *bg, *grid; + static Testitem ti[144]; + int i, n; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + grid = elm_gengrid_add(win); + elm_gengrid_item_size_set(grid, 150, 150); + elm_gengrid_group_item_size_set(grid, 31, 31); + //elm_gengrid_horizontal_set(grid, EINA_TRUE); + elm_gengrid_horizontal_set(grid, EINA_FALSE); + elm_gengrid_multi_select_set(grid, EINA_TRUE); + elm_gengrid_reorder_mode_set(grid, EINA_TRUE); + evas_object_smart_callback_add(grid, "selected", grid_selected, NULL); + evas_object_smart_callback_add(grid, "clicked,double", grid_double_clicked, NULL); + evas_object_smart_callback_add(grid, "longpressed", grid_longpress, NULL); + evas_object_smart_callback_add(grid, "moved", grid_moved, NULL); + evas_object_smart_callback_add(grid, "drag,start,up", grid_drag_up, NULL); + evas_object_smart_callback_add(grid, "drag,start,right", grid_drag_right, NULL); + evas_object_smart_callback_add(grid, "drag,start,down", grid_drag_down, NULL); + evas_object_smart_callback_add(grid, "drag,start,left", grid_drag_left, NULL); + evas_object_smart_callback_add(grid, "drag,stop", grid_drag_stop, NULL); + evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + gic.item_style = "default"; + gic.func.text_get = grid_text_get; + gic.func.content_get = grid_content_get; + gic.func.state_get = grid_state_get; + gic.func.del = grid_del; + + ggic.item_style = "group_index"; + ggic.func.text_get = grid_text_get; + ggic.func.content_get = NULL; + ggic.func.state_get = NULL; + ggic.func.del = NULL; + + + n = 0; + for (i = 0; i < 12 * 12; i++) + { + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), img[n]); + n = (n + 1) % 9; + ti[i].mode = i; + ti[i].path = eina_stringshare_add(buf); + if (i == 0 || i == 18 || i == 53 || i == 100) + //if (i == 0 || i == 18) + ti[i].item = elm_gengrid_item_append(grid, &ggic, &(ti[i]), grid_sel, NULL); + else + ti[i].item = elm_gengrid_item_append(grid, &gic, &(ti[i]), grid_sel, NULL); + if (!(i % 5)) + elm_gen_item_selected_set(ti[i].item, EINA_TRUE); + } + + evas_object_show(grid); + elm_win_resize_object_add(win, grid); + + evas_object_resize(win, 600, 600); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_genlist.c b/src/bin/test_genlist.c new file mode 100644 index 0000000..f48f702 --- /dev/null +++ b/src/bin/test_genlist.c @@ -0,0 +1,1997 @@ +#include +#include +#include "tsuite.h" + +/* Hint: + * In this example some calls to elm_genlist_item_append() are used which give the + * value of an int as 'item data' and 'func data' after casting into (void*). For + * sure this works only on architectures where sizeof(int)==sizeof(void*). + * For real world usage you should hold a data structure or value in your + * application and then give only a pointer to this data as data pointer. + */ + +typedef struct _Testitem +{ + Elm_Genlist_Item *item; + int mode; + int onoff; +} Testitem; + + +static Elm_Genlist_Item_Class itc1; +char *gl_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__) +{ + char buf[256]; + snprintf(buf, sizeof(buf), "Item # %i", (int)(long)data); + return strdup(buf); +} + +Evas_Object *gl_content_get(void *data __UNUSED__, Evas_Object *obj, const char *part) +{ + char buf[PATH_MAX]; + Evas_Object *ic = elm_icon_add(obj); + if (!strcmp(part, "elm.swallow.end")) + snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get()); + else + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + return ic; +} +Eina_Bool gl_state_get(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *part __UNUSED__) +{ + return EINA_FALSE; +} +void gl_del(void *data __UNUSED__, Evas_Object *obj __UNUSED__) +{ +} + +static void +gl_sel(void *data, Evas_Object *obj, void *event_info) +{ + printf("sel item data [%p] on genlist obj [%p], item pointer [%p]\n", data, obj, event_info); +} + +static void +_move(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Evas_Object *gl = data; + Evas_Event_Mouse_Move *ev = event_info; + int where = 0; + Elm_Genlist_Item *gli; + gli = elm_genlist_at_xy_item_get(gl, ev->cur.canvas.x, ev->cur.canvas.y, &where); + if (gli) + printf("over %p, where %i\n", elm_genlist_item_data_get(gli), where); + else + printf("over none, where %i\n", where); +} + +static void +_bt50_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_genlist_item_bring_in(data); +} + +static void +_bt1500_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_genlist_item_middle_bring_in(data); +} + +static void +_gl_selected(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + printf("selected: %p\n", event_info); +} + +static void +_gl_double_clicked(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + printf("double clicked: %p\n", event_info); +} + +static void +_gl_longpress(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + printf("longpress %p\n", event_info); +} + +enum _api_state +{ + HORIZONTAL_SET, + NO_SELECT_MODE_SET, + COMPRESS_MODE_SET, + BOUNCE_SET, + HOMOGENEOUS_SET, + SCROLLER_POLICY_SET, + TOOLTIP_TEXT_SET, + ITEM_CURSOR_SET, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + const Eina_List *items = elm_box_children_get(api->data); + if(!eina_list_count(items)) + return; + + Evas_Object *gl = eina_list_nth(items, 0); /* Genlist is the first item */ + /* use elm_box_children_get() to get list of children */ + switch(api->state) + {/* Put all api-changes under switch */ + case HORIZONTAL_SET: /* 0 */ + elm_genlist_horizontal_set(gl, ELM_LIST_LIMIT); + break; + + case NO_SELECT_MODE_SET: /* 1 */ + elm_gen_no_select_mode_set(gl, EINA_TRUE); + elm_genlist_horizontal_set(gl, ELM_LIST_SCROLL); /* Back to default */ + break; + + case COMPRESS_MODE_SET: /* 2 */ + elm_gen_no_select_mode_set(gl, EINA_FALSE); /* Back to default */ + elm_genlist_compress_mode_set(gl, EINA_TRUE); + break; + + case BOUNCE_SET: /* 3 */ + elm_gen_bounce_set(gl, EINA_FALSE, EINA_FALSE); + break; + + case HOMOGENEOUS_SET: /* 4 */ + elm_gen_bounce_set(gl, EINA_TRUE, EINA_TRUE); /* Back to default */ + elm_genlist_homogeneous_set(gl, EINA_TRUE); + break; + + case SCROLLER_POLICY_SET: /* 5 */ + elm_genlist_homogeneous_set(gl, EINA_FALSE); /* Back to default */ + elm_genlist_scroller_policy_set(gl, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON); + break; + + case TOOLTIP_TEXT_SET: /* 6 */ + { + elm_genlist_item_tooltip_text_set(elm_gen_first_item_get(gl), "Tooltip text from API"); + elm_genlist_item_bring_in(elm_gen_first_item_get(gl)); + } + break; + + case ITEM_CURSOR_SET: /* 7 */ + elm_genlist_item_cursor_set(elm_gen_first_item_get(gl), ELM_CURSOR_HAND2); + break; + + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(a->bt, str); + elm_object_disabled_set(a->bt, a->state == API_STATE_LAST); +} + +TEST_START(test_genlist) +{ + Evas_Object *bg, *gl, *bt_50, *bt_1500, *bx, *bxx; + Evas_Object *over; + Elm_Genlist_Item *gli; + int i; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bxx = elm_box_add(win); + elm_win_resize_object_add(win, bxx); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bxx); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + api->data = bx; + evas_object_show(bx); + + api->bt = elm_button_add(win); + elm_object_text_set(api->bt, "Next API function"); + evas_object_smart_callback_add(api->bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, api->bt); + elm_object_disabled_set(api->bt, api->state == API_STATE_LAST); + evas_object_show(api->bt); + + elm_box_pack_end(bxx, bx); + + gl = elm_genlist_add(win); + evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL); + evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL); + evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL); + // FIXME: This causes genlist to resize the horiz axis very slowly :( + // Reenable this and resize the window horizontally, then try to resize it back + //elm_genlist_horizontal_mode_set(gl, ELM_LIST_LIMIT); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, gl); + evas_object_show(gl); + + over = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(over, 0, 0, 0, 0); + evas_object_event_callback_add(over, EVAS_CALLBACK_MOUSE_MOVE, _move, gl); + evas_object_repeat_events_set(over, 1); + evas_object_show(over); + evas_object_size_hint_weight_set(over, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, over); + + itc1.item_style = "default"; + itc1.func.text_get = gl_text_get; + itc1.func.content_get = gl_content_get; + itc1.func.state_get = gl_state_get; + itc1.func.del = gl_del; + + bt_50 = elm_button_add(win); + elm_object_text_set(bt_50, "Go to 50"); + evas_object_show(bt_50); + elm_box_pack_end(bx, bt_50); + + bt_1500 = elm_button_add(win); + elm_object_text_set(bt_1500, "Go to 1500"); + evas_object_show(bt_1500); + elm_box_pack_end(bx, bt_1500); + + for (i = 0; i < 2000; i++) + { + gli = elm_genlist_item_append(gl, &itc1, + (void *)(long)i/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_NONE, + gl_sel/* func */, + (void *)(long)(i * 10)/* func data */); + if (i == 50) + evas_object_smart_callback_add(bt_50, "clicked", _bt50_cb, gli); + else if (i == 1500) + evas_object_smart_callback_add(bt_1500, "clicked", _bt1500_cb, gli); + } + evas_object_resize(win, 480, 800); + evas_object_show(win); +} +TEST_END + +/*************/ + +static void +my_gl_clear(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *gl = data; + elm_genlist_clear(gl); +} + +static void +my_gl_add(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *gl = data; + static int i = 0; + + itc1.item_style = "default"; + itc1.func.text_get = gl_text_get; + itc1.func.content_get = gl_content_get; + itc1.func.state_get = gl_state_get; + itc1.func.del = gl_del; + + elm_genlist_item_append(gl, &itc1, + (void *)(long)i/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_NONE, + gl_sel/* func */, + (void *)(long)(i * 10)/* func data */); + i++; +} + +static void +my_gl_insert_before(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *gl = data; + static int i = 0; + Elm_Genlist_Item *gli_selected; + + itc1.item_style = "default"; + itc1.func.text_get = gl_text_get; + itc1.func.content_get = gl_content_get; + itc1.func.state_get = gl_state_get; + itc1.func.del = gl_del; + + gli_selected = elm_genlist_selected_item_get(gl); + if(!gli_selected) + { + printf("no item selected\n"); + return ; + } + + elm_genlist_item_insert_before(gl, &itc1, + (void *)(long)i/* item data */, + NULL/* parent */, + gli_selected /* item before */, + ELM_GENLIST_ITEM_NONE, + gl_sel/* func */, + (void *)(long)(i * 10)/* func data */); + i++; +} + +static void +my_gl_insert_after(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *gl = data; + static int i = 0; + Elm_Genlist_Item *gli_selected; + + itc1.item_style = "default"; + itc1.func.text_get = gl_text_get; + itc1.func.content_get = gl_content_get; + itc1.func.state_get = gl_state_get; + itc1.func.del = gl_del; + + gli_selected = elm_genlist_selected_item_get(gl); + if(!gli_selected) + { + printf("no item selected\n"); + return ; + } + + elm_genlist_item_insert_after(gl, &itc1, + (void *)(long)i/* item data */, + NULL/* parent */, + gli_selected /* item after */, + ELM_GENLIST_ITEM_NONE, + gl_sel/* func */, + (void *)(long)(i * 10)/* func data */); + i++; +} + +static void +my_gl_del(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *gl = data; + Elm_Genlist_Item *gli = elm_genlist_selected_item_get(gl); + if (!gli) + { + printf("no item selected\n"); + return; + } + elm_genlist_item_del(gli); +} + +static void +my_gl_disable(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *gl = data; + Elm_Genlist_Item *gli = elm_genlist_selected_item_get(gl); + if (!gli) + { + printf("no item selected\n"); + return; + } + elm_genlist_item_disabled_set(gli, 1); + elm_genlist_item_selected_set(gli, 0); + elm_genlist_item_update(gli); +} + +static void +my_gl_update_all(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *gl = data; + int i = 0; + Elm_Genlist_Item *it = elm_genlist_first_item_get(gl); + while (it) + { + elm_genlist_item_update(it); + printf("%i\n", i); + i++; + it = elm_genlist_item_next_get(it); + } +} + +static void +my_gl_first(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *gl = data; + Elm_Genlist_Item *gli = elm_genlist_first_item_get(gl); + if (!gli) return; + elm_genlist_item_show(gli); + elm_genlist_item_selected_set(gli, 1); +} + +static void +my_gl_last(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *gl = data; + Elm_Genlist_Item *gli = elm_genlist_last_item_get(gl); + if (!gli) return; + elm_genlist_item_show(gli); + elm_genlist_item_selected_set(gli, 1); +} + +static Eina_Bool +my_gl_flush_delay(void *data __UNUSED__) +{ + elm_all_flush(); + return ECORE_CALLBACK_CANCEL; +} + +static void +my_gl_flush(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + ecore_timer_add(1.2, my_gl_flush_delay, NULL); +} + +TEST_START(test_genlist2) +{ + Evas_Object *bg, *gl, *bx, *bx2, *bx3, *bt; + Elm_Genlist_Item *gli[10]; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_bg_file_set(bg, buf, NULL); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + gl = elm_genlist_add(win); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(gl); + + itc1.item_style = "default"; + itc1.func.text_get = gl_text_get; + itc1.func.content_get = gl_content_get; + itc1.func.state_get = gl_state_get; + itc1.func.del = gl_del; + + gli[0] = elm_genlist_item_append(gl, &itc1, + (void *)1001/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + (void *)1001/* func data */); + gli[1] = elm_genlist_item_append(gl, &itc1, + (void *)1002/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + (void *)1002/* func data */); + gli[2] = elm_genlist_item_append(gl, &itc1, + (void *)1003/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + (void *)1003/* func data */); + gli[3] = elm_genlist_item_prepend(gl, &itc1, + (void *)1004/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + (void *)1004/* func data */); + gli[4] = elm_genlist_item_prepend(gl, &itc1, + (void *)1005/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + (void *)1005/* func data */); + gli[5] = elm_genlist_item_insert_before(gl, &itc1, + (void *)1006/* item data */, NULL/* parent */, gli[2]/* rel */, ELM_GENLIST_ITEM_NONE, + gl_sel/* func */, (void *)1006/* func data */); + gli[6] = elm_genlist_item_insert_after(gl, &itc1, + (void *)1007/* item data */, NULL/* parent */, gli[2]/* rel */, ELM_GENLIST_ITEM_NONE, + gl_sel/* func */, (void *)1007/* func data */); + + elm_box_pack_end(bx, gl); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "/\\"); + evas_object_smart_callback_add(bt, "clicked", my_gl_first, gl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "\\/"); + evas_object_smart_callback_add(bt, "clicked", my_gl_last, gl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "#"); + evas_object_smart_callback_add(bt, "clicked", my_gl_disable, gl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "U"); + evas_object_smart_callback_add(bt, "clicked", my_gl_update_all, gl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "X"); + evas_object_smart_callback_add(bt, "clicked", my_gl_clear, gl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "+"); + evas_object_smart_callback_add(bt, "clicked", my_gl_add, gl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "-"); + evas_object_smart_callback_add(bt, "clicked", my_gl_del, gl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx3 = elm_box_add(win); + elm_box_horizontal_set(bx3, EINA_TRUE); + elm_box_homogeneous_set(bx3, EINA_TRUE); + evas_object_size_hint_weight_set(bx3, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "+ before"); + evas_object_smart_callback_add(bt, "clicked", my_gl_insert_before, gl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx3, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "+ after"); + evas_object_smart_callback_add(bt, "clicked", my_gl_insert_after, gl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx3, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Flush"); + evas_object_smart_callback_add(bt, "clicked", my_gl_flush, gl); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx3, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx3); + evas_object_show(bx3); + + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} +TEST_END + +/*************/ + +static Elm_Genlist_Item_Class itc2; +char *gl2_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__) +{ + const Testitem *tit = data; + char buf[256]; + snprintf(buf, sizeof(buf), "Item mode %i", tit->mode); + return strdup(buf); +} +Evas_Object *gl2_content_get(void *data, Evas_Object *obj, const char *part) +{ + const Testitem *tit = data; + char buf[PATH_MAX]; + Evas_Object *ic = elm_icon_add(obj); + if (!strcmp(part, "elm.swallow.icon")) + { + if (!(tit->mode & 0x3)) + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + else if ((tit->mode & 0x3) == 1) + snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get()); + else if ((tit->mode & 0x3) == 2) + snprintf(buf, sizeof(buf), "%s/images/panel_01.jpg", elm_app_data_dir_get()); + else if ((tit->mode & 0x3) == 3) + snprintf(buf, sizeof(buf), "%s/images/rock_01.jpg", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + } + else if (!strcmp(part, "elm.swallow.end")) + { + if (!(tit->mode & 0x3)) + snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get()); + else if ((tit->mode & 0x3) == 1) + snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get()); + else if ((tit->mode & 0x3) == 2) + snprintf(buf, sizeof(buf), "%s/images/sky_03.jpg", elm_app_data_dir_get()); + else if ((tit->mode & 0x3) == 3) + snprintf(buf, sizeof(buf), "%s/images/sky_04.jpg", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + } + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + return ic; +} +Eina_Bool gl2_state_get(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *part __UNUSED__) +{ + return EINA_FALSE; +} +void gl2_del(void *data __UNUSED__, Evas_Object *obj __UNUSED__) +{ +} + +static void +my_gl_update(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Testitem *tit = data; + tit->mode++; + elm_genlist_item_update(tit->item); +} + +static void +my_gl_labels_update(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Testitem *tit = data; + tit->mode++; + elm_genlist_item_fields_update(tit->item, "*", ELM_GENLIST_ITEM_FIELD_LABEL); +} + +static void +my_gl_contents_update(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Testitem *tit = data; + tit->mode++; + elm_genlist_item_fields_update(tit->item, "*", ELM_GENLIST_ITEM_FIELD_CONTENT); +} + +TEST_START(test_genlist3) +{ + Evas_Object *bg, *gl, *bx, *bx2, *bt; + static Testitem tit[3]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + gl = elm_genlist_add(win); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(gl); + + itc2.item_style = "default"; + itc2.func.text_get = gl2_text_get; + itc2.func.content_get = gl2_content_get; + itc2.func.state_get = gl2_state_get; + itc2.func.del = gl2_del; + + tit[0].mode = 0; + tit[0].item = elm_genlist_item_append(gl, &itc2, + &(tit[0])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + NULL/* func data */); + tit[1].mode = 1; + tit[1].item = elm_genlist_item_append(gl, &itc2, + &(tit[1])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + NULL/* func data */); + tit[2].mode = 2; + tit[2].item = elm_genlist_item_append(gl, &itc2, + &(tit[2])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + NULL/* func data */); + + elm_box_pack_end(bx, gl); + evas_object_show(bx); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "[1]"); + evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[0])); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "labels"); + evas_object_smart_callback_add(bt, "clicked", my_gl_labels_update, &(tit[1])); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "contents"); + evas_object_smart_callback_add(bt, "clicked", my_gl_contents_update, &(tit[2])); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} +TEST_END + +/*************/ + +static void +my_gl_item_check_changed(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Testitem *tit = data; + tit->onoff = elm_check_state_get(obj); + printf("item %p onoff = %i\n", tit, tit->onoff); +} + +static Elm_Genlist_Item_Class itc3; +char *gl3_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__) +{ + const Testitem *tit = data; + char buf[256]; + snprintf(buf, sizeof(buf), "Item mode %i", tit->mode); + return strdup(buf); +} +Evas_Object *gl3_content_get(void *data, Evas_Object *obj, const char *part) +{ + const Testitem *tit = data; + if (!strcmp(part, "elm.swallow.icon")) + { + Evas_Object *lb; + + lb = elm_label_add(obj); + elm_label_line_wrap_set(lb, ELM_WRAP_CHAR); + elm_label_wrap_width_set(lb, 201); + elm_object_text_set(lb, "ashj ascjscjh n asjkl hcjlh ls hzshnn zjh sh zxjcjsnd h dfw sdv edev efe fwefvv vsd cvs ws wf fvwf wd fwe f we wef we wfe rfwewef wfv wswf wefg sdfws w wsdcfwcf wsc vdv sdsd sdcd cv wsc sdcv wsc d sdcdcsd sdcdsc wdvd sdcsd wscxcv wssvd sd"); + return lb; + } + else if (!strcmp(part, "elm.swallow.end")) + { + Evas_Object *ck; + ck = elm_check_add(obj); + evas_object_propagate_events_set(ck, EINA_FALSE); + elm_check_state_set(ck, tit->onoff); + evas_object_smart_callback_add(ck, "changed", my_gl_item_check_changed, data); + return ck; + } + return NULL; +} +Eina_Bool gl3_state_get(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *part __UNUSED__) +{ + return EINA_FALSE; +} +void gl3_del(void *data __UNUSED__, Evas_Object *obj __UNUSED__) +{ +} + +TEST_START(test_genlist4) +{ + Evas_Object *bg, *gl, *bx, *bx2, *bt; + static Testitem tit[3]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + gl = elm_genlist_add(win); + elm_genlist_height_for_width_mode_set(gl, EINA_TRUE); + elm_genlist_multi_select_set(gl, 1); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(gl); + + itc3.item_style = "default"; + itc3.func.text_get = gl3_text_get; + itc3.func.content_get = gl3_content_get; + itc3.func.state_get = gl3_state_get; + itc3.func.del = gl3_del; + + tit[0].mode = 0; + tit[0].item = elm_genlist_item_append(gl, &itc3, + &(tit[0])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + NULL/* func data */); + tit[1].mode = 1; + tit[1].item = elm_genlist_item_append(gl, &itc3, + &(tit[1])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + NULL/* func data */); + tit[2].mode = 2; + tit[2].item = elm_genlist_item_append(gl, &itc3, + &(tit[2])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + NULL/* func data */); + + elm_box_pack_end(bx, gl); + evas_object_show(bx); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "[1]"); + evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[0])); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "[2]"); + evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[1])); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "[3]"); + evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[2])); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} +TEST_END + + +/*************/ +static void +my_gl_item_check_changed2(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Testitem *tit = data; + tit->onoff = elm_check_state_get(obj); + printf("item %p onoff = %i\n", tit, tit->onoff); +} + +static Elm_Genlist_Item_Class itc5; +char *gl5_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part) +{ + const Testitem *tit = data; + char buf[256]; + if (!strcmp(part, "elm.text")) + { + snprintf(buf, sizeof(buf), "Item mode %i", tit->mode); + } + else if (!strcmp(part, "elm.text.sub")) + { + snprintf(buf, sizeof(buf), "%i bottles on the wall", tit->mode); + } + return strdup(buf); +} +Evas_Object *gl5_content_get(void *data, Evas_Object *obj, const char *part) +{ + const Testitem *tit = data; + char buf[PATH_MAX]; + if (!strcmp(part, "elm.swallow.icon")) + { + Evas_Object *bx = elm_box_add(obj); + Evas_Object *ic; + elm_box_horizontal_set(bx, EINA_TRUE); + ic = elm_icon_add(obj); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_show(ic); + elm_box_pack_end(bx, ic); + ic = elm_icon_add(obj); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_show(ic); + elm_box_pack_end(bx, ic); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + return bx; + } + else if (!strcmp(part, "elm.swallow.end")) + { + Evas_Object *ck; + ck = elm_check_add(obj); + evas_object_propagate_events_set(ck, EINA_FALSE); + elm_check_state_set(ck, tit->onoff); + evas_object_smart_callback_add(ck, "changed", my_gl_item_check_changed2, data); + evas_object_show(ck); + return ck; + } + return NULL; +} +Eina_Bool gl5_state_get(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *part __UNUSED__) +{ + return EINA_FALSE; +} +void gl5_del(void *data __UNUSED__, Evas_Object *obj __UNUSED__) +{ +} + +static void +item_drag_up(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("drag up\n"); +} + +static void +item_drag_down(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("drag down\n"); +} + +static void +item_drag_left(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("drag left\n"); +} + +static void +item_drag_right(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("drag right\n"); +} + +static void +scroll_top(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("Top edge!\n"); +} + +static void +scroll_bottom(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("Bottom edge!\n"); +} + +static void +scroll_left(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("Left edge!\n"); +} + +static void +scroll_right(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("Right edge!\n"); +} + +static void +item_drag(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("drag\n"); +} + +static void +item_drag_stop(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("drag stop\n"); +} + +static void +item_longpress(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("longpress\n"); +} + +TEST_START(test_genlist5) +{ + Evas_Object *bg, *gl, *bx, *bx2, *bt; + static Testitem tit[3]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + gl = elm_genlist_add(win); + elm_genlist_always_select_mode_set(gl, 1); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(gl); + itc5.item_style = "double_label"; + itc5.func.text_get = gl5_text_get; + itc5.func.content_get = gl5_content_get; + itc5.func.state_get = gl5_state_get; + itc5.func.del = gl5_del; + + tit[0].mode = 0; + tit[0].item = elm_genlist_item_append(gl, &itc5, + &(tit[0])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + NULL/* func data */); + tit[1].mode = 1; + tit[1].item = elm_genlist_item_append(gl, &itc5, + &(tit[1])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + NULL/* func data */); + tit[2].mode = 2; + tit[2].item = elm_genlist_item_append(gl, &itc5, + &(tit[2])/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl_sel/* func */, + NULL/* func data */); + + elm_box_pack_end(bx, gl); + evas_object_show(bx); + + evas_object_smart_callback_add(gl, "drag,start,up", item_drag_up, NULL); + evas_object_smart_callback_add(gl, "drag,start,down", item_drag_down, NULL); + evas_object_smart_callback_add(gl, "drag,start,left", item_drag_left, NULL); + evas_object_smart_callback_add(gl, "drag,start,right", item_drag_right, NULL); + evas_object_smart_callback_add(gl, "scroll,edge,top", scroll_top, NULL); + evas_object_smart_callback_add(gl, "scroll,edge,bottom", scroll_bottom, NULL); + evas_object_smart_callback_add(gl, "scroll,edge,left", scroll_left, NULL); + evas_object_smart_callback_add(gl, "scroll,edge,right", scroll_right, NULL); + evas_object_smart_callback_add(gl, "drag", item_drag, NULL); + evas_object_smart_callback_add(gl, "drag,stop", item_drag_stop, NULL); + evas_object_smart_callback_add(gl, "longpressed", item_longpress, NULL); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "[1]"); + evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[0])); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "[2]"); + evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[1])); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "[3]"); + evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[2])); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} +TEST_END + +/*************/ + +static Elm_Genlist_Item_Class itc4; + +static void +gl4_sel(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Elm_Genlist_Item *it = (Elm_Genlist_Item *)event_info; + int depth = 0; + + depth = elm_genlist_item_expanded_depth_get(it); + printf("expanded depth for selected item is %d\n", depth); + +} +static void +gl4_exp(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Elm_Genlist_Item *it = event_info; + Evas_Object *gl = elm_genlist_item_genlist_get(it); + int val = (int)(long)elm_genlist_item_data_get(it); + val *= 10; + elm_genlist_item_append(gl, &itc4, + (void *)(long)(val + 1)/* item data */, it/* parent */, + ELM_GENLIST_ITEM_NONE, gl4_sel/* func */, + NULL/* func data */); + elm_genlist_item_append(gl, &itc4, + (void *)(long)(val + 2)/* item data */, it/* parent */, + ELM_GENLIST_ITEM_NONE, gl4_sel/* func */, + NULL/* func data */); + elm_genlist_item_append(gl, &itc4, + (void *)(long)(val + 3)/* item data */, it/* parent */, + ELM_GENLIST_ITEM_SUBITEMS, gl4_sel/* func */, + NULL/* func data */); +} +static void +gl4_con(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Elm_Genlist_Item *it = event_info; + elm_genlist_item_subitems_clear(it); +} + +static void +gl4_exp_req(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Elm_Genlist_Item *it = event_info; + elm_genlist_item_expanded_set(it, 1); +} +static void +gl4_con_req(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Elm_Genlist_Item *it = event_info; + elm_genlist_item_expanded_set(it, 0); +} + +char *gl4_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__) +{ + char buf[256]; + snprintf(buf, sizeof(buf), "Item mode %i", (int)(long)data); + return strdup(buf); +} +Evas_Object *gl4_content_get(void *data __UNUSED__, Evas_Object *obj, const char *part) +{ + char buf[PATH_MAX]; + if (!strcmp(part, "elm.swallow.icon")) + { + Evas_Object *ic = elm_icon_add(obj); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + evas_object_show(ic); + return ic; + } + else if (!strcmp(part, "elm.swallow.end")) + { + Evas_Object *ck; + ck = elm_check_add(obj); + evas_object_propagate_events_set(ck, EINA_FALSE); + evas_object_show(ck); + return ck; + } + return NULL; +} +Eina_Bool gl4_state_get(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *part __UNUSED__) +{ + return EINA_FALSE; +} +void gl4_del(void *data __UNUSED__, Evas_Object *obj __UNUSED__) +{ +} + +TEST_START(test_genlist6) +{ + Evas_Object *bg, *gl, *bx, *bx2, *bt; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + gl = elm_genlist_add(win); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(gl); + + itc4.item_style = "default"; + itc4.func.text_get = gl4_text_get; + itc4.func.content_get = gl4_content_get; + itc4.func.state_get = gl4_state_get; + itc4.func.del = gl4_del; + + elm_genlist_item_append(gl, &itc4, + (void *)1/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_SUBITEMS, gl4_sel/* func */, + NULL/* func data */); + elm_genlist_item_append(gl, &itc4, + (void *)2/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_SUBITEMS, gl4_sel/* func */, + NULL/* func data */); + elm_genlist_item_append(gl, &itc4, + (void *)3/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_NONE, gl4_sel/* func */, + NULL/* func data */); + + evas_object_smart_callback_add(gl, "expand,request", gl4_exp_req, gl); + evas_object_smart_callback_add(gl, "contract,request", gl4_con_req, gl); + evas_object_smart_callback_add(gl, "expanded", gl4_exp, gl); + evas_object_smart_callback_add(gl, "contracted", gl4_con, gl); + + elm_box_pack_end(bx, gl); + evas_object_show(bx); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "[1]"); + // evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[0])); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "[2]"); + // evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[1])); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "[3]"); + // evas_object_smart_callback_add(bt, "clicked", my_gl_update, &(tit[2])); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} +TEST_END + +/*************/ + +struct genlist7_data +{ + Evas_Object *win, *pager; +}; + +static Elm_Genlist_Item_Class itc7; +static void +gl_sel7(void *data, Evas_Object *obj, void *event_info) +{ + if (!event_info) return; + elm_genlist_item_item_class_update(event_info, &itc7); + printf("sel item data [%p] on genlist obj [%p], item pointer [%p], new item style [%s] \n", data, obj, event_info, itc7.item_style); +} + +static void +test_genlist7_back_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + struct genlist7_data *info = data; + if (!info) return; + + elm_pager_content_pop(info->pager); +} + +static void +test_genlist7_swipe(void *data, Evas_Object *obj __UNUSED__, void *event_info) +{ + struct genlist7_data *info = data; + Evas_Object *box, *entry, *button; + char item_data[] = "Just a simple test"; + + if ((!event_info) || (!data)) return; + + box = elm_box_add(info->win); + elm_box_homogeneous_set(box, EINA_FALSE); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(box); + + entry = elm_entry_add(info->win); + elm_entry_scrollable_set(entry, EINA_TRUE); + elm_entry_editable_set(entry, EINA_FALSE); + elm_entry_entry_set(entry, item_data); + evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(entry); + + button = elm_button_add(info->win); + elm_object_text_set(button, "back"); + evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 0); + evas_object_smart_callback_add(button, "clicked", test_genlist7_back_cb, + info); + evas_object_show(button); + + elm_box_pack_start(box, entry); + elm_box_pack_end(box, button); + + elm_pager_content_push(info->pager, box); +} + +TEST_START(test_genlist7) +{ + Evas_Object *bg, *gl, *pager; + static struct genlist7_data info; + static Testitem tit[3]; + + info.win = win; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + pager = elm_pager_add(win); + elm_win_resize_object_add(win, pager); + evas_object_size_hint_weight_set(pager, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(pager, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(pager); + info.pager = pager; + + gl = elm_genlist_add(win); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_smart_callback_add(gl, "swipe", test_genlist7_swipe, &info); + evas_object_show(gl); + elm_pager_content_push(pager, gl); + + itc2.item_style = "default"; + itc2.func.text_get = gl2_text_get; + itc2.func.content_get = gl2_content_get; + itc2.func.state_get = gl2_state_get; + itc2.func.del = gl2_del; + + itc7.item_style = "double_label"; + itc7.func.text_get = gl5_text_get; + itc7.func.content_get = gl5_content_get; + itc7.func.state_get = gl5_state_get; + itc7.func.del = gl5_del; + + tit[0].mode = 0; + tit[0].item = elm_genlist_item_append(gl, &itc2, + &(tit[0])/* item data */, NULL/* parent */, + ELM_GENLIST_ITEM_NONE, gl_sel7/* func */, + NULL/* func data */); + tit[1].mode = 1; + tit[1].item = elm_genlist_item_append(gl, &itc2, + &(tit[1])/* item data */, NULL/* parent */, + ELM_GENLIST_ITEM_NONE, gl_sel7/* func */, + NULL/* func data */); + tit[2].mode = 2; + tit[2].item = elm_genlist_item_append(gl, &itc2, + &(tit[2])/* item data */, NULL/* parent */, + ELM_GENLIST_ITEM_NONE, gl_sel7/* func */, + NULL/* func data */); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} +TEST_END + +/*************/ + +static Elm_Genlist_Item_Class itc_group; +char *gl8_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__) +{ + char buf[256]; + snprintf(buf, sizeof(buf), "Group Index # %i (Item # %i)", (int)((long)data / 10), (int)(long)data); + return strdup(buf); +} + +static void +_bt_show_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_genlist_item_top_show(data); + //elm_genlist_item_show(data); + //elm_genlist_item_middle_show(data); +} +static void +_bt_bring_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_genlist_item_top_bring_in(data); + //elm_genlist_item_bring_in(data); + //elm_genlist_item_middle_bring_in(data); +} + +TEST_START(test_genlist8) +{ + Evas_Object *bg, *gl, *bt[8], *bx, *bx2, *bx3; + Elm_Genlist_Item *gli = NULL, *git = NULL; + int i, bt_num; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + gl = elm_genlist_add(win); + evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL); + evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL); + evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, gl); + evas_object_show(gl); + + itc1.item_style = "default"; + itc1.func.text_get = gl_text_get; + itc1.func.content_get = gl_content_get; + itc1.func.state_get = gl_state_get; + itc1.func.del = gl_del; + + itc_group.item_style = "group_index"; + itc_group.func.text_get = gl8_text_get; + itc_group.func.content_get = NULL; + itc_group.func.state_get = NULL; + itc_group.func.del = gl_del; + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt_num = 0; + bt[bt_num] = elm_button_add(win); + elm_object_text_set(bt[bt_num], "Show 0"); + evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0); + evas_object_show(bt[bt_num]); + elm_box_pack_end(bx2, bt[bt_num]); + + bt[++bt_num] = elm_button_add(win); + elm_object_text_set(bt[bt_num], "Show 26"); + evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0); + evas_object_show(bt[bt_num]); + elm_box_pack_end(bx2, bt[bt_num]); + + bt[++bt_num] = elm_button_add(win); + elm_object_text_set(bt[bt_num], "Show 101"); + evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0); + evas_object_show(bt[bt_num]); + elm_box_pack_end(bx2, bt[bt_num]); + + bt[++bt_num] = elm_button_add(win); + elm_object_text_set(bt[bt_num], "Show 480"); + evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0); + evas_object_show(bt[bt_num]); + elm_box_pack_end(bx2, bt[bt_num]); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx3 = elm_box_add(win); + elm_box_horizontal_set(bx3, EINA_TRUE); + elm_box_homogeneous_set(bx3, EINA_TRUE); + evas_object_size_hint_weight_set(bx3, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx3, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt[++bt_num] = elm_button_add(win); + elm_object_text_set(bt[bt_num], "Bring top 0"); + evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0); + evas_object_show(bt[bt_num]); + elm_box_pack_end(bx3, bt[bt_num]); + + bt[++bt_num] = elm_button_add(win); + elm_object_text_set(bt[bt_num], "Bring top 31"); + evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0); + evas_object_show(bt[bt_num]); + elm_box_pack_end(bx3, bt[bt_num]); + + bt[++bt_num] = elm_button_add(win); + elm_object_text_set(bt[bt_num], "Bring top 239"); + evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0); + evas_object_show(bt[bt_num]); + elm_box_pack_end(bx3, bt[bt_num]); + + bt[++bt_num] = elm_button_add(win); + elm_object_text_set(bt[bt_num], "Bring top 477"); + evas_object_size_hint_align_set(bt[bt_num], EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt[bt_num], EVAS_HINT_EXPAND, 0.0); + evas_object_show(bt[bt_num]); + elm_box_pack_end(bx3, bt[bt_num]); + + elm_box_pack_end(bx, bx3); + evas_object_show(bx3); + + for (i = 0; i < 500; i++) + { + if (!(i % 10)) + { + gli = git = elm_genlist_item_append(gl, &itc_group, + (void *)(long)i/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_GROUP, + gl_sel/* func */, + (void *)(long)(i * 10)/* func data */); + elm_genlist_item_display_only_set(git, EINA_TRUE); + } + else if (git) + { + gli = elm_genlist_item_append(gl, &itc1, + (void *)(long)i/* item data */, + git/* parent */, + ELM_GENLIST_ITEM_NONE, + gl_sel/* func */, + (void *)(long)(i * 10)/* func data */); + } + switch (i) + { + case 0: + evas_object_smart_callback_add(bt[0], "clicked", _bt_show_cb, gli); + evas_object_smart_callback_add(bt[4], "clicked", _bt_bring_cb, gli); + break; + case 26: + evas_object_smart_callback_add(bt[1], "clicked", _bt_show_cb, gli); + break; + case 31: + evas_object_smart_callback_add(bt[5], "clicked", _bt_bring_cb, gli); + break; + case 101: + evas_object_smart_callback_add(bt[2], "clicked", _bt_show_cb, gli); + break; + case 239: + evas_object_smart_callback_add(bt[6], "clicked", _bt_bring_cb, gli); + break; + case 477: + evas_object_smart_callback_add(bt[7], "clicked", _bt_bring_cb, gli); + break; + case 480: + evas_object_smart_callback_add(bt[3], "clicked", _bt_show_cb, gli); + break; + } + } + + evas_object_resize(win, 480, 800); + evas_object_show(win); +} +TEST_END + +/*************/ + +static void +gl9_exp(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Elm_Genlist_Item *it = event_info; + Evas_Object *gl = elm_genlist_item_genlist_get(it); + int val = (int)(long)elm_genlist_item_data_get(it); + val *= 10; + elm_genlist_item_append(gl, &itc1, + (void *)(long)(val + 1)/* item data */, it/* parent */, + ELM_GENLIST_ITEM_NONE, gl4_sel/* func */, + NULL/* func data */); + elm_genlist_item_append(gl, &itc1, + (void *)(long)(val + 2)/* item data */, it/* parent */, + ELM_GENLIST_ITEM_NONE, gl4_sel/* func */, + NULL/* func data */); + elm_genlist_item_append(gl, &itc1, + (void *)(long)(val + 3)/* item data */, it/* parent */, + ELM_GENLIST_ITEM_SUBITEMS, gl4_sel/* func */, + NULL/* func data */); +} +static void +gl9_con(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Elm_Genlist_Item *it = event_info; + elm_genlist_item_subitems_clear(it); +} + +static void +gl9_exp_req(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Elm_Genlist_Item *it = event_info; + elm_genlist_item_expanded_set(it, EINA_TRUE); +} +static void +gl9_con_req(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Elm_Genlist_Item *it = event_info; + elm_genlist_item_expanded_set(it, EINA_FALSE); +} + +TEST_START(test_genlist9) +{ + Evas_Object *bg, *gl, *bx; + Elm_Genlist_Item *git; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + gl = elm_genlist_add(win); + evas_object_smart_callback_add(gl, "selected", _gl_selected, NULL); + evas_object_smart_callback_add(gl, "clicked,double", _gl_double_clicked, NULL); + evas_object_smart_callback_add(gl, "longpressed", _gl_longpress, NULL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, gl); + evas_object_show(gl); + + itc1.item_style = "default"; + itc1.func.text_get = gl_text_get; + itc1.func.content_get = gl_content_get; + itc1.func.state_get = gl_state_get; + itc1.func.del = gl_del; + + itc_group.item_style = "group_index"; + itc_group.func.text_get = gl8_text_get; + itc_group.func.content_get = NULL; + itc_group.func.state_get = NULL; + itc_group.func.del = gl_del; + + git = elm_genlist_item_append(gl, &itc_group, + (void *)0/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_GROUP, gl4_sel/* func */, + NULL/* func data */); + elm_genlist_item_display_only_set(git, EINA_TRUE); + elm_genlist_item_append(gl, &itc1, + (void *)1/* item data */, git/* parent */, ELM_GENLIST_ITEM_SUBITEMS, gl4_sel/* func */, + NULL/* func data */); + elm_genlist_item_append(gl, &itc1, + (void *)2/* item data */, git/* parent */, ELM_GENLIST_ITEM_NONE, gl4_sel/* func */, + NULL/* func data */); + elm_genlist_item_append(gl, &itc1, + (void *)3/* item data */, git/* parent */, ELM_GENLIST_ITEM_SUBITEMS, gl4_sel/* func */, + NULL/* func data */); + git = elm_genlist_item_append(gl, &itc_group, + (void *)4/* item data */, NULL/* parent */, ELM_GENLIST_ITEM_GROUP, gl4_sel/* func */, + NULL/* func data */); + elm_genlist_item_display_only_set(git, EINA_TRUE); + elm_genlist_item_append(gl, &itc1, + (void *)5/* item data */, git/* parent */, ELM_GENLIST_ITEM_SUBITEMS, gl4_sel/* func */, + NULL/* func data */); + elm_genlist_item_append(gl, &itc1, + (void *)6/* item data */, git/* parent */, ELM_GENLIST_ITEM_NONE, gl4_sel/* func */, + NULL/* func data */); + elm_genlist_item_append(gl, &itc1, + (void *)7/* item data */, git/* parent */, ELM_GENLIST_ITEM_SUBITEMS, gl4_sel/* func */, + NULL/* func data */); + + evas_object_smart_callback_add(gl, "expand,request", gl9_exp_req, gl); + evas_object_smart_callback_add(gl, "contract,request", gl9_con_req, gl); + evas_object_smart_callback_add(gl, "expanded", gl9_exp, gl); + evas_object_smart_callback_add(gl, "contracted", gl9_con, gl); + + evas_object_resize(win, 480, 800); + evas_object_show(win); +} +TEST_END + +/*************/ + +static Elm_Genlist_Item_Class itc10; +static char *mode_type[] = { "slide", "rotate" }; +char *gl10_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part) +{ + char buf[256]; + if (!strcmp(part, "elm.text.mode")) + snprintf(buf, sizeof(buf), "Mode # %i", (int)(long)data); + else + snprintf(buf, sizeof(buf), "Item # %i", (int)(long)data); + return strdup(buf); +} + +Evas_Object *gl10_content_get(void *data __UNUSED__, Evas_Object *obj, const char *part) +{ + char buf[PATH_MAX]; + Evas_Object *ic = elm_icon_add(obj); + if (!strcmp(part, "elm.swallow.end")) + snprintf(buf, sizeof(buf), "%s/images/bubble.png", elm_app_data_dir_get()); + else + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + return ic; +} +static void +_gl_sel10(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + if (!data) return; + int v = elm_radio_value_get(data); + if (v == 1) + elm_genlist_item_mode_set(event_info, mode_type[v], EINA_TRUE); +} + +static void +_my_gl_mode_right(void *data, Evas_Object *obj __UNUSED__, void *event_info) +{ + if (!data) return; + int v = elm_radio_value_get(data); + if (v == 0) + elm_genlist_item_mode_set(event_info, mode_type[v], EINA_TRUE); +} + +static void +_my_gl_mode_left(void *data, Evas_Object *obj __UNUSED__, void *event_info) +{ + if (!data) return; + int v = elm_radio_value_get(data); + if (v == 0) + elm_genlist_item_mode_set(event_info, mode_type[v], EINA_FALSE); +} + +static void +_my_gl_mode_cancel(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + fprintf(stderr, "drag\n"); + if (!data) return; + int v = elm_radio_value_get(data); + Elm_Genlist_Item *it = (Elm_Genlist_Item *)elm_genlist_mode_item_get(obj); + if (it) + elm_genlist_item_mode_set(it, mode_type[v], EINA_FALSE); +} + +TEST_START(test_genlist10) +{ + Evas_Object *bg, *fr, *lb, *bx, *bx2, *bx3, *rd, *rdg, *gl; + int i; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + fr = elm_frame_add(win); + elm_object_text_set(fr, "Mode Type"); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + bx2 = elm_box_add(win); + elm_object_content_set(fr, bx2); + evas_object_show(bx2); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "Sweep genlist items to the right.
" + "Test this by changing Mode Type to Slide or Rotate."); + elm_box_pack_end(bx2, lb); + evas_object_show(lb); + + bx3 = elm_box_add(win); + elm_box_horizontal_set(bx3, EINA_TRUE); + elm_box_pack_end(bx2, bx3); + evas_object_show(bx3); + + rd = elm_radio_add(win); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_radio_state_value_set(rd, 0); + elm_object_text_set(rd, "Slide "); + evas_object_show(rd); + elm_box_pack_end(bx3, rd); + rdg = rd; + + rd = elm_radio_add(win); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_radio_state_value_set(rd, 1); + elm_object_text_set(rd, "Rotate"); + elm_radio_group_add(rd, rdg); + evas_object_show(rd); + elm_box_pack_end(bx3, rd); + + gl = elm_genlist_add(win); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_smart_callback_add(gl, "drag,start,right", _my_gl_mode_right, rdg); + evas_object_smart_callback_add(gl, "drag,start,left", _my_gl_mode_left, rdg); + evas_object_smart_callback_add(gl, "drag,start,up", _my_gl_mode_cancel, rdg); + evas_object_smart_callback_add(gl, "drag,start,down", _my_gl_mode_cancel, rdg); + evas_object_show(gl); + + itc10.item_style = "default"; + itc10.func.text_get = gl10_text_get; + itc10.func.content_get = gl10_content_get; + itc10.func.state_get = gl_state_get; + itc10.func.del = gl_del; + elm_genlist_mode_item_style_set(gl, "mode"); + + for (i = 0; i < 50; i++) + elm_genlist_item_append(gl, + &itc10, + (void *)(1000 + i)/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_NONE/* flags */, + _gl_sel10/* func */, + rdg/* func data */); + + elm_box_pack_end(bx, gl); + + evas_object_resize(win, 520, 520); + evas_object_show(win); +} +TEST_END + +/*************/ + +static void +_reorder_tg_changed_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + elm_genlist_reorder_mode_set(data, elm_check_state_get(obj)); +} + +/** + * gl_moved is called after an item was reordered. + * This is only called when reorder mode is enabled. + * + * @param data : the genlist object passed as data. + * @param obj : the genlist object. + * @param item : the moved item. + * + * If the move_after is true, + * the item(*item) had been moved after the given relative item(*rel_item) in list. + * If the move_after is false, + * the item(*item) had been moved before the given relative item(*rel_item) in list. + * + */ +static void gl_moved(Evas_Object *obj __UNUSED__, Elm_Genlist_Item *item __UNUSED__, Elm_Genlist_Item *rel_item __UNUSED__, Eina_Bool move_after __UNUSED__) +{ + // if needed, add application logic. +} + +TEST_START(test_genlist11) +{ + Evas_Object *bg, *fr, *lb, *bx, *tg, *gl; + int i; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + fr = elm_frame_add(win); + + elm_object_text_set(fr, "Reorder Mode"); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "Enable reorder mode if you want to move item.
" + "Then long press and drag item."); + elm_object_content_set(fr, lb); + evas_object_show(lb); + + gl = elm_genlist_add(win); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(gl); + + tg = elm_check_add(win); + elm_object_style_set(tg, "toggle"); + elm_object_text_set(tg, "Reorder Mode:"); + elm_check_state_set(tg, elm_mirrored_get()); + evas_object_smart_callback_add(tg, "changed", _reorder_tg_changed_cb, gl); + elm_box_pack_end(bx, tg); + evas_object_show(tg); + + itc1.item_style = "default"; + itc1.func.text_get = gl_text_get; + itc1.func.content_get = gl_content_get; + itc1.func.state_get = gl_state_get; + itc1.func.del = gl_del; + evas_object_smart_callback_add(gl, "moved", (Evas_Smart_Cb)gl_moved, gl); + + for (i = 0; i < 50; i++) + elm_genlist_item_append(gl, + &itc1, + (void *)(1 + i)/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_NONE/* flags */, + NULL/* func */, + NULL/* func data */); + + elm_box_pack_end(bx, gl); + + evas_object_resize(win, 400, 500); + evas_object_show(win); +} +TEST_END + +char *gl12_text_get(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *part __UNUSED__) +{ + return strdup("Enlightenment is not just a window manager for Linux/X11 and others, but also a whole suite of libraries to help you create beautiful user interfaces with much less work than doing it the old fashioned way and fighting with traditional toolkits, not to mention a traditional window manager. It covers uses from small mobile devices like phones all the way to powerful multi-core desktops (which are the primary development environment)."); +} + +TEST_START(test_genlist12) +{ + Evas_Object *bg, *bx, *gl; + int i; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + gl = elm_genlist_add(win); + elm_genlist_height_for_width_mode_set(gl, EINA_TRUE); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, gl); + evas_object_show(gl); + + itc1.item_style = "message"; + itc1.func.text_get = gl12_text_get; + itc1.func.content_get = gl_content_get; + itc1.func.state_get = gl_state_get; + itc1.func.del = gl_del; + + for (i = 0; i < 1000; i++) + { + elm_genlist_item_append(gl, &itc1, + (void *)(long)i/* item data */, + NULL/* parent */, + ELM_GENLIST_ITEM_NONE, + gl_sel/* func */, + (void *)(long)(i * 10)/* func data */); + } + + evas_object_resize(win, 400, 500); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_glview.c b/src/bin/test_glview.c new file mode 100644 index 0000000..cfe4d18 --- /dev/null +++ b/src/bin/test_glview.c @@ -0,0 +1,626 @@ +#include +#include "tsuite.h" + +#ifndef M_PI +#define M_PI 3.14159265 +#endif + +typedef struct _Gear Gear; +typedef struct _GLData GLData; +struct _Gear +{ + GLfloat *vertices; + GLuint vbo; + int count; +}; + +// GL related data here.. +struct _GLData +{ + Evas_GL_API *glapi; + GLuint program; + GLuint vtx_shader; + GLuint fgmt_shader; + int initialized : 1; + int mouse_down : 1; + + // Gear Stuff + GLfloat view_rotx; + GLfloat view_roty; + GLfloat view_rotz; + + Gear *gear1; + Gear *gear2; + Gear *gear3; + + GLfloat angle; + + GLuint proj_location; + GLuint light_location; + GLuint color_location; + + GLfloat proj[16]; + GLfloat light[3]; +}; + +static void gears_init(GLData *gld); +static void free_gear(Gear *gear); +static void gears_reshape(GLData *gld, int width, int height); +static void render_gears(GLData *gld); + +//--------------------------------// +// Gear Stuff.... +static GLfloat * +vert(GLfloat *p, GLfloat x, GLfloat y, GLfloat z, GLfloat *n) +{ + p[0] = x; + p[1] = y; + p[2] = z; + p[3] = n[0]; + p[4] = n[1]; + p[5] = n[2]; + + return p + 6; +} + +/* Draw a gear wheel. You'll probably want to call this function when + * building a display list since we do a lot of trig here. + * + * Input: inner_radius - radius of hole at center + * outer_radius - radius at center of teeth + * width - width of gear + * teeth - number of teeth + * tooth_depth - depth of tooth + */ +static Gear * +make_gear(GLData *gld, GLfloat inner_radius, GLfloat outer_radius, GLfloat width, + GLint teeth, GLfloat tooth_depth) +{ + GLint i; + GLfloat r0, r1, r2; + GLfloat da; + GLfloat *v; + Gear *gear; + double s[5], c[5]; + GLfloat normal[3]; + const int tris_per_tooth = 20; + Evas_GL_API *gl = gld->glapi; + + gear = (Gear*)malloc(sizeof(Gear)); + if (gear == NULL) + return NULL; + + r0 = inner_radius; + r1 = outer_radius - tooth_depth / 2.0; + r2 = outer_radius + tooth_depth / 2.0; + + da = 2.0 * M_PI / teeth / 4.0; + + gear->vertices = calloc(teeth * tris_per_tooth * 3 * 6, + sizeof *gear->vertices); + s[4] = 0; + c[4] = 1; + v = gear->vertices; + for (i = 0; i < teeth; i++) + { + s[0] = s[4]; + c[0] = c[4]; + s[1] = sin(i * 2.0 * M_PI / teeth + da); + c[1] = cos(i * 2.0 * M_PI / teeth + da); + s[2] = sin(i * 2.0 * M_PI / teeth + da * 2); + c[2] = cos(i * 2.0 * M_PI / teeth + da * 2); + s[3] = sin(i * 2.0 * M_PI / teeth + da * 3); + c[3] = cos(i * 2.0 * M_PI / teeth + da * 3); + s[4] = sin(i * 2.0 * M_PI / teeth + da * 4); + c[4] = cos(i * 2.0 * M_PI / teeth + da * 4); + + normal[0] = 0.0; + normal[1] = 0.0; + normal[2] = 1.0; + + v = vert(v, r2 * c[1], r2 * s[1], width * 0.5, normal); + + v = vert(v, r2 * c[1], r2 * s[1], width * 0.5, normal); + v = vert(v, r2 * c[2], r2 * s[2], width * 0.5, normal); + v = vert(v, r1 * c[0], r1 * s[0], width * 0.5, normal); + v = vert(v, r1 * c[3], r1 * s[3], width * 0.5, normal); + v = vert(v, r0 * c[0], r0 * s[0], width * 0.5, normal); + v = vert(v, r1 * c[4], r1 * s[4], width * 0.5, normal); + v = vert(v, r0 * c[4], r0 * s[4], width * 0.5, normal); + + v = vert(v, r0 * c[4], r0 * s[4], width * 0.5, normal); + v = vert(v, r0 * c[0], r0 * s[0], width * 0.5, normal); + v = vert(v, r0 * c[4], r0 * s[4], -width * 0.5, normal); + v = vert(v, r0 * c[0], r0 * s[0], -width * 0.5, normal); + + normal[0] = 0.0; + normal[1] = 0.0; + normal[2] = -1.0; + + v = vert(v, r0 * c[4], r0 * s[4], -width * 0.5, normal); + + v = vert(v, r0 * c[4], r0 * s[4], -width * 0.5, normal); + v = vert(v, r1 * c[4], r1 * s[4], -width * 0.5, normal); + v = vert(v, r0 * c[0], r0 * s[0], -width * 0.5, normal); + v = vert(v, r1 * c[3], r1 * s[3], -width * 0.5, normal); + v = vert(v, r1 * c[0], r1 * s[0], -width * 0.5, normal); + v = vert(v, r2 * c[2], r2 * s[2], -width * 0.5, normal); + v = vert(v, r2 * c[1], r2 * s[1], -width * 0.5, normal); + + v = vert(v, r1 * c[0], r1 * s[0], width * 0.5, normal); + + v = vert(v, r1 * c[0], r1 * s[0], width * 0.5, normal); + v = vert(v, r1 * c[0], r1 * s[0], -width * 0.5, normal); + v = vert(v, r2 * c[1], r2 * s[1], width * 0.5, normal); + v = vert(v, r2 * c[1], r2 * s[1], -width * 0.5, normal); + v = vert(v, r2 * c[2], r2 * s[2], width * 0.5, normal); + v = vert(v, r2 * c[2], r2 * s[2], -width * 0.5, normal); + v = vert(v, r1 * c[3], r1 * s[3], width * 0.5, normal); + v = vert(v, r1 * c[3], r1 * s[3], -width * 0.5, normal); + v = vert(v, r1 * c[4], r1 * s[4], width * 0.5, normal); + v = vert(v, r1 * c[4], r1 * s[4], -width * 0.5, normal); + + v = vert(v, r1 * c[4], r1 * s[4], -width * 0.5, normal); + } + + gear->count = (v - gear->vertices) / 6; + + gl->glGenBuffers(1, &gear->vbo); + gl->glBindBuffer(GL_ARRAY_BUFFER, gear->vbo); + gl->glBufferData(GL_ARRAY_BUFFER, gear->count * 6 * 4, + gear->vertices, GL_STATIC_DRAW); + + + return gear; +} + +static void +free_gear(Gear *gear) +{ + free(gear->vertices); + free(gear); + gear = NULL; +} + +static void +multiply(GLfloat *m, const GLfloat *n) +{ + GLfloat tmp[16]; + const GLfloat *row, *column; + div_t d; + int i, j; + + for (i = 0; i < 16; i++) + { + tmp[i] = 0; + d = div(i, 4); + row = n + d.quot * 4; + column = m + d.rem; + for (j = 0; j < 4; j++) + tmp[i] += row[j] * column[j * 4]; + } + memcpy(m, &tmp, sizeof tmp); +} + +static void +rotate(GLfloat *m, GLfloat angle, GLfloat x, GLfloat y, GLfloat z) +{ + double s, c; + + s = sin(angle); + c = cos(angle); + GLfloat r[16] = + { + x * x * (1 - c) + c, y * x * (1 - c) + z * s, x * z * (1 - c) - y * s, 0, + x * y * (1 - c) - z * s, y * y * (1 - c) + c, y * z * (1 - c) + x * s, 0, + x * z * (1 - c) + y * s, y * z * (1 - c) - x * s, z * z * (1 - c) + c, 0, + 0, 0, 0, 1 + }; + + multiply(m, r); +} + +static void +translate(GLfloat *m, GLfloat x, GLfloat y, GLfloat z) +{ + GLfloat t[16] = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1 }; + + multiply(m, t); +} + +static void +draw_gear(GLData *gld, Gear *gear, GLfloat *m, + GLfloat x, GLfloat y, GLfloat angle, const GLfloat *color) +{ + Evas_GL_API *gl = gld->glapi; + GLfloat tmp[16]; + + memcpy(tmp, m, sizeof tmp); + translate(tmp, x, y, 0); + rotate(tmp, 2 * M_PI * angle / 360.0, 0, 0, 1); + gl->glUniformMatrix4fv(gld->proj_location, 1, GL_FALSE, tmp); + gl->glUniform3fv(gld->light_location, 1, gld->light); + gl->glUniform4fv(gld->color_location, 1, color); + + gl->glBindBuffer(GL_ARRAY_BUFFER, gear->vbo); + + gl->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, + 6 * sizeof(GLfloat), NULL); + gl->glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, + 6 * sizeof(GLfloat), (GLfloat *) 0 + 3); + gl->glEnableVertexAttribArray(0); + gl->glEnableVertexAttribArray(1); + gl->glDrawArrays(GL_TRIANGLE_STRIP, 0, gear->count); +} + +static void +gears_draw(GLData *gld) +{ + Evas_GL_API *gl = gld->glapi; + + static const GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 }; + static const GLfloat green[4] = { 0.0, 0.8, 0.2, 1.0 }; + static const GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 }; + GLfloat m[16]; + + gl->glClearColor(0.8, 0.8, 0.1, 0.5); + gl->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + memcpy(m, gld->proj, sizeof m); + rotate(m, 2 * M_PI * gld->view_rotx / 360.0, 1, 0, 0); + rotate(m, 2 * M_PI * gld->view_roty / 360.0, 0, 1, 0); + rotate(m, 2 * M_PI * gld->view_rotz / 360.0, 0, 0, 1); + + draw_gear(gld, gld->gear1, m, -3.0, -2.0, gld->angle, red); + draw_gear(gld, gld->gear2, m, 3.1, -2.0, -2 * gld->angle - 9.0, green); + draw_gear(gld, gld->gear3, m, -3.1, 4.2, -2 * gld->angle - 25.0, blue); +} + +static void render_gears(GLData *gld) +{ + gears_draw(gld); + + gld->angle += 2.0; +} + +/* new window size or exposure */ +static void +gears_reshape(GLData *gld, int width, int height) +{ + Evas_GL_API *gl = gld->glapi; + + GLfloat ar, m[16] = { + 1.0, 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 0.1, 0.0, + 0.0, 0.0, 0.0, 1.0 + }; + + if (width < height) + ar = width; + else + ar = height; + + m[0] = 0.1 * ar / width; + m[5] = 0.1 * ar / height; + memcpy(gld->proj, m, sizeof gld->proj); + gl->glViewport(0, 0, (GLint) width, (GLint) height); +} + +static const char vertex_shader[] = + "uniform mat4 proj;\n" + "attribute vec4 position;\n" + "attribute vec4 normal;\n" + "varying vec3 rotated_normal;\n" + "varying vec3 rotated_position;\n" + "vec4 tmp;\n" + "void main()\n" + "{\n" + " gl_Position = proj * position;\n" + " rotated_position = gl_Position.xyz;\n" + " tmp = proj * normal;\n" + " rotated_normal = tmp.xyz;\n" + "}\n"; + + static const char fragment_shader[] = + "#ifdef GL_ES\n" + "precision mediump float;\n" + "#endif\n" + "uniform vec4 color;\n" + "uniform vec3 light;\n" + "varying vec3 rotated_normal;\n" + "varying vec3 rotated_position;\n" + "vec3 light_direction;\n" + "vec4 white = vec4(0.5, 0.5, 0.5, 1.0);\n" + "void main()\n" + "{\n" + " light_direction = normalize(light - rotated_position);\n" + " gl_FragColor = color + white * dot(light_direction, rotated_normal);\n" + "}\n"; + + +static void +gears_init(GLData *gld) +{ + Evas_GL_API *gl = gld->glapi; + + const char *p; + char msg[512]; + + gl->glEnable(GL_CULL_FACE); + gl->glEnable(GL_DEPTH_TEST); + + p = vertex_shader; + gld->vtx_shader = gl->glCreateShader(GL_VERTEX_SHADER); + gl->glShaderSource(gld->vtx_shader, 1, &p, NULL); + gl->glCompileShader(gld->vtx_shader); + gl->glGetShaderInfoLog(gld->vtx_shader, sizeof msg, NULL, msg); + printf("vertex shader info: %s\n", msg); + + p = fragment_shader; + gld->fgmt_shader = gl->glCreateShader(GL_FRAGMENT_SHADER); + gl->glShaderSource(gld->fgmt_shader, 1, &p, NULL); + gl->glCompileShader(gld->fgmt_shader); + gl->glGetShaderInfoLog(gld->fgmt_shader, sizeof msg, NULL, msg); + printf("fragment shader info: %s\n", msg); + + gld->program = gl->glCreateProgram(); + gl->glAttachShader(gld->program, gld->vtx_shader); + gl->glAttachShader(gld->program, gld->fgmt_shader); + gl->glBindAttribLocation(gld->program, 0, "position"); + gl->glBindAttribLocation(gld->program, 1, "normal"); + + gl->glLinkProgram(gld->program); + gl->glGetProgramInfoLog(gld->program, sizeof msg, NULL, msg); + printf("info: %s\n", msg); + + gl->glUseProgram(gld->program); + gld->proj_location = gl->glGetUniformLocation(gld->program, "proj"); + gld->light_location = gl->glGetUniformLocation(gld->program, "light"); + gld->color_location = gl->glGetUniformLocation(gld->program, "color"); + + /* make the gears */ + gld->gear1 = make_gear(gld, 1.0, 4.0, 1.0, 20, 0.7); + gld->gear2 = make_gear(gld, 0.5, 2.0, 2.0, 10, 0.7); + gld->gear3 = make_gear(gld, 1.3, 2.0, 0.5, 10, 0.7); +} + + +static void +gldata_init(GLData *gld) +{ + gld->initialized = 0; + gld->mouse_down = 0; + + gld->view_rotx = -20.0; + gld->view_roty = -30.0; + gld->view_rotz = 0.0; + gld->angle = 0.0; + + gld->light[0] = 1.0; + gld->light[1] = 1.0; + gld->light[2] = -5.0; +} + + +//-------------------------// + +static void +_init_gl(Evas_Object *obj) +{ + GLData *gld = evas_object_data_get(obj, "gld"); + + gears_init(gld); +} + +static void +_del_gl(Evas_Object *obj) +{ + GLData *gld = evas_object_data_get(obj, "gld"); + if (!gld) + { + printf("Unable to get GLData. \n"); + return; + } + Evas_GL_API *gl = gld->glapi; + + gl->glDeleteShader(gld->vtx_shader); + gl->glDeleteShader(gld->fgmt_shader); + gl->glDeleteProgram(gld->program); + gl->glDeleteBuffers(1, &gld->gear1->vbo); + gl->glDeleteBuffers(1, &gld->gear2->vbo); + gl->glDeleteBuffers(1, &gld->gear3->vbo); + + free_gear(gld->gear1); + free_gear(gld->gear2); + free_gear(gld->gear3); + + evas_object_data_del((Evas_Object*)obj, "..gld"); + free(gld); +} + + +static void +_resize_gl(Evas_Object *obj) +{ + int w, h; + GLData *gld = evas_object_data_get(obj, "gld"); + + elm_glview_size_get(obj, &w, &h); + + // GL Viewport stuff. you can avoid doing this if viewport is all the + // same as last frame if you want + gears_reshape(gld, w,h); +} + + + +static void +_draw_gl(Evas_Object *obj) +{ + Evas_GL_API *gl = elm_glview_gl_api_get(obj); + GLData *gld = evas_object_data_get(obj, "gld"); + if (!gld) return; + + render_gears(gld); + gl->glFinish(); +} + +static Eina_Bool +_anim(void *data) +{ + elm_glview_changed_set(data); + return EINA_TRUE; +} + +static void +_on_done(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + evas_object_del((Evas_Object*)data); +} + + +static void +_del(void *data __UNUSED__, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + Ecore_Animator *ani = evas_object_data_get(obj, "ani"); + ecore_animator_del(ani); +} + + +static void +_key_down(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info) +{ + Evas_Event_Key_Down *ev; + ev = (Evas_Event_Key_Down *)event_info; + GLData *gld = evas_object_data_get(obj, "gld"); + + if (strcmp(ev->keyname, "Left") == 0) + { + gld->view_roty += 5.0; + return; + } + + if (strcmp(ev->keyname, "Right") == 0) + { + gld->view_roty -= 5.0; + return; + } + + if (strcmp(ev->keyname, "Up") == 0) + { + gld->view_rotx += 5.0; + return; + } + + if (strcmp(ev->keyname, "Down") == 0) + { + gld->view_rotx -= 5.0; + return; + } + if ((strcmp(ev->keyname, "Escape") == 0) || + (strcmp(ev->keyname, "Return") == 0)) + { + //_on_done(data, obj, event_info); + return; + } +} + +static void +_mouse_down(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + GLData *gld = evas_object_data_get(obj, "gld"); + gld->mouse_down = 1; +} + +static void +_mouse_move(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Event_Mouse_Move *ev; + ev = (Evas_Event_Mouse_Move *)event_info; + GLData *gld = evas_object_data_get(obj, "gld"); + float dx = 0, dy = 0; + + if (gld->mouse_down) + { + dx = ev->cur.canvas.x - ev->prev.canvas.x; + dy = ev->cur.canvas.y - ev->prev.canvas.y; + + gld->view_roty += -1.0 * dx; + gld->view_rotx += -1.0 * dy; + } +} + +static void +_mouse_up(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + GLData *gld = evas_object_data_get(obj, "gld"); + gld->mouse_down = 0; +} + +TEST_START(test_glview) +{ + Evas_Object *bg, *bx, *bt, *gl; + Ecore_Animator *ani; + GLData *gld = NULL; + + // alloc a data struct to hold our relevant gl info in + if (!(gld = calloc(1, sizeof(GLData)))) return; + gldata_init(gld); + + // new window - do the usual and give it a name, title and delete handler + + // add a standard bg + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + // Add a GLView + gl = elm_glview_add(win); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_glview_mode_set(gl, ELM_GLVIEW_ALPHA|ELM_GLVIEW_DEPTH); + elm_glview_resize_policy_set(gl, ELM_GLVIEW_RESIZE_POLICY_RECREATE); + elm_glview_render_policy_set(gl, ELM_GLVIEW_RENDER_POLICY_ALWAYS); + elm_glview_init_func_set(gl, _init_gl); + elm_glview_del_func_set(gl, _del_gl); + elm_glview_resize_func_set(gl, _resize_gl); + elm_glview_render_func_set(gl, (Elm_GLView_Func_Cb)_draw_gl); + elm_box_pack_end(bx, gl); + evas_object_show(gl); + + // Add Mouse/Key Event Callbacks + elm_object_focus_set(gl, EINA_TRUE); + evas_object_event_callback_add(gl, EVAS_CALLBACK_KEY_DOWN, _key_down, gl); + evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down, gl); + evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_UP, _mouse_up, gl); + evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move, gl); + + + // Animator and other vars + ani = ecore_animator_add(_anim, gl); + gld->glapi = elm_glview_gl_api_get(gl); + evas_object_data_set(gl, "ani", ani); + evas_object_data_set(gl, "gld", gld); + evas_object_event_callback_add(gl, EVAS_CALLBACK_DEL, _del, gl); + + + /* add an ok button */ + bt = elm_button_add(win); + elm_object_text_set(bt, "OK"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_smart_callback_add(bt, "clicked", _on_done, win); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_glview_simple.c b/src/bin/test_glview_simple.c new file mode 100644 index 0000000..85d3cb1 --- /dev/null +++ b/src/bin/test_glview_simple.c @@ -0,0 +1,282 @@ +#include +#include "tsuite.h" + +typedef struct _GLData GLData; + +// GL related data here.. +struct _GLData +{ + Evas_GL_API *glapi; + GLuint program; + GLuint vtx_shader; + GLuint fgmt_shader; + GLuint vbo; + int initialized : 1; +}; + + +static float red = 1.0; + +//--------------------------------// +static GLuint +load_shader( GLData *gld, GLenum type, const char *shader_src ) +{ + Evas_GL_API *gl = gld->glapi; + GLuint shader; + GLint compiled; + + // Create the shader object + shader = gl->glCreateShader(type); + if (shader==0) + return 0; + + // Load/Compile shader source + gl->glShaderSource(shader, 1, &shader_src, NULL); + gl->glCompileShader(shader); + gl->glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled); + + if (!compiled) + { + GLint info_len = 0; + gl->glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &info_len); + if (info_len > 1) + { + char* info_log = malloc(sizeof(char) * info_len); + + gl->glGetShaderInfoLog(shader, info_len, NULL, info_log); + printf("Error compiling shader:\n%s\n======\n%s\n======\n", info_log, shader_src ); + free(info_log); + } + gl->glDeleteShader(shader); + return 0; + } + + return shader; +} + +// Initialize the shader and program object +static int +init_shaders(GLData *gld) +{ + Evas_GL_API *gl = gld->glapi; + GLbyte vShaderStr[] = + "attribute vec4 vPosition; \n" + "void main() \n" + "{ \n" + " gl_Position = vPosition; \n" + "} \n"; + + GLbyte fShaderStr[] = + "#ifdef GL_ES \n" + "precision mediump float; \n" + "#endif \n" + "void main() \n" + "{ \n" + " gl_FragColor = vec4 ( 1.0, 0.0, 0.0, 1.0 );\n" + "} \n"; + + GLint linked; + + // Load the vertex/fragment shaders + gld->vtx_shader = load_shader(gld, GL_VERTEX_SHADER, (const char*)vShaderStr); + gld->fgmt_shader = load_shader(gld, GL_FRAGMENT_SHADER, (const char*)fShaderStr); + + // Create the program object + gld->program = gl->glCreateProgram( ); + if (gld->program==0) + return 0; + + gl->glAttachShader(gld->program, gld->vtx_shader); + gl->glAttachShader(gld->program, gld->fgmt_shader); + + gl->glBindAttribLocation(gld->program, 0, "vPosition"); + gl->glLinkProgram(gld->program); + gl->glGetProgramiv(gld->program, GL_LINK_STATUS, &linked); + + if (!linked) + { + GLint info_len = 0; + gl->glGetProgramiv(gld->program, GL_INFO_LOG_LENGTH, &info_len); + if (info_len > 1) + { + char* info_log = malloc(sizeof(char) * info_len); + + gl->glGetProgramInfoLog(gld->program, info_len, NULL, info_log); + printf("Error linking program:\n%s\n", info_log); + free(info_log); + } + gl->glDeleteProgram(gld->program); + return 0; + } + return 1; +} + + + +// Callbacks +static void +_init_gl(Evas_Object *obj) +{ + GLData *gld = evas_object_data_get(obj, "gld"); + Evas_GL_API *gl = gld->glapi; + GLfloat vVertices[] = { 0.0f, 0.5f, 0.0f, + -0.5f, -0.5f, 0.0f, + 0.5f, -0.5f, 0.0f }; + + if (!init_shaders(gld)) + { + printf("Error Initializing Shaders\n"); + return; + } + + gl->glGenBuffers(1, &gld->vbo); + gl->glBindBuffer(GL_ARRAY_BUFFER, gld->vbo); + gl->glBufferData(GL_ARRAY_BUFFER, 3 * 3 * 4, vVertices, GL_STATIC_DRAW); +} + +static void +_del_gl(Evas_Object *obj) +{ + GLData *gld = evas_object_data_get(obj, "gld"); + if (!gld) + { + printf("Unable to get GLData. \n"); + return; + } + Evas_GL_API *gl = gld->glapi; + + gl->glDeleteShader(gld->vtx_shader); + gl->glDeleteShader(gld->fgmt_shader); + gl->glDeleteProgram(gld->program); + gl->glDeleteBuffers(1, &gld->vbo); + + evas_object_data_del((Evas_Object*)obj, "..gld"); + free(gld); +} + + +static void +_resize_gl(Evas_Object *obj) +{ + int w, h; + GLData *gld = evas_object_data_get(obj, "gld"); + Evas_GL_API *gl = gld->glapi; + + elm_glview_size_get(obj, &w, &h); + + // GL Viewport stuff. you can avoid doing this if viewport is all the + // same as last frame if you want + gl->glViewport(0, 0, w, h); +} + + + +static void +_draw_gl(Evas_Object *obj) +{ + Evas_GL_API *gl = elm_glview_gl_api_get(obj); + GLData *gld = evas_object_data_get(obj, "gld"); + if (!gld) return; + int w, h; + + elm_glview_size_get(obj, &w, &h); + + gl->glViewport(0, 0, w, h); + gl->glClearColor(red,0.8,0.3,1); + gl->glClear(GL_COLOR_BUFFER_BIT); + + // Draw a Triangle + gl->glEnable(GL_BLEND); + + gl->glUseProgram(gld->program); + + gl->glBindBuffer(GL_ARRAY_BUFFER, gld->vbo); + gl->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, + 0, 0); + gl->glEnableVertexAttribArray(0); + + gl->glDrawArrays(GL_TRIANGLES, 0, 3); + + // Optional - Flush the GL pipeline + gl->glFinish(); + + red -= 0.1; + if (red < 0.0) red = 1.0; +} + +static Eina_Bool +_anim(void *data) +{ + elm_glview_changed_set(data); + return EINA_TRUE; +} + +static void +_on_done(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + evas_object_del((Evas_Object*)data); +} + + +static void +_del(void *data __UNUSED__, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + Ecore_Animator *ani = evas_object_data_get(obj, "ani"); + ecore_animator_del(ani); +} + + +TEST_START(test_glview_simple) +{ + Evas_Object *bg, *bx, *bt, *gl; + Ecore_Animator *ani; + GLData *gld = NULL; + + if (!(gld = calloc(1, sizeof(GLData)))) return; + + // Set the engine to opengl_x11 + elm_engine_set("opengl_x11"); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + gl = elm_glview_add(win); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_glview_mode_set(gl, ELM_GLVIEW_ALPHA | ELM_GLVIEW_DEPTH); + elm_glview_resize_policy_set(gl, ELM_GLVIEW_RESIZE_POLICY_RECREATE); + elm_glview_render_policy_set(gl, ELM_GLVIEW_RENDER_POLICY_ON_DEMAND); + elm_glview_init_func_set(gl, _init_gl); + elm_glview_del_func_set(gl, _del_gl); + elm_glview_resize_func_set(gl, _resize_gl); + elm_glview_render_func_set(gl, _draw_gl); + elm_box_pack_end(bx, gl); + evas_object_show(gl); + + elm_object_focus_set(gl, EINA_TRUE); + + ani = ecore_animator_add(_anim, gl); + gld->glapi = elm_glview_gl_api_get(gl); + evas_object_data_set(gl, "ani", ani); + evas_object_data_set(gl, "gld", gld); + evas_object_event_callback_add(gl, EVAS_CALLBACK_DEL, _del, gl); + + bt = elm_button_add(win); + elm_object_text_set(bt, "OK"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_smart_callback_add(bt, "clicked", _on_done, win); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_grid.c b/src/bin/test_grid.c new file mode 100644 index 0000000..b024e1e --- /dev/null +++ b/src/bin/test_grid.c @@ -0,0 +1,176 @@ +#include +#include "tsuite.h" + +static void +_ch_grid(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + int x, y, w, h; + + elm_grid_pack_get(obj, &x, &y, &w, &h); + elm_grid_pack_set(obj, x - 1, y - 1, w + 2, h + 2); +} + +struct _Api_Data +{ + Evas_Object *grid; + Evas_Object *child; +}; +typedef struct _Api_Data Api_Data; + +enum _api_state +{ + GRID_PACK_SET, + GRID_UNPACK, + GRID_SIZE, + GRID_CLEAR, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + Api_Data *dt = api->data; + int w, h; + + switch(api->state) + { /* Put all api-changes under switch */ + case GRID_PACK_SET: /* 0 */ + elm_grid_pack_set(dt->child, 5, 15, 60, 40); + break; + + case GRID_UNPACK: /* 1 */ + elm_grid_unpack(dt->grid, dt->child); + evas_object_del(dt->child); + break; + + case GRID_SIZE: /* 2 */ + elm_grid_size_get(dt->grid, &w, &h); + printf("size w=<%d> h=<%d>\n", w, h); + w = h = 100; /* grid size returns wrong values */ + w += 30; + h += 10; + + elm_grid_size_set(dt->grid, w, h); + break; + + case GRID_CLEAR: /* 3 */ + elm_grid_clear(dt->grid, EINA_TRUE); + break; + + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(a->bt, str); + elm_object_disabled_set(a->bt, a->state == API_STATE_LAST); +} + +TEST_START(test_grid) +{ + Evas_Object *bg, *gd, *bt, *rc, *en; + Api_Data *dt = malloc(sizeof(Api_Data)); + api->data = dt; + api->free_data = EINA_TRUE; + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + gd = elm_grid_add(win); + elm_grid_size_set(gd, 100, 100); + elm_win_resize_object_add(win, gd); + evas_object_size_hint_weight_set(gd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + dt->grid = gd; + evas_object_show(gd); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_entry_set(en, "Entry text"); + elm_entry_single_line_set(en, 1); + elm_grid_pack(gd, en, 50, 10, 40, 10); + evas_object_show(en); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + elm_entry_entry_set(en, "Entry text 2"); + elm_entry_single_line_set(en, 1); + elm_grid_pack(gd, en, 60, 20, 30, 10); + evas_object_show(en); + + api->bt = elm_button_add(win); + elm_object_text_set(api->bt, "Next API function"); + evas_object_smart_callback_add(api->bt, "clicked", _api_bt_clicked, (void *) api); + elm_grid_pack(gd, api->bt, 30, 0, 40, 10); + elm_object_disabled_set(api->bt, api->state == API_STATE_LAST); + evas_object_show(api->bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button"); + elm_grid_pack(gd, bt, 0, 0, 20, 20); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button"); + elm_grid_pack(gd, bt, 10, 10, 40, 20); + dt->child = bt; + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button"); + elm_grid_pack(gd, bt, 10, 30, 20, 50); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button"); + elm_grid_pack(gd, bt, 80, 80, 20, 20); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Change"); + elm_grid_pack(gd, bt, 40, 40, 20, 20); + evas_object_smart_callback_add(bt, "clicked", _ch_grid, gd); + evas_object_show(bt); + + rc = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(rc, 128, 0, 0, 128); + elm_grid_pack(gd, rc, 40, 70, 20, 10); + evas_object_show(rc); + + rc = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(rc, 0, 128, 0, 128); + elm_grid_pack(gd, rc, 60, 70, 10, 10); + evas_object_show(rc); + + rc = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(rc, 0, 0, 128, 128); + elm_grid_pack(gd, rc, 40, 80, 10, 10); + evas_object_show(rc); + + rc = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(rc, 128, 0, 128, 128); + elm_grid_pack(gd, rc, 50, 80, 10, 10); + evas_object_show(rc); + + rc = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(rc, 128, 64, 0, 128); + elm_grid_pack(gd, rc, 60, 80, 10, 10); + evas_object_show(rc); + + evas_object_resize(win, 480, 480); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_hover.c b/src/bin/test_hover.c new file mode 100644 index 0000000..74cd9ec --- /dev/null +++ b/src/bin/test_hover.c @@ -0,0 +1,162 @@ +#include +#include "tsuite.h" +static void +my_hover_bt(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *hv = data; + + evas_object_show(hv); +} + +TEST_START(test_hover) +{ + Evas_Object *bg, *bx, *bt, *hv, *ic; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + hv = elm_hover_add(win); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button"); + evas_object_smart_callback_add(bt, "clicked", my_hover_bt, hv); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + elm_hover_parent_set(hv, win); + elm_hover_target_set(hv, bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Popup"); + elm_hover_content_set(hv, "middle", bt); + evas_object_show(bt); + + bx = elm_box_add(win); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Top 1"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + bt = elm_button_add(win); + elm_object_text_set(bt, "Top 2"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + bt = elm_button_add(win); + elm_object_text_set(bt, "Top 3"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + evas_object_show(bx); + elm_hover_content_set(hv, "top", bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Bottom"); + elm_hover_content_set(hv, "bottom", bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Left"); + elm_hover_content_set(hv, "left", bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Right"); + elm_hover_content_set(hv, "right", bt); + evas_object_show(bt); + + evas_object_size_hint_min_set(bg, 160, 160); + evas_object_size_hint_max_set(bg, 640, 640); + evas_object_resize(win, 320, 320); + evas_object_show(win); +} +TEST_END + +TEST_START(test_hover2) +{ + Evas_Object *bg, *bx, *bt, *hv, *ic; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + hv = elm_hover_add(win); + elm_object_style_set(hv, "popout"); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button"); + evas_object_smart_callback_add(bt, "clicked", my_hover_bt, hv); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + elm_hover_parent_set(hv, win); + elm_hover_target_set(hv, bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Popup"); + elm_hover_content_set(hv, "middle", bt); + evas_object_show(bt); + + bx = elm_box_add(win); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + bt = elm_button_add(win); + elm_object_text_set(bt, "Top 1"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + bt = elm_button_add(win); + elm_object_text_set(bt, "Top 2"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + bt = elm_button_add(win); + elm_object_text_set(bt, "Top 3"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_show(bx); + elm_hover_content_set(hv, "top", bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Bot"); + elm_hover_content_set(hv, "bottom", bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Left"); + elm_hover_content_set(hv, "left", bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Right"); + elm_hover_content_set(hv, "right", bt); + evas_object_show(bt); + + evas_object_size_hint_min_set(bg, 160, 160); + evas_object_size_hint_max_set(bg, 640, 640); + evas_object_resize(win, 320, 320); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_hoversel.c b/src/bin/test_hoversel.c new file mode 100644 index 0000000..1f1d3ca --- /dev/null +++ b/src/bin/test_hoversel.c @@ -0,0 +1,190 @@ +#include +#include "tsuite.h" +enum _api_state +{ + HOVERSEL_HORIZ, + HOVERSEL_END, + HOVERSEL_LABAL_SET, + HOVERSEL_ICON_UNSET, + HOVERSEL_CLEAR_OPEN, + HOVERSEL_CLEAR, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + const Eina_List *items = elm_box_children_get(api->data); + if(!eina_list_count(items)) + return; + + /* use elm_box_children_get() to get list of children */ + switch(api->state) + { /* Put all api-changes under switch */ + case HOVERSEL_HORIZ: /* Make first hover horiz (0) */ + elm_hoversel_horizontal_set(eina_list_nth(items, 0), EINA_TRUE); + elm_hoversel_hover_begin(eina_list_nth(items, 0)); + break; + + case HOVERSEL_END: /* Make first hover horiz (1) */ + elm_hoversel_hover_begin(eina_list_nth(items, 1)); + elm_hoversel_hover_end(eina_list_nth(items, 1)); + break; + + case HOVERSEL_LABAL_SET: /* set second hover label (2) */ + elm_object_text_set(eina_list_nth(items, 1), "Label from API"); + break; + + case HOVERSEL_ICON_UNSET: /* 3 */ + elm_object_text_set(eina_list_nth(items, 5), "Label only"); + elm_hoversel_icon_unset(eina_list_nth(items, 5)); + break; + + case HOVERSEL_CLEAR_OPEN: /* 4 */ + elm_hoversel_hover_begin(eina_list_nth(items, 1)); + elm_hoversel_clear(eina_list_nth(items, 1)); + break; + + case HOVERSEL_CLEAR: /* 5 */ + elm_hoversel_clear(eina_list_nth(items, 0)); + break; + + case API_STATE_LAST: + break; + + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(a->bt, str); + elm_object_disabled_set(a->bt, a->state == API_STATE_LAST); +} + +TEST_START(test_hoversel) +{ + Evas_Object *bg, *bx, *bxx, *bt, *ic; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bxx = elm_box_add(win); + elm_win_resize_object_add(win, bxx); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bxx); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + api->data = bx; + evas_object_show(bx); + + api->bt = elm_button_add(win); + elm_object_text_set(api->bt, "Next API function"); + evas_object_smart_callback_add(api->bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, api->bt); + elm_object_disabled_set(api->bt, api->state == API_STATE_LAST); + evas_object_show(api->bt); + + elm_box_pack_end(bxx, bx); + + bt = elm_hoversel_add(win); +// FIXME: need to add horizontal hoversel theme to default some day +// elm_hoversel_horizontal_set(bt, 1); + elm_hoversel_hover_parent_set(bt, win); + elm_object_text_set(bt, "Labels"); + elm_hoversel_item_add(bt, "Item 1", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(bt, "Item 2", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(bt, "Item 3", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(bt, "Item 4 - Long Label Here", NULL, ELM_ICON_NONE, NULL, NULL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_size_hint_align_set(bt, 0.5, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_hoversel_add(win); + elm_hoversel_hover_parent_set(bt, win); + elm_object_text_set(bt, "Some Icons"); + elm_hoversel_item_add(bt, "Item 1", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(bt, "Item 2", NULL, ELM_ICON_NONE, NULL, NULL); + elm_hoversel_item_add(bt, "Item 3", "home", ELM_ICON_STANDARD, NULL, NULL); + elm_hoversel_item_add(bt, "Item 4", "close", ELM_ICON_STANDARD, NULL, NULL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_size_hint_align_set(bt, 0.5, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_hoversel_add(win); + elm_hoversel_hover_parent_set(bt, win); + elm_object_text_set(bt, "All Icons"); + elm_hoversel_item_add(bt, "Item 1", "apps", ELM_ICON_STANDARD, NULL, NULL); + elm_hoversel_item_add(bt, "Item 2", "arrow_down", ELM_ICON_STANDARD, NULL, NULL); + elm_hoversel_item_add(bt, "Item 3", "home", ELM_ICON_STANDARD, NULL, NULL); + elm_hoversel_item_add(bt, "Item 4", "close", ELM_ICON_STANDARD, NULL, NULL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_size_hint_align_set(bt, 0.5, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_hoversel_add(win); + elm_hoversel_hover_parent_set(bt, win); + elm_object_text_set(bt, "All Icons"); + elm_hoversel_item_add(bt, "Item 1", "apps", ELM_ICON_STANDARD, NULL, NULL); + snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get()); + elm_hoversel_item_add(bt, "Item 2", buf, ELM_ICON_FILE, NULL, NULL); + elm_hoversel_item_add(bt, "Item 3", "home", ELM_ICON_STANDARD, NULL, NULL); + elm_hoversel_item_add(bt, "Item 4", "close", ELM_ICON_STANDARD, NULL, NULL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_size_hint_align_set(bt, 0.5, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_hoversel_add(win); + elm_hoversel_hover_parent_set(bt, win); + elm_object_text_set(bt, "Disabled Hoversel"); + elm_hoversel_item_add(bt, "Item 1", "apps", ELM_ICON_STANDARD, NULL, NULL); + elm_hoversel_item_add(bt, "Item 2", "close", ELM_ICON_STANDARD, NULL, NULL); + elm_object_disabled_set(bt, 1); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_size_hint_align_set(bt, 0.5, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_hoversel_add(win); + elm_hoversel_hover_parent_set(bt, win); + elm_object_text_set(bt, "Icon + Label"); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/sky_03.jpg", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_hoversel_icon_set(bt, ic); + evas_object_show(ic); + + elm_hoversel_item_add(bt, "Item 1", "apps", ELM_ICON_STANDARD, NULL, NULL); + elm_hoversel_item_add(bt, "Item 2", "arrow_down", ELM_ICON_STANDARD, NULL, NULL); + elm_hoversel_item_add(bt, "Item 3", "home", ELM_ICON_STANDARD, NULL, NULL); + elm_hoversel_item_add(bt, "Item 4", "close", ELM_ICON_STANDARD, NULL, NULL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + evas_object_size_hint_align_set(bt, 0.5, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + evas_object_resize(win, 320, 300); + + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_icon.c b/src/bin/test_icon.c new file mode 100644 index 0000000..66785cf --- /dev/null +++ b/src/bin/test_icon.c @@ -0,0 +1,31 @@ +#include +#include "tsuite.h" + +static void +icon_clicked(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("clicked!\n"); +} + +TEST_START(test_icon) +{ + Evas_Object *ic; + char buf[PATH_MAX]; + + elm_win_alpha_set(win, 1); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + elm_icon_no_scale_set(ic, 1); + evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(ic, 0.5, 0.5); + elm_win_resize_object_add(win, ic); + evas_object_show(ic); + + evas_object_smart_callback_add(ic, "clicked", icon_clicked, NULL); + + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_icon_desktops.c b/src/bin/test_icon_desktops.c new file mode 100644 index 0000000..1746f07 --- /dev/null +++ b/src/bin/test_icon_desktops.c @@ -0,0 +1,98 @@ +#include +#include "tsuite.h" +static Elm_Genlist_Item_Class it_desk; + +static char * +desk_gl_label_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__) +{ +#ifdef ELM_EFREET + Efreet_Desktop *d = (Efreet_Desktop *)data; + return strdup(d->name); +#else + return NULL; + (void)data; +#endif +} +static Evas_Object * +desk_gl_content_get(void *data, Evas_Object *obj, const char *part) +{ +#ifdef ELM_EFREET + Efreet_Desktop *d = (Efreet_Desktop *)data; + Evas_Object *ic; + + ic = elm_icon_add(obj); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + if (!(!strcmp(part, "elm.swallow.icon"))) return ic; + if (!d->icon) return ic; + elm_icon_standard_set(ic, d->icon); + return ic; +#else + return NULL; + (void)data; + (void)obj; + (void)part; +#endif +} +static void +desk_gl_del(void *data, Evas_Object *obj __UNUSED__) +{ +#ifdef ELM_EFREET + Efreet_Desktop *d = (Efreet_Desktop *)data; + efreet_desktop_free(d); +#else + return; + (void)data; +#endif +} + +#ifdef ELM_EFREET +static void +desktop_sel(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("sel\n"); +} +#endif + +TEST_START(test_icon_desktops) +{ + Evas_Object *bg, *gl; +#ifdef ELM_EFREET + Eina_List *desktops; +#endif + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + it_desk.item_style = "default"; + it_desk.func.label_get = desk_gl_label_get; + it_desk.func.content_get = desk_gl_content_get; + it_desk.func.state_get = NULL; + it_desk.func.del = desk_gl_del; + + gl = elm_genlist_add(win); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, gl); + evas_object_show(gl); + +#ifdef ELM_EFREET + if (elm_need_efreet()) + { + desktops = efreet_util_desktop_name_glob_list("*"); + if (desktops) + { + Efreet_Desktop *d; + + EINA_LIST_FREE(desktops, d) + elm_genlist_item_append(gl, &it_desk, d, + NULL, ELM_GENLIST_ITEM_NONE, + desktop_sel, NULL); + } + } +#endif + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_index.c b/src/bin/test_index.c new file mode 100644 index 0000000..3e3ead9 --- /dev/null +++ b/src/bin/test_index.c @@ -0,0 +1,349 @@ +#include +#include "tsuite.h" + +static Elm_Genlist_Item_Class itci; +char *gli_text_get(void *data, Evas_Object *obj __UNUSED__, const char *part __UNUSED__) +{ + char buf[256]; + int j = (long)data; + snprintf(buf, sizeof(buf), "%c%c", + 'A' + ((j >> 4) & 0xf), + 'a' + ((j ) & 0xf) + ); + return strdup(buf); +} + +void +index_changed2(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + // called on a change but delayed in case multiple changes happen in a + // short timespan + elm_genlist_item_top_bring_in(event_info); +} + +void +index_changed(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + // this is calld on every change, no matter how often + // elm_genlist_item_bring_in(event_info); +} + +void +index_selected(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + // called on final select + elm_genlist_item_top_bring_in(event_info); +} + +struct _Idx_Data_Type +{ + Evas_Object *id; /* Pointer to Index */ + void *item; /* Item we use for search */ +}; +typedef struct _Idx_Data_Type Idx_Data_Type; + +enum _api_state +{ + INDEX_LEVEL_SET, + INDEX_ACTIVE_SET, + INDEX_APPEND_RELATIVE, + INDEX_PREPEND, + INDEX_ITEM_DEL, + INDEX_ITEM_FIND, + INDEX_CLEAR, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + Idx_Data_Type *d = api->data; + switch(api->state) + { /* Put all api-changes under switch */ + case INDEX_LEVEL_SET: /* 0 */ + elm_index_active_set(d->id, EINA_TRUE); + elm_index_item_level_set(d->id, (elm_index_item_level_get(d->id) ? 0 : 1)); + break; + + case INDEX_ACTIVE_SET: /* 1 */ + elm_index_active_set(d->id, EINA_FALSE); + break; + + case INDEX_APPEND_RELATIVE: /* 2 */ + elm_index_item_append_relative(d->id, "W", d->item, d->item); + break; + + case INDEX_PREPEND: /* 3 */ + elm_index_item_prepend(d->id, "D", d->item); + break; + + case INDEX_ITEM_DEL: /* 4 */ + elm_index_item_del(d->id, d->item); + break; + + case INDEX_ITEM_FIND: /* 5 */ + { + Elm_Index_Item *i = elm_index_item_find(d->id, d->item); + if(i) + { + printf("Item Find - Found Item.\n"); + elm_index_item_del(d->id, i); + } + } + break; + + case INDEX_CLEAR: /* 6 */ + elm_index_item_clear(d->id); + break; + + case API_STATE_LAST: + break; + + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(a->bt, str); + elm_object_disabled_set(a->bt, a->state == API_STATE_LAST); +} + +TEST_START(test_index) +{ + Evas_Object *bg, *bxx, *gl, *id; + Elm_Genlist_Item *it; + int i, j; + Idx_Data_Type *dt = malloc(sizeof(Idx_Data_Type)); + api->data = dt; + api->free_data = EINA_TRUE; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bxx = elm_box_add(win); + elm_win_resize_object_add(win, bxx); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bxx); + + gl = elm_genlist_add(win); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(gl); + + dt->id = id = elm_index_add(win); + evas_object_size_hint_weight_set(id, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(id, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_win_resize_object_add(win, id); + + api->bt = elm_button_add(win); + elm_object_text_set(api->bt, "Next API function"); + evas_object_smart_callback_add(api->bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, api->bt); + elm_object_disabled_set(api->bt, api->state == API_STATE_LAST); + evas_object_show(api->bt); + + elm_box_pack_end(bxx, gl); + + evas_object_show(id); + + itci.item_style = "default"; + itci.func.text_get = gli_text_get; + itci.func.content_get = NULL; + itci.func.state_get = NULL; + itci.func.del = NULL; + + j = 0; + for (i = 0; i < 100; i++) + { + it = elm_genlist_item_append(gl, &itci, + (void *)(long)j/* item data */, + NULL/* parent */, ELM_GENLIST_ITEM_NONE, + NULL/* func */, NULL/* func data */); + if (!(j & 0xf)) + { + char buf[32]; + + snprintf(buf, sizeof(buf), "%c", 'A' + ((j >> 4) & 0xf)); + elm_index_item_append(id, buf, it); + } + j += 2; + } + evas_object_smart_callback_add(id, "delay,changed", index_changed2, NULL); + evas_object_smart_callback_add(id, "changed", index_changed, NULL); + evas_object_smart_callback_add(id, "selected", index_selected, NULL); + elm_index_item_go(id, 0); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} +TEST_END + +/***********/ + +typedef struct _Test_Index2_Elements +{ + Evas_Object *entry, *lst, *id; +} Test_Index2_Elements; + +void +test_index2_del(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + /* FIXME it won't be called if elm_test main window is closed */ + free(data); +} + +int +test_index2_cmp(const void *data1, const void *data2) +{ + const char *label1, *label2; + const Elm_List_Item *it1 = data1; + const Elm_List_Item *it2 = data2; + + label1 = elm_list_item_label_get(it1); + label2 = elm_list_item_label_get(it2); + + return strcasecmp(label1, label2); +} + +int +test_index2_icmp(const void *data1, const void *data2) +{ + const char *label1, *label2; + const Elm_Index_Item *it1 = data1; + const Elm_Index_Item *it2 = data2; + + label1 = elm_index_item_letter_get(it1); + label2 = elm_index_item_letter_get(it2); + + return strcasecmp(label1, label2); +} + +void +test_index2_it_add(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Test_Index2_Elements *gui = data; + Elm_List_Item *it; + const char *label; + char letter[2]; + + label = elm_entry_entry_get(gui->entry); + snprintf(letter, sizeof(letter), "%c", label[0]); + it = elm_list_item_sorted_insert(gui->lst, label, NULL, NULL, NULL, NULL, + test_index2_cmp); + elm_index_item_sorted_insert(gui->id, letter, it, test_index2_icmp, + test_index2_cmp); + elm_list_go(gui->lst); + /* FIXME it's not showing the recently added item */ + elm_list_item_show(it); +} + +void +test_index2_it_del(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Test_Index2_Elements *gui = data; + const char *label, *label_next; + Elm_List_Item *it, *it_next; + + it = elm_list_selected_item_get(obj); + it_next = elm_list_item_next(it); + + if (!it_next) + { + elm_index_item_del(gui->id, it); + elm_list_item_del(it); + return; + } + + label = elm_list_item_label_get(it); + label_next = elm_list_item_label_get(it_next); + + if (label[0] == label_next[0]) + { + Elm_Index_Item *iit; + iit = elm_index_item_find(gui->id, it); + elm_index_item_data_set(iit, it_next); + } + else + elm_index_item_del(gui->id, it); + + elm_list_item_del(it); +} + +void +test_index2_id_changed(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + elm_list_item_show(event_info); +} + +TEST_START(test_index2) +{ + Evas_Object *bg, *box, *bt; + Test_Index2_Elements *gui; + + gui = malloc(sizeof(*gui)); + + evas_object_smart_callback_add(win, "delete-request", test_index2_del, gui); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + gui->id = elm_index_add(win); + evas_object_size_hint_weight_set(gui->id, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, gui->id); + evas_object_smart_callback_add(gui->id, "delay,changed", + test_index2_id_changed, NULL); + evas_object_show(gui->id); + + gui->entry = elm_entry_add(win); + elm_entry_scrollable_set(gui->entry, EINA_TRUE); + elm_entry_entry_set(gui->entry, "Label"); + elm_entry_single_line_set(gui->entry, EINA_TRUE); + evas_object_size_hint_weight_set(gui->entry, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_fill_set(gui->entry, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, gui->entry); + evas_object_show(gui->entry); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Add"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, bt); + evas_object_smart_callback_add(bt, "clicked", test_index2_it_add, gui); + evas_object_show(bt); + + gui->lst = elm_list_add(win); + elm_box_pack_end(box, gui->lst); + evas_object_size_hint_weight_set(gui->lst, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(gui->lst, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(gui->lst, "selected", test_index2_it_del, + gui); + elm_list_go(gui->lst); + evas_object_show(gui->lst); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_inwin.c b/src/bin/test_inwin.c new file mode 100644 index 0000000..476324c --- /dev/null +++ b/src/bin/test_inwin.c @@ -0,0 +1,114 @@ +#include +#include "tsuite.h" + +enum _api_state +{ + CONTENT_UNSET, + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ + Evas_Object *t; + switch(api->state) + { + case CONTENT_UNSET: + t = elm_win_inwin_content_unset(api->data); + evas_object_del(t); + t = elm_label_add(elm_object_parent_widget_get(api->data)); + elm_object_text_set(t, "Content was unset.
DONE!"); + elm_win_inwin_content_set(api->data, t); + evas_object_show(t); + + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(a->bt, str); + elm_object_disabled_set(a->bt, a->state == API_STATE_LAST); +} + +TEST_START(test_inwin) +{ + Evas_Object *bg, *bxx, *inwin, *lb; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + inwin = elm_win_inwin_add(win); + api->data = inwin; + evas_object_show(inwin); + + bxx = elm_box_add(inwin); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bxx); + + api->bt = elm_button_add(inwin); + elm_object_text_set(api->bt, "Next API function"); + evas_object_smart_callback_add(api->bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, api->bt); + elm_object_disabled_set(api->bt, api->state == API_STATE_LAST); + evas_object_show(api->bt); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "This is an \"inwin\" - a window in a
" + "window. This is handy for quick popups
" + "you want centered, taking over the window
" + "until dismissed somehow. Unlike hovers they
" + "don't hover over their target."); + elm_box_pack_end(bxx, lb); + elm_win_inwin_content_set(inwin, bxx); + evas_object_show(lb); + + evas_object_resize(win, 320, 240); + evas_object_show(win); +} +TEST_END + +TEST_START(test_inwin2) +{ + Evas_Object *bg, *inwin, *lb; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + inwin = elm_win_inwin_add(win); + elm_object_style_set(inwin, "minimal_vertical"); + evas_object_show(inwin); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "This is an \"inwin\" - a window in a
" + "window. This is handy for quick popups
" + "you want centered, taking over the window
" + "until dismissed somehow. Unlike hovers they
" + "don't hover over their target.
" + "
" + "This inwin style compacts itself vertically
" + "to the size of its contents minimum size."); + elm_win_inwin_content_set(inwin, lb); + evas_object_show(lb); + + evas_object_resize(win, 320, 240); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_label.c b/src/bin/test_label.c new file mode 100644 index 0000000..e7228a8 --- /dev/null +++ b/src/bin/test_label.c @@ -0,0 +1,68 @@ +#include +#include "tsuite.h" +TEST_START(test_label) +{ + Evas_Object *bg, *bx, *lb; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "This is a small label" + ); + evas_object_size_hint_weight_set(lb, 0.0, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "This is a larger label with newlines
" + "to make it bigger, bit it won't expand or wrap
" + "just be a block of text that can't change its
" + "formatting as it's fixed based on text
" + ); + evas_object_size_hint_weight_set(lb, 0.0, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + lb = elm_label_add(win); + elm_label_line_wrap_set(lb, ELM_WRAP_CHAR); + elm_object_text_set(lb, + "" + "This is more text designed to line-wrap here as " + "This object is resized horizontally. As it is " + "resized vertically though, nothing should change. " + "The amount of space allocated vertically should " + "change as horizontal size changes." + "" + ); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "This small label set to wrap" + ); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + evas_object_resize(win, 320, 300); + + evas_object_show(bx); + evas_object_show(win); + elm_win_resize_object_add(win, bx); +} +TEST_END diff --git a/src/bin/test_launcher.c b/src/bin/test_launcher.c new file mode 100644 index 0000000..4705765 --- /dev/null +++ b/src/bin/test_launcher.c @@ -0,0 +1,906 @@ +#include +#include "tsuite.h" + +static void +mode_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + Evas_Object *mb; + Eina_List *mbs, *l; + + mbs = evas_object_data_get(win, "mbs"); + EINA_LIST_FOREACH(mbs, l, mb) + { + if (elm_mapbuf_enabled_get(mb)) + elm_mapbuf_enabled_set(mb, 0); + else + elm_mapbuf_enabled_set(mb, 1); + } +} + +static void +full_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + elm_win_fullscreen_set(win, !elm_win_fullscreen_get(win)); +} + +static void +alpha_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + Evas_Object *mb; + Eina_List *mbs, *l; + + mbs = evas_object_data_get(win, "mbs"); + EINA_LIST_FOREACH(mbs, l, mb) + { + elm_mapbuf_alpha_set(mb, elm_check_state_get(obj)); + } +} + +static void +smooth_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + Evas_Object *mb; + Eina_List *mbs, *l; + + mbs = evas_object_data_get(win, "mbs"); + EINA_LIST_FOREACH(mbs, l, mb) + { + elm_mapbuf_smooth_set(mb, elm_check_state_get(obj)); + } +} + +static void +close_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + evas_object_del(data); +} + +static Eina_Bool +tim_cb(void *data) +{ + Evas_Object *tb, *sc, *mb; + Eina_List *list, *l; + + evas_object_data_del(data, "timer"); + tb = evas_object_data_get(data, "tb"); + sc = evas_object_data_get(data, "sc"); + elm_object_scroll_freeze_push(sc); + evas_object_data_set(data, "dragging", (void *)(long)(1)); + evas_object_color_set(data, 255, 255, 255, 255); + list = (Eina_List *)evas_object_data_get + (elm_object_top_widget_get(data), "mbs"); + EINA_LIST_FOREACH(list, l, mb) + evas_object_color_set(mb, 128, 128, 128, 128); + elm_table_unpack(tb, data); + return EINA_FALSE; +} + +static void +ic_del_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + Ecore_Timer *tim; + + tim = evas_object_data_get(obj, "timer"); + if (tim) + { + evas_object_data_del(obj, "timer"); + ecore_timer_del(tim); + } +} + +static void +ic_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Down *ev = event_info; + Ecore_Timer *tim; + Evas_Coord x, y, w, h; + + evas_object_color_set(data, 128, 0, 0, 128); + + tim = evas_object_data_get(obj, "timer"); + if (tim) evas_object_data_del(obj, "timer"); + tim = ecore_timer_add(1.0, tim_cb, obj); + evas_object_data_set(obj, "timer", tim); + + evas_object_geometry_get(data, &x, &y, &w, &h); + evas_object_data_set(obj, "x", (void *)(long)(ev->canvas.x)); + evas_object_data_set(obj, "y", (void *)(long)(ev->canvas.y)); + evas_object_data_set(obj, "px", (void *)(long)(x)); + evas_object_data_set(obj, "py", (void *)(long)(y)); + + if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK) + { + printf("double click %p\n", obj); + } +} + +static void +ic_up_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Up *ev = event_info; + Ecore_Timer *tim; + + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return; + evas_object_color_set(data, 255, 255, 255, 255); + tim = evas_object_data_get(obj, "timer"); + if (tim) + { + evas_object_data_del(obj, "timer"); + ecore_timer_del(tim); + } + if (evas_object_data_get(obj, "dragging")) + { + Evas_Object *tb, *sc, *mb; + Eina_List *list, *l; + int tbx, tby; + + evas_object_data_del(obj, "dragging"); + tb = evas_object_data_get(obj, "tb"); + sc = evas_object_data_get(obj, "sc"); + elm_object_scroll_freeze_pop(sc); + tbx = (int)(long)evas_object_data_get(obj, "tbx"); + tby = (int)(long)evas_object_data_get(obj, "tby"); + elm_table_pack(tb, obj, tbx, tby, 1, 1); + list = (Eina_List *)evas_object_data_get + (elm_object_top_widget_get(obj), "mbs"); + EINA_LIST_FOREACH(list, l, mb) + evas_object_color_set(mb, 255, 255, 255, 255); + } +} + +static void +ic_move_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Move *ev = event_info; + if (evas_object_data_get(obj, "dragging")) + { + Evas_Coord x, y, px, py; + + x = (Evas_Coord)(long)evas_object_data_get(obj, "x"); + y = (Evas_Coord)(long)evas_object_data_get(obj, "y"); + px = (Evas_Coord)(long)evas_object_data_get(obj, "px"); + py = (Evas_Coord)(long)evas_object_data_get(obj, "py"); + evas_object_move(obj, + px + ev->cur.canvas.x - x, + py + ev->cur.canvas.y - y); + } + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) + { + Ecore_Timer *tim; + + tim = evas_object_data_get(obj, "timer"); + if (tim) + { + evas_object_data_del(obj, "timer"); + ecore_timer_del(tim); + } + evas_object_color_set(data, 255, 255, 255, 255); + return; + } +} + +TEST_START(test_launcher) +{ + Evas_Object *bg, *sc, *tb, *pad, *bt, *ic, *lb, *tb2, *mb, *ck, *bx, *bx2; + int i, j, k, n, m; + char buf[PATH_MAX]; + const char *names[] = + { + "Hello", "World", "Spam", "Egg", + "Ham", "Good", "Bad", "Milk", + "Smell", "Of", "Sky", "Gold", + "Hole", "Pig", "And", "Calm" + }; + Eina_List *mbs = NULL; + + bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/sky_04.jpg", elm_app_data_dir_get()); + elm_bg_file_set(bg, buf, NULL); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + bx = elm_box_add(win); + elm_box_homogeneous_set(bx, EINA_TRUE); + elm_box_horizontal_set(bx, EINA_TRUE); + + sc = elm_scroller_add(win); + elm_scroller_bounce_set(sc, 1, 0); + elm_scroller_policy_set(sc, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL); + + n = 0; m = 0; + for (k = 0 ; k < 8; k++) + { + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, 0.0, 0.0); + evas_object_size_hint_align_set(tb, 0.5, 0.5); + + pad = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_min_set(pad, 470, 4); + evas_object_size_hint_weight_set(pad, 0.0, 0.0); + evas_object_size_hint_align_set(pad, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, pad, 1, 0, 5, 1); + + pad = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_min_set(pad, 470, 4); + evas_object_size_hint_weight_set(pad, 0.0, 0.0); + evas_object_size_hint_align_set(pad, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, pad, 1, 11, 5, 1); + + pad = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_min_set(pad, 4, 4); + evas_object_size_hint_weight_set(pad, 0.0, 0.0); + evas_object_size_hint_align_set(pad, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, pad, 0, 1, 1, 10); + + pad = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_min_set(pad, 4, 4); + evas_object_size_hint_weight_set(pad, 0.0, 0.0); + evas_object_size_hint_align_set(pad, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, pad, 6, 1, 1, 10); + + mb = elm_mapbuf_add(win); + elm_object_content_set(mb, tb); + evas_object_show(tb); + + for (j = 0; j < 5; j++) + { + for (i = 0; i < 5; i++) + { + ic = elm_icon_add(win); + elm_object_scale_set(ic, 0.5); + snprintf(buf, sizeof(buf), "%s/images/icon_%02i.png", elm_app_data_dir_get(), n); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ic, 0.5, 0.5); + elm_table_pack(tb, ic, 1 + i, 1 + (j * 2), 1, 1); + evas_object_show(ic); + + lb = elm_label_add(win); + elm_object_style_set(lb, "marker"); + elm_object_text_set(lb, names[m]); + evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(lb, 0.5, 0.5); + elm_table_pack(tb, lb, 1 + i, 1 + (j * 2) + 1, 1, 1); + evas_object_show(lb); + + evas_object_event_callback_add(ic, EVAS_CALLBACK_DEL, ic_del_cb, ic); + + evas_object_event_callback_add(ic, EVAS_CALLBACK_MOUSE_DOWN, ic_down_cb, ic); + evas_object_event_callback_add(ic, EVAS_CALLBACK_MOUSE_UP, ic_up_cb, ic); + evas_object_event_callback_add(ic, EVAS_CALLBACK_MOUSE_MOVE, ic_move_cb, ic); + + evas_object_data_set(ic, "lb", lb); + evas_object_data_set(ic, "tb", tb); + evas_object_data_set(ic, "sc", sc); + evas_object_data_set(ic, "bx", bx); + evas_object_data_set(ic, "mb", mb); + evas_object_data_set(ic, "tbx", (void *)(long)(1 + i)); + evas_object_data_set(ic, "tby", (void *)(long)(1 + (j * 2))); + + n++; if (n > 23) n = 0; + m++; if (m > 15) m = 0; + } + } + + elm_box_pack_end(bx, mb); + evas_object_show(mb); + + mbs = eina_list_append(mbs, mb); + } + + // fixme: free mbs + evas_object_data_set(win, "mbs", mbs); + + bx2 = elm_box_add(win); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_horizontal_set(bx2, EINA_FALSE); + elm_win_resize_object_add(win, bx2); + evas_object_show(bx2); + + elm_object_content_set(sc, bx); + evas_object_show(bx); + + elm_scroller_page_relative_set(sc, 1.0, 1.0); + evas_object_show(sc); + + tb2 = elm_table_add(win); + evas_object_size_hint_weight_set(tb2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(tb2, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx2, tb2); + + elm_box_pack_end(bx2, sc); + + ck = elm_check_add(win); + elm_object_text_set(ck, "Map"); + elm_check_state_set(ck, 0); + evas_object_smart_callback_add(ck, "changed", mode_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.05, 0.99); + elm_table_pack(tb2, ck, 0, 0, 1, 1); + evas_object_show(ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "A"); + elm_check_state_set(ck, 1); + evas_object_smart_callback_add(ck, "changed", alpha_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.20, 0.99); + elm_table_pack(tb2, ck, 1, 0, 1, 1); + evas_object_show(ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "Smo"); + elm_check_state_set(ck, 1); + evas_object_smart_callback_add(ck, "changed", smooth_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.40, 0.99); + elm_table_pack(tb2, ck, 2, 0, 1, 1); + evas_object_show(ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "FS"); + elm_check_state_set(ck, 0); + evas_object_smart_callback_add(ck, "changed", full_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.5, 0.99); + elm_table_pack(tb2, ck, 3, 0, 1, 1); + evas_object_show(ck); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", close_cb, win); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.95, 0.99); + elm_table_pack(tb2, bt, 4, 0, 1, 1); + evas_object_show(bt); + + evas_object_show(tb2); + + evas_object_resize(win, 480, 800); + evas_object_show(win); +} +TEST_END + +TEST_START(test_launcher2) +{ + Evas_Object *bg, *sc, *bt, *tb2, *mb, *ck, *bx, *ly; + int k; + char buf[PATH_MAX]; + Eina_List *mbs = NULL; + + bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/sky_03.jpg", elm_app_data_dir_get()); + elm_bg_file_set(bg, buf, NULL); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + bx = elm_box_add(win); + elm_box_homogeneous_set(bx, EINA_TRUE); + elm_box_horizontal_set(bx, EINA_TRUE); + + for (k = 0 ; k < 8; k++) + { + ly = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "layout"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 1"); + elm_object_part_content_set(ly, "element1", bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 2"); + elm_object_part_content_set(ly, "element2", bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 3"); + elm_object_part_content_set(ly, "element3", bt); + evas_object_show(bt); + + mb = elm_mapbuf_add(win); + elm_object_content_set(mb, ly); + evas_object_show(ly); + + elm_box_pack_end(bx, mb); + evas_object_show(mb); + + mbs = eina_list_append(mbs, mb); + } + + // fixme: free mbs + evas_object_data_set(win, "mbs", mbs); + + sc = elm_scroller_add(win); + elm_scroller_bounce_set(sc, 1, 0); + elm_scroller_policy_set(sc, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, sc); + + elm_object_content_set(sc, bx); + evas_object_show(bx); + + elm_scroller_page_relative_set(sc, 1.0, 1.0); + evas_object_show(sc); + + tb2 = elm_table_add(win); + evas_object_size_hint_weight_set(tb2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, tb2); + + ck = elm_check_add(win); + elm_object_text_set(ck, "Map"); + elm_check_state_set(ck, 0); + evas_object_smart_callback_add(ck, "changed", mode_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.05, 0.99); + elm_table_pack(tb2, ck, 0, 0, 1, 1); + evas_object_show(ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "A"); + elm_check_state_set(ck, 1); + evas_object_smart_callback_add(ck, "changed", alpha_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.20, 0.99); + elm_table_pack(tb2, ck, 1, 0, 1, 1); + evas_object_show(ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "Smo"); + elm_check_state_set(ck, 1); + evas_object_smart_callback_add(ck, "changed", smooth_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.40, 0.99); + elm_table_pack(tb2, ck, 2, 0, 1, 1); + evas_object_show(ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "FS"); + elm_check_state_set(ck, 0); + evas_object_smart_callback_add(ck, "changed", full_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.5, 0.99); + elm_table_pack(tb2, ck, 3, 0, 1, 1); + evas_object_show(ck); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", close_cb, win); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.95, 0.99); + elm_table_pack(tb2, bt, 4, 0, 1, 1); + evas_object_show(bt); + + evas_object_show(tb2); + + evas_object_resize(win, 480, 800); + evas_object_show(win); +} +TEST_END + +static void +l3_mode_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + Evas_Object *mb; + Eina_List *mbs, *l; + + mbs = evas_object_data_get(win, "mbs"); + EINA_LIST_FOREACH(mbs, l, mb) + { + if (elm_mapbuf_enabled_get(mb)) + elm_mapbuf_enabled_set(mb, 0); + else + elm_mapbuf_enabled_set(mb, 1); + } +} + +static void +l3_full_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + elm_win_fullscreen_set(win, !elm_win_fullscreen_get(win)); +} + +static void +l3_alpha_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + Evas_Object *mb; + Eina_List *mbs, *l; + + mbs = evas_object_data_get(win, "mbs"); + EINA_LIST_FOREACH(mbs, l, mb) + { + elm_mapbuf_alpha_set(mb, elm_check_state_get(obj)); + } +} + +static void +l3_smooth_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + Evas_Object *mb; + Eina_List *mbs, *l; + + mbs = evas_object_data_get(win, "mbs"); + EINA_LIST_FOREACH(mbs, l, mb) + { + elm_mapbuf_smooth_set(mb, elm_check_state_get(obj)); + } +} + +static void +l3_hidden_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + Evas_Object *mb; + Eina_List *mbs, *l; + + mbs = evas_object_data_get(win, "mbs"); + EINA_LIST_FOREACH(mbs, l, mb) + { + if (evas_object_visible_get(mb)) evas_object_hide(mb); + else evas_object_show(mb); + } +} + +static void +l3_close_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + evas_object_del(data); +} + +static Eina_Bool +l3_tim_cb(void *data) +{ + Evas_Object *ly, *ly2, *sc, *mb; + Eina_List *list, *l; + char buf[256]; + int slx, sly; + + evas_object_data_del(data, "timer"); + ly = evas_object_data_get(data, "ly"); + ly2 = evas_object_data_get(data, "ly2"); + sc = evas_object_data_get(data, "sc"); + elm_object_scroll_freeze_push(sc); + evas_object_data_set(data, "dragging", (void *)(long)1); + evas_object_color_set(data, 255, 255, 255, 255); + list = (Eina_List *)evas_object_data_get + (elm_object_top_widget_get(data), "mbs"); + EINA_LIST_FOREACH(list, l, mb) + evas_object_color_set(mb, 128, 128, 128, 128); + slx = (int)(long)evas_object_data_get(data, "slx"); + sly = (int)(long)evas_object_data_get(data, "sly"); + snprintf(buf, sizeof(buf), "slot.%i.%i", slx, sly); + elm_object_content_part_unset(ly, buf); + edje_object_signal_emit(elm_layout_edje_get(ly2), "drag", "app"); + return EINA_FALSE; +} + +static void +l3_ic_del_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + Ecore_Timer *tim; + + tim = evas_object_data_get(obj, "timer"); + if (tim) + { + evas_object_data_del(obj, "timer"); + ecore_timer_del(tim); + } +} + +static void +l3_ic_down_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Down *ev = event_info; + Ecore_Timer *tim; + Evas_Coord x, y, w, h; + Evas_Object *ly2; + + tim = evas_object_data_get(obj, "timer"); + if (tim) evas_object_data_del(obj, "timer"); + tim = ecore_timer_add(1.0, l3_tim_cb, obj); + evas_object_data_set(obj, "timer", tim); + + ly2 = evas_object_data_get(obj, "ly2"); + evas_object_geometry_get(ly2, &x, &y, &w, &h); + evas_object_data_set(obj, "x", (void *)(long)(ev->canvas.x)); + evas_object_data_set(obj, "y", (void *)(long)(ev->canvas.y)); + evas_object_data_set(obj, "px", (void *)(long)(x)); + evas_object_data_set(obj, "py", (void *)(long)(y)); + + edje_object_signal_emit(elm_layout_edje_get(ly2), "click", "app"); + + if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK) + { + printf("double click %p\n", obj); + } +} + +static void +l3_ic_up_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Up *ev = event_info; + Ecore_Timer *tim; + Evas_Object *ly2; + + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return; + + ly2 = evas_object_data_get(obj, "ly2"); + tim = evas_object_data_get(obj, "timer"); + if (tim) + { + evas_object_data_del(obj, "timer"); + ecore_timer_del(tim); + } + if (evas_object_data_get(obj, "dragging")) + { + Evas_Object *ly, *sc, *mb; + Eina_List *list, *l; + int slx, sly; + char buf[256]; + + evas_object_data_del(obj, "dragging"); + ly = evas_object_data_get(obj, "ly"); + sc = evas_object_data_get(obj, "sc"); + elm_object_scroll_freeze_pop(sc); + slx = (int)(long)evas_object_data_get(obj, "slx"); + sly = (int)(long)evas_object_data_get(obj, "sly"); + snprintf(buf, sizeof(buf), "slot.%i.%i", slx, sly); + elm_object_part_content_set(ly, buf, ly2); + list = (Eina_List *)evas_object_data_get + (elm_object_top_widget_get(obj), "mbs"); + EINA_LIST_FOREACH(list, l, mb) + evas_object_color_set(mb, 255, 255, 255, 255); + edje_object_signal_emit(elm_layout_edje_get(ly2), "drop", "app"); + } + else + edje_object_signal_emit(elm_layout_edje_get(ly2), "unclick", "app"); +} + +static void +l3_ic_move_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Move *ev = event_info; + Evas_Object *ly2; + + ly2 = evas_object_data_get(obj, "ly2"); + + if (evas_object_data_get(obj, "dragging")) + { + Evas_Coord x, y, px, py; + + x = (Evas_Coord)(long)evas_object_data_get(obj, "x"); + y = (Evas_Coord)(long)evas_object_data_get(obj, "y"); + px = (Evas_Coord)(long)evas_object_data_get(obj, "px"); + py = (Evas_Coord)(long)evas_object_data_get(obj, "py"); + evas_object_move(ly2, + px + ev->cur.canvas.x - x, + py + ev->cur.canvas.y - y); + } + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) + { + Ecore_Timer *tim; + + tim = evas_object_data_get(obj, "timer"); + if (tim) + { + evas_object_data_del(obj, "timer"); + ecore_timer_del(tim); + } + edje_object_signal_emit(elm_layout_edje_get(ly2), "cancel", "app"); + return; + } +} + +TEST_START(test_launcher3) +{ + Evas_Object *bg, *sc, *tb, *pad, *bt, *ic, *tb2, *mb, *ck, *bx, *bx2, *ly, *ly2; + int i, j, k, n, m; + char buf[PATH_MAX]; + const char *names[] = + { + "Hello", "World", "Spam", "Egg", + "Ham", "Good", "Bad", "Milk", + "Smell", "Of", "Sky", "Gold", + "Hole", "Pig", "And", "Calm" + }; + Eina_List *mbs = NULL; + + bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/sky_04.jpg", elm_app_data_dir_get()); + elm_bg_file_set(bg, buf, NULL); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_homogeneous_set(bx, EINA_TRUE); + elm_box_horizontal_set(bx, EINA_TRUE); + + sc = elm_scroller_add(win); + elm_scroller_bounce_set(sc, 1, 0); + elm_scroller_policy_set(sc, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL); + + n = 0; m = 0; + for (k = 0 ; k < 8; k++) + { + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + pad = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_min_set(pad, 450, 10); + elm_table_pack(tb, pad, 1, 0, 1, 1); + + pad = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_min_set(pad, 450, 10); + elm_table_pack(tb, pad, 1, 2, 1, 1); + + pad = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_min_set(pad, 10, 450); + elm_table_pack(tb, pad, 0, 1, 1, 1); + + pad = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_min_set(pad, 10, 450); + elm_table_pack(tb, pad, 2, 1, 1, 1); + + mb = elm_mapbuf_add(win); + mbs = eina_list_append(mbs, mb); + + elm_object_content_set(mb, tb); + evas_object_show(tb); + elm_box_pack_end(bx, mb); + evas_object_show(mb); + + ly = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "launcher_page"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, ly, 1, 1, 1, 1); + evas_object_show(ly); + + for (j = 0; j < 4; j++) + { + for (i = 0; i < 4; i++) + { + ly2 = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly2, buf, "launcher_icon"); + evas_object_size_hint_weight_set(ly2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly2, EVAS_HINT_FILL, EVAS_HINT_FILL); + edje_object_part_text_set(elm_layout_edje_get(ly2), "label", names[m]); + + ic = elm_icon_add(win); + elm_object_scale_set(ic, 0.5); + snprintf(buf, sizeof(buf), "%s/images/icon_%02i.png", elm_app_data_dir_get(), n); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ic, 0.5, 0.5); + elm_object_part_content_set(ly2, "slot", ic); + evas_object_show(ic); + + evas_object_event_callback_add(ic, EVAS_CALLBACK_DEL, l3_ic_del_cb, ic); + + evas_object_event_callback_add(ic, EVAS_CALLBACK_MOUSE_DOWN, l3_ic_down_cb, ic); + evas_object_event_callback_add(ic, EVAS_CALLBACK_MOUSE_UP, l3_ic_up_cb, ic); + evas_object_event_callback_add(ic, EVAS_CALLBACK_MOUSE_MOVE, l3_ic_move_cb, ic); + + evas_object_data_set(ic, "ly", ly); + evas_object_data_set(ic, "ly2", ly2); + evas_object_data_set(ic, "sc", sc); + evas_object_data_set(ic, "bx", bx); + evas_object_data_set(ic, "mb", mb); + evas_object_data_set(ic, "slx", (void *)(long)(i)); + evas_object_data_set(ic, "sly", (void *)(long)(j)); + + snprintf(buf, sizeof(buf), "slot.%i.%i", i, j); + elm_object_part_content_set(ly, buf, ly2); + evas_object_show(ly2); + + n++; if (n > 23) n = 0; + m++; if (m > 15) m = 0; + } + } + } + + // fixme: free mbs + evas_object_data_set(win, "mbs", mbs); + + bx2 = elm_box_add(win); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_horizontal_set(bx2, EINA_FALSE); + elm_win_resize_object_add(win, bx2); + evas_object_show(bx2); + + elm_object_content_set(sc, bx); + evas_object_show(bx); + + elm_scroller_page_relative_set(sc, 1.0, 1.0); + evas_object_show(sc); + + tb2 = elm_table_add(win); + evas_object_size_hint_weight_set(tb2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(tb2, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx2, tb2); + + elm_box_pack_end(bx2, sc); + + ck = elm_check_add(win); + elm_object_text_set(ck, "Map"); + elm_check_state_set(ck, 0); + evas_object_smart_callback_add(ck, "changed", l3_mode_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.05, 0.99); + elm_table_pack(tb2, ck, 0, 0, 1, 1); + evas_object_show(ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "A"); + elm_check_state_set(ck, 1); + evas_object_smart_callback_add(ck, "changed", l3_alpha_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.20, 0.99); + elm_table_pack(tb2, ck, 1, 0, 1, 1); + evas_object_show(ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "Smo"); + elm_check_state_set(ck, 1); + evas_object_smart_callback_add(ck, "changed", l3_smooth_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.40, 0.99); + elm_table_pack(tb2, ck, 2, 0, 1, 1); + evas_object_show(ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "FS"); + elm_check_state_set(ck, 0); + evas_object_smart_callback_add(ck, "changed", l3_full_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.5, 0.99); + elm_table_pack(tb2, ck, 3, 0, 1, 1); + evas_object_show(ck); + + ck = elm_check_add(win); + elm_object_text_set(ck, "Hid"); + elm_check_state_set(ck, 0); + evas_object_smart_callback_add(ck, "changed", l3_hidden_cb, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.5, 0.99); + elm_table_pack(tb2, ck, 4, 0, 1, 1); + evas_object_show(ck); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", l3_close_cb, win); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.95, 0.99); + elm_table_pack(tb2, bt, 5, 0, 1, 1); + evas_object_show(bt); + + evas_object_show(tb2); + + evas_object_resize(win, 480, 800); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_layout.c b/src/bin/test_layout.c new file mode 100644 index 0000000..e731a24 --- /dev/null +++ b/src/bin/test_layout.c @@ -0,0 +1,74 @@ +#include +#include +#include "tsuite.h" +static void +_clicked_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + elm_object_part_text_set(data, "text", elm_object_text_get(obj)); +} + +TEST_START(test_layout) +{ + Evas_Object *bg, *box, *ly, *bt; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + box = elm_box_add(win); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_win_resize_object_add(win, box); + evas_object_show(box); + + ly = elm_layout_add(win); + elm_layout_theme_set(ly, "layout", "application", "titlebar"); + elm_object_text_set(ly, "Some title"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(box, ly); + evas_object_show(ly); + + bt = elm_icon_add(win); + elm_icon_standard_set(bt, "chat"); + evas_object_size_hint_min_set(bt, 20, 20); + elm_layout_icon_set(ly, bt); + + bt = elm_icon_add(win); + elm_icon_standard_set(bt, "close"); + evas_object_size_hint_min_set(bt, 20, 20); + elm_layout_end_set(ly, bt); + + ly = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "layout"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(box, ly); + //elm_win_resize_object_add(win, ly); + evas_object_show(ly); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 1"); + elm_object_part_content_set(ly, "element1", bt); + evas_object_smart_callback_add(bt, "clicked", _clicked_cb, ly); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 2"); + elm_object_part_content_set(ly, "element2", bt); + evas_object_smart_callback_add(bt, "clicked", _clicked_cb, ly); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 3"); + elm_object_part_content_set(ly, "element3", bt); + evas_object_smart_callback_add(bt, "clicked", _clicked_cb, ly); + evas_object_show(bt); + + elm_layout_part_cursor_set(ly, "text", ELM_CURSOR_WATCH); + + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_list.c b/src/bin/test_list.c new file mode 100644 index 0000000..918cd89 --- /dev/null +++ b/src/bin/test_list.c @@ -0,0 +1,1000 @@ +#include +#include +#include "tsuite.h" +static void +my_show_it(void *data, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + elm_list_item_show(data); +} + +static void +scroll_top(void *data __UNUSED__, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + printf("Top edge!\n"); +} + +static void +scroll_bottom(void *data __UNUSED__, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + printf("Bottom edge!\n"); +} + +static void +scroll_left(void *data __UNUSED__, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + printf("Left edge!\n"); +} + +static void +scroll_right(void *data __UNUSED__, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + printf("Right edge!\n"); +} + +enum _api_state +{ + ITEM_PREPEND, /* 0 */ + ITEM_INSERT_BEFORE, /* 1 */ + ITEM_INSERT_AFTER, /* 2 */ + ITEM_SEPARATOR_SET, /* 3 */ + LIST_ITEM_DEL, /* 4 */ + SCROLLER_POLICY_SET_ON, + SCROLLER_POLICY_SET_OFF, /* Back to AUTO next */ + TOOLTIP_TEXT_SET, /* 7 */ + TOOLTIP_UNSET, /* 8 */ + ITEM_CURSOR_SET, /* 9 */ + ITEM_CURSOR_STYLE_SET, + DISABLED_SET, /* 11 */ + MODE_SET_COMPRESS, /* 12 */ + MODE_SET_LIMIT, /* 13 */ + MODE_SET_EXPAND, /* 14 */ + HORIZONTAL_SET, /* 15 */ + BOUNCE_SET, /* 16 */ + LIST_CLEAR, /* 17 */ + API_STATE_LAST +}; +typedef enum _api_state api_state; + +static void +set_api_state(api_data *api) +{ +/** HOW TO TEST ************************ +0 ITEM PREPEND +Scroll to end +1 INSERT BEFORE +Scroll to end +2 INSERT AFTER +3 INSERT SEPERATOR +Scroll to end +4 ITEM DEL +5 POLICY ON, BOUNCE_SET(TRUE, TRUE) +6 POLICY OFF +Scroll to end +7 TOOLTIP last-item +8 Cancel tootip +9 Curosr set on last item +10 Cursor style set last item +11 DISABLE last item +12 MODE COMPRESS +13 MODE LIMIT +14 MODE EXPAND +15 HORIZ SET +16 VERT MODE, BOUNCE(TRUE, FALSE) try to bounce on Y-axis +17 List clear +*** HOW TO TEST ***********************/ + Evas_Object *li = api->data; + + switch(api->state) + { /* Put all api-changes under switch */ + case ITEM_PREPEND: /* 0 */ + { + const Eina_List *items = elm_list_items_get(li); + elm_list_item_prepend(li, "PREPEND", NULL, NULL, NULL, NULL); + elm_list_go(li); + elm_list_item_bring_in(eina_list_nth(items, 0)); + } + break; + + case ITEM_INSERT_BEFORE: /* 1 */ + { + const Eina_List *items = elm_list_items_get(li); + if(eina_list_count(items)) + { + elm_list_item_insert_before(li, + eina_list_nth(items, eina_list_count(items)-1), + "1-before-last", NULL, NULL, NULL, NULL); + elm_list_go(li); + elm_list_item_bring_in(eina_list_data_get(eina_list_last(items))); + } + } + break; + + case ITEM_INSERT_AFTER: /* 2 */ + { + const Eina_List *items = elm_list_items_get(li); + if(eina_list_count(items)) + { + elm_list_item_insert_after(li, + eina_list_nth(items, eina_list_count(items)-2), + "insert-after", NULL, NULL, NULL, NULL); + elm_list_go(li); + elm_list_item_bring_in(eina_list_data_get(eina_list_last(items))); + } + } + break; + + case ITEM_SEPARATOR_SET: /* 3 */ + { + const Eina_List *items = elm_list_items_get(li); + if(eina_list_count(items)) + { + elm_list_item_separator_set(eina_list_nth(items, eina_list_count(items)/2), EINA_TRUE); + elm_list_item_bring_in(eina_list_nth(items, eina_list_count(items)/2)); + elm_list_go(li); + } + } + break; + + case LIST_ITEM_DEL: /* 4 */ + { + const Eina_List *items = elm_list_items_get(li); + if(eina_list_count(items)) + { + elm_list_item_del(eina_list_data_get(eina_list_last(items))); + } + } + break; + + case SCROLLER_POLICY_SET_ON: /* 5 */ + elm_list_bounce_set(li, EINA_TRUE, EINA_TRUE); + elm_list_scroller_policy_set(li, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON); + break; + + case SCROLLER_POLICY_SET_OFF: /* Back to AUTO next (6) */ + elm_list_scroller_policy_set(li, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + break; + + case TOOLTIP_TEXT_SET: /* 7 */ + { + const Eina_List *items = elm_list_items_get(li); + if(eina_list_count(items)) + { + elm_list_item_tooltip_text_set(eina_list_data_get(eina_list_last(items)), "Tooltip set from API"); + } + elm_list_scroller_policy_set(li, ELM_SCROLLER_POLICY_AUTO, ELM_SCROLLER_POLICY_AUTO); + } + break; + + case TOOLTIP_UNSET: /* 8 */ + { + const Eina_List *items = elm_list_items_get(li); + if(eina_list_count(items)) + { + elm_list_item_tooltip_unset(eina_list_data_get(eina_list_last(items))); + } + } + break; + + case ITEM_CURSOR_SET: /* 9 */ + { + const Eina_List *items = elm_list_items_get(li); + if(eina_list_count(items)) + { + elm_list_item_cursor_set(eina_list_data_get(eina_list_last(items)), ELM_CURSOR_HAND2); + } + } + break; + + case ITEM_CURSOR_STYLE_SET: /* 10 */ + { + const Eina_List *items = elm_list_items_get(li); + if(eina_list_count(items)) + { + elm_list_item_cursor_style_set(eina_list_data_get(eina_list_last(items)), "transparent"); + } + } + break; + + case DISABLED_SET: /* 11 */ + { + const Eina_List *items = elm_list_items_get(li); + if(eina_list_count(items)) + { + elm_list_item_disabled_set(eina_list_data_get(eina_list_last(items)), EINA_TRUE); + } + } + break; + + case MODE_SET_COMPRESS: /* 12 */ + elm_list_mode_set(li, ELM_LIST_COMPRESS); + break; + + case MODE_SET_LIMIT: /* 13 */ + elm_list_mode_set(li, ELM_LIST_LIMIT); + break; + + case MODE_SET_EXPAND: /* 14 */ + elm_list_mode_set(li, ELM_LIST_EXPAND); + break; + + case HORIZONTAL_SET: /* 15 */ + elm_list_mode_set(li, ELM_LIST_SCROLL); /* return to default mode */ + elm_list_horizontal_set(li, EINA_TRUE); + break; + + case BOUNCE_SET: /* 16 */ + elm_list_horizontal_set(li, EINA_FALSE); + elm_list_bounce_set(li, EINA_TRUE, EINA_FALSE); + break; + + case LIST_CLEAR: /* 17 */ + elm_list_clear(li); + break; + + case API_STATE_LAST: + break; + + default: + return; + } +} + +static void +_api_bt_clicked(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ /* Will add here a SWITCH command containing code to modify test-object */ + /* in accordance a->state value. */ + api_data *a = data; + char str[128]; + + printf("clicked event on API Button: api_state=<%d>\n", a->state); + set_api_state(a); + a->state++; + sprintf(str, "Next API function (%u)", a->state); + elm_object_text_set(a->bt, str); + elm_object_disabled_set(a->bt, a->state == API_STATE_LAST); +} + +TEST_START(test_list) +{ + Evas_Object *bg, *li, *ic, *ic2, *bx, *bxx, *tb2, *bt; + char buf[PATH_MAX]; + Elm_List_Item *it1, *it2, *it3, *it4, *it5; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bxx = elm_box_add(win); + elm_win_resize_object_add(win, bxx); + evas_object_size_hint_weight_set(bxx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bxx); + + li = elm_list_add(win); + elm_list_mode_set(li, ELM_LIST_LIMIT); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL); + api->data = li; + + api->bt = elm_button_add(win); + elm_object_text_set(api->bt, "Next API function"); + evas_object_smart_callback_add(api->bt, "clicked", _api_bt_clicked, (void *) api); + elm_box_pack_end(bxx, api->bt); + elm_object_disabled_set(api->bt, api->state == API_STATE_LAST); + evas_object_show(api->bt); + + elm_box_pack_end(bxx, li); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 1, 1); + it1 = elm_list_item_append(li, "Hello", ic, NULL, NULL, NULL); + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_scale_set(ic, 0, 0); + elm_icon_file_set(ic, buf, NULL); + elm_list_item_append(li, "world", ic, NULL, NULL, NULL); + ic = elm_icon_add(win); + elm_icon_standard_set(ic, "edit"); + elm_icon_scale_set(ic, 0, 0); + elm_list_item_append(li, ".", ic, NULL, NULL, NULL); + + ic = elm_icon_add(win); + elm_icon_standard_set(ic, "delete"); + elm_icon_scale_set(ic, 0, 0); + ic2 = elm_icon_add(win); + elm_icon_standard_set(ic2, "clock"); + elm_icon_scale_set(ic2, 0, 0); + it2 = elm_list_item_append(li, "How", ic, ic2, NULL, NULL); + + bx = elm_box_add(win); + elm_box_horizontal_set(bx, EINA_TRUE); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_align_set(ic, 0.5, 0.5); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_align_set(ic, 0.5, 0.0); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_align_set(ic, 0.0, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + elm_list_item_append(li, "are", bx, NULL, NULL, NULL); + + elm_list_item_append(li, "you", NULL, NULL, NULL, NULL); + it3 = elm_list_item_append(li, "doing", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "out", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "there", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "today", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "?", NULL, NULL, NULL, NULL); + it4 = elm_list_item_append(li, "Here", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "are", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "some", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "more", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "items", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Is this label long enough?", NULL, NULL, NULL, NULL); + it5 = elm_list_item_append(li, "Maybe this one is even longer so we can test long long items.", NULL, NULL, NULL, NULL); + + elm_list_go(li); + + evas_object_show(li); + + tb2 = elm_table_add(win); + evas_object_size_hint_weight_set(tb2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, tb2); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Hello"); + evas_object_smart_callback_add(bt, "clicked", my_show_it, it1); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.9, 0.5); + elm_table_pack(tb2, bt, 0, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "How"); + evas_object_smart_callback_add(bt, "clicked", my_show_it, it2); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.9, 0.5); + elm_table_pack(tb2, bt, 0, 1, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "doing"); + evas_object_smart_callback_add(bt, "clicked", my_show_it, it3); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.9, 0.5); + elm_table_pack(tb2, bt, 0, 2, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Here"); + evas_object_smart_callback_add(bt, "clicked", my_show_it, it4); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.9, 0.5); + elm_table_pack(tb2, bt, 0, 3, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Maybe this..."); + evas_object_smart_callback_add(bt, "clicked", my_show_it, it5); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.9, 0.5); + elm_table_pack(tb2, bt, 0, 4, 1, 1); + evas_object_show(bt); + + evas_object_show(tb2); + + evas_object_resize(win, 320, 300); + evas_object_show(win); + + evas_object_smart_callback_add(li, "scroll,edge,top", scroll_top, NULL); + evas_object_smart_callback_add(li, "scroll,edge,bottom", scroll_bottom, NULL); + evas_object_smart_callback_add(li, "scroll,edge,left", scroll_left, NULL); + evas_object_smart_callback_add(li, "scroll,edge,right", scroll_right, NULL); +} +TEST_END + +TEST_START(test_list_horizontal) +{ + Evas_Object *bg, *li, *ic, *ic2, *bx, *tb2, *bt; + char buf[PATH_MAX]; + Elm_List_Item *it1, *it2, *it3, *it4; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + li = elm_list_add(win); + elm_list_horizontal_set(li, EINA_TRUE); + elm_list_mode_set(li, ELM_LIST_LIMIT); + elm_win_resize_object_add(win, li); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 1, 1); + it1 = elm_list_item_append(li, "Hello", ic, NULL, NULL, NULL); + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_scale_set(ic, 0, 0); + elm_icon_file_set(ic, buf, NULL); + elm_list_item_append(li, "world", ic, NULL, NULL, NULL); + ic = elm_icon_add(win); + elm_icon_standard_set(ic, "edit"); + elm_icon_scale_set(ic, 0, 0); + elm_list_item_append(li, ".", ic, NULL, NULL, NULL); + + ic = elm_icon_add(win); + elm_icon_standard_set(ic, "delete"); + elm_icon_scale_set(ic, 0, 0); + ic2 = elm_icon_add(win); + elm_icon_standard_set(ic2, "clock"); + elm_icon_scale_set(ic2, 0, 0); + it2 = elm_list_item_append(li, "How", ic, ic2, NULL, NULL); + + bx = elm_box_add(win); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_align_set(ic, 0.5, 0.5); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_align_set(ic, 0.5, 0.0); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + elm_list_item_append(li, "are", bx, NULL, NULL, NULL); + + elm_list_item_append(li, "you", NULL, NULL, NULL, NULL); + it3 = elm_list_item_append(li, "doing", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "out", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "there", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "today", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "?", NULL, NULL, NULL, NULL); + + it4 = elm_list_item_append(li, "And", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "here", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "we", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "are", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "done", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "with", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "items.", NULL, NULL, NULL, NULL); + + elm_list_go(li); + + evas_object_show(li); + + tb2 = elm_table_add(win); + evas_object_size_hint_weight_set(tb2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, tb2); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Hello"); + evas_object_smart_callback_add(bt, "clicked", my_show_it, it1); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.5, 0.9); + elm_table_pack(tb2, bt, 0, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "How"); + evas_object_smart_callback_add(bt, "clicked", my_show_it, it2); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.5, 0.9); + elm_table_pack(tb2, bt, 1, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "doing"); + evas_object_smart_callback_add(bt, "clicked", my_show_it, it3); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.5, 0.9); + elm_table_pack(tb2, bt, 2, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "And"); + evas_object_smart_callback_add(bt, "clicked", my_show_it, it4); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.5, 0.9); + elm_table_pack(tb2, bt, 3, 0, 1, 1); + evas_object_show(bt); + + evas_object_show(tb2); + + evas_object_resize(win, 320, 300); + evas_object_show(win); +} +TEST_END + +/***********/ + +static void +my_li2_clear(void *data, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + elm_list_clear(data); +} + +static void +my_li2_sel(void *data __UNUSED__, + Evas_Object *obj, + void *event_info __UNUSED__) +{ + Elm_List_Item *it = elm_list_selected_item_get(obj); + elm_list_item_selected_set(it, 0); +// elm_list_item_selected_set(event_info, 0); +} + +TEST_START(test_list2) +{ + Evas_Object *bg, *li, *ic, *ic2, *bx, *bx2, *bt; + char buf[PATH_MAX]; + Elm_List_Item *it; + + bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_bg_file_set(bg, buf, NULL); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + li = elm_list_add(win); + evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_list_mode_set(li, ELM_LIST_LIMIT); +// elm_list_multi_select_set(li, 1); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + it = elm_list_item_append(li, "Hello", ic, NULL, my_li2_sel, NULL); + elm_list_item_selected_set(it, 1); + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_scale_set(ic, 0, 0); + elm_icon_file_set(ic, buf, NULL); + elm_list_item_append(li, "world", ic, NULL, NULL, NULL); + ic = elm_icon_add(win); + elm_icon_standard_set(ic, "edit"); + elm_icon_scale_set(ic, 0, 0); + elm_list_item_append(li, ".", ic, NULL, NULL, NULL); + + ic = elm_icon_add(win); + elm_icon_standard_set(ic, "delete"); + elm_icon_scale_set(ic, 0, 0); + ic2 = elm_icon_add(win); + elm_icon_standard_set(ic2, "clock"); + elm_icon_scale_set(ic2, 0, 0); + elm_list_item_append(li, "How", ic, ic2, NULL, NULL); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_align_set(ic, 0.5, 0.5); + elm_box_pack_end(bx2, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_align_set(ic, 0.5, 0.0); + elm_box_pack_end(bx2, ic); + evas_object_show(ic); + elm_list_item_append(li, "are", bx2, NULL, NULL, NULL); + + elm_list_item_append(li, "you", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "doing", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "out", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "there", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "today", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "?", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Here", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "are", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "some", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "more", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "items", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Longer label.", NULL, NULL, NULL, NULL); + + elm_list_go(li); + + elm_box_pack_end(bx, li); + evas_object_show(li); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Clear"); + evas_object_smart_callback_add(bt, "clicked", my_li2_clear, li); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 320, 300); + evas_object_show(win); +} +TEST_END + +/***********/ + +static void +_bt_clicked(void *data __UNUSED__, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + printf("button was clicked\n"); +} + +static void +_it_clicked(void *data __UNUSED__, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + printf("item was clicked\n"); +} + +TEST_START(test_list3) +{ + Evas_Object *bg, *li, *ic, *ic2, *bx; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + li = elm_list_add(win); + elm_win_resize_object_add(win, li); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_list_mode_set(li, ELM_LIST_COMPRESS); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_scale_set(ic, 0, 0); + elm_icon_file_set(ic, buf, NULL); + ic2 = elm_button_add(win); + elm_object_text_set(ic2, "Click me"); + evas_object_smart_callback_add(ic2, "clicked", _bt_clicked, NULL); + evas_object_propagate_events_set(ic2, 0); + elm_list_item_append(li, "Hello", ic, ic2, _it_clicked, NULL); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_scale_set(ic, 0, 0); + elm_icon_file_set(ic, buf, NULL); + ic2 = elm_button_add(win); + elm_object_text_set(ic2, "Click me"); + evas_object_smart_callback_add(ic2, "clicked", _bt_clicked, NULL); + elm_list_item_append(li, "world", ic, ic2, _it_clicked, NULL); + + ic = elm_icon_add(win); + elm_icon_standard_set(ic, "edit"); + elm_icon_scale_set(ic, 0, 0); + elm_list_item_append(li, ".", ic, NULL, NULL, NULL); + + ic = elm_icon_add(win); + elm_icon_standard_set(ic, "delete"); + elm_icon_scale_set(ic, 0, 0); + ic2 = elm_icon_add(win); + elm_icon_standard_set(ic2, "clock"); + elm_icon_scale_set(ic2, 0, 0); + elm_list_item_append(li, "How", ic, ic2, NULL, NULL); + + bx = elm_box_add(win); + elm_box_horizontal_set(bx, EINA_TRUE); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_align_set(ic, 0.5, 0.5); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_align_set(ic, 0.5, 0.0); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_align_set(ic, 0.0, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, ic); + evas_object_show(ic); + + elm_list_item_append(li, "are", bx, NULL, NULL, NULL); + elm_list_item_append(li, "you", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "doing", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "out", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "there", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "today", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "?", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Here", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "are", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "some", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "more", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "items", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Is this label long enough?", NULL, NULL, NULL, NULL); + elm_list_item_append(li, "Maybe this one is even longer so we can test long long items.", NULL, NULL, NULL, NULL); + + elm_list_go(li); + + evas_object_show(li); + + evas_object_resize(win, 320, 300); + evas_object_show(win); +} +TEST_END + +/////////////////////////////////////////////////////////////////////////////////////// + +struct Pginfo +{ + Evas_Object *pager, *win; +}; + +static void +test_list4_back_cb(void *data, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + struct Pginfo *info = data; + if (!info) return; + + elm_pager_content_pop(info->pager); +} + +static void +test_list4_swipe(void *data, + Evas_Object *obj __UNUSED__, + void *event_info) +{ + Evas_Object *box, *entry, *button; + struct Pginfo *info = data; + char *item_data; + if ((!event_info) || (!data)) return; + + item_data = elm_list_item_data_get(event_info); + + box = elm_box_add(info->win); + elm_box_horizontal_set(box, EINA_FALSE); + elm_box_homogeneous_set(box, EINA_FALSE); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(box); + + entry = elm_entry_add(info->win); + elm_entry_scrollable_set(entry, EINA_TRUE); + elm_entry_editable_set(entry, EINA_FALSE); + elm_entry_entry_set(entry, item_data); + evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(entry); + + button = elm_button_add(info->win); + elm_object_text_set(button, "back"); + evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 0); + evas_object_smart_callback_add(button, "clicked", test_list4_back_cb, info); + evas_object_show(button); + + elm_box_pack_start(box, entry); + elm_box_pack_end(box, button); + + elm_pager_content_push(info->pager, box); +} + +TEST_START(test_list4) +{ + Evas_Object *bg, *li, *ic, *ic2, *pager; + static struct Pginfo info = {NULL, NULL}; + char buf[PATH_MAX]; + + info.win = win; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + pager = elm_pager_add(win); + elm_win_resize_object_add(win, pager); + evas_object_size_hint_weight_set(pager, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(pager, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(pager); + info.pager = pager; + + li = elm_list_add(win); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_list_mode_set(li, ELM_LIST_COMPRESS); + evas_object_smart_callback_add(li, "swipe", test_list4_swipe, &info); + elm_pager_content_push(pager, li); + + static char pf_data[] = "Pink Floyd were formed in 1965, and originally consisted of university" \ + "students Roger Waters, Nick Mason, Richard Wright, and Syd Barrett. The group were a popular" \ + "fixture on London's underground music scene, and under Barrett's leadership released two " \ + "charting singles, \"Arnold Layne\" and \"See Emily Play\", and a successful debut album, " \ + "ThePiper at the Gates of Dawn. In 1968, guitarist and singer David Gilmour joined the " \ + "line-up. Barrett was soon removed, due to his increasingly erratic behaviour. Following " \ + "Barrett's departure, bass player and singer Roger Waters became the band's lyricist and " \ + "conceptual leader, with Gilmour assuming lead guitar and much of the vocals. With this " \ + "line-up, Floyd went on to achieve worldwide critical and commercial success with the " \ + "conceptalbums The Dark Side of the Moon, Wish You Were Here, Animals, and The Wall."; + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/mystrale.jpg", elm_app_data_dir_get()); + elm_icon_scale_set(ic, 0, 0); + elm_icon_file_set(ic, buf, NULL); + elm_list_item_append(li, "Pink Floyd", ic, NULL, NULL, &pf_data); + + static char ds_data[] = "Dire Straits were a British rock band, formed by Mark Knopfler " \ + "(lead vocals and lead guitar), his younger brother David Knopfler (rhythm guitar and " \ + "backing vocals), John Illsley (bass guitar and backing vocals), and Pick Withers (drums " \ + "and percussion), and managed by Ed Bicknell, active between 1977 and 1995. Although the " \ + "band was formed in an era when punk rock was at the forefront, Dire Straits played a more " + "bluesy style, albeit with a stripped-down sound that appealed to audiences weary of the " \ + "overproduced stadium rock of the 1970s.[citation needed] In their early days, Mark and " \ + "David requested that pub owners turn down their sound so that patrons could converse " \ + "while the band played, an indication of their unassuming demeanor. Despite this oddly " \ + "self-effacing approach to rock and roll, Dire Straits soon became hugely successful, with " \ + "their first album going multi-platinum globally."; + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/mystrale_2.jpg", elm_app_data_dir_get()); + elm_icon_scale_set(ic, 0, 0); + elm_icon_file_set(ic, buf, NULL); + elm_list_item_append(li, "Dire Straits", ic, NULL, NULL, &ds_data); + + static char uh_data[] = "Uriah Heep are an English hard rock band. The band released several " \ + "commercially successful albums in the 1970s such as Uriah Heep Live (1973), but their " \ + "audience declined by the 1980s, to the point where they became essentially a cult band in " \ + "the United States and United Kingdom. Uriah Heep maintain a significant following in " \ + "Germany, the Netherlands, Scandinavia, the Balkans, Japan and Russia, where they still " \ + "perform at stadium-sized venues."; + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/icon_17.png", elm_app_data_dir_get()); + elm_icon_scale_set(ic, 1, 1); + elm_icon_file_set(ic, buf, NULL); + elm_list_item_append(li, "Uriah Heep", ic, NULL, NULL, &uh_data); + + static char r_data[] = "Rush is a Canadian rock band formed in August 1968, in the Willowdale " \ + "neighbourhood of Toronto, Ontario. The band is composed of bassist, keyboardist, and lead " \ + "vocalist Geddy Lee, guitarist Alex Lifeson, and drummer and lyricist Neil Peart. The band " \ + "and its membership went through a number of re-configurations between 1968 and 1974, " \ + "achieving their current form when Peart replaced original drummer John Rutsey in July 1974, " \ + "two weeks before the group's first United States tour."; + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/icon_21.png", elm_app_data_dir_get()); + elm_icon_scale_set(ic, 0, 0); + elm_icon_file_set(ic, buf, NULL); + ic2 = elm_icon_add(win); + elm_icon_standard_set(ic2, "clock"); + elm_icon_scale_set(ic2, 0, 0); + elm_list_item_append(li, "Rush", ic, ic2, NULL, &r_data); + + elm_list_go(li); + + evas_object_show(li); + evas_object_resize(win, 320, 300); + evas_object_show(win); +} +TEST_END + +///////////////////////////////////////////////////////////////////////////////////////// +struct list5_data_cb +{ + Evas_Object *win, *list; +}; + +static void +test_list5_item_del(void *data, + Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + elm_list_item_del(data); +} + +static void +test_list5_swipe(void *data __UNUSED__, + Evas_Object *obj __UNUSED__, + void *event_info) +{ + Evas_Object *button; + struct list5_data_cb *info = elm_list_item_data_get(event_info); + + if (elm_list_item_end_get(event_info)) return; + + button = elm_button_add(info->win); + elm_object_text_set(button, "delete"); + evas_object_propagate_events_set(button, 0); + evas_object_smart_callback_add(button, "clicked", test_list5_item_del, + event_info); + elm_list_item_end_set(event_info, button); +} + +TEST_START(test_list5) +{ + Evas_Object *bg, *li; + static struct list5_data_cb info; + + info.win = win; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + li = elm_list_add(win); + evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_list_mode_set(li, ELM_LIST_COMPRESS); + evas_object_smart_callback_add(li, "swipe", test_list5_swipe, NULL); + elm_win_resize_object_add(win, li); + evas_object_show(li); + info.list = li; + + elm_list_item_append(li, "Network", NULL, NULL, NULL, &info); + elm_list_item_append(li, "Audio", NULL, NULL, NULL, &info); + + elm_list_go(li); + evas_object_resize(win, 320, 300); + evas_object_show(win); +} +TEST_END + diff --git a/src/bin/test_map.c b/src/bin/test_map.c new file mode 100644 index 0000000..e8fa6b8 --- /dev/null +++ b/src/bin/test_map.c @@ -0,0 +1,798 @@ +#include +#include "tsuite.h" +#define SOURCE_MAX 10 +#define MARKER_MAX 1000 +#define NAME_ENTRY_TEXT "Enter freeform address" + +typedef struct Map_Source +{ + Evas_Object *map; + char *source_name; +} Map_Source; + +static Elm_Map_Marker_Class *itc1, *itc2, *itc_parking; +static Elm_Map_Group_Class *itc_group1, *itc_group2, *itc_group_parking; + +static Evas_Object *rect, *menu, *fs_win; +static int nb_elts; +/*static Elm_Map_Marker *markers[MARKER_MAX];*/ +static Elm_Map_Marker *route_from, *route_to; +static Elm_Map_Route *route; +static Elm_Map_Name *name; +static Evas_Object *track; +static const char **source_names = NULL; +static Evas_Coord old_x, old_y; +static Evas_Coord old_d; +static Map_Source ms[SOURCE_MAX]; + +struct _Test_Data +{ + char *data1; + char *data2; + char *data3; + char *data4; + char *data5; + char *data6; + char *data7; + char *data8; + char *data9; + char *data10; + char *data11; +}; +typedef struct _Test_Data Test_Data; + +static char *data3; /* used in _marker_get */ + +static Evas_Object * _marker_get(Evas_Object *obj, Elm_Map_Marker *marker __UNUSED__, void *data); +static Evas_Object * _group_icon_get(Evas_Object *obj, void *data); + +static void +#ifdef ELM_EMAP +my_map_gpx_fileselector_done(void *data, Evas_Object *obj __UNUSED__, void *event_info) +#else +my_map_gpx_fileselector_done(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +#endif +{ + const char *selected = event_info; + + if (selected) + { + printf("Selected file: %s\n", selected); +#ifdef ELM_EMAP + EMap_Route *emap = emap_route_gpx_new(selected); + track = elm_map_track_add(data, emap); +#else + printf("libEMap is required !\n"); +#endif + } + evas_object_del(fs_win); +} + +static char * +_get_str(char *dest, const char *str) +{ /* dest should be not null and big enough */ + sprintf(dest, "%s/%s", elm_app_data_dir_get(), str); + return dest; +} + +static void +my_map_clicked(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("clicked\n"); +} + +static void +my_map_press(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("press\n"); +} + +static void +my_map_longpressed(void *data, Evas_Object *obj __UNUSED__, void *event_info) +{ + double lon, lat; + Evas_Coord ox, oy, x, y, w, h; + int zoom; + Evas_Event_Mouse_Down *down = (Evas_Event_Mouse_Down *)event_info; + if (!down) return; + + evas_object_geometry_get(data, &ox, &oy, &w, &h); + zoom = elm_map_zoom_get(data); + elm_map_geo_region_get(obj, &lon, &lat); + elm_map_utils_convert_geo_into_coord(obj, lon, lat, pow(2.0, zoom) * 256, &x, &y); + x += down->canvas.x - (w / 2) - ox; + y += down->canvas.y - (h / 2) - oy; + elm_map_utils_convert_coord_into_geo(obj, x, y, pow(2.0, zoom) * 256, &lon, &lat); + + name = elm_map_utils_convert_coord_into_name(data, lon, lat); +} + +static void +my_map_clicked_double(void *data, Evas_Object *obj, void *event_info) +{ + double lon, lat; + double flon, flat, tlon, tlat; + Evas_Coord ox, oy, x, y, w, h, rx, ry, tx, ty; + double d; + int zoom; + char buf[1024]; + Evas_Coord size; + Evas_Event_Mouse_Down *down = (Evas_Event_Mouse_Down *)event_info; + if (!down) return; + + evas_object_geometry_get(data, &ox, &oy, &w, &h); + zoom = elm_map_zoom_get(data); + if (zoom < 5) return; + size = pow(2.0, zoom) * 256; + elm_map_geo_region_get(obj, &lon, &lat); + elm_map_utils_convert_geo_into_coord(obj, lon, lat, size, &x, &y); + + rx = x; + ry = y; + x += down->canvas.x - ((float)w * 0.5) - ox; + y += down->canvas.y - ((float)h * 0.5) - oy; + elm_map_rotate_get(data, &d, NULL, NULL); + elm_map_utils_rotate_coord(data, x, y, rx, ry, -d, &tx, &ty); + elm_map_utils_convert_coord_into_geo(obj, tx, ty, size, &lon, &lat); + + itc1 = elm_map_marker_class_new(data); + + elm_map_marker_class_del_cb_set(itc1, NULL); + + itc_group1 = elm_map_group_class_new(data); + elm_map_group_class_icon_cb_set(itc_group1, _group_icon_get); + elm_map_group_class_data_set(itc_group1, _get_str(buf,"images/bubble.png")); + elm_map_group_class_style_set(itc_group1, "empty"); + elm_map_group_class_zoom_displayed_set(itc_group1, 5); + + if (route_from && route_to) + { + elm_map_marker_remove(route_from); + route_from = NULL; + elm_map_marker_remove(route_to); + route_to = NULL; + elm_map_route_remove(route); + } + + if (!route_from) route_from = elm_map_marker_add(data, lon, lat, itc1, itc_group1, NULL); + else route_to = elm_map_marker_add(data, lon, lat, itc1, itc_group1, NULL); + + if (route_from && route_to) + { + elm_map_marker_region_get(route_from, &flon, &flat); + elm_map_marker_region_get(route_to, &tlon, &tlat); + route = elm_map_route_add(data, ELM_MAP_ROUTE_TYPE_MOTOCAR, ELM_MAP_ROUTE_METHOD_FASTEST, flon, flat, tlon, tlat); + elm_map_route_color_set(route, 255, 0, 0, 255); + } +} + +static void +my_map_load_detail(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("load,detail\n"); +} + +static void +my_map_loaded_detail(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("loaded,detail\n"); +} + +static void +my_map_zoom_start(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("zoom,start\n"); +} + +static void +my_map_zoom_stop(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("zoom,stop\n"); +} + +static void +my_map_zoom_change(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("zoom,change\n"); +} + +static void +my_map_anim_start(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("anim,start\n"); +} + +static void +my_map_anim_stop(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("anim,stop\n"); +} + +static void +my_map_drag_start(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + evas_object_smart_callback_del(data, "longpressed", my_map_longpressed); +} + +static void +my_map_drag_stop(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + evas_object_smart_callback_add(data, "longpressed", my_map_longpressed, data); +} + +static void +my_map_scroll(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + double lon, lat; + elm_map_geo_region_get(obj, &lon, &lat); + printf("scroll longitude : %f latitude : %f\n", lon, lat); +} + +static void +my_map_downloaded(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + int try_num, finish_num; + elm_map_utils_downloading_status_get(data, &try_num, &finish_num); + printf("downloaded : %d / %d\n", finish_num, try_num); +} + +static void +my_map_route_load(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("route_load\n"); +} + +static void +my_map_route_loaded(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + double d; + const char *w, *n; + d = elm_map_route_distance_get(route); + printf("route distance = %lf km\n", d); + + w = elm_map_route_waypoint_get(route); + if (w) printf("[waypoints]\n%s\n", w); + + n = elm_map_route_node_get(route); + if (n) printf("[nodes]\n%s\n", n); +} + +static void +my_map_name_load(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("name_load\n"); +} + +static void +my_map_name_loaded(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + if (!name) return; + double lon, lat; + const char *addr = elm_map_name_address_get(name); + elm_map_name_region_get(name, &lon, &lat); + if (addr) + { + printf("name of [lon = %lf, lat = %lf] is %s\n", lon, lat, addr); + if ((lon != 0.0) && (lat !=0.0)) + { + Eina_Bool b = elm_map_paused_get(data); + elm_map_paused_set(data, EINA_TRUE); + elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL); + elm_map_geo_region_show(data, lon, lat); + elm_map_zoom_set(data, 18); + elm_map_paused_set(data, b); + } + } + elm_map_name_remove(name); +} + +static void +map_show_urmatt(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Eina_Bool b = elm_map_paused_get(data); + elm_map_paused_set(data, EINA_TRUE); + elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL); + elm_map_geo_region_show(data,7.325201, 48.526813); + elm_map_zoom_set(data, 12); + elm_map_paused_set(data, b); +} + +static void +map_bring_seoul(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_map_geo_region_bring_in(data, 126.977969, 37.566535); +} + +static void +map_paused_set(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_map_paused_set(data, EINA_TRUE); +} + +static void +map_paused_unset(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_map_paused_set(data, EINA_FALSE); +} + +static void +map_zoom_in(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + int zoom; + + zoom = elm_map_zoom_get(data) + 1; + elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL); + elm_map_zoom_set(data, zoom); +} + +static void +map_zoom_out(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + int zoom; + + zoom = elm_map_zoom_get(data) - 1; + elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL); + elm_map_zoom_set(data, zoom); +} + +static void +map_zoom_fit(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_AUTO_FIT); +} + +static void +map_zoom_fill(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_AUTO_FILL); +} + +static void +map_track_add(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *fs, *bg, *vbox, *hbox, *sep; + + fs_win = elm_win_add(NULL, "fileselector", ELM_WIN_BASIC); + elm_win_title_set(fs_win, "File Selector"); + elm_win_autodel_set(fs_win, 1); + + bg = elm_bg_add(fs_win); + elm_win_resize_object_add(fs_win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + vbox = elm_box_add(fs_win); + elm_win_resize_object_add(fs_win, vbox); + evas_object_size_hint_weight_set(vbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(vbox); + + fs = elm_fileselector_add(fs_win); + elm_fileselector_is_save_set(fs, EINA_TRUE); + elm_fileselector_expandable_set(fs, EINA_FALSE); + elm_fileselector_path_set(fs, getenv("HOME")); + evas_object_size_hint_weight_set(fs, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(fs, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(vbox, fs); + evas_object_show(fs); + + evas_object_smart_callback_add(fs, "done", my_map_gpx_fileselector_done, data); + + sep = elm_separator_add(fs_win); + elm_separator_horizontal_set(sep, EINA_TRUE); + elm_box_pack_end(vbox, sep); + evas_object_show(sep); + + hbox = elm_box_add(fs_win); + elm_box_horizontal_set(hbox, EINA_TRUE); + elm_box_pack_end(vbox, hbox); + evas_object_show(hbox); + + evas_object_resize(fs_win, 240, 350); + evas_object_show(fs_win); +} + + +static void +map_track_remove(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_map_track_remove(data, track); +} + +static void +map_rotate_cw(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + double d; + Evas_Coord x, y, w, h; + float half_w, half_h; + evas_object_geometry_get(data, &x, &y, &w, &h); + half_w = (float)w * 0.5; + half_h = (float)h * 0.5; + + elm_map_rotate_get(data, &d, NULL, NULL); + d += 15.0; + elm_map_rotate_set(data, d, x + half_w, y + half_h); +} + +static void +map_rotate_ccw(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + double d; + Evas_Coord x, y, w, h; + float half_w, half_h; + evas_object_geometry_get(data, &x, &y, &w, &h); + half_w = (float)w * 0.5; + half_h = (float)h * 0.5; + + elm_map_rotate_get(data, &d, NULL, NULL); + d -= 15.0; + elm_map_rotate_set(data, d, x + half_w, y + half_h); +} + +static void +map_rotate_reset(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Coord x, y, w, h; + float half_w, half_h; + evas_object_geometry_get(data, &x, &y, &w, &h); + half_w = (float)w * 0.5; + half_h = (float)h * 0.5; + + elm_map_rotate_set(data, 0.0, x + half_w, y + half_h); +} + +static void +map_zoom_min_set(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_map_source_zoom_min_set(data, 1); +} + +static void +map_zoom_max_set(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_map_source_zoom_max_set(data, 10); +} + +static void +map_source(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Map_Source *s = data; + + if (!s) return; + elm_map_source_name_set(s->map, s->source_name); +} + +static Evas_Object * +_marker_get(Evas_Object *obj, Elm_Map_Marker *marker __UNUSED__, void *data) +{ + char *d = data; + + Evas_Object *bx = elm_box_add(obj); + evas_object_show(bx); + + if (d == data3) + { + Evas_Object *icon = elm_icon_add(obj); + elm_icon_file_set(icon, d, NULL); + evas_object_show(icon); + + Evas_Object *o = elm_button_add(obj); + elm_object_part_content_set(o, "icon", icon); + evas_object_show(o); + elm_box_pack_end(bx, o); + } + else + { + Evas_Object *o = evas_object_image_add(evas_object_evas_get(obj)); + evas_object_image_file_set(o, d, NULL); + evas_object_image_filled_set(o, EINA_TRUE); + evas_object_size_hint_min_set(o, 64, 64); + evas_object_show(o); + elm_box_pack_end(bx, o); + + Evas_Object *lbl = elm_label_add(obj); + elm_object_text_set(lbl, "Wolves Go !"); + evas_object_show(lbl); + elm_box_pack_end(bx, lbl); + } + + return bx; +} + +static Evas_Object * +_icon_get(Evas_Object *obj, Elm_Map_Marker *marker __UNUSED__, void *data) +{ + char *d = data; + + Evas_Object *icon = elm_icon_add(obj); + elm_icon_file_set(icon, d, NULL); + evas_object_show(icon); + + return icon; +} + +static Evas_Object * +_group_icon_get(Evas_Object *obj, void *data) +{ + char *file = data; + + Evas_Object *icon = elm_icon_add(obj); + elm_icon_file_set(icon, file, NULL); + evas_object_show(icon); + + return icon; +} + +static void +_map_move_resize_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + int x,y,w,h; + + evas_object_geometry_get(data,&x,&y,&w,&h); + evas_object_resize(rect,w,h); + evas_object_move(rect,x,y); +} + +static void +_populate(void *data, Elm_Object_Item *menu_it) +{ + int idx; + + if ((!data) || (!menu_it) || (!source_names)) return; + for (idx = 0; source_names[idx]; idx++) + { + if (idx >= SOURCE_MAX) break; + ms[idx].map = data; + ms[idx].source_name = strdup(source_names[idx]); + elm_menu_item_add(menu, menu_it, "", source_names[idx], map_source, + &ms[idx]); + } +} + +static void +_map_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Down *down = event_info; + Elm_Object_Item *menu_it; + if (!down) return; + + if (down->button == 2) + { + old_x = down->canvas.x; + old_y = down->canvas.y; + old_d = 0.0; + } + else if (down->button == 3) + { + menu = elm_menu_add(obj); + menu_it = elm_menu_item_add(menu, NULL, NULL, "Source", NULL, NULL); + _populate(data, menu_it); + elm_menu_item_add(menu, NULL, NULL, "Show Urmatt", map_show_urmatt, data); + elm_menu_item_add(menu, NULL, NULL, "Bring Seoul", map_bring_seoul, data); + elm_menu_item_add(menu, NULL, NULL, "Paused Set", map_paused_set, data); + elm_menu_item_add(menu, NULL, NULL, "Paused Unset", map_paused_unset, data); + elm_menu_item_add(menu, NULL, NULL, "Zoom +", map_zoom_in, data); + elm_menu_item_add(menu, NULL, NULL, "Zoom -", map_zoom_out, data); + elm_menu_item_add(menu, NULL, NULL, "Zoom Fit", map_zoom_fit, data); + elm_menu_item_add(menu, NULL, NULL, "Zoom Fill", map_zoom_fill, data); + elm_menu_item_add(menu, NULL, NULL, "Add Track", map_track_add, data); + elm_menu_item_add(menu, NULL, NULL, "Remove Track", map_track_remove, data); + elm_menu_item_add(menu, NULL, NULL, "Add Marker", NULL, NULL); + elm_menu_item_add(menu, NULL, NULL, "Rotate CW", map_rotate_cw, data); + elm_menu_item_add(menu, NULL, NULL, "Rotate CCW", map_rotate_ccw, data); + elm_menu_item_add(menu, NULL, NULL, "Reset Rotate", map_rotate_reset, data); + elm_menu_item_add(menu, NULL, NULL, "Set Zoom Min to 1", map_zoom_min_set, data); + elm_menu_item_add(menu, NULL, NULL, "Set Zoom Max to 10", map_zoom_max_set, data); + + elm_menu_move(menu, down->canvas.x, down->canvas.y); + evas_object_show(menu); + } +} + +static void +_map_mouse_move(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Evas_Event_Mouse_Move *move = event_info; + Evas_Coord x, y, w, h; + float half_w, half_h; + int d, d_diff; + double cur_d; + if (!move) return; + + if (move->buttons == 2) + { + evas_object_geometry_get(data, &x, &y, &w, &h); + half_w = (float)w * 0.5; + half_h = (float)h * 0.5; + elm_map_rotate_get(data, &cur_d, NULL, NULL); + + d = move->cur.canvas.x - old_x; + if (!old_d) old_d = d; + else + { + d_diff = old_d - d; + if (d_diff > 0) + { + old_d --; + cur_d += 1.0; + } + else if (d_diff < 0) + { + old_d ++; + cur_d -= 1.0; + } + old_d = d; + elm_map_rotate_set(data, cur_d, x + half_w, y + half_h); + } + } +} + +static void +_map_mouse_up(void *data __UNUSED__, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Evas_Event_Mouse_Up *up = event_info; + if (!up) return; + + if (up->button == 2) + { + old_x = 0; + old_y = 0; + } +} + +static void +_win_del(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Test_Data *tdata = data; + if (!data) return; + + free(tdata->data1); + free(tdata->data2); + free(tdata->data3); + free(tdata->data4); + free(tdata->data5); + free(tdata->data6); + free(tdata->data7); + free(tdata->data8); + free(tdata->data9); + free(tdata->data10); + free(tdata->data11); + + free(tdata); +} + +TEST_START(test_map) +{ + Evas_Object *bg, *map; + int idx = 0; + char buf[1024]; + + Test_Data *tdata = malloc(sizeof(Test_Data)); + tdata->data1 = strdup(_get_str(buf, "images/logo.png")); + tdata->data2 = strdup(_get_str(buf, "images/logo_small.png")); + data3 = tdata->data3 = strdup(_get_str(buf, "images/panel_01.jpg")); + tdata->data4 = strdup(_get_str(buf, "images/plant_01.jpg")); + tdata->data5 = strdup(_get_str(buf, "images/rock_01.jpg")); + tdata->data6 = strdup(_get_str(buf, "images/rock_02.jpg")); + tdata->data7 = strdup(_get_str(buf, "images/sky_01.jpg")); + tdata->data8 = strdup(_get_str(buf, "images/sky_02.jpg")); + tdata->data9 = strdup(_get_str(buf, "images/sky_03.jpg")); + tdata->data10 = strdup(_get_str(buf, "images/sky_03.jpg")); + tdata->data11= strdup(_get_str(buf, "images/wood_01.jpg")); + + evas_object_smart_callback_add(win, "delete,request", _win_del, tdata); + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + map = elm_map_add(win); + if (map) + { + srand(time(NULL)); + + source_names = elm_map_source_names_get(map); + + if (!source_names) return; + printf("map sources [ "); + for (idx = 0; source_names[idx] ; idx++) printf("%s ", source_names[idx]); + printf("]\n"); + + evas_object_size_hint_weight_set(map, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, map); + evas_object_data_set(map, "window", win); + + // + itc1 = elm_map_marker_class_new(map); + elm_map_marker_class_get_cb_set(itc1, _marker_get); + elm_map_marker_class_del_cb_set(itc1, NULL); + + itc2 = elm_map_marker_class_new(map); + elm_map_marker_class_get_cb_set(itc2, _marker_get); + elm_map_marker_class_del_cb_set(itc2, NULL); + elm_map_marker_class_style_set(itc2, "radio2"); + + itc_parking = elm_map_marker_class_new(map); + elm_map_marker_class_get_cb_set(itc_parking, _marker_get); + elm_map_marker_class_del_cb_set(itc_parking, NULL); + elm_map_marker_class_icon_cb_set(itc_parking, _icon_get); + elm_map_marker_class_style_set(itc_parking, "empty"); + // + + // + itc_group1 = elm_map_group_class_new(map); + elm_map_group_class_data_set(itc_group1, + _get_str(buf, "images/plant_01.jpg")); + + itc_group2 = elm_map_group_class_new(map); + elm_map_group_class_style_set(itc_group2, "radio2"); + elm_map_group_class_zoom_displayed_set(itc_group1, 3); + + itc_group_parking = elm_map_group_class_new(map); + elm_map_group_class_icon_cb_set(itc_group_parking, _group_icon_get); + elm_map_group_class_data_set(itc_group_parking, + _get_str(buf, "images/parking.png")); + elm_map_group_class_style_set(itc_group_parking, "empty"); + elm_map_group_class_zoom_displayed_set(itc_group_parking, 5); + // + + rect = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(rect, 0, 0, 0, 0); + evas_object_repeat_events_set(rect,1); + evas_object_show(rect); + evas_object_raise(rect); + + evas_object_event_callback_add(map, EVAS_CALLBACK_RESIZE, + _map_move_resize_cb, map); + evas_object_event_callback_add(map, EVAS_CALLBACK_MOVE, + _map_move_resize_cb, map); + evas_object_event_callback_add(map, EVAS_CALLBACK_MOUSE_DOWN, + _map_mouse_down, map); + evas_object_event_callback_add(map, EVAS_CALLBACK_MOUSE_MOVE, + _map_mouse_move, map); + evas_object_event_callback_add(map, EVAS_CALLBACK_MOUSE_UP, + _map_mouse_up, map); + + elm_map_marker_add(map, 2.352, 48.857, itc1, itc_group1, tdata->data1); + elm_map_marker_add(map, 2.355, 48.857, itc1, itc_group1, tdata->data3); + elm_map_marker_add(map, 3, 48.857, itc2, itc_group1, tdata->data2); + elm_map_marker_add(map, 2.352, 49, itc2, itc_group1, tdata->data1); + + elm_map_marker_add(map, 7.31451, 48.857127, itc1, itc_group1, tdata->data10); + elm_map_marker_add(map, 7.314704, 48.857119, itc1, itc_group1, tdata->data4); + elm_map_marker_add(map, 7.314704, 48.857119, itc2, itc_group1, tdata->data5); + elm_map_marker_add(map, 7.31432, 48.856785, itc2, itc_group1, tdata->data6); + elm_map_marker_add(map, 7.3148, 48.85725, itc1, itc_group2, tdata->data7); + elm_map_marker_add(map, 7.316445, 48.8572210000694, itc1, itc_group1, tdata->data8); + elm_map_marker_add(map, 7.316527000125, 48.85609, itc2, itc_group2, tdata->data9); + elm_map_marker_add(map, 7.3165409990833, 48.856078, itc2, itc_group1, tdata->data11); + elm_map_marker_add(map, 7.319812, 48.856561, itc2, itc_group2, tdata->data10); + + nb_elts = 13; + + evas_object_smart_callback_add(map, "clicked", my_map_clicked, win); + evas_object_smart_callback_add(map, "press", my_map_press, win); + evas_object_smart_callback_add(map, "longpressed", my_map_longpressed, map); + evas_object_smart_callback_add(map, "clicked,double", my_map_clicked_double, map); + evas_object_smart_callback_add(map, "load,detail", my_map_load_detail, win); + evas_object_smart_callback_add(map, "loaded,detail", my_map_loaded_detail, win); + evas_object_smart_callback_add(map, "zoom,start", my_map_zoom_start, win); + evas_object_smart_callback_add(map, "zoom,stop", my_map_zoom_stop, win); + evas_object_smart_callback_add(map, "zoom,change", my_map_zoom_change, win); + evas_object_smart_callback_add(map, "scroll,anim,start", my_map_anim_start, win); + evas_object_smart_callback_add(map, "scroll,anim,stop", my_map_anim_stop, win); + evas_object_smart_callback_add(map, "scroll,drag,start", my_map_drag_start, map); + evas_object_smart_callback_add(map, "scroll,drag,stop", my_map_drag_stop, map); + evas_object_smart_callback_add(map, "scroll", my_map_scroll, win); + evas_object_smart_callback_add(map, "downloaded", my_map_downloaded, map); + evas_object_smart_callback_add(map, "route,load", my_map_route_load, map); + evas_object_smart_callback_add(map, "route,loaded", my_map_route_loaded, map); + evas_object_smart_callback_add(map, "name,load", my_map_name_load, map); + evas_object_smart_callback_add(map, "name,loaded", my_map_name_loaded, map); + + evas_object_show(map); + } + + evas_object_resize(win, 800, 800); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_menu.c b/src/bin/test_menu.c new file mode 100644 index 0000000..9672bf5 --- /dev/null +++ b/src/bin/test_menu.c @@ -0,0 +1,121 @@ +#include +#include "tsuite.h" +static Evas_Object *bg, *menu, *rect; + +static void +_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Evas_Event_Mouse_Down *ev = event_info; + elm_menu_move(data, ev->canvas.x, ev->canvas.y); + evas_object_show(data); +} + +static void +_populate_4(Elm_Object_Item *menu_it) +{ + Elm_Object_Item *menu_it2; + + elm_menu_item_add(menu, menu_it, "go-bottom", "menu 2", NULL, NULL); + elm_menu_item_add(menu, menu_it, "go-first", "menu 3", NULL, NULL); + elm_menu_item_separator_add(menu, menu_it); + menu_it2 = elm_menu_item_add(menu, menu_it, "go-last", "Disabled item", NULL, + NULL); + elm_object_item_disabled_set(menu_it2, EINA_TRUE); + menu_it2 = elm_menu_item_add(menu, menu_it, "go-next", "Disabled item", NULL, + NULL); + elm_object_item_disabled_set(menu_it2, EINA_TRUE); + menu_it2 = elm_menu_item_add(menu, menu_it, "go-up", "Disabled item", NULL, + NULL); + elm_object_item_disabled_set(menu_it2, EINA_TRUE); +} + +static void +_populate_3(Elm_Object_Item *menu_it) +{ + Elm_Object_Item *menu_it2; + + elm_menu_item_add(menu, menu_it, "media-eject", "menu 2", NULL, NULL); + elm_menu_item_add(menu, menu_it, "media-playback-start", "menu 3", NULL, + NULL); + elm_menu_item_separator_add(menu, menu_it); + menu_it2 = elm_menu_item_add(menu, menu_it, "media-playback-stop", + "Disabled item", NULL, NULL); + elm_object_item_disabled_set(menu_it2, EINA_TRUE); +} + +static void +_populate_2(Elm_Object_Item *menu_it) +{ + Elm_Object_Item *menu_it2, *menu_it3; + + elm_menu_item_add(menu, menu_it, "system-reboot", "menu 2", NULL, NULL); + menu_it2 = elm_menu_item_add(menu, menu_it, "system-shutdown", "menu 3", + NULL, NULL); + _populate_3(menu_it2); + + elm_menu_item_separator_add(menu, menu_it); + elm_menu_item_separator_add(menu, menu_it); + elm_menu_item_separator_add(menu, menu_it); + elm_menu_item_separator_add(menu, menu_it); + elm_menu_item_separator_add(menu, menu_it); + elm_menu_item_separator_add(menu, menu_it); + elm_menu_item_separator_add(menu, menu_it); + + menu_it2 = elm_menu_item_add(menu, menu_it, "system-lock-screen", "menu 2", + NULL, NULL); + elm_menu_item_separator_add(menu, menu_it); + + menu_it3 = elm_menu_item_add(menu, menu_it, "system-run", "Disabled item", + NULL, NULL); + elm_object_item_disabled_set(menu_it3, EINA_TRUE); + + _populate_4(menu_it2); +} + +static void +_populate_1(Evas_Object *win, Elm_Object_Item *menu_it) +{ + Elm_Object_Item *menu_it2; + Evas_Object *radio; + + radio = elm_radio_add(win); + elm_radio_state_value_set(radio, 0); + elm_radio_value_set(radio, 0); + elm_object_text_set(radio, "radio in menu"); + menu_it2 = elm_menu_item_add(menu, menu_it, "object-rotate-left", "menu 1", + NULL, NULL); + elm_menu_item_add_object(menu, menu_it, radio, NULL, NULL); + + _populate_2(menu_it2); +} + +TEST_START(test_menu) +{ + Elm_Object_Item *menu_it; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + rect = evas_object_rectangle_add(evas_object_evas_get(win)); + elm_win_resize_object_add(win, rect); + evas_object_color_set(rect, 0, 0, 0, 0); + evas_object_show(rect); + + menu = elm_menu_add(win); + elm_menu_item_add(menu, NULL, NULL, "first item", NULL, NULL); + + menu_it = elm_menu_item_add(menu, NULL, "mail-reply-all", "second item", + NULL, NULL); + _populate_1(win, menu_it); + + elm_menu_item_add(menu, menu_it, "window-new", "sub menu", NULL, NULL); + + evas_object_event_callback_add(rect, EVAS_CALLBACK_MOUSE_DOWN, _show, menu); + + evas_object_resize(win, 350, 200); + evas_object_show(win); +} +TEST_END + diff --git a/src/bin/test_naviframe.c b/src/bin/test_naviframe.c new file mode 100644 index 0000000..dd325d7 --- /dev/null +++ b/src/bin/test_naviframe.c @@ -0,0 +1,241 @@ +#include +#include "tsuite.h" + +struct _Test_Data +{ + char *img1; + char *img2; + char *img3; + char *img4; + char *img5; +}; +typedef struct _Test_Data Test_Data; + +static Test_Data *tdata = NULL; + + static char * +_get_str(char *dest, const char *str) +{ /* dest should be not null and big enough */ + sprintf(dest, "%s/%s", elm_app_data_dir_get(), str); + return dest; +} + +static void +_win_del(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Test_Data *tdata = data; + if (!data) return; + + free(tdata->img1); + free(tdata->img2); + free(tdata->img3); + free(tdata->img4); + free(tdata->img5); + + free(tdata); +} + +Evas_Object * +_content_new(Evas_Object *parent, const char *img) +{ + Evas_Object *photo = elm_photo_add(parent); + elm_photo_file_set(photo, img); + elm_photo_fill_inside_set(photo, EINA_TRUE); + elm_object_style_set(photo, "shadow"); + return photo; +} + +void +_navi_pop(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_naviframe_item_pop(data); +} + +void +_navi_it_del(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_naviframe_item_del(data); +} + +void +_title_clicked(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("Title Clicked!\n"); +} + +void +_title_visible(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_naviframe_item_title_visible_set(data, + !elm_naviframe_item_title_visible_get(data)); +} + +void +_promote(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_naviframe_item_promote(data); +} + +void +_page5(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *bt, *bt2, *content, *nf = data; + Elm_Object_Item *it; + + bt = elm_button_add(nf); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(bt, "Prev"); + + bt2 = elm_button_add(nf); + evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(bt2, "Page 1"); + evas_object_smart_callback_add(bt2, "clicked", _promote, + evas_object_data_get(nf, "page1")); + + content = _content_new(nf, tdata->img5); + it = elm_naviframe_item_insert_after(elm_naviframe_top_item_get(nf), + "Page 5", + bt, + bt2, + content, + NULL); + + evas_object_smart_callback_add(bt, "clicked", _navi_it_del, it); +} + +void +_page4(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *bt, *ic, *content, *nf = data; + char buf[PATH_MAX]; + Elm_Object_Item *it; + + ic = elm_icon_add(nf); + snprintf(buf, sizeof(buf), "%s/images/icon_right_arrow.png", + elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + + bt = elm_button_add(nf); + evas_object_smart_callback_add(bt, "clicked", _page5, nf); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_part_content_set(bt, "icon", ic); + + content = _content_new(nf, tdata->img4); + + it = elm_naviframe_item_push(nf, + "Page 4", + NULL, + bt, + content, + NULL); + + ic = elm_icon_add(nf); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", + elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_object_item_part_content_set(it, "icon", ic); + elm_naviframe_item_title_visible_set(it, EINA_FALSE); + evas_object_smart_callback_add(content, "clicked", _title_visible, it); +} + +void +_page3(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *bt, *bt2, *ic, *content, *nf = data; + char buf[PATH_MAX]; + Elm_Object_Item *it; + + bt = elm_button_add(nf); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(bt, "Prev"); + evas_object_smart_callback_add(bt, "clicked", _navi_pop, nf); + + bt2 = elm_button_add(nf); + evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_text_set(bt2, "Next"); + evas_object_smart_callback_add(bt2, "clicked", _page4, nf); + + content = _content_new(nf, tdata->img3); + + it = elm_naviframe_item_push(nf, + "Page 3", + bt, + bt2, + content, + NULL); + ic = elm_icon_add(nf); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + + elm_object_item_part_content_set(it, "icon", ic); +} + +void +_page2(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *bt, *content, *ic, *nf = data; + char buf[PATH_MAX]; + Elm_Object_Item *it; + + bt = elm_button_add(nf); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(bt, "clicked", _page3, nf); + + ic = elm_icon_add(nf); + snprintf(buf, sizeof(buf), "%s/images/icon_right_arrow.png", + elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + elm_object_part_content_set(bt, "icon", ic); + + content = _content_new(nf, tdata->img2); + + it = elm_naviframe_item_push(nf, "Page 2", NULL, bt, content, NULL); + elm_object_item_part_text_set(it, "subtitle", "Here is sub-title part!"); +} + + +TEST_START(test_naviframe) +{ + Evas_Object *bg, *nf, *btn, *content; + Elm_Object_Item *it; + char buf[1024]; + + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + tdata = malloc(sizeof(Test_Data)); + tdata->img1 = strdup(_get_str(buf, "images/logo.png")); + tdata->img2 = strdup(_get_str(buf, "images/plant_01.jpg")); + tdata->img3 = strdup(_get_str(buf, "images/rock_01.jpg")); + tdata->img4 = strdup(_get_str(buf, "images/rock_02.jpg")); + tdata->img5 = strdup(_get_str(buf, "images/sky_01.jpg")); + evas_object_smart_callback_add(win, "delete,request", _win_del, tdata); + + nf = elm_naviframe_add(win); + elm_win_resize_object_add(win, nf); + evas_object_size_hint_weight_set(nf, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(nf); + evas_object_smart_callback_add(nf, "title,clicked", _title_clicked, 0); + + btn = elm_button_add(nf); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_smart_callback_add(btn, "clicked", _page2, nf); + elm_object_text_set(btn, "Next"); + evas_object_show(btn); + + content = _content_new(nf, tdata->img1); + it = elm_naviframe_item_push(nf, "Page 1", NULL, btn, content, NULL); + evas_object_data_set(nf, "page1", it); + + evas_object_resize(win, 400, 600); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_notify.c b/src/bin/test_notify.c new file mode 100644 index 0000000..c32df04 --- /dev/null +++ b/src/bin/test_notify.c @@ -0,0 +1,295 @@ +#include +#include "tsuite.h" +static void +_bt(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *notify = data; + evas_object_show(notify); +} + +static void +_bt_close(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *notify = data; + evas_object_hide(notify); +} + +static void +_bt_timer_close(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *notify = data; + elm_notify_timeout_set(notify, 2.0); +} + +static void +_notify_timeout(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("Notify timed out!\n"); +} + +static void +_notify_block(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("Notify block area clicked!!\n"); +} + +TEST_START(test_notify) +{ + Evas_Object *bg, *bx, *tb, *notify, *bt, *lb; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + tb = elm_table_add(win); + elm_win_resize_object_add(win, tb); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(tb); + + notify = elm_notify_add(win); + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + bx = elm_box_add(win); + elm_object_content_set(notify, bx); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, "This position is the default."); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", _bt_close, notify); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Top"); + evas_object_smart_callback_add(bt, "clicked", _bt, notify); + elm_table_pack(tb, bt, 1, 0, 1, 1); + evas_object_show(bt); + + notify = elm_notify_add(win); + elm_notify_repeat_events_set(notify, EINA_FALSE); + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_notify_orient_set(notify, ELM_NOTIFY_ORIENT_BOTTOM); + elm_notify_timeout_set(notify, 5.0); + evas_object_smart_callback_add(notify, "timeout", _notify_timeout, NULL); + evas_object_smart_callback_add(notify, "block,clicked", _notify_block, NULL); + + bx = elm_box_add(win); + elm_object_content_set(notify, bx); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Bottom position. This notify use a timeout of 5 sec.
" + "The events outside the window are blocked."); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", _bt_close, notify); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Bottom"); + evas_object_smart_callback_add(bt, "clicked", _bt, notify); + elm_table_pack(tb, bt, 1, 2, 1, 1); + evas_object_show(bt); + + notify = elm_notify_add(win); + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_notify_orient_set(notify, ELM_NOTIFY_ORIENT_LEFT); + elm_notify_timeout_set(notify, 10.0); + evas_object_smart_callback_add(notify, "timeout", _notify_timeout, NULL); + + bx = elm_box_add(win); + elm_object_content_set(notify, bx); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Left position. This notify use a timeout of 10 sec."); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", _bt_close, notify); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Left"); + evas_object_smart_callback_add(bt, "clicked", _bt, notify); + elm_table_pack(tb, bt, 0, 1, 1, 1); + evas_object_show(bt); + + notify = elm_notify_add(win); + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_notify_orient_set(notify, ELM_NOTIFY_ORIENT_CENTER); + elm_notify_timeout_set(notify, 10.0); + evas_object_smart_callback_add(notify, "timeout", _notify_timeout, NULL); + + bx = elm_box_add(win); + elm_object_content_set(notify, bx); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Center position. This notify use a timeout of 10 sec."); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", _bt_close, notify); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Center"); + evas_object_smart_callback_add(bt, "clicked", _bt, notify); + elm_table_pack(tb, bt, 1, 1, 1, 1); + evas_object_show(bt); + + notify = elm_notify_add(win); + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_notify_orient_set(notify, ELM_NOTIFY_ORIENT_RIGHT); + + bx = elm_box_add(win); + elm_object_content_set(notify, bx); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Right position."); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", _bt_close, notify); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Right"); + evas_object_smart_callback_add(bt, "clicked", _bt, notify); + elm_table_pack(tb, bt, 2, 1, 1, 1); + evas_object_show(bt); + + notify = elm_notify_add(win); + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_notify_orient_set(notify, ELM_NOTIFY_ORIENT_TOP_LEFT); + + bx = elm_box_add(win); + elm_object_content_set(notify, bx); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Top Left position."); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", _bt_close, notify); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Top Left"); + evas_object_smart_callback_add(bt, "clicked", _bt, notify); + elm_table_pack(tb, bt, 0, 0, 1, 1); + evas_object_show(bt); + + notify = elm_notify_add(win); + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_notify_orient_set(notify, ELM_NOTIFY_ORIENT_TOP_RIGHT); + + bx = elm_box_add(win); + elm_object_content_set(notify, bx); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Top Right position."); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", _bt_close, notify); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Top Right"); + evas_object_smart_callback_add(bt, "clicked", _bt, notify); + elm_table_pack(tb, bt, 2, 0, 1, 1); + evas_object_show(bt); + + notify = elm_notify_add(win); + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_notify_orient_set(notify, ELM_NOTIFY_ORIENT_BOTTOM_LEFT); + + bx = elm_box_add(win); + elm_object_content_set(notify, bx); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Bottom Left position."); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", _bt_close, notify); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Bottom Left"); + evas_object_smart_callback_add(bt, "clicked", _bt, notify); + elm_table_pack(tb, bt, 0, 2, 1, 1); + evas_object_show(bt); + + notify = elm_notify_add(win); + evas_object_size_hint_weight_set(notify, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_notify_orient_set(notify, ELM_NOTIFY_ORIENT_BOTTOM_RIGHT); + + bx = elm_box_add(win); + elm_object_content_set(notify, bx); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, "Bottom Right position."); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close in 2s"); + evas_object_smart_callback_add(bt, "clicked", _bt_timer_close, notify); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Bottom Right"); + evas_object_smart_callback_add(bt, "clicked", _bt, notify); + elm_table_pack(tb, bt, 2, 2, 1, 1); + evas_object_show(bt); + + evas_object_show(win); + evas_object_resize(win, 300, 350); +} +TEST_END diff --git a/src/bin/test_pager.c b/src/bin/test_pager.c new file mode 100644 index 0000000..cf7c449 --- /dev/null +++ b/src/bin/test_pager.c @@ -0,0 +1,320 @@ +#include +#include "tsuite.h" +typedef struct _Pginfo Pginfo; + +struct _Pginfo +{ + Evas_Object *win, *pager, *pg1, *pg2, *pg3, *pg4; +}; + +static void +my_pager_1(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Pginfo *info = data; + elm_pager_content_promote(info->pager, info->pg2); +} + +static void +my_pager_2(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Pginfo *info = data; + elm_pager_content_promote(info->pager, info->pg3); +} + +static void +my_pager_3(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Pginfo *info = data; + elm_pager_content_promote(info->pager, info->pg4); +} + + +static void +my_pager_4(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Pginfo *info = data; + elm_pager_content_promote(info->pager, info->pg1); +} + + +static void +my_pager_pop(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Pginfo *info = data; + elm_pager_content_pop(info->pager); +} + +struct style_tuple { + const char *label; + const char *name; +}; +static const struct style_tuple styles[] = { + { "Default", "default"}, + { "Slide", "slide"}, + { "Slide Invisible", "slide_invisible"}, + { "Fade", "fade"}, + { "Fade Translucide", "fade_translucide"}, + { "Fade Invisible", "fade_invisible"}, + { "Flip", "flip"}, +}; + +static void +_style(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *pg = data; + elm_object_style_set(pg, styles[elm_radio_value_get(obj)].name); +} + +TEST_START(test_pager) +{ + Evas_Object *bg, *pg, *bx, *lb, *bt; + static Pginfo info; + + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + info.win = win; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + pg = elm_pager_add(win); + evas_object_size_hint_weight_set(pg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, pg); + evas_object_show(pg); + + info.pager = pg; + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "This is page 1 in a pager stack.
" + "
" + "So what is a pager stack? It is a stack
" + "of pages that hold widgets in it. The
" + "pages can be pushed and popped on and
" + "off the stack, activated and otherwise
" + "activated if already in the stack
" + "(activated means promoted to the top of
" + "the stack).
" + "
" + "The theme may define the animation how
" + "show and hide of pages. Select one theme style:"); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + unsigned int i = 0; + Evas_Object *rdg = NULL, *rd; + for (i = 0; i < (sizeof(styles) / sizeof(struct style_tuple)); i++) + { + rd = elm_radio_add(win); + elm_object_text_set(rd, styles[i].label); + elm_radio_state_value_set(rd, i); + if (rdg) + elm_radio_group_add(rd, rdg); + else + rdg = rd; + evas_object_smart_callback_add(rd, "changed", _style, pg); + elm_box_pack_end(bx, rd); + evas_object_show(rd); + } + elm_radio_value_set(rd, 0); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Flip to 2"); + evas_object_smart_callback_add(bt, "clicked", my_pager_1, &info); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Popme"); + evas_object_smart_callback_add(bt, "clicked", my_pager_pop, &info); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + elm_pager_content_push(pg, bx); + info.pg1 = bx; + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "This is page 2 in a pager stack.
" + "
" + "This is just like the previous page in
" + "the pager stack." + ); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Flip to 3"); + evas_object_smart_callback_add(bt, "clicked", my_pager_2, &info); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Popme"); + evas_object_smart_callback_add(bt, "clicked", my_pager_pop, &info); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + elm_pager_content_push(pg, bx); + info.pg2 = bx; + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "This is page 3 in a pager stack.
" + "
" + "This is just like the previous page in
" + "the pager stack."); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Flip to 1"); + evas_object_smart_callback_add(bt, "clicked", my_pager_3, &info); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Popme"); + evas_object_smart_callback_add(bt, "clicked", my_pager_pop, &info); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + elm_pager_content_push(pg, bx); + info.pg3 = bx; + + Evas_Object *ly, *ly2; + char buf[4096]; + + ly = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly, buf, "test/layout"); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(ly); + + ly2 = elm_layout_add(win); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(ly2, buf, "layout2"); + evas_object_size_hint_weight_set(ly2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + //elm_win_resize_object_add(win, ly2); + evas_object_show(ly2); + + + + + bt = elm_button_add(win); + elm_object_text_set(bt, "Flip to 1"); + evas_object_smart_callback_add(bt, "clicked", my_pager_4, &info); + elm_object_part_content_set(ly2, "element1", bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Popme"); + evas_object_smart_callback_add(bt, "clicked", my_pager_pop, &info); + evas_object_show(bt); + elm_object_part_content_set(ly2, "element2", bt); + + elm_object_part_content_set(ly, "swallow", ly2); + evas_object_show(ly); + + elm_pager_content_push(pg, ly); + info.pg4 = ly2; + + + evas_object_show(win); +} +TEST_END + +static void +my_pager_push(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Pginfo *info = data; + Evas_Object *bx, *bt, *lb; + static int count = 2; + char buf[32]; + + bx = elm_box_add(info->win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx); + + lb = elm_label_add(info->win); + snprintf(buf, sizeof(buf), "This is page %d in the slide pager

", count++); + elm_object_text_set(lb, buf); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(info->win); + elm_object_text_set(bt, "Push a new page"); + evas_object_smart_callback_add(bt, "clicked", my_pager_push, info); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(info->win); + elm_object_text_set(bt, "Go back (pop)"); + evas_object_smart_callback_add(bt, "clicked", my_pager_pop, info); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + elm_pager_content_push(info->pager, bx); +} + +TEST_START(test_pager_slide) +{ + Evas_Object *bg, *pg, *bx, *lb, *bt; + static Pginfo info; + + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + info.win = win; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + pg = elm_pager_add(win); + elm_win_resize_object_add(win, pg); + elm_object_style_set(pg, "slide"); + evas_object_show(pg); + info.pager = pg; + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx); + + lb = elm_label_add(win); + elm_object_text_set(lb, + "This is page 1 in a slide pager.
" + "
" + "The slide pager style is useful for browsing
" + "a hierarchy of objects, as it makes clear
" + "the direction of the browse.
" + "This is the 'slide' style, also available
" + "a fully transparent style named 'slide_invisble'.
" + "
"); + elm_box_pack_end(bx, lb); + evas_object_show(lb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Push a new page"); + evas_object_smart_callback_add(bt, "clicked", my_pager_push, &info); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Go back (pop)"); + evas_object_smart_callback_add(bt, "clicked", my_pager_pop, &info); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + elm_pager_content_push(pg, bx); + + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_panel.c b/src/bin/test_panel.c new file mode 100644 index 0000000..03e276b --- /dev/null +++ b/src/bin/test_panel.c @@ -0,0 +1,253 @@ +#include +#include "tsuite.h" +static Elm_Genlist_Item_Class itc; + +static void _bstatus(void *data, Evas_Object *obj, void *event_info); +static void _tstatus(void *data, Evas_Object *obj, void *event_info); +static char *_text_get(void *data, Evas_Object *obj, const char *source); +static Evas_Object *_content_get(void *data, Evas_Object *obj, const char *source); +static Eina_Bool _state_get(void *data, Evas_Object *obj, const char *source); +static void _item_del(void *data, Evas_Object *obj); +static void _fill_list(Evas_Object *obj); +static Eina_Bool _dir_has_subs(const char *path); + +static void +_tstatus(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Elm_Object_Item *tb_it; + const char *status; + + if (elm_panel_hidden_get((Evas_Object*)data)) + status = "hidden"; + else + status = "shown"; + printf("The top panel is currently %s\n", status); + tb_it = elm_toolbar_selected_item_get(obj); + elm_toolbar_item_selected_set(tb_it, EINA_FALSE); +} + +static void +_bstatus(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Elm_Object_Item *tb_it; + const char *status; + + if (elm_panel_hidden_get((Evas_Object*)data)) + status = "hidden"; + else + status = "shown"; + printf("The bottom panel is currently %s\n", status); + tb_it = elm_toolbar_selected_item_get(obj); + elm_toolbar_item_selected_set(tb_it, EINA_FALSE); +} + +static char * +_text_get(void *data, Evas_Object *obj __UNUSED__, const char *source __UNUSED__) +{ + return strdup(ecore_file_file_get(data)); +} + +static Evas_Object * +_content_get(void *data, Evas_Object *obj, const char *source) +{ + if (!strcmp(source, "elm.swallow.icon")) + { + Evas_Object *ic; + + ic = elm_icon_add(obj); + if (ecore_file_is_dir((char *)data)) + elm_icon_standard_set(ic, "folder"); + else + elm_icon_standard_set(ic, "file"); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + evas_object_show(ic); + return ic; + } + return NULL; +} + +static Eina_Bool +_state_get(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *source __UNUSED__) +{ + return EINA_FALSE; +} + +static void +_item_del(void *data, Evas_Object *obj __UNUSED__) +{ + eina_stringshare_del(data); +} + +static void +_fill_list(Evas_Object *obj) +{ + DIR *d; + struct dirent *de; + Eina_List *dirs = NULL, *l; + char *real; + + if (!(d = opendir(getenv("HOME")))) return; + while ((de = readdir(d))) + { + char buff[PATH_MAX]; + + if (de->d_name[0] == '.') continue; + snprintf(buff, sizeof(buff), "%s/%s", getenv("HOME"), de->d_name); + if (!ecore_file_is_dir(buff)) continue; + real = ecore_file_realpath(buff); + dirs = eina_list_append(dirs, real); + } + closedir(d); + + dirs = eina_list_sort(dirs, eina_list_count(dirs), EINA_COMPARE_CB(strcoll)); + + EINA_LIST_FOREACH(dirs, l, real) + { + Eina_Bool result = EINA_FALSE; + + result = _dir_has_subs(real); + if (!result) + elm_genlist_item_append(obj, &itc, eina_stringshare_add(real), + NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + else + elm_genlist_item_append(obj, &itc, eina_stringshare_add(real), + NULL, ELM_GENLIST_ITEM_SUBITEMS, + NULL, NULL); + free(real); + } + eina_list_free(dirs); +} + +static Eina_Bool +_dir_has_subs(const char *path) +{ + DIR *d; + struct dirent *de; + Eina_Bool result = EINA_FALSE; + + if (!path) return result; + if (!(d = opendir(path))) return result; + while ((de = readdir(d))) + { + char buff[PATH_MAX]; + + if (de->d_name[0] == '.') continue; + snprintf(buff, sizeof(buff), "%s/%s", path, de->d_name); + if (ecore_file_is_dir(buff)) + { + result = EINA_TRUE; + break; + } + } + closedir(d); + return result; +} + +TEST_START(test_panel) +{ + Evas_Object *bg, *panel, *bx, *vbx, *toolbar; + Evas_Object *list; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + vbx = elm_box_add(win); + elm_win_resize_object_add(win, vbx); + evas_object_size_hint_weight_set(vbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(vbx, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(vbx); + + bx = elm_box_add(win); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(bx); + + panel = elm_panel_add(win); + elm_panel_orient_set(panel, ELM_PANEL_ORIENT_TOP); + evas_object_size_hint_weight_set(panel, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(panel, EVAS_HINT_FILL, EVAS_HINT_FILL); + + toolbar = elm_toolbar_add(win); + elm_toolbar_homogeneous_set(toolbar, 0); + elm_toolbar_mode_shrink_set(toolbar, ELM_TOOLBAR_SHRINK_NONE); + evas_object_size_hint_weight_set(toolbar, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(toolbar, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(toolbar); + + elm_toolbar_item_append(toolbar, "home", "Hello", _tstatus, panel); + + elm_object_content_set(panel, toolbar); + elm_box_pack_end(vbx, panel); + evas_object_show(panel); + + panel = elm_panel_add(win); + elm_panel_orient_set(panel, ELM_PANEL_ORIENT_LEFT); + evas_object_size_hint_weight_set(panel, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(panel, 0, EVAS_HINT_FILL); + + itc.item_style = "default"; + itc.func.text_get = _text_get; + itc.func.content_get = _content_get; + itc.func.state_get = _state_get; + itc.func.del = _item_del; + + list = elm_genlist_add(win); + evas_object_size_hint_min_set(list, 100, -1); + evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(list); + + elm_object_content_set(panel, list); + + elm_box_pack_end(bx, panel); + evas_object_show(panel); + + _fill_list(list); + + panel = elm_panel_add(win); + elm_panel_orient_set(panel, ELM_PANEL_ORIENT_RIGHT); + evas_object_size_hint_weight_set(panel, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(panel, 1, EVAS_HINT_FILL); + elm_panel_hidden_set(panel, EINA_TRUE); + + list = elm_genlist_add(win); + evas_object_size_hint_min_set(list, 100, -1); + evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(list); + + elm_object_content_set(panel, list); + + elm_box_pack_end(bx, panel); + evas_object_show(panel); + + _fill_list(list); + + elm_box_pack_end(vbx, bx); + + panel = elm_panel_add(win); + elm_panel_orient_set(panel, ELM_PANEL_ORIENT_BOTTOM); + evas_object_size_hint_weight_set(panel, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(panel, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_panel_hidden_set(panel, EINA_TRUE); + + toolbar = elm_toolbar_add(win); + elm_toolbar_homogeneous_set(toolbar, 0); + elm_toolbar_mode_shrink_set(toolbar, ELM_TOOLBAR_SHRINK_NONE); + evas_object_size_hint_weight_set(toolbar, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(toolbar, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(toolbar); + + elm_toolbar_item_append(toolbar, "home", "Hello", _bstatus, panel); + + elm_object_content_set(panel, toolbar); + elm_box_pack_end(vbx, panel); + evas_object_show(panel); + + evas_object_resize(win, 320, 400); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_panes.c b/src/bin/test_panes.c new file mode 100644 index 0000000..2bf6c13 --- /dev/null +++ b/src/bin/test_panes.c @@ -0,0 +1,107 @@ +#include +#include "tsuite.h" +static double size = 0.0; + +static void +_press(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("press\n"); +} + +static void +_unpress(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + printf("unpress, size : %f\n", elm_panes_content_left_size_get(obj)); +} + +static void +_clicked(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("clicked\n"); +} + + +static void +_clicked_double(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + printf("clicked double\n"); + if(elm_panes_content_left_size_get(obj) > 0) + { + size = elm_panes_content_left_size_get(obj); + elm_panes_content_left_size_set(obj, 0.0); + } + else + elm_panes_content_left_size_set(obj, size); +} + + +TEST_START(test_panes) +{ + Evas_Object *bg, *panes, *panes_h, *bt; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + evas_object_show(bg); + + panes = elm_panes_add(win); + elm_win_resize_object_add(win, panes); + evas_object_size_hint_weight_set(panes, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(panes, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(panes); + + evas_object_smart_callback_add(panes, "clicked", _clicked, panes); + evas_object_smart_callback_add(panes, "clicked,double", _clicked_double, panes); + + evas_object_smart_callback_add(panes, "press", _press, panes); + evas_object_smart_callback_add(panes, "unpress", _unpress, panes); + + + // + bt = elm_button_add(win); + elm_object_text_set(bt, "Left"); + evas_object_size_hint_weight_set(bt, 1.0, 1.0); + evas_object_size_hint_align_set(bt, -1.0, -1.0); + evas_object_show(bt); + elm_object_part_content_set(panes, "left", bt); + // + + // + panes_h = elm_panes_add(win); + elm_panes_horizontal_set(panes_h, EINA_TRUE); + evas_object_size_hint_weight_set(panes_h, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(panes_h, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(panes_h); + + evas_object_smart_callback_add(panes_h, "clicked", _clicked, panes_h); + evas_object_smart_callback_add(panes_h, "clicked,double", _clicked_double, panes_h); + + evas_object_smart_callback_add(panes_h, "press", _press, panes_h); + evas_object_smart_callback_add(panes_h, "unpress", _unpress, panes_h); + elm_object_part_content_set(panes, "right", panes_h); + // + + // + bt = elm_button_add(win); + elm_object_text_set(bt, "Up"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(bt); + elm_object_part_content_set(panes_h, "left", bt); + // + + // + bt = elm_button_add(win); + elm_object_text_set(bt, "Down"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(bt); + elm_object_part_content_set(panes_h, "right", bt); + // + + + evas_object_resize(win, 320, 400); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_photo.c b/src/bin/test_photo.c new file mode 100644 index 0000000..3aab8ce --- /dev/null +++ b/src/bin/test_photo.c @@ -0,0 +1,100 @@ +#include +#include "tsuite.h" +static void drop_cb(void *mydata, Evas_Object *obj, void *evdata); +static void drag_stop_cb(void *mydata, Evas_Object *obj, void *evdata); +static void drag_start_cb(void *mydata, Evas_Object *obj, void *evdata); + +TEST_START(test_photo) +{ + Evas_Object *bg, *sc, *tb, *ph; + int i, j, n; + char buf[PATH_MAX]; + const char *img[9] = + { + "panel_01.jpg", + "mystrale.jpg", + "mystrale_2.jpg", + "rock_02.jpg", + "sky_01.jpg", + "sky_02.jpg", + "sky_03.jpg", + "sky_04.jpg", + "wood_01.jpg" + }; + elm_need_ethumb(); + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + n = 0; + for (j = 0; j < 12; j++) + { + for (i = 0; i < 12; i++) + { + ph = elm_photo_add(win); + snprintf(buf, sizeof(buf), "%s/images/%s", + elm_app_data_dir_get(), img[n]); + n++; + if (n >= 9) n = 0; + elm_photo_size_set(ph, 80); + if (n == 8) + elm_photo_thumb_set(ph, buf, NULL); + else + elm_photo_file_set(ph, buf); + elm_photo_editable_set(ph, 1); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_smart_callback_add(ph, "drop", + drop_cb, NULL); + evas_object_smart_callback_add(ph, "drag,start", + drag_start_cb, NULL); + evas_object_smart_callback_add(ph, "drag,stop", + drag_stop_cb, NULL); + + if ((n == 2) || (n == 3)) + { + elm_photo_fill_inside_set(ph, EINA_TRUE); + elm_object_style_set(ph, "shadow"); + } + elm_table_pack(tb, ph, i, j, 1, 1); + evas_object_show(ph); + } + } + + sc = elm_scroller_add(win); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, sc); + + elm_object_content_set(sc, tb); + evas_object_show(tb); + evas_object_show(sc); + + evas_object_resize(win, 300, 300); + evas_object_show(win); +} +TEST_END + +/* Never called, elm_photo never call "drop" smart cb */ +static void +drop_cb(void *mydata __UNUSED__, Evas_Object *obj, void *evdata __UNUSED__){ + printf("Drop on obj %p\n", obj); +} + +static void +drag_start_cb(void *mydata __UNUSED__, Evas_Object *obj __UNUSED__, void *evdata __UNUSED__){ + +} + +static void +drag_stop_cb(void *mydata __UNUSED__, Evas_Object *obj __UNUSED__, void *evdata __UNUSED__){ + +} + +/* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/ diff --git a/src/bin/test_photocam.c b/src/bin/test_photocam.c new file mode 100644 index 0000000..6acc11a --- /dev/null +++ b/src/bin/test_photocam.c @@ -0,0 +1,333 @@ +#include +#include "tsuite.h" +static Evas_Object *rect; + +static void +my_ph_clicked(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("clicked\n"); +} + +static void +my_ph_press(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("press\n"); +} + +static void +my_ph_longpressed(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("longpressed\n"); +} + +static void +my_ph_clicked_double(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("clicked,double\n"); +} + +static void +my_ph_load(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("load\n"); +} + +static void +my_ph_loaded(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("loaded\n"); +} + +static void +my_ph_load_details(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("load,details\n"); +} + +static void +my_ph_loaded_details(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("loaded,details\n"); +} + +static void +my_ph_zoom_start(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("zoom,start\n"); +} + +static void +my_ph_zoom_stop(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("zoom,stop\n"); +} + +static void +my_ph_zoom_change(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("zoom,change\n"); +} + +static void +my_ph_anim_start(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("anim,start\n"); +} + +static void +my_ph_anim_stop(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("anim,stop\n"); +} + +static void +my_ph_drag_start(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("drag,start\n"); +} + +static void +my_ph_drag_stop(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + printf("drag_stop\n"); +} + +static void +my_ph_scroll(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + int x, y, w, h; + elm_photocam_region_get(obj, &x, &y, &w, &h); + printf("scroll %i %i %ix%i\n", x, y, w, h); +} + +static void +my_bt_open(void *data, Evas_Object *obj __UNUSED__, void *event_info) +{ + Evas_Object *ph = data; + const char *file = event_info; + + if (file) + elm_photocam_file_set(ph, file); +} + +static void +my_bt_show_reg(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_photocam_image_region_show(data, 30, 50, 500, 300); +} + +static void +my_bt_bring_reg(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) + +{ + elm_photocam_image_region_bring_in(data, 800, 300, 500, 300); +} + +static void +my_bt_zoom_in(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + double zoom; + + zoom = elm_photocam_zoom_get(data); + zoom -= 0.5; + elm_photocam_zoom_mode_set(data, ELM_PHOTOCAM_ZOOM_MODE_MANUAL); + if (zoom >= (1.0 / 32.0)) elm_photocam_zoom_set(data, zoom); +} + +static void +my_bt_zoom_out(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + double zoom; + + zoom = elm_photocam_zoom_get(data); + zoom += 0.5; + elm_photocam_zoom_mode_set(data, ELM_PHOTOCAM_ZOOM_MODE_MANUAL); + if (zoom <= 256.0) elm_photocam_zoom_set(data, zoom); +} + +static void +my_bt_pause(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_photocam_paused_set(data, !elm_photocam_paused_get(data)); +} + +static void +my_bt_zoom_fit(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_photocam_zoom_mode_set(data, ELM_PHOTOCAM_ZOOM_MODE_AUTO_FIT); +} + +static void +my_bt_zoom_fill(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_photocam_zoom_mode_set(data, ELM_PHOTOCAM_ZOOM_MODE_AUTO_FILL); +} + +static void +_photocam_mouse_wheel_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Evas_Object *photocam = data; + Evas_Event_Mouse_Wheel *ev = (Evas_Event_Mouse_Wheel*) event_info; + int zoom; + double val; + //unset the mouse wheel + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; + + zoom = elm_photocam_zoom_get(photocam); + if ((ev->z>0) && (zoom == 1)) return; + + if (ev->z > 0) + zoom /= 2; + else + zoom *= 2; + + val = 1; + int _zoom = zoom; + while(_zoom>1) + { + _zoom /= 2; + val++; + } + + elm_photocam_zoom_mode_set(photocam, ELM_PHOTOCAM_ZOOM_MODE_MANUAL); + if (zoom >= 1) elm_photocam_zoom_set(photocam, zoom); +} + +static void +_photocam_move_resize_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + int x,y,w,h; + + evas_object_geometry_get(data,&x,&y,&w,&h); + evas_object_resize(rect,w,h); + evas_object_move(rect,x,y); +} + +TEST_START(test_photocam) +{ + Evas_Object *bg, *ph, *tb2, *bt; + // these were just testing - use the "select photo" browser to select one + const char *img[5] = + { + "/home/raster/t1.jpg", // 5 mpixel + "/home/raster/t2.jpg", // 18 mpixel + "/home/raster/t3.jpg", // 39 mpixel + "/home/raster/t4.jpg", // 192 mpixel + "/home/raster/t5.jpg" // 466 mpixel + }; + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + ph = elm_photocam_add(win); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, ph); + evas_object_data_set(ph, "window", win); + + rect = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_color_set(rect, 0, 0, 0, 0); + evas_object_repeat_events_set(rect,1); + evas_object_show(rect); + evas_object_event_callback_add(rect, EVAS_CALLBACK_MOUSE_WHEEL, _photocam_mouse_wheel_cb, ph); + evas_object_raise(rect); + + evas_object_event_callback_add(ph, EVAS_CALLBACK_RESIZE, _photocam_move_resize_cb, ph); + evas_object_event_callback_add(ph, EVAS_CALLBACK_MOVE, _photocam_move_resize_cb, ph); + + evas_object_smart_callback_add(ph, "clicked", my_ph_clicked, win); + evas_object_smart_callback_add(ph, "press", my_ph_press, win); + evas_object_smart_callback_add(ph, "longpressed", my_ph_longpressed, win); + evas_object_smart_callback_add(ph, "clicked,double", my_ph_clicked_double, win); + evas_object_smart_callback_add(ph, "load", my_ph_load, win); + evas_object_smart_callback_add(ph, "loaded", my_ph_loaded, win); + evas_object_smart_callback_add(ph, "load,details", my_ph_load_details, win); + evas_object_smart_callback_add(ph, "loaded,details", my_ph_loaded_details, win); + evas_object_smart_callback_add(ph, "zoom,start", my_ph_zoom_start, win); + evas_object_smart_callback_add(ph, "zoom,stop", my_ph_zoom_stop, win); + evas_object_smart_callback_add(ph, "zoom,change", my_ph_zoom_change, win); + evas_object_smart_callback_add(ph, "scroll,anim,start", my_ph_anim_start, win); + evas_object_smart_callback_add(ph, "scroll,anim,stop", my_ph_anim_stop, win); + evas_object_smart_callback_add(ph, "scroll,drag,start", my_ph_drag_start, win); + evas_object_smart_callback_add(ph, "scroll,drag,stop", my_ph_drag_stop, win); + evas_object_smart_callback_add(ph, "scroll", my_ph_scroll, win); + + elm_photocam_file_set(ph, img[1]); + + evas_object_show(ph); + + tb2 = elm_table_add(win); + evas_object_size_hint_weight_set(tb2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, tb2); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Z -"); + evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_out, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.1, 0.1); + elm_table_pack(tb2, bt, 0, 0, 1, 1); + evas_object_show(bt); + + bt = elm_fileselector_button_add(win); + elm_object_text_set(bt, "Select Photo"); + evas_object_smart_callback_add(bt, "file,chosen", my_bt_open, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.5, 0.1); + elm_table_pack(tb2, bt, 1, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Z +"); + evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_in, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.9, 0.1); + elm_table_pack(tb2, bt, 2, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Show 30,50 500x300"); + evas_object_smart_callback_add(bt, "clicked", my_bt_show_reg, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.1, 0.5); + elm_table_pack(tb2, bt, 0, 1, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Bring 800,300 500x300"); + evas_object_smart_callback_add(bt, "clicked", my_bt_bring_reg, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.9, 0.5); + elm_table_pack(tb2, bt, 2, 1, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Pause On/Off"); + evas_object_smart_callback_add(bt, "clicked", my_bt_pause, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.1, 0.9); + elm_table_pack(tb2, bt, 0, 2, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Fit"); + evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_fit, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.5, 0.9); + elm_table_pack(tb2, bt, 1, 2, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Fill"); + evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_fill, ph); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.9, 0.9); + elm_table_pack(tb2, bt, 2, 2, 1, 1); + evas_object_show(bt); + + evas_object_show(tb2); + + evas_object_resize(win, 800, 800); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_progressbar.c b/src/bin/test_progressbar.c new file mode 100644 index 0000000..001039b --- /dev/null +++ b/src/bin/test_progressbar.c @@ -0,0 +1,199 @@ +#include +#include "tsuite.h" +typedef struct Progressbar +{ + Evas_Object *pb1; + Evas_Object *pb2; + Evas_Object *pb3; + Evas_Object *pb4; + Evas_Object *pb5; + Evas_Object *pb6; + Evas_Object *pb7; + Eina_Bool run; + Ecore_Timer *timer; +} Progressbar; + +static Progressbar _test_progressbar; + +static Eina_Bool +_my_progressbar_value_set (void *data __UNUSED__) +{ + double progress; + + progress = elm_progressbar_value_get (_test_progressbar.pb1); + if (progress < 1.0) progress += 0.0123; + else progress = 0.0; + elm_progressbar_value_set(_test_progressbar.pb1, progress); + elm_progressbar_value_set(_test_progressbar.pb4, progress); + elm_progressbar_value_set(_test_progressbar.pb3, progress); + elm_progressbar_value_set(_test_progressbar.pb6, progress); + if (progress < 1.0) return ECORE_CALLBACK_RENEW; + _test_progressbar.run = 0; + return ECORE_CALLBACK_CANCEL; +} + +static void +my_progressbar_test_start(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_progressbar_pulse(_test_progressbar.pb2, EINA_TRUE); + elm_progressbar_pulse(_test_progressbar.pb5, EINA_TRUE); + elm_progressbar_pulse(_test_progressbar.pb7, EINA_TRUE); + if (!_test_progressbar.run) + { + _test_progressbar.timer = ecore_timer_add(0.1, _my_progressbar_value_set, NULL); + _test_progressbar.run = EINA_TRUE; + } +} + +static void +my_progressbar_test_stop(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_progressbar_pulse(_test_progressbar.pb2, EINA_FALSE); + elm_progressbar_pulse(_test_progressbar.pb5, EINA_FALSE); + elm_progressbar_pulse(_test_progressbar.pb7, EINA_FALSE); + if (_test_progressbar.run) + { + ecore_timer_del(_test_progressbar.timer); + _test_progressbar.run = EINA_FALSE; + } +} + +static void +my_progressbar_destroy(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + my_progressbar_test_stop(NULL, NULL, NULL); + evas_object_del(obj); +} + +TEST_START(test_progressbar) +{ + Evas_Object *bg, *pb, *bx, *hbx, *bt, *bt_bx, *ic1, *ic2; + char buf[PATH_MAX]; + + evas_object_smart_callback_add(win, "delete,request", + my_progressbar_destroy, NULL); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + elm_win_resize_object_add(win, bx); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx); + + pb = elm_progressbar_add(win); + evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, pb); +// elm_progressbar_horizontal_set(pb, EINA_TRUE); +// elm_object_text_set(pb, "Progression %"); +// elm_progressbar_unit_format_set(pb, NULL); + evas_object_show(pb); + _test_progressbar.pb1 = pb; + + pb = elm_progressbar_add(win); + evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(pb, "Infinite bounce"); + elm_progressbar_pulse_set(pb, EINA_TRUE); + elm_box_pack_end(bx, pb); + evas_object_show(pb); + _test_progressbar.pb2 = pb; + + ic1 = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic1, buf, NULL); + evas_object_size_hint_aspect_set(ic1, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + + pb = elm_progressbar_add(win); + elm_object_text_set(pb, "Label"); + elm_object_content_set(pb, ic1); + elm_progressbar_inverted_set(pb, 1); + elm_progressbar_unit_format_set(pb, "%1.1f units"); + elm_progressbar_span_size_set(pb, 200); + evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, pb); + evas_object_show(ic1); + evas_object_show(pb); + _test_progressbar.pb3 = pb; + + hbx = elm_box_add(win); + elm_box_horizontal_set(hbx, EINA_TRUE); + evas_object_size_hint_weight_set(hbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(hbx, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, hbx); + evas_object_show(hbx); + + pb = elm_progressbar_add(win); + elm_progressbar_horizontal_set(pb, EINA_FALSE); + evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(hbx, pb); + elm_progressbar_span_size_set(pb, 60); + elm_object_text_set(pb, "percent"); + evas_object_show(pb); + _test_progressbar.pb4 = pb; + + pb = elm_progressbar_add(win); + elm_progressbar_horizontal_set(pb, EINA_FALSE); + evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_progressbar_span_size_set(pb, 80); + elm_progressbar_pulse_set(pb, EINA_TRUE); + elm_progressbar_unit_format_set(pb, NULL); + elm_object_text_set(pb, "Infinite bounce"); + elm_box_pack_end(hbx, pb); + evas_object_show(pb); + _test_progressbar.pb5 = pb; + + ic2 = elm_icon_add(win); + elm_icon_file_set(ic2, buf, NULL); + evas_object_size_hint_aspect_set(ic2, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1); + + pb = elm_progressbar_add(win); + elm_progressbar_horizontal_set(pb, EINA_FALSE); + elm_object_text_set(pb, "Label"); + elm_object_content_set(pb, ic2); + elm_progressbar_inverted_set(pb, 1); + elm_progressbar_unit_format_set(pb, "%1.2f%%"); + elm_progressbar_span_size_set(pb, 200); + evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(hbx, pb); + evas_object_show(ic2); + evas_object_show(pb); + _test_progressbar.pb6 = pb; + + pb = elm_progressbar_add(win); + elm_object_style_set(pb, "wheel"); + elm_object_text_set(pb, "Style: wheel"); + evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, pb); + evas_object_show(pb); + _test_progressbar.pb7 = pb; + + bt_bx = elm_box_add(win); + elm_box_horizontal_set(bt_bx, EINA_TRUE); + evas_object_size_hint_weight_set(bt_bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, bt_bx); + evas_object_show(bt_bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Start"); + evas_object_smart_callback_add(bt, "clicked", my_progressbar_test_start, NULL); + elm_box_pack_end(bt_bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Stop"); + evas_object_smart_callback_add(bt, "clicked", my_progressbar_test_stop, NULL); + elm_box_pack_end(bt_bx, bt); + evas_object_show(bt); + + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_radio.c b/src/bin/test_radio.c new file mode 100644 index 0000000..c103bdf --- /dev/null +++ b/src/bin/test_radio.c @@ -0,0 +1,94 @@ +#include +#include "tsuite.h" +TEST_START(test_radio) +{ + Evas_Object *bg, *bx, *ic, *rd, *rdg; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, 0); + evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(rd, EVAS_HINT_FILL, 0.5); + elm_object_text_set(rd, "Icon sized to radio"); + elm_object_content_set(rd, ic); + elm_box_pack_end(bx, rd); + evas_object_show(rd); + evas_object_show(ic); + rdg = rd; + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, 1); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "Icon no scale"); + elm_object_content_set(rd, ic); + elm_box_pack_end(bx, rd); + evas_object_show(rd); + evas_object_show(ic); + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, 2); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "Label Only"); + elm_box_pack_end(bx, rd); + evas_object_show(rd); + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, 3); + elm_radio_group_add(rd, rdg); + elm_object_text_set(rd, "Disabled"); + elm_object_disabled_set(rd, 1); + elm_box_pack_end(bx, rd); + evas_object_show(rd); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, 4); + elm_radio_group_add(rd, rdg); + elm_object_content_set(rd, ic); + elm_box_pack_end(bx, rd); + evas_object_show(rd); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + + rd = elm_radio_add(win); + elm_radio_state_value_set(rd, 5); + elm_radio_group_add(rd, rdg); + elm_object_content_set(rd, ic); + elm_object_disabled_set(rd, 1); + elm_box_pack_end(bx, rd); + evas_object_show(rd); + evas_object_show(ic); + + elm_radio_value_set(rdg, 2); + + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_scaling.c b/src/bin/test_scaling.c new file mode 100644 index 0000000..0218a34 --- /dev/null +++ b/src/bin/test_scaling.c @@ -0,0 +1,114 @@ +#include +#include "tsuite.h" +TEST_START(test_scaling) +{ + Evas_Object *bg, *bx, *bt; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Scale: 0.5"); + elm_object_scale_set(bt, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Scale: 0.75"); + elm_object_scale_set(bt, 0.75); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Scale: 1.0"); + elm_object_scale_set(bt, 1.0); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Scale: 1.5"); + elm_object_scale_set(bt, 1.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Scale: 2.0"); + elm_object_scale_set(bt, 2.0); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Scale: 3.0"); + elm_object_scale_set(bt, 3.0); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} +TEST_END + +TEST_START(test_scaling2) +{ + Evas_Object *bg, *bx, *fr, *lb; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + fr = elm_frame_add(win); + elm_object_scale_set(fr, 0.5); + elm_object_text_set(fr, "Scale: 0.5"); + lb = elm_label_add(win); + elm_object_text_set(lb, + "Parent frame scale
" + "is 0.5. Child should
" + "inherit it."); + elm_object_content_set(fr, lb); + evas_object_show(lb); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + fr = elm_frame_add(win); + elm_object_text_set(fr, "Scale: 1.0"); + lb = elm_label_add(win); + elm_object_text_set(lb, + "Parent frame scale
" + "is 1.0. Child should
" + "inherit it."); + elm_object_content_set(fr, lb); + evas_object_show(lb); + elm_object_scale_set(fr, 1.0); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + fr = elm_frame_add(win); + elm_object_text_set(fr, "Scale: 2.0"); + lb = elm_label_add(win); + elm_object_text_set(lb, + "Parent frame scale
" + "is 2.0. Child should
" + "inherit it."); + elm_object_content_set(fr, lb); + evas_object_show(lb); + elm_object_scale_set(fr, 2.0); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_scroller.c b/src/bin/test_scroller.c new file mode 100644 index 0000000..32ccb5d --- /dev/null +++ b/src/bin/test_scroller.c @@ -0,0 +1,260 @@ +#include +#include "tsuite.h" + +void +my_bt_go_300_300(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_scroller_region_bring_in((Evas_Object *)data, 300, 300, 318, 318); +} + +void +my_bt_go_900_300(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_scroller_region_bring_in((Evas_Object *)data, 900, 300, 318, 318); +} + +void +my_bt_go_300_900(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_scroller_region_bring_in((Evas_Object *)data, 300, 900, 318, 318); +} + +void +my_bt_go_900_900(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_scroller_region_bring_in((Evas_Object *)data, 900, 900, 318, 318); +} + +TEST_START(test_scroller) +{ +/******* HOW TO TEST ******************* + Do NOT Exit test window while testing + This causes scroller to get redundent + event that breaks this test. +******** HOW TO TEST ******************/ + Evas_Object *bg2, *tb, *tb2, *bg, *sc, *bt; + int i, j, n; + char buf[PATH_MAX]; + const char *img[9] = + { + "panel_01.jpg", + "plant_01.jpg", + "rock_01.jpg", + "rock_02.jpg", + "sky_01.jpg", + "sky_02.jpg", + "sky_03.jpg", + "sky_04.jpg", + "wood_01.jpg" + }; + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + n = 0; + for (j = 0; j < 12; j++) + { + for (i = 0; i < 12; i++) + { + bg2 = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/%s", + elm_app_data_dir_get(), img[n]); + n++; + if (n >= 9) n = 0; + elm_bg_file_set(bg2, buf, NULL); + evas_object_size_hint_weight_set(bg2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bg2, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_min_set(bg2, 318, 318); + elm_table_pack(tb, bg2, i, j, 1, 1); + evas_object_show(bg2); + } + } + + sc = elm_scroller_add(win); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, sc); + + elm_object_content_set(sc, tb); + evas_object_show(tb); + + elm_scroller_page_relative_set(sc, 1.0, 1.0); +// elm_scroller_page_size_set(sc, 200, 200); + evas_object_show(sc); + + tb2 = elm_table_add(win); + evas_object_size_hint_weight_set(tb2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, tb2); + + bt = elm_button_add(win); + elm_object_text_set(bt, "to 300 300"); + evas_object_smart_callback_add(bt, "clicked", my_bt_go_300_300, sc); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.1, 0.1); + elm_table_pack(tb2, bt, 0, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "to 900 300"); + evas_object_smart_callback_add(bt, "clicked", my_bt_go_900_300, sc); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.9, 0.1); + elm_table_pack(tb2, bt, 1, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "to 300 900"); + evas_object_smart_callback_add(bt, "clicked", my_bt_go_300_900, sc); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.1, 0.9); + elm_table_pack(tb2, bt, 0, 1, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "to 900 900"); + evas_object_smart_callback_add(bt, "clicked", my_bt_go_900_900, sc); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, 0.9, 0.9); + elm_table_pack(tb2, bt, 1, 1, 1, 1); + evas_object_show(bt); + + evas_object_show(tb2); + + evas_object_resize(win, 320, 320); + evas_object_show(win); +} +TEST_END + +void +click_through(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + printf("click went through on %p\n", obj); +} + +TEST_START(test_scroller2) +{ + Evas_Object *bt, *bx, *bx2, *bg, *sc, *tb, *tb2, *rc; + int i, j; + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.0); + + /* { */ + for (i = 0; i < 3; i++) + { + bt = elm_button_add(win); + elm_object_text_set(bt, "Vertical"); + evas_object_smart_callback_add(bt, "clicked", click_through, NULL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + } + /* } */ + + /* { */ + sc = elm_scroller_add(win); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, 0.5); + elm_scroller_bounce_set(sc, 1, 0); + elm_scroller_content_min_limit(sc, 0, 1); + elm_box_pack_end(bx, sc); + evas_object_show(sc); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + + for (i = 0; i < 10; i++) + { + bt = elm_button_add(win); + elm_object_text_set(bt, "... Horizontal scrolling ..."); + evas_object_smart_callback_add(bt, "clicked", click_through, NULL); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + } + + elm_object_content_set(sc, bx2); + evas_object_show(bx2); + /* } */ + + /* { */ + for (i = 0; i < 3; i++) + { + bt = elm_button_add(win); + elm_object_text_set(bt, "Vertical"); + evas_object_smart_callback_add(bt, "clicked", click_through, NULL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + } + /* } */ + + /* { */ + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + rc = evas_object_rectangle_add(evas_object_evas_get(win)); + evas_object_size_hint_min_set(rc, 200, 120); + elm_table_pack(tb, rc, 0, 0, 1, 1); + + sc = elm_scroller_add(win); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, sc, 0, 0, 1, 1); + evas_object_show(sc); + + tb2 = elm_table_add(win); + + for (j = 0; j < 16; j++) + { + for (i = 0; i < 16; i++) + { + bt = elm_button_add(win); + elm_object_text_set(bt, "Both"); + evas_object_smart_callback_add(bt, "clicked", click_through, NULL); + elm_table_pack(tb2, bt, i, j, 1, 1); + evas_object_show(bt); + } + } + + elm_object_content_set(sc, tb2); + evas_object_show(tb2); + /* } */ + + for (i = 0; i < 24; i++) + { + bt = elm_button_add(win); + elm_object_text_set(bt, "Vertical"); + evas_object_smart_callback_add(bt, "clicked", click_through, NULL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, 0.5); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + } + + sc = elm_scroller_add(win); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_scroller_bounce_set(sc, 0, 1); + elm_win_resize_object_add(win, sc); + elm_object_content_set(sc, bx); + evas_object_show(bx); + evas_object_show(sc); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_segment_control.c b/src/bin/test_segment_control.c new file mode 100644 index 0000000..b42e83b --- /dev/null +++ b/src/bin/test_segment_control.c @@ -0,0 +1,96 @@ +#include +#include "tsuite.h" +TEST_START(test_segment_control) +{ + Evas_Object *bg, *ic, *ic1, *ic2, *ic3, *ic4, *ic5; + Elm_Segment_Item *it; + + Evas_Object * in_layout; + Evas_Object *segment1, *segment2, *segment3, *segment4; + char buf[PATH_MAX]; + char buf1[PATH_MAX]; + char buf2[PATH_MAX]; + char buf3[PATH_MAX]; + char buf4[PATH_MAX]; + char buf5[PATH_MAX]; + char buf6[PATH_MAX]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + in_layout = elm_layout_add( win ); + elm_win_resize_object_add(win, in_layout); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", elm_app_data_dir_get()); + elm_layout_file_set(in_layout, buf, "segment_test"); + evas_object_size_hint_weight_set(in_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + ic = elm_icon_add(in_layout); + snprintf(buf1, sizeof(buf1), "%s/images/logo.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf1, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_BOTH, 1, 1); + + ic1 = elm_icon_add(in_layout); + snprintf(buf2, sizeof(buf2), "%s/images/logo.png", elm_app_data_dir_get()); + elm_icon_file_set(ic1, buf2, NULL); + evas_object_size_hint_aspect_set(ic1, EVAS_ASPECT_CONTROL_BOTH, 1, 1); + + segment1 = elm_segment_control_add(win); + elm_segment_control_item_add(segment1, NULL, "Only Text"); + it = elm_segment_control_item_add(segment1, ic, NULL); + elm_segment_control_item_selected_set(it, EINA_TRUE); + elm_segment_control_item_add(segment1, ic1, "Text_Icon_test"); + elm_segment_control_item_add(segment1, NULL, "Seg4"); + elm_segment_control_item_add(segment1, NULL, "Seg5"); + + segment2 = elm_segment_control_add(win); + elm_segment_control_item_add(segment2, NULL, "SegmentItem"); + it = elm_segment_control_item_add(segment2, NULL, "SegmentItem"); + elm_segment_control_item_selected_set(it, EINA_TRUE); + elm_segment_control_item_add(segment2, NULL, "SegmentControlItem"); + elm_segment_control_item_add(segment2, NULL, "SegmentItem"); + + ic2 = elm_icon_add(in_layout); + snprintf(buf3, sizeof(buf3), "%s/images/logo.png", elm_app_data_dir_get()); + elm_icon_file_set(ic2, buf3, NULL); + evas_object_size_hint_aspect_set(ic2, EVAS_ASPECT_CONTROL_BOTH, 1, 1); + + ic3 = elm_icon_add(in_layout); + snprintf(buf4, sizeof(buf4), "%s/images/logo.png", elm_app_data_dir_get()); + elm_icon_file_set(ic3, buf4, NULL); + evas_object_size_hint_aspect_set(ic3, EVAS_ASPECT_CONTROL_BOTH, 1, 1); + + ic4 = elm_icon_add(in_layout); + snprintf(buf5, sizeof(buf5), "%s/images/logo.png", elm_app_data_dir_get()); + elm_icon_file_set(ic4, buf5, NULL); + evas_object_size_hint_aspect_set(ic4, EVAS_ASPECT_CONTROL_BOTH, 1, 1); + + segment3 = elm_segment_control_add(win); + elm_segment_control_item_add(segment3, ic2, NULL); + it = elm_segment_control_item_add(segment3, ic3, NULL); + elm_segment_control_item_selected_set(it, EINA_TRUE); + elm_segment_control_item_add(segment3, ic4, NULL); + + ic5 = elm_icon_add(in_layout); + snprintf(buf6, sizeof(buf6), "%s/images/logo.png", elm_app_data_dir_get()); + elm_icon_file_set(ic5, buf6, NULL); + evas_object_size_hint_aspect_set(ic5, EVAS_ASPECT_CONTROL_BOTH, 1, 1); + + segment4 = elm_segment_control_add(win); + elm_segment_control_item_add(segment4, NULL, "Disabled"); + it = elm_segment_control_item_add(segment4, ic5, "Disabled"); + elm_segment_control_item_selected_set(it, EINA_TRUE); + elm_segment_control_item_add(segment4, NULL, "Disabled"); + elm_object_disabled_set(segment4, EINA_TRUE); + + elm_object_part_content_set(in_layout, "segment1", segment1); + elm_object_part_content_set(in_layout, "segment2", segment2); + elm_object_part_content_set(in_layout, "segment3", segment3); + elm_object_part_content_set(in_layout, "segment4", segment4); + + evas_object_show(in_layout); + + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_separator.c b/src/bin/test_separator.c new file mode 100644 index 0000000..9ed087a --- /dev/null +++ b/src/bin/test_separator.c @@ -0,0 +1,66 @@ +#include +#include "tsuite.h" +TEST_START(test_separator) +{ + Evas_Object *bg, *bx0, *bx, *bt, *sp; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx0 = elm_box_add(win); + evas_object_size_hint_weight_set(bx0, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_horizontal_set(bx0, 1); + elm_win_resize_object_add(win, bx0); + evas_object_show(bx0); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx0, bx); + evas_object_show(bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Left upper corner"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + sp = elm_separator_add(win); + elm_separator_horizontal_set(sp, 1); // by default, separator is vertical, we must set it horizontal + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Left lower corner"); + elm_object_disabled_set(bt, 1); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + sp = elm_separator_add(win); // now we need vertical separator + elm_box_pack_end(bx0, sp); + evas_object_show(sp); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx0, bx); + evas_object_show(bx); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Right upper corner"); + elm_object_disabled_set(bt, 1); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + sp = elm_separator_add(win); + elm_separator_horizontal_set(sp, 1); + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Right lower corner"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_slider.c b/src/bin/test_slider.c new file mode 100644 index 0000000..351722e --- /dev/null +++ b/src/bin/test_slider.c @@ -0,0 +1,190 @@ +#include +#include "tsuite.h" +void +_change_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + double val = elm_slider_value_get(obj); + elm_slider_value_set(data, val); +} + +TEST_START(test_slider) +{ + Evas_Object *bg, *bx, *sl, *ic, *sl1, *bx2; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + + sl = elm_slider_add(win); + sl1 = sl; + elm_object_text_set(sl, "Horizontal"); + elm_object_part_content_set(sl, "icon", ic); + elm_slider_unit_format_set(sl, "%1.1f units"); + elm_slider_span_size_set(sl, 120); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sl); + evas_object_show(ic); + evas_object_show(sl); + + /* horizontal disable state */ + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "Disabled"); + elm_object_part_content_set(sl, "icon", ic); + elm_slider_unit_format_set(sl, "%1.1f units"); + elm_slider_span_size_set(sl, 120); + elm_slider_min_max_set(sl, 50, 150); + elm_slider_value_set(sl, 80); + elm_object_disabled_set(sl, EINA_TRUE); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sl); + evas_object_show(ic); + evas_object_show(sl); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "Horizontal inverted"); + elm_object_part_content_set(sl, "end", ic); + elm_slider_span_size_set(sl, 80); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_slider_indicator_format_set(sl, "%3.0f"); + elm_slider_min_max_set(sl, 50, 150); + elm_slider_value_set(sl, 80); + elm_slider_inverted_set(sl, EINA_TRUE); + evas_object_size_hint_align_set(sl, 0.5, 0.5); + evas_object_size_hint_weight_set(sl, 0.0, 0.0); + elm_box_pack_end(bx, sl); + evas_object_show(ic); + evas_object_show(sl); + + /* label2 disable */ + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "Disabled inverted"); + elm_object_part_content_set(sl, "end", ic); + elm_slider_span_size_set(sl, 80); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_slider_indicator_format_set(sl, "%3.0f"); + elm_slider_min_max_set(sl, 50, 150); + elm_slider_value_set(sl, 80); + elm_slider_inverted_set(sl, EINA_TRUE); + elm_object_disabled_set(sl, EINA_TRUE); + evas_object_size_hint_align_set(sl, 0.5, 0.5); + evas_object_size_hint_weight_set(sl, 0.0, 0.0); + elm_box_pack_end(bx, sl); + evas_object_show(ic); + evas_object_show(sl); + + sl = elm_slider_add(win); + elm_slider_indicator_show_set(sl, EINA_FALSE); + elm_object_text_set(sl, "Scale doubled"); + elm_slider_unit_format_set(sl, "%3.0f units"); + elm_slider_span_size_set(sl, 40); + evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_slider_indicator_format_set(sl, "%3.0f"); + elm_slider_min_max_set(sl, 50, 150); + elm_slider_value_set(sl, 80); + elm_slider_inverted_set(sl, EINA_TRUE); + elm_object_scale_set(sl, 2.0); + elm_box_pack_end(bx, sl); + evas_object_show(ic); + evas_object_show(sl); + + bx2 = elm_box_add(win); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1); + + sl = elm_slider_add(win); + elm_object_part_content_set(sl, "icon", ic); + elm_object_text_set(sl, "Vertical inverted"); + elm_slider_inverted_set(sl, EINA_TRUE); + elm_slider_unit_format_set(sl, "units"); + elm_slider_span_size_set(sl, 60); + evas_object_size_hint_align_set(sl, 0.5, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(sl, 0.0, EVAS_HINT_EXPAND); + elm_slider_indicator_format_set(sl, "%1.1f"); + elm_slider_value_set(sl, 0.2); + elm_object_scale_set(sl, 1.0); + elm_slider_horizontal_set(sl, 0); + elm_box_pack_end(bx2, sl); + evas_object_show(ic); + evas_object_show(sl); + + evas_object_smart_callback_add(sl1, "changed", _change_cb, sl); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "Vertical"); + elm_slider_unit_format_set(sl, "units"); + elm_slider_span_size_set(sl, 60); + evas_object_size_hint_align_set(sl, 0.5, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(sl, 0.0, EVAS_HINT_EXPAND); + elm_slider_indicator_format_set(sl, "%1.1f"); + elm_slider_value_set(sl, 0.2); + elm_object_scale_set(sl, 1.0); + elm_slider_horizontal_set(sl, EINA_FALSE); + elm_box_pack_end(bx2, sl); + evas_object_show(ic); + evas_object_show(sl); + + /* vertical disable state */ + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1); + + sl = elm_slider_add(win); + elm_object_part_content_set(sl, "icon", ic); + elm_object_text_set(sl, "Disabled vertical"); + elm_slider_inverted_set(sl, EINA_TRUE); + elm_slider_unit_format_set(sl, "units"); + elm_slider_span_size_set(sl, 100); + evas_object_size_hint_align_set(sl, 0.5, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(sl, 0.0, EVAS_HINT_EXPAND); + elm_slider_indicator_format_set(sl, "%1.1f"); + elm_slider_value_set(sl, 0.2); + elm_object_scale_set(sl, 1.0); + elm_slider_horizontal_set(sl, 0); + elm_object_disabled_set(sl, EINA_TRUE); + elm_box_pack_end(bx2, sl); + evas_object_show(ic); + evas_object_show(sl); + + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_slideshow.c b/src/bin/test_slideshow.c new file mode 100644 index 0000000..952dbba --- /dev/null +++ b/src/bin/test_slideshow.c @@ -0,0 +1,204 @@ +#include +#include "tsuite.h" +static Evas_Object *slideshow, *bt_start, *bt_stop; +static Elm_Slideshow_Item_Class itc; + +static void +_notify_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + evas_object_show(data); +} + +static void +_next(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_slideshow_next(data); +} + +static void +_previous(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_slideshow_previous(data); +} + +static void +_mouse_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_notify_timeout_set(data, 0.0); + evas_object_show(data); +} + + +static void +_mouse_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_notify_timeout_set(data, 3.0); +} + +static void +_hv_select(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + elm_slideshow_transition_set(slideshow, data); + elm_object_text_set(obj, data); +} + +static void +_layout_select(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + elm_slideshow_layout_set(slideshow, data); + elm_object_text_set(obj, data); +} + +static void +_start(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_slideshow_timeout_set(slideshow, elm_spinner_value_get(data)); + + elm_object_disabled_set(bt_start, EINA_TRUE); + elm_object_disabled_set(bt_stop, EINA_FALSE); +} + +static void +_stop(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_slideshow_timeout_set(slideshow, 0.0); + elm_object_disabled_set(bt_start, EINA_FALSE); + elm_object_disabled_set(bt_stop, EINA_TRUE); +} + +static void +_spin(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + if (elm_slideshow_timeout_get(slideshow) > 0) + elm_slideshow_timeout_set(slideshow, elm_spinner_value_get(data)); +} + +static Evas_Object * +_get(void *data, Evas_Object *obj) +{ + //Evas_Object *photo = elm_photocam_add(obj); + //elm_photocam_file_set(photo, data); + //elm_photocam_zoom_mode_set(photo, ELM_PHOTOCAM_ZOOM_MODE_AUTO_FIT); + + Evas_Object *photo = elm_photo_add(obj); + elm_photo_file_set(photo, data); + elm_photo_fill_inside_set(photo, EINA_TRUE); + elm_object_style_set(photo, "shadow"); + + return photo; +} + +static char * +_get_str(char *dest, const char *str) +{ /* dest should be not null and big enough */ + sprintf(dest, "%s/%s", elm_app_data_dir_get(), str); + return dest; +} + +TEST_START(test_slideshow) +{ + Evas_Object *bg, *notify, *bx, *bt, *hv, *spin; + const Eina_List *l; + const char *transition, *layout; + char buf[1024]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + slideshow = elm_slideshow_add(win); + elm_slideshow_loop_set(slideshow, EINA_TRUE); + elm_win_resize_object_add(win, slideshow); + evas_object_size_hint_weight_set(slideshow, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(slideshow); + + itc.func.get = _get; + itc.func.del = NULL; + + elm_slideshow_item_add(slideshow,&itc,_get_str(buf,"images/logo.png")); + elm_slideshow_item_add(slideshow,&itc,_get_str(buf,"images/plant_01.jpg")); + elm_slideshow_item_add(slideshow,&itc,_get_str(buf,"images/rock_01.jpg")); + elm_slideshow_item_add(slideshow,&itc,get_str(buf,"images/rock_02.jpg")); + elm_slideshow_item_add(slideshow,&itc,_get_str(buf,"images/sky_01.jpg")); + elm_slideshow_item_add(slideshow,&itc,_get_str(buf,"images/sky_04.jpg")); + elm_slideshow_item_add(slideshow,&itc,_get_str(buf,"images/wood_01.jpg")); + elm_slideshow_item_add(slideshow,&itc,_get_str(buf,"images/mystrale.jpg")); + elm_slideshow_item_add(slideshow,&itc,_get_str(buf,"images/mystrale_2.jpg")); + + notify = elm_notify_add(win); + elm_notify_orient_set(notify, ELM_NOTIFY_ORIENT_BOTTOM); + elm_win_resize_object_add(win, notify); + elm_notify_timeout_set(notify, 3.0); + + bx = elm_box_add(win); + elm_box_horizontal_set(bx, EINA_TRUE); + elm_object_content_set(notify, bx); + evas_object_show(bx); + + evas_object_event_callback_add(bx, EVAS_CALLBACK_MOUSE_IN, _mouse_in, + notify); + evas_object_event_callback_add(bx, EVAS_CALLBACK_MOUSE_OUT, _mouse_out, + notify); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Previous"); + evas_object_smart_callback_add(bt, "clicked", _previous, slideshow); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Next"); + evas_object_smart_callback_add(bt, "clicked", _next, slideshow); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + hv = elm_hoversel_add(win); + elm_box_pack_end(bx, hv); + elm_hoversel_hover_parent_set(hv, win); + EINA_LIST_FOREACH(elm_slideshow_transitions_get(slideshow), l, transition) + elm_hoversel_item_add(hv, transition, NULL, 0, _hv_select, transition); + elm_object_text_set(hv, eina_list_data_get(elm_slideshow_transitions_get(slideshow))); + evas_object_show(hv); + + hv = elm_hoversel_add(win); + elm_box_pack_end(bx, hv); + elm_hoversel_hover_parent_set(hv, win); + EINA_LIST_FOREACH(elm_slideshow_layouts_get(slideshow), l, layout) + elm_hoversel_item_add(hv, layout, NULL, 0, _layout_select, layout); + elm_object_text_set(hv, elm_slideshow_layout_get(slideshow)); + evas_object_show(hv); + + spin = elm_spinner_add(win); + elm_spinner_label_format_set(spin, "%2.0f secs."); + evas_object_smart_callback_add(spin, "changed", _spin, spin); + elm_spinner_step_set(spin, 1); + elm_spinner_min_max_set(spin, 1, 30); + elm_spinner_value_set(spin, 3); + elm_box_pack_end(bx, spin); + evas_object_show(spin); + + bt = elm_button_add(win); + bt_start = bt; + elm_object_text_set(bt, "Start"); + evas_object_smart_callback_add(bt, "clicked", _start, spin); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + bt_stop = bt; + elm_object_text_set(bt, "Stop"); + evas_object_smart_callback_add(bt, "clicked", _stop, spin); + elm_box_pack_end(bx, bt); + elm_object_disabled_set(bt, EINA_TRUE); + evas_object_show(bt); + + evas_object_event_callback_add(slideshow, EVAS_CALLBACK_MOUSE_UP, + _notify_show, notify); + evas_object_event_callback_add(slideshow, EVAS_CALLBACK_MOUSE_MOVE, + _notify_show, notify); + + evas_object_resize(win, 500, 400); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_spinner.c b/src/bin/test_spinner.c new file mode 100644 index 0000000..b4ce8e0 --- /dev/null +++ b/src/bin/test_spinner.c @@ -0,0 +1,81 @@ +#include +#include "tsuite.h" +TEST_START(test_spinner) +{ + Evas_Object *bg, *bx, *sp; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + sp = elm_spinner_add(win); + elm_spinner_label_format_set(sp, "%1.1f units"); + elm_spinner_step_set(sp, 1.3); + elm_spinner_wrap_set(sp, ELM_WRAP_CHAR); + elm_spinner_min_max_set(sp, -50.0, 250.0); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + sp = elm_spinner_add(win); + elm_spinner_label_format_set(sp, "Percentage %%%1.2f something"); + elm_spinner_step_set(sp, 5.0); + elm_spinner_wrap_set(sp, ELM_WRAP_CHAR); + elm_spinner_min_max_set(sp, 0.0, 100.0); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + sp = elm_spinner_add(win); + elm_spinner_label_format_set(sp, "%1.1f units"); + elm_spinner_step_set(sp, 1.3); + elm_spinner_wrap_set(sp, ELM_WRAP_CHAR); + elm_object_style_set (sp, "vertical"); + elm_spinner_min_max_set(sp, -50.0, 250.0); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + sp = elm_spinner_add(win); + elm_spinner_label_format_set(sp, "Disabled %.0f"); + elm_object_disabled_set(sp, 1); + elm_spinner_min_max_set(sp, -50.0, 250.0); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + sp = elm_spinner_add(win); + elm_spinner_min_max_set(sp, 1, 12); + elm_spinner_label_format_set(sp, "%.0f"); + elm_spinner_step_set(sp, 1.0); + elm_spinner_editable_set(sp, EINA_FALSE); + elm_spinner_special_value_add(sp, 1, "January"); + elm_spinner_special_value_add(sp, 2, "February"); + elm_spinner_special_value_add(sp, 3, "March"); + elm_spinner_special_value_add(sp, 4, "April"); + elm_spinner_special_value_add(sp, 5, "May"); + elm_spinner_special_value_add(sp, 6, "June"); + elm_spinner_special_value_add(sp, 7, "July"); + elm_spinner_special_value_add(sp, 8, "August"); + elm_spinner_special_value_add(sp, 9, "September"); + elm_spinner_special_value_add(sp, 10, "October"); + elm_spinner_special_value_add(sp, 11, "November"); + elm_spinner_special_value_add(sp, 12, "December"); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, sp); + evas_object_show(sp); + + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_table.c b/src/bin/test_table.c new file mode 100644 index 0000000..fdaa76d --- /dev/null +++ b/src/bin/test_table.c @@ -0,0 +1,340 @@ +#include +#include "tsuite.h" +TEST_START(test_table) +{ + Evas_Object *bg, *tb, *bt; + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + tb = elm_table_add(win); + elm_win_resize_object_add(win, tb); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(tb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 1"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 0, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 2"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 1, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 3"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 2, 0, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 4"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 0, 1, 2, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 5"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 2, 1, 1, 2); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button a"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 0, 2, 2, 1); + evas_object_show(bt); + + evas_object_show(win); +} +TEST_END + +TEST_START(test_table2) +{ + Evas_Object *bg, *tb, *bt; + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + tb = elm_table_add(win); + elm_table_homogeneous_set(tb, EINA_TRUE); + elm_win_resize_object_add(win, tb); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(tb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "A"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 1, 1, 2, 2); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Blah blah blah"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 3, 0, 2, 3); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Hallow"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 0, 3, 10, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "B"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 2, 5, 2, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "C"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 8, 8, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Wide"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 1, 7, 7, 2); + evas_object_show(bt); + + evas_object_show(win); +} +TEST_END + +static void +my_tb_ch(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + Evas_Object *tb = evas_object_data_get(win, "tb"); + Evas_Object *b2 = evas_object_data_get(win, "b2"); + + elm_table_unpack(tb, b2); + elm_table_pack(tb, b2, 1, 0, 1, 2); +} + +TEST_START(test_table3) +{ + Evas_Object *bg, *tb, *bt; + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + tb = elm_table_add(win); + elm_win_resize_object_add(win, tb); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_data_set(win, "tb", tb); + evas_object_show(tb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 1"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 0, 0, 1, 1); + evas_object_data_set(win, "b1", bt); + evas_object_smart_callback_add(bt, "clicked", my_tb_ch, win); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 2"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 1, 0, 1, 1); + evas_object_data_set(win, "b2", bt); + evas_object_smart_callback_add(bt, "clicked", my_tb_ch, win); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 3"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 0, 1, 1, 1); + evas_object_data_set(win, "b3", bt); + evas_object_smart_callback_add(bt, "clicked", my_tb_ch, win); + evas_object_show(bt); + + evas_object_show(win); +} +TEST_END + +TEST_START(test_table4) +{ + Evas_Object *bg, *tb, *bt; + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + tb = elm_table_add(win); + elm_win_resize_object_add(win, tb); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_data_set(win, "tb", tb); + evas_object_show(tb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 1"); + evas_object_size_hint_weight_set(bt, 0.25, 0.25); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 0, 0, 1, 1); + evas_object_data_set(win, "b1", bt); + evas_object_smart_callback_add(bt, "clicked", my_tb_ch, win); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 2"); + evas_object_size_hint_weight_set(bt, 0.75, 0.25); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 1, 0, 1, 1); + evas_object_data_set(win, "b2", bt); + evas_object_smart_callback_add(bt, "clicked", my_tb_ch, win); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button 3"); + evas_object_size_hint_weight_set(bt, 0.25, 0.75); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 0, 1, 1, 1); + evas_object_data_set(win, "b3", bt); + evas_object_smart_callback_add(bt, "clicked", my_tb_ch, win); + evas_object_show(bt); + + evas_object_show(win); +} +TEST_END + +TEST_START(test_table5) +{ + Evas_Object *bg, *tb, *bt; + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + tb = elm_table_add(win); + elm_table_homogeneous_set(tb, EINA_TRUE); + elm_win_resize_object_add(win, tb); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(tb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "A"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 33, 0, 34, 33); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "B"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 67, 33, 33, 34); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "C"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 33, 67, 34, 33); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "D"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 0, 33, 33, 34); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "X"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 33, 33, 34, 34); + evas_object_show(bt); + + evas_object_show(win); +} +TEST_END + +TEST_START(test_table6) +{ + Evas_Object *bg, *tb, *bt; + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + tb = elm_table_add(win); + elm_table_homogeneous_set(tb, EINA_TRUE); + elm_win_resize_object_add(win, tb); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(tb); + + bt = elm_button_add(win); + elm_object_text_set(bt, "C"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 1, 1, 2, 2); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "A"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 1, 1, 2, 2); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Blah blah blah"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 3, 0, 2, 3); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Hallow"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 0, 3, 10, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "B"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 1, 1, 1, 1); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Wide"); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_table_pack(tb, bt, 1, 7, 7, 2); + evas_object_show(bt); + + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_thumb.c b/src/bin/test_thumb.c new file mode 100644 index 0000000..4749d74 --- /dev/null +++ b/src/bin/test_thumb.c @@ -0,0 +1,64 @@ +#include +#include "tsuite.h" +TEST_START(test_thumb) +{ + Evas_Object *bg, *sc, *tb, *th; + int i, j, n; + char buf[PATH_MAX]; + const char *img[11] = + { + "panel_01.jpg", + "plant_01.jpg", + "rock_01.jpg", + "rock_02.jpg", + "sky_01.jpg", + "sky_02.jpg", + "sky_03.jpg", + "sky_04.jpg", + "wood_01.jpg", + "mystrale.jpg", + "mystrale_2.jpg" + }; + + elm_need_ethumb(); + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + n = 0; + for (j = 0; j < 12; j++) + { + for (i = 0; i < 12; i++) + { + th = elm_thumb_add(win); + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), + img[n]); + n = (n + 1) % 11; + elm_thumb_file_set(th, buf, img[n]); + evas_object_size_hint_weight_set(th, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(th, EVAS_HINT_FILL, + EVAS_HINT_FILL); + elm_table_pack(tb, th, i, j, 1, 1); + elm_thumb_editable_set(th, EINA_TRUE); + evas_object_show(th); + } + } + + sc = elm_scroller_add(win); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, sc); + + elm_object_content_set(sc, tb); + evas_object_show(tb); + evas_object_show(sc); + + evas_object_resize(win, 600, 600); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_toggle.c b/src/bin/test_toggle.c new file mode 100644 index 0000000..0281d34 --- /dev/null +++ b/src/bin/test_toggle.c @@ -0,0 +1,85 @@ +#include +#include "tsuite.h" +TEST_START(test_toggle) +{ + Evas_Object *bg, *bx, *ic, *tg; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + + tg = elm_check_add(win); + elm_object_style_set(tg, "toggle"); + evas_object_size_hint_weight_set(tg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(tg, EVAS_HINT_FILL, 0.5); + elm_object_text_set(tg, "Icon sized to toggle"); + elm_object_content_set(tg, ic); + elm_check_state_set(tg, 1); + elm_object_part_text_set(tg, "on", "Yes"); + elm_object_part_text_set(tg, "off", "No"); + elm_box_pack_end(bx, tg); + evas_object_show(tg); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + + tg = elm_check_add(win); + elm_object_style_set(tg, "toggle"); + elm_object_text_set(tg, "Icon no scale"); + elm_object_content_set(tg, ic); + elm_box_pack_end(bx, tg); + evas_object_show(tg); + evas_object_show(ic); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + + tg = elm_check_add(win); + elm_object_style_set(tg, "toggle"); + elm_object_text_set(tg, "Icon no scale"); + elm_object_content_set(tg, ic); + elm_object_disabled_set(tg, 1); + elm_box_pack_end(bx, tg); + evas_object_show(tg); + evas_object_show(ic); + + tg = elm_check_add(win); + elm_object_style_set(tg, "toggle"); + elm_object_text_set(tg, "Label Only"); + elm_object_part_text_set(tg, "on", "Big long fun times label"); + elm_object_part_text_set(tg, "off", "Small long happy fun label"); + elm_box_pack_end(bx, tg); + evas_object_show(tg); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + + tg = elm_check_add(win); + elm_object_style_set(tg, "toggle"); + elm_object_content_set(tg, ic); + elm_box_pack_end(bx, tg); + evas_object_show(tg); + evas_object_show(ic); + + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_toolbar.c b/src/bin/test_toolbar.c new file mode 100644 index 0000000..86be1e7 --- /dev/null +++ b/src/bin/test_toolbar.c @@ -0,0 +1,699 @@ +#include +#include "tsuite.h" +static void +tb_1(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/images/panel_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(data, buf); +} + +static void +tb_2(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/images/rock_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(data, buf); +} + +static void +tb_3(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/images/wood_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(data, buf); +} + +static void +tb_3a(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + tb_3(data, obj, event_info); + elm_toolbar_item_state_set(event_info, elm_toolbar_item_state_next(event_info)); +} + +static void +tb_3b(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + tb_3(data, obj, event_info); + elm_toolbar_item_state_unset(event_info); +} + +static void +tb_4(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/images/sky_03.jpg", elm_app_data_dir_get()); + elm_photo_file_set(data, buf); +} + +static void +tb_4a(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_toolbar_item_state_set(event_info, elm_toolbar_item_state_prev(event_info)); +} + +static void +tb_5(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_photo_file_set(data, NULL); +} + +TEST_START(test_toolbar) +{ + Evas_Object *bg, *bx, *tb, *ph, *menu; + Evas_Object *ph1, *ph2, *ph3, *ph4; + Elm_Object_Item *tb_it; + Elm_Object_Item *menu_it; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + elm_win_resize_object_add(win, bx); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx); + + tb = elm_toolbar_add(win); + elm_toolbar_homogeneous_set(tb, 0); + elm_toolbar_mode_shrink_set(tb, ELM_TOOLBAR_SHRINK_MENU); + evas_object_size_hint_weight_set(tb, 0.0, 0.0); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, 0.0); + + ph1 = elm_photo_add(win); + ph2 = elm_photo_add(win); + ph3 = elm_photo_add(win); + ph4 = elm_photo_add(win); + + tb_it = elm_toolbar_item_append(tb, "document-print", "Hello", tb_1, ph1); + elm_toolbar_item_disabled_set(tb_it, EINA_TRUE); + elm_toolbar_item_priority_set(tb_it, 100); + + tb_it = elm_toolbar_item_append(tb, "folder-new", "World", tb_2, ph1); + elm_toolbar_item_priority_set(tb_it, -100); + + tb_it = elm_toolbar_item_append(tb, "object-rotate-right", "H", tb_3, ph4); + elm_toolbar_item_priority_set(tb_it, 150); + + tb_it = elm_toolbar_item_append(tb, "mail-send", "Comes", tb_4, ph4); + elm_toolbar_item_priority_set(tb_it, 0); + + tb_it = elm_toolbar_item_append(tb, "clock", "Elementary", tb_5, ph4); + elm_toolbar_item_priority_set(tb_it, -200); + + tb_it = elm_toolbar_item_append(tb, "refresh", "Menu", NULL, NULL); + elm_toolbar_item_menu_set(tb_it, 1); + elm_toolbar_item_priority_set(tb_it, -999999); + elm_toolbar_menu_parent_set(tb, win); + menu = elm_toolbar_item_menu_get(tb_it); + + elm_menu_item_add(menu, NULL, "edit-cut", "Shrink", tb_3, ph4); + menu_it = elm_menu_item_add(menu, NULL, "edit-copy", "Mode", tb_4, ph4); + elm_menu_item_add(menu, menu_it, "edit-paste", "is set to", tb_4, ph4); + elm_menu_item_add(menu, NULL, "edit-delete", "Menu", tb_5, ph4); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + tb = elm_table_add(win); + //elm_table_homogeneous_set(tb, 1); + evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ph = ph1; + elm_photo_size_set(ph, 40); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 0, 1, 1); + evas_object_show(ph); + + ph = ph2; + elm_photo_size_set(ph, 80); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 0, 1, 1); + evas_object_show(ph); + + ph = ph3; + elm_photo_size_set(ph, 20); + snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 1, 1, 1); + evas_object_show(ph); + + ph = ph4; + elm_photo_size_set(ph, 60); + snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 1, 1, 1); + evas_object_show(ph); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + evas_object_resize(win, 320, 300); + evas_object_show(win); +} +TEST_END + +TEST_START(test_toolbar2) +{ + Evas_Object *bg, *bx, *tb, *ph, *menu; + Evas_Object *ph1, *ph2, *ph3, *ph4; + Elm_Object_Item *item; + Elm_Object_Item *menu_it; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + elm_win_resize_object_add(win, bx); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx); + + tb = elm_toolbar_add(win); + elm_toolbar_homogeneous_set(tb, 0); + elm_toolbar_mode_shrink_set(tb, ELM_TOOLBAR_SHRINK_SCROLL); + evas_object_size_hint_weight_set(tb, 0.0, 0.0); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, 0.0); + + ph1 = elm_photo_add(win); + ph2 = elm_photo_add(win); + ph3 = elm_photo_add(win); + ph4 = elm_photo_add(win); + + item = elm_toolbar_item_append(tb, "document-print", "Hello", tb_1, ph1); + elm_toolbar_item_disabled_set(item, EINA_TRUE); + elm_toolbar_item_priority_set(item, -100); + + item = elm_toolbar_item_append(tb, "folder-new", "World", tb_2, ph1); + elm_toolbar_item_priority_set(item, 100); + + item = elm_toolbar_item_append(tb, "object-rotate-right", "H", tb_3, ph4); + elm_toolbar_item_priority_set(item, -150); + + item = elm_toolbar_item_append(tb, "mail-send", "Comes", tb_4, ph4); + elm_toolbar_item_priority_set(item, -200); + + item = elm_toolbar_item_append(tb, "clock", "Elementary", tb_5, ph4); + elm_toolbar_item_priority_set(item, 0); + + item = elm_toolbar_item_append(tb, "refresh", "Menu", NULL, NULL); + elm_toolbar_item_menu_set(item, 1); + elm_toolbar_item_priority_set(item, -999999); + elm_toolbar_menu_parent_set(tb, win); + menu = elm_toolbar_item_menu_get(item); + + elm_menu_item_add(menu, NULL, "edit-cut", "Shrink", tb_3, ph4); + menu_it = elm_menu_item_add(menu, NULL, "edit-copy", "Mode", tb_4, ph4); + elm_menu_item_add(menu, menu_it, "edit-paste", "is set to", tb_4, ph4); + elm_menu_item_add(menu, NULL, "edit-delete", "Scroll", tb_5, ph4); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + tb = elm_table_add(win); + //elm_table_homogeneous_set(tb, 1); + evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ph = ph1; + elm_photo_size_set(ph, 40); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 0, 1, 1); + evas_object_show(ph); + + ph = ph2; + elm_photo_size_set(ph, 80); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 0, 1, 1); + evas_object_show(ph); + + ph = ph3; + elm_photo_size_set(ph, 20); + snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 1, 1, 1); + evas_object_show(ph); + + ph = ph4; + elm_photo_size_set(ph, 60); + snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 1, 1, 1); + evas_object_show(ph); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + evas_object_resize(win, 320, 300); + evas_object_show(win); +} +TEST_END + +TEST_START(test_toolbar3) +{ + Evas_Object *bg, *bx, *tb, *ph, *menu; + Evas_Object *ph1, *ph2, *ph3, *ph4; + Elm_Object_Item *tb_it; + Elm_Object_Item *menu_it; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + elm_win_resize_object_add(win, bx); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx); + + tb = elm_toolbar_add(win); + elm_toolbar_homogeneous_set(tb, 0); + elm_toolbar_mode_shrink_set(tb, ELM_TOOLBAR_SHRINK_NONE); + evas_object_size_hint_weight_set(tb, 0.0, 0.0); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, 0.0); + + ph1 = elm_photo_add(win); + ph2 = elm_photo_add(win); + ph3 = elm_photo_add(win); + ph4 = elm_photo_add(win); + + tb_it = elm_toolbar_item_append(tb, "document-print", "Hello", tb_1, ph1); + elm_toolbar_item_disabled_set(tb_it, EINA_TRUE); + elm_toolbar_item_priority_set(tb_it, 0); + + tb_it = elm_toolbar_item_append(tb, "folder-new", "World", tb_2, ph1); + elm_toolbar_item_priority_set(tb_it, -200); + + tb_it = elm_toolbar_item_append(tb, "object-rotate-right", "H", tb_3, ph4); + elm_toolbar_item_priority_set(tb_it, 1); + + tb_it = elm_toolbar_item_append(tb, "mail-send", "Comes", tb_4, ph4); + elm_toolbar_item_priority_set(tb_it, -10); + + tb_it = elm_toolbar_item_append(tb, "clock", "Elementary", tb_5, ph4); + elm_toolbar_item_priority_set(tb_it, 50); + + tb_it = elm_toolbar_item_append(tb, "refresh", "Menu", NULL, NULL); + elm_toolbar_item_menu_set(tb_it, 1); + elm_toolbar_item_priority_set(tb_it, 999999); + elm_toolbar_menu_parent_set(tb, win); + menu = elm_toolbar_item_menu_get(tb_it); + + elm_menu_item_add(menu, NULL, "edit-cut", "Shrink", tb_3, ph4); + menu_it = elm_menu_item_add(menu, NULL, "edit-copy", "Mode", tb_4, ph4); + elm_menu_item_add(menu, menu_it, "edit-paste", "is set to", tb_4, ph4); + elm_menu_item_add(menu, NULL, "edit-delete", "None", tb_5, ph4); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ph = ph1; + elm_photo_size_set(ph, 40); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 0, 1, 1); + evas_object_show(ph); + + ph = ph2; + elm_photo_size_set(ph, 80); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 0, 1, 1); + evas_object_show(ph); + + ph = ph3; + elm_photo_size_set(ph, 20); + snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 1, 1, 1); + evas_object_show(ph); + + ph = ph4; + elm_photo_size_set(ph, 60); + snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 1, 1, 1); + evas_object_show(ph); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + evas_object_resize(win, 320, 300); + evas_object_show(win); +} +TEST_END + +/* The same test of toolbar, but using hide shrink mode instead of menu */ +TEST_START(test_toolbar4) +{ + Evas_Object *bg, *bx, *tb, *ph, *menu; + Evas_Object *ph1, *ph2, *ph3, *ph4; + Elm_Object_Item *tb_it; + Elm_Object_Item *menu_it; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + elm_win_resize_object_add(win, bx); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx); + + tb = elm_toolbar_add(win); + elm_toolbar_homogeneous_set(tb, 0); + elm_toolbar_mode_shrink_set(tb, ELM_TOOLBAR_SHRINK_HIDE); + evas_object_size_hint_weight_set(tb, 0.0, 0.0); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, 0.0); + + ph1 = elm_photo_add(win); + ph2 = elm_photo_add(win); + ph3 = elm_photo_add(win); + ph4 = elm_photo_add(win); + + tb_it = elm_toolbar_item_append(tb, "document-print", "Hello", tb_1, ph1); + elm_toolbar_item_disabled_set(tb_it, EINA_TRUE); + elm_toolbar_item_priority_set(tb_it, 100); + + tb_it = elm_toolbar_item_append(tb, "folder-new", "World", tb_2, ph1); + elm_toolbar_item_priority_set(tb_it, -100); + + tb_it = elm_toolbar_item_append(tb, "object-rotate-right", "H", tb_3, ph4); + elm_toolbar_item_priority_set(tb_it, 150); + + tb_it = elm_toolbar_item_append(tb, "mail-send", "Comes", tb_4, ph4); + elm_toolbar_item_priority_set(tb_it, 0); + + tb_it = elm_toolbar_item_append(tb, "clock", "Elementary", tb_5, ph4); + elm_toolbar_item_priority_set(tb_it, -200); + + tb_it = elm_toolbar_item_append(tb, "refresh", "Menu", NULL, NULL); + elm_toolbar_item_menu_set(tb_it, 1); + elm_toolbar_item_priority_set(tb_it, -999999); + elm_toolbar_menu_parent_set(tb, win); + menu = elm_toolbar_item_menu_get(tb_it); + + elm_menu_item_add(menu, NULL, "edit-cut", "Shrink", tb_3, ph4); + menu_it = elm_menu_item_add(menu, NULL, "edit-copy", "Mode", tb_4, ph4); + elm_menu_item_add(menu, menu_it, "edit-paste", "is set to", tb_4, ph4); + elm_menu_item_add(menu, NULL, "edit-delete", "Menu", tb_5, ph4); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ph = ph1; + elm_photo_size_set(ph, 40); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 0, 1, 1); + evas_object_show(ph); + + ph = ph2; + elm_photo_size_set(ph, 80); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 0, 1, 1); + evas_object_show(ph); + + ph = ph3; + elm_photo_size_set(ph, 20); + snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 1, 1, 1); + evas_object_show(ph); + + ph = ph4; + elm_photo_size_set(ph, 60); + snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 1, 1, 1); + evas_object_show(ph); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + evas_object_resize(win, 320, 300); + evas_object_show(win); +} +TEST_END + +/* Toolbar with multiple state buttons */ +TEST_START(test_toolbar5) +{ + Evas_Object *bg, *bx, *tb, *ph, *menu; + Evas_Object *ph1, *ph2, *ph3, *ph4; + Elm_Object_Item *tb_it; + Elm_Object_Item *menu_it; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + elm_win_resize_object_add(win, bx); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx); + + tb = elm_toolbar_add(win); + elm_toolbar_homogeneous_set(tb, 0); + elm_toolbar_mode_shrink_set(tb, ELM_TOOLBAR_SHRINK_MENU); + evas_object_size_hint_weight_set(tb, 0.0, 0.0); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, 0.0); + elm_toolbar_no_select_mode_set(tb, EINA_TRUE); + + ph1 = elm_photo_add(win); + ph2 = elm_photo_add(win); + ph3 = elm_photo_add(win); + ph4 = elm_photo_add(win); + + tb_it = elm_toolbar_item_append(tb, "document-print", "Hello", tb_1, ph1); + elm_toolbar_item_disabled_set(tb_it, EINA_TRUE); + elm_toolbar_item_priority_set(tb_it, 100); + + snprintf(buf, sizeof(buf), "%s/images/icon_04.pngj", elm_app_data_dir_get()); + tb_it = elm_toolbar_item_append(tb, buf, "World", tb_2, ph1); + elm_toolbar_item_priority_set(tb_it, -100); + + tb_it = elm_toolbar_item_append(tb, "object-rotate-right", "H", tb_3a, ph4); + elm_toolbar_item_state_add(tb_it, "object-rotate-left", "H2", tb_3b, ph4); + elm_toolbar_item_priority_set(tb_it, 150); + + tb_it = elm_toolbar_item_append(tb, "mail-send", "Comes", tb_4a, ph4); + elm_toolbar_item_state_add(tb_it, "emptytrash", "Comes2", tb_4a, ph4); + elm_toolbar_item_state_add(tb_it, "trashcan_full", "Comes3", tb_4a, ph4); + elm_toolbar_item_priority_set(tb_it, 0); + + tb_it = elm_toolbar_item_append(tb, "clock", "Elementary", tb_5, ph4); + elm_toolbar_item_priority_set(tb_it, -200); + + tb_it = elm_toolbar_item_append(tb, "refresh", "Menu", NULL, NULL); + elm_toolbar_item_menu_set(tb_it, 1); + elm_toolbar_item_priority_set(tb_it, -999999); + elm_toolbar_menu_parent_set(tb, win); + menu = elm_toolbar_item_menu_get(tb_it); + + elm_menu_item_add(menu, NULL, "edit-cut", "Shrink", tb_3, ph4); + menu_it = elm_menu_item_add(menu, NULL, "edit-copy", "Mode", tb_4, ph4); + elm_menu_item_add(menu, menu_it, "edit-paste", "is set to", tb_4, ph4); + elm_menu_item_add(menu, NULL, "edit-delete", "Menu", tb_5, ph4); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, 0.0, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ph = ph1; + elm_photo_size_set(ph, 40); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 0, 1, 1); + evas_object_show(ph); + + ph = ph2; + elm_photo_size_set(ph, 80); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 0, 1, 1); + evas_object_show(ph); + + ph = ph3; + elm_photo_size_set(ph, 20); + snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 1, 1, 1); + evas_object_show(ph); + + ph = ph4; + elm_photo_size_set(ph, 60); + snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 1, 1, 1); + evas_object_show(ph); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + evas_object_resize(win, 320, 300); + evas_object_show(win); +} +TEST_END +TEST_START(test_toolbar6) +{ + Evas_Object *bg, *bx, *tb, *ph, *menu; + Evas_Object *ph1, *ph2, *ph3, *ph4; + Elm_Object_Item *tb_it; + Elm_Object_Item *menu_it; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + elm_win_resize_object_add(win, bx); + elm_box_horizontal_set(bx, EINA_TRUE); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(bx); + + tb = elm_toolbar_add(win); + elm_toolbar_horizontal_set(tb, EINA_FALSE); + elm_toolbar_mode_shrink_set(tb, ELM_TOOLBAR_SHRINK_MENU); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ph1 = elm_photo_add(win); + ph2 = elm_photo_add(win); + ph3 = elm_photo_add(win); + ph4 = elm_photo_add(win); + + tb_it = elm_toolbar_item_append(tb, "document-print", "Hello", tb_1, ph1); + elm_toolbar_item_disabled_set(tb_it, EINA_TRUE); + elm_toolbar_item_priority_set(tb_it, 100); + + tb_it = elm_toolbar_item_append(tb, "folder-new", "World", tb_2, ph1); + elm_toolbar_item_priority_set(tb_it, -100); + + tb_it = elm_toolbar_item_append(tb, "object-rotate-right", "H", tb_3, ph4); + elm_toolbar_item_priority_set(tb_it, 150); + + tb_it = elm_toolbar_item_append(tb, "mail-send", "Comes", tb_4, ph4); + elm_toolbar_item_priority_set(tb_it, 0); + + tb_it = elm_toolbar_item_append(tb, "clock", "Elementary", tb_5, ph4); + elm_toolbar_item_priority_set(tb_it, -200); + + tb_it = elm_toolbar_item_append(tb, "refresh", "Menu", NULL, NULL); + elm_toolbar_item_menu_set(tb_it, 1); + elm_toolbar_item_priority_set(tb_it, -999999); + elm_toolbar_menu_parent_set(tb, win); + menu = elm_toolbar_item_menu_get(tb_it); + + elm_menu_item_add(menu, NULL, "edit-cut", "Shrink", tb_3, ph4); + menu_it = elm_menu_item_add(menu, NULL, "edit-copy", "Mode", tb_4, ph4); + elm_menu_item_add(menu, menu_it, "edit-paste", "is set to", tb_4, ph4); + elm_menu_item_add(menu, NULL, "edit-delete", "Menu", tb_5, ph4); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + ph = ph1; + elm_photo_size_set(ph, 40); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 0, 1, 1); + evas_object_show(ph); + + ph = ph2; + elm_photo_size_set(ph, 80); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 0, 1, 1); + evas_object_show(ph); + + ph = ph3; + elm_photo_size_set(ph, 20); + snprintf(buf, sizeof(buf), "%s/images/sky_01.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 0, 1, 1, 1); + evas_object_show(ph); + + ph = ph4; + elm_photo_size_set(ph, 60); + snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get()); + elm_photo_file_set(ph, buf); + evas_object_size_hint_weight_set(ph, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ph, 0.5, 0.5); + elm_table_pack(tb, ph, 1, 1, 1, 1); + evas_object_show(ph); + + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + evas_object_resize(win, 320, 300); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_tooltip.c b/src/bin/test_tooltip.c new file mode 100644 index 0000000..7dd8cc0 --- /dev/null +++ b/src/bin/test_tooltip.c @@ -0,0 +1,600 @@ +#include +#include "tsuite.h" +typedef struct _Testitem +{ + Elm_Gengrid_Item *item; + const char *path; + int mode; + int onoff; +} Testitem; + +static Elm_Gengrid_Item_Class gic; + +char * +grdt_lbl_get(void *data, + Evas_Object *obj __UNUSED__, + const char *part __UNUSED__) +{ + const Testitem *ti = data; + char buf[256]; + snprintf(buf, sizeof(buf), "Photo %s", ti->path); + return strdup(buf); +} + +Evas_Object * +grdt_content_get(void *data, + Evas_Object *obj, + const char *part) +{ + const Testitem *ti = data; + if (!strcmp(part, "elm.swallow.icon")) + { + Evas_Object *icon = elm_bg_add(obj); + elm_bg_file_set(icon, ti->path, NULL); + evas_object_size_hint_aspect_set(icon, + EVAS_ASPECT_CONTROL_VERTICAL, + 1, 1); + evas_object_show(icon); + return icon; + } + return NULL; +} + +static Elm_Genlist_Item_Class itct; + +static void +gltt_exp(void *data __UNUSED__, + Evas_Object *obj __UNUSED__, + void *event_info) +{ + Elm_Genlist_Item *it = event_info; + Evas_Object *gl = elm_genlist_item_genlist_get(it); + int val = (int)(long)elm_genlist_item_data_get(it); + Elm_Genlist_Item *it1, *it2, *it3; + + val *= 10; + it1 = elm_genlist_item_append(gl, &itct, (void *)(long)(val + 1), it, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + it2 = elm_genlist_item_append(gl, &itct, (void *)(long)(val + 2), it, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + it3 = elm_genlist_item_append(gl, &itct, (void *)(long)(val + 3), it, + ELM_GENLIST_ITEM_SUBITEMS, NULL, NULL); + + elm_genlist_item_tooltip_text_set(it1, "Testing A"); + elm_genlist_item_tooltip_text_set(it2, "Testing B"); + elm_genlist_item_tooltip_text_set(it3, "Testing C"); +} + +static void +gltt_con(void *data __UNUSED__, + Evas_Object *obj __UNUSED__, + void *event_info) +{ + Elm_Genlist_Item *it = event_info; + elm_genlist_item_subitems_clear(it); +} + +static void +gltt_exp_req(void *data __UNUSED__, + Evas_Object *obj __UNUSED__, + void *event_info) +{ + Elm_Genlist_Item *it = event_info; + elm_genlist_item_expanded_set(it, 1); +} + +static void +gltt_con_req(void *data __UNUSED__, + Evas_Object *obj __UNUSED__, + void *event_info) +{ + Elm_Genlist_Item *it = event_info; + elm_genlist_item_expanded_set(it, 0); +} + +char * +gltt_text_get(void *data, + Evas_Object *obj __UNUSED__, + const char *part __UNUSED__) +{ + char buf[256]; + snprintf(buf, sizeof(buf), "Item mode %i", (int)(long)data); + return strdup(buf); +} + +static Evas_Object * +_tt_item_icon(void *data __UNUSED__, + Evas_Object *obj __UNUSED__, + Evas_Object *tt, + void *item __UNUSED__) +{ + Evas_Object *ic = elm_icon_add(tt); + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", + elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_resize(ic, 64, 64); + return ic; +} + +static Evas_Object * +_tt_item_icon2(void *data __UNUSED__, + Evas_Object *obj __UNUSED__, + Evas_Object *tt, + void *item __UNUSED__) +{ + Evas_Object *ic = elm_icon_add(tt); + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/images/logo.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + return ic; +} + +static Evas_Object * +_tt_item_icon3(void *data __UNUSED__, + Evas_Object *obj __UNUSED__, + Evas_Object *tt, + void *item __UNUSED__) +{ + int w, h, sw, sh; + Evas_Object *ic = elm_icon_add(tt); + + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/images/insanely_huge_test_image.jpg", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_size_get(ic, &w, &h); + elm_win_screen_size_get(tt, NULL, NULL, &sw, &sh); + if ((w > sw) || (h > sh)) + { + float sc = 0; + if ((float)w / (float)sw >= 0.8) + sc = ((float)sw * 0.8) / (float)w; + else if ((float)h / (float)sh >= 0.8) + sc = ((float)sh * 0.8) / (float)h; + if (sc) elm_object_scale_set(ic, sc); + } + return ic; +} + +static Evas_Object * +_tt_item_label(void *data __UNUSED__, + Evas_Object *obj __UNUSED__, + Evas_Object *tt, + void *item __UNUSED__) +{ + Evas_Object *l = elm_label_add(tt); + elm_object_text_set(l, "Something useful here?" + "No probably not, but this is a super long label" + "which probably breaks on your system, now doesn't it?" + "Yeah, I thought so."); + elm_label_line_wrap_set(l, ELM_WRAP_MIXED); + return l; +} + +static void +_tt_item_icon_del(void *data, + Evas_Object *obj __UNUSED__, + void *event_info) +{ + // test to check for del_cb behavior! + printf("_tt_icon_del: data=%ld (== 456?), event_info=%p\n", + (long)data, event_info); +} + +static void +_tt_text_replace(void *data __UNUSED__, + Evas_Object *obj, + void *event_info __UNUSED__) +{ + static int count = 0; + char buf[64]; + snprintf(buf, sizeof(buf), "count=%d", count); + count++; + elm_object_tooltip_text_set(obj, buf); +} + +static void +_tt_timer_del(void *data __UNUSED__, + Evas *e __UNUSED__, + Evas_Object *obj, + void *event_info __UNUSED__) +{ + Ecore_Timer *timer = evas_object_data_del(obj, "test-timer"); + if (!timer) return; + ecore_timer_del(timer); +} + +static Eina_Bool +_tt_text_replace_timer_cb(void *data) +{ + _tt_text_replace(NULL, data, NULL); + return EINA_TRUE; +} + +static void +_tt_text_replace_timed(void *data __UNUSED__, + Evas_Object *obj, + void *event_info __UNUSED__) +{ + Ecore_Timer *timer = evas_object_data_get(obj, "test-timer"); + if (timer) + { + ecore_timer_del(timer); + evas_object_data_del(obj, "test-timer"); + elm_object_text_set(obj, "Simple text tooltip, click to start" + " changed timed"); + return; + } + + timer = ecore_timer_add(1.5, _tt_text_replace_timer_cb, obj); + evas_object_data_set(obj, "test-timer", timer); + elm_object_text_set(obj, "Simple text tooltip, click to stop changed" + " timed"); +} + +static Evas_Object * +_tt_icon(void *data __UNUSED__, + Evas_Object *obj __UNUSED__, + Evas_Object *tt) +{ + Evas_Object *ic = elm_icon_add(tt); + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", + elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_resize(ic, 64, 64); + return ic; +} + +static Evas_Object * +_tt_icon2(void *data __UNUSED__, + Evas_Object *obj __UNUSED__, + Evas_Object *tt) +{ + Evas_Object *ic = elm_icon_add(tt); + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "%s/images/icon_00.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_resize(ic, 64, 64); + return ic; +} + +static void +_tt_icon_del(void *data, + Evas_Object *obj __UNUSED__, + void *event_info) +{ + // test to check for del_cb behavior! + printf("_tt_icon_del: data=%ld (== 123?), event_info=%p\n", + (long)data, event_info); +} + +static Eina_Bool +_tt_icon_replace_timer_cb(void *data) +{ + static int current = 0; + + elm_object_tooltip_content_cb_set + (data, current ? _tt_icon2 : _tt_icon, NULL, NULL); + + current = !current; + return EINA_TRUE; +} + +static void +_tt_icon_replace_timed(void *data __UNUSED__, + Evas_Object *obj, + void *event_info __UNUSED__) +{ + Ecore_Timer *timer = evas_object_data_get(obj, "test-timer"); + if (timer) + { + ecore_timer_del(timer); + evas_object_data_del(obj, "test-timer"); + elm_object_text_set(obj, "Icon tooltip, click to start changed" + " timed"); + return; + } + + timer = ecore_timer_add(1.5, _tt_icon_replace_timer_cb, obj); + evas_object_data_set(obj, "test-timer", timer); + elm_object_text_set(obj, "Icon tooltip, click to stop changed timed"); +} + +static Eina_Bool +_tt_style_replace_timer_cb(void *data) +{ + static int current = 0; + elm_object_tooltip_style_set(data, current ? NULL : "transparent"); + current = !current; + return EINA_TRUE; +} + +static void +_tt_style_replace_timed(void *data __UNUSED__, + Evas_Object *obj, + void *event_info __UNUSED__) +{ + Ecore_Timer *timer = evas_object_data_get(obj, "test-timer"); + if (timer) + { + ecore_timer_del(timer); + evas_object_data_del(obj, "test-timer"); + elm_object_text_set(obj, "Icon tooltip style, click to start" + " changed timed"); + return; + } + + timer = ecore_timer_add(1.5, _tt_style_replace_timer_cb, obj); + evas_object_data_set(obj, "test-timer", timer); + elm_object_text_set(obj, "Icon tooltip style, click to stop changed" + " timed"); +} + +static void +_tt_visible_lock_toggle(void *data __UNUSED__, + Evas_Object *obj, + void *event_info __UNUSED__) +{ + static int locked = 0; + + locked = !locked; + if (locked) + { + elm_object_text_set(obj, "Locked tooltip visibility"); + elm_object_tooltip_text_set(obj, "This tooltip is locked" + " visible,
click the button" + " to unlock!"); + elm_object_tooltip_show(obj); + } + else + { + elm_object_text_set(obj, "Unlocked tooltip visibility"); + elm_object_tooltip_text_set(obj, "This tooltip is unlocked" + " visible,
click the button" + " to lock!"); + elm_object_tooltip_hide(obj); + } +} + +TEST_START(test_tooltip) +{ + Evas_Object *bg, *bx, *tb, *bt, *se, *lst; + Elm_Object_Item *tb_it; + Elm_List_Item *li; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + tb = elm_toolbar_add(win); + elm_toolbar_homogeneous_set(tb, 0); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, 0.0); + elm_box_pack_end(bx, tb); + evas_object_show(tb); + + tb_it = elm_toolbar_item_append(tb, NULL, "Open", NULL, NULL); + elm_toolbar_item_tooltip_text_set(tb_it, "Opens a file"); + + tb_it = elm_toolbar_item_append(tb, NULL, "Icon", NULL, NULL); + elm_toolbar_item_tooltip_content_cb_set + (tb_it, _tt_item_icon, (void *)456L, _tt_item_icon_del); + elm_toolbar_item_tooltip_style_set(tb_it, "transparent"); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Simple text tooltip"); + elm_object_tooltip_text_set(bt, "Simple text tooltip"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Simple text tooltip, click to change"); + elm_object_tooltip_text_set(bt, "Initial"); + evas_object_smart_callback_add(bt, "clicked", _tt_text_replace, NULL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Simple text tooltip, click to start" + " changed timed"); + elm_object_tooltip_text_set(bt, "Initial"); + evas_object_smart_callback_add(bt, "clicked", _tt_text_replace_timed, + NULL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_event_callback_add(bt, EVAS_CALLBACK_DEL, _tt_timer_del, + NULL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Icon tooltip"); + elm_object_tooltip_content_cb_set(bt, _tt_icon, (void *)123L, + _tt_icon_del); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Icon tooltip, click to start changed timed"); + elm_object_tooltip_content_cb_set(bt, _tt_icon, NULL, NULL); + evas_object_smart_callback_add(bt, "clicked", _tt_icon_replace_timed, + NULL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_event_callback_add(bt, EVAS_CALLBACK_DEL, _tt_timer_del, + NULL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Transparent Icon tooltip"); + elm_object_tooltip_content_cb_set(bt, _tt_icon, NULL, NULL); + elm_object_tooltip_style_set(bt, "transparent"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Icon tooltip style, click to start changed" + " timed"); + elm_object_tooltip_content_cb_set(bt, _tt_icon, NULL, NULL); + evas_object_smart_callback_add(bt, "clicked", _tt_style_replace_timed, + NULL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_event_callback_add(bt, EVAS_CALLBACK_DEL, _tt_timer_del, + NULL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Unlocked tooltip visibility"); + elm_object_tooltip_text_set(bt, "This tooltip is unlocked visible,
" + " click the button to lock!"); + evas_object_smart_callback_add(bt, "clicked", _tt_visible_lock_toggle, + NULL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + se = elm_entry_add(win); + elm_entry_scrollable_set(se, EINA_TRUE); + evas_object_size_hint_weight_set(se, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(se, EVAS_HINT_FILL, 0.5); + elm_entry_scrollbar_policy_set(se, ELM_SCROLLER_POLICY_OFF, + ELM_SCROLLER_POLICY_OFF); + elm_entry_entry_set(se, "Hello, some scrolled entry here!"); + elm_object_tooltip_text_set(se, "Type something here!"); + elm_entry_single_line_set(se, 1); + elm_box_pack_end(bx, se); + evas_object_show(se); + + lst = elm_list_add(win); + li = elm_list_item_append(lst, "Hello", NULL, NULL, NULL, NULL); + elm_list_item_tooltip_content_cb_set(li, _tt_item_label, NULL, NULL); + elm_list_item_tooltip_size_restrict_disable(li, EINA_TRUE); + li = elm_list_item_append(lst, "Icon Tooltip", NULL, NULL, NULL, NULL); + elm_list_item_tooltip_content_cb_set(li, _tt_item_icon, NULL, NULL); + li = elm_list_item_append(lst, "Big Icon Tooltip", NULL, NULL, NULL, NULL); + elm_list_item_tooltip_content_cb_set(li, _tt_item_icon2, NULL, NULL); + elm_list_item_tooltip_style_set(li, "transparent"); + elm_list_item_tooltip_size_restrict_disable(li, EINA_TRUE); + li = elm_list_item_append(lst, "Insanely Big Icon Tooltip", NULL, NULL, NULL, NULL); + elm_list_item_tooltip_content_cb_set(li, _tt_item_icon3, NULL, NULL); + elm_list_item_tooltip_style_set(li, "transparent"); + elm_list_item_tooltip_size_restrict_disable(li, EINA_TRUE); + evas_object_size_hint_weight_set(lst, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(lst, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_min_set(lst, 100, 100); + elm_list_go(lst); + elm_box_pack_end(bx, lst); + evas_object_show(lst); + + evas_object_resize(win, 320, 580); + evas_object_show(win); +} +TEST_END + +TEST_START(test_tooltip2) +{ + Evas_Object *bg, *bx, *grid, *gl; + Elm_Genlist_Item *it1, *it2, *it3; + static Testitem ti[144]; + int i, n; + char buf[PATH_MAX]; + const char *img[9] = + { + "panel_01.jpg", + "plant_01.jpg", + "rock_01.jpg", + "rock_02.jpg", + "sky_01.jpg", + "sky_02.jpg", + "sky_03.jpg", + "sky_04.jpg", + "wood_01.jpg", + }; + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + grid = elm_gengrid_add(win); + elm_gengrid_item_size_set(grid, 100, 100); + elm_gengrid_horizontal_set(grid, EINA_FALSE); + elm_gengrid_multi_select_set(grid, EINA_TRUE); + evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + + gic.item_style = "default"; + gic.func.text_get = grdt_lbl_get; + gic.func.content_get = grdt_content_get; + + n = 0; + for (i = 0; i < 9; i++) + { + snprintf(buf, sizeof(buf), "%s/images/%s", elm_app_data_dir_get(), + img[n]); + n++; + ti[i].mode = i; + ti[i].path = eina_stringshare_add(buf); + ti[i].item = elm_gengrid_item_append(grid, &gic, &(ti[i]), NULL, + NULL); + if (n % 2) + elm_gengrid_item_tooltip_text_set(ti[i].item, "Testing X"); + else + elm_gengrid_item_tooltip_text_set(ti[i].item, "Testing Y"); + if (!(i % 5)) + elm_gengrid_item_selected_set(ti[i].item, EINA_TRUE); + } + + elm_box_pack_end(bx, grid); + evas_object_show(grid); + + gl = elm_genlist_add(win); + evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + + itct.item_style = "default"; + itct.func.text_get = gltt_text_get; + + it1 = elm_genlist_item_append(gl, &itct, (void *)1, NULL, + ELM_GENLIST_ITEM_SUBITEMS, NULL, NULL); + it2 = elm_genlist_item_append(gl, &itct, (void *)2, NULL, + ELM_GENLIST_ITEM_SUBITEMS, NULL, NULL); + it3 = elm_genlist_item_append(gl, &itct, (void *)3, NULL, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + + elm_genlist_item_tooltip_text_set(it1, "Testing 1"); + elm_genlist_item_tooltip_text_set(it2, "Testing 2"); + elm_genlist_item_tooltip_text_set(it3, "Testing 3"); + + evas_object_smart_callback_add(gl, "expand,request", gltt_exp_req, gl); + evas_object_smart_callback_add(gl, "contract,request", gltt_con_req, + gl); + evas_object_smart_callback_add(gl, "expanded", gltt_exp, gl); + evas_object_smart_callback_add(gl, "contracted", gltt_con, gl); + + elm_box_pack_end(bx, gl); + evas_object_show(gl); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_transit.c b/src/bin/test_transit.c new file mode 100644 index 0000000..0d1ded0 --- /dev/null +++ b/src/bin/test_transit.c @@ -0,0 +1,590 @@ +#include +#include "tsuite.h" +typedef struct _Custom_Effect Custom_Effect; + +struct _Custom_Effect +{ + struct _size + { + Evas_Coord w, h; + } from, to; +}; + +static void +_custom_op(Elm_Transit_Effect *effect, Elm_Transit *transit, double progress) +{ + if (!effect) return; + Evas_Coord w, h; + Evas_Object *obj; + const Eina_List *elist; + + Custom_Effect *custom_effect = effect; + const Eina_List *objs = elm_transit_objects_get(transit); + + if (progress < 0.5) + { + h = custom_effect->from.h + (custom_effect->to.h * progress * 2); + w = custom_effect->from.w; + } + else + { + h = custom_effect->from.h + custom_effect->to.h; + w = custom_effect->from.w + \ + (custom_effect->to.w * (progress - 0.5) * 2); + } + + EINA_LIST_FOREACH(objs, elist, obj) + evas_object_resize(obj, w, h); + +} + +static Elm_Transit_Effect * +_custom_context_new(Evas_Coord from_w, Evas_Coord from_h, Evas_Coord to_w, Evas_Coord to_h) +{ + Custom_Effect *custom_effect; + + custom_effect = calloc(1, sizeof(Custom_Effect)); + if (!custom_effect) return NULL; + + custom_effect->from.w = from_w; + custom_effect->from.h = from_h; + custom_effect->to.w = to_w - from_w; + custom_effect->to.h = to_h - from_h; + + return custom_effect; +} + +static void +_custom_context_free(Elm_Transit_Effect *effect, Elm_Transit *transit __UNUSED__) +{ + Custom_Effect *custom_effect = effect; + free(custom_effect); +} + +static void +_transit_rotation_translation_color(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + Elm_Transit *trans; + + trans = elm_transit_add(); + elm_transit_object_add(trans, obj); + elm_transit_auto_reverse_set(trans, EINA_TRUE); + elm_transit_repeat_times_set(trans, 2); + + /* Translation Effect */ + elm_transit_effect_translation_add(trans, -70.0, -150.0, 70.0, 150.0); + + /* Color Effect */ + elm_transit_effect_color_add(trans, 100, 255, 100, 255, 200, 50, 200, 50); + + /* Rotation Effect */ + elm_transit_effect_rotation_add(trans, 0.0, 135.0); + + elm_transit_duration_set(trans, 5.0); + elm_transit_go(trans); +} + +static void +_transit_wipe(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + Elm_Transit *trans; + + trans = elm_transit_add(); + elm_transit_object_add(trans, obj); + elm_transit_auto_reverse_set(trans, EINA_TRUE); + + elm_transit_effect_wipe_add(trans, + ELM_TRANSIT_EFFECT_WIPE_TYPE_HIDE, + ELM_TRANSIT_EFFECT_WIPE_DIR_RIGHT); + + elm_transit_duration_set(trans, 5.0); + elm_transit_go(trans); +} + +static void +_transit_del_cb(void *data, Elm_Transit *transit __UNUSED__) +{ + evas_object_freeze_events_set(data, EINA_FALSE); +} + +static void +_transit_image_animation(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Eina_List *images = NULL; + char buf[PATH_MAX]; + Elm_Transit *trans; + Evas_Object *ic = data; + + snprintf(buf, sizeof(buf), "%s/images/icon_19.png", elm_app_data_dir_get()); + images = eina_list_append(images, eina_stringshare_add(buf)); + + snprintf(buf, sizeof(buf), "%s/images/icon_00.png", elm_app_data_dir_get()); + images = eina_list_append(images, eina_stringshare_add(buf)); + + snprintf(buf, sizeof(buf), "%s/images/icon_11.png", elm_app_data_dir_get()); + images = eina_list_append(images, eina_stringshare_add(buf)); + + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + images = eina_list_append(images, eina_stringshare_add(buf)); + + trans = elm_transit_add(); + elm_transit_del_cb_set(trans, _transit_del_cb, obj); + elm_transit_object_add(trans, ic); + elm_transit_effect_image_animation_add(trans, images); + elm_transit_duration_set(trans, 5.0); + elm_transit_go(trans); + + evas_object_freeze_events_set(obj, EINA_TRUE); +} + +static void +_transit_resizing(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Elm_Transit *trans; + + trans = elm_transit_add(); + elm_transit_object_add(trans, obj); + + elm_transit_effect_resizing_add(trans, 100, 50, 300, 150); + + elm_transit_duration_set(trans, 5.0); + elm_transit_go(trans); +} + +static void +_transit_flip(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Elm_Transit *trans; + Evas_Object *obj2 = data; + + trans = elm_transit_add(); + elm_transit_object_add(trans, obj); + elm_transit_object_add(trans, obj2); + + elm_transit_effect_flip_add(trans, ELM_TRANSIT_EFFECT_FLIP_AXIS_X, EINA_TRUE); + + elm_transit_duration_set(trans, 5.0); + elm_transit_go(trans); +} + +static void +_transit_zoom(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Elm_Transit *trans; + + trans = elm_transit_add(); + elm_transit_object_add(trans, obj); + + elm_transit_effect_zoom_add(trans, 1.0, 3.0); + + elm_transit_duration_set(trans, 5.0); + elm_transit_go(trans); +} + +static void +_transit_blend(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Elm_Transit *trans; + Evas_Object *obj2 = data; + + trans = elm_transit_add(); + elm_transit_object_add(trans, obj); + elm_transit_object_add(trans, obj2); + + elm_transit_effect_blend_add(trans); + + elm_transit_duration_set(trans, 5.0); + elm_transit_go(trans); +} + +static void +_transit_fade(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Elm_Transit *trans; + Evas_Object *obj2 = data; + + trans = elm_transit_add(); + elm_transit_object_add(trans, obj); + elm_transit_object_add(trans, obj2); + + elm_transit_effect_fade_add(trans); + + elm_transit_duration_set(trans, 5.0); + elm_transit_go(trans); +} + +static void +_transit_resizable_flip(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Elm_Transit *trans; + Evas_Object *obj2 = data; + + trans = elm_transit_add(); + elm_transit_object_add(trans, obj); + elm_transit_object_add(trans, obj2); + + elm_transit_effect_resizable_flip_add(trans, ELM_TRANSIT_EFFECT_FLIP_AXIS_Y, EINA_TRUE); + + elm_transit_duration_set(trans, 5.0); + elm_transit_go(trans); +} + +/* Translation, Rotation, Color, Wipe, ImagemAnimation Effect */ +TEST_START(test_transit) +{ + Evas_Object *bg, *bx, *bt, *ic; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_size_hint_min_set(bx, 318, 318); + evas_object_show(bx); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/icon_11.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + + bt = elm_button_add(win); + elm_object_text_set(bt, "ImageAnimation Effect"); + elm_object_content_set(bt, ic); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_show(ic); + evas_object_smart_callback_add(bt, "clicked", _transit_image_animation, ic); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Color, Rotation and Translation"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_smart_callback_add(bt, "clicked", + _transit_rotation_translation_color, NULL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Wipe Effect"); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + evas_object_smart_callback_add(bt, "clicked", _transit_wipe, NULL); + + evas_object_show(win); +} +TEST_END + +/* Resizing Effect */ +TEST_START(test_transit2) +{ + Evas_Object *bg, *bt; + + evas_object_resize(win, 400, 400); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Resizing Effect"); + evas_object_show(bt); + evas_object_move(bt, 50, 100); + evas_object_resize(bt, 100, 50); + evas_object_smart_callback_add(bt, "clicked", _transit_resizing, NULL); + + evas_object_resize(win, 400, 400); + evas_object_show(win); +} +TEST_END + +/* Flip Effect */ +TEST_START(test_transit3) +{ + Evas_Object *bg, *bt, *bt2; + + evas_object_resize(win, 300, 300); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Front Button - Flip Effect"); + evas_object_show(bt); + evas_object_move(bt, 50, 50); + evas_object_resize(bt, 200, 200); + + bt2 = elm_button_add(win); + elm_object_text_set(bt2, "Back Button - Flip Effect"); + evas_object_move(bt2, 50, 50); + evas_object_resize(bt2, 200, 200); + + evas_object_resize(win, 300, 300); + evas_object_show(win); + + evas_object_smart_callback_add(bt, "clicked", _transit_flip, bt2); + evas_object_smart_callback_add(bt2, "clicked", _transit_flip, bt); +} +TEST_END + +/* Zoom Effect */ +TEST_START(test_transit4) +{ + Evas_Object *bg, *bt; + + evas_object_resize(win, 300, 300); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Zoom Effect"); + evas_object_resize(bt, 100, 50); + evas_object_move(bt, 100, 125); + evas_object_show(bt); + + evas_object_smart_callback_add(bt, "clicked", _transit_zoom, NULL); + + evas_object_resize(win, 300, 300); + evas_object_show(win); +} +TEST_END + +/* Blend Effect */ +TEST_START(test_transit5) +{ + Evas_Object *bg, *bt, *bt2, *ic; + + char buf[PATH_MAX]; + evas_object_resize(win, 300, 300); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/rock_01.jpg", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_max_set(ic, 50, 50); + + bt = elm_button_add(win); + elm_object_content_set(bt, ic); + elm_object_text_set(bt, "Before Button - Blend Effect"); + evas_object_move(bt, 25, 125); + evas_object_resize(bt, 250, 50); + evas_object_show(bt); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/rock_02.jpg", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_max_set(ic, 50, 50); + + bt2 = elm_button_add(win); + elm_object_content_set(bt2, ic); + elm_object_text_set(bt2, "After Button - Blend Effect"); + evas_object_move(bt2, 25, 125); + evas_object_resize(bt2, 250, 50); + + evas_object_resize(win, 300, 300); + evas_object_show(win); + + evas_object_smart_callback_add(bt, "clicked", _transit_blend, bt2); + evas_object_smart_callback_add(bt2, "clicked", _transit_blend, bt); +} +TEST_END + +/* Fade Effect */ +TEST_START(test_transit6) +{ + Evas_Object *bg, *bt, *bt2, *ic; + + char buf[PATH_MAX]; + evas_object_resize(win, 300, 300); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/rock_01.jpg", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_max_set(ic, 50, 50); + + bt = elm_button_add(win); + elm_object_content_set(bt, ic); + elm_object_text_set(bt, "Before Button - Fade Effect"); + evas_object_move(bt, 25, 125); + evas_object_resize(bt, 250, 50); + evas_object_show(bt); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/rock_02.jpg", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_max_set(ic, 50, 50); + + bt2 = elm_button_add(win); + elm_object_content_set(bt2, ic); + elm_object_text_set(bt2, "After Button - Fade Effect"); + evas_object_move(bt2, 25, 125); + evas_object_resize(bt2, 250, 50); + + evas_object_resize(win, 300, 300); + evas_object_show(win); + + evas_object_smart_callback_add(bt, "clicked", _transit_fade, bt2); + evas_object_smart_callback_add(bt2, "clicked", _transit_fade, bt); +} +TEST_END + +/* Resizable Flip Effect */ +TEST_START(test_transit7) +{ + Evas_Object *bg, *bt, *bt2; + + evas_object_resize(win, 400, 400); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Front Button - Resizable Flip Effect"); + evas_object_show(bt); + evas_object_move(bt, 50, 100); + evas_object_resize(bt, 250, 30); + + bt2 = elm_button_add(win); + elm_object_text_set(bt2, "Back Button - Resizable Flip Effect"); + evas_object_move(bt2, 50, 100); + evas_object_resize(bt2, 300, 200); + + evas_object_resize(win, 400, 400); + evas_object_show(win); + + evas_object_smart_callback_add(bt, "clicked", _transit_resizable_flip, bt2); + evas_object_smart_callback_add(bt2, "clicked", _transit_resizable_flip, bt); +} +TEST_END + +/* Custom Effect */ +TEST_START(test_transit8) +{ + Evas_Object *bg, *bt; + Elm_Transit *trans; + Elm_Transit_Effect *effect_context; + + evas_object_resize(win, 400, 400); + evas_object_show(win); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Button - Custom Effect"); + evas_object_show(bt); + evas_object_move(bt, 50, 50); + evas_object_resize(bt, 150, 150); + + /* Adding Transit */ + trans = elm_transit_add(); + elm_transit_auto_reverse_set(trans, EINA_TRUE); + elm_transit_tween_mode_set(trans, ELM_TRANSIT_TWEEN_MODE_DECELERATE); + effect_context = _custom_context_new(150, 150, 50, 50); + elm_transit_object_add(trans, bt); + elm_transit_effect_add(trans, + _custom_op, effect_context, + _custom_context_free); + elm_transit_duration_set(trans, 5.0); + elm_transit_repeat_times_set(trans, -1); + elm_transit_go(trans); + + evas_object_resize(win, 400, 400); + evas_object_show(win); +} +TEST_END + +/* Chain Transit Effect */ +TEST_START(test_transit9) +{ + Evas_Object *bg, *bt, *bt2, *bt3, *bt4; + Elm_Transit *trans, *trans2, *trans3, *trans4; + + evas_object_resize(win, 400, 400); + evas_object_show(win); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Chain 1"); + evas_object_resize(bt, 100, 100); + evas_object_move(bt, 0, 0); + evas_object_show(bt); + + bt2 = elm_button_add(win); + elm_object_text_set(bt2, "Chain 2"); + evas_object_resize(bt2, 100, 100); + evas_object_move(bt2, 300, 0); + evas_object_show(bt2); + + bt3 = elm_button_add(win); + elm_object_text_set(bt3, "Chain 3"); + evas_object_resize(bt3, 100, 100); + evas_object_move(bt3, 300, 300); + evas_object_show(bt3); + + bt4 = elm_button_add(win); + elm_object_text_set(bt4, "Chain 4"); + evas_object_resize(bt4, 100, 100); + evas_object_move(bt4, 0, 300); + evas_object_show(bt4); + + trans = elm_transit_add(); + elm_transit_tween_mode_set(trans, ELM_TRANSIT_TWEEN_MODE_ACCELERATE); + elm_transit_effect_translation_add(trans, 0, 0, 300, 0); + elm_transit_object_add(trans, bt); + elm_transit_duration_set(trans, 1); + elm_transit_objects_final_state_keep_set(trans, EINA_TRUE); + elm_transit_go(trans); + + trans2 = elm_transit_add(); + elm_transit_tween_mode_set(trans2, ELM_TRANSIT_TWEEN_MODE_ACCELERATE); + elm_transit_effect_translation_add(trans2, 0, 0, 0, 300); + elm_transit_object_add(trans2, bt2); + elm_transit_duration_set(trans2, 1); + elm_transit_objects_final_state_keep_set(trans2, EINA_TRUE); + elm_transit_chain_transit_add(trans, trans2); + + trans3 = elm_transit_add(); + elm_transit_tween_mode_set(trans3, ELM_TRANSIT_TWEEN_MODE_ACCELERATE); + elm_transit_effect_translation_add(trans3, 0, 0, -300, 0); + elm_transit_object_add(trans3, bt3); + elm_transit_duration_set(trans3, 1); + elm_transit_objects_final_state_keep_set(trans3, EINA_TRUE); + elm_transit_chain_transit_add(trans2, trans3); + + trans4 = elm_transit_add(); + elm_transit_tween_mode_set(trans4, ELM_TRANSIT_TWEEN_MODE_ACCELERATE); + elm_transit_effect_translation_add(trans4, 0, 0, 0, -300); + elm_transit_object_add(trans4, bt4); + elm_transit_duration_set(trans4, 1); + elm_transit_objects_final_state_keep_set(trans4, EINA_TRUE); + elm_transit_chain_transit_add(trans3, trans4); + + evas_object_resize(win, 400, 400); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_weather.c b/src/bin/test_weather.c new file mode 100644 index 0000000..44b0b64 --- /dev/null +++ b/src/bin/test_weather.c @@ -0,0 +1,167 @@ +#include +#include "tsuite.h" +#ifdef HAVE_ELEMENTARY_EWEATHER +# include "EWeather_Smart.h" +#endif + +#ifdef HAVE_ELEMENTARY_EWEATHER +static Evas_Object *en, *hv, *fl; +static Evas_Object *weather[2]; +static int current = 0; +static Eina_Module *module[2]; + +static void +_first_city_cb(void *data __UNUSED__, Evas_Object *o __UNUSED__, void *event_info __UNUSED__) +{ + if (!current) return; + current = 0; + elm_flip_go(fl, ELM_FLIP_ROTATE_YZ_CENTER_AXIS); +} + +static void +_second_city_cb(void *dat __UNUSED__, Evas_Object *o __UNUSED__, void *event_info __UNUSED__) +{ + if (current) return; + current = 1; + elm_flip_go(fl, ELM_FLIP_ROTATE_XZ_CENTER_AXIS); +} + +static void _apply_cb(void *data __UNUSED__, Evas_Object *o __UNUSED__, void *event_info __UNUSED__) +{ + EWeather *eweather = eweather_object_eweather_get(weather[current]); + + if (module[current]) + eweather_plugin_set(eweather, module[current]); + eweather_code_set(eweather, elm_entry_entry_get(en)); + printf("CURRENT %d %p %p\n", current, module[current], eweather); +} + +static void +_hover_select_cb(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + EWeather *eweather = eweather_object_eweather_get(weather[0]); + module[0] = eweather_plugin_search(eweather, elm_hoversel_item_label_get(event_info)); + + eweather = eweather_object_eweather_get(weather[1]); + module[1] = eweather_plugin_search(eweather, elm_hoversel_item_label_get(event_info)); + printf("%p %p\n", module[0], module[1]); +} +#endif + +TEST_START(test_weather) +{ + Evas_Object *bg; +#ifdef HAVE_ELEMENTARY_EWEATHER + Evas_Object *bx, *bx0, *bt; + EWeather *eweather; + Eina_Array_Iterator it; + Eina_Array *array; + Eina_Module *m; + unsigned int i; +#endif + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + evas_object_show(bg); + +#ifdef HAVE_ELEMENTARY_EWEATHER + bx = elm_box_add(win); + elm_win_resize_object_add(win, bx); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx); + + fl = elm_flip_add(win); + evas_object_size_hint_align_set(fl, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(fl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bx, fl); + + current = 0; + + module[0] = NULL; + weather[0] = eweather_object_add(evas_object_evas_get(win)); + evas_object_size_hint_weight_set(weather[0], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(weather[0], -1.0, -1.0); + elm_flip_content_front_set(fl, weather[0]); + evas_object_show(weather[0]); + + module[1] = NULL; + weather[1] = eweather_object_add(evas_object_evas_get(win)); + eweather = eweather_object_eweather_get(weather[1]); + evas_object_size_hint_weight_set(weather[1], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(weather[1], -1.0, -1.0); + elm_flip_content_back_set(fl, weather[1]); + evas_object_show(weather[1]); + + evas_object_show(fl); + + // + bx0 = elm_box_add(win); + elm_box_horizontal_set(bx0, EINA_TRUE); + evas_object_size_hint_weight_set(bx0, 1.0, 0.0); + elm_box_pack_end(bx, bx0); + evas_object_show(bx0); + + bt = elm_button_add(win); + elm_object_text_set(bt, "First city"); + evas_object_show(bt); + elm_box_pack_end(bx0, bt); + evas_object_smart_callback_add(bt, "clicked", _first_city_cb, NULL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Second city"); + evas_object_show(bt); + elm_box_pack_end(bx0, bt); + evas_object_smart_callback_add(bt, "clicked", _second_city_cb, NULL); + // + + // + bx0 = elm_box_add(win); + elm_box_horizontal_set(bx0, EINA_TRUE); + evas_object_size_hint_weight_set(bx0, 1.0, 0.0); + elm_box_pack_end(bx, bx0); + evas_object_show(bx0); + + hv = elm_hoversel_add(win); + elm_hoversel_hover_parent_set(hv, win); + elm_object_text_set(hv, "data source"); + evas_object_size_hint_weight_set(hv, 0.0, 0.0); + evas_object_size_hint_align_set(hv, 0.5, 0.5); + elm_box_pack_end(bx0, hv); + evas_object_show(hv); + + array = eweather_plugins_list_get(eweather); + + EINA_ARRAY_ITER_NEXT(array, i, m, it) + elm_hoversel_item_add(hv, eweather_plugin_name_get(eweather, i), NULL, ELM_ICON_NONE, _hover_select_cb, NULL); + + en = elm_entry_add(win); + elm_entry_line_wrap_set(en, ELM_WRAP_NONE); + elm_entry_single_line_set(en, EINA_TRUE); + elm_entry_entry_set(en, "Paris"); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx0, en); + evas_object_show(en); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Apply"); + evas_object_show(bt); + elm_box_pack_end(bx0, bt); + evas_object_smart_callback_add(bt, "clicked", _apply_cb, NULL); + // + + +#else + Evas_Object *lbl; + + lbl = elm_label_add(win); + elm_win_resize_object_add(win, lbl); + elm_object_text_set(lbl, "libeweather is required to display the forecast."); + evas_object_show(lbl); +#endif + + evas_object_resize(win, 244, 388); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_win_inline.c b/src/bin/test_win_inline.c new file mode 100644 index 0000000..317355d --- /dev/null +++ b/src/bin/test_win_inline.c @@ -0,0 +1,237 @@ +#include +#include "tsuite.h" +static void +fill(Evas_Object *win, Eina_Bool do_bg) +{ + Evas_Object *bg, *sc, *bx, *ic, *bb, *av, *en; + char buf[PATH_MAX]; + + if (do_bg) + { + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + } + + sc = elm_scroller_add(win); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, sc); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_entry_entry_set(en, "This is a single line"); + elm_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_single_line_set(en, 1); + evas_object_show(en); + elm_box_pack_end(bx, en); + + en = elm_entry_add(win); + elm_entry_scrollable_set(en, EINA_TRUE); + evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); + elm_entry_entry_set(en, "Entry 2"); + elm_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_entry_single_line_set(en, 1); + evas_object_show(en); + elm_box_pack_end(bx, en); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1); + + bb = elm_bubble_add(win); + elm_object_text_set(bb, "Message 3"); + elm_object_part_text_set(bb, "info", "10:32 4/11/2008"); + elm_object_part_content_set(bb, "icon", ic); + evas_object_show(ic); + evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL); + av = elm_anchorblock_add(win); + elm_anchorblock_hover_style_set(av, "popout"); + elm_anchorblock_hover_parent_set(av, win); + elm_object_text_set(av, + "Hi there. This is the most recent message in the " + "list of messages. It has one +61 432 1234 " + "(phone number) to click on."); + elm_object_content_set(bb, av); + evas_object_show(av); + elm_box_pack_end(bx, bb); + evas_object_show(bb); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); + + bb = elm_bubble_add(win); + elm_object_text_set(bb, "Message 2"); + elm_object_part_text_set(bb, "info", "7:16 27/10/2008"); + elm_object_part_content_set(bb, "icon", ic); + evas_object_show(ic); + evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL); + av = elm_anchorblock_add(win); + elm_anchorblock_hover_style_set(av, "popout"); + elm_anchorblock_hover_parent_set(av, win); + elm_object_text_set(av, + "Hey what are you doing? This is the second last message " + "Hi there. This is the most recent message in the " + "list. It's a longer one so it can wrap more and " + "contains a John contact " + "link in it to test popups on links. The idea is that " + "all SMS's are scanned for things that look like phone " + "numbers or names that are in your contacts list, and " + "if they are, they become clickable links that pop up " + "a menus of obvious actions to perform on this piece " + "of information. This of course can be later explicitly " + "done by links maybe running local apps or even being " + "web URL's too that launch the web browser and point it " + "to that URL. "); + elm_object_content_set(bb, av); + evas_object_show(av); + elm_box_pack_end(bx, bb); + evas_object_show(bb); + + ic = elm_icon_add(win); + snprintf(buf, sizeof(buf), "%s/images/logo_small.png", elm_app_data_dir_get()); + elm_icon_file_set(ic, buf, NULL); + elm_icon_scale_set(ic, 0, 0); + evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1); + + bb = elm_bubble_add(win); + elm_object_text_set(bb, "Message 1"); + elm_object_part_text_set(bb, "info", "20:47 18/6/2008"); + elm_object_part_content_set(bb, "icon", ic); + evas_object_show(ic); + evas_object_size_hint_weight_set(bb, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bb, EVAS_HINT_FILL, EVAS_HINT_FILL); + + av = elm_anchorblock_add(win); + elm_anchorblock_hover_style_set(av, "popout"); + elm_anchorblock_hover_parent_set(av, win); + elm_object_text_set(av, "This is a short message. "); + elm_object_content_set(bb, av); + evas_object_show(av); + elm_box_pack_end(bx, bb); + evas_object_show(bb); + + elm_object_content_set(sc, bx); + evas_object_show(bx); + + evas_object_show(sc); +} + +static void +cb_mouse_move(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Move *ev = event_info; + Evas_Object *orig = data; + Evas_Coord x, y; + Evas_Map *p; + int i, w, h; + + if (!ev->buttons) return; + evas_object_geometry_get(obj, &x, &y, NULL, NULL); + evas_object_move(obj, + x + (ev->cur.canvas.x - ev->prev.output.x), + y + (ev->cur.canvas.y - ev->prev.output.y)); + evas_object_image_size_get(orig, &w, &h); + p = evas_map_new(4); + evas_object_map_enable_set(orig, EINA_TRUE); + evas_object_raise(orig); + for (i = 0; i < 4; i++) + { + Evas_Object *hand; + char key[32]; + + snprintf(key, sizeof(key), "h-%i\n", i); + hand = evas_object_data_get(orig, key); + evas_object_raise(hand); + evas_object_geometry_get(hand, &x, &y, NULL, NULL); + x += 15; + y += 15; + evas_map_point_coord_set(p, i, x, y, 0); + if (i == 0) evas_map_point_image_uv_set(p, i, 0, 0); + else if (i == 1) evas_map_point_image_uv_set(p, i, w, 0); + else if (i == 2) evas_map_point_image_uv_set(p, i, w, h); + else if (i == 3) evas_map_point_image_uv_set(p, i, 0, h); + } + evas_object_map_set(orig, p); + evas_map_free(p); +} + +static void +create_handles(Evas_Object *obj) +{ + int i; + Evas_Coord x, y, w, h; + + evas_object_geometry_get(obj, &x, &y, &w, &h); + for (i = 0; i < 4; i++) + { + Evas_Object *hand; + char buf[PATH_MAX]; + char key[32]; + + hand = evas_object_image_filled_add(evas_object_evas_get(obj)); + evas_object_resize(hand, 31, 31); + snprintf(buf, sizeof(buf), "%s/images/pt.png", elm_app_data_dir_get()); + evas_object_image_file_set(hand, buf, NULL); + if (i == 0) evas_object_move(hand, x - 15, y - 15); + else if (i == 1) evas_object_move(hand, x + w - 15, y - 15); + else if (i == 2) evas_object_move(hand, x + w - 15, y + h - 15); + else if (i == 3) evas_object_move(hand, x - 15, y + h - 15); + evas_object_event_callback_add(hand, EVAS_CALLBACK_MOUSE_MOVE, cb_mouse_move, obj); + evas_object_show(hand); + snprintf(key, sizeof(key), "h-%i\n", i); + evas_object_data_set(obj, key, hand); + } +} + +TEST_START(test_win_inline) +{ + Evas_Object *bg, *win2, *win3; + char buf[PATH_MAX]; + + bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/plant_01.jpg", elm_app_data_dir_get()); + elm_bg_file_set(bg, buf, NULL); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + win2 = elm_win_add(win, "inlined", ELM_WIN_INLINED_IMAGE); + fill(win2, EINA_TRUE); + + evas_object_move(win2, 20, 60); + evas_object_resize(win2, 300, 200); + // image object for win2 is unlinked to its pos/size - so manual control + // this allows also for using map and other things with it. + evas_object_move(elm_win_inlined_image_object_get(win2), 20, 40); + evas_object_resize(elm_win_inlined_image_object_get(win2), 200, 320); + evas_object_show(win2); + + win3 = elm_win_add(win, "inlined", ELM_WIN_INLINED_IMAGE); + elm_win_alpha_set(win3, EINA_TRUE); + fill(win3, EINA_FALSE); + + evas_object_resize(win3, 300, 200); + evas_object_move(elm_win_inlined_image_object_get(win3), 80, 180); + evas_object_resize(elm_win_inlined_image_object_get(win3), 300, 200); + evas_object_show(win3); + + create_handles(elm_win_inlined_image_object_get(win3)); + + evas_object_resize(win, 400, 600); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/test_win_state.c b/src/bin/test_win_state.c new file mode 100644 index 0000000..122d36a --- /dev/null +++ b/src/bin/test_win_state.c @@ -0,0 +1,357 @@ +#include +#include "tsuite.h" +typedef struct _Testitem +{ + Elm_Genlist_Item *item; + int mode, onoff; +} Testitem; + +static int rotate_with_resize = 0; + +static void +my_bt_38_alpha_on(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + Evas_Object *bg = evas_object_data_get(win, "bg"); + evas_object_hide(bg); + elm_win_alpha_set(win, 1); +} + +static void +my_bt_38_alpha_off(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + Evas_Object *bg = evas_object_data_get(win, "bg"); + evas_object_show(bg); + elm_win_alpha_set(win, 0); +} + +static void +my_ck_38_resize(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ +// Evas_Object *win = data; + rotate_with_resize = elm_check_state_get(obj); +} + +static void +my_bt_38_rot_0(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + if (rotate_with_resize) + elm_win_rotation_with_resize_set(win, 0); + else + elm_win_rotation_set(win, 0); +} + +static void +my_bt_38_rot_90(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + if (rotate_with_resize) + elm_win_rotation_with_resize_set(win, 90); + else + elm_win_rotation_set(win, 90); +} + +static void +my_bt_38_rot_180(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + if (rotate_with_resize) + elm_win_rotation_with_resize_set(win, 180); + else + elm_win_rotation_set(win, 180); +} + +static void +my_bt_38_rot_270(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + if (rotate_with_resize) + elm_win_rotation_with_resize_set(win, 270); + else + elm_win_rotation_set(win, 270); +} +/* +static void +my_win_move(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Coord x, y; + elm_win_screen_position_get(obj, &x, &y); + printf("MOVE - win geom: %4i %4i\n", x, y); +} + +static void +_win_resize(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Coord w, h; + evas_object_geometry_get(obj, NULL, NULL, &w, &h); + printf("RESIZE - win geom: %4ix%4i\n", w, h); +} +*/ +static void +_win_foc_in(void *data __UNUSED__, Evas *e __UNUSED__, void *event_info __UNUSED__) +{ + printf("FOC IN\n"); +} + +static void +_win_foc_out(void *data __UNUSED__, Evas *e __UNUSED__, void *event_info __UNUSED__) +{ + printf("FOC OUT\n"); +} + +static void +_close_win(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + evas_object_del(data); +} + +TEST_START(test_win_state) +{ + Evas_Object *bg, *sl, *bx, *bx2, *bt, *ck; + + evas_event_callback_add(evas_object_evas_get(win), EVAS_CALLBACK_CANVAS_FOCUS_IN, _win_foc_in, NULL); + evas_event_callback_add(evas_object_evas_get(win), EVAS_CALLBACK_CANVAS_FOCUS_OUT, _win_foc_out, NULL); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + evas_object_data_set(win, "bg", bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Alpha On"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_alpha_on, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Alpha Off"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_alpha_off, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "Test"); + elm_slider_span_size_set(sl, 100); + evas_object_size_hint_align_set(sl, 0.5, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_slider_indicator_format_set(sl, "%3.0f"); + elm_slider_min_max_set(sl, 50, 150); + elm_slider_value_set(sl, 50); + elm_slider_inverted_set(sl, 1); + elm_box_pack_end(bx2, sl); + evas_object_show(sl); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + ck = elm_check_add(win); + elm_object_text_set(ck, "resize"); + elm_check_state_set(ck, rotate_with_resize); + evas_object_smart_callback_add(ck, "changed", my_ck_38_resize, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.02, 0.99); + evas_object_show(ck); + elm_box_pack_end(bx, ck); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Rot 0"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_rot_0, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Rot 90"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_rot_90, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Rot 180"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_rot_180, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Rot 270"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_rot_270, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 280, 400); + evas_object_show(win); +} +TEST_END + +TEST_START(test_win_state2) +{ + Evas_Object *bg, *sl, *bx, *bx2, *bt, *ck; + char buf[PATH_MAX]; + + elm_win_title_set(win, "Window States 2"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + snprintf(buf, sizeof(buf), "%s/images/sky_02.jpg", elm_app_data_dir_get()); + elm_bg_file_set(bg, buf, NULL); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + evas_object_data_set(win, "bg", bg); + + bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bx); + evas_object_show(bx); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Alpha On"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_alpha_on, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Alpha Off"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_alpha_off, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, 0.0, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_smart_callback_add(bt, "clicked", _close_win, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + sl = elm_slider_add(win); + elm_object_text_set(sl, "Override Redirect"); + elm_slider_span_size_set(sl, 100); + evas_object_size_hint_align_set(sl, 0.5, 0.5); + evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_slider_indicator_format_set(sl, "%3.0f"); + elm_slider_min_max_set(sl, 50, 150); + elm_slider_value_set(sl, 50); + elm_slider_inverted_set(sl, 1); + elm_box_pack_end(bx2, sl); + evas_object_show(sl); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + ck = elm_check_add(win); + elm_object_text_set(ck, "resize"); + elm_check_state_set(ck, rotate_with_resize); + evas_object_smart_callback_add(ck, "changed", my_ck_38_resize, win); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ck, 0.02, 0.99); + evas_object_show(ck); + elm_box_pack_end(bx, ck); + + bx2 = elm_box_add(win); + elm_box_horizontal_set(bx2, EINA_TRUE); + elm_box_homogeneous_set(bx2, EINA_TRUE); + evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(bx2, EVAS_HINT_FILL, EVAS_HINT_FILL); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Rot 0"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_rot_0, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Rot 90"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_rot_90, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Rot 180"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_rot_180, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Rot 270"); + evas_object_smart_callback_add(bt, "clicked", my_bt_38_rot_270, win); + evas_object_size_hint_fill_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx2, bt); + evas_object_show(bt); + + elm_box_pack_end(bx, bx2); + evas_object_show(bx2); + + evas_object_resize(win, 320, 480); + evas_object_show(win); +} +TEST_END diff --git a/src/bin/tsuite.c b/src/bin/tsuite.c new file mode 100644 index 0000000..9ac43d3 --- /dev/null +++ b/src/bin/tsuite.c @@ -0,0 +1,851 @@ +#define _GNU_SOURCE 1 + +#include +#include +#include "tsuite.h" + +#define IMAGE_FILENAME_EXT ".png" +#include +#include "tsuite_file_data.h" + +void test_3d(void); +void test_actionslider(void); +void test_anchorblock(void); +void test_anchorview(void); +void test_bg_plain(void); +void test_bg_image(void); +void test_bg_options(void); +void test_box_vert(void); +void test_box_vert2(void); +void test_box_horiz(void); +void test_button(void); +void test_bubble(void); +void test_calendar(void); +void test_calendar2(void); +void test_check(void); +void test_colorselector(void); +void test_conformant(void); +void test_conformant2(void); +void test_ctxpopup(void); +void test_cursor(void); +void test_cursor2(void); +void test_cursor3(void); +void test_diskselector(void); +void test_entry(void); +void test_entry_scrolled(void); +void test_entry3(void); +void test_entry4(void); +void test_entry5(void); +void test_entry_notepad(void); +void test_fileselector(void); +void test_fileselector_button(void); +void test_fileselector_entry(void); +void test_floating(void); +void test_focus(void); +void test_focus2(void); +void test_focus3(void); +void test_gengrid(void); +void test_gengrid2(void); +void test_genlist(void); +void test_genlist2(void); +void test_genlist3(void); +void test_genlist4(void); +void test_genlist5(void); +void test_genlist6(void); +void test_genlist7(void); +void test_genlist8(void); +void test_genlist9(void); +void test_genlist10(void); +void test_genlist11(void); +void test_glview(void); +void test_glview_simple(void); +void test_grid(void); +void test_hover(void); +void test_hover2(void); +void test_hoversel(void); +void test_index(void); +void test_index2(void); +void test_inwin(void); +void test_inwin2(void); +void test_label(void); +void test_list(void); +void test_list_horizontal(void); +void test_list2(void); +void test_list3(void); +void test_list4(void); +void test_list5(void); +void test_map(void); +void test_menu(void); +void test_naviframe(void); +void test_notify(void); +void test_pager(void); +void test_pager_slide(void); +void test_panel(void); +void test_panes(void); +void test_photo(void); +void test_photocam(void); +void test_progressbar(void); +void test_radio(void); +void test_scaling(void); +void test_scaling2(void); +void test_scroller(void); +void test_scroller2(void); +void test_segment_control(void); +void test_separator(void); +void test_slider(void); +void test_spinner(void); +void test_table(void); +void test_table2(void); +void test_table3(void); +void test_table4(void); +void test_table5(void); +void test_table6(void); +void test_thumb(void); +void test_toggle(void); +void test_toolbar(void); +void test_toolbar2(void); +void test_toolbar3(void); +void test_toolbar4(void); +void test_toolbar5(void); +void test_tooltip(void); +void test_tooltip2(void); +void test_weather(void); +void test_win_inline(void); +void test_win_state(void); +void test_win_state2(void); + +/* START - Some globals - may want to move these to Timer_Data struct later */ +static Lists_st *vr_list = NULL; +/* END - Some globals - may want to move these to Timer_Data struct later */ + +/** + * @internal + * + * @struct _Tsuite_Data + * Struct holds test-suite data-properties + * + * @ingroup Tsuite + */ +struct _Tsuite_Data +{ + char *name; /**< Test Name */ + int serial; /**< Serial number of currnen-file */ + api_data *api; + Evas *e; + Evas_Object *win; +}; +typedef struct _Tsuite_Data Tsuite_Data; + +/** + * @internal + * + * @struct _Test_Item + * Struct holds test-suite test / func pair. + * + * @ingroup Tsuite + */ +struct _Test_Item +{ /* Item type for array of test-names, test-func-ptr */ + char *name; + void (* func) (void); + Eina_Bool test; +}; +typedef struct _Test_Item Test_Item; + +static Tsuite_Data ts; +static Eina_Bool recording = EINA_FALSE; +static char *dest_dir = NULL; + +Eina_List * +_add_test(Eina_List *list, char *n, void (* f) (void), Eina_Bool t) +{ + Test_Item *item = malloc(sizeof(Test_Item)); + item->name = n; + item->func = f; + item->test = t; + return eina_list_append(list, item); +} + +int test_name_cmp(const void *data1, const void *data2) +{ + return strcmp(((Test_Item *) data1)->name, (char *) data2); +} + +Test_Item * +_set_test(Eina_List *list, char *n, Eina_Bool t) +{ + Test_Item *item = eina_list_search_unsorted(list, test_name_cmp, n); + if (item) + item->test = t; + + return item; +} + +static void (* _tsuite_evas_hook_init) (Lists_st *) = NULL; +static void (* _tsuite_evas_hook_reset) (void) = NULL; + +static void +_init_recording_funcs(void) +{ + _tsuite_evas_hook_init = dlsym(RTLD_DEFAULT, "tsuite_evas_hook_init"); + _tsuite_evas_hook_reset = dlsym(RTLD_DEFAULT, "tsuite_evas_hook_reset"); +} + +/** + * @internal + * + * This function initiates Tsuite_Data + * @param name defines test-name + * @param Pointer_Event Pointer to PE. + * + * @ingroup Tsuite + */ +void +tsuite_init(Evas_Object *win, char *name, api_data *d) +{ + tsuite_cleanup(); + if (!name) + return; + + ts.name = strdup(name); /* Freed by tsuite_cleanup */ + ts.win = win; + ts.api = d; + ts.api->win = win; + ts.e = evas_object_evas_get(ts.win); +} + +/** + * @internal + * + * This function do cleanup for Tsuite + * @param Tsuite_Data * data for cleanup. + * + * @ingroup Tsuite + */ +void +tsuite_cleanup(void) +{ + if (ts.name) + free(ts.name); + + if (ts.api) + { + if (ts.api->data && ts.api->free_data) + free(ts.api->data); + + free(ts.api); + } + + if (ts.win) + evas_object_del(ts.win); + + memset(&ts, 0, sizeof(ts)); +} + +char *tsuite_test_name_get() +{ + return ts.name; +} + +/** + * @internal + * + * This function takes actual shot and saves it in PNG + * @param data Tsuite_Data pointer initiated by user + * @param obj Window pointer + * @param obj name file name. Will use name_+serial if NULL + * + * @ingroup Tsuite + */ +void +tsuite_shot_do(Evas_Object *obj, char *name) +{ + Ecore_Evas *ee, *ee_orig; + Evas_Object *o; + unsigned int *pixels; + int w, h,dir_name_len = 0; + char *filename; + if (dest_dir) + dir_name_len = strlen(dest_dir) + 1; /* includes space of a '/' */ + + if (name) + { + filename = malloc(strlen(name) + strlen(IMAGE_FILENAME_EXT) + + dir_name_len + 4); + + if (dest_dir) + sprintf(filename, "%s/", dest_dir); + + sprintf(filename + dir_name_len, "%s%s", name, IMAGE_FILENAME_EXT); + } + else + { + filename = malloc(strlen(ts.name) + strlen(IMAGE_FILENAME_EXT) + + dir_name_len + 8); /* also space for serial */ + + ts.serial++; + if (dest_dir) + sprintf(filename, "%s/", dest_dir); + + sprintf(filename + dir_name_len, "%s_%d%s", ts.name ,ts.serial, + IMAGE_FILENAME_EXT); + } + + printf("in func <%s> name=<%s>\n", __func__, filename); + + /* A bit hackish, get the ecore_evas from the Evas canvas */ + ee_orig = evas_data_attach_get(evas_object_evas_get(obj)); + + ecore_evas_manual_render(ee_orig); + pixels = (void *)ecore_evas_buffer_pixels_get(ee_orig); + if (!pixels) return; + ecore_evas_geometry_get(ee_orig, NULL, NULL, &w, &h); + if ((w < 1) || (h < 1)) return; + ee = ecore_evas_buffer_new(1, 1); + o = evas_object_image_add(ecore_evas_get(ee)); + evas_object_image_alpha_set(o, ecore_evas_alpha_get(ee_orig)); + evas_object_image_size_set(o, w, h); + evas_object_image_data_set(o, pixels); + + if (!evas_object_image_save(o, filename, NULL, NULL)) + { + printf("Cannot save widget to <%s>\n", filename); + } + ecore_evas_free(ee); + free(filename); +} + +static unsigned int +evt_time_get(unsigned int tm, Variant_st *v) +{ + switch(tsuite_event_mapping_type_get(v->t.type)) + { + case TSUITE_EVENT_MOUSE_IN: + { + mouse_in_mouse_out *t = v->data; + return t->timestamp; + } + case TSUITE_EVENT_MOUSE_OUT: + { + mouse_in_mouse_out *t = v->data; + return t->timestamp; + } + case TSUITE_EVENT_MOUSE_DOWN: + { + mouse_down_mouse_up *t = v->data; + return t->timestamp; + } + case TSUITE_EVENT_MOUSE_UP: + { + mouse_down_mouse_up *t = v->data; + return t->timestamp; + } + case TSUITE_EVENT_MOUSE_MOVE: + { + mouse_move *t = v->data; + return t->timestamp; + } + case TSUITE_EVENT_MOUSE_WHEEL: + { + mouse_wheel *t = v->data; + return t->timestamp; + } + case TSUITE_EVENT_MULTI_DOWN: + { + multi_event *t = v->data; + return t->timestamp; + } + case TSUITE_EVENT_MULTI_UP: + { + multi_event *t = v->data; + return t->timestamp; + } + case TSUITE_EVENT_MULTI_MOVE: + { + multi_move *t = v->data; + return t->timestamp; + } + case TSUITE_EVENT_KEY_DOWN: + { + key_down_key_up *t = v->data; + return t->timestamp; + } + case TSUITE_EVENT_KEY_UP: + { + key_down_key_up *t = v->data; + return t->timestamp; + } + case TSUITE_EVENT_TAKE_SHOT: + { + take_screenshot *t = v->data; + return t->timestamp; + } + default: /* All non-input events are not handeled */ + return tm; + break; + } +} + +static Eina_Bool +tsuite_feed_event(void *data) +{ + static Ecore_Timer *tmr = NULL; + Timer_Data *td = data; + time_t evt_time; + if (!td) + return ECORE_CALLBACK_CANCEL; + + Variant_st *v = eina_list_data_get(td->current_event); + switch(tsuite_event_mapping_type_get(v->t.type)) + { + case TSUITE_EVENT_MOUSE_IN: + { + mouse_in_mouse_out *t = v->data; + evt_time = t->timestamp; +#ifdef DEBUG_TSUITE + printf("%s evas_event_feed_mouse_in timestamp=<%u>\n", __func__, t->timestamp); +#endif + evas_event_feed_mouse_in(td->e, time(NULL), NULL); + break; + } + case TSUITE_EVENT_MOUSE_OUT: + { + mouse_in_mouse_out *t = v->data; + evt_time = t->timestamp; +#ifdef DEBUG_TSUITE + printf("%s evas_event_feed_mouse_out timestamp=<%u>\n", __func__, t->timestamp); +#endif + evas_event_feed_mouse_out(td->e, time(NULL), NULL); + break; + } + case TSUITE_EVENT_MOUSE_DOWN: + { + mouse_down_mouse_up *t = v->data; + evt_time = t->timestamp; +#ifdef DEBUG_TSUITE + printf("%s evas_event_feed_mouse_down timestamp=<%u>\n", __func__, t->timestamp); +#endif + evas_event_feed_mouse_down(td->e, t->b, t->flags, time(NULL), + NULL); + + break; + } + case TSUITE_EVENT_MOUSE_UP: + { + mouse_down_mouse_up *t = v->data; + evt_time = t->timestamp; +#ifdef DEBUG_TSUITE + printf("%s evas_event_feed_mouse_up timestamp=<%u>\n", __func__, t->timestamp); +#endif + evas_event_feed_mouse_up(td->e, t->b, t->flags, time(NULL), + NULL); + + break; + } + case TSUITE_EVENT_MOUSE_MOVE: + { + mouse_move *t = v->data; + evt_time = t->timestamp; +#ifdef DEBUG_TSUITE + printf("%s evas_event_feed_mouse_move (x,y)=(%d,%d) timestamp=<%u>\n", __func__, t->x, t->y, t->timestamp); +#endif + evas_event_feed_mouse_move(td->e, t->x, t->y, time(NULL), NULL); + break; + } + case TSUITE_EVENT_MOUSE_WHEEL: + { + mouse_wheel *t = v->data; + evt_time = t->timestamp; +#ifdef DEBUG_TSUITE + printf("%s evas_event_feed_mouse_wheel timestamp=<%u>\n", __func__, t->timestamp); +#endif + evas_event_feed_mouse_wheel(td->e, t->direction, t->z, + time(NULL), NULL); + + break; + } + case TSUITE_EVENT_MULTI_DOWN: + { + multi_event *t = v->data; + evt_time = t->timestamp; +#ifdef DEBUG_TSUITE + printf("%s evas_event_feed_multi_down timestamp=<%u>\n", __func__, t->timestamp); +#endif + evas_event_feed_multi_down(td->e, t->d, t->x, t->y, t->rad, + t->radx, t->rady, t->pres, t->ang, t->fx, t->fy, + t->flags, time(NULL), NULL); + + break; + } + case TSUITE_EVENT_MULTI_UP: + { + multi_event *t = v->data; + evt_time = t->timestamp; +#ifdef DEBUG_TSUITE + printf("%s evas_event_feed_multi_up timestamp=<%u>\n", __func__, t->timestamp); +#endif + evas_event_feed_multi_up(td->e, t->d, t->x, t->y, t->rad, + t->radx, t->rady, t->pres, t->ang, t->fx, t->fy, + t->flags, time(NULL), NULL); + + break; + } + case TSUITE_EVENT_MULTI_MOVE: + { + multi_move *t = v->data; + evt_time = t->timestamp; +#ifdef DEBUG_TSUITE + printf("%s evas_event_feed_multi_move timestamp=<%u>\n", __func__, t->timestamp); +#endif + evas_event_feed_multi_move(td->e, t->d, t->x, t->y, t->rad, + t->radx, t->rady, t->pres, t->ang, t->fx, t->fy, + time(NULL), NULL); + + break; + } + case TSUITE_EVENT_KEY_DOWN: + { + key_down_key_up *t = v->data; + evt_time = t->timestamp; +#ifdef DEBUG_TSUITE + printf("%s evas_event_feed_key_down timestamp=<%u>\n", __func__, t->timestamp); +#endif + evas_event_feed_key_down(td->e, t->keyname, t->key, t->string, + t->compose, time(NULL), NULL); + + break; + } + case TSUITE_EVENT_KEY_UP: + { + key_down_key_up *t = v->data; + evt_time = t->timestamp; +#ifdef DEBUG_TSUITE + printf("%s evas_event_feed_key_up timestamp=<%u>\n", __func__, t->timestamp); +#endif + evas_event_feed_key_up(td->e, t->keyname, t->key, t->string, + t->compose, time(NULL), NULL); + + break; + } + case TSUITE_EVENT_TAKE_SHOT: + { + take_screenshot *t = v->data; + evt_time = t->timestamp; +#ifdef DEBUG_TSUITE + printf("%s take shot timestamp=<%u>\n", __func__, t->timestamp); +#endif + tsuite_shot_do(ts.win, NULL); /* Serial name based on test-name */ + break; + } + default: /* All non-input events are not handeled */ + evt_time = td->recent_event_time; + break; + } + + double timer_time; + td->current_event = eina_list_next(td->current_event); + + if (!td->current_event) + { /* Finished reading all events */ + elm_exit(); + return ECORE_CALLBACK_CANCEL; + } + + td->recent_event_time = evt_time; + + unsigned int current_event_time = evt_time_get(evt_time, eina_list_data_get(td->current_event)); + + if (current_event_time < td->recent_event_time) /* Could happen with refeed event */ + current_event_time = td->recent_event_time; + +#ifdef DEBUG_TSUITE + printf("%s td->recent_event_time=<%u> current_event_time=<%u>\n", __func__, td->recent_event_time, current_event_time); +#endif + timer_time = (current_event_time - td->recent_event_time) / 1000.0; + + if (!td->recent_event_time) + timer_time = 0.0; + +#ifdef DEBUG_TSUITE + printf("%s timer_time=<%f>\n", __func__, timer_time); +#endif + tmr = ecore_timer_add(timer_time, tsuite_feed_event, td); + + return ECORE_CALLBACK_CANCEL; +} + +void +_test_close_win(void *data __UNUSED__, Evas_Object *obj __UNUSED__, + void *event_info __UNUSED__) +{ + ts.win = NULL; + elm_exit(); +} + +static Lists_st * +free_events(Lists_st *st) +{ + Variant_st *v; + EINA_LIST_FREE(st->variant_list, v) + { + if (recording) + { + Tsuite_Event_Type e = tsuite_event_mapping_type_get(v->t.type); + if ((e == TSUITE_EVENT_KEY_DOWN) || (e == TSUITE_EVENT_KEY_UP)) + { /* Allocated in tsuite_evas_hook.c */ + key_down_key_up *t = v->data; + eina_stringshare_del(t->keyname); + eina_stringshare_del(t->key); + eina_stringshare_del(t->string); + eina_stringshare_del(t->compose); + } + } + + free(v->data); + free(v); + } + + free(st); /* Allocated when reading data from EET file */ + return NULL; +} + +void +do_test(void (* func) (void)) +{ + char buf[1024]; + + vr_list = calloc(1, sizeof(*vr_list)); + if (recording) + _tsuite_evas_hook_init(vr_list); + + func(); + sprintf(buf, "%s.rec", ts.name); + + if (recording) + { + elm_run(); /* and run the program now and handle all events etc. */ + if (vr_list) + write_events(buf, vr_list); + } + else + { + Timer_Data *td = NULL; + + td = calloc(1, sizeof(Timer_Data)); + vr_list = read_events(buf, ts.e, td); + if (td->current_event) + { /* Got first event in list, run test */ + tsuite_feed_event(td); + elm_run(); /* and run the program now and handle all events etc */ + } + + if (td) + free(td); + } + + + if (recording) + _tsuite_evas_hook_reset(); + + if (vr_list) + vr_list = free_events(vr_list); +} + +EAPI int +elm_main(int argc, char **argv) +{ + Eina_List *tests = NULL; + Eina_Bool test_all; + int i, first_arg = 1; + + elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); + + /* tell elm about our app so it can figure out where to get files */ + elm_app_compile_bin_dir_set(PACKAGE_BIN_DIR); + elm_app_compile_data_dir_set(PACKAGE_DATA_DIR); + elm_app_info_set(elm_main, "elementary", "images/logo.png"); + + if (argc >= 2) + { + recording = !strcmp(argv[1], "--record"); + if (!recording) + { /* Could have a destdir param */ + if (!strcmp(argv[1], "--destdir")) + { /* Get dest-dir param */ + first_arg = 2; /* if user ommited dest-dir name, */ + /* works anyway skipping this flag */ + if (argc > 2) + dest_dir = argv[2]; + } + } + } + + if (recording) + { + _init_recording_funcs(); + first_arg = 2; + } + else if (dest_dir) + first_arg = 3; + + /* If no test specified in command line, set all */ + test_all = (first_arg - argc) == 0; + tests = _add_test(tests, "test_3d", test_3d, test_all); + tests = _add_test(tests, "test_actionslider", test_actionslider, test_all); + tests = _add_test(tests, "test_anchorblock", test_anchorblock, test_all); + tests = _add_test(tests, "test_anchorview", test_anchorview, test_all); + tests = _add_test(tests, "test_bg_plain", test_bg_plain, test_all); + tests = _add_test(tests, "test_bg_image", test_bg_image, test_all); + tests = _add_test(tests, "test_bg_options", test_bg_options, test_all); + tests = _add_test(tests, "test_box_vert", test_box_vert, test_all); + tests = _add_test(tests, "test_box_vert2", test_box_vert2, test_all); + tests = _add_test(tests, "test_box_horiz", test_box_horiz, test_all); + tests = _add_test(tests, "test_button", test_button, test_all); + tests = _add_test(tests, "test_bubble", test_bubble, test_all); + tests = _add_test(tests, "test_calendar", test_calendar, test_all); + tests = _add_test(tests, "test_calendar2", test_calendar2, test_all); + tests = _add_test(tests, "test_check", test_check, test_all); + tests = _add_test(tests, "test_colorselector", test_colorselector, test_all); + tests = _add_test(tests, "test_conformant", test_conformant, test_all); + tests = _add_test(tests, "test_conformant2", test_conformant2, test_all); + tests = _add_test(tests, "test_ctxpopup", test_ctxpopup, test_all); + tests = _add_test(tests, "test_cursor", test_cursor, test_all); + tests = _add_test(tests, "test_cursor2", test_cursor2, test_all); + tests = _add_test(tests, "test_cursor3", test_cursor3, test_all); + tests = _add_test(tests, "test_diskselector", test_diskselector, test_all); + tests = _add_test(tests, "test_entry", test_entry, test_all); + tests = _add_test(tests, "test_entry_scrolled", test_entry_scrolled, + test_all); + tests = _add_test(tests, "test_entry3", test_entry3, test_all); + tests = _add_test(tests, "test_entry4", test_entry4, test_all); + tests = _add_test(tests, "test_entry5", test_entry5, test_all); + tests = _add_test(tests, "test_entry_notepad", test_entry_notepad, test_all); + tests = _add_test(tests, "test_fileselector", test_fileselector, test_all); + tests = _add_test(tests, "test_fileselector_button", + test_fileselector_button, test_all); + tests = _add_test(tests, "test_fileselector_entry", + test_fileselector_entry, test_all); + tests = _add_test(tests, "test_floating", test_floating, test_all); + tests = _add_test(tests, "test_focus", test_focus, test_all); + tests = _add_test(tests, "test_focus2", test_focus2, test_all); + tests = _add_test(tests, "test_focus3", test_focus3, test_all); + tests = _add_test(tests, "test_gengrid", test_gengrid, test_all); + tests = _add_test(tests, "test_gengrid2", test_gengrid2, test_all); + tests = _add_test(tests, "test_genlist", test_genlist, test_all); + tests = _add_test(tests, "test_genlist2", test_genlist2, test_all); + tests = _add_test(tests, "test_genlist3", test_genlist3, test_all); + tests = _add_test(tests, "test_genlist4", test_genlist4, test_all); + tests = _add_test(tests, "test_genlist5", test_genlist5, test_all); + tests = _add_test(tests, "test_genlist6", test_genlist6, test_all); + tests = _add_test(tests, "test_genlist7", test_genlist7, test_all); + tests = _add_test(tests, "test_genlist8", test_genlist8, test_all); + tests = _add_test(tests, "test_genlist9", test_genlist9, test_all); + tests = _add_test(tests, "test_genlist10", test_genlist10, test_all); + tests = _add_test(tests, "test_genlist11", test_genlist11, test_all); + tests = _add_test(tests, "test_grid", test_grid, test_all); + tests = _add_test(tests, "test_hover", test_hover, test_all); + tests = _add_test(tests, "test_hover2", test_hover2, test_all); + tests = _add_test(tests, "test_hoversel", test_hoversel, test_all); + tests = _add_test(tests, "test_index", test_index, test_all); + tests = _add_test(tests, "test_index2", test_index2, test_all); + tests = _add_test(tests, "test_inwin", test_inwin, test_all); + tests = _add_test(tests, "test_inwin2", test_inwin2, test_all); + tests = _add_test(tests, "test_label", test_label, test_all); + tests = _add_test(tests, "test_list", test_list, test_all); + tests = _add_test(tests, "test_list_horizontal", test_list_horizontal, + test_all); + + tests = _add_test(tests, "test_list2", test_list2, test_all); + tests = _add_test(tests, "test_list3", test_list3, test_all); + tests = _add_test(tests, "test_list4", test_list4, test_all); + tests = _add_test(tests, "test_list5", test_list5, test_all); + tests = _add_test(tests, "test_map", test_map, test_all); + tests = _add_test(tests, "test_menu", test_menu, test_all); + tests = _add_test(tests, "test_naviframe", test_naviframe, test_all); + tests = _add_test(tests, "test_notify", test_notify, test_all); + tests = _add_test(tests, "test_pager", test_pager, test_all); + tests = _add_test(tests, "test_pager_slide", test_pager_slide, test_all); + tests = _add_test(tests, "test_panel", test_panel, test_all); + tests = _add_test(tests, "test_panes", test_panes, test_all); + tests = _add_test(tests, "test_photo", test_photo, test_all); + tests = _add_test(tests, "test_photocam", test_photocam, test_all); + tests = _add_test(tests, "test_progressbar", test_progressbar, test_all); + tests = _add_test(tests, "test_radio", test_radio, test_all); + tests = _add_test(tests, "test_scaling", test_scaling, test_all); + tests = _add_test(tests, "test_scaling2", test_scaling2, test_all); + tests = _add_test(tests, "test_scroller", test_scroller, test_all); + tests = _add_test(tests, "test_scroller2", test_scroller2, test_all); + tests = _add_test(tests, "test_segment_control", test_segment_control, + test_all); + + tests = _add_test(tests, "test_separator", test_separator, test_all); + tests = _add_test(tests, "test_slider", test_slider, test_all); + tests = _add_test(tests, "test_spinner", test_spinner, test_all); + tests = _add_test(tests, "test_table", test_table, test_all); + tests = _add_test(tests, "test_table2", test_table2, test_all); + tests = _add_test(tests, "test_table3", test_table3, test_all); + tests = _add_test(tests, "test_table4", test_table4, test_all); + tests = _add_test(tests, "test_table5", test_table5, test_all); + tests = _add_test(tests, "test_table6", test_table6, test_all); + tests = _add_test(tests, "test_thumb", test_thumb, test_all); + tests = _add_test(tests, "test_toggle", test_toggle, test_all); + tests = _add_test(tests, "test_toolbar", test_toolbar, test_all); + tests = _add_test(tests, "test_toolbar2", test_toolbar2, test_all); + tests = _add_test(tests, "test_toolbar3", test_toolbar3, test_all); + tests = _add_test(tests, "test_toolbar4", test_toolbar4, test_all); + tests = _add_test(tests, "test_toolbar5", test_toolbar5, test_all); + tests = _add_test(tests, "test_tooltip", test_tooltip, test_all); + tests = _add_test(tests, "test_tooltip2", test_tooltip2, test_all); + tests = _add_test(tests, "test_weather", test_weather, test_all); + tests = _add_test(tests, "test_win_inline", test_win_inline, test_all); + tests = _add_test(tests, "test_win_state", test_win_state, test_all); + tests = _add_test(tests, "test_win_state2", test_win_state2, test_all); + + /* Set tests from command line */ + for(i = first_arg; i < argc ; i++) + _set_test(tests, argv[i], EINA_TRUE); + + Eina_List *l; + Test_Item *item; + int n_tests = 0; + EINA_LIST_FOREACH(tests, l, item) + if (item->test) + { /* Run test and count tests committed */ + do_test(item->func); + n_tests++; + } + + if (n_tests) + { /* Print completed message */ + if (test_all) + printf("\n\nAll tests completed.\n"); + else + printf("\n\n%d tests completed out of %d tests\n", + n_tests, argc - first_arg); + } + else + { /* No tests committed, let user know test-name is wrong */ + printf ("\n\nNo test matching:\n"); + for(i = first_arg; i < argc; i++) + printf("%s\n", argv[i]); + + printf ("\nPlease review test name.\n"); + } + + + /* Free all tests in list */ + Test_Item *data = NULL; + EINA_LIST_FREE(tests, data) + free(data); + + tsuite_cleanup(); + /* if the mainloop that elm_run() runs exist - we exit the app */ + elm_shutdown(); /* clean up and shut down */ + + /* exit code, ZERO if all completed successfuly */ + if (test_all) + return 0; + else + return ((argc - first_arg) - n_tests); +} +ELM_MAIN() diff --git a/src/bin/tsuite.h b/src/bin/tsuite.h new file mode 100644 index 0000000..d512273 --- /dev/null +++ b/src/bin/tsuite.h @@ -0,0 +1,113 @@ +#ifndef _TSUITE_H +#define _TSUITE_H + +#include +#include + +#define fail_if(expr) \ + do { \ + if ( expr ) \ + { \ + FILE *fp; \ + char buf[1024]; \ + sprintf(buf, "fail_%s.txt", tsuite_test_name_get()); \ + if ((fp = fopen(buf, "a")) != NULL) \ + { \ + fprintf(fp, "Failed at %s:%d on <%s>\n", __FILE__, __LINE__, #expr); \ + fclose(fp); \ + } \ + } \ + } while(0) + +/* #define DEBUG_TSUITE 1 */ +struct _api_data +{ + unsigned int state; /* What state we are testing */ + Evas_Object *win; /* Parent Window of widgets */ + Evas_Object *bt; /* Button to progress in states */ + void *data; /* Additional data defined by test */ + Eina_Bool free_data; /* free data on close */ +}; +typedef struct _api_data api_data; + +void +_test_close_win(void *data, Evas_Object *obj, void *event_info); + +#define TEST_START(x) \ + void x(void) \ + { \ + Evas_Object *win = elm_win_add(NULL, #x, ELM_WIN_BASIC); \ + api_data *api = calloc(1, sizeof(api_data)); \ + tsuite_init(win, #x, api); \ + elm_win_title_set(win, #x); \ + elm_win_autodel_set(win, 1); \ + evas_object_smart_callback_add(win, "delete,request", _test_close_win, NULL); \ + evas_object_show(win); + +#define TEST_END \ + } + +#define TEST_SHOT(x) \ + tsuite_shot_do(win, x) + +void tsuite_init(Evas_Object *win, char *name, api_data *d); +void tsuite_cleanup(void); +void tsuite_shot_do(Evas_Object *obj, char *name); +char *tsuite_test_name_get(); +Eina_Bool write_events_get(void); +void write_events_set(Eina_Bool val); +/* Macro declaring a function argument to be unused */ +#define __UNUSED__ __attribute__((unused)) + +enum _Tsuite_Event_Type +{ /* Add any supported events here */ + TSUITE_EVENT_NOT_SUPPORTED = 0, + TSUITE_EVENT_MOUSE_IN, + TSUITE_EVENT_MOUSE_OUT, + TSUITE_EVENT_MOUSE_DOWN, + TSUITE_EVENT_MOUSE_UP, + TSUITE_EVENT_MOUSE_MOVE, + TSUITE_EVENT_MOUSE_WHEEL, + TSUITE_EVENT_MULTI_DOWN, + TSUITE_EVENT_MULTI_UP, + TSUITE_EVENT_MULTI_MOVE, + TSUITE_EVENT_KEY_DOWN, + TSUITE_EVENT_KEY_UP, + TSUITE_EVENT_TAKE_SHOT +}; +typedef enum _Tsuite_Event_Type Tsuite_Event_Type; + +struct _eet_event_type_mapping +{ + Tsuite_Event_Type t; + const char *name; +}; +typedef struct _eet_event_type_mapping eet_event_type_mapping; + +struct _Variant_Type_st +{ + const char *type; + Eina_Bool unknow : 1; +}; +typedef struct _Variant_Type_st Variant_Type_st; + +struct _Variant_st +{ + Variant_Type_st t; + void *data; /* differently than the union type, we + * don't need to pre-allocate the memory + * for the field*/ +}; +typedef struct _Variant_st Variant_st; + +struct _Timer_Data +{ + Eet_File *fp; + unsigned int recent_event_time; + Evas *e; + Eina_List *current_event; +}; +typedef struct _Timer_Data Timer_Data; + +void variant_list_append(Variant_st *v); +#endif diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am new file mode 100644 index 0000000..bc336c7 --- /dev/null +++ b/src/lib/Makefile.am @@ -0,0 +1,23 @@ +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I$(top_srcdir)/src/bin \ +-DPACKAGE_BIN_DIR=\"$(bindir)\" \ +-DPACKAGE_LIB_DIR=\"$(libdir)\" \ +-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \ +@EFL_CFLAGS@ + +EXTRA_DIST = \ + tsuite_file_data.h + +pkgdir = $(libdir)/exactness +pkg_LTLIBRARIES = libexactness.la + +libexactness_la_SOURCES = \ + tsuite_evas_hook.c \ + tsuite_file_data.c + +libexactness_la_LDFLAGS = -module -avoid-version -rdynamic +libexactness_la_DEPENDENCIES = $(top_builddir)/config.h +libexactness_la_LIBADD = @EFL_LIBS@ +libexactness_la_CFLAGS = @EFL_CFLAGS@ diff --git a/src/lib/tsuite_evas_hook.c b/src/lib/tsuite_evas_hook.c new file mode 100644 index 0000000..eb4587e --- /dev/null +++ b/src/lib/tsuite_evas_hook.c @@ -0,0 +1,313 @@ +#define _GNU_SOURCE 1 +#include +#include + +#include +#include +#include +#include +#include +#include "tsuite_file_data.h" +#include "tsuite.h" + + +#define SHOT_KEY_STR "F2" +/* START - EET Handling code */ +struct _Eet_Event_Type +{ + unsigned int version; +}; +typedef struct _Eet_Event_Type Eet_Event_Type; +/* END - EET Handling code */ + +static char *shot_key = SHOT_KEY_STR; +static Lists_st *vr_list = NULL; + +void tsuite_evas_hook_init(Lists_st *v) +{ /* Pointer taken from tsuite.c */ + vr_list = v; + shot_key = getenv("TSUITE_SHOT_KEY"); + if (!shot_key) shot_key = SHOT_KEY_STR; +} + +void tsuite_evas_hook_reset(void) +{ /* tsuite.c informs us that vr_list is no longer valid */ + vr_list = NULL; +} + +/* Adding variant to list, this list is later written to EET file */ +#define ADD_TO_LIST(EVT_TYPE, EVT_STRUCT_NAME, INFO) \ + do { /* This macro will add event to EET data list */ \ + if (vr_list) \ + { \ + Variant_st *v = malloc(sizeof(Variant_st)); \ + v->data = malloc(sizeof(EVT_STRUCT_NAME)); \ + _variant_type_set(tsuite_event_mapping_type_str_get(EVT_TYPE), \ + &v->t, EINA_FALSE); \ + memcpy(v->data, &INFO, sizeof(EVT_STRUCT_NAME)); \ + printf("recording <%s> time=<%u>\n", #EVT_STRUCT_NAME, ((EVT_STRUCT_NAME *) v->data)->timestamp); \ + vr_list->variant_list = eina_list_append(vr_list->variant_list, v); \ + } \ + } while (0) + +static Tsuite_Event_Type +tsuite_event_type_get(Evas_Callback_Type t) +{ + switch(t) + { + case EVAS_CALLBACK_MOUSE_IN: + return TSUITE_EVENT_MOUSE_IN; + case EVAS_CALLBACK_MOUSE_OUT: + return TSUITE_EVENT_MOUSE_OUT; + case EVAS_CALLBACK_MOUSE_DOWN: + return TSUITE_EVENT_MOUSE_DOWN; + case EVAS_CALLBACK_MOUSE_UP: + return TSUITE_EVENT_MOUSE_UP; + case EVAS_CALLBACK_MOUSE_MOVE: + return TSUITE_EVENT_MOUSE_MOVE; + case EVAS_CALLBACK_MOUSE_WHEEL: + return TSUITE_EVENT_MOUSE_WHEEL; + case EVAS_CALLBACK_MULTI_DOWN: + return TSUITE_EVENT_MULTI_DOWN; + case EVAS_CALLBACK_MULTI_UP: + return TSUITE_EVENT_MULTI_UP; + case EVAS_CALLBACK_MULTI_MOVE: + return TSUITE_EVENT_MULTI_MOVE; + case EVAS_CALLBACK_KEY_DOWN: + return TSUITE_EVENT_KEY_DOWN; + case EVAS_CALLBACK_KEY_UP: + return TSUITE_EVENT_KEY_UP; + + default: + return TSUITE_EVENT_NOT_SUPPORTED; + } +} + +EAPI void +evas_event_feed_mouse_in(Evas *e, unsigned int timestamp, const void *data) +{ +#ifdef DEBUG_TSUITE + printf("Calling %s timestamp=<%u>\n", __func__, timestamp); +#endif + mouse_in_mouse_out t = { timestamp }; + int evt = tsuite_event_type_get(EVAS_CALLBACK_MOUSE_IN); + ADD_TO_LIST(evt, mouse_in_mouse_out, t); + void (*orig) (Evas *e, unsigned int timestamp, const void *data) = + dlsym(RTLD_NEXT, __func__); + + orig(e, timestamp, data); +} + +EAPI void +evas_event_feed_mouse_out(Evas *e, unsigned int timestamp, const void *data) +{ +#ifdef DEBUG_TSUITE + printf("Calling %s timestamp=<%u>\n", __func__, timestamp); +#endif + mouse_in_mouse_out t = { timestamp }; + int evt = tsuite_event_type_get(EVAS_CALLBACK_MOUSE_OUT); + ADD_TO_LIST(evt, mouse_in_mouse_out, t); + void (*orig) (Evas *e, unsigned int timestamp, const void *data) = + dlsym(RTLD_NEXT, __func__); + + orig(e, timestamp, data); +} + +EAPI void +evas_event_feed_mouse_down(Evas *e, int b, Evas_Button_Flags flags, + unsigned int timestamp, const void *data) +{ +#ifdef DEBUG_TSUITE + printf("Calling %s timestamp=<%u>\n", __func__, timestamp); +#endif + mouse_down_mouse_up t = { b, flags, timestamp }; + int evt = tsuite_event_type_get(EVAS_CALLBACK_MOUSE_DOWN); + ADD_TO_LIST(evt, mouse_down_mouse_up, t); + void (*orig) (Evas *e, int b, Evas_Button_Flags flags, + unsigned int timestamp, const void *data) = + dlsym(RTLD_NEXT, __func__); + + orig(e, b, flags, timestamp, data); +} + +EAPI void +evas_event_feed_mouse_up(Evas *e, int b, Evas_Button_Flags flags, + unsigned int timestamp, const void *data) +{ +#ifdef DEBUG_TSUITE + printf("Calling %s timestamp=<%u>\n", __func__, timestamp); +#endif + mouse_down_mouse_up t = { b, flags, timestamp }; + int evt = tsuite_event_type_get(EVAS_CALLBACK_MOUSE_UP); + ADD_TO_LIST(evt, mouse_down_mouse_up, t); + void (*orig) (Evas *e, int b, Evas_Button_Flags flags, + unsigned int timestamp, const void *data) = + dlsym(RTLD_NEXT, __func__); + + orig(e, b, flags, timestamp, data); +} + +EAPI void +evas_event_feed_mouse_move(Evas *e, int x, int y, unsigned int timestamp, + const void *data) +{ + mouse_move t = { x, y, timestamp }; +#ifdef DEBUG_TSUITE + printf("Calling %s timestamp=<%u>\n", __func__, timestamp); +#endif + int evt = tsuite_event_type_get(EVAS_CALLBACK_MOUSE_MOVE); + ADD_TO_LIST(evt, mouse_move, t); + void (*orig) (Evas *e, int x, int y, unsigned int timestamp, + const void *data) = dlsym(RTLD_NEXT, __func__); + orig(e, x, y, timestamp, data); +} + +EAPI void +evas_event_feed_mouse_wheel(Evas *e, int direction, int z, + unsigned int timestamp, const void *data) +{ +#ifdef DEBUG_TSUITE + printf("Calling %s timestamp=<%u>\n", __func__, timestamp); +#endif + mouse_wheel t = { direction, z, timestamp }; + int evt = tsuite_event_type_get(EVAS_CALLBACK_MOUSE_WHEEL); + ADD_TO_LIST(evt, mouse_wheel, t); + void (*orig) (Evas *e, int direction, int z, unsigned int timestamp, + const void *data) = dlsym(RTLD_NEXT, __func__); + + orig(e, direction, z, timestamp, data); +} + +EAPI void +evas_event_feed_multi_down(Evas *e, int d, int x, int y, + double rad, double radx, double rady, double pres, double ang, + double fx, double fy, Evas_Button_Flags flags, + unsigned int timestamp, const void *data) +{ +#ifdef DEBUG_TSUITE + printf("Calling %s timestamp=<%u>\n", __func__, timestamp); +#endif + multi_event t = { d, x, y, rad, radx, rady, pres, ang, + fx, fy, flags, timestamp }; + + int evt = tsuite_event_type_get(EVAS_CALLBACK_MULTI_DOWN); + ADD_TO_LIST(evt, multi_event, t); + void (*orig) (Evas *e, int d, int x, int y, double rad, + double radx, double rady, double pres, double ang, + double fx, double fy, Evas_Button_Flags flags, + unsigned int timestamp, const void *data) = + dlsym(RTLD_NEXT, __func__); + orig(e, d, x, y, rad, radx, rady, pres, ang, fx, fy, flags, timestamp, data); +} + +EAPI void +evas_event_feed_multi_up(Evas *e, int d, int x, int y, + double rad, double radx, double rady, double pres, double ang, + double fx, double fy, Evas_Button_Flags flags, + unsigned int timestamp, const void *data) +{ +#ifdef DEBUG_TSUITE + printf("Calling %s timestamp=<%u>\n", __func__, timestamp); +#endif + multi_event t = { d, x, y, rad, radx, rady, pres, ang, fx, fy, flags, timestamp }; + int evt = tsuite_event_type_get(EVAS_CALLBACK_MULTI_UP); + ADD_TO_LIST(evt, multi_event, t); + void (*orig) (Evas *e, int d, int x, int y, double rad, + double radx, double rady, double pres, double ang, + double fx, double fy, Evas_Button_Flags flags, + unsigned int timestamp, const void *data) = + dlsym(RTLD_NEXT, __func__); + + orig(e, d, x, y, rad, radx, rady, pres, ang, fx, fy, flags, timestamp, data); +} + +EAPI void +evas_event_feed_multi_move(Evas *e, int d, int x, int y, double rad, + double radx, double rady, double pres, double ang, + double fx, double fy, unsigned int timestamp, const void *data) +{ +#ifdef DEBUG_TSUITE + printf("Calling %s timestamp=<%u>\n", __func__, timestamp); +#endif + multi_move t = { d, x, y, rad, radx, rady, pres, ang, fx, fy, timestamp }; + int evt = tsuite_event_type_get(EVAS_CALLBACK_MULTI_MOVE); + ADD_TO_LIST(evt, multi_move, t); + void (*orig) (Evas *e, int d, int x, int y, double rad, + double radx, double rady, double pres, double ang, + double fx, double fy, unsigned int timestamp, const void *data) = + dlsym(RTLD_NEXT, __func__); + + orig(e, d, x, y, rad, radx, rady, pres, ang, fx, fy, timestamp, data); +} + +EAPI void +evas_event_feed_key_down(Evas *e, const char *keyname, const char *key, + const char *string, const char *compose, + unsigned int timestamp, const void *data) +{ + int evt = tsuite_event_type_get(EVAS_CALLBACK_KEY_DOWN); + void (*orig) (Evas *e, const char *keyname, const char *key, + const char *string, const char *compose, + unsigned int timestamp, const void *data) = + dlsym(RTLD_NEXT, __func__); +#ifdef DEBUG_TSUITE + printf("Calling %s timestamp=<%u>\n", __func__, timestamp); +#endif + if (!strcmp(key, shot_key)) + { +#ifdef DEBUG_TSUITE + printf("Take Screenshot: %s timestamp=<%u>\n", __func__, timestamp); +#endif + take_screenshot t = { timestamp }; + ADD_TO_LIST(TSUITE_EVENT_TAKE_SHOT, take_screenshot, t); + + orig(e, keyname, key, string, compose, timestamp, data); + return; + } + + /* Contruct t duplicate strings, free them when list if freed */ + key_down_key_up t; + t.timestamp = timestamp; + t.keyname = eina_stringshare_add(keyname); + t.key = eina_stringshare_add(key); + t.string = eina_stringshare_add(string); + t.compose = eina_stringshare_add(compose); + ADD_TO_LIST(evt, key_down_key_up, t); + + orig(e, keyname, key, string, compose, timestamp, data); +} + +EAPI void +evas_event_feed_key_up(Evas *e, const char *keyname, const char *key, + const char *string, const char *compose, + unsigned int timestamp, const void *data) +{ + void (*orig) (Evas *e, const char *keyname, const char *key, + const char *string, const char *compose, + unsigned int timestamp, const void *data) = + dlsym(RTLD_NEXT, __func__); + + if (!strcmp(key, shot_key)) + { +#ifdef DEBUG_TSUITE + printf("Take Screenshot: %s timestamp=<%u>\n", __func__, timestamp); +#endif + orig(e, keyname, key, string, compose, timestamp, data); + return; /* Take screenshot done on key-down */ + } + + int evt = { tsuite_event_type_get(EVAS_CALLBACK_KEY_UP) }; +#ifdef DEBUG_TSUITE + printf("Calling %s timestamp=<%u>\n", __func__, timestamp); +#endif + /* Contruct t duplicate strings, free them when list if freed */ + key_down_key_up t; + t.timestamp = timestamp; + t.keyname = eina_stringshare_add(keyname); + t.key = eina_stringshare_add(key); + t.string = eina_stringshare_add(string); + t.compose = eina_stringshare_add(compose); + ADD_TO_LIST(evt, key_down_key_up, t); + + orig(e, keyname, key, string, compose, timestamp, data); +} diff --git a/src/lib/tsuite_file_data.c b/src/lib/tsuite_file_data.c new file mode 100644 index 0000000..0071c0f --- /dev/null +++ b/src/lib/tsuite_file_data.c @@ -0,0 +1,586 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "tsuite_file_data.h" + +static data_desc *desc = NULL; /* this struct holds descs (alloc on init) */ + +static eet_event_type_mapping eet_mapping[] = { + { TSUITE_EVENT_MOUSE_IN, TSUITE_EVENT_MOUSE_IN_STR }, + { TSUITE_EVENT_MOUSE_OUT, TSUITE_EVENT_MOUSE_OUT_STR }, + { TSUITE_EVENT_MOUSE_DOWN, TSUITE_EVENT_MOUSE_DOWN_STR }, + { TSUITE_EVENT_MOUSE_UP, TSUITE_EVENT_MOUSE_UP_STR }, + { TSUITE_EVENT_MOUSE_MOVE, TSUITE_EVENT_MOUSE_MOVE_STR }, + { TSUITE_EVENT_MOUSE_WHEEL, TSUITE_EVENT_MOUSE_WHEEL_STR }, + { TSUITE_EVENT_MULTI_DOWN, TSUITE_EVENT_MULTI_DOWN_STR }, + { TSUITE_EVENT_MULTI_UP, TSUITE_EVENT_MULTI_UP_STR }, + { TSUITE_EVENT_MULTI_MOVE, TSUITE_EVENT_MULTI_MOVE_STR }, + { TSUITE_EVENT_KEY_DOWN, TSUITE_EVENT_KEY_DOWN_STR }, + { TSUITE_EVENT_KEY_UP, TSUITE_EVENT_KEY_UP_STR }, + { TSUITE_EVENT_TAKE_SHOT, TSUITE_EVENT_TAKE_SHOT_STR }, + { TSUITE_EVENT_NOT_SUPPORTED, NULL } +}; + +Tsuite_Event_Type +tsuite_event_mapping_type_get(const char *name) +{ + int i; + for (i = 0; eet_mapping[i].name != NULL; ++i) + if (strcmp(name, eet_mapping[i].name) == 0) + return eet_mapping[i].t; + + return TSUITE_EVENT_NOT_SUPPORTED; +} + +const char * +tsuite_event_mapping_type_str_get(Tsuite_Event_Type t) +{ + int i; + for (i = 0; eet_mapping[i].name != NULL; ++i) + if (t == eet_mapping[i].t) + return eet_mapping[i].name; + + return NULL; +} + +void +write_events(const char *filename, Lists_st *vr_list) +{ + _data_descriptors_init(); + Eet_File *fp = eet_open(filename, EET_FILE_MODE_WRITE); + eet_data_write(fp, desc->_lists_descriptor, CACHE_FILE_ENTRY, vr_list, + EINA_TRUE); + + eet_close(fp); + _data_descriptors_shutdown(); +} + +Lists_st * +read_events(char *filename, Evas *e, Timer_Data *td) +{ + Lists_st *vr_list; + td->e = e; + td->fp = eet_open(filename, EET_FILE_MODE_READ); + if (!td->fp) + { + printf("Failed to open input file <%s>.\n", filename); + return NULL; + } + + /* Read events list */ + _data_descriptors_init(); + vr_list = eet_data_read(td->fp, desc->_lists_descriptor, CACHE_FILE_ENTRY); + eet_close(td->fp); + _data_descriptors_shutdown(); + if (!vr_list->variant_list) + return NULL; + + td->current_event = eina_list_nth_list(vr_list->variant_list, 0); +#ifdef DEBUG_TSUITE + printf("%s list size is <%d>\n", __func__, eina_list_count(vr_list->variant_list)); +#endif + + return vr_list; +} + +const char * +_variant_type_get(const void *data, Eina_Bool *unknow) +{ + const Variant_Type_st *type = data; + int i; + + if (unknow) + *unknow = type->unknow; + + for (i = 0; eet_mapping[i].name != NULL; ++i) + if (strcmp(type->type, eet_mapping[i].name) == 0) + return eet_mapping[i].name; + + if (unknow) + *unknow = EINA_FALSE; + + return type->type; +} /* _variant_type_get */ + +Eina_Bool +_variant_type_set(const char *type, + void *data, + Eina_Bool unknow) +{ + Variant_Type_st *vt = data; + + vt->type = type; + vt->unknow = unknow; + return EINA_TRUE; +} /* _variant_type_set */ + +/* START - Allocating and setting variant structs */ +mouse_in_mouse_out *mouse_in_mouse_out_set(unsigned int timestamp) +{ + mouse_in_mouse_out *st = calloc(1, sizeof(mouse_in_mouse_out)); + if (st) + { + st->timestamp = timestamp; + } + + return st; +} + +Variant_st *mouse_in_mouse_out_new(Tsuite_Event_Type type, + unsigned int timestamp) +{ + Variant_st *va = calloc(1, sizeof(Variant_st)); + va->t.type = eet_mapping[type].name; + va->data = mouse_in_mouse_out_set(timestamp); + + return va; +} + +mouse_down_mouse_up *mouse_down_mouse_up_set(int b, Evas_Button_Flags flags, + unsigned int timestamp) +{ + mouse_down_mouse_up *st = calloc(1, sizeof(mouse_down_mouse_up)); + if (st) + { + st->b = b; + st->flags = flags; + st->timestamp = timestamp; + } + + return st; +} + +Variant_st *mouse_down_mouse_up_new(Tsuite_Event_Type type, int b, + Evas_Button_Flags flags, unsigned int timestamp) +{ + Variant_st *va = calloc(1, sizeof(Variant_st)); + va->t.type = eet_mapping[type].name; + va->data = mouse_down_mouse_up_set(b, flags, timestamp); + + return va; +} + +mouse_move *mouse_move_set(int x, int y, unsigned int timestamp) +{ + mouse_move *st = calloc(1, sizeof(mouse_move)); + if (st) + { + st->x = x; + st->y = y; + st->timestamp = timestamp; + } + + return st; +} + +Variant_st *mouse_move_new(int x, int y, unsigned int timestamp) +{ + Variant_st *va = calloc(1, sizeof(Variant_st)); + va->t.type = eet_mapping[TSUITE_EVENT_MOUSE_MOVE].name; + va->data = mouse_move_set(x, y, timestamp); + + return va; +} + +mouse_wheel *mouse_wheel_set(int direction, int z, unsigned int timestamp) +{ + mouse_wheel *st = calloc(1, sizeof(mouse_wheel)); + if (st) + { + st->direction = direction; + st->z = z; + st->timestamp = timestamp; + } + + return st; +} + +Variant_st *mouse_wheel_new(int direction, int z, unsigned int timestamp) +{ + Variant_st *va = calloc(1, sizeof(Variant_st)); + va->t.type = eet_mapping[TSUITE_EVENT_MOUSE_WHEEL].name; + va->data = mouse_wheel_set(direction, z, timestamp); + + return va; +} + +multi_event *multi_event_set(int d, int x, int y, double rad, + double radx, double rady, double pres, double ang, + double fx, double fy, Evas_Button_Flags flags, unsigned int timestamp) +{ + multi_event *st = calloc(1, sizeof(multi_event)); + if (st) + { + st->d = d; + st->x = x; + st->y = y; + st->rad = rad; + st->radx = radx; + st->rady = rady; + st->pres = pres; + st->ang = ang; + st->fx = fx; + st->fy = fy; + st->flags = flags; + st->timestamp = timestamp; + } + + return st; +} + +Variant_st *multi_event_new(Tsuite_Event_Type type, int d, int x, int y, + double rad, double radx, double rady, double pres, double ang, + double fx, double fy, Evas_Button_Flags flags, unsigned int timestamp) +{ + Variant_st *va = calloc(1, sizeof(Variant_st)); + va->t.type = eet_mapping[type].name; + va->data = multi_event_set(d, x, y, rad, radx, rady, pres, ang, fx, fy, + flags, timestamp); + + return va; +} + +multi_move *multi_move_set(int d, int x, int y, double rad, double radx, + double rady, double pres, double ang, double fx, double fy, + unsigned int timestamp) +{ + multi_move *st = calloc(1, sizeof(multi_move)); + if (st) + { + st->d = d; + st->x = x; + st->y = y; + st->rad = rad; + st->radx = radx; + st->rady = rady; + st->pres = pres; + st->ang = ang; + st->fx = fx; + st->fy = fy; + st->timestamp = timestamp; + } + + return st; +} + +Variant_st *multi_move_new(int d, int x, int y, + double rad, double radx,double rady, double pres, double ang, + double fx, double fy, unsigned int timestamp) +{ + Variant_st *va = calloc(1, sizeof(Variant_st)); + va->t.type = eet_mapping[TSUITE_EVENT_MULTI_MOVE].name; + va->data = multi_move_set(d, x, y, rad, radx, rady, pres, ang, + fx, fy,timestamp); + + return va; +} + +key_down_key_up *key_down_key_up_set(unsigned int timestamp, + const char *keyname, const char *key, const char *string, + const char *compose) +{ + key_down_key_up *st = calloc(1, sizeof(key_down_key_up)); + if (st) + { + st->timestamp = timestamp; + st->keyname = keyname; + st->key = key; + st->string = string; + st->compose = compose; + } + + return st; +} + +Variant_st *key_down_key_up_new(Tsuite_Event_Type type, + unsigned int timestamp, const char *keyname, const char *key, + const char *string, const char *compose) +{ + Variant_st *va = calloc(1, sizeof(Variant_st)); + va->t.type = eet_mapping[type].name; + va->data = key_down_key_up_set(timestamp, keyname, key, string, compose); + + return va; +} + +take_screenshot *take_screenshot_set(unsigned int timestamp) +{ + take_screenshot *st = calloc(1, sizeof(take_screenshot)); + if (st) + { + st->timestamp = timestamp; + } + + return st; +} + +Variant_st *take_screenshot_new(unsigned int timestamp) +{ + Variant_st *va = calloc(1, sizeof(Variant_st)); + va->t.type = eet_mapping[TSUITE_EVENT_TAKE_SHOT].name; + va->data = take_screenshot_set(timestamp); + + return va; +} +/* END - Allocating and setting variant structs */ + +/* START Event struct descriptors */ +Eet_Data_Descriptor * +take_screenshot_desc_make(void) +{ + Eet_Data_Descriptor_Class eddc; + Eet_Data_Descriptor *desc; + EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, take_screenshot); + desc = eet_data_descriptor_stream_new(&eddc); + + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, take_screenshot, "timestamp", + timestamp, EET_T_UINT); + + return desc; +} + +Eet_Data_Descriptor * +mouse_in_mouse_out_desc_make(void) +{ + Eet_Data_Descriptor_Class eddc; + Eet_Data_Descriptor *desc; + EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, mouse_in_mouse_out); + desc = eet_data_descriptor_stream_new(&eddc); + + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, mouse_in_mouse_out, "timestamp", + timestamp, EET_T_UINT); + + return desc; +} + +Eet_Data_Descriptor * +mouse_down_mouse_up_desc_make(void) +{ + Eet_Data_Descriptor_Class eddc; + Eet_Data_Descriptor *desc; + EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, mouse_down_mouse_up); + desc = eet_data_descriptor_stream_new(&eddc); + + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, mouse_down_mouse_up, "b", b, EET_T_INT); + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, mouse_down_mouse_up, "flags", + flags, EET_T_INT); + + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, mouse_down_mouse_up, "timestamp", + timestamp, EET_T_UINT); + + return desc; +} + +Eet_Data_Descriptor * +mouse_move_desc_make(void) +{ + Eet_Data_Descriptor_Class eddc; + Eet_Data_Descriptor *desc; + EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, mouse_move); + desc = eet_data_descriptor_stream_new(&eddc); + + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, mouse_move, "x", x, EET_T_INT); + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, mouse_move, "y", y, EET_T_INT); + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, mouse_move, "timestamp", + timestamp, EET_T_UINT); + + return desc; +} + +Eet_Data_Descriptor * +mouse_wheel_desc_make(void) +{ + Eet_Data_Descriptor_Class eddc; + Eet_Data_Descriptor *desc; + EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, mouse_wheel); + desc = eet_data_descriptor_stream_new(&eddc); + + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, mouse_wheel, "direction", + direction, EET_T_INT); + + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, mouse_wheel, "z", z, EET_T_INT); + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, mouse_wheel, "timestamp", + timestamp, EET_T_UINT); + + return desc; +} + +Eet_Data_Descriptor * +key_down_key_up_desc_make(void) +{ + Eet_Data_Descriptor_Class eddc; + Eet_Data_Descriptor *desc; + EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, key_down_key_up); + desc = eet_data_descriptor_stream_new(&eddc); + + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, key_down_key_up, "timestamp", + timestamp, EET_T_UINT); + + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, key_down_key_up, "keyname", + keyname, EET_T_STRING); + + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, key_down_key_up, "key", + key, EET_T_STRING); + + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, key_down_key_up, "string", + string, EET_T_STRING); + + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, key_down_key_up, "compose", + compose, EET_T_STRING); + + return desc; +} + +Eet_Data_Descriptor * +multi_event_desc_make(void) +{ + Eet_Data_Descriptor_Class eddc; + Eet_Data_Descriptor *desc; + EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, multi_event); + desc = eet_data_descriptor_stream_new(&eddc); + + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, multi_event, "d", d, EET_T_UINT); + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, multi_event, "x", x, EET_T_UINT); + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, multi_event, "y", y, EET_T_UINT); + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, multi_event, "rad", rad, EET_T_DOUBLE); + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, multi_event, "radx", radx, EET_T_DOUBLE); + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, multi_event, "rady", rady, EET_T_DOUBLE); + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, multi_event, "pres", pres, EET_T_DOUBLE); + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, multi_event, "ang", ang, EET_T_DOUBLE); + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, multi_event, "fx", fx, EET_T_DOUBLE); + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, multi_event, "fy", fy, EET_T_DOUBLE); + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, multi_event, "flags", flags, EET_T_INT); + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, multi_event, "timestamp", + timestamp, EET_T_UINT); + + return desc; +} + +Eet_Data_Descriptor * +multi_move_desc_make(void) +{ + Eet_Data_Descriptor_Class eddc; + Eet_Data_Descriptor *desc; + EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, multi_move); + desc = eet_data_descriptor_stream_new(&eddc); + + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, multi_move, "d", d, EET_T_UINT); + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, multi_move, "x", x, EET_T_UINT); + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, multi_move, "y", y, EET_T_UINT); + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, multi_move, "rad", rad, EET_T_DOUBLE); + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, multi_move, "radx", radx, EET_T_DOUBLE); + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, multi_move, "rady", rady, EET_T_DOUBLE); + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, multi_move, "pres", pres, EET_T_DOUBLE); + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, multi_move, "ang", ang, EET_T_DOUBLE); + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, multi_move, "fx", fx, EET_T_DOUBLE); + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, multi_move, "fy", fy, EET_T_DOUBLE); + EET_DATA_DESCRIPTOR_ADD_BASIC(desc, multi_move, "timestamp", + timestamp, EET_T_UINT); + + return desc; +} + +/* declaring types */ +data_desc *_data_descriptors_init(void) +{ + if (desc) /* Was allocated */ + return desc; + + desc = calloc(1, sizeof(data_desc)); + + Eet_Data_Descriptor_Class eddc; + + EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Lists_st); + desc->_lists_descriptor = eet_data_descriptor_file_new(&eddc); + + desc->take_screenshot = take_screenshot_desc_make(); + desc->mouse_in_mouse_out = mouse_in_mouse_out_desc_make(); + desc->mouse_down_mouse_up = mouse_down_mouse_up_desc_make(); + desc->mouse_move = mouse_move_desc_make(); + desc->mouse_wheel = mouse_wheel_desc_make(); + desc->multi_event = multi_event_desc_make(); + desc->multi_move = multi_move_desc_make(); + desc->key_down_key_up = key_down_key_up_desc_make(); + + /* for variant */ + EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Variant_st); + desc->_variant_descriptor = eet_data_descriptor_file_new(&eddc); + + eddc.version = EET_DATA_DESCRIPTOR_CLASS_VERSION; + eddc.func.type_get = _variant_type_get; + eddc.func.type_set = _variant_type_set; + desc->_variant_unified_descriptor = eet_data_descriptor_stream_new(&eddc); + + EET_DATA_DESCRIPTOR_ADD_MAPPING(desc->_variant_unified_descriptor, + TSUITE_EVENT_MOUSE_IN_STR, desc->mouse_in_mouse_out); + + EET_DATA_DESCRIPTOR_ADD_MAPPING(desc->_variant_unified_descriptor, + TSUITE_EVENT_MOUSE_OUT_STR, desc->mouse_in_mouse_out); + + EET_DATA_DESCRIPTOR_ADD_MAPPING(desc->_variant_unified_descriptor, + TSUITE_EVENT_MOUSE_DOWN_STR, desc->mouse_down_mouse_up); + + EET_DATA_DESCRIPTOR_ADD_MAPPING(desc->_variant_unified_descriptor, + TSUITE_EVENT_MOUSE_UP_STR, desc->mouse_down_mouse_up); + + EET_DATA_DESCRIPTOR_ADD_MAPPING(desc->_variant_unified_descriptor, + TSUITE_EVENT_MOUSE_MOVE_STR, desc->mouse_move); + + EET_DATA_DESCRIPTOR_ADD_MAPPING(desc->_variant_unified_descriptor, + TSUITE_EVENT_MOUSE_WHEEL_STR, desc->mouse_wheel); + + EET_DATA_DESCRIPTOR_ADD_MAPPING(desc->_variant_unified_descriptor, + TSUITE_EVENT_MULTI_DOWN_STR, desc->multi_event); + + EET_DATA_DESCRIPTOR_ADD_MAPPING(desc->_variant_unified_descriptor, + TSUITE_EVENT_MULTI_UP_STR, desc->multi_event); + + EET_DATA_DESCRIPTOR_ADD_MAPPING(desc->_variant_unified_descriptor, + TSUITE_EVENT_MULTI_MOVE_STR, desc->multi_move); + + EET_DATA_DESCRIPTOR_ADD_MAPPING(desc->_variant_unified_descriptor, + TSUITE_EVENT_KEY_DOWN_STR, desc->key_down_key_up); + + EET_DATA_DESCRIPTOR_ADD_MAPPING(desc->_variant_unified_descriptor, + TSUITE_EVENT_KEY_UP_STR, desc->key_down_key_up); + + EET_DATA_DESCRIPTOR_ADD_MAPPING(desc->_variant_unified_descriptor, + TSUITE_EVENT_TAKE_SHOT_STR, desc->take_screenshot); + + + EET_DATA_DESCRIPTOR_ADD_VARIANT(desc->_variant_descriptor, + Variant_st, "data", data, t, desc->_variant_unified_descriptor); + + EET_DATA_DESCRIPTOR_ADD_LIST(desc->_lists_descriptor, + Lists_st, "variant_list", variant_list, desc->_variant_descriptor); + + return desc; +} + +void _data_descriptors_shutdown(void) +{ + if (desc) + { + eet_data_descriptor_free(desc->mouse_in_mouse_out); + eet_data_descriptor_free(desc->mouse_down_mouse_up); + eet_data_descriptor_free(desc->mouse_move); + eet_data_descriptor_free(desc->mouse_wheel); + eet_data_descriptor_free(desc->multi_event); + eet_data_descriptor_free(desc->multi_move); + eet_data_descriptor_free(desc->key_down_key_up); + eet_data_descriptor_free(desc->take_screenshot); + eet_data_descriptor_free(desc->_lists_descriptor); + eet_data_descriptor_free(desc->_variant_descriptor); + eet_data_descriptor_free(desc->_variant_unified_descriptor); + + free(desc); + desc = NULL; + /* FIXME: Should probably only init and shutdown once */ + } +} +/* END Event struct descriptors */ diff --git a/src/lib/tsuite_file_data.h b/src/lib/tsuite_file_data.h new file mode 100644 index 0000000..b7a945e --- /dev/null +++ b/src/lib/tsuite_file_data.h @@ -0,0 +1,143 @@ +#ifndef _TSUITE_EVAS_HOOK_H +#define _TSUITE_EVAS_HOOK_H + +#include "tsuite.h" + +#define CACHE_FILE_ENTRY "cache" + +struct _mouse_in_mouse_out +{ + unsigned int timestamp; +}; + +struct _mouse_down_mouse_up +{ + int b; + Evas_Button_Flags flags; + unsigned int timestamp; +}; + +struct _mouse_move +{ + int x; + int y; + unsigned int timestamp; +}; + +struct _mouse_wheel +{ + int direction; + int z; + unsigned int timestamp; +}; + +struct _key_down_key_up +{ + unsigned int timestamp; + const char *keyname; + const char *key; + const char *string; + const char *compose; +}; + +struct _multi_event +{ + int d; + int x; + int y; + double rad; + double radx; + double rady; + double pres; + double ang; + double fx; + double fy; + Evas_Button_Flags flags; + unsigned int timestamp; +}; + +struct _multi_move +{ + int d; + int x; + int y; + double rad; + double radx; + double rady; + double pres; + double ang; + double fx; + double fy; + unsigned int timestamp; +}; + +typedef struct _mouse_in_mouse_out mouse_in_mouse_out; +typedef struct _mouse_down_mouse_up mouse_down_mouse_up; +typedef struct _mouse_move mouse_move; +typedef struct _mouse_wheel mouse_wheel; +typedef struct _multi_event multi_event; +typedef struct _multi_move multi_move; +typedef struct _key_down_key_up key_down_key_up; +typedef struct _mouse_in_mouse_out take_screenshot; + +/* START - EET support typedefs */ +#define TSUITE_EVENT_MOUSE_IN_STR "tsuite_event_mouse_in" +#define TSUITE_EVENT_MOUSE_OUT_STR "tsuite_event_mouse_out" +#define TSUITE_EVENT_MOUSE_DOWN_STR "tsuite_event_mouse_down" +#define TSUITE_EVENT_MOUSE_UP_STR "tsuite_event_mouse_up" +#define TSUITE_EVENT_MOUSE_MOVE_STR "tsuite_event_mouse_move" +#define TSUITE_EVENT_MOUSE_WHEEL_STR "tsuite_event_mouse_wheel" +#define TSUITE_EVENT_MULTI_DOWN_STR "tsuite_event_multi_down" +#define TSUITE_EVENT_MULTI_UP_STR "tsuite_event_multi_up" +#define TSUITE_EVENT_MULTI_MOVE_STR "tsuite_event_multi_move" +#define TSUITE_EVENT_KEY_DOWN_STR "tsuite_event_key_down" +#define TSUITE_EVENT_KEY_UP_STR "tsuite_event_key_up" +#define TSUITE_EVENT_TAKE_SHOT_STR "tsuite_event_take_shot" + + +struct _Lists_st +{ + Eina_List *variant_list; +}; +typedef struct _Lists_st Lists_st; + +struct _data_desc +{ + Eet_Data_Descriptor *take_screenshot; + Eet_Data_Descriptor *mouse_in_mouse_out; + Eet_Data_Descriptor *mouse_down_mouse_up; + Eet_Data_Descriptor *mouse_move; + Eet_Data_Descriptor *mouse_wheel; + Eet_Data_Descriptor *multi_event; + Eet_Data_Descriptor *multi_move; + Eet_Data_Descriptor *key_down_key_up; + + /* list, variant EET desc support */ + Eet_Data_Descriptor *_lists_descriptor; + Eet_Data_Descriptor *_variant_descriptor; + Eet_Data_Descriptor *_variant_unified_descriptor; +}; +typedef struct _data_desc data_desc; +/* END - EET support typedefs */ + +/* START Event struct descriptors */ +Eet_Data_Descriptor *take_screenshot_desc_make(void); +Eet_Data_Descriptor *mouse_in_mouse_out_desc_make(void); +Eet_Data_Descriptor *mouse_down_mouse_up_desc_make(void); +Eet_Data_Descriptor *mouse_move_desc_make(void); +Eet_Data_Descriptor *mouse_wheel_desc_make(void); +Eet_Data_Descriptor *key_down_key_up_desc_make(void); +Eet_Data_Descriptor *multi_event_desc_make(void); +Eet_Data_Descriptor *multi_move_desc_make(void); +data_desc *_data_descriptors_init(void); +void _data_descriptors_shutdown(void); +/* END Event struct descriptors */ + +Tsuite_Event_Type tsuite_event_mapping_type_get(const char *name); +const char * tsuite_event_mapping_type_str_get(Tsuite_Event_Type t); +const char * _variant_type_get(const void *data, Eina_Bool *unknow); +Eina_Bool _variant_type_set(const char *type, void *data, Eina_Bool unknow); + +void write_events(const char *filename, Lists_st *vr_list); +Lists_st *read_events(char *filename, Evas *e, Timer_Data *td); +#endif diff --git a/src/scripts/Makefile.am b/src/scripts/Makefile.am new file mode 100644 index 0000000..964e57e --- /dev/null +++ b/src/scripts/Makefile.am @@ -0,0 +1,8 @@ +MAINTAINERCLEANFILES = Makefile.in + +uninstall-local: + rm $(bindir)/exactness + +install-exec-local: + ./write.sh $(libdir)/exactness/ + $(INSTALL) exactness $(bindir) diff --git a/src/scripts/write.sh b/src/scripts/write.sh new file mode 100755 index 0000000..9c9473d --- /dev/null +++ b/src/scripts/write.sh @@ -0,0 +1,329 @@ +#!/bin/sh +# This script creates exactness script that later is copied to $(bindir) +# by Makefile. +# The reason to do it this was is that we would like to get $OUR_LIBPATH as +# a parameter from Makefile. +cat <<-ENDOFMESSAGE>exactness +#!/usr/bin/env bash +# tsuite_script.sh -i this makes new 'orig' folder +# tsuite_script.sh -i TestName1 [TestName2 ...] rewrite files for selcted tests in 'orig' folder +# tsuite_script.sh -r [TestName1 TestName2 ...] ; this means record [all tests or TestName additional arg] +# tsuite_script.sh -d FolderName -p [TestName1 TestName2 ...] this means play a record and put screenshots FolderName +# tsuite_script.sh -d FolderName -c [TestName1 TestName2 ...] this means compare "orig" with screenshots in FolderName +# When omitting DestDir we will use 'current' as default DestDir + +#_DEBUG="on" +function DEBUG() +{ + [ "\$_DEBUG" == "on" ] && \$@ +} + +do_help () { +echo "Record tests to produce input-stream to play and set screenshot timing" +echo "To record all tests:" +echo "\$0 -r" +echo "To record specific tests:" +echo "\$0 -r TestName1 [TestName2 ...]" +echo +echo "Play tests to produce PNG files of screenshot defined while recording." +echo "To play all tests:" +echo "\$0 -p d DestDir" +echo "To play specific tests:" +echo "\$0 -p -d DestDir TestName1 [TestName2 ...]" +echo "To play and rewrite 'orig' dir, use init option for all test: \$0 -i" +echo "To play and rewrite 'orig' dir, use init option for selected tests: \$0 -i [TestName1 ...]" +echo +echo "Run comprison to produce comp_*.png files" +echo "To compare all tests:" +echo "\$0 -c [-d DestDir]" +echo "To compare specific tests:" +echo "\$0 -c -d DestDir TestName1 [TestName2 ...]" +echo +echo "NOTE:" +echo "For all actions require DestDir, when omitting this param we use 'current' as default" +} + +do_record () { +DEBUG printf "do_record()\n" +# This will run record for all test if no specific test specified +# or run recording of specified tests (names passed as parameter). +# run ALL tests to record +DEBUG echo do_record "\$*" + +OUR_LIBPATH="$1" + +if [ -z "\$*" ] +then + LD_PRELOAD=\${OUR_LIBPATH}/libexactness.so exactness_raw --record +else + LD_PRELOAD=\${OUR_LIBPATH}/libexactness.so exactness_raw --record \$* +fi +return 0 +} + +do_play () { +# This will play record for all test if '-a' specified. +# or play record of tests specified as parameter. +# run ALL tests to record +DEBUG echo dest dir: "\$_dest_dir" +DEBUG echo do_play "\$_dest_dir" "\$*" + +# Play recorded tests and produce PNG files. +# this will produce screenshots in "_dest_dir" folder +if [ -z "\$*" ] +then +# Clear all files before producing all PNG files. + rm -rf "\$_dest_dir" &> /dev/null + mkdir -p "\$_dest_dir" + ELM_ENGINE="buffer" exactness_raw --destdir "\$_dest_dir" +else + if [ -e "\$_dest_dir" ] + then +# Remove PNG files according to tests played + for i in \$* + do + rm "\$_dest_dir"/"\$i"_[0-9]*.png &> /dev/null + done + else +# Create dest dir + mkdir -p "\$_dest_dir" + fi + + ELM_ENGINE="buffer" exactness_raw --destdir "\$_dest_dir" \$* +fi + +return 0 +} + +compare_files () { +if [ -e "\$1" ] +# First file exists +then + local md_file1=\`md5sum \$1\` + if [ -e "\$2" ] + then +# Second file exists + local md_file2=\`md5sum \$2\` + +# Get md5 of both files + local md1=\`echo "\$md_file1" | cut -d ' ' -f1\` + local md2=\`echo "\$md_file2" | cut -d ' ' -f1\` + +# Increase counter of comparisons + (( ncomp++ )) + + # Compare md5 of both files + if [ "x\$md1" != "x\$md2" ] + then + if [ \$comp_unavail -eq 0 ] + then + # Create diff-file with 'comp_' prefix. + local name=\`basename "\$1"\` + compare "\$1" "\$2" "\$_dest_dir"/comp_"\$name" + else + echo "\$name does not match." + fi +# Increment counter of files not identical. + (( nfail++ )) + fi + else +# Failed to find second file + echo "Test file was not found \$2" + (( nerr++ )) + fi +else +# Failed to find first file + echo "Test file was not found \$1" + (( nerr++ )) +fi +} + +process_compare () { + # Process all files listed in array (param) + local files_list=( "\$@" ) + for line in "\${files_list[@]}" + do + local name=\`basename "\$line"\` + DEBUG echo "comparing \$name" + compare_files "\$_orig_dir"/"\$name" "\$_dest_dir"/"\$name" + done +} + +do_compare () { +DEBUG printf "do_compare()\n" +# This will compare files in 'orig' folder with files in _dest_dir +if [ \$comp_unavail -ne 0 ] +then + if [ \$# -eq 1 ] + then + echo "Compare software missing." + echo "Install \"ImageMagick\" if you like to procduce \"comp\" files." + echo "Printing diffs to output" + fi +fi + +if [ -z "\$_dest_dir" ] +then + printf "For comparing, Usage: %s -c -a -d DirName\nor\n%s -c -d DirName TestName1, TestName2,...\n" \$(basename \$0) \$(basename \$0) >&2 +fi + +if [ "\$_dest_dir" = "\$_orig_dir" ] +then + printf "Dest-Dir is \$_dest_dir, exiting.\n" + return 0 +fi + +local files_list= +if [ -z "\$*" ] +# No test names given, compare all +then + rm -f "\$_dest_dir"/comp_* &> /dev/null + files_list=( \`ls "\$_dest_dir"/test_*\` ) + process_compare "\${files_list[@]}" +else + for test_name in \$* + do + rm -f "\$_dest_dir"/comp_"\$test_name"_[0-9]*.png &> /dev/null + files_list=( \`ls "\$_dest_dir"/"\$test_name"_[0-9]*.png\` ) + process_compare "\${files_list[@]}" + done +fi + +echo "Processed \$ncomp comparisons" +echo "with \$nfail file that did not match" +echo "and \$nerr errors" +return 0 +} + +# Script Entry Point +_record= +_play= +_compare= +_init= +_remove_fail= +_orig_dir="orig" +# Init dest_dir - should change on the fly +_dest_dir= + +nerr=0 +ncomp=0 +nfail=0 + +# Test that compare is insatlled +which compare &> /dev/null +comp_unavail=\$? + +while getopts 'acd:hpri?' OPTION +do + case \$OPTION in + c) _compare=1 + ;; + d) _dest_dir="\$OPTARG" + ;; + p) _play=1 + _remove_fail=1 + ;; + r) _record=1 + _remove_fail=1 + ;; + i) _dest_dir="\$_orig_dir" + _init=1 + _play=1 + _remove_fail=1 + ;; + h) do_help + exit 0 + ;; + ?) do_help + exit 0 + ;; + esac +done +shift \$((\$OPTIND - 1)) +# printf "Remaining arguments are: %s\n" "\$*" +if [ -z "\$_dest_dir" ] +then + if [ ! -z "\$_play" ] + then + _dest_dir="current" + fi + if [ ! -z "\$_compare" ] + then + _dest_dir="current" + fi +else + if [ ! -z "\$_init" ] + then + if [ "\$_dest_dir" != "\$_orig_dir" ] + then + echo "Cannot use '-i' option with a DestDir that is not 'orig'" + echo "No need to specify DestDir when using '-i'" + echo "For help: \$0 -h" + exit 2 + fi + fi +fi + +if [ ! -z "\$_compare" ] +then + if [ "\$_dest_dir" = "\$_orig_dir" ] + then + echo "Cannot use 'orig' dir with compare '-c' option" + echo "Please select different DestDir" + echo "For help: \$0 -h" + exit 3 + fi +fi + +# Here we clear all fail_*.txt files before running test +# because those files are opened with append ("a") mode. +# We don't want to accumlate old tests fail text. +if [ "\$_remove_fail" ] +then + if [ -z "\$*" ] + then + # Remove all file_*.txt files before init/play/record + DEBUG echo "removing fail_*.txt" + rm fail_*.txt &> /dev/null + else + # Remove file_*.txt files before init/play/record + for i in \$* + do + DEBUG echo "removing fail_\$i.txt" + rm fail_"\$i".txt &> /dev/null + done + fi +fi + +if [ "\$_record" ] +then + do_record "\$*" +fi + +if [ "\$_play" ] +then + do_play "\$*" +fi + +if [ "\$_compare" ] +then + do_compare "\$*" +fi + +if [ "\$_remove_fail" ] +then + ls fail_*.txt &> /dev/null + if [ "\$?" -eq 0 ] + then + _n_tests_failed=\`ls fail_*.txt -1 | wc -l\` + + if [ "\$_n_tests_failed" ] + then + echo "\$_n_tests_failed tests had errors while running." + echo "Please examine fail_*.txt files in CWD" + fi + fi +fi +ENDOFMESSAGE + +chmod +x exactness diff --git a/tasn_is_a_lazy_bastard b/tasn_is_a_lazy_bastard index c315802..1184451 100644 --- a/tasn_is_a_lazy_bastard +++ b/tasn_is_a_lazy_bastard @@ -1 +1 @@ -And he deserves to DIEEEEEE +And he deserves to live forever.