pipelines.js 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import Adw from 'gi://Adw';
  2. import GLib from 'gi://GLib';
  3. import GObject from 'gi://GObject';
  4. import { gettext as _ } from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js';
  5. import { PipelineGroup } from './pipelines_management/pipeline_group.js';
  6. import { EffectsDialog } from './pipelines_management/effects_dialog.js';
  7. export const Pipelines = GObject.registerClass({
  8. GTypeName: 'Pipelines',
  9. Template: GLib.uri_resolve_relative(import.meta.url, '../ui/pipelines.ui', GLib.UriFlags.NONE),
  10. InternalChildren: [
  11. 'add_pipeline'
  12. ],
  13. }, class Pipelines extends Adw.PreferencesPage {
  14. constructor(preferences, pipelines_manager, window) {
  15. super({});
  16. this.preferences = preferences;
  17. this.pipelines_manager = pipelines_manager;
  18. this.window = window;
  19. this.pipelines_map = new Map;
  20. for (let pipeline_id in this.pipelines_manager.pipelines)
  21. this.add_pipeline(pipeline_id, false);
  22. this.preferences.connect('reset', _ => {
  23. this.pipelines_map.forEach((_infos, pid) => this.remove_pipeline(pid));
  24. for (let pipeline_id in this.pipelines_manager.pipelines)
  25. this.add_pipeline(pipeline_id, false);
  26. });
  27. this._add_pipeline.connect(
  28. "clicked",
  29. () => this.pipelines_manager.create_pipeline(_("New pipeline"))
  30. );
  31. this.pipelines_manager.connect(
  32. "pipeline-created",
  33. (_obj, id, _pipeline) => this.add_pipeline(id, true)
  34. );
  35. }
  36. add_pipeline(pipeline_id, scroll_to_bottom) {
  37. let pipeline = this.pipelines_manager.pipelines[pipeline_id];
  38. let pipeline_group = new PipelineGroup(
  39. this.pipelines_manager, pipeline_id, pipeline, this
  40. );
  41. let pipeline_destroyed_id = this.pipelines_manager.connect(
  42. pipeline_id + "::pipeline-destroyed",
  43. () => this.remove_pipeline(pipeline_id)
  44. );
  45. let pipeline_renamed_id = this.pipelines_manager.connect(
  46. pipeline_id + "::pipeline-renamed",
  47. (_obj, name) => this.rename_pipeline(pipeline_id, name)
  48. );
  49. this.pipelines_map.set(pipeline_id, {
  50. pipeline_group, pipeline_destroyed_id, pipeline_renamed_id
  51. });
  52. this.add(pipeline_group);
  53. // scroll to the bottom of the page
  54. if (scroll_to_bottom) {
  55. this.window.set_visible_page(this);
  56. setTimeout(() => {
  57. const scroll_adjustment = this.get_first_child().get_vadjustment();
  58. scroll_adjustment.value = scroll_adjustment.get_upper();
  59. }, 10);
  60. pipeline_group._title.grab_focus();
  61. }
  62. }
  63. remove_pipeline(pipeline_id) {
  64. let pipeline_infos = this.pipelines_map.get(pipeline_id);
  65. if (pipeline_infos) {
  66. this.pipelines_manager.disconnect(pipeline_infos.pipeline_destroyed_id);
  67. this.remove(pipeline_infos.pipeline_group);
  68. this.pipelines_map.delete(pipeline_id);
  69. }
  70. }
  71. rename_pipeline(pipeline_id, name) {
  72. let pipeline_infos = this.pipelines_map.get(pipeline_id);
  73. if (pipeline_infos)
  74. pipeline_infos.pipeline_group.set_title(name.length > 0 ? name : " ");
  75. }
  76. open_effects_dialog(pipeline_id) {
  77. let dialog = new EffectsDialog(this.pipelines_manager, pipeline_id);
  78. dialog.present(this.window);
  79. }
  80. });