fpc/packages/ncurses/examples/t2panel.pp
2008-05-04 15:51:26 +00:00

169 lines
3.7 KiB
ObjectPascal

program test_panel;
{$MODE OBJFPC}
uses
ncurses, panel, sysutils;
Type
PPWINDOW = ^PWINDOW;
PPPANEL = ^PPANEL;
const
NLINES = 8;
NCOLS = 32;
procedure print_in_middle(win: PWINDOW; starty, startx, width: Longint; str: AnsiString; color: chtype);
var
slength: Longint;
x, y: Longint;
temp: Double;
begin
if win = nil then
win := stdscr;
getyx(win, y, x);
if startx <> 0 then
x := startx;
if starty <> 0 then
y := starty;
if width = 0 then
width := 80;
slength := Length(str);
temp := (width - slength)/ 2;
x := startx + round(temp);
wattron(win, color);
mvwaddstr(win, y, x, PChar(str));
wattroff(win, color);
refresh();
end;
procedure win_show(win: PWINDOW; lab: AnsiString; label_color: Longint);
var
startx, starty, height, width: Longint;
begin
getbegyx(win, starty, startx);
getmaxyx(win, height, width);
box(win, 0, 0);
mvwaddch(win, 2, 0, ACS_LTEE);
mvwhline(win, 2, 1, ACS_HLINE, width - 2);
mvwaddch(win, 2, width - 1, ACS_RTEE);
print_in_middle(win, 1, 0, width, lab, COLOR_PAIR(label_color));
end;
procedure init_panels(pans: PPPANEL; n: Longint);
var
x, y, i: Longint;
lab: AnsiString;
win: PWINDOW;
begin
y := 2;
x := 3;
for i := 0 to n - 1 do
begin
win := newwin(NLINES, NCOLS, y, x);
FmtStr(lab, 'Window Number %d', [i + 1]);
win_show(win, lab, i + 1);
pans[i] := new_panel(win);
y += 2;
x += 4;
end
end;
procedure select(var oldp: PPANEL; newp: PPANEL);
var
win: PWINDOW;
begin
win := panel_window(oldp);
wattroff(win,A_BOLD);
box(win,0,0);
win := panel_window(newp);
wattron(win,A_BOLD);
box(win,0,0);
oldp := newp;
end;
var
my_panels: array[0..4] of PPANEL;
selected: PPANEL;
ch: chtype;
begin
try
(* Initialize curses *)
initscr();
start_color();
cbreak();
noecho();
keypad(stdscr, TRUE);
(* Initialize all the colors *)
init_pair(1, COLOR_RED, COLOR_BLACK);
init_pair(2, COLOR_GREEN, COLOR_BLACK);
init_pair(3, COLOR_BLUE, COLOR_BLACK);
init_pair(4, COLOR_CYAN, COLOR_BLACK);
init_pair(5, COLOR_YELLOW, COLOR_BLACK);
init_panels(my_panels, 5);
set_panel_userptr(my_panels[0], my_panels[4]);
set_panel_userptr(my_panels[1], my_panels[3]);
set_panel_userptr(my_panels[2], my_panels[1]);
set_panel_userptr(my_panels[3], my_panels[0]);
set_panel_userptr(my_panels[4], my_panels[2]);
select(selected,my_panels[4]);
(* Update the stacking order. 2nd panel will be on top *)
update_panels();
(* Show it on the screen *)
attron(COLOR_PAIR(4));
mvprintw(LINES - 5, 1, 't : top');
mvprintw(LINES - 4, 1, 'h : show or hide toggle');
mvprintw(LINES - 3, 1, '1..5, home, end, up, down, tab : navigate ');
mvprintw(LINES - 2, 1, 'F1 : to Exit');
attroff(COLOR_PAIR(4));
doupdate();
ch := getch;
while ch <> KEY_F(1) do
begin
case ch of
chtype('1'): select(selected,my_panels[0]);
chtype('2'): select(selected,my_panels[1]);
chtype('3'): select(selected,my_panels[2]);
chtype('4'): select(selected,my_panels[3]);
chtype('5'): select(selected,my_panels[4]);
KEY_HOME: select(selected,panel_above(nil));
KEY_END: select(selected,panel_below(nil));
KEY_UP: select(selected,panel_above(selected));
KEY_DOWN: select(selected,panel_below(selected));
9: select(selected,panel_userptr(selected));
chtype('t'): top_panel(selected);
chtype('h'):
begin
if panel_hidden(selected) = OK then
hide_panel(selected)
else
show_panel(selected);
end;
else
end;
update_panels();
doupdate();
ch := getch;
end;
finally
endwin();
end;
end.