page_selector.py (4483B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\theatersOfWar\campaigns\panels\page_selector.py 2 import eveicon 3 import gametime 4 import mathext 5 from carbonui import Align, PickState 6 from carbonui.control.buttonIcon import ButtonIcon 7 from carbonui.primitives.containerAutoSize import ContainerAutoSize 8 from carbonui.primitives.fill import Fill 9 from carbonui.primitives.frame import Frame 10 from carbonui.primitives.layoutGrid import LayoutGrid 11 from carbonui.primitives.line import Line 12 from carbonui.text.styles import TextBody 13 from carbonui.uiconst import FRAME_FILLED_SHADOW_CORNER9 14 from collections import OrderedDict 15 from signals import Signal 16 from carbonui.uicore import uicore 17 18 class PageSelector(ContainerAutoSize): 19 scroll_delay = 0.25 20 21 def ApplyAttributes(self, attributes): 22 self._last_scroll = None 23 super(PageSelector, self).ApplyAttributes(attributes) 24 self.on_page_selected = Signal('on_page_selected') 25 pages_dict = attributes.pages 26 self.current_selected_page_id = attributes.selected_page_id 27 self.page_info_by_id = OrderedDict() 28 self._construct_ui(pages_dict) 29 30 def _construct_ui(self, pages_dict): 31 grid = LayoutGrid(parent=self, columns=2, cellSpacing=(8, 8)) 32 Frame(bgParent=grid, frameConst=FRAME_FILLED_SHADOW_CORNER9, color=(0, 0, 0, 0.15), padLeft=-8) 33 grid.AddCell(Fill(align=Align.TOPLEFT, width=0, height=0, opacity=0.0)) 34 up_icon = ButtonIcon(parent=grid, pos=(0, 0, 16, 16), texturePath=eveicon.caret_up, align=Align.CENTER, func=self.browse, args=(-1,)) 35 for page_id, page_name in pages_dict.iteritems(): 36 row = grid.AddRow(pickState=PickState.ON) 37 TextBody(parent=row, align=Align.CENTERRIGHT, text=page_name) 38 left = (up_icon.width - 4) / 2 39 Line(parent=row, weight=4, align=Align.TOLEFT, opacity=0.75, left=left) 40 row.opacity = 0.5 41 page_info = PageInfo(row, page_id) 42 self.page_info_by_id[page_id] = page_info 43 row.OnClick = lambda p_id = page_id: self.on_row_clicked(p_id) 44 45 grid.AddCell(Fill(align=Align.TOPLEFT, width=0, height=0, opacity=0.0)) 46 down_icon = ButtonIcon(parent=grid, pos=(0, 0, 16, 16), texturePath=eveicon.caret_down, align=Align.CENTER, func=self.browse, args=(1,)) 47 self.show_page_page_as_selected(self.current_selected_page_id) 48 49 def on_row_clicked(self, page_id): 50 self._do_select_page(page_id) 51 52 def browse(self, direction = 1): 53 previous_page_id = self.current_selected_page_id 54 page_keys = self.page_info_by_id.keys() 55 try: 56 current_page_idx = self.get_idx_for_page_id(previous_page_id) 57 new_page_idx = mathext.clamp(current_page_idx + direction, 0, len(self.page_info_by_id) - 1) 58 new_page_id = self.page_info_by_id.values()[new_page_idx].page_id 59 except ValueError: 60 new_page_id = page_keys[0] 61 62 self._do_select_page(new_page_id) 63 64 def _do_select_page(self, new_page_id): 65 previous_page_id = self.current_selected_page_id 66 if new_page_id not in self.page_info_by_id: 67 new_page_id = self.page_info_by_id.keys()[0] 68 self.show_page_page_as_selected(new_page_id) 69 self.on_page_selected(new_page_id, previous_page_id) 70 71 def show_page_page_as_selected(self, page_id): 72 self.current_selected_page_id = page_id 73 for p in self.page_info_by_id.itervalues(): 74 if p.page_id == page_id: 75 p.row.opacity = 1.0 76 else: 77 p.row.opacity = 0.5 78 79 def get_idx_for_page_id(self, page_id): 80 page_info = self.page_info_by_id.get(page_id, None) 81 if page_info is None: 82 return 0 83 return self.page_info_by_id.values().index(page_info) 84 85 def is_page_in_selector(self, page_id): 86 return page_id in self.page_info_by_id 87 88 def on_mouse_wheel(self, *args): 89 if self._last_scroll is not None: 90 diff = gametime.GetSecondsSinceWallclockTime(self._last_scroll) 91 if diff < self.scroll_delay: 92 return 93 self._last_scroll = gametime.GetWallclockTimeNow() 94 if uicore.uilib.dz >= 0: 95 direction = -1 96 else: 97 direction = 1 98 self.browse(direction) 99 100 101 class PageInfo(object): 102 103 def __init__(self, row, page_id): 104 self.row = row 105 self.page_id = page_id