class FxSlidersView(wx.Frame): def __init__(self, parent, fxbox, parameters): style = wx.DEFAULT_FRAME_STYLE | wx.FRAME_FLOAT_ON_PARENT wx.Frame.__init__(self, parent, style=style) self.parent = parent self.fxbox = fxbox self.parameters = parameters self.last_enable = 1 self.graph_object = None closeId = wx.NewId() tabId = wx.NewId() self.prevId = KEY_EVENT_FIRST_ID self.nextId = KEY_EVENT_FIRST_ID + 1 self.cueZeroId = KEY_EVENT_FIRST_ID + 2 self.cue1Id = KEY_EVENT_FIRST_ID + 3 self.cue2Id = KEY_EVENT_FIRST_ID + 4 self.cue3Id = KEY_EVENT_FIRST_ID + 5 self.cue4Id = KEY_EVENT_FIRST_ID + 6 self.cue5Id = KEY_EVENT_FIRST_ID + 7 self.cue6Id = KEY_EVENT_FIRST_ID + 8 self.cue7Id = KEY_EVENT_FIRST_ID + 9 self.cue8Id = KEY_EVENT_FIRST_ID + 10 self.cue9Id = KEY_EVENT_FIRST_ID + 11 self.cue10Id = KEY_EVENT_FIRST_ID + 12 accel_tbl = wx.AcceleratorTable([ (wx.ACCEL_CTRL, ord('W'), closeId), (wx.ACCEL_NORMAL, wx.WXK_TAB, tabId), (wx.ACCEL_NORMAL, wx.WXK_LEFT, self.prevId), (wx.ACCEL_NORMAL, wx.WXK_RIGHT, self.nextId), (wx.ACCEL_NORMAL, wx.WXK_ESCAPE, self.cueZeroId), (wx.ACCEL_NORMAL, ord("1"), self.cue1Id), (wx.ACCEL_NORMAL, ord("2"), self.cue2Id), (wx.ACCEL_NORMAL, ord("3"), self.cue3Id), (wx.ACCEL_NORMAL, ord("4"), self.cue4Id), (wx.ACCEL_NORMAL, ord("5"), self.cue5Id), (wx.ACCEL_NORMAL, ord("6"), self.cue6Id), (wx.ACCEL_NORMAL, ord("7"), self.cue7Id), (wx.ACCEL_NORMAL, ord("8"), self.cue8Id), (wx.ACCEL_NORMAL, ord("9"), self.cue9Id), (wx.ACCEL_NORMAL, ord("0"), self.cue10Id) ]) self.SetAcceleratorTable(accel_tbl) mainWin = QLiveLib.getVar("MainWindow") self.Bind(wx.EVT_MENU, mainWin.onTabulate, id=tabId) self.Bind(wx.EVT_MENU, mainWin.onMoveCue, id=KEY_EVENT_FIRST_ID, id2=KEY_EVENT_FIRST_ID + 100) self.Bind(wx.EVT_MENU, self.onClose, id=closeId) self.Bind(wx.EVT_CLOSE, self.onClose) self.SetTitle("%s Parameter Controls" % self.fxbox.name) self.panel = wx.Panel(self) self.panel.SetBackgroundColour(BACKGROUND_COLOUR) self.sizer = wx.BoxSizer(wx.VERTICAL) # Head headSizer = wx.BoxSizer(wx.HORIZONTAL) headSizer.AddStretchSpacer(1) self.enable = wx.CheckBox(self.panel, -1, "Enable FX:", style=wx.ALIGN_RIGHT) self.enable.SetValue(1) self.enable.Bind(wx.EVT_CHECKBOX, self.enableFx) headSizer.Add(self.enable, 0, wx.TOP | wx.RIGHT, 5) self.sizer.Add(headSizer, 0, wx.EXPAND) self.sizer.Add(wx.StaticLine(self.panel, -1), 0, wx.ALL | wx.EXPAND, 5) # Selection boxes if self.parameters.has_key("inselect"): self.inChannelChecks = [] statbox = wx.StaticBox(self.panel, -1, "Input Selections") selectorSizer = wx.StaticBoxSizer(statbox, wx.HORIZONTAL) labels = self.parameters["inselect"] for i in range(len(labels)): check = wx.CheckBox(self.panel, -1, labels[i]) check.Bind(wx.EVT_CHECKBOX, self.onCheckInSelect) if i == 0: check.SetValue(1) self.inChannelChecks.append(check) selectorSizer.Add(check, 1, wx.EXPAND | wx.ALL, 5) self.sizer.Add(selectorSizer, 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 5) sampleList = ["Mono Track", "Multi-Channel Track"] self.chnlsButton = wx.RadioBox(self.panel, -1, "", wx.DefaultPosition, wx.DefaultSize, sampleList, 2, wx.RA_SPECIFY_COLS | wx.NO_BORDER) self.chnlsButton.Bind(wx.EVT_RADIOBOX, self.onChnlsRadioBox) self.sizer.Add(self.chnlsButton, 0, wx.LEFT, 5) self.sizer.Add(wx.StaticLine(self.panel), 0, wx.ALL | wx.EXPAND, 5) if self.parameters.has_key("outselect"): self.outChannelChecks = [] statbox = wx.StaticBox(self.panel, -1, "Output Selections") selectorSizer = wx.StaticBoxSizer(statbox, wx.HORIZONTAL) labels = self.parameters["outselect"] for i in range(len(labels)): check = wx.CheckBox(self.panel, -1, labels[i]) check.Bind(wx.EVT_CHECKBOX, self.onCheckOutSelect) if i == 0: check.SetValue(1) self.outChannelChecks.append(check) selectorSizer.Add(check, 1, wx.EXPAND | wx.ALL, 5) self.sizer.Add(selectorSizer, 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 5) if self.parameters.has_key("select"): self.selectedSoundfile = "None" soundfiles = QLiveLib.getVar("Soundfiles").getSoundFileObjects() choices = ["None"] + [str(snd.getId() + 1) for snd in soundfiles] popupSizer = wx.BoxSizer(wx.HORIZONTAL) popupTitle = wx.StaticText(self.panel, -1, "Choose a Soundfile:") popupSizer.Add(popupTitle, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5) self.soundfilesPopup = wx.Choice(self.panel, -1, choices=choices) self.soundfilesPopup.SetSelection(0) self.soundfilesPopup.Bind(wx.EVT_CHOICE, self.chooseSoundfile) popupSizer.Add(self.soundfilesPopup, 0, wx.ALL, 5) self.sizer.Add(popupSizer, 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 5) # Controller box if self.parameters.has_key("ctrls"): knobSizer = wx.BoxSizer(wx.HORIZONTAL) sampleList = ["Slider Values", "Interpolation Times"] self.interpButton = wx.RadioBox(self.panel, -1, "", wx.DefaultPosition, wx.DefaultSize, sampleList, 2, wx.RA_SPECIFY_COLS | wx.NO_BORDER) self.interpButton.Bind(wx.EVT_RADIOBOX, self.showMorphEvent) self.sizer.Add(self.interpButton, 0, wx.LEFT, 5) self.widgets = [] for param in self.parameters["ctrls"]: slider = SliderWidget(self.panel, param, fxbox) self.widgets.append(slider) knobSizer.Add(slider, 0, wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, 5) self.sizer.Add(knobSizer, 0, wx.EXPAND) self.graph = Grapher(self.panel, xlen=256, yrange=(0, 1), init=[(0, 0), (0.5, 0.5), (1, 0)], mode=0, outFunction=None) self.graph.SetSize((500, 200)) self.graph.Hide() self.sizer.Add(self.graph, 1, wx.EXPAND | wx.ALL, 5) self.panel.SetSizer(self.sizer) self.frameSizer = wx.BoxSizer(wx.HORIZONTAL) self.frameSizer.Add(self.panel, 1, wx.EXPAND) self.SetSizerAndFit(self.frameSizer) self.Bind(wx.EVT_ENTER_WINDOW, self.getFocus) self.SetMinSize((500, -1)) self.SetSize((500, -1)) def getFocus(self, evt): if self.parameters.has_key("select"): soundfiles = QLiveLib.getVar("Soundfiles").getSoundFileObjects() choices = ["None"] + [str(snd.getId() + 1) for snd in soundfiles] self.soundfilesPopup.SetItems(choices) self.soundfilesPopup.SetStringSelection(self.selectedSoundfile) def chooseSoundfile(self, evt): self.selectedSoundfile = evt.GetEventObject().GetStringSelection() self.fxbox.setSoundfile(self.selectedSoundfile) def setSoundfile(self, snd): self.selectedSoundfile = snd self.soundfilesPopup.SetStringSelection(snd) def onChangeAllInterp(self, value): for slider in self.widgets: slider.setInterpValue(value, True) def onEditButton(self, obj, state): gsz = self.graph.GetSize() sz = self.GetSize() if self.graph_object is not None: if self.graph_object is not obj: self.graph_object.setShowEdit(False) if state: self.graph_object = obj if not self.graph.IsShown(): self.graph.Show() self.SetSize((sz[0], sz[1] + gsz[1])) else: self.graph_object = None self.graph.Hide() self.SetSize((sz[0], sz[1] - gsz[1])) def setInChannelChecks(self, lst): for i, check in enumerate(self.inChannelChecks): check.SetValue(lst[i]) def setIsMultiChannels(self, state): self.chnlsButton.SetSelection(state) def onChnlsRadioBox(self, evt): self.fxbox.setIsMultiChannels(evt.GetInt()) def setOutChannelChecks(self, lst): for i, check in enumerate(self.outChannelChecks): check.SetValue(lst[i]) def showMorphEvent(self, evt): for widget in self.widgets: if isinstance(widget, SliderWidget): widget.setShowMorph(evt.GetInt()) def enableFx(self, evt): self.fxbox.setEnable(evt.GetInt(), fromUser=True) QLiveLib.getVar("FxTracks").drawAndRefresh() def setEnableState(self, x): self.enable.SetValue(x) if x != self.last_enable: self.last_enable = x QLiveLib.getVar("FxTracks").drawAndRefresh() def onCheckInSelect(self, evt): state = evt.GetInt() obj = evt.GetEventObject() which = int(obj.GetLabel()) - 1 self.fxbox.checkInChannel(which, state) def onCheckOutSelect(self, evt): state = evt.GetInt() obj = evt.GetEventObject() which = int(obj.GetLabel()) - 1 self.fxbox.checkOutChannel(which, state) def getWidgets(self): return self.widgets def onClose(self, evt): self.Hide()