1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
import pygtk
pygtk.require( '2.0' )
import gtk
from GUI.GUIConstants import GUIConstants
from GUI.Core.TunePageView import TunePageView
def swap(l,i,j):
e = l[i]
l[i] = l[j]
l[j] = e
class TuneView( gtk.ScrolledWindow ):
NO_PAGE = -1
def _page_width(self):
return self.pageContainer.get_allocation().width / GUIConstants.NUMBER_OF_PAGE_BANK_COLUMNS
def __init__( self, selectPageCallback ):
gtk.ScrolledWindow.__init__( self )
#selectPageCallback(): currently connected to pagePlayer.setPlayTune, which skips to a given page of the tune.
self.selectPageCallback = selectPageCallback
self.selectedPageIndex = self.NO_PAGE
self.set_policy( gtk.POLICY_ALWAYS, gtk.POLICY_AUTOMATIC )
self.set_placement( gtk.CORNER_TOP_LEFT )
#self.pageViews: list of our custom PageView widgets
self.pageViews = []
self.pageContainer = gtk.HBox( False )
self.add_with_viewport( self.pageContainer )
#the old part
self.pageContainer.drag_dest_set( gtk.DEST_DEFAULT_ALL,
[ ( "bank page", gtk.TARGET_SAME_APP, 10 ),
( "tune page", gtk.TARGET_SAME_APP, 11 )],
gtk.gdk.ACTION_COPY|gtk.gdk.ACTION_MOVE )
self.pageContainer.connect( "drag_data_received", self.dragDataReceived )
#private method: called by gtk when pages get dragged onto the tune-view
def dragDataReceived( self, widget, context, x, y, selectionData, info, time ):
print 'dragDataReceived: ', selectionData.data, info, selectionData.data
recv = selectionData.data.split()
if recv[0] == 'p':
pageId = int( recv[1] )
self.addPage( pageId, min( x / self._page_width(), len( self.pageViews )) )
elif recv[0] == 't':
self.moveSelectedPage( min( x / self._page_width(), len( self.pageViews ) -1))
else:
raise 'ERROR'
#public method: called by MainWindow on file load
def syncFromPagePlayer(self):
raise 'never call this'
map( lambda pv:pv.destroy(), self.pageViews )
self.pageViews = []
tunePages = self.tunePagesCallback()
for i in range( len(tunePages)):
self.addPage( tunePages[i], i, False)
def addPage( self, pageID, position ):
#create a new widget
pageView = TunePageView( pageID, position, self.selectPage )
self.pageViews.insert( position, pageView )
self.pageContainer.pack_start( pageView, False )
self.pageContainer.reorder_child( pageView, position )
pageView.set_size_request( self.pageContainer.get_allocation().width / GUIConstants.NUMBER_OF_PAGE_BANK_COLUMNS,
GUIConstants.PAGE_HEIGHT )
pageView.show()
for i in range( len(self.pageViews)) :
self.pageViews[i].tuneIndex = i
self.pageViews[i].setSelected( i == position)
self.selectPageCallback( pageID, position )
pageView.drag_source_set(
gtk.gdk.BUTTON1_MASK,
[ ( "tune page", gtk.TARGET_SAME_APP, 11 ) ],
gtk.gdk.ACTION_COPY|gtk.gdk.ACTION_MOVE )
def moveSelectedPage( self, position):
self.pageContainer.reorder_child( self.pageViews[self.selectedPageIndex], position )
swap( self.pageViews, self.selectedPageIndex, position )
self.selectedPageIndex = position
for i in range( len(self.pageViews) ) :
self.pageViews[i].tuneIndex = i
self.pageViews[i].setSelected( i == position)
def removePage( self, position ):
pv = self.pageViews[position]
self.pageViews[position:position+1] = []
if self.selectedPageIndex >= position : self.selectedPageIndex -= 1
for i in range( len(self.pageViews)) :
self.pageViews[i].tuneIndex = i
self.pageViews[i].setSelected( i == position)
self.pageContainer.remove(pv)
del pv
def selectPage( self, selectedPageIndex, invokeCallback = True ):
if selectedPageIndex >= len( self.pageViews ): selectedPageIndex = self.NO_PAGE
self.selectedPageIndex = selectedPageIndex
if selectedPageIndex == self.NO_PAGE:
for pv in self.pageViews: pv.setSelected(False)
if invokeCallback: self.selectPageCallback( -1, -1 )
else:
if not self.pageViews[ selectedPageIndex ].selected:
map( lambda pv: pv.setSelected( pv.tuneIndex == selectedPageIndex), self.pageViews)
if invokeCallback: self.selectPageCallback( self.pageViews[selectedPageIndex].pageID, selectedPageIndex )
def set_size_request( self, width, height ):
gtk.ScrolledWindow.set_size_request( self, width, height )
map( lambda pv: pv.set_size_request( width / GUIConstants.NUMBER_OF_PAGE_BANK_COLUMNS, GUIConstants.PAGE_HEIGHT ), self.pageViews)
def getPageId( self, idx):
return self.pageViews[idx].pageID
def getTune( self ):
return [ p.pageID for p in self.pageViews ]
|