From 1214c35fb5bca2309b648a0e01c6589485235935 Mon Sep 17 00:00:00 2001 From: Cyberarm Date: Thu, 30 Dec 2021 15:47:42 -0600 Subject: [PATCH] Fixed application taskbar not hiding after task completion, implemented basic uninstaller task, server browser is only told to update from updater if server data has actually changed, added Interface.instance method- fixes assuming window.current_state is a Interface instance. --- lib/api/server_list_server.rb | 4 ++ lib/api/server_list_updater.rb | 5 +-- lib/application_manager.rb | 9 ++++- lib/application_manager/task.rb | 14 ++++++- lib/application_manager/tasks/installer.rb | 7 ++-- lib/application_manager/tasks/uninstaller.rb | 39 +++++++++++++++++- lib/pages/games.rb | 42 +++++++++++++++++++- lib/states/interface.rb | 10 ++++- 8 files changed, 116 insertions(+), 14 deletions(-) diff --git a/lib/api/server_list_server.rb b/lib/api/server_list_server.rb index 3b1eeba..79840cd 100644 --- a/lib/api/server_list_server.rb +++ b/lib/api/server_list_server.rb @@ -25,7 +25,11 @@ class W3DHub @status.instance_variable_set(:@player_count, hash[:numplayers] || 0) @status.instance_variable_set(:@started, hash[:started]) @status.instance_variable_set(:@remaining, hash[:remaining]) + + return true end + + false end class Status diff --git a/lib/api/server_list_updater.rb b/lib/api/server_list_updater.rb index 3e06a11..868ab71 100644 --- a/lib/api/server_list_updater.rb +++ b/lib/api/server_list_updater.rb @@ -105,9 +105,8 @@ class W3DHub id, data = rpc[:arguments] server = Store.server_list.find { |s| s.id == id } - server&.update(data) - state = window.current_state - state.update_server_browser(server) if state.is_a?(States::Interface) && server + server_updated = server&.update(data) + States::Interface.instance&.update_server_browser(server) if server_updated end end end diff --git a/lib/application_manager.rb b/lib/application_manager.rb index 1807c61..d7beea7 100644 --- a/lib/application_manager.rb +++ b/lib/application_manager.rb @@ -94,7 +94,7 @@ class W3DHub end def uninstall(app_id, channel) - puts "Uninstall Request: #{app_id} #{channel}" + puts "Uninstall Request: #{app_id}-#{channel}" return false if !installed?(app_id, channel) || installing?(app_id, channel) @@ -297,6 +297,11 @@ class W3DHub listed_version > current_version end + def uninstalled!(task) + Store.settings[:games].delete(:"#{task.app_id}_#{task.release_channel}") + Store.settings.save_settings + end + # No application tasks are being done def idle? !busy? @@ -314,6 +319,8 @@ class W3DHub def start_next_available_task return unless idle? + @tasks.delete_if { |t| t.state == :complete || t.state == :halted || t.state == :failed } + task = @tasks.find { |t| t.state == :not_started } task&.start end diff --git a/lib/application_manager/task.rb b/lib/application_manager/task.rb index 728664d..865ec59 100644 --- a/lib/application_manager/task.rb +++ b/lib/application_manager/task.rb @@ -105,6 +105,8 @@ class W3DHub def fail!(reason = "") @task_state = :failed @task_failure_reason = reason.to_s + + hide_application_taskbar end def fail_silently! @@ -138,7 +140,15 @@ class W3DHub def update_interface_task_status run_on_main_thread( proc do - window.current_state.interface_task_update_pending = self + States::Interface.instance&.interface_task_update_pending = self + end + ) + end + + def show_application_taskbar + run_on_main_thread( + proc do + States::Interface.instance&.show_application_taskbar end ) end @@ -146,7 +156,7 @@ class W3DHub def hide_application_taskbar run_on_main_thread( proc do - window.current_state.hide_application_taskbar + States::Interface.instance&.hide_application_taskbar end ) end diff --git a/lib/application_manager/tasks/installer.rb b/lib/application_manager/tasks/installer.rb index db584a7..1cc073e 100644 --- a/lib/application_manager/tasks/installer.rb +++ b/lib/application_manager/tasks/installer.rb @@ -6,6 +6,8 @@ class W3DHub end def execute_task + show_application_taskbar + fail_fast return false if failed? @@ -26,20 +28,17 @@ class W3DHub unpack_packages(packages) return false if failed? - sleep 1 create_wine_prefix return false if failed? - sleep 1 install_dependencies(packages) return false if failed? - sleep 1 mark_application_installed return false if failed? - sleep 5 + sleep 1 hide_application_taskbar true diff --git a/lib/application_manager/tasks/uninstaller.rb b/lib/application_manager/tasks/uninstaller.rb index cd915b3..fb72e47 100644 --- a/lib/application_manager/tasks/uninstaller.rb +++ b/lib/application_manager/tasks/uninstaller.rb @@ -5,7 +5,7 @@ class W3DHub :uninstaller end - def exec_task + def execute_task # TODO: cherrypick or nuke installation folder # A: # fetch manifests @@ -15,6 +15,43 @@ class W3DHub # B: # Nuke installation folder # mark application as uninstalled + + show_application_taskbar + + remove_installation_directory + mark_application_uninstalled + + sleep 1 + hide_application_taskbar + + true + end + + def remove_installation_directory + @status.operations.clear + @status.label = "Uninstalling #{@application.name}" + @status.value = "Purging installation folder..." + @status.progress = Float::INFINITY + + path = Cache.install_path(@application, @channel) + + puts path + # TODO: Do some sanity checking, i.e. DO NOT start launcher if `whoami` returns root, path makes sense, + # we're not on Windows trying to uninstall a game likely installed by the official launcher + FileUtils.remove_dir(path) + end + + def mark_application_uninstalled + Store.application_manager.uninstalled!(self) + + @status.operations.clear + @status.label = "Uninstalled #{@application.name}" + @status.value = "" + @status.progress = 1.0 + + @status.step = :mark_application_uninstalled + + puts "#{@app_id} has been uninstalled." end end end diff --git a/lib/pages/games.rb b/lib/pages/games.rb index 9892939..cc9f1e9 100644 --- a/lib/pages/games.rb +++ b/lib/pages/games.rb @@ -89,7 +89,7 @@ class W3DHub Hash.new.tap { |hash| hash[I18n.t(:"games.game_settings")] = { icon: "gear", block: proc { Store.application_manager.settings(game.id, channel.id) } } hash[I18n.t(:"games.wine_configuration")] = { icon: "gear", block: proc { Store.application_manager.wine_configuration(game.id, channel.id) } } if W3DHub.unix? - hash[I18n.t(:"games.game_modifications")] = { icon: "gear", enabled: false, block: proc { puts "Coming Soon!" } } + hash[I18n.t(:"games.game_modifications")] = { icon: "gear", enabled: true, block: proc { populate_game_modifications(game, channel) } } if game.id != "ren" hash[I18n.t(:"games.repair_installation")] = { icon: "wrench", block: proc { Store.application_manager.repair(game.id, channel.id) } } hash[I18n.t(:"games.uninstall_game")] = { icon: "trashCan", block: proc { Store.application_manager.uninstall(game.id, channel.id) } } @@ -225,6 +225,46 @@ class W3DHub end end end + + def populate_game_modifications(application, channel) + @game_news_container.clear do + ([ + { + id: "4E4CB0548029FF234E289B4B8B3E357A", + name: "HD Purchase Terminal Icons", + author: "username", + description: "Replaces them blurry low res icons with juicy hi-res ones.", + icon: nil, + type: "Textures", + subtype: "Purchase Terminal", + multiplayer_approved: true, + games: ["ren", "ia"], + versions: ["0.0.1", "0.0.2", "0.1.0"], + url: "https://w3dhub.com/mods/username/hd_purchase_terminal_icons" + } + ] * 10).flatten.each do |mod| + flow(width: 1.0, height: 128, margin: 4, border_bottom_thickness: 1, border_bottom_color: 0xff_ffffff) do + stack(width: 128, height: 128, padding: 4) do + image BLACK_IMAGE, height: 1.0 + end + + stack(width: 0.75, height: 1.0) do + stack(width: 1.0, height: 128 - 28) do + link(mod[:name]) { Launchy.open(mod[:url]) } + inscription "Author: #{mod[:author]} | #{mod[:type]} | #{mod[:subtype]}" + para mod[:description][0..180] + end + + flow(width: 1.0, height: 28, padding: 4) do + inscription "Version", width: 0.25, text_align: :center + list_box items: mod[:versions], width: 0.5, enabled: mod[:versions].size > 1, padding_top: 0, padding_bottom: 0 + button "Install", width: 0.25, padding_top: 0, padding_bottom: 0 + end + end + end + end + end + end end end end \ No newline at end of file diff --git a/lib/states/interface.rb b/lib/states/interface.rb index f7d1d88..a6776a3 100644 --- a/lib/states/interface.rb +++ b/lib/states/interface.rb @@ -4,7 +4,15 @@ class W3DHub attr_reader :main_thread_queue attr_accessor :interface_task_update_pending + @@instance = nil + + def self.instance + @@instance + end + def setup + @@instance = self + window.show_cursor = true @account = @options[:account] @@ -165,8 +173,6 @@ class W3DHub end def update_interface_task_status(task) - show_application_taskbar - @application_taskbar_label.value = task.status.label @application_taskbar_status_label.value = "#{task.status.value} (#{format("%.2f%%", task.status.progress.clamp(0.0, 1.0) * 100.0)})" @application_taskbar_progressbar.value = task.status.progress.clamp(0.0, 1.0)