use crate::prelude::{PassedUrl, Webview, WebviewUri};
use crate::webview::handlers::{RegisterWryEvent, WryEvents};
use bevy::prelude::{
App, Commands, Entity, Event, EventWriter, Plugin, PreUpdate, Reflect, Res, Window,
};
#[derive(Event, Clone, Debug, Reflect)]
pub struct NewWindowOpened {
pub webview_entity: Entity,
pub opened_window_entity: Entity,
pub url: PassedUrl,
}
#[derive(Event, Clone, Debug, Reflect)]
pub(crate) struct NewWindowRequested {
pub webview_entity: Entity,
pub url: PassedUrl,
pub window: Window,
}
pub(crate) struct NewWindowRequestedPlugin;
impl Plugin for NewWindowRequestedPlugin {
fn build(&self, app: &mut App) {
app.register_type::<NewWindowRequested>()
.add_event::<NewWindowRequested>()
.init_resource::<WryEvents<NewWindowRequested>>()
.register_wry_event::<NewWindowOpened>()
.add_systems(PreUpdate, open_new_window);
}
}
fn open_new_window(
mut commands: Commands,
mut ew: EventWriter<NewWindowOpened>,
events: Res<WryEvents<NewWindowRequested>>,
) {
for request in events.take_events() {
let opened_window_entity = commands
.spawn((
request.window,
Webview::Uri(WebviewUri(request.url.0.to_string())),
))
.id();
ew.write(NewWindowOpened {
webview_entity: request.webview_entity,
opened_window_entity,
url: request.url,
});
}
}