Python API 2.0 Reference
python/api2/demoSequencerDrawManager.py
1 import maya.api.OpenMayaUI as omui
2 import maya.api.OpenMaya as om
3 
4 from maya import cmds
5 
6 from numpy import *
7 import random
8 
9 # Demo script to show how to use the sequencer custom
10 # drawing object API.
11 #
12 # This script can be loaded as a plugin or ran as a script
13 
14 # Declare instances in global scope.
15 # Use globals().get() so this file can be safely reloaded without losing state
16 custom_sequencer_drawers = globals().get('custom_sequencer_drawers', None)
17 
18 # Callback id used to cleanup on app exit (kMayaExiting). Stored globally so
19 # repeated runs/reloads don't accumulate callbacks.
20 maya_exit_callback_id = globals().get('maya_exit_callback_id', None)
21 
22 
23 class CustomSequencerDrawer:
24  """
25  Base class for drawing objects
26  """
27 
28  def __init__(self):
29  self.manager = omui.MSequencerCustomDrawManager()
30  self.draw_ids = []
31  self.init_draw_objects()
32 
33  def uninit(self):
34  self.clear_primitives()
35 
36  for draw_id in self.draw_ids:
37  self.manager.deregisterCustomDraw(draw_id)
38 
39  def create_timeline_draw_object(
40  self, name, tooltip, draw_layer, bg_color=None
41  ):
42  """
43  Creates and registers a custom timeline draw object with the sequencer
44  draw manager.
45  """
46  draw_id = self.manager.registerCustomDrawTimeline(
47  name,
48  tooltip,
49  draw_layer, # Set a value lower than 1000 to draw behind ticks
50  )
51 
52  if bg_color:
53  self.manager.setBackgroundColor(draw_id, om.MColor(bg_color))
54 
55  self.draw_ids.append(draw_id)
56  return draw_id
57 
58  def create_track_title_draw_object(
59  self, name, tooltip, draw_layer, trackNumber,
60  is_audio=False, bg_color=None
61  ):
62  """
63  Creates and registers a custom track title draw object with the
64  sequencer draw manager.
65  """
66  draw_id = self.manager.registerCustomDrawTrack(
67  omui.MSequencerCustomDrawManager.kTrackTitle,
68  name,
69  tooltip,
70  trackNumber,
71  is_audio,
72  draw_layer
73  )
74 
75  self.set_track_properties(draw_id, bg_color)
76  return draw_id
77 
78  def create_track_draw_object(
79  self, name, tooltip, draw_layer, trackNumber,
80  is_audio=False, bg_color=None
81  ):
82  """
83  Creates and registers a custom track draw object with the sequencer
84  draw manager.
85  """
86  draw_id = self.manager.registerCustomDrawTrack(
87  omui.MSequencerCustomDrawManager.kTrack,
88  name,
89  tooltip,
90  trackNumber,
91  is_audio,
92  draw_layer
93  )
94 
95  self.set_track_properties(draw_id, bg_color)
96  return draw_id
97 
98  def set_track_properties(
99  self, draw_id, bg_color=None
100  ):
101  """
102  Setup common attributes between track and track title draw objects
103  """
104  if bg_color:
105  self.manager.setBackgroundColor(draw_id, om.MColor(bg_color))
106 
107  self.draw_ids.append(draw_id)
108  return draw_id
109 
110  @classmethod
111  def bracket_primitive(
112  cls, start, stop, color, bottom, height, priority, label=''
113  ):
114  prim = omui.MSequencerDrawPrimitive(
115  omui.MSequencerDrawPrimitive.kBracket,
116  om.MTime(start), om.MTime(stop), om.MColor(color),
117  bottom, height, priority, label
118  )
119 
120  return prim
121 
122  @classmethod
123  def upper_outline_primitive(
124  cls, start, stop, color, bottom, height, priority, label=''
125  ):
126  prim = omui.MSequencerDrawPrimitive(
127  omui.MSequencerDrawPrimitive.kUpperOutline,
128  om.MTime(start), om.MTime(stop), om.MColor(color),
129  bottom, height, priority, label
130  )
131 
132  return prim
133 
134  @classmethod
135  def full_outline_primitive(
136  cls, start, stop, color, bottom, height, priority, label=''
137  ):
138  prim = omui.MSequencerDrawPrimitive(
139  omui.MSequencerDrawPrimitive.kFullOutline,
140  om.MTime(start), om.MTime(stop), om.MColor(color),
141  bottom, height, priority, label
142  )
143 
144  return prim
145 
146  @classmethod
147  def vertical_line_primitive(
148  cls, time, color, bottom, height, priority, label=''
149  ):
150  prim = omui.MSequencerDrawPrimitive(
151  omui.MSequencerDrawPrimitive.kVerticalLine,
152  om.MTime(time), om.MTime(time), om.MColor(color),
153  bottom, height, priority, label
154  )
155 
156  return prim
157 
158  @classmethod
159  def filled_rect_primitive(
160  cls, start, stop, color, bottom, height, priority, label=''
161  ):
162  prim = omui.MSequencerDrawPrimitive(
163  omui.MSequencerDrawPrimitive.kFilledRect,
164  om.MTime(start), om.MTime(stop), om.MColor(color),
165  bottom, height, priority, label
166  )
167 
168  return prim
169 
170  @classmethod
171  def text_primitive(
172  cls, time, color, bottom, height, priority, label
173  ):
174  prim = omui.MSequencerDrawPrimitive(
175  omui.MSequencerDrawPrimitive.kText,
176  om.MTime(time), om.MTime(time), om.MColor(color),
177  bottom, height, priority, label
178  )
179 
180  return prim
181 
182  def init_draw_objects(self):
183  pass
184 
185  def clear_primitives(self):
186  manager = omui.MSequencerCustomDrawManager()
187 
188  for draw_id in self.draw_ids:
189  manager.clearDrawPrimitives(draw_id)
190 
191  manager.requestSequencerRedraw()
192 
193 
194 class SequencerTimelineDrawDemo(CustomSequencerDrawer):
195  """
196  Demo custom drawing in the Sequencer timeline area.
197  """
198  def __init__(self):
199  self.bg_draw_id = -1
200  self.fg_draw_id = -1
201  self.rgb_bg_color = [1.0, 1.0, 1.0]
202  super().__init__()
203 
204  def init_draw_objects(self):
205  manager = omui.MSequencerCustomDrawManager()
206  self.init_bg_draw_object(manager)
207  self.init_fg_draw_object(manager)
208 
209  def init_bg_draw_object(self, manager):
210  """
211  Setup draw object for sequencer timeline background
212  This object will be drawn before/behind the ticks and frame numbers
213  """
214  draw_id = self.create_timeline_draw_object(
215  'custom draw timeline 1',
216  'My custom draw on timeline BG tooltip',
217  draw_layer=5, # Set a value lower than 1000 to draw behind ticks
218  bg_color=[0.1, 0.3, 0.1, 0.25]
219  )
220  manager.setStartPrimitiveEditFunction(draw_id, self.startEdit)
221  manager.setEditPrimitiveFunction(draw_id, self.editing)
222  manager.setSetCopyPrimitivesFunction(draw_id, self.setCopying)
223  manager.setStopPrimitiveEditFunction(draw_id, self.stopEdit)
224 
225  self.bg_draw_id = draw_id
226  self.update_bg_primitives(manager)
227 
228  def init_fg_draw_object(self, manager):
229  """
230  Setup draw object for sequencer timeline foreground
231  This object will be drawn over the ticks and frame numbers
232  """
233  self.fg_draw_id = self.create_timeline_draw_object(
234  'custom draw timeline 2',
235  '',
236  draw_layer=1001, # Set a value higher than 1000 to draw over ticks
237  )
238 
239  self.update_fg_primitives(manager)
240 
241  def update_bg_primitives(self, manager):
242  """
243  Create primitives for background timeline draw object
244  """
245  prims = [
246  CustomSequencerDrawer.full_outline_primitive(
247  52, 615, [0.2, 0.8, 0.2],
248  bottom=0.05, height=0.9, priority=1
249  ),
250  CustomSequencerDrawer.bracket_primitive(
251  65, 175, [0.8, 0.2, 0.2],
252  bottom=0.2, height=0.7, priority=10,
253  label='Timeline BG Bracket'
254  ),
255  CustomSequencerDrawer.upper_outline_primitive(
256  311, 353, [0.8, 0.8, 0.2],
257  bottom=0.25, height=0.5, priority=1
258  ),
259  CustomSequencerDrawer.full_outline_primitive(
260  405, 457, [0.8, 0.8, 0.8],
261  bottom=0.1, height=0.75, priority=1
262  ),
263  CustomSequencerDrawer.vertical_line_primitive(
264  515, [0.8, 0.1, 0.9],
265  bottom=0, height=1, priority=1
266  ),
267  ]
268 
269  prim = CustomSequencerDrawer.filled_rect_primitive(
270  210, 300, self.rgb_bg_color,
271  bottom=0.1, height=0.75, priority=1
272  )
273 
274  prim.tooltip = 'Filled Rect Tooltip'
275  prim.setBuildMenuFunction(self.make_menu)
276  prims.append(prim)
277 
278  manager.setDrawPrimitives(self.bg_draw_id, prims)
279  manager.requestSequencerRedraw()
280 
281  def make_menu(self, parent_id, time):
282  cmds.setParent(parent_id, menu=True)
283  cmds.menuItem(label=f'Randomize color {time}',
284  command=self.randomize_bg_color)
285 
286  def randomize_bg_color(self, *args):
287  print("Randomizing background color")
288  self.rgb_bg_color = [random.random(), random.random(), random.random()]
289  self.update_bg_primitives(omui.MSequencerCustomDrawManager())
290 
291  def update_fg_primitives(self, manager):
292  """
293  Create primitives for foreground timeline draw object
294  """
295  prims = [
296  CustomSequencerDrawer.filled_rect_primitive(
297  -100, -12, [0.8, 0.8, 0.2],
298  bottom=0.25, height=0.5, priority=1
299  ),
300  CustomSequencerDrawer.full_outline_primitive(
301  -210, -2, [0.8, 0.8, 0.8],
302  bottom=0.1, height=0.75, priority=1
303  ),
304  CustomSequencerDrawer.text_primitive(
305  -200, [1, 1, 1], bottom=0.1, height=0.75, priority=1,
306  label='Timeline FG Draw Object'),
307  ]
308 
309  manager.setDrawPrimitives(self.fg_draw_id, prims)
310 
311  def startEdit(self, time):
312  print(f"Start editing at time {time}")
313 
314  def editing(self, time, currentTime):
315  print(f"Editing at time {time}, currentTime={currentTime}")
316 
317  def stopEdit(self):
318  print("Stop editing")
319 
320  def setCopying(self, copying):
321  print(f"Set copying to {copying}")
322 
323 
324 class ShotTrackTitleDrawDemo(CustomSequencerDrawer):
325  """
326  Demo custom drawing in the Sequencer track title region for a shot track.
327  """
328  def __init__(self):
329  self.toggled = True
330  self.start = 10
331  self.edit_delta = 0
332  self.draw_id = 0
333  super().__init__()
334 
335  def init_draw_objects(self):
336  manager = omui.MSequencerCustomDrawManager()
337  # Register custom draw for track title
338  draw_id = self.create_track_title_draw_object(
339  'custom draw track title',
340  'My Custom Draw Track Title Tooltip',
341  draw_layer=1,
342  trackNumber=3,
343  bg_color=[1.0, 0.3, 0.1, 0.5]
344  )
345 
346  manager.setStartPrimitiveEditFunction(draw_id, self.startEdit)
347  manager.setEditPrimitiveFunction(draw_id, self.editing)
348  manager.setSetCopyPrimitivesFunction(draw_id, self.setCopying)
349  manager.setStopPrimitiveEditFunction(draw_id, self.stopEdit)
350 
351  self.update_primitives(manager, draw_id)
352  self.draw_id = draw_id
353 
354  def update_primitives(self, manager, draw_id):
355  prims = [
356  CustomSequencerDrawer.filled_rect_primitive(
357  self.start + self.edit_delta,
358  self.start + self.edit_delta + 80,
359  [0.2, 0.8, 0.2, 0.75],
360  bottom=0,
361  height=0.5 if self.toggled else 0.75,
362  priority=1
363  )
364  ]
365  prims[-1].tooltip = 'Track Title Filled Rect Tooltip Text'
366 
367  def sample_menu_item(self, *args):
368  self.toggled = not self.toggled
369  self.update_primitives(manager, draw_id)
370 
371  def make_menu(self, parent_id, time):
372  cmds.setParent(parent_id, menu=True)
373  cmds.menuItem(label='Toggle Height',
374  cb=self.toggled,
375  command=lambda *args: sample_menu_item(self, *args))
376 
377  prims[-1].setBuildMenuFunction(
378  lambda parent_id, time: make_menu(self, parent_id, time))
379 
380  manager.setDrawPrimitives(draw_id, prims)
381  manager.requestSequencerRedraw()
382 
383  def startEdit(self, x):
384  print(f"Start editing track title at x {x}")
385  self.edit_delta = 0
386 
387  def editing(self, delta, current_x):
388  print(f"Editing track title at time {delta}, currentTime={current_x}")
389  self.edit_delta = delta.value
390  self.update_primitives(omui.MSequencerCustomDrawManager(), self.draw_id)
391 
392  def stopEdit(self):
393  print("Stop editing track title")
394  self.start += self.edit_delta
395  self.edit_delta = 0
396  self.update_primitives(omui.MSequencerCustomDrawManager(), self.draw_id)
397 
398  def setCopying(self, copying):
399  print(f"Set copying to {copying} for track title")
400 
401 
402 class ShotTrackDrawDemo(CustomSequencerDrawer):
403  """
404  Demo custom drawing in the Sequencer for a shot track.
405  """
406  def __init__(self):
407  self.edit_delta = None
408  self.edit_copy = False
409  self.fg_start = om.MTime(-60)
410  self.fg_length = 100
411  self.fg_draw_id = 0
412  self.bg_draw_id = 0
413  self.toggled = False
414  self.fg_prims = []
415  self.fg_edit_prim = None
416  super().__init__()
417 
418  def init_draw_objects(self):
419  manager = omui.MSequencerCustomDrawManager()
420  # Register custom draw for track
421  self.bg_draw_id = self.create_track_draw_object(
422  'custom draw track BG',
423  'My Custom Draw Track BG Tooltip',
424  draw_layer=1,
425  trackNumber=2,
426  bg_color=[1.0, 0.3, 0.1, 0.5])
427 
428  self.fg_draw_id = self.create_track_draw_object(
429  'custom draw track FG',
430  'My Custom Draw Track FG Tooltip',
431  draw_layer=1001,
432  trackNumber=3,
433  bg_color=[0.0, 0.3, 0.1, 0.5])
434 
435  manager.setStartPrimitiveEditFunction(self.fg_draw_id, self.startEdit)
436  manager.setEditPrimitiveFunction(self.fg_draw_id, self.editing)
437  manager.setSetCopyPrimitivesFunction(self.fg_draw_id, self.setCopying)
438  manager.setStopPrimitiveEditFunction(self.fg_draw_id, self.stopEdit)
439 
440  self.fg_prims = [self.make_fg_obj_prims(self.fg_start)]
441 
442  self.update_bg_primitives(manager, self.bg_draw_id)
443  self.update_fg_primitives(manager, self.fg_draw_id)
444 
445  def update_bg_primitives(self, manager, bg_draw_id):
446  prims = [
447  CustomSequencerDrawer.upper_outline_primitive(
448  15, 245, [0.2, 0.2, 0.8],
449  bottom=0.25 if self.toggled else 0.0,
450  height=0.5 if self.toggled else 1.0,
451  priority=1,
452  label='Track BG Upper Outline'
453  )
454  ]
455  prims[-1].tooltip = 'BG Upper Outline Tooltip Text'
456 
457  def make_menu(self, parent_id, time):
458  cmds.setParent(parent_id, menu=True)
459  cmds.menuItem(label='Toggle Mode',
460  checkBox=self.toggled,
461  command=self.do_toggle)
462 
463  prims[-1].setBuildMenuFunction(
464  lambda parent_id, time: make_menu(self, parent_id, time))
465 
466  manager.setDrawPrimitives(bg_draw_id, prims)
467 
468  def make_fg_obj_prims(self, start, label=None):
469  prim = CustomSequencerDrawer.full_outline_primitive(
470  start.asUnits(om.MTime.kFilm),
471  start.asUnits(om.MTime.kFilm) + self.fg_length,
472  [0.8, 0.8 if self.toggled else 0.0, 0.2] if self.edit_delta is None else [1, 1, 1],
473  bottom=0.1, height=0.7, priority=2,
474  label='Drag to Move' if label is None else label
475  )
476  prim.tooltip = 'Move by dragging or copy by Ctrl + dragging, right click for more options'
477 
478  def make_menu(self, parent_id, time):
479  cmds.setParent(parent_id, menu=True)
480  cmds.menuItem(label='Toggle Mode',
481  checkBox=self.toggled,
482  command=self.do_toggle)
483  cmds.menuItem(label='Duplicate',
484  command=lambda *args: self.duplicate(prim))
485  cmds.menuItem(label='Delete',
486  command=lambda *args: self.delete_at(time),
487  enable=len(self.fg_prims) > 1 and self.find_fg_prim_at_time(time) is not None)
488 
489  prim.setBuildMenuFunction(
490  lambda parent_id, time: make_menu(self, parent_id, time))
491 
492  return prim
493 
494  def update_fg_primitives(self, manager, fg_draw_id):
495  prims = self.fg_prims.copy()
496 
497  if self.edit_delta and self.fg_edit_prim:
498  self.fg_edit_prim.startTime = self.fg_start + self.edit_delta
499  self.fg_edit_prim.endTime = self.fg_start + om.MTime(self.fg_length) + self.edit_delta
500 
501  if self.edit_copy and self.edit_delta:
502  copy_prim = self.make_fg_obj_prims(self.fg_start, 'Ghost')
503  copy_prim.color = om.MColor([0.8, 0.8, 0.2, 0.5])
504  prims.append(copy_prim)
505 
506  manager.setDrawPrimitives(fg_draw_id, prims)
507 
508  def do_toggle(self, *args):
509  self.toggled = not self.toggled
510 
511  for prim in self.fg_prims:
512  prim.color = om.MColor([0.8, 0.8 if self.toggled else 0.0, 0.2])
513 
514  self.update_bg_primitives(omui.MSequencerCustomDrawManager(), self.bg_draw_id)
515  self.update_fg_primitives(omui.MSequencerCustomDrawManager(), self.fg_draw_id)
516 
517  def find_fg_prim_at_time(self, time):
518  for prim in self.fg_prims:
519  if prim.startTime.asUnits(om.MTime.kFilm) <= time.asUnits(om.MTime.kFilm) <= prim.endTime.asUnits(om.MTime.kFilm):
520  return prim
521  return None
522 
523  def delete_at(self, time):
524  print(f"Delete fg prim at time {time}")
525  found = self.find_fg_prim_at_time(time)
526  if found:
527  self.fg_prims.remove(found)
528 
529  self.update_fg_primitives(omui.MSequencerCustomDrawManager(), self.fg_draw_id)
530 
531  def duplicate(self, prim):
532  new_prim = self.make_fg_obj_prims(prim.startTime, 'Duplicate')
533  new_prim.startTime = prim.endTime + om.MTime(10)
534  new_prim.endTime = new_prim.startTime + om.MTime(self.fg_length)
535  self.fg_prims.append(new_prim)
536  self.update_fg_primitives(omui.MSequencerCustomDrawManager(), self.fg_draw_id)
537 
538  def startEdit(self, time):
539  print(f"Start editing track at time {time}")
540  self.fg_edit_prim = self.find_fg_prim_at_time(time)
541  self.fg_start = self.fg_edit_prim.startTime if self.fg_edit_prim else time
542 
543  def editing(self, delta, currentTime):
544  print(f"Editing track with delta {delta}, currentTime={currentTime}")
545  self.edit_delta = delta
546  self.update_fg_primitives(omui.MSequencerCustomDrawManager(), self.fg_draw_id)
547 
548  def stopEdit(self):
549  print("Stop editing track")
550  if self.edit_delta and self.fg_edit_prim:
551  self.fg_edit_prim.startTime = self.fg_start + self.edit_delta
552  self.fg_edit_prim.endTime = self.fg_start + om.MTime(self.fg_length) + self.edit_delta
553 
554  if self.edit_copy:
555  self.fg_prims.insert(0, self.make_fg_obj_prims(self.fg_start, 'Copied'))
556 
557  self.edit_delta = None
558  self.edit_copy = False
559  self.fg_edit_prim = None
560  self.update_fg_primitives(omui.MSequencerCustomDrawManager(), self.fg_draw_id)
561 
562  def setCopying(self, copying):
563  print(f"Set copying to {copying} for track")
564  self.edit_copy = copying
565 
566 
567 class AudioTrackDrawDemo(CustomSequencerDrawer):
568  """
569  Demo custom drawing in the Sequencer for an audio track.
570  Includes both track and track title custom draw objects.
571  """
572  def __init__(self):
573  self.track_draw_id = 0
574  self.title_draw_id = 0
575  self.track_number = 2
576  self.toggled = False
577  self.toggled_title = False
578  super().__init__()
579 
580  def init_draw_objects(self):
581  manager = omui.MSequencerCustomDrawManager()
582  self.create_audio_track_draw_object(manager)
583  self.create_audio_title_draw_object(manager)
584 
585  def create_audio_track_draw_object(self, manager):
586  self.track_draw_id = self.create_track_draw_object(
587  'custom draw audio track',
588  'Audio Track Tooltip',
589  draw_layer=2,
590  trackNumber=self.track_number,
591  is_audio=True,
592  bg_color=[0.1, 0.8, 0.2, 0.7]
593  )
594 
595  manager.setStartPrimitiveEditFunction(self.track_draw_id, self.startEdit)
596  manager.setEditPrimitiveFunction(self.track_draw_id, self.editing)
597  manager.setSetCopyPrimitivesFunction(self.track_draw_id, self.setCopying)
598  manager.setStopPrimitiveEditFunction(self.track_draw_id, self.stopEdit)
599 
600  self.update_track_primitives(manager)
601 
602  def create_audio_title_draw_object(self, manager):
603  self.title_draw_id = self.create_track_title_draw_object(
604  'custom draw audio track title',
605  'Audio Track Title Tooltip',
606  draw_layer=1001, # Set a value higher than default track title layer to draw over default title
607  trackNumber=self.track_number,
608  is_audio=True,
609  bg_color=[0.8, 0.1, 0.2]
610  )
611 
612  self.update_title_primitives(manager)
613 
614  def update_track_primitives(self, manager):
615  prims = [
616  CustomSequencerDrawer.filled_rect_primitive(
617  100, 300 if self.toggled else 150, [0.2, 0.2, 0.2, 0.75],
618  bottom=0.2, height=0.7, priority=1
619  )
620  ]
621  prims[-1].tooltip = 'Audio Track Filled Rect Tooltip Text'
622 
623  def sample_menu_item(self, *args):
624  self.toggled = not self.toggled
625  self.update_track_primitives(manager)
626 
627  def make_menu(self, parent_id, time):
628  cmds.setParent(parent_id, menu=True)
629  cmds.menuItem(label=f'Example Audio Menu Item {time}',
630  command=lambda *args: sample_menu_item(self, *args))
631 
632  prims[-1].setBuildMenuFunction(
633  lambda parent_id, time: make_menu(self, parent_id, time))
634 
635  manager.setDrawPrimitives(self.track_draw_id, prims)
636 
637  def update_title_primitives(self, manager):
638  prims = [
639  CustomSequencerDrawer.text_primitive(
640  60, [1, 1, 1, 1],
641  bottom=0.1, height=0.8, priority=1,
642  label='Audio Track Title Object'
643  ),
644  CustomSequencerDrawer.filled_rect_primitive(
645  10, 85, [0.2, 0.2, 0.2, 0.75],
646  bottom=0.5 if self.toggled_title else 0.0,
647  height=0.4 if self.toggled_title else 1.0,
648  priority=1
649  )
650  ]
651  prims[-1].tooltip = 'Audio Track Title Text Tooltip Text'
652 
653  def sample_menu_item(self, *args):
654  self.toggled_title = not self.toggled_title
655  self.update_title_primitives(manager)
656 
657  def make_menu(self, parent_id, time):
658  cmds.setParent(parent_id, menu=True)
659  cmds.menuItem(label=f'Example Audio Title Menu Item {time}',
660  command=lambda *args: sample_menu_item(self, *args))
661 
662  prims[-1].setBuildMenuFunction(
663  lambda parent_id, time: make_menu(self, parent_id, time))
664 
665  manager.setDrawPrimitives(self.title_draw_id, prims)
666 
667  def startEdit(self, time):
668  print(f"Start editing audio track obj at time {time}")
669 
670  def editing(self, time, currentTime):
671  print(f"Editing audio track obj at time {time}, currentTime={currentTime}")
672 
673  def stopEdit(self):
674  print("Stop editing audio track obj")
675 
676  def setCopying(self, copying):
677  print(f"Set copying to {copying} for audio track obj")
678 
679 
680 def _setup_demo_sequencer_draw_manager():
681  global custom_sequencer_drawers
682 
683  print("Demo sequencer draw manager")
684 
685  if custom_sequencer_drawers:
686  for drawer in custom_sequencer_drawers:
687  drawer.uninit()
688 
689  custom_sequencer_drawers = [
690  SequencerTimelineDrawDemo(),
691  ShotTrackTitleDrawDemo(),
692  ShotTrackDrawDemo(),
693  AudioTrackDrawDemo(),
694  ]
695 
696  _setup_exit_callback()
697 
698 
699 def _setup_exit_callback():
700  global maya_exit_callback_id
701 
702  if maya_exit_callback_id is not None:
703  return
704 
705  maya_exit_callback_id = om.MSceneMessage.addCallback(
706  om.MSceneMessage.kMayaExiting,
707  _on_maya_exiting,
708  )
709 
710 
711 def _cleanup_custom_sequencer_drawers():
712  global custom_sequencer_drawers
713 
714  if not custom_sequencer_drawers:
715  return
716 
717  for drawer in custom_sequencer_drawers:
718  drawer.uninit()
719 
720  custom_sequencer_drawers = None
721 
722 
723 def _remove_exit_callback():
724  global maya_exit_callback_id
725 
726  if maya_exit_callback_id is None:
727  return
728 
729  try:
730  om.MMessage.removeCallback(maya_exit_callback_id)
731  except RuntimeError:
732  # Callback may already be gone during shutdown.
733  pass
734 
735  maya_exit_callback_id = None
736 
737 
738 def _on_maya_exiting(*args):
739  _cleanup_custom_sequencer_drawers()
740  _remove_exit_callback()
741 
742 
743 def initializePlugin(mobject):
744  _setup_exit_callback()
745  _setup_demo_sequencer_draw_manager()
746 
747 
748 def uninitializePlugin(mobject):
749  global custom_sequencer_drawers
750 
751  print("Uninitialize plugin and clear custom sequencer drawers")
752 
753  _cleanup_custom_sequencer_drawers()
754  _remove_exit_callback()
755 
756 
757 def maya_useNewAPI():
758  pass
759 
760 
761 if __name__ == '__main__':
762  _setup_demo_sequencer_draw_manager()