home *** CD-ROM | disk | FTP | other *** search
/ Geek 6 / Geek-006.iso / linux / video / xmovie-1.5.3.tar.gz / xmovie-1.5.3.tar / xmovie-1.5.3 / guicast / bcbutton.C < prev    next >
C/C++ Source or Header  |  2000-11-29  |  6KB  |  314 lines

  1. #include "bcbutton.h"
  2. #include "bcresources.h"
  3. #include "bcpixmap.h"
  4. #include "colors.h"
  5. #include "fonts.h"
  6. #include "keys.h"
  7. #include "vframe.h"
  8.  
  9. #include <string.h>
  10.  
  11. #define BUTTON_UP 0
  12. #define BUTTON_UPHI 1
  13. #define BUTTON_DOWNHI 2
  14.  
  15. BC_Button::BC_Button(int x, int y, 
  16.     VFrame **data)
  17.  : BC_SubWindow(x, y, 0, 0, -1)
  18. {
  19.     this->data = data;
  20.     for(int i = 0; i < 9; i++) images[i] = 0;
  21.     status = BUTTON_UP;
  22. }
  23.  
  24.  
  25. BC_Button::~BC_Button()
  26. {
  27.     for(int i = 0; i < 9; i++) if(images[i]) delete images[i];
  28. }
  29.  
  30.  
  31.  
  32. int BC_Button::initialize()
  33. {
  34. // Get the image
  35.     set_images(data);
  36.  
  37. // Create the subwindow
  38.     BC_SubWindow::initialize();
  39.  
  40. // Display the bitmap
  41.     draw_face();
  42.     return 0;
  43. }
  44.  
  45. int BC_Button::reposition_window(int x, int y)
  46. {
  47.     BC_WindowBase::reposition_window(x, y);
  48.     return 0;
  49. }
  50.  
  51.  
  52. int BC_Button::update_bitmaps(VFrame **data)
  53. {
  54.     this->data = data;
  55.     set_images(data);
  56.     draw_top_background(parent_window, 0, 0, w, h);
  57.     draw_face();
  58.     return 0;
  59. }
  60.  
  61. int BC_Button::set_images(VFrame **data)
  62. {
  63.     for(int i = 0; i < 3; i++)
  64.     {
  65.         if(images[i]) delete images[i];
  66.         images[i] = new BC_Pixmap(parent_window, data[i], PIXMAP_ALPHA);
  67.     }
  68.     w = images[BUTTON_UP]->get_w();
  69.     h = images[BUTTON_UP]->get_h();
  70.     return 0;
  71. }
  72.  
  73. int BC_Button::draw_face()
  74. {
  75.     draw_top_background(parent_window, 0, 0, w, h);
  76.     images[status]->write_drawable(pixmap, 
  77.             0, 
  78.             0,
  79.             w,
  80.             h,
  81.             0,
  82.             0);
  83.     flash();
  84.     return 0;
  85. }
  86.  
  87. int BC_Button::repeat_event(long duration)
  88. {
  89.     if(duration == top_level->get_resources()->tooltip_delay &&
  90.         tooltip_text[0] != 0 &&
  91.         status == BUTTON_UPHI &&
  92.         !tooltip_done)
  93.     {
  94.         show_tooltip();
  95.         tooltip_done = 1;
  96.         return 1;
  97.     }
  98.     return 0;
  99. }
  100.  
  101. int BC_Button::cursor_enter_event()
  102. {
  103.     if(top_level->event_win == win)
  104.     {
  105.         tooltip_done = 0;
  106.         if(top_level->button_down)
  107.         {
  108.             status = BUTTON_DOWNHI;
  109.         }
  110.         else
  111.         if(status == BUTTON_UP) status = BUTTON_UPHI;
  112.         draw_face();
  113.     }
  114.     return 0;
  115. }
  116.  
  117. int BC_Button::cursor_leave_event()
  118. {
  119.     if(status == BUTTON_UPHI)
  120.     {
  121.         status = BUTTON_UP;
  122.         draw_face();
  123.         hide_tooltip();
  124.     }
  125.     return 0;
  126. }
  127.  
  128. int BC_Button::button_press_event()
  129. {
  130.     if(top_level->event_win == win)
  131.     {
  132.         top_level->hide_tooltip();
  133.         if(status == BUTTON_UPHI || status == BUTTON_UP) status = BUTTON_DOWNHI;
  134.         draw_face();
  135.         return 1;
  136.     }
  137.     return 0;
  138. }
  139.  
  140. int BC_Button::button_release_event()
  141. {
  142.     if(top_level->event_win == win)
  143.     {
  144.         hide_tooltip();
  145.         if(status == BUTTON_DOWNHI) 
  146.         {
  147.             status = BUTTON_UPHI;
  148.             draw_face();
  149.  
  150.             if(cursor_inside())
  151.             {
  152.                 handle_event();
  153.                 return 1;
  154.             }
  155.         }
  156.     }
  157.     return 0;
  158. }
  159.  
  160. int BC_Button::cursor_motion_event()
  161. {
  162.     if(top_level->button_down && top_level->event_win == win && 
  163.         status == BUTTON_DOWNHI && !cursor_inside())
  164.     {
  165.         status = BUTTON_UP;
  166.         draw_face();
  167.     }
  168.     return 0;
  169. }
  170.  
  171.  
  172. BC_OKButton::BC_OKButton(int x, int y)
  173.  : BC_Button(x, y, 
  174.      BC_WindowBase::get_resources()->ok_images)
  175. {
  176. }
  177.  
  178. BC_OKButton::BC_OKButton(BC_WindowBase *parent_window)
  179.  : BC_Button(10, 
  180.      parent_window->get_h() - BC_WindowBase::get_resources()->cancel_images[0]->get_h() - 10, 
  181.      BC_WindowBase::get_resources()->ok_images)
  182. {
  183. }
  184.  
  185. int BC_OKButton::handle_event()
  186. {
  187.     get_top_level()->set_done(0);
  188.     return 0;
  189. }
  190.  
  191. int BC_OKButton::keypress_event()
  192. {
  193.     if(get_keypress() == RETURN) return handle_event();
  194.     return 0;
  195. }
  196.  
  197. BC_CancelButton::BC_CancelButton(int x, int y)
  198.  : BC_Button(x, y, 
  199.      BC_WindowBase::get_resources()->cancel_images)
  200. {
  201. }
  202.  
  203. BC_CancelButton::BC_CancelButton(BC_WindowBase *parent_window)
  204.  : BC_Button(parent_window->get_w() - BC_WindowBase::get_resources()->cancel_images[0]->get_w() - 10, 
  205.      parent_window->get_h() - BC_WindowBase::get_resources()->cancel_images[0]->get_h() - 10, 
  206.      BC_WindowBase::get_resources()->cancel_images)
  207. {
  208. }
  209.  
  210. int BC_CancelButton::handle_event()
  211. {
  212.     get_top_level()->set_done(1);
  213.     return 1;
  214. }
  215.  
  216. int BC_CancelButton::keypress_event()
  217. {
  218.     if(get_keypress() == ESC) return handle_event();
  219.     return 0;
  220. }
  221.  
  222.  
  223.  
  224.  
  225. #define LEFT_DN  0
  226. #define LEFT_HI  1
  227. #define LEFT_UP  2
  228. #define MID_DN   3
  229. #define MID_HI   4
  230. #define MID_UP   5
  231. #define RIGHT_DN 6
  232. #define RIGHT_HI 7
  233. #define RIGHT_UP 8
  234.  
  235. BC_GenericButton::BC_GenericButton(int x, int y, char *text)
  236.  : BC_Button(x, y, BC_WindowBase::get_resources()->generic_button_images)
  237. {
  238.     strcpy(this->text, text);
  239. }
  240.  
  241. int BC_GenericButton::set_images(VFrame **data)
  242. {
  243.     for(int i = 0; i < 9; i++)
  244.     {
  245.         if(images[i]) delete images[i];
  246.         images[i] = new BC_Pixmap(parent_window, data[i], PIXMAP_ALPHA);
  247.     }
  248.     w = get_text_width(MEDIUMFONT, text) + images[LEFT_UP]->get_w() + images[RIGHT_UP]->get_w();
  249.     h = images[BUTTON_UP]->get_h();
  250.     return 0;
  251. }
  252.  
  253. int BC_GenericButton::draw_face()
  254. {
  255.     draw_top_background(parent_window, 0, 0, w, h);
  256.  
  257.     for(int i = 0; i < get_w(); )
  258.     {
  259. // Get image to draw
  260.         int image_number = 0;
  261.         int left_boundary = images[LEFT_UP]->get_w_fixed();
  262.         int right_boundary = get_w() - images[RIGHT_UP]->get_w_fixed();
  263.  
  264.         if(i < left_boundary)
  265.         {
  266.             image_number = LEFT_DN;
  267.         }
  268.         else
  269.         if(i < right_boundary)
  270.         {
  271.             image_number = MID_DN;
  272.         }
  273.         else
  274.             image_number = RIGHT_DN;
  275.  
  276.         if(status == BUTTON_UP) image_number += 2;
  277.         else
  278.         if(status == BUTTON_UPHI) image_number += 1;
  279.  
  280.         int output_w = images[image_number]->get_w_fixed();
  281.  
  282.         if(i < left_boundary)
  283.         {
  284.             if(i + output_w > left_boundary) output_w = left_boundary - i;
  285.         }
  286.         else
  287.         if(i < right_boundary)
  288.         {
  289.             if(i + output_w > right_boundary) output_w = right_boundary - i;
  290.         }
  291.         else
  292.             if(i + output_w > get_w()) output_w = get_w() - i;
  293.  
  294.         images[image_number]->write_drawable(pixmap, 
  295.                 i, 
  296.                 0,
  297.                 output_w,
  298.                 h,
  299.                 0,
  300.                 0);
  301.  
  302.         set_color(BLACK);
  303.         set_font(MEDIUMFONT);
  304.         draw_center_text(get_w() / 2, 
  305.             (int)((float)get_h() / 2 + get_text_ascent(MEDIUMFONT) / 2 - 2), 
  306.             text);
  307.  
  308.         i += output_w;
  309.     }
  310.  
  311.     flash();
  312.     return 0;
  313. }
  314.