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)