NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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