remove RcFrontend & RcLayout
[skip ci]
This commit is contained in:
@@ -10,6 +10,7 @@ use wgui::{
|
||||
i18n::Translation,
|
||||
layout::{Layout, LayoutParams, WidgetID},
|
||||
parser::{Fetchable, ParseDocumentParams, ParserState},
|
||||
task::Tasks,
|
||||
widget::{label::WidgetLabel, rectangle::WidgetRectangle},
|
||||
windowing::{WguiWindow, WguiWindowParams, WguiWindowParamsExtra, WguiWindowPlacement},
|
||||
};
|
||||
@@ -18,10 +19,9 @@ use wlx_common::{dash_interface::BoxDashInterface, timestep::Timestep};
|
||||
use crate::{
|
||||
assets, settings,
|
||||
tab::{
|
||||
apps::TabApps, games::TabGames, home::TabHome, monado::TabMonado, processes::TabProcesses, settings::TabSettings,
|
||||
Tab, TabType,
|
||||
Tab, TabType, apps::TabApps, games::TabGames, home::TabHome, monado::TabMonado, processes::TabProcesses,
|
||||
settings::TabSettings,
|
||||
},
|
||||
task::Tasks,
|
||||
util::{
|
||||
popup_manager::{MountPopupParams, PopupManager, PopupManagerParams},
|
||||
toast_manager::ToastManager,
|
||||
@@ -308,37 +308,37 @@ impl Frontend {
|
||||
|
||||
// "Home" side 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),
|
||||
);
|
||||
|
||||
// "Apps" side 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),
|
||||
);
|
||||
|
||||
// "Games" side 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),
|
||||
);
|
||||
|
||||
// "Monado side 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),
|
||||
);
|
||||
|
||||
// "Processes" side 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),
|
||||
);
|
||||
|
||||
// "Settings" side 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),
|
||||
);
|
||||
|
||||
@@ -348,13 +348,13 @@ impl Frontend {
|
||||
|
||||
// "Audio" bottom bar button
|
||||
self.tasks.handle_button(
|
||||
self.state.fetch_component_as::<ComponentButton>("btn_audio")?,
|
||||
&self.state.fetch_component_as::<ComponentButton>("btn_audio")?,
|
||||
FrontendTask::ShowAudioSettings,
|
||||
);
|
||||
|
||||
// "Recenter playspace" bottom bar button
|
||||
self.tasks.handle_button(
|
||||
self.state.fetch_component_as::<ComponentButton>("btn_recenter")?,
|
||||
&self.state.fetch_component_as::<ComponentButton>("btn_recenter")?,
|
||||
FrontendTask::RecenterPlayspace,
|
||||
);
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@ mod assets;
|
||||
pub mod frontend;
|
||||
pub mod settings;
|
||||
mod tab;
|
||||
mod task;
|
||||
mod util;
|
||||
mod various;
|
||||
mod views;
|
||||
|
||||
@@ -7,12 +7,12 @@ use wgui::{
|
||||
i18n::Translation,
|
||||
layout::{WidgetID, WidgetPair},
|
||||
parser::{Fetchable, ParseDocumentParams, ParserState},
|
||||
task::Tasks,
|
||||
};
|
||||
|
||||
use crate::{
|
||||
frontend::{Frontend, FrontendTask, FrontendTasks},
|
||||
tab::{Tab, TabType},
|
||||
task::Tasks,
|
||||
util::{
|
||||
self,
|
||||
desktop_finder::DesktopEntry,
|
||||
|
||||
@@ -67,11 +67,11 @@ impl TabHome {
|
||||
let btn_settings = state.fetch_component_as::<ComponentButton>("btn_settings")?;
|
||||
|
||||
let tasks = &mut frontend.tasks;
|
||||
tasks.handle_button(btn_apps, FrontendTask::SetTab(TabType::Apps));
|
||||
tasks.handle_button(btn_games, FrontendTask::SetTab(TabType::Games));
|
||||
tasks.handle_button(btn_monado, FrontendTask::SetTab(TabType::Monado));
|
||||
tasks.handle_button(btn_processes, FrontendTask::SetTab(TabType::Processes));
|
||||
tasks.handle_button(btn_settings, FrontendTask::SetTab(TabType::Settings));
|
||||
tasks.handle_button(&btn_apps, FrontendTask::SetTab(TabType::Apps));
|
||||
tasks.handle_button(&btn_games, FrontendTask::SetTab(TabType::Games));
|
||||
tasks.handle_button(&btn_monado, FrontendTask::SetTab(TabType::Monado));
|
||||
tasks.handle_button(&btn_processes, FrontendTask::SetTab(TabType::Processes));
|
||||
tasks.handle_button(&btn_settings, FrontendTask::SetTab(TabType::Settings));
|
||||
|
||||
Ok(Self { state })
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ use wgui::{
|
||||
components::checkbox::ComponentCheckbox,
|
||||
layout::WidgetID,
|
||||
parser::{Fetchable, ParseDocumentParams, ParserState},
|
||||
task::Tasks,
|
||||
};
|
||||
|
||||
use crate::{
|
||||
@@ -13,37 +14,71 @@ use crate::{
|
||||
tab::{Tab, TabType},
|
||||
};
|
||||
|
||||
enum Task {
|
||||
ToggleSetting(SettingType, bool),
|
||||
}
|
||||
|
||||
pub struct TabSettings {
|
||||
#[allow(dead_code)]
|
||||
pub state: ParserState,
|
||||
|
||||
tasks: Tasks<Task>,
|
||||
}
|
||||
|
||||
impl Tab for TabSettings {
|
||||
fn get_type(&self) -> TabType {
|
||||
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(
|
||||
frontend: &mut Frontend,
|
||||
tasks: &Tasks<Task>,
|
||||
checkbox: Rc<ComponentCheckbox>,
|
||||
fetch_callback: fn(&mut settings::Settings) -> &mut bool,
|
||||
change_callback: Option<fn(&mut Frontend, bool)>,
|
||||
setting: SettingType,
|
||||
additional_frontend_task: Option<FrontendTask>,
|
||||
) -> anyhow::Result<()> {
|
||||
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| {
|
||||
let mut frontend = rc_frontend.borrow_mut();
|
||||
*fetch_callback(frontend.settings.get_mut()) = e.checked;
|
||||
tasks.push(Task::ToggleSetting(setting.clone(), e.checked));
|
||||
|
||||
if let Some(change_callback) = &change_callback {
|
||||
change_callback(&mut frontend, e.checked);
|
||||
if let Some(task) = &additional_frontend_task {
|
||||
frontend_tasks.push(task.clone());
|
||||
}
|
||||
|
||||
frontend.settings.mark_as_dirty();
|
||||
|
||||
Ok(())
|
||||
}));
|
||||
|
||||
@@ -63,42 +98,56 @@ impl TabSettings {
|
||||
parent_id,
|
||||
)?;
|
||||
|
||||
let tasks = Tasks::new();
|
||||
|
||||
init_setting_checkbox(
|
||||
frontend,
|
||||
&tasks,
|
||||
state.data.fetch_component_as::<ComponentCheckbox>("cb_hide_username")?,
|
||||
|settings| &mut settings.home_screen.hide_username,
|
||||
SettingType::DashHideUsername,
|
||||
None,
|
||||
)?;
|
||||
|
||||
init_setting_checkbox(
|
||||
frontend,
|
||||
&tasks,
|
||||
state.data.fetch_component_as::<ComponentCheckbox>("cb_am_pm_clock")?,
|
||||
|settings| &mut settings.general.am_pm_clock,
|
||||
Some(|frontend, _| {
|
||||
frontend.tasks.push(FrontendTask::RefreshClock);
|
||||
}),
|
||||
SettingType::DashAmPmClock,
|
||||
None,
|
||||
)?;
|
||||
|
||||
init_setting_checkbox(
|
||||
frontend,
|
||||
&tasks,
|
||||
state.data.fetch_component_as::<ComponentCheckbox>("cb_am_pm_clock")?,
|
||||
SettingType::DashAmPmClock,
|
||||
Some(FrontendTask::RefreshClock),
|
||||
)?;
|
||||
|
||||
init_setting_checkbox(
|
||||
frontend,
|
||||
&tasks,
|
||||
state
|
||||
.data
|
||||
.fetch_component_as::<ComponentCheckbox>("cb_opaque_background")?,
|
||||
|settings| &mut settings.general.opaque_background,
|
||||
Some(|frontend, _| {
|
||||
frontend.tasks.push(FrontendTask::RefreshBackground);
|
||||
}),
|
||||
SettingType::DashOpaqueBackground,
|
||||
Some(FrontendTask::RefreshBackground),
|
||||
)?;
|
||||
|
||||
init_setting_checkbox(
|
||||
frontend,
|
||||
&tasks,
|
||||
state
|
||||
.data
|
||||
.fetch_component_as::<ComponentCheckbox>("cb_xwayland_by_default")?,
|
||||
|settings| &mut settings.tweaks.xwayland_by_default,
|
||||
SettingType::DashXwaylandByDefault,
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
use std::{cell::RefCell, collections::VecDeque, rc::Rc};
|
||||
|
||||
use wgui::components::button::ComponentButton;
|
||||
|
||||
pub struct Tasks<TaskType>(Rc<RefCell<VecDeque<TaskType>>>);
|
||||
|
||||
impl<T> Clone for Tasks<T> {
|
||||
fn clone(&self) -> Self {
|
||||
Self(self.0.clone())
|
||||
}
|
||||
}
|
||||
|
||||
impl<TaskType: 'static> Tasks<TaskType> {
|
||||
pub fn new() -> Self {
|
||||
Self(Rc::new(RefCell::new(VecDeque::new())))
|
||||
}
|
||||
|
||||
pub fn push(&self, task: TaskType) {
|
||||
self.0.borrow_mut().push_back(task);
|
||||
}
|
||||
|
||||
pub fn drain(&mut self) -> VecDeque<TaskType> {
|
||||
let mut tasks = self.0.borrow_mut();
|
||||
std::mem::take(&mut *tasks)
|
||||
}
|
||||
}
|
||||
|
||||
impl<TaskType: 'static> Default for Tasks<TaskType> {
|
||||
fn default() -> Self {
|
||||
Self::new()
|
||||
}
|
||||
}
|
||||
|
||||
impl<TaskType: Clone + 'static> Tasks<TaskType> {
|
||||
pub fn handle_button(&self, button: Rc<ComponentButton>, task: TaskType) {
|
||||
button.on_click({
|
||||
let this = self.clone();
|
||||
Box::new(move |_, _| {
|
||||
this.push(task.clone());
|
||||
Ok(())
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
pub fn make_callback(&self, task: TaskType) -> Rc<dyn Fn()> {
|
||||
let this = self.clone();
|
||||
Rc::new(move || {
|
||||
this.push(task.clone());
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,7 @@ use wgui::{
|
||||
i18n::Translation,
|
||||
layout::{Layout, WidgetID},
|
||||
parser::{Fetchable, ParseDocumentParams, ParserState},
|
||||
task::Tasks,
|
||||
widget::label::WidgetLabel,
|
||||
};
|
||||
use wlx_common::dash_interface::BoxDashInterface;
|
||||
@@ -15,7 +16,6 @@ use wlx_common::dash_interface::BoxDashInterface;
|
||||
use crate::{
|
||||
frontend::{FrontendTask, FrontendTasks},
|
||||
settings::SettingsIO,
|
||||
task::Tasks,
|
||||
util::desktop_finder::DesktopEntry,
|
||||
};
|
||||
|
||||
@@ -96,7 +96,7 @@ impl View {
|
||||
|
||||
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")?;
|
||||
|
||||
|
||||
@@ -12,12 +12,12 @@ use wgui::{
|
||||
i18n::Translation,
|
||||
layout::{Layout, WidgetID},
|
||||
parser::{Fetchable, ParseDocumentParams, ParserState},
|
||||
task::Tasks,
|
||||
widget::ConstructEssentials,
|
||||
};
|
||||
|
||||
use crate::{
|
||||
frontend::{FrontendTask, FrontendTasks},
|
||||
task::Tasks,
|
||||
util::pactl_wrapper,
|
||||
};
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ use wgui::{
|
||||
self,
|
||||
prelude::{length, percent},
|
||||
},
|
||||
task::Tasks,
|
||||
widget::{
|
||||
ConstructEssentials,
|
||||
div::WidgetDiv,
|
||||
@@ -29,7 +30,6 @@ use wgui::{
|
||||
|
||||
use crate::{
|
||||
frontend::{FrontendTask, FrontendTasks},
|
||||
task::Tasks,
|
||||
util::{
|
||||
cover_art_fetcher::{self, CoverArt},
|
||||
popup_manager::MountPopupParams,
|
||||
|
||||
@@ -13,6 +13,7 @@ use wgui::{
|
||||
layout::{Layout, WidgetID},
|
||||
parser::{Fetchable, ParseDocumentParams, ParserState},
|
||||
taffy::{self, prelude::length},
|
||||
task::Tasks,
|
||||
widget::{
|
||||
ConstructEssentials,
|
||||
div::WidgetDiv,
|
||||
@@ -21,13 +22,10 @@ use wgui::{
|
||||
};
|
||||
use wlx_common::dash_interface::BoxDashInterface;
|
||||
|
||||
use crate::{
|
||||
task::Tasks,
|
||||
util::{
|
||||
self,
|
||||
desktop_finder::{self},
|
||||
various::get_desktop_file_icon_path,
|
||||
},
|
||||
use crate::util::{
|
||||
self,
|
||||
desktop_finder::{self},
|
||||
various::get_desktop_file_icon_path,
|
||||
};
|
||||
|
||||
#[derive(Clone)]
|
||||
|
||||
@@ -10,16 +10,16 @@ use wgui::{
|
||||
parser::{Fetchable, ParseDocumentParams, ParserState},
|
||||
renderer_vk::text::{FontWeight, HorizontalAlign, TextStyle},
|
||||
taffy::{self, prelude::length},
|
||||
task::Tasks,
|
||||
widget::{
|
||||
label::{WidgetLabel, WidgetLabelParams},
|
||||
ConstructEssentials,
|
||||
label::{WidgetLabel, WidgetLabelParams},
|
||||
},
|
||||
};
|
||||
use wlx_common::dash_interface::BoxDashInterface;
|
||||
|
||||
use crate::{
|
||||
frontend::{FrontendTask, FrontendTasks},
|
||||
task::Tasks,
|
||||
util::popup_manager::{MountPopupParams, PopupHandle},
|
||||
views::window_options,
|
||||
};
|
||||
|
||||
@@ -8,13 +8,13 @@ use wgui::{
|
||||
i18n::Translation,
|
||||
layout::{Layout, WidgetID},
|
||||
parser::{Fetchable, ParseDocumentParams, ParserState},
|
||||
task::Tasks,
|
||||
widget::ConstructEssentials,
|
||||
};
|
||||
use wlx_common::dash_interface::BoxDashInterface;
|
||||
|
||||
use crate::{
|
||||
frontend::{FrontendTask, FrontendTasks},
|
||||
task::Tasks,
|
||||
views::window_list::construct_window_button,
|
||||
};
|
||||
|
||||
@@ -80,9 +80,9 @@ impl View {
|
||||
c.finish()?;
|
||||
}
|
||||
|
||||
tasks.handle_button(btn_close, Task::Close);
|
||||
tasks.handle_button(btn_kill, Task::Kill);
|
||||
tasks.handle_button(btn_show_hide, Task::SetVisible(!params.window.visible));
|
||||
tasks.handle_button(&btn_close, Task::Close);
|
||||
tasks.handle_button(&btn_kill, Task::Kill);
|
||||
tasks.handle_button(&btn_show_hide, Task::SetVisible(!params.window.visible));
|
||||
|
||||
Ok(Self {
|
||||
state,
|
||||
|
||||
Reference in New Issue
Block a user