mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-27 21:33:40 +02:00
169 lines
3.7 KiB
ObjectPascal
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. |