mirror of
https://github.com/labwc/labwc.git
synced 2025-11-02 09:01:47 -05:00
Chase wlroots: prep work: menu to tree
This commit is contained in:
parent
3f65a2ff77
commit
65a5315e42
2 changed files with 29 additions and 20 deletions
|
|
@ -16,6 +16,7 @@ enum menu_align {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct menu_scene {
|
struct menu_scene {
|
||||||
|
struct wlr_scene_tree *tree;
|
||||||
struct lab_data_buffer *buffer;
|
struct lab_data_buffer *buffer;
|
||||||
struct wlr_scene_node *text;
|
struct wlr_scene_node *text;
|
||||||
struct wlr_scene_node *background;
|
struct wlr_scene_node *background;
|
||||||
|
|
@ -25,6 +26,7 @@ struct menuitem {
|
||||||
struct wl_list actions;
|
struct wl_list actions;
|
||||||
struct menu *parent;
|
struct menu *parent;
|
||||||
struct menu *submenu;
|
struct menu *submenu;
|
||||||
|
struct wlr_scene_tree *tree;
|
||||||
struct menu_scene normal;
|
struct menu_scene normal;
|
||||||
struct menu_scene selected;
|
struct menu_scene selected;
|
||||||
struct wl_list link; /* menu::menuitems */
|
struct wl_list link; /* menu::menuitems */
|
||||||
|
|
|
||||||
|
|
@ -96,7 +96,6 @@ item_create(struct menu *menu, const char *text)
|
||||||
|
|
||||||
int x, y;
|
int x, y;
|
||||||
int item_max_width = MENUWIDTH - 2 * MENU_ITEM_PADDING_X;
|
int item_max_width = MENUWIDTH - 2 * MENU_ITEM_PADDING_X;
|
||||||
struct wlr_scene_node *parent = &menu->scene_tree->node;
|
|
||||||
|
|
||||||
/* Font buffer */
|
/* Font buffer */
|
||||||
font_buffer_create(&menuitem->normal.buffer, item_max_width,
|
font_buffer_create(&menuitem->normal.buffer, item_max_width,
|
||||||
|
|
@ -117,25 +116,30 @@ item_create(struct menu *menu, const char *text)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Menu item root node */
|
||||||
|
menuitem->tree = wlr_scene_tree_create(&menu->scene_tree->node);
|
||||||
|
node_descriptor_create(&menuitem->tree->node,
|
||||||
|
LAB_NODE_DESC_MENUITEM, menuitem);
|
||||||
|
|
||||||
|
/* Tree for each state to hold background and text buffer */
|
||||||
|
menuitem->normal.tree = wlr_scene_tree_create(&menuitem->tree->node);
|
||||||
|
menuitem->selected.tree = wlr_scene_tree_create(&menuitem->tree->node);
|
||||||
|
|
||||||
/* Item background nodes */
|
/* Item background nodes */
|
||||||
menuitem->normal.background = &wlr_scene_rect_create(parent,
|
menuitem->normal.background = &wlr_scene_rect_create(
|
||||||
|
&menuitem->normal.tree->node,
|
||||||
MENUWIDTH, menu->item_height,
|
MENUWIDTH, menu->item_height,
|
||||||
theme->menu_items_bg_color)->node;
|
theme->menu_items_bg_color)->node;
|
||||||
menuitem->selected.background = &wlr_scene_rect_create(parent,
|
menuitem->selected.background = &wlr_scene_rect_create(
|
||||||
|
&menuitem->selected.tree->node,
|
||||||
MENUWIDTH, menu->item_height,
|
MENUWIDTH, menu->item_height,
|
||||||
theme->menu_items_active_bg_color)->node;
|
theme->menu_items_active_bg_color)->node;
|
||||||
|
|
||||||
/* Font nodes */
|
/* Font nodes */
|
||||||
menuitem->normal.text = &wlr_scene_buffer_create(
|
menuitem->normal.text = &wlr_scene_buffer_create(
|
||||||
menuitem->normal.background, &menuitem->normal.buffer->base)->node;
|
&menuitem->normal.tree->node, &menuitem->normal.buffer->base)->node;
|
||||||
menuitem->selected.text = &wlr_scene_buffer_create(
|
menuitem->selected.text = &wlr_scene_buffer_create(
|
||||||
menuitem->selected.background, &menuitem->selected.buffer->base)->node;
|
&menuitem->selected.tree->node, &menuitem->selected.buffer->base)->node;
|
||||||
|
|
||||||
/* Node descriptors for top scene nodes of menuitem */
|
|
||||||
node_descriptor_create(menuitem->normal.background,
|
|
||||||
LAB_NODE_DESC_MENUITEM, menuitem);
|
|
||||||
node_descriptor_create(menuitem->selected.background,
|
|
||||||
LAB_NODE_DESC_MENUITEM, menuitem);
|
|
||||||
|
|
||||||
/* Center font nodes */
|
/* Center font nodes */
|
||||||
y = (menu->item_height - menuitem->normal.buffer->base.height) / 2;
|
y = (menu->item_height - menuitem->normal.buffer->base.height) / 2;
|
||||||
|
|
@ -146,11 +150,10 @@ item_create(struct menu *menu, const char *text)
|
||||||
/* Position the item in relation to its menu */
|
/* Position the item in relation to its menu */
|
||||||
int item_count = wl_list_length(&menu->menuitems);
|
int item_count = wl_list_length(&menu->menuitems);
|
||||||
y = item_count * menu->item_height;
|
y = item_count * menu->item_height;
|
||||||
wlr_scene_node_set_position(menuitem->normal.background, 0, y);
|
wlr_scene_node_set_position(&menuitem->tree->node, 0, y);
|
||||||
wlr_scene_node_set_position(menuitem->selected.background, 0, y);
|
|
||||||
|
|
||||||
/* Hide selected state */
|
/* Hide selected state */
|
||||||
wlr_scene_node_set_enabled(menuitem->selected.background, false);
|
wlr_scene_node_set_enabled(&menuitem->selected.tree->node, false);
|
||||||
|
|
||||||
/* Update menu extents */
|
/* Update menu extents */
|
||||||
menu->size.height = (item_count + 1) * menu->item_height;
|
menu->size.height = (item_count + 1) * menu->item_height;
|
||||||
|
|
@ -432,7 +435,7 @@ menu_configure(struct menu *menu, int lx, int ly, enum menu_align align)
|
||||||
} else {
|
} else {
|
||||||
new_lx = lx;
|
new_lx = lx;
|
||||||
}
|
}
|
||||||
rel_y = item->normal.background->state.y;
|
rel_y = item->tree->node.state.y;
|
||||||
new_ly = ly + rel_y - theme->menu_overlap_y;
|
new_ly = ly + rel_y - theme->menu_overlap_y;
|
||||||
menu_configure(item->submenu, new_lx, new_ly, align);
|
menu_configure(item->submenu, new_lx, new_ly, align);
|
||||||
}
|
}
|
||||||
|
|
@ -493,10 +496,14 @@ menu_finish(void)
|
||||||
wl_list_for_each_safe(item, next, &menu->menuitems, link) {
|
wl_list_for_each_safe(item, next, &menu->menuitems, link) {
|
||||||
wl_list_remove(&item->link);
|
wl_list_remove(&item->link);
|
||||||
action_list_free(&item->actions);
|
action_list_free(&item->actions);
|
||||||
|
/* TODO: just destroy menu->tree and let scene-graph do the rest */
|
||||||
wlr_scene_node_destroy(item->normal.text);
|
wlr_scene_node_destroy(item->normal.text);
|
||||||
wlr_scene_node_destroy(item->selected.text);
|
wlr_scene_node_destroy(item->selected.text);
|
||||||
wlr_scene_node_destroy(item->normal.background);
|
wlr_scene_node_destroy(item->normal.background);
|
||||||
wlr_scene_node_destroy(item->selected.background);
|
wlr_scene_node_destroy(item->selected.background);
|
||||||
|
wlr_scene_node_destroy(&item->normal.tree->node);
|
||||||
|
wlr_scene_node_destroy(&item->selected.tree->node);
|
||||||
|
wlr_scene_node_destroy(&item->tree->node);
|
||||||
wlr_buffer_drop(&item->normal.buffer->base);
|
wlr_buffer_drop(&item->normal.buffer->base);
|
||||||
wlr_buffer_drop(&item->selected.buffer->base);
|
wlr_buffer_drop(&item->selected.buffer->base);
|
||||||
free(item);
|
free(item);
|
||||||
|
|
@ -515,14 +522,14 @@ menu_set_selection(struct menu *menu, struct menuitem *item)
|
||||||
/* Clear old selection */
|
/* Clear old selection */
|
||||||
if (menu->selection.item) {
|
if (menu->selection.item) {
|
||||||
wlr_scene_node_set_enabled(
|
wlr_scene_node_set_enabled(
|
||||||
menu->selection.item->normal.background, true);
|
&menu->selection.item->normal.tree->node, true);
|
||||||
wlr_scene_node_set_enabled(
|
wlr_scene_node_set_enabled(
|
||||||
menu->selection.item->selected.background, false);
|
&menu->selection.item->selected.tree->node, false);
|
||||||
}
|
}
|
||||||
/* Set new selection */
|
/* Set new selection */
|
||||||
if (item) {
|
if (item) {
|
||||||
wlr_scene_node_set_enabled(item->normal.background, false);
|
wlr_scene_node_set_enabled(&item->normal.tree->node, false);
|
||||||
wlr_scene_node_set_enabled(item->selected.background, true);
|
wlr_scene_node_set_enabled(&item->selected.tree->node, true);
|
||||||
}
|
}
|
||||||
menu->selection.item = item;
|
menu->selection.item = item;
|
||||||
}
|
}
|
||||||
|
|
@ -562,7 +569,7 @@ menu_process_cursor_motion(struct wlr_scene_node *node)
|
||||||
assert(node && node->data);
|
assert(node && node->data);
|
||||||
struct menuitem *item = node_menuitem_from_node(node);
|
struct menuitem *item = node_menuitem_from_node(node);
|
||||||
|
|
||||||
if (node == item->selected.background) {
|
if (node == &item->selected.tree->node) {
|
||||||
/* We are on an already selected item */
|
/* We are on an already selected item */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue