From a2f2d5fcfccff78fde4cc50775b04c33a1ab40f2 Mon Sep 17 00:00:00 2001 From: Milan Stastny Date: Mon, 3 Apr 2023 11:27:27 +0200 Subject: [PATCH 1/5] Clippy fixes --- Cargo.toml | 2 - ....achetagames.epic_asset_manager.Devel.json | 2 +- ...github.achetagames.epic_asset_manager.json | 2 +- src/models/asset_data.rs | 66 ++++++------ src/models/database.rs | 4 +- src/models/engine_data.rs | 10 +- src/models/mod.rs | 25 ++--- src/tools/asset_info.rs | 20 ++-- src/tools/epic_web.rs | 40 ++++--- src/ui/authentication.rs | 8 +- src/ui/widgets/download_manager/asset.rs | 100 ++++++++---------- src/ui/widgets/download_manager/docker.rs | 73 +++++-------- .../widgets/download_manager/download_item.rs | 6 +- src/ui/widgets/download_manager/epic_file.rs | 47 +++----- src/ui/widgets/download_manager/mod.rs | 36 +++---- .../logged_in/engines/docker_download.rs | 74 ++++++------- src/ui/widgets/logged_in/engines/engine.rs | 4 +- .../logged_in/engines/engine_detail.rs | 39 +++---- .../widgets/logged_in/engines/engines_side.rs | 2 +- .../logged_in/engines/epic_download.rs | 50 ++++----- src/ui/widgets/logged_in/engines/mod.rs | 40 ++++--- .../logged_in/library/actions/local_asset.rs | 2 +- .../library/actions/manage_local_assets.rs | 2 +- .../widgets/logged_in/library/actions/mod.rs | 6 +- src/ui/widgets/logged_in/library/asset.rs | 12 +-- .../widgets/logged_in/library/asset_detail.rs | 2 +- src/ui/widgets/logged_in/library/mod.rs | 57 +++------- .../logged_in/library/sidebar/categories.rs | 7 +- .../widgets/logged_in/library/sidebar/mod.rs | 49 ++++----- src/ui/widgets/logged_in/log_line.rs | 2 +- src/ui/widgets/logged_in/logs.rs | 13 ++- src/ui/widgets/logged_in/projects/mod.rs | 20 ++-- src/ui/widgets/logged_in/projects/project.rs | 56 +++++----- .../logged_in/projects/project_detail.rs | 2 +- src/ui/widgets/preferences/mod.rs | 69 +++++------- src/ui/widgets/progress_icon.rs | 4 +- src/window.rs | 16 +-- 37 files changed, 414 insertions(+), 555 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2c992cb..edf19de 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,8 +9,6 @@ description = "An unofficial client to install Unreal Engine, download and manag keywords = ["unreal", "engine", "gamedev", "assets", "epic"] categories = ["gui"] -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] adw = { package = "libadwaita", version = "0.2" } anyhow = "1.0" diff --git a/build-aux/io.github.achetagames.epic_asset_manager.Devel.json b/build-aux/io.github.achetagames.epic_asset_manager.Devel.json index fb173f6..c991c86 100644 --- a/build-aux/io.github.achetagames.epic_asset_manager.Devel.json +++ b/build-aux/io.github.achetagames.epic_asset_manager.Devel.json @@ -1,7 +1,7 @@ { "app-id": "io.github.achetagames.epic_asset_manager.Devel", "runtime": "org.gnome.Platform", - "runtime-version": "43", + "runtime-version": "44", "sdk": "org.gnome.Sdk", "command": "epic_asset_manager", "sdk-extensions": [ diff --git a/build-aux/io.github.achetagames.epic_asset_manager.json b/build-aux/io.github.achetagames.epic_asset_manager.json index aaf0f24..d485f0c 100644 --- a/build-aux/io.github.achetagames.epic_asset_manager.json +++ b/build-aux/io.github.achetagames.epic_asset_manager.json @@ -1,7 +1,7 @@ { "app-id": "io.github.achetagames.epic_asset_manager", "runtime": "org.gnome.Platform", - "runtime-version": "43", + "runtime-version": "44", "sdk": "org.gnome.Sdk", "command": "epic_asset_manager", "sdk-extensions": [ diff --git a/src/models/asset_data.rs b/src/models/asset_data.rs index 8d87705..03a8d33 100644 --- a/src/models/asset_data.rs +++ b/src/models/asset_data.rs @@ -226,11 +226,11 @@ impl AssetData { fn configure_kind(&self, asset: &AssetInfo) { let self_ = self.imp(); - match Self::decide_kind(asset) { - None => { + Self::decide_kind(asset).map_or_else( + || { self_.kind.replace(None); - } - Some(kind) => match kind { + }, + |kind| match kind { AssetType::Asset => { self_.kind.replace(Some("asset".to_string())); } @@ -247,7 +247,7 @@ impl AssetData { self_.kind.replace(Some("plugins".to_string())); } }, - } + ); } pub fn id(&self) -> String { @@ -268,36 +268,33 @@ impl AssetData { pub fn release(&self) -> Option> { let self_ = self.imp(); - match &*self_.asset.borrow() { - Some(a) => match a.latest_release() { + (*self_.asset.borrow()) + .as_ref() + .and_then(|a| match a.latest_release() { None => a.last_modified_date, Some(ri) => ri.date_added, - }, - None => None, - } + }) } pub fn kind(&self) -> Option { let self_ = self.imp(); - match &*self_.kind.borrow() { - Some(a) => match a.as_str() { + (*self_.kind.borrow()) + .as_ref() + .and_then(|a| match a.as_str() { "asset" => Some(AssetType::Asset), "games" => Some(AssetType::Game), "plugins" => Some(AssetType::Plugin), "projects" => Some(AssetType::Project), "engines" => Some(AssetType::Engine), _ => None, - }, - None => None, - } + }) } pub fn last_modified(&self) -> Option> { let self_ = self.imp(); - match &*self_.asset.borrow() { - Some(a) => a.last_modified_date, - None => None, - } + (*self_.asset.borrow()) + .as_ref() + .and_then(|a| a.last_modified_date) } pub fn image(&self) -> Option { @@ -338,26 +335,23 @@ impl AssetData { self.has_category(c) }; - match cat.chars().nth(c.len()) { - None => result, - Some(operator) => { - let remainder: String = cat.chars().into_iter().skip(c.len() + 1).collect(); - match operator { - '&' => { - if result { - self.check_category(&remainder) - } else { - result - } - } - '|' => result || self.check_category(&remainder), - _ => { - error!("Unimplemented operator"); - false + cat.chars().nth(c.len()).map_or(result, |operator| { + let remainder: String = cat.chars().skip(c.len() + 1).collect(); + match operator { + '&' => { + if result { + self.check_category(&remainder) + } else { + result } } + '|' => result || self.check_category(&remainder), + _ => { + error!("Unimplemented operator"); + false + } } - } + }) }) } diff --git a/src/models/database.rs b/src/models/database.rs index 3f7367c..bd5aa2e 100644 --- a/src/models/database.rs +++ b/src/models/database.rs @@ -28,10 +28,10 @@ fn run_migration_on( fn init_pool() -> Result> { let db_path = &DB_PATH; - fs::create_dir_all(&db_path.to_str().unwrap())?; + fs::create_dir_all(db_path.to_str().unwrap())?; let db_path = db_path.join("eam.db"); if !db_path.exists() { - File::create(&db_path.to_str().unwrap())?; + File::create(db_path.to_str().unwrap())?; } let manager = ConnectionManager::::new(db_path.to_str().unwrap()); let pool = r2d2::Pool::builder().build(manager)?; diff --git a/src/models/engine_data.rs b/src/models/engine_data.rs index 9248435..f7bdb4f 100644 --- a/src/models/engine_data.rs +++ b/src/models/engine_data.rs @@ -260,7 +260,7 @@ impl EngineData { if let Some(path) = data.path() { let sender = self_.sender.clone(); thread::spawn(move || { - Self::needs_repo_update(&path, Some(sender)); + Self::needs_repo_update(&path, &Some(sender)); }); } data @@ -305,7 +305,8 @@ impl EngineData { self.emit_by_name::<()>("finished", &[]); } - fn needs_repo_update(_path: &str, _sender: Option>) -> bool { + #[allow(clippy::missing_const_for_fn)] + fn needs_repo_update(_path: &str, _sender: &Option>) -> bool { // #[cfg(target_os = "linux")] // This is disabled due to issues with git2 crate and constant need to rebuild if git lib gets updated // { @@ -394,10 +395,7 @@ impl EngineData { } pub fn valid(&self) -> bool { - match self.ueversion() { - None => false, - Some(v) => v.valid(), - } + self.ueversion().map_or(false, |v| v.valid()) } pub fn version(&self) -> Option { diff --git a/src/models/mod.rs b/src/models/mod.rs index 344498b..7e58d4e 100644 --- a/src/models/mod.rs +++ b/src/models/mod.rs @@ -13,6 +13,7 @@ use gtk4::glib::{MainContext, Receiver, Sender, UserDirectory, PRIORITY_DEFAULT} use gtk4::prelude::*; use log::{debug, error, info, warn}; use std::cell::RefCell; +use std::collections::HashMap; use std::thread; #[cfg(target_os = "linux")] @@ -175,21 +176,17 @@ impl Model { Some(ss) => { match ss.get_any_collection() { Ok(collection) => { - match collection.search_items( - [("application", crate::config::APP_ID)] - .iter() - .copied() - .collect(), - ) { + match collection.search_items(HashMap::from([( + "application", + crate::config::APP_ID, + )])) { Ok(items) => { let mut ud = egs_api::api::types::account::UserData::new(); for item in items { - let label = if let Ok(l) = item.get_label() { - l - } else { - debug!("No label skipping"); - continue; - }; + let Ok(label) = item.get_label() else { + debug!("No label skipping"); + continue; + }; debug!("Loading: {}", label); if let Ok(attributes) = item.get_attributes() { match label.as_str() { @@ -323,9 +320,7 @@ impl Model { item: &str, ) -> Option<(String, chrono::DateTime)> { let exp = match chrono::DateTime::parse_from_rfc3339( - self.settings - .string(&format!("{}-expiration", item)) - .as_str(), + self.settings.string(&format!("{item}-expiration")).as_str(), ) { Ok(d) => d.with_timezone(&chrono::Utc), Err(e) => { diff --git a/src/tools/asset_info.rs b/src/tools/asset_info.rs index 059fce3..228d55b 100644 --- a/src/tools/asset_info.rs +++ b/src/tools/asset_info.rs @@ -39,18 +39,14 @@ impl Search for AssetInfo { } } } - match search { - None => tag_found, - Some(f) => { - if tag_found { - match &self.title { - None => true, - Some(title) => title.to_lowercase().contains(&f.to_lowercase()), - } - } else { - false - } + search.map_or(tag_found, |f| { + if tag_found { + self.title.as_ref().map_or(true, |title| { + title.to_lowercase().contains(&f.to_lowercase()) + }) + } else { + false } - } + }) } } diff --git a/src/tools/epic_web.rs b/src/tools/epic_web.rs index e057523..730b9d2 100644 --- a/src/tools/epic_web.rs +++ b/src/tools/epic_web.rs @@ -127,8 +127,7 @@ impl EpicWeb { if let Err(e) = self .client .get(format!( - "https://www.unrealengine.com/id/api/set-sid?sid={}", - sid + "https://www.unrealengine.com/id/api/set-sid?sid={sid}" )) .send() { @@ -151,28 +150,25 @@ impl EpicWeb { } Ok(r) => { match r.text() { - Ok(t) => match serde_json::from_str::(&t) { - Ok(eula) => { - return match eula.data.eula.has_account_accepted { - None => { - match eula.errors { - None => {} - Some(errors) => { - for error in errors { - error!("Failed to query EULA status: {} with response: {}", error.message, error.service_response); - } - } + Ok(t) => { + match serde_json::from_str::(&t) { + Ok(eula) => { + return match eula.data.eula.has_account_accepted { + None => { + eula.errors.map_or((), |errors| for error in errors { + error!("Failed to query EULA status: {} with response: {}", error.message, error.service_response); + }); + false } - false - } - Some(accepted) => accepted.accepted, - }; + Some(accepted) => accepted.accepted, + }; + } + Err(e) => { + error!("Failed to parse EULA json: {}", e); + debug!("Response: {}", t); + } } - Err(e) => { - error!("Failed to parse EULA json: {}", e); - debug!("Response: {}", t); - } - }, + } Err(e) => { error!("Failed to read EULA text: {}", e); } diff --git a/src/ui/authentication.rs b/src/ui/authentication.rs index 08eec82..db37080 100644 --- a/src/ui/authentication.rs +++ b/src/ui/authentication.rs @@ -40,12 +40,8 @@ impl EpicAssetManagerWindow { pub fn token_time(&self, key: &str) -> Option> { let self_: &crate::window::imp::EpicAssetManagerWindow = self.imp(); - match chrono::DateTime::parse_from_rfc3339( - self_.model.borrow().settings.string(key).as_str(), - ) { - Ok(d) => Some(d.with_timezone(&chrono::Utc)), - Err(_) => None, - } + chrono::DateTime::parse_from_rfc3339(self_.model.borrow().settings.string(key).as_str()) + .map_or(None, |d| Some(d.with_timezone(&chrono::Utc))) } pub fn can_relogin(&self) -> bool { diff --git a/src/ui/widgets/download_manager/asset.rs b/src/ui/widgets/download_manager/asset.rs index 78d1509..2da1b61 100644 --- a/src/ui/widgets/download_manager/asset.rs +++ b/src/ui/widgets/download_manager/asset.rs @@ -274,10 +274,7 @@ impl Asset for super::EpicDownloadManager { dm: &[egs_api::api::types::download_manifest::DownloadManifest], ) { let self_ = self.imp(); - let item = match self.get_item(id) { - None => return, - Some(i) => i, - }; + let Some(item) = self.get_item(id) else { return }; if dm.is_empty() { item.set_property("status", "Failed to get download manifests".to_string()); return; @@ -369,21 +366,20 @@ impl Asset for super::EpicDownloadManager { manifest: egs_api::api::types::download_manifest::FileManifestList, ) { let self_ = self.imp(); - let _item = match self.get_item(&id) { - None => return, - Some(i) => i, - }; + let Some(_item) = self.get_item(&id) else { return }; let vaults = self_.settings.strv("unreal-vault-directories"); - let mut target = std::path::PathBuf::from(match vaults.first() { - None => self_ - .settings - .string("temporary-download-directory") - .to_string(), - Some(v) => v.to_string(), - }); + let mut target = std::path::PathBuf::from(vaults.first().map_or_else( + || { + self_ + .settings + .string("temporary-download-directory") + .to_string() + }, + std::string::ToString::to_string, + )); target.push(release.clone()); target.push("temp"); - let full_filename = format!("{}/{}/{}", id, release, filename); + let full_filename = format!("{id}/{release}/{filename}"); self_.downloaded_files.borrow_mut().insert( full_filename.clone(), DownloadedFile { @@ -402,7 +398,7 @@ impl Asset for super::EpicDownloadManager { .asset_guids .borrow_mut() .entry(id.clone()) - .or_insert(vec![]) + .or_default() .push(chunk.guid.clone()); let mut chunks = self_.downloaded_chunks.borrow_mut(); match chunks.get_mut(&chunk.guid) { @@ -410,7 +406,7 @@ impl Asset for super::EpicDownloadManager { chunks.insert(chunk.guid.clone(), vec![full_filename.clone()]); let mut p = target.clone(); let g = chunk.guid.clone(); - p.push(format!("{}.chunk", g)); + p.push(format!("{g}.chunk")); sender .send(super::Msg::RedownloadChunk( reqwest::Url::parse("unix:/").unwrap(), @@ -604,12 +600,9 @@ impl Asset for super::EpicDownloadManager { if let Some(files) = chunks.get(guid) { for file in files { if let Some(f) = self_.downloaded_files.borrow_mut().get_mut(file) { - let item = match self.get_item(&f.asset) { - None => { - break; - } - Some(i) => i, - }; + let Some(item) = self.get_item(&f.asset) else { + break; + }; item.add_downloaded_size(progress); self.emit_by_name::<()>("tick", &[]); break; @@ -634,12 +627,7 @@ impl Asset for super::EpicDownloadManager { filename: String, ) { let self_ = self.imp(); - let item = match self.get_item(&asset_id) { - None => { - return; - } - Some(i) => i, - }; + let Some(item) = self.get_item(&asset_id) else { return; }; let mut targets: Vec<(String, bool)> = Vec::new(); { @@ -673,7 +661,7 @@ impl Asset for super::EpicDownloadManager { } if let Some(item) = self.get_item(&asset) { item.set_property("status", "Paused".to_string()); - item.set_property("speed", "".to_string()); + item.set_property("speed", String::new()); } } @@ -707,7 +695,7 @@ impl Asset for super::EpicDownloadManager { .paused_asset_chunks .borrow_mut() .entry(guid) - .or_insert(vec![]) + .or_default() .push((url, path)); } @@ -736,7 +724,7 @@ impl Asset for super::EpicDownloadManager { if let Some(guids) = self_.asset_guids.borrow_mut().remove(&asset) { if let Some(item) = self.get_item(&asset) { item.set_property("status", "Canceled".to_string()); - item.set_property("speed", "".to_string()); + item.set_property("speed", String::new()); if let Some(v) = item.version() { self_.download_items.borrow_mut().remove(&v); } @@ -876,10 +864,8 @@ fn initiate_file_download( } } let hash = hasher.finalize(); - if m.file_hash.eq(&hash - .iter() - .map(|b| format!("{:02x}", b)) - .collect::()) + if m.file_hash + .eq(&hash.iter().map(|b| format!("{b:02x}")).collect::()) { sender .send(super::Msg::FileAlreadyDownloaded( @@ -963,20 +949,21 @@ impl AssetPriv for super::EpicDownloadManager { ) { let self_ = self.imp(); let vaults = self_.settings.strv("unreal-vault-directories"); - let temp_dir = std::path::PathBuf::from(match vaults.first() { - None => self_ - .settings - .string("temporary-download-directory") - .to_string(), - Some(v) => v.to_string(), - }); + let temp_dir = std::path::PathBuf::from(vaults.first().map_or_else( + || { + self_ + .settings + .string("temporary-download-directory") + .to_string() + }, + std::string::ToString::to_string, + )); let mut targets: Vec<(String, bool)> = Vec::new(); let mut to_vault = true; { - let actions = match self.get_item(&f.asset) { - None => vec![], - Some(i) => i.actions(), - }; + let actions = self + .get_item(&f.asset) + .map_or_else(Vec::new, |i| i.actions()); for act in actions { match act { @@ -1025,10 +1012,9 @@ impl AssetPriv for super::EpicDownloadManager { Ok(mut target) => { let hash = extract_chunks(finished.chunks, &temp.clone(), &mut target).finalize(); - if finished.hash.eq(&hash - .iter() - .map(|b| format!("{:02x}", b)) - .collect::()) + if finished + .hash + .eq(&hash.iter().map(|b| format!("{b:02x}")).collect::()) { copy_files(&vault.clone(), targets, &finished.name); sender @@ -1098,14 +1084,14 @@ fn copy_files(from: &Path, targets: Vec<(String, bool)>, filename: &str) { continue; } if tar.exists() { - let ext = match tar.extension() { - None => OsString::from_str(".bak").unwrap(), - Some(ext) => { + let ext = tar.extension().map_or_else( + || OsString::from_str(".bak").unwrap(), + |ext| { let mut new = ext.to_os_string(); new.push(".bak"); new - } - }; + }, + ); let mut bak = tar.clone(); bak.set_extension(ext); if let Err(err) = std::fs::rename(&tar, bak) { diff --git a/src/ui/widgets/download_manager/docker.rs b/src/ui/widgets/download_manager/docker.rs index 1790e89..1db426b 100644 --- a/src/ui/widgets/download_manager/docker.rs +++ b/src/ui/widgets/download_manager/docker.rs @@ -77,12 +77,9 @@ impl Docker for crate::ui::widgets::download_manager::EpicDownloadManager { #[cfg(target_os = "linux")] fn perform_docker_blob_downloads(&self, version: &str, size: u64, digests: Vec<(String, u64)>) { let self_ = self.imp(); - let item = match self.get_item(version) { - None => { - return; - } - Some(i) => i, - }; + let Some(item) = self.get_item(version) else { + return; + }; item.set_property("status", "waiting for download slot".to_string()); item.set_total_size(u128::from(size)); item.set_total_files(digests.len() as u64); @@ -117,10 +114,7 @@ impl Docker for crate::ui::widgets::download_manager::EpicDownloadManager { let client = dclient.clone(); let sender = self_.sender.clone(); let pool = self_.download_pool.clone(); - let target = match self.docker_target_directory() { - None => return, - Some(t) => t, - }; + let Some(target) = self.docker_target_directory() else { return }; debug!("Going to download to {:?}", target); let (send, recv) = std::sync::mpsc::channel::(); self.add_thread_sender(ver.clone(), send); @@ -179,10 +173,7 @@ impl Docker for crate::ui::widgets::download_manager::EpicDownloadManager { } #[cfg(target_os = "linux")] fn cancel_docker_digest(&self, _version: &str, digest: (String, u64)) { - let mut target = match self.docker_target_directory() { - None => return, - Some(t) => t, - }; + let Some(mut target) = self.docker_target_directory() else { return }; target.push(digest.0); if let Err(e) = std::fs::remove_file(target) { warn!("Unable to remove docker file {:?}", e); @@ -196,7 +187,7 @@ impl Docker for crate::ui::widgets::download_manager::EpicDownloadManager { .paused_docker_digests .borrow_mut() .entry(version) - .or_insert(vec![]) + .or_default() .push(digest); } @@ -300,12 +291,9 @@ impl Docker for crate::ui::widgets::download_manager::EpicDownloadManager { #[cfg(target_os = "linux")] fn docker_download_progress(&self, version: &str, progress: u64) { - let item = match self.get_item(version) { - None => { - return; - } - Some(i) => i, - }; + let Some(item) = self.get_item(version) else { + return; + }; item.add_downloaded_size(u128::from(progress)); self.emit_by_name::<()>("tick", &[]); @@ -329,10 +317,7 @@ impl Docker for crate::ui::widgets::download_manager::EpicDownloadManager { let self_ = self.imp(); if let Some(digests) = self_.docker_digests.borrow_mut().get_mut(version) { let mut to_extract: Vec = Vec::new(); - let target = match self.docker_target_directory() { - None => return, - Some(t) => t, - }; + let Some(target) = self.docker_target_directory() else { return }; for d in digests { match d.1 { DownloadStatus::Init => { @@ -353,14 +338,18 @@ impl Docker for crate::ui::widgets::download_manager::EpicDownloadManager { }; } if !to_extract.is_empty() { - let path = match self_.settings.strv("unreal-engine-directories").get(0) { - None => PathBuf::from(&version), - Some(p) => { - let mut path = PathBuf::from(p); - path.push(&version); - path - } - }; + let path = self_ + .settings + .strv("unreal-engine-directories") + .get(0) + .map_or_else( + || PathBuf::from(&version), + |p| { + let mut path = PathBuf::from(p); + path.push(version); + path + }, + ); if let Err(e) = std::fs::create_dir_all(&path) { warn!("Unable to create target directory: {}", e); }; @@ -396,16 +385,10 @@ impl Docker for crate::ui::widgets::download_manager::EpicDownloadManager { fn docker_extraction_finished(&self, version: &str) { let self_ = self.imp(); if let Some(digests) = self_.docker_digests.borrow_mut().get_mut(version) { - let item = match self.get_item(version) { - None => { - return; - } - Some(i) => i, - }; - let target = match self.docker_target_directory() { - None => return, - Some(t) => t, - }; + let Some(item) = self.get_item(version) else { + return; + }; + let Some(target) = self.docker_target_directory() else { return }; let mut remaining = 0; for d in digests { match d.1 { @@ -450,7 +433,7 @@ impl Docker for crate::ui::widgets::download_manager::EpicDownloadManager { if let Some(item) = self.get_item(&version) { self.send_to_thread_sender(&version.clone(), &ThreadMessages::Cancel); item.set_property("status", "Canceled".to_string()); - item.set_property("speed", "".to_string()); + item.set_property("speed", String::new()); if let Some(v) = item.version() { self_.download_items.borrow_mut().remove(&v); } @@ -475,7 +458,7 @@ impl Docker for crate::ui::widgets::download_manager::EpicDownloadManager { if let Some(item) = self.get_item(&version) { self.send_to_thread_sender(&version, &ThreadMessages::Pause); item.set_property("status", "Paused".to_string()); - item.set_property("speed", "".to_string()); + item.set_property("speed", String::new()); } } diff --git a/src/ui/widgets/download_manager/download_item.rs b/src/ui/widgets/download_manager/download_item.rs index 015b739..5b5064d 100644 --- a/src/ui/widgets/download_manager/download_item.rs +++ b/src/ui/widgets/download_manager/download_item.rs @@ -221,7 +221,7 @@ pub mod imp { let label = value .get::>() .expect("type conformity checked by `Object::set_property`") - .map(|l| format!("{}", l)); + .map(|l| format!("{l}")); self.label.replace(label); } @@ -247,7 +247,7 @@ pub mod imp { let status = value .get::>() .expect("type conformity checked by `Object::set_property`") - .map(|l| format!("{}", l)); + .map(|l| format!("{l}")); self.stack.set_visible_child_name("label"); self.status.replace(status); } @@ -614,7 +614,7 @@ impl EpicDownloadItem { let total = *self_.total_files.borrow(); self_ .extraction_progress - .set_tooltip_text(Some(&format!("{}/{}", new_count, total))); + .set_tooltip_text(Some(&format!("{new_count}/{total}"))); self_ .extraction_progress .set_fraction(new_count as f64 / total as f64); diff --git a/src/ui/widgets/download_manager/epic_file.rs b/src/ui/widgets/download_manager/epic_file.rs index ee09bb5..1d0b53f 100644 --- a/src/ui/widgets/download_manager/epic_file.rs +++ b/src/ui/widgets/download_manager/epic_file.rs @@ -73,11 +73,8 @@ pub trait EpicFile { impl EpicFile for crate::ui::widgets::download_manager::EpicDownloadManager { fn perform_file_download(&self, url: &str, size: u64, version: &str) { let self_ = self.imp(); - let item = match self.get_item(version) { - None => { - return; - } - Some(i) => i, + let Some(item) = self.get_item(version) else { + return; }; item.set_property("status", "waiting for download slot".to_string()); item.set_total_size(u128::from(size)); @@ -142,23 +139,16 @@ impl EpicFile for crate::ui::widgets::download_manager::EpicDownloadManager { for cap in re.captures_iter(version) { item.set_property( "label", - match cap.get(2) { - None => cap[1].to_string(), - Some(suffix) => { + cap.get(2).map_or_else( + || cap[1].to_string(), + |suffix| { format!( "{} ({})", - match cap.get(1) { - None => { - "" - } - Some(v) => { - v.as_str() - } - }, + cap.get(1).map_or("", |v| v.as_str()), suffix.as_str() ) - } - }, + }, + ), ); } item.set_property("status", "initializing...".to_string()); @@ -237,11 +227,8 @@ impl EpicFile for crate::ui::widgets::download_manager::EpicDownloadManager { } fn epic_download_progress(&self, version: &str, progress: u64) { - let item = match self.get_item(version) { - None => { - return; - } - Some(i) => i, + let Some(item) = self.get_item(version) else { + return; }; item.add_downloaded_size(u128::from(progress)); @@ -253,7 +240,7 @@ impl EpicFile for crate::ui::widgets::download_manager::EpicDownloadManager { if let Some(item) = self.get_item(&version) { self.send_to_thread_sender(&version.clone(), &ThreadMessages::Cancel); item.set_property("status", "Canceled".to_string()); - item.set_property("speed", "".to_string()); + item.set_property("speed", String::new()); if let Some(v) = item.version() { self_.download_items.borrow_mut().remove(&v); } @@ -274,7 +261,7 @@ impl EpicFile for crate::ui::widgets::download_manager::EpicDownloadManager { if let Some(item) = self.get_item(&version) { self.send_to_thread_sender(&version, &ThreadMessages::Pause); item.set_property("status", "Paused".to_string()); - item.set_property("speed", "".to_string()); + item.set_property("speed", String::new()); } } @@ -307,7 +294,7 @@ impl EpicFile for crate::ui::widgets::download_manager::EpicDownloadManager { } if p.exists() { if let Some(item) = self.get_item(version) { - let metadata = std::fs::metadata(&p.as_path()).expect("unable to read metadata"); + let metadata = std::fs::metadata(p.as_path()).expect("unable to read metadata"); item.add_downloaded_size(item.total_size() - item.downloaded_size()); if u128::from(metadata.size()) == item.total_size() { let file = fs::File::open(&p).unwrap(); @@ -358,7 +345,7 @@ fn extract( file_target.push(&outpath); if file_target.exists() { let metadata = - std::fs::metadata(&file_target.as_path()).expect("unable to read metadata"); + std::fs::metadata(file_target.as_path()).expect("unable to read metadata"); if metadata.size() == file.size() { sender.send(Msg::EpicFileExtracted(ver.clone())).unwrap(); continue; @@ -369,7 +356,7 @@ fn extract( } else { if let Some(p) = file_target.parent() { if !p.exists() { - fs::create_dir_all(&p).unwrap(); + fs::create_dir_all(p).unwrap(); } } let mut outfile = fs::File::create(&file_target).unwrap(); @@ -450,11 +437,11 @@ fn run( ); fs::create_dir_all(p.parent().unwrap()).unwrap(); let mut client = if p.exists() { - let metadata = std::fs::metadata(&p.as_path()).expect("unable to read metadata"); + let metadata = std::fs::metadata(p.as_path()).expect("unable to read metadata"); if metadata.size() == size { debug!("Already downloaded {}", p.to_str().unwrap_or_default()); sender - .send(super::Msg::EpicDownloadProgress(ver.clone(), size as u64)) + .send(super::Msg::EpicDownloadProgress(ver.clone(), size)) .unwrap(); sender.send(Msg::EpicFileFinished(ver)).unwrap(); return; diff --git a/src/ui/widgets/download_manager/mod.rs b/src/ui/widgets/download_manager/mod.rs index 55bb6c6..772f86d 100644 --- a/src/ui/widgets/download_manager/mod.rs +++ b/src/ui/widgets/download_manager/mod.rs @@ -271,10 +271,7 @@ impl EpicDownloadManager { let self_ = self.imp(); match msg { Msg::ProcessItemThumbnail(id, image) => { - let item = match self.get_item(&id) { - None => return, - Some(i) => i, - }; + let Some(item) = self.get_item(&id) else { return }; item.set_property("thumbnail", Some(image)); } Msg::StartAssetDownload(id, manifest) => { @@ -299,12 +296,7 @@ impl EpicDownloadManager { self.file_already_extracted(id, progress, fullname, filename); } Msg::FileExtracted(id) => { - let item = match self.get_item(&id) { - None => { - return; - } - Some(i) => i, - }; + let Some(item) = self.get_item(&id) else { return }; item.file_processed(); self.emit_by_name::<()>("tick", &[]); } @@ -328,7 +320,7 @@ impl EpicDownloadManager { if let Some(w) = self_.window.get() { w.add_notification( "iodownloaderror", - &format!("Unable to download file: {}", e), + &format!("Unable to download file: {e}"), gtk4::MessageType::Error, ); } @@ -409,13 +401,15 @@ impl EpicDownloadManager { info!("File finished: {}", file); self_.downloaded_files.borrow_mut().remove(file); let vaults = self_.settings.strv("unreal-vault-directories"); - let temp_dir = std::path::PathBuf::from(match vaults.first() { - None => self_ - .settings - .string("temporary-download-directory") - .to_string(), - Some(v) => v.to_string(), - }); + let temp_dir = std::path::PathBuf::from(vaults.first().map_or_else( + || { + self_ + .settings + .string("temporary-download-directory") + .to_string() + }, + std::string::ToString::to_string, + )); for chunk in file_details.finished_chunks { if let Some(ch) = self_.downloaded_chunks.borrow_mut().get_mut(&chunk.guid) { ch.retain(|x| !x.eq(file)); @@ -480,7 +474,7 @@ impl EpicDownloadManager { } if let Ok(response) = reqwest::blocking::get(image.url.clone()) { if let Ok(b) = response.bytes() { - std::fs::create_dir_all(&cache_path.parent().unwrap()).unwrap(); + std::fs::create_dir_all(cache_path.parent().unwrap()).unwrap(); //TODO: Report downloaded size match File::create(cache_path.as_path()) { Ok(mut thumbnail) => { @@ -504,7 +498,7 @@ impl EpicDownloadManager { .thread_senders .borrow_mut() .entry(key) - .or_insert(vec![]) + .or_default() .push(sender); } @@ -543,7 +537,7 @@ impl EpicDownloadManager { debug!("Downloading image"); if let Ok(response) = reqwest::blocking::get(image.url.clone()) { if let Ok(b) = response.bytes() { - std::fs::create_dir_all(&cache_path.parent().unwrap()).unwrap(); + std::fs::create_dir_all(cache_path.parent().unwrap()).unwrap(); //TODO: Report downloaded size match File::create(cache_path.as_path()) { Ok(mut thumbnail) => { diff --git a/src/ui/widgets/logged_in/engines/docker_download.rs b/src/ui/widgets/logged_in/engines/docker_download.rs index 29e6d94..c405523 100644 --- a/src/ui/widgets/logged_in/engines/docker_download.rs +++ b/src/ui/widgets/logged_in/engines/docker_download.rs @@ -291,6 +291,7 @@ impl DockerEngineDownload { for tag in tags { if re.is_match(&tag) { for cap in re.captures_iter(&tag) { + #[allow(clippy::option_if_let_else)] match result.get_mut(&cap[1]) { None => { result.insert( @@ -307,12 +308,9 @@ impl DockerEngineDownload { } } Err(e) => { - error!("Failed to get tags: {:?}", e); + error!("Failed to get tags: {e:?}"); sender - .send(Msg::Error(format!( - "Failed to get tags: {:?}", - e - ))) + .send(Msg::Error(format!("Failed to get tags: {e:?}"))) .unwrap(); } } @@ -389,15 +387,12 @@ impl DockerEngineDownload { }), ); - let mut version: Vec<&String> = versions.keys().into_iter().collect(); - version.sort_by(|a, b| match version_compare::compare(b, a) { - Ok(cmp) => match cmp { - Cmp::Eq | Cmp::Le | Cmp::Ge => std::cmp::Ordering::Equal, - Cmp::Ne | Cmp::Lt => std::cmp::Ordering::Less, - Cmp::Gt => std::cmp::Ordering::Greater, - }, - Err(_) => std::cmp::Ordering::Equal, - }); + let mut version: Vec<&String> = versions.keys().collect(); + version.sort_by(|a, b| version_compare::compare(b, a).map_or(std::cmp::Ordering::Equal, |cmp| match cmp { + Cmp::Eq | Cmp::Le | Cmp::Ge => std::cmp::Ordering::Equal, + Cmp::Ne | Cmp::Lt => std::cmp::Ordering::Less, + Cmp::Gt => std::cmp::Ordering::Greater, + })); for ver in version { combo.append(Some(ver), ver); @@ -468,34 +463,29 @@ impl DockerEngineDownload { Msg::ManifestSize(size) => { let byte = byte_unit::Byte::from_bytes(u128::from(size)).get_appropriate_unit(false); - match self_.settings.strv("unreal-engine-directories").get(0) { - None => { - if let Some(w) = self_.window.get() { - w.add_notification("missing engine config", "Unable to install engine missing Unreal Engine Directories configuration", gtk4::MessageType::Error); - get_action!(self_.actions, @install).set_enabled(false); - } - } - Some(p) => { - let mut path = std::path::Path::new(p); - while !path.exists() { - path = match path.parent() { - None => break, - Some(p) => p, - } - } - if fs2::available_space(path).unwrap_or_default() < size { - if let Some(w) = self_.window.get() { - w.add_notification("no space left on device engine", "Not enough space left in the Engine directory for install, please choose a different one.", gtk4::MessageType::Error); - } - get_action!(self_.actions, @install).set_enabled(false); - } else { - if let Some(w) = self_.window.get() { - w.clear_notification("no space left on device engine"); - } - get_action!(self_.actions, @install).set_enabled(true); - } - } - }; + self_.settings.strv("unreal-engine-directories").get(0).map_or_else(|| if let Some(w) = self_.window.get() { + w.add_notification("missing engine config", "Unable to install engine missing Unreal Engine Directories configuration", gtk4::MessageType::Error); + get_action!(self_.actions, @install).set_enabled(false); + }, |p| { + let mut path = std::path::Path::new(p); + while !path.exists() { + path = match path.parent() { + None => break, + Some(p) => p, + } + } + if fs2::available_space(path).unwrap_or_default() < size { + if let Some(w) = self_.window.get() { + w.add_notification("no space left on device engine", "Not enough space left in the Engine directory for install, please choose a different one.", gtk4::MessageType::Error); + } + get_action!(self_.actions, @install).set_enabled(false); + } else { + if let Some(w) = self_.window.get() { + w.clear_notification("no space left on device engine"); + } + get_action!(self_.actions, @install).set_enabled(true); + } + }); self.set_property("download-size", Some(byte.format(1))); } Msg::Error(_error) => { diff --git a/src/ui/widgets/logged_in/engines/engine.rs b/src/ui/widgets/logged_in/engines/engine.rs index 4c84779..40edfdb 100644 --- a/src/ui/widgets/logged_in/engines/engine.rs +++ b/src/ui/widgets/logged_in/engines/engine.rs @@ -113,7 +113,7 @@ pub mod imp { let version = value .get::>() .expect("type conformity checked by `Object::set_property`") - .map(|l| format!("{}", l)); + .map(|l| format!("{l}")); self.version.replace(version); } "path" => { @@ -124,7 +124,7 @@ pub mod imp { let branch = value .get::>() .expect("type conformity checked by `Object::set_property`") - .map(|l| format!("Branch: {}", l)); + .map(|l| format!("Branch: {l}")); self.branch.replace(branch); } "has-branch" => { diff --git a/src/ui/widgets/logged_in/engines/engine_detail.rs b/src/ui/widgets/logged_in/engines/engine_detail.rs index 0339ce5..236a934 100644 --- a/src/ui/widgets/logged_in/engines/engine_detail.rs +++ b/src/ui/widgets/logged_in/engines/engine_detail.rs @@ -181,27 +181,22 @@ impl EpicEngineDetails { fn launch_engine(&self) { let path = self.path(); if let Some(path) = path { - match Self::get_engine_binary_path(&path) { - None => { - warn!("No path"); - } - Some(p) => { - let context = gtk4::gio::AppLaunchContext::new(); - context.setenv("GLIBC_TUNABLES", "glibc.rtld.dynamic_sort=2"); - let app = gtk4::gio::AppInfo::create_from_commandline( - if ashpd::is_sandboxed() { - format!("flatpak-spawn --env='GLIBC_TUNABLES=glibc.rtld.dynamic_sort=2' --host \"{}\"", p.to_str().unwrap()) - } else { - format!("\"{}\"", p.to_str().unwrap()) - }, - Some("Unreal Engine"), - gtk4::gio::AppInfoCreateFlags::NONE, - ) - .unwrap(); - app.launch(&[], Some(&context)) - .expect("Failed to launch application"); - } - } + Self::get_engine_binary_path(&path).map_or_else(|| { + warn!("No path"); + }, |p| { + let context = gtk4::gio::AppLaunchContext::new(); + context.setenv("GLIBC_TUNABLES", "glibc.rtld.dynamic_sort=2"); + let app = gtk4::gio::AppInfo::create_from_commandline( + if ashpd::is_sandboxed() { + format!("flatpak-spawn --env='GLIBC_TUNABLES=glibc.rtld.dynamic_sort=2' --host \"{}\"", p.to_str().unwrap()) + } else { + format!("\"{}\"", p.to_str().unwrap()) + }, + Some("Unreal Engine"), + gtk4::gio::AppInfoCreateFlags::NONE, + ).unwrap(); + app.launch(&[], Some(&context)).expect("Failed to launch application"); + }); }; self.show_confirmation("Engine Launched"); } @@ -293,7 +288,7 @@ impl EpicEngineDetails { { let ctx = glib::MainContext::default(); ctx.spawn_local(async move { - crate::tools::open_directory(&format!("{}/Engine", p)).await; + crate::tools::open_directory(&format!("{p}/Engine")).await; }); }; } diff --git a/src/ui/widgets/logged_in/engines/engines_side.rs b/src/ui/widgets/logged_in/engines/engines_side.rs index 95da94c..21a6f3c 100644 --- a/src/ui/widgets/logged_in/engines/engines_side.rs +++ b/src/ui/widgets/logged_in/engines/engines_side.rs @@ -206,7 +206,7 @@ impl EpicEnginesSide { pub fn set_data(&self, data: &crate::models::engine_data::EngineData) { let self_ = self.imp(); if let Some(title) = &data.version() { - self.set_property("title", &format!("{}", title)); + self.set_property("title", &format!("{title}")); } self_.details.set_data(data); self_.stack.set_visible_child_name("details"); diff --git a/src/ui/widgets/logged_in/engines/epic_download.rs b/src/ui/widgets/logged_in/engines/epic_download.rs index 26b4d34..651e307 100644 --- a/src/ui/widgets/logged_in/engines/epic_download.rs +++ b/src/ui/widgets/logged_in/engines/epic_download.rs @@ -329,37 +329,32 @@ impl EpicEngineDownload { if re.is_match(&version.name) { for cap in re.captures_iter(&version.name) { result.insert( - match cap.get(2) { - None => cap[1].to_string(), - Some(suffix) => { + cap.get(2).map_or_else( + || cap[1].to_string(), + |suffix| { format!( "{} ({})", - match cap.get(1) { - None => { - "" - } - Some(v) => { - v.as_str() - } - }, + cap.get(1).map_or("", |v| v.as_str()), suffix.as_str() ) - } - }, + }, + ), version.clone(), ); } } } self_.engine_versions.replace(Some(result.clone())); - let mut version: Vec<&String> = result.keys().into_iter().collect(); - version.sort_by(|a, b| match version_compare::compare(b, a) { - Ok(cmp) => match cmp { - Cmp::Eq | Cmp::Le | Cmp::Ge => std::cmp::Ordering::Equal, - Cmp::Ne | Cmp::Lt => std::cmp::Ordering::Less, - Cmp::Gt => std::cmp::Ordering::Greater, - }, - Err(_) => std::cmp::Ordering::Equal, + let mut version: Vec<&String> = result.keys().collect(); + version.sort_by(|a, b| { + version_compare::compare(b, a).map_or( + std::cmp::Ordering::Equal, + |cmp| match cmp { + Cmp::Eq | Cmp::Le | Cmp::Ge => std::cmp::Ordering::Equal, + Cmp::Ne | Cmp::Lt => std::cmp::Ordering::Less, + Cmp::Gt => std::cmp::Ordering::Greater, + }, + ) }); for ver in version { @@ -379,12 +374,9 @@ impl EpicEngineDownload { let win_ = window.imp(); let mut eg = win_.model.borrow().epic_games.borrow().clone(); let sender = self_.sender.clone(); - let id = match eg.user_details().account_id { - None => { - sender.send(Msg::EULAValid(false)).unwrap(); - return; - } - Some(i) => i, + let Some(id) = eg.user_details().account_id else { + sender.send(Msg::EULAValid(false)).unwrap(); + return; }; thread::spawn(move || { if let Some(token) = tokio::runtime::Runtime::new() @@ -424,8 +416,8 @@ impl EpicEngineDownload { fn open_browser(code: &str) { #[cfg(target_os = "linux")] - if gio::AppInfo::launch_default_for_uri(&format!("https://www.epicgames.com/id/exchange?exchangeCode={}&redirectUrl=https%3A%2F%2Fwww.unrealengine.com%2Feulacheck%2Funreal", code), None::<&gio::AppLaunchContext>).is_err() { - error!("Please go to https://www.epicgames.com/id/exchange?exchangeCode={}&redirectUrl=https%3A%2F%2Fwww.unrealengine.com%2Feulacheck%2Funreal", code); + if gio::AppInfo::launch_default_for_uri(&format!("https://www.epicgames.com/id/exchange?exchangeCode={code}&redirectUrl=https%3A%2F%2Fwww.unrealengine.com%2Feulacheck%2Funreal"), None::<&gio::AppLaunchContext>).is_err() { + error!("Please go to https://www.epicgames.com/id/exchange?exchangeCode={code}&redirectUrl=https%3A%2F%2Fwww.unrealengine.com%2Feulacheck%2Funreal"); } #[cfg(target_os = "windows")] open::that(format!("https://www.epicgames.com/id/exchange?exchangeCode={}&redirectUrl=https%3A%2F%2Fwww.unrealengine.com%2Feulacheck%2Funreal", code)); diff --git a/src/ui/widgets/logged_in/engines/mod.rs b/src/ui/widgets/logged_in/engines/mod.rs index 4069dbe..5c99511 100644 --- a/src/ui/widgets/logged_in/engines/mod.rs +++ b/src/ui/widgets/logged_in/engines/mod.rs @@ -270,17 +270,15 @@ impl EpicEnginesBox { return gtk4::Ordering::Smaller; } - match version_compare::compare( - &info1.version().unwrap_or_default(), - &info2.version().unwrap_or_default(), - ) { - Ok(comp) => match comp { - Cmp::Lt => gtk4::Ordering::Larger, - Cmp::Eq | Cmp::Le | Cmp::Ge => gtk4::Ordering::Equal, - Cmp::Gt | Cmp::Ne => gtk4::Ordering::Smaller, - }, - Err(_) => gtk4::Ordering::Smaller, - } + version_compare::compare( + info1.version().unwrap_or_default(), + info2.version().unwrap_or_default(), + ) + .map_or(gtk4::Ordering::Smaller, |comp| match comp { + Cmp::Lt => gtk4::Ordering::Larger, + Cmp::Eq | Cmp::Le | Cmp::Ge => gtk4::Ordering::Equal, + Cmp::Gt | Cmp::Ne => gtk4::Ordering::Smaller, + }) }); let sorted_model = gtk4::SortListModel::new(Some(&self_.grid_model), Some(&sorter)); let selection_model = gtk4::SingleSelection::new(Some(&sorted_model)); @@ -408,11 +406,12 @@ impl EpicEnginesBox { if !data.valid() { continue; } - match data.path() { - None => self.remove_item(&item, data.guid()), - Some(path) => { - match PathBuf::from_str(&path) { - Ok(mut p) => { + data.path().map_or_else( + || self.remove_item(&item, data.guid()), + |path| { + PathBuf::from_str(&path).map_or_else( + |_| self.remove_item(&item, data.guid()), + |mut p| { if !p.exists() { self.remove_item(&item, data.guid()); } @@ -422,11 +421,10 @@ impl EpicEnginesBox { if !p.exists() { self.remove_item(&item, data.guid()); } - } - Err(_) => self.remove_item(&item, data.guid()), - }; - } - } + }, + ); + }, + ); } } diff --git a/src/ui/widgets/logged_in/library/actions/local_asset.rs b/src/ui/widgets/logged_in/library/actions/local_asset.rs index e2f576a..1316461 100644 --- a/src/ui/widgets/logged_in/library/actions/local_asset.rs +++ b/src/ui/widgets/logged_in/library/actions/local_asset.rs @@ -87,7 +87,7 @@ pub mod imp { let label = value .get::>() .expect("type conformity checked by `Object::set_property`"); - let formatted = label.as_ref().map(|l| format!("{}", l)); + let formatted = label.as_ref().map(|l| format!("{l}")); self.label.replace(formatted); self.instance().set_property("path", label); } diff --git a/src/ui/widgets/logged_in/library/actions/manage_local_assets.rs b/src/ui/widgets/logged_in/library/actions/manage_local_assets.rs index d09105d..8a54969 100644 --- a/src/ui/widgets/logged_in/library/actions/manage_local_assets.rs +++ b/src/ui/widgets/logged_in/library/actions/manage_local_assets.rs @@ -158,7 +158,7 @@ impl EpicLocalAssets { if let Ok(path) = PathBuf::from_str(&p) { if path.exists() { if let Some(parent) = path.parent() { - if let Err(e) = std::fs::remove_dir_all(&parent) { + if let Err(e) = std::fs::remove_dir_all(parent) { error!("Unable to remove vault data: {:?}", e); }; } diff --git a/src/ui/widgets/logged_in/library/actions/mod.rs b/src/ui/widgets/logged_in/library/actions/mod.rs index c3f2b2d..090e58d 100644 --- a/src/ui/widgets/logged_in/library/actions/mod.rs +++ b/src/ui/widgets/logged_in/library/actions/mod.rs @@ -418,14 +418,14 @@ impl EpicAssetActions { } } self_.select_download_version.append( - Some(release.id.as_ref().unwrap_or(&"".to_string())), + Some(release.id.as_ref().unwrap_or(&String::new())), &format!( "{}{}", release .version_title .as_ref() - .unwrap_or(&"".to_string()) - .or(release.app_id.as_ref().unwrap_or(&"".to_string())), + .unwrap_or(&String::new()) + .or(release.app_id.as_ref().unwrap_or(&String::new())), if id == 0 { " (latest)" } else { "" } ), ); diff --git a/src/ui/widgets/logged_in/library/asset.rs b/src/ui/widgets/logged_in/library/asset.rs index b737621..9c3e022 100644 --- a/src/ui/widgets/logged_in/library/asset.rs +++ b/src/ui/widgets/logged_in/library/asset.rs @@ -134,14 +134,14 @@ pub mod imp { .expect("type conformity checked by `Object::set_property`"); self.thumbnail.replace(thumbnail.clone()); - match thumbnail { - None => { + thumbnail.map_or_else( + || { self.image.set_icon_name(Some("ue-logo-symbolic")); - } - Some(t) => { + }, + |t| { self.image.set_from_paintable(Some(&t)); - } - } + }, + ); } _ => unimplemented!(), } diff --git a/src/ui/widgets/logged_in/library/asset_detail.rs b/src/ui/widgets/logged_in/library/asset_detail.rs index 1d8d0b3..7c22b1b 100644 --- a/src/ui/widgets/logged_in/library/asset_detail.rs +++ b/src/ui/widgets/logged_in/library/asset_detail.rs @@ -509,7 +509,7 @@ impl EpicAssetDetails { if let Some(title) = &asset.title { self_ .title - .set_markup(&format!("{}", title)); + .set_markup(&format!("{title}")); } self_.images.clear(); diff --git a/src/ui/widgets/logged_in/library/mod.rs b/src/ui/widgets/logged_in/library/mod.rs index 40275b0..8cd5ab6 100644 --- a/src/ui/widgets/logged_in/library/mod.rs +++ b/src/ui/widgets/logged_in/library/mod.rs @@ -201,30 +201,12 @@ pub mod imp { "filter" => { let filter: Option = value.get().unwrap(); - self.filter.replace(match filter { - None => None, - Some(f) => { - if f.is_empty() { - None - } else { - Some(f) - } - } - }); + self.filter.replace(filter.filter(|f| !f.is_empty())); self.instance().apply_filter(); } "search" => { let search: Option = value.get().unwrap(); - self.search.replace(match search { - None => None, - Some(f) => { - if f.is_empty() { - None - } else { - Some(f) - } - } - }); + self.search.replace(search.filter(|f| !f.is_empty())); self.instance().apply_filter(); } "item" => { @@ -452,13 +434,8 @@ impl EpicLibraryBox { if let Some(product) = self.product() { let assets = self_.loaded_assets.borrow(); let products = self_.asset_product_names.borrow(); - match products.get(&product) { - Some(id) => { - if let Some(a) = assets.get(id) { - self_.details.set_asset(a); - } - } - None => { + products.get(&product).map_or_else( + || { for prod in products.keys() { if product.starts_with(prod) { if let Some(id) = products.get(prod) { @@ -469,8 +446,13 @@ impl EpicLibraryBox { break; } } - } - } + }, + |id| { + if let Some(a) = assets.get(id) { + self_.details.set_asset(a); + } + }, + ); } }, |id| { @@ -637,16 +619,12 @@ impl EpicLibraryBox { let asset = object .downcast_ref::() .unwrap(); - (match &search { - None => true, - Some(se) => asset + search.as_ref().map_or(true, |se| { + asset .name() .to_ascii_lowercase() - .contains(&se.to_ascii_lowercase()), - }) && (match &filter_p { - None => true, - Some(f) => asset.check_category(f), - }) + .contains(&se.to_ascii_lowercase()) + }) && filter_p.as_ref().map_or(true, |f| asset.check_category(f)) }); self_.filter_model.set_filter(Some(&filter)); self.update_count(); @@ -794,10 +772,7 @@ impl EpicLibraryBox { fn main_window(&self) -> Option<&crate::window::EpicAssetManagerWindow> { let self_ = self.imp(); - match self_.window.get() { - Some(window) => Some(window), - None => None, - } + self_.window.get() } pub fn fetch_assets(&self) { diff --git a/src/ui/widgets/logged_in/library/sidebar/categories.rs b/src/ui/widgets/logged_in/library/sidebar/categories.rs index 3d94f75..9b920e4 100644 --- a/src/ui/widgets/logged_in/library/sidebar/categories.rs +++ b/src/ui/widgets/logged_in/library/sidebar/categories.rs @@ -232,10 +232,9 @@ impl EpicSidebarCategories { pub fn capitalize_first_letter(s: &str) -> String { let mut c = s.chars(); - match c.next() { - None => String::new(), - Some(f) => f.to_uppercase().collect::() + c.as_str(), - } + c.next().map_or_else(String::new, |f| { + f.to_uppercase().collect::() + c.as_str() + }) } pub fn title(&self) -> Option { self.property("title") diff --git a/src/ui/widgets/logged_in/library/sidebar/mod.rs b/src/ui/widgets/logged_in/library/sidebar/mod.rs index dfe432a..f76cda4 100644 --- a/src/ui/widgets/logged_in/library/sidebar/mod.rs +++ b/src/ui/widgets/logged_in/library/sidebar/mod.rs @@ -320,27 +320,24 @@ impl EpicSidebar { self_.stack.set_visible_child_name(&p); } if let Some(l) = self_.loggedin.get() { - match self.category_by_name(&p) { - None => { + self.category_by_name(&p).map_or_else( + || { l.set_property("filter", filter); - } - Some(cat) => { - let filter = match cat.filter() { - None => None, - Some(filter) => { - let mut prefix = String::new(); - if self_.downloaded_switch.is_active() { - prefix.push_str("downloaded&"); - } - if self_.favorites_switch.is_active() { - prefix.push_str("favorites&"); - } - Some(format!("{}{}", prefix, filter)) + }, + |cat| { + let filter = cat.filter().map(|filter| { + let mut prefix = String::new(); + if self_.downloaded_switch.is_active() { + prefix.push_str("downloaded&"); + } + if self_.favorites_switch.is_active() { + prefix.push_str("favorites&"); } - }; + format!("{prefix}{filter}") + }); l.set_property("filter", filter); - } - } + }, + ); }; } } @@ -386,8 +383,8 @@ impl EpicSidebar { fn add_category_by_name(&self, part: &str, p: &str) -> EpicSidebarCategories { let self_ = self.imp(); - match self.category_by_name(p) { - None => { + self.category_by_name(p).map_or_else( + || { let c = categories::EpicSidebarCategories::new( &categories::EpicSidebarCategories::capitalize_first_letter(part), p, @@ -397,17 +394,17 @@ impl EpicSidebar { c.set_widget_name(p); self_.stack.add_named(&c, Some(p)); c - } - Some(c) => c, - } + }, + |c| c, + ) } } fn open_browser(code: &str) { #[cfg(target_os = "linux")] - if gio::AppInfo::launch_default_for_uri(&format!("https://www.epicgames.com/id/exchange?exchangeCode={}&redirectUrl=https%3A%2F%2Fwww.unrealengine.com%2Fmarketplace", code), None::<&gio::AppLaunchContext>).is_err() { - error!("Please go to https://www.epicgames.com/id/exchange?exchangeCode={}&redirectUrl=https%3A%2F%2Fwww.unrealengine.com%2Fmarketplace", code); + if gio::AppInfo::launch_default_for_uri(&format!("https://www.epicgames.com/id/exchange?exchangeCode={code}&redirectUrl=https%3A%2F%2Fwww.unrealengine.com%2Fmarketplace"), None::<&gio::AppLaunchContext>).is_err() { + error!("Please go to https://www.epicgames.com/id/exchange?exchangeCode={code}&redirectUrl=https%3A%2F%2Fwww.unrealengine.com%2Fmarketplace"); } #[cfg(target_os = "windows")] - open::that(format!("https://www.epicgames.com/id/exchange?exchangeCode={}&redirectUrl=https%3A%2F%2Fwww.unrealengine.com%2Fmarketplace", code)); + open::that(format!("https://www.epicgames.com/id/exchange?exchangeCode={code}&redirectUrl=https%3A%2F%2Fwww.unrealengine.com%2Fmarketplace")); } diff --git a/src/ui/widgets/logged_in/log_line.rs b/src/ui/widgets/logged_in/log_line.rs index beddfee..71b5570 100644 --- a/src/ui/widgets/logged_in/log_line.rs +++ b/src/ui/widgets/logged_in/log_line.rs @@ -97,7 +97,7 @@ pub mod imp { let label = value .get::>() .expect("type conformity checked by `Object::set_property`"); - let formatted = label.as_ref().map(|l| format!("{}", l)); + let formatted = label.as_ref().map(|l| format!("{l}")); self.label.replace(formatted); } "path" => { diff --git a/src/ui/widgets/logged_in/logs.rs b/src/ui/widgets/logged_in/logs.rs index 94f1b67..b7159f3 100644 --- a/src/ui/widgets/logged_in/logs.rs +++ b/src/ui/widgets/logged_in/logs.rs @@ -307,18 +307,17 @@ impl EpicLogs { }; } }; - let metadata = - std::fs::metadata(&p.as_path()).expect("unable to read metadata"); + let metadata = std::fs::metadata(p.as_path()).expect("unable to read metadata"); sender .send(Msg::AddLog( p.to_str().unwrap_or_default().to_string(), - match metadata.modified() { - Ok(time) => { + metadata.modified().map_or_else( + |_| p.to_str().unwrap_or_default().to_string(), + |time| { let t: chrono::DateTime = time.into(); format!("{}", t.format("%Y-%m-%d %T")) - } - Err(_) => p.to_str().unwrap_or_default().to_string(), - }, + }, + ), crash, )) .unwrap(); diff --git a/src/ui/widgets/logged_in/projects/mod.rs b/src/ui/widgets/logged_in/projects/mod.rs index 2621f6b..c68deca 100644 --- a/src/ui/widgets/logged_in/projects/mod.rs +++ b/src/ui/widgets/logged_in/projects/mod.rs @@ -276,19 +276,19 @@ impl EpicProjectsBox { .clone() .downcast::() .unwrap(); - match data.path() { - None => self.remove_item(&item, data.path()), - Some(path) => { - match PathBuf::from_str(&path) { - Ok(p) => { + data.path().map_or_else( + || self.remove_item(&item, data.path()), + |path| { + PathBuf::from_str(&path).map_or_else( + |_| self.remove_item(&item, data.path()), + |p| { if !p.exists() { self.remove_item(&item, data.path()); } - } - Err(_) => self.remove_item(&item, data.path()), - }; - } - } + }, + ); + }, + ); } } diff --git a/src/ui/widgets/logged_in/projects/project.rs b/src/ui/widgets/logged_in/projects/project.rs index 968a175..01fe360 100644 --- a/src/ui/widgets/logged_in/projects/project.rs +++ b/src/ui/widgets/logged_in/projects/project.rs @@ -84,14 +84,14 @@ pub mod imp { let name = value .get::>() .expect("type conformity checked by `Object::set_property`") - .map(|l| format!("{}", l)); + .map(|l| format!("{l}")); self.name.replace(name); } "engine" => { let engine = value .get::>() .expect("type conformity checked by `Object::set_property`") - .map(|l| format!("{}", l)); + .map(|l| format!("{l}")); self.engine.replace(engine); } _ => unimplemented!(), @@ -159,11 +159,11 @@ impl EpicProject { self_.data.replace(Some(data.clone())); self.set_property("name", &data.name()); self.set_property("tooltip-text", &data.path()); - match data.uproject() { - None => { + data.uproject().map_or_else( + || { self.set_property("engine", ""); - } - Some(uproject) => match self.associated_engine(&uproject) { + }, + |uproject| match self.associated_engine(&uproject) { None => { let db = crate::models::database::connection(); let mut last_engine: Option = None; @@ -180,41 +180,41 @@ impl EpicProject { last_engine = Some(last); } }; - match last_engine { - None => { + last_engine.map_or_else( + || { self.set_property("engine", "Unknown Engine"); - } - Some(eng) => { - match crate::models::engine_data::EngineData::read_engine_version(&eng) - { - None => { - self.set_property("engine", eng); - } - Some(version) => { - self.set_property("engine", version.format()); - } - } - } - } + }, + |eng| { + crate::models::engine_data::EngineData::read_engine_version(&eng) + .map_or_else( + || { + self.set_property("engine", eng); + }, + |version| { + self.set_property("engine", version.format()); + }, + ); + }, + ); } Some(eng) => { self.set_property("engine", eng.version.format()); } }, - }; + ); if let Some(pix) = data.image() { self_.thumbnail.set_custom_image(Some(&pix)); } - match data.path() { - None => { + data.path().map_or_else( + || { self_.thumbnail.set_text(None); - } - Some(path) => { + }, + |path| { self_.thumbnail.set_text(Some(&path)); - } - } + }, + ); self_.handler.replace(Some(data.connect_local( "finished", diff --git a/src/ui/widgets/logged_in/projects/project_detail.rs b/src/ui/widgets/logged_in/projects/project_detail.rs index c2896ba..9dbe899 100644 --- a/src/ui/widgets/logged_in/projects/project_detail.rs +++ b/src/ui/widgets/logged_in/projects/project_detail.rs @@ -221,7 +221,7 @@ impl UnrealProjectDetails { path ) } else { - format!("\"{:?}\" \"{}\"", p, path) + format!("\"{p:?}\" \"{path}\"") }, Some("Unreal Engine"), gtk4::gio::AppInfoCreateFlags::NONE, diff --git a/src/ui/widgets/preferences/mod.rs b/src/ui/widgets/preferences/mod.rs index 0b4f53f..aa5f30e 100644 --- a/src/ui/widgets/preferences/mod.rs +++ b/src/ui/widgets/preferences/mod.rs @@ -313,7 +313,7 @@ impl PreferencesWindow { let level = self_.settings.int("log-level"); self_ .log_level_selection - .set_active_id(Some(&format!("{}", level))); + .set_active_id(Some(&format!("{level}"))); self.log_level_changed(); let category = self_.settings.string("default-category"); self_ @@ -329,27 +329,23 @@ impl PreferencesWindow { let win_ = w.imp(); #[cfg(target_os = "linux")] { - match &win_.model.borrow().secret_service { - None => { - w.add_notification("ss_none", "org.freedesktop.Secret.Service not available for use, secrets will not be stored securely", gtk4::MessageType::Warning); + win_.model.borrow().secret_service.as_ref().map_or_else( + || { + // w.add_notification("ss_none", "org.freedesktop.Secret.Service not available for use, secrets will not be stored securely", gtk4::MessageType::Warning); self.load_secrets_insecure(); - } - Some(ss) => { + }, + |ss| { if let Ok(collection) = ss.get_any_collection() { - if let Ok(items) = collection.search_items( - [("application", crate::config::APP_ID)] - .iter() - .copied() - .collect(), - ) { + if let Ok(items) = collection.search_items(HashMap::from([( + "application", + crate::config::APP_ID, + )])) { for item in items { - let label = if let Ok(l) = item.get_label() { - l - } else { - debug!("No label skipping"); - continue; - }; - debug!("Loading: {}", label); + let Ok(label) = item.get_label() else { + debug!("No label skipping"); + continue; + }; + debug!("Loading: {label}"); match label.as_str() { "eam_github_token" => { if let Ok(d) = item.get_secret() { @@ -364,8 +360,8 @@ impl PreferencesWindow { } }; }; - } - } + }, + ); } #[cfg(target_os = "windows")] { @@ -406,12 +402,12 @@ impl PreferencesWindow { let model = win_.model.borrow(); #[cfg(target_os = "linux")] { - match &model.secret_service { - None => { - w.add_notification("ss_none_gh", "org.freedesktop.Secret.Service not available for use, github token will not be saved securely", gtk4::MessageType::Warning); + model.secret_service.as_ref().map_or_else( + || { + // w.add_notification("ss_none_gh", "org.freedesktop.Secret.Service not available for use, github token will not be saved securely", gtk4::MessageType::Warning); self.save_github_token_insecure(); - } - Some(ss) => { + }, + |ss| { self_.settings.set_string("github-token", "").unwrap(); if let Err(e) = ss.get_any_collection().unwrap().create_item( "eam_github_token", @@ -421,11 +417,11 @@ impl PreferencesWindow { "text/plain", ) { error!("Failed to save secret {}", e); - w.add_notification("ss_none_gh", "org.freedesktop.Secret.Service not available for use, github token will not be saved securely", gtk4::MessageType::Warning); + // w.add_notification("ss_none_gh", "org.freedesktop.Secret.Service not available for use, github token will not be saved securely", gtk4::MessageType::Warning); self.save_github_token_insecure(); }; - } - } + }, + ); } #[cfg(target_os = "windows")] { @@ -550,9 +546,7 @@ impl PreferencesWindow { | DirectoryConfigType::Projects => { if let Some((setting_name, widget)) = self.setting_name_and_box_from_type(kind) { let mut current = self_.settings.strv(setting_name); - let n = if let Ok(s) = name.into_string() { - s - } else { + let Ok(n) = name.into_string() else { error!("Selected directory is not UTF8"); return; }; @@ -623,6 +617,7 @@ impl PreferencesWindow { let self_ = self.imp(); let mut rows = self_.directory_rows.borrow_mut(); + #[allow(clippy::option_if_let_else)] match rows.get_mut(&kind) { None => { row.set_up_enabled(false); @@ -717,10 +712,7 @@ impl PreferencesWindow { { let mut rows = self_.directory_rows.borrow_mut(); if let Some(r) = rows.get_mut(&kind) { - let current_position = match r.iter().position(|i| i.0 == dir) { - Some(p) => p, - None => return, - }; + let Some(current_position) = r.iter().position(|i| i.0 == dir) else { return }; let item = r.remove(current_position); let sibling = &r[current_position - 1]; @@ -744,10 +736,7 @@ impl PreferencesWindow { { let mut rows = self_.directory_rows.borrow_mut(); if let Some(r) = rows.get_mut(&kind) { - let current_position = match r.iter().position(|i| i.0 == dir) { - Some(p) => p, - None => return, - }; + let Some(current_position) = r.iter().position(|i| i.0 == dir) else { return }; let item = r.remove(current_position); let total = r.len(); if current_position < total { diff --git a/src/ui/widgets/progress_icon.rs b/src/ui/widgets/progress_icon.rs index 2844e17..6f9a401 100644 --- a/src/ui/widgets/progress_icon.rs +++ b/src/ui/widgets/progress_icon.rs @@ -109,14 +109,14 @@ pub mod imp { } else { color.set_alpha(0.15); } - let color_stop = gsk::ColorStop::new(fraction as f32, color); + let color_stop = gsk::ColorStop::new(fraction, color); if widget.inverted() { color.set_alpha(0.15); } else { color.set_alpha(1.0); } - let color_stop_end = gsk::ColorStop::new(fraction as f32, color); + let color_stop_end = gsk::ColorStop::new(fraction, color); let rotation = 0.0; snapshot.push_rounded_clip(&circle); diff --git a/src/window.rs b/src/window.rs index e69fdcd..53762e1 100644 --- a/src/window.rs +++ b/src/window.rs @@ -496,13 +496,15 @@ impl EpicAssetManagerWindow { let mut attributes = HashMap::new(); attributes.insert("application", crate::config::APP_ID); attributes.insert("type", secret_type); - let d = match expiration { - None => chrono::Utc - .timestamp_opt(0, 0) - .unwrap() - .to_rfc3339_opts(chrono::SecondsFormat::Millis, true), - Some(e) => e.to_rfc3339_opts(chrono::SecondsFormat::Millis, true), - }; + let d = expiration.map_or_else( + || { + chrono::Utc + .timestamp_opt(0, 0) + .unwrap() + .to_rfc3339_opts(chrono::SecondsFormat::Millis, true) + }, + |e| e.to_rfc3339_opts(chrono::SecondsFormat::Millis, true), + ); self_ .model .borrow() From 8a0f6c076dce71b052daa5a071ef9150cb18a8ec Mon Sep 17 00:00:00 2001 From: Milan Stastny Date: Mon, 3 Apr 2023 14:32:59 +0200 Subject: [PATCH 2/5] Update dependencies --- Cargo.toml | 14 +-- src/application.rs | 40 +++---- src/models/asset_data.rs | 63 +++------- src/models/category_data.rs | 44 ++----- src/models/engine_data.rs | 40 ++----- src/models/log_data.rs | 14 +-- src/models/mod.rs | 12 +- src/models/plugin_data.rs | 10 +- src/models/project_data.rs | 20 ++-- src/tools/mod.rs | 8 +- src/ui/widgets/download_manager/docker.rs | 6 +- .../widgets/download_manager/download_item.rs | 109 +++--------------- src/ui/widgets/download_manager/epic_file.rs | 2 +- src/ui/widgets/download_manager/mod.rs | 17 +-- .../logged_in/engines/docker_download.rs | 22 +--- src/ui/widgets/logged_in/engines/engine.rs | 38 ++---- .../logged_in/engines/engine_detail.rs | 48 ++++---- .../widgets/logged_in/engines/engines_side.rs | 41 ++----- .../logged_in/engines/epic_download.rs | 4 +- src/ui/widgets/logged_in/engines/install.rs | 4 +- src/ui/widgets/logged_in/engines/mod.rs | 43 ++++--- .../library/actions/add_to_project.rs | 15 +-- .../library/actions/create_asset_project.rs | 20 +--- .../library/actions/download_detail.rs | 15 +-- .../logged_in/library/actions/local_asset.rs | 22 +--- .../library/actions/manage_local_assets.rs | 2 +- .../widgets/logged_in/library/actions/mod.rs | 44 ++----- src/ui/widgets/logged_in/library/asset.rs | 42 +------ .../widgets/logged_in/library/asset_detail.rs | 25 ++-- .../widgets/logged_in/library/image_stack.rs | 15 +-- src/ui/widgets/logged_in/library/mod.rs | 90 +++++---------- .../logged_in/library/sidebar/button.rs | 48 ++------ .../logged_in/library/sidebar/categories.rs | 47 +++----- .../logged_in/library/sidebar/category.rs | 34 +----- .../widgets/logged_in/library/sidebar/mod.rs | 15 +-- src/ui/widgets/logged_in/log_line.rs | 35 +----- src/ui/widgets/logged_in/logs.rs | 11 +- src/ui/widgets/logged_in/mod.rs | 20 +--- src/ui/widgets/logged_in/plugins.rs | 2 +- src/ui/widgets/logged_in/projects/mod.rs | 33 +++--- src/ui/widgets/logged_in/projects/project.rs | 12 +- .../logged_in/projects/project_detail.rs | 83 ++++++------- src/ui/widgets/preferences/dir_row.rs | 2 +- src/ui/widgets/preferences/mod.rs | 10 +- src/ui/widgets/progress_icon.rs | 63 ++++------ src/ui/widgets/sid_login/mod.rs | 2 +- src/window.rs | 16 +-- 47 files changed, 382 insertions(+), 940 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index edf19de..427cc9b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ keywords = ["unreal", "engine", "gamedev", "assets", "epic"] categories = ["gui"] [dependencies] -adw = { package = "libadwaita", version = "0.2" } +adw = { package = "libadwaita", version = "0.3" } anyhow = "1.0" byte-unit = "4.0" chrono = "0.4" @@ -19,14 +19,14 @@ diesel_migrations = { version = "2.0.0", features = ["sqlite"] } egs-api = "0.6" env_logger = "0.10.0" fs2 = "0.4.3" -gtk4 = { version = "0.5", features = ["v4_8"] } +gtk4 = { version = "0.6", features = ["v4_8"] } gtk-macros = "0.3" html2pango = "0.5" lazy_static = "1.4" -libsqlite3-sys = { version = "0.22.2", features = ["bundled"] } +libsqlite3-sys = { version = "0.25.2", features = ["bundled"] } log = "0.4" once_cell = "1.8" -opener = "0.5" +opener = "0.6" rand = "0.8" regex = "1" reqwest = { version = "0.11", features = ["json", "cookies", "blocking"] } @@ -42,10 +42,10 @@ zip = "0.6" winres = "0.1" [target.'cfg(target_os = "windows")'.dependencies] -open = "3" +open = "4" [target.'cfg(target_os = "linux")'.dependencies] -ashpd = "0.3" +ashpd = "0.4" gettext-rs = { version = "0.7", features = ["gettext-system"] } ghregistry = "^0.2" -secret-service = "2.0" +secret-service = { version = "3.0", features = ["crypto-rust"]} diff --git a/src/application.rs b/src/application.rs index 7d71e92..9251998 100644 --- a/src/application.rs +++ b/src/application.rs @@ -5,7 +5,7 @@ use glib::clone; use gtk4::prelude::*; use gtk4::subclass::prelude::*; use gtk4::{gdk, gio, glib}; -use gtk_macros::{action, stateful_action}; +use gtk_macros::action; use log::{debug, error, info}; use once_cell::sync::OnceCell; @@ -45,7 +45,7 @@ pub mod imp { impl ApplicationImpl for EpicAssetManager { fn activate(&self) { debug!("GtkApplication::activate"); - let app = self.instance(); + let app = self.obj(); let self_ = app.imp(); if let Some(window) = self_.window.get() { window.show(); @@ -126,7 +126,7 @@ pub mod imp { fn startup(&self) { debug!("GtkApplication::startup"); self.parent_startup(); - let app = self.instance(); + let app = self.obj(); app.set_resource_base_path(Some("/io/github/achetagames/epic_asset_manager")); Self::Type::setup_css(); @@ -161,14 +161,14 @@ impl Default for EpicAssetManager { impl EpicAssetManager { pub fn new() -> Self { - glib::Object::new::(&[ - ("application-id", &Some(config::APP_ID)), - ("flags", &ApplicationFlags::HANDLES_OPEN), - ( + glib::Object::builder() + .property("application-id", config::APP_ID) + .property("flags", ApplicationFlags::HANDLES_OPEN) + .property( "resource-base-path", - &Some("/io/github/achetagames/epic_asset_manager/"), - ), - ]) + "/io/github/achetagames/epic_asset_manager/", + ) + .build() } pub fn main_window(&self) -> &EpicAssetManagerWindow { @@ -194,14 +194,12 @@ impl EpicAssetManager { ); let is_dark_mode = self_.settings.boolean("dark-mode"); - stateful_action!( - self, - "dark-mode", - is_dark_mode, - clone!(@weak self as app => move |action, _| { - app.toggle_dark_mode(action); - }) - ); + let simple_action = + gio::SimpleAction::new_stateful("dark-mode", None, is_dark_mode.to_variant()); + simple_action.connect_activate(clone!(@weak self as app => move |action, _| { + app.toggle_dark_mode(action); + })); + self.add_action(&simple_action); // About action!( @@ -227,7 +225,7 @@ impl EpicAssetManager { let state = action.state().unwrap(); let action_state: bool = state.get().unwrap(); let is_dark_mode = !action_state; - action.set_state(&is_dark_mode.to_variant()); + action.set_state(is_dark_mode.to_variant()); if let Err(err) = self_.settings.set_boolean("dark-mode", is_dark_mode) { error!("Failed to switch dark mode: {} ", err); } @@ -263,8 +261,8 @@ impl EpicAssetManager { .version(config::VERSION) .transient_for(self.main_window()) .modal(true) - .authors(vec!["Acheta Games".into()]) - .documenters(vec!["Osayami".into()]) + .authors(vec!["Acheta Games".to_string()]) + .documenters(vec!["Osayami".to_string()]) .build(); dialog.show(); diff --git a/src/models/asset_data.rs b/src/models/asset_data.rs index 03a8d33..04111c7 100644 --- a/src/models/asset_data.rs +++ b/src/models/asset_data.rs @@ -4,7 +4,7 @@ use diesel::{select, ExpressionMethods, QueryDsl, RunQueryDsl}; use egs_api::api::types::asset_info::AssetInfo; use glib::ObjectExt; use gtk4::gdk::Texture; -use gtk4::gio::prelude::SettingsExt; +use gtk4::prelude::SettingsExtManual; use gtk4::{glib, subclass::prelude::*}; use log::error; use std::path::PathBuf; @@ -22,7 +22,7 @@ mod imp { use super::*; use glib::ToValue; use gtk4::gdk::Texture; - use gtk4::glib::{ParamSpecObject, StaticType}; + use gtk4::glib::ParamSpecObject; use std::cell::RefCell; // The actual data structure that stores our values. This is not accessible @@ -34,7 +34,7 @@ mod imp { favorite: RefCell, downloaded: RefCell, pub kind: RefCell>, - pub asset: RefCell>, + pub asset: RefCell>, thumbnail: RefCell>, pub settings: gtk4::gio::Settings, } @@ -67,10 +67,10 @@ mod imp { // This maps between the GObject properties and our internal storage of the // corresponding values of the properties. impl ObjectImpl for AssetData { - fn signals() -> &'static [gtk4::glib::subclass::Signal] { - static SIGNALS: once_cell::sync::Lazy> = + fn signals() -> &'static [glib::subclass::Signal] { + static SIGNALS: once_cell::sync::Lazy> = once_cell::sync::Lazy::new(|| { - vec![gtk4::glib::subclass::Signal::builder("refreshed") + vec![glib::subclass::Signal::builder("refreshed") .flags(glib::SignalFlags::ACTION) .build()] }); @@ -81,41 +81,11 @@ mod imp { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - glib::ParamSpecString::new( - "name", - "Name", - "Name", - None, // Default value - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecString::new( - "id", - "ID", - "ID", - None, // Default value - glib::ParamFlags::READWRITE, - ), - ParamSpecObject::new( - "thumbnail", - "Thumbnail", - "Thumbnail", - Texture::static_type(), - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecBoolean::new( - "favorite", - "favorite", - "Is favorite", - false, - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecBoolean::new( - "downloaded", - "downloaded", - "Is Downloaded", - false, - glib::ParamFlags::READWRITE, - ), + glib::ParamSpecString::builder("name").build(), + glib::ParamSpecString::builder("id").build(), + ParamSpecObject::builder::("thumbnail").build(), + glib::ParamSpecBoolean::builder("favorite").build(), + glib::ParamSpecBoolean::builder("downloaded").build(), ] }); @@ -181,7 +151,7 @@ glib::wrapper! { // initial values for our two properties and then returns the new instance impl AssetData { pub fn new(asset: &AssetInfo, image: Option) -> AssetData { - let data: Self = glib::Object::new::(&[]); + let data: Self = glib::Object::new::(); let self_ = data.imp(); data.set_property("id", &asset.id); @@ -374,13 +344,10 @@ impl AssetData { self.set_property("downloaded", false); } - pub fn downloaded_locations( - directories: &[gtk4::glib::GString], - asset_id: &str, - ) -> Vec { - let mut result: Vec = Vec::new(); + pub fn downloaded_locations(directories: &glib::StrV, asset_id: &str) -> Vec { + let mut result: Vec = Vec::new(); for directory in directories { - let mut path = std::path::PathBuf::from(&directory); + let mut path = std::path::PathBuf::from(directory.to_str()); path.push(asset_id); path.push("data"); if path.exists() { diff --git a/src/models/category_data.rs b/src/models/category_data.rs index 640f1be..9f040fa 100644 --- a/src/models/category_data.rs +++ b/src/models/category_data.rs @@ -35,34 +35,10 @@ mod imp { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - glib::ParamSpecString::new( - "name", - "Name", - "Name", - None, // Default value - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecString::new( - "path", - "Path", - "Path", - None, // Default value - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecString::new( - "filter", - "Filter", - "Filter", - None, // Default value - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecBoolean::new( - "leaf", - "Leaf", - "Is leaf", - false, - glib::ParamFlags::READWRITE, - ), + glib::ParamSpecString::builder("name").build(), + glib::ParamSpecString::builder("path").build(), + glib::ParamSpecString::builder("filter").build(), + glib::ParamSpecBoolean::builder("leaf").build(), ] }); @@ -117,12 +93,12 @@ glib::wrapper! { impl CategoryData { pub fn new(name: &str, filter: &str, path: &str, leaf: bool) -> CategoryData { - glib::Object::new::(&[ - ("name", &name), - ("filter", &filter), - ("path", &path), - ("leaf", &leaf), - ]) + glib::Object::builder() + .property("name", &name) + .property("filter", &filter) + .property("path", &path) + .property("leaf", &leaf) + .build() } pub fn name(&self) -> String { diff --git a/src/models/engine_data.rs b/src/models/engine_data.rs index f7bdb4f..f076b02 100644 --- a/src/models/engine_data.rs +++ b/src/models/engine_data.rs @@ -136,7 +136,7 @@ mod imp { impl ObjectImpl for EngineData { fn constructed(&self) { self.parent_constructed(); - self.instance().setup_messaging(); + self.obj().setup_messaging(); } fn signals() -> &'static [glib::subclass::Signal] { @@ -153,36 +153,12 @@ mod imp { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - ParamSpecString::new("guid", "GUID", "GUID", None, glib::ParamFlags::READWRITE), - ParamSpecString::new("path", "Path", "Path", None, glib::ParamFlags::READWRITE), - ParamSpecString::new( - "version", - "Version", - "Version", - None, - glib::ParamFlags::READWRITE, - ), - ParamSpecBoolean::new( - "needs-update", - "needs update", - "Check if engine needs update", - false, - glib::ParamFlags::READWRITE, - ), - ParamSpecString::new( - "branch", - "Branch", - "Branch", - None, - glib::ParamFlags::READWRITE, - ), - ParamSpecBoolean::new( - "has-branch", - "Has Branch", - "Has Branch", - false, - glib::ParamFlags::READWRITE, - ), + ParamSpecString::builder("guid").build(), + ParamSpecString::builder("path").build(), + ParamSpecString::builder("version").build(), + ParamSpecBoolean::builder("needs-update").build(), + ParamSpecString::builder("branch").build(), + ParamSpecBoolean::builder("has-branch").build(), ] }); PROPERTIES.as_ref() @@ -249,7 +225,7 @@ impl EngineData { version: &UnrealVersion, model: >k4::gio::ListStore, ) -> EngineData { - let data: Self = glib::Object::new::(&[]); + let data: Self = glib::Object::new::(); let self_ = data.imp(); self_.position.set(model.n_items()).unwrap(); self_.model.set(model.clone()).unwrap(); diff --git a/src/models/log_data.rs b/src/models/log_data.rs index d7a2c15..dcb3dd9 100644 --- a/src/models/log_data.rs +++ b/src/models/log_data.rs @@ -48,15 +48,9 @@ mod imp { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - ParamSpecString::new("path", "Path", "Path", None, glib::ParamFlags::READWRITE), - ParamSpecString::new("name", "Name", "Name", None, glib::ParamFlags::READWRITE), - ParamSpecBoolean::new( - "crash", - "crash", - "Is Crash", - false, - glib::ParamFlags::READWRITE, - ), + ParamSpecString::builder("path").build(), + ParamSpecString::builder("name").build(), + ParamSpecBoolean::builder("crash").build(), ] }); PROPERTIES.as_ref() @@ -101,7 +95,7 @@ glib::wrapper! { // initial values for our two properties and then returns the new instance impl LogData { pub fn new(path: &str, name: &str, crash: bool) -> LogData { - let data: Self = glib::Object::new::(&[]); + let data: Self = glib::Object::new::(); data.set_property("path", &path); data.set_property("name", &name); data.set_property("crash", crash); diff --git a/src/models/mod.rs b/src/models/mod.rs index 7e58d4e..60743a1 100644 --- a/src/models/mod.rs +++ b/src/models/mod.rs @@ -17,7 +17,7 @@ use std::collections::HashMap; use std::thread; #[cfg(target_os = "linux")] -use secret_service::{EncryptionType, SecretService}; +use secret_service::{blocking::SecretService, EncryptionType}; pub struct Model { pub epic_games: RefCell, @@ -42,7 +42,7 @@ impl Model { let mut obj = Self { epic_games: RefCell::new(EpicGames::new()), #[cfg(target_os = "linux")] - secret_service: match SecretService::new(EncryptionType::Dh) { + secret_service: match SecretService::connect(EncryptionType::Dh) { Ok(ss) => Some(ss), Err(e) => { error!( @@ -91,7 +91,7 @@ impl Model { Some(mut dir) => { dir.push("Unreal Projects"); self.settings - .set_strv("unreal-projects-directories", &[dir.to_str().unwrap()]) + .set_strv("unreal-projects-directories", vec![dir.to_str().unwrap()]) .unwrap(); } }; @@ -105,7 +105,7 @@ impl Model { Some(mut dir) => { dir.push("EpicVault"); self.settings - .set_strv("unreal-vault-directories", &[dir.to_str().unwrap()]) + .set_strv("unreal-vault-directories", vec![dir.to_str().unwrap()]) .unwrap(); } }; @@ -119,7 +119,7 @@ impl Model { Some(mut dir) => { dir.push("Unreal Engine"); self.settings - .set_strv("unreal-engine-directories", &[dir.to_str().unwrap()]) + .set_strv("unreal-engine-directories", vec![dir.to_str().unwrap()]) .unwrap(); } }; @@ -279,7 +279,7 @@ impl Model { fn load_egs_secrets( &self, - item: &secret_service::Item, + item: &secret_service::blocking::Item, attributes: &std::collections::HashMap, expiration: &str, ) -> Option<(String, String, chrono::DateTime)> { diff --git a/src/models/plugin_data.rs b/src/models/plugin_data.rs index 0f82485..0c33dfd 100644 --- a/src/models/plugin_data.rs +++ b/src/models/plugin_data.rs @@ -151,7 +151,7 @@ mod imp { impl ObjectImpl for PluginData { fn constructed(&self) { self.parent_constructed(); - self.instance().setup_messaging(); + self.obj().setup_messaging(); } fn signals() -> &'static [gtk4::glib::subclass::Signal] { @@ -168,9 +168,9 @@ mod imp { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - ParamSpecString::new("guid", "GUID", "GUID", None, glib::ParamFlags::READWRITE), - ParamSpecString::new("path", "Path", "Path", None, glib::ParamFlags::READWRITE), - ParamSpecString::new("name", "Name", "Name", None, glib::ParamFlags::READWRITE), + ParamSpecString::builder("guid").build(), + ParamSpecString::builder("path").build(), + ParamSpecString::builder("name").build(), ] }); PROPERTIES.as_ref() @@ -215,7 +215,7 @@ glib::wrapper! { // initial values for our two properties and then returns the new instance impl PluginData { pub fn new(path: &str, name: &str) -> PluginData { - let data: Self = glib::Object::new(&[]); + let data: Self = glib::Object::new(); data.set_property("path", &path); data.set_property("name", &name); data diff --git a/src/models/project_data.rs b/src/models/project_data.rs index 4611a25..9065de8 100644 --- a/src/models/project_data.rs +++ b/src/models/project_data.rs @@ -1,7 +1,7 @@ use glib::ObjectExt; use gtk4::gdk::Texture; use gtk4::glib::clone; -use gtk4::{self, glib, prelude::*, subclass::prelude::*}; +use gtk4::{self, glib, subclass::prelude::*}; use log::{error, info}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; @@ -88,7 +88,7 @@ mod imp { impl ObjectImpl for ProjectData { fn constructed(&self) { self.parent_constructed(); - self.instance().setup_messaging(); + self.obj().setup_messaging(); } fn signals() -> &'static [gtk4::glib::subclass::Signal] { @@ -105,16 +105,10 @@ mod imp { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - ParamSpecString::new("guid", "GUID", "GUID", None, glib::ParamFlags::READWRITE), - ParamSpecString::new("path", "Path", "Path", None, glib::ParamFlags::READWRITE), - ParamSpecString::new("name", "Name", "Name", None, glib::ParamFlags::READWRITE), - ParamSpecObject::new( - "thumbnail", - "Thumbnail", - "Thumbnail", - Texture::static_type(), - glib::ParamFlags::READWRITE, - ), + ParamSpecString::builder("guid").build(), + ParamSpecString::builder("path").build(), + ParamSpecString::builder("name").build(), + ParamSpecObject::builder::("thumbnail").build(), ] }); PROPERTIES.as_ref() @@ -166,7 +160,7 @@ glib::wrapper! { // initial values for our two properties and then returns the new instance impl ProjectData { pub fn new(path: &str, name: &str) -> ProjectData { - let data: Self = glib::Object::new::(&[]); + let data: Self = glib::Object::new::(); let self_ = data.imp(); data.set_property("path", &path); data.set_property("name", &name); diff --git a/src/tools/mod.rs b/src/tools/mod.rs index 154f130..65d283e 100644 --- a/src/tools/mod.rs +++ b/src/tools/mod.rs @@ -8,11 +8,9 @@ pub async fn open_directory(path: &str) { #[cfg(target_os = "linux")] { if let Ok(dir) = std::fs::File::open(path) { - match ashpd::desktop::open_uri::open_directory( - &ashpd::WindowIdentifier::default(), - &dir, - ) - .await + match ashpd::desktop::open_uri::OpenDirectoryRequest::default() + .send(&dir) + .await { Err(e) => { error!("Unable to open directory using portals: {}", e); diff --git a/src/ui/widgets/download_manager/docker.rs b/src/ui/widgets/download_manager/docker.rs index 1db426b..3353bf1 100644 --- a/src/ui/widgets/download_manager/docker.rs +++ b/src/ui/widgets/download_manager/docker.rs @@ -106,7 +106,7 @@ impl Docker for crate::ui::widgets::download_manager::EpicDownloadManager { let self_ = self.imp(); if let Some(window) = self_.window.get() { let win_: &crate::window::imp::EpicAssetManagerWindow = - crate::window::imp::EpicAssetManagerWindow::from_instance(window); + crate::window::imp::EpicAssetManagerWindow::from_obj(window); if let Some(dclient) = &*win_.model.borrow().dclient.borrow() { let ver = version.to_string(); let d = digest.0.clone(); @@ -283,7 +283,7 @@ impl Docker for crate::ui::widgets::download_manager::EpicDownloadManager { } return None; } - Some(p) => PathBuf::from(p), + Some(p) => PathBuf::from(p.to_str()), }; target.push("docker"); Some(target) @@ -345,7 +345,7 @@ impl Docker for crate::ui::widgets::download_manager::EpicDownloadManager { .map_or_else( || PathBuf::from(&version), |p| { - let mut path = PathBuf::from(p); + let mut path = PathBuf::from(p.to_str()); path.push(version); path }, diff --git a/src/ui/widgets/download_manager/download_item.rs b/src/ui/widgets/download_manager/download_item.rs index 5b5064d..43b9fef 100644 --- a/src/ui/widgets/download_manager/download_item.rs +++ b/src/ui/widgets/download_manager/download_item.rs @@ -6,9 +6,10 @@ use gtk4::glib::clone; use gtk4::{gio, glib, prelude::*, subclass::prelude::*, CompositeTemplate}; use gtk_macros::{action, get_action}; -#[derive(Debug, Copy, Clone, PartialEq, Eq, glib::Enum)] +#[derive(Default, Debug, Copy, Clone, PartialEq, Eq, glib::Enum)] #[enum_type(name = "ItemType")] pub enum ItemType { + #[default] Unknown, Asset, Docker, @@ -21,7 +22,6 @@ pub mod imp { use crate::window::EpicAssetManagerWindow; use gtk4::gdk::Texture; use gtk4::gio; - use gtk4::glib::ParamSpecObject; use once_cell::sync::OnceCell; use std::cell::RefCell; use std::collections::VecDeque; @@ -114,91 +114,20 @@ pub mod imp { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - glib::ParamSpecEnum::new( - "item-type", - "Item Type", - "Item Type", - ItemType::static_type(), - 0, - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecString::new( - "label", - "Label", - "Label", - None, // Default value - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecBoolean::new( - "paused", - "paused", - "Is paused", - false, - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecBoolean::new( - "canceled", - "canceled", - "Is canceled", - false, - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecString::new( - "asset", - "Asset", - "Asset", - None, // Default value - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecString::new( - "version", - "Version", - "Version", - None, // Default value - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecString::new( - "release", - "Release", - "Release", - None, // Default value - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecString::new( - "speed", - "Speed", - "Speed", - None, // Default value - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecString::new( - "target", - "Target", - "Target", - None, // Default value - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecString::new( - "path", - "Path", - "Path", - None, // Default value - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecString::new( - "status", - "status", - "status", - None, // Default value - glib::ParamFlags::READWRITE, - ), - ParamSpecObject::new( - "thumbnail", - "Thumbnail", - "Thumbnail", - Texture::static_type(), - glib::ParamFlags::READWRITE, - ), + glib::ParamSpecEnum::builder::("item-type") + .default_value(ItemType::Unknown) + .build(), + glib::ParamSpecString::builder("label").build(), + glib::ParamSpecBoolean::builder("paused").build(), + glib::ParamSpecBoolean::builder("canceled").build(), + glib::ParamSpecString::builder("asset").build(), + glib::ParamSpecString::builder("version").build(), + glib::ParamSpecString::builder("release").build(), + glib::ParamSpecString::builder("speed").build(), + glib::ParamSpecString::builder("target").build(), + glib::ParamSpecString::builder("path").build(), + glib::ParamSpecString::builder("status").build(), + glib::ParamSpecObject::builder::("thumbnail").build(), ] }); @@ -237,7 +166,7 @@ pub mod imp { self.actions, "open", clone!(@weak self as imp => move |_, _| { - let obj = imp.instance(); + let obj = imp.obj(); obj.open_path(); }) ); @@ -334,7 +263,7 @@ pub mod imp { fn constructed(&self) { self.parent_constructed(); - let obj = self.instance(); + let obj = self.obj(); obj.setup_actions(); obj.setup_messaging(); obj.setup_timer(); @@ -358,7 +287,7 @@ impl Default for EpicDownloadItem { impl EpicDownloadItem { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn set_download_manager( diff --git a/src/ui/widgets/download_manager/epic_file.rs b/src/ui/widgets/download_manager/epic_file.rs index 1d0b53f..f099ee0 100644 --- a/src/ui/widgets/download_manager/epic_file.rs +++ b/src/ui/widgets/download_manager/epic_file.rs @@ -108,7 +108,7 @@ impl EpicFile for crate::ui::widgets::download_manager::EpicDownloadManager { } return None; } - Some(p) => PathBuf::from(p), + Some(p) => PathBuf::from(p.to_str()), }; Some(target) } diff --git a/src/ui/widgets/download_manager/mod.rs b/src/ui/widgets/download_manager/mod.rs index 772f86d..b2adce0 100644 --- a/src/ui/widgets/download_manager/mod.rs +++ b/src/ui/widgets/download_manager/mod.rs @@ -161,7 +161,7 @@ pub mod imp { impl ObjectImpl for EpicDownloadManager { fn constructed(&self) { self.parent_constructed(); - let obj = self.instance(); + let obj = self.obj(); obj.setup_actions(); obj.setup_messaging(); } @@ -178,15 +178,8 @@ pub mod imp { fn properties() -> &'static [ParamSpec] { use once_cell::sync::Lazy; - static PROPERTIES: Lazy> = Lazy::new(|| { - vec![ParamSpecBoolean::new( - "has-items", - "has items", - "Has Items", - false, - glib::ParamFlags::READWRITE, - )] - }); + static PROPERTIES: Lazy> = + Lazy::new(|| vec![ParamSpecBoolean::builder("has-items").build()]); PROPERTIES.as_ref() } @@ -225,7 +218,7 @@ impl Default for EpicDownloadManager { impl EpicDownloadManager { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn set_window(&self, window: &crate::window::EpicAssetManagerWindow) { @@ -245,7 +238,7 @@ impl EpicDownloadManager { self_.actions, "close", clone!(@weak self as details => move |_, _| { - let self_: &imp::EpicDownloadManager = imp::EpicDownloadManager::from_instance(&details); + let self_: &imp::EpicDownloadManager = imp::EpicDownloadManager::from_obj(&details); if let Some(w) = self_.window.get() { w.show_logged_in(); } diff --git a/src/ui/widgets/logged_in/engines/docker_download.rs b/src/ui/widgets/logged_in/engines/docker_download.rs index c405523..cb4f301 100644 --- a/src/ui/widgets/logged_in/engines/docker_download.rs +++ b/src/ui/widgets/logged_in/engines/docker_download.rs @@ -86,7 +86,7 @@ pub mod imp { impl ObjectImpl for DockerEngineDownload { fn constructed(&self) { self.parent_constructed(); - let obj = self.instance(); + let obj = self.obj(); obj.setup_messaging(); obj.setup_actions(); } @@ -95,20 +95,8 @@ pub mod imp { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - ParamSpecString::new( - "selected", - "Selected", - "Selected", - None, - glib::ParamFlags::READWRITE, - ), - ParamSpecString::new( - "download-size", - "Download Size", - "Download Size", - None, - glib::ParamFlags::READWRITE, - ), + ParamSpecString::builder("selected").build(), + ParamSpecString::builder("download-size").build(), ] }); PROPERTIES.as_ref() @@ -155,7 +143,7 @@ impl Default for DockerEngineDownload { impl DockerEngineDownload { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn set_window(&self, window: &crate::window::EpicAssetManagerWindow) { @@ -467,7 +455,7 @@ impl DockerEngineDownload { w.add_notification("missing engine config", "Unable to install engine missing Unreal Engine Directories configuration", gtk4::MessageType::Error); get_action!(self_.actions, @install).set_enabled(false); }, |p| { - let mut path = std::path::Path::new(p); + let mut path = std::path::Path::new(p.to_str()); while !path.exists() { path = match path.parent() { None => break, diff --git a/src/ui/widgets/logged_in/engines/engine.rs b/src/ui/widgets/logged_in/engines/engine.rs index 40edfdb..1941d0a 100644 --- a/src/ui/widgets/logged_in/engines/engine.rs +++ b/src/ui/widgets/logged_in/engines/engine.rs @@ -68,36 +68,12 @@ pub mod imp { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - ParamSpecBoolean::new( - "needs-update", - "needs update", - "Check if engine needs update", - false, - glib::ParamFlags::READWRITE, - ), - ParamSpecString::new( - "version", - "Version", - "Version", - None, - glib::ParamFlags::READWRITE, - ), - ParamSpecString::new("path", "Path", "Path", None, glib::ParamFlags::READWRITE), - ParamSpecString::new( - "branch", - "Branch", - "Branch", - None, - glib::ParamFlags::READWRITE, - ), - ParamSpecBoolean::new( - "has-branch", - "Has Branch", - "Has Branch", - false, - glib::ParamFlags::READWRITE, - ), - ParamSpecString::new("guid", "GUID", "GUID", None, glib::ParamFlags::READWRITE), + ParamSpecBoolean::builder("needs-update").build(), + ParamSpecString::builder("version").build(), + ParamSpecString::builder("path").build(), + ParamSpecString::builder("branch").build(), + ParamSpecBoolean::builder("has-branch").build(), + ParamSpecString::builder("guid").build(), ] }); PROPERTIES.as_ref() @@ -169,7 +145,7 @@ impl Default for EpicEngine { impl EpicEngine { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn path(&self) -> Option { diff --git a/src/ui/widgets/logged_in/engines/engine_detail.rs b/src/ui/widgets/logged_in/engines/engine_detail.rs index 236a934..158bc32 100644 --- a/src/ui/widgets/logged_in/engines/engine_detail.rs +++ b/src/ui/widgets/logged_in/engines/engine_detail.rs @@ -83,22 +83,11 @@ pub mod imp { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - ParamSpecString::new( - "selected", - "Selected", - "Selected", - None, - glib::ParamFlags::READWRITE, - ), - ParamSpecUInt::new( - "position", - "position", - "item_position", - 0, - u32::MAX, - 0, - glib::ParamFlags::READWRITE, - ), + ParamSpecString::builder("selected").build(), + ParamSpecUInt::builder("position") + .minimum(0) + .default_value(0) + .build(), ] }); PROPERTIES.as_ref() @@ -128,7 +117,7 @@ pub mod imp { fn constructed(&self) { self.parent_constructed(); - self.instance().setup_actions(); + self.obj().setup_actions(); } } @@ -149,7 +138,7 @@ impl Default for EpicEngineDetails { impl EpicEngineDetails { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn set_download_manager( @@ -186,16 +175,19 @@ impl EpicEngineDetails { }, |p| { let context = gtk4::gio::AppLaunchContext::new(); context.setenv("GLIBC_TUNABLES", "glibc.rtld.dynamic_sort=2"); - let app = gtk4::gio::AppInfo::create_from_commandline( - if ashpd::is_sandboxed() { - format!("flatpak-spawn --env='GLIBC_TUNABLES=glibc.rtld.dynamic_sort=2' --host \"{}\"", p.to_str().unwrap()) - } else { - format!("\"{}\"", p.to_str().unwrap()) - }, - Some("Unreal Engine"), - gtk4::gio::AppInfoCreateFlags::NONE, - ).unwrap(); - app.launch(&[], Some(&context)).expect("Failed to launch application"); + let ctx = glib::MainContext::default(); + ctx.spawn_local(async move { + let app = gtk4::gio::AppInfo::create_from_commandline( + if ashpd::is_sandboxed().await { + format!("flatpak-spawn --env='GLIBC_TUNABLES=glibc.rtld.dynamic_sort=2' --host \"{}\"", p.to_str().unwrap()) + } else { + format!("\"{}\"", p.to_str().unwrap()) + }, + Some("Unreal Engine"), + gtk4::gio::AppInfoCreateFlags::NONE, + ).unwrap(); + app.launch(&[], Some(&context)).expect("Failed to launch application"); + }); }); }; self.show_confirmation("Engine Launched"); diff --git a/src/ui/widgets/logged_in/engines/engines_side.rs b/src/ui/widgets/logged_in/engines/engines_side.rs index 21a6f3c..12085db 100644 --- a/src/ui/widgets/logged_in/engines/engines_side.rs +++ b/src/ui/widgets/logged_in/engines/engines_side.rs @@ -65,43 +65,20 @@ pub mod imp { impl ObjectImpl for EpicEnginesSide { fn constructed(&self) { self.parent_constructed(); - self.instance().setup_actions(); + self.obj().setup_actions(); } fn properties() -> &'static [ParamSpec] { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - ParamSpecBoolean::new( - "expanded", - "expanded", - "Is expanded", - false, - glib::ParamFlags::READWRITE, - ), - ParamSpecString::new( - "selected", - "Selected", - "Selected", - None, - glib::ParamFlags::READWRITE, - ), - ParamSpecString::new( - "title", - "Title", - "Title", - None, - glib::ParamFlags::READWRITE, - ), - ParamSpecUInt::new( - "position", - "position", - "item_position", - 0, - u32::MAX, - 0, - glib::ParamFlags::READWRITE, - ), + ParamSpecBoolean::builder("expanded").build(), + ParamSpecString::builder("selected").build(), + ParamSpecString::builder("title").build(), + ParamSpecUInt::builder("position") + .minimum(0) + .default_value(0) + .build(), ] }); PROPERTIES.as_ref() @@ -160,7 +137,7 @@ impl Default for EpicEnginesSide { impl EpicEnginesSide { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn set_window(&self, window: &crate::window::EpicAssetManagerWindow) { diff --git a/src/ui/widgets/logged_in/engines/epic_download.rs b/src/ui/widgets/logged_in/engines/epic_download.rs index 651e307..ad76434 100644 --- a/src/ui/widgets/logged_in/engines/epic_download.rs +++ b/src/ui/widgets/logged_in/engines/epic_download.rs @@ -112,7 +112,7 @@ pub mod imp { impl ObjectImpl for EpicEngineDownload { fn constructed(&self) { self.parent_constructed(); - let obj = self.instance(); + let obj = self.obj(); obj.setup_messaging(); obj.setup_actions(); obj.setup_widgets(); @@ -136,7 +136,7 @@ impl Default for EpicEngineDownload { impl EpicEngineDownload { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn set_window(&self, window: &crate::window::EpicAssetManagerWindow) { diff --git a/src/ui/widgets/logged_in/engines/install.rs b/src/ui/widgets/logged_in/engines/install.rs index 9d41c86..a983738 100644 --- a/src/ui/widgets/logged_in/engines/install.rs +++ b/src/ui/widgets/logged_in/engines/install.rs @@ -1,5 +1,5 @@ use gtk4::subclass::prelude::*; -use gtk4::{self, gio, prelude::*}; +use gtk4::{self, gio}; use gtk4::{glib, CompositeTemplate}; pub mod imp { @@ -73,7 +73,7 @@ impl Default for EpicEngineInstall { impl EpicEngineInstall { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn set_window(&self, window: &crate::window::EpicAssetManagerWindow) { diff --git a/src/ui/widgets/logged_in/engines/mod.rs b/src/ui/widgets/logged_in/engines/mod.rs index 5c99511..33fe330 100644 --- a/src/ui/widgets/logged_in/engines/mod.rs +++ b/src/ui/widgets/logged_in/engines/mod.rs @@ -130,7 +130,7 @@ pub mod imp { impl ObjectImpl for EpicEnginesBox { fn constructed(&self) { self.parent_constructed(); - let obj = self.instance(); + let obj = self.obj(); obj.setup_actions(); obj.setup_messaging(); } @@ -139,20 +139,8 @@ pub mod imp { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - ParamSpecBoolean::new( - "expanded", - "expanded", - "Is expanded", - false, - glib::ParamFlags::READWRITE, - ), - ParamSpecString::new( - "selected", - "Selected", - "Selected", - None, - glib::ParamFlags::READWRITE, - ), + ParamSpecBoolean::builder("expanded").build(), + ParamSpecString::builder("selected").build(), ] }); PROPERTIES.as_ref() @@ -198,7 +186,7 @@ impl Default for EpicEnginesBox { impl EpicEnginesBox { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn setup_messaging(&self) { @@ -280,10 +268,15 @@ impl EpicEnginesBox { Cmp::Gt | Cmp::Ne => gtk4::Ordering::Smaller, }) }); - let sorted_model = gtk4::SortListModel::new(Some(&self_.grid_model), Some(&sorter)); - let selection_model = gtk4::SingleSelection::new(Some(&sorted_model)); - selection_model.set_autoselect(false); - selection_model.set_can_unselect(true); + let sorted_model = gtk4::SortListModel::builder() + .model(&self_.grid_model) + .sorter(&sorter) + .build(); + let selection_model = gtk4::SingleSelection::builder() + .model(&sorted_model) + .autoselect(false) + .can_unselect(true) + .build(); self_.engine_grid.set_model(Some(&selection_model)); self_.engine_grid.set_factory(Some(&factory)); @@ -531,9 +524,13 @@ impl EpicEnginesBox { }; if let Ok(keys) = ini.keys("Installations") { - for item in keys.0 { - if let Ok(path) = ini.value("Installations", &item) { - let guid: String = item.chars().filter(|c| c != &'{' && c != &'}').collect(); + for item in keys { + if let Ok(path) = ini.value("Installations", item.to_str()) { + let guid: String = item + .to_string() + .chars() + .filter(|c| c != &'{' && c != &'}') + .collect(); debug!("Got engine install: {} in {}", guid, path); match path.to_string().strip_suffix('/') { None => { diff --git a/src/ui/widgets/logged_in/library/actions/add_to_project.rs b/src/ui/widgets/logged_in/library/actions/add_to_project.rs index e4d4635..8a5c1a1 100644 --- a/src/ui/widgets/logged_in/library/actions/add_to_project.rs +++ b/src/ui/widgets/logged_in/library/actions/add_to_project.rs @@ -64,7 +64,7 @@ pub mod imp { impl ObjectImpl for EpicAddToProject { fn constructed(&self) { self.parent_constructed(); - self.instance().setup_actions(); + self.obj().setup_actions(); } fn signals() -> &'static [gtk4::glib::subclass::Signal] { @@ -79,15 +79,8 @@ pub mod imp { fn properties() -> &'static [glib::ParamSpec] { use once_cell::sync::Lazy; - static PROPERTIES: Lazy> = Lazy::new(|| { - vec![glib::ParamSpecString::new( - "selected-version", - "selected_version", - "selected_version", - None, // Default value - glib::ParamFlags::READWRITE, - )] - }); + static PROPERTIES: Lazy> = + Lazy::new(|| vec![glib::ParamSpecString::builder("selected-version").build()]); PROPERTIES.as_ref() } @@ -129,7 +122,7 @@ impl Default for EpicAddToProject { impl EpicAddToProject { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn set_window(&self, window: &crate::window::EpicAssetManagerWindow) { diff --git a/src/ui/widgets/logged_in/library/actions/create_asset_project.rs b/src/ui/widgets/logged_in/library/actions/create_asset_project.rs index cde4079..54d7835 100644 --- a/src/ui/widgets/logged_in/library/actions/create_asset_project.rs +++ b/src/ui/widgets/logged_in/library/actions/create_asset_project.rs @@ -66,7 +66,7 @@ pub mod imp { impl ObjectImpl for EpicCreateAssetProject { fn constructed(&self) { self.parent_constructed(); - let obj = self.instance(); + let obj = self.obj(); obj.setup_actions(); obj.set_target_directories(); } @@ -85,20 +85,8 @@ pub mod imp { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - glib::ParamSpecString::new( - "selected-version", - "selected_version", - "selected_version", - None, // Default value - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecString::new( - "project-name", - "Project Name", - "Project Name", - None, // Default value - glib::ParamFlags::READWRITE, - ), + glib::ParamSpecString::builder("selected-version").build(), + glib::ParamSpecString::builder("project-name").build(), ] }); @@ -149,7 +137,7 @@ impl Default for EpicCreateAssetProject { impl EpicCreateAssetProject { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn set_target_directories(&self) { diff --git a/src/ui/widgets/logged_in/library/actions/download_detail.rs b/src/ui/widgets/logged_in/library/actions/download_detail.rs index 6fd4dae..c0c758d 100644 --- a/src/ui/widgets/logged_in/library/actions/download_detail.rs +++ b/src/ui/widgets/logged_in/library/actions/download_detail.rs @@ -55,7 +55,7 @@ pub mod imp { impl ObjectImpl for EpicDownloadDetails { fn constructed(&self) { self.parent_constructed(); - let obj = self.instance(); + let obj = self.obj(); obj.setup_actions(); obj.set_target_directories(); } @@ -72,15 +72,8 @@ pub mod imp { fn properties() -> &'static [glib::ParamSpec] { use once_cell::sync::Lazy; - static PROPERTIES: Lazy> = Lazy::new(|| { - vec![glib::ParamSpecString::new( - "selected-version", - "selected_version", - "selected_version", - None, // Default value - glib::ParamFlags::READWRITE, - )] - }); + static PROPERTIES: Lazy> = + Lazy::new(|| vec![glib::ParamSpecString::builder("selected-version").build()]); PROPERTIES.as_ref() } @@ -122,7 +115,7 @@ impl Default for EpicDownloadDetails { impl EpicDownloadDetails { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn set_target_directories(&self) { diff --git a/src/ui/widgets/logged_in/library/actions/local_asset.rs b/src/ui/widgets/logged_in/library/actions/local_asset.rs index 1316461..206fc19 100644 --- a/src/ui/widgets/logged_in/library/actions/local_asset.rs +++ b/src/ui/widgets/logged_in/library/actions/local_asset.rs @@ -44,7 +44,7 @@ pub mod imp { impl ObjectImpl for EpicLocalAsset { fn constructed(&self) { self.parent_constructed(); - self.instance().setup_actions(); + self.obj().setup_actions(); } fn signals() -> &'static [glib::subclass::Signal] { @@ -61,20 +61,8 @@ pub mod imp { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - glib::ParamSpecString::new( - "label", - "label", - "label", - None, // Default value - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecString::new( - "path", - "path", - "path", - None, // Default value - glib::ParamFlags::READWRITE, - ), + glib::ParamSpecString::builder("label").build(), + glib::ParamSpecString::builder("path").build(), ] }); @@ -89,7 +77,7 @@ pub mod imp { .expect("type conformity checked by `Object::set_property`"); let formatted = label.as_ref().map(|l| format!("{l}")); self.label.replace(formatted); - self.instance().set_property("path", label); + self.obj().set_property("path", label); } "path" => { let path = value @@ -127,7 +115,7 @@ impl Default for EpicLocalAsset { impl EpicLocalAsset { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn setup_actions(&self) { diff --git a/src/ui/widgets/logged_in/library/actions/manage_local_assets.rs b/src/ui/widgets/logged_in/library/actions/manage_local_assets.rs index 8a54969..28a4f84 100644 --- a/src/ui/widgets/logged_in/library/actions/manage_local_assets.rs +++ b/src/ui/widgets/logged_in/library/actions/manage_local_assets.rs @@ -91,7 +91,7 @@ impl Default for EpicLocalAssets { impl EpicLocalAssets { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn set_asset(&self, asset: &egs_api::api::types::asset_info::AssetInfo) { diff --git a/src/ui/widgets/logged_in/library/actions/mod.rs b/src/ui/widgets/logged_in/library/actions/mod.rs index 090e58d..b49f477 100644 --- a/src/ui/widgets/logged_in/library/actions/mod.rs +++ b/src/ui/widgets/logged_in/library/actions/mod.rs @@ -133,7 +133,7 @@ pub mod imp { fn constructed(&self) { self.parent_constructed(); self.details_group.add_widget(&*self.version_label); - let obj = self.instance(); + let obj = self.obj(); obj.setup_actions(); obj.setup_events(); } @@ -152,41 +152,11 @@ pub mod imp { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - glib::ParamSpecString::new( - "selected-version", - "selected_version", - "selected_version", - None, // Default value - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecString::new( - "supported-versions", - "supported_versions", - "supported_versions", - None, // Default value - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecString::new( - "platforms", - "platforms", - "platforms", - None, // Default value - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecString::new( - "release-date", - "release_date", - "release_date", - None, // Default value - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecString::new( - "release-notes", - "release_notes", - "release_notes", - None, // Default value - glib::ParamFlags::READWRITE, - ), + glib::ParamSpecString::builder("selected-version").build(), + glib::ParamSpecString::builder("supported-versions").build(), + glib::ParamSpecString::builder("platforms").build(), + glib::ParamSpecString::builder("release-date").build(), + glib::ParamSpecString::builder("release-notes").build(), ] }); @@ -258,7 +228,7 @@ impl Default for EpicAssetActions { impl EpicAssetActions { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn set_window(&self, window: &crate::window::EpicAssetManagerWindow) { diff --git a/src/ui/widgets/logged_in/library/asset.rs b/src/ui/widgets/logged_in/library/asset.rs index 9c3e022..18c51c4 100644 --- a/src/ui/widgets/logged_in/library/asset.rs +++ b/src/ui/widgets/logged_in/library/asset.rs @@ -61,41 +61,11 @@ pub mod imp { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - glib::ParamSpecString::new( - "label", - "Label", - "Label", - None, // Default value - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecString::new( - "id", - "ID", - "ID", - None, // Default value - glib::ParamFlags::READWRITE, - ), - ParamSpecObject::new( - "thumbnail", - "Thumbnail", - "Thumbnail", - Texture::static_type(), - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecBoolean::new( - "favorite", - "favorite", - "Is favorite", - false, - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecBoolean::new( - "downloaded", - "downloaded", - "Is Downloaded", - false, - glib::ParamFlags::READWRITE, - ), + glib::ParamSpecString::builder("label").build(), + glib::ParamSpecString::builder("id").build(), + ParamSpecObject::builder::("thumbnail").build(), + glib::ParamSpecBoolean::builder("favorite").build(), + glib::ParamSpecBoolean::builder("downloaded").build(), ] }); @@ -176,7 +146,7 @@ impl Default for EpicAsset { impl EpicAsset { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn set_data(&self, data: &crate::models::asset_data::AssetData) { diff --git a/src/ui/widgets/logged_in/library/asset_detail.rs b/src/ui/widgets/logged_in/library/asset_detail.rs index 7c22b1b..e6847b1 100644 --- a/src/ui/widgets/logged_in/library/asset_detail.rs +++ b/src/ui/widgets/logged_in/library/asset_detail.rs @@ -108,29 +108,18 @@ pub mod imp { impl ObjectImpl for EpicAssetDetails { fn constructed(&self) { self.parent_constructed(); - self.instance().setup_actions(); + self.obj().setup_actions(); } fn properties() -> &'static [ParamSpec] { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - ParamSpecBoolean::new( - "expanded", - "expanded", - "Is expanded", - false, - glib::ParamFlags::READWRITE, - ), - ParamSpecUInt::new( - "position", - "position", - "item_position", - 0, - u32::MAX, - 0, - glib::ParamFlags::READWRITE, - ), + ParamSpecBoolean::builder("expanded").build(), + ParamSpecUInt::builder("position") + .minimum(0) + .default_value(0) + .build(), ] }); PROPERTIES.as_ref() @@ -176,7 +165,7 @@ impl Default for EpicAssetDetails { impl EpicAssetDetails { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn set_window(&self, window: &crate::window::EpicAssetManagerWindow) { diff --git a/src/ui/widgets/logged_in/library/image_stack.rs b/src/ui/widgets/logged_in/library/image_stack.rs index 9ec8306..0e00c2a 100644 --- a/src/ui/widgets/logged_in/library/image_stack.rs +++ b/src/ui/widgets/logged_in/library/image_stack.rs @@ -68,22 +68,15 @@ pub mod imp { impl ObjectImpl for EpicImageOverlay { fn constructed(&self) { self.parent_constructed(); - let obj = self.instance(); + let obj = self.obj(); obj.setup_actions(); obj.setup_receiver(); } fn properties() -> &'static [glib::ParamSpec] { use once_cell::sync::Lazy; - static PROPERTIES: Lazy> = Lazy::new(|| { - vec![glib::ParamSpecString::new( - "asset", - "Asset", - "Asset", - None, // Default value - glib::ParamFlags::READWRITE, - )] - }); + static PROPERTIES: Lazy> = + Lazy::new(|| vec![glib::ParamSpecString::builder("asset").build()]); PROPERTIES.as_ref() } @@ -132,7 +125,7 @@ pub enum Msg { impl EpicImageOverlay { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn clear(&self) { diff --git a/src/ui/widgets/logged_in/library/mod.rs b/src/ui/widgets/logged_in/library/mod.rs index 8cd5ab6..752e782 100644 --- a/src/ui/widgets/logged_in/library/mod.rs +++ b/src/ui/widgets/logged_in/library/mod.rs @@ -100,8 +100,14 @@ pub mod imp { actions: gio::SimpleActionGroup::new(), window: OnceCell::new(), download_manager: OnceCell::new(), - filter_model: gtk4::FilterListModel::new(gio::ListModel::NONE, gtk4::Filter::NONE), - sorter_model: gtk4::SortListModel::new(gio::ListModel::NONE, gtk4::Sorter::NONE), + filter_model: gtk4::FilterListModel::new( + gio::ListModel::NONE.cloned(), + gtk4::Filter::NONE.cloned(), + ), + sorter_model: gtk4::SortListModel::new( + gio::ListModel::NONE.cloned(), + gtk4::Sorter::NONE.cloned(), + ), grid_model: gio::ListStore::new(crate::models::asset_data::AssetData::static_type()), loaded_assets: RefCell::new(HashMap::new()), loaded_data: RefCell::new(HashMap::new()), @@ -134,53 +140,19 @@ pub mod imp { static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - ParamSpecBoolean::new( - "sidebar-expanded", - "sidebar expanded", - "Is Sidebar expanded", - false, - glib::ParamFlags::READWRITE, - ), - ParamSpecUInt::new( - "to-load", - "to load", - "Assets to load", - 0, - u32::MAX, - 0, - glib::ParamFlags::READWRITE, - ), - ParamSpecUInt::new( - "loaded", - "loaded", - "Assets to load", - 0, - u32::MAX, - 0, - glib::ParamFlags::READWRITE, - ), - ParamSpecString::new( - "filter", - "Filter", - "Filter", - None, - glib::ParamFlags::READWRITE, - ), - ParamSpecString::new( - "search", - "Search", - "Search", - None, - glib::ParamFlags::READWRITE, - ), - ParamSpecString::new("item", "item", "item", None, glib::ParamFlags::READWRITE), - ParamSpecString::new( - "product", - "product", - "product", - None, - glib::ParamFlags::READWRITE, - ), + ParamSpecBoolean::builder("sidebar-expanded").build(), + ParamSpecUInt::builder("to-load") + .minimum(0) + .default_value(0) + .build(), + ParamSpecUInt::builder("loaded") + .minimum(0) + .default_value(0) + .build(), + ParamSpecString::builder("filter").build(), + ParamSpecString::builder("search").build(), + ParamSpecString::builder("item").build(), + ParamSpecString::builder("product").build(), ] }); PROPERTIES.as_ref() @@ -202,24 +174,24 @@ pub mod imp { let filter: Option = value.get().unwrap(); self.filter.replace(filter.filter(|f| !f.is_empty())); - self.instance().apply_filter(); + self.obj().apply_filter(); } "search" => { let search: Option = value.get().unwrap(); self.search.replace(search.filter(|f| !f.is_empty())); - self.instance().apply_filter(); + self.obj().apply_filter(); } "item" => { let item = value.get().unwrap(); self.product.replace(None); self.item.replace(item); - self.instance().open_asset(); + self.obj().open_asset(); } "product" => { let product = value.get().unwrap(); self.item.replace(None); self.product.replace(product); - self.instance().open_asset(); + self.obj().open_asset(); } _ => unimplemented!(), } @@ -240,7 +212,7 @@ pub mod imp { fn constructed(&self) { self.parent_constructed(); - let obj = self.instance(); + let obj = self.obj(); obj.bind_properties(); obj.setup_actions(); obj.setup_widgets(); @@ -264,7 +236,7 @@ impl Default for EpicLibraryBox { impl EpicLibraryBox { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn set_download_manager( @@ -314,9 +286,11 @@ impl EpicLibraryBox { self_ .sorter_model .set_sorter(Some(&Self::sorter("name", true))); - let selection_model = gtk4::SingleSelection::new(Some(&self_.sorter_model)); - selection_model.set_autoselect(false); - selection_model.set_can_unselect(true); + let selection_model = gtk4::SingleSelection::builder() + .model(&self_.sorter_model) + .autoselect(false) + .can_unselect(true) + .build(); self_.asset_grid.set_model(Some(&selection_model)); self_.asset_grid.set_factory(Some(&factory)); diff --git a/src/ui/widgets/logged_in/library/sidebar/button.rs b/src/ui/widgets/logged_in/library/sidebar/button.rs index 906905e..8f408c8 100644 --- a/src/ui/widgets/logged_in/library/sidebar/button.rs +++ b/src/ui/widgets/logged_in/library/sidebar/button.rs @@ -9,7 +9,7 @@ pub mod imp { use crate::models::category_data::CategoryData; use glib::ParamSpec; use gtk4::glib::{ParamSpecBoolean, ParamSpecString}; - use gtk4::{gio, gio::ListStore, SingleSelection}; + use gtk4::{gio, gio::ListStore}; use once_cell::sync::OnceCell; use std::cell::RefCell; @@ -28,7 +28,6 @@ pub mod imp { #[template_child] pub separator: TemplateChild, pub categories: ListStore, - pub selection_model: SingleSelection, } #[glib::object_subclass] @@ -49,7 +48,6 @@ pub mod imp { category_button: TemplateChild::default(), separator: TemplateChild::default(), categories: ListStore::new(CategoryData::static_type()), - selection_model: SingleSelection::new(None::<>k4::SortListModel>), } } @@ -68,41 +66,11 @@ pub mod imp { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - ParamSpecString::new( - "tooltip-text", - "tooltip text", - "The category name", - None, - glib::ParamFlags::READWRITE, - ), - ParamSpecString::new( - "path", - "path", - "The category path", - None, - glib::ParamFlags::READWRITE, - ), - ParamSpecString::new( - "icon-name", - "icon name", - "The Icon Name", - None, - glib::ParamFlags::READWRITE, - ), - ParamSpecString::new( - "filter", - "Filter", - "Filter", - None, - glib::ParamFlags::READWRITE, - ), - ParamSpecBoolean::new( - "expanded", - "expanded", - "Is expanded", - false, - glib::ParamFlags::READWRITE, - ), + ParamSpecString::builder("tooltip-text").build(), + ParamSpecString::builder("path").build(), + ParamSpecString::builder("icon-name").build(), + ParamSpecString::builder("filter").build(), + ParamSpecBoolean::builder("expanded").build(), ] }); PROPERTIES.as_ref() @@ -149,7 +117,7 @@ pub mod imp { fn constructed(&self) { self.parent_constructed(); - self.instance().setup_actions(); + self.obj().setup_actions(); } } @@ -170,7 +138,7 @@ impl Default for EpicSidebarButton { impl EpicSidebarButton { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn set_sidebar( diff --git a/src/ui/widgets/logged_in/library/sidebar/categories.rs b/src/ui/widgets/logged_in/library/sidebar/categories.rs index 9b920e4..bffb7b4 100644 --- a/src/ui/widgets/logged_in/library/sidebar/categories.rs +++ b/src/ui/widgets/logged_in/library/sidebar/categories.rs @@ -51,7 +51,7 @@ pub mod imp { actions: gio::SimpleActionGroup::new(), categories: TemplateChild::default(), cats: ListStore::new(CategoryData::static_type()), - selection_model: SingleSelection::new(None::<>k4::SortListModel>), + selection_model: SingleSelection::new(None::), categories_set: RefCell::new(HashSet::new()), previous: TemplateChild::default(), } @@ -72,35 +72,11 @@ pub mod imp { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - ParamSpecString::new( - "title", - "title", - "The category title", - None, - glib::ParamFlags::READWRITE, - ), - ParamSpecString::new( - "icon-name", - "icon name", - "The Icon Name", - None, - glib::ParamFlags::READWRITE, - ), - ParamSpecString::new("path", "Path", "Path", None, glib::ParamFlags::READWRITE), - ParamSpecString::new( - "filter", - "Filter", - "Filter", - None, - glib::ParamFlags::READWRITE, - ), - ParamSpecBoolean::new( - "expanded", - "expanded", - "Is expanded", - false, - glib::ParamFlags::READWRITE, - ), + ParamSpecString::builder("title").build(), + ParamSpecString::builder("icon-name").build(), + ParamSpecString::builder("path").build(), + ParamSpecString::builder("filter").build(), + ParamSpecBoolean::builder("expanded").build(), ] }); PROPERTIES.as_ref() @@ -115,7 +91,7 @@ pub mod imp { "path" => { let path: Option = value.get().unwrap(); self.path.replace(path); - self.instance().has_previous(); + self.obj().has_previous(); } "filter" => { let filter = value.get().unwrap(); @@ -146,7 +122,7 @@ pub mod imp { fn constructed(&self) { self.parent_constructed(); - let obj = self.instance(); + let obj = self.obj(); obj.setup_actions(); obj.setup_categories(); } @@ -174,7 +150,7 @@ impl EpicSidebarCategories { filter: Option<&str>, sidebar: Option<&crate::ui::widgets::logged_in::library::sidebar::EpicSidebar>, ) -> Self { - let stack: Self = glib::Object::new(&[]); + let stack: Self = glib::Object::new(); stack.set_property("title", title); stack.set_property("path", path); @@ -297,7 +273,10 @@ impl EpicSidebarCategories { } }); - let sorted_model = gtk4::SortListModel::new(Some(&self_.cats), Some(&sorter)); + let sorted_model = gtk4::SortListModel::builder() + .model(&self_.cats) + .sorter(&sorter) + .build(); self_.selection_model.set_model(Some(&sorted_model)); self_.selection_model.set_autoselect(false); self_.selection_model.set_can_unselect(true); diff --git a/src/ui/widgets/logged_in/library/sidebar/category.rs b/src/ui/widgets/logged_in/library/sidebar/category.rs index e5f51a5..73988ae 100644 --- a/src/ui/widgets/logged_in/library/sidebar/category.rs +++ b/src/ui/widgets/logged_in/library/sidebar/category.rs @@ -53,34 +53,10 @@ pub mod imp { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - ParamSpecString::new( - "title", - "title", - "The category title", - None, - glib::ParamFlags::READWRITE, - ), - ParamSpecString::new( - "icon-name", - "icon name", - "The Icon Name", - None, - glib::ParamFlags::READWRITE, - ), - ParamSpecString::new( - "filter", - "Filter", - "Filter", - None, - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecBoolean::new( - "leaf", - "Leaf", - "Is leaf", - false, - glib::ParamFlags::READWRITE, - ), + ParamSpecString::builder("title").build(), + ParamSpecString::builder("icon-name").build(), + ParamSpecString::builder("filter").build(), + glib::ParamSpecBoolean::builder("leaf").build(), ] }); PROPERTIES.as_ref() @@ -138,6 +114,6 @@ impl Default for EpicSidebarCategory { impl EpicSidebarCategory { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } } diff --git a/src/ui/widgets/logged_in/library/sidebar/mod.rs b/src/ui/widgets/logged_in/library/sidebar/mod.rs index f76cda4..8c71841 100644 --- a/src/ui/widgets/logged_in/library/sidebar/mod.rs +++ b/src/ui/widgets/logged_in/library/sidebar/mod.rs @@ -90,7 +90,7 @@ pub mod imp { impl ObjectImpl for EpicSidebar { fn constructed(&self) { self.parent_constructed(); - let obj = self.instance(); + let obj = self.obj(); obj.setup_actions(); self.all_category.set_sidebar(&obj); self.unreal_category.set_sidebar(&obj); @@ -101,15 +101,8 @@ pub mod imp { fn properties() -> &'static [ParamSpec] { use once_cell::sync::Lazy; - static PROPERTIES: Lazy> = Lazy::new(|| { - vec![ParamSpecBoolean::new( - "expanded", - "sidebar expanded", - "Is Sidebar expanded", - false, - glib::ParamFlags::READWRITE, - )] - }); + static PROPERTIES: Lazy> = + Lazy::new(|| vec![ParamSpecBoolean::builder("expanded").build()]); PROPERTIES.as_ref() } @@ -148,7 +141,7 @@ impl Default for EpicSidebar { impl EpicSidebar { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn set_window(&self, window: &crate::window::EpicAssetManagerWindow) { diff --git a/src/ui/widgets/logged_in/log_line.rs b/src/ui/widgets/logged_in/log_line.rs index 71b5570..da2a5b2 100644 --- a/src/ui/widgets/logged_in/log_line.rs +++ b/src/ui/widgets/logged_in/log_line.rs @@ -47,7 +47,7 @@ pub mod imp { impl ObjectImpl for EpicLogLine { fn constructed(&self) { self.parent_constructed(); - self.instance().setup_actions(); + self.obj().setup_actions(); } fn signals() -> &'static [glib::subclass::Signal] { @@ -64,27 +64,9 @@ pub mod imp { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - glib::ParamSpecString::new( - "label", - "label", - "label", - None, // Default value - glib::ParamFlags::READWRITE, - ), - glib::ParamSpecString::new( - "path", - "path", - "path", - None, // Default value - glib::ParamFlags::READWRITE, - ), - ParamSpecBoolean::new( - "crash", - "crash", - "Is Crash", - false, - glib::ParamFlags::READWRITE, - ), + glib::ParamSpecString::builder("label").build(), + glib::ParamSpecString::builder("path").build(), + ParamSpecBoolean::builder("crash").build(), ] }); @@ -141,7 +123,7 @@ impl Default for EpicLogLine { impl EpicLogLine { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn setup_actions(&self) { @@ -189,12 +171,7 @@ impl EpicLogLine { if let Ok(dir) = std::fs::File::open(&p) { let ctx = glib::MainContext::default(); ctx.spawn_local(clone!(@weak self as asset_details => async move { - ashpd::desktop::open_uri::open_file( - &ashpd::WindowIdentifier::default(), - &dir, - false, - false - ) + ashpd::desktop::open_uri::OpenFileRequest::default().send_file(&dir) .await.unwrap(); })); }; diff --git a/src/ui/widgets/logged_in/logs.rs b/src/ui/widgets/logged_in/logs.rs index b7159f3..734a40e 100644 --- a/src/ui/widgets/logged_in/logs.rs +++ b/src/ui/widgets/logged_in/logs.rs @@ -84,7 +84,7 @@ pub mod imp { impl ObjectImpl for EpicLogs { fn constructed(&self) { self.parent_constructed(); - self.instance().setup_messaging(); + self.obj().setup_messaging(); } } @@ -105,7 +105,7 @@ impl Default for EpicLogs { impl EpicLogs { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn setup_messaging(&self) { @@ -169,8 +169,11 @@ impl EpicLogs { Self::populate_model(item); }); - let sorter_model = gtk4::SortListModel::new(Some(&self_.model), Some(&Self::sorter())); - let selection_model = gtk4::NoSelection::new(Some(&sorter_model)); + let sorter_model = gtk4::SortListModel::builder() + .model(&self_.model) + .sorter(&Self::sorter()) + .build(); + let selection_model = gtk4::NoSelection::new(Some(sorter_model)); self_.logs.set_model(Some(&selection_model)); self_.logs.set_factory(Some(&factory)); } diff --git a/src/ui/widgets/logged_in/mod.rs b/src/ui/widgets/logged_in/mod.rs index 56c5a0d..4e1e65c 100644 --- a/src/ui/widgets/logged_in/mod.rs +++ b/src/ui/widgets/logged_in/mod.rs @@ -76,21 +76,9 @@ pub mod imp { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - ParamSpecString::new("item", "item", "item", None, glib::ParamFlags::READWRITE), - ParamSpecString::new( - "product", - "product", - "product", - None, - glib::ParamFlags::READWRITE, - ), - ParamSpecObject::new( - "stack", - "Stack", - "Stack", - adw::ViewStack::static_type(), - glib::ParamFlags::READWRITE, - ), + ParamSpecString::builder("item").build(), + ParamSpecString::builder("product").build(), + ParamSpecObject::builder::("stack").build(), ] }); PROPERTIES.as_ref() @@ -143,7 +131,7 @@ impl Default for EpicLoggedInBox { impl EpicLoggedInBox { pub fn new() -> Self { - glib::Object::new::(&[]) + glib::Object::new() } pub fn set_window(&self, window: &crate::window::EpicAssetManagerWindow) { diff --git a/src/ui/widgets/logged_in/plugins.rs b/src/ui/widgets/logged_in/plugins.rs index 4fa7b9b..a747935 100644 --- a/src/ui/widgets/logged_in/plugins.rs +++ b/src/ui/widgets/logged_in/plugins.rs @@ -75,7 +75,7 @@ impl Default for EpicPlugins { impl EpicPlugins { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn set_window(&self, window: &crate::window::EpicAssetManagerWindow) { diff --git a/src/ui/widgets/logged_in/projects/mod.rs b/src/ui/widgets/logged_in/projects/mod.rs index c68deca..e9a46ab 100644 --- a/src/ui/widgets/logged_in/projects/mod.rs +++ b/src/ui/widgets/logged_in/projects/mod.rs @@ -85,7 +85,7 @@ pub mod imp { impl ObjectImpl for EpicProjectsBox { fn constructed(&self) { self.parent_constructed(); - let obj = self.instance(); + let obj = self.obj(); obj.setup_actions(); obj.setup_messaging(); } @@ -94,20 +94,8 @@ pub mod imp { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - ParamSpecBoolean::new( - "expanded", - "expanded", - "Is expanded", - false, - glib::ParamFlags::READWRITE, - ), - ParamSpecString::new( - "selected", - "Selected", - "Selected", - None, - glib::ParamFlags::READWRITE, - ), + ParamSpecBoolean::builder("expanded").build(), + ParamSpecString::builder("selected").build(), ] }); PROPERTIES.as_ref() @@ -153,7 +141,7 @@ impl Default for EpicProjectsBox { impl EpicProjectsBox { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn setup_messaging(&self) { @@ -227,10 +215,15 @@ impl EpicProjectsBox { .into(), } }); - let sorted_model = gtk4::SortListModel::new(Some(&self_.grid_model), Some(&sorter)); - let selection_model = gtk4::SingleSelection::new(Some(&sorted_model)); - selection_model.set_autoselect(false); - selection_model.set_can_unselect(true); + let sorted_model = gtk4::SortListModel::builder() + .model(&self_.grid_model) + .sorter(&sorter) + .build(); + let selection_model = gtk4::SingleSelection::builder() + .model(&sorted_model) + .autoselect(false) + .can_unselect(true) + .build(); selection_model.connect_selected_notify(clone!(@weak self as projects => move |model| { projects.project_selected(model); diff --git a/src/ui/widgets/logged_in/projects/project.rs b/src/ui/widgets/logged_in/projects/project.rs index 01fe360..cda790e 100644 --- a/src/ui/widgets/logged_in/projects/project.rs +++ b/src/ui/widgets/logged_in/projects/project.rs @@ -65,14 +65,8 @@ pub mod imp { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - ParamSpecString::new("name", "Name", "Name", None, glib::ParamFlags::READWRITE), - ParamSpecString::new( - "engine", - "Engine", - "Engine", - None, - glib::ParamFlags::READWRITE, - ), + ParamSpecString::builder("name").build(), + ParamSpecString::builder("engine").build(), ] }); PROPERTIES.as_ref() @@ -124,7 +118,7 @@ impl Default for EpicProject { impl EpicProject { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn set_window(&self, window: &crate::window::EpicAssetManagerWindow) { diff --git a/src/ui/widgets/logged_in/projects/project_detail.rs b/src/ui/widgets/logged_in/projects/project_detail.rs index 9dbe899..702dc3f 100644 --- a/src/ui/widgets/logged_in/projects/project_detail.rs +++ b/src/ui/widgets/logged_in/projects/project_detail.rs @@ -89,23 +89,12 @@ pub mod imp { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - ParamSpecBoolean::new( - "expanded", - "expanded", - "Is expanded", - false, - glib::ParamFlags::READWRITE, - ), - ParamSpecString::new("path", "Path", "Path", None, glib::ParamFlags::READWRITE), - ParamSpecUInt::new( - "position", - "position", - "item_position", - 0, - u32::MAX, - 0, - glib::ParamFlags::READWRITE, - ), + ParamSpecBoolean::builder("expanded").build(), + ParamSpecString::builder("path").build(), + ParamSpecUInt::builder("position") + .minimum(0) + .default_value(0) + .build(), ] }); PROPERTIES.as_ref() @@ -140,7 +129,7 @@ pub mod imp { fn constructed(&self) { self.parent_constructed(); - self.instance().setup_actions(); + self.obj().setup_actions(); } } @@ -161,7 +150,7 @@ impl Default for UnrealProjectDetails { impl UnrealProjectDetails { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn setup_actions(&self) { @@ -205,30 +194,31 @@ impl UnrealProjectDetails { if let Ok(mut conn) = db.get() { diesel::replace_into(unreal_project_latest_engine::table) .values(( - crate::schema::unreal_project_latest_engine::project.eq(path.clone()), - crate::schema::unreal_project_latest_engine::engine.eq(eng.path), + unreal_project_latest_engine::project.eq(path.clone()), + unreal_project_latest_engine::engine.eq(eng.path), )) .execute(&mut conn) .expect("Unable to insert last engine to the DB"); }; - let context = gtk4::gio::AppLaunchContext::new(); + let context = gio::AppLaunchContext::new(); context.setenv("GLIBC_TUNABLES", "glibc.rtld.dynamic_sort=2"); - let app = gtk4::gio::AppInfo::create_from_commandline( - if ashpd::is_sandboxed() { - format!( - "flatpak-spawn --env='GLIBC_TUNABLES=glibc.rtld.dynamic_sort=2' --host \"{}\" \"{}\"", - p.to_str().unwrap(), - path - ) - } else { - format!("\"{p:?}\" \"{path}\"") - }, - Some("Unreal Engine"), - gtk4::gio::AppInfoCreateFlags::NONE, - ) - .unwrap(); - app.launch(&[], Some(&context)) - .expect("Failed to launch application"); + let ctx = glib::MainContext::default(); + ctx.spawn_local(async move { + let app = gio::AppInfo::create_from_commandline( + if ashpd::is_sandboxed().await { + format!( + "flatpak-spawn --env='GLIBC_TUNABLES=glibc.rtld.dynamic_sort=2' --host \"{}\" \"{}\"", + p.to_str().unwrap(), + path + ) + } else { + format!("\"{p:?}\" \"{path}\"") + }, + Some("Unreal Engine"), + gio::AppInfoCreateFlags::NONE, + ).unwrap(); + app.launch(&[], Some(&context)).expect("Failed to launch application"); + }); } }; let self_ = self.imp(); @@ -269,11 +259,7 @@ impl UnrealProjectDetails { self_.confirmation_revealer.set_vexpand_set(false); } - pub fn set_project( - &self, - project: &crate::models::project_data::Uproject, - path: Option, - ) { + pub fn set_project(&self, project: &Uproject, path: Option) { let self_ = self.imp(); self.show_details(); self.set_property("path", &path); @@ -301,7 +287,7 @@ impl UnrealProjectDetails { } // Engine - let combo = gtk4::ComboBoxText::new(); + let combo = ComboBoxText::new(); let associated = self.associated_engine(project); self.set_launch_enabled(false); let db = crate::models::database::connection(); @@ -309,11 +295,8 @@ impl UnrealProjectDetails { if let Ok(mut conn) = db.get() { let engines: Result = unreal_project_latest_engine::table - .filter( - crate::schema::unreal_project_latest_engine::project - .eq(&self.path().unwrap()), - ) - .select(crate::schema::unreal_project_latest_engine::engine) + .filter(unreal_project_latest_engine::project.eq(&self.path().unwrap())) + .select(unreal_project_latest_engine::engine) .first(&mut conn); if let Ok(last) = engines { last_engine = Some(last); @@ -414,7 +397,7 @@ impl UnrealProjectDetails { } } - fn engine_selected(&self, combo: >k4::ComboBoxText) { + fn engine_selected(&self, combo: &ComboBoxText) { if let Some(eng) = combo.active_id() { let self_ = self.imp(); for engine in self.available_engines() { diff --git a/src/ui/widgets/preferences/dir_row.rs b/src/ui/widgets/preferences/dir_row.rs index fecce7b..abbb08b 100644 --- a/src/ui/widgets/preferences/dir_row.rs +++ b/src/ui/widgets/preferences/dir_row.rs @@ -75,7 +75,7 @@ glib::wrapper! { impl DirectoryRow { pub fn new(dir: &str, window: &crate::ui::widgets::preferences::PreferencesWindow) -> Self { - let row: Self = glib::Object::new(&[]); + let row: Self = glib::Object::new(); adw::prelude::PreferencesRowExt::set_title(&row, dir); let self_ = row.imp(); self_.window.set(window.clone()).unwrap(); diff --git a/src/ui/widgets/preferences/mod.rs b/src/ui/widgets/preferences/mod.rs index aa5f30e..8767213 100644 --- a/src/ui/widgets/preferences/mod.rs +++ b/src/ui/widgets/preferences/mod.rs @@ -103,7 +103,7 @@ pub mod imp { impl ObjectImpl for PreferencesWindow { fn constructed(&self) { self.parent_constructed(); - let obj = self.instance(); + let obj = self.obj(); obj.bind_settings(); obj.load_settings(); obj.setup_actions(); @@ -138,7 +138,7 @@ impl Default for PreferencesWindow { impl PreferencesWindow { pub fn new() -> Self { - glib::Object::new(&[]) + glib::Object::new() } pub fn set_window(&self, window: &crate::window::EpicAssetManagerWindow) { @@ -554,11 +554,7 @@ impl PreferencesWindow { current.push(gtk4::glib::GString::from(n.clone())); self.add_directory_row(widget, n, kind); } - let new: Vec<&str> = current.iter().map(gtk4::glib::GString::as_str).collect(); - self_ - .settings - .set_strv(setting_name, new.as_slice()) - .unwrap(); + self_.settings.set_strv(setting_name, current).unwrap(); } } DirectoryConfigType::Games => {} diff --git a/src/ui/widgets/progress_icon.rs b/src/ui/widgets/progress_icon.rs index 6f9a401..0d81696 100644 --- a/src/ui/widgets/progress_icon.rs +++ b/src/ui/widgets/progress_icon.rs @@ -35,29 +35,14 @@ pub mod imp { fn properties() -> &'static [glib::ParamSpec] { static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - ParamSpecFloat::new( - "fraction", - "Progress", - "Progress of the icon", - 0.0, - 1.0, - 0.0, - glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY, - ), - glib::ParamSpecBoolean::new( - "inverted", - "Inverted", - "Invert icon colors", - false, - glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY, - ), - glib::ParamSpecBoolean::new( - "clockwise", - "Clockwise", - "Direction of the icon", - false, - glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY, - ), + ParamSpecFloat::builder("fraction") + .maximum(1.0) + .default_value(0.0) + .explicit_notify() + .readwrite() + .build(), + glib::ParamSpecBoolean::builder("inverted").build(), + glib::ParamSpecBoolean::builder("clockwise").build(), ] }); PROPERTIES.as_ref() @@ -65,18 +50,18 @@ pub mod imp { fn property(&self, _id: usize, pspec: &glib::ParamSpec) -> glib::Value { match pspec.name() { - "fraction" => self.instance().fraction().to_value(), - "inverted" => self.instance().inverted().to_value(), - "clockwise" => self.instance().clockwise().to_value(), + "fraction" => self.obj().fraction().to_value(), + "inverted" => self.obj().inverted().to_value(), + "clockwise" => self.obj().clockwise().to_value(), _ => unreachable!(), } } fn set_property(&self, _id: usize, value: &glib::Value, pspec: &glib::ParamSpec) { match pspec.name() { - "fraction" => self.instance().set_fraction(value.get().unwrap()), - "inverted" => self.instance().set_inverted(value.get().unwrap()), - "clockwise" => self.instance().set_clockwise(value.get().unwrap()), + "fraction" => self.obj().set_fraction(value.get().unwrap()), + "inverted" => self.obj().set_inverted(value.get().unwrap()), + "clockwise" => self.obj().set_clockwise(value.get().unwrap()), _ => unreachable!(), } } @@ -84,13 +69,13 @@ pub mod imp { fn constructed(&self) { self.parent_constructed(); - self.instance().set_valign(gtk4::Align::Center); + self.obj().set_valign(gtk4::Align::Center); } } impl WidgetImpl for ProgressIcon { fn snapshot(&self, snapshot: >k4::Snapshot) { - let widget = self.instance(); + let widget = self.obj(); let size = widget.size() as f32; let radius = size / 2.0; let mut color = widget.style_context().color(); @@ -125,7 +110,7 @@ pub mod imp { } fn measure(&self, _orientation: gtk4::Orientation, _for_size: i32) -> (i32, i32, i32, i32) { - let widget = self.instance(); + let widget = self.obj(); (widget.size(), widget.size(), -1, -1) } } @@ -144,7 +129,7 @@ glib::wrapper! { impl Default for ProgressIcon { fn default() -> Self { - glib::Object::new(&[]) + glib::Object::new() } } @@ -190,14 +175,14 @@ pub trait ProgressIconExt { impl> ProgressIconExt for W { fn fraction(&self) -> f32 { - let this = imp::ProgressIcon::from_instance(self.as_ref()); + let this = imp::ProgressIcon::from_obj(self.as_ref()); *this.fraction.borrow() } fn set_fraction(&self, fraction: f32) { if (fraction - self.fraction()).abs() < f32::EPSILON { return; } - let this = imp::ProgressIcon::from_instance(self.as_ref()); + let this = imp::ProgressIcon::from_obj(self.as_ref()); let clamped = fraction.clamp(0.0, 1.0); this.fraction.replace(clamped); self.as_ref().queue_draw(); @@ -205,28 +190,28 @@ impl> ProgressIconExt for W { } fn inverted(&self) -> bool { - let this = imp::ProgressIcon::from_instance(self.as_ref()); + let this = imp::ProgressIcon::from_obj(self.as_ref()); *this.inverted.borrow() } fn set_inverted(&self, inverted: bool) { if inverted == self.inverted() { return; } - let this = imp::ProgressIcon::from_instance(self.as_ref()); + let this = imp::ProgressIcon::from_obj(self.as_ref()); this.inverted.replace(inverted); self.as_ref().queue_draw(); self.notify("inverted"); } fn clockwise(&self) -> bool { - let this = imp::ProgressIcon::from_instance(self.as_ref()); + let this = imp::ProgressIcon::from_obj(self.as_ref()); *this.clockwise.borrow() } fn set_clockwise(&self, clockwise: bool) { if clockwise == self.clockwise() { return; } - let this = imp::ProgressIcon::from_instance(self.as_ref()); + let this = imp::ProgressIcon::from_obj(self.as_ref()); this.clockwise.replace(clockwise); self.as_ref().queue_draw(); self.notify("clockwise"); diff --git a/src/ui/widgets/sid_login/mod.rs b/src/ui/widgets/sid_login/mod.rs index ebdd297..d9521cc 100644 --- a/src/ui/widgets/sid_login/mod.rs +++ b/src/ui/widgets/sid_login/mod.rs @@ -47,7 +47,7 @@ pub mod imp { impl ObjectImpl for SidBox { fn constructed(&self) { self.parent_constructed(); - let obj = self.instance(); + let obj = self.obj(); obj.setup_actions(); obj.setup_events(); } diff --git a/src/window.rs b/src/window.rs index 53762e1..b54adbe 100644 --- a/src/window.rs +++ b/src/window.rs @@ -96,14 +96,8 @@ pub mod imp { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ - ParamSpecString::new("item", "item", "item", None, glib::ParamFlags::READWRITE), - ParamSpecString::new( - "product", - "product", - "product", - None, - glib::ParamFlags::READWRITE, - ), + ParamSpecString::builder("item").build(), + ParamSpecString::builder("product").build(), ] }); PROPERTIES.as_ref() @@ -133,7 +127,7 @@ pub mod imp { fn constructed(&self) { self.parent_constructed(); - let obj = self.instance(); + let obj = self.obj(); // Devel Profile if PROFILE == "Devel" { obj.style_context().add_class("devel"); @@ -165,7 +159,7 @@ pub mod imp { impl WindowImpl for EpicAssetManagerWindow { // save window state on delete event fn close_request(&self) -> Inhibit { - if let Err(err) = self.instance().save_window_size() { + if let Err(err) = self.obj().save_window_size() { warn!("Failed to save window state, {}", &err); } Inhibit(false) @@ -182,7 +176,7 @@ glib::wrapper! { impl EpicAssetManagerWindow { pub fn new(app: &EpicAssetManager) -> Self { - let window: Self = glib::Object::new(&[]); + let window: Self = glib::Object::new(); window.set_application(Some(app)); gtk4::Window::set_default_icon_name(APP_ID); From 2057b9b9cb69e0fcdeec76bbc9a334015365a054 Mon Sep 17 00:00:00 2001 From: Milan Stastny Date: Mon, 3 Apr 2023 14:39:33 +0200 Subject: [PATCH 3/5] Gracefully handle corrupted chunk, fixes #233 --- src/ui/widgets/download_manager/asset.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/ui/widgets/download_manager/asset.rs b/src/ui/widgets/download_manager/asset.rs index 2da1b61..b934192 100644 --- a/src/ui/widgets/download_manager/asset.rs +++ b/src/ui/widgets/download_manager/asset.rs @@ -1,6 +1,7 @@ use crate::tools::asset_info::Search; use crate::ui::widgets::download_manager::Msg::CancelChunk; use crate::ui::widgets::download_manager::{Msg, PostDownloadAction, ThreadMessages}; +use egs_api::api::types::chunk::Chunk; use glib::clone; use gtk4::glib; use gtk4::glib::Sender; @@ -1050,7 +1051,13 @@ fn extract_chunks( let metadata = f.metadata().expect("Unable to read metadata"); let mut buffer = vec![0_u8; usize::try_from(metadata.len()).unwrap()]; f.read_exact(&mut buffer).expect("Read failed"); - let ch = egs_api::api::types::chunk::Chunk::from_vec(buffer).unwrap(); + let ch = match egs_api::api::types::chunk::Chunk::from_vec(buffer) { + None => { + error!("Failed to parse chunk from file: {:?}", chunk.link); + break; + } + Some(c) => c, + }; if u128::from( ch.uncompressed_size .unwrap_or_else(|| u32::try_from(ch.data.len()).unwrap()), From dc34864f560883fc37673ef83f0dc0e8d148c1b0 Mon Sep 17 00:00:00 2001 From: Milan Stastny Date: Mon, 3 Apr 2023 14:52:23 +0200 Subject: [PATCH 4/5] 3.8.4 release --- Cargo.toml | 2 +- ...b.achetagames.epic_asset_manager.metainfo.xml.in.in | 10 ++++++++++ meson.build | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 427cc9b..fe3c95e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "epic_asset_manager" -version = "3.8.3" +version = "3.8.4" authors = ["Milan Stastny "] edition = "2021" license-file = "LICENSE" diff --git a/data/io.github.achetagames.epic_asset_manager.metainfo.xml.in.in b/data/io.github.achetagames.epic_asset_manager.metainfo.xml.in.in index a391912..edf9f8f 100644 --- a/data/io.github.achetagames.epic_asset_manager.metainfo.xml.in.in +++ b/data/io.github.achetagames.epic_asset_manager.metainfo.xml.in.in @@ -64,6 +64,16 @@ https://ko-fi.com/achetagames + + +

Update release

+
    +
  • Gracefully handle corrupted chunk
  • +
  • Update dependencies
  • +
  • Fix actions
  • +
+
+

Bug fixing

diff --git a/meson.build b/meson.build index 7a8d18a..b4a7f1f 100644 --- a/meson.build +++ b/meson.build @@ -1,6 +1,6 @@ project('epic_asset_manager', 'rust', - version: '3.8.3', + version: '3.8.4', license: 'MIT', meson_version: '>= 0.59') From d1539afcb4bacf0f3a8d84690f41dcad47dcb215 Mon Sep 17 00:00:00 2001 From: Milan Stastny Date: Mon, 3 Apr 2023 15:04:45 +0200 Subject: [PATCH 5/5] Update actions to latest gnome image --- .github/workflows/release.yml | 2 +- .github/workflows/rust.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e517c6f..152859c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -17,7 +17,7 @@ jobs: name: "Flatpak" runs-on: ubuntu-20.04 container: - image: bilelmoussaoui/flatpak-github-actions:gnome-43 + image: bilelmoussaoui/flatpak-github-actions:gnome-44 options: --privileged steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 4cd6d22..6378a62 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -15,7 +15,7 @@ jobs: name: "Flatpak" runs-on: ubuntu-20.04 container: - image: bilelmoussaoui/flatpak-github-actions:gnome-43 + image: bilelmoussaoui/flatpak-github-actions:gnome-44 options: --privileged steps: - uses: actions/checkout@v2