root/src/buildMenu.py @ 604

Revision 604, 4.7 KB (checked in by jelinson, 2 years ago)

fixed buildmenu overlapping bu

Line 
1'''
2Created on Mar 23, 2012
3
4@author: TechTrek
5'''
6import math
7from inGameMenu import InGameMenu
8from menuPage import MenuPage
9from buildMenuEntry import BuildMenuEntry
10from backButton import BackButton
11from buildables import buildingLUT
12from dim import buildMenuDim as DIM
13from globals import *
14
15
16class BuildMenu(InGameMenu):
17    """
18        The build menu gives access to the different categories of buildings
19        that can be built.
20    """
21
22    def __init__(self, pos, visible, category, buildResponse, closeResponse):
23        """
24            initializes the components of the BuildMenu subclass, which
25            contains menu pages as subwindows
26
27            input type: int((x,y)), bool(visible), int(category),
28                        function pointer(buildResponse),
29                        function pointer(closeResponse)
30        """
31        InGameMenu.__init__(self, pos, visible, closeResponse)
32        self.category = category
33        self.currentPage = 0
34        self.responseList = [(self.prevPage,), (self.nextPage,), buildResponse, closeResponse]
35
36        back = BackButton((self.pos[0] + DIM.BUT_W_SHIFT,
37                           self.pos[1] + DIM.BUT_H_SHIFT), True,
38                          ((self.close,)))
39        back.stayBack = True
40        self.addWindow(back)
41        self.pageOffset = len(self.subwindows)
42
43        catBuildings = []
44        for building in buildingLUT.values():
45            if building.buildingType == self.category:
46                catBuildings.append(building)
47        catBuildings.sort()
48
49        # here you will check how many of category buildings there are
50        self.numPages = (len(catBuildings) - 1) / PAGE_SIZE
51        for j in range(self.numPages + 1):
52            page = MenuPage(self.pos, False, j, self.responseList)
53            for i in range(PAGE_SIZE):
54                if j * PAGE_SIZE + i >= len(catBuildings):
55                    continue
56                building = catBuildings[j * PAGE_SIZE + i]
57                entry = BuildMenuEntry((self.pos[0] + DIM.W_SHIFT,
58                                        self.pos[1] + DIM.H_SHIFT + DIM.V_SHIFT * i),
59                                       True, building)
60                entry.setYesResponse(buildResponse)
61                page.subwindows.append(entry)
62
63            self.addWindow(page)
64        self.subwindows[self.currentPage + self.pageOffset].open()
65
66    def setBackResponse(self, response):
67        """
68            Sets the back button response
69
70            input type: function pointer
71            return type: none
72        """
73        backButtonIndex = self.getElement(BackButton)
74        self.subwindows[backButtonIndex].addResponse(response)
75
76    def prevPage(self):
77        """
78            Moves to the previous block
79
80            input type: none
81            return type: none
82        """
83        if self.currentPage > 0:
84            self.subwindows[self.currentPage + self.pageOffset].close()
85            self.currentPage -= 1
86            self.subwindows[self.currentPage + self.pageOffset].open()
87            if DEBUG == 0:
88                print 'left to page: ', self.currentPage
89
90    def nextPage(self):
91        """
92            Moves to the next block
93
94            input type: none
95            return type: none
96        """
97        if self.currentPage < self.numPages:
98            self.subwindows[self.currentPage + self.pageOffset].close()
99            self.currentPage += 1
100            self.subwindows[self.currentPage + self.pageOffset].open()
101            if DEBUG == 0:
102                print 'right to page: ', self.currentPage
103
104    def open(self):
105        """
106            opens the window
107
108            input type: none
109            return type: none
110        """
111        self.visible = True
112        self.subwindows[self.currentPage + self.pageOffset].open()
113
114    def close(self):
115        """
116            closes the window and subwindows
117
118            input type: none
119            return type: none
120        """
121        self.visible = False
122        self.subwindows[self.currentPage + self.pageOffset].close()
123        self.currentPage = 0
124
125    def event(self, e):
126        """
127            Checks if event applies to visible child windows. If so, return
128            true.
129
130            Otherwise, checks if events apply to this object. If they do,
131            return true and take appropriate action.
132
133            Else, returns false.
134
135            input type: pygame.event
136            output type: boolean
137            """
138        for window in self.subwindows:
139            if window.isVisible():
140                returnValue = window.event(e)
141                if returnValue is not False:
142                    return returnValue
143        return self.response(e)
Note: See TracBrowser for help on using the browser.