}
}
-GtkWidget*
+grr_board_view_t *
grr_board_view_new (rr_board_t *board)
{
grr_board_view_t *view;
grr_board_view_update (view);
- return GTK_WIDGET (view);
+ return view;
}
void
view->client = client;
}
+void
+grr_board_view_set_active_robot (grr_board_view_t *view, rr_robot_t robot)
+{
+ g_return_if_fail (view != NULL);
+
+ view->active_robot = robot;
+}
+
+void
+grr_board_view_move_active (grr_board_view_t *view, rr_direction_t dir)
+{
+ if (view->client) {
+ rr_client_move (view->client, view->active_robot, dir);
+ } else {
+ rr_board_move (view->board, view->active_robot, dir);
+ gtk_widget_queue_draw (GTK_WIDGET (view));
+ }
+}
+
+void
+grr_board_view_undo (grr_board_view_t *view)
+{
+ if (view->client) {
+ rr_client_undo (view->client);
+ } else {
+ rr_board_undo (view->board);
+ gtk_widget_queue_draw (GTK_WIDGET (view));
+ }
+}
+
static void
grr_board_view_destroy (GtkObject *object)
{
}
/* Draw goal target in center of board */
- XrSave (xrs);
- {
+ /* XXX: Not a perfect heuristic. Should check for the vacant box too. */
+ if (view->board_width == 16 && view->board_height == 16) {
+ XrSave (xrs);
XrTranslate (xrs,
(view->board_width / 2 - 1) * view->cell_width,
(view->board_height / 2 - 1) * view->cell_height);
grr_board_view_draw_cell (view, xrs, goal_target, goal_target,
view->cell_width * 2, view->cell_height * 2);
+ XrRestore (xrs);
}
- XrRestore (xrs);
/* Draw walls */
for (j=0; j < view->board_height; j++) {
*grid_y = (pointer_y - view->board_pad_y) / view->cell_height;
}
-
static gint
grr_board_view_button_press (GtkWidget *widget,
- GdkEventButton *event)
+ GdkEventButton *event)
{
grr_board_view_t *view;
rr_cell_t cell;
gtk_grab_add (widget);
view->button = event->button;
- view->drag_robot = RR_CELL_GET_ROBOT (cell);
+ grr_board_view_set_active_robot (view, RR_CELL_GET_ROBOT (cell));
grr_board_view_update_mouse (view, event->x, event->y);
}
grr_board_view_pointer_coords_to_grid (view, event->x, event->y, &x, &y);
- rr_board_find_robot (view->board, view->drag_robot, &robot_x, &robot_y);
+ rr_board_find_robot (view->board, view->active_robot, &robot_x, &robot_y);
dx = x - robot_x;
dy = y - robot_y;
if (dx == 0 && dy == 0)
dir = RR_DIRECTION_SOUTH;
else
dir = RR_DIRECTION_NORTH;
-
- if (view->client)
- rr_client_move (view->client, view->drag_robot, dir);
- return FALSE;
+ grr_board_view_move_active (view, dir);
+
+ return FALSE;
}
static gint
g_return_if_fail (view != NULL);
g_return_if_fail (GRR_IS_BOARD_VIEW (view));
- /* XXX: Should draw a robot here */
+ /* XXX: Perhaps should draw a robot here */
}
static void