1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-06-20 00:15:31 +00:00
elinks/src/bfu/group.c
Witold Filipczyk c086cbe26e [color] Removed code related to draw_text_node
This idea failed. Code was slow.
2022-10-16 15:18:34 +02:00

178 lines
3.9 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/libintl.h"
#include "terminal/draw.h"
#include "terminal/terminal.h"
#include "util/color.h"
/* Same as in src/bfu/checkbox.c */
#define CHECKBOX_LEN 3 /* "[X]" or "(X)" */
void
dlg_format_group(struct dialog_data *dlg_data,
struct widget_data *widget_data,
int n, int x, int *y, int w, int *rw, int format_only)
{
struct terminal *term = dlg_data->win->term;
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;
char *text = widget_data->widget->text;
int label_length;
int label_padding;
#ifdef CONFIG_UTF8
if (term->utf8_cp) {
if (text && *text)
label_length = utf8_ptr2cells(text, NULL);
else
label_length = 0;
} else
#endif /* CONFIG_UTF8 */
label_length = (text && *text) ? strlen(text) : 0;
label_padding = (label_length > 0);
if (widget_data->widget->type == WIDGET_CHECKBOX) {
width = CHECKBOX_LEN;
} else if (widget_is_textfield(widget_data)) {
#ifdef CONFIG_UTF8
if (term->utf8_cp) {
width = utf8_ptr2cells((char *)widget_data->widget->data,
NULL);
} else
#endif /* CONFIG_UTF8 */
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 (!format_only) {
if (widget_data->widget->type == WIDGET_CHECKBOX) {
/* Draw text at right of checkbox. */
if (label_length) {
#ifdef CONFIG_UTF8
if (term->utf8_cp) {
int lb = utf8_cells2bytes(
text,
label_length,
NULL);
draw_dlg_text(dlg_data, xpos + width
+ label_padding,
*y, text, lb, 0,
color);
} else
#endif /* CONFIG_UTF8 */
{
draw_dlg_text(dlg_data, 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) {
#ifdef CONFIG_UTF8
if (term->utf8_cp) {
int lb = utf8_cells2bytes(
text,
label_length,
NULL);
draw_dlg_text(dlg_data, xpos, *y,
text, lb, 0, color);
} else
#endif /* CONFIG_UTF8 */
{
draw_dlg_text(dlg_data, 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 y = 0;
int n = dlg_data->number_of_widgets - 2;
#ifdef CONFIG_UTF8
if (term->utf8_cp)
rw = int_min(w, utf8_ptr2cells(dlg_data->dlg->title, NULL));
else
#endif /* CONFIG_UTF8 */
rw = int_min(w, strlen(dlg_data->dlg->title));
dlg_format_group(dlg_data, dlg_data->widgets_data, n,
0, &y, w, &rw, 1);
y++;
dlg_format_buttons(dlg_data, dlg_data->widgets_data + n, 2, 0, &y, w,
&rw, ALIGN_CENTER, 1);
w = rw;
draw_dialog(dlg_data, w, y);
y = dlg_data->box.y + DIALOG_TB + 1;
dlg_format_group(dlg_data, dlg_data->widgets_data, n,
dlg_data->box.x + DIALOG_LB, &y, w, NULL, 0);
y++;
dlg_format_buttons(dlg_data, dlg_data->widgets_data + n, 2,
dlg_data->box.x + DIALOG_LB, &y, w, &rw, ALIGN_CENTER, 0);
}