Skip to content

Commit

Permalink
Minigalaxy (#249)
Browse files Browse the repository at this point in the history
* Setup minigalaxy platform

* Impelment mini galaxy platform

* Customize the games_folder in minigalaxy

* Include Mini Galaxy in readme
  • Loading branch information
PhilipK authored Oct 11, 2022
1 parent 40c55e5 commit 5470d23
Show file tree
Hide file tree
Showing 5 changed files with 131 additions and 1 deletion.
1 change: 1 addition & 0 deletions Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ BoilR can import games from many platforms, but there are limits based
| [Amazon Games](https://gaming.amazon.com) | Yes | No | No |
| [Flatpaks](https://flathub.org/) | No | Yes | [No](https://github.com/PhilipK/BoilR/issues/184#issuecomment-1192680467) |
| [Bottles](https://usebottles.com/) | No | Yes | Yes |
| [MiniGalaxy](https://sharkwouter.github.io/minigalaxy/) | No | Yes | Yes |

## Getting cover art for your shortcuts

Expand Down
3 changes: 3 additions & 0 deletions src/platforms/minigalaxy/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
mod platform;

pub use platform::MiniGalaxyPlatform;
122 changes: 122 additions & 0 deletions src/platforms/minigalaxy/platform.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
use serde::{Deserialize, Serialize};

use crate::platforms::{GamesPlatform, FromSettingsString, load_settings, GogShortcut, NeedsPorton};

#[derive(Clone)]
pub struct MiniGalaxyPlatform {
settings: Settings,
}

#[derive(Deserialize, Serialize, Clone)]
struct Settings {
enabled: bool,
create_symlinks: bool,
games_folder: Option<String>,
}

impl Default for Settings{
fn default() -> Self {
#[cfg(target_family = "unix")]
let enabled = true;
#[cfg(target_family = "windows")]
let enabled = false;
Self { enabled, create_symlinks:false, games_folder:None }
}
}


impl NeedsPorton<MiniGalaxyPlatform> for GogShortcut{
#[cfg(target_family = "unix")]
fn needs_proton(&self, _platform: &MiniGalaxyPlatform) -> bool {
//TODO check if we can do better than just always true
//this might be a linux game
true
}

#[cfg(not(target_family = "unix"))]
fn needs_proton(&self, _platform: &MiniGalaxyPlatform) -> bool {
false
}

#[cfg(not(target_family = "unix"))]
fn create_symlinks(&self, _platform: &MiniGalaxyPlatform) -> bool {
false
}

#[cfg(target_family = "unix")]
fn create_symlinks(&self, platform: &MiniGalaxyPlatform) -> bool {
platform.settings.create_symlinks
}
}

impl FromSettingsString for MiniGalaxyPlatform {
fn from_settings_string<S: AsRef<str>>(s: S) -> Self {
MiniGalaxyPlatform {
settings: load_settings(s),
}
}
}

impl GamesPlatform for MiniGalaxyPlatform{
fn name(&self) -> &str {
"Mini Galaxy"
}

fn code_name(&self) -> &str {
"minigalaxy"
}

fn enabled(&self) -> bool {
self.settings.enabled
}

fn get_shortcut_info(&self) -> eyre::Result<Vec<crate::platforms::ShortcutToImport>> {

let games_folder = match &self.settings.games_folder{
Some(custom_folder) => std::path::Path::new(&custom_folder).to_path_buf(),
None => {
get_default_folder_path()?
},
};
let dirs = games_folder.read_dir()?;
let mut game_folders = vec![];
for game_folder in dirs{
if let Ok(game_folder) = game_folder{
game_folders.push(game_folder.path().to_owned());
}
}
let gog_games = crate::platforms::get_gog_shortcuts_from_game_folders(game_folders);
crate::platforms::to_shortcuts(self, Ok(gog_games))
}

fn get_settings_serilizable(&self) -> String {
toml::to_string(&self.settings).unwrap_or_default()
}

fn render_ui(&mut self, ui: &mut egui::Ui) {
ui.heading("Mini Galaxy");
ui.checkbox(&mut self.settings.enabled, "Import from Mini Galaxy");
let mut path_text = self.settings.games_folder.clone().unwrap_or_else(get_default_folder_string);
if ui.text_edit_singleline(&mut path_text).changed(){
if path_text.trim().is_empty(){
self.settings.games_folder = None;
}else{
self.settings.games_folder = Some(path_text);
}
}

#[cfg(target_family = "unix")]
if self.settings.enabled {
ui.checkbox(&mut self.settings.create_symlinks, "Create symlinks");
}
}
}

fn get_default_folder_string() -> String {
get_default_folder_path().unwrap_or_default().to_string_lossy().to_string()
}

fn get_default_folder_path() -> eyre::Result<std::path::PathBuf> {
let home = std::env::var("HOME")?;
Ok(std::path::Path::new(&home).join("GOG Games"))
}
1 change: 1 addition & 0 deletions src/platforms/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ mod origin;
mod platform;
mod platforms_load;
mod uplay;
mod minigalaxy;

pub(crate) use platform::*;

Expand Down
5 changes: 4 additions & 1 deletion src/platforms/platforms_load.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,12 @@ use super::heroic::HeroicPlatform;
use super::itch::ItchPlatform;
use super::legendary::LegendaryPlatform;
use super::lutris::LutrisPlatform;
use super::minigalaxy::MiniGalaxyPlatform;
use super::origin::OriginPlatform;
use super::uplay::UplayPlatform;
use super::GamesPlatform;

const PLATFORM_NAMES: [&str; 11] = [
const PLATFORM_NAMES: [&str; 12] = [
"amazon",
"bottles",
"epic_games",
Expand All @@ -29,6 +30,7 @@ const PLATFORM_NAMES: [&str; 11] = [
"lutris",
"origin",
"uplay",
"minigalaxy"
];

pub type Platforms = Vec<Box<dyn GamesPlatform>>;
Expand All @@ -51,6 +53,7 @@ pub fn load_platform<A: AsRef<str>, B: AsRef<str>>(
"legendary" => load::<LegendaryPlatform>(s),
"lutris" => load::<LutrisPlatform>(s),
"origin" => load::<OriginPlatform>(s),
"minigalaxy" => load::<MiniGalaxyPlatform>(s),
_ => Err(eyre::format_err!("Unknown platform named {name}")),
}
}
Expand Down

0 comments on commit 5470d23

Please sign in to comment.