util.ts 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. // Copyright (c) Jupyter Development Team.
  2. // Distributed under the terms of the Modified BSD License.
  3. import 'jest';
  4. // Distributed under the terms of the Modified BSD License.
  5. import { IMenuExtender } from '@jupyterlab/mainmenu';
  6. import { Widget } from '@lumino/widgets';
  7. /**
  8. * Given a widget and a set containing IMenuExtenders,
  9. * check the tracker and return the extender, if any,
  10. * that holds the widget.
  11. */
  12. function findExtender<E extends IMenuExtender<Widget>>(
  13. widget: Widget,
  14. s: Set<E>
  15. ): E | undefined {
  16. let extender: E | undefined;
  17. s.forEach(value => {
  18. if (value.tracker.has(widget)) {
  19. extender = value;
  20. }
  21. });
  22. return extender;
  23. }
  24. /**
  25. * A utility function that delegates command execution
  26. * to an IMenuExtender.
  27. */
  28. export function delegateExecute<E extends IMenuExtender<Widget>>(
  29. widget: Widget,
  30. s: Set<E>,
  31. executor: keyof E
  32. ): Promise<any> {
  33. const extender = findExtender(widget, s);
  34. if (!extender) {
  35. return Promise.resolve(void 0);
  36. }
  37. // Coerce the result to be a function. When Typedoc is updated to use
  38. // Typescript 2.8, we can possibly use conditional types to get Typescript
  39. // to recognize this is a function.
  40. const f = (extender[executor] as any) as (w: Widget) => Promise<any>;
  41. return f(widget);
  42. }
  43. /**
  44. * A utility function that delegates whether a command is toggled
  45. * for an IMenuExtender.
  46. */
  47. export function delegateToggled<E extends IMenuExtender<Widget>>(
  48. widget: Widget,
  49. s: Set<E>,
  50. toggled: keyof E
  51. ): boolean {
  52. const extender = findExtender(widget, s);
  53. if (extender && extender[toggled]) {
  54. // Coerce the result to be a function. When Typedoc is updated to use
  55. // Typescript 2.8, we can possibly use conditional types to get Typescript
  56. // to recognize this is a function.
  57. const f = (extender[toggled] as any) as (w: Widget) => boolean;
  58. return f(widget);
  59. }
  60. return false;
  61. }