@@ -13,17 +13,25 @@ def __init__(self, screen):
1313 # pygame.display.set_mode(...)
1414 self ._screen = screen
1515 self .keymap = {pygame .K_UP :1 , pygame .K_RIGHT :2 , pygame .K_DOWN :3 , pygame .K_LEFT :4 }
16-
16+ self . selectedColor = ( 245 , 101 , 44 ) # orange ;)
1717 self .nextAction = None
1818
1919 self .menus = {}
20+
21+ self ._selectedMenu = '' # menu 'name'
22+ self ._selectedMenuItem = '' # selected index
23+ self ._selectedMenuItemIndex = - 1 # selected index
2024
2125 def interaction (self , eventKey ):
2226 canInteract = False
2327
2428 if eventKey in self .keymap :
2529 canInteract = True
26- nextAction = self .keymap [eventKey ]
30+ self .nextAction = self .keymap [eventKey ]
31+ if self .nextAction == 1 : # UP
32+ self .selectMenuItem (- 1 )
33+ elif self .nextAction == 3 : # DOWN
34+ self .selectMenuItem (1 )
2735 else :
2836 # reset the action if multiple times pressed keys before
2937 # actually did something
@@ -34,7 +42,7 @@ def interaction(self, eventKey):
3442 def addMenu (self , menuKey , menuRows ):
3543 ''' add an menu
3644 menuKey: unique name of the menu
37- menueRows : [
45+ menuRows : [
3846 {"rowName":"title", "selectable":False, "font":"MS Comic Sans", "fontSize":30, "color":(0,0,255), "text":"UserInterfaceGenerator"},
3947 {"rowName":"start", "selectable":True, "font":"MS Comic Sans", "fontSize":30, "color":(0,0,255), "text":"Start Game"},
4048 {"rowName":"q", "selectable":True, "font":"MS Comic Sans", "fontSize":30, "color":(123,55,255), "text":"QUIT"}
@@ -53,11 +61,70 @@ def addSimpleMenu(self, menuKey, menuRows, font="MS Comic Sans", size=30, color=
5361 menu .append ({"rowName" :"simple_" + str (rowCount ), "selectable" :False , "font" :font , "fontSize" :size , "color" :color , "text" :row })
5462
5563 self .menus [menuKey ] = menu
56-
57- def draw (self , menuKey ):
64+
65+ def __getAvailableIndexes (self ):
66+ indexList = []
67+ if self ._selectedMenu in self .menus :
68+ for i in range (len (self .menus [self ._selectedMenu ])):
69+ if self .menus [self ._selectedMenu ][i ]['selectable' ]:
70+ indexList .append (i )
71+ return indexList
72+
73+ def selectMenuItem (self , direction = 0 ):
74+ ''' select the menu item
75+ direction: +1 (down) or -1 (up), 0 for the first selectable item in the current menu
76+ '''
77+ #self._selectedIndex
78+
79+ indexList = self .__getAvailableIndexes ()
80+ if len (indexList ) == 0 :
81+ print ('NO MENU ITEMS' )
82+ return - 1
83+
84+ if self ._selectedMenu in self .menus and direction == 0 :
85+ self ._selectedMenuItemIndex = indexList [0 ]
86+ self ._selectedMenuItem = self .menus [self ._selectedMenu ][indexList [0 ]]
87+ else :
88+ currentIndex = 0
89+ if self ._selectedMenuItemIndex in indexList :
90+ currentIndex = indexList .index (self ._selectedMenuItemIndex )
91+ nextIndex = currentIndex + direction
92+
93+ # allow top-down / down-top switching
94+ if nextIndex >= len (indexList ): # last element ogf list!
95+ self ._selectedMenuItemIndex = indexList [0 ]
96+ self ._selectedMenuItem = self .menus [self ._selectedMenu ][self ._selectedMenuItemIndex ]
97+ elif nextIndex < 0 :
98+ self ._selectedMenuItemIndex = indexList [- 1 ] # last element ogf list!
99+ self ._selectedMenuItem = self .menus [self ._selectedMenu ][self ._selectedMenuItemIndex ]
100+ else :
101+ self ._selectedMenuItemIndex = indexList [nextIndex ]
102+ self ._selectedMenuItem = self .menus [self ._selectedMenu ][self ._selectedMenuItemIndex ]
103+
104+ return self ._selectedMenuItem
105+
106+ def getSelectedItem (self ):
107+ if self ._selectedMenu in self .menus and self ._selectedMenuItemIndex >= 0 :
108+ return self .menus [self ._selectedMenu ][self ._selectedMenuItemIndex ]
109+
110+ print ("WARNING! NO SELECTED MENU ITEM FOUND!" )
111+ return None
112+
113+ def draw (self , menuKey = '' ):
58114 if menuKey in self .menus :
59- menuToDraw = self .menus [menuKey ]
60-
115+ self ._selectedMenu = menuKey
116+ elif menuKey == '' :
117+ if self ._selectedMenu == '' and 'main' in self .menus :
118+ self ._selectedMenu = 'main'
119+ else :
120+ raise Exception ("Error menu '" + menuKey + "' does not exist and there is no 'main' menu" )
121+
122+ menuToDraw = self .menus [self ._selectedMenu ]
123+
124+ if self ._selectedMenuItemIndex == - 1 :
125+ self .selectMenuItem (0 )
126+
127+ if menuToDraw is not None :
61128 #print fnt.size(resultText)
62129 menuRowsCount = len (menuToDraw )
63130 for i in range (menuRowsCount ):
@@ -66,7 +133,12 @@ def draw(self, menuKey):
66133 xPos = (self ._screen .get_width () / 2 )
67134 yPos = (self ._screen .get_height () / 30 ) * menuRowsCount
68135 txt = menuToDraw [i ]["text" ]
69- self ._screen .blit (fnt .render (txt , 1 , menuToDraw [i ]["color" ]), ( xPos - (fnt .size (txt )[0 ] / 2 ), yPos + (i * fontSize )))
136+
137+ color = menuToDraw [i ]["color" ]
138+ if i == self ._selectedMenuItemIndex :
139+ color = self .selectedColor
140+
141+ self ._screen .blit (fnt .render (txt , 1 , color ), ( xPos - (fnt .size (txt )[0 ] / 2 ), yPos + (i * fontSize )))
70142 else :
71143 raise Exception ("Error menu '" + menuKey + "' does not exist" )
72144
@@ -81,7 +153,9 @@ def draw(self, menuKey):
81153 iUi .addMenu ("main" , [
82154 {"rowName" :"title" , "selectable" :False , "font" :"MS Comic Sans" , "fontSize" :30 , "color" :(0 ,0 ,255 ), "text" :"UserInterfaceGenerator" },
83155 {"rowName" :"start" , "selectable" :True , "font" :"MS Comic Sans" , "fontSize" :30 , "color" :(0 ,0 ,255 ), "text" :"Start Game" },
84- {"rowName" :"q" , "selectable" :True , "font" :"MS Comic Sans" , "fontSize" :30 , "color" :(123 ,55 ,255 ), "text" :"QUIT" }
156+ {"rowName" :"info" , "selectable" :True , "font" :"MS Comic Sans" , "fontSize" :30 , "color" :(123 ,55 ,255 ), "text" :"1NF0$" },
157+ {"rowName" :"q" , "selectable" :True , "font" :"MS Comic Sans" , "fontSize" :30 , "color" :(123 ,55 ,255 ), "text" :"QUIT" },
158+ {"rowName" :"notes" , "selectable" :False , "font" :"MS Comic Sans" , "fontSize" :30 , "color" :(123 ,55 ,255 ), "text" :"sometext" },
85159 ]
86160 )
87161
0 commit comments