pxt-common-packages 12.2.12 → 12.2.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -341,10 +341,16 @@ declare namespace pxsim.browserEvents {
341
341
  ArrowRight = 39,
342
342
  PageDown = 34,
343
343
  End = 35,
344
- Home = 36
344
+ Home = 36,
345
+ LeftShift = 1016,
346
+ RightShift = 1017,
347
+ LeftControl = 1018,
348
+ RightControl = 1019,
349
+ Backspace = 8,
350
+ Delete = 46
345
351
  }
346
352
  function onKeyboardEvent(event: KeyboardEvent, pressed: boolean): void;
347
- function getValueForKey(event: KeyboardEvent): 0 | Key;
353
+ function getValueForKey(event: KeyboardEvent): 0 | Key.Zero | Key.One | Key.Two | Key.Three | Key.Four | Key.Five | Key.Six | Key.Seven | Key.Eight | Key.Nine | Key.BackTick | Key.Hyphen | Key.Equals | Key.Q | Key.W | Key.E | Key.R | Key.T | Key.Y | Key.U | Key.I | Key.O | Key.P | Key.OpenBracket | Key.CloseBracket | Key.BackSlash | Key.A | Key.S | Key.D | Key.F | Key.G | Key.H | Key.Space | Key.PageUp | Key.J | Key.K | Key.L | Key.SemiColon | Key.Apostrophe | Key.Z | Key.X | Key.C | Key.V | Key.B | Key.N | Key.M | Key.Comma | Key.Period | Key.ForwardSlash | Key.Shift | Key.Enter | Key.CapsLock | Key.Tab | Key.Control | Key.Meta | Key.Alt | Key.ArrowUp | Key.ArrowDown | Key.ArrowLeft | Key.ArrowRight | Key.PageDown | Key.End | Key.Home | Key.Backspace | Key.Delete;
348
354
  }
349
355
  declare namespace pxsim.browserEvents {
350
356
  interface BrowserEventsBoard extends CommonBoard {
@@ -813,16 +813,42 @@ var pxsim;
813
813
  Key[Key["PageDown"] = 34] = "PageDown";
814
814
  Key[Key["End"] = 35] = "End";
815
815
  Key[Key["Home"] = 36] = "Home";
816
+ Key[Key["LeftShift"] = 1016] = "LeftShift";
817
+ Key[Key["RightShift"] = 1017] = "RightShift";
818
+ Key[Key["LeftControl"] = 1018] = "LeftControl";
819
+ Key[Key["RightControl"] = 1019] = "RightControl";
820
+ Key[Key["Backspace"] = 8] = "Backspace";
821
+ Key[Key["Delete"] = 46] = "Delete";
816
822
  })(Key = browserEvents.Key || (browserEvents.Key = {}));
817
823
  function onKeyboardEvent(event, pressed) {
824
+ const eventValue = getValueForKey(event);
825
+ fireEvent(eventValue, pressed);
826
+ if (eventValue === Key.Shift) {
827
+ if (event.location === event.DOM_KEY_LOCATION_LEFT) {
828
+ fireEvent(Key.LeftShift, pressed);
829
+ }
830
+ else if (event.location === event.DOM_KEY_LOCATION_RIGHT) {
831
+ fireEvent(Key.RightShift, pressed);
832
+ }
833
+ }
834
+ if (eventValue === Key.Control) {
835
+ if (event.location === event.DOM_KEY_LOCATION_LEFT) {
836
+ fireEvent(Key.LeftControl, pressed);
837
+ }
838
+ else if (event.location === event.DOM_KEY_LOCATION_RIGHT) {
839
+ fireEvent(Key.RightControl, pressed);
840
+ }
841
+ }
842
+ }
843
+ browserEvents.onKeyboardEvent = onKeyboardEvent;
844
+ function fireEvent(key, pressed) {
818
845
  if (pressed) {
819
- pxsim.board().bus.queue(6866, getValueForKey(event));
846
+ pxsim.board().bus.queue(6866, key);
820
847
  }
821
848
  else {
822
- pxsim.board().bus.queue(6867, getValueForKey(event));
849
+ pxsim.board().bus.queue(6867, key);
823
850
  }
824
851
  }
825
- browserEvents.onKeyboardEvent = onKeyboardEvent;
826
852
  function getValueForKey(event) {
827
853
  switch (event.key) {
828
854
  case "0":
@@ -998,6 +1024,10 @@ var pxsim;
998
1024
  return Key.End;
999
1025
  case "Home":
1000
1026
  return Key.Home;
1027
+ case "Delete":
1028
+ return Key.Delete;
1029
+ case "Backspace":
1030
+ return Key.Backspace;
1001
1031
  default:
1002
1032
  return 0;
1003
1033
  }
@@ -27,6 +27,10 @@ int wheelDz() {
27
27
  return -1;
28
28
  }
29
29
 
30
+ //%
31
+ void _setCursorVisible(bool visible) {
32
+ }
33
+
30
34
  //%
31
35
  int currentTime() {
32
36
  return -1;
@@ -4,29 +4,47 @@
4
4
  //% block="Browser Events"
5
5
  namespace browserEvents {
6
6
  export enum Event {
7
+ //% block="pointer down"
7
8
  PointerDown = 6857,
9
+ //% block="pointer up"
8
10
  PointerUp = 6858,
11
+ //% block="pointer move"
9
12
  PointerMove = 6859,
13
+ //% block="pointer leave"
10
14
  PointerLeave = 6860,
15
+ //% block="pointer enter"
11
16
  PointerEnter = 6861,
17
+ //% block="pointer cancel"
12
18
  PointerCancel = 6862,
19
+ //% block="pointer over"
13
20
  PointerOver = 6863,
21
+ //% block="pointer out"
14
22
  PointerOut = 6864,
23
+ //% block="wheel"
15
24
  Wheel = 6865,
25
+ //% block="key down"
16
26
  KeyDown = 6866,
27
+ //% block="key up"
17
28
  KeyUp = 6867
18
29
  }
19
30
 
20
31
  export enum MouseButtonId {
32
+ //% block="left"
21
33
  Left = 1,
34
+ //% block="right"
22
35
  Right = 3,
36
+ //% block="wheel"
23
37
  Wheel = 2,
38
+ //% block="back"
24
39
  Back = 4,
40
+ //% block="forward"
25
41
  Forward = 5
26
42
  }
27
43
 
28
44
  export enum MouseButtonEvent {
45
+ //% block="pressed"
29
46
  Pressed = Event.PointerDown,
47
+ //% block="released"
30
48
  Released = Event.PointerUp,
31
49
  }
32
50
 
@@ -147,6 +165,14 @@ namespace browserEvents {
147
165
  });
148
166
  }
149
167
 
168
+ //% blockId=browserEvents_setCursorVisible
169
+ //% block="set cursor visible $visible"
170
+ //% group="Mouse"
171
+ //% weight=0
172
+ export function setCursorVisible(visible: boolean) {
173
+ _setCursorVisible(visible);
174
+ }
175
+
150
176
  //% fixedInstance whenUsed block="left"
151
177
  export const MouseLeft = new MouseButton(MouseButtonId.Left);
152
178
 
@@ -62,12 +62,22 @@ namespace browserEvents {
62
62
  ArrowRight = 39,
63
63
  PageDown = 34,
64
64
  End = 35,
65
- Home = 36
65
+ Home = 36,
66
+ LeftShift = 1016,
67
+ RightShift = 1017,
68
+ LeftControl = 1018,
69
+ RightControl = 1019,
70
+ Backspace = 8,
71
+ Delete = 46,
66
72
  }
67
73
 
68
74
  export enum KeyEvent {
75
+ //% block="pressed"
69
76
  Pressed,
70
- Released
77
+ //% block="released"
78
+ Released,
79
+ //% block="repeat"
80
+ Repeat
71
81
  }
72
82
 
73
83
  export function keyToString(key: Key) {
@@ -198,44 +208,171 @@ namespace browserEvents {
198
208
  return "-";
199
209
  case Key.Equals:
200
210
  return "=";
211
+ case Key.LeftShift:
212
+ return "LeftShift";
213
+ case Key.RightShift:
214
+ return "RightShift";
215
+ case Key.LeftControl:
216
+ return "LeftControl";
217
+ case Key.RightControl:
218
+ return "RightControl";
219
+ case Key.Backspace:
220
+ return "Backspace";
221
+ case Key.Delete:
222
+ return "Delete";
201
223
  }
202
224
  }
203
225
 
226
+ //% whenUsed
227
+ let _buttonsPendingInit: KeyButton[];
204
228
 
205
- //% fixedInstances
206
- export class KeyButton {
207
- protected _pressed: boolean;
229
+ let defaultRepeatDelay = 500;
230
+ let defaultRepeatInterval = 30;
231
+
232
+ class KeySceneState {
208
233
  protected pressHandler: () => void;
209
234
  protected pressListeners: (() => void)[];
210
235
  protected releaseHandler: () => void;
211
236
  protected releaseListeners: (() => void)[];
237
+ protected repeatHandler: () => void;
238
+ protected repeatListeners: (() => void)[];
212
239
 
213
240
  constructor(public id: number) {
214
- control.onEvent(Event.KeyUp, this.id, () => this.setPressed(false), 16);
215
- control.onEvent(Event.KeyDown, this.id, () => this.setPressed(true), 16);
216
-
217
- this._pressed = false;
218
241
  this.pressListeners = [];
219
242
  this.releaseListeners = [];
243
+ this.repeatListeners = [];
244
+ }
245
+
246
+ onEvent(event: KeyEvent, handler: () => void) {
247
+ if (event === KeyEvent.Pressed) {
248
+ this.pressHandler = handler;
249
+ }
250
+ else if (event === KeyEvent.Released) {
251
+ this.releaseHandler = handler;
252
+ }
253
+ else {
254
+ this.repeatHandler = handler;
255
+ }
256
+ }
257
+
258
+ addEventListener(event: KeyEvent, handler: () => void) {
259
+ if (event === KeyEvent.Pressed) {
260
+ this.pressListeners.push(handler);
261
+ }
262
+ else if (event === KeyEvent.Released) {
263
+ this.releaseListeners.push(handler);
264
+ }
265
+ else {
266
+ this.repeatListeners.push(handler);
267
+ }
268
+ }
269
+
270
+ removeEventListener(event: KeyEvent, handler: () => void) {
271
+ if (event === KeyEvent.Pressed) {
272
+ this.pressListeners = this.pressListeners.filter(p => p !== handler);
273
+ }
274
+ else if (event === KeyEvent.Released) {
275
+ this.releaseListeners = this.releaseListeners.filter(p => p !== handler);;
276
+ }
277
+ else {
278
+ this.repeatListeners = this.repeatListeners.filter(p => p !== handler);
279
+ }
280
+ }
281
+
282
+ raiseButtonPressed() {
283
+ if (this.pressHandler) {
284
+ this.pressHandler();
285
+ }
286
+ for (const handler of this.pressListeners) {
287
+ handler();
288
+ }
289
+ }
290
+
291
+ raiseButtonReleased() {
292
+ if (this.releaseHandler) {
293
+ this.releaseHandler();
294
+ }
295
+ for (const handler of this.releaseListeners) {
296
+ handler();
297
+ }
298
+ }
299
+
300
+ raiseButtonRepeat() {
301
+ if (this.repeatHandler) {
302
+ this.repeatHandler();
303
+ }
304
+ for (const handler of this.repeatListeners) {
305
+ handler();
306
+ }
307
+ }
308
+ }
309
+
310
+ //% fixedInstances
311
+ export class KeyButton {
312
+ protected _pressed: boolean;
313
+ public repeatDelay: number;
314
+ public repeatInterval: number;
315
+ private _repeatCount: number;
316
+ private _pressedElapsed: number;
317
+
318
+ protected sceneStack: KeySceneState[];
319
+
320
+ protected get state(): KeySceneState {
321
+ return this.sceneStack[this.sceneStack.length - 1];
322
+ }
323
+
324
+ constructor(public id: number) {
325
+ // use internalOnEvent so that events fire regardless of the current scen
326
+ control.internalOnEvent(Event.KeyUp, this.id, () => this.setPressed(false), 16);
327
+ control.internalOnEvent(Event.KeyDown, this.id, () => this.setPressed(true), 16);
328
+ this._pressed = false;
329
+
330
+ // this code may run before game/scene.ts, in which case calling this.__registerUpdate
331
+ // will trigger an exception. to prevent that, start a thread that pauses until we
332
+ // detect that an event context has been registered and then call it
333
+ if (control.eventContext()) {
334
+ this.__registerUpdate();
335
+ }
336
+ else {
337
+ if (!_buttonsPendingInit) {
338
+ _buttonsPendingInit = [];
339
+ control.runInBackground(() => {
340
+ pauseUntil(() => !!control.eventContext());
341
+ for (const button of _buttonsPendingInit) {
342
+ button.__registerUpdate();
343
+ }
344
+ _buttonsPendingInit = undefined;
345
+ });
346
+ }
347
+ _buttonsPendingInit.push(this);
348
+ }
349
+
350
+ this.sceneStack = [new KeySceneState(id)];
351
+
352
+ game.addScenePushHandler(() => {
353
+ this.sceneStack.push(new KeySceneState(id));
354
+ this.__registerUpdate();
355
+ });
356
+ game.addScenePopHandler(() => {
357
+ this.sceneStack.pop();
358
+ if (this.sceneStack.length === 0) {
359
+ this.sceneStack = [new KeySceneState(id)];
360
+ this.__registerUpdate();
361
+ }
362
+ });
220
363
  }
221
364
 
222
365
  setPressed(pressed: boolean) {
366
+ if (this._pressed === pressed) return;
367
+
223
368
  this._pressed = pressed;
224
369
  if (pressed) {
225
- if (this.pressHandler) {
226
- this.pressHandler();
227
- }
228
- for (const handler of this.pressListeners) {
229
- handler();
230
- }
370
+ this._repeatCount = 0;
371
+ this._pressedElapsed = 0;
372
+ this.state.raiseButtonPressed();
231
373
  }
232
374
  else {
233
- if (this.releaseHandler) {
234
- this.releaseHandler();
235
- }
236
- for (const handler of this.releaseListeners) {
237
- handler();
238
- }
375
+ this.state.raiseButtonReleased();
239
376
  }
240
377
  }
241
378
 
@@ -244,12 +381,7 @@ namespace browserEvents {
244
381
  //% group="Keyboard"
245
382
  //% weight=100
246
383
  onEvent(event: KeyEvent, handler: () => void) {
247
- if (event === KeyEvent.Pressed) {
248
- this.pressHandler = handler;
249
- }
250
- else {
251
- this.releaseHandler = handler;
252
- }
384
+ this.state.onEvent(event, handler);
253
385
  }
254
386
 
255
387
  //% blockId=browserEvents_key_isPressed
@@ -269,22 +401,34 @@ namespace browserEvents {
269
401
  }
270
402
 
271
403
  addEventListener(event: KeyEvent, handler: () => void) {
272
- if (event === KeyEvent.Pressed) {
273
- this.pressListeners.push(handler);
274
- }
275
- else {
276
- this.releaseListeners.push(handler);
277
- }
404
+ this.state.addEventListener(event, handler);
278
405
  }
279
406
 
280
407
  removeEventListener(event: KeyEvent, handler: () => void) {
281
- if (event === KeyEvent.Pressed) {
282
- this.pressListeners = this.pressListeners.filter(p => p !== handler);
283
- }
284
- else {
285
- this.releaseListeners = this.releaseListeners.filter(p => p !== handler);
408
+ this.state.removeEventListener(event, handler);
409
+ }
410
+
411
+ __update() {
412
+ const delay = this.repeatDelay === undefined ? defaultRepeatDelay : this.repeatDelay;
413
+ const interval = this.repeatInterval === undefined ? defaultRepeatInterval : this.repeatInterval;
414
+ if (!this._pressed) return;
415
+ this._pressedElapsed += game.eventContext().deltaTimeMillis;
416
+
417
+ // inital delay
418
+ if (this._pressedElapsed < delay)
419
+ return;
420
+
421
+ // repeat count for this step
422
+ const count = Math.floor((this._pressedElapsed - delay - interval) / interval);
423
+ if (count != this._repeatCount) {
424
+ this._repeatCount = count;
425
+ this.state.raiseButtonRepeat();
286
426
  }
287
427
  }
428
+
429
+ __registerUpdate() {
430
+ game.eventContext().registerFrameHandler(scene.CONTROLLER_PRIORITY, () => this.__update());
431
+ }
288
432
  }
289
433
 
290
434
  //% fixedInstance whenUsed
@@ -476,6 +620,35 @@ namespace browserEvents {
476
620
  //% fixedInstance whenUsed
477
621
  export const Home = new KeyButton(Key.Home);
478
622
 
623
+ //% fixedInstance whenUsed
624
+ export const LeftShift = new KeyButton(Key.LeftShift);
625
+
626
+ //% fixedInstance whenUsed
627
+ export const RightShift = new KeyButton(Key.RightShift);
628
+
629
+ //% fixedInstance whenUsed
630
+ export const LeftControl = new KeyButton(Key.LeftControl);
631
+
632
+ //% fixedInstance whenUsed
633
+ export const RightControl = new KeyButton(Key.RightControl);
634
+
635
+ //% fixedInstance whenUsed
636
+ export const Backspace = new KeyButton(Key.Backspace);
637
+
638
+ //% fixedInstance whenUsed
639
+ export const Delete = new KeyButton(Key.Delete);
640
+
479
641
  //% fixedInstance whenUsed
480
642
  export const Any = new KeyButton(0);
643
+
644
+ //% blockId=browser_events_setKeyboardRepeatDefault
645
+ //% block="set keyboard repeat delay $delay ms interval $interval ms"
646
+ //% delay.defl=500
647
+ //% interval.defl=30
648
+ //% group="Keyboard"
649
+ //% weight=0
650
+ export function setKeyboardRepeatDefault(delay: number, interval: number) {
651
+ defaultRepeatDelay = Math.max(delay, 0);
652
+ defaultRepeatInterval = Math.max(interval, 1);
653
+ }
481
654
  }
@@ -9,6 +9,8 @@ declare namespace browserEvents {
9
9
  function wheelDy(): number;
10
10
  //% shim=browserEvents::wheelDz
11
11
  function wheelDz(): number;
12
+ //% shim=browserEvents::_setCursorVisible
13
+ function _setCursorVisible(visible: boolean): void;
12
14
 
13
15
  //% shim=browserEvents::currentTime
14
16
  function currentTime(): number;
@@ -62,15 +62,44 @@ namespace pxsim.browserEvents {
62
62
  ArrowRight = 39,
63
63
  PageDown = 34,
64
64
  End = 35,
65
- Home = 36
65
+ Home = 36,
66
+ LeftShift = 1016,
67
+ RightShift = 1017,
68
+ LeftControl = 1018,
69
+ RightControl = 1019,
70
+ Backspace = 8,
71
+ Delete = 46,
66
72
  }
67
73
 
68
74
  export function onKeyboardEvent(event: KeyboardEvent, pressed: boolean) {
75
+ const eventValue = getValueForKey(event);
76
+
77
+ fireEvent(eventValue as Key, pressed);
78
+
79
+ if (eventValue === Key.Shift) {
80
+ if (event.location === event.DOM_KEY_LOCATION_LEFT) {
81
+ fireEvent(Key.LeftShift, pressed);
82
+ }
83
+ else if (event.location === event.DOM_KEY_LOCATION_RIGHT) {
84
+ fireEvent(Key.RightShift, pressed);
85
+ }
86
+ }
87
+ if (eventValue === Key.Control) {
88
+ if (event.location === event.DOM_KEY_LOCATION_LEFT) {
89
+ fireEvent(Key.LeftControl, pressed);
90
+ }
91
+ else if (event.location === event.DOM_KEY_LOCATION_RIGHT) {
92
+ fireEvent(Key.RightControl, pressed);
93
+ }
94
+ }
95
+ }
96
+
97
+ function fireEvent(key: Key, pressed: boolean) {
69
98
  if (pressed) {
70
- board().bus.queue(6866, getValueForKey(event));
99
+ board().bus.queue(6866, key);
71
100
  }
72
101
  else {
73
- board().bus.queue(6867, getValueForKey(event));
102
+ board().bus.queue(6867, key);
74
103
  }
75
104
  }
76
105
 
@@ -249,6 +278,10 @@ namespace pxsim.browserEvents {
249
278
  return Key.End;
250
279
  case "Home":
251
280
  return Key.Home;
281
+ case "Delete":
282
+ return Key.Delete;
283
+ case "Backspace":
284
+ return Key.Backspace;
252
285
  default:
253
286
  return 0;
254
287
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pxt-common-packages",
3
- "version": "12.2.12",
3
+ "version": "12.2.13",
4
4
  "description": "Microsoft MakeCode (PXT) common packages",
5
5
  "keywords": [
6
6
  "MakeCode",