Skip to content
This repository was archived by the owner on Dec 23, 2021. It is now read-only.

Commit 61d8149

Browse files
Merge pull request #153 from microsoft/users/t-luslev/shake-the-cpx
Make the cpx shake
2 parents 67d532f + 37ba441 commit 61d8149

File tree

5 files changed

+80
-5
lines changed

5 files changed

+80
-5
lines changed

src/requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ pytest==5.0.1
44
applicationinsights==0.11.9
55
python-socketio==4.3.1
66
requests==2.22.0
7-
pywin32==227; platform_system == "Windows"
7+
pywin32==227; platform_system == "Windows"

src/view/components/toolbar/MotionSensorBar.tsx

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import * as React from "react";
55
import InputSlider from "./InputSlider";
66
import SensorButton from "./SensorButton";
7+
import svg from "../cpx/Svg_utils";
78

89
import { CONSTANTS } from "../../constants";
910
import "../../styles/MotionSensorBar.css";
@@ -162,15 +163,21 @@ class MotionSensorBar extends React.Component {
162163
);
163164
}
164165

165-
private onMouseDown = () => this.handleOnclick(true, "shake");
166+
private onMouseDown = (event: React.PointerEvent<HTMLButtonElement>) => {
167+
this.updateShakePress(true, event.currentTarget.id);
168+
this.handleOnclick(true, "shake");
169+
};
166170

167171
private onKeyUp = (event: React.KeyboardEvent<HTMLButtonElement>) =>
168172
this.onKeyEvent(event, false);
169173

170174
private onKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>) =>
171175
this.onKeyEvent(event, true);
172176

173-
private onMouseUp = () => this.handleOnclick(false, "shake");
177+
private onMouseUp = (event: React.PointerEvent<HTMLButtonElement>) => {
178+
this.updateShakePress(false, event.currentTarget.id);
179+
this.handleOnclick(false, "shake");
180+
};
174181

175182
private handleOnclick = (active: boolean, type: string) => {
176183
const messageState = { [type]: active };
@@ -187,6 +194,19 @@ class MotionSensorBar extends React.Component {
187194
this.handleOnclick(active, "shake");
188195
}
189196
}
197+
198+
private updateShakePress = (shakeState: boolean, id: string): void => {
199+
const svgElement = window.document.getElementById("cpx_svg");
200+
const buttonElement = window.document.getElementById(id);
201+
const cpxSvg: SVGElement = (svgElement as unknown) as SVGElement;
202+
203+
if (svgElement && cpxSvg && buttonElement) {
204+
buttonElement.setAttribute("aria-pressed", shakeState.toString());
205+
shakeState
206+
? svg.addClass(cpxSvg, "shake-pressed")
207+
: svg.removeClass(cpxSvg, "shake-pressed");
208+
}
209+
};
190210
}
191211

192212
export default MotionSensorBar;

src/view/components/toolbar/SensorButton.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { ISensorButtonProps } from "../../viewUtils";
88
const SensorButton: React.FC<ISensorButtonProps> = props => {
99
return (
1010
<button
11+
id={`${props.label}-button`}
1112
onMouseUp={props.onMouseUp}
1213
onMouseDown={props.onMouseDown}
1314
onKeyUp={props.onKeyUp}

src/view/styles/Simulator.css

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,57 @@
1818
.file-selector {
1919
padding: 20px;
2020
}
21+
22+
.shake-pressed {
23+
/* Start the shake animation and make the animation last for 0.5 seconds */
24+
animation: shake 0.5s;
25+
26+
/* When the animation is finished, start again */
27+
animation-iteration-count: infinite;
28+
}
29+
30+
@keyframes shake {
31+
0% {
32+
transform: translate(1px, 1px) rotate(0deg);
33+
}
34+
10% {
35+
transform: translate(-1px, -2px) rotate(-1deg);
36+
}
37+
20% {
38+
transform: translate(-3px, 0px) rotate(1deg);
39+
}
40+
30% {
41+
transform: translate(3px, 2px) rotate(0deg);
42+
}
43+
40% {
44+
transform: translate(1px, -1px) rotate(1deg);
45+
}
46+
50% {
47+
transform: translate(-1px, 2px) rotate(-1deg);
48+
}
49+
60% {
50+
transform: translate(-3px, 1px) rotate(0deg);
51+
}
52+
70% {
53+
transform: translate(3px, 1px) rotate(-1deg);
54+
}
55+
80% {
56+
transform: translate(-1px, -1px) rotate(1deg);
57+
}
58+
90% {
59+
transform: translate(1px, 2px) rotate(0deg);
60+
}
61+
100% {
62+
transform: translate(1px, -2px) rotate(-1deg);
63+
}
64+
}
65+
66+
.simulator {
67+
display: flex;
68+
flex-direction: column;
69+
justify-content: center;
70+
max-width: 700px;
71+
max-height: 700px;
72+
margin-left: auto;
73+
margin-right: auto;
74+
}

src/view/viewUtils.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ export interface ISliderProps {
1212
export interface ISensorButtonProps {
1313
label: string;
1414
type: string;
15-
onMouseUp: () => void;
16-
onMouseDown: () => void;
15+
onMouseUp: (event: React.PointerEvent<HTMLButtonElement>) => void;
16+
onMouseDown: (event: React.PointerEvent<HTMLButtonElement>) => void;
1717
onKeyUp: (event: React.KeyboardEvent<HTMLButtonElement>) => void;
1818
onKeyDown: (event: React.KeyboardEvent<HTMLButtonElement>) => void;
1919
}

0 commit comments

Comments
 (0)