}
}
-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)
{
grr_board_view_draw_walls (view, xrs, RR_CELL_GET_WALLS (cell));
XrRestore (xrs);
- xpad = width / 5;
- ypad = width / 5;
+ xpad = width / 10;
+ ypad = width / 10;
XrSave (xrs);
XrTranslate (xrs, xpad, ypad);
XrScale (xrs,
width / GRR_SVG_ASSUMED_WIDTH,
height / GRR_SVG_ASSUMED_HEIGHT);
- XrRectangle (xrs, 0, 0,
- GRR_SVG_ASSUMED_WIDTH,
- GRR_SVG_ASSUMED_HEIGHT);
+ XrRectangle (xrs, 1, 1,
+ GRR_SVG_ASSUMED_WIDTH - 1,
+ GRR_SVG_ASSUMED_HEIGHT - 1);
XrSetRGBColor (xrs, 1, 1, 1);
XrSetAlpha (xrs, 0.75);
XrFill (xrs);
}
}
- /* Draw grid. */
- XrSave (xrs);
- {
- XrSetRGBColor (xrs, .75, .75, 1);
- XrSetLineWidth (xrs, 1);
- for (j=0; j < view->board_height; j++) {
- XrMoveTo (xrs, 0, j * view->cell_height + 0.5);
- XrRelLineTo (xrs, view->board_width * view->cell_width, 0);
- }
- for (i=0; i < view->board_width; i++) {
- XrMoveTo (xrs, i * view->cell_width + 0.5, 0);
- XrRelLineTo (xrs, 0, view->board_height * view->cell_height);
- }
- XrStroke (xrs);
- }
- XrRestore (xrs);
-
/* 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