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

searchinput.py (8394B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\control\searchinput.py
      2 import random
      3 import weakref
      4 from eve.client.script.ui.shared.userentry import User
      5 import carbonui.const as uiconst
      6 import uthread
      7 from carbon.common.script.util.timerstuff import AutoTimer
      8 from carbonui.control.singlelineedits.singleLineEditText import SingleLineEditText
      9 from carbonui.primitives.container import Container
     10 from carbonui.uicore import uicore
     11 from carbonui.util.various_unsorted import IsUnder, GetWindowAbove
     12 from eve.client.script.ui.control.entries.util import GetFromClass
     13 from eve.client.script.ui.control.eveScroll import Scroll
     14 from carbonui.decorative.menuUnderlay import MenuUnderlay
     15 from eve.client.script.ui.shared.userentry import User
     16 
     17 class SearchInput(SingleLineEditText):
     18     default_name = 'SearchInput'
     19     scrollPosition = None
     20     searchString = None
     21     searchResultMenu = None
     22     searchResultVisibleEntries = 5
     23     OnSearchEntrySelected = None
     24     blockSelection = False
     25     selectedNode = None
     26 
     27     def ApplyAttributes(self, attributes):
     28         SingleLineEditText.ApplyAttributes(self, attributes)
     29         self.OnChange = self.OnSearchInputChange
     30         self.GetSearchEntries = attributes.GetSearchEntries
     31         self.OnSearchEntrySelected = attributes.OnSearchEntrySelected
     32         self.CloseMenuCallback = attributes.OnResultMenuClosed
     33         self.allowBrowsing = attributes.Get('allowBrowsing', False)
     34         uicore.uilib.RegisterForTriuiEvents([uiconst.UI_MOUSEDOWN], self.OnGlobalMouseDown)
     35 
     36     def Close(self):
     37         self.OnSearchEntrySelected = None
     38         self.GetSearchEntries = None
     39         self.CloseMenuCallback = None
     40         self.OnInsert = None
     41         self.searchThread = None
     42         self.CloseResultMenu()
     43         super(SearchInput, self).Close()
     44 
     45     def HasResultMenu(self):
     46         if self.searchResultMenu:
     47             searchResultMenu = self.searchResultMenu()
     48             if searchResultMenu and not searchResultMenu.destroyed:
     49                 return True
     50         return False
     51 
     52     def CloseResultMenu(self):
     53         if self.searchResultMenu:
     54             searchResultMenu = self.searchResultMenu()
     55             if searchResultMenu and not searchResultMenu.destroyed:
     56                 self.scrollPosition = (self.searchString, searchResultMenu.searchScroll.GetScrollProportion())
     57                 searchResultMenu.Close()
     58             self.searchResultMenu = None
     59             if self.CloseMenuCallback:
     60                 self.CloseMenuCallback()
     61 
     62     def OnSearchInputChange(self, *args, **kwds):
     63         if not self.GetValue():
     64             self.searchThread = None
     65             self.SearchForData()
     66         else:
     67             self.searchThread = AutoTimer(280, self.SearchForData)
     68 
     69     def SearchForData(self):
     70         self.searchThread = None
     71         if self.GetSearchEntries:
     72             searchString = self.GetValue()
     73             self.searchString = searchString
     74             if self.isCharacterField and not self.ValidateSearchString(searchString):
     75                 return
     76             valid = self.GetSearchEntries(searchString)
     77             self.ShowSearchResult(valid)
     78 
     79     def ValidateSearchString(self, searchString):
     80         splitString = searchString.split()
     81         if any((len(i) >= 3 for i in splitString)):
     82             return True
     83         return False
     84 
     85     def ShowSearchResult(self, result):
     86         searchResultMenu = None
     87         if self.searchResultMenu:
     88             searchResultMenu = self.searchResultMenu()
     89             if searchResultMenu and searchResultMenu.destroyed:
     90                 searchResultMenu = None
     91         if not result:
     92             self.CloseResultMenu()
     93             return
     94         if not searchResultMenu:
     95             l, t, w, h = self.GetAbsolute()
     96             searchResultMenu = Container(name='resultMenuParent', parent=uicore.layer.utilmenu, pos=(l,
     97              t + h + 1,
     98              max(w, 200),
     99              300), align=uiconst.TOPLEFT, opacity=0.0)
    100             searchResultMenu.searchScroll = Scroll(parent=searchResultMenu, align=uiconst.TOALL, padding=1, multiSelect=0 if self.allowBrowsing else 0)
    101             if self.OnSearchEntrySelected:
    102                 searchResultMenu.searchScroll.OnSelectionChange = self.OnSelectionChanged
    103             MenuUnderlay(bgParent=searchResultMenu)
    104             self.searchResultMenu = weakref.ref(searchResultMenu)
    105             self.updateThread = AutoTimer(1, self.UpdateDropdownState)
    106             startHeight = 0
    107         else:
    108             startHeight = searchResultMenu.height
    109         if self.scrollPosition and self.searchString == self.scrollPosition[0]:
    110             scrollTo = self.scrollPosition[1]
    111         else:
    112             scrollTo = 0.0
    113         self.scrollTo = scrollTo
    114         searchResultMenu.searchScroll.LoadContent(contentList=result, scrollTo=scrollTo)
    115         for node in searchResultMenu.searchScroll.sr.nodes:
    116             node['OnClick'] = self.OnSearchEntrySelected
    117 
    118         visibleEntriesHeight = sum([ node.height for node in searchResultMenu.searchScroll.sr.nodes[:self.searchResultVisibleEntries] ])
    119         endHeight = min(searchResultMenu.searchScroll.GetContentHeight(), visibleEntriesHeight) + 4
    120         uicore.animations.MorphScalar(searchResultMenu, 'height', startVal=startHeight, endVal=endHeight, duration=0.25, callback=self.SetScrollPosition)
    121         uicore.animations.FadeTo(searchResultMenu, startVal=searchResultMenu.opacity, endVal=1.0, duration=0.5)
    122 
    123     def SetScrollPosition(self, *args, **kwds):
    124         if self.searchResultMenu:
    125             searchResultMenu = self.searchResultMenu()
    126             if searchResultMenu and not searchResultMenu.destroyed:
    127                 uthread.new(searchResultMenu.searchScroll.ScrollToProportion, self.scrollTo)
    128 
    129     def GetResultMenu(self):
    130         if self.searchResultMenu:
    131             searchResultMenu = self.searchResultMenu()
    132             if searchResultMenu and not searchResultMenu.destroyed:
    133                 return searchResultMenu
    134 
    135     def UpdateDropdownState(self):
    136         if self.destroyed:
    137             self.updateThread = None
    138             return
    139         if not (self.searchResultMenu and self.searchResultMenu()):
    140             self.updateThread = None
    141             return
    142         wnd = GetWindowAbove(self)
    143         activeWindow = uicore.registry.GetActive()
    144         if wnd and wnd is not activeWindow and activeWindow is not uicore.desktop:
    145             self.CloseResultMenu()
    146             return
    147 
    148     def GetSearchEntriesDemo(self, searchString):
    149         if not searchString:
    150             return []
    151         entries = []
    152         for i in xrange(random.choice([0,
    153          2,
    154          4,
    155          8,
    156          16])):
    157             entries.append(GetFromClass(User, {'charID': session.charid}))
    158 
    159         return entries
    160 
    161     def OnSelectionChanged(self, *args, **kwds):
    162         if self.allowBrowsing:
    163             self.selectedNode = args[0]
    164         elif not self.blockSelection and self.OnSearchEntrySelected:
    165             self.OnSearchEntrySelected(*args, **kwds)
    166 
    167     def OnMouseDown(self, *args, **kwds):
    168         SingleLineEditText.OnMouseDown(self, *args, **kwds)
    169         self.selectedNode = None
    170         uthread.new(self.SearchForData)
    171 
    172     def OnGlobalMouseDown(self, *args):
    173         if self.destroyed:
    174             return False
    175         self.blockSelection = False
    176         searchResultMenu = self.searchResultMenu
    177         if searchResultMenu and searchResultMenu():
    178             for layer in (uicore.layer.utilmenu, uicore.layer.menu):
    179                 if IsUnder(uicore.uilib.mouseOver, layer):
    180                     if uicore.uilib.rightbtn:
    181                         self.blockSelection = True
    182                     return True
    183 
    184             self.CloseResultMenu()
    185         return True
    186 
    187     def OnKeyDown(self, vkey, flag):
    188         if vkey in (uiconst.VK_DOWN, uiconst.VK_UP):
    189             if self.searchResultMenu:
    190                 searchResultMenu = self.searchResultMenu()
    191                 if searchResultMenu and not searchResultMenu.destroyed:
    192                     if vkey == uiconst.VK_UP:
    193                         searchResultMenu.searchScroll.OnUp()
    194                     else:
    195                         searchResultMenu.searchScroll.OnDown()
    196         if vkey == uiconst.VK_RETURN:
    197             if not self.selectedNode:
    198                 return
    199             self.OnSearchEntrySelected(self.selectedNode)
    200         SingleLineEditText.OnKeyDown(self, vkey, flag)