From 936a590e44f49282717fa02b4fd74421997f8ba7 Mon Sep 17 00:00:00 2001 From: Kevin Worth Date: Tue, 30 Jun 2009 12:27:21 -0400 Subject: [PATCH] Highlight tile when clicked and/or dragged. New .svg file added(highlighted version of tile) A tile is highlighted when clicked and remains highlighted until another tile or empty space is clicked. --- kub.c | 32 +++++++++++++-- tiles/selectedtile.svg | 89 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+), 3 deletions(-) create mode 100644 tiles/selectedtile.svg diff --git a/kub.c b/kub.c index bae99e7..a4d5dce 100644 --- a/kub.c +++ b/kub.c @@ -53,6 +53,7 @@ typedef struct tile { int number; int x; int y; + int selected; } tile_t; #define DECK_MAX_TILES 104 @@ -95,6 +96,7 @@ typedef struct game { deck_t deck; selection_box_t selection_box; RsvgHandle *blanktile; + RsvgHandle *selectedtile; int current_tile; int select_mode; @@ -125,6 +127,7 @@ static void tile_init (tile_t *tile, color_t color, int number) tile->number = number; tile->x = 0; tile->y = 0; + tile->selected = 0; } static void tile_set_x_y (tile_t *tile, int x, int y) @@ -157,7 +160,11 @@ static void tile_draw(game_t *game, tile_t *tile, cairo_t *cr, GdkRegion *region cairo_save(cr); cairo_translate(cr, tile->x, tile->y); - rsvg_handle_render_cairo (game->blanktile, cr); + + if (tile->selected) + rsvg_handle_render_cairo (game->selectedtile, cr); + else + rsvg_handle_render_cairo (game->blanktile, cr); if (tile->color == BLACK) cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); @@ -477,6 +484,10 @@ static void game_init(game_t *game) deck_init(&game->deck); deck_shuffle(&game->deck); + game->selectedtile = rsvg_handle_new_from_file ("tiles/selectedtile.svg", &error); + if (error) + FATAL_ERROR (error->message); + game->blanktile = rsvg_handle_new_from_file ("tiles/blanktile.svg", &error); if (error) FATAL_ERROR (error->message); @@ -515,6 +526,7 @@ static gboolean on_key_press_event (GtkWidget *widget, GdkEventKey *event, game_ static gboolean on_button_press_event (GtkWidget *widget, GdkEventButton *event, game_t *game) { int i, tile_x, tile_y; + tile_t *curr_tile = &game->deck.tiles[game->current_tile]; for (i = 0; i < game->deck.num_tiles; i++) { @@ -524,13 +536,28 @@ 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); + game->current_tile = i; + curr_tile = &game->deck.tiles[game->current_tile]; + if (!curr_tile->selected) + curr_tile->selected = 1; + else + curr_tile->selected = 0; + gtk_widget_queue_draw_area (widget, curr_tile->x - 1, curr_tile->y - 1, TILE_WIDTH + 1, TILE_HEIGHT + 2); + game->diff_x = event->x - tile_x; game->diff_y = event->y - tile_y; } } if (game->select_mode) { + 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); + game->selection_box.visible = 1; /*These next two lines are likely to be replaced by...*/ game->click_x = event->x; @@ -593,8 +620,7 @@ static gboolean on_button_release_event (GtkWidget *widget, GdkEventButton *even printf("is set %d\n", tile_group_is_set(&group) ); for (i = 0; i < group.num_tiles; i++) tile_print(group.tiles[i]); - } - + } game->select_mode = 1; return TRUE; diff --git a/tiles/selectedtile.svg b/tiles/selectedtile.svg new file mode 100644 index 0000000..6b13914 --- /dev/null +++ b/tiles/selectedtile.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + -- 2.43.0