audio: Add a custom VolumeScale widget

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2021-09-01 14:50:04 -04:00
parent 33c7bdf517
commit edc3e7f876
2 changed files with 52 additions and 4 deletions

View File

@ -59,6 +59,20 @@ class SeekScale(ScalePlus):
return GLib.SOURCE_CONTINUE
class VolumeScale(ScalePlus):
def __init__(self, player):
ScalePlus.__init__(self, 0.0, 1.0, 0.05, 0.25)
self.player = player
self.set_value(player.get_volume())
def do_change_value(self, scroll, value):
self.set_value(value)
self.player.set_volume(value)
def format_value(self, scale, value):
return f"{int(value * 100)}%"
class ScaleButton(Gtk.Button):
def __init__(self, scale, icon):
Gtk.Button.__init__(self)

View File

@ -6,14 +6,17 @@ from gi.repository import Gst
from . import scale
class FakePlayer(GObject.GObject):
def __init__(self, position, duration):
def __init__(self, position, duration, volume):
GObject.GObject.__init__(self)
self.pos = position
self.dur = duration
self.vol = volume
def position(self): return self.pos
def duration(self): return self.dur
def seek(self, value): self.seek_val = value
def set_volume(self, volume): self.vol = volume
def get_volume(self): return self.vol
class TestScalePlus(unittest.TestCase):
@ -67,7 +70,7 @@ class TestScalePlus(unittest.TestCase):
class TestSeekScale(unittest.TestCase):
def test_seek_scale_init(self):
fake = FakePlayer(0, 5 * Gst.SECOND)
fake = FakePlayer(0, 5 * Gst.SECOND, 1)
seek = scale.SeekScale(fake)
adj = seek.get_adjustment()
@ -82,7 +85,7 @@ class TestSeekScale(unittest.TestCase):
self.assertEqual(adj.get_page_increment(), 30 * Gst.SECOND)
def test_seek_scale_update(self):
fake = FakePlayer(3 * Gst.SECOND, 15 * Gst.SECOND)
fake = FakePlayer(3 * Gst.SECOND, 15 * Gst.SECOND, 1)
seek = scale.SeekScale(fake)
adj = seek.get_adjustment()
@ -93,7 +96,7 @@ class TestSeekScale(unittest.TestCase):
self.assertEqual(adj.get_upper(), 15 * Gst.SECOND)
def test_seek_scale_values(self):
fake = FakePlayer(0, 15 * Gst.SECOND)
fake = FakePlayer(0, 15 * Gst.SECOND, 1)
seek = scale.SeekScale(fake)
seek.update()
@ -106,6 +109,37 @@ class TestSeekScale(unittest.TestCase):
self.assertEqual(fake.seek_val, 0)
class TestVolumeScale(unittest.TestCase):
def test_volume_scale_init(self):
fake = FakePlayer(0, 5 * Gst.SECOND, 1.0)
volume = scale.VolumeScale(fake)
adj = volume.get_adjustment()
self.assertIsInstance(volume, scale.ScalePlus)
self.assertEqual(volume.player, fake)
self.assertEqual(adj.get_value(), 1.0)
self.assertEqual(adj.get_lower(), 0.0)
self.assertEqual(adj.get_upper(), 1.0)
self.assertEqual(adj.get_step_increment(), 0.05)
self.assertEqual(adj.get_page_increment(), 0.25)
fake.set_volume(0.5)
vol2 = scale.VolumeScale(fake)
self.assertEqual(vol2.get_value(), 0.5)
def test_volume_scale_values(self):
fake = FakePlayer(0, 15 * Gst.SECOND, 0.5)
volume = scale.VolumeScale(fake)
volume.increment()
self.assertEqual(fake.get_volume(), 0.55)
self.assertEqual(volume.format_value(volume, 0.55), "55%")
volume.decrement()
self.assertEqual(fake.get_volume(), 0.50)
self.assertEqual(volume.format_value(volume, 0.50), "50%")
class TestScaleButton(unittest.TestCase):
def test_scale_button(self):
splus = scale.ScalePlus(0, 5, 1, 1)