Skip to content

Commit

Permalink
Proton: List uninstalled Proton versions from Steam in Add menu
Browse files Browse the repository at this point in the history
Proton: Fixed Virtual Desktop option
InstallDialog: Download button for installers (#304)
  • Loading branch information
tkashkin committed Oct 23, 2020
1 parent 0a5bcfa commit 602ca47
Show file tree
Hide file tree
Showing 11 changed files with 117 additions and 22 deletions.
18 changes: 13 additions & 5 deletions src/data/compat/tools/proton/Proton.vala
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ namespace GameHub.Data.Compat.Tools.Proton
string? _version = null;
if(FileUtils.get_contents(executable.get_parent().get_child("version").get_path(), out _version))
{
version = _version;
version = _version.strip();
if(" " in version)
{
version = Utils.replace_prefix(version.split(" ", 2)[1], "proton-", "").strip();
Expand Down Expand Up @@ -147,12 +147,14 @@ namespace GameHub.Data.Compat.Tools.Proton
}

private static ArrayList<Proton>? proton_versions = null;
private static HashMap<string, string>? proton_appids = null;

public static new ArrayList<Proton> detect()
{
if(proton_versions != null) return proton_versions;

proton_versions = new ArrayList<Proton>();
proton_appids = new HashMap<string, string>();

var db_versions = (ArrayList<Proton>) DB.Tables.CompatTools.get_all("proton");
if(db_versions != null)
Expand Down Expand Up @@ -201,6 +203,11 @@ namespace GameHub.Data.Compat.Tools.Proton
return proton_versions;
}

public static HashMap<string, string>? get_appids()
{
return proton_appids;
}

public static bool is_proton_version_added(File proton)
{
foreach(var existing_version in proton_versions)
Expand Down Expand Up @@ -235,10 +242,11 @@ namespace GameHub.Data.Compat.Tools.Proton
File? proton_dir = null;
if(Steam.find_app_install_dir(appid, out proton_dir))
{
if(proton_dir != null)
{
add_proton_version_from_file(proton_dir.get_child("proton"), name);
}
add_proton_version_from_file(proton_dir.get_child("proton"), name);
}
else
{
proton_appids.set(appid, name ?? @"Proton (app $(appid))");
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/data/compat/tools/wine/Wine.vala
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ namespace GameHub.Data.Compat.Tools.Wine
string[] cmd = get_exec_cmdline_base();
if(wine_options.desktop.enabled)
{
cmd += "explorer";
cmd += "c:\\windows\\system32\\explorer.exe";
cmd += @"/desktop=$(runnable.name_escaped),$(wine_options.desktop.width)x$(wine_options.desktop.height)";
}
if(file.get_path().down().has_suffix(".msi"))
Expand Down
9 changes: 9 additions & 0 deletions src/data/runnables/tasks/install/InstallTask.vala
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ namespace GameHub.Data.Runnables.Tasks.Install
public bool can_import_install_dir { get; construct set; default = false; }
private bool install_dir_imported = false;

public bool cancelled { get; private set; default = false; }

public InstallTask(Runnable? runnable, ArrayList<Installer>? installers, ArrayList<File>? install_dirs, InstallTask.Mode install_mode=InstallTask.Mode.INTERACTIVE, bool allow_install_dir_import=true)
{
Object(runnable: runnable, installers: installers, install_dirs: install_dirs, install_mode: install_mode, can_import_install_dir: allow_install_dir_import);
Expand Down Expand Up @@ -113,6 +115,7 @@ namespace GameHub.Data.Runnables.Tasks.Install

public async void start()
{
if(cancelled) return;
init();
if(install_mode == InstallTask.Mode.INTERACTIVE)
{
Expand All @@ -134,6 +137,7 @@ namespace GameHub.Data.Runnables.Tasks.Install

public async void install()
{
if(cancelled) return;
if(install_dir_imported)
{
warning("[InstallTask.install] Installation directory was imported, skipping installation");
Expand Down Expand Up @@ -225,6 +229,11 @@ namespace GameHub.Data.Runnables.Tasks.Install
}
}

public void cancel()
{
cancelled = true;
}

private void update()
{
notify_property("config-step");
Expand Down
13 changes: 9 additions & 4 deletions src/data/runnables/tasks/install/Installer.vala
Original file line number Diff line number Diff line change
Expand Up @@ -162,10 +162,7 @@ namespace GameHub.Data.Runnables.Tasks.Install

construct
{
if(installers_dir != null && installers_dir.get_child(@".installer_$(id)").query_exists())
{
download_state = new DownloadState(DownloadState.State.DOWNLOADED);
}
update_download_state();
}

public File? installers_dir { get; protected set; }
Expand All @@ -174,6 +171,14 @@ namespace GameHub.Data.Runnables.Tasks.Install

public virtual async void fetch_parts(){}

public void update_download_state()
{
if(installers_dir != null && installers_dir.get_child(@".installer_$(id)").query_exists())
{
download_state = new DownloadState(DownloadState.State.DOWNLOADED);
}
}

public override async bool install(InstallTask task)
{
try
Expand Down
2 changes: 2 additions & 0 deletions src/ui/dialogs/InstallDialog/InstallDialog.vala
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,8 @@ namespace GameHub.UI.Dialogs.InstallDialog
back_button.clicked.connect(() => task.step_prev());
next_button.clicked.connect(() => task.step_next());

task.notify["cancelled"].connect(() => destroy());

task.load_installers.begin();
}

Expand Down
15 changes: 15 additions & 0 deletions src/ui/dialogs/InstallDialog/steps/InstallerStep.vala
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,14 @@ namespace GameHub.UI.Dialogs.InstallDialog.Steps
download_button.get_style_context().add_class(Gtk.STYLE_CLASS_FLAT);
download_button.valign = Align.CENTER;
download_button.tooltip_text = _("Download");
download_button.sensitive = false;

download_button.clicked.connect(() => {
installer.cast<DownloadableInstaller>(dl => {
dl.download.begin(task);
task.cancel();
});
});

notify["installer"].connect(() => update());
update();
Expand All @@ -136,11 +144,18 @@ namespace GameHub.UI.Dialogs.InstallDialog.Steps

string[] detail_info_parts = {};

download_button.sensitive = false;

installer.cast<DownloadableInstaller>(dl => {
dl.update_download_state();
if(dl.download_state != null && dl.download_state.state == DownloadableInstaller.DownloadState.State.DOWNLOADED)
{
detail_info_parts += _("Downloaded");
}
else
{
download_button.sensitive = true;
}
});

if(!installer.is_installable)
Expand Down
28 changes: 21 additions & 7 deletions src/ui/dialogs/SettingsDialog/pages/general/Collection.vala
Original file line number Diff line number Diff line change
Expand Up @@ -73,21 +73,35 @@ namespace GameHub.UI.Dialogs.SettingsDialog.Pages.General
);
add_widget(sgrp_collection);

var vars_common = new ArrayList<VariableEntry.Variable>();
vars_common.add(new VariableEntry.Variable("${root}", _("Collection directory")));
vars_common.add(new VariableEntry.Variable("${game}", _("Game name")));

var vars_platform = new ArrayList<VariableEntry.Variable>();
vars_platform.add(new VariableEntry.Variable("${platform}", _("Platform identifier")));
vars_platform.add(new VariableEntry.Variable("${platform_name}", _("Platform name")));

var vars_subdir_game_dir = new ArrayList<VariableEntry.Variable>();
vars_subdir_game_dir.add(new VariableEntry.Variable("${game_dir}", _("Game directory")));

var vars_game_dir = new ArrayList<VariableEntry.Variable>();
vars_game_dir.add(new VariableEntry.Variable("${root}", _("Collection directory")));
vars_game_dir.add(new VariableEntry.Variable("${game}", _("Game name")));
vars_game_dir.add(new VariableEntry.Variable("${platform}", _("Platform identifier")));
vars_game_dir.add(new VariableEntry.Variable("${platform_name}", _("Platform name")));
vars_game_dir.add_all(vars_common);
vars_game_dir.add_all(vars_platform);

var vars_subdir = new ArrayList<VariableEntry.Variable>();
vars_subdir.add(new VariableEntry.Variable("${game_dir}", _("Game directory")));
vars_subdir.add_all(vars_game_dir);
vars_subdir.add_all(vars_subdir_game_dir);
vars_subdir.add_all(vars_common);
vars_subdir.add_all(vars_platform);

var vars_subdir_gog_bonus = new ArrayList<VariableEntry.Variable>();
vars_subdir_gog_bonus.add_all(vars_subdir_game_dir);
vars_subdir_gog_bonus.add_all(vars_common);

var sgrp_gog = new SettingsGroup("GOG");
gog_game_dir = sgrp_gog.add_setting(new EntrySetting.bind(_("Game directory") + """<span alpha="75%"> • ${game_dir}</span>""", null, InlineWidgets.variable_entry(vars_game_dir, "source-gog-symbolic"), gog, "game-dir"));
gog_installers = sgrp_gog.add_setting(new EntrySetting.bind(_("Installers directory"), null, InlineWidgets.variable_entry(vars_subdir, "source-gog-symbolic"), gog, "installers"));
gog_dlc = sgrp_gog.add_setting(new EntrySetting.bind(_("DLC directory"), null, InlineWidgets.variable_entry(vars_subdir, "folder-download-symbolic"), gog, "dlc"));
gog_bonus = sgrp_gog.add_setting(new EntrySetting.bind(_("Bonus content directory"), null, InlineWidgets.variable_entry(vars_subdir, "folder-music-symbolic"), gog, "bonus"));
gog_bonus = sgrp_gog.add_setting(new EntrySetting.bind(_("Bonus content directory"), null, InlineWidgets.variable_entry(vars_subdir_gog_bonus, "folder-music-symbolic"), gog, "bonus"));
add_widget(sgrp_gog);

var sgrp_humble = new SettingsGroup("Humble Bundle");
Expand Down
4 changes: 2 additions & 2 deletions src/ui/widgets/compat/CompatToolsList.vala
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ namespace GameHub.UI.Widgets.Compat
var tab = get_nth_page(page) as CompatToolsGroupTab;
if(tab != null)
{
tab.add_new_tool();
tab.add_new_tool(add_tool_button);
}
}

Expand Down Expand Up @@ -161,7 +161,7 @@ namespace GameHub.UI.Widgets.Compat

protected virtual void create_options_widget(CompatToolRow row, Box container){}

public virtual void add_new_tool(){}
public virtual void add_new_tool(Button button){}
}

public class CompatToolRow: BaseSetting
Expand Down
44 changes: 43 additions & 1 deletion src/ui/widgets/compat/tabs/Proton.vala
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ using GameHub.Data.Compat;
using GameHub.Data.Compat.Tools;
using GameHub.Data.Compat.Tools.Wine;
using GameHub.Data.Compat.Tools.Proton;

using GameHub.Data.Sources.Steam;

using GameHub.Data.Runnables;

using GameHub.Utils;
Expand Down Expand Up @@ -106,7 +109,46 @@ namespace GameHub.UI.Widgets.Compat.Tabs
compat_tool_selected(proton);
}

public override void add_new_tool()
public override void add_new_tool(Button button)
{
var appids = Tools.Proton.Proton.get_appids();
if(appids != null && appids.size > 0)
{
var menu = new Gtk.Menu();
menu.halign = Align.END;

var steam_menu = new Gtk.Menu();
foreach(var app in appids.entries)
{
var menu_item = new Gtk.MenuItem.with_label(app.value);
menu_item.activate.connect(() => {
Steam.install_app(app.key);
});
steam_menu.add(menu_item);
}

var steam_menu_item = new Gtk.MenuItem.with_label(_("Install Proton from Steam"));
steam_menu_item.submenu = steam_menu;
menu.add(steam_menu_item);

var custom_menu_item = new Gtk.MenuItem.with_label(_("Add custom Proton version"));
custom_menu_item.activate.connect(add_custom_proton_version);
menu.add(custom_menu_item);

menu.show_all();
#if GTK_3_22
menu.popup_at_widget(button, Gravity.SOUTH_EAST, Gravity.NORTH_EAST, null);
#else
menu.popup(null, null, null, 0, Gdk.CURRENT_TIME);
#endif
}
else
{
add_custom_proton_version();
}
}

private void add_custom_proton_version()
{
#if GTK_3_22
var chooser = new FileChooserNative(_("Select Proton executable"), GameHub.UI.Windows.MainWindow.instance, FileChooserAction.OPEN, _("Select"), _("Cancel"));
Expand Down
2 changes: 1 addition & 1 deletion src/ui/widgets/compat/tabs/Wine.vala
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ namespace GameHub.UI.Widgets.Compat.Tabs
wine_options.desktop.bind_property("height", vdesktop_resolution_height_spinbutton, "value", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
}

public override void add_new_tool()
public override void add_new_tool(Button button)
{
#if GTK_3_22
var chooser = new FileChooserNative(_("Select Wine executable"), GameHub.UI.Windows.MainWindow.instance, FileChooserAction.OPEN, _("Select"), _("Cancel"));
Expand Down
2 changes: 1 addition & 1 deletion src/utils/ExecTask.vala
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ namespace GameHub.Utils
}
else
{
Process.spawn_sync(_dir, _cmd, _env, SpawnFlags.SEARCH_PATH | SpawnFlags.CHILD_INHERITS_STDIN | SpawnFlags.STDERR_TO_DEV_NULL, null, null, null, out status);
Process.spawn_sync(_dir, _cmd, _env, SpawnFlags.SEARCH_PATH | SpawnFlags.CHILD_INHERITS_STDIN, null, null, null, out status);
return new Result(status);
}
}
Expand Down

0 comments on commit 602ca47

Please sign in to comment.