mirror of https://github.com/wayvr-org/wayvr.git
refactor overlay spawning
This commit is contained in:
parent
e378749619
commit
1cbae4c3ad
|
|
@ -85,12 +85,23 @@ pub struct ModifyPanelTask {
|
|||
pub command: ModifyPanelCommand,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy)]
|
||||
pub enum ToggleMode {
|
||||
EnsureOn,
|
||||
EnsureOff,
|
||||
Toggle,
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub enum SpawnPos {
|
||||
/// Always spawn at the designated pos
|
||||
Fixed,
|
||||
/// Automatically spread out for user experience
|
||||
Spread,
|
||||
/// Spawn relative to a different overlay
|
||||
Parent(OverlaySelector),
|
||||
}
|
||||
|
||||
pub type ModifyOverlayTask = dyn FnOnce(&mut AppState, &mut OverlayWindowConfig) + Send;
|
||||
pub type CreateOverlayTask = dyn FnOnce(&mut AppState) -> Option<OverlayWindowConfig> + Send;
|
||||
pub enum OverlayTask {
|
||||
|
|
@ -107,7 +118,7 @@ pub enum OverlayTask {
|
|||
SettingsChanged,
|
||||
KeyboardChanged,
|
||||
Modify(OverlaySelector, Box<ModifyOverlayTask>),
|
||||
Create(OverlaySelector, Box<CreateOverlayTask>),
|
||||
Spawn(OverlaySelector, SpawnPos, Box<CreateOverlayTask>),
|
||||
ModifyPanel(ModifyPanelTask),
|
||||
Drop(OverlaySelector),
|
||||
}
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ use xkbcommon::xkb;
|
|||
|
||||
use crate::{
|
||||
backend::{
|
||||
task::{OverlayTask, TaskContainer, TaskType, ToggleMode},
|
||||
task::{OverlayTask, SpawnPos, TaskContainer, TaskType, ToggleMode},
|
||||
wayvr::{
|
||||
image_importer::ImageImporter,
|
||||
process::{KillSignal, Process},
|
||||
|
|
@ -434,8 +434,9 @@ impl WvrServerState {
|
|||
None => DesktopFinder::create_icon(&title)?.into(),
|
||||
};
|
||||
|
||||
app.tasks.enqueue(TaskType::Overlay(OverlayTask::Create(
|
||||
app.tasks.enqueue(TaskType::Overlay(OverlayTask::Spawn(
|
||||
OverlaySelector::Nothing,
|
||||
SpawnPos::Spread,
|
||||
Box::new(move |app: &mut AppState| {
|
||||
create_wl_window_overlay(
|
||||
title,
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ use wlx_common::{config::HandsfreePointer, overlays::ToastTopic};
|
|||
use crate::{
|
||||
RESTART, RUNNING,
|
||||
backend::{
|
||||
task::{OverlayTask, PlayspaceTask, TaskType, ToggleMode},
|
||||
task::{OverlayTask, PlayspaceTask, SpawnPos, TaskType, ToggleMode},
|
||||
wayvr::process::KillSignal,
|
||||
},
|
||||
gui::panel::{log_cmd_invalid_arg, log_cmd_missing_arg},
|
||||
|
|
@ -441,8 +441,9 @@ pub(super) fn setup_custom_button<S: 'static>(
|
|||
app.tasks.enqueue(TaskType::Overlay(OverlayTask::Drop(
|
||||
OverlaySelector::Name(name.clone()),
|
||||
)));
|
||||
app.tasks.enqueue(TaskType::Overlay(OverlayTask::Create(
|
||||
app.tasks.enqueue(TaskType::Overlay(OverlayTask::Spawn(
|
||||
OverlaySelector::Name(owc.name.clone()),
|
||||
SpawnPos::Spread,
|
||||
Box::new(move |app| {
|
||||
if let Some(mut owc) = create_custom(app, name) {
|
||||
owc.show_on_spawn = true;
|
||||
|
|
@ -534,8 +535,9 @@ pub(super) fn setup_custom_button<S: 'static>(
|
|||
}
|
||||
|
||||
let name = crate::overlays::screen::mirror::new_mirror_name();
|
||||
app.tasks.enqueue(TaskType::Overlay(OverlayTask::Create(
|
||||
app.tasks.enqueue(TaskType::Overlay(OverlayTask::Spawn(
|
||||
OverlaySelector::Name(name.clone()),
|
||||
SpawnPos::Spread,
|
||||
Box::new(move |app| {
|
||||
Some(crate::overlays::screen::mirror::new_mirror(
|
||||
name,
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ use wlx_common::{
|
|||
};
|
||||
|
||||
use crate::{
|
||||
backend::task::{OverlayTask, TaskType},
|
||||
backend::task::{OverlayTask, SpawnPos, TaskType},
|
||||
gui::panel::{GuiPanel, NewGuiPanelParams, OnCustomIdFunc},
|
||||
state::AppState,
|
||||
windowing::{OverlaySelector, Z_ORDER_TOAST, window::OverlayWindowConfig},
|
||||
|
|
@ -88,8 +88,9 @@ impl Toast {
|
|||
// multiple toasts are submitted for the same
|
||||
// frame, only the first one gets created
|
||||
app.tasks.enqueue_at(
|
||||
TaskType::Overlay(OverlayTask::Create(
|
||||
TaskType::Overlay(OverlayTask::Spawn(
|
||||
selector.clone(),
|
||||
SpawnPos::Fixed,
|
||||
Box::new(move |app| {
|
||||
let maybe_toast = new_toast(self, app);
|
||||
app.tasks.enqueue_at(
|
||||
|
|
|
|||
|
|
@ -345,7 +345,7 @@ where
|
|||
log::warn!("Overlay not found for task: {sel:?}");
|
||||
}
|
||||
}
|
||||
OverlayTask::Create(sel, f) => {
|
||||
OverlayTask::Spawn(sel, pos, f) => {
|
||||
let None = self.mut_by_selector(&sel) else {
|
||||
log::debug!("Could not create {sel:?}: exists");
|
||||
return Ok(());
|
||||
|
|
|
|||
|
|
@ -309,3 +309,11 @@ pub fn save_transform(state: &mut OverlayWindowState, app: &mut AppState) {
|
|||
|
||||
state.saved_transform = Some(parent_transform.inverse() * state.transform);
|
||||
}
|
||||
|
||||
pub fn spawn_transform_from_parent(parent: &Affine3A, _hmd: &Affine3A) -> Affine3A {
|
||||
let local_offset = Vec3A::new(0.08, -0.08, 0.06);
|
||||
let world_offset = parent.x_axis * local_offset.x - parent.y_axis * local_offset.y
|
||||
+ parent.z_axis * local_offset.z;
|
||||
|
||||
Affine3A::from_translation((parent.translation + world_offset).into())
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue