From: Ian Jackson Date: Wed, 17 Mar 2021 18:04:53 +0000 (+0000) Subject: clock: wip rendering X-Git-Tag: otter-0.5.0~665 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=276cfb6d9e0d2e6f6f027211adf8c79923eb7b9f;p=otter.git clock: wip rendering Signed-off-by: Ian Jackson --- diff --git a/src/clock.rs b/src/clock.rs index 23ee84e5..70a3259e 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -136,8 +136,8 @@ enum URenderState { use URenderState as URS; impl Clock { - fn urender<'r>(&self, state: &State, gplayers: &'r GPlayers, gpc: &GPiece) - -> [URender<'r>; N] + fn urender<'r>(&self, state: &State, held: Option, + gplayers: &'r GPlayers) -> [URender<'r>; N] { let mut r: [URender;N] = izip!( USERS.iter(), @@ -153,7 +153,7 @@ impl Clock { if let Some(running) = &state.running { if running.user != user { URS::Inactive - } else if gpc.held.is_some() { + } else if held.is_some() { URS::ActiveHeld } else { URS::Running @@ -185,8 +185,8 @@ impl Clock { // ==================== rendering ==================== -const W: Coord = 50; -const H: Coord = 20; +const W: Coord = 40; +const H: Coord = 14; const OUTLINE: Rectangle = Rectangle { xy: PosC([W as f64, H as f64]) }; @@ -227,19 +227,84 @@ impl PieceTrait for Clock { fn nfaces(&self) -> RawFaceId { 1 } #[throws(IE)] - fn svg_piece(&self, f: &mut Html, _gpc: &GPiece, _gs: &GameState, id: VisiblePieceId) { - dbgc!("rendering", id); - write!( &mut f.0, r##" - - "##, W, H - )?; -/* - let urs = + fn svg_piece(&self, f: &mut Html, gpc: &GPiece, gs: &GameState, + vpid: VisiblePieceId) { + let f = &mut f.0; + let state = gpc.xdata()? + .ok_or_else(|| internal_logic_error("missing/wrong xdata"))?; + let urenders = self.urender(&state, gpc.held, &gs.players); + + // player missing, nick is red and pink - dbg - for (i,u) in USERS.iter().enumerate() { - - }*/ + const Y: &[f32] = &[ 0., 7. ]; + + struct Show { + text: &'static str, + background: &'static str, + sigil: &'static str, + } + + impl URenderState { + fn show(self) -> Show { + use URS::*; + let (text, background, sigil) = match self { + Running => ("black", "yellow", "▶" /* > */ ), + ActiveHeld => ("black", "yellow", "‖" /* || */ ), + Inactive => ("black", "white", ":" ), + Stopped => ("black", "lightblue", "□" /* [] */ ), + Reset => ("black", "lightgreen", "○" /* O */ ), + Flag => ("white", "red", "⚑" /* F */ ), + }; + Show { text, background, sigil } + } + } + + write!(f, r##" +"##, + )?; + for (y, u) in izip!(Y.iter(), urenders.iter()) { + write!(f, r##" + "##, + y, + u.st.show().background, + )?; + } + write!(f, r##" + + "##, + vpid + )?; + for (y, u) in izip!(Y.iter(), urenders.iter()) { + let y = y + 6.; + let show = u.st.show(); + let mins = u.remaining.tv_sec() / 60; + let secs = u.remaining.tv_sec() % 60; + + write!(f, r##" + {:>3}{}{:02}"##, + y, + show.text, + mins, + show.sigil, + secs + )?; + if let Some(nick) = u.nick { + write!(f, r##" + {}"##, + y, + vpid, + htmlescape::encode_minimal(nick), + )?; + } else { + write!(f, r##" +   -"## + )?; + } + } + write!(f, r##" +"##)?; } #[throws(IE)]