desktop: Use new PlayerOptions struct for player building, not CLI args directly

This commit is contained in:
Nathan Adams 2023-05-25 22:14:45 +02:00
parent 558fea2a7c
commit a86aff07a6
2 changed files with 72 additions and 9 deletions

View File

@ -1,7 +1,7 @@
use crate::cli::Opt; use crate::cli::Opt;
use crate::custom_event::RuffleEvent; use crate::custom_event::RuffleEvent;
use crate::gui::{GuiController, MENU_HEIGHT}; use crate::gui::{GuiController, MENU_HEIGHT};
use crate::player::PlayerController; use crate::player::{PlayerController, PlayerOptions};
use crate::util::{ use crate::util::{
get_screen_size, parse_url, pick_file, winit_key_to_char, winit_to_ruffle_key_code, get_screen_size, parse_url, pick_file, winit_key_to_char, winit_to_ruffle_key_code,
winit_to_ruffle_text_control, winit_to_ruffle_text_control,
@ -68,7 +68,11 @@ impl App {
); );
if let Some(movie_url) = movie_url { if let Some(movie_url) = movie_url {
player.create(&opt, movie_url, gui.create_movie_view()); player.create(
&PlayerOptions::from(&opt),
movie_url,
gui.create_movie_view(),
);
} }
Ok(Self { Ok(Self {
@ -199,7 +203,11 @@ impl App {
if let Ok(url) = parse_url(&file) { if let Ok(url) = parse_url(&file) {
let movie_view = let movie_view =
self.gui.lock().expect("Gui lock").create_movie_view(); self.gui.lock().expect("Gui lock").create_movie_view();
self.player.create(&self.opt, url, movie_view); self.player.create(
&PlayerOptions::from(&self.opt),
url,
movie_view,
);
} }
} }
WindowEvent::MouseInput { button, state, .. } => { WindowEvent::MouseInput { button, state, .. } => {
@ -432,7 +440,7 @@ impl App {
// TODO: Show dialog on error. // TODO: Show dialog on error.
let url = parse_url(&path).expect("Couldn't load specified path"); let url = parse_url(&path).expect("Couldn't load specified path");
self.player.create( self.player.create(
&self.opt, &PlayerOptions::from(&self.opt),
url, url,
self.gui.lock().expect("Gui lock").create_movie_view(), self.gui.lock().expect("Gui lock").create_movie_view(),
); );
@ -441,7 +449,7 @@ impl App {
winit::event::Event::UserEvent(RuffleEvent::OpenURL(url)) => { winit::event::Event::UserEvent(RuffleEvent::OpenURL(url)) => {
self.player.create( self.player.create(
&self.opt, &PlayerOptions::from(&self.opt),
url, url,
self.gui.lock().expect("Gui lock").create_movie_view(), self.gui.lock().expect("Gui lock").create_movie_view(),
); );

View File

@ -8,8 +8,11 @@ use crate::gui::MovieView;
use crate::{CALLSTACK, RENDER_INFO, SWF_INFO}; use crate::{CALLSTACK, RENDER_INFO, SWF_INFO};
use anyhow::anyhow; use anyhow::anyhow;
use ruffle_core::backend::audio::AudioBackend; use ruffle_core::backend::audio::AudioBackend;
use ruffle_core::{Player, PlayerBuilder, PlayerEvent}; use ruffle_core::backend::navigator::OpenURLMode;
use ruffle_core::config::Letterbox;
use ruffle_core::{LoadBehavior, Player, PlayerBuilder, PlayerEvent, StageScaleMode};
use ruffle_render::backend::RenderBackend; use ruffle_render::backend::RenderBackend;
use ruffle_render::quality::StageQuality;
use ruffle_render_wgpu::backend::WgpuRenderBackend; use ruffle_render_wgpu::backend::WgpuRenderBackend;
use ruffle_render_wgpu::descriptors::Descriptors; use ruffle_render_wgpu::descriptors::Descriptors;
use std::rc::Rc; use std::rc::Rc;
@ -19,6 +22,58 @@ use url::Url;
use winit::event_loop::EventLoopProxy; use winit::event_loop::EventLoopProxy;
use winit::window::Window; use winit::window::Window;
/// Options used when creating a Player (& passed through to a PlayerBuilder).
/// These may be primed by command line arguments.
pub struct PlayerOptions {
pub parameters: Vec<(String, String)>,
pub width: Option<f64>,
pub height: Option<f64>,
pub max_execution_duration: f64,
pub base: Option<Url>,
pub quality: StageQuality,
pub scale: StageScaleMode,
pub volume: f32,
pub force_scale: bool,
pub proxy: Option<Url>,
pub upgrade_to_https: bool,
pub fullscreen: bool,
pub timedemo: bool,
pub dont_warn_on_unsupported_content: bool,
pub load_behavior: LoadBehavior,
pub letterbox: Letterbox,
pub spoof_url: Option<Url>,
pub player_version: Option<u8>,
pub frame_rate: Option<f64>,
pub open_url_mode: OpenURLMode,
}
impl From<&Opt> for PlayerOptions {
fn from(value: &Opt) -> Self {
Self {
parameters: value.parameters().collect(),
width: value.width,
height: value.height,
max_execution_duration: value.max_execution_duration,
base: value.base.clone(),
quality: value.quality,
scale: value.scale,
volume: value.volume,
force_scale: value.force_scale,
proxy: value.proxy.clone(),
upgrade_to_https: value.upgrade_to_https,
fullscreen: value.fullscreen,
timedemo: value.timedemo,
dont_warn_on_unsupported_content: value.dont_warn_on_unsupported_content,
load_behavior: value.load_behavior,
letterbox: value.letterbox,
spoof_url: value.spoof_url.clone(),
player_version: value.player_version,
frame_rate: value.frame_rate,
open_url_mode: value.open_url_mode,
}
}
}
/// Represents a current Player and any associated state with that player, /// Represents a current Player and any associated state with that player,
/// which may be lost when this Player is closed (dropped) /// which may be lost when this Player is closed (dropped)
struct ActivePlayer { struct ActivePlayer {
@ -28,7 +83,7 @@ struct ActivePlayer {
impl ActivePlayer { impl ActivePlayer {
pub fn new( pub fn new(
opt: &Opt, opt: &PlayerOptions,
event_loop: EventLoopProxy<RuffleEvent>, event_loop: EventLoopProxy<RuffleEvent>,
movie_url: Url, movie_url: Url,
window: Rc<Window>, window: Rc<Window>,
@ -100,7 +155,7 @@ impl ActivePlayer {
}; };
let mut parameters: Vec<(String, String)> = movie_url.query_pairs().into_owned().collect(); let mut parameters: Vec<(String, String)> = movie_url.query_pairs().into_owned().collect();
parameters.extend(opt.parameters()); parameters.extend(opt.parameters.to_owned());
{ {
let mut player_lock = player.lock().expect("Player lock must be available"); let mut player_lock = player.lock().expect("Player lock must be available");
@ -137,7 +192,7 @@ impl PlayerController {
} }
} }
pub fn create(&mut self, opt: &Opt, movie_url: Url, movie_view: MovieView) { pub fn create(&mut self, opt: &PlayerOptions, movie_url: Url, movie_view: MovieView) {
self.player = Some(ActivePlayer::new( self.player = Some(ActivePlayer::new(
opt, opt,
self.event_loop.clone(), self.event_loop.clone(),