Add support for lutris flatpak version (#114)

This commit is contained in:
Philip Kristoffersen
2022-05-01 17:21:09 +02:00
committed by GitHub
parent 3f075f80f1
commit 81ddcb6959
6 changed files with 81 additions and 25 deletions
+3
View File
@@ -32,6 +32,9 @@ create_symlinks = true
[lutris] [lutris]
enabled = false enabled = false
executable = "lutris"
flatpak_image = "net.lutris.Lutris//beta"
flatpak = false
[heroic] [heroic]
enabled = true enabled = true
+2
View File
@@ -24,6 +24,8 @@ fn parse_line(input: &str) -> Option<LutrisGame> {
index: index.to_string(), index: index.to_string(),
name: name.to_string(), name: name.to_string(),
platform: platform.to_string(), platform: platform.to_string(),
//theese will be added by the platform class
settings: None,
}) })
} }
+43 -2
View File
@@ -1,3 +1,4 @@
use crate::lutris::settings::LutrisSettings;
use steam_shortcuts_util::{shortcut::ShortcutOwned, Shortcut}; use steam_shortcuts_util::{shortcut::ShortcutOwned, Shortcut};
#[derive(Clone)] #[derive(Clone)]
@@ -6,15 +7,17 @@ pub struct LutrisGame {
pub name: String, pub name: String,
pub id: String, pub id: String,
pub platform: String, pub platform: String,
pub settings: Option<LutrisSettings>,
} }
impl From<LutrisGame> for ShortcutOwned { impl From<LutrisGame> for ShortcutOwned {
fn from(game: LutrisGame) -> Self { fn from(game: LutrisGame) -> Self {
let options = format!("lutris:rungame/{}", game.id); let options = game.get_options();
let exectuable = game.get_executable();
Shortcut::new( Shortcut::new(
"0", "0",
game.name.as_str(), game.name.as_str(),
"lutris", exectuable.as_str(),
"", "",
"", "",
"", "",
@@ -23,3 +26,41 @@ impl From<LutrisGame> for ShortcutOwned {
.to_owned() .to_owned()
} }
} }
impl LutrisGame {
pub fn get_options(&self) -> String {
let is_flatpak = self
.settings
.as_ref()
.map(|s| s.flatpak)
.unwrap_or_default();
if is_flatpak {
format!(
"run {} lutris:rungame/{}",
self.settings
.as_ref()
.map(|s| s.flatpak_image.clone())
.unwrap_or_default(),
self.id
)
} else {
format!("lutris:rungame/{}", self.id)
}
}
pub fn get_executable(&self) -> String {
let is_flatpak = self
.settings
.as_ref()
.map(|s| s.flatpak)
.unwrap_or_default();
if is_flatpak {
"flatpak".to_string()
} else {
self.settings
.as_ref()
.map(|s| s.executable.clone())
.unwrap_or_default()
}
}
}
+16 -9
View File
@@ -19,18 +19,12 @@ impl Platform<LutrisGame, Box<dyn Error>> for LutrisPlatform {
} }
fn get_shortcuts(&self) -> Result<Vec<LutrisGame>, Box<dyn Error>> { fn get_shortcuts(&self) -> Result<Vec<LutrisGame>, Box<dyn Error>> {
let default_lutris_exe = "lutris".to_string(); let output = get_lutris_command_output(&self.settings)?;
let lutris_executable = self
.settings
.executable
.as_ref()
.unwrap_or(&default_lutris_exe);
let lutris_command = Command::new(lutris_executable).arg("-lo").output()?;
let output = String::from_utf8_lossy(&lutris_command.stdout).to_string();
let games = parse_lutris_games(output.as_str()); let games = parse_lutris_games(output.as_str());
let mut res = vec![]; let mut res = vec![];
for game in games { for mut game in games {
if game.platform != "steam" { if game.platform != "steam" {
game.settings = Some(self.settings.clone());
res.push(game); res.push(game);
} }
} }
@@ -56,3 +50,16 @@ impl Platform<LutrisGame, Box<dyn Error>> for LutrisPlatform {
false false
} }
} }
fn get_lutris_command_output(settings: &LutrisSettings) -> Result<String, Box<dyn Error>> {
let output = if settings.flatpak {
let flatpak_image = &settings.flatpak_image;
let mut command = Command::new("flatpak");
command.arg("run").arg(flatpak_image).arg("-lo").output()?
} else {
let mut command = Command::new(&settings.executable);
command.arg("-lo").output()?
};
Ok(String::from_utf8_lossy(&output.stdout).to_string())
}
+3 -1
View File
@@ -3,5 +3,7 @@ use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize, Clone)] #[derive(Debug, Deserialize, Serialize, Clone)]
pub struct LutrisSettings { pub struct LutrisSettings {
pub enabled: bool, pub enabled: bool,
pub executable: Option<String>, pub executable: String,
pub flatpak: bool,
pub flatpak_image: String,
} }
+14 -13
View File
@@ -58,19 +58,20 @@ impl MyEguiApp {
ui.heading("Lutris"); ui.heading("Lutris");
ui.checkbox(&mut self.settings.lutris.enabled, "Import form Lutris"); ui.checkbox(&mut self.settings.lutris.enabled, "Import form Lutris");
if self.settings.lutris.enabled { if self.settings.lutris.enabled {
ui.horizontal(|ui| { ui.checkbox(&mut self.settings.lutris.flatpak, "Flatpak version");
let mut empty_string = "".to_string(); if !self.settings.lutris.flatpak {
let lutris_location = self ui.horizontal(|ui| {
.settings let lutris_location = &mut self.settings.lutris.executable;
.lutris ui.label("Lutris Location: ");
.executable ui.text_edit_singleline(lutris_location);
.as_mut() });
.unwrap_or(&mut empty_string); } else {
ui.label("Lutris Location: "); ui.horizontal(|ui| {
if ui.text_edit_singleline(lutris_location).changed() { let flatpak_image = &mut self.settings.lutris.flatpak_image;
self.settings.lutris.executable = Some(lutris_location.to_string()); ui.label("Flatpak image");
} ui.text_edit_singleline(flatpak_image);
}); });
}
} }
ui.add_space(SECTION_SPACING); ui.add_space(SECTION_SPACING);
} }