Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "winlib.h"
  4.  
  5. typedef struct
  6. {
  7.     ctrl_t   ctrl;
  8.  
  9.     uint32_t state;
  10.  
  11.     char     *caption;
  12.     int       capt_len;
  13. }button_t;
  14.  
  15. static void button_on_draw(button_t *btn)
  16. {
  17.     color_t color = 0xFFD7D7D7;
  18.     char t = (char)btn->ctrl.id;
  19.     rect_t rc, rci;
  20.  
  21.     if(btn->ctrl.style & 1)
  22.     {
  23.         send_message(btn->ctrl.parent, MSG_OWNERDRAW, btn, 0);
  24.         return;
  25.     }
  26.  
  27.     if(btn->state & bPressed)
  28.         color = 0xFFB0B0B0;
  29.     else if(btn->state & bHighlight)
  30.         color = 0xFFE7E7E7;
  31.  
  32.     rc = rci = btn->ctrl.rc;
  33.     rci.l++;
  34.     rci.t++;
  35.  
  36.     px_hline(btn->ctrl.ctx, rc.l, rc.t, btn->ctrl.w, 0xFF646464);
  37.     px_fill_rect(btn->ctrl.ctx,  &rci, color);
  38.     px_hline(btn->ctrl.ctx, rc.l, rc.b-1, btn->ctrl.w, 0xFF646464);
  39.     px_vline(btn->ctrl.ctx, rc.l, rc.t+1, btn->ctrl.h-2, 0xFF646464);
  40.     px_vline(btn->ctrl.ctx, rc.r-1, rc.t+1, btn->ctrl.h-2, 0xFF646464);
  41.  
  42.     rc.l+= 4;
  43.     rc.t+= 6;
  44.  
  45.     draw_text_ext(btn->ctrl.ctx, btn->ctrl.font, btn->caption, btn->capt_len, &rc, 0xFF000000);
  46. };
  47.  
  48. static void button_on_mouseenter(button_t *btn)
  49. {
  50.     btn->state|= bHighlight;
  51.     send_message(&btn->ctrl, MSG_DRAW, 0, 0);
  52. }
  53.  
  54. static void button_on_mouseleave(button_t *btn)
  55. {
  56.     if( (ctrl_t*)btn != mouse_capture) {
  57.         btn->state &= ~bHighlight;
  58.         send_message(&btn->ctrl, MSG_DRAW, 0, 0);
  59.     };
  60. }
  61.  
  62. static void button_on_lbuttondown(button_t *btn, int x, int y)
  63. {
  64.     capture_mouse((ctrl_t*)btn);
  65.     btn->state|= bPressed;
  66.     send_message(&btn->ctrl, MSG_DRAW, 0, 0);
  67. };
  68.  
  69. static void button_on_lbuttonup(button_t *btn, int x, int y)
  70. {
  71.     int action;
  72.  
  73.     action = (btn->state & bPressed) ? MSG_COMMAND : 0;
  74.  
  75.     release_mouse();
  76.  
  77.     if( pt_in_rect( &btn->ctrl.rc, x, y) )
  78.         btn->state = bHighlight;
  79.     else
  80.         btn->state = 0;
  81.  
  82.     send_message(&btn->ctrl, MSG_DRAW, 0, 0);
  83.  
  84.     if(action)
  85.         send_message(btn->ctrl.parent,MSG_COMMAND,btn->ctrl.id,(int)btn);
  86. };
  87.  
  88. static void button_on_mousemove(button_t *btn, int x, int y)
  89. {
  90.     int  old_state;
  91.  
  92.     if( !(btn->state & bHighlight))
  93.     {
  94.         btn->state|= bHighlight;
  95.         send_message(&btn->ctrl, MSG_DRAW, 0, 0);
  96.     };
  97.  
  98.     if( (ctrl_t*)btn != mouse_capture)
  99.         return;
  100.  
  101.     old_state = btn->state;
  102.  
  103.     if( pt_in_rect(&btn->ctrl.rc, x, y) )
  104.         btn->state |= bPressed;
  105.     else
  106.         btn->state &= ~bPressed;
  107.  
  108.     if( old_state ^ btn->state)
  109.         send_message(&btn->ctrl, MSG_DRAW, 0, 0);
  110. }
  111.  
  112. int button_proc(ctrl_t *ctrl, uint32_t msg, uint32_t arg1, uint32_t arg2)
  113. {
  114.     button_t *btn = (button_t*)ctrl;
  115.  
  116.     switch( msg )
  117.     {
  118.         HANDLE_MSG(btn, MSG_DRAW, button_on_draw);
  119.         HANDLE_MSG(btn, MSG_MOUSEENTER, button_on_mouseenter);
  120.         HANDLE_MSG(btn, MSG_MOUSELEAVE, button_on_mouseleave);
  121.         HANDLE_MSG(btn, MSG_LBTNDOWN, button_on_lbuttondown);
  122.         HANDLE_MSG(btn, MSG_LBTNDBLCLK, button_on_lbuttondown);
  123.         HANDLE_MSG(btn, MSG_LBTNUP, button_on_lbuttonup);
  124.         HANDLE_MSG(btn, MSG_MOUSEMOVE, button_on_mousemove);
  125.     }
  126.     return 0;
  127. };
  128.  
  129. ctrl_t *create_button(char *caption, uint32_t style, int id, int x, int y,
  130.                       int w, int h, ctrl_t *parent)
  131. {
  132.     button_t  *btn;
  133.     int        len;
  134.  
  135.     if( !parent )
  136.         return NULL;
  137.  
  138.     btn = create_control(sizeof(button_t), id, x, y, w, h, parent);
  139.     btn->ctrl.style = style;
  140.     btn->ctrl.handler = button_proc;
  141.     btn->state = 0;
  142.     btn->caption = caption;
  143.  
  144.     if( !caption )
  145.         btn->capt_len = 0;
  146.     else
  147.     {
  148.         len = strlen(caption);
  149.         btn->capt_len = len;
  150.         if( len )
  151.             btn->caption = strdup(caption);
  152.         else
  153.             btn->caption = NULL;
  154.     }
  155.  
  156.     return &btn->ctrl;
  157. };
  158.  
  159.