From: Jonas Kölker Date: Mon, 21 Sep 2015 15:39:47 +0000 (+0200) Subject: Range: add pencil marks to squares by Shift-cursor keys. X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=sgt-puzzles.git;a=commitdiff_plain;h=d5f7c4f871200f9808e284408e28defaa8afbcd3 Range: add pencil marks to squares by Shift-cursor keys. --- diff --git a/puzzles.but b/puzzles.but index ef96ad1..e22c438 100644 --- a/puzzles.but +++ b/puzzles.but @@ -2917,7 +2917,9 @@ dotted or empty) in opposite directions. You can also use the cursor keys to move around the grid squares. Pressing Return does the same as clicking with the left button, while -pressing Space does the same as a right button click. +pressing Space does the same as a right button click. Moving with the +cursor keys while holding Shift will place dots in all squares that +are moved through. (All the actions described in \k{common-actions} are also available.) diff --git a/range.c b/range.c index 4347f76..f2ea1b7 100644 --- a/range.c +++ b/range.c @@ -1273,6 +1273,8 @@ static char *interpret_move(const game_state *state, game_ui *ui, enum {none, forwards, backwards, hint}; int const w = state->params.w, h = state->params.h; int r = ui->r, c = ui->c, action = none, cell; + int shift = button & MOD_SHFT; + button &= ~shift; if (IS_CURSOR_SELECT(button) && !ui->cursor_show) return NULL; @@ -1330,7 +1332,36 @@ static char *interpret_move(const game_state *state, game_ui *ui, int i; for (i = 0; i < 4 && cursors[i] != button; ++i); assert (i < 4); - if (!out_of_bounds(ui->r + dr[i], ui->c + dc[i], w, h)) { + if (shift) { + int pre_r = r, pre_c = c, do_pre, do_post; + cell = state->grid[idx(r, c, state->params.w)]; + do_pre = (cell == EMPTY); + + if (out_of_bounds(ui->r + dr[i], ui->c + dc[i], w, h)) { + if (do_pre) + return nfmtstr(40, "W,%d,%d", pre_r, pre_c); + else + return NULL; + } + + ui->r += dr[i]; + ui->c += dc[i]; + + cell = state->grid[idx(ui->r, ui->c, state->params.w)]; + do_post = (cell == EMPTY); + + /* (do_pre ? "..." : "") concat (do_post ? "..." : "") */ + if (do_pre && do_post) + return nfmtstr(80, "W,%d,%dW,%d,%d", + pre_r, pre_c, ui->r, ui->c); + else if (do_pre) + return nfmtstr(40, "W,%d,%d", pre_r, pre_c); + else if (do_post) + return nfmtstr(40, "W,%d,%d", ui->r, ui->c); + else + return ""; + + } else if (!out_of_bounds(ui->r + dr[i], ui->c + dc[i], w, h)) { ui->r += dr[i]; ui->c += dc[i]; }