Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/TamTamEdit.activity/Edit/rm/TuneView.py
blob: 63cf4681bac563baa77d1866fadce9f808bdf126 (plain)
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 ]