diff options
author | amartin <olpc@localhost.localdomain> | 2007-03-20 19:06:13 (GMT) |
---|---|---|
committer | amartin <olpc@localhost.localdomain> | 2007-03-20 19:06:13 (GMT) |
commit | 5f29f86ef43b756ccdd8c7001a7093ce54b38745 (patch) | |
tree | 725c3e9b8dfdf4ee9d6c58307eb926907623c5e5 /Edit/Properties.py | |
parent | 5424e03d7148b80f24388aa07291ee364b7f59c5 (diff) |
temporary save load buttons
Diffstat (limited to 'Edit/Properties.py')
-rw-r--r-- | Edit/Properties.py | 350 |
1 files changed, 236 insertions, 114 deletions
diff --git a/Edit/Properties.py b/Edit/Properties.py index 46466e4..247b30e 100644 --- a/Edit/Properties.py +++ b/Edit/Properties.py @@ -4,67 +4,53 @@ import gtk from types import * from math import sqrt from Util.ThemeWidgets import * +from Util.NoteDB import PARAMETER import Config -class Properties( gtk.Window ): - def __init__(self, context): - gtk.Window.__init__( self, gtk.WINDOW_TOPLEVEL ) - self.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG) - self.set_position( gtk.WIN_POS_CENTER ) - self.set_default_size(30, 300) - self.move(270, 305) - self.set_border_width(0) - self.set_decorated(False) - self.mainBox = RoundVBox(fillcolor="#FFF", bordercolor="#FFF") - self.mainBox.set_radius(10) - - self.pitch = .4 - self.volume = .4 - self.pan = .4 - self.reverb = .4 - self.attack = .4 - self.decay = .4 - self.filterCutoff = .4 - self.filterType = 0 +class Properties( gtk.VBox ): + def __init__( self, noteDB, doneHandler ): + gtk.VBox.__init__( self ) - self.setupWindow() - self.add(self.mainBox) - self.show_all() + self.noteDB = noteDB + self.doneHandler = doneHandler - def delete_event(self, widget, event, data=None): - return False + self.context = "page" + self.notes = {} # notes indexed by page and track + self.setup = False # flag to block note updates durning setup + + self.filterType = 0 - def setupWindow( self ): - self.connect("delete_event", self.delete_event) self.parametersBox = RoundVBox(fillcolor=Config.INST_BCK_COLOR, bordercolor=Config.PANEL_BCK_COLOR) self.parametersBox.set_border_width(1) self.parametersBox.set_radius(10) - self.mainBox.pack_start(self.parametersBox) + self.pack_start(self.parametersBox) controlsBox = gtk.HBox() pitchBox = RoundVBox(fillcolor=Config.PANEL_COLOR, bordercolor=Config.INST_BCK_COLOR) pitchBox.set_border_width(3) pitchBox.set_radius(10) - self.pitchAdjust = gtk.Adjustment(.4, 0, 1, .01, .01, 0) - self.pitchAdjust.connect("value-changed", self.handlePitch) - pitchSlider = ImageVScale( Config.TAM_TAM_ROOT + "/Resources/Images/sliderEditVolume.png", self.pitchAdjust, 7 ) - pitchSlider.set_inverted(True) - pitchSlider.set_size_request(50, 250) - self.pitchLabel = gtk.Image() - self.pitchLabel.set_from_file(Config.IMAGE_ROOT + 'propPitch2.png') - pitchBox.pack_start(pitchSlider, True, True, 5) - pitchBox.pack_start(self.pitchLabel, False, padding=10) + pitchUp = ImageButton( Config.IMAGE_ROOT+"arrowEditUp.png", Config.IMAGE_ROOT+"arrowEditUpDown.png", Config.IMAGE_ROOT+"arrowEditUpOver.png", backgroundFill = Config.PANEL_COLOR ) + #pitchUp.set_size_request( 25, toolPanelHeight ) + pitchUp.connect( "clicked", lambda w:self.incrementPitch( 1 ) ) + pitchBox.pack_start( pitchUp ) + self.pitchIcon = gtk.Image() + self.pitchIcon.set_from_file(Config.IMAGE_ROOT + 'propPitch2.png') + pitchBox.pack_start(self.pitchIcon) + pitchDown = ImageButton( Config.IMAGE_ROOT+"arrowEditDown.png", Config.IMAGE_ROOT+"arrowEditDownDown.png", Config.IMAGE_ROOT+"arrowEditDownOver.png", backgroundFill = Config.PANEL_COLOR ) + #pitchDown.set_size_request( , ) + pitchDown.connect( "clicked", lambda w:self.incrementPitch( -1 ) ) + pitchBox.pack_start( pitchDown ) controlsBox.pack_start(pitchBox) volumeBox = RoundVBox(fillcolor=Config.PANEL_COLOR, bordercolor=Config.INST_BCK_COLOR) volumeBox.set_border_width(3) volumeBox.set_radius(10) self.volumeAdjust = gtk.Adjustment(.4, 0, 1, .01, .01, 0) - self.volumeAdjust.connect("value-changed", self.handleVolume) volumeSlider = ImageVScale( Config.TAM_TAM_ROOT + "/Resources/Images/sliderEditVolume.png", self.volumeAdjust, 7 ) + self.volumeAdjust.connect("value-changed", self.handleVolume) volumeSlider.set_inverted(True) - volumeSlider.set_size_request(50, 250) + volumeSlider.set_size_request(50, 175) self.volumeLabel = gtk.Image() self.volumeLabel.set_from_file(Config.IMAGE_ROOT + 'propVolume1.png') volumeBox.pack_start(volumeSlider, True, True, 5) @@ -74,13 +60,14 @@ class Properties( gtk.Window ): panBox = RoundVBox(fillcolor=Config.PANEL_COLOR, bordercolor=Config.INST_BCK_COLOR) panBox.set_border_width(3) panBox.set_radius(10) - self.panAdjust = gtk.Adjustment(.4, 0, 1, .01, .01, 0) - self.panAdjust.connect("value-changed", self.handlePan) + self.panAdjust = gtk.Adjustment( 0.5, 0, 1, .1, .1, 0) panSlider = ImageVScale( Config.TAM_TAM_ROOT + "/Resources/Images/sliderEditVolume.png", self.panAdjust, 7 ) + self.panAdjust.connect("value-changed", self.handlePan) + panSlider.set_snap( 0.1 ) panSlider.set_inverted(True) - panSlider.set_size_request(50, 250) + panSlider.set_size_request(50, 175) self.panLabel = gtk.Image() - self.panLabel.set_from_file(Config.IMAGE_ROOT + 'propPan1.png') + self.handlePan( self.panAdjust ) panBox.pack_start(panSlider, True, True, 5) panBox.pack_start(self.panLabel, False, padding=10) controlsBox.pack_start(panBox) @@ -88,13 +75,14 @@ class Properties( gtk.Window ): reverbBox = RoundVBox(fillcolor=Config.PANEL_COLOR, bordercolor=Config.INST_BCK_COLOR) reverbBox.set_border_width(3) reverbBox.set_radius(10) - self.reverbAdjust = gtk.Adjustment(.4, 0, 1, .01, .01, 0) - self.reverbAdjust.connect("value-changed", self.handleReverb) + self.reverbAdjust = gtk.Adjustment(0.1, 0, 1, 0.1, 0.1, 0) reverbSlider = ImageVScale( Config.TAM_TAM_ROOT + "/Resources/Images/sliderEditVolume.png", self.reverbAdjust, 7 ) + self.reverbAdjust.connect("value-changed", self.handleReverb) + reverbSlider.set_snap( 0.1 ) reverbSlider.set_inverted(True) - reverbSlider.set_size_request(50, 250) + reverbSlider.set_size_request(50, 175) self.reverbLabel = gtk.Image() - self.reverbLabel.set_from_file(Config.IMAGE_ROOT + 'propReverb2.png') + self.handleReverb( self.reverbAdjust ) reverbBox.pack_start(reverbSlider, True, True, 5) reverbBox.pack_start(self.reverbLabel, False, padding=10) controlsBox.pack_start(reverbBox) @@ -102,13 +90,14 @@ class Properties( gtk.Window ): attackBox = RoundVBox(fillcolor=Config.PANEL_COLOR, bordercolor=Config.INST_BCK_COLOR) attackBox.set_border_width(3) attackBox.set_radius(10) - self.attackAdjust = gtk.Adjustment(.4, 0, 1, .01, .01, 0) - self.attackAdjust.connect("value-changed", self.handleAttack) + self.attackAdjust = gtk.Adjustment(0.04, 0.03, 1, .01, .01, 0) attackSlider = ImageVScale( Config.TAM_TAM_ROOT + "/Resources/Images/sliderEditVolume.png", self.attackAdjust, 7 ) + self.attackAdjust.connect("value-changed", self.handleAttack) + attackSlider.set_snap( 0.01 ) attackSlider.set_inverted(True) - attackSlider.set_size_request(50, 250) + attackSlider.set_size_request(50, 175) self.attackLabel = gtk.Image() - self.attackLabel.set_from_file(Config.IMAGE_ROOT + 'propAtt1.png') + self.handleAttack( self.attackAdjust ) attackBox.pack_start(attackSlider, True, True, 5) attackBox.pack_start(self.attackLabel, False, padding=10) controlsBox.pack_start(attackBox) @@ -116,69 +105,102 @@ class Properties( gtk.Window ): decayBox = RoundVBox(fillcolor=Config.PANEL_COLOR, bordercolor=Config.INST_BCK_COLOR) decayBox.set_border_width(3) decayBox.set_radius(10) - self.decayAdjust = gtk.Adjustment(.4, 0, 1, .01, .01, 0) - self.decayAdjust.connect("value-changed", self.handleDecay) + self.decayAdjust = gtk.Adjustment(0.31, 0.03, 1, .01, .01, 0) decaySlider = ImageVScale( Config.TAM_TAM_ROOT + "/Resources/Images/sliderEditVolume.png", self.decayAdjust, 7 ) + self.decayAdjust.connect("value-changed", self.handleDecay) + decaySlider.set_snap( 0.01 ) decaySlider.set_inverted(True) - decaySlider.set_size_request(50, 250) + decaySlider.set_size_request(50, 175) self.decayLabel = gtk.Image() - self.decayLabel.set_from_file(Config.IMAGE_ROOT + 'propDec1.png') + self.handleDecay( self.decayAdjust ) decayBox.pack_start(decaySlider, True, True, 5) decayBox.pack_start(self.decayLabel, False, padding=10) controlsBox.pack_start(decayBox) - filterBox = RoundVBox(fillcolor=Config.PANEL_COLOR, bordercolor=Config.INST_BCK_COLOR) + filterBox = RoundHBox(fillcolor=Config.PANEL_COLOR, bordercolor=Config.INST_BCK_COLOR) filterBox.set_border_width(3) filterBox.set_radius(10) - filterSliderBox = gtk.HBox() - self.cutoffAdjust = gtk.Adjustment(.4, 0, 1, .01, .01, 0) - self.cutoffAdjust.connect("value-changed", self.handleFilter, 0) - cutoffSlider = ImageVScale( Config.TAM_TAM_ROOT + "/Resources/Images/sliderEditVolume.png", self.cutoffAdjust, 7 ) - cutoffSlider.set_inverted(True) - cutoffSlider.set_size_request(50, 250) - filterSliderBox.pack_start(cutoffSlider, True, True, 5) - - self.filterTypeAdjust = gtk.Adjustment( 0, 0, 2, 1, 1, 0) - self.filterTypeAdjust.connect("value-changed", self.handleFilter, 1) - filterTypeSlider = ImageVScale( Config.TAM_TAM_ROOT + "/Resources/Images/sliderEditVolume.png", self.filterTypeAdjust, slider_border = 7, snap = 1 ) - filterTypeSlider.set_inverted(True) - filterTypeSlider.set_size_request(50, 250) - filterSliderBox.pack_start(filterTypeSlider, True, True, 5) - - filterBox.pack_start(filterSliderBox) - + filterTypeBox = gtk.VBox() + self.filterTypeLowButton = gtk.ToggleButton( "L" ) + self.filterTypeLowButton.connect( "toggled", self.handleFilterType, 1 ) + filterTypeBox.pack_start( self.filterTypeLowButton ) + self.filterTypeHighButton = gtk.ToggleButton( "H" ) + self.filterTypeHighButton.connect( "toggled", self.handleFilterType, 2 ) + filterTypeBox.pack_start( self.filterTypeHighButton ) + self.filterTypeBandButton = gtk.ToggleButton( "B" ) + self.filterTypeBandButton.connect( "toggled", self.handleFilterType, 3 ) + filterTypeBox.pack_start( self.filterTypeBandButton ) + filterBox.pack_start( filterTypeBox ) + + self.filterSliderBox = gtk.VBox() + self.filterSliderBox.set_size_request(50, -1) + self.cutoffAdjust = gtk.Adjustment(1000, 100, 7000, 100, 100, 0) + self.cutoffSlider = ImageVScale( Config.TAM_TAM_ROOT + "/Resources/Images/sliderEditVolume.png", self.cutoffAdjust, 7 ) + self.cutoffSlider.set_snap(100) + self.cutoffAdjust.connect("value-changed", self.handleFilter) + self.cutoffSlider.set_inverted(True) + self.cutoffSlider.set_size_request(50, 175) + self.filterSliderBox.pack_start(self.cutoffSlider, True, True, 5) self.filterLabel = gtk.Image() self.filterLabel.set_from_file(Config.IMAGE_ROOT + 'propFilter1.png') - filterBox.pack_start(self.filterLabel, False, padding=10) + self.filterSliderBox.pack_start(self.filterLabel, False, padding=10) + + filterBox.pack_start(self.filterSliderBox) controlsBox.pack_start(filterBox) self.parametersBox.pack_start(controlsBox) - # Transport Panel Setup - transportBox = RoundVBox(fillcolor=Config.INST_BCK_COLOR, bordercolor=Config.PANEL_BCK_COLOR) - transportBox.set_border_width(1) - transportBox.set_radius(10) - - # create cancel/check button - transButtonBox = gtk.HBox() - checkButton = ImageButton(Config.IMAGE_ROOT + 'check.png') - checkButton.connect("clicked", self.applyParametersChange) - - cancelButton = ImageButton(Config.IMAGE_ROOT + 'closeA.png') - cancelButton.connect("clicked", self.cancel) - - transButtonBox.pack_end(checkButton, False, False, 10) - transButtonBox.pack_end(cancelButton, False, False) - transportBox.pack_start(transButtonBox, False, False, 5) - self.parametersBox.pack_start(transportBox) - - - - def handlePitch( self, adjust ): - self.pitch = adjust.value - img = int(self.pitch * 5.) - self.pitchLabel.set_from_file(Config.IMAGE_ROOT + 'propPitch' + str(img) + '.png') + self.show_all() + + def setContext( self, context, pageIds = None, trackIds = None, notes = {} ): + self.context = context + self.notes = {} + if context == "page": + for p in pageIds: + self.notes[p] = {} + for t in range(Config.NUMBER_OF_TRACKS): + self.notes[p][t] = self.noteDB.getNotesByTrack( p, t ) + elif context == "track": + for p in pageIds: + self.notes[p] = {} + for t in trackIds: + self.notes[p][t] = self.noteDB.getNotesByTrack( p, t ) + else: + self.notes = notes + + for p in self.notes: + for t in self.notes[p]: + if len(self.notes[p][t]): + # initialize values from first note + self.setup = True + n = self.notes[p][t][0] + self.panAdjust.set_value( n.cs.pan ) + self.reverbAdjust.set_value( n.cs.reverbSend ) + self.attackAdjust.set_value( n.cs.attack ) + self.decayAdjust.set_value( n.cs.decay ) + if n.cs.filterType == 0: + self.filterTypeLowButton.set_active(False) + self.filterTypeHighButton.set_active(False) + self.filterTypeBandButton.set_active(False) + self.filterLabel.hide() + self.cutoffSlider.hide() + else: + if n.cs.filterType == 1: + self.filterTypeLowButton.set_active(True) + if n.cs.filterType == 2: + self.filterTypeHighButton.set_active(True) + if n.cs.filterType == 3: + self.filterTypeBandButton.set_active(True) + self.filterLabel.show() + self.cutoffSlider.show() + self.filterType = n.cs.filterType + self.cutoffAdjust.set_value( n.cs.filterCutoff ) + self.setup = False + return + + def incrementPitch( self, step ): + print step def handleVolume( self, adjust ): self.volume = adjust.value @@ -186,33 +208,133 @@ class Properties( gtk.Window ): self.volumeLabel.set_from_file(Config.IMAGE_ROOT + 'propVolume' + str(img) + '.png') def handlePan( self, adjust ): - self.pan = adjust.value - img = int(self.pan * 4.) + img = min( 4, int(adjust.value * 5) ) self.panLabel.set_from_file(Config.IMAGE_ROOT + 'propPan' + str(img) + '.png') + if not self.setup: + stream = [] + for p in self.notes: + for t in self.notes[p]: + if len(self.notes[p][t]): + stream += [ p, t, PARAMETER.PAN, len(self.notes[p][t]) ] + for n in self.notes[p][t]: + stream += [ n.id, adjust.value ] + if len(stream): + self.noteDB.updateNotes( stream + [-1] ) def handleReverb( self, adjust ): - self.reverb = adjust.value - img = int(self.reverb * 5.) + img = min( 5, int(adjust.value * 6) ) self.reverbLabel.set_from_file(Config.IMAGE_ROOT + 'propReverb' + str(img) + '.png') + if not self.setup: + stream = [] + for p in self.notes: + for t in self.notes[p]: + if len(self.notes[p][t]): + stream += [ p, t, PARAMETER.REVERB, len(self.notes[p][t]) ] + for n in self.notes[p][t]: + stream += [ n.id, adjust.value ] + if len(stream): + self.noteDB.updateNotes( stream + [-1] ) def handleAttack( self, adjust ): - self.attack = adjust.value - img = int(self.attack * 4.) + val = adjust.value*adjust.value + img = min( 4, int(val * 5) ) self.attackLabel.set_from_file(Config.IMAGE_ROOT + 'propAtt' + str(img) + '.png') + if not self.setup: + stream = [] + for p in self.notes: + for t in self.notes[p]: + if len(self.notes[p][t]): + stream += [ p, t, PARAMETER.ATTACK, len(self.notes[p][t]) ] + for n in self.notes[p][t]: + stream += [ n.id, adjust.value ] + if len(stream): + self.noteDB.updateNotes( stream + [-1] ) def handleDecay( self, adjust ): - self.decay = adjust.value - img = int(self.decay * 4.) + val = adjust.value*adjust.value + img = min( 4, int(val * 5) ) self.decayLabel.set_from_file(Config.IMAGE_ROOT + 'propDec' + str(img) + '.png') + if not self.setup: + stream = [] + for p in self.notes: + for t in self.notes[p]: + if len(self.notes[p][t]): + stream += [ p, t, PARAMETER.DECAY, len(self.notes[p][t]) ] + for n in self.notes[p][t]: + stream += [ n.id, adjust.value ] + if len(stream): + self.noteDB.updateNotes( stream + [-1] ) + + def handleFilterType( self, widget, type ): - def handleFilter( self, adjust, slider ): - if slider == 0: - self.filterCutoff = adjust.value - else: - self.filterType = adjust.value - - img = int(self.filterCutoff * 5.) + (int(self.filterType)*6) - self.filterLabel.set_from_file(Config.IMAGE_ROOT + 'propFilter' + str(img) + '.png') + if widget.get_active(): + if self.filterType == 0: + self.filterLabel.show() + self.cutoffSlider.show() + + self.filterType = type + self.updateFilterLabel() + + if widget != self.filterTypeLowButton and self.filterTypeLowButton.get_active(): + self.filterTypeLowButton.set_active( False ) + if widget != self.filterTypeBandButton and self.filterTypeBandButton.get_active(): + self.filterTypeBandButton.set_active( False ) + if widget != self.filterTypeHighButton and self.filterTypeHighButton.get_active(): + self.filterTypeHighButton.set_active( False ) + if not self.setup: + typestream = [] + cutoffstream = [] + cutoff = self.cutoffAdjust.value + for p in self.notes: + for t in self.notes[p]: + if len(self.notes[p][t]): + substream = [] + typestream += [ p, t, PARAMETER.FILTERTYPE, len(self.notes[p][t]) ] + for n in self.notes[p][t]: + typestream += [ n.id, type ] + if n.cs.filterCutoff != cutoff: + substream += [ n.id, cutoff ] + if len(substream): + cutoffstream += [ p, t, PARAMETER.FILTERCUTOFF, len(substream)//2 ] + substream + if len(typestream): + self.noteDB.updateNotes( typestream + [-1] ) + if len(cutoffstream): + self.noteDB.updateNotes( cutoffstream + [-1] ) + + elif type == self.filterType: + self.filterType = 0 + self.filterLabel.hide() + self.cutoffSlider.hide() + if not self.setup: + typestream = [] + for p in self.notes: + for t in self.notes[p]: + if len(self.notes[p][t]): + typestream += [ p, t, PARAMETER.FILTERTYPE, len(self.notes[p][t]) ] + for n in self.notes[p][t]: + typestream += [ n.id, 0 ] + if len(typestream): + self.noteDB.updateNotes( typestream + [-1] ) + + def handleFilter( self, adjust ): + stream = [] + for p in self.notes: + for t in self.notes[p]: + if len(self.notes[p][t]): + stream += [ p, t, PARAMETER.FILTERCUTOFF, len(self.notes[p][t]) ] + for n in self.notes[p][t]: + stream += [ n.id, adjust.value ] + if len(stream): + self.noteDB.updateNotes( stream + [-1] ) + + + self.updateFilterLabel() + + + def updateFilterLabel( self ): + val = (self.cutoffAdjust.value-self.cutoffAdjust.lower)/(self.cutoffAdjust.upper-self.cutoffAdjust.lower) + img = min( 5, int(val * 6) ) + self.filterLabel.set_from_file(Config.IMAGE_ROOT + 'propFilter%d.%d' % (self.filterType, img) + '.png') def cancel( self, widget, data=None ): self.window.destroy() |