Update UI, respect multitouch

This commit is contained in:
Dominic Zimmer 2022-10-29 14:43:14 +02:00
parent fe6242cbbf
commit 3b459606e4
4 changed files with 59 additions and 14 deletions

View File

@ -27,6 +27,9 @@
--button-color: lightgrey; --button-color: lightgrey;
} }
body {
background-color: black;
}
.button { .button {
line-height: var(--button-height); line-height: var(--button-height);

View File

@ -10,13 +10,15 @@ const Client = () => {
const [socket, setSocket] = useState<WebSocket>(); const [socket, setSocket] = useState<WebSocket>();
const [buttonMap, setButtonMap] = useState<ButtonMap>(defaultButtonMap); const [buttonMap, setButtonMap] = useState<ButtonMap>(defaultButtonMap);
const updateButtonEvent = (button: ButtonType, state: "down" | "up") => const updateButtonEvent = (button: ButtonType, buttonState: "down" | "up") =>
() => setButtonMap((m) => { () => setButtonMap((m) => {
const newMap = { ...m, [button]: (state === "down") }; const newMap = { ...m, [button]: (buttonState === "down") };
if (mapToBitvector(newMap).reduce((a,b) => a+b, 0) > 1) { const multitouch = !!state.allowMultitouch;
return m; const multiInput = mapToBitvector(newMap).reduce((a,b) => a+b, 0) > 1;
} else { if (!multiInput || multitouch) {
return newMap; return newMap;
} else {
return m;
} }
}); });

View File

@ -16,6 +16,7 @@ span {
} }
.timer { .timer {
width: 75px;
font-weight: bold; font-weight: bold;
text-align: right; text-align: right;
} }
@ -43,19 +44,47 @@ span {
.row { .row {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: space-between; justify-content: space-around;
padding: 0px 10px; padding: 0px 10px;
} }
.vote { .vote {
display: flex;
flex-direction: row;
justify-content: space-between;
width: 100%;
}
.vote .bar {
color: white;
font-size: 24pt; font-size: 24pt;
text-transform: uppercase; text-transform: uppercase;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
gap: 30px;
border-radius: 5px;
background-color: #3a3a3a;
max-width: 200px;
width: var(--vote-percentage, 0px);
} }
.vote .percentage {
font-weight: bold;
line-height: 100%;
align-items: center;
display: inline-flex;
}
.vote .bar-wrap {
width: 70%;
}
.voting { .voting {
background: #040404;
border-radius: 20px;
padding: 4px;
gap: 2px;
margin: 15%; margin: 15%;
display: flex;
flex-direction: column;
align-items: flex-start;
} }
pre { pre {

View File

@ -1,5 +1,4 @@
import { useEffect, useMemo, useState } from 'react'; import { CSSProperties, useEffect, useMemo, useState } from 'react';
import './Client.css';
import './TVMode.css'; import './TVMode.css';
import { ButtonType, buttonTypeList, WGPPState } from './types'; import { ButtonType, buttonTypeList, WGPPState } from './types';
@ -27,7 +26,11 @@ const TVMode = () => {
}, []) }, [])
const totalCount = useMemo(() => buttonTypeList.reduce((acc, v) => (state?.votes?.[v] ?? 0) + acc, 0), [state]); const totalCount = useMemo(() => buttonTypeList.reduce((acc, v) => (state?.votes?.[v] ?? 0) + acc, 0), [state]);
const voteList = useMemo(() => buttonTypeList.map(b => [b, state?.votes?.[b] ?? 0] as [ButtonType, number]).sort((a, b) => b[1] - a[1]), [state]); const voteList = useMemo(() =>
buttonTypeList
.map(b => [b, state?.votes?.[b] ?? 0] as [ButtonType, number])
//.sort((a, b) => b[1] - a[1])
, [state]);
return <div className="stream"> return <div className="stream">
{state === undefined ? {state === undefined ?
@ -35,14 +38,22 @@ const TVMode = () => {
<div> <div>
<span className={`mode mode-${state.mode}`}>{state.mode}</span> <span className={`mode mode-${state.mode}`}>{state.mode}</span>
<div className="row"> <div className="row">
<span className="subtitle">next: {state.nextMode}</span> <div>
<span>
next:&nbsp;
</span>
<span className={`subtitle mode-${state.nextMode}`}>{state.nextMode}</span>
</div>
<span className="timer">{Math.round(state.timeUntilNextMode ?? 0)}s </span> <span className="timer">{Math.round(state.timeUntilNextMode ?? 0)}s </span>
</div> </div>
<div className="voting"> <div className="voting">
{voteList.flatMap(([b, numVotes], index) => { {voteList.flatMap(([b, numVotes], index) => {
const percentage = numVotes === 0 ? "" : Math.round(numVotes / totalCount * 100) + "%"; const percentage = numVotes === 0 ? 0 : Math.round(numVotes / totalCount * 100);
return <div className="vote" key={index}> return <div className="vote" style={{ "--vote-percentage": percentage + "%" } as CSSProperties} key={index}>
<span>{b}</span><span>{percentage}</span> <div className="bar-wrap">
<div className="bar" style={{ "--vote-percentage": percentage + "%" } as CSSProperties} >{b}</div>
</div>
<span className="percentage">{percentage === 0 ? "" : `${percentage}%`}</span>
</div>; </div>;
})} })}
</div> </div>