1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-11-04 08:17:17 -05:00
elinks/src/bfu/group.c
2005-10-21 09:14:07 +02:00

119 lines
2.7 KiB
C

/* Widget group implementation. */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <string.h>
#include "elinks.h"
#include "bfu/dialog.h"
#include "bfu/button.h"
#include "bfu/group.h"
#include "intl/gettext/libintl.h"
#include "terminal/draw.h"
#include "terminal/terminal.h"
#include "util/color.h"
void
dlg_format_group(struct terminal *term,
struct widget_data *widget_data,
int n, int x, int *y, int w, int *rw)
{
int space_between_widgets = 1;
int line_width = 0;
int xpos;
struct color_pair *color = get_bfu_color(term, "dialog.text");
assert(n > 0);
if_assert_failed return;
while (n--) {
int widget_width;
int width;
unsigned char *text = widget_data->widget->text;
int label_length = (text && *text) ? strlen(text) : 0;
int label_padding = (label_length > 0);
if (widget_data->widget->type == WIDGET_CHECKBOX) {
width = 3;
} else if (widget_is_textfield(widget_data)) {
width = widget_data->widget->datalen;
} else {
/* TODO: handle all widget types. */
widget_data++;
continue;
}
int_bounds(&label_length, 0, w - width - label_padding);
widget_width = width + label_padding + label_length;
if (line_width + widget_width > w) {
line_width = 0;
(*y) += 2; /* Next line */
}
xpos = x + line_width;
if (term) {
if (widget_data->widget->type == WIDGET_CHECKBOX) {
/* Draw text at right of checkbox. */
if (label_length)
draw_text(term, xpos + width + label_padding, *y,
text, label_length,
0, color);
set_box(&widget_data->box, xpos, *y, width, 1);
} else if (widget_is_textfield(widget_data)) {
/* Draw label at left of widget. */
if (label_length)
draw_text(term, xpos, *y,
text, label_length,
0, color);
set_box(&widget_data->box,
xpos + label_padding + label_length, *y,
width, 1);
}
}
line_width += widget_width;
if (rw) int_bounds(rw, line_width, w);
line_width += space_between_widgets;
widget_data++;
}
(*y)++;
}
void
group_layouter(struct dialog_data *dlg_data)
{
struct terminal *term = dlg_data->win->term;
int w = dialog_max_width(term);
int rw = int_min(w, strlen(dlg_data->dlg->title));
int y = 0;
int n = dlg_data->number_of_widgets - 2;
dlg_format_group(NULL, dlg_data->widgets_data, n,
0, &y, w, &rw);
y++;
dlg_format_buttons(NULL, dlg_data->widgets_data + n, 2, 0, &y, w,
&rw, ALIGN_CENTER);
w = rw;
draw_dialog(dlg_data, w, y);
y = dlg_data->box.y + DIALOG_TB + 1;
dlg_format_group(term, dlg_data->widgets_data, n,
dlg_data->box.x + DIALOG_LB, &y, w, NULL);
y++;
dlg_format_buttons(term, dlg_data->widgets_data + n, 2,
dlg_data->box.x + DIALOG_LB, &y, w, &rw, ALIGN_CENTER);
}