mutter/tests/interactive/test-box-layout.c
José Dapena Paz 7b63da69cf Add "homogeneous" mode to ClutterBoxLayout.
Added new "homogeneous" mode to ClutterBoxLayout, that makes layout children
get all the same size.

This is heavily inspired in the "homogeneous" attribute available in GtkBox,
but simplified as we don't have padding nor borders in box layout, only
spacing.

Also added to test-box-layout a key to set/unset homogeneous mode.

* Coding style fixes.
* Added proper test for homogeneous mode in box layout.
* Fix in homogeneous mode.

http://bugzilla.openedhand.com/show_bug.cgi?id=2034

Signed-off-by: Emmanuele Bassi <ebassi@linux.intel.com>
2010-03-25 09:41:54 +00:00

275 lines
7.7 KiB
C

/*
* Copyright 2009 Intel Corporation.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU Lesser General Public License,
* version 2.1, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
* Boston, MA 02111-1307, USA.
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <gmodule.h>
#include <clutter/clutter.h>
#include <cogl/cogl.h>
#include "pango/cogl-pango.h"
#define INSTRUCTIONS \
"Press v\t\342\236\236\tSwitch horizontal/vertical\n" \
"Press h\t\342\236\236\tSwitch homogeneous\n" \
"Press p\t\342\236\236\tSwitch pack start/end\n" \
"Press s\t\342\236\236\tIncrement spacing (up to 12px)\n" \
"Press a\t\342\236\236\tSwitch animations on/off\n" \
"Press q\t\342\236\236\tQuit"
static ClutterActor *hover_actor = NULL;
static ClutterActor *box = NULL;
static ClutterActor *label = NULL;
static guint last_index = 0;
static void
on_paint (ClutterActor *actor,
gpointer user_data)
{
guint index_ = GPOINTER_TO_UINT (user_data);
gchar *text = g_strdup_printf ("%u", index_);
ClutterActorBox alloc = { 0, };
CoglColor color;
gint layout_width, layout_height;
gfloat width, height;
PangoLayout *layout;
clutter_actor_get_allocation_box (actor, &alloc);
clutter_actor_box_get_size (&alloc, &width, &height);
layout = clutter_actor_create_pango_layout (actor, text);
pango_layout_get_size (layout, &layout_width, &layout_height);
cogl_color_set_from_4ub (&color, 0, 0, 0, 255);
cogl_pango_render_layout (layout,
(width - (layout_width / 1024)) / 2,
(height - (layout_height / 1024)) / 2,
&color, 0);
g_object_unref (layout);
g_free (text);
}
static void
enter_event (ClutterActor *actor,
ClutterEvent *event,
gpointer data)
{
ClutterColor color = { 0x00, 0x00, 0x00, 0xff };
clutter_rectangle_set_border_width (CLUTTER_RECTANGLE (actor), 2);
clutter_rectangle_set_border_color (CLUTTER_RECTANGLE (actor), &color);
hover_actor = actor;
}
static void
leave_event (ClutterActor *actor,
ClutterEvent *event,
gpointer data)
{
clutter_rectangle_set_border_width (CLUTTER_RECTANGLE (actor), 0);
hover_actor = NULL;
}
static gboolean
button_release_event (ClutterActor *actor,
ClutterEvent *event,
ClutterBoxLayout *layout)
{
gboolean xfill, yfill;
ClutterBoxAlignment xalign, yalign;
gint button;
button = clutter_event_get_button (event);
if (button == 1)
{
clutter_box_layout_get_fill (layout, actor, &xfill, &yfill);
clutter_box_layout_set_fill (layout, actor,
xfill ? FALSE : TRUE,
yfill ? FALSE : TRUE);
}
else
{
clutter_box_layout_get_alignment (layout, actor, &xalign, &yalign);
if (xalign < 2)
xalign += 1;
else
xalign = 0;
if (yalign < 2)
yalign += 1;
else
yalign = 0;
clutter_box_layout_set_alignment (layout, actor, xalign, yalign);
}
return TRUE;
}
static void
add_actor (ClutterBoxLayout *layout,
guint index_)
{
ClutterActor *rect;
ClutterColor color = { 0xff, 0xff, 0xff, 255 };
static gboolean expand = TRUE;
clutter_color_from_hls (&color,
g_random_double_range (0.0, 360.0),
0.5,
0.5);
rect = clutter_rectangle_new_with_color (&color);
clutter_actor_set_size (rect, 32, 64);
clutter_box_layout_pack (layout, rect, expand,
FALSE, /* x-fill */
FALSE, /* y-fill */
CLUTTER_BOX_ALIGNMENT_CENTER,
CLUTTER_BOX_ALIGNMENT_CENTER);
clutter_actor_set_reactive (rect, TRUE);
g_signal_connect_after (rect, "paint",
G_CALLBACK (on_paint),
GUINT_TO_POINTER (index_));
g_signal_connect (rect, "enter-event", G_CALLBACK (enter_event), NULL);
g_signal_connect (rect, "leave-event", G_CALLBACK (leave_event), NULL);
g_signal_connect (rect, "button-release-event",
G_CALLBACK (button_release_event),
layout);
expand = !expand;
}
static gboolean
key_release_cb (ClutterActor *actor,
ClutterEvent *event,
ClutterBoxLayout *layout)
{
gboolean toggle;
guint spacing;
switch (clutter_event_get_key_symbol (event))
{
case CLUTTER_a:
toggle = clutter_box_layout_get_use_animations (layout);
clutter_box_layout_set_use_animations (layout, !toggle);
break;
case CLUTTER_v:
toggle = clutter_box_layout_get_vertical (layout);
clutter_box_layout_set_vertical (layout, !toggle);
break;
case CLUTTER_h:
toggle = clutter_box_layout_get_homogeneous (layout);
clutter_box_layout_set_homogeneous (layout, !toggle);
break;
case CLUTTER_p:
toggle = clutter_box_layout_get_pack_start (layout);
clutter_box_layout_set_pack_start (layout, !toggle);
break;
case CLUTTER_s:
spacing = clutter_box_layout_get_spacing (layout);
if (spacing > 12)
spacing = 0;
else
spacing++;
clutter_box_layout_set_spacing (layout, spacing);
break;
case CLUTTER_plus:
add_actor (layout, last_index++);
break;
case CLUTTER_q:
clutter_main_quit ();
break;
default:
return FALSE;
}
return TRUE;
}
static void
stage_size_changed_cb (ClutterActor *stage,
const ClutterActorBox *allocation,
ClutterAllocationFlags flags,
gpointer dummy G_GNUC_UNUSED)
{
gfloat width, height;
clutter_actor_box_get_size (allocation, &width, &height);
clutter_actor_set_size (box, width - 100, height - 100);
clutter_actor_set_y (label,
height - clutter_actor_get_height (label) - 8);
}
G_MODULE_EXPORT int
test_box_layout_main (int argc, char *argv[])
{
ClutterActor *stage;
ClutterLayoutManager *layout;
gint i;
clutter_init (&argc, &argv);
stage = clutter_stage_get_default ();
clutter_stage_set_title (CLUTTER_STAGE (stage), "Box Layout");
clutter_stage_set_user_resizable (CLUTTER_STAGE (stage), TRUE);
clutter_actor_set_size (stage, 640, 480);
layout = clutter_box_layout_new ();
box = clutter_box_new (layout);
clutter_container_add_actor (CLUTTER_CONTAINER (stage), box);
for (i = 0; i < 5; i++)
add_actor (CLUTTER_BOX_LAYOUT (layout), last_index++);
g_signal_connect (stage, "key-release-event",
G_CALLBACK (key_release_cb),
layout);
g_signal_connect (stage, "allocation-changed",
G_CALLBACK (stage_size_changed_cb),
NULL);
label = clutter_text_new_with_text ("Sans 12px", INSTRUCTIONS);
clutter_container_add_actor (CLUTTER_CONTAINER (stage), label);
clutter_actor_set_y (label,
480 - clutter_actor_get_height (label) - 8);
clutter_actor_show (stage);
clutter_main ();
return EXIT_SUCCESS;
}