forked from AuroraMiddleware/gtk
puzzle: Add mouse support
Make it so that clicking on a puzzle piece moves enough pieces to move the empty space there, if it is possible.
This commit is contained in:
parent
ebf042d305
commit
1ee23d0d49
@ -219,6 +219,68 @@ puzzle_key_pressed (GtkEventControllerKey *controller,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
puzzle_button_pressed (GtkGestureMultiPress *gesture,
|
||||||
|
int n_press,
|
||||||
|
double x,
|
||||||
|
double y,
|
||||||
|
GtkWidget *grid)
|
||||||
|
{
|
||||||
|
GtkWidget *child;
|
||||||
|
int l, t, i;
|
||||||
|
int pos;
|
||||||
|
|
||||||
|
child = gtk_widget_pick (grid, x, y);
|
||||||
|
|
||||||
|
if (!child)
|
||||||
|
{
|
||||||
|
gtk_widget_error_bell (grid);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
gtk_container_child_get (GTK_CONTAINER (grid), child,
|
||||||
|
"left-attach", &l,
|
||||||
|
"top-attach", &t,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if (l == pos_x && t == pos_y)
|
||||||
|
{
|
||||||
|
gtk_widget_error_bell (grid);
|
||||||
|
}
|
||||||
|
else if (l == pos_x)
|
||||||
|
{
|
||||||
|
pos = pos_y;
|
||||||
|
for (i = t; i < pos; i++)
|
||||||
|
{
|
||||||
|
if (!move_puzzle (grid, 0, -1))
|
||||||
|
gtk_widget_error_bell (grid);
|
||||||
|
}
|
||||||
|
for (i = pos; i < t; i++)
|
||||||
|
{
|
||||||
|
if (!move_puzzle (grid, 0, 1))
|
||||||
|
gtk_widget_error_bell (grid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (t == pos_y)
|
||||||
|
{
|
||||||
|
pos = pos_x;
|
||||||
|
for (i = l; i < pos; i++)
|
||||||
|
{
|
||||||
|
if (!move_puzzle (grid, -1, 0))
|
||||||
|
gtk_widget_error_bell (grid);
|
||||||
|
}
|
||||||
|
for (i = pos; i < l; i++)
|
||||||
|
{
|
||||||
|
if (!move_puzzle (grid, 1, 0))
|
||||||
|
gtk_widget_error_bell (grid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gtk_widget_error_bell (grid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
start_puzzle (GdkPaintable *puzzle)
|
start_puzzle (GdkPaintable *puzzle)
|
||||||
{
|
{
|
||||||
@ -244,6 +306,12 @@ start_puzzle (GdkPaintable *puzzle)
|
|||||||
grid);
|
grid);
|
||||||
gtk_widget_add_controller (GTK_WIDGET (grid), controller);
|
gtk_widget_add_controller (GTK_WIDGET (grid), controller);
|
||||||
|
|
||||||
|
controller = gtk_gesture_multi_press_new ();
|
||||||
|
g_signal_connect (controller, "pressed",
|
||||||
|
G_CALLBACK (puzzle_button_pressed),
|
||||||
|
grid);
|
||||||
|
gtk_widget_add_controller (GTK_WIDGET (grid), controller);
|
||||||
|
|
||||||
/* Make sure the cells have equal size */
|
/* Make sure the cells have equal size */
|
||||||
gtk_grid_set_row_homogeneous (GTK_GRID (grid), TRUE);
|
gtk_grid_set_row_homogeneous (GTK_GRID (grid), TRUE);
|
||||||
gtk_grid_set_column_homogeneous (GTK_GRID (grid), TRUE);
|
gtk_grid_set_column_homogeneous (GTK_GRID (grid), TRUE);
|
||||||
|
Loading…
Reference in New Issue
Block a user