From d3b3119c9d4d63a51bcaffc871ced2a38051c89c Mon Sep 17 00:00:00 2001 From: Nathan Adams Date: Wed, 24 Apr 2024 22:20:34 +0200 Subject: [PATCH] desktop: Made player_version Option --- desktop/src/gui/dialogs/open_dialog.rs | 40 ++++++++++++++++++++++---- desktop/src/player.rs | 6 ++-- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/desktop/src/gui/dialogs/open_dialog.rs b/desktop/src/gui/dialogs/open_dialog.rs index d015b9cfd..4debac1e2 100644 --- a/desktop/src/gui/dialogs/open_dialog.rs +++ b/desktop/src/gui/dialogs/open_dialog.rs @@ -3,8 +3,7 @@ use crate::gui::text; use crate::gui::widgets::PathOrUrlField; use crate::player::LaunchOptions; use egui::{ - Align2, Button, Checkbox, ComboBox, DragValue, Grid, Layout, Slider, TextEdit, Ui, Widget, - Window, + emath, Align2, Button, Checkbox, ComboBox, Grid, Layout, Slider, TextEdit, Ui, Widget, Window, }; use ruffle_core::backend::navigator::{OpenURLMode, SocketMode}; use ruffle_core::config::Letterbox; @@ -38,6 +37,7 @@ pub struct OpenDialog { scale_mode: OptionalField>>, load_behavior: OptionalField>, letterbox: OptionalField>, + player_version: OptionalField>, } impl OpenDialog { @@ -198,6 +198,8 @@ impl OpenDialog { }), ), ); + let player_version = + OptionalField::new(defaults.player_version, NumberField::new(1..=32, 32)); Self { options: defaults, @@ -215,6 +217,7 @@ impl OpenDialog { scale_mode, load_behavior, letterbox, + player_version, } } @@ -429,9 +432,8 @@ impl OpenDialog { ui.end_row(); ui.label(text(locale, "player-version")); - DragValue::new(&mut self.options.player_version) - .clamp_range(1..=32) - .ui(ui); + self.player_version + .ui(ui, &mut self.options.player_version, locale); ui.end_row(); ui.label(text(locale, "custom-framerate")); @@ -580,6 +582,34 @@ impl InnerField for DurationField { } } +struct NumberField { + range: RangeInclusive, + default: T, +} + +impl NumberField { + pub fn new(range: RangeInclusive, default: T) -> Self { + Self { range, default } + } +} + +impl InnerField for NumberField { + type Value = T; + type Result = T; + + fn value_if_missing(&self) -> Self::Value { + self.default + } + + fn ui(&self, ui: &mut Ui, value: &mut Self::Value, _error: bool, _locale: &LanguageIdentifier) { + Slider::new(value, self.range.clone()).ui(ui); + } + + fn value_to_result(&self, value: &Self::Value) -> Result { + Ok(*value) + } +} + type ValueToTextFn = dyn Fn(T, &LanguageIdentifier) -> Cow<'static, str>; type CheckboxLabelFn = dyn Fn(&LanguageIdentifier) -> Cow<'static, str>; diff --git a/desktop/src/player.rs b/desktop/src/player.rs index 1fbfff6c1..be9c9299d 100644 --- a/desktop/src/player.rs +++ b/desktop/src/player.rs @@ -54,7 +54,7 @@ pub struct LaunchOptions { pub save_directory: PathBuf, pub letterbox: Option, pub spoof_url: Option, - pub player_version: u8, + pub player_version: Option, pub player_runtime: PlayerRuntime, pub frame_rate: Option, pub open_url_mode: OpenURLMode, @@ -89,7 +89,7 @@ impl From<&GlobalPreferences> for LaunchOptions { save_directory: value.cli.save_directory.clone(), letterbox: value.cli.letterbox, spoof_url: value.cli.spoof_url.clone(), - player_version: value.cli.player_version.unwrap_or(32), + player_version: value.cli.player_version, player_runtime: value.cli.player_runtime, frame_rate: value.cli.frame_rate, open_url_mode: value.cli.open_url_mode, @@ -239,7 +239,7 @@ impl ActivePlayer { .with_load_behavior(opt.load_behavior.unwrap_or(LoadBehavior::Streaming)) .with_spoofed_url(opt.spoof_url.clone().map(|url| url.to_string())) .with_page_url(opt.spoof_url.clone().map(|url| url.to_string())) - .with_player_version(Some(opt.player_version)) + .with_player_version(opt.player_version) .with_player_runtime(opt.player_runtime) .with_frame_rate(opt.frame_rate) .with_avm2_optimizer_enabled(opt.avm2_optimizer_enabled);