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
|
import pygtk
pygtk.require( '2.0' )
import gtk
from GUI.GUIConstants import GUIConstants
from GUI.Core.PageView import PageView
class PageBankView( gtk.Frame ):
NO_PAGE = -1
def __init__( self, selectPageCallback, pageDropCallback ):
gtk.Frame.__init__( self )
self.table = gtk.Table( 1, GUIConstants.NUMBER_OF_PAGE_BANK_COLUMNS )
self.add( self.table )
self.drag_dest_set( gtk.DEST_DEFAULT_ALL, [ ( "tune page", gtk.TARGET_SAME_APP, 11 )], gtk.gdk.ACTION_COPY|gtk.gdk.ACTION_MOVE )
self.connect( "drag_data_received", self.dragDataReceived )
self.selectPageCallback = selectPageCallback
self.pageDropCallback = pageDropCallback
self.selectedPageIds = set([])
self.pageIndexDictionary = {}
self.pageViews = {}
def dragDataReceived( self, widget, context, x, y, selectionData, info, time):
self.pageDropCallback( selectionData.data )
def addPage( self, pageId, invokeCallback = True ):
pageIndex = len( self.pageViews.keys() )
self.pageIndexDictionary[ pageIndex ] = pageId
#TODO: resize table to suit number of pages?
#if pageIndex > ( self.table.n-rows * self.table.n_columns ):
# self.table.resize( self.table.n_rows + 1, self.table.n_columns )
pageView = PageView( pageIndex, self.selectPage, True )
self.pageViews[ pageIndex ] = pageView
columnIndex = pageIndex % GUIConstants.NUMBER_OF_PAGE_BANK_COLUMNS
rowIndex = int( pageIndex / GUIConstants.NUMBER_OF_PAGE_BANK_COLUMNS )
self.table.attach( pageView, columnIndex, columnIndex + 1, rowIndex, rowIndex + 1, gtk.SHRINK, gtk.SHRINK )
self.updateSize( pageView )
pageView.drag_source_set( gtk.gdk.BUTTON1_MASK,
[ ( "bank page", gtk.TARGET_SAME_APP, 10 ) ],
gtk.gdk.ACTION_COPY )
self.selectPage( pageId, True, invokeCallback )
pageView.show()
def set_size_request( self, width, height ):
gtk.Frame.set_size_request( self, width, height )
self.table.set_size_request( width, height )
for pageId in self.pageViews.keys():
self.updateSize( self.pageViews[ pageId ] )
def updateSize( self, pageView ):
pageView.set_size_request( self.get_allocation().width / GUIConstants.NUMBER_OF_PAGE_BANK_COLUMNS,
GUIConstants.PAGE_HEIGHT - 1 )
def selectPage( self, selectedPageId, invokeCallback = True, deselectOthers = True ):
if deselectOthers:
for pageId in self.pageViews.keys():
self.pageViews[ pageId ].setSelected( pageId == selectedPageId )
if pageId != selectedPageId:
self.selectedPageIds.discard( pageId )
else:
self.selectedPageIds.add( pageId )
#nb: pageId might be NO_PAGE, and selectedPageIds can be empty here
else:
self.pageViews[ selectedPageId ].toggleSelected()
if self.pageViews[ selectedPageId ].selected:
self.selectedPageIds.add( selectedPageId )
else:
self.selectedPageIds.discard( selectedPageId )
if invokeCallback:
self.selectPageCallback( selectedPageId )
def getSelectedPageIds( self ):
rval = filter( lambda id: self.pageViews[id].selected == True, self.pageViews.keys())
return rval
|