UI for GOG

This commit is contained in:
Philip Kristoffersen
2021-10-06 11:13:54 +02:00
parent 53021a177a
commit ffde590f1c
5 changed files with 120 additions and 38 deletions
+48 -11
View File
@@ -6,12 +6,13 @@ This little tool will synchronize games from other platforms into your Steam lib
The goal is that you do not have to leave your Steam library to launch games from other launchers/stores. The goal is that you do not have to leave your Steam library to launch games from other launchers/stores.
## Features ## Features
- [x] Download art from [SteamGridDB](https://www.steamgriddb.com/) - [x] Download art from [SteamGridDB](https://www.steamgriddb.com/)
- [x] [Legendary](https://github.com/derrod/legendary) integration - [x] [Legendary](https://github.com/derrod/legendary) integration
- [x] [Epic Games Store](https://www.epicgames.com/) integration - [x] [Epic Games Store](https://www.epicgames.com/) integration
- [x] [Itch.io](https://itch.io/app) integration - [x] [Itch.io](https://itch.io/app) integration
- [x] [Origin](https://www.origin.com) integration (currently only windows, linux comming soon) - [x] [Origin](https://www.origin.com) integration (currently only windows, linux comming soon)
- [x] [GOG](https://www.gog.com/galaxy) integration (currently only windows, linux comming soon, also no ui configuration either, but coming even sooner) - [x] [GOG](https://www.gog.com/galaxy) integration
- [x] Cross Platform - [x] Cross Platform
- [x] Small (~1.5mb on disk), lightweight (~2mb ram) and fast(~30ms sync) - [x] Small (~1.5mb on disk), lightweight (~2mb ram) and fast(~30ms sync)
- [x] UI For configuration - [x] UI For configuration
@@ -28,35 +29,39 @@ Feel free to submit issues and pull requests.
## Getting started ## Getting started
* Download the latest release from the [releases page](https://github.com/PhilipK/BoilR/releases). - Download the latest release from the [releases page](https://github.com/PhilipK/BoilR/releases).
* Choose the UI version or the cli version (if in doubt pick the UI version) - Choose the UI version or the cli version (if in doubt pick the UI version)
* Place it in a folder of your choice. - Place it in a folder of your choice.
* Run the executable. - Run the executable.
* Restart Steam to see your new shortcuts. - Restart Steam to see your new shortcuts.
## Getting art for your shortcuts ## Getting art for your shortcuts
* Get a [SteamGridDB API key](https://www.steamgriddb.com/profile/preferences/api)
* For the CLI version, Write it in the `config.toml` file (see how in the [config section](#configuration)).
* for the Ui version , copy it into the auth key input.
* Run the executable again
- Get a [SteamGridDB API key](https://www.steamgriddb.com/profile/preferences/api)
- For the CLI version, Write it in the `config.toml` file (see how in the [config section](#configuration)).
- for the Ui version , copy it into the auth key input.
- Run the executable again
## Configuration ## Configuration
The tool reads its configuration from a `config.toml` file. The tool reads its configuration from a `config.toml` file.
You can either manually edit this file or use the UI version to changing these configurations. You can either manually edit this file or use the UI version to changing these configurations.
Here is a simple example of how to write the config file: Here is a simple example of how to write the config file:
```toml ```toml
[steamgrid_db] [steamgrid_db]
auth_key="your steamgrid db auth key" auth_key="your steamgrid db auth key"
``` ```
And here is a full example of all configuration options: And here is a full example of all configuration options:
```toml ```toml
[epic_games] [epic_games]
enabled=true #On windows this is default true, on linux default false enabled=true #On windows this is default true, on linux default false
location="C:\\ProgramData\\Epic\\EpicGamesLauncher\\Data\\Manifests" #If this value is not defined, the tool will try to find it automatically (only windows). If it can't find it, it will fail and tell you. location="C:\\ProgramData\\Epic\\EpicGamesLauncher\\Data\\Manifests" #If this value is not defined, the tool will try to find it automatically (only windows). If it can't find it, it will fail and tell you.
create_symlinks = true #Only for Linux, To get around a bug in steam where paths can not contain spaces, BoilR creates symlinks in ~/.boilr/link and uses those.
[legendary] [legendary]
enabled=false #On windows this is default false, on linux default true enabled=false #On windows this is default false, on linux default true
@@ -65,6 +70,7 @@ executable="legendary" #If this value is not defined, "legendary" will be used,
[itch] [itch]
enabled=false #Default false enabled=false #Default false
location="C:\\Users\\user\\AppData\\Roaming\\itch" #If this value is not defined, "%APPDATA%itch" will be used on windows, and HOME/.config/itch on linux. location="C:\\Users\\user\\AppData\\Roaming\\itch" #If this value is not defined, "%APPDATA%itch" will be used on windows, and HOME/.config/itch on linux.
create_symlinks = true #Only for Linux, To get around a bug in steam where paths can not contain spaces, BoilR creates symlinks in ~/.boilr/link and uses those.
[origin] [origin]
enabled=false #Default false enabled=false #Default false
@@ -72,7 +78,9 @@ location="C:\\ProgramData\\Origin" #If this value is not defined, "%PROGRAMGDATA
[gog] [gog]
enabled=false #Default false enabled=false #Default false
location="C:\\ProgramData\\GOG.com\\Galaxy" #The location of GOG Galaxy (will default to this value if not defined) location="C:\\ProgramData\\GOG.com\\Galaxy" #The location of GOG Galaxy will default to this value if not defined on windows and "~/Games/gog-galaxy/drive_c/ProgramData/GOG.com/Galaxy" on linux.
create_symlinks = true #Only for Linux, To get around a bug in steam where paths can not contain spaces, BoilR creates symlinks in ~/.boilr/link and uses those.
wine_c_drive="/home/username/Games/gog-galaxy/drive_c" #Only for Linux, Is mandatory on linux.
[steam] [steam]
location="C:\\Program Files (x86)\\Steam\\" #If this value is not defined, the tool will try to find it automatically. If it can't find it, it will fail and tell you. location="C:\\Program Files (x86)\\Steam\\" #If this value is not defined, the tool will try to find it automatically. If it can't find it, it will fail and tell you.
@@ -82,6 +90,35 @@ enabled = true #If false, the whole download of custom art will be skipped.
auth_key="<your steamgrid db auth key>" #This value is mandatory if you have steamgrid_db enabled. auth_key="<your steamgrid db auth key>" #This value is mandatory if you have steamgrid_db enabled.
``` ```
## Tips for Linux
If you are on linux, and want to use one of the launchers that is not available natively, here are a few ways that you can make them work.
### GOG
- Install [Lutris](https://lutris.net/)
- Install GOG thourgh Lutris [here](https://lutris.net/games/gog-galaxy/)
- Set the path to GOG in the config.toml (or through the ui)
- Run BoilR
- Remember to pick which version of Proton you want to use for a game, before the first time you want to rn it.
### Epic
I recommend you just use [Legendary](https://github.com/derrod/legendary). But if you really want to use EGS you can:
- Install [Lutris](https://lutris.net/)
- Install EGS thourgh Lutris [here](https://lutris.net/games/epic-games-store/)
- Set the path to EGS in the config.toml (or through the ui)
- Run BoilR
- Remember to pick which version of Proton you want to use for a game, before the first time you want to rn it.
### Origin
Currently BoilR can't setup shortcuts to Origin because Origin uses a special link to open games. But I know of a workaround, it is just going to take a bit to make (basicly let Boiler take that url as input and let it call origin with proton settings and the url).
This section will be updated when it is ready.
Untill then you can still play origin games thourgh Lutris [here](https://lutris.net/games/origin/)
## License ## License
This project is dual license MIT or Apache 2.0 , it is up to you. In short, you can do what you want with this project, but if in doubt read the license files. This project is dual license MIT or Apache 2.0 , it is up to you. In short, you can do what you want with this project, but if in doubt read the license files.
+24 -7
View File
@@ -8,7 +8,7 @@ class UserInterface {open
} { } {
Fl_Window win { Fl_Window win {
label {Main View} open label {Main View} open
xywh {768 30 535 865} type Double visible xywh {768 0 575 985} type Double visible
} { } {
Fl_Group {} { Fl_Group {} {
label BoilR label BoilR
@@ -76,11 +76,11 @@ class UserInterface {open
} }
} }
Fl_Group origin_group { Fl_Group origin_group {
label Origin open label Origin
xywh {40 699 633 78} align 5 xywh {35 699 638 121} align 5
} { } {
Fl_Input origin_folder_input { Fl_Input origin_folder_input {
label {Origin Data Folder} selected label {Origin Data Folder}
xywh {40 745 445 26} align 5 xywh {40 745 445 26} align 5
} }
Fl_Check_Button enable_origin_checkbox { Fl_Check_Button enable_origin_checkbox {
@@ -89,15 +89,32 @@ class UserInterface {open
} }
} }
Fl_Group action_buttons { Fl_Group action_buttons {
xywh {35 800 570 50} xywh {35 800 570 170}
} { } {
Fl_Button save_settings_button { Fl_Button save_settings_button {
label {Save Settings} label {Save Settings}
xywh {38 808 120 40} xywh {35 930 120 40}
} }
Fl_Button synchronize_button { Fl_Button synchronize_button {
label {Synchronize Games} label {Synchronize Games}
xywh {325 806 160 40} xywh {325 925 160 40}
}
}
Fl_Group {} {
label {GOG Galaxy} open
xywh {35 799 570 121} align 5
} {
Fl_Check_Button enable_gog_checkbox {
label Enable
xywh {35 799 570 26} down_box DOWN_BOX
}
Fl_Input gog_folder_input {
label {GOG Data Folder}
xywh {35 844 445 26} align 5
}
Fl_Input gog_winedrive_input {
label {GOG Wine C Drive} selected
xywh {35 894 445 26} align 5
} }
} }
} }
+12 -13
View File
@@ -52,7 +52,6 @@ impl Platform<GogShortcut, GogErrors> for GogPlatform {
for install_location in install_locations { for install_location in install_locations {
let path = Path::new(&install_location); let path = Path::new(&install_location);
if path.exists() { if path.exists() {
println!("exists {:?}", &path);
let dirs = path.read_dir(); let dirs = path.read_dir();
if let Ok(dirs) = dirs { if let Ok(dirs) = dirs {
for dir in dirs { for dir in dirs {
@@ -122,7 +121,7 @@ impl Platform<GogShortcut, GogErrors> for GogPlatform {
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
let working_dir = working_dir.replace("\\", "/"); let working_dir = working_dir.replace("\\", "/");
let full_path_string = full_path.to_string(); let full_path_string = full_path.to_string();
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
@@ -149,17 +148,17 @@ impl Platform<GogShortcut, GogErrors> for GogPlatform {
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
fn fix_paths(wine_c_drive: &String, paths: Vec<String>) -> Vec<String> { fn fix_paths(wine_c_drive: &String, paths: Vec<String>) -> Vec<String> {
paths paths
.iter() .iter()
.flat_map(|path| { .flat_map(|path| {
if path.starts_with("C:\\") { if path.starts_with("C:\\") {
let path_buf = Path::new(wine_c_drive).join(&path[3..]); let path_buf = Path::new(wine_c_drive).join(&path[3..]);
path_buf.to_str().map(|s| s.to_string().replace("\\", "/")) path_buf.to_str().map(|s| s.to_string().replace("\\", "/"))
} else { } else {
None None
} }
}) })
.collect() .collect()
} }
fn get_install_locations(path: PathBuf) -> Result<Vec<String>, GogErrors> { fn get_install_locations(path: PathBuf) -> Result<Vec<String>, GogErrors> {
+5 -6
View File
@@ -164,12 +164,11 @@ fn create_sym_links(shortcut: &ShortcutOwned) -> ShortcutOwned {
let workdir_original = Path::new(&shortcut.start_dir); let workdir_original = Path::new(&shortcut.start_dir);
use std::os::unix::fs::symlink; use std::os::unix::fs::symlink;
// If the links exsists, then they must point towards what is needed, otherwise they would have a different app id
match ( let target_ok = target_link.exists() || symlink(&target_original, &target_link).is_ok();
symlink(&target_original, &target_link), let workdir_ok = workdir_link.exists() || symlink(&workdir_original, &workdir_link).is_ok();
symlink(&workdir_original, &workdir_link), match (target_ok, workdir_ok) {
) { (true, true) => {
(Ok(_), Ok(_)) => {
let exe = target_link.to_string_lossy().to_string(); let exe = target_link.to_string_lossy().to_string();
let start_dir = workdir_link.to_string_lossy().to_string(); let start_dir = workdir_link.to_string_lossy().to_string();
let new_shortcut = Shortcut::new( let new_shortcut = Shortcut::new(
+31 -1
View File
@@ -71,6 +71,11 @@ fn update_settings_with_ui_values(settings: &mut Settings, ui: &UserInterface) {
// Itch // Itch
settings.itch.enabled = ui.enable_itch_checkbox.value(); settings.itch.enabled = ui.enable_itch_checkbox.value();
settings.itch.location = empty_or_whitespace(ui.itch_locatoin_input.value()); settings.itch.location = empty_or_whitespace(ui.itch_locatoin_input.value());
// Gog
settings.gog.enabled = ui.enable_gog_checkbox.value();
settings.gog.location = empty_or_whitespace(ui.gog_folder_input.value());
settings.gog.wine_c_drive = empty_or_whitespace(ui.gog_winedrive_input.value());
} }
#[cfg(feature = "ui")] #[cfg(feature = "ui")]
@@ -84,7 +89,7 @@ fn save_settings_to_file(settings: &Settings) {
fn update_ui_with_settings(ui: &mut UserInterface, settings: &Settings) { fn update_ui_with_settings(ui: &mut UserInterface, settings: &Settings) {
use std::path::Path; use std::path::Path;
use crate::{itch, origin, steam}; use crate::{gog, itch, origin, steam};
ui.steam_location_input.set_value( ui.steam_location_input.set_value(
&settings &settings
@@ -152,4 +157,29 @@ fn update_ui_with_settings(ui: &mut UserInterface, settings: &Settings) {
.clone() .clone()
.unwrap_or(default_origin_location), .unwrap_or(default_origin_location),
); );
ui.enable_gog_checkbox.set_value(settings.gog.enabled);
let default_gog_location = gog::default_location();
let default_gog_location = if !default_gog_location.exists() {
String::from("")
} else {
default_gog_location.to_string_lossy().to_string()
};
ui.gog_folder_input.set_value(
&settings
.gog
.location
.clone()
.unwrap_or(default_gog_location),
);
#[cfg(target_os = "linux")]
{
ui.gog_winedrive_input
.set_value(&settings.gog.wine_c_drive.clone().unwrap_or("".to_string()));
}
#[cfg(not(target_os = "linux"))]
{
ui.gog_winedrive_input.deactivate();
}
} }