ref: 011d42df0da442363559ea8a6cfa7be5fcd80330
parent: a9d0f9ef35f68811817b055a74d926fcd23ab646
author: Simon Tatham <anakin@pobox.com>
date: Fri Jun 10 07:24:44 EDT 2005
Patch from Chris Emerson to add a status bar to Rectangles. Apart from saying `Auto-solved' or `Completed', the main function of the status bar is to track the current size of a rectangle you're dragging out, which makes life much easier when trying to count up large rectangles in 19x19 mode. [originally from svn r5937]
--- a/rect.c
+++ b/rect.c
@@ -2035,6 +2035,14 @@
* treated as a small drag rather than a click.
*/
int dragged;
+ /*
+ * These are the co-ordinates of the top-left and bottom-right squares
+ * in the drag box, respectively, or -1 otherwise.
+ */
+ int x1;
+ int y1;
+ int x2;
+ int y2;
};
static game_ui *new_ui(game_state *state)
@@ -2045,6 +2053,10 @@
ui->drag_end_x = -1;
ui->drag_end_y = -1;
ui->dragged = FALSE;
+ ui->x1 = -1;
+ ui->y1 = -1;
+ ui->x2 = -1;
+ ui->y2 = -1;
return ui;
}
@@ -2140,21 +2152,12 @@
static void ui_draw_rect(game_state *state, game_ui *ui,
unsigned char *hedge, unsigned char *vedge, int c)
{
- int x1, x2, y1, y2, x, y, t;
+ int x, y;
+ int x1 = ui->x1;
+ int y1 = ui->y1;
+ int x2 = ui->x2;
+ int y2 = ui->y2;
- x1 = ui->drag_start_x;
- x2 = ui->drag_end_x;
- if (x2 < x1) { t = x1; x1 = x2; x2 = t; }
-
- y1 = ui->drag_start_y;
- y2 = ui->drag_end_y;
- if (y2 < y1) { t = y1; y1 = y2; y2 = t; }
-
- x1 = x1 / 2; /* rounds down */
- x2 = (x2+1) / 2; /* rounds up */
- y1 = y1 / 2; /* rounds down */
- y2 = (y2+1) / 2; /* rounds up */
-
/*
* Draw horizontal edges of rectangles.
*/
@@ -2223,10 +2226,26 @@
}
if (xc != ui->drag_end_x || yc != ui->drag_end_y) {
+ int t;
+
ui->drag_end_x = xc;
ui->drag_end_y = yc;
ui->dragged = TRUE;
active = TRUE;
+
+ ui->x1 = ui->drag_start_x;
+ ui->x2 = ui->drag_end_x;
+ if (ui->x2 < ui->x1) { t = ui->x1; ui->x1 = ui->x2; ui->x2 = t; }
+
+ ui->y1 = ui->drag_start_y;
+ ui->y2 = ui->drag_end_y;
+ if (ui->y2 < ui->y1) { t = ui->y1; ui->y1 = ui->y2; ui->y2 = t; }
+
+ ui->x1 = ui->x1 / 2; /* rounds down */
+ ui->x2 = (ui->x2+1) / 2; /* rounds up */
+ ui->y1 = ui->y1 / 2; /* rounds down */
+ ui->y2 = (ui->y2+1) / 2; /* rounds up */
+
}
ret = NULL;
@@ -2278,6 +2297,10 @@
ui->drag_start_y = -1;
ui->drag_end_x = -1;
ui->drag_end_y = -1;
+ ui->x1 = -1;
+ ui->y1 = -1;
+ ui->x2 = -1;
+ ui->y2 = -1;
ui->dragged = FALSE;
active = TRUE;
}
@@ -2516,10 +2539,30 @@
}
}
+ {
+ char buf[256];
+
+ if (ui->x1 >= 0 && ui->y1 >= 0 &&
+ ui->x2 >= 0 && ui->y2 >= 0) {
+ sprintf(buf, "%dx%d ",
+ ui->x2-ui->x1,
+ ui->y2-ui->y1);
+ } else {
+ buf[0] = '\0';
+ }
+
+ if (state->cheated)
+ strcat(buf, "Auto-solved.");
+ else if (state->completed)
+ strcat(buf, "COMPLETED!");
+
+ status_bar(fe, buf);
+ }
+
if (hedge != state->hedge) {
sfree(hedge);
sfree(vedge);
- }
+ }
sfree(corners);
sfree(correct);
@@ -2542,7 +2585,7 @@
static int game_wants_statusbar(void)
{
- return FALSE;
+ return TRUE;
}
static int game_timing_state(game_state *state)