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 | |
parent | 5424e03d7148b80f24388aa07291ee364b7f59c5 (diff) |
temporary save load buttons
Diffstat (limited to 'Edit')
-rw-r--r-- | Edit/MainWindow.py | 170 | ||||
-rw-r--r-- | Edit/Properties.py | 350 |
2 files changed, 332 insertions, 188 deletions
diff --git a/Edit/MainWindow.py b/Edit/MainWindow.py index 897f440..1b9ffe7 100644 --- a/Edit/MainWindow.py +++ b/Edit/MainWindow.py @@ -11,7 +11,6 @@ from Util.CSoundClient import new_csound_client from Util.InstrumentPanel import InstrumentPanel from Util.InstrumentPanel import DrumPanel from Util.CSoundNote import CSoundNote -from Edit.Properties import Properties import time class CONTEXT: @@ -24,6 +23,7 @@ from SubActivity import SubActivity from Generation.GenerationConstants import GenerationConstants from Generation.GenerationParametersWindow import GenerationParametersWindow +from Edit.Properties import Properties from Edit.TrackInterface import TrackInterface, TrackInterfaceParasite from Edit.TuneInterface import TuneInterface, TuneInterfaceParasite @@ -233,11 +233,11 @@ class MainWindow( SubActivity ): contextWidth = 674 self.GUI["2contextBox"] = formatRoundBox( RoundFixed(), Config.BG_COLOR ) self.GUI["2contextBox"].set_size_request( contextWidth, -1 ) - self.GUI["2contextPrevButton"] = ImageButton( Config.IMAGE_ROOT+"arrowEditLeft.png", backgroundFill = Config.BG_COLOR ) + self.GUI["2contextPrevButton"] = ImageButton( Config.IMAGE_ROOT+"arrowEditLeft.png", Config.IMAGE_ROOT+"arrowEditLeftDown.png", Config.IMAGE_ROOT+"arrowEditLeftOver.png", backgroundFill = Config.BG_COLOR ) self.GUI["2contextPrevButton"].set_size_request( 25, toolPanelHeight ) self.GUI["2contextPrevButton"].connect( "clicked", lambda a1:self.prevContext() ) self.GUI["2contextBox"].put( self.GUI["2contextPrevButton"], 0, 0 ) - self.GUI["2contextNextButton"] = ImageButton( Config.IMAGE_ROOT+"arrowEditRight.png", backgroundFill = Config.BG_COLOR ) + self.GUI["2contextNextButton"] = ImageButton( Config.IMAGE_ROOT+"arrowEditRight.png", Config.IMAGE_ROOT+"arrowEditRightDown.png", Config.IMAGE_ROOT+"arrowEditRightOver.png", backgroundFill = Config.BG_COLOR ) self.GUI["2contextNextButton"].set_size_request( 25, toolPanelHeight ) self.GUI["2contextNextButton"].connect( "clicked", lambda a1:self.nextContext() ) self.GUI["2contextBox"].put( self.GUI["2contextNextButton"], contextWidth-25, 0 ) @@ -247,9 +247,8 @@ class MainWindow( SubActivity ): self.GUI["2pageGenerateButton"] = ImageToggleButton( Config.IMAGE_ROOT+"genPage.png", Config.IMAGE_ROOT+"genPageDown.png", Config.IMAGE_ROOT+"genPageOver.png", backgroundFill = Config.BG_COLOR ) self.GUI["2pageGenerateButton"].connect( "toggled", self.pageGenerate ) self.GUI["2pageBox"].pack_start( self.GUI["2pageGenerateButton"] ) - self.GUI["2pagePropertiesButton"] = ImageButton( Config.IMAGE_ROOT+"propPage.png", backgroundFill = Config.BG_COLOR ) - #self.GUI["2pagePropertiesButton"] = ImageButton( Config.IMAGE_ROOT+"propPage.png", Config.IMAGE_ROOT+"propPageDown.png", Config.IMAGE_ROOT+"propPageOver.png", backgroundFill = Config.BG_COLOR ) - self.GUI["2pagePropertiesButton"].connect( "clicked", lambda a1:self.pageProperties() ) + self.GUI["2pagePropertiesButton"] = ImageToggleButton( Config.IMAGE_ROOT+"propPage.png", Config.IMAGE_ROOT+"propPageDown.png", Config.IMAGE_ROOT+"propPageOver.png", backgroundFill = Config.BG_COLOR ) + self.GUI["2pagePropertiesButton"].connect( "toggled", self.pageProperties ) self.GUI["2pageBox"].pack_start( self.GUI["2pagePropertiesButton"] ) self.GUI["2pageDeleteButton"] = ImageButton( Config.IMAGE_ROOT+"delPage.png", Config.IMAGE_ROOT+"delPageDown.png", Config.IMAGE_ROOT+"delPageOver.png", backgroundFill = Config.BG_COLOR ) self.GUI["2pageDeleteButton"].connect( "clicked", lambda a1:self.pageDelete() ) @@ -260,10 +259,6 @@ class MainWindow( SubActivity ): self.GUI["2pageNewButton"] = ImageButton( Config.IMAGE_ROOT+"addPage.png", Config.IMAGE_ROOT+"addPageDown.png", Config.IMAGE_ROOT+"addPageOver.png", backgroundFill = Config.BG_COLOR ) self.GUI["2pageNewButton"].connect( "clicked", lambda a1:self.pageAdd() ) self.GUI["2pageBox"].pack_start( self.GUI["2pageNewButton"] ) - self.GUI["2pageBeatsButton"] = ImageButton( Config.IMAGE_ROOT+"beatPage.png", backgroundFill = Config.BG_COLOR ) - #self.GUI["2pageBeatsButton"] = ImageButton( Config.IMAGE_ROOT+"beatPage.png", Config.IMAGE_ROOT+"beatPageDown.png", Config.IMAGE_ROOT+"beatPageOver.png", backgroundFill = Config.BG_COLOR ) - #self.GUI["2pageBeatsButton"].connect( "clicked", lambda a1:self.pageBeats() ) - self.GUI["2pageBox"].pack_start( self.GUI["2pageBeatsButton"] ) self.GUI["2contextBox"].put( self.GUI["2pageBox"], 25, 0 ) # + + + track box self.GUI["2trackBox"] = gtk.HBox() @@ -271,9 +266,8 @@ class MainWindow( SubActivity ): self.GUI["2trackGenerateButton"] = ImageToggleButton( Config.IMAGE_ROOT+"genTrack.png", Config.IMAGE_ROOT+"genTrackDown.png", Config.IMAGE_ROOT+"genTrackOver.png", backgroundFill = Config.BG_COLOR ) self.GUI["2trackGenerateButton"].connect( "toggled", self.trackGenerate ) self.GUI["2trackBox"].pack_start( self.GUI["2trackGenerateButton"] ) - self.GUI["2trackPropertiesButton"] = ImageButton( Config.IMAGE_ROOT+"propTrack.png", backgroundFill = Config.BG_COLOR ) - #self.GUI["2trackPropertiesButton"] = ImageButton( Config.IMAGE_ROOT+"propTrack.png", Config.IMAGE_ROOT+"propTrackDown.png", Config.IMAGE_ROOT+"propTrackOver.png", backgroundFill = Config.BG_COLOR ) - self.GUI["2trackPropertiesButton"].connect( "clicked", lambda a1:self.trackProperties() ) + self.GUI["2trackPropertiesButton"] = ImageToggleButton( Config.IMAGE_ROOT+"propTrack.png", Config.IMAGE_ROOT+"propTrackDown.png", Config.IMAGE_ROOT+"propTrackOver.png", backgroundFill = Config.BG_COLOR ) + self.GUI["2trackPropertiesButton"].connect( "toggled", self.trackProperties ) self.GUI["2trackBox"].pack_start( self.GUI["2trackPropertiesButton"] ) self.GUI["2trackDeleteButton"] = ImageButton( Config.IMAGE_ROOT+"delTrack.png", Config.IMAGE_ROOT+"delTrackDown.png", Config.IMAGE_ROOT+"delTrackOver.png", backgroundFill = Config.BG_COLOR ) self.GUI["2trackDeleteButton"].connect( "clicked", lambda a1:self.trackDelete() ) @@ -285,9 +279,8 @@ class MainWindow( SubActivity ): # + + + note box self.GUI["2noteBox"] = gtk.HBox() self.GUI["2noteBox"].set_size_request( contextWidth-50, 73 ) - self.GUI["2notePropertiesButton"] = ImageButton( Config.IMAGE_ROOT+"propNote.png", backgroundFill = Config.BG_COLOR ) - #self.GUI["2notePropertiesButton"] = ImageButton( Config.IMAGE_ROOT+"propNote.png", Config.IMAGE_ROOT+"propNoteDown.png", Config.IMAGE_ROOT+"propNoteOver.png", backgroundFill = Config.BG_COLOR ) - self.GUI["2notePropertiesButton"].connect( "clicked", lambda a1:self.noteProperties() ) + self.GUI["2notePropertiesButton"] = ImageToggleButton( Config.IMAGE_ROOT+"propNote.png", Config.IMAGE_ROOT+"propNoteDown.png", Config.IMAGE_ROOT+"propNoteOver.png", backgroundFill = Config.BG_COLOR ) + self.GUI["2notePropertiesButton"].connect( "toggled", self.noteProperties ) self.GUI["2noteBox"].pack_start( self.GUI["2notePropertiesButton"] ) self.GUI["2noteDeleteButton"] = ImageButton( Config.IMAGE_ROOT+"delNote.png", Config.IMAGE_ROOT+"delNoteDown.png", Config.IMAGE_ROOT+"delNoteOver.png", backgroundFill = Config.BG_COLOR ) self.GUI["2noteDeleteButton"].connect( "clicked", lambda a1:self.noteDelete() ) @@ -295,42 +288,6 @@ class MainWindow( SubActivity ): self.GUI["2noteDuplicateButton"] = ImageToggleButton( Config.IMAGE_ROOT+"dupNote.png", Config.IMAGE_ROOT+"dupNoteDown.png", Config.IMAGE_ROOT+"dupNoteOver.png", backgroundFill = Config.BG_COLOR ) self.GUI["2noteDuplicateButton"].connect( "toggled", self.noteDuplicateWidget ) self.GUI["2noteBox"].pack_start( self.GUI["2noteDuplicateButton"] ) - self.GUI["2noteOnsetBox"] = gtk.HBox( False ) - self.GUI["2noteOnsetBox"].set_size_request( 72, -1 ) - self.GUI["2noteOnsetMinusButton"] = ImageButton( Config.IMAGE_ROOT+"editOnsetLeft.png", Config.IMAGE_ROOT+"editOnsetDownLeft.png", Config.IMAGE_ROOT+"editOnsetOverLeft.png", backgroundFill = Config.BG_COLOR ) - self.GUI["2noteOnsetMinusButton"].connect( "clicked", lambda a1:self.trackInterface.noteStepOnset(-1) ) - self.GUI["2noteOnsetBox"].pack_start( self.GUI["2noteOnsetMinusButton"], False, False ) - self.GUI["2noteOnsetPlusButton"] = ImageButton( Config.IMAGE_ROOT+"editOnsetRight.png", Config.IMAGE_ROOT+"editOnsetDownRight.png", Config.IMAGE_ROOT+"editOnsetOverRight.png", backgroundFill = Config.BG_COLOR ) - self.GUI["2noteOnsetPlusButton"].connect( "clicked", lambda a1:self.trackInterface.noteStepOnset(1) ) - self.GUI["2noteOnsetBox"].pack_start( self.GUI["2noteOnsetPlusButton"], False, False ) - self.GUI["2noteBox"].pack_start( self.GUI["2noteOnsetBox"] ) - self.GUI["2notePitchBox"] = gtk.VBox() - self.GUI["2notePitchBox"].set_size_request( 72, -1 ) - self.GUI["2notePitchPlusButton"] = ImageButton( Config.IMAGE_ROOT+"editPitchTop.png", Config.IMAGE_ROOT+"editPitchDownTop.png", Config.IMAGE_ROOT+"editPitchOverTop.png", backgroundFill = Config.BG_COLOR ) - self.GUI["2notePitchPlusButton"].connect( "clicked", lambda a1:self.trackInterface.noteStepPitch(1) ) - self.GUI["2notePitchBox"].pack_start( self.GUI["2notePitchPlusButton"] ) - self.GUI["2notePitchMinusButton"] = ImageButton( Config.IMAGE_ROOT+"editPitchBot.png", Config.IMAGE_ROOT+"editPitchDownBot.png", Config.IMAGE_ROOT+"editPitchOverBot.png", backgroundFill = Config.BG_COLOR ) - self.GUI["2notePitchMinusButton"].connect( "clicked", lambda a1:self.trackInterface.noteStepPitch(-1) ) - self.GUI["2notePitchBox"].pack_start( self.GUI["2notePitchMinusButton"] ) - self.GUI["2noteBox"].pack_start( self.GUI["2notePitchBox"] ) - self.GUI["2noteDurationBox"] = gtk.HBox( False ) - self.GUI["2noteDurationBox"].set_size_request( 72, -1 ) - self.GUI["2noteDurationMinusButton"] = ImageButton( Config.IMAGE_ROOT+"editDurLeft.png", Config.IMAGE_ROOT+"editDurDownLeft.png", Config.IMAGE_ROOT+"editDurOverLeft.png", backgroundFill = Config.BG_COLOR ) - self.GUI["2noteDurationMinusButton"].connect( "clicked", lambda a1:self.trackInterface.noteStepDuration(-1) ) - self.GUI["2noteDurationBox"].pack_start( self.GUI["2noteDurationMinusButton"], False, False ) - self.GUI["2noteDurationPlusButton"] = ImageButton( Config.IMAGE_ROOT+"editDurRight.png", Config.IMAGE_ROOT+"editDurDownRight.png", Config.IMAGE_ROOT+"editDurOverRight.png", backgroundFill = Config.BG_COLOR ) - self.GUI["2noteDurationPlusButton"].connect( "clicked", lambda a1:self.trackInterface.noteStepDuration(1) ) - self.GUI["2noteDurationBox"].pack_start( self.GUI["2noteDurationPlusButton"], False, False ) - self.GUI["2noteBox"].pack_start( self.GUI["2noteDurationBox"] ) - self.GUI["2noteVolumeBox"] = gtk.VBox() - self.GUI["2noteVolumeBox"].set_size_request( 72, -1 ) - self.GUI["2noteVolumePlusButton"] = ImageButton( Config.IMAGE_ROOT+"editAmpTop.png", Config.IMAGE_ROOT+"editAmpDownTop.png", Config.IMAGE_ROOT+"editAmpOverTop.png", backgroundFill = Config.BG_COLOR ) - self.GUI["2noteVolumePlusButton"].connect( "clicked", lambda a1:self.trackInterface.noteStepVolume(0.1) ) - self.GUI["2noteVolumeBox"].pack_start( self.GUI["2noteVolumePlusButton"] ) - self.GUI["2noteVolumeMinusButton"] = ImageButton( Config.IMAGE_ROOT+"editAmpBot.png", Config.IMAGE_ROOT+"editAmpDownBot.png", Config.IMAGE_ROOT+"editAmpOverBot.png", backgroundFill = Config.BG_COLOR ) - self.GUI["2noteVolumeMinusButton"].connect( "clicked", lambda a1:self.trackInterface.noteStepVolume(-0.1) ) - self.GUI["2noteVolumeBox"].pack_start( self.GUI["2noteVolumeMinusButton"] ) - self.GUI["2noteBox"].pack_start( self.GUI["2noteVolumeBox"] ) self.GUI["2contextBox"].put( self.GUI["2noteBox"], 25, 0 ) self.GUI["2toolPanel"].pack_start( self.GUI["2contextBox"], False ) # + + transport box @@ -362,10 +319,17 @@ class MainWindow( SubActivity ): self.GUI["2closeButton"].connect( "pressed", self.handleClose) self.GUI["2transportBox"].pack_start( self.GUI["2closeButton"] ) self.GUI["2toolPanel"].pack_start( self.GUI["2transportBox"] ) - # + tune box + # + load/save box self.GUI["2tuneBox"] = formatRoundBox( RoundHBox(), Config.BG_COLOR ) + self.GUI["2saveButton"] = ImageButton( Config.IMAGE_ROOT+"save.png", backgroundFill=Config.BG_COLOR ) + #self.GUI["2saveButton"].connect("clicked", self.somesave ) + self.GUI["2tuneBox"].pack_start( self.GUI["2saveButton"], False, False ) + self.GUI["2loadButton"] = ImageButton( Config.IMAGE_ROOT+"load.png", backgroundFill=Config.BG_COLOR ) + #self.GUI["2loadButton"].connect("clicked", self.someload ) + self.GUI["2tuneBox"].pack_start( self.GUI["2loadButton"], False, False ) + # + tune box self.GUI["2tuneHBox"] = gtk.HBox() - self.GUI["2tuneScrollLeftButton"] = ImageButton( Config.IMAGE_ROOT+"arrowEditLeft.png", backgroundFill = Config.BG_COLOR ) + self.GUI["2tuneScrollLeftButton"] = ImageButton( Config.IMAGE_ROOT+"arrowEditLeft.png", Config.IMAGE_ROOT+"arrowEditLeftDown.png", Config.IMAGE_ROOT+"arrowEditLeftOver.png", backgroundFill = Config.BG_COLOR ) self.GUI["2tuneScrollLeftButton"].set_size_request( 25, -1 ) self.GUI["2tuneScrollLeftButton"].connect( "clicked", lambda a1:self.scrollTune( -1 ) ) self.GUI["2tuneHBox"].pack_start( self.GUI["2tuneScrollLeftButton"], False, False ) @@ -380,7 +344,7 @@ class MainWindow( SubActivity ): self.GUI["2tuneSlider"] = gtk.HScrollbar( self.GUI["2tuneScrolledWindow"].get_hadjustment() ) #ImageHScale( Config.IMAGE_ROOT+"sliderEditTempo.png", self.GUI["2tuneScrolledWindow"].get_hadjustment(), 6 ) self.GUI["2tuneVBox"].pack_start( self.GUI["2tuneSlider"], False, False ) self.GUI["2tuneHBox"].pack_start( self.GUI["2tuneVBox"] ) - self.GUI["2tuneScrollRightButton"] = ImageButton( Config.IMAGE_ROOT+"arrowEditRight.png", backgroundFill = Config.BG_COLOR ) + self.GUI["2tuneScrollRightButton"] = ImageButton( Config.IMAGE_ROOT+"arrowEditRight.png", Config.IMAGE_ROOT+"arrowEditRightDown.png", Config.IMAGE_ROOT+"arrowEditRightOver.png", backgroundFill = Config.BG_COLOR ) self.GUI["2tuneScrollRightButton"].set_size_request( 25, toolPanelHeight ) self.GUI["2tuneScrollRightButton"].connect( "clicked", lambda a1:self.scrollTune( 1 ) ) self.GUI["2tuneHBox"].pack_start( self.GUI["2tuneScrollRightButton"], False, False ) @@ -423,12 +387,19 @@ class MainWindow( SubActivity ): self.generationPanel = GenerationParametersWindow( self.generate, self.variate, self.doneGenerationPopup ) TP.ProfileEnd("init_GUI::generationPanel") self.GUI["9generationPopup"] = gtk.Window(gtk.WINDOW_POPUP) - #self.GUI["9generationPopup"].move( 400, 100 ) - #self.GUI["9generationPopup"].resize( 400, 100 ) self.GUI["9generationPopup"].set_modal(True) self.GUI["9generationPopup"].add_events( gtk.gdk.BUTTON_PRESS_MASK ) self.GUI["9generationPopup"].connect("button-release-event", lambda w,e:self.doneGenerationPopup() ) self.GUI["9generationPopup"].add( self.generationPanel ) + # + properties window + TP.ProfileBegin("init_GUI::propertiesPanel") + self.propertiesPanel = Properties( self.noteDB, self.donePropertiesPopup ) + TP.ProfileEnd("init_GUI::propertiesPanel") + self.GUI["9propertiesPopup"] = gtk.Window(gtk.WINDOW_POPUP) + self.GUI["9propertiesPopup"].set_modal(True) + self.GUI["9propertiesPopup"].add_events( gtk.gdk.BUTTON_PRESS_MASK ) + self.GUI["9propertiesPopup"].connect("button-release-event", lambda w,e:self.donePropertiesPopup() ) + self.GUI["9propertiesPopup"].add( self.propertiesPanel ) # + playback scope self.GUI["9loopPopup"] = gtk.Window(gtk.WINDOW_POPUP) self.GUI["9loopPopup"].move( 100, 100 ) @@ -547,6 +518,20 @@ class MainWindow( SubActivity ): #========================================================= # Popup Windows + def doneGenerationPopup( self ): + if self.GUI["2pageGenerateButton"].get_active(): + self.GUI["2pageGenerateButton"].set_active( False ) + if self.GUI["2trackGenerateButton"].get_active(): + self.GUI["2trackGenerateButton"].set_active( False ) + + def donePropertiesPopup( self ): + if self.GUI["2pagePropertiesButton"].get_active(): + self.GUI["2pagePropertiesButton"].set_active( False ) + if self.GUI["2trackPropertiesButton"].get_active(): + self.GUI["2trackPropertiesButton"].set_active( False ) + if self.GUI["2notePropertiesButton"].get_active(): + self.GUI["2notePropertiesButton"].set_active( False ) + def cancelPopup( self, w, event, popup ): popup.hide() @@ -826,12 +811,6 @@ class MainWindow( SubActivity ): # generation functions #----------------------------------- - def doneGenerationPopup( self ): - if self.GUI["2pageGenerateButton"].get_active(): - self.GUI["2pageGenerateButton"].set_active( False ) - if self.GUI["2trackGenerateButton"].get_active(): - self.GUI["2trackGenerateButton"].set_active( False ) - def recompose( self, algo, params, genOrVar): if self.generateMode == "track": if self.trackSelected == [ 0 for i in range(Config.NUMBER_OF_TRACKS) ]: @@ -927,9 +906,28 @@ class MainWindow( SubActivity ): #======================================================= # Note Functions - def noteProperties( self ): - if (Config.DEBUG > 3): print "noteProperties", self.trackInterface.selectedNotes - self.properties = Properties(self.context) + def noteProperties( self, widget ): + if widget.get_active(): + ids = self.trackInterface.getSelectedNotes() + notes = { self.displayedPage: {} } + for t in range(Config.NUMBER_OF_TRACKS): + if len(ids[t]): + notes[self.displayedPage][t] = [ self.noteDB.getNote( self.displayedPage, t, id ) for id in ids[t] ] + + self.propertiesPanel.setContext("note", notes = notes ) + winLoc = self.parent.window.get_position() + balloc = self.GUI["2contextBox"].get_allocation() + walloc = self.GUI["9propertiesPopup"].get_allocation() + if walloc.height != 1: # hack to make deal with showing the window before first allocation T_T + self.GUI["9propertiesPopup"].move( balloc.x + winLoc[0], balloc.y - walloc.height + winLoc[1] ) + else: + self.GUI["9propertiesPopup"].move(0, 2048) # off the screen + self.GUI["9propertiesPopup"].show() + if walloc.height == 1: + walloc = self.GUI["9propertiesPopup"].get_allocation() + self.GUI["9propertiesPopup"].move( balloc.x + winLoc[0], balloc.y - walloc.height + winLoc[1] ) + else: + self.GUI["9propertiesPopup"].hide() def noteDelete( self ): ids = self.trackInterface.getSelectedNotes() @@ -1053,8 +1051,22 @@ class MainWindow( SubActivity ): self.GUI["9generationPopup"].hide() - def trackProperties( self, trackIds = -1 ): - self.properties = Properties(self.context) + def trackProperties( self, widget ): + if widget.get_active(): + self.propertiesPanel.setContext( "track", self.tuneInterface.getSelectedIds(), [ i for i in range(Config.NUMBER_OF_TRACKS) if self.trackSelected[i] ] ) + winLoc = self.parent.window.get_position() + balloc = self.GUI["2contextBox"].get_allocation() + walloc = self.GUI["9propertiesPopup"].get_allocation() + if walloc.height != 1: # hack to make deal with showing the window before first allocation T_T + self.GUI["9propertiesPopup"].move( balloc.x + winLoc[0], balloc.y - walloc.height + winLoc[1] ) + else: + self.GUI["9propertiesPopup"].move(0, 2048) # off the screen + self.GUI["9propertiesPopup"].show() + if walloc.height == 1: + walloc = self.GUI["9propertiesPopup"].get_allocation() + self.GUI["9propertiesPopup"].move( balloc.x + winLoc[0], balloc.y - walloc.height + winLoc[1] ) + else: + self.GUI["9propertiesPopup"].hide() def trackDelete( self, pageIds = -1, trackIds = -1 ): @@ -1135,12 +1147,22 @@ class MainWindow( SubActivity ): else: self.GUI["9generationPopup"].hide() - def pageProperties( self, pageIds = -1 ): - self.properties = Properties(self.context) - - if pageIds == -1: pageIds = self.tuneInterface.getSelectedIds() - - # TODO show properties or something + def pageProperties( self, widget ): + if widget.get_active(): + self.propertiesPanel.setContext( "page", self.tuneInterface.getSelectedIds() ) + winLoc = self.parent.window.get_position() + balloc = self.GUI["2contextBox"].get_allocation() + walloc = self.GUI["9propertiesPopup"].get_allocation() + if walloc.height != 1: # hack to make deal with showing the window before first allocation T_T + self.GUI["9propertiesPopup"].move( balloc.x + winLoc[0], balloc.y - walloc.height + winLoc[1] ) + else: + self.GUI["9propertiesPopup"].move(0, 2048) # off the screen + self.GUI["9propertiesPopup"].show() + if walloc.height == 1: + walloc = self.GUI["9propertiesPopup"].get_allocation() + self.GUI["9propertiesPopup"].move( balloc.x + winLoc[0], balloc.y - walloc.height + winLoc[1] ) + else: + self.GUI["9propertiesPopup"].hide() def pageDelete( self, pageIds = -1 ): 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() |