1*f81fb7c4SAndroid Build Coastguard Worker""" 2*f81fb7c4SAndroid Build Coastguard Worker File: 3*f81fb7c4SAndroid Build Coastguard Worker JetSegGraph.py 4*f81fb7c4SAndroid Build Coastguard Worker 5*f81fb7c4SAndroid Build Coastguard Worker Contents and purpose: 6*f81fb7c4SAndroid Build Coastguard Worker Draws the event graph and progress bar 7*f81fb7c4SAndroid Build Coastguard Worker 8*f81fb7c4SAndroid Build Coastguard Worker Copyright (c) 2008 Android Open Source Project 9*f81fb7c4SAndroid Build Coastguard Worker 10*f81fb7c4SAndroid Build Coastguard Worker Licensed under the Apache License, Version 2.0 (the "License"); 11*f81fb7c4SAndroid Build Coastguard Worker you may not use this file except in compliance with the License. 12*f81fb7c4SAndroid Build Coastguard Worker You may obtain a copy of the License at 13*f81fb7c4SAndroid Build Coastguard Worker 14*f81fb7c4SAndroid Build Coastguard Worker http://www.apache.org/licenses/LICENSE-2.0 15*f81fb7c4SAndroid Build Coastguard Worker 16*f81fb7c4SAndroid Build Coastguard Worker Unless required by applicable law or agreed to in writing, software 17*f81fb7c4SAndroid Build Coastguard Worker distributed under the License is distributed on an "AS IS" BASIS, 18*f81fb7c4SAndroid Build Coastguard Worker WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 19*f81fb7c4SAndroid Build Coastguard Worker See the License for the specific language governing permissions and 20*f81fb7c4SAndroid Build Coastguard Worker limitations under the License. 21*f81fb7c4SAndroid Build Coastguard Worker""" 22*f81fb7c4SAndroid Build Coastguard Worker 23*f81fb7c4SAndroid Build Coastguard Worker 24*f81fb7c4SAndroid Build Coastguard Workerimport wx 25*f81fb7c4SAndroid Build Coastguard Workerimport logging 26*f81fb7c4SAndroid Build Coastguard Worker 27*f81fb7c4SAndroid Build Coastguard Workerfrom JetUtils import * 28*f81fb7c4SAndroid Build Coastguard Workerfrom JetDefs import * 29*f81fb7c4SAndroid Build Coastguard Worker 30*f81fb7c4SAndroid Build Coastguard WorkerGRAPH_COLORS = [ 31*f81fb7c4SAndroid Build Coastguard Worker '#C0E272', 32*f81fb7c4SAndroid Build Coastguard Worker '#85CF89', 33*f81fb7c4SAndroid Build Coastguard Worker '#CF9683', 34*f81fb7c4SAndroid Build Coastguard Worker '#749EDE', 35*f81fb7c4SAndroid Build Coastguard Worker '#9FB5B1', 36*f81fb7c4SAndroid Build Coastguard Worker '#B095BF', 37*f81fb7c4SAndroid Build Coastguard Worker '#FE546D', 38*f81fb7c4SAndroid Build Coastguard Worker '#B3BB97', 39*f81fb7c4SAndroid Build Coastguard Worker '#FFFFB8', 40*f81fb7c4SAndroid Build Coastguard Worker 41*f81fb7c4SAndroid Build Coastguard Worker ] 42*f81fb7c4SAndroid Build Coastguard Worker 43*f81fb7c4SAndroid Build Coastguard WorkerPROGRESS_BAR = '#0000CC' 44*f81fb7c4SAndroid Build Coastguard WorkerEOS_BAR = '#095000' 45*f81fb7c4SAndroid Build Coastguard WorkerAPP_BAR = '#B3BB97' 46*f81fb7c4SAndroid Build Coastguard Worker 47*f81fb7c4SAndroid Build Coastguard Worker 48*f81fb7c4SAndroid Build Coastguard Workerclass Marker(): 49*f81fb7c4SAndroid Build Coastguard Worker """ Defines portions of the graph for events """ 50*f81fb7c4SAndroid Build Coastguard Worker def __init__(self, sEventType, iEventId, sName, sStartMbt, sEndMbt, iStartMeasure, ppqn): 51*f81fb7c4SAndroid Build Coastguard Worker self.sEventType = sEventType 52*f81fb7c4SAndroid Build Coastguard Worker self.iEventId = iEventId 53*f81fb7c4SAndroid Build Coastguard Worker self.sName = sName 54*f81fb7c4SAndroid Build Coastguard Worker self.StartMbt = ConvertStrTimeToTuple(sStartMbt) 55*f81fb7c4SAndroid Build Coastguard Worker self.EndMbt = ConvertStrTimeToTuple(sEndMbt) 56*f81fb7c4SAndroid Build Coastguard Worker self.iStartMeasure = iStartMeasure 57*f81fb7c4SAndroid Build Coastguard Worker self.iStart = 0 58*f81fb7c4SAndroid Build Coastguard Worker self.iEnd = 0 59*f81fb7c4SAndroid Build Coastguard Worker self.iWidth = 0 60*f81fb7c4SAndroid Build Coastguard Worker self.iHeight = 0 61*f81fb7c4SAndroid Build Coastguard Worker self.iTop = 0 62*f81fb7c4SAndroid Build Coastguard Worker self.iUpdate = False 63*f81fb7c4SAndroid Build Coastguard Worker self.sColor = '#FFFFB8' 64*f81fb7c4SAndroid Build Coastguard Worker self.ppqn = ppqn 65*f81fb7c4SAndroid Build Coastguard Worker self.isDirty = False 66*f81fb7c4SAndroid Build Coastguard Worker 67*f81fb7c4SAndroid Build Coastguard Worker def CalcCoord(self, step, height, ColorFct): 68*f81fb7c4SAndroid Build Coastguard Worker """ Calculates the coordinates in pixels for graphing the shaded regions """ 69*f81fb7c4SAndroid Build Coastguard Worker #measures 70*f81fb7c4SAndroid Build Coastguard Worker iStartM = self.StartMbt[0] - self.iStartMeasure 71*f81fb7c4SAndroid Build Coastguard Worker iEndM = self.EndMbt[0] - self.iStartMeasure 72*f81fb7c4SAndroid Build Coastguard Worker self.iStart = step * iStartM 73*f81fb7c4SAndroid Build Coastguard Worker self.iEnd = step * iEndM 74*f81fb7c4SAndroid Build Coastguard Worker #beats 75*f81fb7c4SAndroid Build Coastguard Worker self.iStart = self.iStart + ((step / 4.0) * (self.StartMbt[1]-1)) 76*f81fb7c4SAndroid Build Coastguard Worker self.iEnd = self.iEnd + ((step / 4.0) * (self.EndMbt[1]-1)) 77*f81fb7c4SAndroid Build Coastguard Worker #ticks 78*f81fb7c4SAndroid Build Coastguard Worker pctTickOfBeat = (float(self.StartMbt[2]) / float(self.ppqn)) 79*f81fb7c4SAndroid Build Coastguard Worker self.iStart = self.iStart + ((pctTickOfBeat * (step / 4.0))) 80*f81fb7c4SAndroid Build Coastguard Worker pctTickOfBeat = (float(self.EndMbt[2]) / float(self.ppqn)) 81*f81fb7c4SAndroid Build Coastguard Worker self.iEnd = self.iEnd + ((pctTickOfBeat * (step / 4.0))) 82*f81fb7c4SAndroid Build Coastguard Worker 83*f81fb7c4SAndroid Build Coastguard Worker self.iWidth = self.iEnd - self.iStart 84*f81fb7c4SAndroid Build Coastguard Worker 85*f81fb7c4SAndroid Build Coastguard Worker self.iHeight = height 86*f81fb7c4SAndroid Build Coastguard Worker self.sColor = ColorFct() 87*f81fb7c4SAndroid Build Coastguard Worker self.iUpdate = False 88*f81fb7c4SAndroid Build Coastguard Worker 89*f81fb7c4SAndroid Build Coastguard Workerclass SegmentGraph(wx.Panel): 90*f81fb7c4SAndroid Build Coastguard Worker """ Draws the player graph bar """ 91*f81fb7c4SAndroid Build Coastguard Worker def __init__(self, parent, pos=wx.DefaultPosition, size=wx.DefaultSize, ClickCallbackFct=None, showLabels=True, showClips=True, showAppEvts=True): 92*f81fb7c4SAndroid Build Coastguard Worker wx.Panel.__init__(self, parent, -1, pos=pos, size=size, style=wx.BORDER_STATIC) 93*f81fb7c4SAndroid Build Coastguard Worker self.iLocationInMs = 0 94*f81fb7c4SAndroid Build Coastguard Worker self.iLengthInMs = 0 95*f81fb7c4SAndroid Build Coastguard Worker self.iLengthInMeasures = 0 96*f81fb7c4SAndroid Build Coastguard Worker self.iMarkerTop = 15 97*f81fb7c4SAndroid Build Coastguard Worker self.iScaleTop = 0 98*f81fb7c4SAndroid Build Coastguard Worker self.iEdges = 5 99*f81fb7c4SAndroid Build Coastguard Worker self.iStartMeasure = 0 100*f81fb7c4SAndroid Build Coastguard Worker self.iMidiMode = False 101*f81fb7c4SAndroid Build Coastguard Worker self.ClickCallbackFct = ClickCallbackFct 102*f81fb7c4SAndroid Build Coastguard Worker self.iColor = 0 103*f81fb7c4SAndroid Build Coastguard Worker self.showLabels = showLabels 104*f81fb7c4SAndroid Build Coastguard Worker self.showClips = showClips 105*f81fb7c4SAndroid Build Coastguard Worker self.showAppEvts = showAppEvts 106*f81fb7c4SAndroid Build Coastguard Worker 107*f81fb7c4SAndroid Build Coastguard Worker self.font = wx.Font(8, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, False, 'Courier') 108*f81fb7c4SAndroid Build Coastguard Worker 109*f81fb7c4SAndroid Build Coastguard Worker self.Markers = [] 110*f81fb7c4SAndroid Build Coastguard Worker self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) 111*f81fb7c4SAndroid Build Coastguard Worker self.Bind(wx.EVT_PAINT, self.OnPaint) 112*f81fb7c4SAndroid Build Coastguard Worker self.Bind(wx.EVT_SIZE, self.OnSize) 113*f81fb7c4SAndroid Build Coastguard Worker self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) 114*f81fb7c4SAndroid Build Coastguard Worker 115*f81fb7c4SAndroid Build Coastguard Worker #initialize buffer 116*f81fb7c4SAndroid Build Coastguard Worker self.OnSize(None) 117*f81fb7c4SAndroid Build Coastguard Worker 118*f81fb7c4SAndroid Build Coastguard Worker def ClearGraph(self): 119*f81fb7c4SAndroid Build Coastguard Worker """ Clears the graph values """ 120*f81fb7c4SAndroid Build Coastguard Worker self.iLocationInMs = 0 121*f81fb7c4SAndroid Build Coastguard Worker self.iLengthInMs = 0 122*f81fb7c4SAndroid Build Coastguard Worker self.iLengthInMeasures = 0 123*f81fb7c4SAndroid Build Coastguard Worker self.iMarkerTop = 15 124*f81fb7c4SAndroid Build Coastguard Worker self.iScaleTop = 0 125*f81fb7c4SAndroid Build Coastguard Worker self.iEdges = 5 126*f81fb7c4SAndroid Build Coastguard Worker self.iStartMeasure = 0 127*f81fb7c4SAndroid Build Coastguard Worker self.iMidiMode = False 128*f81fb7c4SAndroid Build Coastguard Worker self.iColor = 0 129*f81fb7c4SAndroid Build Coastguard Worker self.Markers = [] 130*f81fb7c4SAndroid Build Coastguard Worker self.iLocationInMs = 0 131*f81fb7c4SAndroid Build Coastguard Worker self.DoDrawing() 132*f81fb7c4SAndroid Build Coastguard Worker 133*f81fb7c4SAndroid Build Coastguard Worker def LoadSegment(self, segment, segMarker=None, iMidiMode=False, showLabels=True, showClips=True, showAppEvts=True): 134*f81fb7c4SAndroid Build Coastguard Worker """ Loads up the segment drawing the graph """ 135*f81fb7c4SAndroid Build Coastguard Worker if segment is None: 136*f81fb7c4SAndroid Build Coastguard Worker self.ClearGraph() 137*f81fb7c4SAndroid Build Coastguard Worker return None 138*f81fb7c4SAndroid Build Coastguard Worker self.iMidiMode = iMidiMode 139*f81fb7c4SAndroid Build Coastguard Worker self.showLabels = showLabels 140*f81fb7c4SAndroid Build Coastguard Worker self.showClips = showClips 141*f81fb7c4SAndroid Build Coastguard Worker self.showAppEvts = showAppEvts 142*f81fb7c4SAndroid Build Coastguard Worker self.Markers = [] 143*f81fb7c4SAndroid Build Coastguard Worker self.iLocationInMs = 0 144*f81fb7c4SAndroid Build Coastguard Worker info = MidiSegInfo(segment) 145*f81fb7c4SAndroid Build Coastguard Worker #disable graph for debugging 146*f81fb7c4SAndroid Build Coastguard Worker #return info 147*f81fb7c4SAndroid Build Coastguard Worker self.iLengthInMs = info.iLengthInMs 148*f81fb7c4SAndroid Build Coastguard Worker self.ppqn = info.ppqn 149*f81fb7c4SAndroid Build Coastguard Worker self.StartMbt = mbtFct(ConvertStrTimeToTuple(segment.start), 1) 150*f81fb7c4SAndroid Build Coastguard Worker self.EndMbt = mbtFct(ConvertStrTimeToTuple(segment.end), 1) 151*f81fb7c4SAndroid Build Coastguard Worker self.LengthMbt = None 152*f81fb7c4SAndroid Build Coastguard Worker self.iStartMeasure = self.StartMbt[0] 153*f81fb7c4SAndroid Build Coastguard Worker self.iLengthInMeasures = self.EndMbt[0] - self.StartMbt[0] 154*f81fb7c4SAndroid Build Coastguard Worker 155*f81fb7c4SAndroid Build Coastguard Worker for jet_event in segment.jetevents: 156*f81fb7c4SAndroid Build Coastguard Worker if self.showClips and jet_event.event_type == JetDefs.E_CLIP: 157*f81fb7c4SAndroid Build Coastguard Worker self.AddMarker(JetDefs.E_CLIP, jet_event.event_id, jet_event.event_name, mbtFct(jet_event.event_start,1), mbtFct(jet_event.event_end,1), self.iStartMeasure, self.ppqn) 158*f81fb7c4SAndroid Build Coastguard Worker elif jet_event.event_type == JetDefs.E_EOS: 159*f81fb7c4SAndroid Build Coastguard Worker self.AddMarker(JetDefs.E_EOS, jet_event.event_id, jet_event.event_name, mbtFct(jet_event.event_end,1), mbtFct(jet_event.event_end,1), self.iStartMeasure, self.ppqn) 160*f81fb7c4SAndroid Build Coastguard Worker elif self.showAppEvts and jet_event.event_type == JetDefs.E_APP: 161*f81fb7c4SAndroid Build Coastguard Worker self.AddMarker(JetDefs.E_APP, jet_event.event_id, jet_event.event_name, mbtFct(jet_event.event_start,1), mbtFct(jet_event.event_end,1), self.iStartMeasure, self.ppqn) 162*f81fb7c4SAndroid Build Coastguard Worker 163*f81fb7c4SAndroid Build Coastguard Worker if segMarker is not None: 164*f81fb7c4SAndroid Build Coastguard Worker self.AddMarker(JetDefs.E_CLIP, 0, segMarker[0], mbtFct(segMarker[1],1), mbtFct(segMarker[2],1), self.iStartMeasure, self.ppqn) 165*f81fb7c4SAndroid Build Coastguard Worker 166*f81fb7c4SAndroid Build Coastguard Worker self.DoDrawing() 167*f81fb7c4SAndroid Build Coastguard Worker return info 168*f81fb7c4SAndroid Build Coastguard Worker 169*f81fb7c4SAndroid Build Coastguard Worker def AddMarker(self, sEventType, iEventId, sName, sStartMbt, sEndMbt, iStartMeasure, ppqn): 170*f81fb7c4SAndroid Build Coastguard Worker """ Adds a marker to the list """ 171*f81fb7c4SAndroid Build Coastguard Worker if not CompareMbt(sStartMbt, sEndMbt): 172*f81fb7c4SAndroid Build Coastguard Worker sEndMbt = sStartMbt 173*f81fb7c4SAndroid Build Coastguard Worker self.Markers.append(Marker(sEventType, iEventId, sName, sStartMbt, sEndMbt, iStartMeasure, ppqn)) 174*f81fb7c4SAndroid Build Coastguard Worker 175*f81fb7c4SAndroid Build Coastguard Worker def OnLeftDown(self, event): 176*f81fb7c4SAndroid Build Coastguard Worker """ Calls the function assicated with an event """ 177*f81fb7c4SAndroid Build Coastguard Worker pt = event.GetPosition() 178*f81fb7c4SAndroid Build Coastguard Worker for Marker in self.Markers: 179*f81fb7c4SAndroid Build Coastguard Worker if pt[0] >= Marker.iStart and pt[0] <= Marker.iEnd and pt[1] >= Marker.iTop and pt[1] <= Marker.iTop + Marker.iHeight: 180*f81fb7c4SAndroid Build Coastguard Worker if self.ClickCallbackFct != None: 181*f81fb7c4SAndroid Build Coastguard Worker self.ClickCallbackFct(Marker.sName, Marker.iEventId) 182*f81fb7c4SAndroid Build Coastguard Worker 183*f81fb7c4SAndroid Build Coastguard Worker def GetAColor(self): 184*f81fb7c4SAndroid Build Coastguard Worker """ Gets a color """ 185*f81fb7c4SAndroid Build Coastguard Worker color = GRAPH_COLORS[self.iColor] 186*f81fb7c4SAndroid Build Coastguard Worker self.iColor = self.iColor + 1 187*f81fb7c4SAndroid Build Coastguard Worker if self.iColor >= len(GRAPH_COLORS): 188*f81fb7c4SAndroid Build Coastguard Worker self.iColor = 0 189*f81fb7c4SAndroid Build Coastguard Worker return color 190*f81fb7c4SAndroid Build Coastguard Worker 191*f81fb7c4SAndroid Build Coastguard Worker def OnSize(self, event=None): 192*f81fb7c4SAndroid Build Coastguard Worker """ Repaints for resizing of screen """ 193*f81fb7c4SAndroid Build Coastguard Worker if OsWindows(): 194*f81fb7c4SAndroid Build Coastguard Worker # The Buffer init is done here, to make sure the buffer is always 195*f81fb7c4SAndroid Build Coastguard Worker # the same size as the Window 196*f81fb7c4SAndroid Build Coastguard Worker Size = self.GetClientSizeTuple() 197*f81fb7c4SAndroid Build Coastguard Worker 198*f81fb7c4SAndroid Build Coastguard Worker # Make new offscreen bitmap: this bitmap will always have the 199*f81fb7c4SAndroid Build Coastguard Worker # current drawing in it, so it can be used to save the image to 200*f81fb7c4SAndroid Build Coastguard Worker # a file, or whatever. 201*f81fb7c4SAndroid Build Coastguard Worker self._Buffer = wx.EmptyBitmap(*Size) 202*f81fb7c4SAndroid Build Coastguard Worker self.DoDrawing(None) 203*f81fb7c4SAndroid Build Coastguard Worker if event is not None: 204*f81fb7c4SAndroid Build Coastguard Worker event.Skip() 205*f81fb7c4SAndroid Build Coastguard Worker 206*f81fb7c4SAndroid Build Coastguard Worker def OnPaint(self, event=None): 207*f81fb7c4SAndroid Build Coastguard Worker """ Painting of windows """ 208*f81fb7c4SAndroid Build Coastguard Worker if OsWindows(): 209*f81fb7c4SAndroid Build Coastguard Worker dc = wx.BufferedPaintDC(self, self._Buffer) 210*f81fb7c4SAndroid Build Coastguard Worker else: 211*f81fb7c4SAndroid Build Coastguard Worker dc = wx.AutoBufferedPaintDC(self) 212*f81fb7c4SAndroid Build Coastguard Worker dc.Background = wx.Brush(wx.WHITE) 213*f81fb7c4SAndroid Build Coastguard Worker self.DoDrawing(dc) 214*f81fb7c4SAndroid Build Coastguard Worker 215*f81fb7c4SAndroid Build Coastguard Worker def DoDrawing(self, dc=None): 216*f81fb7c4SAndroid Build Coastguard Worker """ Does the actual drawing of the control """ 217*f81fb7c4SAndroid Build Coastguard Worker if dc is None: 218*f81fb7c4SAndroid Build Coastguard Worker if OsWindows(): 219*f81fb7c4SAndroid Build Coastguard Worker dc = wx.BufferedDC(wx.ClientDC(self), self._Buffer) 220*f81fb7c4SAndroid Build Coastguard Worker else: 221*f81fb7c4SAndroid Build Coastguard Worker dc = wx.AutoBufferedPaintDC(self) 222*f81fb7c4SAndroid Build Coastguard Worker dc.Background = wx.Brush(wx.WHITE) 223*f81fb7c4SAndroid Build Coastguard Worker 224*f81fb7c4SAndroid Build Coastguard Worker dc.Clear() 225*f81fb7c4SAndroid Build Coastguard Worker 226*f81fb7c4SAndroid Build Coastguard Worker self.iColor = 0 227*f81fb7c4SAndroid Build Coastguard Worker gWidth, gHeight = self.GetSize() 228*f81fb7c4SAndroid Build Coastguard Worker gWidth = gWidth - (self.iEdges * 2) 229*f81fb7c4SAndroid Build Coastguard Worker step = int(gWidth / (self.iLengthInMeasures + .01)) 230*f81fb7c4SAndroid Build Coastguard Worker 231*f81fb7c4SAndroid Build Coastguard Worker for Marker in self.Markers: 232*f81fb7c4SAndroid Build Coastguard Worker Marker.CalcCoord(step, gHeight, self.GetAColor) 233*f81fb7c4SAndroid Build Coastguard Worker 234*f81fb7c4SAndroid Build Coastguard Worker """ eliminate overlaps; establish colors """ 235*f81fb7c4SAndroid Build Coastguard Worker iClips = 0 236*f81fb7c4SAndroid Build Coastguard Worker iMarkers = 0 237*f81fb7c4SAndroid Build Coastguard Worker for index, Marker in enumerate(self.Markers): 238*f81fb7c4SAndroid Build Coastguard Worker if Marker.sEventType == JetDefs.E_CLIP: 239*f81fb7c4SAndroid Build Coastguard Worker iClips = iClips + 1 240*f81fb7c4SAndroid Build Coastguard Worker iOverlaps = 1 241*f81fb7c4SAndroid Build Coastguard Worker for index1, Marker1 in enumerate(self.Markers): 242*f81fb7c4SAndroid Build Coastguard Worker if Marker.sEventType == JetDefs.E_CLIP: 243*f81fb7c4SAndroid Build Coastguard Worker if index != index1 and not Marker1.iUpdate: 244*f81fb7c4SAndroid Build Coastguard Worker if Marker.iStart <= Marker1.iStart and Marker.iEnd <= Marker1.iEnd and Marker.iEnd >= Marker1.iStart: 245*f81fb7c4SAndroid Build Coastguard Worker iOverlaps = iOverlaps + 1 246*f81fb7c4SAndroid Build Coastguard Worker Marker.iUpdate = True 247*f81fb7c4SAndroid Build Coastguard Worker Marker1.iUpdate = True 248*f81fb7c4SAndroid Build Coastguard Worker if not Marker.iUpdate and Marker.iStart >= Marker1.iStart and Marker.iEnd >= Marker1.iEnd and Marker.iStart <= Marker1.iEnd: 249*f81fb7c4SAndroid Build Coastguard Worker iOverlaps = iOverlaps + 1 250*f81fb7c4SAndroid Build Coastguard Worker Marker.iUpdate = True 251*f81fb7c4SAndroid Build Coastguard Worker Marker1.iUpdate = True 252*f81fb7c4SAndroid Build Coastguard Worker if iOverlaps > 1: 253*f81fb7c4SAndroid Build Coastguard Worker iTop = 0 254*f81fb7c4SAndroid Build Coastguard Worker for index1, Marker1 in enumerate(self.Markers): 255*f81fb7c4SAndroid Build Coastguard Worker if Marker.sEventType == JetDefs.E_CLIP: 256*f81fb7c4SAndroid Build Coastguard Worker if Marker1.iUpdate: 257*f81fb7c4SAndroid Build Coastguard Worker Marker1.iHeight = gHeight / iOverlaps 258*f81fb7c4SAndroid Build Coastguard Worker Marker1.iTop = iTop * Marker1.iHeight 259*f81fb7c4SAndroid Build Coastguard Worker iTop = iTop + 1 260*f81fb7c4SAndroid Build Coastguard Worker elif Marker.sEventType == JetDefs.E_APP: 261*f81fb7c4SAndroid Build Coastguard Worker iMarkers = iMarkers + 1 262*f81fb7c4SAndroid Build Coastguard Worker 263*f81fb7c4SAndroid Build Coastguard Worker for Marker in self.Markers: 264*f81fb7c4SAndroid Build Coastguard Worker if Marker.sEventType == JetDefs.E_CLIP: 265*f81fb7c4SAndroid Build Coastguard Worker dc.SetPen(wx.Pen(Marker.sColor)) 266*f81fb7c4SAndroid Build Coastguard Worker dc.SetBrush(wx.Brush(Marker.sColor)) 267*f81fb7c4SAndroid Build Coastguard Worker dc.DrawRectangle(Marker.iStart + self.iEdges, Marker.iTop, Marker.iWidth, Marker.iHeight) 268*f81fb7c4SAndroid Build Coastguard Worker width, height = dc.GetTextExtent(Marker.sName) 269*f81fb7c4SAndroid Build Coastguard Worker k = ((Marker.iStart + Marker.iEnd) / 2) - (width/2) + self.iEdges 270*f81fb7c4SAndroid Build Coastguard Worker if self.showLabels or self.iMidiMode: 271*f81fb7c4SAndroid Build Coastguard Worker dc.DrawText(Marker.sName, k, ((Marker.iTop+Marker.iHeight/2) - (height*.5))) 272*f81fb7c4SAndroid Build Coastguard Worker if self.iMidiMode: 273*f81fb7c4SAndroid Build Coastguard Worker self.iMidiModeStart = Marker.iStart 274*f81fb7c4SAndroid Build Coastguard Worker elif Marker.sEventType == JetDefs.E_EOS: 275*f81fb7c4SAndroid Build Coastguard Worker dc.SetPen(wx.Pen(EOS_BAR)) 276*f81fb7c4SAndroid Build Coastguard Worker dc.SetBrush(wx.Brush(EOS_BAR)) 277*f81fb7c4SAndroid Build Coastguard Worker dc.DrawRectangle(Marker.iStart + self.iEdges, Marker.iTop, 1, Marker.iHeight) 278*f81fb7c4SAndroid Build Coastguard Worker width, height = dc.GetTextExtent(Marker.sName) 279*f81fb7c4SAndroid Build Coastguard Worker k = Marker.iStart - (width/2) + self.iEdges 280*f81fb7c4SAndroid Build Coastguard Worker dc.DrawText(Marker.sName, k, ((Marker.iTop+Marker.iHeight/2) - (height*.5))) 281*f81fb7c4SAndroid Build Coastguard Worker elif Marker.sEventType == JetDefs.E_APP: 282*f81fb7c4SAndroid Build Coastguard Worker dc.SetPen(wx.Pen(APP_BAR)) 283*f81fb7c4SAndroid Build Coastguard Worker dc.SetBrush(wx.Brush(APP_BAR)) 284*f81fb7c4SAndroid Build Coastguard Worker dc.DrawRectangle(Marker.iStart + self.iEdges, Marker.iTop, 1, Marker.iHeight) 285*f81fb7c4SAndroid Build Coastguard Worker width, height = dc.GetTextExtent(Marker.sName) 286*f81fb7c4SAndroid Build Coastguard Worker k = Marker.iStart - (width/2) + self.iEdges 287*f81fb7c4SAndroid Build Coastguard Worker if self.showLabels or self.iMidiMode: 288*f81fb7c4SAndroid Build Coastguard Worker dc.DrawText(Marker.sName, k, ((Marker.iTop+Marker.iHeight/2) - (height*.5))) 289*f81fb7c4SAndroid Build Coastguard Worker 290*f81fb7c4SAndroid Build Coastguard Worker 291*f81fb7c4SAndroid Build Coastguard Worker """ Draw scale """ 292*f81fb7c4SAndroid Build Coastguard Worker if gWidth == 0: 293*f81fb7c4SAndroid Build Coastguard Worker iDiv = 50 294*f81fb7c4SAndroid Build Coastguard Worker else: 295*f81fb7c4SAndroid Build Coastguard Worker iDiv = (gWidth)/18 296*f81fb7c4SAndroid Build Coastguard Worker if iDiv == 0: 297*f81fb7c4SAndroid Build Coastguard Worker iDiv = 50 298*f81fb7c4SAndroid Build Coastguard Worker scale = ((self.iLengthInMeasures / iDiv) + 1) 299*f81fb7c4SAndroid Build Coastguard Worker if scale == 0: 300*f81fb7c4SAndroid Build Coastguard Worker scale = 1 301*f81fb7c4SAndroid Build Coastguard Worker beatStep = step / 4.0 302*f81fb7c4SAndroid Build Coastguard Worker dc.SetFont(self.font) 303*f81fb7c4SAndroid Build Coastguard Worker j = 0 304*f81fb7c4SAndroid Build Coastguard Worker lastEnd = 0 305*f81fb7c4SAndroid Build Coastguard Worker num = range(self.iStartMeasure, self.iStartMeasure + self.iLengthInMeasures + 1, 1) 306*f81fb7c4SAndroid Build Coastguard Worker dc.SetPen(wx.Pen('#5C5142')) 307*f81fb7c4SAndroid Build Coastguard Worker for i in range(0, (self.iLengthInMeasures+1)*step, step): 308*f81fb7c4SAndroid Build Coastguard Worker k = i + self.iEdges 309*f81fb7c4SAndroid Build Coastguard Worker dc.DrawLine(k, self.iScaleTop, k, self.iScaleTop+8) 310*f81fb7c4SAndroid Build Coastguard Worker if i != (self.iLengthInMeasures)*step: 311*f81fb7c4SAndroid Build Coastguard Worker for iBeat in range(1,4): 312*f81fb7c4SAndroid Build Coastguard Worker k = i+(iBeat * beatStep) + self.iEdges 313*f81fb7c4SAndroid Build Coastguard Worker dc.DrawLine(k, self.iScaleTop, k, self.iScaleTop+4) 314*f81fb7c4SAndroid Build Coastguard Worker width, height = dc.GetTextExtent(str(num[j])) 315*f81fb7c4SAndroid Build Coastguard Worker k = i-(width/2) + self.iEdges 316*f81fb7c4SAndroid Build Coastguard Worker if k > lastEnd: 317*f81fb7c4SAndroid Build Coastguard Worker if j == 0 or (j % scale) == 0: 318*f81fb7c4SAndroid Build Coastguard Worker dc.DrawText(str(num[j]), k, self.iScaleTop+8) 319*f81fb7c4SAndroid Build Coastguard Worker lastEnd = k + width 320*f81fb7c4SAndroid Build Coastguard Worker j = j + 1 321*f81fb7c4SAndroid Build Coastguard Worker 322*f81fb7c4SAndroid Build Coastguard Worker """ Updates the location bar in case screen moved or resized """ 323*f81fb7c4SAndroid Build Coastguard Worker if self.iLocationInMs > 0 and self.iLengthInMs > 0: 324*f81fb7c4SAndroid Build Coastguard Worker iOffset = 0 325*f81fb7c4SAndroid Build Coastguard Worker if self.iMidiMode: 326*f81fb7c4SAndroid Build Coastguard Worker iOffset = self.iMidiModeStart 327*f81fb7c4SAndroid Build Coastguard Worker 328*f81fb7c4SAndroid Build Coastguard Worker till = gWidth * (self.iLocationInMs / self.iLengthInMs) 329*f81fb7c4SAndroid Build Coastguard Worker dc.SetPen(wx.Pen(PROGRESS_BAR)) 330*f81fb7c4SAndroid Build Coastguard Worker dc.SetBrush(wx.Brush(PROGRESS_BAR)) 331*f81fb7c4SAndroid Build Coastguard Worker dc.DrawRectangle(self.iEdges + iOffset, gHeight-6, till, 3) 332*f81fb7c4SAndroid Build Coastguard Worker 333*f81fb7c4SAndroid Build Coastguard Worker def UpdateLocation(self, iLocationInMs): 334*f81fb7c4SAndroid Build Coastguard Worker """ Updates the location bar """ 335*f81fb7c4SAndroid Build Coastguard Worker #disable graph for debugging 336*f81fb7c4SAndroid Build Coastguard Worker #return info 337*f81fb7c4SAndroid Build Coastguard Worker 338*f81fb7c4SAndroid Build Coastguard Worker self.iLocationInMs = iLocationInMs 339*f81fb7c4SAndroid Build Coastguard Worker if self.iLocationInMs > 0 and self.iLengthInMs > 0: 340*f81fb7c4SAndroid Build Coastguard Worker if OsWindows(): 341*f81fb7c4SAndroid Build Coastguard Worker dc = wx.BufferedDC(wx.ClientDC(self), self._Buffer) 342*f81fb7c4SAndroid Build Coastguard Worker else: 343*f81fb7c4SAndroid Build Coastguard Worker dc = wx.AutoBufferedPaintDC(self) 344*f81fb7c4SAndroid Build Coastguard Worker dc.Background = wx.Brush(wx.WHITE) 345*f81fb7c4SAndroid Build Coastguard Worker 346*f81fb7c4SAndroid Build Coastguard Worker iOffset = 0 347*f81fb7c4SAndroid Build Coastguard Worker if self.iMidiMode: 348*f81fb7c4SAndroid Build Coastguard Worker iOffset = self.iMidiModeStart 349*f81fb7c4SAndroid Build Coastguard Worker 350*f81fb7c4SAndroid Build Coastguard Worker gWidth, gHeight = self.GetSize() 351*f81fb7c4SAndroid Build Coastguard Worker gWidth = gWidth - (self.iEdges * 2) 352*f81fb7c4SAndroid Build Coastguard Worker 353*f81fb7c4SAndroid Build Coastguard Worker till = gWidth * (self.iLocationInMs / self.iLengthInMs) 354*f81fb7c4SAndroid Build Coastguard Worker dc.SetPen(wx.Pen(PROGRESS_BAR)) 355*f81fb7c4SAndroid Build Coastguard Worker dc.SetBrush(wx.Brush(PROGRESS_BAR)) 356*f81fb7c4SAndroid Build Coastguard Worker dc.DrawRectangle(self.iEdges + iOffset, gHeight-6, till, 3) 357*f81fb7c4SAndroid Build Coastguard Worker self.isDirty = True 358*f81fb7c4SAndroid Build Coastguard Worker else: 359*f81fb7c4SAndroid Build Coastguard Worker if self.isDirty: 360*f81fb7c4SAndroid Build Coastguard Worker self.DoDrawing() 361*f81fb7c4SAndroid Build Coastguard Worker self.isDirty = False 362