fix: explicit lifetimes for view closures
This commit is contained in:
parent
add66a6424
commit
354b4866ec
6 changed files with 127 additions and 93 deletions
|
|
@ -1,6 +1,7 @@
|
|||
use cosmic::app::Core;
|
||||
use cosmic::iced::event::listen_with;
|
||||
use cosmic::iced::window::Id;
|
||||
use cosmic::iced::{Length, Limits, Task};
|
||||
use cosmic::iced::{self, Length, Limits, Task};
|
||||
use cosmic::iced_runtime::core::window;
|
||||
use cosmic::iced_runtime::platform_specific::wayland::popup::SctkPopupSettings;
|
||||
use cosmic::iced_runtime::platform_specific::wayland::subsurface;
|
||||
|
|
@ -114,7 +115,7 @@ impl cosmic::Application for Window {
|
|||
self.example_row = toggled;
|
||||
}
|
||||
|
||||
Message::Surface(surface_message) => {}
|
||||
Message::Surface(_) => {}
|
||||
Message::Selected(i) => {
|
||||
self.selected = Some(i);
|
||||
return cosmic::task::message(cosmic::app::message::destroy_popup::<Window>(
|
||||
|
|
@ -123,16 +124,14 @@ impl cosmic::Application for Window {
|
|||
}
|
||||
Message::OpenDropdown(sctk_popup_settings, view) => {
|
||||
self.dropdown_id = sctk_popup_settings.id;
|
||||
return cosmic::task::message(cosmic::app::message::app_popup::<
|
||||
Window,
|
||||
>(
|
||||
move |_: &mut Window| sctk_popup_settings.clone(),
|
||||
Some(
|
||||
move |_: &Window| -> cosmic::Element<'static, cosmic::app::Message<Message>> {
|
||||
view().map(cosmic::app::Message::App)
|
||||
},
|
||||
),
|
||||
));
|
||||
return cosmic::task::message(cosmic::app::message::app_popup::<Window>(
|
||||
move |_: &mut Window| sctk_popup_settings.clone(),
|
||||
Some(Box::new(
|
||||
move |_: &Window| -> cosmic::Element<'_, cosmic::app::Message<Message>> {
|
||||
view().map(cosmic::app::Message::App)
|
||||
},
|
||||
)),
|
||||
));
|
||||
}
|
||||
Message::PopupCloseRequested(id) => {
|
||||
return cosmic::task::message(cosmic::app::message::destroy_popup::<Window>(id));
|
||||
|
|
@ -169,57 +168,67 @@ impl cosmic::Application for Window {
|
|||
popup_settings
|
||||
},
|
||||
Some(
|
||||
move |state: &Window| -> cosmic::Element<
|
||||
'static,
|
||||
cosmic::app::Message<Message>,
|
||||
> {
|
||||
{
|
||||
let content_list = list_column().padding(5).spacing(0).add(
|
||||
settings::item(
|
||||
"Example row",
|
||||
cosmic::widget::container(
|
||||
toggler(state.example_row).on_toggle(|value| {
|
||||
Message::ToggleExampleRow(value)
|
||||
}),
|
||||
)
|
||||
.height(Length::Fixed(50.)),
|
||||
),
|
||||
).add(dropdown(&["1", "asdf", "hello", "test"], state.selected, Message::Selected).with_popup(state.popup.unwrap_or(Id::NONE), Message::OpenDropdown).on_close_popup(Message::PopupCloseRequested)
|
||||
);
|
||||
Element::from(
|
||||
state.core.applet.popup_container(content_list),
|
||||
)
|
||||
.map(cosmic::app::Message::App)
|
||||
}
|
||||
},
|
||||
Box::new(
|
||||
move |state: &Window| -> cosmic::Element<
|
||||
'_,
|
||||
cosmic::app::Message<Message>,
|
||||
> {
|
||||
{
|
||||
let content_list = list_column()
|
||||
.padding(5)
|
||||
.spacing(0)
|
||||
.add(settings::item(
|
||||
"Example row",
|
||||
cosmic::widget::container(
|
||||
toggler(state.example_row).on_toggle(|value| {
|
||||
Message::ToggleExampleRow(value)
|
||||
}),
|
||||
)
|
||||
.height(Length::Fixed(50.)),
|
||||
))
|
||||
.add(
|
||||
dropdown(
|
||||
&["1", "asdf", "hello", "test"],
|
||||
state.selected,
|
||||
Message::Selected,
|
||||
)
|
||||
.with_popup(
|
||||
state.popup.unwrap_or(Id::NONE),
|
||||
Message::OpenDropdown,
|
||||
)
|
||||
.on_close_popup(Message::PopupCloseRequested),
|
||||
);
|
||||
Element::from(
|
||||
state.core.applet.popup_container(content_list),
|
||||
)
|
||||
.map(cosmic::app::Message::App)
|
||||
}
|
||||
},
|
||||
),
|
||||
),
|
||||
)
|
||||
},
|
||||
),
|
||||
|_| {
|
||||
cosmic::app::message::subsurface(
|
||||
|app: &mut Window| {
|
||||
subsurface::SctkSubsurfaceSettings {
|
||||
parent: window::Id::RESERVED,
|
||||
id: app.subsurface_id,
|
||||
loc: iced_core::Point { x: -100., y: 0. },
|
||||
size: Some((10., 10.).into()),
|
||||
z: 1,
|
||||
}
|
||||
|app: &mut Window| subsurface::SctkSubsurfaceSettings {
|
||||
parent: window::Id::RESERVED,
|
||||
id: app.subsurface_id,
|
||||
loc: iced_core::Point { x: -100., y: 0. },
|
||||
size: Some((10., 10.).into()),
|
||||
z: 1,
|
||||
steal_keyboard_focus: true,
|
||||
},
|
||||
Some(|_: &Window| {
|
||||
autosize::autosize(
|
||||
Some(Box::new(|_: &'_ Window| {
|
||||
Element::from(autosize::autosize(
|
||||
layer_container(cosmic::widget::text("hello"))
|
||||
.layer(cosmic::cosmic_theme::Layer::Background),
|
||||
SUBSURFACE_ID.clone(),
|
||||
)
|
||||
.into()
|
||||
}),
|
||||
))
|
||||
})),
|
||||
)
|
||||
},
|
||||
cosmic::app::message::destroy_subsurface::<Window>(
|
||||
self.subsurface_id
|
||||
),
|
||||
cosmic::app::message::destroy_subsurface::<Window>(self.subsurface_id),
|
||||
)
|
||||
.into()
|
||||
}
|
||||
|
|
@ -231,4 +240,13 @@ impl cosmic::Application for Window {
|
|||
fn style(&self) -> Option<cosmic::iced_runtime::Appearance> {
|
||||
Some(cosmic::applet::style())
|
||||
}
|
||||
|
||||
fn subscription(&self) -> cosmic::iced::Subscription<Self::Message> {
|
||||
listen_with(|e, status, id| {
|
||||
if matches!(e, iced::event::Event::Keyboard(_)) {
|
||||
dbg!(e, id);
|
||||
}
|
||||
None
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ use apply::Apply;
|
|||
use cosmic::app::{Core, Settings, Task};
|
||||
use cosmic::dialog::file_chooser::{self, FileFilter};
|
||||
use cosmic::iced_core::Length;
|
||||
use cosmic::surface_message::{SurfaceMessage, SurfaceMessageHandler};
|
||||
use cosmic::widget::button;
|
||||
use cosmic::{executor, iced, ApplicationExt, Element};
|
||||
use std::sync::Arc;
|
||||
|
|
@ -34,6 +35,22 @@ pub enum Message {
|
|||
OpenError(Arc<file_chooser::Error>),
|
||||
OpenFile,
|
||||
Selected(Url),
|
||||
Surface(SurfaceMessage),
|
||||
}
|
||||
|
||||
impl SurfaceMessageHandler for Message {
|
||||
fn to_surface_message(self) -> cosmic::surface_message::MessageWrapper<Self> {
|
||||
match self {
|
||||
Message::Surface(m) => cosmic::surface_message::MessageWrapper::Surface(m),
|
||||
m => cosmic::surface_message::MessageWrapper::Message(m),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<SurfaceMessage> for Message {
|
||||
fn from(value: SurfaceMessage) -> Self {
|
||||
Message::Surface(value)
|
||||
}
|
||||
}
|
||||
|
||||
/// The [`App`] stores application-specific state.
|
||||
|
|
@ -91,13 +108,11 @@ impl cosmic::Application for App {
|
|||
Message::Cancelled => {
|
||||
eprintln!("open file dialog cancelled");
|
||||
}
|
||||
|
||||
Message::FileRead(url, contents) => {
|
||||
eprintln!("read file");
|
||||
self.selected_file = Some(url);
|
||||
self.file_contents = contents;
|
||||
}
|
||||
|
||||
Message::Selected(url) => {
|
||||
eprintln!("selected file");
|
||||
|
||||
|
|
@ -142,8 +157,6 @@ impl cosmic::Application for App {
|
|||
Message::FileRead(url, contents)
|
||||
});
|
||||
}
|
||||
|
||||
// Creates a new open dialog.
|
||||
Message::OpenFile => {
|
||||
return cosmic::task::future(async move {
|
||||
eprintln!("opening new dialog");
|
||||
|
|
@ -169,13 +182,9 @@ impl cosmic::Application for App {
|
|||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Displays an error in the application's warning bar.
|
||||
Message::Error(why) => {
|
||||
self.error_status = Some(why);
|
||||
}
|
||||
|
||||
// Displays an error in the application's warning bar.
|
||||
Message::OpenError(why) => {
|
||||
if let Some(why) = Arc::into_inner(why) {
|
||||
let mut source: &dyn std::error::Error = &why;
|
||||
|
|
@ -190,10 +199,10 @@ impl cosmic::Application for App {
|
|||
self.error_status = Some(string);
|
||||
}
|
||||
}
|
||||
|
||||
Message::CloseError => {
|
||||
self.error_status = None;
|
||||
}
|
||||
Message::Surface(surface_message) => {}
|
||||
}
|
||||
|
||||
Task::none()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue