From 547423279684b744a1a3007656cc507354c2a91a Mon Sep 17 00:00:00 2001 From: Michael Aaron Murphy Date: Sat, 20 Jul 2024 05:55:03 +0200 Subject: [PATCH] fix: widget unfocus on mouse click --- src/app/cosmic.rs | 3 --- src/keyboard_nav.rs | 34 ---------------------------------- src/widget/text_input/input.rs | 10 +++------- 3 files changed, 3 insertions(+), 44 deletions(-) diff --git a/src/app/cosmic.rs b/src/app/cosmic.rs index db69b6fe..77562451 100644 --- a/src/app/cosmic.rs +++ b/src/app/cosmic.rs @@ -371,9 +371,6 @@ impl Cosmic { } Message::KeyboardNav(message) => match message { - keyboard_nav::Message::Unfocus => { - return keyboard_nav::unfocus().map(super::Message::Cosmic) - } keyboard_nav::Message::FocusNext => { return iced::widget::focus_next().map(super::Message::Cosmic) } diff --git a/src/keyboard_nav.rs b/src/keyboard_nav.rs index eed4f84c..95657e40 100644 --- a/src/keyboard_nav.rs +++ b/src/keyboard_nav.rs @@ -17,7 +17,6 @@ pub enum Message { FocusNext, FocusPrevious, Fullscreen, - Unfocus, Search, } @@ -59,42 +58,9 @@ pub fn subscription() -> Subscription { return Some(Message::Search); } - Event::Mouse(mouse::Event::ButtonPressed { .. }) => { - return Some(Message::Unfocus); - } - _ => (), } None }) } - -/// Unfocuses any actively-focused widget. -pub fn unfocus() -> Command { - Command::::widget(unfocus_operation()) -} - -#[must_use] -fn unfocus_operation() -> impl Operation { - struct Unfocus {} - - impl Operation for Unfocus { - fn focusable(&mut self, state: &mut dyn operation::Focusable, _id: Option<&Id>) { - if state.is_focused() { - state.unfocus(); - } - } - - fn container( - &mut self, - _id: Option<&Id>, - _bounds: Rectangle, - operate_on_children: &mut dyn FnMut(&mut dyn Operation), - ) { - operate_on_children(self); - } - } - - Unfocus {} -} diff --git a/src/widget/text_input/input.rs b/src/widget/text_input/input.rs index 773a346e..b7fbe9db 100644 --- a/src/widget/text_input/input.rs +++ b/src/widget/text_input/input.rs @@ -1210,19 +1210,15 @@ where let state = state(); let is_clicked = cursor_position.is_over(text_layout.bounds()) && on_input.is_some(); - state.is_focused = if is_clicked { - state.is_focused.or_else(|| { + if is_clicked { + state.is_focused = state.is_focused.or_else(|| { let now = Instant::now(); Some(Focus { updated_at: now, now, }) - }) - } else { - None - }; + }); - if is_clicked { let Some(pos) = cursor_position.position() else { return event::Status::Ignored; };