accdd92110
Added 3 examples for the box layout recipe: 1) Simple box layout demonstrating how to set actor properties 2) Trivial menu implementation using box layout 3) Demonstration app which enables tweaking and testing of layout property interactions Also inlined example 1 in the solution section and added more explanatory text in the discussion.
152 lines
5.2 KiB
C
152 lines
5.2 KiB
C
#include <stdlib.h>
|
|
#include <clutter/clutter.h>
|
|
|
|
#define FONT "Sans 20px"
|
|
|
|
static const ClutterColor stage_color = { 0x33, 0x33, 0x55, 0xff };
|
|
static const ClutterColor yellow_color = { 0xaa, 0xaa, 0x00, 0xff };
|
|
static const ClutterColor black_color = { 0x00, 0x00, 0x00, 0xff };
|
|
|
|
static void
|
|
menu_run_option (ClutterActor *actor,
|
|
ClutterEvent *event,
|
|
gpointer user_data)
|
|
{
|
|
g_debug ("%s pressed", (gchar *) user_data);
|
|
}
|
|
|
|
static void
|
|
menu_add_option (ClutterBox *menu,
|
|
gchar *text,
|
|
gchar *shortcut)
|
|
{
|
|
ClutterActor *entry;
|
|
|
|
entry = clutter_box_new (clutter_bin_layout_new (CLUTTER_BIN_ALIGNMENT_CENTER,
|
|
CLUTTER_BIN_ALIGNMENT_CENTER));
|
|
clutter_box_set_color (CLUTTER_BOX (entry), &black_color);
|
|
clutter_actor_set_width (entry, 250);
|
|
clutter_actor_set_reactive (entry, TRUE);
|
|
|
|
clutter_box_pack (CLUTTER_BOX (entry),
|
|
clutter_text_new_full (FONT, text, &yellow_color),
|
|
"x-align", CLUTTER_BIN_ALIGNMENT_START,
|
|
NULL);
|
|
|
|
clutter_box_pack (CLUTTER_BOX (entry),
|
|
clutter_text_new_full (FONT, shortcut, &yellow_color),
|
|
"x-align", CLUTTER_BIN_ALIGNMENT_END,
|
|
NULL);
|
|
|
|
clutter_container_add_actor (CLUTTER_CONTAINER (menu), entry);
|
|
|
|
g_signal_connect (entry,
|
|
"button-press-event",
|
|
G_CALLBACK (menu_run_option),
|
|
text);
|
|
}
|
|
|
|
static void
|
|
menu_toggle (ClutterActor *actor,
|
|
ClutterEvent *event,
|
|
gpointer user_data)
|
|
{
|
|
ClutterAnimation *animation;
|
|
ClutterActor *menu = CLUTTER_ACTOR (user_data);
|
|
|
|
if (clutter_actor_get_animation (menu))
|
|
return;
|
|
|
|
if (clutter_actor_get_opacity (menu) > 0)
|
|
{
|
|
animation = clutter_actor_animate (menu, CLUTTER_EASE_OUT_CUBIC, 200,
|
|
"opacity", 0,
|
|
NULL);
|
|
|
|
/* hide the menu once it is fully transparent */
|
|
g_signal_connect_swapped (animation,
|
|
"completed",
|
|
G_CALLBACK (clutter_actor_hide),
|
|
menu);
|
|
}
|
|
else
|
|
{
|
|
clutter_actor_show (menu);
|
|
|
|
clutter_actor_animate (menu, CLUTTER_EASE_OUT_CUBIC, 200,
|
|
"opacity", 255,
|
|
NULL);
|
|
}
|
|
}
|
|
|
|
int
|
|
main (int argc,
|
|
char *argv[])
|
|
{
|
|
ClutterActor *stage;
|
|
ClutterActor *button;
|
|
ClutterLayoutManager *menu_layout;
|
|
ClutterActor *menu;
|
|
|
|
clutter_init (&argc, &argv);
|
|
|
|
stage = clutter_stage_get_default ();
|
|
clutter_actor_set_size (stage, 400, 400);
|
|
clutter_stage_set_color (CLUTTER_STAGE (stage), &stage_color);
|
|
g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL);
|
|
|
|
/* button */
|
|
button = clutter_box_new (clutter_bin_layout_new (CLUTTER_BIN_ALIGNMENT_CENTER,
|
|
CLUTTER_BIN_ALIGNMENT_CENTER));
|
|
clutter_actor_set_width (button, 100);
|
|
clutter_actor_set_position (button, 50, 50);
|
|
clutter_actor_set_reactive (button, TRUE);
|
|
clutter_box_set_color (CLUTTER_BOX (button), &black_color);
|
|
clutter_box_pack (CLUTTER_BOX (button),
|
|
clutter_text_new_full (FONT, "Edit", &yellow_color),
|
|
"x-align", CLUTTER_BIN_ALIGNMENT_FILL,
|
|
"y-align", CLUTTER_BIN_ALIGNMENT_FILL,
|
|
NULL);
|
|
|
|
/* menu */
|
|
menu_layout = clutter_box_layout_new ();
|
|
clutter_box_layout_set_homogeneous (CLUTTER_BOX_LAYOUT (menu_layout), TRUE);
|
|
clutter_box_layout_set_vertical (CLUTTER_BOX_LAYOUT (menu_layout), TRUE);
|
|
clutter_box_layout_set_spacing (CLUTTER_BOX_LAYOUT (menu_layout), 2);
|
|
|
|
menu = clutter_box_new (menu_layout);
|
|
clutter_box_set_color (CLUTTER_BOX (menu), &yellow_color);
|
|
menu_add_option (CLUTTER_BOX (menu), "Undo", "Ctrl-z");
|
|
menu_add_option (CLUTTER_BOX (menu), "Redo", "Ctrl-Shift-z");
|
|
menu_add_option (CLUTTER_BOX (menu), "Cut", "Ctrl-x");
|
|
menu_add_option (CLUTTER_BOX (menu), "Copy", "Ctrl-c");
|
|
menu_add_option (CLUTTER_BOX (menu), "Paste", "Ctrl-v");
|
|
|
|
/* align left-hand side of menu with left-hand side of button */
|
|
clutter_actor_add_constraint (menu, clutter_align_constraint_new (button,
|
|
CLUTTER_ALIGN_X_AXIS,
|
|
0.0));
|
|
|
|
/* align top of menu with the bottom of the button */
|
|
clutter_actor_add_constraint (menu, clutter_bind_constraint_new (button,
|
|
CLUTTER_BIND_Y,
|
|
clutter_actor_get_height (button)));
|
|
|
|
/* hide the menu until we're ready to animate it in */
|
|
clutter_actor_set_opacity (menu, 0);
|
|
clutter_actor_hide (menu);
|
|
|
|
/* clicking on the button toggles the menu */
|
|
g_signal_connect (button, "button-press-event", G_CALLBACK (menu_toggle), menu);
|
|
|
|
clutter_container_add_actor (CLUTTER_CONTAINER (stage), menu);
|
|
|
|
clutter_container_add_actor (CLUTTER_CONTAINER (stage), button);
|
|
|
|
clutter_actor_show (stage);
|
|
|
|
clutter_main ();
|
|
|
|
return EXIT_SUCCESS;
|
|
}
|