summaryrefslogtreecommitdiffstats
path: root/jet_tools/JetCreator/JetDialogs.py
diff options
context:
space:
mode:
Diffstat (limited to 'jet_tools/JetCreator/JetDialogs.py')
-rwxr-xr-xjet_tools/JetCreator/JetDialogs.py1031
1 files changed, 1031 insertions, 0 deletions
diff --git a/jet_tools/JetCreator/JetDialogs.py b/jet_tools/JetCreator/JetDialogs.py
new file mode 100755
index 0000000..67d689b
--- /dev/null
+++ b/jet_tools/JetCreator/JetDialogs.py
@@ -0,0 +1,1031 @@
+"""
+ 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()
+
+
+