elm_transit - Combined effects and options.

This example shows how to apply the following transition effects:

- translation
- color
- rotation
- wipe
- zoom
- resizing

It allows you to apply more than one effect at once, and also allows to set properties like event_enabled, auto_reverse, repeat_times and tween_mode.

//Compile with:
//gcc -o transit_example_03 transit_example_03.c `pkg-config --cflags --libs elementary` -DDATA_DIR="\"<directory>\""
//where directory is the a path where images/icon_07.png can be found.
#include <Elementary.h>
/* structure to hold context for many callbacks */
struct Context
{
Eina_Bool events_enabled;
Eina_Bool auto_reverse;
Eina_Bool final_state_keep;
int repeat_times;
Elm_Transit_Tween_Mode tween_mode;
Evas_Object *obj;
};
static void
_transit_translation(Elm_Transit *trans)
{
/* considering the original position (x0, y0), moves the object from
* (x0 - 20, y0 - 50) to (x0 + 70, y0 + 150) */
elm_transit_effect_translation_add(trans, -20, -50, 70, 150);
}
static void
_transit_color(Elm_Transit *trans)
{
/* changes the object color from 100, 255, 100, 255 to
* 40, 10, 40, 50 */
elm_transit_effect_color_add(trans, 100, 255, 100, 255, 40, 10, 40, 50);
}
static void
_transit_rotation(Elm_Transit *trans)
{
/* rotates the object from its original angle to 135 degrees to the right */
elm_transit_effect_rotation_add(trans, 0.0, 135.0);
}
static void
_transit_wipe(Elm_Transit *trans)
{
/* hide the object clipping it from the left to the right */
elm_transit_effect_wipe_add(trans,
ELM_TRANSIT_EFFECT_WIPE_TYPE_HIDE,
ELM_TRANSIT_EFFECT_WIPE_DIR_RIGHT);
}
static void
_transit_zoom(Elm_Transit *trans)
{
/* zoom the object from its original size to 2x */
elm_transit_effect_zoom_add(trans, 1.0, 2.0);
}
static void
_transit_resizing(Elm_Transit *trans)
{
/* resize the object from 250x100 to 400x160 */
elm_transit_effect_resizing_add(trans, 250, 100, 400, 160);
}
/* helper structure that will hold the transit checkboxes string, callbacks
* and checked statuses */
static struct {
const char *label;
void (*transition_add_cb)(Elm_Transit *);
Eina_Bool checked;
} _transitions[] = {
{ "Translation", _transit_translation, EINA_FALSE },
{ "Color", _transit_color, EINA_FALSE },
{ "Rotation", _transit_rotation, EINA_FALSE },
{ "Wipe", _transit_wipe, EINA_FALSE },
{ "Zoom", _transit_zoom, EINA_FALSE },
{ "Resizing", _transit_resizing, EINA_FALSE },
{ NULL, NULL, EINA_FALSE }
};
/* add a checkbox to the box with the given label, and uses the checked
* pointer as state_pointer to this checkbox */
static void
_checkbox_transition_add(Evas_Object *box, const char *label, Eina_Bool *checked)
{
Evas_Object *check = elm_check_add(elm_object_parent_widget_get(box));
evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(check, 0.0, 0.0);
elm_object_text_set(check, label);
elm_check_state_pointer_set(check, checked);
elm_box_pack_end(box, check);
evas_object_show(check);
}
static void
_transit_start(void *data, Evas_Object *o EINA_UNUSED, void *event_info EINA_UNUSED)
{
Elm_Transit *trans = NULL;
int i;
struct Context *ctxt = data;
Evas_Object *obj = ctxt->obj; // the object on which the transition will be
// applied
// FIXME: Should check if there's another transit going before starting a new
// one
/* initialization: create the transition and add the object to it */
trans = elm_transit_add();
elm_transit_object_add(trans, obj);
/* from our helper structure and array, check if the specified transition is
* checked and use its callback to add this transition to trans */
for (i = 0; _transitions[i].label; i++)
{
if (_transitions[i].checked)
_transitions[i].transition_add_cb(trans);
}
/* get the various options for this transition from the context structure */
elm_transit_event_enabled_set(trans, ctxt->events_enabled);
elm_transit_auto_reverse_set(trans, ctxt->auto_reverse);
elm_transit_objects_final_state_keep_set(trans, ctxt->final_state_keep);
elm_transit_tween_mode_set(trans, ctxt->tween_mode);
elm_transit_repeat_times_set(trans, ctxt->repeat_times);
/* set the transition time to 2 seconds and start it */
elm_transit_duration_set(trans, 2.0);
elm_transit_go(trans);
}
/* callback useful just to know whether we can receive events from the
* object or not */
static void
_object_clicked(void *data EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *event_info EINA_UNUSED)
{
printf("object clicked!\n");
}
/* update our context with the given value for repeat count */
static void
_cb_repeat_changed(void *data, Evas_Object *obj, void *event EINA_UNUSED)
{
int *repeat_cnt = data;
*repeat_cnt = elm_spinner_value_get(obj);
}
/* update our context with the given tween mode for the transition */
static void
_cb_tween_changed(void *data, Evas_Object *obj, void *event EINA_UNUSED)
{
Elm_Transit_Tween_Mode *mode = data;
double val = 0.0;
val = elm_spinner_value_get(obj);
if (EINA_DBL_EQ(val, 1.0))
*mode = ELM_TRANSIT_TWEEN_MODE_LINEAR;
else if (EINA_DBL_EQ(val, 2.0))
*mode = ELM_TRANSIT_TWEEN_MODE_SINUSOIDAL;
else if (EINA_DBL_EQ(val, 3.0))
*mode = ELM_TRANSIT_TWEEN_MODE_DECELERATE;
else if (EINA_DBL_EQ(val, 4.0))
*mode = ELM_TRANSIT_TWEEN_MODE_ACCELERATE;
}
EAPI_MAIN int
elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED)
{
Evas_Object *win, *obj, *icon, *box, *vbox, *vbox2, *hbox, *btn;
Evas_Object *cbox, *dummy, *spinner;
char buf[PATH_MAX];
int i;
struct Context context;
/* initialize our context */
context.events_enabled = EINA_FALSE;
context.auto_reverse = EINA_FALSE;
context.final_state_keep = EINA_FALSE;
context.repeat_times = 0;
context.tween_mode = ELM_TRANSIT_TWEEN_MODE_LINEAR;
elm_app_info_set(elm_main, "elementary", "images/icon_07.png");
elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
/* add a window */
win = elm_win_util_standard_add("transit", "Transit Example");
elm_win_autodel_set(win, EINA_TRUE);
/* add a vertical box that will hold everything */
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);
/* a dummy background to create some space for the animation */
dummy = elm_bg_add(win);
evas_object_size_hint_weight_set(dummy, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_box_pack_end(box, dummy);
evas_object_show(dummy);
/* add an object that we are going to play with */
/* this object isn't packed inside the box because we don't want it to have
* its size, position, aspect or anything else controlled by the container */
obj = elm_button_add(win);
elm_object_text_set(obj, "Transformed object!");
icon = elm_icon_add(win);
snprintf(buf, sizeof(buf), "%s/images/icon_07.png", elm_app_data_dir_get());
elm_image_file_set(icon, buf, NULL);
elm_object_part_content_set(obj, "icon", icon);
evas_object_move(obj, 160, 60);
evas_object_resize(obj, 250, 100);
evas_object_show(obj);
context.obj = obj;
/* a callback to know if clicks are being received */
evas_object_smart_callback_add(obj, "clicked", _object_clicked, NULL);
/* button to start our transition */
btn = elm_button_add(win);
evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_object_text_set(btn, "Transit!");
elm_box_pack_end(box, btn);
evas_object_show(btn);
evas_object_smart_callback_add(btn, "clicked", _transit_start, &context);
/* horizontal box to help visual organization */
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, 0.0);
elm_box_pack_end(box, hbox);
evas_object_show(hbox);
/* horizontal box that will hold the many transition checkboxes */
vbox = elm_box_add(win);
evas_object_size_hint_weight_set(vbox, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
evas_object_size_hint_align_set(vbox, EVAS_HINT_FILL, 0.0);
/* create the respective checkboxes based on our helper structure and
* array */
for (i = 0; _transitions[i].label; i++)
_checkbox_transition_add(vbox, _transitions[i].label,
&_transitions[i].checked);
elm_box_pack_end(hbox, vbox);
evas_object_show(vbox);
/* vertical box that will hold the many transition option checkboxes */
vbox2 = elm_box_add(win);
evas_object_size_hint_weight_set(vbox2, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
evas_object_size_hint_align_set(vbox2, EVAS_HINT_FILL, 0.0);
elm_box_pack_end(hbox, vbox2);
evas_object_show(vbox2);
/* the rest of this code adds widgets to control some of the behavior of
* the transitions */
cbox = elm_check_add(win);
evas_object_size_hint_weight_set(cbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(cbox, 0.0, 0.0);
elm_object_text_set(cbox, "Events enabled");
elm_check_state_pointer_set(cbox, &context.events_enabled);
elm_box_pack_end(vbox2, cbox);
evas_object_show(cbox);
cbox = elm_check_add(win);
evas_object_size_hint_weight_set(cbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(cbox, 0.0, 0.0);
elm_object_text_set(cbox, "Auto reverse");
elm_check_state_pointer_set(cbox, &context.auto_reverse);
elm_box_pack_end(vbox2, cbox);
evas_object_show(cbox);
cbox = elm_check_add(win);
evas_object_size_hint_weight_set(cbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(cbox, 0.0, 0.0);
elm_object_text_set(cbox, "Keep final state");
elm_check_state_pointer_set(cbox, &context.final_state_keep);
elm_box_pack_end(vbox2, cbox);
evas_object_show(cbox);
spinner = elm_spinner_add(win);
elm_object_style_set(spinner, "vertical");
elm_spinner_min_max_set(spinner, 0, 4);
elm_spinner_label_format_set(spinner, "%.0f");
elm_spinner_editable_set(spinner, EINA_FALSE);
evas_object_size_hint_weight_set(spinner, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(spinner, 0.0, EVAS_HINT_FILL);
evas_object_smart_callback_add(spinner, "changed", _cb_repeat_changed, &context.repeat_times);
elm_box_pack_end(vbox2, spinner);
evas_object_show(spinner);
spinner = elm_spinner_add(win);
elm_object_style_set(spinner, "vertical");
elm_spinner_min_max_set(spinner, 1, 4);
elm_spinner_label_format_set(spinner, "%.0f");
elm_spinner_editable_set(spinner, EINA_FALSE);
elm_spinner_special_value_add(spinner, 1, "linear");
elm_spinner_special_value_add(spinner, 2, "sinusoidal");
elm_spinner_special_value_add(spinner, 3, "decelerate");
elm_spinner_special_value_add(spinner, 4, "accelerate");
evas_object_size_hint_weight_set(spinner, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(spinner, 0.0, EVAS_HINT_FILL);
evas_object_smart_callback_add(spinner, "changed", _cb_tween_changed, &context.tween_mode);
elm_box_pack_end(vbox2, spinner);
evas_object_show(spinner);
evas_object_show(win);
elm_run();
return 0;
}
ELM_MAIN()
EVAS_HINT_EXPAND
#define EVAS_HINT_EXPAND
Use with evas_object_size_hint_weight_set(), evas_object_size_hint_weight_get(), evas_object_size_hin...
Definition Evas_Common.h:297
EVAS_HINT_FILL
#define EVAS_HINT_FILL
Use with evas_object_size_hint_align_set(), evas_object_size_hint_align_get(), evas_object_size_hint_...
Definition Evas_Common.h:298
EINA_DBL_EQ
#define EINA_DBL_EQ(a, b)
Safe comparison of double.
Definition eina_util.h:100
EINA_TRUE
#define EINA_TRUE
boolean value TRUE (numerical value 1)
Definition eina_types.h:539
EINA_FALSE
#define EINA_FALSE
boolean value FALSE (numerical value 0)
Definition eina_types.h:533
Eina_Bool
unsigned char Eina_Bool
Type to mimic a boolean.
Definition eina_types.h:527
EINA_UNUSED
#define EINA_UNUSED
Used to indicate that a function parameter is purposely unused.
Definition eina_types.h:339
elm_app_info_set
void elm_app_info_set(void *mainfunc, const char *dom, const char *checkfile)
Re-locate the application somewhere else after compilation, if the developer wishes for easier distri...
Definition elm_main.c:496
elm_app_data_dir_get
const char * elm_app_data_dir_get(void)
Get the application's run time data prefix directory, as set by elm_app_info_set() and the way (envir...
Definition elm_main.c:586
elm_bg_add
Evas_Object * elm_bg_add(Evas_Object *parent)
Adds a new background to the parent.
Definition efl_ui_bg.c:304
elm_box_horizontal_set
void elm_box_horizontal_set(Elm_Box *obj, Eina_Bool horizontal)
Set the horizontal orientation.
Definition elm_box_eo.legacy.c:27
elm_box_add
Evas_Object * elm_box_add(Evas_Object *parent)
Add a new box to the parent.
Definition elm_box.c:363
elm_box_pack_end
void elm_box_pack_end(Elm_Box *obj, Efl_Canvas_Object *subobj)
Add an object at the end of the pack list.
Definition elm_box_eo.legacy.c:57
elm_button_add
Evas_Object * elm_button_add(Evas_Object *parent)
Add a new button to the parent's canvas.
Definition efl_ui_button.c:459
elm_check_add
Evas_Object * elm_check_add(Evas_Object *parent)
Add a new Check object.
Definition efl_ui_check.c:516
elm_check_state_pointer_set
void elm_check_state_pointer_set(Eo *obj, Eina_Bool *statep)
Set a convenience pointer to a boolean to change.
Definition efl_ui_check.c:387
elm_object_part_content_set
void elm_object_part_content_set(Evas_Object *obj, const char *part, Evas_Object *content)
Set the content on part of a given container widget.
Definition elm_main.c:1562
ELM_MAIN
#define ELM_MAIN()
macro to be used after the elm_main() function
Definition elm_general.h:556
elm_policy_set
Eina_Bool elm_policy_set(unsigned int policy, int value)
Set a new policy's value (for a given policy group/identifier).
Definition elm_main.c:1380
elm_run
void elm_run(void)
Run Elementary's main loop.
Definition elm_main.c:1357
ELM_POLICY_QUIT_LAST_WINDOW_CLOSED
@ ELM_POLICY_QUIT_LAST_WINDOW_CLOSED
quit when the application's last window is closed
Definition elm_general.h:248
ELM_POLICY_QUIT
@ ELM_POLICY_QUIT
under which circumstances the application should quit automatically.
Definition elm_general.h:227
elm_icon_add
Evas_Object * elm_icon_add(Evas_Object *parent)
Add a new icon object to the parent.
Definition elm_icon.c:604
elm_image_file_set
Eina_Bool elm_image_file_set(Evas_Object *obj, const char *file, const char *group)
Set the file that will be used as the image's source.
Definition efl_ui_image.c:2416
elm_spinner_value_get
double elm_spinner_value_get(const Evas_Object *obj)
Control the value the spinner displays.
Definition elm_spinner.c:1387
elm_spinner_special_value_add
void elm_spinner_special_value_add(Elm_Spinner *obj, double value, const char *label)
Control special string to display in the place of the numerical value.
Definition elm_spinner_eo.legacy.c:75
elm_spinner_add
Evas_Object * elm_spinner_add(Evas_Object *parent)
Add a new spinner widget to the given parent Elementary (container) object.
Definition elm_spinner.c:1350
elm_spinner_label_format_set
void elm_spinner_label_format_set(Elm_Spinner *obj, const char *fmt)
Control the format string of the displayed label.
Definition elm_spinner_eo.legacy.c:63
elm_spinner_editable_set
void elm_spinner_editable_set(Elm_Spinner *obj, Eina_Bool editable)
Control whether the spinner can be directly edited by the user or not.
Definition elm_spinner_eo.legacy.c:39
elm_spinner_min_max_set
void elm_spinner_min_max_set(Evas_Object *obj, double min, double max)
Control the minimum and maximum values for the spinner.
Definition elm_spinner.c:1357
elm_object_style_set
Eina_Bool elm_object_style_set(Evas_Object *obj, const char *style)
Set the style to used by a given widget.
Definition elm_main.c:1583
elm_transit_tween_mode_set
void elm_transit_tween_mode_set(Elm_Transit *transit, Elm_Transit_Tween_Mode tween_mode)
Set the transit animation acceleration type.
Definition elm_transit.c:780
elm_transit_effect_zoom_add
Elm_Transit_Effect * elm_transit_effect_zoom_add(Elm_Transit *transit, float from_rate, float to_rate)
Add the Zoom Effect to Elm_Transit.
Definition elm_transit.c:1333
elm_transit_effect_translation_add
Elm_Transit_Effect * elm_transit_effect_translation_add(Elm_Transit *transit, Evas_Coord from_dx, Evas_Coord from_dy, Evas_Coord to_dx, Evas_Coord to_dy)
Add the Translation Effect to Elm_Transit.
Definition elm_transit.c:1240
Elm_Transit
struct _Elm_Transit Elm_Transit
The Transit created with elm_transit_add().
Definition elm_transit.h:130
elm_transit_auto_reverse_set
void elm_transit_auto_reverse_set(Elm_Transit *transit, Eina_Bool reverse)
Set reverse effect automatically.
Definition elm_transit.c:744
elm_transit_objects_final_state_keep_set
void elm_transit_objects_final_state_keep_set(Elm_Transit *transit, Eina_Bool state_keep)
Enable/disable keeping up the objects states.
Definition elm_transit.c:984
elm_transit_go
void elm_transit_go(Elm_Transit *transit)
Starts the transition.
Definition elm_transit.c:856
elm_transit_effect_resizing_add
Elm_Transit_Effect * elm_transit_effect_resizing_add(Elm_Transit *transit, Evas_Coord from_w, Evas_Coord from_h, Evas_Coord to_w, Evas_Coord to_h)
Add the Resizing Effect to Elm_Transit.
Definition elm_transit.c:1101
elm_transit_duration_set
void elm_transit_duration_set(Elm_Transit *transit, double duration)
Set the transit animation time.
Definition elm_transit.c:820
elm_transit_effect_wipe_add
void * elm_transit_effect_wipe_add(Elm_Transit *transit, Elm_Transit_Effect_Wipe_Type type, Elm_Transit_Effect_Wipe_Dir dir)
Add the Wipe Effect to Elm_Transit.
Definition elm_transit.c:2027
Elm_Transit_Tween_Mode
Elm_Transit_Tween_Mode
The type of acceleration used in the transition.
Definition elm_transit.h:63
elm_transit_event_enabled_set
void elm_transit_event_enabled_set(Elm_Transit *transit, Eina_Bool enabled)
Set the event enabled when transit is operating.
Definition elm_transit.c:713
elm_transit_add
Elm_Transit * elm_transit_add(void)
Create new transit.
Definition elm_transit.c:566
elm_transit_object_add
void elm_transit_object_add(Elm_Transit *transit, Evas_Object *obj)
Add new object to apply the effects.
Definition elm_transit.c:653
elm_transit_effect_color_add
Elm_Transit_Effect * elm_transit_effect_color_add(Elm_Transit *transit, unsigned int from_r, unsigned int from_g, unsigned int from_b, unsigned int from_a, unsigned int to_r, unsigned int to_g, unsigned int to_b, unsigned int to_a)
Add the Color Effect to Elm_Transit.
Definition elm_transit.c:2105
elm_transit_effect_rotation_add
Elm_Transit_Effect * elm_transit_effect_rotation_add(Elm_Transit *transit, float from_degree, float to_degree)
Add the Rotation Effect to Elm_Transit.
Definition elm_transit.c:2563
elm_transit_repeat_times_set
void elm_transit_repeat_times_set(Elm_Transit *transit, int repeat)
Set the transit repeat count.
Definition elm_transit.c:758
ELM_TRANSIT_EFFECT_WIPE_TYPE_HIDE
@ ELM_TRANSIT_EFFECT_WIPE_TYPE_HIDE
Hide the object during the animation.
Definition elm_transit.h:116
ELM_TRANSIT_TWEEN_MODE_LINEAR
@ ELM_TRANSIT_TWEEN_MODE_LINEAR
Constant speed.
Definition elm_transit.h:64
ELM_TRANSIT_TWEEN_MODE_SINUSOIDAL
@ ELM_TRANSIT_TWEEN_MODE_SINUSOIDAL
Starts slow, increase speed over time, then decrease again and stop slowly, v1 being a power factor.
Definition elm_transit.h:65
ELM_TRANSIT_TWEEN_MODE_DECELERATE
@ ELM_TRANSIT_TWEEN_MODE_DECELERATE
Starts fast and decrease speed over time, v1 being a power factor.
Definition elm_transit.h:68
ELM_TRANSIT_TWEEN_MODE_ACCELERATE
@ ELM_TRANSIT_TWEEN_MODE_ACCELERATE
Starts slow and increase speed over time, v1 being a power factor.
Definition elm_transit.h:70
ELM_TRANSIT_EFFECT_WIPE_DIR_RIGHT
@ ELM_TRANSIT_EFFECT_WIPE_DIR_RIGHT
Wipe to the right.
Definition elm_transit.h:105
elm_win_util_standard_add
Evas_Object * elm_win_util_standard_add(const char *name, const char *title)
Adds a window object with standard setup.
Definition efl_ui_win.c:9587
elm_win_resize_object_add
void elm_win_resize_object_add(Eo *obj, Evas_Object *subobj)
Add subobj as a resize object of window obj.
Definition efl_ui_win.c:9002
elm_win_autodel_set
void elm_win_autodel_set(Eo *obj, Eina_Bool autodel)
Set the window's autodel state.
Definition efl_ui_win.c:6199
evas_object_show
EVAS_API void evas_object_show(Evas_Object *eo_obj)
Makes the given Evas object visible.
Definition evas_object_main.c:1814
evas_object_move
EVAS_API void evas_object_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
Move the given Evas object to the given location inside its canvas' viewport.
Definition evas_object_main.c:1171
evas_object_size_hint_weight_set
EVAS_API void evas_object_size_hint_weight_set(Evas_Object *obj, double x, double y)
Sets the hints for an object's weight.
Definition evas_object_main.c:2638
evas_object_size_hint_align_set
EVAS_API void evas_object_size_hint_align_set(Evas_Object *obj, double x, double y)
Sets the hints for an object's alignment.
Definition evas_object_main.c:2650
Evas_Object
Efl_Canvas_Object Evas_Object
An Evas Object handle.
Definition Evas_Common.h:185
evas_object_resize
EVAS_API void evas_object_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
Changes the size of the given Evas object.
Definition evas_object_main.c:1236
evas_object_smart_callback_add
EVAS_API void evas_object_smart_callback_add(Evas_Object *eo_obj, const char *event, Evas_Smart_Cb func, const void *data)
Add (register) a callback function to the smart event specified by event on the smart object obj.
Definition evas_object_smart.c:1040