wip rebase updates

This commit is contained in:
Ashley Wulber 2026-02-10 15:37:41 -05:00
parent 86dcf8af6c
commit e10459fb37
68 changed files with 1776 additions and 1544 deletions

View file

@ -23,7 +23,7 @@ use iced::{
event, keyboard, mouse, touch, window,
};
use iced_core::mouse::ScrollDelta;
use iced_core::text::{Ellipsize, LineHeight, Renderer as TextRenderer, Shaping, Wrapping};
use iced_core::text::{self, Ellipsize, LineHeight, Renderer as TextRenderer, Shaping, Wrapping};
use iced_core::widget::operation::Focusable;
use iced_core::widget::{self, operation, tree};
use iced_core::{Border, Point, Renderer as IcedRenderer, Shadow, Text};
@ -265,22 +265,33 @@ where
}
}
let text = Text {
content: text.as_ref(),
size: iced::Pixels(self.font_size),
bounds: Size::INFINITY,
font,
horizontal_alignment: alignment::Horizontal::Left,
vertical_alignment: alignment::Vertical::Center,
shaping: Shaping::Advanced,
wrapping: Wrapping::None,
ellipsize: Ellipsize::None,
line_height: self.line_height,
};
if let Some(paragraph) = state.paragraphs.get_mut(key) {
let text = Text {
content: text.as_ref(),
size: iced::Pixels(self.font_size),
bounds: Size::INFINITE,
font,
align_x: text::Alignment::Left,
align_y: alignment::Vertical::Center,
shaping: Shaping::Advanced,
wrapping: Wrapping::None,
line_height: self.line_height,
ellipsize: Ellipsize::default(),
};
paragraph.update(text);
} else {
let text = Text {
content: text.to_string(),
size: iced::Pixels(self.font_size),
bounds: Size::INFINITE,
font,
align_x: text::Alignment::Left,
align_y: alignment::Vertical::Center,
shaping: Shaping::Advanced,
wrapping: Wrapping::None,
line_height: self.line_height,
ellipsize: Ellipsize::default(),
};
state.paragraphs.insert(key, crate::Plain::new(text));
}
}
@ -441,7 +452,7 @@ where
}
/// Item the previous item in the widget.
fn focus_previous(&mut self, state: &mut LocalState) -> event::Status {
fn focus_previous(&mut self, state: &mut LocalState, shell: &mut Shell<'_, Message>) {
match state.focused_item {
Item::Tab(entity) => {
let mut keys = self.iterate_visible_tabs(state).rev();
@ -455,7 +466,8 @@ where
}
state.focused_item = Item::Tab(key);
return event::Status::Captured;
shell.capture_event();
return;
}
break;
@ -464,24 +476,28 @@ where
if self.prev_tab_sensitive(state) {
state.focused_item = Item::PrevButton;
return event::Status::Captured;
shell.capture_event();
return;
}
}
Item::NextButton => {
if let Some(last) = self.last_tab(state) {
state.focused_item = Item::Tab(last);
return event::Status::Captured;
shell.capture_event();
return;
}
}
Item::None => {
if self.next_tab_sensitive(state) {
state.focused_item = Item::NextButton;
return event::Status::Captured;
shell.capture_event();
return;
} else if let Some(last) = self.last_tab(state) {
state.focused_item = Item::Tab(last);
return event::Status::Captured;
shell.capture_event();
return;
}
}
@ -489,11 +505,10 @@ where
}
state.focused_item = Item::None;
event::Status::Ignored
}
/// Item the next item in the widget.
fn focus_next(&mut self, state: &mut LocalState) -> event::Status {
fn focus_next(&mut self, state: &mut LocalState, shell: &mut Shell<'_, Message>) {
match state.focused_item {
Item::Tab(entity) => {
let mut keys = self.iterate_visible_tabs(state);
@ -506,7 +521,8 @@ where
}
state.focused_item = Item::Tab(key);
return event::Status::Captured;
shell.capture_event();
return;
}
break;
@ -515,24 +531,28 @@ where
if self.next_tab_sensitive(state) {
state.focused_item = Item::NextButton;
return event::Status::Captured;
shell.capture_event();
return;
}
}
Item::PrevButton => {
if let Some(first) = self.first_tab(state) {
state.focused_item = Item::Tab(first);
return event::Status::Captured;
shell.capture_event();
return;
}
}
Item::None => {
if self.prev_tab_sensitive(state) {
state.focused_item = Item::PrevButton;
return event::Status::Captured;
shell.capture_event();
return;
} else if let Some(first) = self.first_tab(state) {
state.focused_item = Item::Tab(first);
return event::Status::Captured;
shell.capture_event();
return;
}
}
@ -540,7 +560,6 @@ where
}
state.focused_item = Item::None;
event::Status::Ignored
}
fn iterate_visible_tabs<'b>(
@ -595,12 +614,12 @@ where
icon_spacing = f32::from(self.button_spacing);
let paragraph = entry.or_insert_with(|| {
crate::Plain::new(Text {
content: text.as_ref(),
content: text.to_string(), // TODO should we just use String at this point?
size: iced::Pixels(self.font_size),
bounds: Size::INFINITY,
bounds: Size::INFINITE,
font,
horizontal_alignment: alignment::Horizontal::Left,
vertical_alignment: alignment::Vertical::Center,
align_x: text::Alignment::Left,
align_y: alignment::Vertical::Center,
shaping: Shaping::Advanced,
wrapping: Wrapping::default(),
ellipsize: Ellipsize::default(),
@ -888,7 +907,7 @@ where
}
fn layout(
&self,
&mut self,
tree: &mut Tree,
renderer: &Renderer,
limits: &layout::Limits,
@ -902,17 +921,17 @@ where
}
#[allow(clippy::too_many_lines)]
fn on_event(
fn update(
&mut self,
tree: &mut Tree,
mut event: Event,
mut event: &Event,
layout: Layout<'_>,
cursor_position: mouse::Cursor,
_renderer: &Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
_viewport: &iced::Rectangle,
) -> event::Status {
) {
let my_bounds = layout.bounds();
let state = tree.state.downcast_mut::<LocalState>();
@ -941,7 +960,8 @@ where
"tab drag source finished id={:?}",
my_id
);
return event::Status::Captured;
shell.capture_event();
return;
}
}
DndEvent::Offer(
@ -1137,8 +1157,8 @@ where
});
let (maybe_msg, ret) = state.dnd_state.on_data_received(
mem::take(mime_type),
mem::take(data),
mime_type.clone(),
data.clone(),
None::<fn(_, _) -> Message>,
on_drop,
);
@ -1160,10 +1180,11 @@ where
}
if let Some(on_reorder) = self.on_reorder.as_ref() {
shell.publish(on_reorder(event));
return event::Status::Captured;
shell.capture_event();
return;
}
}
return ret;
return;
}
}
_ => {}
@ -1175,7 +1196,7 @@ where
match event {
Event::Touch(touch::Event::FingerPressed { id, .. }) => {
state.fingers_pressed.insert(id);
state.fingers_pressed.insert(*id);
}
Event::Touch(touch::Event::FingerLifted { id, .. }) => {
@ -1252,7 +1273,8 @@ where
|| (touch_lifted(&event) && fingers_pressed == 1))
{
shell.publish(on_close(key));
return event::Status::Captured;
shell.capture_event();
return;
}
if self.on_middle_press.is_none() {
@ -1263,7 +1285,8 @@ where
{
if state.middle_clicked == Some(Item::Tab(key)) {
shell.publish(on_close(key));
return event::Status::Captured;
shell.capture_event();
return;
}
state.middle_clicked = None;
@ -1315,7 +1338,8 @@ where
state.set_focused();
state.focused_item = Item::Tab(key);
state.pressed_item = None;
return event::Status::Captured;
shell.capture_event();
return;
}
}
}
@ -1336,7 +1360,8 @@ where
});
shell.publish(on_context(key));
return event::Status::Captured;
shell.capture_event();
return;
}
}
}
@ -1347,7 +1372,8 @@ where
state.middle_clicked = Some(Item::Tab(key));
if let Some(on_middle_press) = self.on_middle_press.as_ref() {
shell.publish(on_middle_press(key));
return event::Status::Captured;
shell.capture_event();
return;
}
}
}
@ -1374,7 +1400,7 @@ where
ScrollDelta::Lines { y, .. } | ScrollDelta::Pixels { y, .. } => {
let mut activate_key = None;
if y < 0.0 {
if *y < 0.0 {
let mut prev_key = Entity::null();
for key in self.model.order.iter().copied() {
@ -1386,7 +1412,7 @@ where
prev_key = key;
}
}
} else if y > 0.0 {
} else if *y > 0.0 {
let mut buttons = self.model.order.iter().copied();
while let Some(key) = buttons.next() {
if self.model.is_active(key) {
@ -1405,7 +1431,8 @@ where
shell.publish(on_activate(key));
state.set_focused();
state.focused_item = Item::Tab(key);
return event::Status::Captured;
shell.capture_event();
return;
}
}
}
@ -1424,7 +1451,7 @@ where
if is_pressed(&event) {
state.unfocus();
state.pressed_item = None;
return event::Status::Ignored;
return;
}
} else if is_lifted(&event) {
state.pressed_item = None;
@ -1452,7 +1479,8 @@ where
position,
clipboard,
) {
return event::Status::Captured;
shell.capture_event();
return;
}
}
}
@ -1475,12 +1503,10 @@ where
}) = event
{
state.focused_visible = true;
return if modifiers == keyboard::Modifiers::SHIFT {
self.focus_previous(state)
return if *modifiers == keyboard::Modifiers::SHIFT {
self.focus_previous(state, shell)
} else if modifiers.is_empty() {
self.focus_next(state)
} else {
event::Status::Ignored
self.focus_next(state, shell)
};
}
@ -1524,24 +1550,23 @@ where
Item::None | Item::Set => (),
}
return event::Status::Captured;
shell.capture_event();
return;
}
}
}
event::Status::Ignored
}
fn operate(
&self,
&mut self,
tree: &mut Tree,
_layout: Layout<'_>,
layout: Layout<'_>,
_renderer: &Renderer,
operation: &mut dyn iced_core::widget::Operation<()>,
) {
let state = tree.state.downcast_mut::<LocalState>();
operation.focusable(state, Some(&self.id.0));
operation.custom(state, Some(&self.id.0));
operation.focusable(Some(&self.id.0), layout.bounds(), state);
operation.custom(Some(&self.id.0), layout.bounds(), state);
if let Item::Set = state.focused_item {
if self.prev_tab_sensitive(state) {
@ -1616,6 +1641,7 @@ where
bounds,
border: appearance.border,
shadow: Shadow::default(),
snap: true,
},
background,
);
@ -1644,6 +1670,7 @@ where
..Default::default()
},
shadow: Shadow::default(),
snap: true,
},
background_appearance
.background
@ -1692,6 +1719,7 @@ where
..Default::default()
},
shadow: Shadow::default(),
snap: true,
},
background_appearance
.background
@ -1747,6 +1775,7 @@ where
bounds,
border: Border::default(),
shadow: Shadow::default(),
snap: true,
},
{
let theme = crate::theme::active();
@ -1842,6 +1871,7 @@ where
..Default::default()
},
shadow: Shadow::default(),
snap: true,
},
appearance.active.text_color,
);
@ -1878,6 +1908,7 @@ where
..Default::default()
},
shadow: Shadow::default(),
snap: true,
},
divider_background,
);
@ -1910,6 +1941,7 @@ where
button_appearance.border
},
shadow: Shadow::default(),
snap: true,
},
status_appearance
.background
@ -2069,8 +2101,9 @@ where
fn overlay<'b>(
&'b mut self,
tree: &'b mut Tree,
layout: iced_core::Layout<'_>,
layout: iced_core::Layout<'b>,
_renderer: &Renderer,
viewport: &iced_core::Rectangle,
translation: Vector,
) -> Option<iced_core::overlay::Element<'b, Message, crate::Theme, Renderer>> {
let state = tree.state.downcast_mut::<LocalState>();
@ -2662,6 +2695,7 @@ fn draw_drop_indicator(
..Default::default()
},
shadow: Shadow::default(),
snap: true,
},
Background::Color(color),
);