home *** CD-ROM | disk | FTP | other *** search
/ Virtual Reality Zone / VRZONE.ISO / mac / PC / PCGLOVE / GLOVE / OBJGLV.ZIP / SRC / DEMO4B / USERINT / USERINT.CPP < prev   
C/C++ Source or Header  |  1992-10-31  |  3KB  |  139 lines

  1. /* User interface routines for 3DVIEW */
  2.  
  3. /* Written by Bernie Roehl, January 1992 (broehl@sunee.waterloo.edu) */
  4.  
  5. /* Copyright 1992 by Dave Stampe and Bernie Roehl.
  6.    May be freely used to write software for release into the public domain;
  7.    all commercial endeavours MUST contact Bernie Roehl and Dave Stampe
  8.    for permission to incorporate any part of this software into their
  9.    products!
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <ctype.h>
  14. #include <string.h>
  15.  
  16. #include "rend386.hpp"
  17. #include "userint.hpp"
  18. #include "pointer.hpp"
  19. #include "cursor.hpp"
  20. #include "render.hpp"
  21. #include "keyboard.hpp"
  22.  
  23. /* Colors */
  24. #define INTERIOR   4
  25. #define TEXT      14
  26.  
  27. #define TEXTHEIGHT 8
  28. #define TEXTWIDTH 8
  29.  
  30. extern int left_page, right_page;
  31. extern PDRIVER *menu_device;
  32.  
  33. void neatbox(int w, int h, int *x, int *y)
  34. {
  35.     extern int v_page;
  36.     *x = (screeninfo->xcent - (w >> 1)) & 0x0FF8;
  37.     *y = screeninfo->ycent - (h >> 1);
  38.     right_page = left_page = v_page; /* stop stereo for now */
  39.     user_box(*x-2, *y-2, *x+w+8, *y+h+8, 0);
  40.     user_box(*x-5, *y-5, *x+w+5, *y+h+5, INTERIOR);
  41. }
  42.  
  43. void poptext(char *text[])
  44. {
  45.     int i, h = 0, w = 0, x, y, page;
  46.     page = cursor_hide();
  47.     for (i = 0; text[i]; ++i) {
  48.         h += TEXTHEIGHT;
  49.         if (strlen(text[i])*TEXTWIDTH > w)
  50.             w = strlen(text[i])*TEXTWIDTH;
  51.     }
  52.     if (w > 300) w = 300;
  53.     neatbox(w , h , &x, &y);
  54.     for (i = 0; text[i]; ++i) {
  55.         user_text(x, y, TEXT, text[i]);
  56.         y += TEXTHEIGHT;
  57.     }
  58.     cursor_show(page);
  59. }
  60.  
  61. int menu(char *text[]) /* returns number (0--n) of entry clicked on */
  62. {
  63.     int i, h = 0, w = 0, x, y, page;
  64.     int top;
  65.     unsigned buttons;
  66.     int num = 0;
  67.     page = cursor_hide();
  68.     for (i = 0; text[i]; ++i)
  69.     {
  70.         h += TEXTHEIGHT;
  71.         if (strlen(text[i])*TEXTWIDTH > w)
  72.             w = strlen(text[i])*TEXTWIDTH;
  73.     }
  74.     if (w > 300) w = 300;
  75.     neatbox(w, h, &x, &y);
  76.     top = y;
  77.     for (i = 0; text[i]; ++i)
  78.     {
  79.         user_text(x, y, TEXT, text[i]);
  80.         y += TEXTHEIGHT;
  81.         num++;
  82.     }
  83.     cursor_show(page);
  84.     do {
  85.         while (move_2D(menu_device, &x, &y, &buttons) == 0);
  86.         do { 
  87.             move_2D(menu_device,&x, &y, &buttons); 
  88.         }
  89.         while (!buttons);
  90.         do { 
  91.             move_2D(menu_device,&x, &y, &buttons); 
  92.         }
  93.         while (buttons);
  94.         i = (y-top) / TEXTHEIGHT;
  95.     }
  96.     while ((i < 0) || (i >= num));
  97.     return(i);
  98. }
  99.  
  100. void popmsg(char *msg)
  101. {
  102.     int x, y, page;
  103.     page = cursor_hide();
  104.     neatbox(strlen(msg)*TEXTWIDTH+16, TEXTHEIGHT+16, &x, &y);
  105.     user_text(x+8, y+8, TEXT, msg);
  106.     cursor_show(page);
  107. }
  108.  
  109. unsigned askfor(char *prompt, char *buff, int n)
  110. {
  111.     unsigned c, page;
  112.     int x, y, i;
  113.  
  114.     page = cursor_hide();
  115.     neatbox(strlen(prompt)*TEXTWIDTH + n * TEXTWIDTH + 10,
  116.     TEXTHEIGHT + 10, &x, &y);
  117.     user_text(x, y, TEXT, prompt);
  118.     x += strlen(prompt) * TEXTWIDTH;
  119.     buff[i = 0] = '\0';
  120.     while ((c = getkey()) != 0x1B)
  121.     {
  122.         if (c == '\r') break;
  123.         if (c == '\b' && i > 0)
  124.         {
  125.             user_box(x, y, x+TEXTWIDTH*strlen(buff), y+TEXTHEIGHT, INTERIOR);
  126.             buff[--i] = '\0';
  127.             user_text(x, y, TEXT,buff);
  128.         }
  129.         if (isprint(c) && i < n)
  130.         {
  131.             buff[i++] = c;
  132.             buff[i] = '\0';
  133.             user_text(x, y, TEXT, buff);
  134.         }
  135.     }
  136.     cursor_show(page);
  137.     return c;
  138. }
  139.