Skip to content

Commit 69d67ad

Browse files
authored
Merge pull request #342 from flipcomputing/codex/update-camera-rotate-button-key-support
Expand camera control key bindings to full when-key-event range
2 parents 6bbbf2e + 3497fd9 commit 69d67ad

4 files changed

Lines changed: 110 additions & 26 deletions

File tree

api/camera.js

Lines changed: 57 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -237,54 +237,99 @@ export const flockCamera = {
237237
return "__active_camera__";
238238
},
239239
cameraControl(key, action) {
240+
const keyMap = {
241+
ArrowLeft: 37,
242+
ArrowUp: 38,
243+
ArrowRight: 39,
244+
ArrowDown: 40,
245+
" ": 32,
246+
",": 188,
247+
".": 190,
248+
"/": 191,
249+
};
250+
251+
const normalizeKeyCode = (inputKey) => {
252+
if (typeof inputKey === "number") {
253+
return inputKey;
254+
}
255+
256+
if (typeof inputKey !== "string") {
257+
return null;
258+
}
259+
260+
if (/^[0-9]$/.test(inputKey)) {
261+
return inputKey.charCodeAt(0);
262+
}
263+
264+
if (/^\d{2,}$/.test(inputKey)) {
265+
return Number(inputKey);
266+
}
267+
268+
if (keyMap[inputKey] != null) {
269+
return keyMap[inputKey];
270+
}
271+
272+
if (/^[a-z]$/i.test(inputKey)) {
273+
return inputKey.toUpperCase().charCodeAt(0);
274+
}
275+
276+
return null;
277+
};
278+
279+
const normalizedKey = normalizeKeyCode(key);
280+
if (normalizedKey == null) {
281+
console.warn("Unsupported camera control key:", key);
282+
return;
283+
}
284+
240285
// Define a local function to handle the camera actions
241286
function handleCameraAction() {
242287
if (flock.scene.activeCamera.keysRotateLeft) {
243288
// FreeCamera specific controls
244289
switch (action) {
245290
case "moveUp":
246-
flock.scene.activeCamera.keysUp.push(key);
291+
flock.scene.activeCamera.keysUp.push(normalizedKey);
247292
break;
248293
case "moveDown":
249-
flock.scene.activeCamera.keysDown.push(key);
294+
flock.scene.activeCamera.keysDown.push(normalizedKey);
250295
break;
251296
case "moveLeft":
252-
flock.scene.activeCamera.keysLeft.push(key);
297+
flock.scene.activeCamera.keysLeft.push(normalizedKey);
253298
break;
254299
case "moveRight":
255-
flock.scene.activeCamera.keysRight.push(key);
300+
flock.scene.activeCamera.keysRight.push(normalizedKey);
256301
break;
257302
case "rotateUp":
258-
flock.scene.activeCamera.keysRotateUp.push(key);
303+
flock.scene.activeCamera.keysRotateUp.push(normalizedKey);
259304
break;
260305
case "rotateDown":
261-
flock.scene.activeCamera.keysRotateDown.push(key);
306+
flock.scene.activeCamera.keysRotateDown.push(normalizedKey);
262307
break;
263308
case "rotateLeft":
264-
flock.scene.activeCamera.keysRotateLeft.push(key);
309+
flock.scene.activeCamera.keysRotateLeft.push(normalizedKey);
265310
break;
266311
case "rotateRight":
267-
flock.scene.activeCamera.keysRotateRight.push(key);
312+
flock.scene.activeCamera.keysRotateRight.push(normalizedKey);
268313
break;
269314
}
270315
} else {
271316
// ArcRotateCamera specific controls
272317
switch (action) {
273318
case "rotateLeft":
274319
case "moveLeft":
275-
flock.scene.activeCamera.keysLeft.push(key);
320+
flock.scene.activeCamera.keysLeft.push(normalizedKey);
276321
break;
277322
case "rotateRight":
278323
case "moveRight":
279-
flock.scene.activeCamera.keysRight.push(key);
324+
flock.scene.activeCamera.keysRight.push(normalizedKey);
280325
break;
281326
case "moveUp":
282327
case "rotateUp":
283-
flock.scene.activeCamera.keysUp.push(key);
328+
flock.scene.activeCamera.keysUp.push(normalizedKey);
284329
break;
285330
case "moveDown":
286331
case "rotateDown":
287-
flock.scene.activeCamera.keysDown.push(key);
332+
flock.scene.activeCamera.keysDown.push(normalizedKey);
288333
break;
289334
}
290335
}

blocks/camera.js

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,21 +27,54 @@ export function defineCameraBlocks() {
2727
],
2828
},
2929
{
30-
type: "field_dropdown",
30+
type: "field_grid_dropdown",
3131
name: "KEY",
32+
columns: 10,
3233
options: [
33-
getDropdownOption("65"), // A key
34-
getDropdownOption("68"), // D key
35-
getDropdownOption("87"), // W key
36-
getDropdownOption("83"), // S key
37-
getDropdownOption("81"), // Q key
38-
getDropdownOption("69"), // E key
39-
getDropdownOption("70"), // F key
40-
getDropdownOption("32"), // Space key
41-
getDropdownOption("38"), // Up arrow key
42-
getDropdownOption("40"), // Down arrow key
43-
getDropdownOption("37"), // Left arrow key
44-
getDropdownOption("39"), // Right arrow key
34+
getDropdownOption("0"),
35+
getDropdownOption("1"),
36+
getDropdownOption("2"),
37+
getDropdownOption("3"),
38+
getDropdownOption("4"),
39+
getDropdownOption("5"),
40+
getDropdownOption("6"),
41+
getDropdownOption("7"),
42+
getDropdownOption("8"),
43+
getDropdownOption("9"),
44+
getDropdownOption("a"),
45+
getDropdownOption("b"),
46+
getDropdownOption("c"),
47+
getDropdownOption("d"),
48+
getDropdownOption("e"),
49+
getDropdownOption("f"),
50+
getDropdownOption("g"),
51+
getDropdownOption("h"),
52+
getDropdownOption("i"),
53+
getDropdownOption("j"),
54+
getDropdownOption("k"),
55+
getDropdownOption("l"),
56+
getDropdownOption("m"),
57+
getDropdownOption("n"),
58+
getDropdownOption("o"),
59+
getDropdownOption("p"),
60+
getDropdownOption("q"),
61+
getDropdownOption("r"),
62+
getDropdownOption("s"),
63+
getDropdownOption("t"),
64+
getDropdownOption("u"),
65+
getDropdownOption("v"),
66+
getDropdownOption("w"),
67+
getDropdownOption("x"),
68+
getDropdownOption("y"),
69+
getDropdownOption("z"),
70+
getDropdownOption(" "),
71+
getDropdownOption(","),
72+
getDropdownOption("."),
73+
getDropdownOption("/"),
74+
getDropdownOption("ArrowLeft"),
75+
getDropdownOption("ArrowUp"),
76+
getDropdownOption("ArrowRight"),
77+
getDropdownOption("ArrowDown"),
4578
],
4679
},
4780
],

generators/generators.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3515,7 +3515,7 @@ export function defineGenerators() {
35153515
const key = block.getFieldValue("KEY");
35163516
const action = block.getFieldValue("ACTION");
35173517

3518-
return `cameraControl(${key}, "${action}");\n`;
3518+
return `cameraControl(${JSON.stringify(key)}, "${action}");\n`;
35193519
};
35203520

35213521
javascriptGenerator.forBlock["keyword_block"] = function (block) {

style/blockly.css

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,12 @@ color: var(--color-menu-item-text) !important;
413413

414414
}
415415

416+
417+
/* Ensure key labels in field_grid_dropdown are readable on light dropdowns. */
418+
.blocklyFieldGrid .blocklyFieldGridItem {
419+
color: #000000 !important;
420+
}
421+
416422
body .blocklyHtmlInput {
417423
font-family: "Atkinson Hyperlegible Next", "Asap", Helvetica, Arial, Lucida, sans-serif !important;
418424
}

0 commit comments

Comments
 (0)