util.ts 1.8 KB

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