#![cfg(feature = "window")]
use zng_app::handler::APP_HANDLER;
pub use zng_app::window::{MonitorId, WINDOW, WindowId, WindowMode};
pub use zng_ext_window::{
AppRunWindowExt, AutoSize, CloseWindowResult, FocusIndicator, HeadlessAppWindowExt, HeadlessMonitor, IME_EVENT, ImeArgs, MONITORS,
MONITORS_CHANGED_EVENT, MonitorInfo, MonitorQuery, MonitorsChangedArgs, ParallelWin, RenderMode, StartPosition, VideoMode,
WINDOW_CHANGED_EVENT, WINDOW_CLOSE_EVENT, WINDOW_CLOSE_REQUESTED_EVENT, WINDOW_Ext, WINDOW_LOAD_EVENT, WINDOW_OPEN_EVENT, WINDOWS,
WidgetInfoBuilderImeArea, WidgetInfoImeArea, WindowButton, WindowCapability, WindowChangedArgs, WindowCloseArgs,
WindowCloseRequestedArgs, WindowIcon, WindowLoadingHandle, WindowOpenArgs, WindowRoot, WindowRootExtenderArgs, WindowState,
WindowStateAllowed, WindowVars,
};
#[cfg(feature = "image")]
pub use zng_ext_window::{FRAME_IMAGE_READY_EVENT, FrameCaptureMode, FrameImageReadyArgs};
pub mod cmd {
pub use zng_ext_window::cmd::*;
#[cfg(feature = "inspector")]
pub use zng_wgt_inspector::INSPECT_CMD;
}
pub use zng_wgt_window::{BlockWindowLoad, DefaultStyle, WINDOWS_Ext, Window};
pub use zng_wgt_window::events::{
on_ime, on_pre_ime, on_pre_window_changed, on_pre_window_close_requested, on_pre_window_exited_fullscreen, on_pre_window_fullscreen,
on_pre_window_load, on_pre_window_maximized, on_pre_window_minimized, on_pre_window_moved, on_pre_window_open, on_pre_window_resized,
on_pre_window_restored, on_pre_window_state_changed, on_pre_window_unmaximized, on_pre_window_unminimized, on_window_changed,
on_window_close_requested, on_window_exited_fullscreen, on_window_fullscreen, on_window_load, on_window_maximized, on_window_minimized,
on_window_moved, on_window_open, on_window_resized, on_window_restored, on_window_state_changed, on_window_unmaximized,
on_window_unminimized,
};
#[cfg(feature = "image")]
pub use zng_wgt_window::events::{on_frame_image_ready, on_pre_frame_image_ready};
#[cfg(feature = "inspector")]
pub mod inspector {
pub use zng_wgt_inspector::debug::{InspectMode, show_bounds, show_center_points, show_directional_query, show_hit_test, show_rows};
pub use zng_wgt_inspector::{INSPECTOR, InspectedInfo, InspectedTree, InspectedWidget, InspectorWatcherBuilder};
}
pub fn default_mobile_nested_open_handler(args: &mut zng_ext_window::OpenNestedHandlerArgs) {
use crate::prelude::*;
if !matches!(WINDOW.mode(), WindowMode::Headed) {
return;
}
let open: Vec<_> = WINDOWS
.widget_trees()
.into_iter()
.filter(|w| {
WINDOWS.mode(w.window_id()) == Some(window::WindowMode::Headed)
&& WINDOWS
.vars(w.window_id())
.map(|v| v.nest_parent().get().is_none())
.unwrap_or(false)
})
.take(2)
.collect();
if open.len() == 1 {
let id = WINDOW.id();
let vars = WINDOW.vars();
#[cfg(feature = "image")]
let icon = vars.icon();
let title = vars.title();
let node = task::parking_lot::Mutex::new(Some(args.nest()));
let host_win_id = open[0].window_id();
let host_wgt_id = WidgetId::new_unique();
layer::LAYERS_INSERT_CMD.scoped(host_win_id).notify_param((
layer::LayerIndex::TOP_MOST,
wgt_fn!(|_: ()| {
let frame = Container! {
layout::margin = 10;
layout::align = Align::CENTER;
widget::modal = true;
#[cfg(feature = "color_filter")]
color::filter::drop_shadow = {
offset: 4,
blur_radius: 6,
color: colors::BLACK.with_alpha(50.pct()),
};
widget::background_color = light_dark(rgb(0.95, 0.95, 0.95), rgb(0.05, 0.05, 0.05));
widget::corner_radius = 4;
layout::padding = 5;
child_spacing = 5;
child_top = Container! {
child_spacing = 4;
#[cfg(feature = "image")]
child_start = Image! {
layout::size = 24;
source = icon.map(|i| match i {
WindowIcon::Image(s) => s.clone(),
WindowIcon::Default => ImageSource::flood(layout::PxSize::zero(), rgba(0, 0, 0, 0), None),
_ => unreachable!(),
});
};
child = Text! {
txt = title.clone();
txt_align = Align::CENTER;
font_weight = FontWeight::BOLD;
};
#[cfg(feature = "button")]
child_end = Button! {
style_fn = zng::button::LightStyle!();
child = ICONS.get_or("close", || Text!("x"));
on_click = hn!(|args| {
args.propagation.stop();
let _ = WINDOWS.close(id);
});
};
};
child = node.lock().take().into_node().into_widget();
};
Container! {
id = host_wgt_id;
child = frame;
widget::background_color = colors::BLACK.with_alpha(20.pct());
layout::padding = WINDOWS.vars(host_win_id).unwrap().safe_padding().map_into();
}
}),
));
window::WINDOW_CLOSE_EVENT
.on_pre_event(
true,
hn!(|args| {
if args.windows.contains(&id) {
APP_HANDLER.unsubscribe();
layer::LAYERS_REMOVE_CMD.scoped(host_win_id).notify_param(host_wgt_id);
}
}),
)
.perm();
}
}