big dialogs: set_curosr2 -> set_dlg_cursor.
[elinks.git] / src / bfu / checkbox.c
blob25107eccbd48742009156a40f6239895df7c9111
1 /* Checkbox widget handlers. */
3 #ifdef HAVE_CONFIG_H
4 #include "config.h"
5 #endif
7 #include "elinks.h"
9 #include "bfu/button.h"
10 #include "bfu/checkbox.h"
11 #include "bfu/dialog.h"
12 #include "bfu/text.h"
13 #include "intl/gettext/libintl.h"
14 #include "terminal/draw.h"
15 #include "terminal/mouse.h"
16 #include "terminal/terminal.h"
18 #define CHECKBOX_HEIGHT 1
19 #define CHECKBOX_LEN 3 /* "[X]" or "(X)" */
20 #define CHECKBOX_SPACING 1 /* "[X]" + " " + "Label" */
21 #define CHECKBOX_LS (CHECKBOX_LEN + CHECKBOX_SPACING) /* "[X] " */
23 void
24 add_dlg_radio_do(struct dialog *dlg, unsigned char *text,
25 int groupid, int groupnum, int *data)
27 struct widget *widget = &dlg->widgets[dlg->number_of_widgets++];
29 widget->type = WIDGET_CHECKBOX;
30 widget->text = text;
31 widget->datalen = sizeof(*data);
32 widget->data = (void *) data;
34 widget->info.checkbox.gid = groupid;
35 widget->info.checkbox.gnum = groupnum;
38 void
39 dlg_format_checkbox(struct terminal *term, struct dialog_data *dlg_data,
40 struct widget_data *widget_data,
41 int x, int *y, int w, int *rw,
42 enum format_align align, int format_only)
44 unsigned char *text = widget_data->widget->text;
46 set_box(&widget_data->box, x, *y, CHECKBOX_LEN, CHECKBOX_HEIGHT);
48 if (w <= CHECKBOX_LS) return;
50 if (text && *text) {
51 if (rw) *rw -= CHECKBOX_LS;
52 dlg_format_text_do(dlg_data, text, x + CHECKBOX_LS, y,
53 w - CHECKBOX_LS, rw,
54 get_bfu_color(term, "dialog.checkbox-label"),
55 align, format_only);
56 if (rw) *rw += CHECKBOX_LS;
60 static widget_handler_status_T
61 display_checkbox(struct dialog_data *dlg_data, struct widget_data *widget_data)
63 struct terminal *term = dlg_data->win->term;
64 struct color_pair *color;
65 unsigned char *text;
66 struct box *pos = &widget_data->box;
67 int selected = is_selected_widget(dlg_data, widget_data);
69 if (selected) {
70 color = get_bfu_color(term, "dialog.checkbox-selected");
71 } else {
72 color = get_bfu_color(term, "dialog.checkbox");
74 if (!color) return EVENT_PROCESSED;
76 if (widget_data->info.checkbox.checked)
77 text = widget_data->widget->info.checkbox.gid ? "(X)" : "[X]";
78 else
79 text = widget_data->widget->info.checkbox.gid ? "( )" : "[ ]";
81 draw_dlg_text(term, dlg_data, pos->x, pos->y, text, CHECKBOX_LEN, 0, color);
83 if (selected) {
84 set_dlg_cursor(term, dlg_data, pos->x + 1, pos->y, 1);
85 set_dlg_window_ptr(dlg_data, dlg_data->win, pos->x, pos->y);
88 return EVENT_PROCESSED;
91 static widget_handler_status_T
92 init_checkbox(struct dialog_data *dlg_data, struct widget_data *widget_data)
94 int *cdata = (int *) widget_data->cdata;
96 assert(cdata);
98 if (widget_data->widget->info.checkbox.gid) {
99 if (*cdata == widget_data->widget->info.checkbox.gnum)
100 widget_data->info.checkbox.checked = 1;
101 } else {
102 if (*cdata)
103 widget_data->info.checkbox.checked = 1;
105 return EVENT_PROCESSED;
108 static widget_handler_status_T
109 mouse_checkbox(struct dialog_data *dlg_data, struct widget_data *widget_data)
111 struct terminal *term = dlg_data->win->term;
112 struct term_event *ev = dlg_data->term_event;
114 if (check_mouse_wheel(ev)
115 || !check_mouse_position(ev, &widget_data->box))
116 return EVENT_NOT_PROCESSED;
118 select_widget(dlg_data, widget_data);
120 do_not_ignore_next_mouse_event(term);
122 if (check_mouse_action(ev, B_UP) && widget_data->widget->ops->select)
123 widget_data->widget->ops->select(dlg_data, widget_data);
125 return EVENT_PROCESSED;
128 static widget_handler_status_T
129 select_checkbox(struct dialog_data *dlg_data, struct widget_data *widget_data)
131 if (!widget_data->widget->info.checkbox.gid) {
132 /* Checkbox. */
133 int *cdata = (int *) widget_data->cdata;
135 assert(cdata);
137 widget_data->info.checkbox.checked = *cdata = !*cdata;
139 } else {
140 /* Group of radio buttons. */
141 struct widget_data *wdata;
143 foreach_widget(dlg_data, wdata) {
144 int *cdata = (int *) wdata->cdata;
146 if (wdata->widget->type != WIDGET_CHECKBOX)
147 continue;
149 if (wdata->widget->info.checkbox.gid
150 != widget_data->widget->info.checkbox.gid)
151 continue;
153 assert(cdata);
155 *cdata = widget_data->widget->info.checkbox.gnum;
156 wdata->info.checkbox.checked = 0;
157 display_widget(dlg_data, wdata);
159 widget_data->info.checkbox.checked = 1;
161 display_widget(dlg_data, widget_data);
163 return EVENT_PROCESSED;
166 const struct widget_ops checkbox_ops = {
167 display_checkbox,
168 init_checkbox,
169 mouse_checkbox,
170 NULL,
171 select_checkbox,
172 NULL,