diff --git a/cosmic-theme/src/steps.rs b/cosmic-theme/src/steps.rs index de23e52..6487ba8 100644 --- a/cosmic-theme/src/steps.rs +++ b/cosmic-theme/src/steps.rs @@ -63,7 +63,9 @@ pub fn get_text( } else { step_array }; - let Some(index) = get_index(base_index, 70, step_array.len(), is_dark).or_else(|| get_index(base_index, 50, step_array.len(), is_dark)) else { + let Some(index) = get_index(base_index, 70, step_array.len(), is_dark) + .or_else(|| get_index(base_index, 50, step_array.len(), is_dark)) + else { return fallback.to_owned(); }; diff --git a/examples/cosmic/src/window/demo.rs b/examples/cosmic/src/window/demo.rs index 0609ea9..69be5cc 100644 --- a/examples/cosmic/src/window/demo.rs +++ b/examples/cosmic/src/window/demo.rs @@ -500,7 +500,6 @@ impl State { ) .on_input(Message::InputChanged) // .on_submit(Message::Activate(None)) - .padding(8) .size(20) .id(INPUT_ID.clone()) .into(), @@ -508,6 +507,11 @@ impl State { .width(Length::Fill) .on_input(Message::InputChanged) .into(), + cosmic::widget::text_input("test", &self.entry_value) + .width(Length::Fixed(600.0)) + .padding(32) + .on_input(Message::InputChanged) + .into(), cosmic::widget::search_input( "test", &self.entry_value, @@ -516,6 +520,43 @@ impl State { .width(Length::Fill) .on_input(Message::InputChanged) .into(), + cosmic::widget::text_input("test", &self.entry_value) + .width(Length::Fixed(600.0)) + .on_input(Message::InputChanged) + .into(), + cosmic::widget::search_input( + "test", + &self.entry_value, + Some(Message::InputChanged("".to_string())), + ) + .width(Length::Fixed(100.0)) + .on_input(Message::InputChanged) + .into(), + cosmic::widget::search_input( + "test", + &self.entry_value, + Some(Message::InputChanged("".to_string())), + ) + .padding([24, 48]) + .width(Length::Fixed(400.0)) + .on_input(Message::InputChanged) + .into(), + cosmic::widget::search_input( + "test", + &self.entry_value, + Some(Message::InputChanged("".to_string())), + ) + .width(Length::Fixed(400.0)) + .on_input(Message::InputChanged) + .into(), + cosmic::widget::search_input( + "test", + &self.entry_value, + Some(Message::InputChanged("".to_string())), + ) + .width(Length::Fixed(800.0)) + .on_input(Message::InputChanged) + .into(), ]) .into() } diff --git a/src/widget/segmented_button/model/mod.rs b/src/widget/segmented_button/model/mod.rs index 425dcf8..405f278 100644 --- a/src/widget/segmented_button/model/mod.rs +++ b/src/widget/segmented_button/model/mod.rs @@ -339,7 +339,7 @@ where /// ``` pub fn position_set(&mut self, id: Entity, position: u16) -> Option { let Some(index) = self.position(id) else { - return None + return None; }; let position = self.order.len().min(position as usize); @@ -360,11 +360,11 @@ where /// ``` pub fn position_swap(&mut self, first: Entity, second: Entity) -> bool { let Some(first_index) = self.position(first) else { - return false + return false; }; let Some(second_index) = self.position(second) else { - return false + return false; }; self.order.swap(first_index as usize, second_index as usize); diff --git a/src/widget/text_input/input.rs b/src/widget/text_input/input.rs index abb4290..37b4e46 100644 --- a/src/widget/text_input/input.rs +++ b/src/widget/text_input/input.rs @@ -705,7 +705,8 @@ where ); } } - + let mut children = layout.children(); + let layout = children.next().unwrap(); mouse_interaction(layout, cursor_position, self.on_input.is_none()) } } @@ -765,11 +766,11 @@ pub fn layout( helper_text_size: f32, helper_text_line_height: text::LineHeight, ) -> layout::Node { + let limits = limits.width(width); let spacing = THEME.with(|t| t.borrow().cosmic().space_xxs()); let mut nodes = Vec::with_capacity(3); let text_pos = if let Some(label) = label { - let limits = limits.width(width); let text_bounds = limits.resolve(Size::ZERO); let label_size = renderer.measure( @@ -788,11 +789,14 @@ pub fn layout( }; let text_size = size.unwrap_or_else(|| renderer.default_size()); + let mut text_input_height = text_size * 1.2; let padding = padding.fit(Size::ZERO, limits.max()); let helper_pos = if start_icon.is_some() || end_icon.is_some() { // TODO configurable icon spacing, maybe via appearance - let mut height = text_size * 1.2; + let limits_copy = limits; + + let limits = limits.pad(padding); let icon_spacing = 8.0; let (start_icon_width, mut start_icon) = if let Some(icon) = start_icon.as_ref() { let icon_node = icon.layout( @@ -801,7 +805,7 @@ pub fn layout( .width(icon.as_widget().width()) .height(icon.as_widget().height()), ); - height = height.max(icon_node.bounds().height); + text_input_height = text_input_height.max(icon_node.bounds().height); (icon_node.bounds().width + icon_spacing, Some(icon_node)) } else { (0.0, None) @@ -814,12 +818,12 @@ pub fn layout( .width(icon.as_widget().width()) .height(icon.as_widget().height()), ); - height = height.max(icon_node.bounds().height); + text_input_height = text_input_height.max(icon_node.bounds().height); (icon_node.bounds().width + icon_spacing, Some(icon_node)) } else { (0.0, None) }; - let text_limits = limits.width(width).pad(padding).height(text_size * 1.2); + let text_limits = limits.width(width).height(text_size * 1.2); let text_bounds = text_limits.resolve(Size::ZERO); @@ -828,7 +832,7 @@ pub fn layout( text_node.move_to(Point::new( padding.left + start_icon_width, - padding.top + ((height - text_size * 1.2) / 2.0).max(0.0), + padding.top + ((text_input_height - text_size * 1.2) / 2.0).max(0.0), )); let mut node_list: Vec<_> = Vec::with_capacity(3); @@ -844,21 +848,33 @@ pub fn layout( } if let Some(mut end_icon) = end_icon.take() { end_icon.move_to(Point::new( - text_node_bounds.x + text_node_bounds.width, + text_node_bounds.x + text_node_bounds.width + f32::from(spacing), padding.top + ((text_size * 1.2 - end_icon.bounds().height) / 2.0).max(0.0), )); node_list.push(end_icon); } - let input_limits = limits.width(width).pad(padding).height(height); - let input_bounds = input_limits.resolve(Size::ZERO); + let text_input_size = Size::new( + text_node_bounds.x + text_node_bounds.width + end_icon_width, + text_input_height, + ) + .pad(padding); + + let input_limits = limits_copy + .width(width) + .height(text_input_height.max(text_input_size.height)) + .min_width(text_input_size.width); + let input_bounds = input_limits.resolve(text_input_size); let input_node = layout::Node::with_children(input_bounds, node_list).translate(text_pos); let y_pos = input_node.bounds().y + input_node.bounds().height + f32::from(spacing); nodes.push(input_node); Vector::new(0.0, y_pos) } else { - let limits = limits.width(width).pad(padding).height(text_size * 1.2); + let limits = limits + .width(width) + .height(text_input_height + padding.vertical()) + .pad(padding); let text_bounds = limits.resolve(Size::ZERO); let mut text = layout::Node::new(text_bounds); @@ -898,7 +914,11 @@ pub fn layout( ) }); size.height += (nodes.len() - 1) as f32 * f32::from(spacing); - let limits = limits.width(width).pad(padding).height(size.height); + + let limits = limits + .width(width) + .height(size.height) + .min_width(size.width); layout::Node::with_children(limits.resolve(size), nodes) } @@ -1182,7 +1202,9 @@ where let state = state(); if let Some(focus) = &mut state.is_focused { - let Some(on_input) = on_input else { return event::Status::Ignored }; + let Some(on_input) = on_input else { + return event::Status::Ignored; + }; if state.is_pasting.is_none() && !state.keyboard_modifiers.command() @@ -1205,7 +1227,9 @@ where let state = state(); if let Some(focus) = &mut state.is_focused { - let Some(on_input) = on_input else { return event::Status::Ignored }; + let Some(on_input) = on_input else { + return event::Status::Ignored; + }; let modifiers = state.keyboard_modifiers; focus.updated_at = Instant::now(); @@ -1433,7 +1457,7 @@ where wayland::DndOfferEvent::Enter { x, y, mime_types }, ))) => { let Some(on_dnd_command_produced) = on_dnd_command_produced else { - return event::Status::Ignored + return event::Status::Ignored; }; let state = state(); @@ -1588,8 +1612,8 @@ where .iter() .find(|m| mime_types.contains(&(**m).to_string())) else { - state.dnd_offer = DndOfferState::None; - return event::Status::Captured; + state.dnd_offer = DndOfferState::None; + return event::Status::Captured; }; state.dnd_offer = DndOfferState::Dropped; shell.publish(on_dnd_command_produced(Box::new(move || {