From 7c79fd8f543f46d54b5823620faa604b436f967b Mon Sep 17 00:00:00 2001 From: Kevin Worth Date: Fri, 3 Jul 2009 12:44:12 -0400 Subject: [PATCH] Allow selection of tile by including any edge of tile and highlight selected files. A group of tiles can be selected by overlapping the selection box and any edge(not including a corner) of each tile. Highlighting on the fly is currently buggy. Selected tiles remain highlighted even once they are no longer within the selection box and even after an empty space or other tile is clicked. --- kub.c | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/kub.c b/kub.c index a4d5dce..a029c13 100644 --- a/kub.c +++ b/kub.c @@ -536,7 +536,7 @@ static gboolean on_button_press_event (GtkWidget *widget, GdkEventButton *event, event->y >= tile_y && event->y <= (tile_y + TILE_HEIGHT) ) { game->select_mode = 0; - + curr_tile = &game->deck.tiles[game->current_tile]; game->deck.tiles[game->current_tile].selected = 0; gtk_widget_queue_draw_area (widget, curr_tile->x - 1, curr_tile->y - 1, TILE_WIDTH + 1, TILE_HEIGHT + 2); @@ -610,7 +610,19 @@ static gboolean on_button_release_event (GtkWidget *widget, GdkEventButton *even tile_y2 >= y_min && tile_y2 <= y_max) || /*or top-right corner of tile selected*/ (tile_x2 >= x_min && tile_x2 <= x_max && - tile_y >= y_min && tile_y <= y_max) ) + tile_y >= y_min && tile_y <= y_max) || + /*or left edge*/ + (y_min >= tile_y && y_min <= tile_y2 && + x_min <= tile_x && x_max >= tile_x) || + /*or top edge*/ + (x_min >= tile_x && x_min <= tile_x2 && + y_min <= tile_y && y_max >= tile_y) || + /*or right edge*/ + (y_min >= tile_y && y_min <= tile_y2 && + x_min >= tile_x && x_min <= tile_x2) || + /*or bottom edge*/ + (x_min >= tile_x && x_min <= tile_x2 && + y_min >= tile_y && y_min <= tile_y) ) { group.tiles[group.num_tiles] = game->deck.tiles[i]; group.num_tiles++; @@ -635,12 +647,27 @@ static gboolean on_button_motion_event (GtkWidget *widget, GdkEventMotion *event box = &game->selection_box; box->visible = 1; - gtk_widget_queue_draw_area ( widget, MIN(box->x1, box->x2), MIN(box->y1, box->y2), abs(box->x2 - box->x1), abs(box->y2 - box->y1) ); + gtk_widget_queue_draw_area ( widget, MIN(box->x1, box->x2), MIN(box->y1,box->y2), abs(box->x2 - box->x1), abs(box->y2 - box->y1) ); box->x2 = event->x; box->y2 = event->y; gtk_widget_queue_draw_area ( widget, MIN(box->x1, box->x2), MIN(box->y1, box->y2), abs(box->x2 - box->x1), abs(box->y2 - box->y1) ); + + int i; + tile_t *curr_tile; + for (i = 0; i < game->deck.num_tiles; i++) + { + if ((event->x >= game->deck.tiles[i].x && + event->x <= game->deck.tiles[i].x + TILE_WIDTH) && + (event->y >= game->deck.tiles[i].y && + event->y <= game->deck.tiles[i].y + TILE_HEIGHT)) + { + curr_tile = &game->deck.tiles[i]; + curr_tile->selected = 1; + gtk_widget_queue_draw_area (widget, curr_tile->x - 1, curr_tile->y - 1, TILE_WIDTH + 1, TILE_HEIGHT + 2); + } + } } else { -- 2.43.0