fix: window id handling for multi-window
This commit is contained in:
parent
324ef6e905
commit
8a017a15ee
5 changed files with 38 additions and 9 deletions
|
|
@ -743,6 +743,7 @@ where
|
||||||
|
|
||||||
#[cfg(feature = "multi-window")]
|
#[cfg(feature = "multi-window")]
|
||||||
pub fn view(&self, id: window::Id) -> Element<'_, crate::Action<T::Message>> {
|
pub fn view(&self, id: window::Id) -> Element<'_, crate::Action<T::Message>> {
|
||||||
|
crate::widget::text_context_menu::set_current_window_id(id);
|
||||||
#[cfg(all(wayland_platform, target_os = "linux"))]
|
#[cfg(all(wayland_platform, target_os = "linux"))]
|
||||||
if let Some((_, _, _, Some(v))) = self.surface_views.get(&id) {
|
if let Some((_, _, _, Some(v))) = self.surface_views.get(&id) {
|
||||||
return v(&self.app);
|
return v(&self.app);
|
||||||
|
|
@ -756,8 +757,6 @@ where
|
||||||
return self.app.view_window(id).map(crate::Action::App);
|
return self.app.view_window(id).map(crate::Action::App);
|
||||||
}
|
}
|
||||||
|
|
||||||
crate::widget::text_context_menu::set_current_window_id(id);
|
|
||||||
|
|
||||||
let view = if self.app.core().window.use_template {
|
let view = if self.app.core().window.use_template {
|
||||||
self.app.view_main()
|
self.app.view_main()
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
use crate::Renderer;
|
use crate::Renderer;
|
||||||
use crate::widget::menu::MenuBarState;
|
use crate::widget::menu::MenuBarState;
|
||||||
|
|
||||||
|
use iced::window;
|
||||||
use iced_core::event::Event;
|
use iced_core::event::Event;
|
||||||
use iced_core::text::LineHeight;
|
use iced_core::text::LineHeight;
|
||||||
use iced_core::widget::Widget;
|
use iced_core::widget::Widget;
|
||||||
|
|
@ -30,6 +31,7 @@ pub struct SelectableText<'a> {
|
||||||
inner: InnerText<'a>,
|
inner: InnerText<'a>,
|
||||||
selectable: bool,
|
selectable: bool,
|
||||||
context_menu: bool,
|
context_menu: bool,
|
||||||
|
window_id: window::Id,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> SelectableText<'a> {
|
impl<'a> SelectableText<'a> {
|
||||||
|
|
@ -41,6 +43,7 @@ impl<'a> SelectableText<'a> {
|
||||||
inner: InnerText::new(content),
|
inner: InnerText::new(content),
|
||||||
selectable: true,
|
selectable: true,
|
||||||
context_menu: true,
|
context_menu: true,
|
||||||
|
window_id: crate::widget::text_context_menu::current_window_id(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -183,6 +186,7 @@ impl<'a> From<InnerText<'a>> for SelectableText<'a> {
|
||||||
inner,
|
inner,
|
||||||
selectable: true,
|
selectable: true,
|
||||||
context_menu: true,
|
context_menu: true,
|
||||||
|
window_id: crate::widget::text_context_menu::current_window_id(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -356,6 +360,7 @@ impl<'a, Message: Clone + 'static> Widget<Message, crate::Theme, Renderer> for S
|
||||||
renderer,
|
renderer,
|
||||||
viewport,
|
viewport,
|
||||||
cursor,
|
cursor,
|
||||||
|
self.window_id,
|
||||||
);
|
);
|
||||||
|
|
||||||
self.inner
|
self.inner
|
||||||
|
|
@ -380,7 +385,11 @@ impl<'a, Message: Clone + 'static> Widget<Message, crate::Theme, Renderer> for S
|
||||||
|
|
||||||
let wrapper_state = tree.state.downcast_ref::<TextWrapperState>();
|
let wrapper_state = tree.state.downcast_ref::<TextWrapperState>();
|
||||||
let menu_bar_state = wrapper_state.menu_bar_state.clone();
|
let menu_bar_state = wrapper_state.menu_bar_state.clone();
|
||||||
crate::widget::text_context_menu::dismiss_popup_on_event(&menu_bar_state, event);
|
crate::widget::text_context_menu::dismiss_popup_on_event(
|
||||||
|
&menu_bar_state,
|
||||||
|
event,
|
||||||
|
self.window_id,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
w_mut::<Message>(&mut self.inner).update(
|
w_mut::<Message>(&mut self.inner).update(
|
||||||
|
|
@ -477,6 +486,7 @@ impl<'a, Message: Clone + 'static> From<SelectableText<'a>> for crate::Element<'
|
||||||
inner,
|
inner,
|
||||||
selectable,
|
selectable,
|
||||||
context_menu,
|
context_menu,
|
||||||
|
window_id,
|
||||||
} = text;
|
} = text;
|
||||||
// Apply selection to the inner widget here, at the last moment before
|
// Apply selection to the inner widget here, at the last moment before
|
||||||
// it becomes part of the tree. iced's `Text::selectable()` is one-way
|
// it becomes part of the tree. iced's `Text::selectable()` is one-way
|
||||||
|
|
@ -491,6 +501,7 @@ impl<'a, Message: Clone + 'static> From<SelectableText<'a>> for crate::Element<'
|
||||||
inner,
|
inner,
|
||||||
selectable,
|
selectable,
|
||||||
context_menu,
|
context_menu,
|
||||||
|
window_id,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,8 @@
|
||||||
|
|
||||||
pub use iced_core::widget::text::HasSelectableText;
|
pub use iced_core::widget::text::HasSelectableText;
|
||||||
#[cfg(wayland_platform)]
|
#[cfg(wayland_platform)]
|
||||||
|
use iced_core::window;
|
||||||
|
#[cfg(wayland_platform)]
|
||||||
use iced_runtime::platform_specific::wayland::CornerRadius;
|
use iced_runtime::platform_specific::wayland::CornerRadius;
|
||||||
|
|
||||||
#[cfg(wayland_platform)]
|
#[cfg(wayland_platform)]
|
||||||
|
|
@ -486,10 +488,10 @@ pub(crate) fn create_text_context_popup(
|
||||||
renderer: &crate::Renderer,
|
renderer: &crate::Renderer,
|
||||||
viewport: &Rectangle,
|
viewport: &Rectangle,
|
||||||
cursor: mouse::Cursor,
|
cursor: mouse::Cursor,
|
||||||
|
window_id: window::Id,
|
||||||
) {
|
) {
|
||||||
use iced_runtime::platform_specific::wayland::popup::{SctkPopupSettings, SctkPositioner};
|
use iced_runtime::platform_specific::wayland::popup::{SctkPopupSettings, SctkPositioner};
|
||||||
|
|
||||||
let window_id = current_window_id();
|
|
||||||
if window_id == iced_core::window::Id::NONE {
|
if window_id == iced_core::window::Id::NONE {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -625,7 +627,11 @@ pub(crate) fn create_text_context_popup(
|
||||||
/// Dismisses this widget's open context-menu popup on an outside click,
|
/// Dismisses this widget's open context-menu popup on an outside click,
|
||||||
/// touch, or Escape.
|
/// touch, or Escape.
|
||||||
#[cfg(wayland_platform)]
|
#[cfg(wayland_platform)]
|
||||||
pub(crate) fn dismiss_popup_on_event(menu_bar_state: &MenuBarState, event: &event::Event) {
|
pub(crate) fn dismiss_popup_on_event(
|
||||||
|
menu_bar_state: &MenuBarState,
|
||||||
|
event: &event::Event,
|
||||||
|
window_id: window::Id,
|
||||||
|
) {
|
||||||
let is_dismiss = matches!(
|
let is_dismiss = matches!(
|
||||||
event,
|
event,
|
||||||
event::Event::Mouse(mouse::Event::ButtonPressed(
|
event::Event::Mouse(mouse::Event::ButtonPressed(
|
||||||
|
|
@ -639,7 +645,6 @@ pub(crate) fn dismiss_popup_on_event(menu_bar_state: &MenuBarState, event: &even
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let window_id = current_window_id();
|
|
||||||
let popup_id = menu_bar_state
|
let popup_id = menu_bar_state
|
||||||
.inner
|
.inner
|
||||||
.with_data(|state| state.popup_id.get(&window_id).copied());
|
.with_data(|state| state.popup_id.get(&window_id).copied());
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ use iced_core::text::highlighter;
|
||||||
use iced_core::widget::Widget;
|
use iced_core::widget::Widget;
|
||||||
use iced_core::widget::tree::{self, Tree};
|
use iced_core::widget::tree::{self, Tree};
|
||||||
use iced_core::{
|
use iced_core::{
|
||||||
Clipboard, Layout, Length, Rectangle, Shell, Size, Vector, mouse, overlay, renderer,
|
Clipboard, Layout, Length, Rectangle, Shell, Size, Vector, mouse, overlay, renderer, window,
|
||||||
};
|
};
|
||||||
|
|
||||||
type InnerEditor<'a, Message> =
|
type InnerEditor<'a, Message> =
|
||||||
|
|
@ -24,6 +24,7 @@ type InnerEditor<'a, Message> =
|
||||||
pub struct TextEditor<'a, Message> {
|
pub struct TextEditor<'a, Message> {
|
||||||
inner: InnerEditor<'a, Message>,
|
inner: InnerEditor<'a, Message>,
|
||||||
has_context_menu: bool,
|
has_context_menu: bool,
|
||||||
|
window_id: window::Id,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct EditorWrapperState {
|
struct EditorWrapperState {
|
||||||
|
|
@ -37,6 +38,7 @@ impl<'a, Message: Clone + 'static> TextEditor<'a, Message> {
|
||||||
Self {
|
Self {
|
||||||
inner: iced_widget::text_editor(content),
|
inner: iced_widget::text_editor(content),
|
||||||
has_context_menu: true,
|
has_context_menu: true,
|
||||||
|
window_id: crate::widget::text_context_menu::current_window_id(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -300,6 +302,7 @@ impl<'a, Message: Clone + 'static> Widget<Message, crate::Theme, crate::Renderer
|
||||||
renderer,
|
renderer,
|
||||||
viewport,
|
viewport,
|
||||||
cursor,
|
cursor,
|
||||||
|
self.window_id,
|
||||||
);
|
);
|
||||||
|
|
||||||
self.inner
|
self.inner
|
||||||
|
|
@ -334,7 +337,11 @@ impl<'a, Message: Clone + 'static> Widget<Message, crate::Theme, crate::Renderer
|
||||||
// Dismiss popup on outside click / Escape.
|
// Dismiss popup on outside click / Escape.
|
||||||
let wrapper_state = tree.state.downcast_ref::<EditorWrapperState>();
|
let wrapper_state = tree.state.downcast_ref::<EditorWrapperState>();
|
||||||
let menu_bar_state = wrapper_state.menu_bar_state.clone();
|
let menu_bar_state = wrapper_state.menu_bar_state.clone();
|
||||||
crate::widget::text_context_menu::dismiss_popup_on_event(&menu_bar_state, event);
|
crate::widget::text_context_menu::dismiss_popup_on_event(
|
||||||
|
&menu_bar_state,
|
||||||
|
event,
|
||||||
|
self.window_id,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ew_mut::<Message>(&mut self.inner).update(
|
ew_mut::<Message>(&mut self.inner).update(
|
||||||
|
|
|
||||||
|
|
@ -218,6 +218,7 @@ pub struct TextInput<'a, Message> {
|
||||||
/// The text input tracks and manages the input value in its state.
|
/// The text input tracks and manages the input value in its state.
|
||||||
manage_value: bool,
|
manage_value: bool,
|
||||||
drag_threshold: f32,
|
drag_threshold: f32,
|
||||||
|
window_id: window::Id,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, Message> TextInput<'a, Message>
|
impl<'a, Message> TextInput<'a, Message>
|
||||||
|
|
@ -268,6 +269,7 @@ where
|
||||||
always_active: false,
|
always_active: false,
|
||||||
manage_value: false,
|
manage_value: false,
|
||||||
drag_threshold: 20.0,
|
drag_threshold: 20.0,
|
||||||
|
window_id: crate::widget::text_context_menu::current_window_id(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -922,7 +924,11 @@ where
|
||||||
#[cfg(all(wayland_platform, feature = "winit"))]
|
#[cfg(all(wayland_platform, feature = "winit"))]
|
||||||
if self.uses_popup_context_menu() {
|
if self.uses_popup_context_menu() {
|
||||||
let menu_bar_state = tree.state.downcast_ref::<State>().menu_bar_state.clone();
|
let menu_bar_state = tree.state.downcast_ref::<State>().menu_bar_state.clone();
|
||||||
crate::widget::text_context_menu::dismiss_popup_on_event(&menu_bar_state, event);
|
crate::widget::text_context_menu::dismiss_popup_on_event(
|
||||||
|
&menu_bar_state,
|
||||||
|
event,
|
||||||
|
self.window_id,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
let text_layout = self.text_layout(layout);
|
let text_layout = self.text_layout(layout);
|
||||||
|
|
@ -1062,6 +1068,7 @@ where
|
||||||
renderer,
|
renderer,
|
||||||
viewport,
|
viewport,
|
||||||
cursor_position,
|
cursor_position,
|
||||||
|
self.window_id,
|
||||||
);
|
);
|
||||||
|
|
||||||
let state = tree.state.downcast_mut::<State>();
|
let state = tree.state.downcast_mut::<State>();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue