X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=src%2Fgrr_board_view.c;h=b48c2913e8a9cef451cc4311719d4a433b1789d8;hb=cac5a27c8be36ded1bba3a790cf8723f1affc2a4;hp=863ac2005c3f98f2346762483f0e2bd5b93af97c;hpb=db9af66aed15acf27e1902aeca9b9a682a388abb;p=grrobot diff --git a/src/grr_board_view.c b/src/grr_board_view.c index 863ac20..b48c291 100644 --- a/src/grr_board_view.c +++ b/src/grr_board_view.c @@ -150,7 +150,7 @@ grr_board_view_init (grr_board_view_t *view) } } -GtkWidget* +grr_board_view_t * grr_board_view_new (rr_board_t *board) { grr_board_view_t *view; @@ -161,7 +161,7 @@ grr_board_view_new (rr_board_t *board) grr_board_view_update (view); - return GTK_WIDGET (view); + return view; } void @@ -172,6 +172,36 @@ grr_board_view_set_client (grr_board_view_t *view, rr_client_t *client) 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) { @@ -458,15 +488,16 @@ grr_board_view_expose (GtkWidget *widget, } /* 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++) { @@ -495,10 +526,9 @@ grr_board_view_pointer_coords_to_grid (grr_board_view_t *view, *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; @@ -520,7 +550,7 @@ grr_board_view_button_press (GtkWidget *widget, 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); } @@ -551,7 +581,7 @@ grr_board_view_button_release (GtkWidget *widget, 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) @@ -567,11 +597,10 @@ grr_board_view_button_release (GtkWidget *widget, 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 @@ -623,7 +652,7 @@ grr_board_view_update_mouse (grr_board_view_t *view, gint x, gint y) 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