52
class ClipProperties(gtk.VBox, Loggable):
57
class ClipProperties(gtk.ScrolledWindow, Loggable):
54
59
Widget for configuring clips properties
57
62
def __init__(self, instance, uiman):
58
gtk.VBox.__init__(self)
63
gtk.ScrolledWindow.__init__(self)
59
64
Loggable.__init__(self)
66
self.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
67
self.set_shadow_type(gtk.SHADOW_NONE)
70
vp.set_shadow_type(gtk.SHADOW_NONE)
61
73
self.app = instance
62
74
self.settings = instance.settings
63
75
self._project = None
76
self.transformation_expander = None
64
77
self.info_bar_box = gtk.VBox()
66
82
self.effect_properties_handling = EffectsPropertiesHandling(instance.action_log)
67
84
self.effect_expander = EffectProperties(instance,
68
85
self.effect_properties_handling,
71
self.pack_start(self.info_bar_box, expand=False, fill=True)
72
self.pack_end(self.effect_expander, expand=True, fill=True)
88
vbox.pack_start(self.info_bar_box, expand=False, fill=True)
90
self.transformation_expander = TransformationProperties(
91
instance, instance.action_log)
92
vbox.pack_start(self.transformation_expander, expand=False, fill=False)
93
self.transformation_expander.show()
95
vbox.pack_end(self.effect_expander, expand=True, fill=True)
96
vbox.set_spacing(SPACING)
74
98
self.info_bar_box.show()
75
99
self.effect_expander.show()
78
104
def _setProject(self, project):
79
105
self._project = project
81
107
self.effect_expander._connectTimelineSelection(self._project.timeline)
108
if self.transformation_expander:
109
self.transformation_expander.timeline = self._project.timeline
83
111
def _getProject(self):
84
112
return self._project
355
385
def _updateTreeview(self):
356
386
self.storemodel.clear()
357
387
for track_effect in self.selected_effects:
358
to_append = [track_effect.gnl_object.get_property("active")]
359
track_effect.gnl_object.connect("notify::active",
360
self._activeChangedCb)
361
if isinstance(track_effect.factory.getInputStreams()[0],
363
to_append.append("Video")
365
to_append.append("Audio")
367
to_append.append(track_effect.factory.getHumanName())
368
to_append.append(track_effect.factory.getDescription())
369
to_append.append(track_effect)
371
self.storemodel.append(to_append)
388
if not track_effect.factory.effectname in HIDDEN_EFFECTS:
389
to_append = [track_effect.gnl_object.get_property("active")]
390
track_effect.gnl_object.connect("notify::active",
391
self._activeChangedCb)
392
if isinstance(track_effect.factory.getInputStreams()[0],
394
to_append.append("Video")
396
to_append.append("Audio")
398
to_append.append(track_effect.factory.getHumanName())
399
to_append.append(track_effect.factory.getDescription())
400
to_append.append(track_effect)
402
self.storemodel.append(to_append)
373
404
def _showInfoBar(self):
374
405
if self._info_bar is None:
430
461
if self._effect_config_ui:
431
462
self._effect_config_ui.hide()
432
463
self._effect_config_ui = None
466
class TransformationProperties(gtk.Expander):
468
Widget for viewing and configuring speed
471
'selection-changed': []}
473
def __init__(self, app, action_log):
474
gtk.Expander.__init__(self)
475
self.action_log = action_log
477
self._timeline = None
478
self._current_tl_obj = None
479
self.spin_buttons = {}
480
self.default_values = {}
481
self.set_label(_("Transformation configuration"))
482
self.set_sensitive(False)
484
if not "Frei0r" in soft_deps:
485
self.builder = gtk.Builder()
486
self.builder.add_from_file(os.path.join(get_ui_dir(),
487
"cliptransformation.ui"))
489
self.add(self.builder.get_object("transform_box"))
492
self.connect('notify::expanded', self._expandedCb)
494
def _initButtons(self):
495
self.zoom_scale = self.builder.get_object("zoom_scale")
496
self.zoom_scale.connect("value-changed", self._zoomViewerCb)
497
clear_button = self.builder.get_object("clear_button")
498
clear_button.connect("clicked", self._defaultValuesCb)
500
self._getAndConnectToEffect("xpos_spinbtn", "tilt_x")
501
self._getAndConnectToEffect("ypos_spinbtn", "tilt_y")
503
self._getAndConnectToEffect("width_spinbtn", "scale_x")
504
self._getAndConnectToEffect("height_spinbtn", "scale_y")
506
self._getAndConnectToEffect("crop_left_spinbtn", "clip_left")
507
self._getAndConnectToEffect("crop_right_spinbtn", "clip_right")
508
self._getAndConnectToEffect("crop_top_spinbtn", "clip_top")
509
self._getAndConnectToEffect("crop_bottom_spinbtn", "clip_bottom")
510
self.connectSpinButtonsToFlush()
512
def _zoomViewerCb(self, scale):
513
self.app.gui.viewer.setZoom(scale.get_value())
515
def _expandedCb(self, expander, params):
516
if not "Frei0r" in soft_deps:
517
if self._current_tl_obj:
518
self.effect = self._findOrCreateEffect("frei0r-filter-scale0tilt")
519
self._updateSpinButtons()
520
self.set_expanded(self.get_expanded())
521
self._updateBoxVisibility()
522
self.zoom_scale.set_value(1.0)
524
if self.get_expanded():
525
DepsManager(self.app)
526
self.set_expanded(False)
528
def _defaultValuesCb(self, widget):
529
self.disconnectSpinButtonsFromFlush()
530
for name, spinbtn in self.spin_buttons.items():
531
spinbtn.set_value(self.default_values[name])
532
self.app.gui.viewer.pipeline.flushSeekVideo()
533
self.connectSpinButtonsToFlush()
534
self.track_effect.gnl_object.props.active = False
536
def disconnectSpinButtonsFromFlush(self):
537
for spinbtn in self.spin_buttons.values():
538
spinbtn.disconnect_by_func(self._flushPipeLineCb)
540
def connectSpinButtonsToFlush(self):
541
for spinbtn in self.spin_buttons.values():
542
spinbtn.connect("output", self._flushPipeLineCb)
544
def _updateSpinButtons(self):
545
for name, spinbtn in self.spin_buttons.items():
546
spinbtn.set_value(self.effect.get_property(name))
548
def _getAndConnectToEffect(self, widget_name, property_name):
549
spinbtn = self.builder.get_object(widget_name)
550
spinbtn.connect("output",
551
self._onValueChangedCb, property_name)
552
self.spin_buttons[property_name] = spinbtn
553
self.default_values[property_name] = spinbtn.get_value()
555
def _onValueChangedCb(self, spinbtn, prop):
556
value = spinbtn.get_value()
558
if value != self.default_values[prop] and not self.track_effect.gnl_object.props.active:
559
self.track_effect.gnl_object.props.active = True
561
if value != self.effect.get_property(prop):
562
self.action_log.begin("Transformation property change")
563
self.effect.set_property(prop, value)
564
self.action_log.commit()
565
box = self.app.gui.viewer.internal.box
567
# update box when values are changed in the spin boxes,
568
# so no point is selected
569
if box and box.clicked_point == 0:
570
box.update_from_effect(self.effect)
572
def _flushPipeLineCb(self, widget):
573
self.app.gui.viewer.pipeline.flushSeekVideo()
575
def _findEffect(self, name):
576
for track_effect in self._current_tl_obj.track_objects:
577
if isinstance(track_effect, TrackEffect):
578
if name in track_effect.getElement().get_path_string():
579
self.track_effect = track_effect
580
return track_effect.getElement()
582
def _findOrCreateEffect(self, name):
583
effect = self._findEffect(name)
585
factory = self.app.effects.getFactoryFromName(name)
586
self.timeline.addEffectFactoryOnObject(factory, [self._current_tl_obj])
587
effect = self._findEffect(name)
588
# disable the effect on default
589
self.track_effect.gnl_object.props.active = False
590
self.app.gui.viewer.internal.set_transformation_properties(self)
591
effect.freeze_notify()
594
def _selectionChangedCb(self, timeline):
595
if self.timeline and len(self.timeline.selection.selected) > 0:
596
for tl_obj in self.timeline.selection.selected:
599
if tl_obj != self._current_tl_obj:
600
self._current_tl_obj = tl_obj
603
self.set_sensitive(True)
604
if self.get_expanded():
605
self.effect = self._findOrCreateEffect("frei0r-filter-scale0tilt")
606
self._updateSpinButtons()
608
if self._current_tl_obj:
609
self._current_tl_obj = None
610
self.zoom_scale.set_value(1.0)
611
self.app.gui.viewer.pipeline.flushSeekVideo()
613
self.set_sensitive(False)
614
self._updateBoxVisibility()
616
def _updateBoxVisibility(self):
617
if self.get_expanded() and self._current_tl_obj:
618
self.app.gui.viewer.internal.show_box()
620
self.app.gui.viewer.internal.hide_box()
622
def _getTimeline(self):
623
return self._timeline
625
def _setTimeline(self, timeline):
626
self._timeline = timeline
628
self.timeline.connect('selection-changed', self._selectionChangedCb)
630
timeline = property(_getTimeline, _setTimeline)