""" File: JetDialogs.py Contents and purpose: Dialog boxes used in JetCreator Copyright (c) 2008 Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. """ import wx import thread import wx.lib.newevent from JetDefs import * from JetCtrls import * from JetFile import * from JetUtils import * from JetPreview import * from JetSegGraph import * from eas import * from JetStatusEvent import * PLAY_SEGMENT = 1 PLAY_MIDI = 2 class JetEdit(): """ Class used to build dialog box controls from the definitions in JetDefs """ def __init__(self, panel, ctrlList, callbackClass): LBL_OFFSET = 15 ctrls = getattr(JetDefs, ctrlList) self.ctrls = {} for Lbl, Text, Row, Col, Len, Min, Max, Id, Lst, Fct, Enabled, HelpText in ctrls: try: iDisplayLbl = True if Text[0:3] == "btn": self.ctrls[Text] = wx.Button(panel, Id, Lbl, wx.Point(Col, Row), size=Len) if Fct > "": self.ctrls[Text].Bind(wx.EVT_BUTTON, getattr(callbackClass, Fct), self.ctrls[Text], id=Id) if Id == wx.ID_OK: self.ctrls[Text].SetDefault() iDisplayLbl = False else: if Text[0:3] == "txt": self.ctrls[Text] = wx.TextCtrl(panel, Id, "", wx.Point(Col, Row + LBL_OFFSET +3), wx.Size(Len,-1)) elif Text[0:4] == "spn1": self.ctrls[Text] = JetSpinOneBased(panel, Id, "", wx.Point(Col, Row + LBL_OFFSET), wx.Size(Len,-1), min=Min, max=Max) elif Text[0:3] == "spn": self.ctrls[Text] = JetSpin(panel, Id, "", wx.Point(Col, Row + LBL_OFFSET), wx.Size(Len,-1), min=Min, max=Max) elif Text[0:3] == "cmb": self.ctrls[Text] = wx.ComboBox(panel, Id, "", wx.Point(Col, Row + LBL_OFFSET), wx.Size(Len,-1), Lst, wx.CB_DROPDOWN | wx.CB_READONLY ) self.ctrls[Text].SetValue(Lst[0]) if Fct > "": self.ctrls[Text].Bind(wx.EVT_COMBOBOX, getattr(callbackClass, Fct), self.ctrls[Text]) elif Text[0:2] == "tm": self.ctrls[Text] = TimeCtrl(panel, pos=(Col, Row + LBL_OFFSET), ctlName=Text) elif Text[0:7] == "filecmb": self.ctrls[Text] = JetFileCombo(panel, pos=(Col, Row + LBL_OFFSET), size=wx.Size(Len,-1), title=Lbl, spec=Lst, id=Id) elif Text[0:7] == "filetxt": self.ctrls[Text] = JetFileText(panel, pos=(Col, Row + LBL_OFFSET), size=wx.Size(Len,-1), title=Lbl, spec=Lst, id=Id) elif Text[0:2] == "fr": self.ctrls[Text] = wx.StaticBox(parent=panel, id=wx.ID_ANY, label=Lbl, pos=(Row, Col), size=Len) iDisplayLbl = False elif Text[0:3] == "chk": self.ctrls[Text] = JetCheckBox(panel, Id, label=Lbl, pos=(Col, Row), size=wx.Size(Len,-1)) iDisplayLbl = False if Fct > "": self.ctrls[Text].Bind(wx.EVT_CHECKBOX , getattr(callbackClass, Fct), self.ctrls[Text]) elif Text[0:6] == "rdobox": self.ctrls[Text] = wx.RadioBox(panel, Id, label=Lbl, pos=(Col, Row), size=Len, choices=Lst, majorDimension=1, style=wx.RA_SPECIFY_COLS) iDisplayLbl = False if Fct > "": self.ctrls[Text].Bind(wx.EVT_RADIOBOX , getattr(callbackClass, Fct), self.ctrls[Text]) elif Text[0:3] == "opt": self.ctrls[Text] = JetRadioButton(panel, Id, label=Lbl, pos=(Col, Row), size=wx.Size(Len,-1)) iDisplayLbl = False self.ctrls[Text].SetValue(Lst) if Fct > "": self.ctrls[Text].Bind(wx.EVT_RADIOBUTTON , getattr(callbackClass, Fct), self.ctrls[Text]) elif Text[0:3] == "lst": self.ctrls[Text] = wx.ListBox(panel, Id, pos=(Col, Row), size=Len) iDisplayLbl = False elif Text[0:4] == "grd2": self.ctrls[Text] = JetTrackCtrl(panel, Id, pos=(Col, Row + LBL_OFFSET), size=Len, style=wx.LC_REPORT | wx.SUNKEN_BORDER) iDisplayLbl = True elif Text[0:3] == "grd": self.ctrls[Text] = JetListCtrl(panel, Id, pos=(Col, Row), size=Len) iDisplayLbl = False elif Text[0:5] == "graph": self.ctrls[Text] = SegmentGraph(panel, pos=(Col, Row), size=Len) iDisplayLbl = False elif Text[0:3] == "hlp": self.ctrls[Text] = wx.ContextHelpButton(panel, Id, pos=(Col, Row)) iDisplayLbl = False elif Text[0:3] == "lbl": self.ctrls[Text] = wx.StaticText(panel, Id, Lbl, wx.Point(Col, Row), size=wx.Size(Len[0],Len[1])) iDisplayLbl = False elif Text[0:3] == "box": self.ctrls[Text] = wx.StaticBox(panel, wx.ID_ANY, Lbl, pos=(Col, Row), size=Len) iDisplayLbl = False if iDisplayLbl: self.ctrls[Lbl] = wx.StaticText(panel, Id, Lbl, wx.Point(Col, Row)) if not Enabled: self.ctrls[Text].Enable(False) helpText = IniGetValue(JetDefs.JETCREATOR_HLP, ctrlList, Lbl) if helpText > "": self.ctrls[Text].SetHelpText(helpText) #except AttributeError: #No stub function for testing #print("def " + Fct + "(self, event): pass") except: raise def GetValue(self, fld): """ Gets the value of a control """ return self.ctrls[fld].GetValue() def SetValue(self, fld, val): """ Sets the value of a control """ self.ctrls[fld].SetValue(val) class JetOpen(wx.Dialog): """ Opens a jet definition file """ def __init__(self): wx.Dialog.__init__(self, None, -1, JetDefs.DLG_JETOPEN) self.fileName = "" self.je = JetEdit(self, "JETOPEN_CTRLS", self) fileList = GetRecentJetFiles() self.je.ctrls[JetDefs.F_JLIST].AppendItems(fileList) if len(fileList) > 0: self.je.ctrls[JetDefs.F_JFILE].SetValue(fileList[0]) self.Bind(wx.EVT_LISTBOX_DCLICK, self.OnOpen) self.Bind(wx.EVT_LISTBOX, self.OnClick) self.SetSize(JetDefs.JETOPEN_SIZE) self.CenterOnParent() def OnJetImport(self, event): """ Exit the dialog with flag to import """ self.EndModal(JetDefs.ID_JET_IMPORT) def OnClick(self, event): """ Clicking on item in listbox """ sValue = self.je.ctrls[JetDefs.F_JLIST].GetString(self.je.ctrls[JetDefs.F_JLIST].GetSelection()) self.je.ctrls[JetDefs.F_JFILE].SetValue(sValue) def OnOpen(self, event): """ Double clicking on item in listbox """ sValue = self.je.ctrls[JetDefs.F_JLIST].GetString(self.je.ctrls[JetDefs.F_JLIST].GetSelection()) self.je.ctrls[JetDefs.F_JFILE].SetValue(sValue) if self.Validate(): self.fileName = self.je.ctrls[JetDefs.F_JFILE].GetValue() AppendRecentJetFile(self.fileName) self.EndModal(JetDefs.ID_JET_OPEN) def OnOk(self, event): """ Clicking the ok button """ if self.Validate(): self.fileName = self.je.ctrls[JetDefs.F_JFILE].GetValue() AppendRecentJetFile(self.fileName) self.EndModal(JetDefs.ID_JET_OPEN) def OnNew(self, event): """ Exit the dialog with flag to create new blank jet file """ self.EndModal(JetDefs.ID_JET_NEW) def Validate(self): """ Validates the filename """ if len(self.je.ctrls[JetDefs.F_JFILE].GetValue()) == 0: InfoMsg("Jet Filename", "The Jet filename is blank.") self.je.ctrls[JetDefs.F_JFILE].SetFocus() return False if not FileExists(self.je.ctrls[JetDefs.F_JFILE].GetValue()): InfoMsg("MIDI File", "The file does not exist.") self.je.ctrls[JetDefs.F_JFILE].SetFocus() return False return True class JetPreferences(wx.Dialog): """ Preferences dialog box """ def __init__(self): wx.Dialog.__init__(self, None, -1, JetDefs.DLG_PREFERENCES) self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) self.je = JetEdit(self, "PREFERENCES_CTRLS", self) self.SetSize(JetDefs.PREFERENCES_SIZE) self.CenterOnParent() def OnOk(self, event): self.EndModal(wx.ID_OK) def GetValue(self, fld): return self.je.ctrls[fld].GetValue() def SetValue(self, fld, val): self.je.ctrls[fld].SetValue(val) class JetAbout(wx.Dialog): """ About dialog box """ def __init__(self): wx.Dialog.__init__(self, None, -1, JetDefs.DLG_ABOUT) img = __import__('img_splash') bmp = img.getBitmap() b = wx.StaticBitmap(self, -1, bmp) self.SetSize((bmp.GetWidth(), bmp.GetHeight())) self.CenterOnParent() s = __import__('sys') print(s.platform) def OnOk(self, event): self.EndModal(wx.ID_OK) def GetValue(self, fld): return self.je.ctrls[fld].GetValue() def SetValue(self, fld, val): self.je.ctrls[fld].SetValue(val) class JetPropertiesDialog(wx.Dialog): """ Properties dialog box """ def __init__(self): wx.Dialog.__init__(self, None, -1, JetDefs.DLG_PROPERTIES) self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) self.je = JetEdit(self, "JET_PROPERTIES_CTRLS", self) self.SetSize(JetDefs.JET_PROPERTIES_SIZE) self.CenterOnParent() def OnOk(self, event): self.EndModal(wx.ID_OK) def GetValue(self, fld): return self.je.ctrls[fld].GetValue() def SetValue(self, fld, val): self.je.ctrls[fld].SetValue(val) class JetErrors(wx.Dialog): """ Errors dialog box """ def __init__(self, title): wx.Dialog.__init__(self, None, -1, title) self.je = JetEdit(self, "ERRORDLG", self) self.SetSize(JetDefs.ERRORDLG_SIZE) self.CenterOnParent() def OnOk(self, event): self.EndModal(wx.ID_OK) def SetErrors(self, errors): self.je.ctrls[JetDefs.F_ERRGRID].AddCol("Error", JetDefs.ERRORCOLW) self.je.ctrls[JetDefs.F_ERRGRID].AddCol("Description", JetDefs.ERRORCOLW) self.je.ctrls[JetDefs.F_ERRGRID].AddRows(errors) class SegEdit(wx.Dialog): """ Dialog box to edit segments """ def __init__(self, title, currentJetConfigFile): wx.Dialog.__init__(self, None, -1, title) self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) self.currentJetConfigFile = currentJetConfigFile self.je = JetEdit(self, "SEGDLG_CTRLS", self) self.je.ctrls[JetDefs.F_MIDIFILE].cmb.Bind(wx.EVT_KILL_FOCUS, self.OnMidiChanged) self.je.ctrls[JetDefs.F_MIDIFILE].cmb.Bind(wx.EVT_COMBOBOX, self.OnMidiChanged) self.je.ctrls[JetDefs.F_MIDIFILE].SetEventFire(True) self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_TRACK, JetDefs.MUTEGRD_TRACK) self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_CHANNEL, JetDefs.MUTEGRD_CHANNEL) self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_NAME, JetDefs.MUTEGRD_NAME) self.je.ctrls[JetDefs.F_MUTEFLAGS].BindCheckBox(self.OnEventChecked) self.je.ctrls[JetDefs.F_START].SetChangeCallbackFct(self.UpdateGraph) self.je.ctrls[JetDefs.F_END].SetChangeCallbackFct(self.UpdateGraph) self.je.ctrls[JetDefs.F_DISPEMPTYTRACKS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_DISPEMPTYTRACKS, JetDefs.F_DISPEMPTYTRACKS, 'bool', 'False')) self.je.ctrls[JetDefs.F_GRAPHLABELS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True')) self.je.ctrls[JetDefs.F_GRAPHCLIPS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True')) self.je.ctrls[JetDefs.F_GRAPHAPPEVTS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True')) self.replicatePrefix = "" self.lstReplicate = [] self.chkReplaceMatching = False EVT_JET_STATUS(self, self.OnJetStatusUpdate) wx.EVT_CLOSE(self, self.OnClose) self.Player = None self.segment = None self.graphSegment = None self.jetevents = [] self.lastMidiFile = "" self.lastMidiInfo = None self.playMode = PLAY_SEGMENT self.graphMode = PLAY_MIDI self.SetSize(JetDefs.SEGDLG_SIZE) self.CenterOnParent() def OnClose(self, event): """ Closing the dialog box """ self.ShutdownPlayer() self.je.ctrls[JetDefs.F_START].UnBindKillFocus() self.je.ctrls[JetDefs.F_END].UnBindKillFocus() self.EndModal(wx.ID_CANCEL) def ShutdownPlayer(self): """ Shutdown player flag """ if self.Player is not None: self.Player.SetKeepPlayingFlag(False) def OnMidiChanged(self, event): """ When new midi file selected, get its info """ self.UpdateMaxMbt() event.Skip() def UpdateMaxMbt(self): """ Get midi info in thread so UI smoother """ thread.start_new_thread(self.UpdateMaxMbtThread, ()) def UpdateMaxMbtThread(self): """ Thread to get midi file info """ if self.je.ctrls[JetDefs.F_MIDIFILE].GetValue() == self.lastMidiFile: return self.lastMidiFile = self.je.ctrls[JetDefs.F_MIDIFILE].GetValue() self.lastMidiInfo = GetMidiInfo(self.je.ctrls[JetDefs.F_MIDIFILE].GetValue()) wx.PostEvent(self, JetStatusEvent(JetDefs.PST_MIDI_INFO, self.lastMidiInfo)) def GetValue(self, fld): """ Gets a control value """ return self.je.ctrls[fld].GetValue() def SetValue(self, fld, val): """ Sets a control value """ self.je.ctrls[fld].SetValue(val) if self.je.ctrls[fld] == self.je.ctrls[JetDefs.F_MIDIFILE]: self.UpdateMaxMbt() def OnOk(self, event): """ Exits dialog box """ self.ShutdownPlayer() if self.Validate(): self.je.ctrls[JetDefs.F_START].UnBindKillFocus() self.je.ctrls[JetDefs.F_END].UnBindKillFocus() self.EndModal(wx.ID_OK) def Validate(self): """ Validates the control values before exiting """ if not CompareMbt(self.je.ctrls[JetDefs.F_START].GetValue(), self.je.ctrls[JetDefs.F_END].GetValue()): InfoMsg("Start/End", "The segment starting and ending times are illogical.") self.je.ctrls[JetDefs.F_START].SetFocus() return False if len(self.je.ctrls[JetDefs.F_SEGNAME].GetValue()) == 0: InfoMsg("Segment Name", "The segment must have a name.") self.je.ctrls[JetDefs.F_SEGNAME].SetFocus() return False if len(self.je.ctrls[JetDefs.F_MIDIFILE].GetValue()) == 0: InfoMsg("MIDI File", "The segment must have a midi file selected.") self.je.ctrls[JetDefs.F_MIDIFILE].SetFocus() return False if not FileExists(self.je.ctrls[JetDefs.F_MIDIFILE].GetValue()): InfoMsg("MIDI File", "The MIDI file does not exist.") self.je.ctrls[JetDefs.F_MIDIFILE].SetFocus() return False if len(self.je.ctrls[JetDefs.F_DLSFILE].GetValue()) > 0: if not FileExists(self.je.ctrls[JetDefs.F_DLSFILE].GetValue()): InfoMsg("DLS File", "The DLS file does not exist.") self.je.ctrls[JetDefs.F_DLSFILE].SetFocus() return False self.je.ctrls[JetDefs.F_MUTEFLAGS].SetValue(ComputeMuteFlagsFromList(self.je.ctrls[JetDefs.F_MUTEFLAGS])) return True def SetSegment(self, mode): """ Builds the segment info for graphing """ if mode == PLAY_SEGMENT: jetevents = self.jetevents segment = JetSegment(self.GetValue(JetDefs.F_SEGNAME), self.GetValue(JetDefs.F_MIDIFILE), self.GetValue(JetDefs.F_START), self.GetValue(JetDefs.F_END), JetDefs.MBT_ZEROSTR, self.GetValue(JetDefs.F_SEGNAME), self.GetValue(JetDefs.F_QUANTIZE), jetevents, self.GetValue(JetDefs.F_DLSFILE), None, self.GetValue(JetDefs.F_TRANSPOSE), self.GetValue(JetDefs.F_REPEAT), self.GetValue(JetDefs.F_MUTEFLAGS)) else: jetevents = [] segment = JetSegment(self.GetValue(JetDefs.F_SEGNAME), self.GetValue(JetDefs.F_MIDIFILE), JetDefs.MBT_ZEROSTR, self.lastMidiInfo.endMbtStr, JetDefs.MBT_ZEROSTR, self.GetValue(JetDefs.F_SEGNAME), self.GetValue(JetDefs.F_QUANTIZE), jetevents, self.GetValue(JetDefs.F_DLSFILE), None, 0, 0, 0) return segment def OnEventChecked(self, index, checked): """ Track is checked so mute or unmute it """ if self.Player is not None: trackNum = self.je.ctrls[JetDefs.F_MUTEFLAGS].GetTrackNumber(index) self.Player.SetMuteFlag(trackNum, checked) def OnPlay(self, event): """ Play the segment button pressed """ if self.je.ctrls[JetDefs.F_PLAY].GetLabel() == JetDefs.BUT_STOP: self.Player.SetKeepPlayingFlag(False) return if not self.Validate(): return self.playMode = PLAY_SEGMENT self.graphSegment = self.SetSegment(self.graphMode) self.UpdateGraph() self.Player = PreviewPlayer(self.je.ctrls[JetDefs.F_PLAY], self.SetSegment(self.playMode)) self.Player.SetGraphCtrl(self.je.ctrls[JetDefs.F_GRAPH], self) self.PlayerThread = thread.start_new_thread(self.Player .Start, ()) def OnPlayMidi(self, event): """ Play the whole midi file pressed """ if self.je.ctrls[JetDefs.F_PLAYMIDI].GetLabel() == JetDefs.BUT_STOP: self.Player.SetKeepPlayingFlag(False) return if not self.Validate(): return self.playMode = PLAY_MIDI self.graphSegment = self.SetSegment(self.graphMode) self.UpdateGraph() self.Player = PreviewPlayer(self.je.ctrls[JetDefs.F_PLAYMIDI], self.SetSegment(self.playMode)) self.Player.SetGraphCtrl(self.je.ctrls[JetDefs.F_GRAPH], self) self.PlayerThread = thread.start_new_thread(self.Player .Start, ()) def OnSetGraphType(self, event): """ Sets the type of graph """ self.SetGraphType(event.GetInt()) def SetGraphType(self, iMode): """ Sets the type of graph """ if iMode == 1: self.graphMode = PLAY_SEGMENT else: self.graphMode = PLAY_MIDI self.graphSegment = self.SetSegment(self.graphMode) self.UpdateGraph() def OnGraphUpdate(self, evt): """ Calls graph control to draw """ self.je.ctrls[JetDefs.F_GRAPH].DoDrawing() def UpdateGraph(self): """ Updates values for graph control """ if self.graphMode == PLAY_SEGMENT: self.je.ctrls[JetDefs.F_GRAPH].LoadSegment(self.graphSegment, showLabels=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True'), showClips=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True'), showAppEvts=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True')) else: if self.playMode == PLAY_SEGMENT: iMidiMode = True else: iMidiMode = False self.je.ctrls[JetDefs.F_GRAPH].LoadSegment(self.graphSegment,(self.GetValue(JetDefs.F_SEGNAME), self.GetValue(JetDefs.F_START), self.GetValue(JetDefs.F_END)), iMidiMode, showLabels=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True'), showClips=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True'), showAppEvts=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True')) def OnJetStatusUpdate(self, evt): """ All UI needed by thread must be called via Postevent or OS X crashes """ if evt.mode == JetDefs.PST_UPD_LOCATION: self.je.ctrls[JetDefs.F_GRAPH].UpdateLocation(evt.data) elif evt.mode == JetDefs.PST_PLAY: if self.playMode == PLAY_SEGMENT: self.je.ctrls[JetDefs.F_PLAY].SetLabel(JetDefs.BUT_STOP) self.je.ctrls[JetDefs.F_PLAYMIDI].Enabled = False else: self.je.ctrls[JetDefs.F_RDOGRAPH].Enabled = False self.je.ctrls[JetDefs.F_PLAYMIDI].SetLabel(JetDefs.BUT_STOP) self.je.ctrls[JetDefs.F_PLAY].Enabled = False self.je.ctrls[JetDefs.F_PAUSE].Enabled = True self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE) elif evt.mode == JetDefs.PST_DONE: self.je.ctrls[JetDefs.F_RDOGRAPH].Enabled = True if self.playMode == PLAY_SEGMENT: self.je.ctrls[JetDefs.F_PLAY].SetLabel(JetDefs.BUT_PLAYSEG) self.je.ctrls[JetDefs.F_PLAYMIDI].Enabled = True else: self.je.ctrls[JetDefs.F_PLAYMIDI].SetLabel(JetDefs.BUT_PLAYMIDI) self.je.ctrls[JetDefs.F_PLAY].Enabled = True self.je.ctrls[JetDefs.F_PAUSE].Enabled = False self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE) elif evt.mode == JetDefs.PST_PAUSE: self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_RESUME) elif evt.mode == JetDefs.PST_RESUME: self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE) elif evt.mode == JetDefs.PST_MIDI_INFO: ClearRowSelections(self.je.ctrls[JetDefs.F_MUTEFLAGS]) self.md = evt.data if self.md.err == 0: self.je.ctrls[JetDefs.F_END].SetMaxMbt(self.md.maxMeasures+1,self.md.maxBeats,self.md.maxTicks) if self.je.ctrls[JetDefs.F_END].GetValue() == JetDefs.MBT_ZEROSTR: self.je.ctrls[JetDefs.F_END].SetValue((self.md.maxMeasures,0,0)) self.je.ctrls[JetDefs.F_START].SetMaxMbt(self.md.maxMeasures+1,self.md.maxBeats,self.md.maxTicks) self.je.ctrls[JetDefs.F_MUTEFLAGS].DeleteAllItems() loadEmpty = IniGetValue(self.currentJetConfigFile, JetDefs.INI_DISPEMPTYTRACKS, JetDefs.INI_DISPEMPTYTRACKS, 'bool', 'False') for track in self.md.trackList: self.je.ctrls[JetDefs.F_MUTEFLAGS].AddTrackRow(track, loadEmpty) self.je.ctrls[JetDefs.F_MUTEFLAGS].CheckTracks(self.je.ctrls[JetDefs.F_MUTEFLAGS].GetValue()) self.graphSegment = self.SetSegment(self.graphMode) self.UpdateGraph() def OnSetTrackDisplayOption(self, evt): IniSetValue(self.currentJetConfigFile, JetDefs.INI_DISPEMPTYTRACKS, JetDefs.INI_DISPEMPTYTRACKS, self.je.ctrls[JetDefs.F_DISPEMPTYTRACKS].GetValue()) loadEmpty = IniGetValue(self.currentJetConfigFile, JetDefs.INI_DISPEMPTYTRACKS, JetDefs.INI_DISPEMPTYTRACKS, 'bool', 'False') if self.md is not None: self.je.ctrls[JetDefs.F_MUTEFLAGS].DeleteAllItems() if self.md.err == 0: for track in self.md.trackList: self.je.ctrls[JetDefs.F_MUTEFLAGS].AddTrackRow(track, loadEmpty) def OnPause(self, evt): """ Pauses the playback """ self.Player.Pause() def OnSetGraphOptions(self, evt): """ Sets graph options """ IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, self.je.ctrls[JetDefs.F_GRAPHLABELS].GetValue()) IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, self.je.ctrls[JetDefs.F_GRAPHAPPEVTS].GetValue()) IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, self.je.ctrls[JetDefs.F_GRAPHCLIPS].GetValue()) self.UpdateGraph() def OnReplicate(self, evt): dlg = JetReplicate("Replicate Segment") dlg.SetValue(JetDefs.F_RPREPLACE, True) dlg.SetName(self.GetValue(JetDefs.F_SEGNAME)) dlg.event_type = "SEGMENT" dlg.event_max = self.je.ctrls[JetDefs.F_START].GetMaxMbt() dlg.length = MbtDifference(ConvertStrTimeToTuple(self.GetValue(JetDefs.F_START)), ConvertStrTimeToTuple(self.GetValue(JetDefs.F_END))) result = dlg.ShowModal() if result == wx.ID_OK: self.replicatePrefix = dlg.GetValue(JetDefs.F_RPPREFIX) self.lstReplicate = dlg.lstReplicate self.chkReplaceMatching = dlg.GetValue(JetDefs.F_RPREPLACE) self.EndModal(wx.ID_OK) else: dlg.Destroy() class EventEdit(wx.Dialog): """ Event edit dialog box """ def __init__(self, title, currentJetConfigFile): wx.Dialog.__init__(self, None, -1, title) self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) self.title = title self.currentJetConfigFile = currentJetConfigFile self.je = JetEdit(self, "EVTDLG_CTRLS", self) self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_TRACK, JetDefs.MUTEGRD_TRACK) self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_CHANNEL, JetDefs.MUTEGRD_CHANNEL) self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_NAME, JetDefs.MUTEGRD_NAME) self.je.ctrls[JetDefs.F_ESTART].SetChangeCallbackFct(self.UpdateGraph) self.je.ctrls[JetDefs.F_EEND].SetChangeCallbackFct(self.UpdateGraph) self.je.ctrls[JetDefs.F_GRAPHLABELS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True')) self.je.ctrls[JetDefs.F_GRAPHCLIPS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True')) self.je.ctrls[JetDefs.F_GRAPHAPPEVTS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True')) EVT_JET_STATUS(self, self.OnJetStatusUpdate) self.segment = None self.Player = None self.event_id = 1 self.replicatePrefix = "" self.lstReplicate = [] self.chkReplaceMatching = False wx.EVT_CLOSE(self, self.OnClose) self.SetSize(JetDefs.EVTDLG_SIZE) self.CenterOnParent() def OnGraphUpdate(self, evt): """ Calls the graph module to update the graph """ self.je.ctrls[JetDefs.F_GRAPH].DoDrawing() def OnJetStatusUpdate(self, evt): """ Updates to UI needed by play thread come through here otherwise OS X crashes """ if evt.mode == JetDefs.PST_UPD_LOCATION: self.je.ctrls[JetDefs.F_GRAPH].UpdateLocation(evt.data) elif evt.mode == JetDefs.PST_PLAY: self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE) self.je.ctrls[JetDefs.F_PLAY].SetLabel(JetDefs.BUT_STOP) self.je.ctrls[JetDefs.F_PAUSE].Enabled = True self.je.ctrls[JetDefs.F_ETRIGGERBUT].Enabled = True self.je.ctrls[JetDefs.F_EMUTEBUT].Enabled = True elif evt.mode == JetDefs.PST_DONE: self.je.ctrls[JetDefs.F_EMUTEBUT].SetLabel(JetDefs.BUT_UNMUTE) self.je.ctrls[JetDefs.F_PLAY].SetLabel(JetDefs.BUT_PLAY) self.je.ctrls[JetDefs.F_PAUSE].Enabled = False self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE) self.je.ctrls[JetDefs.F_ETRIGGERBUT].Enabled = False self.je.ctrls[JetDefs.F_EMUTEBUT].Enabled = False elif evt.mode == JetDefs.PST_PAUSE: self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_RESUME) elif evt.mode == JetDefs.PST_RESUME: self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE) def OnPause(self, evt): """ Pause the player """ self.Player.Pause() def UpdateGraph(self): """ Called back from player thread to update the graph """ if len(self.segment.jetevents) == 0: self.segment.jetevents.append(JetEvent(self.je.ctrls[JetDefs.F_ENAME].GetValue(), self.je.ctrls[JetDefs.F_ETYPE].GetValue(), 1, self.je.ctrls[JetDefs.F_ETRACK].GetValue(), self.je.ctrls[JetDefs.F_ECHANNEL].GetValue(), self.je.ctrls[JetDefs.F_ESTART].GetValue(), self.je.ctrls[JetDefs.F_EEND].GetValue())) self.segment.jetevents[0].event_name = self.je.ctrls[JetDefs.F_ENAME].GetValue() self.segment.jetevents[0].event_type = self.je.ctrls[JetDefs.F_ETYPE].GetValue() self.segment.jetevents[0].event_start = self.je.ctrls[JetDefs.F_ESTART].GetValue() self.segment.jetevents[0].event_end = self.je.ctrls[JetDefs.F_EEND].GetValue() self.je.ctrls[JetDefs.F_GRAPH].LoadSegment(self.segment, showLabels=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True'), showClips=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True'), showAppEvts=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True')) def OnClose(self, event): """ Called when dialog is closed """ self.ShutdownPlayer() self.je.ctrls[JetDefs.F_ESTART].UnBindKillFocus() self.je.ctrls[JetDefs.F_EEND].UnBindKillFocus() self.EndModal(wx.ID_CANCEL) def ShutdownPlayer(self): """ Sets flag to kill play loop """ if self.Player is not None: self.Player.SetKeepPlayingFlag(False) def GetValue(self, fld): """ Gets the value of a control """ return self.je.ctrls[fld].GetValue() def SetValue(self, fld, val): """ Sets the value of a control """ self.je.ctrls[fld].SetValue(val) def SetEventId(self): """ Sets the eventid value """ if self.title == JetDefs.MAIN_ADDEVENTTITLE: iNextEventId = -1 for evt in self.segment.jetevents: if evt.event_type == JetDefs.E_CLIP: if iNextEventId < evt.event_id: iNextEventId = evt.event_id self.je.ctrls[JetDefs.F_EEVENTID].SetValue(iNextEventId + 1) def OnEventSelect(self, event=None): """ Adjusts the dialog box controls for various types of events """ eType = self.je.ctrls[JetDefs.F_ETYPE].GetValue() if eType == JetDefs.E_EOS: self.je.ctrls[JetDefs.F_ENAME].SetValue(JetDefs.E_EOS) self.je.ctrls[JetDefs.F_ENAME].Enable(False) self.je.ctrls[JetDefs.F_ESTART].Enable(False) self.je.ctrls[JetDefs.F_EEND].Enable(True) self.je.ctrls[JetDefs.F_ETRIGGERBUT].Enable(False) self.je.ctrls[JetDefs.F_EEVENTID].Enable(False) elif eType == JetDefs.E_CLIP: if len(self.je.ctrls[JetDefs.F_ENAME].GetValue()) == 0 or self.je.ctrls[JetDefs.F_ENAME].GetValue() == JetDefs.E_EOS or self.je.ctrls[JetDefs.F_ENAME].GetValue() == JetDefs.E_APP: self.je.ctrls[JetDefs.F_ENAME].SetValue(JetDefs.E_CLIP) self.je.ctrls[JetDefs.F_ENAME].Enable(True) self.je.ctrls[JetDefs.F_ESTART].Enable(True) self.je.ctrls[JetDefs.F_EEND].Enable(True) self.je.ctrls[JetDefs.F_ETRIGGERBUT].Enable(True) self.je.ctrls[JetDefs.F_EEVENTID].Enable(True) self.je.ctrls[JetDefs.F_EEVENTID].SetRange(JetDefs.EVENTID_MIN, JetDefs.EVENTID_MAX) if self.je.ctrls[JetDefs.F_EEVENTID].GetValue() < JetDefs.EVENTID_MIN: self.je.ctrls[JetDefs.F_EEVENTID].SetValue(JetDefs.EVENTID_MIN) if self.je.ctrls[JetDefs.F_EEVENTID].GetValue() > JetDefs.EVENTID_MAX: self.je.ctrls[JetDefs.F_EEVENTID].SetValue(JetDefs.EVENTID_MAX) self.SetEventId() elif eType == JetDefs.E_APP: if len(self.je.ctrls[JetDefs.F_ENAME].GetValue()) == 0 or self.je.ctrls[JetDefs.F_ENAME].GetValue() == JetDefs.E_EOS: self.je.ctrls[JetDefs.F_ENAME].SetValue(JetDefs.E_APP) self.je.ctrls[JetDefs.F_ENAME].Enable(True) self.je.ctrls[JetDefs.F_ESTART].Enable(True) self.je.ctrls[JetDefs.F_EEND].Enable(False) self.je.ctrls[JetDefs.F_ETRIGGERBUT].Enable(False) self.je.ctrls[JetDefs.F_EEVENTID].Enable(True) self.je.ctrls[JetDefs.F_EEVENTID].SetRange(JetDefs.APPCONTROLLERID_MIN, JetDefs.APPCONTROLLERID_MAX) if self.je.ctrls[JetDefs.F_EEVENTID].GetValue() < JetDefs.APPCONTROLLERID_MIN: self.je.ctrls[JetDefs.F_EEVENTID].SetValue(JetDefs.APPCONTROLLERID_MIN) if self.je.ctrls[JetDefs.F_EEVENTID].GetValue() > JetDefs.APPCONTROLLERID_MAX: self.je.ctrls[JetDefs.F_EEVENTID].SetValue(JetDefs.APPCONTROLLERID_MAX) def OnOk(self, event): """ Exits the dialog box """ self.ShutdownPlayer() if self.Validate(): self.je.ctrls[JetDefs.F_ESTART].UnBindKillFocus() self.je.ctrls[JetDefs.F_EEND].UnBindKillFocus() self.EndModal(wx.ID_OK) def Validate(self): """ Validates the control values prior to exiting """ if len(self.je.ctrls[JetDefs.F_ENAME].GetValue()) == 0: InfoMsg("Event Name", "The event must have a name.") self.je.ctrls[JetDefs.F_ENAME].SetFocus() return False if len(self.je.ctrls[JetDefs.F_ETYPE].GetValue()) == 0: InfoMsg("Event Name", "The event type must be selected.") self.je.ctrls[JetDefs.F_ETYPE].SetFocus() return False if self.je.ctrls[JetDefs.F_ETYPE].GetValue() == JetDefs.E_CLIP: if not CompareMbt(self.je.ctrls[JetDefs.F_ESTART].GetValue(), self.je.ctrls[JetDefs.F_EEND].GetValue()): InfoMsg("Start/End", "The event starting and ending times are illogical.") self.je.ctrls[JetDefs.F_ESTART].SetFocus() return False if MbtVal(self.je.ctrls[JetDefs.F_ESTART].GetValue()) < MbtVal(self.je.ctrls[JetDefs.F_START].GetValue()): InfoMsg("Event Starting Time", "The event starting time is illogical.") self.je.ctrls[JetDefs.F_ESTART].SetFocus() return False if MbtVal(self.je.ctrls[JetDefs.F_EEND].GetValue()) > MbtVal(self.je.ctrls[JetDefs.F_END].GetValue()): InfoMsg("Event Ending Time", "The event ending time is illogical.") self.je.ctrls[JetDefs.F_ESTART].SetFocus() return False if self.je.ctrls[JetDefs.F_ETYPE].GetValue() == JetDefs.E_APP: self.je.ctrls[JetDefs.F_EEND].SetValue(self.je.ctrls[JetDefs.F_ESTART].GetValue()) if self.je.ctrls[JetDefs.F_ETYPE].GetValue() == JetDefs.E_EOS: self.je.ctrls[JetDefs.F_ESTART].SetValue(self.je.ctrls[JetDefs.F_EEND].GetValue()) return True def SetSegment(self, segment): """ Sets the segment values, then calls the graph update """ self.segment = segment md = GetMidiInfo(segment.filename) if md.err == 0: self.SetValue(JetDefs.F_SEGNAME, segment.segname) self.SetValue(JetDefs.F_MUTEFLAGS, segment.mute_flags) self.SetValue(JetDefs.F_MIDIFILE, segment.filename) self.SetValue(JetDefs.F_DLSFILE, segment.dlsfile) self.SetValue(JetDefs.F_START, segment.start) self.SetValue(JetDefs.F_END, segment.end) self.SetValue(JetDefs.F_QUANTIZE, segment.quantize) self.SetValue(JetDefs.F_TRANSPOSE, segment.transpose) self.SetValue(JetDefs.F_REPEAT, segment.repeat) maxMeasures = abs(int(self.je.ctrls[JetDefs.F_END].GetValue('int')[0])) self.je.ctrls[JetDefs.F_EEND].SetMaxMbt(maxMeasures+1,md.maxBeats,md.maxTicks) self.je.ctrls[JetDefs.F_ESTART].SetMaxMbt(maxMeasures+1,md.maxBeats,md.maxTicks) minMeasures = abs(int(self.je.ctrls[JetDefs.F_START].GetValue('int')[0])) self.je.ctrls[JetDefs.F_EEND].SetMinMbt(minMeasures+1,0,0) self.je.ctrls[JetDefs.F_ESTART].SetMinMbt(minMeasures+1,0,0) self.je.ctrls[JetDefs.F_END].GetValue('int') self.je.ctrls[JetDefs.F_ETRACK].SetRange(1, md.maxTracks) self.je.ctrls[JetDefs.F_MUTEFLAGS].DeleteAllItems() for track in md.trackList: self.je.ctrls[JetDefs.F_MUTEFLAGS].AddTrackRow(track) self.je.ctrls[JetDefs.F_MUTEFLAGS].CheckTracks(self.je.ctrls[JetDefs.F_MUTEFLAGS].GetValue()) self.je.ctrls[JetDefs.F_MUTEFLAGS].SetTextColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT)) self.je.ctrls[JetDefs.F_GRAPH].LoadSegment(segment, showLabels=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True'), showClips=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True'), showAppEvts=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True')) def OnPlay(self, event): """ Plays the segment allowing interaction with events """ if self.je.ctrls[JetDefs.F_PLAY].GetLabel() == JetDefs.BUT_STOP: self.Player.SetKeepPlayingFlag(False) return if not self.Validate(): return jetevents = [] jetevents.append(JetEvent(self.GetValue(JetDefs.F_ENAME), self.GetValue(JetDefs.F_ETYPE), self.event_id, int(self.GetValue(JetDefs.F_ETRACK)), int(self.GetValue(JetDefs.F_ECHANNEL)), self.GetValue(JetDefs.F_ESTART), self.GetValue(JetDefs.F_EEND))) segment = JetSegment(self.GetValue(JetDefs.F_SEGNAME), self.GetValue(JetDefs.F_MIDIFILE), self.GetValue(JetDefs.F_START), self.GetValue(JetDefs.F_END), JetDefs.MBT_ZEROSTR, self.GetValue(JetDefs.F_SEGNAME), self.GetValue(JetDefs.F_QUANTIZE), jetevents, self.GetValue(JetDefs.F_DLSFILE), None, self.GetValue(JetDefs.F_TRANSPOSE), self.GetValue(JetDefs.F_REPEAT), self.GetValue(JetDefs.F_MUTEFLAGS)) self.Player = PreviewPlayer(self.je.ctrls[JetDefs.F_PLAY], segment) self.Player.SetGraphCtrl(self.je.ctrls[JetDefs.F_GRAPH], self) self.je.ctrls[JetDefs.F_GRAPH].ClickCallbackFct = self.GraphTriggerClip self.Player.trigger_button = self.je.ctrls[JetDefs.F_ETRIGGERBUT] self.Player.mute_button = self.je.ctrls[JetDefs.F_EMUTEBUT] thread.start_new_thread(self.Player .Start, ()) def GraphTriggerClip(self, sClipName, iEventId): """ Triggers a clip via graph """ if self.Player is not None: self.Player.GraphTriggerClip(sClipName, iEventId) def OnMute(self, event): """ Mutes a track """ if self.Player is not None: self.Player.MuteTrackViaButton(self.je.ctrls[JetDefs.F_EMUTEBUT], int(self.je.ctrls[JetDefs.F_ETRACK].GetValue())) def OnTriggerClip(self, event): """ Triggers a clip """ if self.Player is not None: self.Player.TriggerClip(self.event_id) def OnSetGraphOptions(self, evt): """ Sets graph options """ IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, self.je.ctrls[JetDefs.F_GRAPHLABELS].GetValue()) IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, self.je.ctrls[JetDefs.F_GRAPHAPPEVTS].GetValue()) IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, self.je.ctrls[JetDefs.F_GRAPHCLIPS].GetValue()) self.UpdateGraph() def OnReplicate(self, evt): dlg = JetReplicate("Replicate Event") dlg.SetValue(JetDefs.F_RPREPLACE, True) dlg.SetName(self.GetValue(JetDefs.F_ENAME)) dlg.event_type = self.GetValue(JetDefs.F_ETYPE) dlg.event_max = self.segment.end dlg.length = MbtDifference(ConvertStrTimeToTuple(self.GetValue(JetDefs.F_ESTART)), ConvertStrTimeToTuple(self.GetValue(JetDefs.F_EEND))) result = dlg.ShowModal() if result == wx.ID_OK: self.replicatePrefix = dlg.GetValue(JetDefs.F_RPPREFIX) self.lstReplicate = dlg.lstReplicate self.chkReplaceMatching = dlg.GetValue(JetDefs.F_RPREPLACE) self.EndModal(wx.ID_OK) else: dlg.Destroy() class JetReplicate(wx.Dialog): """ Replicate dialog box """ def __init__(self, title): wx.Dialog.__init__(self, None, -1, title) self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) self.je = JetEdit(self, "REPLICATE_CTRLS", self) self.je.ctrls[JetDefs.F_RPINCREMENT].SetMinMbt(0,0,0) self.je.ctrls[JetDefs.F_RPINCREMENT].SetValue((-1,-1,-1)) self.je.ctrls[JetDefs.F_RPNUMBER].SetValue(1) for title, width, fld in JetDefs.REPLICATE_GRID: self.je.ctrls[JetDefs.F_RPGRDPREVIEW].AddCol(title, width) self.lstReplicate = [] self.SetSize(JetDefs.REPLICATE_SIZE) self.CenterOnParent() def OnOk(self, event): self.EndModal(wx.ID_OK) def GetValue(self, fld): return self.je.ctrls[fld].GetValue() def SetValue(self, fld, val): self.je.ctrls[fld].SetValue(val) def SetName(self, name): for i in range(len(name), 1, -1): if not name[i-1].isdigit() and name[i-1] <> ' ': break else: name = name[0:i-1] self.SetValue(JetDefs.F_RPPREFIX, name) def Validate(self): if self.GetValue(JetDefs.F_RPPREFIX) == '': InfoMsg("Message", "Prefix is required.") return False return True def OnPreview(self, event): if not self.Validate(): return start = MbtVal(self.GetValue(JetDefs.F_ESTART)) max = MbtVal(self.event_max) increment = MbtVal((self.je.ctrls[JetDefs.F_RPINCREMENT].GetMeasure(), self.je.ctrls[JetDefs.F_RPINCREMENT].GetBeat(), self.je.ctrls[JetDefs.F_RPINCREMENT].GetTick())) self.lstReplicate = [] iTo = int(self.GetValue(JetDefs.F_RPNUMBER)) for i in range(iTo): evt_name = "%s %.2d" % (self.GetValue(JetDefs.F_RPPREFIX), i) s_ticks = start + (i * increment) s_mbt = TicksToMbt(s_ticks) evt_start = "%d:%d:%d" % (s_mbt[0]+1, s_mbt[1]+1, s_mbt[2]) if self.event_type == JetDefs.E_CLIP or self.event_type == "SEGMENT": e_ticks = s_ticks + self.length e_mbt = TicksToMbt(e_ticks) evt_end = "%d:%d:%d" % (e_mbt[0]+1, e_mbt[1]+1, e_mbt[2]) else: e_ticks = s_ticks evt_end = evt_start if s_ticks <= max and e_ticks <= max: self.lstReplicate.append((evt_name, evt_start, evt_end)) self.je.ctrls[JetDefs.F_RPGRDPREVIEW].DeleteAllItems() self.je.ctrls[JetDefs.F_RPGRDPREVIEW].AddRows(self.lstReplicate) class JetMove(wx.Dialog): """ Move events dialog box """ def __init__(self, title): wx.Dialog.__init__(self, None, -1, title) self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) self.je = JetEdit(self, "MOVE_CTRLS", self) self.je.ctrls[JetDefs.F_RPINCREMENT].SetMinMbt(-999,-4,-480) self.je.ctrls[JetDefs.F_RPINCREMENT].SetValue((-1,-1,-1)) for title, width, fld in JetDefs.REPLICATE_GRID: self.je.ctrls[JetDefs.F_RPGRDPREVIEW].AddCol(title, width) self.lstMove = [] self.lstMoveMbt = [] self.lstMoveItems = [] self.SetSize(JetDefs.REPLICATE_SIZE) self.CenterOnParent() def OnOk(self, event): self.EndModal(wx.ID_OK) def GetValue(self, fld): return self.je.ctrls[fld].GetValue() def SetValue(self, fld, val): self.je.ctrls[fld].SetValue(val) def OnPreview(self, event): increment = MbtVal((abs(self.je.ctrls[JetDefs.F_RPINCREMENT].GetMeasure()), abs(self.je.ctrls[JetDefs.F_RPINCREMENT].GetBeat()), abs(self.je.ctrls[JetDefs.F_RPINCREMENT].GetTick()))) if self.je.ctrls[JetDefs.F_RPINCREMENT].GetMeasure() < 0 or self.je.ctrls[JetDefs.F_RPINCREMENT].GetBeat() < 0 or self.je.ctrls[JetDefs.F_RPINCREMENT].GetTick() < 0: increment = 0 - increment self.lstMove = [] self.lstMoveMbt = [] for itm in self.lstMoveItems: max = MbtVal(itm[3]) evt_name = itm[0] start = MbtVal(itm[1]) s_ticks = start + increment s_mbt = TicksToMbt(s_ticks) evt_start = "%d:%d:%d" % (s_mbt[0]+1, s_mbt[1]+1, s_mbt[2]) evt_start_save = "%d:%d:%d" % s_mbt end = MbtVal(itm[2]) e_ticks = end + increment e_mbt = TicksToMbt(e_ticks) evt_end = "%d:%d:%d" % (e_mbt[0]+1, e_mbt[1]+1, e_mbt[2]) evt_end_save = "%d:%d:%d" % e_mbt if s_ticks <= max and e_ticks <= max and s_ticks >= 0 and e_ticks >= 0: self.lstMove.append((evt_name, evt_start, evt_end)) self.lstMoveMbt.append((evt_name, evt_start_save, evt_end_save)) self.je.ctrls[JetDefs.F_RPGRDPREVIEW].DeleteAllItems() self.je.ctrls[JetDefs.F_RPGRDPREVIEW].AddRows(self.lstMove) if __name__ == '__main1__': """ Test dialogs """ app = wx.PySimpleApp() #dlg = JetOpen() #dlg = JetPropertiesDialog() #dlg = ExportDialog("Export Jet File") #dlg = JetAbout() dlg = JetReplicate("Replicate Event") dlg.SetValue(JetDefs.F_RPREPLACE, True) dlg.event_max = "5:0:0" dlg.event_type = JetDefs.E_APP dlg.length = 480 dlg.SetName("abc 02") result = dlg.ShowModal() if result == wx.ID_OK: print("OK") dlg.Destroy() if __name__ == '__main1__': """ Test Segment dialog """ app = wx.PySimpleApp() helpProvider = wx.SimpleHelpProvider() wx.HelpProvider_Set(helpProvider) dlg = SegEdit("Segments", JetDefs.UNTITLED_FILE) dlg.SetValue(JetDefs.F_SEGNAME, "Test Segment Name") dlg.SetValue(JetDefs.F_MIDIFILE, '/Users/BHruska/JetContent/jenn_Burning Line.mid') dlg.SetValue(JetDefs.F_MIDIFILE, 'C:/_Data/JetCreator/JetDemo1/jenn_Burning Line.mid') dlg.SetValue(JetDefs.F_DLSFILE, '') dlg.SetValue(JetDefs.F_START, '4:0:0') dlg.SetValue(JetDefs.F_END, '8:0:0') dlg.SetValue(JetDefs.F_QUANTIZE, 6) result = dlg.ShowModal() dlg.Destroy() if __name__ == '__main__': """ Test Event dialog """ app = wx.PySimpleApp() jetevents = [] segment = JetSegment("Test Segment Name", 'C:/_Data/JetCreator/JetDemo1/jenn_Burning Line.mid', '0:0:0', '4:0:0', None, "Test Segment Name", 6, jetevents, '', None, 0,0,3) dlg = EventEdit("Event Edit", JetDefs.UNTITLED_FILE) dlg.SetValue(JetDefs.F_ENAME, "Test Event Name") dlg.SetValue(JetDefs.F_ETYPE, "TriggerClip") dlg.SetSegment(segment) result = dlg.ShowModal() dlg.Destroy()