""" | |
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() | |