OneLauncher-Cracked/packages/oneclient_app/src/layout/root_layout.rs

90 lines
3.4 KiB
Rust

use freya::prelude::*;
use freya::router::*;
use crate::components::{
AccountSwitcher, ClusterUpdatePopup, GenericPromptOverlay, JavaPromptOverlay, OptionalModsPopup,
NotificationCenter, PackageUpdatePopup, SplashCurtain, StatusBar, Toasts,
UpdatePromptOverlay,
};
use crate::hooks::{SplashState, use_provide_overlay_claims, use_provide_splash};
#[cfg(not(target_os = "macos"))]
use crate::hooks::use_start_maximized;
use crate::layout::{HomeArtPrefetch, PendingLaunchDriver};
use crate::motion::AnimationClockDriver;
use crate::routes::Route;
use crate::theme;
use crate::theme::colors;
#[derive(PartialEq)]
pub struct RootLayout;
impl Component for RootLayout {
fn render(&self) -> impl IntoElement {
let active = use_state(|| false);
let home_ready = use_state(|| false);
use_provide_splash(SplashState { active, home_ready });
use_provide_overlay_claims();
// macOS rounds the window natively so Freya must not round on top of it
#[cfg(target_os = "macos")]
let corner = 0.;
// Elsewhere the window is borderless and squared when maximized
// No reactive maximized signal exists so root_size changes stand in as the trigger
#[cfg(not(target_os = "macos"))]
let corner = {
let root_size = Platform::get().root_size;
// Seeded because the query below only answers after the window is visible
// which would round the corners of the first frames of a maximized launch
let start_maximized = use_start_maximized();
let mut maximized = use_state(move || start_maximized);
let size = *root_size.read();
let dep = (size.width as i32, size.height as i32);
use_side_effect_with_deps(&dep, move |_| {
spawn(async move {
let is_max = Platform::get()
.post_callback(|id, ctx| {
ctx.windows.get(&id).map(|w| w.window().is_maximized())
})
.await;
if let Ok(Some(is_max)) = is_max {
if *maximized.peek() != is_max {
maximized.set(is_max);
}
}
});
});
if *maximized.read() { 0. } else { 12. }
};
rect()
.width(Size::fill())
.height(Size::fill())
.background(colors::page())
.color(colors::fg_primary())
.font_family(theme::DEFAULT_FONT)
.corner_radius(CornerRadius::new_all(corner))
.overflow(Overflow::Clip)
.child(
rect()
.width(Size::fill())
.height(Size::fill())
.child(Outlet::<Route>::new()),
)
.child(NotificationCenter)
.child(AccountSwitcher)
.child(Toasts)
.child(UpdatePromptOverlay)
.child(JavaPromptOverlay)
// Must stay last it renders whatever the overlays above did not claim
.child(GenericPromptOverlay)
.child(ClusterUpdatePopup)
.child(OptionalModsPopup)
.child(PackageUpdatePopup)
.child(StatusBar)
.child(SplashCurtain)
.child(AnimationClockDriver)
.child(HomeArtPrefetch)
.child(PendingLaunchDriver)
}
}