Fix inconsistent naming of tree parameter in Widget trait (#2950)
* fix inconsistent naming of tree parameter in widget trait * rename `Tree` parameter in various usages across iced
This commit is contained in:
parent
6f0b408f90
commit
6bbe189809
27 changed files with 127 additions and 128 deletions
|
|
@ -459,7 +459,7 @@ where
|
|||
|
||||
fn operate(
|
||||
&mut self,
|
||||
_state: &mut Tree,
|
||||
_tree: &mut Tree,
|
||||
layout: Layout<'_>,
|
||||
_renderer: &Renderer,
|
||||
operation: &mut dyn widget::Operation,
|
||||
|
|
|
|||
|
|
@ -269,14 +269,14 @@ where
|
|||
shell: &mut Shell<'_, Message>,
|
||||
viewport: &Rectangle,
|
||||
) {
|
||||
for ((child, state), layout) in self
|
||||
for ((child, tree), layout) in self
|
||||
.children
|
||||
.iter_mut()
|
||||
.zip(&mut tree.children)
|
||||
.zip(layout.children())
|
||||
{
|
||||
child.as_widget_mut().update(
|
||||
state, event, layout, cursor, renderer, clipboard, shell,
|
||||
tree, event, layout, cursor, renderer, clipboard, shell,
|
||||
viewport,
|
||||
);
|
||||
}
|
||||
|
|
@ -294,10 +294,10 @@ where
|
|||
.iter()
|
||||
.zip(&tree.children)
|
||||
.zip(layout.children())
|
||||
.map(|((child, state), layout)| {
|
||||
child.as_widget().mouse_interaction(
|
||||
state, layout, cursor, viewport, renderer,
|
||||
)
|
||||
.map(|((child, tree), layout)| {
|
||||
child
|
||||
.as_widget()
|
||||
.mouse_interaction(tree, layout, cursor, viewport, renderer)
|
||||
})
|
||||
.max()
|
||||
.unwrap_or_default()
|
||||
|
|
@ -320,7 +320,7 @@ where
|
|||
viewport
|
||||
};
|
||||
|
||||
for ((child, state), layout) in self
|
||||
for ((child, tree), layout) in self
|
||||
.children
|
||||
.iter()
|
||||
.zip(&tree.children)
|
||||
|
|
@ -328,7 +328,7 @@ where
|
|||
.filter(|(_, layout)| layout.bounds().intersects(viewport))
|
||||
{
|
||||
child.as_widget().draw(
|
||||
state, renderer, theme, style, layout, cursor, viewport,
|
||||
tree, renderer, theme, style, layout, cursor, viewport,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -125,7 +125,7 @@ where
|
|||
|
||||
fn update(
|
||||
&mut self,
|
||||
state: &mut widget::Tree,
|
||||
tree: &mut widget::Tree,
|
||||
event: &Event,
|
||||
layout: Layout<'_>,
|
||||
cursor: mouse::Cursor,
|
||||
|
|
@ -139,7 +139,7 @@ where
|
|||
}
|
||||
|
||||
self.content.as_widget_mut().update(
|
||||
state, event, layout, cursor, renderer, clipboard, shell, viewport,
|
||||
tree, event, layout, cursor, renderer, clipboard, shell, viewport,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -180,7 +180,7 @@ where
|
|||
|
||||
fn mouse_interaction(
|
||||
&self,
|
||||
state: &widget::Tree,
|
||||
tree: &widget::Tree,
|
||||
layout: Layout<'_>,
|
||||
cursor: mouse::Cursor,
|
||||
viewport: &Rectangle,
|
||||
|
|
@ -192,19 +192,19 @@ where
|
|||
|
||||
self.content
|
||||
.as_widget()
|
||||
.mouse_interaction(state, layout, cursor, viewport, renderer)
|
||||
.mouse_interaction(tree, layout, cursor, viewport, renderer)
|
||||
}
|
||||
|
||||
fn operate(
|
||||
&mut self,
|
||||
state: &mut widget::Tree,
|
||||
tree: &mut widget::Tree,
|
||||
layout: Layout<'_>,
|
||||
renderer: &Renderer,
|
||||
operation: &mut dyn widget::Operation,
|
||||
) {
|
||||
self.content
|
||||
.as_widget_mut()
|
||||
.operate(state, layout, renderer, operation);
|
||||
.operate(tree, layout, renderer, operation);
|
||||
}
|
||||
|
||||
fn overlay<'a>(
|
||||
|
|
|
|||
|
|
@ -281,14 +281,14 @@ where
|
|||
shell: &mut Shell<'_, Message>,
|
||||
viewport: &Rectangle,
|
||||
) {
|
||||
for ((child, state), layout) in self
|
||||
for ((child, tree), layout) in self
|
||||
.children
|
||||
.iter_mut()
|
||||
.zip(&mut tree.children)
|
||||
.zip(layout.children())
|
||||
{
|
||||
child.as_widget_mut().update(
|
||||
state, event, layout, cursor, renderer, clipboard, shell,
|
||||
tree, event, layout, cursor, renderer, clipboard, shell,
|
||||
viewport,
|
||||
);
|
||||
}
|
||||
|
|
@ -306,10 +306,10 @@ where
|
|||
.iter()
|
||||
.zip(&tree.children)
|
||||
.zip(layout.children())
|
||||
.map(|((child, state), layout)| {
|
||||
child.as_widget().mouse_interaction(
|
||||
state, layout, cursor, viewport, renderer,
|
||||
)
|
||||
.map(|((child, tree), layout)| {
|
||||
child
|
||||
.as_widget()
|
||||
.mouse_interaction(tree, layout, cursor, viewport, renderer)
|
||||
})
|
||||
.max()
|
||||
.unwrap_or_default()
|
||||
|
|
@ -326,7 +326,7 @@ where
|
|||
viewport: &Rectangle,
|
||||
) {
|
||||
if let Some(viewport) = layout.bounds().intersection(viewport) {
|
||||
for ((child, state), layout) in self
|
||||
for ((child, tree), layout) in self
|
||||
.children
|
||||
.iter()
|
||||
.zip(&tree.children)
|
||||
|
|
@ -334,7 +334,7 @@ where
|
|||
.filter(|(_, layout)| layout.bounds().intersects(&viewport))
|
||||
{
|
||||
child.as_widget().draw(
|
||||
state, renderer, theme, style, layout, cursor, &viewport,
|
||||
tree, renderer, theme, style, layout, cursor, &viewport,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -647,19 +647,19 @@ where
|
|||
|
||||
fn operate(
|
||||
&mut self,
|
||||
state: &mut Tree,
|
||||
tree: &mut Tree,
|
||||
layout: Layout<'_>,
|
||||
renderer: &Renderer,
|
||||
operation: &mut dyn operation::Operation,
|
||||
) {
|
||||
self.content
|
||||
.as_widget_mut()
|
||||
.operate(state, layout, renderer, operation);
|
||||
.operate(tree, layout, renderer, operation);
|
||||
}
|
||||
|
||||
fn update(
|
||||
&mut self,
|
||||
state: &mut Tree,
|
||||
tree: &mut Tree,
|
||||
event: &Event,
|
||||
layout: Layout<'_>,
|
||||
cursor: mouse::Cursor,
|
||||
|
|
@ -674,7 +674,7 @@ where
|
|||
);
|
||||
|
||||
self.content.as_widget_mut().update(
|
||||
state, event, layout, cursor, renderer, clipboard, shell,
|
||||
tree, event, layout, cursor, renderer, clipboard, shell,
|
||||
viewport,
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -383,7 +383,7 @@ where
|
|||
|
||||
fn draw(
|
||||
&self,
|
||||
_state: &Tree,
|
||||
_tree: &Tree,
|
||||
renderer: &mut Renderer,
|
||||
_theme: &Theme,
|
||||
_style: &renderer::Style,
|
||||
|
|
|
|||
|
|
@ -308,14 +308,14 @@ where
|
|||
shell: &mut Shell<'_, Message>,
|
||||
viewport: &Rectangle,
|
||||
) {
|
||||
for ((child, state), layout) in self
|
||||
for ((child, tree), layout) in self
|
||||
.children
|
||||
.iter_mut()
|
||||
.zip(&mut tree.children)
|
||||
.zip(layout.children())
|
||||
{
|
||||
child.as_widget_mut().update(
|
||||
state, event, layout, cursor, renderer, clipboard, shell,
|
||||
tree, event, layout, cursor, renderer, clipboard, shell,
|
||||
viewport,
|
||||
);
|
||||
}
|
||||
|
|
@ -333,10 +333,10 @@ where
|
|||
.iter()
|
||||
.zip(&tree.children)
|
||||
.zip(layout.children())
|
||||
.map(|((child, state), layout)| {
|
||||
child.as_widget().mouse_interaction(
|
||||
state, layout, cursor, viewport, renderer,
|
||||
)
|
||||
.map(|((child, tree), layout)| {
|
||||
child
|
||||
.as_widget()
|
||||
.mouse_interaction(tree, layout, cursor, viewport, renderer)
|
||||
})
|
||||
.max()
|
||||
.unwrap_or_default()
|
||||
|
|
|
|||
|
|
@ -168,7 +168,7 @@ where
|
|||
{
|
||||
position: Point,
|
||||
viewport: Rectangle,
|
||||
state: &'a mut Tree,
|
||||
tree: &'a mut Tree,
|
||||
list: Scrollable<'a, Message, Theme, Renderer>,
|
||||
width: f32,
|
||||
target_height: f32,
|
||||
|
|
@ -226,7 +226,7 @@ where
|
|||
Self {
|
||||
position,
|
||||
viewport,
|
||||
state: &mut state.tree,
|
||||
tree: &mut state.tree,
|
||||
list,
|
||||
width,
|
||||
target_height,
|
||||
|
|
@ -259,7 +259,7 @@ where
|
|||
)
|
||||
.width(self.width);
|
||||
|
||||
let node = self.list.layout(self.state, renderer, &limits);
|
||||
let node = self.list.layout(self.tree, renderer, &limits);
|
||||
let size = node.size();
|
||||
|
||||
node.move_to(if space_below > space_above {
|
||||
|
|
@ -281,7 +281,7 @@ where
|
|||
let bounds = layout.bounds();
|
||||
|
||||
self.list.update(
|
||||
self.state, event, layout, cursor, renderer, clipboard, shell,
|
||||
self.tree, event, layout, cursor, renderer, clipboard, shell,
|
||||
&bounds,
|
||||
);
|
||||
}
|
||||
|
|
@ -293,7 +293,7 @@ where
|
|||
renderer: &Renderer,
|
||||
) -> mouse::Interaction {
|
||||
self.list.mouse_interaction(
|
||||
self.state,
|
||||
self.tree,
|
||||
layout,
|
||||
cursor,
|
||||
&self.viewport,
|
||||
|
|
@ -323,7 +323,7 @@ where
|
|||
);
|
||||
|
||||
self.list.draw(
|
||||
self.state, renderer, theme, defaults, layout, cursor, &bounds,
|
||||
self.tree, renderer, theme, defaults, layout, cursor, &bounds,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -487,7 +487,7 @@ where
|
|||
|
||||
fn mouse_interaction(
|
||||
&self,
|
||||
_state: &Tree,
|
||||
_tree: &Tree,
|
||||
layout: Layout<'_>,
|
||||
cursor: mouse::Cursor,
|
||||
_viewport: &Rectangle,
|
||||
|
|
@ -504,7 +504,7 @@ where
|
|||
|
||||
fn draw(
|
||||
&self,
|
||||
_state: &Tree,
|
||||
_tree: &Tree,
|
||||
renderer: &mut Renderer,
|
||||
theme: &Theme,
|
||||
_style: &renderer::Style,
|
||||
|
|
|
|||
|
|
@ -166,7 +166,7 @@ where
|
|||
|
||||
fn draw(
|
||||
&self,
|
||||
_state: &Tree,
|
||||
_tree: &Tree,
|
||||
renderer: &mut Renderer,
|
||||
theme: &Theme,
|
||||
_style: &renderer::Style,
|
||||
|
|
|
|||
|
|
@ -326,7 +326,7 @@ where
|
|||
|
||||
fn update(
|
||||
&mut self,
|
||||
_state: &mut Tree,
|
||||
_tree: &mut Tree,
|
||||
event: &Event,
|
||||
layout: Layout<'_>,
|
||||
cursor: mouse::Cursor,
|
||||
|
|
@ -369,7 +369,7 @@ where
|
|||
|
||||
fn mouse_interaction(
|
||||
&self,
|
||||
_state: &Tree,
|
||||
_tree: &Tree,
|
||||
layout: Layout<'_>,
|
||||
cursor: mouse::Cursor,
|
||||
_viewport: &Rectangle,
|
||||
|
|
|
|||
|
|
@ -258,14 +258,14 @@ where
|
|||
shell: &mut Shell<'_, Message>,
|
||||
viewport: &Rectangle,
|
||||
) {
|
||||
for ((child, state), layout) in self
|
||||
for ((child, tree), layout) in self
|
||||
.children
|
||||
.iter_mut()
|
||||
.zip(&mut tree.children)
|
||||
.zip(layout.children())
|
||||
{
|
||||
child.as_widget_mut().update(
|
||||
state, event, layout, cursor, renderer, clipboard, shell,
|
||||
tree, event, layout, cursor, renderer, clipboard, shell,
|
||||
viewport,
|
||||
);
|
||||
}
|
||||
|
|
@ -283,10 +283,10 @@ where
|
|||
.iter()
|
||||
.zip(&tree.children)
|
||||
.zip(layout.children())
|
||||
.map(|((child, state), layout)| {
|
||||
child.as_widget().mouse_interaction(
|
||||
state, layout, cursor, viewport, renderer,
|
||||
)
|
||||
.map(|((child, tree), layout)| {
|
||||
child
|
||||
.as_widget()
|
||||
.mouse_interaction(tree, layout, cursor, viewport, renderer)
|
||||
})
|
||||
.max()
|
||||
.unwrap_or_default()
|
||||
|
|
@ -309,7 +309,7 @@ where
|
|||
viewport
|
||||
};
|
||||
|
||||
for ((child, state), layout) in self
|
||||
for ((child, tree), layout) in self
|
||||
.children
|
||||
.iter()
|
||||
.zip(&tree.children)
|
||||
|
|
@ -317,7 +317,7 @@ where
|
|||
.filter(|(_, layout)| layout.bounds().intersects(viewport))
|
||||
{
|
||||
child.as_widget().draw(
|
||||
state, renderer, theme, style, layout, cursor, viewport,
|
||||
tree, renderer, theme, style, layout, cursor, viewport,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -133,7 +133,7 @@ where
|
|||
|
||||
fn draw(
|
||||
&self,
|
||||
_state: &Tree,
|
||||
_tree: &Tree,
|
||||
renderer: &mut Renderer,
|
||||
theme: &Theme,
|
||||
_style: &renderer::Style,
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ where
|
|||
|
||||
fn draw(
|
||||
&self,
|
||||
_state: &Tree,
|
||||
_tree: &Tree,
|
||||
_renderer: &mut Renderer,
|
||||
_theme: &Theme,
|
||||
_style: &renderer::Style,
|
||||
|
|
|
|||
|
|
@ -224,7 +224,7 @@ where
|
|||
let is_over = cursor.is_over(layout.bounds());
|
||||
let end = self.children.len() - 1;
|
||||
|
||||
for (i, ((child, state), layout)) in self
|
||||
for (i, ((child, tree), layout)) in self
|
||||
.children
|
||||
.iter_mut()
|
||||
.rev()
|
||||
|
|
@ -233,7 +233,7 @@ where
|
|||
.enumerate()
|
||||
{
|
||||
child.as_widget_mut().update(
|
||||
state, event, layout, cursor, renderer, clipboard, shell,
|
||||
tree, event, layout, cursor, renderer, clipboard, shell,
|
||||
viewport,
|
||||
);
|
||||
|
||||
|
|
@ -243,7 +243,7 @@ where
|
|||
|
||||
if i < end && is_over && !cursor.is_levitating() {
|
||||
let interaction = child.as_widget().mouse_interaction(
|
||||
state, layout, cursor, viewport, renderer,
|
||||
tree, layout, cursor, viewport, renderer,
|
||||
);
|
||||
|
||||
if interaction != mouse::Interaction::None {
|
||||
|
|
@ -266,10 +266,10 @@ where
|
|||
.rev()
|
||||
.zip(tree.children.iter().rev())
|
||||
.zip(layout.children().rev())
|
||||
.map(|((child, state), layout)| {
|
||||
child.as_widget().mouse_interaction(
|
||||
state, layout, cursor, viewport, renderer,
|
||||
)
|
||||
.map(|((child, tree), layout)| {
|
||||
child
|
||||
.as_widget()
|
||||
.mouse_interaction(tree, layout, cursor, viewport, renderer)
|
||||
})
|
||||
.find(|&interaction| interaction != mouse::Interaction::None)
|
||||
.unwrap_or_default()
|
||||
|
|
@ -298,9 +298,9 @@ where
|
|||
.rev()
|
||||
.zip(tree.children.iter().rev())
|
||||
.zip(layout.children().rev())
|
||||
.position(|((layer, state), layout)| {
|
||||
.position(|((layer, tree), layout)| {
|
||||
let interaction = layer.as_widget().mouse_interaction(
|
||||
state, layout, cursor, viewport, renderer,
|
||||
tree, layout, cursor, viewport, renderer,
|
||||
);
|
||||
|
||||
interaction != mouse::Interaction::None
|
||||
|
|
@ -323,30 +323,30 @@ where
|
|||
let mut draw_layer =
|
||||
|i,
|
||||
layer: &Element<'a, Message, Theme, Renderer>,
|
||||
state,
|
||||
tree,
|
||||
layout,
|
||||
cursor| {
|
||||
if i > 0 {
|
||||
renderer.with_layer(*viewport, |renderer| {
|
||||
layer.as_widget().draw(
|
||||
state, renderer, theme, style, layout, cursor,
|
||||
tree, renderer, theme, style, layout, cursor,
|
||||
viewport,
|
||||
);
|
||||
});
|
||||
} else {
|
||||
layer.as_widget().draw(
|
||||
state, renderer, theme, style, layout, cursor,
|
||||
tree, renderer, theme, style, layout, cursor,
|
||||
viewport,
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
for (i, ((layer, state), layout)) in layers.take(layers_below) {
|
||||
draw_layer(i, layer, state, layout, mouse::Cursor::Unavailable);
|
||||
for (i, ((layer, tree), layout)) in layers.take(layers_below) {
|
||||
draw_layer(i, layer, tree, layout, mouse::Cursor::Unavailable);
|
||||
}
|
||||
|
||||
for (i, ((layer, state), layout)) in layers {
|
||||
draw_layer(i, layer, state, layout, cursor);
|
||||
for (i, ((layer, tree), layout)) in layers {
|
||||
draw_layer(i, layer, tree, layout, cursor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -226,8 +226,8 @@ where
|
|||
.collect()
|
||||
}
|
||||
|
||||
fn diff(&self, state: &mut widget::Tree) {
|
||||
state.diff_children(&self.cells);
|
||||
fn diff(&self, tree: &mut widget::Tree) {
|
||||
tree.diff_children(&self.cells);
|
||||
}
|
||||
|
||||
fn layout(
|
||||
|
|
@ -472,14 +472,14 @@ where
|
|||
shell: &mut core::Shell<'_, Message>,
|
||||
viewport: &Rectangle,
|
||||
) {
|
||||
for ((cell, state), layout) in self
|
||||
for ((cell, tree), layout) in self
|
||||
.cells
|
||||
.iter_mut()
|
||||
.zip(&mut tree.children)
|
||||
.zip(layout.children())
|
||||
{
|
||||
cell.as_widget_mut().update(
|
||||
state, event, layout, cursor, renderer, clipboard, shell,
|
||||
tree, event, layout, cursor, renderer, clipboard, shell,
|
||||
viewport,
|
||||
);
|
||||
}
|
||||
|
|
@ -570,10 +570,9 @@ where
|
|||
.iter()
|
||||
.zip(&tree.children)
|
||||
.zip(layout.children())
|
||||
.map(|((cell, state), layout)| {
|
||||
cell.as_widget().mouse_interaction(
|
||||
state, layout, cursor, viewport, renderer,
|
||||
)
|
||||
.map(|((cell, tree), layout)| {
|
||||
cell.as_widget()
|
||||
.mouse_interaction(tree, layout, cursor, viewport, renderer)
|
||||
})
|
||||
.max()
|
||||
.unwrap_or_default()
|
||||
|
|
@ -599,7 +598,7 @@ where
|
|||
|
||||
fn overlay<'b>(
|
||||
&'b mut self,
|
||||
state: &'b mut widget::Tree,
|
||||
tree: &'b mut widget::Tree,
|
||||
layout: Layout<'b>,
|
||||
renderer: &Renderer,
|
||||
viewport: &Rectangle,
|
||||
|
|
@ -607,7 +606,7 @@ where
|
|||
) -> Option<overlay::Element<'b, Message, Theme, Renderer>> {
|
||||
overlay::from_children(
|
||||
&mut self.cells,
|
||||
state,
|
||||
tree,
|
||||
layout,
|
||||
renderer,
|
||||
viewport,
|
||||
|
|
|
|||
|
|
@ -1056,7 +1056,7 @@ where
|
|||
|
||||
fn mouse_interaction(
|
||||
&self,
|
||||
_state: &widget::Tree,
|
||||
_tree: &widget::Tree,
|
||||
layout: Layout<'_>,
|
||||
cursor: mouse::Cursor,
|
||||
_viewport: &Rectangle,
|
||||
|
|
|
|||
|
|
@ -1393,7 +1393,7 @@ where
|
|||
|
||||
fn mouse_interaction(
|
||||
&self,
|
||||
_state: &Tree,
|
||||
_tree: &Tree,
|
||||
layout: Layout<'_>,
|
||||
cursor: mouse::Cursor,
|
||||
_viewport: &Rectangle,
|
||||
|
|
|
|||
|
|
@ -316,7 +316,7 @@ where
|
|||
|
||||
fn update(
|
||||
&mut self,
|
||||
_state: &mut Tree,
|
||||
_tree: &mut Tree,
|
||||
event: &Event,
|
||||
layout: Layout<'_>,
|
||||
cursor: mouse::Cursor,
|
||||
|
|
@ -368,7 +368,7 @@ where
|
|||
|
||||
fn mouse_interaction(
|
||||
&self,
|
||||
_state: &Tree,
|
||||
_tree: &Tree,
|
||||
layout: Layout<'_>,
|
||||
cursor: mouse::Cursor,
|
||||
_viewport: &Rectangle,
|
||||
|
|
|
|||
|
|
@ -300,7 +300,7 @@ where
|
|||
Some(overlay::Element::new(Box::new(Overlay {
|
||||
position: layout.position() + translation,
|
||||
tooltip: &mut self.tooltip,
|
||||
state: children.next().unwrap(),
|
||||
tree: children.next().unwrap(),
|
||||
cursor_position,
|
||||
content_bounds: layout.bounds(),
|
||||
snap_within_viewport: self.snap_within_viewport,
|
||||
|
|
@ -372,7 +372,7 @@ where
|
|||
{
|
||||
position: Point,
|
||||
tooltip: &'b mut Element<'a, Message, Theme, Renderer>,
|
||||
state: &'b mut widget::Tree,
|
||||
tree: &'b mut widget::Tree,
|
||||
cursor_position: Point,
|
||||
content_bounds: Rectangle,
|
||||
snap_within_viewport: bool,
|
||||
|
|
@ -392,7 +392,7 @@ where
|
|||
let viewport = Rectangle::with_size(bounds);
|
||||
|
||||
let tooltip_layout = self.tooltip.as_widget_mut().layout(
|
||||
self.state,
|
||||
self.tree,
|
||||
renderer,
|
||||
&layout::Limits::new(
|
||||
Size::ZERO,
|
||||
|
|
@ -507,7 +507,7 @@ where
|
|||
};
|
||||
|
||||
self.tooltip.as_widget().draw(
|
||||
self.state,
|
||||
self.tree,
|
||||
renderer,
|
||||
theme,
|
||||
&defaults,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue