Advertisement
Guest User

uichat.py

a guest
Nov 1st, 2021
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 45.43 KB | None | 0 0
  1. import ui
  2. import grp
  3. import chat
  4. import wndMgr
  5. import net
  6. import app
  7. import ime
  8. import localeInfo
  9. import colorInfo
  10. import constInfo
  11. import systemSetting
  12. import player
  13.  
  14. if app.ENABLE_CHATTING_WINDOW_RENEWAL:
  15.     import os
  16.     import uiCommon
  17.     import uiScriptLocale
  18.     import cPickle as pickle
  19.     import player
  20.  
  21. ENABLE_CHAT_COMMAND = True
  22. ENABLE_LAST_SENTENCE_STACK = True
  23. ENABLE_INSULT_CHECK = True
  24.  
  25. if localeInfo.IsHONGKONG():
  26.     ENABLE_LAST_SENTENCE_STACK = True
  27.  
  28. if localeInfo.IsEUROPE():
  29.     ENABLE_CHAT_COMMAND = False
  30.  
  31. if localeInfo.IsCANADA():
  32.     ENABLE_LAST_SENTENCE_STACK = False
  33.  
  34. chatInputSetList = []
  35. def InsertChatInputSetWindow(wnd):
  36.     global chatInputSetList
  37.     chatInputSetList.append(wnd)
  38. def RefreshChatMode():
  39.     global chatInputSetList
  40.     map(lambda wnd:wnd.OnRefreshChatMode(), chatInputSetList)
  41. def DestroyChatInputSetWindow():
  42.     global chatInputSetList
  43.     chatInputSetList = []
  44.  
  45. if app.ENABLE_CHATTING_WINDOW_RENEWAL:
  46.     CHECK_BOX_X_POS = 145
  47.  
  48.     OPTION_CHECKBOX_TALKING = 1
  49.     OPTION_CHECKBOX_PARTY = 2
  50.     OPTION_CHECKBOX_GUILD = 3
  51.     OPTION_CHECKBOX_SHOUT = 4
  52.     OPTION_CHECKBOX_INFO = 5
  53.     OPTION_CHECKBOX_NOTICE = 6
  54.     OPTION_CHECKBOX_DICE = 7
  55.     OPTION_CHECKBOX_EXP_INFO = 8
  56.     OPTION_CHECKBOX_ITEM_INFO = 9
  57.     OPTION_CHECKBOX_MONEY_INFO = 10
  58.  
  59.     OPTION_CHECKBOX_MODE = {
  60.         chat.CHAT_TYPE_TALKING : OPTION_CHECKBOX_TALKING,
  61.         chat.CHAT_TYPE_INFO : OPTION_CHECKBOX_INFO,
  62.         chat.CHAT_TYPE_NOTICE : OPTION_CHECKBOX_NOTICE,
  63.         chat.CHAT_TYPE_PARTY : OPTION_CHECKBOX_PARTY,
  64.         chat.CHAT_TYPE_GUILD : OPTION_CHECKBOX_GUILD,
  65.         chat.CHAT_TYPE_SHOUT : OPTION_CHECKBOX_SHOUT,
  66.         chat.CHAT_TYPE_DICE_INFO : OPTION_CHECKBOX_DICE,
  67.         chat.CHAT_TYPE_EXP_INFO : OPTION_CHECKBOX_EXP_INFO,
  68.         chat.CHAT_TYPE_ITEM_INFO : OPTION_CHECKBOX_ITEM_INFO,
  69.         chat.CHAT_TYPE_MONEY_INFO : OPTION_CHECKBOX_MONEY_INFO,
  70.     }
  71.  
  72.     ## ChatSettingWindow
  73.     class ChatSettingWindow(ui.ScriptWindow):
  74.         __author__ = "Owsap"
  75.         __copyright__ = "Copyright 2021, Owsap Productions"
  76.  
  77.         class MouseReflector(ui.Window):
  78.             def __init__(self, parent):
  79.                 ui.Window.__init__(self)
  80.                 self.SetParent(parent)
  81.                 self.AddFlag("not_pick")
  82.                 self.width = self.height = 0
  83.                 self.isDown = False
  84.  
  85.             def __del__(self):
  86.                 ui.Window.__del__(self)
  87.  
  88.             def Down(self):
  89.                 self.isDown = True
  90.  
  91.             def Up(self):
  92.                 self.isDown = False
  93.  
  94.             def OnRender(self):
  95.                 if self.isDown:
  96.                     grp.SetColor(ui.WHITE_COLOR)
  97.                 else:
  98.                     grp.SetColor(ui.HALF_WHITE_COLOR)
  99.  
  100.                 x, y = self.GetGlobalPosition()
  101.                 grp.RenderBar(x + 2, y + 2, self.GetWidth() - 4, self.GetHeight() - 4)
  102.  
  103.         class CheckBox(ui.ImageBox):
  104.             def __init__(self, parent, x, y, event, filename = "d:/ymir work/ui/chat/chattingoption_check_box_off.sub"):
  105.                 ui.ImageBox.__init__(self)
  106.                 self.SetParent(parent)
  107.                 self.SetPosition(x, y)
  108.                 self.LoadImage(filename)
  109.  
  110.                 self.mouseReflector = parent.MouseReflector(self)
  111.                 self.mouseReflector.SetSize(self.GetWidth(), self.GetHeight())
  112.  
  113.                 image = ui.MakeImageBox(self, "d:/ymir work/ui/public/check_image.sub", 0, 0)
  114.                 image.AddFlag("not_pick")
  115.                 image.SetWindowHorizontalAlignCenter()
  116.                 image.SetWindowVerticalAlignCenter()
  117.                 image.Hide()
  118.  
  119.                 self.check = False
  120.                 self.enable = True
  121.                 self.image = image
  122.                 self.event = event
  123.                 self.Show()
  124.  
  125.                 self.mouseReflector.UpdateRect()
  126.  
  127.             def __del__(self):
  128.                 ui.ImageBox.__del__(self)
  129.  
  130.             def GetCheck(self):
  131.                 return self.check
  132.  
  133.             def SetCheck(self, flag):
  134.                 if flag:
  135.                     self.check = True
  136.                     self.image.Show()
  137.                 else:
  138.                     self.check = False
  139.                     self.image.Hide()
  140.  
  141.             def Disable(self):
  142.                 self.enable = False
  143.  
  144.             def OnMouseOverIn(self):
  145.                 if not self.enable:
  146.                     return
  147.                 self.mouseReflector.Show()
  148.  
  149.             def OnMouseOverOut(self):
  150.                 if not self.enable:
  151.                     return
  152.                 self.mouseReflector.Hide()
  153.  
  154.             def OnMouseLeftButtonDown(self):
  155.                 if not self.enable:
  156.                     return
  157.                 self.mouseReflector.Down()
  158.  
  159.             def OnMouseLeftButtonUp(self):
  160.                 if not self.enable:
  161.                     return
  162.                 self.mouseReflector.Up()
  163.                 self.event()
  164.  
  165.         def __init__(self, parent):
  166.             ui.ScriptWindow.__init__(self)
  167.             self.isLoaded = False
  168.  
  169.             self.parent = parent
  170.             self.questionDialog = None
  171.  
  172.             self.checkBoxSlotDict = {}
  173.             self.tmpCheckBoxSettingDict = {}
  174.  
  175.             self.__LoadWindow()
  176.  
  177.         def __del__(self):
  178.             ui.ScriptWindow.__del__(self)
  179.             self.isLoaded = False
  180.             self.parent = None
  181.             self.questionDialog = None
  182.             self.checkBoxSlotDict = {}
  183.             self.tmpCheckBoxSettingDict = {}
  184.  
  185.         def __LoadWindow(self):
  186.             if self.isLoaded:
  187.                 return
  188.  
  189.             self.isLoaded = 1
  190.  
  191.             try:
  192.                 pyScrLoader = ui.PythonScriptLoader()
  193.                 pyScrLoader.LoadScriptFile(self, "UIScript/ChatSettingWindow.py")
  194.             except:
  195.                 import exception
  196.                 exception.Abort("ChatSettingWindow.LoadWindow.LoadScript")
  197.  
  198.             try:
  199.                 self.__BindObject()
  200.             except:
  201.                 import exception
  202.                 exception.Abort("ChatSettingWindow.LoadWindow.BindObject")
  203.  
  204.             try:
  205.                 self.__CreateObject()
  206.             except:
  207.                 import exception
  208.                 exception.Abort("ChatSettingWindow.LoadWindow.CreateObject")
  209.  
  210.             try:
  211.                 self.__LoadChattingOptionFile()
  212.             except:
  213.                 self.__SaveDefault()
  214.  
  215.         def __BindObject(self):
  216.             self.GetChild("board").SetCloseEvent(ui.__mem_func__(self.Close))
  217.  
  218.             self.resetBtn = self.GetChild("reset_button")
  219.             self.resetBtn.SetEvent(ui.__mem_func__(self.__OnClickPopUpSetting), localeInfo.CHATTING_SETTING_CLEAR_QUESTION)
  220.  
  221.             self.saveBtn = self.GetChild("save_button")
  222.             self.saveBtn.SetEvent(ui.__mem_func__(self.__OnClickSave))
  223.  
  224.             self.cancelBtn = self.GetChild("cancle_button")
  225.             self.cancelBtn.SetEvent(ui.__mem_func__(self.Close))
  226.  
  227.         def __CreateObject(self):
  228.             for key in xrange(1, len(OPTION_CHECKBOX_MODE) + 1):
  229.                 event = lambda index = key : ui.__mem_func__(self.SetCurrentChatOption)(index)
  230.  
  231.                 # chatting_setting_talking_bg.y + (31 * y)
  232.                 yPos = 64 + (31 * 0)
  233.                 if key >= OPTION_CHECKBOX_DICE:
  234.                     yPos = 64 + (31 * 1)
  235.                 if key >= OPTION_CHECKBOX_EXP_INFO:
  236.                     yPos = 64 + (31 * 2)
  237.  
  238.                 self.checkBoxSlotDict[key] = self.CheckBox(self, CHECK_BOX_X_POS, yPos + (18 * (key - 1)), event)
  239.  
  240.         def __OnClickSave(self):
  241.             self.__SaveFile()
  242.  
  243.             if self.parent:
  244.                 self.parent.RefreshChatWindow()
  245.  
  246.             self.Close()
  247.  
  248.         def __GetChattingFile(self):
  249.             # Create the UserData/chatting path if it doesn't exist.
  250.             path = ["UserData", "chatting"]
  251.             try:
  252.                 if not os.path.exists(os.getcwd() + os.sep + path[0] + os.sep + path[1]):
  253.                     os.makedirs(os.getcwd() + os.sep + "UserData" + os.sep + "chatting")
  254.             except WindowsError as error: pass
  255.             return "%s/%s/%s" % (path[0], path[1], player.GetName()) # -_-'
  256.  
  257.         def __LoadChattingOptionFile(self):
  258.             load = False
  259.             try:
  260.                 fileName = self.__GetChattingFile()
  261.                 file = open(fileName)
  262.                 try:
  263.                     load = True
  264.                     self.tmpCheckBoxSettingDict = pickle.load(file)
  265.                 except (ValueError, EOFError, pickle.PicklingError, pickle.UnpicklingError): pass
  266.             except IOError: pass
  267.  
  268.             for key in xrange(1, len(OPTION_CHECKBOX_MODE) + 1):
  269.                 if not load:
  270.                     # Default, always enable and add to dict.
  271.                     value = True
  272.                     self.tmpCheckBoxSettingDict[key] = True
  273.                 else:
  274.                     value = self.tmpCheckBoxSettingDict[key]
  275.                 self.checkBoxSlotDict[key].SetCheck(value)
  276.  
  277.             if not load:
  278.                 self.__SaveDefault()
  279.  
  280.         def __SaveFile(self):
  281.             if not self.tmpCheckBoxSettingDict:
  282.                 return
  283.  
  284.             try:
  285.                 fileName = self.__GetChattingFile()
  286.                 file = open(fileName, 'wb')
  287.                 pickle.dump(self.tmpCheckBoxSettingDict, file)
  288.             except IOError:
  289.                 return
  290.  
  291.         def __SaveDefault(self):
  292.             for key in xrange(1, len(OPTION_CHECKBOX_MODE) + 1):
  293.                 self.tmpCheckBoxSettingDict[key] = True
  294.  
  295.             try:
  296.                 fileName = self.__GetChattingFile()
  297.                 file = open(fileName, 'wb')
  298.                 pickle.dump(self.tmpCheckBoxSettingDict, file)
  299.             except IOError:
  300.                 return
  301.  
  302.         def __OnClickPopUpSetting(self, text):
  303.             questionDialog = uiCommon.QuestionDialog()
  304.             questionDialog.SetText(text)
  305.             questionDialog.SetAcceptEvent(ui.__mem_func__(self.__QuestionPopupAccept))
  306.             questionDialog.SetCancelEvent(ui.__mem_func__(self.__QuestionPopupCancle))
  307.             questionDialog.Open()
  308.             self.questionDialog = questionDialog
  309.  
  310.         def __QuestionPopupAccept(self):
  311.             if not self.questionDialog:
  312.                 return
  313.  
  314.             self.__SaveDefault()
  315.  
  316.             if self.parent:
  317.                 self.parent.RefreshChatWindow()
  318.  
  319.             self.__QuestionPopupCancle()
  320.             self.Close()
  321.  
  322.         def __QuestionPopupCancle(self):
  323.             self.questionDialog.Close()
  324.             self.questionDialog = None
  325.  
  326.         def SetCurrentChatOption(self, index):
  327.             value = False
  328.             if not self.checkBoxSlotDict[index].GetCheck():
  329.                 value = True
  330.  
  331.             self.checkBoxSlotDict[index].SetCheck(value)
  332.             self.tmpCheckBoxSettingDict.update({index: value})
  333.  
  334.         def GetChatModeSetting(self, mode):
  335.             try:
  336.                 value = OPTION_CHECKBOX_MODE[mode]
  337.                 return self.tmpCheckBoxSettingDict[value]
  338.             except KeyError:
  339.                 return True
  340.  
  341.         def OnPressEscapeKey(self):
  342.             self.Close()
  343.             return True
  344.  
  345.         def Open(self):
  346.             if not self.isLoaded:
  347.                 self.__LoadWindow()
  348.  
  349.             try:
  350.                 self.__LoadChattingOptionFile()
  351.             except:
  352.                 self.__SaveDefault()
  353.  
  354.             self.Show()
  355.  
  356.         def Close(self):
  357.             if self.questionDialog:
  358.                 self.questionDialog.Close()
  359.  
  360.             self.Hide()
  361.  
  362. ## ChatModeButton
  363. class ChatModeButton(ui.Window):
  364.  
  365.     OUTLINE_COLOR = grp.GenerateColor(1.0, 1.0, 1.0, 1.0)
  366.     OVER_COLOR = grp.GenerateColor(1.0, 1.0, 1.0, 0.3)
  367.     BUTTON_STATE_UP = 0
  368.     BUTTON_STATE_OVER = 1
  369.     BUTTON_STATE_DOWN = 2
  370.  
  371.     def __init__(self):
  372.         ui.Window.__init__(self)
  373.         self.state = None
  374.         self.buttonText = None
  375.         self.event = None
  376.         self.SetWindowName("ChatModeButton")
  377.  
  378.         net.EnableChatInsultFilter(ENABLE_INSULT_CHECK)
  379.  
  380.     def __del__(self):
  381.         ui.Window.__del__(self)
  382.  
  383.     def SAFE_SetEvent(self, event):
  384.         self.event=ui.__mem_func__(event)
  385.  
  386.     def SetText(self, text):
  387.         if None == self.buttonText:
  388.             textLine = ui.TextLine()
  389.             textLine.SetParent(self)
  390.             textLine.SetWindowHorizontalAlignCenter()
  391.             textLine.SetWindowVerticalAlignCenter()
  392.             textLine.SetVerticalAlignCenter()
  393.             textLine.SetHorizontalAlignCenter()
  394.             textLine.SetPackedFontColor(self.OUTLINE_COLOR)
  395.             textLine.Show()
  396.             self.buttonText = textLine
  397.  
  398.         self.buttonText.SetText(text)
  399.  
  400.     def SetSize(self, width, height):
  401.         self.width = width
  402.         self.height = height
  403.         ui.Window.SetSize(self, width, height)
  404.  
  405.     def OnMouseOverIn(self):
  406.         self.state = self.BUTTON_STATE_OVER
  407.  
  408.     def OnMouseOverOut(self):
  409.         self.state = self.BUTTON_STATE_UP
  410.  
  411.     def OnMouseLeftButtonDown(self):
  412.         self.state = self.BUTTON_STATE_DOWN
  413.  
  414.     def OnMouseLeftButtonUp(self):
  415.         self.state = self.BUTTON_STATE_UP
  416.         if self.IsIn():
  417.             self.state = self.BUTTON_STATE_OVER
  418.  
  419.         if None != self.event:
  420.             self.event()
  421.  
  422.     def OnRender(self):
  423.  
  424.         (x, y) = self.GetGlobalPosition()
  425.  
  426.         grp.SetColor(self.OUTLINE_COLOR)
  427.         grp.RenderRoundBox(x, y, self.width, self.height)
  428.  
  429.         if self.state >= self.BUTTON_STATE_OVER:
  430.             grp.RenderRoundBox(x+1, y, self.width-2, self.height)
  431.             grp.RenderRoundBox(x, y+1, self.width, self.height-2)
  432.  
  433.             if self.BUTTON_STATE_DOWN == self.state:
  434.                 grp.SetColor(self.OVER_COLOR)
  435.                 grp.RenderBar(x+1, y+1, self.width-2, self.height-2)
  436.  
  437. ## ChatLine
  438. class ChatLine(ui.EditLine):
  439.  
  440.     CHAT_MODE_NAME = {  chat.CHAT_TYPE_TALKING : localeInfo.CHAT_NORMAL,
  441.                         chat.CHAT_TYPE_PARTY : localeInfo.CHAT_PARTY,
  442.                         chat.CHAT_TYPE_GUILD : localeInfo.CHAT_GUILD,
  443.                         chat.CHAT_TYPE_SHOUT : localeInfo.CHAT_SHOUT, }
  444.  
  445.     def __init__(self):
  446.         ui.EditLine.__init__(self)
  447.         self.SetWindowName("Chat Line")
  448.         self.lastShoutTime = 0
  449.         self.eventEscape = lambda *arg: None
  450.         self.eventReturn = lambda *arg: None
  451.         self.eventTab = None
  452.         self.chatMode = chat.CHAT_TYPE_TALKING
  453.         self.bCodePage = True
  454.  
  455.         self.overTextLine = ui.TextLine()
  456.         self.overTextLine.SetParent(self)
  457.         self.overTextLine.SetPosition(-1, 0)
  458.         self.overTextLine.SetFontColor(1.0, 1.0, 0.0)
  459.         self.overTextLine.SetOutline()
  460.         self.overTextLine.Hide()
  461.  
  462.         self.lastSentenceStack = []
  463.         self.lastSentencePos = 0
  464.  
  465.     def SetChatMode(self, mode):
  466.         self.chatMode = mode
  467.  
  468.     def GetChatMode(self):
  469.         return self.chatMode
  470.  
  471.     def ChangeChatMode(self):
  472.         if chat.CHAT_TYPE_TALKING == self.GetChatMode():
  473.             self.SetChatMode(chat.CHAT_TYPE_PARTY)
  474.             self.SetText("#")
  475.             self.SetEndPosition()
  476.  
  477.         elif chat.CHAT_TYPE_PARTY == self.GetChatMode():
  478.             self.SetChatMode(chat.CHAT_TYPE_GUILD)
  479.             self.SetText("%")
  480.             self.SetEndPosition()
  481.  
  482.         elif chat.CHAT_TYPE_GUILD == self.GetChatMode():
  483.             self.SetChatMode(chat.CHAT_TYPE_SHOUT)
  484.             self.SetText("!")
  485.             self.SetEndPosition()
  486.  
  487.         elif chat.CHAT_TYPE_SHOUT == self.GetChatMode():
  488.             self.SetChatMode(chat.CHAT_TYPE_TALKING)
  489.             self.SetText("")
  490.  
  491.         self.__CheckChatMark()
  492.  
  493.     def GetCurrentChatModeName(self):
  494.         try:
  495.             return self.CHAT_MODE_NAME[self.chatMode]
  496.         except:
  497.             import exception
  498.             exception.Abort("ChatLine.GetCurrentChatModeName")
  499.  
  500.     def SAFE_SetEscapeEvent(self, event):
  501.         self.eventReturn = ui.__mem_func__(event)
  502.  
  503.     def SAFE_SetReturnEvent(self, event):
  504.         self.eventEscape = ui.__mem_func__(event)
  505.  
  506.     def SAFE_SetTabEvent(self, event):
  507.         self.eventTab = ui.__mem_func__(event)
  508.  
  509.     def SetTabEvent(self, event):
  510.         self.eventTab = event
  511.  
  512.     def OpenChat(self):
  513.         self.SetFocus()
  514.         self.__ResetChat()
  515.  
  516.     def __ClearChat(self):
  517.         self.SetText("")
  518.         self.lastSentencePos = 0
  519.  
  520.     def __ResetChat(self):
  521.         if chat.CHAT_TYPE_PARTY == self.GetChatMode():
  522.             self.SetText("#")
  523.             self.SetEndPosition()
  524.         elif chat.CHAT_TYPE_GUILD == self.GetChatMode():
  525.             self.SetText("%")
  526.             self.SetEndPosition()
  527.         elif chat.CHAT_TYPE_SHOUT == self.GetChatMode():
  528.             self.SetText("!")
  529.             self.SetEndPosition()
  530.         else:
  531.             self.__ClearChat()
  532.  
  533.         self.__CheckChatMark()
  534.  
  535.  
  536.     def __SendChatPacket(self, text, type):
  537.         if text == "(!realizare_title_1!)":
  538.             return
  539.  
  540.         cuvinte = text.split(" ")
  541.         text2 = ""
  542.         for index in range(len(cuvinte)):
  543.             if "www." in cuvinte[index] or "http:" in cuvinte[index] or "https:" in cuvinte[index]:
  544.                 tmp = cuvinte[index]
  545.                 cuvinte[index] = "|cFF00C0FC|h|Hlink:" + tmp + "|h"+ tmp + "|h"
  546.  
  547.             text2 += " "+cuvinte[index]
  548.            
  549.         if net.IsChatInsultIn(text2[1:]):
  550.             chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.CHAT_INSULT_STRING)
  551.         else:
  552.             net.SendChatPacket(text2[1:], type)
  553.  
  554.     def __SendPartyChatPacket(self, text):
  555.  
  556.         if 1 == len(text):
  557.             self.RunCloseEvent()
  558.             return
  559.  
  560.         self.__SendChatPacket(text[1:], chat.CHAT_TYPE_PARTY)
  561.         self.__ResetChat()
  562.  
  563.     def __SendGuildChatPacket(self, text):
  564.  
  565.         if 1 == len(text):
  566.             self.RunCloseEvent()
  567.             return
  568.  
  569.         self.__SendChatPacket(text[1:], chat.CHAT_TYPE_GUILD)
  570.         self.__ResetChat()
  571.  
  572.     def __SendShoutChatPacket(self, text):
  573.  
  574.         if 1 == len(text):
  575.             self.RunCloseEvent()
  576.             return
  577.  
  578.         if app.GetTime() < self.lastShoutTime + 15:
  579.             chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.CHAT_SHOUT_LIMIT)
  580.             self.__ResetChat()
  581.             return
  582.  
  583.         self.__SendChatPacket(text[1:], chat.CHAT_TYPE_SHOUT)
  584.         self.__ResetChat()
  585.  
  586.         self.lastShoutTime = app.GetTime()
  587.  
  588.     def __SendTalkingChatPacket(self, text):
  589.         self.__SendChatPacket(text, chat.CHAT_TYPE_TALKING)
  590.         self.__ResetChat()
  591.  
  592.     def OnIMETab(self):
  593.         #if None != self.eventTab:
  594.         #   self.eventTab()
  595.         #return True
  596.         return False
  597.  
  598.     def OnIMEUpdate(self):
  599.         ui.EditLine.OnIMEUpdate(self)
  600.         self.__CheckChatMark()
  601.  
  602.     def __CheckChatMark(self):
  603.  
  604.         self.overTextLine.Hide()
  605.  
  606.         text = self.GetText()
  607.         if len(text) > 0:
  608.             if '#' == text[0]:
  609.                 self.overTextLine.SetText("#")
  610.                 self.overTextLine.Show()
  611.             elif '%' == text[0]:
  612.                 self.overTextLine.SetText("%")
  613.                 self.overTextLine.Show()
  614.             elif '!' == text[0]:
  615.                 self.overTextLine.SetText("!")
  616.                 self.overTextLine.Show()
  617.  
  618.     def OnIMEKeyDown(self, key):
  619.         # LAST_SENTENCE_STACK
  620.         if app.VK_UP == key:
  621.             self.__PrevLastSentenceStack()
  622.             return True
  623.  
  624.         if app.VK_DOWN == key:
  625.             self.__NextLastSentenceStack()
  626.             return True
  627.         # END_OF_LAST_SENTENCE_STACK
  628.  
  629.         ui.EditLine.OnIMEKeyDown(self, key)
  630.  
  631.     # LAST_SENTENCE_STACK
  632.     def __PrevLastSentenceStack(self):
  633.         global ENABLE_LAST_SENTENCE_STACK
  634.         if not ENABLE_LAST_SENTENCE_STACK:
  635.             return
  636.  
  637.         if self.lastSentenceStack and self.lastSentencePos < len(self.lastSentenceStack):
  638.             self.lastSentencePos += 1
  639.             lastSentence = self.lastSentenceStack[-self.lastSentencePos]
  640.             self.SetText(lastSentence)
  641.             self.SetEndPosition()
  642.  
  643.     def __NextLastSentenceStack(self):
  644.         global ENABLE_LAST_SENTENCE_STACK
  645.         if not ENABLE_LAST_SENTENCE_STACK:
  646.             return
  647.  
  648.         if self.lastSentenceStack and self.lastSentencePos > 1:
  649.             self.lastSentencePos -= 1
  650.             lastSentence = self.lastSentenceStack[-self.lastSentencePos]
  651.             self.SetText(lastSentence)
  652.             self.SetEndPosition()
  653.  
  654.     def __PushLastSentenceStack(self, text):
  655.         global ENABLE_LAST_SENTENCE_STACK
  656.         if not ENABLE_LAST_SENTENCE_STACK:
  657.             return
  658.  
  659.         if len(text) <= 0:
  660.             return
  661.  
  662.         LAST_SENTENCE_STACK_SIZE = 32
  663.         if len(self.lastSentenceStack) > LAST_SENTENCE_STACK_SIZE:
  664.             self.lastSentenceStack.pop(0)
  665.  
  666.         self.lastSentenceStack.append(text)
  667.     # END_OF_LAST_SENTENCE_STACK
  668.  
  669.     def OnIMEReturn(self):
  670.         text = self.GetText()
  671.         textLen=len(text)
  672.  
  673.         # LAST_SENTENCE_STACK
  674.         self.__PushLastSentenceStack(text)
  675.         # END_OF_LAST_SENTENCE_STACK
  676.  
  677.         textSpaceCount=text.count(' ')
  678.  
  679.         if (textLen > 0) and (textLen != textSpaceCount):
  680.             if '#' == text[0]:
  681.                 self.__SendPartyChatPacket(text)
  682.             elif '%' == text[0]:
  683.                 self.__SendGuildChatPacket(text)
  684.             elif '!' == text[0]:
  685.                 self.__SendShoutChatPacket(text)
  686.             else:
  687.                 self.__SendTalkingChatPacket(text)
  688.         else:
  689.             self.__ClearChat()
  690.             self.eventReturn()
  691.  
  692.         return True
  693.  
  694.     def OnPressEscapeKey(self):
  695.         self.__ClearChat()
  696.         self.eventEscape()
  697.         return True
  698.  
  699.     def RunCloseEvent(self):
  700.         self.eventEscape()
  701.  
  702.     def BindInterface(self, interface):
  703.         self.interface = interface
  704.  
  705.     def OnMouseLeftButtonDown(self):
  706.         hyperlink = ui.GetHyperlink()
  707.         if hyperlink:
  708.             if app.IsPressed(app.DIK_LALT):
  709.                 link = chat.GetLinkFromHyperlink(hyperlink)
  710.                 ime.PasteString(link)
  711.             else:
  712.                 self.interface.MakeHyperlinkTooltip(hyperlink)
  713.         else:
  714.             ui.EditLine.OnMouseLeftButtonDown(self)
  715.  
  716. class ChatInputSet(ui.Window):
  717.  
  718.     CHAT_OUTLINE_COLOR = grp.GenerateColor(1.0, 1.0, 1.0, 1.0)
  719.  
  720.     def __init__(self):
  721.         ui.Window.__init__(self)
  722.         self.SetWindowName("ChatInputSet")
  723.  
  724.         InsertChatInputSetWindow(self)
  725.         self.__Create()
  726.  
  727.     def __del__(self):
  728.         ui.Window.__del__(self)
  729.  
  730.     def __Create(self):
  731.         chatModeButton = ChatModeButton()
  732.         chatModeButton.SetParent(self)
  733.         chatModeButton.SetSize(40, 17)
  734.         chatModeButton.SetText(localeInfo.CHAT_NORMAL)
  735.         chatModeButton.SetPosition(7, 2)
  736.         chatModeButton.SAFE_SetEvent(self.OnChangeChatMode)
  737.         self.chatModeButton = chatModeButton
  738.  
  739.         chatLine = ChatLine()
  740.         chatLine.SetParent(self)
  741.         chatLine.SetMax(512)
  742.         chatLine.SetUserMax(76)
  743.         chatLine.SetText("")
  744.         chatLine.SAFE_SetTabEvent(self.OnChangeChatMode)
  745.         chatLine.x = 0
  746.         chatLine.y = 0
  747.         chatLine.width = 0
  748.         chatLine.height = 0
  749.         self.chatLine = chatLine
  750.  
  751.         btnSend = ui.Button()
  752.         btnSend.SetParent(self)
  753.         btnSend.SetUpVisual("d:/ymir work/ui/game/taskbar/Send_Chat_Button_01.sub")
  754.         btnSend.SetOverVisual("d:/ymir work/ui/game/taskbar/Send_Chat_Button_02.sub")
  755.         btnSend.SetDownVisual("d:/ymir work/ui/game/taskbar/Send_Chat_Button_03.sub")
  756.         btnSend.SetToolTipText(localeInfo.CHAT_SEND_CHAT)
  757.         btnSend.SAFE_SetEvent(self.chatLine.OnIMEReturn)
  758.         self.btnSend = btnSend
  759.  
  760.     def Destroy(self):
  761.         self.chatModeButton = None
  762.         self.chatLine = None
  763.         self.btnSend = None
  764.  
  765.     def Open(self):
  766.         self.chatLine.Show()
  767.         self.chatLine.SetPosition(57, 5)
  768.         self.chatLine.SetFocus()
  769.         self.chatLine.OpenChat()
  770.  
  771.         self.chatModeButton.SetPosition(7, 2)
  772.         self.chatModeButton.Show()
  773.  
  774.         self.btnSend.Show()
  775.         self.Show()
  776.  
  777.         self.RefreshPosition()
  778.         return True
  779.  
  780.     def Close(self):
  781.         self.chatLine.KillFocus()
  782.         self.chatLine.Hide()
  783.         self.chatModeButton.Hide()
  784.         self.btnSend.Hide()
  785.         self.Hide()
  786.         return True
  787.  
  788.     def SetEscapeEvent(self, event):
  789.         self.chatLine.SetEscapeEvent(event)
  790.  
  791.     def SetReturnEvent(self, event):
  792.         self.chatLine.SetReturnEvent(event)
  793.  
  794.     def OnChangeChatMode(self):
  795.         RefreshChatMode()
  796.  
  797.     def OnRefreshChatMode(self):
  798.         self.chatLine.ChangeChatMode()
  799.         self.chatModeButton.SetText(self.chatLine.GetCurrentChatModeName())
  800.  
  801.     def SetChatFocus(self):
  802.         self.chatLine.SetFocus()
  803.  
  804.     def KillChatFocus(self):
  805.         self.chatLine.KillFocus()
  806.  
  807.     def SetChatMax(self, max):
  808.         self.chatLine.SetUserMax(max)
  809.  
  810.     def RefreshPosition(self):
  811.         if localeInfo.IsARABIC():
  812.             self.chatLine.SetSize(self.GetWidth() - 93, 18)
  813.         else:
  814.             self.chatLine.SetSize(self.GetWidth() - 93, 13)
  815.  
  816.         self.btnSend.SetPosition(self.GetWidth() - 25, 2)
  817.  
  818.         (self.chatLine.x, self.chatLine.y, self.chatLine.width, self.chatLine.height) = self.chatLine.GetRect()
  819.  
  820.     def BindInterface(self, interface):
  821.         self.chatLine.BindInterface(interface)
  822.  
  823.     def OnRender(self):
  824.         (x, y, width, height) = self.chatLine.GetRect()
  825.         ui.RenderRoundBox(x-4, y-3, width+7, height+4, self.CHAT_OUTLINE_COLOR)
  826.  
  827. ## ChatWindow
  828. class ChatWindow(ui.Window):
  829.  
  830.     BOARD_START_COLOR = grp.GenerateColor(0.0, 0.0, 0.0, 0.0)
  831.     BOARD_END_COLOR = grp.GenerateColor(0.0, 0.0, 0.0, 0.8)
  832.     BOARD_MIDDLE_COLOR = grp.GenerateColor(0.0, 0.0, 0.0, 0.5)
  833.     CHAT_OUTLINE_COLOR = grp.GenerateColor(1.0, 1.0, 1.0, 1.0)
  834.  
  835.     if app.ENABLE_CHATTING_WINDOW_RENEWAL:
  836.         EDIT_LINE_HIDE_HEIGHT = 20
  837.     EDIT_LINE_HEIGHT = 25
  838.     CHAT_WINDOW_WIDTH = 600
  839.  
  840.     class ChatBackBoard(ui.Window):
  841.         def __init__(self):
  842.             ui.Window.__init__(self)
  843.         def __del__(self):
  844.             ui.Window.__del__(self)
  845.  
  846.     class ChatButton(ui.DragButton):
  847.  
  848.         def __init__(self):
  849.             ui.DragButton.__init__(self)
  850.             self.AddFlag("float")
  851.             self.AddFlag("movable")
  852.             self.AddFlag("restrict_x")
  853.             self.topFlag = False
  854.             self.SetWindowName("ChatWindow:ChatButton")
  855.  
  856.  
  857.         def __del__(self):
  858.             ui.DragButton.__del__(self)
  859.  
  860.         def SetOwner(self, owner):
  861.             self.owner = owner
  862.  
  863.         def OnMouseOverIn(self):
  864.             app.SetCursor(app.VSIZE)
  865.  
  866.         def OnMouseOverOut(self):
  867.             app.SetCursor(app.NORMAL)
  868.  
  869.         def OnTop(self):
  870.             if True == self.topFlag:
  871.                 return
  872.  
  873.             self.topFlag = True
  874.             self.owner.SetTop()
  875.             self.topFlag = False
  876.  
  877.     def __init__(self):
  878.         ui.Window.__init__(self)
  879.         self.AddFlag("float")
  880.  
  881.         self.SetWindowName("ChatWindow")
  882.         self.__RegisterChatColorDict()
  883.  
  884.         self.boardState = chat.BOARD_STATE_VIEW
  885.         self.chatID = chat.CreateChatSet(chat.CHAT_SET_CHAT_WINDOW)
  886.         chat.SetBoardState(self.chatID, chat.BOARD_STATE_VIEW)
  887.  
  888.         self.xBar = 0
  889.         self.yBar = 0
  890.         self.widthBar = 0
  891.         self.heightBar = 0
  892.         self.curHeightBar = 0
  893.         self.visibleLineCount = 0
  894.         self.scrollBarPos = 1.0
  895.         self.scrollLock = False
  896.  
  897.         chatInputSet = ChatInputSet()
  898.         chatInputSet.SetParent(self)
  899.         chatInputSet.SetEscapeEvent(ui.__mem_func__(self.CloseChat))
  900.         chatInputSet.SetReturnEvent(ui.__mem_func__(self.CloseChat))
  901.         chatInputSet.SetSize(550, 25)
  902.         self.chatInputSet = chatInputSet
  903.  
  904.         btnSendWhisper = ui.Button()
  905.         btnSendWhisper.SetParent(self)
  906.         btnSendWhisper.SetUpVisual("d:/ymir work/ui/game/taskbar/Send_Whisper_Button_01.sub")
  907.         btnSendWhisper.SetOverVisual("d:/ymir work/ui/game/taskbar/Send_Whisper_Button_02.sub")
  908.         btnSendWhisper.SetDownVisual("d:/ymir work/ui/game/taskbar/Send_Whisper_Button_03.sub")
  909.         btnSendWhisper.SetToolTipText(localeInfo.CHAT_SEND_MEMO)
  910.         btnSendWhisper.Hide()
  911.         self.btnSendWhisper = btnSendWhisper
  912.  
  913.         btnChatLog = ui.Button()
  914.         btnChatLog.SetParent(self)
  915.         btnChatLog.SetUpVisual("d:/ymir work/ui/game/taskbar/Open_Chat_Log_Button_01.sub")
  916.         btnChatLog.SetOverVisual("d:/ymir work/ui/game/taskbar/Open_Chat_Log_Button_02.sub")
  917.         btnChatLog.SetDownVisual("d:/ymir work/ui/game/taskbar/Open_Chat_Log_Button_03.sub")
  918.         btnChatLog.SetToolTipText(localeInfo.CHAT_LOG)
  919.         btnChatLog.Hide()
  920.         self.btnChatLog = btnChatLog
  921.  
  922.         btnChatSizing = self.ChatButton()
  923.         btnChatSizing.SetOwner(self)
  924.         btnChatSizing.SetMoveEvent(ui.__mem_func__(self.Refresh))
  925.         btnChatSizing.Hide()
  926.         self.btnChatSizing = btnChatSizing
  927.  
  928.         if app.ENABLE_CHATTING_WINDOW_RENEWAL:
  929.             imgChatBarLeft = ui.ImageBox()
  930.             imgChatBarLeft.SetParent(self.btnChatSizing)
  931.             imgChatBarLeft.AddFlag("not_pick")
  932.             imgChatBarLeft.LoadImage("d:/ymir work/ui/chat/chat_linebar_left.tga")
  933.             imgChatBarLeft.Show()
  934.             self.imgChatBarLeft = imgChatBarLeft
  935.  
  936.             imgChatBarRight = ui.ImageBox()
  937.             imgChatBarRight.SetParent(self.btnChatSizing)
  938.             imgChatBarRight.AddFlag("not_pick")
  939.             imgChatBarRight.LoadImage("d:/ymir work/ui/chat/chat_linebar_right.tga")
  940.             imgChatBarRight.Show()
  941.             self.imgChatBarRight = imgChatBarRight
  942.  
  943.             imgChatBarMiddle = ui.ExpandedImageBox()
  944.             imgChatBarMiddle.SetParent(self.btnChatSizing)
  945.             imgChatBarMiddle.AddFlag("not_pick")
  946.             imgChatBarMiddle.LoadImage("d:/ymir work/ui/chat/chatmenutab_line.tga")
  947.             imgChatBarMiddle.Show()
  948.             self.imgChatBarMiddle = imgChatBarMiddle
  949.  
  950.             btnChatTab = ui.Button()
  951.             btnChatTab.SetParent(self.btnChatSizing)
  952.             btnChatTab.SetUpVisual("d:/ymir work/ui/chat/chatmenutab_down.tga")
  953.             btnChatTab.SetOverVisual("d:/ymir work/ui/chat/chatmenutab_down.tga")
  954.             btnChatTab.SetDownVisual("d:/ymir work/ui/chat/chatmenutab_down.tga")
  955.             btnChatTab.SetToolTipText(uiScriptLocale.CHATTING_SETTING_TALKING, 0, -23)
  956.             btnChatTab.Show()
  957.             btnChatTab.Down()
  958.             self.btnChatTab = btnChatTab
  959.  
  960.             btnChatSettingOption = ui.Button()
  961.             btnChatSettingOption.SetParent(self.btnChatSizing)
  962.             btnChatSettingOption.SetUpVisual("d:/ymir work/ui/chat/btn_option01_default.tga")
  963.             btnChatSettingOption.SetOverVisual("d:/ymir work/ui/chat/btn_option01_over.tga")
  964.             btnChatSettingOption.SetDownVisual("d:/ymir work/ui/chat/btn_option01_down.tga")
  965.             btnChatSettingOption.SetToolTipText(localeInfo.CHATTING_SETTING_SETTING, 0, -23)
  966.             btnChatSettingOption.SetEvent(ui.__mem_func__(self.__SettingOptionWndOpen))
  967.             btnChatSettingOption.Show()
  968.             self.btnChatSettingOption = btnChatSettingOption
  969.  
  970.             self.wndChatSettingOption = ChatSettingWindow(self)
  971.         else:
  972.             imgChatBarLeft = ui.ImageBox()
  973.             imgChatBarLeft.SetParent(self.btnChatSizing)
  974.             imgChatBarLeft.AddFlag("not_pick")
  975.             imgChatBarLeft.LoadImage("d:/ymir work/ui/pattern/chat_bar_left.tga")
  976.             imgChatBarLeft.Show()
  977.             self.imgChatBarLeft = imgChatBarLeft
  978.  
  979.             imgChatBarRight = ui.ImageBox()
  980.             imgChatBarRight.SetParent(self.btnChatSizing)
  981.             imgChatBarRight.AddFlag("not_pick")
  982.             imgChatBarRight.LoadImage("d:/ymir work/ui/pattern/chat_bar_right.tga")
  983.             imgChatBarRight.Show()
  984.             self.imgChatBarRight = imgChatBarRight
  985.  
  986.             imgChatBarMiddle = ui.ExpandedImageBox()
  987.             imgChatBarMiddle.SetParent(self.btnChatSizing)
  988.             imgChatBarMiddle.AddFlag("not_pick")
  989.             imgChatBarMiddle.LoadImage("d:/ymir work/ui/pattern/chat_bar_middle.tga")
  990.             imgChatBarMiddle.Show()
  991.             self.imgChatBarMiddle = imgChatBarMiddle
  992.  
  993.         scrollBar = ui.ScrollBar()
  994.         scrollBar.AddFlag("float")
  995.         scrollBar.SetScrollEvent(ui.__mem_func__(self.OnScroll))
  996.         self.scrollBar = scrollBar
  997.  
  998.         self.Refresh()
  999.         if app.ENABLE_CHATTING_WINDOW_RENEWAL:
  1000.             self.RefreshChatWindow()
  1001.         self.chatInputSet.RefreshPosition() # RTL 시 위치를 제대로 잡으려면 위치 갱신이 필요하다
  1002.  
  1003.     def __del__(self):
  1004.         ui.Window.__del__(self)
  1005.  
  1006.     def __RegisterChatColorDict(self):
  1007.         CHAT_COLOR_DICT = {
  1008.             chat.CHAT_TYPE_TALKING : colorInfo.CHAT_RGB_TALK,
  1009.             chat.CHAT_TYPE_INFO : colorInfo.CHAT_RGB_INFO,
  1010.             chat.CHAT_TYPE_NOTICE : colorInfo.CHAT_RGB_NOTICE,
  1011.             chat.CHAT_TYPE_PARTY : colorInfo.CHAT_RGB_PARTY,
  1012.             chat.CHAT_TYPE_GUILD : colorInfo.CHAT_RGB_GUILD,
  1013.             chat.CHAT_TYPE_COMMAND : colorInfo.CHAT_RGB_COMMAND,
  1014.             chat.CHAT_TYPE_SHOUT : colorInfo.CHAT_RGB_SHOUT,
  1015.             chat.CHAT_TYPE_WHISPER : colorInfo.CHAT_RGB_WHISPER,
  1016.         }
  1017.  
  1018.         if app.ENABLE_CHATTING_WINDOW_RENEWAL:
  1019.             CHAT_COLOR_DICT.update({
  1020.                 chat.CHAT_TYPE_EXP_INFO : colorInfo.CHAT_RGB_INFO,
  1021.                 chat.CHAT_TYPE_ITEM_INFO : colorInfo.CHAT_RGB_INFO,
  1022.                 chat.CHAT_TYPE_MONEY_INFO : colorInfo.CHAT_RGB_INFO,
  1023.             })
  1024.  
  1025.         for colorItem in CHAT_COLOR_DICT.items():
  1026.             type=colorItem[0]
  1027.             rgb=colorItem[1]
  1028.             chat.SetChatColor(type, rgb[0], rgb[1], rgb[2])
  1029.  
  1030.     def Destroy(self):
  1031.         self.chatInputSet.Destroy()
  1032.         self.chatInputSet = None
  1033.  
  1034.         self.btnSendWhisper = 0
  1035.         self.btnChatLog = 0
  1036.         self.btnChatSizing = 0
  1037.         if app.ENABLE_CHATTING_WINDOW_RENEWAL:
  1038.             if self.wndChatSettingOption:
  1039.                 self.wndChatSettingOption.Close()
  1040.                 self.wndChatSettingOption = None
  1041.                
  1042.     ################
  1043.     ## Open & Close
  1044.     def OpenChat(self):
  1045.         self.SetSize(self.CHAT_WINDOW_WIDTH, 25)
  1046.         chat.SetBoardState(self.chatID, chat.BOARD_STATE_EDIT)
  1047.         self.boardState = chat.BOARD_STATE_EDIT
  1048.  
  1049.         (x, y, width, height) = self.GetRect()
  1050.         (btnX, btnY) = self.btnChatSizing.GetGlobalPosition()
  1051.  
  1052.         if localeInfo.IsARABIC():
  1053.             chat.SetPosition(self.chatID, x + width - 10, y)
  1054.         else:
  1055.             chat.SetPosition(self.chatID, x + 10, y)
  1056.  
  1057.         chat.SetHeight(self.chatID, y - btnY - self.EDIT_LINE_HEIGHT + 100)
  1058.  
  1059.         if self.IsShow():
  1060.             self.btnChatSizing.Show()
  1061.  
  1062.         self.Refresh()
  1063.         if app.ENABLE_CHATTING_WINDOW_RENEWAL:
  1064.             self.RefreshChatWindow()
  1065.         self.btnSendWhisper.SetPosition(self.GetWidth() - 50, 2)
  1066.         self.btnSendWhisper.Show()
  1067.  
  1068.         self.btnChatLog.SetPosition(self.GetWidth() - 25, 2)
  1069.         self.btnChatLog.Show()
  1070.  
  1071.         self.chatInputSet.Open()
  1072.         self.chatInputSet.SetTop()
  1073.         self.SetTop()
  1074.  
  1075.     def CloseChat(self):
  1076.         chat.SetBoardState(self.chatID, chat.BOARD_STATE_VIEW)
  1077.         self.boardState = chat.BOARD_STATE_VIEW
  1078.  
  1079.         (x, y, width, height) = self.GetRect()
  1080.  
  1081.         if localeInfo.IsARABIC():
  1082.             chat.SetPosition(self.chatID, x + width - 10, y + self.EDIT_LINE_HEIGHT)
  1083.         else:
  1084.             chat.SetPosition(self.chatID, x + 10, y + self.EDIT_LINE_HEIGHT)
  1085.  
  1086.         self.SetSize(self.CHAT_WINDOW_WIDTH, 0)
  1087.  
  1088.         self.chatInputSet.Close()
  1089.         self.btnSendWhisper.Hide()
  1090.         self.btnChatLog.Hide()
  1091.         self.btnChatSizing.Hide()
  1092.  
  1093.         self.Refresh()
  1094.         if app.ENABLE_CHATTING_WINDOW_RENEWAL:
  1095.             self.RefreshChatWindow()
  1096.            
  1097.     def SetSendWhisperEvent(self, event):
  1098.         self.btnSendWhisper.SetEvent(event)
  1099.  
  1100.     def SetOpenChatLogEvent(self, event):
  1101.         self.btnChatLog.SetEvent(event)
  1102.  
  1103.     def IsEditMode(self):
  1104.         if chat.BOARD_STATE_EDIT == self.boardState:
  1105.             return True
  1106.  
  1107.         return False
  1108.  
  1109.     def __RefreshSizingBar(self):
  1110.         (x, y, width, height) = self.GetRect()
  1111.         gxChat, gyChat = self.btnChatSizing.GetGlobalPosition()
  1112.         self.btnChatSizing.SetPosition(x, gyChat)
  1113.         self.btnChatSizing.SetSize(width, 22)
  1114.         if app.ENABLE_CHATTING_WINDOW_RENEWAL:
  1115.             self.imgChatBarLeft.SetPosition(0, 17)
  1116.  
  1117.             self.imgChatBarRight.SetPosition(width - 57, 0)
  1118.  
  1119.             self.btnChatTab.SetTextAddPos(uiScriptLocale.CHATTING_SETTING_DEFAULT_TITLE, -2)
  1120.             self.btnChatTab.SetPosition(4, 0)
  1121.             self.btnChatSettingOption.SetPosition(width - 27, 3)
  1122.  
  1123.             self.imgChatBarMiddle.SetPosition(57.0, 0)
  1124.             self.imgChatBarMiddle.SetRenderingRect(0.0, 0.0, float(width - 57.0 * 2) / 57.0 - 1.0, 0.0)
  1125.         else:
  1126.             self.imgChatBarLeft.SetPosition(0, 0)
  1127.             self.imgChatBarRight.SetPosition(width - 64, 0)
  1128.             self.imgChatBarMiddle.SetPosition(64, 0)
  1129.             self.imgChatBarMiddle.SetRenderingRect(0.0, 0.0, float(width - 128) / 64.0 - 1.0, 0.0)
  1130.  
  1131.     def SetPosition(self, x, y):
  1132.         ui.Window.SetPosition(self, x, y)
  1133.         self.__RefreshSizingBar()
  1134.  
  1135.     def SetSize(self, width, height):
  1136.         ui.Window.SetSize(self, width, height)
  1137.         self.__RefreshSizingBar()
  1138.  
  1139.     def SetHeight(self, height):
  1140.         gxChat, gyChat = self.btnChatSizing.GetGlobalPosition()
  1141.         self.btnChatSizing.SetPosition(gxChat, wndMgr.GetScreenHeight() - height)
  1142.  
  1143.     ###########
  1144.     ## Refresh
  1145.     def Refresh(self):
  1146.         if self.boardState == chat.BOARD_STATE_EDIT:
  1147.             self.RefreshBoardEditState()
  1148.         elif self.boardState == chat.BOARD_STATE_VIEW:
  1149.             self.RefreshBoardViewState()
  1150.  
  1151.     def RefreshBoardEditState(self):
  1152.  
  1153.         (x, y, width, height) = self.GetRect()
  1154.         (btnX, btnY) = self.btnChatSizing.GetGlobalPosition()
  1155.  
  1156.         self.xBar = x
  1157.         self.yBar = btnY
  1158.         self.widthBar = width
  1159.         self.heightBar = y - btnY + self.EDIT_LINE_HEIGHT
  1160.         self.curHeightBar = self.heightBar
  1161.  
  1162.         if localeInfo.IsARABIC():
  1163.             chat.SetPosition(self.chatID, x + width - 10, y)
  1164.         else:
  1165.             chat.SetPosition(self.chatID, x + 10, y)
  1166.  
  1167.         chat.SetHeight(self.chatID, y - btnY - self.EDIT_LINE_HEIGHT)
  1168.         chat.ArrangeShowingChat(self.chatID)
  1169.  
  1170.         if btnY > y:
  1171.             self.btnChatSizing.SetPosition(btnX, y)
  1172.             self.heightBar = self.EDIT_LINE_HEIGHT
  1173.  
  1174.     def RefreshBoardViewState(self):
  1175.         (x, y, width, height) = self.GetRect()
  1176.         (btnX, btnY) = self.btnChatSizing.GetGlobalPosition()
  1177.         textAreaHeight = self.visibleLineCount * chat.GetLineStep(self.chatID)
  1178.  
  1179.         if localeInfo.IsARABIC():
  1180.             chat.SetPosition(self.chatID, x + width - 10, y + self.EDIT_LINE_HEIGHT)
  1181.         else:
  1182.             chat.SetPosition(self.chatID, x + 10, y + self.EDIT_LINE_HEIGHT)
  1183.  
  1184.         chat.SetHeight(self.chatID, y - btnY - self.EDIT_LINE_HEIGHT + 100)
  1185.  
  1186.         if self.boardState == chat.BOARD_STATE_EDIT:
  1187.             textAreaHeight += 45
  1188.         elif self.visibleLineCount != 0:
  1189.             textAreaHeight += 10 + 10
  1190.  
  1191.         self.xBar = x
  1192.         self.yBar = y + self.EDIT_LINE_HEIGHT - textAreaHeight
  1193.         self.widthBar = width
  1194.         self.heightBar = textAreaHeight
  1195.  
  1196.         self.scrollBar.Hide()
  1197.  
  1198.     ##########
  1199.     ## Render
  1200.     def OnUpdate(self):
  1201.         if self.boardState == chat.BOARD_STATE_EDIT:
  1202.             chat.Update(self.chatID)
  1203.         elif self.boardState == chat.BOARD_STATE_VIEW:
  1204.             if systemSetting.IsViewChat():
  1205.                 chat.Update(self.chatID)
  1206.  
  1207.     def OnRender(self):
  1208.         if chat.GetVisibleLineCount(self.chatID) != self.visibleLineCount:
  1209.             self.visibleLineCount = chat.GetVisibleLineCount(self.chatID)
  1210.             self.Refresh()
  1211.  
  1212.         if self.curHeightBar != self.heightBar:
  1213.             self.curHeightBar += (self.heightBar - self.curHeightBar) / 10
  1214.  
  1215.         if self.boardState == chat.BOARD_STATE_EDIT:
  1216.             grp.SetColor(self.BOARD_MIDDLE_COLOR)
  1217.             if app.ENABLE_CHATTING_WINDOW_RENEWAL:
  1218.                 grp.RenderBar(self.xBar, self.yBar + (self.heightBar - self.curHeightBar) + self.EDIT_LINE_HIDE_HEIGHT, self.widthBar, self.curHeightBar)
  1219.             else:
  1220.                 grp.RenderBar(self.xBar, self.yBar + (self.heightBar - self.curHeightBar) + 10, self.widthBar, self.curHeightBar)
  1221.             chat.Render(self.chatID)
  1222.         elif self.boardState == chat.BOARD_STATE_VIEW:
  1223.             if systemSetting.IsViewChat():
  1224.                 grp.RenderGradationBar(self.xBar, self.yBar + (self.heightBar - self.curHeightBar), self.widthBar, self.curHeightBar, self.BOARD_START_COLOR, self.BOARD_END_COLOR)
  1225.                 chat.Render(self.chatID)
  1226.  
  1227.     ##########
  1228.     ## Event
  1229.     def OnTop(self):
  1230.         self.btnChatSizing.SetTop()
  1231.         self.scrollBar.SetTop()
  1232.  
  1233.     def OnScroll(self):
  1234.         if not self.scrollLock:
  1235.             self.scrollBarPos = self.scrollBar.GetPos()
  1236.  
  1237.         lineCount = chat.GetLineCount(self.chatID)
  1238.         visibleLineCount = chat.GetVisibleLineCount(self.chatID)
  1239.         endLine = visibleLineCount + int(float(lineCount - visibleLineCount) * self.scrollBarPos)
  1240.  
  1241.         chat.SetEndPos(self.chatID, self.scrollBarPos)
  1242.  
  1243.     def OnChangeChatMode(self):
  1244.         self.chatInputSet.OnChangeChatMode()
  1245.  
  1246.     def SetChatFocus(self):
  1247.         self.chatInputSet.SetChatFocus()
  1248.  
  1249.     def BindInterface(self, interface):
  1250.         self.chatInputSet.BindInterface(interface)
  1251.  
  1252.     if app.ENABLE_CHATTING_WINDOW_RENEWAL:
  1253.         def __SettingOptionWndOpen(self):
  1254.             if self.wndChatSettingOption:
  1255.                 if self.wndChatSettingOption.IsShow():
  1256.                     self.wndChatSettingOption.Close()
  1257.                 else:
  1258.                     self.wndChatSettingOption.Open()
  1259.  
  1260.         def RefreshChatWindow(self):
  1261.             if not self.wndChatSettingOption:
  1262.                 return
  1263.  
  1264.             for mode in OPTION_CHECKBOX_MODE.iterkeys():
  1265.                 enable = self.wndChatSettingOption.GetChatModeSetting(mode)
  1266.                 if enable:
  1267.                     chat.EnableChatMode(self.chatID, mode)
  1268.                 else:
  1269.                     chat.DisableChatMode(self.chatID, mode)
  1270.  
  1271. ## ChatLogWindow
  1272. class ChatLogWindow(ui.Window):
  1273.  
  1274.     BLOCK_WIDTH = 32
  1275.     CHAT_MODE_NAME = ( localeInfo.CHAT_NORMAL, localeInfo.CHAT_PARTY, localeInfo.CHAT_GUILD, localeInfo.CHAT_SHOUT, localeInfo.CHAT_INFORMATION, localeInfo.CHAT_NOTICE, )
  1276.     CHAT_MODE_INDEX = ( chat.CHAT_TYPE_TALKING,
  1277.                         chat.CHAT_TYPE_PARTY,
  1278.                         chat.CHAT_TYPE_GUILD,
  1279.                         chat.CHAT_TYPE_SHOUT,
  1280.                         chat.CHAT_TYPE_INFO,
  1281.                         chat.CHAT_TYPE_NOTICE, )
  1282.  
  1283.     CHAT_LOG_WINDOW_MINIMUM_WIDTH = 450
  1284.     CHAT_LOG_WINDOW_MINIMUM_HEIGHT = 120
  1285.  
  1286.     class ResizeButton(ui.DragButton):
  1287.  
  1288.         def __init__(self):
  1289.             ui.DragButton.__init__(self)
  1290.  
  1291.         def __del__(self):
  1292.             ui.DragButton.__del__(self)
  1293.  
  1294.         def OnMouseOverIn(self):
  1295.             app.SetCursor(app.HVSIZE)
  1296.  
  1297.         def OnMouseOverOut(self):
  1298.             app.SetCursor(app.NORMAL)
  1299.  
  1300.     def __init__(self):
  1301.  
  1302.         self.allChatMode = True
  1303.         self.chatInputSet = None
  1304.  
  1305.         ui.Window.__init__(self)
  1306.         self.AddFlag("float")
  1307.         self.AddFlag("movable")
  1308.         self.SetWindowName("ChatLogWindow")
  1309.         self.__CreateChatInputSet()
  1310.         self.__CreateWindow()
  1311.         self.__CreateButton()
  1312.         self.__CreateScrollBar()
  1313.  
  1314.         self.chatID = chat.CreateChatSet(chat.CHAT_SET_LOG_WINDOW)
  1315.         chat.SetBoardState(self.chatID, chat.BOARD_STATE_LOG)
  1316.         for i in self.CHAT_MODE_INDEX:
  1317.             chat.EnableChatMode(self.chatID, i)
  1318.  
  1319.         if app.ENABLE_CHATTING_WINDOW_RENEWAL:
  1320.             chat.EnableChatMode(self.chatID, chat.CHAT_TYPE_EXP_INFO)
  1321.             chat.EnableChatMode(self.chatID, chat.CHAT_TYPE_ITEM_INFO)
  1322.             chat.EnableChatMode(self.chatID, chat.CHAT_TYPE_MONEY_INFO)
  1323.  
  1324.         self.SetPosition(20, 20)
  1325.         self.SetSize(self.CHAT_LOG_WINDOW_MINIMUM_WIDTH, self.CHAT_LOG_WINDOW_MINIMUM_HEIGHT)
  1326.         self.btnSizing.SetPosition(self.CHAT_LOG_WINDOW_MINIMUM_WIDTH-self.btnSizing.GetWidth(), self.CHAT_LOG_WINDOW_MINIMUM_HEIGHT-self.btnSizing.GetHeight()+2)
  1327.  
  1328.         self.OnResize()
  1329.  
  1330.     def __CreateChatInputSet(self):
  1331.         chatInputSet = ChatInputSet()
  1332.         chatInputSet.SetParent(self)
  1333.         chatInputSet.SetEscapeEvent(ui.__mem_func__(self.Close))
  1334.         chatInputSet.SetWindowVerticalAlignBottom()
  1335.         chatInputSet.Open()
  1336.         self.chatInputSet = chatInputSet
  1337.  
  1338.     def __CreateWindow(self):
  1339.         imgLeft = ui.ImageBox()
  1340.         imgLeft.AddFlag("not_pick")
  1341.         imgLeft.SetParent(self)
  1342.  
  1343.         imgCenter = ui.ExpandedImageBox()
  1344.         imgCenter.AddFlag("not_pick")
  1345.         imgCenter.SetParent(self)
  1346.  
  1347.         imgRight = ui.ImageBox()
  1348.         imgRight.AddFlag("not_pick")
  1349.         imgRight.SetParent(self)
  1350.  
  1351.         if localeInfo.IsARABIC():
  1352.             imgLeft.LoadImage("locale/ae/ui/pattern/titlebar_left.tga")
  1353.             imgCenter.LoadImage("locale/ae/ui/pattern/titlebar_center.tga")
  1354.             imgRight.LoadImage("locale/ae/ui/pattern/titlebar_right.tga")
  1355.         else:
  1356.             imgLeft.LoadImage("d:/ymir work/ui/pattern/chatlogwindow_titlebar_left.tga")
  1357.             imgCenter.LoadImage("d:/ymir work/ui/pattern/chatlogwindow_titlebar_middle.tga")
  1358.             imgRight.LoadImage("d:/ymir work/ui/pattern/chatlogwindow_titlebar_right.tga")
  1359.  
  1360.         imgLeft.Show()
  1361.         imgCenter.Show()
  1362.         imgRight.Show()
  1363.  
  1364.         btnClose = ui.Button()
  1365.         btnClose.SetParent(self)
  1366.         btnClose.SetUpVisual("d:/ymir work/ui/public/close_button_01.sub")
  1367.         btnClose.SetOverVisual("d:/ymir work/ui/public/close_button_02.sub")
  1368.         btnClose.SetDownVisual("d:/ymir work/ui/public/close_button_03.sub")
  1369.         btnClose.SetToolTipText(localeInfo.UI_CLOSE, 0, -23)
  1370.         btnClose.SetEvent(ui.__mem_func__(self.Close))
  1371.         btnClose.Show()
  1372.  
  1373.         btnSizing = self.ResizeButton()
  1374.         btnSizing.SetParent(self)
  1375.         btnSizing.SetMoveEvent(ui.__mem_func__(self.OnResize))
  1376.         btnSizing.SetSize(16, 16)
  1377.         btnSizing.Show()
  1378.  
  1379.         titleName = ui.TextLine()
  1380.         titleName.SetParent(self)
  1381.  
  1382.         if localeInfo.IsARABIC():
  1383.             titleName.SetPosition(self.GetWidth()-20, 6)
  1384.         else:
  1385.             titleName.SetPosition(20, 6)
  1386.  
  1387.         titleName.SetText(localeInfo.CHAT_LOG_TITLE)
  1388.         titleName.Show()
  1389.  
  1390.         self.imgLeft = imgLeft
  1391.         self.imgCenter = imgCenter
  1392.         self.imgRight = imgRight
  1393.         self.btnClose = btnClose
  1394.         self.btnSizing = btnSizing
  1395.         self.titleName = titleName
  1396.  
  1397.     def __CreateButton(self):
  1398.  
  1399.         if localeInfo.IsARABIC():
  1400.             bx = 20
  1401.         else:
  1402.             bx = 13
  1403.  
  1404.         btnAll = ui.RadioButton()
  1405.         btnAll.SetParent(self)
  1406.         btnAll.SetPosition(bx, 24)
  1407.         btnAll.SetUpVisual("d:/ymir work/ui/public/xsmall_button_01.sub")
  1408.         btnAll.SetOverVisual("d:/ymir work/ui/public/xsmall_button_02.sub")
  1409.         btnAll.SetDownVisual("d:/ymir work/ui/public/xsmall_button_03.sub")
  1410.         btnAll.SetText(localeInfo.CHAT_ALL)
  1411.         btnAll.SetEvent(ui.__mem_func__(self.ToggleAllChatMode))
  1412.         btnAll.Down()
  1413.         btnAll.Show()
  1414.         self.btnAll = btnAll
  1415.  
  1416.         x = bx + 48
  1417.         i = 0
  1418.         self.modeButtonList = []
  1419.         for name in self.CHAT_MODE_NAME:
  1420.             btn = ui.ToggleButton()
  1421.             btn.SetParent(self)
  1422.             btn.SetPosition(x, 24)
  1423.             btn.SetUpVisual("d:/ymir work/ui/public/xsmall_button_01.sub")
  1424.             btn.SetOverVisual("d:/ymir work/ui/public/xsmall_button_02.sub")
  1425.             btn.SetDownVisual("d:/ymir work/ui/public/xsmall_button_03.sub")
  1426.             btn.SetText(name)
  1427.             btn.Show()
  1428.  
  1429.             mode = self.CHAT_MODE_INDEX[i]
  1430.             btn.SetToggleUpEvent(lambda arg=mode: self.ToggleChatMode(arg))
  1431.             btn.SetToggleDownEvent(lambda arg=mode: self.ToggleChatMode(arg))
  1432.             self.modeButtonList.append(btn)
  1433.  
  1434.             x += 48
  1435.             i += 1
  1436.  
  1437.     def __CreateScrollBar(self):
  1438.         scrollBar = ui.SmallThinScrollBar()
  1439.         scrollBar.SetParent(self)
  1440.         scrollBar.Show()
  1441.         scrollBar.SetScrollEvent(ui.__mem_func__(self.OnScroll))
  1442.         self.scrollBar = scrollBar
  1443.         self.scrollBarPos = 1.0
  1444.  
  1445.     def __del__(self):
  1446.         ui.Window.__del__(self)
  1447.  
  1448.     def Destroy(self):
  1449.         self.imgLeft = None
  1450.         self.imgCenter = None
  1451.         self.imgRight = None
  1452.         self.btnClose = None
  1453.         self.btnSizing = None
  1454.         self.modeButtonList = []
  1455.         self.scrollBar = None
  1456.         self.chatInputSet = None
  1457.  
  1458.     def ToggleAllChatMode(self):
  1459.         if self.allChatMode:
  1460.             return
  1461.  
  1462.         self.allChatMode = True
  1463.  
  1464.         for i in self.CHAT_MODE_INDEX:
  1465.             chat.EnableChatMode(self.chatID, i)
  1466.         if app.ENABLE_CHATTING_WINDOW_RENEWAL:
  1467.             chat.EnableChatMode(self.chatID, chat.CHAT_TYPE_EXP_INFO)
  1468.             chat.EnableChatMode(self.chatID, chat.CHAT_TYPE_ITEM_INFO)
  1469.             chat.EnableChatMode(self.chatID, chat.CHAT_TYPE_MONEY_INFO)
  1470.         for btn in self.modeButtonList:
  1471.             btn.SetUp()
  1472.  
  1473.     def ToggleChatMode(self, mode):
  1474.         if self.allChatMode:
  1475.             self.allChatMode = False
  1476.             for i in self.CHAT_MODE_INDEX:
  1477.                 chat.DisableChatMode(self.chatID, i)
  1478.             chat.EnableChatMode(self.chatID, mode)
  1479.             if app.ENABLE_CHATTING_WINDOW_RENEWAL:
  1480.                 if mode == chat.CHAT_TYPE_INFO:
  1481.                     chat.EnableChatMode(self.chatID, chat.CHAT_TYPE_EXP_INFO)
  1482.                     chat.EnableChatMode(self.chatID, chat.CHAT_TYPE_ITEM_INFO)
  1483.                     chat.EnableChatMode(self.chatID, chat.CHAT_TYPE_MONEY_INFO)
  1484.             self.btnAll.SetUp()
  1485.  
  1486.         else:
  1487.             chat.ToggleChatMode(self.chatID, mode)
  1488.  
  1489.     def SetSize(self, width, height):
  1490.         self.imgCenter.SetRenderingRect(0.0, 0.0, float((width - self.BLOCK_WIDTH*2) - self.BLOCK_WIDTH) / self.BLOCK_WIDTH, 0.0)
  1491.         self.imgCenter.SetPosition(self.BLOCK_WIDTH, 0)
  1492.         self.imgRight.SetPosition(width - self.BLOCK_WIDTH, 0)
  1493.  
  1494.         if localeInfo.IsARABIC():
  1495.             self.titleName.SetPosition(self.GetWidth()-20, 3)
  1496.             self.btnClose.SetPosition(3, 3)
  1497.             self.scrollBar.SetPosition(1, 45)
  1498.         else:
  1499.             self.btnClose.SetPosition(width - self.btnClose.GetWidth() - 5, 5)
  1500.             self.scrollBar.SetPosition(width - 15, 45)
  1501.  
  1502.         self.scrollBar.SetScrollBarSize(height - 45 - 12)
  1503.         self.scrollBar.SetPos(self.scrollBarPos)
  1504.         ui.Window.SetSize(self, width, height)
  1505.  
  1506.     def Open(self):
  1507.         self.OnResize()
  1508.         self.chatInputSet.SetChatFocus()
  1509.         self.Show()
  1510.  
  1511.     def Close(self):
  1512.         if self.chatInputSet:
  1513.             self.chatInputSet.KillChatFocus()
  1514.         self.Hide()
  1515.  
  1516.     def OnResize(self):
  1517.         x, y = self.btnSizing.GetLocalPosition()
  1518.         width = self.btnSizing.GetWidth()
  1519.         height = self.btnSizing.GetHeight()
  1520.  
  1521.         if x < self.CHAT_LOG_WINDOW_MINIMUM_WIDTH - width:
  1522.             self.btnSizing.SetPosition(self.CHAT_LOG_WINDOW_MINIMUM_WIDTH - width, y)
  1523.             return
  1524.         if y < self.CHAT_LOG_WINDOW_MINIMUM_HEIGHT - height:
  1525.             self.btnSizing.SetPosition(x, self.CHAT_LOG_WINDOW_MINIMUM_HEIGHT - height)
  1526.             return
  1527.  
  1528.         self.scrollBar.LockScroll()
  1529.         self.SetSize(x + width, y + height)
  1530.         self.scrollBar.UnlockScroll()
  1531.  
  1532.         if localeInfo.IsARABIC():
  1533.             self.chatInputSet.SetPosition(20, 25)
  1534.         else:
  1535.             self.chatInputSet.SetPosition(0, 25)
  1536.  
  1537.         self.chatInputSet.SetSize(self.GetWidth() - 20, 20)
  1538.         self.chatInputSet.RefreshPosition()
  1539.         self.chatInputSet.SetChatMax(self.GetWidth() / 8)
  1540.  
  1541.     def OnScroll(self):
  1542.         self.scrollBarPos = self.scrollBar.GetPos()
  1543.  
  1544.         lineCount = chat.GetLineCount(self.chatID)
  1545.         visibleLineCount = chat.GetVisibleLineCount(self.chatID)
  1546.         endLine = visibleLineCount + int(float(lineCount - visibleLineCount) * self.scrollBarPos)
  1547.  
  1548.         chat.SetEndPos(self.chatID, self.scrollBarPos)
  1549.  
  1550.     def OnRender(self):
  1551.         (x, y, width, height) = self.GetRect()
  1552.  
  1553.         if localeInfo.IsARABIC():
  1554.             grp.SetColor(0x77000000)
  1555.             grp.RenderBar(x+2, y+45, 13, height-45)
  1556.  
  1557.             grp.SetColor(0x77000000)
  1558.             grp.RenderBar(x, y, width, height)
  1559.             grp.SetColor(0x77000000)
  1560.             grp.RenderBox(x, y, width-2, height)
  1561.             grp.SetColor(0x77000000)
  1562.             grp.RenderBox(x+1, y+1, width-2, height)
  1563.  
  1564.             grp.SetColor(0xff989898)
  1565.             grp.RenderLine(x+width-13, y+height-1, 11, -11)
  1566.             grp.RenderLine(x+width-9, y+height-1, 7, -7)
  1567.             grp.RenderLine(x+width-5, y+height-1, 3, -3)
  1568.         else:
  1569.             grp.SetColor(0x77000000)
  1570.             grp.RenderBar(x+width-15, y+45, 13, height-45)
  1571.  
  1572.             grp.SetColor(0x77000000)
  1573.             grp.RenderBar(x, y, width, height)
  1574.             grp.SetColor(0x77000000)
  1575.             grp.RenderBox(x, y, width-2, height)
  1576.             grp.SetColor(0x77000000)
  1577.             grp.RenderBox(x+1, y+1, width-2, height)
  1578.  
  1579.             grp.SetColor(0xff989898)
  1580.             grp.RenderLine(x+width-13, y+height-1, 11, -11)
  1581.             grp.RenderLine(x+width-9, y+height-1, 7, -7)
  1582.             grp.RenderLine(x+width-5, y+height-1, 3, -3)
  1583.  
  1584.         #####
  1585.  
  1586.         chat.ArrangeShowingChat(self.chatID)
  1587.  
  1588.         if localeInfo.IsARABIC():
  1589.             chat.SetPosition(self.chatID, x + width - 10, y + height - 25)
  1590.         else:
  1591.             chat.SetPosition(self.chatID, x + 10, y + height - 25)
  1592.  
  1593.         chat.SetHeight(self.chatID, height - 45 - 25)
  1594.         chat.Update(self.chatID)
  1595.         chat.Render(self.chatID)
  1596.  
  1597.     def OnPressEscapeKey(self):
  1598.         self.Close()
  1599.         return True
  1600.  
  1601.     def BindInterface(self, interface):
  1602.         self.interface = interface
  1603.  
  1604.     def OnMouseLeftButtonDown(self):
  1605.         hyperlink = ui.GetHyperlink()
  1606.         if hyperlink:
  1607.             if app.IsPressed(app.DIK_LALT):
  1608.                 link = chat.GetLinkFromHyperlink(hyperlink)
  1609.                 ime.PasteString(link)
  1610.             else:
  1611.                 self.interface.MakeHyperlinkTooltip(hyperlink)
  1612.  
  1613.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement