mirror of
https://github.com/an-anime-team/sleepy-launcher.git
synced 2025-03-15 06:28:27 +03:00
Components list: added base components states system
This commit is contained in:
parent
f168862cc7
commit
db24d1bd25
5 changed files with 68 additions and 17 deletions
|
@ -2,6 +2,8 @@ use relm4::prelude::*;
|
|||
|
||||
use adw::prelude::*;
|
||||
|
||||
use std::path::PathBuf;
|
||||
|
||||
pub struct ComponentGroup {
|
||||
pub title: String,
|
||||
pub show_recommended_only: bool,
|
||||
|
@ -16,7 +18,7 @@ pub enum AppMsg {
|
|||
|
||||
#[relm4::component(pub)]
|
||||
impl SimpleComponent for ComponentGroup {
|
||||
type Init = super::ComponentsListGroup;
|
||||
type Init = (super::ComponentsListGroup, PathBuf);
|
||||
type Input = AppMsg;
|
||||
type Output = ();
|
||||
|
||||
|
@ -32,14 +34,14 @@ impl SimpleComponent for ComponentGroup {
|
|||
_sender: ComponentSender<Self>,
|
||||
) -> ComponentParts<Self> {
|
||||
let model = ComponentGroup {
|
||||
title: init.title,
|
||||
title: init.0.title,
|
||||
show_recommended_only: true,
|
||||
|
||||
versions: init.versions
|
||||
versions: init.0.versions
|
||||
.into_iter()
|
||||
.map(|version| {
|
||||
super::ComponentVersion::builder()
|
||||
.launch(version)
|
||||
.launch((version, init.1.clone()))
|
||||
.detach()
|
||||
})
|
||||
.collect()
|
||||
|
|
|
@ -3,7 +3,6 @@ use relm4::prelude::*;
|
|||
use adw::prelude::*;
|
||||
|
||||
pub struct ComponentsList {
|
||||
pub _download_folder: String,
|
||||
pub show_recommended_only: bool,
|
||||
|
||||
pub groups: Vec<Controller<super::ComponentGroup>>
|
||||
|
@ -30,14 +29,13 @@ impl SimpleComponent for ComponentsList {
|
|||
_sender: ComponentSender<Self>,
|
||||
) -> ComponentParts<Self> {
|
||||
let model = ComponentsList {
|
||||
_download_folder: init.download_folder,
|
||||
show_recommended_only: true,
|
||||
|
||||
groups: init.groups
|
||||
.into_iter()
|
||||
.map(|group| {
|
||||
super::ComponentGroup::builder()
|
||||
.launch(group)
|
||||
.launch((group, init.download_folder.clone()))
|
||||
.detach()
|
||||
})
|
||||
.collect()
|
||||
|
|
|
@ -8,9 +8,11 @@ pub use version::*;
|
|||
|
||||
use anime_launcher_sdk::components::*;
|
||||
|
||||
use std::path::PathBuf;
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub struct ComponentsListPattern {
|
||||
pub download_folder: String,
|
||||
pub download_folder: PathBuf,
|
||||
pub groups: Vec<ComponentsListGroup>
|
||||
}
|
||||
|
||||
|
@ -40,6 +42,7 @@ impl From<dxvk::Group> for ComponentsListGroup {
|
|||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub struct ComponentsListVersion {
|
||||
pub name: String,
|
||||
pub title: String,
|
||||
pub uri: String,
|
||||
pub recommended: bool
|
||||
|
@ -48,6 +51,7 @@ pub struct ComponentsListVersion {
|
|||
impl From<wine::Version> for ComponentsListVersion {
|
||||
fn from(version: wine::Version) -> Self {
|
||||
Self {
|
||||
name: version.name,
|
||||
title: version.title,
|
||||
uri: version.uri,
|
||||
recommended: version.recommended
|
||||
|
@ -58,6 +62,7 @@ impl From<wine::Version> for ComponentsListVersion {
|
|||
impl From<dxvk::Version> for ComponentsListVersion {
|
||||
fn from(version: dxvk::Version) -> Self {
|
||||
Self {
|
||||
name: version.name.clone(),
|
||||
title: version.name,
|
||||
uri: version.uri,
|
||||
recommended: version.recommended
|
||||
|
|
|
@ -2,10 +2,25 @@ use relm4::prelude::*;
|
|||
|
||||
use adw::prelude::*;
|
||||
|
||||
use std::path::PathBuf;
|
||||
|
||||
pub enum VersionState {
|
||||
Downloaded,
|
||||
Downloading(u64, u64),
|
||||
Unpacking(u64, u64),
|
||||
NotDownloaded
|
||||
}
|
||||
|
||||
pub struct ComponentVersion {
|
||||
pub name: String,
|
||||
pub title: String,
|
||||
pub recommended: bool,
|
||||
pub show_recommended_only: bool
|
||||
|
||||
pub download_uri: String,
|
||||
pub download_folder: PathBuf,
|
||||
|
||||
pub show_recommended_only: bool,
|
||||
pub state: VersionState
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
|
@ -15,7 +30,7 @@ pub enum AppMsg {
|
|||
|
||||
#[relm4::component(pub)]
|
||||
impl SimpleComponent for ComponentVersion {
|
||||
type Init = super::ComponentsListVersion;
|
||||
type Init = (super::ComponentsListVersion, PathBuf);
|
||||
type Input = AppMsg;
|
||||
type Output = ();
|
||||
|
||||
|
@ -24,7 +39,20 @@ impl SimpleComponent for ComponentVersion {
|
|||
set_title: &model.title,
|
||||
|
||||
#[watch]
|
||||
set_visible: !model.show_recommended_only || model.recommended
|
||||
set_visible: !model.show_recommended_only || model.recommended,
|
||||
|
||||
add_suffix = >k::Button {
|
||||
#[watch]
|
||||
set_icon_name: match model.state {
|
||||
VersionState::NotDownloaded => "document-save-symbolic",
|
||||
|
||||
// In other states it will be downloaded or hidden
|
||||
_ => "user-trash-symbolic"
|
||||
},
|
||||
|
||||
add_css_class: "flat",
|
||||
set_valign: gtk::Align::Center
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -33,10 +61,23 @@ impl SimpleComponent for ComponentVersion {
|
|||
root: &Self::Root,
|
||||
_sender: ComponentSender<Self>,
|
||||
) -> ComponentParts<Self> {
|
||||
let model = ComponentVersion {
|
||||
title: init.title,
|
||||
recommended: init.recommended,
|
||||
show_recommended_only: true
|
||||
let mut model = ComponentVersion {
|
||||
name: init.0.name,
|
||||
title: init.0.title,
|
||||
recommended: init.0.recommended,
|
||||
|
||||
download_uri: init.0.uri,
|
||||
download_folder: init.1,
|
||||
|
||||
show_recommended_only: true,
|
||||
state: VersionState::NotDownloaded
|
||||
};
|
||||
|
||||
// Set default component state
|
||||
model.state = if model.download_folder.join(&model.name).exists() {
|
||||
VersionState::Downloaded
|
||||
} else {
|
||||
VersionState::NotDownloaded
|
||||
};
|
||||
|
||||
let widgets = view_output!();
|
||||
|
|
|
@ -3,12 +3,17 @@ use relm4::prelude::*;
|
|||
use gtk::prelude::*;
|
||||
use adw::prelude::*;
|
||||
|
||||
use anime_launcher_sdk::config;
|
||||
use anime_launcher_sdk::components::*;
|
||||
|
||||
use crate::ui::components::{self, *};
|
||||
|
||||
use crate::i18n::tr;
|
||||
|
||||
lazy_static::lazy_static! {
|
||||
static ref CONFIG: config::Config = config::get().expect("Failed to load config");
|
||||
}
|
||||
|
||||
pub struct App {
|
||||
wine_components: Controller<ComponentsList>,
|
||||
dxvk_components: Controller<ComponentsList>
|
||||
|
@ -83,14 +88,14 @@ impl SimpleComponent for App {
|
|||
let model = App {
|
||||
wine_components: ComponentsList::builder()
|
||||
.launch(ComponentsListPattern {
|
||||
download_folder: String::from("/tmp"),
|
||||
download_folder: CONFIG.game.wine.builds.clone(),
|
||||
groups: wine::get_groups().into_iter().map(|group| group.into()).collect()
|
||||
})
|
||||
.detach(),
|
||||
|
||||
dxvk_components: ComponentsList::builder()
|
||||
.launch(ComponentsListPattern {
|
||||
download_folder: String::from("/tmp"),
|
||||
download_folder: CONFIG.game.dxvk.builds.clone(),
|
||||
groups: dxvk::get_groups().into_iter().map(|group| group.into()).collect()
|
||||
})
|
||||
.detach(),
|
||||
|
|
Loading…
Add table
Reference in a new issue