1#!/usr/bin/env python 2# 3# $Id$ 4# 5# (n)curses exerciser in Python, an interactive test for the curses 6# module. Currently, only the panel demos are ported. 7 8import curses 9from curses import panel 10 11def wGetchar(win = None): 12 if win is None: win = stdscr 13 return win.getch() 14 15def Getchar(): 16 wGetchar() 17 18# 19# Panels tester 20# 21def wait_a_while(): 22 if nap_msec == 1: 23 Getchar() 24 else: 25 curses.napms(nap_msec) 26 27def saywhat(text): 28 stdscr.move(curses.LINES - 1, 0) 29 stdscr.clrtoeol() 30 stdscr.addstr(text) 31 32def mkpanel(color, rows, cols, tly, tlx): 33 win = curses.newwin(rows, cols, tly, tlx) 34 pan = panel.new_panel(win) 35 if curses.has_colors(): 36 if color == curses.COLOR_BLUE: 37 fg = curses.COLOR_WHITE 38 else: 39 fg = curses.COLOR_BLACK 40 bg = color 41 curses.init_pair(color, fg, bg) 42 win.bkgdset(ord(' '), curses.color_pair(color)) 43 else: 44 win.bkgdset(ord(' '), curses.A_BOLD) 45 46 return pan 47 48def pflush(): 49 panel.update_panels() 50 curses.doupdate() 51 52def fill_panel(pan): 53 win = pan.window() 54 num = pan.userptr()[1] 55 56 win.move(1, 1) 57 win.addstr("-pan%c-" % num) 58 win.clrtoeol() 59 win.box() 60 61 maxy, maxx = win.getmaxyx() 62 for y in range(2, maxy - 1): 63 for x in range(1, maxx - 1): 64 win.move(y, x) 65 win.addch(num) 66 67def demo_panels(win): 68 global stdscr, nap_msec, mod 69 stdscr = win 70 nap_msec = 1 71 mod = ["test", "TEST", "(**)", "*()*", "<-->", "LAST"] 72 73 stdscr.refresh() 74 75 for y in range(0, curses.LINES - 1): 76 for x in range(0, curses.COLS): 77 stdscr.addstr("%d" % ((y + x) % 10)) 78 for y in range(0, 1): 79 p1 = mkpanel(curses.COLOR_RED, 80 curses.LINES // 2 - 2, 81 curses.COLS // 8 + 1, 82 0, 83 0) 84 p1.set_userptr("p1") 85 86 p2 = mkpanel(curses.COLOR_GREEN, 87 curses.LINES // 2 + 1, 88 curses.COLS // 7, 89 curses.LINES // 4, 90 curses.COLS // 10) 91 p2.set_userptr("p2") 92 93 p3 = mkpanel(curses.COLOR_YELLOW, 94 curses.LINES // 4, 95 curses.COLS // 10, 96 curses.LINES // 2, 97 curses.COLS // 9) 98 p3.set_userptr("p3") 99 100 p4 = mkpanel(curses.COLOR_BLUE, 101 curses.LINES // 2 - 2, 102 curses.COLS // 8, 103 curses.LINES // 2 - 2, 104 curses.COLS // 3) 105 p4.set_userptr("p4") 106 107 p5 = mkpanel(curses.COLOR_MAGENTA, 108 curses.LINES // 2 - 2, 109 curses.COLS // 8, 110 curses.LINES // 2, 111 curses.COLS // 2 - 2) 112 p5.set_userptr("p5") 113 114 fill_panel(p1) 115 fill_panel(p2) 116 fill_panel(p3) 117 fill_panel(p4) 118 fill_panel(p5) 119 p4.hide() 120 p5.hide() 121 pflush() 122 saywhat("press any key to continue") 123 wait_a_while() 124 125 saywhat("h3 s1 s2 s4 s5;press any key to continue") 126 p1.move(0, 0) 127 p3.hide() 128 p1.show() 129 p2.show() 130 p4.show() 131 p5.show() 132 pflush() 133 wait_a_while() 134 135 saywhat("s1; press any key to continue") 136 p1.show() 137 pflush() 138 wait_a_while() 139 140 saywhat("s2; press any key to continue") 141 p2.show() 142 pflush() 143 wait_a_while() 144 145 saywhat("m2; press any key to continue") 146 p2.move(curses.LINES // 3 + 1, curses.COLS // 8) 147 pflush() 148 wait_a_while() 149 150 saywhat("s3; press any key to continue") 151 p3.show() 152 pflush() 153 wait_a_while() 154 155 saywhat("m3; press any key to continue") 156 p3.move(curses.LINES // 4 + 1, curses.COLS // 15) 157 pflush() 158 wait_a_while() 159 160 saywhat("b3; press any key to continue") 161 p3.bottom() 162 pflush() 163 wait_a_while() 164 165 saywhat("s4; press any key to continue") 166 p4.show() 167 pflush() 168 wait_a_while() 169 170 saywhat("s5; press any key to continue") 171 p5.show() 172 pflush() 173 wait_a_while() 174 175 saywhat("t3; press any key to continue") 176 p3.top() 177 pflush() 178 wait_a_while() 179 180 saywhat("t1; press any key to continue") 181 p1.show() 182 pflush() 183 wait_a_while() 184 185 saywhat("t2; press any key to continue") 186 p2.show() 187 pflush() 188 wait_a_while() 189 190 saywhat("t3; press any key to continue") 191 p3.show() 192 pflush() 193 wait_a_while() 194 195 saywhat("t4; press any key to continue") 196 p4.show() 197 pflush() 198 wait_a_while() 199 200 for itmp in range(0, 6): 201 w4 = p4.window() 202 w5 = p5.window() 203 204 saywhat("m4; press any key to continue") 205 w4.move(curses.LINES // 8, 1) 206 w4.addstr(mod[itmp]) 207 p4.move(curses.LINES // 6, itmp * curses.COLS // 8) 208 w5.move(curses.LINES // 6, 1) 209 w5.addstr(mod[itmp]) 210 pflush() 211 wait_a_while() 212 213 saywhat("m5; press any key to continue") 214 w4.move(curses.LINES // 6, 1) 215 w4.addstr(mod[itmp]) 216 p5.move(curses.LINES // 3 - 1, itmp * 10 + 6) 217 w5.move(curses.LINES // 8, 1) 218 w5.addstr(mod[itmp]) 219 pflush() 220 wait_a_while() 221 222 saywhat("m4; press any key to continue") 223 p4.move(curses.LINES // 6, (itmp + 1) * curses.COLS // 8) 224 pflush() 225 wait_a_while() 226 227 saywhat("t5; press any key to continue") 228 p5.top() 229 pflush() 230 wait_a_while() 231 232 saywhat("t2; press any key to continue") 233 p2.top() 234 pflush() 235 wait_a_while() 236 237 saywhat("t1; press any key to continue") 238 p1.top() 239 pflush() 240 wait_a_while() 241 242 saywhat("d2; press any key to continue") 243 del p2 244 pflush() 245 wait_a_while() 246 247 saywhat("h3; press any key to continue") 248 p3.hide() 249 pflush() 250 wait_a_while() 251 252 saywhat("d1; press any key to continue") 253 del p1 254 pflush() 255 wait_a_while() 256 257 saywhat("d4; press any key to continue") 258 del p4 259 pflush() 260 wait_a_while() 261 262 saywhat("d5; press any key to continue") 263 del p5 264 pflush() 265 wait_a_while() 266 if nap_msec == 1: 267 break 268 nap_msec = 100 269 270# 271# one fine day there'll be the menu at this place 272# 273curses.wrapper(demo_panels) 274