JetDialogs.py revision 8872ef327bd0a801363edf1c6ce8df0b74e51c8d
115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek""" 215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek File: 315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek JetDialogs.py 415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek Contents and purpose: 615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek Dialog boxes used in JetCreator 715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek Copyright (c) 2008 Android Open Source Project 915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 1015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek Licensed under the Apache License, Version 2.0 (the "License"); 1115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek you may not use this file except in compliance with the License. 1215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek You may obtain a copy of the License at 1315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 1415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek http://www.apache.org/licenses/LICENSE-2.0 1515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 1615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek Unless required by applicable law or agreed to in writing, software 1715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek distributed under the License is distributed on an "AS IS" BASIS, 1815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek See the License for the specific language governing permissions and 2015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek limitations under the License. 2115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek""" 2215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 2315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekimport wx 2415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekimport thread 2515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekimport wx.lib.newevent 2615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 2715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekfrom JetDefs import * 2815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekfrom JetCtrls import * 2915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekfrom JetFile import * 3015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekfrom JetUtils import * 3115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekfrom JetPreview import * 3215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekfrom JetSegGraph import * 3315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekfrom eas import * 3415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekfrom JetStatusEvent import * 3515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 3615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel KlimekPLAY_SEGMENT = 1 3715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel KlimekPLAY_MIDI = 2 3815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 3915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekclass JetEdit(): 409a7a50eef777765e4d20e3b1f3670b32582114fbHans Wennborg """ Class used to build dialog box controls from the definitions in JetDefs """ 419a7a50eef777765e4d20e3b1f3670b32582114fbHans Wennborg def __init__(self, panel, ctrlList, callbackClass): 4215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek LBL_OFFSET = 15 4315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 449a7a50eef777765e4d20e3b1f3670b32582114fbHans Wennborg ctrls = getattr(JetDefs, ctrlList) 459a7a50eef777765e4d20e3b1f3670b32582114fbHans Wennborg self.ctrls = {} 4615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek for Lbl, Text, Row, Col, Len, Min, Max, Id, Lst, Fct, Enabled, HelpText in ctrls: 4715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek try: 4815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek iDisplayLbl = True 4915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek if Text[0:3] == "btn": 5015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text] = wx.Button(panel, Id, Lbl, wx.Point(Col, Row), size=Len) 5115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek if Fct > "": 5215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text].Bind(wx.EVT_BUTTON, getattr(callbackClass, Fct), self.ctrls[Text], id=Id) 5315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek if Id == wx.ID_OK: 5415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text].SetDefault() 5515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek iDisplayLbl = False 5615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek else: 5715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek if Text[0:3] == "txt": 5815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text] = wx.TextCtrl(panel, Id, "", wx.Point(Col, Row + LBL_OFFSET +3), wx.Size(Len,-1)) 5915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek elif Text[0:4] == "spn1": 6015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text] = JetSpinOneBased(panel, Id, "", wx.Point(Col, Row + LBL_OFFSET), wx.Size(Len,-1), min=Min, max=Max) 6115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek elif Text[0:3] == "spn": 6215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text] = JetSpin(panel, Id, "", wx.Point(Col, Row + LBL_OFFSET), wx.Size(Len,-1), min=Min, max=Max) 6315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek elif Text[0:3] == "cmb": 6415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text] = wx.ComboBox(panel, Id, "", wx.Point(Col, Row + LBL_OFFSET), wx.Size(Len,-1), Lst, wx.CB_DROPDOWN | wx.CB_READONLY ) 6515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text].SetValue(Lst[0]) 6615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek if Fct > "": 6715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text].Bind(wx.EVT_COMBOBOX, getattr(callbackClass, Fct), self.ctrls[Text]) 6815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek elif Text[0:2] == "tm": 6915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text] = TimeCtrl(panel, pos=(Col, Row + LBL_OFFSET), ctlName=Text) 7015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek elif Text[0:7] == "filecmb": 7115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text] = JetFileCombo(panel, pos=(Col, Row + LBL_OFFSET), size=wx.Size(Len,-1), title=Lbl, spec=Lst, id=Id) 7215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek elif Text[0:7] == "filetxt": 7315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text] = JetFileText(panel, pos=(Col, Row + LBL_OFFSET), size=wx.Size(Len,-1), title=Lbl, spec=Lst, id=Id) 7415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek elif Text[0:2] == "fr": 7515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text] = wx.StaticBox(parent=panel, id=wx.ID_ANY, label=Lbl, pos=(Row, Col), size=Len) 7615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek iDisplayLbl = False 7715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek elif Text[0:3] == "chk": 7815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text] = JetCheckBox(panel, Id, label=Lbl, pos=(Col, Row), size=wx.Size(Len,-1)) 7915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek iDisplayLbl = False 8015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek if Fct > "": 8115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text].Bind(wx.EVT_CHECKBOX , getattr(callbackClass, Fct), self.ctrls[Text]) 8215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek elif Text[0:6] == "rdobox": 8315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text] = wx.RadioBox(panel, Id, label=Lbl, pos=(Col, Row), size=Len, choices=Lst, majorDimension=1, style=wx.RA_SPECIFY_COLS) 8415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek iDisplayLbl = False 8515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek if Fct > "": 8615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text].Bind(wx.EVT_RADIOBOX , getattr(callbackClass, Fct), self.ctrls[Text]) 8715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek elif Text[0:3] == "opt": 8815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text] = JetRadioButton(panel, Id, label=Lbl, pos=(Col, Row), size=wx.Size(Len,-1)) 8915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek iDisplayLbl = False 9015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text].SetValue(Lst) 9115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek if Fct > "": 9215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text].Bind(wx.EVT_RADIOBUTTON , getattr(callbackClass, Fct), self.ctrls[Text]) 9315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek elif Text[0:3] == "lst": 9415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text] = wx.ListBox(panel, Id, pos=(Col, Row), size=Len) 9515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek iDisplayLbl = False 9615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek elif Text[0:4] == "grd2": 9715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text] = JetTrackCtrl(panel, Id, pos=(Col, Row + LBL_OFFSET), size=Len, style=wx.LC_REPORT | wx.SUNKEN_BORDER) 9815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek iDisplayLbl = True 9915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek elif Text[0:3] == "grd": 10015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text] = JetListCtrl(panel, Id, pos=(Col, Row), size=Len) 10115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek iDisplayLbl = False 10215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek elif Text[0:5] == "graph": 10315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text] = SegmentGraph(panel, pos=(Col, Row), size=Len) 10415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek iDisplayLbl = False 10515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek elif Text[0:3] == "hlp": 10615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text] = wx.ContextHelpButton(panel, Id, pos=(Col, Row)) 10715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek iDisplayLbl = False 10815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek elif Text[0:3] == "lbl": 10915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text] = wx.StaticText(panel, Id, Lbl, wx.Point(Col, Row), size=wx.Size(Len[0],Len[1])) 11015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek iDisplayLbl = False 11115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek elif Text[0:3] == "box": 11215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text] = wx.StaticBox(panel, wx.ID_ANY, Lbl, pos=(Col, Row), size=Len) 11315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek iDisplayLbl = False 11415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 11515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek if iDisplayLbl: 11615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Lbl] = wx.StaticText(panel, Id, Lbl, wx.Point(Col, Row)) 11715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek if not Enabled: 11815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text].Enable(False) 11915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 12015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek helpText = IniGetValue(JetDefs.JETCREATOR_HLP, ctrlList, Lbl) 12115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek if helpText > "": 12215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[Text].SetHelpText(helpText) 12315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 12415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek #except AttributeError: 12515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek #No stub function for testing 12615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek #print("def " + Fct + "(self, event): pass") 12715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek except: 12815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek raise 12915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 13015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek def GetValue(self, fld): 13115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek """ Gets the value of a control """ 13215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek return self.ctrls[fld].GetValue() 13315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 13415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek def SetValue(self, fld, val): 13515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek """ Sets the value of a control """ 13615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.ctrls[fld].SetValue(val) 13715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 13815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekclass JetOpen(wx.Dialog): 13915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek """ Opens a jet definition file """ 14015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek def __init__(self): 14115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek wx.Dialog.__init__(self, None, -1, JetDefs.DLG_JETOPEN) 14215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.fileName = "" 14315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.je = JetEdit(self, "JETOPEN_CTRLS", self) 14415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek fileList = GetRecentJetFiles() 14515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.je.ctrls[JetDefs.F_JLIST].AppendItems(fileList) 14615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek if len(fileList) > 0: 14715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.je.ctrls[JetDefs.F_JFILE].SetValue(fileList[0]) 14815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.Bind(wx.EVT_LISTBOX_DCLICK, self.OnOpen) 14915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.Bind(wx.EVT_LISTBOX, self.OnClick) 15015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.SetSize(JetDefs.JETOPEN_SIZE) 15115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.CenterOnParent() 15222d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek 15322d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek def OnJetImport(self, event): 15422d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek """ Exit the dialog with flag to import """ 15522d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek self.EndModal(JetDefs.ID_JET_IMPORT) 15622d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek 15722d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek def OnClick(self, event): 15822d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek """ Clicking on item in listbox """ 15922d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek sValue = self.je.ctrls[JetDefs.F_JLIST].GetString(self.je.ctrls[JetDefs.F_JLIST].GetSelection()) 16022d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek self.je.ctrls[JetDefs.F_JFILE].SetValue(sValue) 16122d58ddc9e3cb01ef2d736a27759cda39a336b95Manuel Klimek 16215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek def OnOpen(self, event): 16315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek """ Double clicking on item in listbox """ 16415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek sValue = self.je.ctrls[JetDefs.F_JLIST].GetString(self.je.ctrls[JetDefs.F_JLIST].GetSelection()) 16515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.je.ctrls[JetDefs.F_JFILE].SetValue(sValue) 16615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek if self.Validate(): 16715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.fileName = self.je.ctrls[JetDefs.F_JFILE].GetValue() 16815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek AppendRecentJetFile(self.fileName) 16915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.EndModal(JetDefs.ID_JET_OPEN) 17015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 17115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek def OnOk(self, event): 17215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek """ Clicking the ok button """ 17315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek if self.Validate(): 17415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.fileName = self.je.ctrls[JetDefs.F_JFILE].GetValue() 17515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek AppendRecentJetFile(self.fileName) 17615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.EndModal(JetDefs.ID_JET_OPEN) 17715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 17815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek def OnNew(self, event): 17915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek """ Exit the dialog with flag to create new blank jet file """ 18015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.EndModal(JetDefs.ID_JET_NEW) 18115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 18215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek def Validate(self): 18315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek """ Validates the filename """ 18415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek if len(self.je.ctrls[JetDefs.F_JFILE].GetValue()) == 0: 18515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek InfoMsg("Jet Filename", "The Jet filename is blank.") 18615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.je.ctrls[JetDefs.F_JFILE].SetFocus() 18715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek return False 18815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek if not FileExists(self.je.ctrls[JetDefs.F_JFILE].GetValue()): 18915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek InfoMsg("MIDI File", "The file does not exist.") 19015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.je.ctrls[JetDefs.F_JFILE].SetFocus() 19115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek return False 19215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek return True 19315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 19415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekclass JetPreferences(wx.Dialog): 19515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek """ Preferences dialog box """ 19615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek def __init__(self): 19715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek wx.Dialog.__init__(self, None, -1, JetDefs.DLG_PREFERENCES) 19815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) 19915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.je = JetEdit(self, "PREFERENCES_CTRLS", self) 20015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.SetSize(JetDefs.PREFERENCES_SIZE) 20115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.CenterOnParent() 20215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 20315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek def OnOk(self, event): 20415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.EndModal(wx.ID_OK) 20515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 20615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek def GetValue(self, fld): 20715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek return self.je.ctrls[fld].GetValue() 20815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 20915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek def SetValue(self, fld, val): 21015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.je.ctrls[fld].SetValue(val) 21115852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 21215852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek 21315852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimekclass JetAbout(wx.Dialog): 21415852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek """ About dialog box """ 21515852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek def __init__(self): 21615852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek wx.Dialog.__init__(self, None, -1, JetDefs.DLG_ABOUT) 21715852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek img = __import__('img_splash') 21815852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek bmp = img.getBitmap() 21915852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek b = wx.StaticBitmap(self, -1, bmp) 22015852fc162eb6f77c28b67c868fdeeffed8c57d4Manuel Klimek self.SetSize((bmp.GetWidth(), bmp.GetHeight())) 221 self.CenterOnParent() 222 s = __import__('sys') 223 print(s.platform) 224 225 def OnOk(self, event): 226 self.EndModal(wx.ID_OK) 227 228 def GetValue(self, fld): 229 return self.je.ctrls[fld].GetValue() 230 231 def SetValue(self, fld, val): 232 self.je.ctrls[fld].SetValue(val) 233 234 235class JetPropertiesDialog(wx.Dialog): 236 """ Properties dialog box """ 237 def __init__(self): 238 wx.Dialog.__init__(self, None, -1, JetDefs.DLG_PROPERTIES) 239 self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) 240 self.je = JetEdit(self, "JET_PROPERTIES_CTRLS", self) 241 self.SetSize(JetDefs.JET_PROPERTIES_SIZE) 242 self.CenterOnParent() 243 244 def OnOk(self, event): 245 self.EndModal(wx.ID_OK) 246 247 def GetValue(self, fld): 248 return self.je.ctrls[fld].GetValue() 249 250 def SetValue(self, fld, val): 251 self.je.ctrls[fld].SetValue(val) 252 253 254class JetErrors(wx.Dialog): 255 """ Errors dialog box """ 256 def __init__(self, title): 257 wx.Dialog.__init__(self, None, -1, title) 258 self.je = JetEdit(self, "ERRORDLG", self) 259 self.SetSize(JetDefs.ERRORDLG_SIZE) 260 self.CenterOnParent() 261 262 def OnOk(self, event): 263 self.EndModal(wx.ID_OK) 264 265 def SetErrors(self, errors): 266 self.je.ctrls[JetDefs.F_ERRGRID].AddCol("Error", JetDefs.ERRORCOLW) 267 self.je.ctrls[JetDefs.F_ERRGRID].AddCol("Description", JetDefs.ERRORCOLW) 268 self.je.ctrls[JetDefs.F_ERRGRID].AddRows(errors) 269 270 271class SegEdit(wx.Dialog): 272 """ Dialog box to edit segments """ 273 def __init__(self, title, currentJetConfigFile): 274 wx.Dialog.__init__(self, None, -1, title) 275 self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) 276 self.currentJetConfigFile = currentJetConfigFile 277 self.je = JetEdit(self, "SEGDLG_CTRLS", self) 278 self.je.ctrls[JetDefs.F_MIDIFILE].cmb.Bind(wx.EVT_KILL_FOCUS, self.OnMidiChanged) 279 self.je.ctrls[JetDefs.F_MIDIFILE].cmb.Bind(wx.EVT_COMBOBOX, self.OnMidiChanged) 280 self.je.ctrls[JetDefs.F_MIDIFILE].SetEventFire(True) 281 self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_TRACK, JetDefs.MUTEGRD_TRACK) 282 self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_CHANNEL, JetDefs.MUTEGRD_CHANNEL) 283 self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_NAME, JetDefs.MUTEGRD_NAME) 284 self.je.ctrls[JetDefs.F_MUTEFLAGS].BindCheckBox(self.OnEventChecked) 285 self.je.ctrls[JetDefs.F_START].SetChangeCallbackFct(self.UpdateGraph) 286 self.je.ctrls[JetDefs.F_END].SetChangeCallbackFct(self.UpdateGraph) 287 self.je.ctrls[JetDefs.F_DISPEMPTYTRACKS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_DISPEMPTYTRACKS, JetDefs.F_DISPEMPTYTRACKS, 'bool', 'False')) 288 self.je.ctrls[JetDefs.F_GRAPHLABELS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True')) 289 self.je.ctrls[JetDefs.F_GRAPHCLIPS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True')) 290 self.je.ctrls[JetDefs.F_GRAPHAPPEVTS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True')) 291 self.replicatePrefix = "" 292 self.lstReplicate = [] 293 self.chkReplaceMatching = False 294 295 EVT_JET_STATUS(self, self.OnJetStatusUpdate) 296 wx.EVT_CLOSE(self, self.OnClose) 297 298 self.Player = None 299 self.segment = None 300 self.graphSegment = None 301 self.jetevents = [] 302 self.lastMidiFile = "" 303 self.lastMidiInfo = None 304 self.playMode = PLAY_SEGMENT 305 self.graphMode = PLAY_MIDI 306 self.SetSize(JetDefs.SEGDLG_SIZE) 307 self.CenterOnParent() 308 309 def OnClose(self, event): 310 """ Closing the dialog box """ 311 self.ShutdownPlayer() 312 self.je.ctrls[JetDefs.F_START].UnBindKillFocus() 313 self.je.ctrls[JetDefs.F_END].UnBindKillFocus() 314 self.EndModal(wx.ID_CANCEL) 315 316 def ShutdownPlayer(self): 317 """ Shutdown player flag """ 318 if self.Player is not None: 319 self.Player.SetKeepPlayingFlag(False) 320 321 def OnMidiChanged(self, event): 322 """ When new midi file selected, get its info """ 323 self.UpdateMaxMbt() 324 event.Skip() 325 326 def UpdateMaxMbt(self): 327 """ Get midi info in thread so UI smoother """ 328 thread.start_new_thread(self.UpdateMaxMbtThread, ()) 329 330 def UpdateMaxMbtThread(self): 331 """ Thread to get midi file info """ 332 if self.je.ctrls[JetDefs.F_MIDIFILE].GetValue() == self.lastMidiFile: 333 return 334 self.lastMidiFile = self.je.ctrls[JetDefs.F_MIDIFILE].GetValue() 335 self.lastMidiInfo = GetMidiInfo(self.je.ctrls[JetDefs.F_MIDIFILE].GetValue()) 336 wx.PostEvent(self, JetStatusEvent(JetDefs.PST_MIDI_INFO, self.lastMidiInfo)) 337 338 def GetValue(self, fld): 339 """ Gets a control value """ 340 return self.je.ctrls[fld].GetValue() 341 342 def SetValue(self, fld, val): 343 """ Sets a control value """ 344 self.je.ctrls[fld].SetValue(val) 345 if self.je.ctrls[fld] == self.je.ctrls[JetDefs.F_MIDIFILE]: 346 self.UpdateMaxMbt() 347 348 def OnOk(self, event): 349 """ Exits dialog box """ 350 self.ShutdownPlayer() 351 if self.Validate(): 352 self.je.ctrls[JetDefs.F_START].UnBindKillFocus() 353 self.je.ctrls[JetDefs.F_END].UnBindKillFocus() 354 self.EndModal(wx.ID_OK) 355 356 def Validate(self): 357 """ Validates the control values before exiting """ 358 if not CompareMbt(self.je.ctrls[JetDefs.F_START].GetValue(), self.je.ctrls[JetDefs.F_END].GetValue()): 359 InfoMsg("Start/End", "The segment starting and ending times are illogical.") 360 self.je.ctrls[JetDefs.F_START].SetFocus() 361 return False 362 if len(self.je.ctrls[JetDefs.F_SEGNAME].GetValue()) == 0: 363 InfoMsg("Segment Name", "The segment must have a name.") 364 self.je.ctrls[JetDefs.F_SEGNAME].SetFocus() 365 return False 366 if len(self.je.ctrls[JetDefs.F_MIDIFILE].GetValue()) == 0: 367 InfoMsg("MIDI File", "The segment must have a midi file selected.") 368 self.je.ctrls[JetDefs.F_MIDIFILE].SetFocus() 369 return False 370 if not FileExists(self.je.ctrls[JetDefs.F_MIDIFILE].GetValue()): 371 InfoMsg("MIDI File", "The MIDI file does not exist.") 372 self.je.ctrls[JetDefs.F_MIDIFILE].SetFocus() 373 return False 374 if len(self.je.ctrls[JetDefs.F_DLSFILE].GetValue()) > 0: 375 if not FileExists(self.je.ctrls[JetDefs.F_DLSFILE].GetValue()): 376 InfoMsg("DLS File", "The DLS file does not exist.") 377 self.je.ctrls[JetDefs.F_DLSFILE].SetFocus() 378 return False 379 self.je.ctrls[JetDefs.F_MUTEFLAGS].SetValue(ComputeMuteFlagsFromList(self.je.ctrls[JetDefs.F_MUTEFLAGS])) 380 return True 381 382 def SetSegment(self, mode): 383 """ Builds the segment info for graphing """ 384 if mode == PLAY_SEGMENT: 385 jetevents = self.jetevents 386 segment = JetSegment(self.GetValue(JetDefs.F_SEGNAME), 387 self.GetValue(JetDefs.F_MIDIFILE), 388 self.GetValue(JetDefs.F_START), 389 self.GetValue(JetDefs.F_END), 390 JetDefs.MBT_ZEROSTR, 391 self.GetValue(JetDefs.F_SEGNAME), 392 self.GetValue(JetDefs.F_QUANTIZE), 393 jetevents, 394 self.GetValue(JetDefs.F_DLSFILE), 395 None, 396 self.GetValue(JetDefs.F_TRANSPOSE), 397 self.GetValue(JetDefs.F_REPEAT), 398 self.GetValue(JetDefs.F_MUTEFLAGS)) 399 else: 400 jetevents = [] 401 segment = JetSegment(self.GetValue(JetDefs.F_SEGNAME), 402 self.GetValue(JetDefs.F_MIDIFILE), 403 JetDefs.MBT_ZEROSTR, 404 self.lastMidiInfo.endMbtStr, 405 JetDefs.MBT_ZEROSTR, 406 self.GetValue(JetDefs.F_SEGNAME), 407 self.GetValue(JetDefs.F_QUANTIZE), 408 jetevents, 409 self.GetValue(JetDefs.F_DLSFILE), 410 None, 411 0, 412 0, 413 0) 414 return segment 415 416 def OnEventChecked(self, index, checked): 417 """ Track is checked so mute or unmute it """ 418 if self.Player is not None: 419 trackNum = self.je.ctrls[JetDefs.F_MUTEFLAGS].GetTrackNumber(index) 420 self.Player.SetMuteFlag(trackNum, checked) 421 422 def OnPlay(self, event): 423 """ Play the segment button pressed """ 424 if self.je.ctrls[JetDefs.F_PLAY].GetLabel() == JetDefs.BUT_STOP: 425 self.Player.SetKeepPlayingFlag(False) 426 return 427 428 if not self.Validate(): 429 return 430 431 self.playMode = PLAY_SEGMENT 432 self.graphSegment = self.SetSegment(self.graphMode) 433 self.UpdateGraph() 434 self.Player = PreviewPlayer(self.je.ctrls[JetDefs.F_PLAY], self.SetSegment(self.playMode)) 435 self.Player.SetGraphCtrl(self.je.ctrls[JetDefs.F_GRAPH], self) 436 self.PlayerThread = thread.start_new_thread(self.Player .Start, ()) 437 438 def OnPlayMidi(self, event): 439 """ Play the whole midi file pressed """ 440 if self.je.ctrls[JetDefs.F_PLAYMIDI].GetLabel() == JetDefs.BUT_STOP: 441 self.Player.SetKeepPlayingFlag(False) 442 return 443 444 if not self.Validate(): 445 return 446 447 self.playMode = PLAY_MIDI 448 self.graphSegment = self.SetSegment(self.graphMode) 449 self.UpdateGraph() 450 self.Player = PreviewPlayer(self.je.ctrls[JetDefs.F_PLAYMIDI], self.SetSegment(self.playMode)) 451 self.Player.SetGraphCtrl(self.je.ctrls[JetDefs.F_GRAPH], self) 452 self.PlayerThread = thread.start_new_thread(self.Player .Start, ()) 453 454 def OnSetGraphType(self, event): 455 """ Sets the type of graph """ 456 self.SetGraphType(event.GetInt()) 457 458 def SetGraphType(self, iMode): 459 """ Sets the type of graph """ 460 if iMode == 1: 461 self.graphMode = PLAY_SEGMENT 462 else: 463 self.graphMode = PLAY_MIDI 464 self.graphSegment = self.SetSegment(self.graphMode) 465 self.UpdateGraph() 466 467 def OnGraphUpdate(self, evt): 468 """ Calls graph control to draw """ 469 self.je.ctrls[JetDefs.F_GRAPH].DoDrawing() 470 471 def UpdateGraph(self): 472 """ Updates values for graph control """ 473 if self.graphMode == PLAY_SEGMENT: 474 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')) 475 else: 476 if self.playMode == PLAY_SEGMENT: 477 iMidiMode = True 478 else: 479 iMidiMode = False 480 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')) 481 482 def OnJetStatusUpdate(self, evt): 483 """ All UI needed by thread must be called via Postevent or OS X crashes """ 484 if evt.mode == JetDefs.PST_UPD_LOCATION: 485 self.je.ctrls[JetDefs.F_GRAPH].UpdateLocation(evt.data) 486 elif evt.mode == JetDefs.PST_PLAY: 487 if self.playMode == PLAY_SEGMENT: 488 self.je.ctrls[JetDefs.F_PLAY].SetLabel(JetDefs.BUT_STOP) 489 self.je.ctrls[JetDefs.F_PLAYMIDI].Enabled = False 490 else: 491 self.je.ctrls[JetDefs.F_RDOGRAPH].Enabled = False 492 self.je.ctrls[JetDefs.F_PLAYMIDI].SetLabel(JetDefs.BUT_STOP) 493 self.je.ctrls[JetDefs.F_PLAY].Enabled = False 494 495 self.je.ctrls[JetDefs.F_PAUSE].Enabled = True 496 self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE) 497 elif evt.mode == JetDefs.PST_DONE: 498 self.je.ctrls[JetDefs.F_RDOGRAPH].Enabled = True 499 if self.playMode == PLAY_SEGMENT: 500 self.je.ctrls[JetDefs.F_PLAY].SetLabel(JetDefs.BUT_PLAYSEG) 501 self.je.ctrls[JetDefs.F_PLAYMIDI].Enabled = True 502 else: 503 self.je.ctrls[JetDefs.F_PLAYMIDI].SetLabel(JetDefs.BUT_PLAYMIDI) 504 self.je.ctrls[JetDefs.F_PLAY].Enabled = True 505 506 self.je.ctrls[JetDefs.F_PAUSE].Enabled = False 507 self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE) 508 elif evt.mode == JetDefs.PST_PAUSE: 509 self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_RESUME) 510 elif evt.mode == JetDefs.PST_RESUME: 511 self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE) 512 elif evt.mode == JetDefs.PST_MIDI_INFO: 513 ClearRowSelections(self.je.ctrls[JetDefs.F_MUTEFLAGS]) 514 self.md = evt.data 515 if self.md.err == 0: 516 self.je.ctrls[JetDefs.F_END].SetMaxMbt(self.md.maxMeasures+1,self.md.maxBeats,self.md.maxTicks) 517 if self.je.ctrls[JetDefs.F_END].GetValue() == JetDefs.MBT_ZEROSTR: 518 self.je.ctrls[JetDefs.F_END].SetValue((self.md.maxMeasures,0,0)) 519 self.je.ctrls[JetDefs.F_START].SetMaxMbt(self.md.maxMeasures+1,self.md.maxBeats,self.md.maxTicks) 520 self.je.ctrls[JetDefs.F_MUTEFLAGS].DeleteAllItems() 521 loadEmpty = IniGetValue(self.currentJetConfigFile, JetDefs.INI_DISPEMPTYTRACKS, JetDefs.INI_DISPEMPTYTRACKS, 'bool', 'False') 522 for track in self.md.trackList: 523 self.je.ctrls[JetDefs.F_MUTEFLAGS].AddTrackRow(track, loadEmpty) 524 self.je.ctrls[JetDefs.F_MUTEFLAGS].CheckTracks(self.je.ctrls[JetDefs.F_MUTEFLAGS].GetValue()) 525 self.graphSegment = self.SetSegment(self.graphMode) 526 self.UpdateGraph() 527 528 def OnSetTrackDisplayOption(self, evt): 529 IniSetValue(self.currentJetConfigFile, JetDefs.INI_DISPEMPTYTRACKS, JetDefs.INI_DISPEMPTYTRACKS, self.je.ctrls[JetDefs.F_DISPEMPTYTRACKS].GetValue()) 530 loadEmpty = IniGetValue(self.currentJetConfigFile, JetDefs.INI_DISPEMPTYTRACKS, JetDefs.INI_DISPEMPTYTRACKS, 'bool', 'False') 531 if self.md is not None: 532 self.je.ctrls[JetDefs.F_MUTEFLAGS].DeleteAllItems() 533 if self.md.err == 0: 534 for track in self.md.trackList: 535 self.je.ctrls[JetDefs.F_MUTEFLAGS].AddTrackRow(track, loadEmpty) 536 537 def OnPause(self, evt): 538 """ Pauses the playback """ 539 self.Player.Pause() 540 541 def OnSetGraphOptions(self, evt): 542 """ Sets graph options """ 543 IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, self.je.ctrls[JetDefs.F_GRAPHLABELS].GetValue()) 544 IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, self.je.ctrls[JetDefs.F_GRAPHAPPEVTS].GetValue()) 545 IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, self.je.ctrls[JetDefs.F_GRAPHCLIPS].GetValue()) 546 self.UpdateGraph() 547 548 def OnReplicate(self, evt): 549 dlg = JetReplicate("Replicate Segment") 550 dlg.SetValue(JetDefs.F_RPREPLACE, True) 551 dlg.SetName(self.GetValue(JetDefs.F_SEGNAME)) 552 dlg.event_type = "SEGMENT" 553 dlg.event_max = self.je.ctrls[JetDefs.F_START].GetMaxMbt() 554 dlg.length = MbtDifference(ConvertStrTimeToTuple(self.GetValue(JetDefs.F_START)), ConvertStrTimeToTuple(self.GetValue(JetDefs.F_END))) 555 result = dlg.ShowModal() 556 if result == wx.ID_OK: 557 self.replicatePrefix = dlg.GetValue(JetDefs.F_RPPREFIX) 558 self.lstReplicate = dlg.lstReplicate 559 self.chkReplaceMatching = dlg.GetValue(JetDefs.F_RPREPLACE) 560 self.EndModal(wx.ID_OK) 561 else: 562 dlg.Destroy() 563 564class EventEdit(wx.Dialog): 565 """ Event edit dialog box """ 566 def __init__(self, title, currentJetConfigFile): 567 wx.Dialog.__init__(self, None, -1, title) 568 self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) 569 self.title = title 570 self.currentJetConfigFile = currentJetConfigFile 571 self.je = JetEdit(self, "EVTDLG_CTRLS", self) 572 self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_TRACK, JetDefs.MUTEGRD_TRACK) 573 self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_CHANNEL, JetDefs.MUTEGRD_CHANNEL) 574 self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_NAME, JetDefs.MUTEGRD_NAME) 575 self.je.ctrls[JetDefs.F_ESTART].SetChangeCallbackFct(self.UpdateGraph) 576 self.je.ctrls[JetDefs.F_EEND].SetChangeCallbackFct(self.UpdateGraph) 577 self.je.ctrls[JetDefs.F_GRAPHLABELS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True')) 578 self.je.ctrls[JetDefs.F_GRAPHCLIPS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True')) 579 self.je.ctrls[JetDefs.F_GRAPHAPPEVTS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True')) 580 EVT_JET_STATUS(self, self.OnJetStatusUpdate) 581 self.segment = None 582 self.Player = None 583 self.event_id = 1 584 self.replicatePrefix = "" 585 self.lstReplicate = [] 586 self.chkReplaceMatching = False 587 588 wx.EVT_CLOSE(self, self.OnClose) 589 self.SetSize(JetDefs.EVTDLG_SIZE) 590 self.CenterOnParent() 591 592 def OnGraphUpdate(self, evt): 593 """ Calls the graph module to update the graph """ 594 self.je.ctrls[JetDefs.F_GRAPH].DoDrawing() 595 596 def OnJetStatusUpdate(self, evt): 597 """ Updates to UI needed by play thread come through here otherwise OS X crashes """ 598 if evt.mode == JetDefs.PST_UPD_LOCATION: 599 self.je.ctrls[JetDefs.F_GRAPH].UpdateLocation(evt.data) 600 elif evt.mode == JetDefs.PST_PLAY: 601 self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE) 602 self.je.ctrls[JetDefs.F_PLAY].SetLabel(JetDefs.BUT_STOP) 603 self.je.ctrls[JetDefs.F_PAUSE].Enabled = True 604 self.je.ctrls[JetDefs.F_ETRIGGERBUT].Enabled = True 605 self.je.ctrls[JetDefs.F_EMUTEBUT].Enabled = True 606 elif evt.mode == JetDefs.PST_DONE: 607 self.je.ctrls[JetDefs.F_EMUTEBUT].SetLabel(JetDefs.BUT_UNMUTE) 608 self.je.ctrls[JetDefs.F_PLAY].SetLabel(JetDefs.BUT_PLAY) 609 self.je.ctrls[JetDefs.F_PAUSE].Enabled = False 610 self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE) 611 self.je.ctrls[JetDefs.F_ETRIGGERBUT].Enabled = False 612 self.je.ctrls[JetDefs.F_EMUTEBUT].Enabled = False 613 elif evt.mode == JetDefs.PST_PAUSE: 614 self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_RESUME) 615 elif evt.mode == JetDefs.PST_RESUME: 616 self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE) 617 618 def OnPause(self, evt): 619 """ Pause the player """ 620 self.Player.Pause() 621 622 def UpdateGraph(self): 623 """ Called back from player thread to update the graph """ 624 if len(self.segment.jetevents) == 0: 625 self.segment.jetevents.append(JetEvent(self.je.ctrls[JetDefs.F_ENAME].GetValue(), 626 self.je.ctrls[JetDefs.F_ETYPE].GetValue(), 627 1, 628 self.je.ctrls[JetDefs.F_ETRACK].GetValue(), 629 self.je.ctrls[JetDefs.F_ECHANNEL].GetValue(), 630 self.je.ctrls[JetDefs.F_ESTART].GetValue(), 631 self.je.ctrls[JetDefs.F_EEND].GetValue())) 632 633 self.segment.jetevents[0].event_name = self.je.ctrls[JetDefs.F_ENAME].GetValue() 634 self.segment.jetevents[0].event_type = self.je.ctrls[JetDefs.F_ETYPE].GetValue() 635 self.segment.jetevents[0].event_start = self.je.ctrls[JetDefs.F_ESTART].GetValue() 636 self.segment.jetevents[0].event_end = self.je.ctrls[JetDefs.F_EEND].GetValue() 637 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')) 638 639 def OnClose(self, event): 640 """ Called when dialog is closed """ 641 self.ShutdownPlayer() 642 self.je.ctrls[JetDefs.F_ESTART].UnBindKillFocus() 643 self.je.ctrls[JetDefs.F_EEND].UnBindKillFocus() 644 self.EndModal(wx.ID_CANCEL) 645 646 def ShutdownPlayer(self): 647 """ Sets flag to kill play loop """ 648 if self.Player is not None: 649 self.Player.SetKeepPlayingFlag(False) 650 651 def GetValue(self, fld): 652 """ Gets the value of a control """ 653 return self.je.ctrls[fld].GetValue() 654 655 def SetValue(self, fld, val): 656 """ Sets the value of a control """ 657 self.je.ctrls[fld].SetValue(val) 658 659 def SetEventId(self): 660 """ Sets the eventid value """ 661 if self.title == JetDefs.MAIN_ADDEVENTTITLE: 662 iNextEventId = -1 663 for evt in self.segment.jetevents: 664 if evt.event_type == JetDefs.E_CLIP: 665 if iNextEventId < evt.event_id: 666 iNextEventId = evt.event_id 667 self.je.ctrls[JetDefs.F_EEVENTID].SetValue(iNextEventId + 1) 668 669 def OnEventSelect(self, event=None): 670 """ Adjusts the dialog box controls for various types of events """ 671 eType = self.je.ctrls[JetDefs.F_ETYPE].GetValue() 672 if eType == JetDefs.E_EOS: 673 self.je.ctrls[JetDefs.F_ENAME].SetValue(JetDefs.E_EOS) 674 self.je.ctrls[JetDefs.F_ENAME].Enable(False) 675 self.je.ctrls[JetDefs.F_ESTART].Enable(False) 676 self.je.ctrls[JetDefs.F_EEND].Enable(True) 677 self.je.ctrls[JetDefs.F_ETRIGGERBUT].Enable(False) 678 self.je.ctrls[JetDefs.F_EEVENTID].Enable(False) 679 elif eType == JetDefs.E_CLIP: 680 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: 681 self.je.ctrls[JetDefs.F_ENAME].SetValue(JetDefs.E_CLIP) 682 self.je.ctrls[JetDefs.F_ENAME].Enable(True) 683 self.je.ctrls[JetDefs.F_ESTART].Enable(True) 684 self.je.ctrls[JetDefs.F_EEND].Enable(True) 685 self.je.ctrls[JetDefs.F_ETRIGGERBUT].Enable(True) 686 self.je.ctrls[JetDefs.F_EEVENTID].Enable(True) 687 self.je.ctrls[JetDefs.F_EEVENTID].SetRange(JetDefs.EVENTID_MIN, JetDefs.EVENTID_MAX) 688 if self.je.ctrls[JetDefs.F_EEVENTID].GetValue() < JetDefs.EVENTID_MIN: 689 self.je.ctrls[JetDefs.F_EEVENTID].SetValue(JetDefs.EVENTID_MIN) 690 if self.je.ctrls[JetDefs.F_EEVENTID].GetValue() > JetDefs.EVENTID_MAX: 691 self.je.ctrls[JetDefs.F_EEVENTID].SetValue(JetDefs.EVENTID_MAX) 692 self.SetEventId() 693 elif eType == JetDefs.E_APP: 694 if len(self.je.ctrls[JetDefs.F_ENAME].GetValue()) == 0 or self.je.ctrls[JetDefs.F_ENAME].GetValue() == JetDefs.E_EOS: 695 self.je.ctrls[JetDefs.F_ENAME].SetValue(JetDefs.E_APP) 696 self.je.ctrls[JetDefs.F_ENAME].Enable(True) 697 self.je.ctrls[JetDefs.F_ESTART].Enable(True) 698 self.je.ctrls[JetDefs.F_EEND].Enable(False) 699 self.je.ctrls[JetDefs.F_ETRIGGERBUT].Enable(False) 700 self.je.ctrls[JetDefs.F_EEVENTID].Enable(True) 701 self.je.ctrls[JetDefs.F_EEVENTID].SetRange(JetDefs.APPCONTROLLERID_MIN, JetDefs.APPCONTROLLERID_MAX) 702 if self.je.ctrls[JetDefs.F_EEVENTID].GetValue() < JetDefs.APPCONTROLLERID_MIN: 703 self.je.ctrls[JetDefs.F_EEVENTID].SetValue(JetDefs.APPCONTROLLERID_MIN) 704 if self.je.ctrls[JetDefs.F_EEVENTID].GetValue() > JetDefs.APPCONTROLLERID_MAX: 705 self.je.ctrls[JetDefs.F_EEVENTID].SetValue(JetDefs.APPCONTROLLERID_MAX) 706 707 def OnOk(self, event): 708 """ Exits the dialog box """ 709 self.ShutdownPlayer() 710 if self.Validate(): 711 self.je.ctrls[JetDefs.F_ESTART].UnBindKillFocus() 712 self.je.ctrls[JetDefs.F_EEND].UnBindKillFocus() 713 self.EndModal(wx.ID_OK) 714 715 def Validate(self): 716 """ Validates the control values prior to exiting """ 717 if len(self.je.ctrls[JetDefs.F_ENAME].GetValue()) == 0: 718 InfoMsg("Event Name", "The event must have a name.") 719 self.je.ctrls[JetDefs.F_ENAME].SetFocus() 720 return False 721 if len(self.je.ctrls[JetDefs.F_ETYPE].GetValue()) == 0: 722 InfoMsg("Event Name", "The event type must be selected.") 723 self.je.ctrls[JetDefs.F_ETYPE].SetFocus() 724 return False 725 if self.je.ctrls[JetDefs.F_ETYPE].GetValue() == JetDefs.E_CLIP: 726 if not CompareMbt(self.je.ctrls[JetDefs.F_ESTART].GetValue(), self.je.ctrls[JetDefs.F_EEND].GetValue()): 727 InfoMsg("Start/End", "The event starting and ending times are illogical.") 728 self.je.ctrls[JetDefs.F_ESTART].SetFocus() 729 return False 730 if MbtVal(self.je.ctrls[JetDefs.F_ESTART].GetValue()) < MbtVal(self.je.ctrls[JetDefs.F_START].GetValue()): 731 InfoMsg("Event Starting Time", "The event starting time is illogical.") 732 self.je.ctrls[JetDefs.F_ESTART].SetFocus() 733 return False 734 if MbtVal(self.je.ctrls[JetDefs.F_EEND].GetValue()) > MbtVal(self.je.ctrls[JetDefs.F_END].GetValue()): 735 InfoMsg("Event Ending Time", "The event ending time is illogical.") 736 self.je.ctrls[JetDefs.F_ESTART].SetFocus() 737 return False 738 if self.je.ctrls[JetDefs.F_ETYPE].GetValue() == JetDefs.E_APP: 739 self.je.ctrls[JetDefs.F_EEND].SetValue(self.je.ctrls[JetDefs.F_ESTART].GetValue()) 740 if self.je.ctrls[JetDefs.F_ETYPE].GetValue() == JetDefs.E_EOS: 741 self.je.ctrls[JetDefs.F_ESTART].SetValue(self.je.ctrls[JetDefs.F_EEND].GetValue()) 742 return True 743 744 def SetSegment(self, segment): 745 """ Sets the segment values, then calls the graph update """ 746 self.segment = segment 747 md = GetMidiInfo(segment.filename) 748 if md.err == 0: 749 self.SetValue(JetDefs.F_SEGNAME, segment.segname) 750 self.SetValue(JetDefs.F_MUTEFLAGS, segment.mute_flags) 751 self.SetValue(JetDefs.F_MIDIFILE, segment.filename) 752 self.SetValue(JetDefs.F_DLSFILE, segment.dlsfile) 753 self.SetValue(JetDefs.F_START, segment.start) 754 self.SetValue(JetDefs.F_END, segment.end) 755 self.SetValue(JetDefs.F_QUANTIZE, segment.quantize) 756 self.SetValue(JetDefs.F_TRANSPOSE, segment.transpose) 757 self.SetValue(JetDefs.F_REPEAT, segment.repeat) 758 maxMeasures = abs(int(self.je.ctrls[JetDefs.F_END].GetValue('int')[0])) 759 self.je.ctrls[JetDefs.F_EEND].SetMaxMbt(maxMeasures+1,md.maxBeats,md.maxTicks) 760 self.je.ctrls[JetDefs.F_ESTART].SetMaxMbt(maxMeasures+1,md.maxBeats,md.maxTicks) 761 minMeasures = abs(int(self.je.ctrls[JetDefs.F_START].GetValue('int')[0])) 762 self.je.ctrls[JetDefs.F_EEND].SetMinMbt(minMeasures+1,0,0) 763 self.je.ctrls[JetDefs.F_ESTART].SetMinMbt(minMeasures+1,0,0) 764 self.je.ctrls[JetDefs.F_END].GetValue('int') 765 self.je.ctrls[JetDefs.F_ETRACK].SetRange(1, md.maxTracks) 766 self.je.ctrls[JetDefs.F_MUTEFLAGS].DeleteAllItems() 767 for track in md.trackList: 768 self.je.ctrls[JetDefs.F_MUTEFLAGS].AddTrackRow(track) 769 self.je.ctrls[JetDefs.F_MUTEFLAGS].CheckTracks(self.je.ctrls[JetDefs.F_MUTEFLAGS].GetValue()) 770 self.je.ctrls[JetDefs.F_MUTEFLAGS].SetTextColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT)) 771 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')) 772 773 def OnPlay(self, event): 774 """ Plays the segment allowing interaction with events """ 775 if self.je.ctrls[JetDefs.F_PLAY].GetLabel() == JetDefs.BUT_STOP: 776 self.Player.SetKeepPlayingFlag(False) 777 return 778 779 if not self.Validate(): 780 return 781 782 jetevents = [] 783 jetevents.append(JetEvent(self.GetValue(JetDefs.F_ENAME), self.GetValue(JetDefs.F_ETYPE), 784 self.event_id, int(self.GetValue(JetDefs.F_ETRACK)), 785 int(self.GetValue(JetDefs.F_ECHANNEL)), 786 self.GetValue(JetDefs.F_ESTART), self.GetValue(JetDefs.F_EEND))) 787 788 segment = JetSegment(self.GetValue(JetDefs.F_SEGNAME), 789 self.GetValue(JetDefs.F_MIDIFILE), 790 self.GetValue(JetDefs.F_START), 791 self.GetValue(JetDefs.F_END), 792 JetDefs.MBT_ZEROSTR, 793 self.GetValue(JetDefs.F_SEGNAME), 794 self.GetValue(JetDefs.F_QUANTIZE), 795 jetevents, 796 self.GetValue(JetDefs.F_DLSFILE), 797 None, 798 self.GetValue(JetDefs.F_TRANSPOSE), 799 self.GetValue(JetDefs.F_REPEAT), 800 self.GetValue(JetDefs.F_MUTEFLAGS)) 801 802 self.Player = PreviewPlayer(self.je.ctrls[JetDefs.F_PLAY], segment) 803 self.Player.SetGraphCtrl(self.je.ctrls[JetDefs.F_GRAPH], self) 804 self.je.ctrls[JetDefs.F_GRAPH].ClickCallbackFct = self.GraphTriggerClip 805 self.Player.trigger_button = self.je.ctrls[JetDefs.F_ETRIGGERBUT] 806 self.Player.mute_button = self.je.ctrls[JetDefs.F_EMUTEBUT] 807 thread.start_new_thread(self.Player .Start, ()) 808 809 def GraphTriggerClip(self, sClipName, iEventId): 810 """ Triggers a clip via graph """ 811 if self.Player is not None: 812 self.Player.GraphTriggerClip(sClipName, iEventId) 813 814 def OnMute(self, event): 815 """ Mutes a track """ 816 if self.Player is not None: 817 self.Player.MuteTrackViaButton(self.je.ctrls[JetDefs.F_EMUTEBUT], 818 int(self.je.ctrls[JetDefs.F_ETRACK].GetValue())) 819 820 def OnTriggerClip(self, event): 821 """ Triggers a clip """ 822 if self.Player is not None: 823 self.Player.TriggerClip(self.event_id) 824 825 def OnSetGraphOptions(self, evt): 826 """ Sets graph options """ 827 IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, self.je.ctrls[JetDefs.F_GRAPHLABELS].GetValue()) 828 IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, self.je.ctrls[JetDefs.F_GRAPHAPPEVTS].GetValue()) 829 IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, self.je.ctrls[JetDefs.F_GRAPHCLIPS].GetValue()) 830 self.UpdateGraph() 831 832 def OnReplicate(self, evt): 833 dlg = JetReplicate("Replicate Event") 834 dlg.SetValue(JetDefs.F_RPREPLACE, True) 835 dlg.SetName(self.GetValue(JetDefs.F_ENAME)) 836 dlg.event_type = self.GetValue(JetDefs.F_ETYPE) 837 dlg.event_max = self.segment.end 838 dlg.length = MbtDifference(ConvertStrTimeToTuple(self.GetValue(JetDefs.F_ESTART)), ConvertStrTimeToTuple(self.GetValue(JetDefs.F_EEND))) 839 result = dlg.ShowModal() 840 if result == wx.ID_OK: 841 self.replicatePrefix = dlg.GetValue(JetDefs.F_RPPREFIX) 842 self.lstReplicate = dlg.lstReplicate 843 self.chkReplaceMatching = dlg.GetValue(JetDefs.F_RPREPLACE) 844 self.EndModal(wx.ID_OK) 845 else: 846 dlg.Destroy() 847 848class JetReplicate(wx.Dialog): 849 """ Replicate dialog box """ 850 def __init__(self, title): 851 wx.Dialog.__init__(self, None, -1, title) 852 self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) 853 self.je = JetEdit(self, "REPLICATE_CTRLS", self) 854 855 self.je.ctrls[JetDefs.F_RPINCREMENT].SetMinMbt(0,0,0) 856 self.je.ctrls[JetDefs.F_RPINCREMENT].SetValue((-1,-1,-1)) 857 self.je.ctrls[JetDefs.F_RPNUMBER].SetValue(1) 858 for title, width, fld in JetDefs.REPLICATE_GRID: 859 self.je.ctrls[JetDefs.F_RPGRDPREVIEW].AddCol(title, width) 860 self.lstReplicate = [] 861 862 self.SetSize(JetDefs.REPLICATE_SIZE) 863 self.CenterOnParent() 864 865 def OnOk(self, event): 866 self.EndModal(wx.ID_OK) 867 868 def GetValue(self, fld): 869 return self.je.ctrls[fld].GetValue() 870 871 def SetValue(self, fld, val): 872 self.je.ctrls[fld].SetValue(val) 873 874 def SetName(self, name): 875 for i in range(len(name), 1, -1): 876 if not name[i-1].isdigit() and name[i-1] <> ' ': 877 break 878 else: 879 name = name[0:i-1] 880 self.SetValue(JetDefs.F_RPPREFIX, name) 881 882 def Validate(self): 883 if self.GetValue(JetDefs.F_RPPREFIX) == '': 884 InfoMsg("Message", "Prefix is required.") 885 return False 886 return True 887 888 def OnPreview(self, event): 889 if not self.Validate(): 890 return 891 start = MbtVal(self.GetValue(JetDefs.F_ESTART)) 892 max = MbtVal(self.event_max) 893 increment = MbtVal((self.je.ctrls[JetDefs.F_RPINCREMENT].GetMeasure(), self.je.ctrls[JetDefs.F_RPINCREMENT].GetBeat(), self.je.ctrls[JetDefs.F_RPINCREMENT].GetTick())) 894 895 self.lstReplicate = [] 896 iTo = int(self.GetValue(JetDefs.F_RPNUMBER)) 897 for i in range(iTo): 898 evt_name = "%s %.2d" % (self.GetValue(JetDefs.F_RPPREFIX), i) 899 s_ticks = start + (i * increment) 900 s_mbt = TicksToMbt(s_ticks) 901 evt_start = "%d:%d:%d" % (s_mbt[0]+1, s_mbt[1]+1, s_mbt[2]) 902 if self.event_type == JetDefs.E_CLIP or self.event_type == "SEGMENT": 903 e_ticks = s_ticks + self.length 904 e_mbt = TicksToMbt(e_ticks) 905 evt_end = "%d:%d:%d" % (e_mbt[0]+1, e_mbt[1]+1, e_mbt[2]) 906 else: 907 e_ticks = s_ticks 908 evt_end = evt_start 909 if s_ticks <= max and e_ticks <= max: 910 self.lstReplicate.append((evt_name, evt_start, evt_end)) 911 912 self.je.ctrls[JetDefs.F_RPGRDPREVIEW].DeleteAllItems() 913 self.je.ctrls[JetDefs.F_RPGRDPREVIEW].AddRows(self.lstReplicate) 914 915class JetMove(wx.Dialog): 916 """ Move events dialog box """ 917 def __init__(self, title): 918 wx.Dialog.__init__(self, None, -1, title) 919 self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) 920 self.je = JetEdit(self, "MOVE_CTRLS", self) 921 922 self.je.ctrls[JetDefs.F_RPINCREMENT].SetMinMbt(-999,-4,-480) 923 self.je.ctrls[JetDefs.F_RPINCREMENT].SetValue((-1,-1,-1)) 924 for title, width, fld in JetDefs.REPLICATE_GRID: 925 self.je.ctrls[JetDefs.F_RPGRDPREVIEW].AddCol(title, width) 926 self.lstMove = [] 927 self.lstMoveMbt = [] 928 self.lstMoveItems = [] 929 930 self.SetSize(JetDefs.REPLICATE_SIZE) 931 self.CenterOnParent() 932 933 def OnOk(self, event): 934 self.EndModal(wx.ID_OK) 935 936 def GetValue(self, fld): 937 return self.je.ctrls[fld].GetValue() 938 939 def SetValue(self, fld, val): 940 self.je.ctrls[fld].SetValue(val) 941 942 def OnPreview(self, event): 943 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()))) 944 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: 945 increment = 0 - increment 946 self.lstMove = [] 947 self.lstMoveMbt = [] 948 for itm in self.lstMoveItems: 949 max = MbtVal(itm[3]) 950 evt_name = itm[0] 951 start = MbtVal(itm[1]) 952 s_ticks = start + increment 953 954 s_mbt = TicksToMbt(s_ticks) 955 evt_start = "%d:%d:%d" % (s_mbt[0]+1, s_mbt[1]+1, s_mbt[2]) 956 evt_start_save = "%d:%d:%d" % s_mbt 957 958 end = MbtVal(itm[2]) 959 e_ticks = end + increment 960 e_mbt = TicksToMbt(e_ticks) 961 evt_end = "%d:%d:%d" % (e_mbt[0]+1, e_mbt[1]+1, e_mbt[2]) 962 evt_end_save = "%d:%d:%d" % e_mbt 963 964 if s_ticks <= max and e_ticks <= max and s_ticks >= 0 and e_ticks >= 0: 965 self.lstMove.append((evt_name, evt_start, evt_end)) 966 self.lstMoveMbt.append((evt_name, evt_start_save, evt_end_save)) 967 968 self.je.ctrls[JetDefs.F_RPGRDPREVIEW].DeleteAllItems() 969 self.je.ctrls[JetDefs.F_RPGRDPREVIEW].AddRows(self.lstMove) 970 971if __name__ == '__main1__': 972 """ Test dialogs """ 973 app = wx.PySimpleApp() 974 975 #dlg = JetOpen() 976 #dlg = JetPropertiesDialog() 977 #dlg = ExportDialog("Export Jet File") 978 #dlg = JetAbout() 979 980 dlg = JetReplicate("Replicate Event") 981 dlg.SetValue(JetDefs.F_RPREPLACE, True) 982 dlg.event_max = "5:0:0" 983 dlg.event_type = JetDefs.E_APP 984 dlg.length = 480 985 dlg.SetName("abc 02") 986 result = dlg.ShowModal() 987 if result == wx.ID_OK: 988 print("OK") 989 990 dlg.Destroy() 991 992if __name__ == '__main1__': 993 """ Test Segment dialog """ 994 app = wx.PySimpleApp() 995 996 helpProvider = wx.SimpleHelpProvider() 997 wx.HelpProvider_Set(helpProvider) 998 999 dlg = SegEdit("Segments", JetDefs.UNTITLED_FILE) 1000 dlg.SetValue(JetDefs.F_SEGNAME, "Test Segment Name") 1001 dlg.SetValue(JetDefs.F_MIDIFILE, '/Users/BHruska/JetContent/jenn_Burning Line.mid') 1002 dlg.SetValue(JetDefs.F_MIDIFILE, 'C:/_Data/JetCreator/JetDemo1/jenn_Burning Line.mid') 1003 dlg.SetValue(JetDefs.F_DLSFILE, '') 1004 dlg.SetValue(JetDefs.F_START, '4:0:0') 1005 dlg.SetValue(JetDefs.F_END, '8:0:0') 1006 dlg.SetValue(JetDefs.F_QUANTIZE, 6) 1007 1008 result = dlg.ShowModal() 1009 dlg.Destroy() 1010 1011if __name__ == '__main__': 1012 """ Test Event dialog """ 1013 app = wx.PySimpleApp() 1014 1015 jetevents = [] 1016 1017 segment = JetSegment("Test Segment Name", 'C:/_Data/JetCreator/JetDemo1/jenn_Burning Line.mid', 1018 '0:0:0', '4:0:0', None, 1019 "Test Segment Name", 6, jetevents, 1020 '', None, 0,0,3) 1021 1022 dlg = EventEdit("Event Edit", JetDefs.UNTITLED_FILE) 1023 dlg.SetValue(JetDefs.F_ENAME, "Test Event Name") 1024 dlg.SetValue(JetDefs.F_ETYPE, "TriggerClip") 1025 dlg.SetSegment(segment) 1026 1027 result = dlg.ShowModal() 1028 dlg.Destroy() 1029 1030 1031 1032