mx/tests/test-table.c

281 lines
8.8 KiB
C

/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* 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 <stdlib.h>
#include <stdio.h>
#include <glib.h>
#include <clutter/clutter.h>
#include <mx/mx.h>
static void
toggle_expand (MxButton *expand_button, ClutterActor *button)
{
gboolean x_expand;
gchar *label;
ClutterContainer *table =
CLUTTER_CONTAINER (clutter_actor_get_parent (button));
clutter_container_child_get (table, button,
"x-expand", &x_expand,
NULL);
x_expand = !x_expand;
clutter_container_child_set (table, button,
"x-expand", x_expand,
NULL);
label = g_strdup_printf ("button6 x-expand = %d", x_expand);
mx_button_set_label (expand_button, label);
g_free (label);
}
static void
switch_align (ClutterActor *button, ClutterContainer *table)
{
static gint pattern = 1;
MxAlign x_align, y_align;
const gchar *label;
switch (pattern)
{
default:
case 1:
x_align = y_align = MX_ALIGN_MIDDLE;
label = "Align (Middle, Middle)";
break;
case 2:
x_align = y_align = MX_ALIGN_START;
label = "Align (Start, Start)";
break;
case 3:
x_align = MX_ALIGN_MIDDLE;
y_align = MX_ALIGN_START;
label = "Align (Middle, Start)";
break;
case 4:
x_align = MX_ALIGN_END;
y_align = MX_ALIGN_START;
label = "Align (End, Start)";
break;
case 5:
x_align = MX_ALIGN_END;
y_align = MX_ALIGN_MIDDLE;
label = "Align (End, Middle)";
break;
case 6:
x_align = MX_ALIGN_END;
y_align = MX_ALIGN_END;
label = "Align (End, End)";
break;
case 7:
x_align = MX_ALIGN_MIDDLE;
y_align = MX_ALIGN_END;
label = "Align (Middle, End)";
break;
case 8:
x_align = MX_ALIGN_START;
y_align = MX_ALIGN_END;
label = "Align (Start, End)";
break;
case 9:
x_align = MX_ALIGN_START;
y_align = MX_ALIGN_MIDDLE;
label = "Align (Start, Middle)";
break;
}
if (++pattern > 9)
pattern = 1;
clutter_container_child_set (table, button,
"x-align", x_align,
"y-align", y_align,
NULL);
mx_button_set_label (MX_BUTTON (button), label);
}
static void
toggle_visible (ClutterActor *button)
{
clutter_actor_hide (button);
}
gboolean drag = FALSE;
static gboolean
button_press (ClutterActor *actor, ClutterButtonEvent *event,
ClutterActor *table)
{
if (event->button == 1)
{
drag = TRUE;
return TRUE;
}
return FALSE;
}
static gboolean
button_release (ClutterActor *actor, ClutterButtonEvent *event,
ClutterActor *table)
{
if (event->button == 1)
{
drag = FALSE;
return TRUE;
}
if (event->button == 3)
clutter_actor_set_size (table, -1, -1);
return FALSE;
}
static void
motion_event (ClutterActor *actor, ClutterMotionEvent *event,
ClutterActor *table)
{
if (drag)
clutter_actor_set_size (table, event->x - 5, event->y - 5);
}
int
main (int argc, char *argv[])
{
MxApplication *application;
MxWindow *window;
ClutterActor *stage, *button2, *table;
ClutterActor *button1, *button3, *button4, *button5, *button6, *button7,
*button8, *button9, *button10;
application = mx_application_new (&argc, &argv, "Test Table", 0);
window = mx_application_create_window (application);
stage = (ClutterActor *) mx_window_get_clutter_stage (window);
table = mx_table_new ();
mx_table_set_column_spacing (MX_TABLE (table), 10);
mx_table_set_row_spacing (MX_TABLE (table), 10);
button1 = mx_button_new_with_label ("button1");
button2 = clutter_texture_new_from_file ("redhand.png", NULL);
button3 = mx_button_new_with_label ("button3");
button4 = mx_button_new_with_label ("button6 x-expand = 1");
button5 = mx_button_new_with_label ("button5");
button6 = mx_button_new_with_label ("button6");
button7 = mx_button_new ();
button8 = mx_button_new_with_label ("button8");
button9 = mx_button_new_with_label ("button9");
button10 = mx_button_new_with_label ("button10");
mx_table_add_actor (MX_TABLE (table), button1, 0, 0);
mx_table_add_actor (MX_TABLE (table), button2, 0, 1);
mx_table_add_actor (MX_TABLE (table), button3, 1, 1);
mx_table_add_actor (MX_TABLE (table), button4, 2, 0);
mx_table_add_actor (MX_TABLE (table), button5, 3, 0);
mx_table_add_actor (MX_TABLE (table), button6, 3, 1);
mx_table_add_actor (MX_TABLE (table), button7, 4, 1);
mx_table_add_actor (MX_TABLE (table), button8, 4, 0);
mx_table_add_actor (MX_TABLE (table), button9, 5, 0);
mx_table_add_actor (MX_TABLE (table), button10, -1, 0);
mx_table_child_set_row_span (MX_TABLE (table), button1, 2);
mx_table_child_set_row_span (MX_TABLE (table), button7, 2);
mx_table_child_set_column_span (MX_TABLE (table), button4, 2);
clutter_actor_set_size (button1, 100, 100);
clutter_actor_set_width (button4, 250);
clutter_container_child_set (CLUTTER_CONTAINER (table),
button1,
"x-expand", TRUE, "y-expand", FALSE,
NULL);
clutter_container_child_set (CLUTTER_CONTAINER (table),
button2,
"x-expand", FALSE, "y-expand", TRUE,
"x-fill", FALSE, "y-fill", FALSE,
NULL);
clutter_container_child_set (CLUTTER_CONTAINER (table),
button3,
"x-expand", FALSE, "y-expand", FALSE,
NULL);
clutter_container_child_set (CLUTTER_CONTAINER (table),
button4,
"x-expand", FALSE, "y-expand", FALSE,
NULL);
clutter_container_child_set (CLUTTER_CONTAINER (table),
button5,
"x-expand", FALSE, "y-expand", FALSE,
NULL);
clutter_container_child_set (CLUTTER_CONTAINER (table),
button6,
"x-expand", TRUE, "y-expand", FALSE,
NULL);
clutter_container_child_set (CLUTTER_CONTAINER (table),
button7,
"x-expand", FALSE, "y-expand", FALSE,
"x-fill", FALSE, "y-fill", FALSE,
NULL);
switch_align (button7, CLUTTER_CONTAINER (table));
clutter_container_child_set (CLUTTER_CONTAINER (table),
button8,
"x-expand", FALSE, "y-expand", TRUE,
NULL);
clutter_container_child_set (CLUTTER_CONTAINER (table),
button9,
"x-expand", FALSE, "y-expand", FALSE,
NULL);
clutter_container_child_set (CLUTTER_CONTAINER (table),
button10,
"x-expand", FALSE, "y-expand", FALSE,
NULL);
g_object_set (G_OBJECT (button2), "keep-aspect-ratio", TRUE, NULL);
mx_window_set_child (window, table);
g_signal_connect (button4, "clicked", G_CALLBACK (toggle_expand), button6);
g_signal_connect (button7, "clicked", G_CALLBACK (switch_align), table);
g_signal_connect (button10, "clicked", G_CALLBACK (toggle_visible), NULL);
g_signal_connect (stage, "button-press-event", G_CALLBACK (button_press),
table);
g_signal_connect (stage, "motion-event", G_CALLBACK (motion_event),
table);
g_signal_connect (stage, "button-release-event", G_CALLBACK (button_release),
table);
clutter_actor_show (stage);
g_debug ("table row count = %d",
mx_table_get_row_count (MX_TABLE (table)));
g_debug ("table column count = %d",
mx_table_get_column_count (MX_TABLE (table)));
mx_application_run (application);
return EXIT_SUCCESS;
}