#
# THIS FILE IS PART OF THE JOKOSHER PROJECT AND LICENSED UNDER THE GPL. SEE
# THE 'COPYING' FILE FOR DETAILS
#
# MixerStrip.py
#
# Contains the VU widget, the buttons below it and levels,
# for an Instrument in the mixing view.
#
#-------------------------------------------------------------------------------
import pygtk
pygtk.require("2.0")
import gtk
import gobject
import os
import Globals
import Utils
import ControlsBox
import gettext
_ = gettext.gettext
from VUWidget import *
#=========================================================================
class MixerStrip(gtk.Frame):
"""
Contains the VU widget and the buttons below it,
for an Instrument in the mixing view.
"""
""" GTK widget name """
__gtype_name__ = 'MixerStrip'
#_____________________________________________________________________
def __init__(self, project, instrument, mixview, mainview):
"""
Creates a new instance of MixerStrip.
Parameters:
project -- the currently active Project.
instrument -- the instrument associated with this MixerStrip.
mixview -- the mixing view object (CompactMixView).
mainview -- the main Jokosher window (MainApp).
"""
gtk.Container.__init__(self)
self.project = project
self.instrument = instrument
self.mixview = mixview
self.mainview = mainview
self.Updating = False
self.statusbarMsgID = None
self.vbox = gtk.VBox()
self.add(self.vbox)
self.minbutt = gtk.Button()
img = gtk.image_new_from_stock(gtk.STOCK_GOTO_BOTTOM, gtk.ICON_SIZE_MENU)
self.minbutt.set_image(img)
self.minbutt.set_tooltip_text(_("Minimize instrument"))
self.minbutt.connect("clicked", self.EmitMinimise)
self.vbox.pack_start(self.minbutt, False)
self.panvbox = gtk.VBox()
self.panvbox.set_border_width(3)
self.vbox.pack_start(self.panvbox, False)
# the slider label
balanceLabel = gtk.Label(_("Balance:"))
self.panvbox.pack_start(balanceLabel, False)
# add the panning slider
self.panhbox = gtk.HBox()
self.panhbox.set_spacing(3)
self.leftlab = gtk.Label(_("L"))
self.rightlab = gtk.Label(_("R"))
self.pan = gtk.HScale()
self.pan.set_range(-1.0, 1.0)
self.pan.set_increments(0.1, 1.0)
self.pan.set_draw_value(False)
self.pan.set_tooltip_text(_("Adjust instrument balance. Right-click to center"))
if self.instrument.pan:
self.pan.set_value(self.instrument.pan)
self.pan.connect("value-changed", self.OnPanChanged)
self.pan.connect("button-press-event", self.OnPanClicked)
self.panhbox.pack_start(self.leftlab, False)
self.panhbox.pack_start(self.pan, True)
self.panhbox.pack_start(self.rightlab, False)
self.panvbox.pack_start(self.panhbox, False)
#volume label
volumeLabel = gtk.Label(_("Volume:"))
volumeLabel.set_padding(3, 3)
self.vbox.pack_start(volumeLabel, False)
# VU Meter
self.vu = VUWidget(self, self.mainview)
self.vbox.pack_start(self.vu, True, True)
#Control Buttons
controlsBox = ControlsBox.ControlsBox(project, mainview,instrument,includeEffects=False)
self.vbox.pack_start(controlsBox, False, False)
# Label and icon
hb = gtk.HBox()
self.instrImage = gtk.Image()
#initalize the image from the instrument's pixbuf
self.OnInstrumentImage()
hb.pack_start(self.instrImage, False, False)
self.label = gtk.Label(instrument.name)
self.label.set_max_width_chars(6)
hb.pack_start(self.label, True, True)
self.instrument.connect("name", self.OnInstrumentName)
self.instrument.connect("image", self.OnInstrumentImage)
self.vbox.pack_end(hb, False, False)
self.vbox.show_all()
self.show_all()
#_____________________________________________________________________
def EmitMinimise(self, widget):
"""
Minimizes the Instrument to the StatusBar.
Parameters:
widget -- reserved for GTK callbacks, don't use it explicitly.
"""
self.emit("minimise")
#_____________________________________________________________________
def OnInstrumentName(self, instrument=None):
"""
Callback for when the instrument's name changes.
Parameters:
instrument -- the instrument instance that send the signal.
"""
self.label.set_text(self.instrument.name)
#_____________________________________________________________________
def OnInstrumentImage(self, instrument=None):
"""
Callback for when the instrument's image changes.
Parameters:
instrument -- the instrument instance that send the signal.
"""
imgsize = gtk.icon_size_lookup(gtk.ICON_SIZE_MENU)[0]
pixbuf = self.instrument.pixbuf.scale_simple(imgsize, imgsize, gtk.gdk.INTERP_BILINEAR)
self.instrImage.set_from_pixbuf(pixbuf)
#_____________________________________________________________________
def Destroy(self):
"""
Called when the MixerStrip is destroyed. It also emits the
destroy signal to the VUMixer widget.
"""
self.instrument.disconnect_by_func(self.OnInstrumentImage)
self.instrument.disconnect_by_func(self.OnInstrumentName)
self.vu.Destroy()
self.destroy()
#_____________________________________________________________________
def GetLevel(self):
"""
Obtain the instrument level.
Returns:
the level of the instrument.
"""
return self.instrument.level
#_____________________________________________________________________
def GetVolume(self):
"""
Obtain the instrument volume.
Returns:
the volume of the instrument.
"""
return self.instrument.volume
#_____________________________________________________________________
def SetVolume(self, vol):
"""
Sets the instrument's volume.
Parameters:
vol -- volume value to set this Instrument's volume to.
"""
self.instrument.SetVolume(vol)
#_____________________________________________________________________
def CommitVolume(self):
self.instrument.CommitVolume()
#_____________________________________________________________________
def OnPanChanged(self, slider):
"""
Changes the Instrument's audiopanorama value to the
one indicated by the slider control.
It also updates the statusbar when dragging the slider.
Parameters:
slider -- panning slider control.
"""
value = round(slider.get_value(), 2)
# clear any existing status bar messages
if self.statusbarMsgID is not None:
self.mainview.ClearStatusBar(self.statusbarMsgID)
# set the statusbar message depending on the current pan value
if value < 0:
self.statusbarMsgID = self.mainview.SetStatusBar(_("Current balance is %d%% left") % (-value * 100))
elif value == 0:
self.statusbarMsgID = self.mainview.SetStatusBar(_("Current balance is centered"))
else:
self.statusbarMsgID = self.mainview.SetStatusBar(_("Current balance is %d%% right") % (value * 100))
#to remove the status bar message in a few seconds
self.OnTimedStatusBarClear()
self.instrument.pan = value
self.instrument.panElement.set_property("panorama", value)
#_____________________________________________________________________
def OnPanClicked(self, slider, mouse):
"""
Centers the panning slider bar when right clicked.
Parameters:
slider -- panning slider control.
mouse -- mouse event that fired this callback.
"""
if mouse.button == 3:
slider.set_value(0.0)
return True
#_____________________________________________________________________
def OnTimedStatusBarClear(self):
"""
Waits for a few seconds and then clears the status bar message.
"""
# clear any existing status bar messages
if self.statusbarMsgID is not None:
gobject.timeout_add(2000, self.mainview.ClearStatusBar, self.statusbarMsgID)
self.statusbarMsgID = None
#_____________________________________________________________________
#=========================================================================
#create signal to be emitted by MixerStrip
gobject.signal_new("minimise", MixerStrip, gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ())
#=========================================================================