diff --git a/lib/application_manager.rb b/lib/application_manager.rb index b37bb97..e0f3e33 100644 --- a/lib/application_manager.rb +++ b/lib/application_manager.rb @@ -50,6 +50,17 @@ class W3DHub def settings(app_id, channel) logger.info(LOG_TAG) { "Settings Request: #{app_id}-#{channel}" } + if (app_data = installed?(app_id, channel)) + _application = Store.applications.games.find { |g| g.id == app_id } + _channel = _application.channels.find { |c| c.id == channel } + + push_state(W3DHub::States::GameSettingsDialog, title: "#{_application.name} (#{_channel.name}) Settings", app_id: app_id, channel: channel) + end + end + + def wwconfig(app_id, channel) + logger.info(LOG_TAG) { "WWConfig Request: #{app_id}-#{channel}" } + # open wwconfig.exe or config.exe for ecw if (app_data = installed?(app_id, channel)) diff --git a/lib/pages/games_redesign.rb b/lib/pages/games_redesign.rb index b28cff1..4446b71 100644 --- a/lib/pages/games_redesign.rb +++ b/lib/pages/games_redesign.rb @@ -33,6 +33,16 @@ class W3DHub @games_list_container.clear do background 0xff_121920 + stack(width: 128, height: 1.0) do + flow(fill: true) + + button "All Games", enabled: false, tip: "Under Construction" do + populate_all_games_view + end + + flow(fill: true) + end + Store.applications.games.each do |game| selected = game == @focused_game @@ -170,7 +180,8 @@ class W3DHub button get_image("#{GAME_ROOT_PATH}/media/ui_icons/gear.png"), tip: I18n.t(:"games.game_options"), image_height: 32, margin_left: 0 do |btn| items = [] - items << { label: I18n.t(:"games.game_settings"), block: proc { Store.application_manager.settings(game.id, channel.id) } } + items << { label: I18n.t(:"games.game_settings"), block: proc { Store.application_manager.wwconfig(game.id, channel.id) } } + # items << { label: I18n.t(:"games.game_settings"), block: proc { Store.application_manager.settings(game.id, channel.id) } } items << { label: I18n.t(:"games.wine_configuration"), block: proc { Store.application_manager.wine_configuration(game.id, channel.id) } } if W3DHub.unix? items << { label: I18n.t(:"games.game_modifications"), block: proc { populate_game_modifications(game, channel) } } unless Store.offline_mode if game.id != "ren" @@ -262,6 +273,70 @@ class W3DHub end end + def populate_all_games_view + @game_page_container.clear do + background 0x88_353535 + @game_page_container.style.background_image_color = 0x88_353535 + @game_page_container.style.default[:background_image_color] = 0x88_353535 + @game_page_container.update_background_image + + @focused_game = nil + @focused_channel = nil + + populate_games_list + + flow(width: 1.0, height: 1.0) do + games_view_container = nil + # Options + stack(width: 360, height: 1.0, padding: 8, scroll: true, border_thickness_right: 1, border_color_right: W3DHub::BORDER_COLOR) do + background 0x55_000000 + + flow(width: 1.0, height: 48) do + button "All Games", width: 280 do + # games_view_container.clear + end + tagline Store.applications.games.count.to_s, fill: true, text_align: :right + end + + flow(width: 1.0, height: 48, margin_top: 8) do + button "Installed", width: 280 + tagline "0", fill: true, text_align: :right + end + + flow(width: 1.0, height: 48, margin_top: 8) do + button "Favorites", width: 280 + tagline "0", fill: true, text_align: :right + end + end + + # Games list + games_view_container = stack(fill: true, height: 1.0, padding: 8, margin: 8) do + title "All Games" + + flow(width: 1.0, fill: true, scroll: true) do + Store.applications.games.each do |game| + stack(width: 150, height: 200, padding: 8, margin: 8, background: 0x88_151515, border_color: game.color, border_thickness: 1) do + flow(width: 1.0, height: 24) do + para "Favorite", fill: true + toggle_button checked: false, height: 1.0, padding_top: 3, padding_right: 3, padding_bottom: 3, padding_left: 3 + end + + image_path = File.exist?("#{GAME_ROOT_PATH}/media/icons/#{game.id}.png") ? "#{GAME_ROOT_PATH}/media/icons/#{game.id}.png" : "#{GAME_ROOT_PATH}/media/icons/default_icon.png" + flow(width: 1.0, margin_top: 8) do + flow(fill: true) + image image_path, width: 0.5 + flow(fill: true) + end + + caption game.name, margin_top: 8 + end + end + end + end + end + end + end + def fetch_game_news(game) lock = Cache.acquire_net_lock("game_news_#{game.id}") return false unless lock diff --git a/lib/states/game_settings_dialog.rb b/lib/states/game_settings_dialog.rb new file mode 100644 index 0000000..40243d9 --- /dev/null +++ b/lib/states/game_settings_dialog.rb @@ -0,0 +1,163 @@ +class W3DHub + class States + class GameSettingsDialog < CyberarmEngine::GuiState + BUTTON_STYLE = { text_size: 18, padding_top: 3, padding_bottom: 3, padding_left: 3, padding_right: 3 } + def setup + window.show_cursor = true + + theme(W3DHub::THEME) + + background 0xee_444444 + + stack(width: 1.0, max_width: 720, height: 1.0, max_height: 512, v_align: :center, h_align: :center, background: 0xee_222222) do + flow(width: 1.0, height: 0.1, padding: 8) do + background 0x88_000000 + + image "#{GAME_ROOT_PATH}/media/icons/#{@options[:app_id]}.png", width: 0.04, align: :center + + tagline "#{@options[:title]}", width: 0.9, text_align: :center + end + + stack(width: 1.0, fill: true, padding: 16) do + flow(width: 1.0, fill: true) do + stack(width: 0.5, height: 1.0) do + caption "General" + + flow(width: 1.0, height: 24, margin: 4) do + para "Default to First Person", fill: true + toggle_button tip: "Default to First Person", **BUTTON_STYLE + end + + flow(width: 1.0, height: 24, margin: 4) do + para "Enable Chat Log", fill: true + toggle_button tip: "Enable Chat Log", **BUTTON_STYLE + end + + flow(width: 1.0, height: 24, margin: 4) do + para "Background Downloads", fill: true + toggle_button tip: "Background Downloads", **BUTTON_STYLE + end + + flow(width: 1.0, height: 24, margin: 4) do + para "Show FPS", fill: true + toggle_button tip: "Show FPS", **BUTTON_STYLE + end + end + + stack(width: 0.5, height: 1.0) do + caption "Video" + + flow(width: 1.0, height: 24, margin: 4) do + para "Resolution", fill: true + list_box items: ["#{Gosu.screen_width}x#{Gosu.screen_height}"], width: 128, **BUTTON_STYLE + end + + flow(width: 1.0, height: 24, margin: 4) do + para "Windowed Mode", fill: true + list_box items: ["Windowed", "Borderless", "Fullscreen"], width: 128, **BUTTON_STYLE + end + + flow(width: 1.0, height: 24, margin: 4) do + para "Enable VSync", fill: true + toggle_button tip: "Enable VSync", **BUTTON_STYLE + end + + flow(width: 1.0, height: 24, margin: 4) do + para "MSAA Mode", fill: true + list_box items: %w[0 2 4 8 16], width: 48, **BUTTON_STYLE + end + end + end + + flow(width: 1.0, fill: true) do + stack(width: 0.5, height: 1.0) do + caption "Audio" + + flow(width: 1.0, height: 24, margin: 4) do + para "Sound Effects", fill: true + slider height: 1.0, width: 172, margin_right: 8 + toggle_button tip: "Sound Effects", checked: true, **BUTTON_STYLE + end + + flow(width: 1.0, height: 24, margin: 4) do + para "Dialogue", fill: true + slider height: 1.0, width: 172, margin_right: 8 + toggle_button tip: "Dialogue", checked: true, **BUTTON_STYLE + end + + flow(width: 1.0, height: 24, margin: 4) do + para "Music", fill: true + slider height: 1.0, width: 172, margin_right: 8 + toggle_button tip:"Music", checked: true, **BUTTON_STYLE + end + + flow(width: 1.0, height: 24, margin: 4) do + para "Cinematic", fill: true + slider height: 1.0, width: 172, margin_right: 8 + toggle_button tip: "Cinematic", checked: true, **BUTTON_STYLE + end + end + + stack(width: 0.5, height: 1.0) do + caption "Performance" + flow(width: 1.0, height: 24, margin: 4) do + para "Texture Detail", fill: true + list_box items: ["Low", "Medium", "High"], width: 128, **BUTTON_STYLE + end + + flow(width: 1.0, height: 24, margin: 4) do + para "Shader Detail", fill: true + list_box items: ["Low", "Medium", "High"], width: 128, **BUTTON_STYLE + end + + flow(width: 1.0, height: 24, margin: 4) do + para "Post Proccessing Detail", fill: true + list_box items: ["Low", "Medium", "High"], width: 128, **BUTTON_STYLE + end + + flow(width: 1.0, height: 24, margin: 4) do + para "Shadow Detail", fill: true + list_box items: ["Low", "Medium", "High"], width: 128, **BUTTON_STYLE + end + + flow(width: 1.0, height: 24, margin: 4) do + para "High Quality Shadows", fill: true + toggle_button tip: "High Quality Shadows", **BUTTON_STYLE + end + end + end + end + + flow(width: 1.0, height: 0.1, padding: 8) do + button "Cancel", width: 0.25 do + pop_state + @options[:cancel_callback]&.call + end + + flow(fill: true) + + button "WWConfig", width: 0.25 do + pop_state + Store.application_manager.wwconfig(@options[:app_id], @options[:channel]) + end + + flow(fill: true) + + button "Save", width: 0.25 do + pop_state + @options[:accept_callback]&.call + end + end + end + end + + def draw + previous_state&.draw + + Gosu.flush + + super + end + end + end +end diff --git a/lib/theme.rb b/lib/theme.rb index abbac2c..9e9b3d2 100644 --- a/lib/theme.rb +++ b/lib/theme.rb @@ -76,6 +76,24 @@ class W3DHub ListBox: { padding_left: 8, padding_right: 8 + }, + Slider: { + border_color: 0xff_00acff + }, + Handle: { + text_size: 18, + padding_top: 8, + padding_left: 2, + padding_right: 2, + padding_bottom: 8, + border_color: Gosu::Color::NONE, + background: 0xff_00acff, + hover: { + background: 0xff_bee6fd + }, + active: { + background: 0xff_add5ec + } } } end diff --git a/w3d_hub_linux_launcher.rb b/w3d_hub_linux_launcher.rb index 75d65eb..c845522 100644 --- a/w3d_hub_linux_launcher.rb +++ b/w3d_hub_linux_launcher.rb @@ -87,6 +87,7 @@ require_relative "lib/states/message_dialog" require_relative "lib/states/prompt_dialog" require_relative "lib/states/confirm_dialog" require_relative "lib/states/direct_connect_dialog" +require_relative "lib/states/game_settings_dialog" require_relative "lib/api" require_relative "lib/api/service_status"