rewardItemsGrid.py (6378B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\loginRewards\rewardItemsGrid.py 2 import itertoolsext 3 from carbonui.primitives.layoutGrid import LayoutGrid 4 from carbonui import uiconst 5 from carbonui.uianimations import animations 6 from eve.client.script.ui.shared.loginRewards.rewardUiConst import SCROLL_ANIMATION 7 import mathext 8 9 class RewardItemsGrid(LayoutGrid): 10 default_name = 'rewardGrid' 11 12 def ApplyAttributes(self, attributes): 13 self.panelConst = attributes.panelConst 14 self.isScrolling = False 15 self.numAllEntries = attributes.numAllEntries 16 self.entries = {} 17 self.cells = {} 18 self.selectedIdx = 0 19 self.offset = attributes.offset or 0 20 LayoutGrid.ApplyAttributes(self, attributes) 21 22 def SetGridPosition(self, newPosValue, animateTime = SCROLL_ANIMATION): 23 allEntriesWidth = self.numAllEntries * self.panelConst.ENTRY_WIDTH 24 if newPosValue > self.GetMinPosValue() or newPosValue < -allEntriesWidth: 25 self._StopScrolling() 26 return False 27 if animateTime: 28 animations.MorphScalar(self, 'left', startVal=self.left, endVal=newPosValue, duration=animateTime, curveType=uiconst.ANIM_SMOOTH, callback=self._StopScrolling) 29 else: 30 self.left = newPosValue 31 self._StopScrolling() 32 return True 33 34 def GetMinPosValue(self): 35 return 10 + self.offset 36 37 def IsScrolling(self): 38 return self.isScrolling 39 40 def _StopScrolling(self, *args): 41 self.isScrolling = False 42 43 def GoToSelectedEntry(self, entryIdx, animateTime = SCROLL_ANIMATION, *args): 44 if self.isScrolling: 45 return 46 self.isScrolling = True 47 newEntryIdx = max(0, entryIdx - self.panelConst.SELECTED_CELL) 48 return self.GoToEntry(newEntryIdx, animateTime=animateTime) 49 50 def OnBrowse(self, direction, currentFirstVisibleEntry, *args): 51 if self.isScrolling: 52 return 53 self.isScrolling = True 54 newIdx = direction + currentFirstVisibleEntry 55 return self.GoToEntry(newIdx) 56 57 def GoToEntry(self, entryIdx, animateTime = SCROLL_ANIMATION): 58 if self.AreEntriesFewerThanMaxVisible(): 59 self.align = uiconst.CENTER 60 self._StopScrolling() 61 return 62 self.align = uiconst.CENTERLEFT 63 newEntryIdx = mathext.clamp(entryIdx, 0, self.numAllEntries - self.panelConst.NUM_VISIBLE_ITEMS) 64 cellAtIdx = self.cells.get(newEntryIdx, None) 65 if not cellAtIdx: 66 self._StopScrolling() 67 return 68 numLowerIdx = itertoolsext.count((i for i in self.cells.iterkeys() if i < newEntryIdx)) 69 newValue = -numLowerIdx * self.panelConst.ENTRY_WIDTH + self.offset 70 moved = self.SetGridPosition(newValue, animateTime=animateTime) 71 if moved: 72 return newEntryIdx 73 74 def AreEntriesFewerThanMaxVisible(self): 75 return self.numAllEntries < self.panelConst.NUM_VISIBLE_ITEMS 76 77 def GetEntriesWidth(self): 78 return len(self.entries) * self.panelConst.ENTRY_WIDTH 79 80 def GetNumEntries(self): 81 return self.numAllEntries 82 83 def LoadEntries(self, entryInfo): 84 self.entries.clear() 85 self.cells.clear() 86 self._LoadEntries(entryInfo) 87 88 def _LoadEntries(self, entryInfo): 89 for i, info in enumerate(entryInfo): 90 entryClass = info['entryClass'] 91 entry = entryClass(**info) 92 c = self.AddCell(cellObject=entry) 93 self.entries[i] = entry 94 self.cells[i] = c 95 96 def GetEntry(self, entryNum): 97 return self.entries.get(entryNum, None) 98 99 def SetEntryAsSelected(self, entryNum, withTransition = False): 100 animateTime = 0.75 if withTransition else 0 101 for eIdx, entry in self.entries.iteritems(): 102 entry.SetSelectedState(eIdx == entryNum, animateTime) 103 104 def UpdateEntryState(self, selectedIdx, updateKeyVal): 105 for eIdx, entry in self.entries.iteritems(): 106 entry.UpdateEntryState(eIdx, selectedIdx, updateKeyVal) 107 108 109 class RewardItemsGridCycle(RewardItemsGrid): 110 111 def ApplyAttributes(self, attributes): 112 panelConst = attributes.panelConst 113 attributes.columns += panelConst.NUM_VISIBLE_ITEMS + panelConst.SELECTED_CELL 114 attributes.numAllEntries += panelConst.NUM_VISIBLE_ITEMS + panelConst.SELECTED_CELL 115 RewardItemsGrid.ApplyAttributes(self, attributes) 116 117 def _GetMaxDay(self): 118 return self.numAllEntries 119 120 def _LoadEntries(self, entryInfo): 121 minIdx = min(self.entries) if self.entries else 0 122 for eachInfo in reversed(entryInfo): 123 if len(self.entries) >= self.panelConst.SELECTED_CELL: 124 break 125 entryClass = eachInfo['entryClass'] 126 entry = entryClass(**eachInfo) 127 c = self.AddCell(cellObject=entry) 128 minIdx -= 1 129 self.entries[minIdx] = entry 130 self.cells[minIdx] = c 131 132 RewardItemsGrid._LoadEntries(self, entryInfo) 133 maxIdx = max(self.entries) if self.entries else 0 134 for eachInfo in entryInfo: 135 entryClass = eachInfo['entryClass'] 136 entry = entryClass(**eachInfo) 137 c = self.AddCell(cellObject=entry) 138 maxIdx += 1 139 self.entries[maxIdx] = entry 140 self.cells[maxIdx] = c 141 if len(self.entries) >= self.numAllEntries: 142 break 143 144 145 class DayGrid(RewardItemsGrid): 146 default_name = 'dayGrid' 147 148 def LoadEntries(self, entryInfo): 149 self.entries.clear() 150 self.cells.clear() 151 self._LoadEntries(entryInfo) 152 153 def _LoadEntries(self, entryInfo): 154 for i, info in enumerate(entryInfo): 155 entryClass = info['entryClass'] 156 entry = entryClass(**info) 157 c = self.AddCell(cellObject=entry) 158 self.entries[i] = entry 159 self.cells[i] = c 160 161 def SetDayEntryAsSelected(self, entryNum, withTransition = False): 162 animateTime = 0.75 if withTransition else 0 163 for eIdx, entry in self.entries.iteritems(): 164 entry.SetDaySelectedState(eIdx == entryNum, animateTime) 165 166 def UpdateEntryState(self, selectedIdx, updateKeyVal): 167 for eIdx, entry in self.entries.iteritems(): 168 entry.UpdateEntryState(eIdx, selectedIdx, updateKeyVal)