Dissolve widget_redistribute()
liberty-xui has xui_hbox() and xui_vbox(), the way we use widgets is odd.
This commit is contained in:
parent
19a0a468a9
commit
b3fe85995f
77
nncmpp.c
77
nncmpp.c
|
@ -1172,46 +1172,6 @@ struct app_ui
|
||||||
bool have_icons;
|
bool have_icons;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Replaces negative widths amongst widgets in the sublist by redistributing
|
|
||||||
/// any width remaining after all positive claims are satisfied from "width".
|
|
||||||
/// Also unifies heights to the maximum value of the run, and returns it.
|
|
||||||
/// Then the widths are taken as final, and used to initialize X coordinates.
|
|
||||||
static int
|
|
||||||
widget_redistribute (struct widget *head, int width)
|
|
||||||
{
|
|
||||||
int parts = 0, max_height = 0;
|
|
||||||
LIST_FOR_EACH (struct widget, w, head)
|
|
||||||
{
|
|
||||||
max_height = MAX (max_height, w->height);
|
|
||||||
if (w->width < 0)
|
|
||||||
parts -= w->width;
|
|
||||||
else
|
|
||||||
width -= w->width;
|
|
||||||
}
|
|
||||||
|
|
||||||
int remaining = MAX (width, 0), part_width = parts ? remaining / parts : 0;
|
|
||||||
struct widget *last = NULL;
|
|
||||||
LIST_FOR_EACH (struct widget, w, head)
|
|
||||||
{
|
|
||||||
w->height = max_height;
|
|
||||||
if (w->width < 0)
|
|
||||||
{
|
|
||||||
remaining -= (w->width *= -part_width);
|
|
||||||
last = w;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (last)
|
|
||||||
last->width += remaining;
|
|
||||||
|
|
||||||
int x = 0;
|
|
||||||
LIST_FOR_EACH (struct widget, w, head)
|
|
||||||
{
|
|
||||||
widget_move (w, x - w->x, 0);
|
|
||||||
x += w->width;
|
|
||||||
}
|
|
||||||
return max_height;
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
||||||
struct tab;
|
struct tab;
|
||||||
|
@ -1666,11 +1626,46 @@ app_append_layout (struct layout *l, struct layout *dest)
|
||||||
*l = (struct layout) {};
|
*l = (struct layout) {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Replaces negative widths amongst widgets in the layout by redistributing
|
||||||
|
/// any width remaining after all positive claims are satisfied from "width".
|
||||||
|
/// Also unifies heights to the maximum value of the run.
|
||||||
|
/// Then the widths are taken as final, and used to initialize X coordinates.
|
||||||
static void
|
static void
|
||||||
app_flush_layout_full (struct layout *l, int width, struct layout *dest)
|
app_flush_layout_full (struct layout *l, int width, struct layout *dest)
|
||||||
{
|
{
|
||||||
hard_assert (l != NULL && l->head != NULL);
|
hard_assert (l != NULL && l->head != NULL);
|
||||||
widget_redistribute (l->head, width);
|
|
||||||
|
int parts = 0, max_height = 0;
|
||||||
|
LIST_FOR_EACH (struct widget, w, l->head)
|
||||||
|
{
|
||||||
|
max_height = MAX (max_height, w->height);
|
||||||
|
if (w->width < 0)
|
||||||
|
parts -= w->width;
|
||||||
|
else
|
||||||
|
width -= w->width;
|
||||||
|
}
|
||||||
|
|
||||||
|
int remaining = MAX (width, 0), part_width = parts ? remaining / parts : 0;
|
||||||
|
struct widget *last = NULL;
|
||||||
|
LIST_FOR_EACH (struct widget, w, l->head)
|
||||||
|
{
|
||||||
|
w->height = max_height;
|
||||||
|
if (w->width < 0)
|
||||||
|
{
|
||||||
|
remaining -= (w->width *= -part_width);
|
||||||
|
last = w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (last)
|
||||||
|
last->width += remaining;
|
||||||
|
|
||||||
|
int x = 0;
|
||||||
|
LIST_FOR_EACH (struct widget, w, l->head)
|
||||||
|
{
|
||||||
|
widget_move (w, x - w->x, 0);
|
||||||
|
x += w->width;
|
||||||
|
}
|
||||||
|
|
||||||
app_append_layout (l, dest);
|
app_append_layout (l, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue