[pitivi] layer: Add a toggle button to mute a layer



commit d5858c5256dedb024ac1350033fb3457f449b5e2
Author: Christopher G <christgx5 gmail com>
Date:   Sat Apr 18 13:11:52 2020 -0500

    layer: Add a toggle button to mute a layer
    
    Fixes #1648

 pitivi/timeline/layer.py     | 25 ++++++++++++++++++++++++
 tests/test_timeline_layer.py | 45 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 70 insertions(+)
---
diff --git a/pitivi/timeline/layer.py b/pitivi/timeline/layer.py
index 8e5a52f1..d8e2658e 100644
--- a/pitivi/timeline/layer.py
+++ b/pitivi/timeline/layer.py
@@ -58,6 +58,9 @@ class LayerControls(Gtk.EventBox, Loggable):
         self.app = app
         self.__icon = None
 
+        tracks = self.ges_timeline.get_tracks()
+        self.timeline_audio_tracks = [track for track in tracks if track.props.track_type == 
GES.TrackType.AUDIO]
+
         hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
         self.add(hbox)
 
@@ -83,6 +86,13 @@ class LayerControls(Gtk.EventBox, Loggable):
         self.__update_name()
         name_row.pack_start(self.name_entry, True, True, 0)
 
+        self.mute_toggle_button = Gtk.ToggleButton.new()
+        self.mute_toggle_button.props.valign = Gtk.Align.CENTER
+        self.mute_toggle_button.props.relief = Gtk.ReliefStyle.NONE
+        self.mute_toggle_button.connect("toggled", self.__mute_button_toggled_cb)
+        self.__update_mute_button()
+        name_row.pack_start(self.mute_toggle_button, False, False, 0)
+
         self.menubutton = Gtk.MenuButton.new()
         self.menubutton.props.valign = Gtk.Align.CENTER
         self.menubutton.props.relief = Gtk.ReliefStyle.NONE
@@ -98,6 +108,7 @@ class LayerControls(Gtk.EventBox, Loggable):
         vbox.pack_start(space, False, False, 0)
 
         self.ges_layer.connect("notify::priority", self.__layer_priority_changed_cb)
+        self.ges_layer.connect("active-changed", self.__layer_active_changed_cb)
         self.ges_timeline.connect("layer-added", self.__timeline_layer_added_cb)
         self.ges_timeline.connect("layer-removed", self.__timeline_layer_removed_cb)
         self.__update_actions()
@@ -213,6 +224,20 @@ class LayerControls(Gtk.EventBox, Loggable):
         self.ges_timeline.ui.move_layer(self.ges_layer, index)
         self.app.project_manager.current_project.pipeline.commit_timeline()
 
+    def __mute_button_toggled_cb(self, button):
+        self.ges_layer.set_active_for_tracks(not button.get_active(), self.timeline_audio_tracks)
+        self.app.project_manager.current_project.pipeline.commit_timeline()
+
+    def __update_mute_button(self):
+        muted = all([not self.ges_layer.get_active_for_track(t) for t in self.timeline_audio_tracks])
+        self.mute_toggle_button.set_active(muted)
+        icon_name = "audio-volume-muted-symbolic" if muted else "audio-volume-high-symbolic"
+        image = Gtk.Image.new_from_icon_name(icon_name, Gtk.IconSize.BUTTON)
+        self.mute_toggle_button.set_image(image)
+
+    def __layer_active_changed_cb(self, ges_layer, active, tracks):
+        self.__update_mute_button()
+
     def update(self, media_types):
         self.props.height_request = self.ges_layer.ui.props.height_request
 
diff --git a/tests/test_timeline_layer.py b/tests/test_timeline_layer.py
index ba3935e4..fa0bcf24 100644
--- a/tests/test_timeline_layer.py
+++ b/tests/test_timeline_layer.py
@@ -46,6 +46,51 @@ class TestLayerControl(common.TestCase):
         layer.set_name("Layer 0x")
         self.assertEqual(layer.get_name(), "Layer 0x")
 
+    def test_mute_and_unmute_layer(self):
+        timeline_container = common.create_timeline_container()
+        timeline = timeline_container.timeline
+        ges_layer = timeline.ges_timeline.append_layer()
+        layer_controls = ges_layer.control_ui
+        mute_toggle_button = layer_controls.mute_toggle_button
+
+        for audio_track in layer_controls.timeline_audio_tracks:
+            self.assertTrue(ges_layer.get_active_for_track(audio_track))
+            self.assertFalse(mute_toggle_button.get_active())
+
+            ges_layer.set_active_for_tracks(False, [audio_track])
+            common.create_main_loop().run(until_empty=True)
+            self.assertFalse(ges_layer.get_active_for_track(audio_track))
+            self.assertTrue(mute_toggle_button.get_active())
+
+            ges_layer.set_active_for_tracks(True, [audio_track])
+            common.create_main_loop().run(until_empty=True)
+            self.assertTrue(ges_layer.get_active_for_track(audio_track))
+            self.assertFalse(mute_toggle_button.get_active())
+
+    def test_mute_and_unmute_layer_button(self):
+        timeline_container = common.create_timeline_container()
+        timeline = timeline_container.timeline
+        ges_layer = timeline.ges_timeline.append_layer()
+        layer_controls = ges_layer.control_ui
+        mute_toggle_button = layer_controls.mute_toggle_button
+
+        for audio_track in layer_controls.timeline_audio_tracks:
+            self.assertTrue(ges_layer.get_active_for_track(audio_track))
+        common.create_main_loop().run(until_empty=True)
+        self.assertFalse(mute_toggle_button.get_active())
+
+        mute_toggle_button.clicked()
+        for audio_track in layer_controls.timeline_audio_tracks:
+            self.assertFalse(ges_layer.get_active_for_track(audio_track))
+        common.create_main_loop().run(until_empty=True)
+        self.assertTrue(mute_toggle_button.get_active())
+
+        mute_toggle_button.clicked()
+        for audio_track in layer_controls.timeline_audio_tracks:
+            self.assertTrue(ges_layer.get_active_for_track(audio_track))
+        common.create_main_loop().run(until_empty=True)
+        self.assertFalse(mute_toggle_button.get_active())
+
 
 class TestLayer(common.TestCase):
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]