util.ts 1.8 KB

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