123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- {
- Example 17. Panel Hiding and Showing example
- from ncurses howto
- }
- program test_panel;
- {$MODE OBJFPC}
- uses
- ncurses, panel, sysutils;
- Type
- PANEL_DATA = record
- hide: Boolean; (* TRUE if panel is hidden *)
- end;
- PPWINDOW = ^PWINDOW;
- const
- NLINES = 10;
- NCOLS = 40;
- procedure print_in_middle(win: PWINDOW; starty, startx, width: Longint; str: AnsiString; color: chtype);
- var
- slength, 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;
- (* Show the window with a border and a label *)
- procedure win_show(win: PWINDOW; lab: AnsiString; label_color: Longint);
- var
- startx, starty, height, width: Smallint;
- 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;
- (* Put all the windows *)
- procedure init_wins(wins: PPWINDOW; n: Longint);
- var
- x, y, i: Longint;
- lab: AnsiString;
- begin
- y := 2;
- x := 10;
- for i := 0 to n - 1 do
- begin
- wins[i] := newwin(NLINES, NCOLS, y, x);
- FmtStr(lab, 'Window Number %d', [i + 1]);
- win_show(wins[i], lab, i + 1);
- y += 3;
- x += 7;
- end
- end;
- var
- my_wins: array[0..2] of PWINDOW;
- my_panels: array[0..2] of PPANEL;
- panel_datas: array[0..2] of PANEL_DATA;
- temp: ^PANEL_DATA;
- 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_wins(my_wins, 3);
- (* Attach a panel to each window *) (* Order is bottom up *)
- my_panels[0] := new_panel(my_wins[0]); (* Push 0, order: stdscr-0 *)
- my_panels[1] := new_panel(my_wins[1]); (* Push 1, order: stdscr-0-1 *)
- my_panels[2] := new_panel(my_wins[2]); (* Push 2, order: stdscr-0-1-2 *)
- (* Initialize panel datas saying that nothing is hidden *)
- panel_datas[0].hide := FALSE;
- panel_datas[1].hide := FALSE;
- panel_datas[2].hide := FALSE;
- set_panel_userptr(my_panels[0], @panel_datas[0]);
- set_panel_userptr(my_panels[1], @panel_datas[1]);
- set_panel_userptr(my_panels[2], @panel_datas[2]);
- (* Update the stacking order. 2nd panel will be on top *)
- update_panels();
- (* Show it on the screen *)
- attron(COLOR_PAIR(4));
- mvprintw(LINES - 3, 0, 'Show or Hide a window with "a"(first window) "b"(Second Window) "c"(Third Window)');
- mvprintw(LINES - 2, 0, 'F1 to Exit');
- attroff(COLOR_PAIR(4));
- doupdate();
- ch := getch;
- while ch <> KEY_F(1) do
- begin
- case ch of
- chtype('a'):
- begin
- temp := panel_userptr(my_panels[0]);
- if temp^.hide = FALSE then
- begin
- hide_panel(my_panels[0]);
- temp^.hide := TRUE;
- end
- else
- begin
- show_panel(my_panels[0]);
- temp^.hide := FALSE;
- end
- end;
- chtype('b'):
- begin
- temp := panel_userptr(my_panels[1]);
- if temp^.hide = FALSE then
- begin
- hide_panel(my_panels[1]);
- temp^.hide := TRUE;
- end
- else
- begin
- show_panel(my_panels[1]);
- temp^.hide := FALSE;
- end
- end;
- chtype('c'):
- begin
- temp := panel_userptr(my_panels[2]);
- if temp^.hide = FALSE then
- begin
- hide_panel(my_panels[2]);
- temp^.hide := TRUE;
- end
- else
- begin
- show_panel(my_panels[2]);
- temp^.hide := FALSE;
- end
- end
- else
- end;
- update_panels();
- doupdate();
- ch := getch;
- end;
- finally
- endwin();
- end;
- end.
|