link.py (5282B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\carbonui\control\link.py 2 import blue 3 import eveformat 4 from carbon.client.script.environment.AudioUtil import PlaySound 5 from carbon.common.script.util.commonutils import StripTags 6 from carbon.common.script.util.mathUtil import LtoI 7 from carbonui.util.bunch import Bunch 8 from carbon.common.script.util import commonutils 9 import carbonui.const as uiconst 10 from carbonui.primitives.container import Container 11 from carbonui.primitives.fill import Fill 12 from chroma import Color 13 14 class Link(Container): 15 isDragObject = True 16 17 def GetDragData(self, *args): 18 if getattr(self, 'url', None) and getattr(self, 'linkText', None): 19 entry = Bunch() 20 entry.__guid__ = 'TextLink' 21 entry.url = self.url 22 entry.displayText = self.linkText 23 return [entry] 24 25 @classmethod 26 def PrepareDrag(cls, dragContainer, dragSource, *args): 27 dragData = dragContainer.dragData[0] 28 displayText = eveformat.truncate_text_ignoring_tags(dragData.displayText, 24, '...') 29 from carbonui.control.label import LabelOverride as Label 30 label = Label(parent=dragContainer, text=commonutils.StripTags(displayText), align=uiconst.TOPLEFT, bold=True) 31 Fill(parent=dragContainer, color=(0, 0, 0, 0.3), padding=(-10, -2, -10, -2)) 32 dragContainer.width = label.textwidth 33 dragContainer.height = label.textheight 34 return (2, label.textheight) 35 36 def OnClick(self, *args): 37 if self.url: 38 PlaySound(uiconst.SOUND_BUTTON_CLICK) 39 self.ClickLink(self, self.url.replace('&', '&')) 40 41 def ClickLink(self, parent, URL): 42 linkUsed = self.ResolveInGameLink(parent, URL) 43 if not linkUsed: 44 self.UrlHandlerDelegate(parent, 'GoTo', URL) 45 46 def GetStandardLinkHint(self, url, **kwds): 47 link_service = sm.GetService('link') 48 if link_service.has_handler_for(url): 49 return link_service.get_hint(url) 50 51 def LoadTooltipPanel(self, tooltipPanel, *args): 52 pass 53 54 def GetLinkFormat(self, url, linkState = None, linkStyle = None): 55 linkState = linkState or uiconst.LINK_IDLE 56 linkStyle = linkStyle or uiconst.LINKSTYLE_REGULAR 57 color = sm.GetService('link').get_color(url, linkState, linkStyle) 58 fmt = Bunch() 59 fmt.color = LtoI(Color.from_any(color).as_argb_int32()) 60 fmt.underline = linkState in (uiconst.LINK_ACTIVE, uiconst.LINK_HOVER) 61 fmt.bold = sm.GetService('link').get_bold(url, linkStyle) 62 return fmt 63 64 def FormatLinkParams(self, params, linkState = None, linkStyle = None): 65 if 'priorUrlColor' not in params: 66 params.priorUrlColor = params.color 67 if 'priorUrlBold' not in params: 68 params.priorUrlBold = params.bold 69 if 'priorUrlItalic' not in params: 70 params.priorUrlItalic = params.italic 71 if 'priorUrlUnderline' not in params: 72 params.priorUrlUnderline = params.underline 73 linkFmt = self.GetLinkFormat(params.url, linkState, linkStyle) 74 if linkFmt.color is not None: 75 params.color = linkFmt.color 76 if linkFmt.underline is not None: 77 params.underline = linkFmt.underline 78 if linkFmt.bold is not None: 79 params.bold = linkFmt.bold 80 if linkFmt.italic is not None: 81 params.italic = linkFmt.italic 82 83 def ResolveInGameLink(self, parent, URL): 84 link_service = sm.GetService('link') 85 if link_service.has_handler_for(URL): 86 link_service.resolve(URL, self.GetLinkText(parent)) 87 return True 88 return False 89 90 def GetLinkText(self, parent): 91 from carbonui.control.label import LabelCore 92 if isinstance(parent, LabelCore): 93 drag_link_data = getattr(parent, '_dragLinkData', None) 94 link_text = drag_link_data[0] if drag_link_data is not None else None 95 else: 96 link_text = getattr(parent, 'linkText', None) 97 return StripTags(link_text) 98 99 def CanOpenBrowser(self, *args): 100 return False 101 102 def GetMenu(self): 103 if getattr(self, 'url', None) is None: 104 return [] 105 return self.GetLinkMenu(self, self.url) 106 107 def GetLinkMenu(self, parent, url): 108 link_service = sm.GetService('link') 109 if link_service.has_handler_for(url): 110 return link_service.get_menu(url) or [] 111 return [] 112 113 def ValidateURL(self, URL): 114 badURLs = self.GetBadUrls() 115 for badURL in badURLs: 116 if URL.startswith(badURL): 117 return False 118 119 return True 120 121 def GetBadUrls(self, *args): 122 return ['shellexec:', 'cmd:/'] 123 124 def CopyUrl(self, url): 125 blue.pyos.SetClipboardData(url) 126 127 def UrlHandlerDelegate(self, parent, funcName, args): 128 handler = getattr(self, 'URLHandler', None) 129 if not handler and getattr(parent, 'sr', None) and getattr(parent.sr, 'node', None): 130 handler = getattr(parent.sr.node, 'URLHandler', None) 131 if handler: 132 func = getattr(handler, funcName, None) 133 if func: 134 func(args) 135 return 136 self.ResolveInGameLink(parent, args)