Components list: added base components states system

This commit is contained in:
Observer KRypt0n_ 2023-01-22 12:33:26 +02:00
parent f168862cc7
commit db24d1bd25
No known key found for this signature in database
GPG key ID: 844DA47BA25FE1E2
5 changed files with 68 additions and 17 deletions

View file

@ -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()

View file

@ -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()

View file

@ -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

View file

@ -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 = &gtk::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!();

View file

@ -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(),