remove RcFrontend & RcLayout

[skip ci]
This commit is contained in:
Aleksander
2025-12-26 12:43:14 +01:00
parent f29de34de2
commit 4f7204ccf7
19 changed files with 145 additions and 128 deletions

View File

@@ -10,6 +10,7 @@ use wgui::{
i18n::Translation, i18n::Translation,
layout::{Layout, LayoutParams, WidgetID}, layout::{Layout, LayoutParams, WidgetID},
parser::{Fetchable, ParseDocumentParams, ParserState}, parser::{Fetchable, ParseDocumentParams, ParserState},
task::Tasks,
widget::{label::WidgetLabel, rectangle::WidgetRectangle}, widget::{label::WidgetLabel, rectangle::WidgetRectangle},
windowing::{WguiWindow, WguiWindowParams, WguiWindowParamsExtra, WguiWindowPlacement}, windowing::{WguiWindow, WguiWindowParams, WguiWindowParamsExtra, WguiWindowPlacement},
}; };
@@ -18,10 +19,9 @@ use wlx_common::{dash_interface::BoxDashInterface, timestep::Timestep};
use crate::{ use crate::{
assets, settings, assets, settings,
tab::{ tab::{
apps::TabApps, games::TabGames, home::TabHome, monado::TabMonado, processes::TabProcesses, settings::TabSettings, Tab, TabType, apps::TabApps, games::TabGames, home::TabHome, monado::TabMonado, processes::TabProcesses,
Tab, TabType, settings::TabSettings,
}, },
task::Tasks,
util::{ util::{
popup_manager::{MountPopupParams, PopupManager, PopupManagerParams}, popup_manager::{MountPopupParams, PopupManager, PopupManagerParams},
toast_manager::ToastManager, toast_manager::ToastManager,
@@ -308,37 +308,37 @@ impl Frontend {
// "Home" side button // "Home" side button
self.tasks.handle_button( self.tasks.handle_button(
self.state.fetch_component_as::<ComponentButton>("btn_side_home")?, &self.state.fetch_component_as::<ComponentButton>("btn_side_home")?,
FrontendTask::SetTab(TabType::Home), FrontendTask::SetTab(TabType::Home),
); );
// "Apps" side button // "Apps" side button
self.tasks.handle_button( self.tasks.handle_button(
self.state.fetch_component_as::<ComponentButton>("btn_side_apps")?, &self.state.fetch_component_as::<ComponentButton>("btn_side_apps")?,
FrontendTask::SetTab(TabType::Apps), FrontendTask::SetTab(TabType::Apps),
); );
// "Games" side button // "Games" side button
self.tasks.handle_button( self.tasks.handle_button(
self.state.fetch_component_as::<ComponentButton>("btn_side_games")?, &self.state.fetch_component_as::<ComponentButton>("btn_side_games")?,
FrontendTask::SetTab(TabType::Games), FrontendTask::SetTab(TabType::Games),
); );
// "Monado side button" // "Monado side button"
self.tasks.handle_button( self.tasks.handle_button(
self.state.fetch_component_as::<ComponentButton>("btn_side_monado")?, &self.state.fetch_component_as::<ComponentButton>("btn_side_monado")?,
FrontendTask::SetTab(TabType::Monado), FrontendTask::SetTab(TabType::Monado),
); );
// "Processes" side button // "Processes" side button
self.tasks.handle_button( self.tasks.handle_button(
self.state.fetch_component_as::<ComponentButton>("btn_side_processes")?, &self.state.fetch_component_as::<ComponentButton>("btn_side_processes")?,
FrontendTask::SetTab(TabType::Processes), FrontendTask::SetTab(TabType::Processes),
); );
// "Settings" side button // "Settings" side button
self.tasks.handle_button( self.tasks.handle_button(
self.state.fetch_component_as::<ComponentButton>("btn_side_settings")?, &self.state.fetch_component_as::<ComponentButton>("btn_side_settings")?,
FrontendTask::SetTab(TabType::Settings), FrontendTask::SetTab(TabType::Settings),
); );
@@ -348,13 +348,13 @@ impl Frontend {
// "Audio" bottom bar button // "Audio" bottom bar button
self.tasks.handle_button( self.tasks.handle_button(
self.state.fetch_component_as::<ComponentButton>("btn_audio")?, &self.state.fetch_component_as::<ComponentButton>("btn_audio")?,
FrontendTask::ShowAudioSettings, FrontendTask::ShowAudioSettings,
); );
// "Recenter playspace" bottom bar button // "Recenter playspace" bottom bar button
self.tasks.handle_button( self.tasks.handle_button(
self.state.fetch_component_as::<ComponentButton>("btn_recenter")?, &self.state.fetch_component_as::<ComponentButton>("btn_recenter")?,
FrontendTask::RecenterPlayspace, FrontendTask::RecenterPlayspace,
); );

View File

@@ -2,7 +2,6 @@ mod assets;
pub mod frontend; pub mod frontend;
pub mod settings; pub mod settings;
mod tab; mod tab;
mod task;
mod util; mod util;
mod various; mod various;
mod views; mod views;

View File

@@ -7,12 +7,12 @@ use wgui::{
i18n::Translation, i18n::Translation,
layout::{WidgetID, WidgetPair}, layout::{WidgetID, WidgetPair},
parser::{Fetchable, ParseDocumentParams, ParserState}, parser::{Fetchable, ParseDocumentParams, ParserState},
task::Tasks,
}; };
use crate::{ use crate::{
frontend::{Frontend, FrontendTask, FrontendTasks}, frontend::{Frontend, FrontendTask, FrontendTasks},
tab::{Tab, TabType}, tab::{Tab, TabType},
task::Tasks,
util::{ util::{
self, self,
desktop_finder::DesktopEntry, desktop_finder::DesktopEntry,

View File

@@ -67,11 +67,11 @@ impl TabHome {
let btn_settings = state.fetch_component_as::<ComponentButton>("btn_settings")?; let btn_settings = state.fetch_component_as::<ComponentButton>("btn_settings")?;
let tasks = &mut frontend.tasks; let tasks = &mut frontend.tasks;
tasks.handle_button(btn_apps, FrontendTask::SetTab(TabType::Apps)); tasks.handle_button(&btn_apps, FrontendTask::SetTab(TabType::Apps));
tasks.handle_button(btn_games, FrontendTask::SetTab(TabType::Games)); tasks.handle_button(&btn_games, FrontendTask::SetTab(TabType::Games));
tasks.handle_button(btn_monado, FrontendTask::SetTab(TabType::Monado)); tasks.handle_button(&btn_monado, FrontendTask::SetTab(TabType::Monado));
tasks.handle_button(btn_processes, FrontendTask::SetTab(TabType::Processes)); tasks.handle_button(&btn_processes, FrontendTask::SetTab(TabType::Processes));
tasks.handle_button(btn_settings, FrontendTask::SetTab(TabType::Settings)); tasks.handle_button(&btn_settings, FrontendTask::SetTab(TabType::Settings));
Ok(Self { state }) Ok(Self { state })
} }

View File

@@ -5,6 +5,7 @@ use wgui::{
components::checkbox::ComponentCheckbox, components::checkbox::ComponentCheckbox,
layout::WidgetID, layout::WidgetID,
parser::{Fetchable, ParseDocumentParams, ParserState}, parser::{Fetchable, ParseDocumentParams, ParserState},
task::Tasks,
}; };
use crate::{ use crate::{
@@ -13,37 +14,71 @@ use crate::{
tab::{Tab, TabType}, tab::{Tab, TabType},
}; };
enum Task {
ToggleSetting(SettingType, bool),
}
pub struct TabSettings { pub struct TabSettings {
#[allow(dead_code)] #[allow(dead_code)]
pub state: ParserState, pub state: ParserState,
tasks: Tasks<Task>,
} }
impl Tab for TabSettings { impl Tab for TabSettings {
fn get_type(&self) -> TabType { fn get_type(&self) -> TabType {
TabType::Settings TabType::Settings
} }
fn update(&mut self, frontend: &mut Frontend) -> anyhow::Result<()> {
for task in self.tasks.drain() {
match task {
Task::ToggleSetting(setting, n) => self.toggle_setting(frontend, setting, n),
}
}
Ok(())
}
}
#[allow(clippy::enum_variant_names)]
#[derive(Clone)]
enum SettingType {
DashHideUsername,
DashAmPmClock,
DashOpaqueBackground,
DashXwaylandByDefault,
}
impl SettingType {
fn get_bool<'a>(&self, settings: &'a mut settings::Settings) -> &'a mut bool {
match self {
SettingType::DashHideUsername => &mut settings.home_screen.hide_username,
SettingType::DashAmPmClock => &mut settings.general.am_pm_clock,
SettingType::DashOpaqueBackground => &mut settings.general.opaque_background,
SettingType::DashXwaylandByDefault => &mut settings.tweaks.xwayland_by_default,
}
}
} }
fn init_setting_checkbox( fn init_setting_checkbox(
frontend: &mut Frontend, frontend: &mut Frontend,
tasks: &Tasks<Task>,
checkbox: Rc<ComponentCheckbox>, checkbox: Rc<ComponentCheckbox>,
fetch_callback: fn(&mut settings::Settings) -> &mut bool, setting: SettingType,
change_callback: Option<fn(&mut Frontend, bool)>, additional_frontend_task: Option<FrontendTask>,
) -> anyhow::Result<()> { ) -> anyhow::Result<()> {
let mut c = frontend.layout.start_common(); let mut c = frontend.layout.start_common();
checkbox.set_checked(&mut c.common(), *setting.get_bool(frontend.settings.get_mut()));
let tasks = tasks.clone();
let frontend_tasks = frontend.tasks.clone();
checkbox.set_checked(&mut c.common(), *fetch_callback(params.settings));
let rc_frontend = params.frontend.clone();
checkbox.on_toggle(Box::new(move |_common, e| { checkbox.on_toggle(Box::new(move |_common, e| {
let mut frontend = rc_frontend.borrow_mut(); tasks.push(Task::ToggleSetting(setting.clone(), e.checked));
*fetch_callback(frontend.settings.get_mut()) = e.checked;
if let Some(change_callback) = &change_callback { if let Some(task) = &additional_frontend_task {
change_callback(&mut frontend, e.checked); frontend_tasks.push(task.clone());
} }
frontend.settings.mark_as_dirty();
Ok(()) Ok(())
})); }));
@@ -63,42 +98,56 @@ impl TabSettings {
parent_id, parent_id,
)?; )?;
let tasks = Tasks::new();
init_setting_checkbox( init_setting_checkbox(
frontend, frontend,
&tasks,
state.data.fetch_component_as::<ComponentCheckbox>("cb_hide_username")?, state.data.fetch_component_as::<ComponentCheckbox>("cb_hide_username")?,
|settings| &mut settings.home_screen.hide_username, SettingType::DashHideUsername,
None, None,
)?; )?;
init_setting_checkbox( init_setting_checkbox(
frontend, frontend,
&tasks,
state.data.fetch_component_as::<ComponentCheckbox>("cb_am_pm_clock")?, state.data.fetch_component_as::<ComponentCheckbox>("cb_am_pm_clock")?,
|settings| &mut settings.general.am_pm_clock, SettingType::DashAmPmClock,
Some(|frontend, _| { None,
frontend.tasks.push(FrontendTask::RefreshClock);
}),
)?; )?;
init_setting_checkbox( init_setting_checkbox(
frontend, frontend,
&tasks,
state.data.fetch_component_as::<ComponentCheckbox>("cb_am_pm_clock")?,
SettingType::DashAmPmClock,
Some(FrontendTask::RefreshClock),
)?;
init_setting_checkbox(
frontend,
&tasks,
state state
.data .data
.fetch_component_as::<ComponentCheckbox>("cb_opaque_background")?, .fetch_component_as::<ComponentCheckbox>("cb_opaque_background")?,
|settings| &mut settings.general.opaque_background, SettingType::DashOpaqueBackground,
Some(|frontend, _| { Some(FrontendTask::RefreshBackground),
frontend.tasks.push(FrontendTask::RefreshBackground);
}),
)?; )?;
init_setting_checkbox( init_setting_checkbox(
frontend, frontend,
&tasks,
state state
.data .data
.fetch_component_as::<ComponentCheckbox>("cb_xwayland_by_default")?, .fetch_component_as::<ComponentCheckbox>("cb_xwayland_by_default")?,
|settings| &mut settings.tweaks.xwayland_by_default, SettingType::DashXwaylandByDefault,
None, None,
)?; )?;
Ok(Self { state }) Ok(Self { state, tasks })
}
fn toggle_setting(&mut self, frontend: &mut Frontend, setting: SettingType, state: bool) {
*setting.get_bool(frontend.settings.get_mut()) = state;
} }
} }

View File

@@ -8,6 +8,7 @@ use wgui::{
i18n::Translation, i18n::Translation,
layout::{Layout, WidgetID}, layout::{Layout, WidgetID},
parser::{Fetchable, ParseDocumentParams, ParserState}, parser::{Fetchable, ParseDocumentParams, ParserState},
task::Tasks,
widget::label::WidgetLabel, widget::label::WidgetLabel,
}; };
use wlx_common::dash_interface::BoxDashInterface; use wlx_common::dash_interface::BoxDashInterface;
@@ -15,7 +16,6 @@ use wlx_common::dash_interface::BoxDashInterface;
use crate::{ use crate::{
frontend::{FrontendTask, FrontendTasks}, frontend::{FrontendTask, FrontendTasks},
settings::SettingsIO, settings::SettingsIO,
task::Tasks,
util::desktop_finder::DesktopEntry, util::desktop_finder::DesktopEntry,
}; };
@@ -96,7 +96,7 @@ impl View {
let tasks = Tasks::new(); let tasks = Tasks::new();
tasks.handle_button(btn_launch, Task::Launch); tasks.handle_button(&btn_launch, Task::Launch);
let id_icon_parent = state.get_widget_id("icon_parent")?; let id_icon_parent = state.get_widget_id("icon_parent")?;

View File

@@ -12,12 +12,12 @@ use wgui::{
i18n::Translation, i18n::Translation,
layout::{Layout, WidgetID}, layout::{Layout, WidgetID},
parser::{Fetchable, ParseDocumentParams, ParserState}, parser::{Fetchable, ParseDocumentParams, ParserState},
task::Tasks,
widget::ConstructEssentials, widget::ConstructEssentials,
}; };
use crate::{ use crate::{
frontend::{FrontendTask, FrontendTasks}, frontend::{FrontendTask, FrontendTasks},
task::Tasks,
util::pactl_wrapper, util::pactl_wrapper,
}; };

View File

@@ -17,6 +17,7 @@ use wgui::{
self, self,
prelude::{length, percent}, prelude::{length, percent},
}, },
task::Tasks,
widget::{ widget::{
ConstructEssentials, ConstructEssentials,
div::WidgetDiv, div::WidgetDiv,
@@ -29,7 +30,6 @@ use wgui::{
use crate::{ use crate::{
frontend::{FrontendTask, FrontendTasks}, frontend::{FrontendTask, FrontendTasks},
task::Tasks,
util::{ util::{
cover_art_fetcher::{self, CoverArt}, cover_art_fetcher::{self, CoverArt},
popup_manager::MountPopupParams, popup_manager::MountPopupParams,

View File

@@ -13,6 +13,7 @@ use wgui::{
layout::{Layout, WidgetID}, layout::{Layout, WidgetID},
parser::{Fetchable, ParseDocumentParams, ParserState}, parser::{Fetchable, ParseDocumentParams, ParserState},
taffy::{self, prelude::length}, taffy::{self, prelude::length},
task::Tasks,
widget::{ widget::{
ConstructEssentials, ConstructEssentials,
div::WidgetDiv, div::WidgetDiv,
@@ -21,13 +22,10 @@ use wgui::{
}; };
use wlx_common::dash_interface::BoxDashInterface; use wlx_common::dash_interface::BoxDashInterface;
use crate::{ use crate::util::{
task::Tasks, self,
util::{ desktop_finder::{self},
self, various::get_desktop_file_icon_path,
desktop_finder::{self},
various::get_desktop_file_icon_path,
},
}; };
#[derive(Clone)] #[derive(Clone)]

View File

@@ -10,16 +10,16 @@ use wgui::{
parser::{Fetchable, ParseDocumentParams, ParserState}, parser::{Fetchable, ParseDocumentParams, ParserState},
renderer_vk::text::{FontWeight, HorizontalAlign, TextStyle}, renderer_vk::text::{FontWeight, HorizontalAlign, TextStyle},
taffy::{self, prelude::length}, taffy::{self, prelude::length},
task::Tasks,
widget::{ widget::{
label::{WidgetLabel, WidgetLabelParams},
ConstructEssentials, ConstructEssentials,
label::{WidgetLabel, WidgetLabelParams},
}, },
}; };
use wlx_common::dash_interface::BoxDashInterface; use wlx_common::dash_interface::BoxDashInterface;
use crate::{ use crate::{
frontend::{FrontendTask, FrontendTasks}, frontend::{FrontendTask, FrontendTasks},
task::Tasks,
util::popup_manager::{MountPopupParams, PopupHandle}, util::popup_manager::{MountPopupParams, PopupHandle},
views::window_options, views::window_options,
}; };

View File

@@ -8,13 +8,13 @@ use wgui::{
i18n::Translation, i18n::Translation,
layout::{Layout, WidgetID}, layout::{Layout, WidgetID},
parser::{Fetchable, ParseDocumentParams, ParserState}, parser::{Fetchable, ParseDocumentParams, ParserState},
task::Tasks,
widget::ConstructEssentials, widget::ConstructEssentials,
}; };
use wlx_common::dash_interface::BoxDashInterface; use wlx_common::dash_interface::BoxDashInterface;
use crate::{ use crate::{
frontend::{FrontendTask, FrontendTasks}, frontend::{FrontendTask, FrontendTasks},
task::Tasks,
views::window_list::construct_window_button, views::window_list::construct_window_button,
}; };
@@ -80,9 +80,9 @@ impl View {
c.finish()?; c.finish()?;
} }
tasks.handle_button(btn_close, Task::Close); tasks.handle_button(&btn_close, Task::Close);
tasks.handle_button(btn_kill, Task::Kill); tasks.handle_button(&btn_kill, Task::Kill);
tasks.handle_button(btn_show_hide, Task::SetVisible(!params.window.visible)); tasks.handle_button(&btn_show_hide, Task::SetVisible(!params.window.visible));
Ok(Self { Ok(Self {
state, state,

View File

@@ -131,7 +131,6 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
MouseScrollDelta::LineDelta(x, y) => { MouseScrollDelta::LineDelta(x, y) => {
testbed testbed
.layout() .layout()
.borrow_mut()
.push_event( .push_event(
&wgui::event::Event::MouseWheel(MouseWheelEvent { &wgui::event::Event::MouseWheel(MouseWheelEvent {
delta: Vec2::new(x, y), delta: Vec2::new(x, y),
@@ -146,7 +145,6 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
MouseScrollDelta::PixelDelta(pos) => { MouseScrollDelta::PixelDelta(pos) => {
testbed testbed
.layout() .layout()
.borrow_mut()
.push_event( .push_event(
&wgui::event::Event::MouseWheel(MouseWheelEvent { &wgui::event::Event::MouseWheel(MouseWheelEvent {
delta: Vec2::new(pos.x as f32 / 5.0, pos.y as f32 / 5.0), delta: Vec2::new(pos.x as f32 / 5.0, pos.y as f32 / 5.0),
@@ -167,7 +165,6 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
if matches!(state, winit::event::ElementState::Pressed) { if matches!(state, winit::event::ElementState::Pressed) {
testbed testbed
.layout() .layout()
.borrow_mut()
.push_event( .push_event(
&wgui::event::Event::MouseDown(MouseDownEvent { &wgui::event::Event::MouseDown(MouseDownEvent {
pos: mouse / scale, pos: mouse / scale,
@@ -181,7 +178,6 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
} else { } else {
testbed testbed
.layout() .layout()
.borrow_mut()
.push_event( .push_event(
&wgui::event::Event::MouseUp(MouseUpEvent { &wgui::event::Event::MouseUp(MouseUpEvent {
pos: mouse / scale, pos: mouse / scale,
@@ -202,7 +198,6 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
mouse = vec2(position.x as _, position.y as _); mouse = vec2(position.x as _, position.y as _);
testbed testbed
.layout() .layout()
.borrow_mut()
.push_event( .push_event(
&wgui::event::Event::MouseMotion(MouseMotionEvent { &wgui::event::Event::MouseMotion(MouseMotionEvent {
pos: mouse / scale, pos: mouse / scale,
@@ -225,11 +220,11 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
"Debug draw enabled\n\tAqua: widget boundary\n\tMagenta: Scissoring (separate render pass)" "Debug draw enabled\n\tAqua: widget boundary\n\tMagenta: Scissoring (separate render pass)"
); );
} }
testbed.layout().borrow_mut().mark_redraw(); testbed.layout().mark_redraw();
} }
if event.physical_key == PhysicalKey::Code(KeyCode::F11) { if event.physical_key == PhysicalKey::Code(KeyCode::F11) {
testbed.layout().borrow_mut().print_tree(); testbed.layout().print_tree();
} }
if event.physical_key == PhysicalKey::Code(KeyCode::Equal) { if event.physical_key == PhysicalKey::Code(KeyCode::Equal) {
@@ -290,7 +285,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
} }
while timestep.on_tick() { while timestep.on_tick() {
testbed.layout().borrow_mut().tick().unwrap(); testbed.layout().tick().unwrap();
} }
testbed testbed
@@ -301,7 +296,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
}) })
.unwrap(); .unwrap();
if !render_context.dirty && !testbed.layout().borrow_mut().check_toggle_needs_redraw() { if !render_context.dirty && !testbed.layout().check_toggle_needs_redraw() {
// no need to redraw // no need to redraw
std::thread::sleep(std::time::Duration::from_millis(5)); // dirty fix to prevent cpu burning precious cycles doing a busy loop std::thread::sleep(std::time::Duration::from_millis(5)); // dirty fix to prevent cpu burning precious cycles doing a busy loop
return; return;
@@ -336,19 +331,18 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
.begin_rendering(tgt, WGfxClearMode::Clear([0.0, 0.0, 0.0, 0.1])) .begin_rendering(tgt, WGfxClearMode::Clear([0.0, 0.0, 0.0, 0.1]))
.unwrap(); .unwrap();
let mut layout = testbed.layout().borrow_mut(); let layout = testbed.layout();
let globals = layout.state.globals.clone(); let globals = layout.state.globals.clone();
let mut globals = globals.get(); let mut globals = globals.get();
let mut draw_params = wgui::drawing::DrawParams { let mut draw_params = wgui::drawing::DrawParams {
globals: &mut globals, globals: &mut globals,
layout: &mut layout, layout,
debug_draw: debug_draw_enabled, debug_draw: debug_draw_enabled,
timestep_alpha: timestep.alpha, timestep_alpha: timestep.alpha,
}; };
let primitives = wgui::drawing::draw(&mut draw_params).unwrap(); let primitives = wgui::drawing::draw(&mut draw_params).unwrap();
drop(layout);
let draw_result = render_context let draw_result = render_context
.draw( .draw(

View File

@@ -1,4 +1,4 @@
use wgui::layout::RcLayout; use wgui::layout::Layout;
pub mod testbed_any; pub mod testbed_any;
pub mod testbed_dashboard; pub mod testbed_dashboard;
@@ -12,5 +12,5 @@ pub struct TestbedUpdateParams {
pub trait Testbed { pub trait Testbed {
fn update(&mut self, params: TestbedUpdateParams) -> anyhow::Result<()>; fn update(&mut self, params: TestbedUpdateParams) -> anyhow::Result<()>;
fn layout(&self) -> &RcLayout; fn layout(&mut self) -> &mut Layout;
} }

View File

@@ -9,12 +9,12 @@ use wgui::{
assets::AssetPath, assets::AssetPath,
font_config::WguiFontConfig, font_config::WguiFontConfig,
globals::WguiGlobals, globals::WguiGlobals,
layout::{LayoutParams, RcLayout}, layout::{Layout, LayoutParams},
parser::{ParseDocumentParams, ParserState}, parser::{ParseDocumentParams, ParserState},
}; };
pub struct TestbedAny { pub struct TestbedAny {
pub layout: RcLayout, pub layout: Layout,
#[allow(dead_code)] #[allow(dead_code)]
state: ParserState, state: ParserState,
@@ -43,23 +43,20 @@ impl TestbedAny {
}, },
&LayoutParams::default(), &LayoutParams::default(),
)?; )?;
Ok(Self { Ok(Self { layout, state })
layout: layout.as_rc(),
state,
})
} }
} }
impl Testbed for TestbedAny { impl Testbed for TestbedAny {
fn update(&mut self, params: TestbedUpdateParams) -> anyhow::Result<()> { fn update(&mut self, params: TestbedUpdateParams) -> anyhow::Result<()> {
self.layout.borrow_mut().update( self.layout.update(
Vec2::new(params.width, params.height), Vec2::new(params.width, params.height),
params.timestep_alpha, params.timestep_alpha,
)?; )?;
Ok(()) Ok(())
} }
fn layout(&self) -> &RcLayout { fn layout(&mut self) -> &mut Layout {
&self.layout &mut self.layout
} }
} }

View File

@@ -3,7 +3,7 @@ use dash_frontend::{
frontend, frontend,
settings::{self, SettingsIO}, settings::{self, SettingsIO},
}; };
use wgui::layout::RcLayout; use wgui::layout::Layout;
use wlx_common::dash_interface_emulated::DashInterfaceEmulated; use wlx_common::dash_interface_emulated::DashInterfaceEmulated;
struct SimpleSettingsIO { struct SimpleSettingsIO {
@@ -53,8 +53,7 @@ impl settings::SettingsIO for SimpleSettingsIO {
} }
pub struct TestbedDashboard { pub struct TestbedDashboard {
layout: RcLayout, frontend: frontend::Frontend,
frontend: frontend::RcFrontend,
} }
impl TestbedDashboard { impl TestbedDashboard {
@@ -62,26 +61,22 @@ impl TestbedDashboard {
let settings = SimpleSettingsIO::new(); let settings = SimpleSettingsIO::new();
let interface = DashInterfaceEmulated::new(); let interface = DashInterfaceEmulated::new();
let (frontend, layout) = frontend::Frontend::new(frontend::InitParams { let frontend = frontend::Frontend::new(frontend::InitParams {
settings: Box::new(settings), settings: Box::new(settings),
interface: Box::new(interface), interface: Box::new(interface),
})?; })?;
Ok(Self { frontend, layout }) Ok(Self { frontend })
} }
} }
impl Testbed for TestbedDashboard { impl Testbed for TestbedDashboard {
fn update(&mut self, params: TestbedUpdateParams) -> anyhow::Result<()> { fn update(&mut self, params: TestbedUpdateParams) -> anyhow::Result<()> {
let mut frontend = self.frontend.borrow_mut(); self
frontend.update( .frontend
&self.frontend, .update(params.width, params.height, params.timestep_alpha)
params.width,
params.height,
params.timestep_alpha,
)
} }
fn layout(&self) -> &RcLayout { fn layout(&mut self) -> &mut Layout {
&self.layout &mut self.frontend.layout
} }
} }

View File

@@ -1,4 +1,4 @@
use std::{cell::RefCell, collections::VecDeque, path::PathBuf, rc::Rc}; use std::{cell::RefCell, path::PathBuf, rc::Rc};
use crate::{ use crate::{
assets, assets,
@@ -17,9 +17,10 @@ use wgui::{
font_config::WguiFontConfig, font_config::WguiFontConfig,
globals::WguiGlobals, globals::WguiGlobals,
i18n::Translation, i18n::Translation,
layout::{Layout, LayoutParams, RcLayout, Widget}, layout::{Layout, LayoutParams, Widget},
parser::{Fetchable, ParseDocumentExtra, ParseDocumentParams, ParserState}, parser::{Fetchable, ParseDocumentExtra, ParseDocumentParams, ParserState},
taffy, taffy,
task::Tasks,
widget::{label::WidgetLabel, rectangle::WidgetRectangle}, widget::{label::WidgetLabel, rectangle::WidgetRectangle},
windowing::{WguiWindow, WguiWindowParams}, windowing::{WguiWindow, WguiWindowParams},
}; };
@@ -29,16 +30,15 @@ pub enum TestbedTask {
} }
struct Data { struct Data {
tasks: VecDeque<TestbedTask>,
#[allow(dead_code)] #[allow(dead_code)]
state: ParserState, state: ParserState,
popup_window: WguiWindow, popup_window: WguiWindow,
} }
#[derive(Clone)]
pub struct TestbedGeneric { pub struct TestbedGeneric {
pub layout: RcLayout, pub layout: Layout,
tasks: Tasks<TestbedTask>,
globals: WguiGlobals, globals: WguiGlobals,
data: Rc<RefCell<Data>>, data: Rc<RefCell<Data>>,
@@ -168,19 +168,19 @@ impl TestbedGeneric {
})); }));
let testbed = Self { let testbed = Self {
layout: layout.as_rc(), layout,
tasks: Default::default(),
globals: globals.clone(), globals: globals.clone(),
data: Rc::new(RefCell::new(Data { data: Rc::new(RefCell::new(Data {
state, state,
tasks: Default::default(),
popup_window: WguiWindow::default(), popup_window: WguiWindow::default(),
})), })),
}; };
button_popup.on_click({ button_popup.on_click({
let testbed = testbed.clone(); let tasks = testbed.tasks.clone();
Box::new(move |_, _| { Box::new(move |_, _| {
testbed.push_task(TestbedTask::ShowPopup); tasks.push(TestbedTask::ShowPopup);
Ok(()) Ok(())
}) })
}); });
@@ -188,19 +188,14 @@ impl TestbedGeneric {
Ok(testbed) Ok(testbed)
} }
fn push_task(&self, task: TestbedTask) {
self.data.borrow_mut().tasks.push_back(task);
}
fn process_task( fn process_task(
&mut self, &mut self,
task: &TestbedTask, task: &TestbedTask,
params: &mut TestbedUpdateParams, params: &mut TestbedUpdateParams,
layout: &mut Layout,
data: &mut Data, data: &mut Data,
) -> anyhow::Result<()> { ) -> anyhow::Result<()> {
match task { match task {
TestbedTask::ShowPopup => self.show_popup(params, layout, data)?, TestbedTask::ShowPopup => self.show_popup(params, data)?,
} }
Ok(()) Ok(())
@@ -209,13 +204,12 @@ impl TestbedGeneric {
fn show_popup( fn show_popup(
&mut self, &mut self,
_params: &mut TestbedUpdateParams, _params: &mut TestbedUpdateParams,
layout: &mut Layout,
data: &mut Data, data: &mut Data,
) -> anyhow::Result<()> { ) -> anyhow::Result<()> {
data.popup_window.open(&mut WguiWindowParams { data.popup_window.open(&mut WguiWindowParams {
globals: self.globals.clone(), globals: self.globals.clone(),
position: Vec2::new(128.0, 128.0), position: Vec2::new(128.0, 128.0),
layout, layout: &mut self.layout,
title: Translation::from_raw_text("foo"), title: Translation::from_raw_text("foo"),
extra: Default::default(), extra: Default::default(),
})?; })?;
@@ -226,25 +220,22 @@ impl TestbedGeneric {
impl Testbed for TestbedGeneric { impl Testbed for TestbedGeneric {
fn update(&mut self, mut params: TestbedUpdateParams) -> anyhow::Result<()> { fn update(&mut self, mut params: TestbedUpdateParams) -> anyhow::Result<()> {
let layout = self.layout.clone();
let data = self.data.clone(); let data = self.data.clone();
let mut layout = layout.borrow_mut();
let mut data = data.borrow_mut(); let mut data = data.borrow_mut();
layout.update( self.layout.update(
Vec2::new(params.width, params.height), Vec2::new(params.width, params.height),
params.timestep_alpha, params.timestep_alpha,
)?; )?;
while let Some(task) = data.tasks.pop_front() { for task in self.tasks.drain() {
self.process_task(&task, &mut params, &mut layout, &mut data)?; self.process_task(&task, &mut params, &mut data)?;
} }
Ok(()) Ok(())
} }
fn layout(&self) -> &RcLayout { fn layout(&mut self) -> &mut Layout {
&self.layout &mut self.layout
} }
} }

View File

@@ -163,8 +163,6 @@ pub struct Layout {
pub animations: Animations, pub animations: Animations,
} }
pub type RcLayout = Rc<RefCell<Layout>>;
#[derive(Default)] #[derive(Default)]
pub struct LayoutParams { pub struct LayoutParams {
pub resize_to_parent: bool, pub resize_to_parent: bool,
@@ -226,10 +224,6 @@ impl Layout {
} }
} }
pub fn as_rc(self) -> RcLayout {
Rc::new(RefCell::new(self))
}
pub fn add_topmost_child( pub fn add_topmost_child(
&mut self, &mut self,
widget: WidgetState, widget: WidgetState,

View File

@@ -35,6 +35,7 @@ pub mod layout;
pub mod parser; pub mod parser;
pub mod renderer_vk; pub mod renderer_vk;
pub mod stack; pub mod stack;
pub mod task;
pub mod widget; pub mod widget;
pub mod windowing; pub mod windowing;

View File

@@ -1,7 +1,6 @@
use crate::components::button::ComponentButton;
use std::{cell::RefCell, collections::VecDeque, rc::Rc}; use std::{cell::RefCell, collections::VecDeque, rc::Rc};
use wgui::components::button::ComponentButton;
pub struct Tasks<TaskType>(Rc<RefCell<VecDeque<TaskType>>>); pub struct Tasks<TaskType>(Rc<RefCell<VecDeque<TaskType>>>);
impl<T> Clone for Tasks<T> { impl<T> Clone for Tasks<T> {
@@ -32,7 +31,7 @@ impl<TaskType: 'static> Default for Tasks<TaskType> {
} }
impl<TaskType: Clone + 'static> Tasks<TaskType> { impl<TaskType: Clone + 'static> Tasks<TaskType> {
pub fn handle_button(&self, button: Rc<ComponentButton>, task: TaskType) { pub fn handle_button(&self, button: &Rc<ComponentButton>, task: TaskType) {
button.on_click({ button.on_click({
let this = self.clone(); let this = self.clone();
Box::new(move |_, _| { Box::new(move |_, _| {