1
2 /* Terminality - a portable terminal handling library
3 * Copyright (C) 1998-2002, Emil Mikulic.
4 * This is LGPL - look at COPYING.LIB
5 */
6
7 /* Project: Terminality
8 * File: demo.cpp
9 * Author: Emil Mikulic, Michal Safranek
10 * Description: Demonstrate the Terminality GUI
11 */
12
13 /* Define this if you want the 'theme preview' function: */
14 #define THEME_FOREVER
15
16 #include <gui.h>
17 #include <time.h>
18 #include <stdlib.h>
19 #include "myscheme.h"
20 #include <xmem.h>
21
22 #ifdef USE_NCURSES /* alias we're not under Windoze */
23 //#include <unistd.h>
24 #endif
25
26 const char rcsid[] =
27 "$Id: demo.cpp,v 1.19 2002/07/26 01:39:43 darkmoon Exp $";
28
29
30
doabout(void)31 void doabout(void)
32 {
33 /* Paint the screen */
34 #ifndef __DJGPP__
35 fillscreen(DarkGray, Black, BLOCK_1);
36 #else
37 fillscreen(DarkGray, Black, 176);
38 #endif
39
40 /* Draw a 3D box */
41 drawbox_out(12,11,CON_COLS-12,14, Green);
42
43 /* Write in it */
44 setcolor(White, Green);
45 center(12,"Terminality");
46 center(13,"Copyright (C) 1998-2002, Emil, Volker and Michal.");
47
48 /* Centertext */
49 setcolor(LightRed, Black);
50 center(18, "Demo Program");
51
52 /* Press any key */
53 setcolor(White, Black);
54 center(20, "Press any key to continue");
55 update();
56 while (!keypressed()) {};
57 readkey();
58 }
59
60
61
local_kh(key k,element_type et,void * ptr)62 key local_kh(key k, element_type et, void *ptr){
63 ((textbox *) ptr)->set_buf("Great cheat! :)");
64 ((textbox *) ptr)->draw();
65 return KEY_NOTHING;
66 }
67
68
69
dodlg(void)70 void dodlg(void)
71 {
72 button *b = NULL;
73 form *myForm = new form(30,4,36,19);
74
75 myForm->addstatic(new staticLabel(32,7,"Text:"));
76 myForm->addstatic(new staticLabel(32,8,"Numbers:"));
77 textbox *tbx = new textbox(41,7,"<geoffwa> It's a cow-dog. "
78 "It says \"moof\"!", 20, 50);
79 #ifndef _WIN32
80 tbx->bind(KEY_F(1), &local_kh, 0);
81 #endif
82 myForm->addobject(tbx);
83 textbox *mybox = new textbox(41,8,"12", 20);
84 mybox->charmap = "0123456789";
85
86 myForm->addobject(mybox);
87 myForm->addobject(new checkbox(32,10,false,"I'm a CheckBox"));
88 myForm->addstatic(new staticLabel(32,12,"Choose your gender:"));
89
90 radioGroup *rg = new radioGroup;
91 myForm->addobject(new radio(rg,1,34,13,false,"Male"));
92 myForm->addobject(new radio(rg,2,34,14,false,"Female"));
93 myForm->addstatic(new staticLabel(32,16,"Choose your race:"));
94
95 radioGroup *rg2 = new radioGroup;
96 myForm->addobject(new radio(rg2,1,34,17,false,"Human"));
97 myForm->addobject(new radio(rg2,2,34,18,false,"Elf"));
98 myForm->addobject(new radio(rg2,3,34,19,false,"Dwarf"));
99 myForm->addobject(new radio(rg2,4,50,17,false,"Orc"));
100 myForm->addobject(new radio(rg2,5,50,18,false,"Troll"));
101 myForm->addobject(new radio(rg2,6,50,19,false,"Drakeling"));
102
103 myForm->addobject(b = new button(52,21,6,1,"OK",1));
104 b->dflt = true;
105 myForm->run();
106
107 /*
108 * Short note about gathering results: if you want to get result
109 * from radio buttons in a group, use their 'radioGroup' instead of
110 * travelling through them and checking 'selected'.
111 *
112 * for example: printw("Radio group1: %d\n",rg2->selected_id);
113 */
114 delete myForm;
115 delete rg;
116 delete rg2;
117 }
118
119
120
hshow(char * text)121 void hshow(char *text)
122 {
123 char *buf = (char*) xmalloc(strlen(text) + 25);
124 form *myForm = new form(20,3,40,5);
125
126 sprintf(buf, "You pressed the %s item", text);
127 myForm->addstatic(new staticLabel(21+(40-strlen(buf))/2,4,buf));
128 myForm->addobject(new button(37,6,6,1,"OK",1));
129 myForm->run();
130 delete myForm;
131 xfree(buf);
132 }
133
134
135
dodlg2(void)136 void dodlg2(void)
137 {
138 clrscr();
139 hMenu *myMenu = new hMenu(
140 new hMenuItem("First",1,1),
141 new hMenuItem("Second",7,92),
142 new hMenuItem("Third",14,13),
143 NULL);
144 myMenu->y = 1;
145 myMenu->visible = true;
146 int ch,die=0;
147
148 do {
149 clrscr();
150
151 ch = myMenu->getchoice();
152 die = 1;
153 switch(ch) {
154 case 1:
155 hshow("first");
156 break;
157 case 92:
158 hshow("second");
159 break;
160 case 13:
161 hshow("third");
162 break;
163 case -1:
164 break;
165 default:
166 die = 0;
167 break;
168 };
169 } while(die != 1);
170 delete myMenu;
171 }
172
173
174
my_listing_handle(key k,void * l,int num)175 key my_listing_handle(key k, void *l, int num)
176 {
177 if(k == ' ') {
178 gotoxy(28, 25);
179 setcolor(White, Black);
180 printw("listing_handle(' '): %.3d", num);
181 update();
182 return KEY_NOTHING;
183 } else {
184 return k;
185 }
186 }
187
188
189
dodlg3(void)190 void dodlg3(void)
191 {
192 tn_list *it1 = NULL, *it2 = NULL, *it3 = NULL, *cl3 = NULL;
193 char *tmp;
194 color *ctmp;
195 int i, x, y;
196
197 clrscr();
198 srand(time(0));
199
200 #define SIZE 30
201
202 #define CREATE_DATA(x,h) tmp = (char *)xmalloc(SIZE + 1); \
203 sprintf(tmp,"%d",h); if (x) tn_list_add(x, tmp); else \
204 x = tn_list_new(tmp);
205
206 #define GENERATE_DATA(y) x = (int) (1000.0*rand()/(RAND_MAX+1.0)); \
207 CREATE_DATA(y,x);
208
209 #define ADD_CLR(x,y) ctmp = (color *)xmalloc(sizeof(color)*4); \
210 ctmp[0] = ctmp[1] = y; ctmp[2] = Default; ctmp[3] = Default; \
211 if (x) tn_list_add(x,ctmp); else x = tn_list_new(ctmp);
212
213 #define ADD_ODD(x) ADD_CLR(x,LightBlue);
214 #define ADD_EVEN(x) ADD_CLR(x,Red);
215
216 for (i = 0; i < 100; i++) {
217 y = 0;
218 GENERATE_DATA(it1);
219 y += x;
220 GENERATE_DATA(it2);
221 y += x;
222 CREATE_DATA(it3, y);
223 if (!(y%2)) {
224 ADD_EVEN(cl3);
225 } else {
226 ADD_ODD(cl3);
227 }
228 }
229
230 listing *myListing = new listing (2, 2, 78, 23,
231 new listingSeparator(2),
232 new listingItem(3,24,"A",it1),
233 new listingSeparator(27),
234 new listingItem(28,25,"B",it2),
235 new listingSeparator(53),
236 new listingItem(54,25,"A+B (even=red, odd=blue)",it3,cl3),
237 new listingSeparator(79, cl3),
238 NULL);
239
240 myListing->set_handle(&my_listing_handle);
241 myListing->visible = true;
242 myListing->run();
243 delete myListing;
244
245 #define KILL_LIST(x) \
246 for(i = 0; i < tn_list_size(x); i++) { xfree(tn_list_getdata(x,i)); } \
247 tn_list_free(x); tn_list_kill(x);
248
249 KILL_LIST(it1);
250 KILL_LIST(it2);
251 KILL_LIST(it3);
252 KILL_LIST(cl3);
253
254 #undef KILL_LIST
255 #undef SIZE
256 #undef CREATE_DATA
257 #undef GENERATE_DATA
258 #undef ADD_CLR
259 #undef ADD_ODD
260 #undef ADD_EVEN
261 }
262
263
264
dodlg4(void)265 void dodlg4(void)
266 {
267 form *myForm = new form(30,4,36,19);
268 button *b = NULL;
269
270 myForm->addstatic(new staticLabel(46,7,"Text:"));
271 myForm->addobject(new textarea(37,11,20,7,"Wow! It says \"moof\"! "
272 "That's great!"));
273 myForm->addobject(b = new button(52,21,6,1,"OK",1));
274 b->dflt = true;
275 myForm->run();
276
277 delete myForm;
278 }
279
280
281
dflt_glkh(key k,element_type et,void * ptr)282 int dflt_glkh(key k, element_type et, void *ptr)
283 {
284 gotoxy(1, et==Hmenu?25:1);
285 printw("dflt_glkh(): called: %d, %d, %p (accept)", k, et, ptr);
286 update();
287 return KEY_NOTHING;
288 }
289
290
291
dflt_glkh2(key k,element_type et,void * ptr)292 int dflt_glkh2(key k, element_type et, void *ptr)
293 {
294 /* Function keys are broken on Win32 right at the moment */
295 #ifndef _WIN32
296 if (k != KEY_F(2) && k != KEY_F(3)) {
297 return KEY_ENTER;
298 }
299 if (k == KEY_F(2))
300 default_scheme();
301 else
302 set_scheme(my_color_scheme);
303 #endif
304 return KEY_NOTHING;
305 }
306
307
308
doviewer(void)309 void doviewer(void)
310 {
311 /* Paint the screen */
312 #ifndef __DJGPP__
313 fillscreen(DarkGray, Black, BLOCK_1);
314 #else
315 fillscreen(DarkGray, Black, 176);
316 #endif
317
318 setcolor(White, Blue);
319 textviewer(30,10,20,4, "Arithmetic is being able to count up to twenty "
320 "without taking off your shoes.\n\n -- Mickey Mouse");
321 }
322
323
324
doscheme(void)325 void doscheme(void)
326 {
327 menu *scheme_menu = new menu(
328 new menuItem("Original", 1),
329 new menuItem("Blue", 2),
330 new menuSeparator(),
331 #ifdef THEME_FOREVER
332 new menuItem("Exit", 99),
333 #else
334 new menuItem("Unchanged", 99),
335 #endif
336 NULL);
337
338 scheme_menu->x = 30;
339 scheme_menu->y = 10;
340 scheme_menu->visible = true;
341
342 #ifdef THEME_FOREVER
343 while(1) {
344 #endif
345 switch(scheme_menu->getchoice()) {
346 case 1:
347 default_scheme();
348 break;
349 case 2:
350 set_scheme(my_color_scheme);
351 break;
352 case -1:
353 case 99:
354 delete scheme_menu;
355 return;
356 default:
357 beep();
358 break;
359 }
360 #ifdef THEME_FOREVER
361 }
362 #endif
363 }
364
365
366
367 bool perc = true, alt = false;
368 progressBar *pb = NULL;
369 form *myForm = NULL;
370
371
372
perc_handle(int sel)373 void perc_handle(int sel)
374 {
375 perc = sel?true:false;
376 pb->show_perc = perc;
377 myForm->draw();
378 }
379
380
381
alt_handle(int sel)382 void alt_handle(int sel)
383 {
384 alt = sel?true:false;
385 pb->alt_clr = alt;
386 myForm->draw();
387 }
388
389
390
dopbar(void)391 void dopbar(void)
392 {
393 int die = 0;
394 checkbox *cb = NULL;
395 button *b = NULL;
396
397 myForm = new form(27, 10, 33, 10);
398 pb = new progressBar(29, 12, 27, 1);
399 myForm->remember_id = true;
400 pb->show_perc = perc;
401 pb->alt_clr = alt;
402 myForm->addstatic(pb);
403 myForm->addobject(new button(29, 14, 6, 1, " ->", 3));
404 myForm->addobject(new button(52, 14, 6, 1, " |<-", 1));
405 myForm->addobject(cb = new checkbox(29, 18, perc, "Draw percents"));
406 cb->spc_handle = perc_handle;
407 myForm->addobject(cb = new checkbox(29, 19, alt, "Alternate colors"));
408 cb->spc_handle = alt_handle;
409 myForm->addobject(b = new button(52, 18, 6, 1, " OK", 4));
410 b->dflt = true;
411 die = 0;
412
413 while (!die) {
414 switch (myForm->run()) {
415 case 1:/* |<- */
416 pb->setcur(0);
417 break;
418 case 3:/* -> */
419 if(!pb->advance()) beep();
420 break;
421 case 0:/* ESC */
422 case 4:/* OK */
423 die = 1;
424 break;
425 }
426 }
427 delete myForm;
428 }
429
430
431
dotextview(char * av0)432 void dotextview(char *av0)
433 {
434 winTextview *wtw = new winTextview(20, 5, 40, 15, "winTextview");
435 if(wtw->import_file("sth.xxx")){
436 wtw->set_content("\n\n\n\n\n\n Can't open file: "
437 "\033f4sth.xxx\033f! :(");
438 }
439 wtw->run();
440 delete wtw;
441 }
442
443
444
bottom_line_dr(void)445 void bottom_line_dr(void){
446 center(CON_ROWS,
447 "\033b0\033f8\x0b0\x0b1\x0b2"
448 "\033f7\x0b1\x0b2\x0db"
449 "\033b7\033fFUse the arrow keys!"
450 "\033b0\033f7\x0db\x0b2\x0b1"
451 "\033f8\x0b2\x0b1\x0b0");
452 }
453
454 #define NUMPHASES 4
455 char phases[NUMPHASES] = {'|', '/', '-', '\\'};
456 int current_phase = 0;
457
supme(key k,element_type et,void * ptr)458 key supme(key k, element_type et, void *ptr){
459 gotoxy(CON_COLS, 1);
460 writech(phases[current_phase++]);
461 current_phase %= NUMPHASES;
462 return k;
463 }
464
465
466
main(int argc,char ** argv)467 int main(int argc, char **argv)
468 {
469 if(argc>1) {
470 xmem_want_debug = 1;
471 }
472
473 // init console
474 initcons();
475 clrscr();
476
477 #ifndef _WIN32
478 register_key(KEY_F(1), dflt_glkh, 0);
479 register_key(KEY_F(2), dflt_glkh2, 0);
480 register_key(KEY_F(3), dflt_glkh2, 0);
481 register_key(KEY_F(4), dflt_glkh2, 0);
482 #endif
483 register_key(KEY_SUPERVISE, supme, 0);
484
485 menu *myMenu = new menu(
486 new menuItem("About", 1),
487 new menuItem("Test Dialog", 2),
488 new menuItem("Test Horizontal Menu", 3),
489 new menuItem("Test Listing", 4),
490 new menuItem("Test TextArea", 5),
491 new menuItem("Test Progress Bar", 6),
492 new menuItem("Test Textviewer", 7),
493 new menuItem("Test Textview (new)", 9),
494 new menuItem("Theme change", 8),
495 new menuSeparator(),
496 new menuItem("Quit", 99),
497 NULL);
498 myMenu->x = 3;
499 myMenu->y = 10;
500 custom *bottom_line = new custom(&bottom_line_dr, NULL);
501 bottom_line->visible = true;
502
503 int ch;
504 do {
505 setcolor(LightGray, Black);
506 clrscr();
507
508 bottom_line->draw();
509 ch = myMenu->getchoice();
510 switch (ch) {
511 case 1:/* About */
512 doabout(); break;
513
514 case 2:/* Dialog */
515 myMenu->visible = true;
516 dodlg();
517 myMenu->visible = false;
518 break;
519
520 case 3:/* HMenu */
521 bottom_line->visible = false;
522 dodlg2();
523 bottom_line->visible = true;
524 break;
525
526 case 4:/* Listing */
527 bottom_line->visible = false;
528 dodlg3();
529 bottom_line->visible = true;
530 break;
531
532 case 5:/* TextArea */
533 myMenu->visible = true;
534 dodlg4();
535 myMenu->visible = false;
536 break;
537
538 case 6:/* pBar */
539 myMenu->visible = true;
540 dopbar();
541 myMenu->visible = false;
542 break;
543
544 case 7:/* Textviewer */
545 bottom_line->visible = false;
546 doviewer();
547 bottom_line->visible = true;
548 break;
549
550 case 8:/* Theme selector */
551 myMenu->visible = true;
552 doscheme();
553 myMenu->visible = false;
554 break;
555 case 9:/* Textview */
556 myMenu->visible = true;
557 dotextview(argv[0]);
558 myMenu->visible = false;
559 break;
560
561 #if 0
562 case -1:/* ESC hit */
563 ch = 99;
564 break;
565 #endif
566 default: break;
567 };
568 } while(ch != 99);
569 delete myMenu;
570 delete bottom_line;
571
572 // Clear screen - it looks better
573 setcolor(LightGray, Black);
574 set_cursor(line);
575 clrscr();
576 update();
577
578 // finish up
579 donecons();
580 return 0;
581 }
582
583