marker-action.ts 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /**
  2. * Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import { OrderedSet, Interval } from '../mol-data/int';
  7. import BitFlags from './bit-flags';
  8. export enum MarkerAction {
  9. None = 0x0,
  10. Highlight = 0x1,
  11. RemoveHighlight = 0x2,
  12. Select = 0x4,
  13. Deselect = 0x8,
  14. Toggle = 0x10,
  15. Clear = 0x20
  16. }
  17. export type MarkerActions = BitFlags<MarkerAction>
  18. export namespace MarkerActions {
  19. export const is: (m: MarkerActions, f: MarkerAction) => boolean = BitFlags.has;
  20. export const All = (
  21. MarkerAction.Highlight | MarkerAction.RemoveHighlight |
  22. MarkerAction.Select | MarkerAction.Deselect | MarkerAction.Toggle |
  23. MarkerAction.Clear
  24. ) as MarkerActions;
  25. export const Highlighting = (
  26. MarkerAction.Highlight | MarkerAction.RemoveHighlight |
  27. MarkerAction.Clear
  28. ) as MarkerActions;
  29. export const Selecting = (
  30. MarkerAction.Select | MarkerAction.Deselect | MarkerAction.Toggle |
  31. MarkerAction.Clear
  32. ) as MarkerActions;
  33. }
  34. export function applyMarkerActionAtPosition(array: Uint8Array, i: number, action: MarkerAction) {
  35. let v = array[i];
  36. switch (action) {
  37. case MarkerAction.Highlight:
  38. if (v % 2 === 0) {
  39. array[i] = v + 1;
  40. return true;
  41. }
  42. return false;
  43. case MarkerAction.RemoveHighlight:
  44. if (v % 2 !== 0) {
  45. array[i] = v - 1;
  46. return true;
  47. }
  48. return false;
  49. case MarkerAction.Select:
  50. if (v < 2) {
  51. array[i] = v + 2;
  52. return true;
  53. }
  54. return false;
  55. case MarkerAction.Deselect:
  56. array[i] = v % 2;
  57. return array[i] !== v;
  58. case MarkerAction.Toggle:
  59. if (v >= 2) array[i] = v - 2;
  60. else array[i] = v + 2;
  61. return true;
  62. case MarkerAction.Clear:
  63. array[i] = 0;
  64. return v !== 0;
  65. }
  66. return false;
  67. }
  68. export function applyMarkerAction(array: Uint8Array, set: OrderedSet, action: MarkerAction) {
  69. let changed = false;
  70. if (Interval.is(set)) {
  71. for (let i = Interval.start(set), _i = Interval.end(set); i < _i; i++) {
  72. changed = applyMarkerActionAtPosition(array, i, action) || changed;
  73. }
  74. } else {
  75. for (let i = 0, _i = set.length; i < _i; i++) {
  76. changed = applyMarkerActionAtPosition(array, set[i], action) || changed;
  77. }
  78. }
  79. return changed;
  80. }