Improve dialogs
Now in fteapot you can select any one of the buttons in a modal dialog with the cursor keys and hit enter and it will be selected. Fixes #17. In addition, I clarified that the block attribute options will either set every cell to bold (say), or unset every cell, or you can cancel to not actually go through with the block operation. These changes required adding a custom FLTK dialog, tpt_choose.{h,cxx}. Along the way, I reflowed fteapot.fl to make it more readable for further coding. Finally, there is a small amount of additional prep for color support that (unfortunately) got mixed in with these changes.
This commit is contained in:
parent
341b12ba04
commit
2e0a3a480c
@ -40,7 +40,7 @@ endif ()
|
||||
find_package(FLTK)
|
||||
if (FLTK_FOUND)
|
||||
fltk_wrap_ui(fteapot fteapot.fl)
|
||||
add_executable(fteapot WIN32 ${fteapot_FLTK_UI_SRCS})
|
||||
add_executable(fteapot WIN32 tpt_choose.cxx ${fteapot_FLTK_UI_SRCS})
|
||||
set(fteapot_DEB_DEPENDS ", libstdc++6 (>= 4.1.1), libfltk1.3")
|
||||
if (ENABLE_HELP)
|
||||
set(fteapot_DEB_DEPENDS "${fteapot_DEB_DEPENDS}, libfltk-images1.3")
|
||||
|
@ -148,7 +148,7 @@ int doanyway(Sheet *sheet, const char *msg)
|
||||
int result;
|
||||
|
||||
if (sheet->changed) {
|
||||
result=line_ok(msg,0);
|
||||
result = line_ok(msg,0);
|
||||
if (result < 0) return 0;
|
||||
return result;
|
||||
}
|
||||
@ -344,7 +344,13 @@ static void do_attribute(Sheet *cursheet, Key action)
|
||||
case ADJUST_RIGHT: ++adj;
|
||||
case ADJUST_LEFT:
|
||||
{
|
||||
if (!onecell && line_ok(_("Change adjustment of block:"), 0) <= 0) break;
|
||||
const char *templ = _("Change adjustment of block to ");
|
||||
char *prompt = malloc(strlen(templ) + 64);
|
||||
const char *way = _("center?");
|
||||
if (action == ADJUST_RIGHT) way = _("right?");
|
||||
else if (action == ADJUST_LEFT) way = _("left?");
|
||||
strcpy(prompt, templ); strcat(prompt, way);
|
||||
if (!onecell && line_ok(prompt, 0) <= 0) break;
|
||||
for (ALL_LOCS_IN_REGION(cursheet,w))
|
||||
setadjust(cursheet, w, adj);
|
||||
break;
|
||||
@ -355,8 +361,9 @@ static void do_attribute(Sheet *cursheet, Key action)
|
||||
int n;
|
||||
|
||||
if (onecell) n = !getscientific(fcell);
|
||||
else n = line_ok(_("Make block notation scientific:"),
|
||||
getscientific(fcell));
|
||||
else n = line_binary(_("Make block notation:"),
|
||||
_("dD)ecimal"), _("sS)cientific"),
|
||||
!getscientific(fcell));
|
||||
if (n >= 0)
|
||||
for (ALL_LOCS_IN_REGION(cursheet,w))
|
||||
setscientific(cursheet, w, n);
|
||||
@ -381,9 +388,12 @@ static void do_attribute(Sheet *cursheet, Key action)
|
||||
case ADJUST_SHADOW:
|
||||
{
|
||||
int n;
|
||||
|
||||
if (onecell) n = !SHADOWED(cursheet, cursheet->mark1);
|
||||
else n = line_ok(_("Shadow block:"), SHADOWED(cursheet, cursheet->mark1));
|
||||
Location r;
|
||||
LOCATION_GETS(r, cursheet->mark1); ++r[X];
|
||||
if (onecell) n = !SHADOWED(cursheet, r);
|
||||
else n = line_binary(_("Set block to:"),
|
||||
_("uU)nshadowed"), _("sS)hadowed"),
|
||||
!SHADOWED(cursheet, r));
|
||||
if (cursheet->mark1[X] == 0 && n == 1) {
|
||||
line_msg(_("Shadow cell:"),_("You can not shadow cells in column 0"));
|
||||
break;
|
||||
@ -397,12 +407,14 @@ static void do_attribute(Sheet *cursheet, Key action)
|
||||
if (n==0)
|
||||
{
|
||||
LOCATION_GETS(r, w);
|
||||
for (++(r[X]); SHADOWED(cursheet, r); ++(r[X]))
|
||||
if (!SHADOWED(cursheet, r)) ++(r[X]);
|
||||
for (; SHADOWED(cursheet, r); ++(r[X]))
|
||||
shadow(cursheet, r, 0);
|
||||
}
|
||||
else if (w[X]>0) shadow(cursheet, w, 1);
|
||||
}
|
||||
}
|
||||
if (n>0) do_mark(cursheet, UNMARKED);
|
||||
break;
|
||||
}
|
||||
/*}}}*/
|
||||
@ -412,8 +424,9 @@ static void do_attribute(Sheet *cursheet, Key action)
|
||||
int n;
|
||||
|
||||
if (onecell) n = !transparent(fcell);
|
||||
else n = line_ok(_("Make block transparent:"),
|
||||
transparent(fcell));
|
||||
else n = line_binary(_("Set block to:"),
|
||||
_("pP)rotected"), _("tT)ransparent:"),
|
||||
!transparent(fcell));
|
||||
if (n >= 0)
|
||||
for (ALL_LOCS_IN_REGION(cursheet,w)) maketrans(cursheet, w, n);
|
||||
break;
|
||||
@ -425,7 +438,8 @@ static void do_attribute(Sheet *cursheet, Key action)
|
||||
int n;
|
||||
|
||||
if (onecell) n = !isbold(fcell);
|
||||
else n = line_ok(_("Make block bold:"), isbold(fcell));
|
||||
else n = line_binary(_("Set block weight to:"),
|
||||
_("rR)egular"), _("bB)old"), !isbold(fcell));
|
||||
if (n >= 0)
|
||||
for (ALL_LOCS_IN_REGION(cursheet,w)) bold(cursheet, w, n);
|
||||
break;
|
||||
@ -437,7 +451,8 @@ static void do_attribute(Sheet *cursheet, Key action)
|
||||
int n;
|
||||
|
||||
if (onecell) n = !underlined(fcell);
|
||||
else n = line_ok(_("Underline block:"), underlined(fcell));
|
||||
else n = line_binary(_("Set block to:"), _("nN)ot underline"),
|
||||
_("uU)nderline"), !underlined(fcell));
|
||||
if (n >= 0)
|
||||
for (ALL_LOCS_IN_REGION(cursheet,w)) underline(cursheet, w, n);
|
||||
break;
|
||||
@ -456,7 +471,8 @@ static void do_attribute(Sheet *cursheet, Key action)
|
||||
int n;
|
||||
|
||||
if (onecell) n = !locked(fcell);
|
||||
else n = line_ok(_("Lock block:"), locked(fcell));
|
||||
else n = line_binary(_("Set block to:"), _("uU)nlocked"), _("lL)ocked"),
|
||||
!locked(fcell));
|
||||
if (n >= 0)
|
||||
for (ALL_LOCS_IN_REGION(cursheet,w)) lockcell(cursheet, w, n);
|
||||
break;
|
||||
@ -468,8 +484,8 @@ static void do_attribute(Sheet *cursheet, Key action)
|
||||
int n;
|
||||
|
||||
if (onecell) n = !ignored(fcell);
|
||||
else n = line_ok(_("Ignore contents of all cells in this block:"),
|
||||
ignored(fcell));
|
||||
else n = line_binary(_("Set block to:"), _("cC)omputed"), _("iI)gnored"),
|
||||
!ignored(fcell));
|
||||
if (n >= 0)
|
||||
for (ALL_LOCS_IN_REGION(cursheet,w)) igncell(cursheet, w, n);
|
||||
break;
|
||||
@ -913,14 +929,11 @@ static int do_insert(Sheet *sheet)
|
||||
{
|
||||
MenuChoice menu[4];
|
||||
|
||||
menu[0].str=strdup(_("cC)olumn")); menu[0].c='\0';
|
||||
menu[1].str=strdup(_("rR)ow")); menu[1].c='\0';
|
||||
menu[2].str=strdup(_("dD)epth")); menu[2].c='\0';
|
||||
menu[0].str = _("cC)olumn"); menu[0].c='\0';
|
||||
menu[1].str = _("rR)ow"); menu[1].c='\0';
|
||||
menu[2].str = _("dD)epth"); menu[2].c='\0';
|
||||
menu[3].str=(char*)0;
|
||||
reply=line_menu(_("Insert:"),menu,0);
|
||||
free(menu[0].str);
|
||||
free(menu[1].str);
|
||||
free(menu[2].str);
|
||||
if (reply<0) return reply;
|
||||
}
|
||||
/*}}}*/
|
||||
@ -939,16 +952,14 @@ static int do_insert(Sheet *sheet)
|
||||
/* show menu */ /*{{{*/
|
||||
switch (reply)
|
||||
{
|
||||
case 0: menu[0].str=strdup(_("wW)hole column")); break;
|
||||
case 1: menu[0].str=strdup(_("wW)hole line")); break;
|
||||
case 2: menu[0].str=strdup(_("wW)hole sheet")); break;
|
||||
case 0: menu[0].str = _("wW)hole column"); break;
|
||||
case 1: menu[0].str = _("wW)hole line"); break;
|
||||
case 2: menu[0].str = _("wW)hole sheet"); break;
|
||||
default: assert(0);
|
||||
}
|
||||
menu[1].str=strdup(_("sS)ingle cell")); menu[1].c='\0';
|
||||
menu[2].str=(char*)0;
|
||||
menu[1].str = _("sS)ingle cell"); menu[1].c='\0';
|
||||
menu[2].str = (char*)0;
|
||||
r=line_menu(_("Insert:"),menu,0);
|
||||
free(menu[0].str);
|
||||
free(menu[1].str);
|
||||
/*}}}*/
|
||||
switch (r)
|
||||
{
|
||||
@ -1030,14 +1041,11 @@ static int do_delete(Sheet *sheet)
|
||||
{
|
||||
MenuChoice menu[4];
|
||||
|
||||
menu[0].str=strdup(_("cC)olumn")); menu[0].c='\0';
|
||||
menu[1].str=strdup(_("rR)ow")); menu[1].c='\0';
|
||||
menu[2].str=strdup(_("dD)epth")); menu[2].c='\0';
|
||||
menu[3].str=(char*)0;
|
||||
menu[0].str = _("cC)olumn"); menu[0].c='\0';
|
||||
menu[1].str = _("rR)ow"); menu[1].c='\0';
|
||||
menu[2].str = _("dD)epth"); menu[2].c='\0';
|
||||
menu[3].str = (char*)0;
|
||||
reply=line_menu(_("Delete:"),menu,0);
|
||||
free(menu[0].str);
|
||||
free(menu[1].str);
|
||||
free(menu[2].str);
|
||||
if (reply<0) return reply;
|
||||
}
|
||||
/*}}}*/
|
||||
@ -1057,16 +1065,14 @@ static int do_delete(Sheet *sheet)
|
||||
/* show menu */ /*{{{*/
|
||||
switch (reply)
|
||||
{
|
||||
case 0: menu[0].str=strdup(_("wW)hole column")); break;
|
||||
case 1: menu[0].str=strdup(_("wW)hole line")); break;
|
||||
case 2: menu[0].str=strdup(_("wW)hole sheet")); break;
|
||||
case 0: menu[0].str = _("wW)hole column"); break;
|
||||
case 1: menu[0].str = _("wW)hole line"); break;
|
||||
case 2: menu[0].str = _("wW)hole sheet"); break;
|
||||
default: assert(0);
|
||||
}
|
||||
menu[1].str=strdup(_("sS)ingle cell")); menu[1].c='\0';
|
||||
menu[1].str = _("sS)ingle cell"); menu[1].c='\0';
|
||||
menu[2].str=(char*)0;
|
||||
r=line_menu(_("Delete:"),menu,0);
|
||||
free(menu[0].str);
|
||||
free(menu[1].str);
|
||||
/*}}}*/
|
||||
switch (r)
|
||||
{
|
||||
@ -1454,14 +1460,11 @@ static int do_mirror(Sheet *sheet)
|
||||
{
|
||||
MenuChoice menu[4];
|
||||
|
||||
menu[0].str=strdup(_("lL)eft-right")); menu[0].c='\0';
|
||||
menu[1].str=strdup(_("uU)pside-down")); menu[1].c='\0';
|
||||
menu[2].str=strdup(_("fF)ront-back")); menu[2].c='\0';
|
||||
menu[3].str=(char*)0;
|
||||
menu[0].str = _("lL)eft-right"); menu[0].c='\0';
|
||||
menu[1].str = _("uU)pside-down"); menu[1].c='\0';
|
||||
menu[2].str = _("fF)ront-back"); menu[2].c='\0';
|
||||
menu[3].str = (char*)0;
|
||||
reply=line_menu(_("Mirror block:"),menu,0);
|
||||
free(menu[0].str);
|
||||
free(menu[1].str);
|
||||
free(menu[2].str);
|
||||
if (reply<0) return reply;
|
||||
}
|
||||
/*}}}*/
|
||||
|
147
src/display.c
147
src/display.c
@ -67,22 +67,22 @@ static int do_attribute(Sheet *cursheet)
|
||||
int c;
|
||||
|
||||
/* create menus */
|
||||
adjmenu[0].str=strdup(_("lL)eft")); adjmenu[0].c='\0';
|
||||
adjmenu[1].str=strdup(_("rR)ight")); adjmenu[1].c='\0';
|
||||
adjmenu[2].str=strdup(_("cC)entered")); adjmenu[2].c='\0';
|
||||
adjmenu[3].str=strdup(_("11).23e1 <-> 12.3")); adjmenu[3].c='\0';
|
||||
adjmenu[4].str=strdup(_("pP)recision")); adjmenu[4].c='\0';
|
||||
adjmenu[5].str=strdup(_("sS)hadow")); adjmenu[5].c='\0';
|
||||
adjmenu[6].str=strdup(_("bB)old")); adjmenu[6].c='\0';
|
||||
adjmenu[7].str=strdup(_("uU)nderline")); adjmenu[7].c='\0';
|
||||
adjmenu[8].str=strdup(_("oO)utput special characters")); adjmenu[8].c='\0';
|
||||
adjmenu[9].str=(char*)0;
|
||||
adjmenu[0].str = _("lL)eft"); adjmenu[0].c='\0';
|
||||
adjmenu[1].str = _("rR)ight"); adjmenu[1].c='\0';
|
||||
adjmenu[2].str = _("cC)entered"); adjmenu[2].c='\0';
|
||||
adjmenu[3].str = _("11).23e1 <-> 12.3"); adjmenu[3].c='\0';
|
||||
adjmenu[4].str = _("pP)recision"); adjmenu[4].c='\0';
|
||||
adjmenu[5].str = _("sS)hadow"); adjmenu[5].c='\0';
|
||||
adjmenu[6].str = _("bB)old"); adjmenu[6].c='\0';
|
||||
adjmenu[7].str = _("uU)nderline"); adjmenu[7].c='\0';
|
||||
adjmenu[8].str = _("oO)utput special characters"); adjmenu[8].c='\0';
|
||||
adjmenu[9].str = (char*)0;
|
||||
|
||||
mainmenu[0].str=strdup(_("rR)epresentation")); mainmenu[0].c='\0';
|
||||
mainmenu[1].str=strdup(_("lL)abel")); mainmenu[1].c='\0';
|
||||
mainmenu[2].str=strdup(_("oLo)ck")); mainmenu[2].c='\0';
|
||||
mainmenu[3].str=strdup(_("iI)gnore")); mainmenu[3].c='\0';
|
||||
mainmenu[4].str=(char*)0;
|
||||
mainmenu[0].str = _("rR)epresentation"); mainmenu[0].c='\0';
|
||||
mainmenu[1].str = _("lL)abel"); mainmenu[1].c='\0';
|
||||
mainmenu[2].str = _("oLo)ck"); mainmenu[2].c='\0';
|
||||
mainmenu[3].str = _("iI)gnore"); mainmenu[3].c='\0';
|
||||
mainmenu[4].str = (char*)0;
|
||||
|
||||
do
|
||||
{
|
||||
@ -130,21 +130,6 @@ static int do_attribute(Sheet *cursheet)
|
||||
} while (c == K_INVALID);
|
||||
if (c == KEY_CANCEL) c = K_INVALID;
|
||||
|
||||
/* free menus */
|
||||
free(mainmenu[0].str);
|
||||
free(mainmenu[1].str);
|
||||
free(mainmenu[2].str);
|
||||
free(mainmenu[3].str);
|
||||
free(adjmenu[0].str);
|
||||
free(adjmenu[1].str);
|
||||
free(adjmenu[2].str);
|
||||
free(adjmenu[3].str);
|
||||
free(adjmenu[4].str);
|
||||
free(adjmenu[5].str);
|
||||
free(adjmenu[6].str);
|
||||
free(adjmenu[7].str);
|
||||
free(adjmenu[8].str);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
@ -156,10 +141,10 @@ static int do_file(Sheet *cursheet)
|
||||
int c;
|
||||
|
||||
|
||||
menu[0].str=strdup(_("lL)oad")); menu[0].c='\0';
|
||||
menu[1].str=strdup(_("sS)ave")); menu[1].c='\0';
|
||||
menu[2].str=strdup(_("nN)ame")); menu[2].c='\0';
|
||||
menu[3].str=(char*)0;
|
||||
menu[0].str = _("lL)oad"); menu[0].c='\0';
|
||||
menu[1].str = _("sS)ave"); menu[1].c='\0';
|
||||
menu[2].str = _("nN)ame"); menu[2].c='\0';
|
||||
menu[3].str = (char*)0;
|
||||
c=0;
|
||||
do
|
||||
{
|
||||
@ -174,9 +159,6 @@ static int do_file(Sheet *cursheet)
|
||||
}
|
||||
} while (c == K_INVALID);
|
||||
if (c == KEY_CANCEL) c = K_INVALID;
|
||||
free(menu[0].str);
|
||||
free(menu[1].str);
|
||||
free(menu[2].str);
|
||||
return c;
|
||||
}
|
||||
|
||||
@ -258,15 +240,15 @@ static int do_block(Sheet *cursheet)
|
||||
MenuChoice block[9];
|
||||
int c;
|
||||
|
||||
block[0].str=strdup(_("ecle)ar")); block[0].c='\0';
|
||||
block[1].str=strdup(_("iI)nsert")); block[1].c='\0';
|
||||
block[2].str=strdup(_("dD)elete")); block[2].c='\0';
|
||||
block[3].str=strdup(_("mM)ove")); block[3].c='\0';
|
||||
block[4].str=strdup(_("cC)opy")); block[4].c='\0';
|
||||
block[5].str=strdup(_("fF)ill")); block[5].c='\0';
|
||||
block[6].str=strdup(_("sS)ort")); block[6].c='\0';
|
||||
block[7].str=strdup(_("rMir)ror")); block[7].c='\0';
|
||||
block[8].str=(char*)0;
|
||||
block[0].str = _("ecle)ar"); block[0].c='\0';
|
||||
block[1].str = _("iI)nsert"); block[1].c='\0';
|
||||
block[2].str = _("dD)elete"); block[2].c='\0';
|
||||
block[3].str = _("mM)ove"); block[3].c='\0';
|
||||
block[4].str = _("cC)opy"); block[4].c='\0';
|
||||
block[5].str = _("fF)ill"); block[5].c='\0';
|
||||
block[6].str = _("sS)ort"); block[6].c='\0';
|
||||
block[7].str = _("rMir)ror"); block[7].c='\0';
|
||||
block[8].str = (char*)0;
|
||||
c=0;
|
||||
do
|
||||
{
|
||||
@ -285,14 +267,6 @@ static int do_block(Sheet *cursheet)
|
||||
}
|
||||
} while (c == K_INVALID);
|
||||
if (c == KEY_CANCEL) c = K_INVALID;
|
||||
free(block[0].str);
|
||||
free(block[1].str);
|
||||
free(block[2].str);
|
||||
free(block[3].str);
|
||||
free(block[4].str);
|
||||
free(block[5].str);
|
||||
free(block[6].str);
|
||||
free(block[7].str);
|
||||
return c;
|
||||
}
|
||||
|
||||
@ -304,15 +278,15 @@ int show_menu(Sheet *cursheet)
|
||||
int c = K_INVALID;
|
||||
|
||||
|
||||
menu[0].str=strdup(_("aA)ttributes")); menu[0].c='\0';
|
||||
menu[1].str=strdup(_("wW)idth")); menu[1].c='\0';
|
||||
menu[2].str=strdup(_("bB)lock")); menu[2].c='\0';
|
||||
menu[3].str=strdup(_("fF)ile")); menu[3].c='\0';
|
||||
menu[4].str=strdup(_("gG)oto")); menu[4].c='\0';
|
||||
menu[5].str=strdup(_("sS)hell")); menu[5].c='\0';
|
||||
menu[6].str=strdup(_("vV)ersion")); menu[6].c='\0';
|
||||
menu[7].str=strdup(_("qQ)uit")); menu[7].c='\0';
|
||||
menu[8].str=(char*)0;
|
||||
menu[0].str = _("aA)ttributes"); menu[0].c='\0';
|
||||
menu[1].str = _("wW)idth"); menu[1].c='\0';
|
||||
menu[2].str = _("bB)lock"); menu[2].c='\0';
|
||||
menu[3].str = _("fF)ile"); menu[3].c='\0';
|
||||
menu[4].str = _("gG)oto"); menu[4].c='\0';
|
||||
menu[5].str = _("sS)hell"); menu[5].c='\0';
|
||||
menu[6].str = _("vV)ersion"); menu[6].c='\0';
|
||||
menu[7].str = _("qQ)uit"); menu[7].c='\0';
|
||||
menu[8].str = (char*)0;
|
||||
|
||||
do
|
||||
{
|
||||
@ -332,16 +306,6 @@ int show_menu(Sheet *cursheet)
|
||||
}
|
||||
} while (c == K_INVALID);
|
||||
if (c == KEY_CANCEL) c = K_INVALID;
|
||||
|
||||
free(menu[0].str);
|
||||
free(menu[1].str);
|
||||
free(menu[2].str);
|
||||
free(menu[3].str);
|
||||
free(menu[4].str);
|
||||
free(menu[5].str);
|
||||
free(menu[6].str);
|
||||
free(menu[7].str);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
@ -398,6 +362,7 @@ void display_main(Sheet *cursheet)
|
||||
#define TEAPOT_WHITE 16
|
||||
#define CHANNEL_MAX 1000
|
||||
|
||||
typedef short CursesColor[3];
|
||||
void display_init(Sheet *cursheet, int always_redraw)
|
||||
{
|
||||
initscr();
|
||||
@ -417,6 +382,13 @@ void display_init(Sheet *cursheet, int always_redraw)
|
||||
#ifdef HAVE_TYPEAHEAD
|
||||
if (always_redraw) typeahead(-1);
|
||||
#endif
|
||||
/* allocate and initialize the palette */
|
||||
cursheet->max_colors = COLORS;
|
||||
cursheet->palette = (void *)malloc(COLORS*sizeof(CursesColor));
|
||||
memset(cursheet->palette, '\0', COLORS*sizeof(CursesColor));
|
||||
CursesColor *palt = (CursesColor *)(cursheet->palette);
|
||||
for (size_t i = 0; i <= TEAPOT_WHITE; ++i)
|
||||
(void)color_content(i, &(palt[i][0]), &(palt[i][1]), &(palt[i][2]));
|
||||
}
|
||||
|
||||
void display_end(Sheet* sheet)
|
||||
@ -426,6 +398,7 @@ void display_end(Sheet* sheet)
|
||||
noraw();
|
||||
refresh();
|
||||
endwin();
|
||||
free(sheet->palette);
|
||||
}
|
||||
|
||||
void redraw_cell(Sheet *sheet, const Location at )
|
||||
@ -833,19 +806,29 @@ int line_ok(const char *prompt, int curx)
|
||||
{
|
||||
|
||||
MenuChoice menu[3];
|
||||
int result;
|
||||
|
||||
|
||||
|
||||
assert(curx==0 || curx==1);
|
||||
|
||||
menu[0].str=strdup(_("nN)o")); menu[0].c='\0';
|
||||
menu[1].str=strdup(_("yY)es")); menu[1].c='\0';
|
||||
menu[0].str = _("nN)o"); menu[0].c='\0';
|
||||
menu[1].str = _("yY)es"); menu[1].c='\0';
|
||||
menu[2].str=(char*)0;
|
||||
result=line_menu(prompt,menu,curx);
|
||||
free(menu[0].str);
|
||||
free(menu[1].str);
|
||||
return (result);
|
||||
return line_menu(prompt, menu, curx);
|
||||
}
|
||||
|
||||
/* line_binary -- two choices with cancel */
|
||||
int line_binary(const char *prompt, const char* op1, const char* op2, int curx)
|
||||
{
|
||||
|
||||
MenuChoice menu[4];
|
||||
int result;
|
||||
|
||||
assert(curx==0 || curx==1);
|
||||
|
||||
menu[0].str = _("cC)ancel");
|
||||
menu[1].str = op1; menu[0].c='\0';
|
||||
menu[2].str = op2; menu[1].c='\0';
|
||||
menu[3].str = (char*)0;
|
||||
return line_menu(prompt, menu, curx+1) - 1;
|
||||
}
|
||||
|
||||
/* line_menu -- one line menu */
|
||||
|
@ -11,7 +11,7 @@ extern "C" {
|
||||
typedef struct
|
||||
{
|
||||
Key c;
|
||||
char *str;
|
||||
const char *str;
|
||||
} MenuChoice;
|
||||
|
||||
void display_main(Sheet *cursheet);
|
||||
@ -22,6 +22,7 @@ void redraw_sheet(Sheet *sheet);
|
||||
const char *line_file(const char *file, const char *pattern, const char *title, int create);
|
||||
int line_edit(Sheet *sheet, char *buf, size_t size, const char *prompt, size_t *x, size_t *offx);
|
||||
int line_ok(const char *prompt, int curx);
|
||||
int line_binary(const char *prompt, const char* op1, const char* op2, int curx);
|
||||
void line_msg(const char *prompt, const char *msg);
|
||||
int keypressed(void);
|
||||
void show_text(const char *text);
|
||||
|
1701
src/fteapot.fl
1701
src/fteapot.fl
File diff suppressed because it is too large
Load Diff
230
src/tpt_choose.cxx
Normal file
230
src/tpt_choose.cxx
Normal file
@ -0,0 +1,230 @@
|
||||
#include <FL/Fl.H>
|
||||
#include <FL/Fl_Box.H>
|
||||
#include <FL/Fl_Return_Button.H>
|
||||
#include <FL/Fl_Window.H>
|
||||
|
||||
#include <FL/fl_draw.H>
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
|
||||
class Tpt_Return_Button : public Fl_Return_Button {
|
||||
public:
|
||||
int handle(int event) {
|
||||
if (event == FL_KEYBOARD
|
||||
&& (Fl::event_key() == FL_Enter || Fl::event_key() == FL_KP_Enter)) {
|
||||
simulate_key_action();
|
||||
do_callback();
|
||||
return 1;
|
||||
} else
|
||||
return Fl_Button::handle(event);
|
||||
}
|
||||
Tpt_Return_Button(int x, int y, int w, int h) : Fl_Return_Button(x, y, w, h)
|
||||
{}
|
||||
};
|
||||
|
||||
static Fl_Window *message_form;
|
||||
static Fl_Box *message;
|
||||
static Fl_Box *icon;
|
||||
static const int N_BUTTONS = 3;
|
||||
static Fl_Button *button[N_BUTTONS];
|
||||
static int ret_val;
|
||||
static const char *iconlabel = "?";
|
||||
static const char *message_title_default;
|
||||
Fl_Font fl_message_font_ = FL_HELVETICA;
|
||||
Fl_Fontsize fl_message_size_ = -1;
|
||||
static int enableHotspot = 1;
|
||||
|
||||
static char avoidRecursion = 0;
|
||||
|
||||
|
||||
// Sets the global return value (ret_val) and closes the window.
|
||||
static void button_cb(Fl_Widget *, long val) {
|
||||
ret_val = (int) val;
|
||||
if (Fl::event_key() == FL_Escape) ret_val = -1;
|
||||
message_form->hide();
|
||||
}
|
||||
|
||||
// If the window is simply closed, that's the same as hitting escape
|
||||
static void form_cb(Fl_Widget *, long val) {
|
||||
ret_val = -1;
|
||||
message_form->hide();
|
||||
}
|
||||
|
||||
static Fl_Window *makeform() {
|
||||
if (message_form) {
|
||||
return message_form;
|
||||
}
|
||||
// make sure that the dialog does not become the child of some
|
||||
// current group
|
||||
Fl_Group *previously_current_group = Fl_Group::current();
|
||||
Fl_Group::current(0);
|
||||
// create a new top level window
|
||||
Fl_Window *w = message_form = new Fl_Window(410,103);
|
||||
message_form->callback(form_cb);
|
||||
|
||||
(message = new Fl_Box(60, 25, 340, 20))
|
||||
->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE|FL_ALIGN_WRAP);
|
||||
{Fl_Box* o = icon = new Fl_Box(10, 10, 50, 50);
|
||||
o->box(FL_THIN_UP_BOX);
|
||||
o->labelfont(FL_TIMES_BOLD);
|
||||
o->labelsize(34);
|
||||
o->color(FL_WHITE);
|
||||
o->labelcolor(FL_BLUE);
|
||||
}
|
||||
w->end(); // don't add the buttons automatically
|
||||
// create the buttons (right to left)
|
||||
for (int b=0, x=100*N_BUTTONS+10; b<N_BUTTONS; b++, x -= 100) {
|
||||
button[b] = new Tpt_Return_Button(x, 70, 90, 23);
|
||||
button[b]->align(FL_ALIGN_INSIDE|FL_ALIGN_WRAP);
|
||||
button[b]->callback(button_cb, b);
|
||||
}
|
||||
button[0]->shortcut(FL_Escape);
|
||||
// add the buttons (left to right so arrow keys work)
|
||||
for (int b = N_BUTTONS-1; b >= 0; --b)
|
||||
w->add(button[b]);
|
||||
|
||||
w->begin();
|
||||
w->resizable(new Fl_Box(60,10,110-60,27));
|
||||
w->end();
|
||||
w->set_modal();
|
||||
Fl_Group::current(previously_current_group);
|
||||
return w;
|
||||
}
|
||||
|
||||
/*
|
||||
* 'resizeform()' - Resize the form and widgets so that they hold everything
|
||||
* that is asked of them...
|
||||
*/
|
||||
|
||||
static void resizeform() {
|
||||
int i;
|
||||
int message_w, message_h;
|
||||
int text_height;
|
||||
int button_w[N_BUTTONS], button_h[N_BUTTONS];
|
||||
int x, w, h, max_w, max_h;
|
||||
const int icon_size = 50;
|
||||
|
||||
message_form->size(410,103);
|
||||
|
||||
fl_font(message->labelfont(), message->labelsize());
|
||||
message_w = message_h = 0;
|
||||
fl_measure(message->label(), message_w, message_h);
|
||||
|
||||
message_w += 10;
|
||||
message_h += 10;
|
||||
if (message_w < 340)
|
||||
message_w = 340;
|
||||
if (message_h < 30)
|
||||
message_h = 30;
|
||||
|
||||
fl_font(button[0]->labelfont(), button[0]->labelsize());
|
||||
|
||||
memset(button_w, 0, sizeof(button_w));
|
||||
memset(button_h, 0, sizeof(button_h));
|
||||
|
||||
for (max_h = 25, i = 0; i < N_BUTTONS; i ++)
|
||||
if (button[i]->visible())
|
||||
{
|
||||
fl_measure(button[i]->label(), button_w[i], button_h[i]);
|
||||
|
||||
if (i == 1)
|
||||
button_w[1] += 20;
|
||||
|
||||
button_w[i] += 30;
|
||||
button_h[i] += 10;
|
||||
|
||||
if (button_h[i] > max_h)
|
||||
max_h = button_h[i];
|
||||
}
|
||||
|
||||
text_height = message_h;
|
||||
|
||||
max_w = message_w + 10 + icon_size;
|
||||
w = -10;
|
||||
for (int i = 0; i < N_BUTTONS; ++i) w += button_w[i];
|
||||
|
||||
if (w > max_w)
|
||||
max_w = w;
|
||||
|
||||
message_w = max_w - 10 - icon_size;
|
||||
|
||||
w = max_w + 20;
|
||||
h = max_h + 30 + text_height;
|
||||
|
||||
message_form->size(w, h);
|
||||
message_form->size_range(w, h, w, h);
|
||||
|
||||
message->resize(20 + icon_size, 10, message_w, message_h);
|
||||
icon->resize(10, 10, icon_size, icon_size);
|
||||
icon->labelsize(icon_size - 10);
|
||||
|
||||
for (x = w, i = 0; i < N_BUTTONS; i ++)
|
||||
if (button_w[i])
|
||||
{
|
||||
x -= button_w[i];
|
||||
button[i]->resize(x, h - 10 - max_h, button_w[i] - 10, max_h);
|
||||
}
|
||||
message_form->init_sizes();
|
||||
}
|
||||
|
||||
int tpt_choose(const char* prompt, const char* op0, const char *op1,
|
||||
const char* op2, int curx) {
|
||||
|
||||
if (avoidRecursion) return 0;
|
||||
|
||||
Fl::pushed(0); // stop dragging
|
||||
|
||||
avoidRecursion = 1;
|
||||
|
||||
makeform();
|
||||
message_form->size(410,103);
|
||||
message->label(prompt);
|
||||
message->labelfont(fl_message_font_);
|
||||
if (fl_message_size_ == -1) message->labelsize(FL_NORMAL_SIZE);
|
||||
else message->labelsize(fl_message_size_);
|
||||
if (op0) {
|
||||
button[0]->show();
|
||||
button[0]->label(op0);
|
||||
button[1]->position(210,70);
|
||||
}
|
||||
else { button[0]->hide(); button[1]->position(310,70); }
|
||||
if (op1) { button[1]->show(); button[1]->label(op1);}
|
||||
else button[1]->hide();
|
||||
if (op2) { button[2]->show(); button[2]->label(op2); }
|
||||
else button[2]->hide();
|
||||
|
||||
button[curx]->take_focus();
|
||||
|
||||
const char* prev_icon_label = icon->label();
|
||||
if (!prev_icon_label) icon->label(iconlabel);
|
||||
|
||||
resizeform();
|
||||
|
||||
if (enableHotspot)
|
||||
message_form->hotspot(button[0]);
|
||||
if (op0 && Fl_Widget::label_shortcut(op0))
|
||||
button[0]->shortcut(0);
|
||||
else
|
||||
button[0]->shortcut(FL_Escape);
|
||||
|
||||
// set default window title, if defined and a specific title is not set
|
||||
if (!message_form->label() && message_title_default)
|
||||
message_form->label(message_title_default);
|
||||
|
||||
// deactivate Fl::grab(), because it is incompatible with modal windows
|
||||
Fl_Window* g = Fl::grab();
|
||||
if (g) Fl::grab(0);
|
||||
Fl_Group *current_group = Fl_Group::current(); // make sure the dialog does not interfere with any active group
|
||||
message_form->show();
|
||||
Fl_Group::current(current_group);
|
||||
while (message_form->shown()) Fl::wait();
|
||||
if (g) // regrab the previous popup menu, if there was one
|
||||
Fl::grab(g);
|
||||
icon->label(prev_icon_label);
|
||||
message_form->label(0); // reset window title
|
||||
|
||||
avoidRecursion = 0;
|
||||
|
||||
return ret_val;
|
||||
}
|
7
src/tpt_choose.h
Normal file
7
src/tpt_choose.h
Normal file
@ -0,0 +1,7 @@
|
||||
#ifndef TPT_CHOOSE_H
|
||||
#define TPT_CHOOSE_H
|
||||
|
||||
int tpt_choose(const char* prompt, const char* op0, const char *op1,
|
||||
const char* op2, int deflt);
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user