gui.cpp 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. /* Written by Bill Brown, USACERL (brown@zorro.cecer.army.mil)
  2. * May 2-12, 1994
  3. *
  4. * This code is in the public domain. Specifically, we give to the public
  5. * domain all rights for future licensing of the source code, all resale
  6. * rights, and all publishing rights.
  7. *
  8. * We ask, but do not require, that the following message be included in
  9. * all derived works:
  10. * "Portions developed at the US Army Construction Engineering
  11. * Research Laboratories, Champaign, Illinois."
  12. *
  13. * USACERL GIVES NO WARRANTY, EXPRESSED OR IMPLIED,
  14. * FOR THE SOFTWARE AND/OR DOCUMENTATION PROVIDED, INCLUDING, WITHOUT
  15. * LIMITATION, WARRANTY OF MERCHANTABILITY AND WARRANTY OF FITNESS FOR A
  16. * PARTICULAR PURPOSE.
  17. */
  18. #include <stdlib.h>
  19. #include <wx/button.h>
  20. #include <wx/bmpbuttn.h>
  21. #include <wx/bitmap.h>
  22. #include <wx/sizer.h>
  23. #include <wx/strconv.h>
  24. #include <wx/event.h>
  25. #include <wx/dcclient.h>
  26. #include <wx/dc.h>
  27. #include <wx/colour.h>
  28. #include "gui.h"
  29. #include "bitmaps/rewind.xbm"
  30. #include "bitmaps/rplay.xbm"
  31. #include "bitmaps/stepb.xbm"
  32. #include "bitmaps/stop.xbm"
  33. #include "bitmaps/stepf.xbm"
  34. #include "bitmaps/play.xbm"
  35. #include "bitmaps/loop.xbm"
  36. #include "bitmaps/swing.xbm"
  37. #include "bitmaps/snail.xbm"
  38. #include "bitmaps/rabbit.xbm"
  39. enum {
  40. MYID_REW,
  41. MYID_RPLAY,
  42. MYID_STEPB,
  43. MYID_STOP,
  44. MYID_STEPF,
  45. MYID_PLAY,
  46. MYID_LOOP,
  47. MYID_SWING,
  48. MYID_SLOWER,
  49. MYID_FASTER,
  50. MYID_SHNAMES,
  51. MYID_DOEXIT,
  52. };
  53. BEGIN_EVENT_TABLE(MyCanvas, wxPanel)
  54. EVT_ERASE_BACKGROUND(MyCanvas::erase)
  55. END_EVENT_TABLE()
  56. MyCanvas::MyCanvas(wxWindow *parent, wxWindowID id, const wxSize &size)
  57. : wxPanel(parent, id, wxDefaultPosition, size)
  58. {
  59. SetBackgroundStyle(wxBG_STYLE_CUSTOM);
  60. }
  61. void MyCanvas::erase(wxEraseEvent &ev)
  62. {
  63. ev.GetDC();
  64. }
  65. void MyCanvas::draw_image(wxBitmap *bmp)
  66. {
  67. wxClientDC dc(this);
  68. dc.DrawBitmap(*bmp, 0, 0, false);
  69. }
  70. void MyCanvas::draw_text(int style, int x, int y, const char *str)
  71. {
  72. wxClientDC dc(this);
  73. switch (style) {
  74. case 1:
  75. dc.SetTextBackground(*wxWHITE);
  76. dc.SetTextForeground(*wxBLACK);
  77. break;
  78. case 2:
  79. dc.SetTextBackground(*wxBLACK);
  80. dc.SetTextForeground(*wxWHITE);
  81. break;
  82. default:
  83. return;
  84. }
  85. dc.DrawText(wxString(str, wxConvISO8859_1), x, y);
  86. }
  87. BEGIN_EVENT_TABLE(MyFrame, wxFrame)
  88. EVT_BUTTON(MYID_REW, MyFrame::rewind_callback)
  89. EVT_BUTTON(MYID_RPLAY, MyFrame::rplay_callback)
  90. EVT_BUTTON(MYID_STEPB, MyFrame::stepb_callback)
  91. EVT_BUTTON(MYID_STOP, MyFrame::stop_callback)
  92. EVT_BUTTON(MYID_STEPF, MyFrame::stepf_callback)
  93. EVT_BUTTON(MYID_PLAY, MyFrame::play_callback)
  94. EVT_BUTTON(MYID_LOOP, MyFrame::loop_callback)
  95. EVT_BUTTON(MYID_SWING, MyFrame::swing_callback)
  96. EVT_BUTTON(MYID_SLOWER, MyFrame::slower_callback)
  97. EVT_BUTTON(MYID_FASTER, MyFrame::faster_callback)
  98. EVT_BUTTON(MYID_SHNAMES, MyFrame::names_callback)
  99. EVT_BUTTON(MYID_DOEXIT, MyFrame::exit_callback)
  100. END_EVENT_TABLE()
  101. void MyFrame::make_buttons(wxSizer *sizer)
  102. {
  103. sizer->Add(new wxBitmapButton(this, MYID_REW , wxBitmap(rewind_bits, rewind_width, rewind_height)));
  104. sizer->Add(new wxBitmapButton(this, MYID_RPLAY , wxBitmap(rplay_bits , rplay_width , rplay_height )));
  105. sizer->Add(new wxBitmapButton(this, MYID_STEPB , wxBitmap(stepb_bits , stepb_width , stepb_height )));
  106. sizer->Add(new wxBitmapButton(this, MYID_STOP , wxBitmap(stop_bits , stop_width , stop_height )));
  107. sizer->Add(new wxBitmapButton(this, MYID_STEPF , wxBitmap(stepf_bits , stepf_width , stepf_height )));
  108. sizer->Add(new wxBitmapButton(this, MYID_PLAY , wxBitmap(play_bits , play_width , play_height )));
  109. sizer->Add(new wxBitmapButton(this, MYID_LOOP , wxBitmap(loop_bits , loop_width , loop_height )));
  110. sizer->Add(new wxBitmapButton(this, MYID_SWING , wxBitmap(swing_bits , swing_width , swing_height )));
  111. sizer->Add(new wxBitmapButton(this, MYID_SLOWER, wxBitmap(snail_bits , snail_width , snail_height )));
  112. sizer->Add(new wxBitmapButton(this, MYID_FASTER, wxBitmap(rabbit_bits, rabbit_width, rabbit_height)));
  113. sizer->Add(new wxButton(this, MYID_SHNAMES, wxString("Names", wxConvISO8859_1)));
  114. sizer->Add(new wxButton(this, MYID_DOEXIT, wxString("Exit", wxConvISO8859_1)));
  115. }
  116. void MyFrame::rewind_callback(wxCommandEvent &event)
  117. {
  118. cd->step = 0;
  119. cd->stop = 1;
  120. cd->rewind = 1;
  121. }
  122. void MyFrame::rplay_callback(wxCommandEvent &event)
  123. {
  124. cd->step = 0;
  125. cd->stop = 0;
  126. cd->direction = -1;
  127. cd->curframe = cd->prevframe + cd->direction;
  128. }
  129. void MyFrame::stepb_callback(wxCommandEvent &event)
  130. {
  131. cd->step = 1;
  132. cd->direction = -1;
  133. cd->curframe = cd->prevframe + cd->direction;
  134. }
  135. void MyFrame::stop_callback(wxCommandEvent &event)
  136. {
  137. cd->stop = 1;
  138. }
  139. void MyFrame::stepf_callback(wxCommandEvent &event)
  140. {
  141. cd->step = 1;
  142. cd->direction = 1;
  143. cd->curframe = cd->prevframe + cd->direction;
  144. }
  145. void MyFrame::play_callback(wxCommandEvent &event)
  146. {
  147. cd->step = 0;
  148. cd->stop = 0;
  149. cd->direction = 1;
  150. cd->curframe = cd->prevframe + cd->direction;
  151. }
  152. void MyFrame::loop_callback(wxCommandEvent &event)
  153. {
  154. cd->loop = !cd->loop;
  155. cd->swing = 0;
  156. cd->stop = !cd->loop;
  157. }
  158. void MyFrame::swing_callback(wxCommandEvent &event)
  159. {
  160. cd->swing = !cd->swing;
  161. cd->loop = 0;
  162. cd->stop = !cd->swing;
  163. }
  164. void MyFrame::slower_callback(wxCommandEvent &event)
  165. {
  166. if (cd->speed) {
  167. if (cd->speed < 200000)
  168. cd->speed *= 3;
  169. }
  170. else
  171. cd->speed = 1;
  172. }
  173. void MyFrame::faster_callback(wxCommandEvent &event)
  174. {
  175. if (cd->speed > 1)
  176. cd->speed /= 3;
  177. }
  178. void MyFrame::names_callback(wxCommandEvent &event)
  179. {
  180. cd->shownames = (1 + cd->shownames) % 3;
  181. }
  182. void MyFrame::exit_callback(wxCommandEvent &event)
  183. {
  184. exit(0);
  185. }
  186. void MyFrame::change_label(const char *label)
  187. {
  188. flabel->SetLabel(wxString(label, wxConvISO8859_1));
  189. }
  190. #if 0
  191. void MyFrame::init_graphics()
  192. {
  193. /* global variables */
  194. Widget canvas;
  195. Display *theDisplay;
  196. XImage *pic_array[MAXIMAGES];
  197. GC invertGC, drawGC;
  198. int scrn;
  199. Display *dpy;
  200. Window grwin;
  201. Colormap fixedcmap;
  202. unsigned long blackPix, whitePix;
  203. unsigned int depth;
  204. Visual *use_visual;
  205. dpy = XtDisplay(canvas);
  206. grwin = XtWindow(canvas);
  207. scrn = DefaultScreen(dpy);
  208. use_visual = DefaultVisual(dpy, scrn);
  209. #if 1
  210. fixedcmap = XCreateColormap(dpy, grwin, use_visual, AllocNone);
  211. #else
  212. fixedcmap = DefaultColormap(dpy, scrn);
  213. #endif
  214. fixedcmap = InitColorTableFixed(fixedcmap);
  215. XtVaGetValues(canvas, XmNdepth, &depth, NULL);
  216. XtVaSetValues(toplevel, XmNcolormap, fixedcmap, NULL);
  217. XtSetWMColormapWindows(toplevel, &canvas, 1);
  218. /**************************************************************/
  219. blackPix = _get_lookup_for_color(0, 0, 0);
  220. whitePix = _get_lookup_for_color(255, 255, 255);
  221. drawGC =
  222. XCreateGC(XtDisplay(canvas), XtWindow(canvas), (unsigned long)0,
  223. NULL);
  224. theDisplay = XtDisplay(toplevel);
  225. XSetFunction(theDisplay, drawGC, GXcopy);
  226. XSetForeground(theDisplay, drawGC, blackPix);
  227. XSetBackground(theDisplay, drawGC, whitePix);
  228. invertGC =
  229. XCreateGC(XtDisplay(canvas), XtWindow(canvas), (unsigned long)0,
  230. NULL);
  231. XSetFunction(theDisplay, invertGC, GXcopy);
  232. XSetForeground(theDisplay, invertGC, whitePix);
  233. XSetBackground(theDisplay, invertGC, blackPix);
  234. }
  235. #endif
  236. MyFrame::MyFrame(const wxString& title, int ncols, int nrows, struct gui_data *cd)
  237. : wxFrame((wxFrame *)NULL, wxID_ANY, title), cd(cd)
  238. {
  239. canvas = new MyCanvas(this, wxID_ANY, wxSize(ncols, nrows));
  240. wxBoxSizer *sizer, *buttons;
  241. if (ncols > nrows) {
  242. sizer = new wxBoxSizer(wxVERTICAL);
  243. buttons = new wxBoxSizer(wxHORIZONTAL);
  244. sizer->Add(canvas);
  245. sizer->Add(buttons);
  246. }
  247. else {
  248. sizer = new wxBoxSizer(wxHORIZONTAL);
  249. buttons = new wxBoxSizer(wxVERTICAL);
  250. sizer->Add(canvas);
  251. sizer->Add(buttons);
  252. }
  253. make_buttons(buttons);
  254. flabel = new wxStaticText(this, wxID_ANY, wxString("00000", wxConvISO8859_1), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT);
  255. buttons->Add(flabel);
  256. SetSizerAndFit(sizer);
  257. }