feat(ui): added new patch status, fixed voiceovers issue
This commit is contained in:
parent
bbcdcf4973
commit
172241457a
3 changed files with 106 additions and 34 deletions
8
Cargo.lock
generated
8
Cargo.lock
generated
|
@ -57,8 +57,8 @@ checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anime-game-core"
|
name = "anime-game-core"
|
||||||
version = "1.17.0"
|
version = "1.17.2"
|
||||||
source = "git+https://github.com/an-anime-team/anime-game-core?tag=1.17.0#e2cd6d91ef80d9fba72e0abe2e71b802d558dd75"
|
source = "git+https://github.com/an-anime-team/anime-game-core?tag=1.17.2#11b51441ed0390b7a5ba20e62e3c28a6886f8b97"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"bzip2",
|
"bzip2",
|
||||||
|
@ -82,8 +82,8 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anime-launcher-sdk"
|
name = "anime-launcher-sdk"
|
||||||
version = "1.12.0"
|
version = "1.12.2"
|
||||||
source = "git+https://github.com/an-anime-team/anime-launcher-sdk?tag=1.12.0#eaa6db3a68c6c73120589185e78c707945d7723f"
|
source = "git+https://github.com/an-anime-team/anime-launcher-sdk?tag=1.12.2#923a389dffe44c2076bbacb7085084069fbaee4f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anime-game-core",
|
"anime-game-core",
|
||||||
"anyhow",
|
"anyhow",
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
name = "honkers-railway-launcher"
|
name = "honkers-railway-launcher"
|
||||||
version = "1.4.0"
|
version = "1.4.0"
|
||||||
description = "The Honkers Railway launcher"
|
description = "The Honkers Railway launcher"
|
||||||
authors = ["Nikita Podvirnyy <suimin.tu.mu.ga.mi@gmail.com>"]
|
authors = ["Nikita Podvirnyy <krypt0nn@vk.com>"]
|
||||||
homepage = "https://github.com/an-anime-team/the-honkers-railway-launcher"
|
homepage = "https://github.com/an-anime-team/the-honkers-railway-launcher"
|
||||||
repository = "https://github.com/an-anime-team/the-honkers-railway-launcher"
|
repository = "https://github.com/an-anime-team/the-honkers-railway-launcher"
|
||||||
license = "GPL-3.0"
|
license = "GPL-3.0"
|
||||||
|
@ -19,7 +19,7 @@ glib-build-tools = "0.18"
|
||||||
|
|
||||||
[dependencies.anime-launcher-sdk]
|
[dependencies.anime-launcher-sdk]
|
||||||
git = "https://github.com/an-anime-team/anime-launcher-sdk"
|
git = "https://github.com/an-anime-team/anime-launcher-sdk"
|
||||||
tag = "1.12.0"
|
tag = "1.12.2"
|
||||||
features = ["all", "star-rail", "star-rail-patch"]
|
features = ["all", "star-rail", "star-rail-patch"]
|
||||||
|
|
||||||
# path = "../anime-launcher-sdk" # ! for dev purposes only
|
# path = "../anime-launcher-sdk" # ! for dev purposes only
|
||||||
|
|
|
@ -303,12 +303,21 @@ impl SimpleComponent for App {
|
||||||
#[watch]
|
#[watch]
|
||||||
set_tooltip_text: Some(&tr!("predownload-update", {
|
set_tooltip_text: Some(&tr!("predownload-update", {
|
||||||
"version" = match model.state.as_ref() {
|
"version" = match model.state.as_ref() {
|
||||||
Some(LauncherState::PredownloadAvailable { diff, .. }) => diff.latest().to_string(),
|
Some(LauncherState::PredownloadAvailable { game, .. }) => game.latest().to_string(),
|
||||||
_ => String::from("?")
|
_ => String::from("?")
|
||||||
},
|
},
|
||||||
|
|
||||||
"size" = match model.state.as_ref() {
|
"size" = match model.state.as_ref() {
|
||||||
Some(LauncherState::PredownloadAvailable { diff, .. }) => prettify_bytes(diff.downloaded_size().unwrap_or(0)),
|
Some(LauncherState::PredownloadAvailable { game, voices, .. }) => {
|
||||||
|
let mut size = game.downloaded_size().unwrap_or(0);
|
||||||
|
|
||||||
|
for voice in voices {
|
||||||
|
size += voice.downloaded_size().unwrap_or(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
prettify_bytes(size)
|
||||||
|
}
|
||||||
|
|
||||||
_ => String::from("?")
|
_ => String::from("?")
|
||||||
}
|
}
|
||||||
})),
|
})),
|
||||||
|
@ -318,13 +327,27 @@ impl SimpleComponent for App {
|
||||||
|
|
||||||
#[watch]
|
#[watch]
|
||||||
set_sensitive: match model.state.as_ref() {
|
set_sensitive: match model.state.as_ref() {
|
||||||
Some(LauncherState::PredownloadAvailable { diff, .. }) => {
|
Some(LauncherState::PredownloadAvailable { game, voices, .. }) => {
|
||||||
let config = Config::get().unwrap();
|
let config = Config::get().unwrap();
|
||||||
let temp = config.launcher.temp.unwrap_or_else(std::env::temp_dir);
|
let temp = config.launcher.temp.unwrap_or_else(std::env::temp_dir);
|
||||||
|
|
||||||
!temp.join(diff.file_name().unwrap()).metadata()
|
let mut downloaded = temp.join(game.file_name().unwrap()).metadata()
|
||||||
.map(|metadata| Some(metadata.len()) == diff.downloaded_size())
|
.map(|metadata| Some(metadata.len()) == game.downloaded_size())
|
||||||
.unwrap_or(false)
|
.unwrap_or(false);
|
||||||
|
|
||||||
|
if downloaded {
|
||||||
|
for voice in voices {
|
||||||
|
downloaded = !temp.join(voice.file_name().unwrap()).metadata()
|
||||||
|
.map(|metadata| Some(metadata.len()) == voice.downloaded_size())
|
||||||
|
.unwrap_or(false);
|
||||||
|
|
||||||
|
if downloaded {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
!downloaded
|
||||||
}
|
}
|
||||||
|
|
||||||
_ => false
|
_ => false
|
||||||
|
@ -332,14 +355,26 @@ impl SimpleComponent for App {
|
||||||
|
|
||||||
#[watch]
|
#[watch]
|
||||||
set_css_classes: match model.state.as_ref() {
|
set_css_classes: match model.state.as_ref() {
|
||||||
Some(LauncherState::PredownloadAvailable { diff, .. }) => {
|
Some(LauncherState::PredownloadAvailable { game, voices, .. }) => {
|
||||||
let config = Config::get().unwrap();
|
let config = Config::get().unwrap();
|
||||||
let temp = config.launcher.temp.unwrap_or_else(std::env::temp_dir);
|
let temp = config.launcher.temp.unwrap_or_else(std::env::temp_dir);
|
||||||
|
|
||||||
let downloaded = temp.join(diff.file_name().unwrap()).metadata()
|
let mut downloaded = temp.join(game.file_name().unwrap()).metadata()
|
||||||
.map(|metadata| Some(metadata.len()) == diff.downloaded_size())
|
.map(|metadata| Some(metadata.len()) == game.downloaded_size())
|
||||||
.unwrap_or(false);
|
.unwrap_or(false);
|
||||||
|
|
||||||
|
if downloaded {
|
||||||
|
for voice in voices {
|
||||||
|
downloaded = !temp.join(voice.file_name().unwrap()).metadata()
|
||||||
|
.map(|metadata| Some(metadata.len()) == voice.downloaded_size())
|
||||||
|
.unwrap_or(false);
|
||||||
|
|
||||||
|
if downloaded {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if downloaded {
|
if downloaded {
|
||||||
&["success", "circular"]
|
&["success", "circular"]
|
||||||
} else {
|
} else {
|
||||||
|
@ -369,8 +404,10 @@ impl SimpleComponent for App {
|
||||||
set_icon_name: match &model.state {
|
set_icon_name: match &model.state {
|
||||||
Some(LauncherState::Launch) |
|
Some(LauncherState::Launch) |
|
||||||
Some(LauncherState::PatchNotVerified) |
|
Some(LauncherState::PatchNotVerified) |
|
||||||
|
Some(LauncherState::PatchConcerning) |
|
||||||
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Verified, .. }) |
|
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Verified, .. }) |
|
||||||
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unverified, .. })
|
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unverified, .. }) |
|
||||||
|
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Concerning, .. })
|
||||||
=> "media-playback-start-symbolic",
|
=> "media-playback-start-symbolic",
|
||||||
|
|
||||||
Some(LauncherState::PatchNotInstalled) |
|
Some(LauncherState::PatchNotInstalled) |
|
||||||
|
@ -382,9 +419,12 @@ impl SimpleComponent for App {
|
||||||
Some(LauncherState::PrefixNotExists) => "document-save-symbolic",
|
Some(LauncherState::PrefixNotExists) => "document-save-symbolic",
|
||||||
|
|
||||||
Some(LauncherState::GameUpdateAvailable(_)) |
|
Some(LauncherState::GameUpdateAvailable(_)) |
|
||||||
Some(LauncherState::GameNotInstalled(_)) => "document-save-symbolic",
|
Some(LauncherState::GameNotInstalled(_)) |
|
||||||
|
Some(LauncherState::VoiceUpdateAvailable(_)) |
|
||||||
|
Some(LauncherState::VoiceNotInstalled(_)) => "document-save-symbolic",
|
||||||
|
|
||||||
Some(LauncherState::GameOutdated(_)) |
|
Some(LauncherState::GameOutdated(_)) |
|
||||||
|
Some(LauncherState::VoiceOutdated(_)) |
|
||||||
Some(LauncherState::PatchBroken) |
|
Some(LauncherState::PatchBroken) |
|
||||||
Some(LauncherState::PatchUnsafe) |
|
Some(LauncherState::PatchUnsafe) |
|
||||||
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Broken, .. }) |
|
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Broken, .. }) |
|
||||||
|
@ -396,8 +436,10 @@ impl SimpleComponent for App {
|
||||||
set_label: &match &model.state {
|
set_label: &match &model.state {
|
||||||
Some(LauncherState::Launch) |
|
Some(LauncherState::Launch) |
|
||||||
Some(LauncherState::PatchNotVerified) |
|
Some(LauncherState::PatchNotVerified) |
|
||||||
|
Some(LauncherState::PatchConcerning) |
|
||||||
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Verified, .. }) |
|
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Verified, .. }) |
|
||||||
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unverified, .. })
|
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unverified, .. }) |
|
||||||
|
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Concerning, .. })
|
||||||
=> tr!("launch"),
|
=> tr!("launch"),
|
||||||
|
|
||||||
Some(LauncherState::PatchNotInstalled) |
|
Some(LauncherState::PatchNotInstalled) |
|
||||||
|
@ -417,7 +459,9 @@ impl SimpleComponent for App {
|
||||||
Some(LauncherState::PrefixNotExists) => tr!("create-prefix"),
|
Some(LauncherState::PrefixNotExists) => tr!("create-prefix"),
|
||||||
|
|
||||||
Some(LauncherState::GameUpdateAvailable(diff)) |
|
Some(LauncherState::GameUpdateAvailable(diff)) |
|
||||||
Some(LauncherState::GameOutdated(diff)) => {
|
Some(LauncherState::GameOutdated(diff)) |
|
||||||
|
Some(LauncherState::VoiceUpdateAvailable(diff)) |
|
||||||
|
Some(LauncherState::VoiceOutdated(diff)) => {
|
||||||
match (Config::get(), diff.file_name()) {
|
match (Config::get(), diff.file_name()) {
|
||||||
(Ok(config), Some(filename)) => {
|
(Ok(config), Some(filename)) => {
|
||||||
let temp = config.launcher.temp.unwrap_or_else(std::env::temp_dir);
|
let temp = config.launcher.temp.unwrap_or_else(std::env::temp_dir);
|
||||||
|
@ -435,7 +479,8 @@ impl SimpleComponent for App {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
Some(LauncherState::GameNotInstalled(_)) => tr!("download"),
|
Some(LauncherState::GameNotInstalled(_)) |
|
||||||
|
Some(LauncherState::VoiceNotInstalled(_)) => tr!("download"),
|
||||||
|
|
||||||
None => String::from("...")
|
None => String::from("...")
|
||||||
}
|
}
|
||||||
|
@ -444,6 +489,7 @@ impl SimpleComponent for App {
|
||||||
#[watch]
|
#[watch]
|
||||||
set_sensitive: !model.disabled_buttons && match &model.state {
|
set_sensitive: !model.disabled_buttons && match &model.state {
|
||||||
Some(LauncherState::GameOutdated { .. }) |
|
Some(LauncherState::GameOutdated { .. }) |
|
||||||
|
Some(LauncherState::VoiceOutdated(_)) |
|
||||||
Some(LauncherState::PatchBroken) |
|
Some(LauncherState::PatchBroken) |
|
||||||
Some(LauncherState::PatchUnsafe) |
|
Some(LauncherState::PatchUnsafe) |
|
||||||
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Broken, .. }) |
|
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Broken, .. }) |
|
||||||
|
@ -456,12 +502,15 @@ impl SimpleComponent for App {
|
||||||
#[watch]
|
#[watch]
|
||||||
set_css_classes: match &model.state {
|
set_css_classes: match &model.state {
|
||||||
Some(LauncherState::GameOutdated { .. }) |
|
Some(LauncherState::GameOutdated { .. }) |
|
||||||
|
Some(LauncherState::VoiceOutdated(_)) |
|
||||||
Some(LauncherState::PatchNotVerified) => &["warning", "pill"],
|
Some(LauncherState::PatchNotVerified) => &["warning", "pill"],
|
||||||
|
|
||||||
Some(LauncherState::PatchBroken) |
|
Some(LauncherState::PatchBroken) |
|
||||||
Some(LauncherState::PatchUnsafe) |
|
Some(LauncherState::PatchUnsafe) |
|
||||||
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Broken, .. }) |
|
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Broken, .. }) |
|
||||||
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unsafe, .. }) => &["error", "pill"],
|
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unsafe, .. }) |
|
||||||
|
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Concerning, .. })
|
||||||
|
=> &["error", "pill"],
|
||||||
|
|
||||||
Some(_) => &["suggested-action", "pill"],
|
Some(_) => &["suggested-action", "pill"],
|
||||||
None => &["pill"]
|
None => &["pill"]
|
||||||
|
@ -469,7 +518,8 @@ impl SimpleComponent for App {
|
||||||
|
|
||||||
#[watch]
|
#[watch]
|
||||||
set_tooltip_text: Some(&match &model.state {
|
set_tooltip_text: Some(&match &model.state {
|
||||||
Some(LauncherState::GameOutdated { .. }) => tr!("main-window--version-outdated-tooltip"),
|
Some(LauncherState::GameOutdated { .. }) |
|
||||||
|
Some(LauncherState::VoiceOutdated(_)) => tr!("main-window--version-outdated-tooltip"),
|
||||||
|
|
||||||
Some(LauncherState::PatchNotVerified) => tr!("patch-testing-tooltip"),
|
Some(LauncherState::PatchNotVerified) => tr!("patch-testing-tooltip"),
|
||||||
|
|
||||||
|
@ -477,8 +527,12 @@ impl SimpleComponent for App {
|
||||||
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Broken, .. })
|
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Broken, .. })
|
||||||
=> tr!("patch-broken-tooltip"),
|
=> tr!("patch-broken-tooltip"),
|
||||||
|
|
||||||
|
// TODO: a special tooltip for concerning patch state
|
||||||
|
|
||||||
Some(LauncherState::PatchUnsafe) |
|
Some(LauncherState::PatchUnsafe) |
|
||||||
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unsafe, .. })
|
Some(LauncherState::PatchConcerning) |
|
||||||
|
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unsafe, .. }) |
|
||||||
|
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Concerning, .. })
|
||||||
=> tr!("patch-unsafe-tooltip"),
|
=> tr!("patch-unsafe-tooltip"),
|
||||||
|
|
||||||
_ => String::new()
|
_ => String::new()
|
||||||
|
@ -965,6 +1019,12 @@ impl SimpleComponent for App {
|
||||||
sender.input(AppMsg::SetLoadingStatus(Some(Some(tr!("loading-launcher-state--game")))));
|
sender.input(AppMsg::SetLoadingStatus(Some(Some(tr!("loading-launcher-state--game")))));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StateUpdating::Voice(locale) => {
|
||||||
|
sender.input(AppMsg::SetLoadingStatus(Some(Some(tr!("loading-launcher-state--voice", {
|
||||||
|
"locale" = locale.to_name()
|
||||||
|
})))));
|
||||||
|
}
|
||||||
|
|
||||||
StateUpdating::Patch => {
|
StateUpdating::Patch => {
|
||||||
sender.input(AppMsg::SetLoadingStatus(Some(Some(tr!("loading-launcher-state--patch")))));
|
sender.input(AppMsg::SetLoadingStatus(Some(Some(tr!("loading-launcher-state--patch")))));
|
||||||
}
|
}
|
||||||
|
@ -1047,7 +1107,7 @@ impl SimpleComponent for App {
|
||||||
|
|
||||||
#[allow(unused_must_use)]
|
#[allow(unused_must_use)]
|
||||||
AppMsg::PredownloadUpdate => {
|
AppMsg::PredownloadUpdate => {
|
||||||
if let Some(LauncherState::PredownloadAvailable { mut diff, .. }) = self.state.clone() {
|
if let Some(LauncherState::PredownloadAvailable { game, mut voices, .. }) = self.state.clone() {
|
||||||
let tmp = Config::get().unwrap().launcher.temp.unwrap_or_else(std::env::temp_dir);
|
let tmp = Config::get().unwrap().launcher.temp.unwrap_or_else(std::env::temp_dir);
|
||||||
|
|
||||||
self.downloading = true;
|
self.downloading = true;
|
||||||
|
@ -1056,18 +1116,26 @@ impl SimpleComponent for App {
|
||||||
|
|
||||||
progress_bar_input.send(ProgressBarMsg::UpdateCaption(Some(tr!("downloading"))));
|
progress_bar_input.send(ProgressBarMsg::UpdateCaption(Some(tr!("downloading"))));
|
||||||
|
|
||||||
|
let mut diffs: Vec<VersionDiff> = vec![game];
|
||||||
|
|
||||||
|
diffs.append(&mut voices);
|
||||||
|
|
||||||
std::thread::spawn(move || {
|
std::thread::spawn(move || {
|
||||||
let result = diff.download_to(&tmp, clone!(@strong progress_bar_input => move |curr, total| {
|
for mut diff in diffs {
|
||||||
progress_bar_input.send(ProgressBarMsg::UpdateProgress(curr, total));
|
let result = diff.download_to(&tmp, clone!(@strong progress_bar_input => move |curr, total| {
|
||||||
}));
|
progress_bar_input.send(ProgressBarMsg::UpdateProgress(curr, total));
|
||||||
|
}));
|
||||||
|
|
||||||
if let Err(err) = result {
|
if let Err(err) = result {
|
||||||
sender.input(AppMsg::Toast {
|
sender.input(AppMsg::Toast {
|
||||||
title: tr!("downloading-failed"),
|
title: tr!("downloading-failed"),
|
||||||
description: Some(err.to_string())
|
description: Some(err.to_string())
|
||||||
});
|
});
|
||||||
|
|
||||||
tracing::error!("Failed to predownload update: {err}");
|
tracing::error!("Failed to predownload update: {err}");
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sender.input(AppMsg::SetDownloading(false));
|
sender.input(AppMsg::SetDownloading(false));
|
||||||
|
@ -1082,8 +1150,10 @@ impl SimpleComponent for App {
|
||||||
AppMsg::PerformAction => unsafe {
|
AppMsg::PerformAction => unsafe {
|
||||||
match self.state.as_ref().unwrap_unchecked() {
|
match self.state.as_ref().unwrap_unchecked() {
|
||||||
LauncherState::PatchNotVerified |
|
LauncherState::PatchNotVerified |
|
||||||
|
LauncherState::PatchConcerning |
|
||||||
LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Verified, .. } |
|
LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Verified, .. } |
|
||||||
LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unverified, .. } |
|
LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unverified, .. } |
|
||||||
|
LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Concerning, .. } |
|
||||||
LauncherState::Launch => launch::launch(sender),
|
LauncherState::Launch => launch::launch(sender),
|
||||||
|
|
||||||
LauncherState::PatchNotInstalled |
|
LauncherState::PatchNotInstalled |
|
||||||
|
@ -1095,7 +1165,9 @@ impl SimpleComponent for App {
|
||||||
LauncherState::PrefixNotExists => create_prefix::create_prefix(sender),
|
LauncherState::PrefixNotExists => create_prefix::create_prefix(sender),
|
||||||
|
|
||||||
LauncherState::GameUpdateAvailable(diff) |
|
LauncherState::GameUpdateAvailable(diff) |
|
||||||
LauncherState::GameNotInstalled(diff) =>
|
LauncherState::GameNotInstalled(diff) |
|
||||||
|
LauncherState::VoiceUpdateAvailable(diff) |
|
||||||
|
LauncherState::VoiceNotInstalled(diff) =>
|
||||||
download_diff::download_diff(sender, self.progress_bar.sender().to_owned(), diff.to_owned()),
|
download_diff::download_diff(sender, self.progress_bar.sender().to_owned(), diff.to_owned()),
|
||||||
|
|
||||||
_ => ()
|
_ => ()
|
||||||
|
|
Loading…
Reference in a new issue