Implement a fill-with menu item
This new option fills the entire marked region with copies of the current cell. Implements #35.
This commit is contained in:
parent
8b95dec96d
commit
39c12c08e0
@ -150,6 +150,7 @@ void freecellcontents(Cell *faded)
|
|||||||
void copycell(Cell *to, const Cell *fromcell)
|
void copycell(Cell *to, const Cell *fromcell)
|
||||||
{
|
{
|
||||||
assert(to != NULLCELL);
|
assert(to != NULLCELL);
|
||||||
|
if (to == fromcell) return;
|
||||||
|
|
||||||
freecellcontents(to);
|
freecellcontents(to);
|
||||||
if (fromcell != NULLCELL) {
|
if (fromcell != NULLCELL) {
|
||||||
|
@ -1201,6 +1201,19 @@ static int do_fill(Sheet *sheet)
|
|||||||
}
|
}
|
||||||
/*}}}*/
|
/*}}}*/
|
||||||
|
|
||||||
|
/* fill the entire marked region using the current cell */
|
||||||
|
void fillwith(Sheet *she)
|
||||||
|
{
|
||||||
|
do_mark(she, GET_MARK_ALL);
|
||||||
|
Cell *src = curcell(she);
|
||||||
|
Location dest;
|
||||||
|
bool scan_labels = (src != NULLCELL && getlabel(src) != (const char*)0);
|
||||||
|
/* the following is safe since we have handled copying a cell to itself */
|
||||||
|
for (ALL_LOCS_IN_REGION(she, dest)) copycelltosheet(src, she, dest);
|
||||||
|
if (scan_labels) cachelabels(she);
|
||||||
|
forceupdate(she);
|
||||||
|
}
|
||||||
|
|
||||||
/* do_sort -- sort block */ /*{{{*/
|
/* do_sort -- sort block */ /*{{{*/
|
||||||
static int do_sort(Sheet *sheet)
|
static int do_sort(Sheet *sheet)
|
||||||
{
|
{
|
||||||
@ -1515,6 +1528,7 @@ int do_sheetcmd(Sheet *cursheet, Key c, int moveonly)
|
|||||||
case BLOCK_MOVE: do_move(cursheet,0,0); redraw_sheet(cursheet); break;
|
case BLOCK_MOVE: do_move(cursheet,0,0); redraw_sheet(cursheet); break;
|
||||||
case BLOCK_COPY: do_move(cursheet,1,0); redraw_sheet(cursheet); break;
|
case BLOCK_COPY: do_move(cursheet,1,0); redraw_sheet(cursheet); break;
|
||||||
case BLOCK_FILL: do_fill(cursheet); redraw_sheet(cursheet); break;
|
case BLOCK_FILL: do_fill(cursheet); redraw_sheet(cursheet); break;
|
||||||
|
case FILL_BLOCK: fillwith(cursheet); redraw_sheet(cursheet); break;
|
||||||
case BLOCK_SORT: do_sort(cursheet); redraw_sheet(cursheet); break;
|
case BLOCK_SORT: do_sort(cursheet); redraw_sheet(cursheet); break;
|
||||||
case BLOCK_MIRROR: do_mirror(cursheet); redraw_sheet(cursheet); break;
|
case BLOCK_MIRROR: do_mirror(cursheet); redraw_sheet(cursheet); break;
|
||||||
case ADJUST_LEFT:
|
case ADJUST_LEFT:
|
||||||
|
@ -80,7 +80,8 @@ typedef enum {
|
|||||||
K_ABOUT = -54,
|
K_ABOUT = -54,
|
||||||
K_HELP = -55,
|
K_HELP = -55,
|
||||||
K_DUMPCELL = -56,
|
K_DUMPCELL = -56,
|
||||||
ADJUST_UNDERLINE = -57
|
ADJUST_UNDERLINE = -57,
|
||||||
|
FILL_BLOCK = -58
|
||||||
} Key;
|
} Key;
|
||||||
|
|
||||||
extern int do_sheetcmd(Sheet *cursheet, Key c, int moveonly);
|
extern int do_sheetcmd(Sheet *cursheet, Key c, int moveonly);
|
||||||
@ -89,7 +90,8 @@ extern void moveto(Sheet *sheet, int x, int y, int z);
|
|||||||
extern void movetoloc(Sheet *sheet, const Location dest);
|
extern void movetoloc(Sheet *sheet, const Location dest);
|
||||||
extern void relmoveto(Sheet *sheet, int x, int y, int z);
|
extern void relmoveto(Sheet *sheet, int x, int y, int z);
|
||||||
extern void do_mark(Sheet *cursheet, MarkState ms);
|
extern void do_mark(Sheet *cursheet, MarkState ms);
|
||||||
|
void fillwith(Sheet *she);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -46,18 +46,20 @@ int max_eval;
|
|||||||
/*}}}*/
|
/*}}}*/
|
||||||
|
|
||||||
/* copycelltosheet -- copy a cell into a sheet*/ /*{{{*/
|
/* copycelltosheet -- copy a cell into a sheet*/ /*{{{*/
|
||||||
static void copycelltosheet(const Cell *fromcell,
|
void copycelltosheet(const Cell *fromcell, Sheet *sheet2, const Location to)
|
||||||
Sheet *sheet2, const Location to)
|
|
||||||
{
|
{
|
||||||
assert(sheet2 != (Sheet*)0);
|
assert(sheet2 != (Sheet*)0);
|
||||||
|
Cell *tocell = safe_cell_at(sheet2, to);
|
||||||
|
if (fromcell == tocell) return;
|
||||||
|
|
||||||
freecellofsheet(sheet2, to);
|
freecellofsheet(sheet2, to);
|
||||||
if (fromcell != NULLCELL)
|
if (fromcell != NULLCELL)
|
||||||
/* copy first cell to second */ /*{{{*/
|
/* copy first cell to second */ /*{{{*/
|
||||||
{
|
{
|
||||||
sheet2->changed = 1;
|
sheet2->changed = 1;
|
||||||
Cell *tocell = initcellofsheet(sheet2, to);
|
Cell *alsotocell = initcellofsheet(sheet2, to);
|
||||||
copycell(tocell, fromcell);
|
assert(tocell == NULLCELL || tocell == alsotocell);
|
||||||
|
copycell(alsotocell, fromcell);
|
||||||
}
|
}
|
||||||
/*}}}*/
|
/*}}}*/
|
||||||
}
|
}
|
||||||
|
@ -73,6 +73,7 @@ extern int max_eval;
|
|||||||
void initialize_sheet(Sheet *sheet);
|
void initialize_sheet(Sheet *sheet);
|
||||||
void resize(Sheet *sheet, int x, int y, int z);
|
void resize(Sheet *sheet, int x, int y, int z);
|
||||||
Cell *initcellofsheet(Sheet *sheet, const Location at);
|
Cell *initcellofsheet(Sheet *sheet, const Location at);
|
||||||
|
void copycelltosheet(const Cell *fromcell, Sheet *sheet2, const Location to);
|
||||||
Cell *safe_cell_at(Sheet *sheet, const Location at);
|
Cell *safe_cell_at(Sheet *sheet, const Location at);
|
||||||
Cell *curcell(Sheet *sheet);
|
Cell *curcell(Sheet *sheet);
|
||||||
void cachelabels(Sheet *sheet);
|
void cachelabels(Sheet *sheet);
|
||||||
|
@ -428,6 +428,11 @@ table->redraw();} open
|
|||||||
user_data BLOCK_FILL
|
user_data BLOCK_FILL
|
||||||
xywh {0 0 36 21} shortcut 0x90066
|
xywh {0 0 36 21} shortcut 0x90066
|
||||||
}
|
}
|
||||||
|
MenuItem {} {
|
||||||
|
label {FillWith}
|
||||||
|
user_data FILL_BLOCK
|
||||||
|
xywh {0 0 36 30}
|
||||||
|
}
|
||||||
MenuItem {} {
|
MenuItem {} {
|
||||||
label {C&lear}
|
label {C&lear}
|
||||||
user_data BLOCK_CLEAR
|
user_data BLOCK_CLEAR
|
||||||
|
Loading…
Reference in New Issue
Block a user