mirror of
https://github.com/labwc/labwc.git
synced 2025-11-03 09:01:51 -05:00
src/menu.c: move some post_processing() and menu_update_width()
This commit is contained in:
parent
d5daee6b96
commit
90fad69027
1 changed files with 79 additions and 79 deletions
158
src/menu/menu.c
158
src/menu/menu.c
|
|
@ -104,85 +104,6 @@ menu_get_by_id(struct server *server, const char *id)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
menu_update_width(struct menu *menu)
|
|
||||||
{
|
|
||||||
struct menuitem *item;
|
|
||||||
struct theme *theme = menu->server->theme;
|
|
||||||
int max_width = theme->menu_min_width;
|
|
||||||
|
|
||||||
/* Get widest menu item, clamped by menu_max_width */
|
|
||||||
wl_list_for_each(item, &menu->menuitems, link) {
|
|
||||||
if (item->native_width > max_width) {
|
|
||||||
max_width = item->native_width < theme->menu_max_width
|
|
||||||
? item->native_width : theme->menu_max_width;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
menu->size.width = max_width + 2 * theme->menu_items_padding_x;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TODO: This function is getting a bit unwieldy. Consider calculating
|
|
||||||
* the menu-window width up-front to avoid this post_processing() and
|
|
||||||
* second-bite-of-the-cherry stuff
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Update all items for the new size */
|
|
||||||
wl_list_for_each(item, &menu->menuitems, link) {
|
|
||||||
wlr_scene_rect_set_size(
|
|
||||||
wlr_scene_rect_from_node(item->normal.background),
|
|
||||||
menu->size.width, item->height);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Separator lines are special because they change width with
|
|
||||||
* the menu.
|
|
||||||
*/
|
|
||||||
if (item->type == LAB_MENU_SEPARATOR_LINE) {
|
|
||||||
int width = menu->size.width
|
|
||||||
- 2 * theme->menu_separator_padding_width;
|
|
||||||
wlr_scene_rect_set_size(
|
|
||||||
wlr_scene_rect_from_node(item->normal.text),
|
|
||||||
width, theme->menu_separator_line_thickness);
|
|
||||||
} else if (item->type == LAB_MENU_TITLE) {
|
|
||||||
if (item->native_width > max_width) {
|
|
||||||
scaled_font_buffer_set_max_width(item->normal.buffer,
|
|
||||||
max_width);
|
|
||||||
}
|
|
||||||
if (theme->menu_title_text_justify == LAB_JUSTIFY_CENTER) {
|
|
||||||
int x, y;
|
|
||||||
x = (menu->size.width - item->native_width) / 2;
|
|
||||||
x = x < 0 ? 0 : x;
|
|
||||||
y = (theme->menu_header_height - item->normal.buffer->height) / 2;
|
|
||||||
wlr_scene_node_set_position(item->normal.text, x, y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (item->selectable) {
|
|
||||||
/* Only selectable items have item->selected.background */
|
|
||||||
wlr_scene_rect_set_size(
|
|
||||||
wlr_scene_rect_from_node(item->selected.background),
|
|
||||||
menu->size.width, item->height);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (item->native_width > max_width || item->submenu || item->execute) {
|
|
||||||
scaled_font_buffer_set_max_width(item->normal.buffer,
|
|
||||||
max_width);
|
|
||||||
if (item->selectable) {
|
|
||||||
scaled_font_buffer_set_max_width(item->selected.buffer,
|
|
||||||
max_width);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
post_processing(struct server *server)
|
|
||||||
{
|
|
||||||
struct menu *menu;
|
|
||||||
wl_list_for_each(menu, &server->menus, link) {
|
|
||||||
menu_update_width(menu);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
validate_menu(struct menu *menu)
|
validate_menu(struct menu *menu)
|
||||||
{
|
{
|
||||||
|
|
@ -370,6 +291,85 @@ separator_create(struct menu *menu, const char *label)
|
||||||
return menuitem;
|
return menuitem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
menu_update_width(struct menu *menu)
|
||||||
|
{
|
||||||
|
struct menuitem *item;
|
||||||
|
struct theme *theme = menu->server->theme;
|
||||||
|
int max_width = theme->menu_min_width;
|
||||||
|
|
||||||
|
/* Get widest menu item, clamped by menu_max_width */
|
||||||
|
wl_list_for_each(item, &menu->menuitems, link) {
|
||||||
|
if (item->native_width > max_width) {
|
||||||
|
max_width = item->native_width < theme->menu_max_width
|
||||||
|
? item->native_width : theme->menu_max_width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
menu->size.width = max_width + 2 * theme->menu_items_padding_x;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TODO: This function is getting a bit unwieldy. Consider calculating
|
||||||
|
* the menu-window width up-front to avoid this post_processing() and
|
||||||
|
* second-bite-of-the-cherry stuff
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Update all items for the new size */
|
||||||
|
wl_list_for_each(item, &menu->menuitems, link) {
|
||||||
|
wlr_scene_rect_set_size(
|
||||||
|
wlr_scene_rect_from_node(item->normal.background),
|
||||||
|
menu->size.width, item->height);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Separator lines are special because they change width with
|
||||||
|
* the menu.
|
||||||
|
*/
|
||||||
|
if (item->type == LAB_MENU_SEPARATOR_LINE) {
|
||||||
|
int width = menu->size.width
|
||||||
|
- 2 * theme->menu_separator_padding_width;
|
||||||
|
wlr_scene_rect_set_size(
|
||||||
|
wlr_scene_rect_from_node(item->normal.text),
|
||||||
|
width, theme->menu_separator_line_thickness);
|
||||||
|
} else if (item->type == LAB_MENU_TITLE) {
|
||||||
|
if (item->native_width > max_width) {
|
||||||
|
scaled_font_buffer_set_max_width(item->normal.buffer,
|
||||||
|
max_width);
|
||||||
|
}
|
||||||
|
if (theme->menu_title_text_justify == LAB_JUSTIFY_CENTER) {
|
||||||
|
int x, y;
|
||||||
|
x = (menu->size.width - item->native_width) / 2;
|
||||||
|
x = x < 0 ? 0 : x;
|
||||||
|
y = (theme->menu_header_height - item->normal.buffer->height) / 2;
|
||||||
|
wlr_scene_node_set_position(item->normal.text, x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item->selectable) {
|
||||||
|
/* Only selectable items have item->selected.background */
|
||||||
|
wlr_scene_rect_set_size(
|
||||||
|
wlr_scene_rect_from_node(item->selected.background),
|
||||||
|
menu->size.width, item->height);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item->native_width > max_width || item->submenu || item->execute) {
|
||||||
|
scaled_font_buffer_set_max_width(item->normal.buffer,
|
||||||
|
max_width);
|
||||||
|
if (item->selectable) {
|
||||||
|
scaled_font_buffer_set_max_width(item->selected.buffer,
|
||||||
|
max_width);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
post_processing(struct server *server)
|
||||||
|
{
|
||||||
|
struct menu *menu;
|
||||||
|
wl_list_for_each(menu, &server->menus, link) {
|
||||||
|
menu_update_width(menu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Handle the following:
|
* Handle the following:
|
||||||
* <item label="">
|
* <item label="">
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue