From: Ian Jackson Date: Thu, 26 Nov 2020 00:10:54 +0000 (+0000) Subject: Landscape mode via url X-Git-Tag: otter-0.2.0~359 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=c0f3f0babfc19761adc8d2b4bf24dc6c236c8948;p=otter.git Landscape mode via url Signed-off-by: Ian Jackson --- diff --git a/Cargo.lock.example b/Cargo.lock.example index c27d1cfa..6b1e531d 100644 --- a/Cargo.lock.example +++ b/Cargo.lock.example @@ -646,6 +646,15 @@ dependencies = [ "serde", ] +[[package]] +name = "heck" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "hermit-abi" version = "0.1.17" @@ -1152,6 +1161,7 @@ dependencies = [ "serde_json", "serde_with", "slotmap", + "strum", "thiserror", "toml 0.5.7", "typetag", @@ -1703,6 +1713,27 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" +[[package]] +name = "strum" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7318c509b5ba57f18533982607f24070a55d353e90d4cae30c467cdb2ad5ac5c" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee8bc6b87a5112aeeab1f4a9f7ab634fe6cbefc4850006df31267f4cfb9e3149" +dependencies = [ + "heck", + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn 1.0.48", +] + [[package]] name = "subtle" version = "1.0.0" @@ -1987,6 +2018,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-segmentation" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" + [[package]] name = "unicode-xid" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index cc055521..9b580e5f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -58,6 +58,7 @@ serde = { version = "1", features = ["derive","rc"] } serde_json = "1" serde_with = "1" slotmap = { version = "0.4", features = ['serde'] } +strum = { version = "0.20", features = ['derive'] } thiserror = "1" toml = "0.5" typetag = "0.1.6" diff --git a/src/api.rs b/src/api.rs index 77f11b48..621a8141 100644 --- a/src/api.rs +++ b/src/api.rs @@ -6,6 +6,28 @@ use crate::imports::*; type WRC = WhatResponseToClientOp; +#[derive(Clone,Copy,Debug,Eq,PartialEq,Serialize,Deserialize,EnumString)] +pub enum PresentationLayout { + Portrait, + Landscape, +} + +impl<'r> FromParam<'r> for PresentationLayout { + type Error = strum::ParseError; + fn from_param(param: &'r RawStr) -> Result { + param.as_str().parse() + } +} + +impl PresentationLayout { + pub fn template(self) -> &'static str { + match self { + PresentationLayout::Portrait => "session", + PresentationLayout::Landscape => "landscape", + } + } +} + #[derive(Debug,Serialize,Deserialize)] struct ApiPiece { ctoken : RawToken, diff --git a/src/bin/daemon-otter.rs b/src/bin/daemon-otter.rs index a91ba444..6b12c962 100644 --- a/src/bin/daemon-otter.rs +++ b/src/bin/daemon-otter.rs @@ -57,13 +57,27 @@ impl<'r> FromParam<'r> for CheckedResourceLeaf { #[derive(Serialize,Debug)] struct LoadingRenderContext<'r> { - ptoken : &'r RawTokenVal, + ptoken: &'r RawTokenVal, + layout: PresentationLayout, } #[get("/")] #[throws(OE)] -fn loading(ptoken: WholeQueryString) -> Template { +fn loading_p(ptoken: WholeQueryString) -> Template { + loading(PresentationLayout::Portrait, ptoken)? +} +#[get("/l")] +#[throws(OE)] +fn loading_l(ptoken: WholeQueryString) -> Template { + loading(PresentationLayout::Landscape, ptoken)? +} + +#[throws(OE)] +fn loading(layout: PresentationLayout, ptoken: WholeQueryString) -> Template { if let Some(ptoken) = ptoken.0 { - let c = LoadingRenderContext { ptoken : RawTokenVal::from_str(ptoken) }; + let c = LoadingRenderContext { + ptoken: RawTokenVal::from_str(ptoken), + layout, + }; Template::render("loading",&c) } else { let c = FrontPageRenderContext { }; @@ -209,7 +223,8 @@ fn main() { .attach(Template::fairing()) .manage(cors_state) .mount("/", routes![ - loading, + loading_l, + loading_p, resource, updates, ]) diff --git a/src/imports.rs b/src/imports.rs index 6d4d575e..d5323121 100644 --- a/src/imports.rs +++ b/src/imports.rs @@ -32,6 +32,7 @@ pub use std::mem; pub use std::os::unix; pub use std::time::Instant; pub use std::path::PathBuf; +pub use std::string::ParseError; pub use std::os::unix::ffi::OsStrExt; pub use std::env; pub use std::process::exit; @@ -111,6 +112,8 @@ pub use either::{Either,Left,Right}; pub use if_chain::if_chain; +pub use strum::EnumString; + pub use crate::global::*; pub use crate::gamestate::*; pub use crate::pieces::*; @@ -123,6 +126,7 @@ pub use crate::slotmap_slot_idx::*; pub use crate::cmdlistener::*; pub use crate::mgmtchannel::*; pub use crate::api::{Lens,TransparentLens,ApiPieceOpError}; +pub use crate::api::{PresentationLayout}; pub use crate::utils::*; pub use crate::spec::*; pub use crate::debugreader::DebugReader; diff --git a/src/session.rs b/src/session.rs index 736f5a79..b14e4170 100644 --- a/src/session.rs +++ b/src/session.rs @@ -53,8 +53,9 @@ struct DataLoadPlayer { struct SessionForm { ptoken : RawToken, } -#[post("/_/session", format="json", data="
")] -fn session(form : Json) -> Result { +#[post("/_/session/", format="json", data="")] +fn session(form : Json, layout: PresentationLayout) + -> Result { // make session in this game, log a message to other players let iad = lookup_token(form.ptoken.borrow())?; let player = iad.ident; @@ -187,7 +188,7 @@ fn session(form : Json) -> Result { &player, client, &c.nick, &c.ctoken, iad.gref.lock().ok().as_ref().map(|ig| &**ig)); - Ok(Template::render("session",&c)) + Ok(Template::render(layout.template(),&c)) } pub fn mount(rocket_instance: Rocket) -> Rocket { diff --git a/templates/loading.tera b/templates/loading.tera index f011ede4..ddd1ea0f 100644 --- a/templates/loading.tera +++ b/templates/loading.tera @@ -6,6 +6,7 @@ + diff --git a/templates/script.ts b/templates/script.ts index 2610224d..04e96116 100644 --- a/templates/script.ts +++ b/templates/script.ts @@ -87,6 +87,7 @@ type PieceErrorHandler = (piece: PieceId, p: PieceInfo, m: PieceOpError) => boolean; interface DispatchTable { [key: string]: H }; +var globalinfo_elem : HTMLElement; var general_timeout : number = 10000; var messages : DispatchTable = Object(); var pieceops : DispatchTable = Object(); @@ -1148,9 +1149,11 @@ var wasm_promise : Promise;; function doload(){ console.log('DOLOAD'); + globalinfo_elem = document.getElementById('global-info')!; + let layout = globalinfo_elem!.dataset!.layout!; var elem = document.getElementById('loading_token')!; var ptoken = elem.dataset.ptoken; - xhr_post_then('/_/session', + xhr_post_then('/_/session/' + layout, JSON.stringify({ ptoken : ptoken }), loaded);