123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- 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.
|