diff --git a/Gemfile b/Gemfile index ccc6f61..973ad67 100644 --- a/Gemfile +++ b/Gemfile @@ -1,6 +1,7 @@ source "https://rubygems.org" gem "base64" +gem "excon" gem "cyberarm_engine" gem "sdl2-bindings" gem "digest-crc" diff --git a/lib/application_manager.rb b/lib/application_manager.rb index 7ca93e5..d67fc99 100644 --- a/lib/application_manager.rb +++ b/lib/application_manager.rb @@ -44,7 +44,7 @@ class W3DHub # if auto-import fails ask user for path to game exe # mark app as imported/installed - @tasks.push(Importer.new(app_id, channel)) + push_state(W3DHub::States::ImportGameDialog, app_id: app_id, channel: channel) end def settings(app_id, channel) @@ -389,17 +389,19 @@ class W3DHub false end - def imported!(task, exe_path) + def imported!(application, channel, exe_path) + exe_path.gsub!("\\", "/") + application_data = { - name: task.application.name, + name: application.name, install_directory: File.dirname(exe_path), - installed_version: task.channel.current_version, + installed_version: channel.current_version, install_path: exe_path, - wine_prefix: task.wine_prefix + wine_prefix: nil } Store.settings[:games] ||= {} - Store.settings[:games][:"#{task.app_id}_#{task.release_channel}"] = application_data + Store.settings[:games][:"#{application.id}_#{channel.id}"] = application_data Store.settings.save_settings end diff --git a/lib/application_manager/task.rb b/lib/application_manager/task.rb index 09f5bb2..0916758 100644 --- a/lib/application_manager/task.rb +++ b/lib/application_manager/task.rb @@ -238,7 +238,8 @@ class W3DHub @files.delete_if { |f| f.name.casecmp?(file.name) } unless file.patch? - # If file has been recreated in a newer patch, don't delete it; A full file package will exist for it so it will get completely replaced. + # If file has been recreated in a newer patch, don't delete it; + # A full file package will exist for it so it will get completely replaced. @deleted_files.delete_if { |f| f.name.casecmp?(file.name) } @files.push(file) diff --git a/lib/application_manager/tasks/importer.rb b/lib/application_manager/tasks/importer.rb deleted file mode 100644 index 8f4549b..0000000 --- a/lib/application_manager/tasks/importer.rb +++ /dev/null @@ -1,26 +0,0 @@ -class W3DHub - class ApplicationManager - class Importer < Task - LOG_TAG = "W3DHub::ApplicationManager::Importer".freeze - - def type - :importer - end - - def execute_task - path = W3DHub.ask_file - - unless File.exist?(path) && !File.directory?(path) - fail!("File #{path.inspect} does not exist or is a directory") - fail_silently! if path.nil? || path&.length&.zero? # User likely canceled the file selection - end - - return false if failed? - - Store.application_manager.imported!(self, path) - - true - end - end - end -end diff --git a/lib/states/dialogs/import_game_dialog.rb b/lib/states/dialogs/import_game_dialog.rb new file mode 100644 index 0000000..1403dc7 --- /dev/null +++ b/lib/states/dialogs/import_game_dialog.rb @@ -0,0 +1,85 @@ +class W3DHub + class States + class ImportGameDialog < CyberarmEngine::GuiState + def setup + @application = Store.applications.games.find { |g| g.id == @options[:app_id] } + @channel = @application.channels.find { |c| c.id == @options[:channel] } + + theme W3DHub::THEME + + background 0x88_525252 + + stack(width: 1.0, max_width: 760, height: 1.0, max_height: 268, v_align: :center, h_align: :center, background: 0xee_222222) do + # Title bar + flow(width: 1.0, height: 36, padding: 8) do + background 0x88_000000 + + # image "#{GAME_ROOT_PATH}/media/ui_icons/export.png", width: 32, align: :center, color: 0xaa_ffffff + + # tagline "#{I18n.t(:"server_browser.direct_connect")}", fill: true, text_align: :center + title "Import #{@application.name} (#{@channel.name})", width: 1.0, text_align: :center, font: BOLD_FONT + end + + stack(width: 1.0, fill: true, padding_left: 8, padding_right: 8) do + stack(width: 1.0, height: 72) do + para "Path to Executable:" + + flow(width: 1.0, fill: true) do + @game_path = edit_line "", fill: true, height: 1.0 + button "Browse...", width: 128, height: 1.0, enabled: W3DHub.unix?, tip: W3DHub.unix? ? "Browse for game executable" : "Not available on Windows" do + path = W3DHub.ask_file + @game_path.value = path if !path.empty? && File.exist?(path) + end + end + end + + flow(fill: true) + + flow(width: 1.0, margin_top: 8, height: 46, padding_bottom: 8) do + button "Cancel", fill: true, margin_right: 4 do + pop_state + end + + flow(fill: true) + + @save_button = button "Save", fill: true, margin_left: 4, enabled: false do + pop_state + + Store.application_manager.imported!(@application, @channel, @game_path.value) + end + end + end + end + end + + def draw + previous_state&.draw + + Gosu.flush + + super + end + + def update + super + + @save_button.enabled = valid? + end + + def button_down(id) + super + + case id + when Gosu::KB_ESCAPE + pop_state + end + end + + def valid? + path = @game_path.value + + File.exist?(path) && !File.directory?(path) && File.extname(path) == ".exe" + end + end + end +end diff --git a/lib/window.rb b/lib/window.rb index 5c92073..e6dd103 100644 --- a/lib/window.rb +++ b/lib/window.rb @@ -1,6 +1,7 @@ class W3DHub class Window < CyberarmEngine::Window def setup + self.show_stats_plotter = false self.caption = I18n.t(:app_name) Store[:server_list] = [] diff --git a/w3d_hub_linux_launcher.rb b/w3d_hub_linux_launcher.rb index b448872..acf581d 100644 --- a/w3d_hub_linux_launcher.rb +++ b/w3d_hub_linux_launcher.rb @@ -14,6 +14,7 @@ require "logger" require "time" require "base64" require "zip" +require "excon" class W3DHub W3DHUB_DEBUG = ARGV.join.include?("--debug") @@ -110,7 +111,6 @@ require_relative "lib/application_manager/tasks/installer" require_relative "lib/application_manager/tasks/updater" require_relative "lib/application_manager/tasks/uninstaller" require_relative "lib/application_manager/tasks/repairer" -require_relative "lib/application_manager/tasks/importer" require_relative "lib/states/demo_input_delay" require_relative "lib/states/boot" require_relative "lib/states/interface" @@ -121,6 +121,7 @@ require_relative "lib/states/dialogs/prompt_dialog" require_relative "lib/states/dialogs/confirm_dialog" require_relative "lib/states/dialogs/direct_connect_dialog" require_relative "lib/states/dialogs/game_settings_dialog" +require_relative "lib/states/dialogs/import_game_dialog" require_relative "lib/api" require_relative "lib/api/service_status"