xref: /aosp_15_r20/external/sonivox/jet_tools/JetCreator/JetSegGraph.py (revision f81fb7c475c4b71ff83bdcc517de2a8c174e4e5c)
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