remove RcFrontend & RcLayout
[skip ci]
This commit is contained in:
@@ -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,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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 })
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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")?;
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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)]
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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 |_, _| {
|
||||||
Reference in New Issue
Block a user