Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6865 serge 1
#include 
2
#include 
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