Guest User

uiikashop.py

a guest
Sep 15th, 2026
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 152.50 KB | None | 0 0
  1. # cpython modules
  2. import app
  3. import player
  4. import item
  5. import net
  6. import dbg
  7. import wndMgr
  8. import ikashop
  9. import chr
  10.  
  11. # m2 python modules
  12. import localeInfo as locale
  13. import mouseModule as mouse
  14. import ui
  15. import uicommon
  16. import uitooltip
  17.  
  18. # python modules
  19. import datetime
  20. from _weakref import proxy
  21. from random import shuffle
  22.  
  23. AUCTION_MIN_RAISE_PERCENTAGE = 10
  24. RESTORE_DURATION_COST = 1000000
  25. MOVE_SHOP_ENTITY_COST = 100000
  26. SLOT_SIZE = 32
  27. MIN_OFFER_PCT = 30 # private offer min % of selling price
  28. YANG_PER_CHEQUE = 100000000
  29.  
  30. ENABLE_DEFAULT_UI_BOARD = 1
  31. ENABLE_CHEQUE_SYSTEM = getattr(app, "ENABLE_CHEQUE_SYSTEM", 0)
  32.  
  33. def debug(fmt, *args):
  34.     if args:
  35.         fmt = fmt.format(*args)
  36.     dbg.Tracen(fmt)
  37.  
  38. def debugStack():
  39.     import traceback
  40.     s = traceback.format_stack()
  41.     for line in s[:-1]:
  42.         debug(line)
  43.  
  44. def RomeNumber(num):
  45.     nums = {
  46.         1 : "I",        2 : "II",       3 : "III",
  47.         4 : "IV",       5 : "V",        6 : "VI",
  48.         7 : "VII",      8 : "VIII",     9 : "IX",
  49.     }
  50.     return nums.get(num, "X")
  51.  
  52. def DatetimeFormat(timestamp):
  53.     try:
  54.         # make datetime object
  55.         dts = datetime.datetime.fromtimestamp(timestamp)
  56.         # make today datetime object
  57.         dtn = datetime.datetime.now()
  58.         # checking for today
  59.         if dts.date() == dtn.date():
  60.             return locale.IKASHOP_DATETIME_TODAY.format(dts.hour, dts.minute)
  61.         # checking for yesterday
  62.         dty = dtn - datetime.timedelta(days=1)
  63.         if dty.date() == dts.date():
  64.             return locale.IKASHOP_DATETIME_YESTERDAY.format(dts.hour, dts.minute)
  65.         # checking for tomorrow
  66.         dty = dtn + datetime.timedelta(days=1)
  67.         if dty.date() == dts.date():
  68.             return locale.IKASHOP_DATETIME_TOMORROW.format(dts.hour, dts.minute)
  69.         # formatting dd/mm/yy hh:mm
  70.         return "{:02d}/{:02d}/{:02d} {:02d}:{:02d}".format(
  71.             dts.day, dts.month, dts.year%100, dts.hour, dts.minute)
  72.     except Exception as e:
  73.         dbg.TraceError("{}: {}".format(e, timestamp))
  74.  
  75. def GetScreenSize():
  76.     return wndMgr.GetScreenWidth(), wndMgr.GetScreenHeight()
  77.  
  78. class ProxyPrototype(object):
  79.     pass
  80.  
  81. def IsProxy(obj):
  82.     if not hasattr(IsProxy, "test"):
  83.         fakeInstance = ProxyPrototype()
  84.         IsProxy.test = proxy(fakeInstance)
  85.     return type(obj) == type(IsProxy.test)
  86.  
  87. def SelfDestroyObject(instance):
  88.     def DestroyValue(value):
  89.         if IsProxy(value):
  90.             return True
  91.         if isinstance(value, ui.Window):
  92.             if isinstance(value, IkarusShopWindow):
  93.                 value.Destroy()
  94.             else:
  95.                 SelfDestroyObject(value)
  96.             return True
  97.         elif type(value) in (list, tuple, dict, set):
  98.             values = value if type(value) != dict else value.values()
  99.             ret = [DestroyValue(val) for val in values]
  100.             return any(ret)
  101.         elif callable(value) and hasattr(value, '__self__'):
  102.             return True
  103.         return False
  104.  
  105.     def MakeEmptyValue(value):
  106.         if type(value) in (list, tuple, dict, set):
  107.             return type(value)()
  108.         return None
  109.  
  110.     # skipping all non-window instances
  111.     if not isinstance(instance, ui.Window):
  112.         return
  113.  
  114.     # skipping all instances already destroyed
  115.     if getattr(instance, "_SelfDestroyed", False):
  116.         return
  117.  
  118.     # desroying the instance
  119.     instance._SelfDestroyed = True
  120.     for name, value in vars(instance).items():
  121.         if value and DestroyValue(value):
  122.             setattr(instance, name, MakeEmptyValue(value))
  123.  
  124. def IsPressingCTRL():
  125.     return app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL)
  126.  
  127. def IsPressingSHIFT():
  128.     return app.IsPressed(app.DIK_LSHIFT) or app.IsPressed(app.DIK_RSHIFT)
  129.  
  130. def GetInventoryItemHash(win, pos):
  131.     vnum = player.GetItemIndex(win, pos)
  132.     count = player.GetItemCount(win, pos)
  133.     sockets = tuple(player.GetItemMetinSocket(win, pos, i) for i in xrange(player.METIN_SOCKET_MAX_NUM))
  134.     attrs = tuple(player.GetItemAttribute(win, pos, i) for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM))
  135.     return ikashop.GetItemHash(vnum, count, sockets, attrs)
  136.  
  137. def GetAttributeSettings():
  138.     def NoFormat(str):
  139.         removingStrings = ["%", "0", "+", ":"]
  140.         for value in removingStrings:
  141.             str = str.replace(value, "")
  142.         return str.strip()
  143.  
  144.     values = []
  145.     attributeDict = uitooltip.ItemToolTip.AFFECT_DICT
  146.     for apply, text in attributeDict.items():
  147.         if not isinstance(text, str):
  148.             text = text(0)
  149.         values.append((apply, NoFormat(text)))
  150.     values.sort(key = lambda t : t[1])
  151.     values = [(0, locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT),] + values
  152.     return values
  153.  
  154. def IsUsingFilter(filters):
  155.     for filter in filters:
  156.         if isinstance(filter, tuple):
  157.             if IsUsingFilter(filter):
  158.                 return True
  159.         elif filter:
  160.             return True
  161.     return False
  162.  
  163. def ExtractInputPrice(dialog):
  164.     if ENABLE_CHEQUE_SYSTEM:
  165.         cheque = dialog.GetCheque()
  166.         cheque = cheque.lower().replace("k", "000")
  167.         cheque = int(cheque) if cheque and cheque.isdigit() else 0
  168.  
  169.     # extracting value
  170.     value = dialog.GetText()
  171.     value = value.lower().replace("k", "000")
  172.     value = long(value) if value and value.isdigit() else 0
  173.  
  174.     if ENABLE_CHEQUE_SYSTEM:
  175.         if cheque == 0 and value == 0:
  176.             return False, None
  177.         price = value, cheque
  178.     else:
  179.         if value == 0:
  180.             return False, None
  181.         price = value,
  182.     return True, price
  183.  
  184. class IkarusShopWindow(ui.Window):
  185.  
  186.     HALIGN_SETTER = {
  187.         "center" : ui.Window.SetWindowHorizontalAlignCenter,
  188.         "right" : ui.Window.SetWindowHorizontalAlignRight,
  189.     }
  190.  
  191.     VALIGN_SETTER = {
  192.         "center" : ui.Window.SetWindowVerticalAlignCenter,
  193.         "bottom" : ui.Window.SetWindowVerticalAlignBottom,
  194.     }
  195.  
  196.     def _ApplyWidgetAlignments(self, child, halign, valign):
  197.         if halign in self.HALIGN_SETTER:
  198.             self.HALIGN_SETTER[halign](child)
  199.         if valign in self.VALIGN_SETTER:
  200.             self.VALIGN_SETTER(child)
  201.  
  202.     def _RegisterDialog(self, dialog):
  203.         if not hasattr(self, "_dialogs"):
  204.             self._dialogs = []
  205.         self._dialogs.append(dialog)
  206.  
  207.     def SetTop(self):
  208.         super(IkarusShopWindow, self).SetTop()
  209.         if hasattr(self, "_dialogs"):
  210.             for dialog in self._dialogs:
  211.                 dialog.SetTop()
  212.  
  213.     def Hide(self):
  214.         super(IkarusShopWindow, self).Hide()
  215.         if hasattr(self, "_dialogs"):
  216.             for window in self._dialogs:
  217.                 window.Hide()
  218.  
  219.     def CreateWidget(self, type, x = 0, y = 0, show = True, pos = None, size = None, parent = None, halign = None, valign = None):
  220.         child = type()
  221.         child.SetParent(parent if parent else self)
  222.         if show:
  223.             child.Show()
  224.         if size:
  225.             child.SetSize(*size)
  226.         self._ApplyWidgetAlignments(child, halign, valign)
  227.         if pos:
  228.             x,y = pos
  229.         child.SetPosition(x,y)
  230.         return child
  231.  
  232.     def Destroy(self):
  233.         super(IkarusShopWindow, self).Destroy()
  234.         # cleaning shitty undestroyable widgets
  235.         if hasattr(self, "questionDialog"):
  236.             SelfDestroyObject(self.questionDialog)
  237.             del self.questionDialog
  238.         if hasattr(self, "popupDialog"):
  239.             SelfDestroyObject(self.popupDialog)
  240.             del self.popupDialog
  241.         if hasattr(self, "moneyInputDialog"):
  242.             SelfDestroyObject(self.moneyInputDialog)
  243.             del self.moneyInputDialog
  244.         if hasattr(self, "itemToolTip"):
  245.             SelfDestroyObject(self.itemToolTip)
  246.             del self.itemToolTip
  247.         # cleaning itself
  248.         SelfDestroyObject(self)
  249.  
  250.     def OpenQuestionDialog(self, question, acceptEvent, denyEvent = None):
  251.         if getattr(self, "questionDialog", None) == None:
  252.             self.questionDialog = uicommon.QuestionDialog()
  253.             self.questionDialog.SetAcceptText(locale.IKASHOP_QUESTION_DIALOG_CONTINUE_TEXT)
  254.             self.questionDialog.SetCancelText(locale.IKASHOP_QUESTION_DIALOG_CANCEL_TEXT)
  255.             self._RegisterDialog(self.questionDialog)
  256.         self.questionDialog.SetText(question)
  257.         self.questionDialog.SetWidth(self.questionDialog.textLine.GetTextSize()[0] + 40)
  258.         self.questionDialog.SetAcceptEvent(acceptEvent)
  259.         self.questionDialog.SetCancelEvent(denyEvent if denyEvent else self.questionDialog.Hide)
  260.         self.questionDialog.Open()
  261.  
  262.     def OpenPopupDialog(self, message, seconds = 6):
  263.         if getattr(self, "popupDialog", None) == None:
  264.             self.popupDialog = uicommon.PopupDialog()
  265.             self._RegisterDialog(self.popupDialog)
  266.         self.popupDialog.SetText(message)
  267.         self.popupDialog.SetWidth(self.popupDialog.message.GetTextSize()[0] + 40)
  268.         self.popupDialog.Open()
  269.         self.popupDialog.SetAutoClose(seconds)
  270.  
  271.     def OpenMoneyInputDialog(self, acceptEvent, denyEvent = None, value = 0, cheque = 0, nocheque = 0):
  272.         # checking for gold overflow
  273.         if ENABLE_CHEQUE_SYSTEM:
  274.             if not nocheque:
  275.                 yangmax = 2**31
  276.                 while yangmax <= value:
  277.                     cheque += 1
  278.                     value -= ikashop.YANG_PER_CHEQUE
  279.  
  280.         if getattr(self, "moneyInputDialog", None) == None:
  281.             self.moneyInputDialog = uicommon.MoneyInputDialog()
  282.             self.moneyInputDialog.SetTitle(locale.IKASHOP_MONEY_INPUT_DIALOG_TITLE)
  283.             self._RegisterDialog(self.moneyInputDialog)
  284.  
  285.         if ENABLE_CHEQUE_SYSTEM:
  286.             self.moneyInputDialog.HideCheque() if nocheque \
  287.                 else self.moneyInputDialog.ShowCheque()
  288.  
  289.         self.moneyInputDialog.Open()
  290.         self.moneyInputDialog.SetAcceptEvent(acceptEvent)
  291.         self.moneyInputDialog.SetCancelEvent(denyEvent if denyEvent else self.moneyInputDialog.Hide)
  292.         self.moneyInputDialog.SetValue(value if value != 0 else "")
  293.         if ENABLE_CHEQUE_SYSTEM:
  294.             self.moneyInputDialog.SetCheque(cheque if cheque != 0 else "")
  295.  
  296.     def GetToolTip(self):
  297.         if getattr(self, "itemToolTip", None) == None:
  298.             self.itemToolTip = uitooltip.ItemToolTip()
  299.             self.itemToolTip.itemVnum = 1
  300.             self._RegisterDialog(self.itemToolTip)
  301.         return self.itemToolTip
  302.  
  303.     def Toggle(self):
  304.         self.Close() if self.IsShow()\
  305.             else self.Open()
  306.  
  307.     def ShowExclamationMark(self, pos = None):
  308.         rpos = pos if pos else (self.GetWidth() - 14, 1)
  309.         if not hasattr(self, "_ExclamationMark"):
  310.             self._ExclamationMark = self.CreateWidget(ui.ImageBox, pos = rpos )
  311.             self._ExclamationMark.LoadImage("ikashop/lite/mark.png")
  312.         self._ExclamationMark.Show()
  313.  
  314.     def HideExclamationMark(self):
  315.         if hasattr(self, '_ExclamationMark'):
  316.             self._ExclamationMark.Hide()
  317.  
  318. if ENABLE_DEFAULT_UI_BOARD:
  319.     class IkashopBoardWithTitleBar(IkarusShopWindow):
  320.         def __init__(self):
  321.             super(IkashopBoardWithTitleBar, self).__init__()
  322.             self._LoadIkashopBoardWithTitleBar()
  323.  
  324.         def _LoadIkashopBoardWithTitleBar(self):
  325.             self._internalBoard = self.CreateWidget(ui.BoardWithTitleBar, pos = (-2, -2))
  326.             self._internalBoard.SetSize(self.GetWidth()+6, self.GetHeight()+4)
  327.  
  328.         def _UpdateView(self):
  329.             if hasattr(self, "_internalBoard"):
  330.                 self._internalBoard.SetSize(self.GetWidth()+6, self.GetHeight()+4)
  331.  
  332.         def SetSize(self, w, h):
  333.             super(IkashopBoardWithTitleBar, self).SetSize(w,h)
  334.             self._UpdateView()
  335.  
  336.         def SetTitleName(self, title):
  337.             self._internalBoard.SetTitleName(title)
  338.  
  339.         def SetCloseEvent(self, event, *args):
  340.             self._internalBoard.SetCloseEvent(ui.__mem_func__(event, *args))
  341.  
  342.         def OnPressEscapeKey(self):
  343.             if self.IsShow():
  344.                 self.Close()
  345.                 return True
  346.             return False
  347.  
  348. else:
  349.     class IkashopBoardWithTitleBar(IkarusShopWindow):
  350.  
  351.         SIDE_MARGIN = 16
  352.  
  353.         def __init__(self):
  354.             super(IkashopBoardWithTitleBar, self).__init__()
  355.             self._LoadIkashopBoardWithTitleBar()
  356.  
  357.         def _LoadIkashopBoardWithTitleBar(self):
  358.             # loading center
  359.             self.centerImage = self.CreateWidget(ui.ExpandedImageBox, x = 3, y = 30)
  360.             self.centerImage.LoadImage("ikashop/lite/common/board/center.png")
  361.             self.centerImage.AddFlag("not_pick")
  362.  
  363.             # loading sides
  364.             self.leftSide = self.CreateWidget(ui.ExpandedImageBox, y = self.SIDE_MARGIN)
  365.             self.leftSide.LoadImage("ikashop/lite/common/board/left.png")
  366.             self.leftSide.AddFlag("not_pick")
  367.  
  368.             self.rightSide = self.CreateWidget(ui.ExpandedImageBox, y = self.SIDE_MARGIN)
  369.             self.rightSide.LoadImage("ikashop/lite/common/board/right.png")
  370.             self.rightSide.AddFlag("not_pick")
  371.  
  372.             self.bottomSide = self.CreateWidget(ui.ExpandedImageBox, x = self.SIDE_MARGIN)
  373.             self.bottomSide.LoadImage("ikashop/lite/common/board/bottom.png")
  374.             self.bottomSide.AddFlag("not_pick")
  375.  
  376.             # loading corners
  377.             self.leftBottomCorner = self.CreateWidget(ui.ImageBox)
  378.             self.leftBottomCorner.LoadImage("ikashop/lite/common/board/lb_corner.png")
  379.             self.leftBottomCorner.AddFlag("not_pick")
  380.  
  381.             self.rightBottomCorner = self.CreateWidget(ui.ImageBox)
  382.             self.rightBottomCorner.LoadImage("ikashop/lite/common/board/rb_corner.png")
  383.             self.rightBottomCorner.AddFlag("not_pick")
  384.  
  385.             # loading titlebar
  386.             self.titleLeft = self.CreateWidget(ui.ImageBox)
  387.             self.titleLeft.LoadImage("ikashop/lite/common/board/titlebar/left.png")
  388.             self.titleLeft.AddFlag("not_pick")
  389.  
  390.             self.titleRight = self.CreateWidget(ui.ImageBox)
  391.             self.titleRight.LoadImage("ikashop/lite/common/board/titlebar/right.png")
  392.             self.titleRight.AddFlag("not_pick")
  393.  
  394.             self.titleCenter = self.CreateWidget(ui.ExpandedImageBox, x = self.titleLeft.GetWidth())
  395.             self.titleCenter.LoadImage("ikashop/lite/common/board/titlebar/center.png")
  396.             self.titleCenter.AddFlag("not_pick")
  397.  
  398.             self.closeButton = self.CreateWidget(ui.Button, y = 3)
  399.             self.closeButton.SetUpVisual("ikashop/lite/common/board/titlebar/close/default.png")
  400.             self.closeButton.SetDownVisual("ikashop/lite/common/board/titlebar/close/default.png")
  401.             self.closeButton.SetOverVisual("ikashop/lite/common/board/titlebar/close/hover.png")
  402.  
  403.             self.titleText = self.CreateWidget(ui.TextLine)
  404.             self.titleText.SetHorizontalAlignCenter()
  405.             self.titleText.SetFontName("Tahoma:20")
  406.             self.titleText.SetPackedFontColor(0xFFFFFFFF)
  407.             self.titleText.SetOutline(1)
  408.             self.titleText.AddFlag("not_pick")
  409.  
  410.         def _UpdateView(self):
  411.             if getattr(self, "centerImage", None) == None:
  412.                 return
  413.  
  414.             width = float(self.GetWidth())
  415.             height = float(self.GetHeight())
  416.  
  417.             # updating center
  418.             centerWidth = width - 6
  419.             centerHeight = height - 33
  420.             centerHorizontalScale = centerWidth / self.centerImage.GetWidth()
  421.             centerVerticalScale = centerHeight / self.centerImage.GetHeight()
  422.             self.centerImage.SetRenderingRect(0.0, 0.0, centerHorizontalScale - 1.0, centerVerticalScale - 1.0)
  423.  
  424.             # updating sides
  425.             sideVerticalScale = (height - self.SIDE_MARGIN*2) / self.leftSide.GetHeight()
  426.             self.leftSide.SetRenderingRect(0.0, 0.0, 0.0, sideVerticalScale - 1.0)
  427.             sideVerticalScale = (height - self.SIDE_MARGIN*2) / self.rightSide.GetHeight()
  428.             self.rightSide.SetRenderingRect(0.0, 0.0, 0.0, sideVerticalScale - 1.0)
  429.             self.rightSide.SetPosition(width - self.rightSide.GetWidth(), self.SIDE_MARGIN)
  430.             sideHorizontalScale = (width - self.SIDE_MARGIN*2) / self.bottomSide.GetWidth()
  431.             self.bottomSide.SetRenderingRect(0.0, 0.0, sideHorizontalScale - 1.0, 0.0)
  432.             self.bottomSide.SetPosition(self.SIDE_MARGIN, height - self.bottomSide.GetHeight())
  433.  
  434.             # updating corner positions
  435.             self.leftBottomCorner.SetPosition(0, height - self.leftBottomCorner.GetHeight())
  436.             self.rightBottomCorner.SetPosition(width - self.rightBottomCorner.GetWidth(), height - self.rightBottomCorner.GetHeight())
  437.  
  438.             # updating titlebar
  439.             titlebarCenterWidth = width - self.titleLeft.GetWidth() - self.titleRight.GetWidth()
  440.             titlebarCenterWidth = max(10, titlebarCenterWidth)
  441.             titlebarCenterScale = titlebarCenterWidth / self.titleCenter.GetWidth()
  442.             self.titleCenter.SetScale(titlebarCenterScale, 1.0)
  443.             self.titleRight.SetPosition(titlebarCenterWidth + self.titleLeft.GetWidth(), 0)
  444.             self.closeButton.SetPosition(width - self.closeButton.GetWidth() - 6, self.closeButton.GetLocalPosition()[1])
  445.             self.titleText.SetPosition(width/2, 3)
  446.  
  447.         def SetSize(self, w, h):
  448.             super(IkashopBoardWithTitleBar, self).SetSize(w,h)
  449.             self._UpdateView()
  450.  
  451.         def SetTitleName(self, title):
  452.             self.titleText.SetText(title)
  453.  
  454.         def SetCloseEvent(self, event, *args):
  455.             self.closeButton.SetEvent(event, *args)
  456.  
  457.         def OnPressEscapeKey(self):
  458.             if self.IsShow():
  459.                 self.Close()
  460.                 return True
  461.             return False
  462.  
  463.  
  464. class IkarusShopSafeboxBoard(IkashopBoardWithTitleBar):
  465.  
  466.     GRID_COLUMNS = ikashop.SAFEBOX_GRID_WIDTH
  467.     GRID_ROWS = ikashop.SAFEBOX_GRID_HEIGHT
  468.     PAGE_COUNT = ikashop.SAFEBOX_PAGE_COUNT
  469.  
  470.  
  471.     def __init__(self):
  472.         super(IkarusShopSafeboxBoard, self).__init__()
  473.         self.items = []
  474.         self._SettingUpBoard()
  475.         self._LoadIkarusShopSafeboxBoard()
  476.  
  477.     def _SettingUpBoard(self):
  478.         sw, sh = GetScreenSize()
  479.         self.SetSize(324, 438)
  480.         self.SetTitleName(locale.IKASHOP_SAFEBOX_BOARD_TITLE)
  481.         self.SetCloseEvent(self.Close)
  482.         self.SetPosition(sw/2 - self.GetWidth(), sh / 2 - self.GetHeight()/2)
  483.         self.AddFlag("movable")
  484.         self.AddFlag("float")
  485.  
  486.     def _LoadIkarusShopSafeboxBoard(self):
  487.         # making slot box
  488.         self.slotBox = self.CreateWidget(ui.ImageBox, pos = (11, 35))
  489.         self.slotBox.LoadImage("ikashop/lite/safebox/slot_box.png")
  490.  
  491.         self.slotWindow = self.CreateWidget(ui.GridSlotWindow, parent = self.slotBox, pos = (6,6))
  492.         self.slotWindow.ArrangeSlot(0, self.GRID_COLUMNS, self.GRID_ROWS, SLOT_SIZE, SLOT_SIZE, 0, 0)
  493.         self.slotWindow.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
  494.         self.slotWindow.SetOverInItemEvent(self._ShowToolTipOnItemSlot)
  495.         self.slotWindow.SetOverOutItemEvent(self._HideToolTipOnItemSlot)
  496.         self.slotWindow.SetSelectItemSlotEvent(self._OnClickItemSlot)
  497.  
  498.         # making money box
  499.         self.moneyBox = self.CreateWidget(ui.ImageBox, pos = (11, 404))
  500.         self.moneyBox.LoadImage("ikashop/lite/safebox/money_box.png")
  501.         mx, my = self.moneyBox.GetLocalPosition()
  502.  
  503.         self.moneyText = self.CreateWidget(ui.TextLine, parent = self.moneyBox, pos = (23, 4))
  504.         self.moneyText.SetFontName("Tahoma:11")
  505.         self.moneyText.SetPackedFontColor(0xFFFFFFFF)
  506.         self.moneyText.SetText(locale.NumberToString(2**31))
  507.  
  508.         self.moneyClaimButton = self.CreateWidget(ui.Button, pos = (mx + self.moneyBox.GetWidth() + 2, my))
  509.         self.moneyClaimButton.SetUpVisual("ikashop/lite/safebox/buttons/claim_money/default.png")
  510.         self.moneyClaimButton.SetOverVisual("ikashop/lite/safebox/buttons/claim_money/hover.png")
  511.         self.moneyClaimButton.SetDownVisual("ikashop/lite/safebox/buttons/claim_money/default.png")
  512.         self.moneyClaimButton.SetToolTipText(locale.IKASHOP_SAFEBOX_CLAIM_MONEY_BUTTON_TEXT)
  513.         self.moneyClaimButton.SetEvent(self._OnClickClaimMoneyButton)
  514.  
  515.         # making page selection box
  516.         self.selectPageButtons = []
  517.         for i in xrange(self.PAGE_COUNT):
  518.             selectPageButton = self.CreateWidget(ui.Button, pos = (158 + i*41, 405))
  519.             selectPageButton.SetUpVisual("ikashop/lite/safebox/buttons/select_page/default.png")
  520.             selectPageButton.SetDownVisual("ikashop/lite/safebox/buttons/select_page/default.png")
  521.             selectPageButton.SetOverVisual("ikashop/lite/safebox/buttons/select_page/hover.png")
  522.             selectPageButton.SetDisableVisual("ikashop/lite/safebox/buttons/select_page/disabled.png")
  523.             selectPageButton.SetText(RomeNumber(i+1))
  524.             selectPageButton.SAFE_SetEvent(self._OnSelectPage, i)
  525.             self.selectPageButtons.append(selectPageButton)
  526.  
  527.         # making claim items button
  528.         self.itemsClaimButton = self.CreateWidget(ui.Button, pos = (158 + self.PAGE_COUNT*41 + 2, 405))
  529.         self.itemsClaimButton.SetUpVisual("ikashop/lite/safebox/buttons/claim_items/default.png")
  530.         self.itemsClaimButton.SetDownVisual("ikashop/lite/safebox/buttons/claim_items/default.png")
  531.         self.itemsClaimButton.SetOverVisual("ikashop/lite/safebox/buttons/claim_items/hover.png")
  532.         self.itemsClaimButton.SetToolTipText(locale.IKASHOP_SAFEBOX_CLAIM_ITEMS_BUTTON_TEXT)
  533.         self.itemsClaimButton.SAFE_SetEvent(self._OnClickClaimAllItemsButton)
  534.  
  535.         # default opening first page
  536.         self._OnSelectPage(0)
  537.  
  538.     def _OnSelectPage(self, num):
  539.         for button in self.selectPageButtons:
  540.             button.Enable()
  541.         self.selectPageButtons[num].Disable()
  542.         self.currentPage = num
  543.         self._RefreshPage()
  544.  
  545.     def _RefreshPage(self):
  546.         cells = self.GRID_COLUMNS * self.GRID_ROWS
  547.         srange = cells * self.currentPage
  548.         erange = srange + cells
  549.  
  550.         for i in xrange(srange, erange):
  551.             local = i - srange
  552.             if not i in self.items:
  553.                 self.slotWindow.ClearSlot(local)
  554.                 continue
  555.             data = self.items[i]
  556.             count = data['count'] if data['count'] > 1 else 0
  557.             self.slotWindow.SetItemSlot(local, data['vnum'], count)
  558.  
  559.         self.slotWindow.RefreshSlot()
  560.  
  561.     def _RefreshItems(self, items):
  562.         self.items = {item['cell'] : item for item in items}
  563.         self._RefreshPage()
  564.  
  565.     def _ShowToolTipOnItemSlot(self, slot):
  566.         slot = slot + self.currentPage * (self.GRID_COLUMNS * self.GRID_ROWS)
  567.         if slot in self.items:
  568.             data = self.items[slot]
  569.             tooltip = self.GetToolTip()
  570.             tooltip.ClearToolTip()
  571.             tooltip.AddItemData(data['vnum'], data['sockets'], data['attrs'])
  572.             tooltip.AppendTextLine(locale.IKASHOP_SAFEBOX_CLAIM_ITEM_TOOLTIP)
  573.             tooltip.ShowToolTip()
  574.  
  575.     def _HideToolTipOnItemSlot(self, slot=0):
  576.         tooltip = self.GetToolTip()
  577.         tooltip.ClearToolTip()
  578.         tooltip.HideToolTip()
  579.  
  580.     def _OnClickItemSlot(self, cell):
  581.         cell = cell + self.currentPage * (self.GRID_COLUMNS * self.GRID_ROWS)
  582.         if cell in self.items:
  583.             data = self.items[cell]
  584.             ikashop.SendSafeboxGetItem(data['id'])
  585.  
  586.     def _OnClickClaimAllItemsButton(self):
  587.         self.OpenQuestionDialog(
  588.             locale.IKASHOP_SAFEBOX_CLAIM_ALL_ITEMS_QUESTION, self._OnAcceptClaimAllItemsQuestion)
  589.  
  590.     def _OnClickClaimMoneyButton(self):
  591.  
  592.  
  593.         ikashop.SendSafeboxGetValutes()
  594.  
  595.     def _OnAcceptClaimAllItemsQuestion(self):
  596.         self.questionDialog.Hide()
  597.         for item in self.items.values():
  598.             ikashop.SendSafeboxGetItem(item['id'])
  599.  
  600.     def Open(self):
  601.         self.SetTop()
  602.         if not self.IsShow():
  603.             ikashop.SendSafeboxOpen()
  604.  
  605.     def Setup(self, yang, items):
  606.         if not self.IsShow():
  607.             self.Show()
  608.             self.SetTop()
  609.  
  610.         self.moneyText.SetText(locale.NumberToString(yang))
  611.         self._RefreshItems(items)
  612.  
  613.     def RemoveItem(self, itemid):
  614.         items = [data for data in self.items.values() if data['id'] != itemid]
  615.         self._RefreshItems(items)
  616.  
  617.     def AddItem(self, item):
  618.         items = list(self.items.values()) + [item,]
  619.         self._RefreshItems(items)
  620.  
  621.     def Destroy(self):
  622.         super(IkarusShopSafeboxBoard, self).Destroy()
  623.  
  624.     def Close(self):
  625.         ikashop.SendSafeboxClose()
  626.         self.Hide()
  627.  
  628. class IkarusCreateAuctionDialog(IkashopBoardWithTitleBar):
  629.  
  630.     def __init__(self):
  631.         super(IkarusCreateAuctionDialog, self).__init__()
  632.         self._LoadIkarusCreateAuctionDialog()
  633.         self._InsertedItem = None
  634.         self._ItemInfo = None
  635.  
  636.     def _LoadIkarusCreateAuctionDialog(self):
  637.         self._SettingUpBoard()
  638.  
  639.         # loading slot
  640.         self.slot = self.CreateWidget(ui.GridSlotWindow, pos = (self.GetWidth()/2- 17, 45))
  641.         self.slot.ArrangeSlot(0, 1, 3, SLOT_SIZE, SLOT_SIZE, 0, 0)
  642.         self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
  643.         self.slot.SetSelectEmptySlotEvent(self._OnClickEmptySlot)
  644.         self.slot.SetSelectItemSlotEvent(self._OnClickItemSlot)
  645.         self.slot.SetOverInItemEvent(self._ShowToolTipOnItemSlot)
  646.         self.slot.SetOverOutItemEvent(self._HideToolTipOnItemSlot)
  647.  
  648.         # loading continue button
  649.         self.proceedButton = self.CreateWidget(ui.Button, pos = (self.GetWidth() / 2 - 53, self.GetHeight() - 40))
  650.         self.proceedButton.SetUpVisual("ikashop/lite/auction/raise_button/default.png")
  651.         self.proceedButton.SetDownVisual("ikashop/lite/auction/raise_button/default.png")
  652.         self.proceedButton.SetOverVisual("ikashop/lite/auction/raise_button/hover.png")
  653.         self.proceedButton.SetText(locale.IKASHOP_ACUTION_CREATE_CREATE_BUTTON)
  654.         self.proceedButton.SAFE_SetEvent(self._OnClickCreateAuction)
  655.         self.proceedButton.Show()
  656.         self.proceedButton.ButtonText.SetPosition(self.proceedButton.GetWidth()/2 + 12, self.proceedButton.GetHeight()/2-1)
  657.  
  658.     def _SettingUpBoard(self):
  659.         sw, sh = GetScreenSize()
  660.         self.SetSize(145, 195)
  661.         self.SetTitleName(locale.IKASHOP_AUCTION_CREATE_BOARD_TITLE)
  662.         self.SetCloseEvent(self.Close)
  663.         self.SetPosition(sw/2 - self.GetWidth()/2, sh / 2 - self.GetHeight()/2)
  664.         self.AddFlag("movable")
  665.         self.AddFlag("float")
  666.  
  667.     def _Reset(self):
  668.         # reset slots
  669.         for i in xrange(3):
  670.             self.slot.ClearSlot(i)
  671.         self.slot.RefreshSlot()
  672.  
  673.         if hasattr(self, "moneyInputDialog"):
  674.             self.moneyInputDialog.SoftClose()
  675.  
  676.         self._InsertedItem = None
  677.         self._ItemInfo = None
  678.  
  679.     def _OnClickEmptySlot(self, slot):
  680.         if self._InsertedItem != None:
  681.             return
  682.         if mouse.mouseController.isAttached():
  683.             attachedType = mouse.mouseController.GetAttachedType()
  684.             attachedItemIndex = mouse.mouseController.GetAttachedItemIndex()
  685.             attachedItemSlotPos = mouse.mouseController.GetAttachedSlotNumber()
  686.             mouse.mouseController.DeattachObject()
  687.             # validating attached item
  688.             if attachedType in (player.SLOT_TYPE_DRAGON_SOUL_INVENTORY, player.SLOT_TYPE_INVENTORY):
  689.                 win, pos = player.SlotTypeToInvenType(attachedType), attachedItemSlotPos
  690.                 if player.ITEM_MONEY != attachedItemIndex:
  691.                     self.InsertItemInSlot(win, pos)
  692.  
  693.     def _OnClickItemSlot(self, slot):
  694.         if mouse.mouseController.isAttached():
  695.             return
  696.         self._Reset()
  697.  
  698.     def _ShowToolTipOnItemSlot(self, slot):
  699.         win, pos = self._InsertedItem
  700.         tooltip = self.GetToolTip()
  701.         tooltip.SetInventoryItem(pos, win)
  702.         tooltip.AppendTextLine(locale.IKASHOP_AUCTION_CREATE_REMOVE_ITEM)
  703.  
  704.     def _HideToolTipOnItemSlot(self, slot = 0):
  705.         tooltip = self.GetToolTip()
  706.         tooltip.ClearToolTip()
  707.         tooltip.HideToolTip()
  708.  
  709.     def _OnClickCreateAuction(self):
  710.         self.OpenMoneyInputDialog(self._OnAcceptStartingPriceInput, nocheque = 1)
  711.         if app.EXTEND_IKASHOP_ULTIMATE:
  712.             vnum, count, hash = self._ItemInfo
  713.             ikashop.SendPriceAverageRequest(vnum, count)
  714.             self.moneyInputDialog.SetPriceAverage(-1)
  715.  
  716.     def _OnAcceptStartingPriceInput(self):
  717.         # extracting value
  718.         value = self.moneyInputDialog.GetText()
  719.         value = value.lower().replace("k", "000")
  720.         self.moneyInputDialog.SoftClose()
  721.  
  722.         # validating value
  723.         if not value or not value.isdigit():
  724.             self.OpenPopupDialog(locale.IKASHOP_BUSINESS_INVALID_ITEM_PRICE)
  725.             return
  726.  
  727.         if self._InsertedItem is None:
  728.             return
  729.  
  730.         win, pos = self._InsertedItem
  731.  
  732.         self.Close()
  733.         ikashop.SendAuctionCreate(win, pos, long(value))
  734.         return True
  735.  
  736.     def InsertItemInSlot(self, win, pos):
  737.         vnum = player.GetItemIndex(win, pos)
  738.         count = player.GetItemCount(win, pos)
  739.  
  740.         # checking item antifalg
  741.         item.SelectItem(vnum)
  742.         if item.IsAntiFlag(item.ANTIFLAG_GIVE) or item.IsAntiFlag(item.ANTIFLAG_MYSHOP):
  743.             self.OpenPopupDialog(locale.IKASHOP_BUSINESS_CANNOT_SELL_ITEM)
  744.             return
  745.  
  746.         self._InsertedItem = win, pos
  747.         self._ItemInfo = vnum, count, GetInventoryItemHash(win, pos)
  748.  
  749.         self.slot.SetItemSlot(0, vnum, count if count > 1 else 0)
  750.         self.slot.RefreshSlot()
  751.  
  752.     def Open(self):
  753.         self._Reset()
  754.         self.Show()
  755.         self.SetTop()
  756.         if app.EXTEND_IKASHOP_PRO:
  757.             player.RefreshInventory()
  758.  
  759.     def Close(self):
  760.         self.Hide()
  761.         if app.EXTEND_IKASHOP_PRO:
  762.             player.RefreshInventory()
  763.  
  764.     def OnUpdate(self):
  765.         if self._ItemInfo != None:
  766.             win, pos = self._InsertedItem
  767.             vnum, count, hash = self._ItemInfo
  768.  
  769.             if vnum != player.GetItemIndex(win, pos):
  770.                 self._Reset()
  771.             elif count != player.GetItemCount(win, pos):
  772.                 self._Reset()
  773.             elif hash != GetInventoryItemHash(win, pos):
  774.                 self._Reset()
  775.  
  776.  
  777. class IkarusShopAuctionOfferView(IkarusShopWindow):
  778.  
  779.     def __init__(self):
  780.         super(IkarusShopAuctionOfferView, self).__init__()
  781.         self._LoadIkarusShopAuctionOfferView()
  782.  
  783.     def _LoadIkarusShopAuctionOfferView(self):
  784.         # making background and fitting its size
  785.         self.background = self.CreateWidget(ui.ImageBox, pos = ())
  786.         self.background.LoadImage("ikashop/lite/auction/offer_box.png")
  787.         self.SetSize(self.background.GetWidth(), self.background.GetHeight())
  788.  
  789.         # making name text
  790.         self.nameText = self.CreateWidget(ui.TextLine, pos = (28, 5))
  791.         self.nameText.SetPackedFontColor(0xFFFFFFFF)
  792.         self.nameText.SetFontName("Tahoma:11")
  793.  
  794.         # making datetime
  795.         self.datetimeText = self.CreateWidget(ui.TextLine, pos = (168 + 13, 5))
  796.         self.datetimeText.SetPackedFontColor(0xFFFFFFFF)
  797.         self.datetimeText.SetHorizontalAlignCenter()
  798.  
  799.         # making money text
  800.         self.moneyText = self.CreateWidget(ui.TextLine, pos = (256 + 13, 5))
  801.         self.moneyText.SetPackedFontColor(0xFFFFFFFF)
  802.  
  803.     def Setup(self, pos, data):
  804.         name, datetime, price = data['buyername'], data['datetime'], data['price']
  805.         self.nameText.SetText("{}. {}".format(pos, name))
  806.         self.datetimeText.SetText(DatetimeFormat(datetime))
  807.         self.moneyText.SetText(locale.NumberToString(price))
  808.         self.Show()
  809.  
  810. class IkarusShopAuctionOwnerBoard(IkashopBoardWithTitleBar):
  811.     OFFER_VIEW_COUNT = 6
  812.     OFFER_VIEW_HEIGHT = 28
  813.     RAISE_FACTOR = 1.0 + float(AUCTION_MIN_RAISE_PERCENTAGE) / 100.0
  814.  
  815.     def __init__(self):
  816.         super(IkarusShopAuctionOwnerBoard, self).__init__()
  817.         self._SettingUpBoard()
  818.         self._LoadIkarusShopAuctionOwnerBoard()
  819.  
  820.     def _SettingUpBoard(self):
  821.         sw, sh = GetScreenSize()
  822.         self.SetSize(513 + 13, 249)
  823.         self.SetTitleName(locale.IKASHOP_AUCTION_BOARD_TITLE)
  824.         self.SetCloseEvent(self.Close)
  825.         self.SetPosition(sw/2 - self.GetWidth(), sh / 2 - self.GetHeight()/2 + 100)
  826.         self.AddFlag("movable")
  827.         self.AddFlag("float")
  828.  
  829.     def _LoadIkarusShopAuctionOwnerBoard(self):
  830.         # making info box
  831.         self.infoBox = self.CreateWidget(ui.ImageBox, pos = (12, 36))
  832.         self.infoBox.LoadImage("ikashop/lite/auction/info_box.png")
  833.         self.infoBox.SetMouseWheelEvent(self._MouseWheelScrollOffers)
  834.  
  835.         self.minRaiseText = self.CreateWidget(ui.TextLine, pos = (458+13, 221-36), parent = self.infoBox)
  836.         self.minRaiseText.SetPackedFontColor(0xFFFFFFFF)
  837.         self.minRaiseText.SetHorizontalAlignRight()
  838.  
  839.         self.durationText = self.CreateWidget(ui.TextLine, pos = (141, 221-36), parent = self.infoBox)
  840.         self.durationText.SetPackedFontColor(0xFFFFFFFF)
  841.  
  842.         # making slot
  843.         self.slot = self.CreateWidget(ui.GridSlotWindow, pos = (36, 44), size = (32, 98), parent = self.infoBox)
  844.         self.slot.ArrangeSlot(0, 1, 3, SLOT_SIZE, SLOT_SIZE, 0, 0)
  845.         self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
  846.         self.slot.SetOverInItemEvent(self._OverInItem)
  847.         self.slot.SetOverOutItemEvent(self._OverOutItem)
  848.  
  849.         # making scrollbar
  850.         self.offerScrollbar = self.CreateWidget(ui.ScrollBar, pos = (470+13, 4), parent = self.infoBox)
  851.         self.offerScrollbar.SetScrollBarSize(self.infoBox.GetHeight() - 35)
  852.         self.offerScrollbar.SetScrollEvent(self._ScrollOffers)
  853.  
  854.         # making cancel auction button
  855.         self.cancelAuctionButton = self.CreateWidget(ui.Button, pos = (12, self.GetHeight() - 33))
  856.         self.cancelAuctionButton.SetUpVisual("ikashop/lite/auction/cancel_button/default.png")
  857.         self.cancelAuctionButton.SetDownVisual("ikashop/lite/auction/cancel_button/default.png")
  858.         self.cancelAuctionButton.SetOverVisual("ikashop/lite/auction/cancel_button/hover.png")
  859.         self.cancelAuctionButton.SetText(locale.IKASHOP_ACUTION_CANCEL_AUCTION_BUTTON)
  860.         self.cancelAuctionButton.SAFE_SetEvent(self._OnClickCancelAuction)
  861.         self.cancelAuctionButton.Show()
  862.  
  863.         # making offers
  864.         self.offerViews = []
  865.         for i in xrange(self.OFFER_VIEW_COUNT):
  866.             self.offerViews.append(self.CreateWidget(
  867.                 IkarusShopAuctionOfferView, pos = (115, 6 + i*self.OFFER_VIEW_HEIGHT), parent = self.infoBox))
  868.  
  869.     def _RefreshOffers(self):
  870.         # calculating count difference
  871.         diff = len(self.offers) - self.OFFER_VIEW_COUNT
  872.         diff = max(diff, 0)
  873.  
  874.         # calculating ranges
  875.         offset = self.offerScrollbar.GetPos()
  876.         sindex = int(diff * offset)
  877.         eindex = sindex + min(self.OFFER_VIEW_COUNT, len(self.offers))
  878.  
  879.         # iterating over views
  880.         for i, view in enumerate(self.offerViews):
  881.             ri = i + sindex
  882.             view.Hide() if ri >= eindex \
  883.                 else view.Setup(ri+1, self.offers[ri])
  884.  
  885.         # updating scrollbar middlebar length
  886.         viewHeight = self.OFFER_VIEW_HEIGHT
  887.         self.offerScrollbar.UpdateScrollbarLenght(viewHeight * len(self.offers))
  888.  
  889.     def _MouseWheelScrollOffers(self, delta):
  890.         if self.offerScrollbar.IsShow():
  891.             self.offerScrollbar.OnDown() if delta < 0 \
  892.                 else self.offerScrollbar.OnUp()
  893.         return True
  894.  
  895.     def _ScrollOffers(self):
  896.         if self.offerScrollbar.IsShow():
  897.             self._RefreshOffers()
  898.  
  899.     def _UpdateScrollbarState(self):
  900.         self.offerScrollbar.SetPos(0)
  901.         if len(self.offers) <= self.OFFER_VIEW_COUNT:
  902.             self.offerScrollbar.Hide()
  903.         else:
  904.             self.offerScrollbar.Show()
  905.  
  906.     def _OverInItem(self, slot):
  907.         data = self.auctionInfo
  908.         tooltip = self.GetToolTip()
  909.         tooltip.ClearToolTip()
  910.         tooltip.AddItemData(data['vnum'], data['sockets'], data['attrs'])
  911.         if app.EXTEND_IKASHOP_ULTIMATE:
  912.             tooltip.AppendTextLine(locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_NOT_AVAILABLE) if data['priceavg'] == 0 \
  913.                 else tooltip.AppendTextLine(locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_VALUE.format(locale.NumberToMoneyString(data['priceavg'])))
  914.         tooltip.ShowToolTip()
  915.  
  916.     def _OverOutItem(self, slot = 0):
  917.         tooltip = self.GetToolTip()
  918.         tooltip.ClearToolTip()
  919.         tooltip.HideToolTip()
  920.  
  921.     def _OnClickCancelAuction(self):
  922.         if self.auctionInfo['offers']:
  923.             self.OpenPopupDialog(locale.IKASHOP_AUCTION_CANNOT_CANCEL)
  924.             return
  925.  
  926.         self.OpenQuestionDialog(locale.IKASHOP_AUCTION_CANCEL_AUCTION_QUESTION, self._OnAcceptCancelAuction)
  927.  
  928.     def _OnAcceptCancelAuction(self):
  929.         ikashop.SendMyAuctionCancel()
  930.         self.questionDialog.Close()
  931.         self.Close()
  932.  
  933.     def SetOffers(self, offers):
  934.         self.offers = sorted(offers, key = lambda val : val['datetime'], reverse=True)
  935.         self._UpdateScrollbarState()
  936.         self._RefreshOffers()
  937.         self.RefreshMinRaise()
  938.  
  939.     def SetDuration(self, duration):
  940.         self.durationText.SetText(locale.SecondToDHM(duration*60))
  941.  
  942.     def _GetMinRaise(self):
  943.         if not self.offers:
  944.             return self.auctionInfo['price']
  945.  
  946.         minraise = max([val['price'] for val in self.offers])
  947.         if minraise < 1000:
  948.             return minraise + 1000
  949.  
  950.         return minraise * (100+AUCTION_MIN_RAISE_PERCENTAGE) / 100
  951.  
  952.     def RefreshMinRaise(self):
  953.         self.minRaise = self._GetMinRaise()
  954.         self.minRaiseText.SetText(locale.IKASHOP_AUCTION_MIN_BID + '  ' + locale.NumberToString(self.minRaise))
  955.  
  956.     def Open(self):
  957.         ikashop.SendMyAuctionOpen()
  958.  
  959.     def Close(self):
  960.         self.Hide()
  961.         ikashop.SendMyAuctionClose()
  962.  
  963.     def Setup(self, data):
  964.         # storing data
  965.         self.auctionInfo = data
  966.  
  967.         # refreshing duration
  968.         seconds = data['duration'] * 60
  969.         self.durationText.SetText(locale.SecondToDHM(seconds))
  970.  
  971.         # refreshing item
  972.         vnum = data['vnum']
  973.         count = data['count'] if data['count'] > 1 else 0
  974.         item.SelectItem(vnum)
  975.         size = item.GetItemSize()[1]
  976.         self.slot.ArrangeSlot(0, 1, size, SLOT_SIZE, SLOT_SIZE, 0, 0)
  977.         self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
  978.         self.slot.SetItemSlot(0, vnum, count)
  979.  
  980.         # refreshing offers
  981.         self.SetOffers(data['offers'])
  982.  
  983.         if not self.IsShow():
  984.             self.Show()
  985.             self.SetTop()
  986.  
  987. class IkarusShopListBoard(IkashopBoardWithTitleBar):
  988.  
  989.     def _LoadIkarusShopListBoard(self):
  990.         # making board box
  991.         self.boardBox = self.CreateWidget(ui.ExpandedImageBox, pos = (11,36))
  992.         self.boardBox.LoadImage("ikashop/lite/list_box.png")
  993.         boardBoxHorizontalScale = float(self.GetWidth() - 22 - 16) / self.boardBox.GetWidth()
  994.         boardBoxVerticalScale =  float(self.GetHeight() - 47) / self.boardBox.GetHeight()
  995.         self.boardBox.SetScale(boardBoxHorizontalScale, boardBoxVerticalScale)
  996.         self.boardBox.SetMouseWheelEvent(self._MouseWheelScrollElements)
  997.  
  998.         # making scrollbar
  999.         self.elementScrollbar = self.CreateWidget(ui.ScrollBar, pos = (self.GetWidth() - 24, 36))
  1000.         self.elementScrollbar.SetScrollBarSize(self.boardBox.GetHeight())
  1001.         self.elementScrollbar.SetScrollEvent(self._ScrollElements)
  1002.  
  1003.         # making empty header
  1004.         self.emptyHeader = self.CreateWidget(ui.TextLine, pos = (self.GetWidth()/2, self.GetHeight()/2 - 10))
  1005.         self.emptyHeader.SetFontName("Tahoma:14")
  1006.         self.emptyHeader.SetPackedFontColor(0xFFFFFFFF)
  1007.         self.emptyHeader.SetOutline(1)
  1008.         self.emptyHeader.SetHorizontalAlignCenter()
  1009.         self.emptyHeader.SetVerticalAlignCenter()
  1010.         self.emptyHeader.SetText(locale.IKASHOP_GENERIC_LIST_EMPTY_HEADER)
  1011.  
  1012.     def _SettingUpBoard(self):
  1013.         sw, sh = GetScreenSize()
  1014.         self.SetCloseEvent(getattr(self, "Close", self.Hide))
  1015.         self.SetPosition(sw/2 + 20 - (self.GetWidth() - 200), sh / 2 - self.GetHeight()/2)
  1016.         self.AddFlag("movable")
  1017.         self.AddFlag("float")
  1018.  
  1019.     def _MakeListElements(self, type, viewCount):
  1020.         self.viewCount = viewCount
  1021.         # making notifiction boxes
  1022.         self.views = []
  1023.         for i in xrange(self.viewCount):
  1024.             view = self.CreateWidget(type, parent = self.boardBox)
  1025.             space = view.GetHeight()+2
  1026.             view.SetPosition(9, 7 + i * space)
  1027.             self.views.append(view)
  1028.  
  1029.     def _ScrollElements(self):
  1030.         if self.elementScrollbar.IsShow():
  1031.             self._RefreshElements()
  1032.  
  1033.     def _MouseWheelScrollElements(self, delta):
  1034.         if self.elementScrollbar.IsShow():
  1035.             self.elementScrollbar.OnDown() if delta < 0 \
  1036.                 else self.elementScrollbar.OnUp()
  1037.         return True
  1038.  
  1039.     def _UpdateScrollbarState(self):
  1040.         if len(self.elements) <= self.viewCount:
  1041.             self.elementScrollbar.SetPos(0)
  1042.             self.elementScrollbar.Hide()
  1043.         else:
  1044.             self.elementScrollbar.Show()
  1045.  
  1046.     def _RefreshElements(self):
  1047.         # calculating count difference
  1048.         diff = len(self.elements) - self.viewCount
  1049.         diff = max(diff, 0)
  1050.  
  1051.         # calculating ranges
  1052.         offset = self.elementScrollbar.GetPos()
  1053.         sindex = int(diff * offset)
  1054.         eindex = sindex + min(self.viewCount, len(self.elements))
  1055.  
  1056.         # iterating over views
  1057.         for i, view in enumerate(self.views):
  1058.             ri = i + sindex
  1059.             if ri >= eindex:
  1060.                 view.Hide()
  1061.             else:
  1062.                 view.Setup(self.elements[ri])
  1063.                 view.Show()
  1064.  
  1065.         # updating scrollbar middlebar length
  1066.         viewHeight = self.views[0].GetHeight()+2
  1067.         self.elementScrollbar.UpdateScrollbarLenght(viewHeight * len(self.elements))
  1068.  
  1069.     def SetElements(self, elements):
  1070.         self.elements = elements
  1071.         self._UpdateScrollbarState()
  1072.         self._RefreshElements()
  1073.  
  1074.         self.emptyHeader.Show() if not elements \
  1075.             else self.emptyHeader.Hide()
  1076.  
  1077.  
  1078. class IkarusShopOfferView(IkarusShopWindow):
  1079.  
  1080.     def __init__(self):
  1081.         super(IkarusShopOfferView, self).__init__()
  1082.         self._LoadIkarusShopOfferView()
  1083.  
  1084.     def _LoadIkarusShopOfferView(self):
  1085.         # making background
  1086.         self.background = self.CreateWidget(ui.ExpandedImageBox)
  1087.         self.background.LoadImage("ikashop/lite/search_shop/result_item_box.png")
  1088.         self.SetSize(self.background.GetWidth(), self.background.GetHeight())
  1089.  
  1090.         # making textlines
  1091.         self.itemName = self.CreateWidget(ui.TextLine, pos = (60, 17 - 6))
  1092.         self.itemName.SetPackedFontColor(0xFFFFFFFF)
  1093.         self.sellerName = self.CreateWidget(ui.TextLine, pos = (78, 41 - 6))
  1094.         self.duration = self.CreateWidget(ui.TextLine, pos = (226, 41 - 6))
  1095.         self.price = self.CreateWidget(ui.TextLine, pos = (78, 58))
  1096.  
  1097.         if app.EXTEND_IKASHOP_ULTIMATE:
  1098.             self.priceAverage = self.CreateWidget(ui.TextLine, pos = (330-8, 58))
  1099.             self.priceAverage.SetHorizontalAlignRight()
  1100.  
  1101.         # making buttons
  1102.         self.acceptOfferButton = self.CreateWidget(ui.Button, pos = (261, 84))
  1103.         self.acceptOfferButton.SetUpVisual("ikashop/lite/search_shop/buy_button/default.png")
  1104.         self.acceptOfferButton.SetDownVisual("ikashop/lite/search_shop/buy_button/default.png")
  1105.         self.acceptOfferButton.SetOverVisual("ikashop/lite/search_shop/buy_button/hover.png")
  1106.         self.acceptOfferButton.SAFE_SetEvent(self._OnClickAcceptOffer)
  1107.         self.acceptOfferButton.SetText(locale.IKASHOP_OFFER_LIST_ACCEPT_OFFER_BUTTON_TEXT)
  1108.  
  1109.         self.cancelOfferButton = self.CreateWidget(ui.Button, pos = (189, 84))
  1110.         self.cancelOfferButton.SetUpVisual("ikashop/lite/search_shop/offer_button/default.png")
  1111.         self.cancelOfferButton.SetDownVisual("ikashop/lite/search_shop/offer_button/default.png")
  1112.         self.cancelOfferButton.SetOverVisual("ikashop/lite/search_shop/offer_button/hover.png")
  1113.         self.cancelOfferButton.SAFE_SetEvent(self._OnClickCancelButton)
  1114.         self.cancelOfferButton.SetText(locale.IKASHOP_SEARCH_SHOP_OFFER_BUTTON_TEXT)
  1115.  
  1116.         # making slot item
  1117.         self.slot = self.CreateWidget(ui.GridSlotWindow, pos = (9, 7))
  1118.         self.slot.ArrangeSlot(0, 1, 3, SLOT_SIZE, SLOT_SIZE, 0, 0)
  1119.         self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
  1120.         self.slot.SetOverInItemEvent(self._OverInItem)
  1121.         self.slot.SetOverOutItemEvent(self._OverOutItem)
  1122.  
  1123.     def _OverInItem(self, slot):
  1124.         tooltip = self.GetToolTip()
  1125.         tooltip.ClearToolTip()
  1126.         tooltip.AddItemData(self.itemData['vnum'], self.itemData['sockets'], self.itemData['attrs'])
  1127.         tooltip.ShowToolTip()
  1128.  
  1129.     def _OverOutItem(self):
  1130.         tooltip = self.GetToolTip()
  1131.         tooltip.HideToolTip()
  1132.  
  1133.     def _OnClickAcceptOffer(self):
  1134.         self.OpenQuestionDialog(locale.IKASHOP_OFFER_LIST_ACCEPT_OFFER_QUESTION, self._OnAcceptOffer)
  1135.  
  1136.     def _OnClickCancelButton(self):
  1137.         self.OpenQuestionDialog(locale.IKASHOP_OFFER_LIST_CANCEL_OFFER_QUESTION, self._OnCancelOffer)
  1138.  
  1139.     def _OnAcceptOffer(self):
  1140.         self.questionDialog.Hide()
  1141.         ikashop.SendOfferAccept(self.data['id'])
  1142.  
  1143.     def _OnCancelOffer(self):
  1144.         self.questionDialog.Hide()
  1145.         ikashop.SendOfferCancel(self.data['id'], self.data['ownerid'])
  1146.  
  1147.     def Setup(self, data):
  1148.         self.ShowExclamationMark() if data['incoming']\
  1149.             else self.HideExclamationMark()
  1150.  
  1151.         self.acceptOfferButton.Show() if data['incoming']\
  1152.             else self.acceptOfferButton.Hide()
  1153.  
  1154.         self.cancelOfferButton.SetText(locale.IKASHOP_OFFER_LIST_DENY_OFFER_BUTTON_TEXT) if data['incoming']\
  1155.             else self.cancelOfferButton.SetText(locale.IKASHOP_OFFER_LIST_CANCEL_OFFER_BUTTON_TEXT)
  1156.  
  1157.         self.cancelOfferButton.SetPosition(189, 84) if data['incoming']\
  1158.             else self.cancelOfferButton.SetPosition(261, 84)
  1159.  
  1160.         self.background.LoadImage("ikashop/lite/offer_list/incoming_offer.png") if data['incoming']\
  1161.             else self.background.LoadImage("ikashop/lite/offer_list/outcoming_offer.png")
  1162.  
  1163.         # setting itemname
  1164.         itemData = data['item']
  1165.         item.SelectItem(itemData['vnum'])
  1166.         itemName = item.GetItemName()
  1167.         self.itemName.SetText(itemName)
  1168.  
  1169.         # setting seller name
  1170.         self.sellerName.SetText(data['buyer_name']) if data['incoming']\
  1171.             else self.sellerName.SetText(data['name'])
  1172.  
  1173.         # setting duration
  1174.         self.duration.SetText(DatetimeFormat(data['datetime']))
  1175.  
  1176.         # setting price
  1177.         self.price.SetText(locale.NumberToString(data['price']))
  1178.  
  1179.         if app.EXTEND_IKASHOP_ULTIMATE:
  1180.             pa = locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_NOT_AVAILABLE_EMOJI if itemData['priceavg'] == 0 \
  1181.                 else locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_EMOJI.format(locale.NumberToMoneyString(itemData['priceavg']))
  1182.             self.priceAverage.SetText(pa)
  1183.  
  1184.  
  1185.         # setting slot
  1186.         itemcount = itemData['count'] if itemData['count'] > 1 else 0
  1187.         self.slot.ArrangeSlot(0, 1, item.GetItemSize()[1], SLOT_SIZE, SLOT_SIZE, 0, 0)
  1188.         self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
  1189.         self.slot.SetItemSlot(0, itemData['vnum'], itemcount)
  1190.         self.data = data
  1191.         self.itemData = itemData
  1192.  
  1193. class IkarusShopOffersBoard(IkarusShopListBoard):
  1194.  
  1195.     OFFER_VIEW_COUNT = 3
  1196.  
  1197.     def __init__(self):
  1198.         super(IkarusShopOffersBoard, self).__init__()
  1199.         self._SettingUpBoard()
  1200.         self._LoadIkarusShopOffersBoard()
  1201.  
  1202.     def _SettingUpBoard(self):
  1203.         self.SetSize(395, 399)
  1204.         self.SetTitleName(locale.IKASHOP_OFFER_LIST_BOARD_TITLE)
  1205.         super(IkarusShopOffersBoard, self)._SettingUpBoard()
  1206.  
  1207.     def _LoadIkarusShopOffersBoard(self):
  1208.         self._LoadIkarusShopListBoard()
  1209.         self._MakeListElements(IkarusShopOfferView, self.OFFER_VIEW_COUNT)
  1210.  
  1211.     def SetOffers(self, offers):
  1212.         self.offers = sorted(offers, key = lambda val : val['datetime'], reverse=True)
  1213.         self.SetElements(self.offers)
  1214.         self.Show()
  1215.         self.SetTop()
  1216.  
  1217.     def Open(self):
  1218.         ikashop.SendOfferListRequest()
  1219.  
  1220.     def Close(self):
  1221.         self.Hide()
  1222.         ikashop.SendOffersListClose()
  1223.  
  1224. if app.EXTEND_IKASHOP_PRO:
  1225.     class IkarusShopNotificationView(IkarusShopWindow):
  1226.  
  1227.  
  1228.         def __init__(self):
  1229.             super(IkarusShopNotificationView, self).__init__()
  1230.             self._LoadIkarusShopNotificationView()
  1231.  
  1232.         def _LoadIkarusShopNotificationView(self):
  1233.             # making background and fitting its size
  1234.             self.background = self.CreateWidget(ui.ImageBox)
  1235.             self.background.LoadImage("ikashop/pro/notification/notification_box.png")
  1236.             self.SetSize(self.background.GetWidth(), self.background.GetHeight())
  1237.  
  1238.             # making what
  1239.             self.whatText = self.CreateWidget(ui.TextLine, pos = (9, 5))
  1240.             self.whatText.SetPackedFontColor(0xFFFFFFFF)
  1241.  
  1242.             # making datetime
  1243.             self.datetimeText = self.CreateWidget(ui.TextLine, pos = (405-11, 5))
  1244.             self.datetimeText.SetPackedFontColor(0xFFFFFFFF)
  1245.             self.datetimeText.SetHorizontalAlignCenter()
  1246.  
  1247.         def Setup(self, data):
  1248.             def GetItemName(what):
  1249.                 if what == 0:
  1250.                     return ""
  1251.                 item.SelectItem(what)
  1252.                 return item.GetItemName()
  1253.  
  1254.             def extractPriceString(format):
  1255.                 if ENABLE_CHEQUE_SYSTEM:
  1256.                     s = format.split("|")
  1257.                     money = long(s[0])
  1258.                     cheque = long(s[1]) if len(s) > 1 else 0
  1259.                     price = ""
  1260.                     if money != 0:
  1261.                         price += locale.NumberToMoneyString(money)
  1262.                     if cheque != 0:
  1263.                         if price:
  1264.                             price += ', '
  1265.                         price += locale.NumberToCheque(cheque)
  1266.                     return price
  1267.                 return locale.NumberToMoneyString(long(format))
  1268.  
  1269.             self.data = data
  1270.             itemname = GetItemName(data['what'])
  1271.             if data['type'] == ikashop.NOTIFICATION_SELLER_SELLER_SOLD_ITEM:
  1272.                 price = extractPriceString(data['format'])
  1273.                 message = locale.IKASHOP_PRO_NOTIFICATION_SELLER_SOLD_ITEM.format(itemname, price)
  1274.                 self.whatText.SetText(message)
  1275.             elif data['type'] == ikashop.NOTIFICATION_SELLER_NEW_OFFER_ON_ITEM:
  1276.                 message = locale.IKASHOP_PRO_NOTIFICATION_SELLER_NEW_OFFER_ON_ITEM.format(itemname)
  1277.                 self.whatText.SetText(message)
  1278.             elif data['type'] == ikashop.NOTIFICATION_SELLER_SHOP_EXPIRED:
  1279.                 message = locale.IKASHOP_PRO_NOTIFICATION_SELLER_SHOP_EXPIRED
  1280.                 self.whatText.SetText(message)
  1281.             elif data['type'] == ikashop.NOTIFICATION_SELLER_ITEM_EXPIRED:
  1282.                 message = locale.IKASHOP_PRO_NOTIFICATION_SELLER_ITEM_EXPIRED.format(itemname)
  1283.                 self.whatText.SetText(message)
  1284.             elif data['type'] == ikashop.NOTIFICATION_SELLER_AUCTION_NEW_OFFER:
  1285.                 message = locale.IKASHOP_PRO_NOTIFICATION_SELLER_AUCTION_NEW_OFFER.format(itemname)
  1286.                 self.whatText.SetText(message)
  1287.             elif data['type'] == ikashop.NOTIFICATION_SELLER_AUCTION_EXPIRED:
  1288.                 message = locale.IKASHOP_PRO_NOTIFICATION_SELLER_AUCTION_EXPIRED.format(itemname)
  1289.                 self.whatText.SetText(message)
  1290.             elif data['type'] == ikashop.NOTIFICATION_SELLER_AUCTION_SOLD:
  1291.                 price = long(data['format'])
  1292.                 message = locale.IKASHOP_PRO_NOTIFICATION_SELLER_AUCTION_SOLD.format(itemname, data['who'], locale.NumberToMoneyString(price))
  1293.                 self.whatText.SetText(message)
  1294.             elif data['type'] == ikashop.NOTIFICATION_SELLER_OFFER_CANCELLED:
  1295.                 message = locale.IKASHOP_PRO_NOTIFICATION_SELLER_OFFER_CANCELLED.format(itemname)
  1296.                 self.whatText.SetText(message)
  1297.             elif data['type'] == ikashop.NOTIFICATION_BUYER_OFFER_DENIED:
  1298.                 price = long(data['format'])
  1299.                 message = locale.IKASHOP_PRO_NOTIFICATION_BUYER_OFFER_DENIED.format(locale.NumberToMoneyString(price), itemname)
  1300.                 self.whatText.SetText(message)
  1301.             elif data['type'] == ikashop.NOTIFICATION_BUYER_OFFER_ACCEPTED:
  1302.                 price = long(data['format'])
  1303.                 message = locale.IKASHOP_PRO_NOTIFICATION_BUYER_OFFER_ACCEPTED.format(locale.NumberToMoneyString(price), itemname)
  1304.                 self.whatText.SetText(message)
  1305.             elif data['type'] == ikashop.NOTIFICATION_BUYER_OFFER_EXPIRED:
  1306.                 price = long(data['format'])
  1307.                 message = locale.IKASHOP_PRO_NOTIFICATION_BUYER_OFFER_EXPIRED.format(locale.NumberToMoneyString(price), itemname)
  1308.                 self.whatText.SetText(message)
  1309.             elif data['type'] == ikashop.NOTIFICATION_BUYER_AUCTION_BUY:
  1310.                 price = long(data['format'])
  1311.                 message = locale.IKASHOP_PRO_NOTIFICATION_BUYER_AUCTION_BUY.format(itemname, locale.NumberToMoneyString(price))
  1312.                 self.whatText.SetText(message)
  1313.             elif data['type'] == ikashop.NOTIFICATION_BUYER_AUCTION_RAISE:
  1314.                 message = locale.IKASHOP_PRO_NOTIFICATION_BUYER_AUCTION_RAISE.format(data['who'], itemname)
  1315.                 self.whatText.SetText(message)
  1316.             elif data['type'] == ikashop.NOTIFICATION_BUYER_AUCTION_LOST:
  1317.                 price = long(data['format'])
  1318.                 message = locale.IKASHOP_PRO_NOTIFICATION_BUYER_AUCTION_LOST.format(data['who'], itemname, locale.NumberToMoneyString(price))
  1319.                 self.whatText.SetText(message)
  1320.  
  1321.             if app.EXTEND_IKASHOP_ULTIMATE:
  1322.                 if data['type'] == ikashop.NOTIFICATION_SELLER_DECORATION_EXPIRED:
  1323.                     self.whatText.SetText(locale.IKASHOP_ULTIMATE_NOTIFICATION_SELLER_DECORATION_EXPIRED)
  1324.  
  1325.             self.datetimeText.SetText(DatetimeFormat(data['datetime']))
  1326.             self.ShowExclamationMark() if not data['seen']\
  1327.                 else self.HideExclamationMark()
  1328.  
  1329.  
  1330.     class IkarusShopNotificationBoard(IkarusShopListBoard):
  1331.  
  1332.         NOTIFICATION_VIEW_COUNT = 10
  1333.  
  1334.         def __init__(self):
  1335.             super(IkarusShopNotificationBoard, self).__init__()
  1336.             ikashop.LoadNotifications()
  1337.             self._SettingUpBoard()
  1338.             self._LoadIkarusShopNotificationBoard()
  1339.  
  1340.         def _SettingUpBoard(self):
  1341.             self.SetSize(494, 330)
  1342.             self.SetTitleName(locale.IKASHOP_PRO_NOTIFICATION_BOARD_TITLE)
  1343.             super(IkarusShopNotificationBoard, self)._SettingUpBoard()
  1344.  
  1345.         def _LoadIkarusShopNotificationBoard(self):
  1346.             self._LoadIkarusShopListBoard()
  1347.             self._MakeListElements(IkarusShopNotificationView, self.NOTIFICATION_VIEW_COUNT)
  1348.  
  1349.         def SetNotifications(self, notifications):
  1350.             cached = ikashop.GetNotifications()
  1351.             for i, notification in enumerate(notifications):
  1352.                 type = notification['type']
  1353.                 who = notification['who']
  1354.                 what = notification['what']
  1355.                 format = notification['format']
  1356.                 datetime = notification['datetime']
  1357.                 save = i == len(notifications)-1
  1358.                 ikashop.RegisterNotification(type, who, what, format, datetime, save)
  1359.             notifications = cached + notifications
  1360.             self.notifications = sorted(notifications, key = lambda val : val['datetime'], reverse=True)
  1361.             self.SetElements(self.notifications)
  1362.             self.Show()
  1363.             self.SetTop()
  1364.  
  1365.         def Open(self):
  1366.             ikashop.SendNotificationListRequest()
  1367.  
  1368.         def Close(self):
  1369.             self.Hide()
  1370.             ikashop.SendNotificationListClose()
  1371.  
  1372. class IkarusShopCounter(IkarusShopWindow):
  1373.     def __init__(self):
  1374.         super(IkarusShopCounter, self).__init__()
  1375.         self._LoadIkarusShopCounter()
  1376.  
  1377.     def _LoadIkarusShopCounter(self):
  1378.         self.background = self.CreateWidget(ui.ImageBox)
  1379.         self.background.LoadImage("ikashop/lite/business/counter.png")
  1380.  
  1381.         self.counter = self.CreateWidget(ui.TextLine)
  1382.         self.counter.SetOutline(1)
  1383.         self.counter.SetPackedFontColor(0xFFFFFFFF)
  1384.         self.counter.SetPosition(self.background.GetWidth()/2, self.background.GetHeight()/2 - 1)
  1385.         self.counter.SetHorizontalAlignCenter()
  1386.         self.counter.SetVerticalAlignCenter()
  1387.  
  1388.     def SetCounter(self, count):
  1389.         if count == 0:
  1390.             self.Hide()
  1391.         else:
  1392.             self.counter.SetText(str(count) if count <= 9 else "9+")
  1393.             self.Show()
  1394.  
  1395. class IkarusShopBusinessBoard(IkashopBoardWithTitleBar):
  1396.  
  1397.     GRID_COLUMNS = ikashop.SHOP_GRID_WIDTH
  1398.     GRID_ROWS = ikashop.SHOP_GRID_HEIGHT
  1399.     PAGE_SIZE = GRID_COLUMNS * GRID_ROWS
  1400.  
  1401.     if app.EXTEND_IKASHOP_ULTIMATE:
  1402.         PAGE_COUNT = 3
  1403.  
  1404.     def __init__(self):
  1405.         super(IkarusShopBusinessBoard, self).__init__()
  1406.         if app.EXTEND_IKASHOP_ULTIMATE:
  1407.             self.selectedPage = 0
  1408.         if app.EXTEND_IKASHOP_PRO:
  1409.             self.editedMarkedInfo = None
  1410.             self.editedMarkedTime = None
  1411.             self.editedMarkedColor = None
  1412.             self.removingItemList = []
  1413.         self._SettingUpBoard()
  1414.         self._LoadLinkedBoards()
  1415.         self._LoadShopBusinessWindow()
  1416.         ikashop.SetBusinessBoard(self)
  1417.  
  1418.     def __del__(self):
  1419.         super(IkarusShopBusinessBoard, self).__del__()
  1420.         ikashop.SetBusinessBoard(None)
  1421.  
  1422.     def _SettingUpBoard(self):
  1423.         self.SetSize(558, 404)
  1424.         self.SetTitleName(locale.IKASHOP_BUSINESS_BOARD_TITLE)
  1425.         self.SetCloseEvent(self.Close)
  1426.         self.SetCenterPosition()
  1427.         self.AddFlag("movable")
  1428.         self.AddFlag("float")
  1429.  
  1430.     def _LoadShopBusinessWindow(self):
  1431.         # making slot box
  1432.         self.slotBox = self.CreateWidget(ui.ImageBox, pos = (55,35 + 27))
  1433.         self.slotBox.LoadImage("ikashop/lite/business/slot_box.png")
  1434.         if app.EXTEND_IKASHOP_ULTIMATE:
  1435.             self.slotBox.SetMouseWheelEvent(self._OnScrollMouseWheel)
  1436.  
  1437.         self.slotWindow = self.CreateWidget(ui.GridSlotWindow, parent = self.slotBox, pos = (6,6))
  1438.         self.slotWindow.ArrangeSlot(0, self.GRID_COLUMNS, self.GRID_ROWS, SLOT_SIZE, SLOT_SIZE, 0, 0)
  1439.         self.slotWindow.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
  1440.         self.slotWindow.SetSelectEmptySlotEvent(self._OnClickEmptySlot)
  1441.         self.slotWindow.SetSelectItemSlotEvent(self._OnClickItemSlot)
  1442.         self.slotWindow.SetOverInItemEvent(self._ShowToolTipOnItemSlot)
  1443.         self.slotWindow.SetOverOutItemEvent(self._HideToolTipOnItemSlot)
  1444.         self.slotWindow.SetUnselectItemSlotEvent(self._OnRightClickItemSlot)
  1445.  
  1446.         # making duration box
  1447.         self.durationBox = self.CreateWidget(ui.ImageBox, pos = (55,35))
  1448.         self.durationBox.LoadImage("ikashop/lite/business/duration_box.png")
  1449.  
  1450.         self.durationText = self.CreateWidget(ui.TextLine, parent = self.durationBox, pos = (30, 4))
  1451.         self.durationText.SetPackedFontColor(0xFFFFFFFF)
  1452.         self.durationText.SetText("11d 22h 18m")
  1453.  
  1454.         self.durationExpiredIcon = self.CreateWidget(ui.ImageBox, pos = (168 - 49, 3), parent = self.durationBox)
  1455.         self.durationExpiredIcon.LoadImage("ikashop/lite/business/expired_icon.png")
  1456.  
  1457.         self.durationIncreaseButton = self.CreateWidget(ui.Button, parent = self.durationBox, pos = (189 - 49, 3))
  1458.         self.durationIncreaseButton.SetUpVisual("ikashop/lite/business/buttons/duration_up/default.png")
  1459.         self.durationIncreaseButton.SetDownVisual("ikashop/lite/business/buttons/duration_up/default.png")
  1460.         self.durationIncreaseButton.SetOverVisual("ikashop/lite/business/buttons/duration_up/hover.png")
  1461.         self.durationIncreaseButton.SetToolTipText(locale.IKASHOP_BUSINESS_DURATION_INCREASE_BUTTON_TEXT)
  1462.         self.durationIncreaseButton.SetEvent(self._OnClickDurationIncreaseButton)
  1463.         self.durationIncreaseButton.ToolTipText.SetOutline(1)
  1464.  
  1465.         # making bottom bar buttons
  1466.         self.cancelShopButton = self.CreateWidget(ui.Button, pos = (604 - 92, 35))
  1467.         self.cancelShopButton.SetUpVisual("ikashop/lite/business/buttons/cancel_shop/default.png")
  1468.         self.cancelShopButton.SetDownVisual("ikashop/lite/business/buttons/cancel_shop/default.png")
  1469.         self.cancelShopButton.SetOverVisual("ikashop/lite/business/buttons/cancel_shop/hover.png")
  1470.         self.cancelShopButton.SetToolTipText(locale.IKASHOP_BUSINESS_CANCEL_SHOP_BUTTON_TEXT)
  1471.         self.cancelShopButton.SAFE_SetEvent(self._OnClickCancelShopButton)
  1472.         self.cancelShopButton.ToolTipText.SetOutline(1)
  1473.  
  1474.         if app.EXTEND_IKASHOP_PRO:
  1475.             self.moveShopButton = self.CreateWidget(ui.Button, pos = (604 - 95 - self.cancelShopButton.GetWidth(), 35))
  1476.             self.moveShopButton.SetUpVisual("ikashop/lite/business/buttons/move_shop/default.png")
  1477.             self.moveShopButton.SetDownVisual("ikashop/lite/business/buttons/move_shop/default.png")
  1478.             self.moveShopButton.SetOverVisual("ikashop/lite/business/buttons/move_shop/hover.png")
  1479.             self.moveShopButton.SetToolTipText(locale.IKASHOP_PRO_BUSINESS_MOVE_SHOP_BUTTON_TEXT)
  1480.             self.moveShopButton.SAFE_SetEvent(self._OnClickMoveShopButton)
  1481.             self.moveShopButton.ToolTipText.SetOutline(1)
  1482.  
  1483.         # making sidebar buttons
  1484.         self.safeboxOpenButton = self.CreateWidget(ui.Button, pos = (7, 37))
  1485.         self.safeboxOpenButton.SetUpVisual("ikashop/lite/business/buttons/safebox/default.png")
  1486.         self.safeboxOpenButton.SetDownVisual("ikashop/lite/business/buttons/safebox/default.png")
  1487.         self.safeboxOpenButton.SetOverVisual("ikashop/lite/business/buttons/safebox/hover.png")
  1488.         self.safeboxOpenButton.SAFE_SetEvent(self.safeboxBoard.Toggle)
  1489.         self.safeboxOpenButton.SetToolTipText(locale.IKASHOP_BUSINESS_SAFEBOX_OPEN_BUTTON_TEXT)
  1490.         self.safeboxOpenButton.ToolTipText.SetOutline(1)
  1491.  
  1492.         self.privateOfferOpenButton = self.CreateWidget(ui.Button, pos = (7, 37 + 33))
  1493.         self.privateOfferOpenButton.SetUpVisual("ikashop/lite/business/buttons/offer/default.png")
  1494.         self.privateOfferOpenButton.SetDownVisual("ikashop/lite/business/buttons/offer/default.png")
  1495.         self.privateOfferOpenButton.SetOverVisual("ikashop/lite/business/buttons/offer/hover.png")
  1496.         self.privateOfferOpenButton.SAFE_SetEvent(self.offersBoard.Toggle)
  1497.         self.privateOfferOpenButton.SetToolTipText(locale.IKASHOP_BUSINESS_PRIVATE_OFFER_OPEN_BUTTON_TEXT)
  1498.         self.privateOfferOpenButton.ToolTipText.SetOutline(1)
  1499.  
  1500.         self.auctionOpenButton = self.CreateWidget(ui.Button, pos = (7, 37 + 33*2))
  1501.         self.auctionOpenButton.SetUpVisual("ikashop/lite/business/buttons/auction/default.png")
  1502.         self.auctionOpenButton.SetDownVisual("ikashop/lite/business/buttons/auction/default.png")
  1503.         self.auctionOpenButton.SetOverVisual("ikashop/lite/business/buttons/auction/hover.png")
  1504.         self.auctionOpenButton.SAFE_SetEvent(self.auctionBoard.Toggle)
  1505.         self.auctionOpenButton.SetToolTipText(locale.IKASHOP_BUSINESS_AUCTION_OPEN_BUTTON_TEXT)
  1506.         self.auctionOpenButton.ToolTipText.SetOutline(1)
  1507.  
  1508.         self.safeboxItemCounter = self.CreateWidget(IkarusShopCounter, pos = (25, 0), parent = self.safeboxOpenButton)
  1509.         self.privateOfferCounter = self.CreateWidget(IkarusShopCounter, pos = (25, 0), parent = self.privateOfferOpenButton)
  1510.         self.auctionOfferCounter = self.CreateWidget(IkarusShopCounter, pos = (25, 0), parent = self.auctionOpenButton)
  1511.  
  1512.         if app.EXTEND_IKASHOP_PRO:
  1513.             self.notificationOpenButton = self.CreateWidget(ui.Button, pos = (7, 352+12))
  1514.             self.notificationOpenButton.SetUpVisual("ikashop/pro/business/buttons/notification/default.png")
  1515.             self.notificationOpenButton.SetDownVisual("ikashop/pro/business/buttons/notification/default.png")
  1516.             self.notificationOpenButton.SetOverVisual("ikashop/pro/business/buttons/notification/hover.png")
  1517.             self.notificationOpenButton.SAFE_SetEvent(self.notificationBoard.Toggle)
  1518.             self.notificationOpenButton.SetToolTipText(locale.IKASHOP_PRO_BUSINESS_NOTIFICATION_OPEN_BUTTON_TEXT)
  1519.             self.notificationOpenButton.ToolTipText.SetOutline(1)
  1520.  
  1521.             self.notificationCounter = self.CreateWidget(IkarusShopCounter, pos = (25, 0), parent = self.notificationOpenButton)
  1522.  
  1523.         if app.EXTEND_IKASHOP_ULTIMATE:
  1524.             self.decorationBox = self.CreateWidget(ui.ImageBox, pos = (327+19, 35))
  1525.             self.decorationBox.LoadImage("ikashop/ultimate/decoration_box.png")
  1526.  
  1527.             self.decorationTime = self.CreateWidget(ui.TextLine, pos = (28, 5), parent = self.decorationBox)
  1528.             self.decorationTime.SetPackedFontColor(0xFFFFFFFF)
  1529.  
  1530.             self.lockedCells = []
  1531.             for i in xrange(self.PAGE_SIZE):
  1532.                 col, row = i % self.GRID_COLUMNS, i // self.GRID_COLUMNS
  1533.                 lock = self.CreateWidget(ui.ImageBox, pos = (6 + 32*col,6 + 32*row), parent = self.slotBox, show = 0)
  1534.                 lock.LoadImage("ikashop/ultimate/lock_slot.png")
  1535.                 self.lockedCells.append(lock)
  1536.  
  1537.             # making page selection box
  1538.             self.selectPageButtons = []
  1539.             for i in xrange(self.PAGE_COUNT):
  1540.                 selectPageButton = self.CreateWidget(ui.Button, pos = (269 - 48 + i*41, 35))
  1541.                 selectPageButton.SetUpVisual("ikashop/lite/safebox/buttons/select_page/default.png")
  1542.                 selectPageButton.SetDownVisual("ikashop/lite/safebox/buttons/select_page/default.png")
  1543.                 selectPageButton.SetOverVisual("ikashop/lite/safebox/buttons/select_page/hover.png")
  1544.                 selectPageButton.SetDisableVisual("ikashop/lite/safebox/buttons/select_page/disabled.png")
  1545.                 selectPageButton.SetText(RomeNumber(i+1))
  1546.                 selectPageButton.SAFE_SetEvent(self._OnSelectPage, i)
  1547.                 self.selectPageButtons.append(selectPageButton)
  1548.  
  1549.     def _LoadLinkedBoards(self):
  1550.         self.safeboxBoard = IkarusShopSafeboxBoard()
  1551.         self.auctionBoard = IkarusShopAuctionOwnerBoard()
  1552.         self.offersBoard = IkarusShopOffersBoard()
  1553.         if app.EXTEND_IKASHOP_PRO:
  1554.             self.notificationBoard = IkarusShopNotificationBoard()
  1555.  
  1556.     # HANDLING DURATION RESTORE PROCESS
  1557.     def _OnClickDurationIncreaseButton(self):
  1558.         # checking cash
  1559.         if player.GetElk() < RESTORE_DURATION_COST:
  1560.             self.OpenPopupDialog(locale.IKASHOP_BUSINESS_INCREASE_DURATION_NO_MONEY)
  1561.             return
  1562.  
  1563.         # opening question
  1564.         question = locale.IKASHOP_BUSINESS_INCREASE_DURATION_QUESTION.format(locale.NumberToMoneyString(RESTORE_DURATION_COST))
  1565.         self.OpenQuestionDialog(question, self._OnIncreaseDurationQuestionAccept)
  1566.  
  1567.     def _OnIncreaseDurationQuestionAccept(self):
  1568.         ikashop.SendShopCreate()
  1569.         self.questionDialog.Hide()
  1570.  
  1571.     # HANDLING INSERT ITEM PROCESS
  1572.     def _OnClickEmptySlot(self, slot):
  1573.         if app.EXTEND_IKASHOP_ULTIMATE:
  1574.             slot = self._LocalToGlobalSlot(slot)
  1575.  
  1576.         if mouse.mouseController.isAttached():
  1577.             attachedType = mouse.mouseController.GetAttachedType()
  1578.             attachedItemIndex = mouse.mouseController.GetAttachedItemIndex()
  1579.             attachedItemSlotPos = mouse.mouseController.GetAttachedSlotNumber()
  1580.             mouse.mouseController.DeattachObject()
  1581.  
  1582.             if app.EXTEND_IKASHOP_ULTIMATE:
  1583.                 if attachedType == player.SLOT_TYPE_OFFLINESHOP:
  1584.                     ikashop.SendShopMoveItem(attachedItemSlotPos, slot)
  1585.                     return
  1586.  
  1587.             # validating attached item
  1588.             if attachedType in (player.SLOT_TYPE_DRAGON_SOUL_INVENTORY, player.SLOT_TYPE_INVENTORY):
  1589.                 win, pos = player.SlotTypeToInvenType(attachedType), attachedItemSlotPos
  1590.                 if player.ITEM_MONEY != attachedItemIndex:
  1591.                     self.InsertItemInSlot(win, pos, slot)
  1592.  
  1593.     def InsertItemInSlot(self, win, pos, slot = None):
  1594.         # checking shop isn't expired
  1595.         if self.shopInfo['duration'] <= 0:
  1596.             self.OpenPopupDialog(locale.IKASHOP_BUSINESS_CANNOT_SELL_ITEM_EXPIRED_SHOP)
  1597.             return
  1598.  
  1599.         # checking item antiflags
  1600.         itemIndex = player.GetItemIndex(win, pos)
  1601.         itemCount = player.GetItemCount(win, pos)
  1602.  
  1603.         if itemIndex != 0:
  1604.             item.SelectItem(itemIndex)
  1605.             # checking item antifalg
  1606.             if item.IsAntiFlag(item.ANTIFLAG_GIVE) or item.IsAntiFlag(item.ANTIFLAG_MYSHOP):
  1607.                 self.OpenPopupDialog(locale.IKASHOP_BUSINESS_CANNOT_SELL_ITEM)
  1608.                 return
  1609.  
  1610.             # autodetecting price
  1611.             if app.EXTEND_IKASHOP_PRO:
  1612.                 itemHash = GetInventoryItemHash(win, pos)
  1613.                 detectedPrice = ikashop.GetItemPriceCache(itemIndex, itemHash, itemCount)
  1614.                 isFastCall = slot == None # <- slot is None while calling it from inventory
  1615.  
  1616.             # autodetecting empty slot
  1617.             items = [(sitem['vnum'], sitem['cell']) for sitem in self.shopInfo['items'].values()]
  1618.             if slot == None:
  1619.                 slot = ikashop.GetFirstEmptyCell(item.GetItemSize()[1], items)
  1620.  
  1621.                 # checking for busy space
  1622.                 if slot == None:
  1623.                     self.OpenPopupDialog(locale.IKASHOP_BUSINESS_CANNOT_SELL_ITEM_NO_SPACE)
  1624.  
  1625.             # checking shop space
  1626.             else:
  1627.                 if app.EXTEND_IKASHOP_ULTIMATE:
  1628.                     if not ikashop.CheckShopSpace(items, itemIndex, slot, self.shopInfo['lock']):
  1629.                         return
  1630.                 else:
  1631.                     if not ikashop.CheckShopSpace(items, itemIndex, slot):
  1632.                         return
  1633.  
  1634.             # caching inserting item info
  1635.             self.insertingPriceInfo = slot, win, pos
  1636.  
  1637.             if app.EXTEND_IKASHOP_PRO:
  1638.                 # checking price is already available
  1639.                 if isFastCall and detectedPrice:
  1640.                     price = detectedPrice['value'],
  1641.                     if ENABLE_CHEQUE_SYSTEM:
  1642.                         price += detectedPrice['cheque'],
  1643.                     ikashop.SendAddItem(win, pos, slot, *price)
  1644.                     return
  1645.  
  1646.                 # opening money input dialog
  1647.                 kargs = detectedPrice if detectedPrice else {}
  1648.                 self.priceCacheInfo = itemIndex, itemHash, itemCount
  1649.                 self.OpenMoneyInputDialog(self._OnAcceptInsertingItemPrice, **kargs)
  1650.  
  1651.             else:
  1652.                 self.OpenMoneyInputDialog(self._OnAcceptInsertingItemPrice)
  1653.  
  1654.             if app.EXTEND_IKASHOP_ULTIMATE:
  1655.                 ikashop.SendPriceAverageRequest(itemIndex, itemCount)
  1656.                 self.moneyInputDialog.SetPriceAverage(-1)
  1657.  
  1658.     def _OnAcceptInsertingItemPrice(self):
  1659.         self.moneyInputDialog.SoftClose()
  1660.  
  1661.         ok, price = ExtractInputPrice(self.moneyInputDialog)
  1662.         if not ok:
  1663.             self.OpenPopupDialog(locale.IKASHOP_BUSINESS_INVALID_ITEM_PRICE)
  1664.             return
  1665.  
  1666.         # sending add item
  1667.         dest, win, slot = self.insertingPriceInfo
  1668.         ikashop.SendAddItem(win, slot, dest, *price)
  1669.         if app.EXTEND_IKASHOP_PRO:
  1670.             # registering item price into price cache
  1671.             vnum, hash, count = self.priceCacheInfo
  1672.             ikashop.RegisterItemPriceCache(vnum, hash, count, *price)
  1673.         return True
  1674.  
  1675.     # HANDLING EDIT PRICE/ REMOVE ITEM
  1676.     def _OnClickItemSlot(self, slot):
  1677.         if app.EXTEND_IKASHOP_ULTIMATE:
  1678.             if mouse.mouseController.isAttached():
  1679.                 return
  1680.             slot = self._LocalToGlobalSlot(slot)
  1681.  
  1682.         # checking item does exists
  1683.         if slot in self.shopInfo['items']:
  1684.             data = self.shopInfo['items'][slot]
  1685.  
  1686.             # checking for edit item request
  1687.             if IsPressingSHIFT():
  1688.                 self.insertingPriceInfo = data
  1689.                 if app.EXTEND_IKASHOP_PRO:
  1690.                     self.insertingPriceAllSimilar = False
  1691.                     detectPrice = ikashop.GetItemPriceCache(data['vnum'], data['hash'], data['count'])
  1692.                     kargs = detectPrice if detectPrice else {}
  1693.                     self.OpenMoneyInputDialog(self._OnAcceptEditingItemPrice, **kargs)
  1694.                 else:
  1695.                     self.OpenMoneyInputDialog(self._OnAcceptEditingItemPrice)
  1696.                 if app.EXTEND_IKASHOP_ULTIMATE:
  1697.                     self.moneyInputDialog.SetPriceAverage(data['priceavg'])
  1698.                 return
  1699.  
  1700.             if app.EXTEND_IKASHOP_PRO:
  1701.                 # checking for edit all similar items
  1702.                 if IsPressingCTRL():
  1703.                     self.insertingPriceInfo = data
  1704.                     self.insertingPriceAllSimilar = True
  1705.                     detectPrice = ikashop.GetItemPriceCache(data['vnum'], data['hash'], data['count'])
  1706.                     kargs = detectPrice if detectPrice else {}
  1707.                     self.OpenMoneyInputDialog(self._OnAcceptEditingItemPrice, **kargs)
  1708.                     self.SetEditedMarkedSlotInfo(data['vnum'], data['count'], data['hash'], (0.7, 0.7, 0.7), infinite=1)
  1709.                     if app.EXTEND_IKASHOP_ULTIMATE:
  1710.                         self.moneyInputDialog.SetPriceAverage(data['priceavg'])
  1711.                     return
  1712.  
  1713.             if app.EXTEND_IKASHOP_ULTIMATE:
  1714.                 # attaching the item
  1715.                 mouse.mouseController.AttachObject(self, player.SLOT_TYPE_OFFLINESHOP, slot, data['vnum'], data['count'])
  1716.  
  1717.  
  1718.     def _OnRightClickItemSlot(self, slot):
  1719.         if app.EXTEND_IKASHOP_ULTIMATE:
  1720.             slot = self._LocalToGlobalSlot(slot)
  1721.             if mouse.mouseController.isAttached():
  1722.                 return
  1723.  
  1724.         # checking item does exists
  1725.         if slot in self.shopInfo['items']:
  1726.             data = self.shopInfo['items'][slot]
  1727.  
  1728.             # checking for remove all similar items
  1729.             if app.EXTEND_IKASHOP_PRO:
  1730.                 if IsPressingCTRL():
  1731.                     self.removingVnum = data['vnum']
  1732.                     item.SelectItem(self.removingVnum)
  1733.                     question = locale.IKASHOP_PRO_BUSINESS_REMOVE_ALL_SIMILAR_ITEMS_QUESTION.format(item.GetItemName())
  1734.                     self.OpenQuestionDialog(question, self._OnAcceptRemoveAllSimilarItems)
  1735.  
  1736.                     # marking all removing items
  1737.                     for slot, data in self.shopInfo['items'].items():
  1738.                         if data['vnum'] == self.removingVnum:
  1739.                             self.AppendRemovingItemSlot(slot)
  1740.                     self._RefreshItems()
  1741.                     return
  1742.  
  1743.             # starting edit item price process
  1744.             ikashop.SendRemoveItem(data['id'])
  1745.  
  1746.     def _OnAcceptRemoveAllSimilarItems(self):
  1747.         self.questionDialog.Hide()
  1748.         for item in self.shopInfo['items'].values():
  1749.             if item['vnum'] == self.removingVnum:
  1750.                 ikashop.SendRemoveItem(item['id'])
  1751.  
  1752.     def _OnAcceptEditingItemPrice(self):
  1753.         self.moneyInputDialog.SoftClose()
  1754.         ok, price = ExtractInputPrice(self.moneyInputDialog)
  1755.         if not ok:
  1756.             self.OpenPopupDialog(locale.IKASHOP_BUSINESS_INVALID_ITEM_PRICE)
  1757.             return
  1758.  
  1759.         # sending edit item
  1760.         data = self.insertingPriceInfo
  1761.  
  1762.         if app.EXTEND_IKASHOP_PRO:
  1763.             # registering price into price cache
  1764.             ikashop.RegisterItemPriceCache(data['vnum'], data['hash'], data['count'], *price)
  1765.             # editing all item prices
  1766.             if self.insertingPriceAllSimilar:
  1767.                 for checkData in self.shopInfo['items'].values():
  1768.                     if data['hash'] == checkData['hash'] and data['count'] == checkData['count'] and data['vnum'] == checkData['vnum']:
  1769.                         if price[0] != checkData['price'] or (ENABLE_CHEQUE_SYSTEM and price[1] != checkData['cheque']):
  1770.                             ikashop.SendEditItem(checkData['id'], *price)
  1771.                 self.SetEditedMarkedSlotInfo(data['vnum'], data['count'], data['hash'], (0.5, 0.5, 0.1), price = price)
  1772.             else:
  1773.                 ikashop.SendEditItem(data['id'], *price)
  1774.  
  1775.         else:
  1776.             ikashop.SendEditItem(data['id'], *price)
  1777.  
  1778.         return True
  1779.  
  1780.     # HANDLING TOOLTIP OVER IN OVER OUT
  1781.     def _ShowToolTipOnItemSlot(self, slot):
  1782.         if app.EXTEND_IKASHOP_ULTIMATE:
  1783.             slot = self._LocalToGlobalSlot(slot)
  1784.  
  1785.         if slot in self.shopInfo['items']:
  1786.             data = self.shopInfo['items'][slot]
  1787.             tooltip = self.GetToolTip()
  1788.             tooltip.ClearToolTip()
  1789.             tooltip.AddItemData(data['vnum'], data['sockets'], data['attrs'])
  1790.             if 'price' in data and data['price'] != 0:
  1791.                 tooltip.AppendPrice(data['price'])
  1792.             if 'cheque' in data and data['cheque'] != 0:
  1793.                 tooltip.AppendCheque(data['cheque'])
  1794.  
  1795.             if app.EXTEND_IKASHOP_ULTIMATE:
  1796.                 tooltip.AppendTextLine(locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_NOT_AVAILABLE) if data['priceavg'] == 0 \
  1797.                     else tooltip.AppendTextLine(locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_VALUE.format(locale.NumberToMoneyString(data['priceavg'])))
  1798.  
  1799.             # checking shop isn't expired
  1800.             tooltip.AppendTextLine(locale.IKASHOP_BUSINESS_EDIT_ITEM_TOOLTIP)
  1801.             if app.EXTEND_IKASHOP_PRO:
  1802.                 tooltip.AppendTextLine(locale.IKASHOP_PRO_BUSINESS_EDIT_ALL_SIMILAR_ITEM_TOOLTIP)
  1803.             tooltip.AppendTextLine(locale.IKASHOP_BUSINESS_REMOVE_ITEM_TOOLTIP)
  1804.             if app.EXTEND_IKASHOP_PRO:
  1805.                 tooltip.AppendTextLine(locale.IKASHOP_PRO_BUSINESS_REMOVE_ALL_SIMILAR_ITEM_TOOLTIP)
  1806.             tooltip.ShowToolTip()
  1807.  
  1808.     def _HideToolTipOnItemSlot(self, slot=0):
  1809.         tooltip = self.GetToolTip()
  1810.         tooltip.ClearToolTip()
  1811.         tooltip.HideToolTip()
  1812.  
  1813.     # HANDLING CANCEL SHOP REQUEST
  1814.     def _OnClickCancelShopButton(self):
  1815.         self.OpenQuestionDialog(locale.IKASHOP_BUSINESS_CANCEL_SHOP_QUESTION, self._OnAcceptCancelShopQuestion)
  1816.  
  1817.     def _OnAcceptCancelShopQuestion(self):
  1818.         self.questionDialog.Hide()
  1819.         ikashop.SendForceCloseShop()
  1820.  
  1821.     if app.EXTEND_IKASHOP_PRO:
  1822.         # HANDLING MOVE SHOP REQUEST
  1823.         def _OnClickMoveShopButton(self):
  1824.             # checking money
  1825.             if player.GetElk() < MOVE_SHOP_ENTITY_COST:
  1826.                 self.OpenPopupDialog(locale.IKASHOP_PRO_BUSINESS_MOVE_SHOP_NO_MONEY)
  1827.                 return
  1828.             # sending question
  1829.             message = locale.IKASHOP_PRO_BUSINESS_MOVE_SHOP_QUESTION.format(locale.NumberToMoneyString(MOVE_SHOP_ENTITY_COST))
  1830.             self.OpenQuestionDialog(message, self._OnAcceptMoveShopQuestion)
  1831.  
  1832.         def _OnAcceptMoveShopQuestion(self):
  1833.             self.questionDialog.Hide()
  1834.             ikashop.SendMoveShopEntity()
  1835.  
  1836.     # HANDLING AUCTION CREATION
  1837.     def _OnAcceptCreateAuctionQuestion(self):
  1838.         self.questionDialog.Hide()
  1839.  
  1840.         if not hasattr(self, "createAuctionDialog"):
  1841.             self.createAuctionDialog = IkarusCreateAuctionDialog()
  1842.             self._RegisterDialog(self.createAuctionDialog)
  1843.  
  1844.         self.createAuctionDialog.Open()
  1845.  
  1846.     if app.EXTEND_IKASHOP_ULTIMATE:
  1847.         def _LocalToGlobalSlot(self, pos):
  1848.             return self.selectedPage * self.PAGE_SIZE + pos
  1849.  
  1850.         def _GlobalToLocalSlot(self, pos):
  1851.             return pos % self.PAGE_SIZE
  1852.  
  1853.     def _RefreshItems(self):
  1854.         # resetting slots
  1855.         for i in xrange(self.GRID_COLUMNS*self.GRID_ROWS):
  1856.             self.slotWindow.ClearSlot(i)
  1857.             if app.EXTEND_IKASHOP_PRO:
  1858.                 self.slotWindow.DeactivateSlot(i)
  1859.  
  1860.         if app.EXTEND_IKASHOP_ULTIMATE:
  1861.             for i in xrange(self.PAGE_SIZE):
  1862.                 self.lockedCells[i].Hide()
  1863.  
  1864.             scell = self.PAGE_SIZE * self.selectedPage
  1865.             ecell = scell + self.PAGE_SIZE
  1866.  
  1867.             for cell in xrange(scell, ecell):
  1868.                 if cell >= self.shopInfo['lock']:
  1869.                     self.lockedCells[self._GlobalToLocalSlot(cell)].Show()
  1870.  
  1871.             for cell in xrange(scell, ecell):
  1872.                 if cell in self.shopInfo['items']:
  1873.                     item = self.shopInfo['items'][cell]
  1874.                     pos = self._GlobalToLocalSlot(cell)
  1875.                     self.slotWindow.SetItemSlot(pos, item['vnum'], item['count'] if item['count'] > 1 else 0)
  1876.  
  1877.         else:
  1878.             # setting up slots
  1879.             for item in self.shopInfo['items'].values():
  1880.                 self.slotWindow.SetItemSlot(item['cell'], item['vnum'], item['count'] if item['count'] > 1 else 0)
  1881.  
  1882.         if app.EXTEND_IKASHOP_PRO:
  1883.             self._RefreshMarkedSlots()
  1884.  
  1885.         self.slotWindow.RefreshSlot()
  1886.  
  1887.  
  1888.     if app.EXTEND_IKASHOP_PRO:
  1889.         def _RefreshMarkedSlots(self):
  1890.             # marking edited items
  1891.             actualTime = app.GetTime()
  1892.             if self.editedMarkedInfo != None and self.editedMarkedTime != None:
  1893.                 if self.editedMarkedTime > actualTime or self.editedMarkedTime == -1:
  1894.                     vnum, count, hash, price = self.editedMarkedInfo
  1895.                     for i in xrange(self.PAGE_SIZE):
  1896.                         slot = i
  1897.                         if app.EXTEND_IKASHOP_ULTIMATE:
  1898.                             slot = self._LocalToGlobalSlot(i)
  1899.  
  1900.                         if slot in self.shopInfo['items']:
  1901.                             data = self.shopInfo['items'][slot]
  1902.                             if (data['vnum'], data['count'], data['hash']) == (vnum, count, hash):
  1903.                                 if ENABLE_CHEQUE_SYSTEM:
  1904.                                     itemPrice = (data['price'], data['cheque'])
  1905.                                 else:
  1906.                                     itemPrice = data['price'],
  1907.                                 if price is None or itemPrice == price:
  1908.                                     self.slotWindow.ActivateSlot(i, *self.editedMarkedColor)
  1909.  
  1910.             # marking removing items
  1911.             if app.EXTEND_IKASHOP_ULTIMATE:
  1912.                 shownCellStart = self.selectedPage * self.PAGE_SIZE
  1913.                 shownCellEnd = shownCellStart + self.PAGE_SIZE
  1914.                 for slot in self.removingItemList:
  1915.                     if slot >= shownCellStart and slot < shownCellEnd:
  1916.                         local = self._GlobalToLocalSlot(slot)
  1917.                         self.slotWindow.ActivateSlot(local, 0.5, 0.1, 0.1)
  1918.  
  1919.             else:
  1920.                 for slot in self.removingItemList:
  1921.                     self.slotWindow.ActivateSlot(slot, 0.5, 0.1, 0.1)
  1922.  
  1923.  
  1924.     # PUBLIC INTERFACE
  1925.     def Open(self):
  1926.         ikashop.SendOpenShopOwner()
  1927.         if app.EXTEND_IKASHOP_PRO:
  1928.             player.RefreshInventory()
  1929.  
  1930.     def Close(self):
  1931.         self.Hide()
  1932.         ikashop.SendCloseMyShopBoard()
  1933.         if app.EXTEND_IKASHOP_PRO:
  1934.             player.RefreshInventory()
  1935.  
  1936.     if app.EXTEND_IKASHOP_PRO:
  1937.         def AppendRemovingItemSlot(self, slot):
  1938.             if not slot in self.removingItemList:
  1939.                 self.removingItemList.append(slot)
  1940.  
  1941.         def SetEditedMarkedSlotInfo(self, vnum, count, hash, color, infinite = 0, price = None):
  1942.             self.editedMarkedInfo = vnum, count, hash, price
  1943.             self.editedMarkedTime = app.GetTime() + 20.0 if not infinite else -1
  1944.             self.editedMarkedColor = color
  1945.             self._RefreshItems()
  1946.  
  1947.         def OnUpdate(self):
  1948.             # checking for edited item list
  1949.             if self.editedMarkedTime != None and self.editedMarkedTime != -1 and self.editedMarkedTime < app.GetTime():
  1950.                 self.editedMarkedTime = None
  1951.                 self.editedMarkedInfo = None
  1952.                 self._RefreshItems()
  1953.  
  1954.             # checking for closed money input dialog
  1955.             if self.editedMarkedInfo != None and self.editedMarkedTime == -1 and not self.moneyInputDialog.IsShow():
  1956.                 self.editedMarkedTime = None
  1957.                 self.editedMarkedInfo = None
  1958.                 self._RefreshItems()
  1959.  
  1960.             # checking for removing item list
  1961.             if self.removingItemList:
  1962.                 if not self.questionDialog.IsShow():
  1963.                     self.removingItemList = []
  1964.                     self._RefreshItems()
  1965.  
  1966.     def IsCreatingAuction(self):
  1967.         return hasattr(self, "createAuctionDialog") and self.createAuctionDialog.IsShow()
  1968.  
  1969.     # BINARY CALLS
  1970.     def OpenShopOwner(self, data):
  1971.         # refreshing duration
  1972.         if data['duration'] > 0:
  1973.             self.durationText.SetText(locale.SecondToDHM(data['duration']*60))
  1974.             self.durationExpiredIcon.Hide()
  1975.             if not app.EXTEND_IKASHOP_ULTIMATE:
  1976.                 self.durationIncreaseButton.Hide()
  1977.         else:
  1978.             self.durationText.SetText(locale.IKASHOP_BUSINESS_SHOP_EXPIRED_DURATION)
  1979.             self.durationExpiredIcon.Show()
  1980.             self.durationIncreaseButton.Show()
  1981.  
  1982.         if app.EXTEND_IKASHOP_ULTIMATE:
  1983.             self.decorationBox.Show() if data['decoration'] != 0\
  1984.                 else self.decorationBox.Hide()
  1985.             self.decorationTime.SetText(locale.SecondToDHM(data['decoration_time']*60))
  1986.  
  1987.  
  1988.         # ordering items by cell and storing info
  1989.         data['items'] = { item['cell'] : item for item in data['items'] }
  1990.         self.shopInfo = data
  1991.  
  1992.         self._RefreshItems()
  1993.  
  1994.         if not self.IsShow():
  1995.             self.Show()
  1996.             self.SetTop()
  1997.             if app.EXTEND_IKASHOP_ULTIMATE:
  1998.                 self._OnSelectPage(0)
  1999.  
  2000.         if app.EXTEND_IKASHOP_PRO:
  2001.             player.RefreshInventory()
  2002.  
  2003.     def OpenShopOwnerEmpty(self):
  2004.         # refreshing duration
  2005.         self.durationText.SetText(locale.IKASHOP_BUSINESS_SHOP_EXPIRED_DURATION)
  2006.         self.durationExpiredIcon.Show()
  2007.         self.durationIncreaseButton.Show()
  2008.  
  2009.         if app.EXTEND_IKASHOP_ULTIMATE:
  2010.             self.decorationBox.Hide()
  2011.  
  2012.         # resetting slots
  2013.         for i in xrange(self.GRID_COLUMNS*self.GRID_ROWS):
  2014.             self.slotWindow.ClearSlot(i)
  2015.         self.slotWindow.RefreshSlot()
  2016.  
  2017.         # making shop info data
  2018.         self.shopInfo = {'duration' : 0, 'items' : {}}
  2019.         if app.EXTEND_IKASHOP_ULTIMATE:
  2020.             self.shopInfo['lock'] = ikashop.OFFSHOP_LOCK_INDEX_INIT
  2021.  
  2022.         if not self.IsShow():
  2023.             self.Show()
  2024.             self.SetTop()
  2025.             if app.EXTEND_IKASHOP_ULTIMATE:
  2026.                 self._OnSelectPage(0)
  2027.  
  2028.         if app.EXTEND_IKASHOP_PRO:
  2029.             player.RefreshInventory()
  2030.  
  2031.     def ShopOwnerRemoveItem(self, itemid):
  2032.         if 'items' in self.shopInfo:
  2033.             self.shopInfo['items'] = {cell:item for cell,item in self.shopInfo['items'].items() if item['id'] != itemid}
  2034.             self._RefreshItems()
  2035.  
  2036.     def ShopOwnerEditItem(self, itemid, prices):
  2037.         if 'items' in self.shopInfo:
  2038.             for data in self.shopInfo['items'].values():
  2039.                 if data['id'] == itemid:
  2040.                     data['price'] = prices['price']
  2041.                     if prices.has_key('cheque'):
  2042.                         data['cheque'] = prices['cheque']
  2043.                     self._RefreshItems()
  2044.                     break
  2045.  
  2046.     def SetupSafebox(self, yang, items):
  2047.         self.safeboxBoard.Setup(yang, items)
  2048.  
  2049.     def SafeboxRemoveItem(self, itemid):
  2050.         self.safeboxBoard.RemoveItem(itemid)
  2051.  
  2052.     def SafeboxAddItem(self, item):
  2053.         self.safeboxBoard.AddItem(item)
  2054.  
  2055.     def SetupAcutionOwner(self, data):
  2056.         self.auctionBoard.Setup(data)
  2057.  
  2058.     def OpenCreateAuctionQuestion(self):
  2059.         question = locale.IKASHOP_BUSINESS_NO_AUCTION_CREATE_AUCTION_QUESTION
  2060.         self.OpenQuestionDialog(question, self._OnAcceptCreateAuctionQuestion)
  2061.  
  2062.     def AuctionInsertItemInSlot(self, win, pos):
  2063.         self.createAuctionDialog.InsertItemInSlot(win, pos)
  2064.  
  2065.     def SetOffers(self, offers):
  2066.         self.offersBoard.SetOffers(offers)
  2067.  
  2068.     def SetSafeboxCounter(self, count):
  2069.         self.safeboxItemCounter.SetCounter(count)
  2070.  
  2071.     def SetAuctionCounter(self, count):
  2072.         self.auctionOfferCounter.SetCounter(count)
  2073.  
  2074.     def SetOffersCounter(self, count):
  2075.         self.privateOfferCounter.SetCounter(count)
  2076.  
  2077.     if app.EXTEND_IKASHOP_PRO:
  2078.         def SetNotificationCounter(self, count):
  2079.             self.notificationCounter.SetCounter(count)
  2080.  
  2081.         def SetNotifications(self, notifications):
  2082.             self.notificationBoard.SetNotifications(notifications)
  2083.  
  2084.     if app.EXTEND_IKASHOP_ULTIMATE:
  2085.         def SetPriceAverage(self, price):
  2086.             if hasattr(self, "moneyInputDialog"):
  2087.                 self.moneyInputDialog.SetPriceAverage(price)
  2088.             if hasattr(self, "createAuctionDialog"):
  2089.                 if hasattr(self.createAuctionDialog, "moneyInputDialog"):
  2090.                     self.createAuctionDialog.moneyInputDialog.SetPriceAverage(price)
  2091.  
  2092.         def _OnSelectPage(self, page):
  2093.             self.selectedPage = page
  2094.             for idx, button in enumerate(self.selectPageButtons):
  2095.                 button.Disable() if idx == page else button.Enable()
  2096.             self._RefreshItems()
  2097.  
  2098.         def _OnScrollMouseWheel(self, delta):
  2099.             if delta > 0:
  2100.                 if self.selectedPage > 0:
  2101.                     self._OnSelectPage(self.selectedPage-1)
  2102.             else:
  2103.                 if self.selectedPage + 1 < self.PAGE_COUNT:
  2104.                     self._OnSelectPage(self.selectedPage+1)
  2105.             return True
  2106.  
  2107.     def ServerPopupMessage(self, message):
  2108.         message = getattr(locale, message, message)
  2109.         self.OpenPopupDialog(message)
  2110.  
  2111. class IkarusShopGuestBoard(IkashopBoardWithTitleBar):
  2112.  
  2113.     GRID_COLUMNS = ikashop.SHOP_GRID_WIDTH
  2114.     GRID_ROWS = ikashop.SHOP_GRID_HEIGHT
  2115.  
  2116.     if app.EXTEND_IKASHOP_ULTIMATE:
  2117.         PAGE_COUNT = 3
  2118.         PAGE_SIZE = GRID_COLUMNS * GRID_ROWS
  2119.  
  2120.     def __init__(self):
  2121.         super(IkarusShopGuestBoard, self).__init__()
  2122.         if app.EXTEND_IKASHOP_ULTIMATE:
  2123.             self.selectedPage = 0
  2124.             self.lockImages = []
  2125.         self.markedInfo = None
  2126.         self._SettingUpBoard()
  2127.         self._LoadIkarusShopGuestBoard()
  2128.  
  2129.     def _SettingUpBoard(self):
  2130.         self.SetSize(508, 404)
  2131.         self.SetCloseEvent(self.Close)
  2132.         self.AddFlag("movable")
  2133.         self.AddFlag("float")
  2134.         self.SetCenterPosition()
  2135.         x,y = self.GetLocalPosition()
  2136.         self.SetPosition(x+100,y)
  2137.  
  2138.     def _LoadIkarusShopGuestBoard(self):
  2139.         # making slot box
  2140.         self.slotBox = self.CreateWidget(ui.ImageBox, pos = (5,35 + 27))
  2141.         self.slotBox.LoadImage("ikashop/lite/business/slot_box.png")
  2142.         if app.EXTEND_IKASHOP_ULTIMATE:
  2143.             self.slotBox.SetMouseWheelEvent(self._OnScrollMouseWheel)
  2144.  
  2145.         self.slotWindow = self.CreateWidget(ui.GridSlotWindow, parent = self.slotBox, pos = (6,6))
  2146.         self.slotWindow.ArrangeSlot(0, self.GRID_COLUMNS, self.GRID_ROWS, SLOT_SIZE, SLOT_SIZE, 0, 0)
  2147.         self.slotWindow.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
  2148.         self.slotWindow.SetSelectItemSlotEvent(self._OnClickItemSlot)
  2149.         self.slotWindow.SetOverInItemEvent(self._ShowToolTipOnItemSlot)
  2150.         self.slotWindow.SetOverOutItemEvent(self._HideToolTipOnItemSlot)
  2151.  
  2152.         # making duration box
  2153.         self.durationBox = self.CreateWidget(ui.ImageBox, pos = (5,35))
  2154.         self.durationBox.LoadImage("ikashop/lite/business/duration_box.png")
  2155.  
  2156.         self.durationText = self.CreateWidget(ui.TextLine, parent = self.durationBox, pos = (30, 4))
  2157.         self.durationText.SetPackedFontColor(0xFFFFFFFF)
  2158.         self.durationText.SetText("11d 22h 18m")
  2159.  
  2160.         if app.EXTEND_IKASHOP_ULTIMATE:
  2161.             self.lockedCells = []
  2162.             for i in xrange(self.PAGE_SIZE):
  2163.                 col, row = i % self.GRID_COLUMNS, i // self.GRID_COLUMNS
  2164.                 lock = self.CreateWidget(ui.ImageBox, pos = (6 + 32*col,6 + 32*row), parent = self.slotBox, show = 0)
  2165.                 lock.LoadImage("ikashop/ultimate/lock_slot.png")
  2166.                 self.lockedCells.append(lock)
  2167.  
  2168.             # making page selection box
  2169.             self.selectPageButtons = []
  2170.             for i in xrange(self.PAGE_COUNT):
  2171.                 selectPageButton = self.CreateWidget(ui.Button, pos = (269 - 48 + i*41, 35))
  2172.                 selectPageButton.SetUpVisual("ikashop/lite/safebox/buttons/select_page/default.png")
  2173.                 selectPageButton.SetDownVisual("ikashop/lite/safebox/buttons/select_page/default.png")
  2174.                 selectPageButton.SetOverVisual("ikashop/lite/safebox/buttons/select_page/hover.png")
  2175.                 selectPageButton.SetDisableVisual("ikashop/lite/safebox/buttons/select_page/disabled.png")
  2176.                 selectPageButton.SetText(RomeNumber(i+1))
  2177.                 selectPageButton.SAFE_SetEvent(self._OnSelectPage, i)
  2178.                 self.selectPageButtons.append(selectPageButton)
  2179.  
  2180.     def _OnClickItemSlot(self, slot):
  2181.         if app.EXTEND_IKASHOP_ULTIMATE:
  2182.             slot = self._LocalToGlobalSlot(slot)
  2183.  
  2184.         if slot in self.shopInfo['items']:
  2185.             data = self.shopInfo['items'][slot]
  2186.  
  2187.             # making item name
  2188.             item.SelectItem(data['vnum'])
  2189.             itemName = item.GetItemName()
  2190.             if data['count'] > 1:
  2191.                 itemName += "({})".format(data['count'])
  2192.  
  2193.             # making item price
  2194.             if ENABLE_CHEQUE_SYSTEM:
  2195.                 itemPrice = ""
  2196.                 if data['price'] != 0:
  2197.                     itemPrice += locale.NumberToMoneyString(data['price'])
  2198.                 if data['cheque'] != 0:
  2199.                     if itemPrice:
  2200.                         itemPrice += ', '
  2201.                     itemPrice += locale.NumberToCheque(data['cheque'])
  2202.             else:
  2203.                 itemPrice = locale.NumberToMoneyString(data['price'])
  2204.  
  2205.  
  2206.             if app.EXTEND_IKASHOP_PRO:
  2207.                 if IsPressingCTRL():
  2208.                     item.SelectItem(data['vnum'])
  2209.  
  2210.                     # making message
  2211.                     message = locale.IKASHOP_PRO_SHOP_GUEST_BUY_ALL_ITEMS_QUESTION.format(itemName, itemPrice)
  2212.                     self.buyAllInfo = data['vnum'], data['count'], data['price']
  2213.                     self.OpenQuestionDialog(message, self._OnAcceptBuyAllQuestion)
  2214.                     return
  2215.  
  2216.             if IsPressingSHIFT():
  2217.                 # checking offer min price
  2218.                 if data['price'] + data.get('cheque', 0) * YANG_PER_CHEQUE < 10000:
  2219.                     self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_MAKE_OFFER_ITEM_PRICE_TOO_LOW)
  2220.                     return
  2221.  
  2222.                 self.offerInfo = data['id'], data['price'], data.get('cheque', 0)
  2223.                 self.OpenMoneyInputDialog(self._OnAcceptMakeOfferInput)
  2224.                 if app.EXTEND_IKASHOP_ULTIMATE:
  2225.                     self.moneyInputDialog.SetPriceAverage(data['priceavg'])
  2226.                 return
  2227.  
  2228.             self.buyItemInfo = self.shopInfo['id'], data['id'], data['price'] + data.get('cheque', 0) * YANG_PER_CHEQUE
  2229.             message = locale.IKASHOP_SHOP_GUEST_BUY_ITEM_QUESTION.format(itemName, itemPrice)
  2230.             self.OpenQuestionDialog(message, self._OnAcceptBuyItemQuestion)
  2231.  
  2232.     if app.EXTEND_IKASHOP_PRO:
  2233.         def _OnAcceptBuyAllQuestion(self):
  2234.             self.questionDialog.Hide()
  2235.             for data in self.shopInfo['items'].values():
  2236.                 if (data['vnum'], data['count'], data['price']) == self.buyAllInfo:
  2237.                     ikashop.SendBuyItem(self.shopInfo['id'], data['id'], data['price'] + data.get('cheque', 0) * YANG_PER_CHEQUE)
  2238.  
  2239.     def _OnAcceptBuyItemQuestion(self):
  2240.         ikashop.SendBuyItem(*self.buyItemInfo)
  2241.         self.questionDialog.Hide()
  2242.  
  2243.     def _OnAcceptMakeOfferInput(self):
  2244.         self.moneyInputDialog.SoftClose()
  2245.  
  2246.         # validating value
  2247.         ok, value = ExtractInputPrice(self.moneyInputDialog)
  2248.         if not ok:
  2249.             self.OpenPopupDialog(locale.IKASHOP_BUSINESS_INVALID_ITEM_PRICE)
  2250.             return
  2251.  
  2252.         # checking for max offer price
  2253.         id, price, cheque = self.offerInfo
  2254.  
  2255.         if ENABLE_CHEQUE_SYSTEM:
  2256.             valueTotal = value[0] + value[1] * YANG_PER_CHEQUE
  2257.             priceTotal = price + cheque * YANG_PER_CHEQUE
  2258.             if valueTotal >= priceTotal:
  2259.                 self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_MUST_BE_LOWER_THAN_PRICE)
  2260.                 return True
  2261.  
  2262.             # checking for min offer price
  2263.             minoffer = priceTotal * MIN_OFFER_PCT / 100
  2264.             if valueTotal < minoffer:
  2265.                 self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_MUST_BE_HIGHER_THAN_PCT_OF_PRICE.format(MIN_OFFER_PCT))
  2266.                 return True
  2267.  
  2268.             # checking owned cash
  2269.             if value[0] > player.GetElk() or value[1] > player.GetCheque():
  2270.                 self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_NOT_ENOUGH_MONEY)
  2271.                 return True
  2272.  
  2273.         else:
  2274.             if value[0] >= price:
  2275.                 self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_MUST_BE_LOWER_THAN_PRICE)
  2276.                 return True
  2277.  
  2278.             # checking for min offer price
  2279.             minoffer = price * MIN_OFFER_PCT / 100
  2280.             if value[0] < minoffer:
  2281.                 self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_MUST_BE_HIGHER_THAN_PCT_OF_PRICE.format(MIN_OFFER_PCT))
  2282.                 return True
  2283.  
  2284.             # checking owned cash
  2285.             if value[0] > player.GetElk():
  2286.                 self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_NOT_ENOUGH_MONEY)
  2287.                 return True
  2288.  
  2289.         ikashop.SendOfferCreate(self.shopInfo['id'], id, *value)
  2290.         return True
  2291.  
  2292.     def _ShowToolTipOnItemSlot(self, slot):
  2293.         if app.EXTEND_IKASHOP_ULTIMATE:
  2294.             slot = self._LocalToGlobalSlot(slot)
  2295.  
  2296.         if slot in self.shopInfo['items']:
  2297.             data = self.shopInfo['items'][slot]
  2298.             tooltip = self.GetToolTip()
  2299.             tooltip.ClearToolTip()
  2300.             tooltip.AddItemData(data['vnum'], data['sockets'], data['attrs'])
  2301.             if 'price' in data and data['price'] != 0:
  2302.                 tooltip.AppendPrice(data['price'])
  2303.             if 'cheque' in data and data['cheque'] != 0:
  2304.                 tooltip.AppendCheque(data['cheque'])
  2305.             if app.EXTEND_IKASHOP_ULTIMATE:
  2306.                 tooltip.AppendTextLine(locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_NOT_AVAILABLE) if data['priceavg'] == 0 \
  2307.                     else tooltip.AppendTextLine(locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_VALUE.format(locale.NumberToMoneyString(data['priceavg'])))
  2308.             tooltip.AppendTextLine(locale.IKASHOP_SHOP_GUEST_BUY_ITEM_TOOLTIP)
  2309.             if app.EXTEND_IKASHOP_PRO:
  2310.                 tooltip.AppendTextLine(locale.IKASHOP_PRO_SHOP_GUEST_BUY_ALL_ITEM_TOOLTIP)
  2311.             tooltip.AppendTextLine(locale.IKASHOP_SHOP_GUEST_OFFER_ITEM_TOOLTIP)
  2312.             tooltip.ShowToolTip()
  2313.  
  2314.     def _HideToolTipOnItemSlot(self, slot=0):
  2315.         tooltip = self.GetToolTip()
  2316.         tooltip.ClearToolTip()
  2317.         tooltip.HideToolTip()
  2318.  
  2319.     if app.EXTEND_IKASHOP_ULTIMATE:
  2320.         def _OnSelectPage(self, page):
  2321.             self.selectedPage = page
  2322.             for idx, button in enumerate(self.selectPageButtons):
  2323.                 button.Disable() if idx == page else button.Enable()
  2324.             self._RefreshItems()
  2325.  
  2326.         def _LocalToGlobalSlot(self, pos):
  2327.             return self.selectedPage * self.PAGE_SIZE + pos
  2328.  
  2329.         def _GlobalToLocalSlot(self, pos):
  2330.             return pos % self.PAGE_SIZE
  2331.  
  2332.         def _OnScrollMouseWheel(self, delta):
  2333.             if delta > 0:
  2334.                 if self.selectedPage > 0:
  2335.                     self._OnSelectPage(self.selectedPage-1)
  2336.             else:
  2337.                 if self.selectedPage + 1 < self.PAGE_COUNT:
  2338.                     self._OnSelectPage(self.selectedPage+1)
  2339.             return True
  2340.  
  2341.     def _RefreshItems(self):
  2342.         # resetting slots
  2343.         for i in xrange(self.GRID_COLUMNS*self.GRID_ROWS):
  2344.             self.slotWindow.ClearSlot(i)
  2345.             self.slotWindow.DeactivateSlot(i)
  2346.  
  2347.         if app.EXTEND_IKASHOP_ULTIMATE:
  2348.             for i in xrange(self.PAGE_SIZE):
  2349.                 self.lockedCells[i].Hide()
  2350.  
  2351.             scell = self.PAGE_SIZE * self.selectedPage
  2352.             ecell = scell + self.PAGE_SIZE
  2353.  
  2354.             for cell in xrange(scell, ecell):
  2355.                 if cell >= self.shopInfo['lock']:
  2356.                     self.lockedCells[self._GlobalToLocalSlot(cell)].Show()
  2357.  
  2358.  
  2359.                 if cell in self.shopInfo['items']:
  2360.                     item = self.shopInfo['items'][cell]
  2361.                     pos = self._GlobalToLocalSlot(cell)
  2362.                     self.slotWindow.SetItemSlot(pos, item['vnum'], item['count'] if item['count'] > 1 else 0)
  2363.  
  2364.         else:
  2365.             # setting up slots
  2366.             for item in self.shopInfo['items'].values():
  2367.                 self.slotWindow.SetItemSlot(item['cell'], item['vnum'], item['count'] if item['count'] > 1 else 0)
  2368.  
  2369.         self.slotWindow.RefreshSlot()
  2370.         self._RefreshMarkedSlots()
  2371.  
  2372.     def _RefreshMarkedSlots(self):
  2373.         if not self.markedInfo:
  2374.             return
  2375.  
  2376.         if app.EXTEND_IKASHOP_ULTIMATE:
  2377.             scell = self.PAGE_SIZE * self.selectedPage
  2378.             ecell = scell + self.PAGE_SIZE
  2379.             shownCells = xrange(scell, ecell)
  2380.  
  2381.         vnum, count, price = self.markedInfo
  2382.         for cell, data in self.shopInfo['items'].items():
  2383.             if app.EXTEND_IKASHOP_ULTIMATE:
  2384.                 if cell not in shownCells:
  2385.                     continue
  2386.             if (data['vnum'], data['count'], data['price']) == (vnum, count, price):
  2387.                 self.slotWindow.ActivateSlot(cell, 0.4, 0.4, 0.1)
  2388.         self.slotWindow.RefreshSlot()
  2389.  
  2390.     def Open(self, data):
  2391.         # refreshing duration & title
  2392.         self.durationText.SetText(locale.SecondToDHM(data['duration']*60))
  2393.         self.SetTitleName(locale.IKASHOP_SHOP_NAME_FORMAT.format(data['name']))
  2394.  
  2395.         # ordering items by cell and storing info
  2396.         data['items'] = { item['cell'] : item for item in data['items'] }
  2397.         self.shopInfo = data
  2398.  
  2399.         self._RefreshItems()
  2400.  
  2401.         if not self.IsShow():
  2402.             if app.EXTEND_IKASHOP_ULTIMATE:
  2403.                 self._OnSelectPage(0)
  2404.             self.Show()
  2405.         self.SetTop()
  2406.  
  2407.     def Close(self):
  2408.         self.Hide()
  2409.         ikashop.SendCloseShopGuestBoard()
  2410.  
  2411.     def MarkItems(self, vnum, count, price):
  2412.         self.markedInfo = vnum, count, price
  2413.         self._RefreshMarkedSlots()
  2414.  
  2415.     def CheckExpiring(self, id):
  2416.         if self.shopInfo['id'] == id:
  2417.             self.Close()
  2418.             self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_EXPIRED)
  2419.  
  2420.     def ShopGuestRemoveItem(self, itemid):
  2421.         if 'items' in self.shopInfo:
  2422.             self.shopInfo['items'] = { cell : data for cell, data in self.shopInfo['items'].items() if data['id'] != itemid}
  2423.             self._RefreshItems()
  2424.  
  2425.     def EditItem(self, itemid, prices):
  2426.         if 'items' in self.shopInfo:
  2427.             for data in self.shopInfo['items'].values():
  2428.                 if data['id'] == itemid:
  2429.                     data['price'] = prices['price']
  2430.                     if 'cheque' in prices:
  2431.                         data['cheque'] = prices['cheque']
  2432.                     self._RefreshItems()
  2433.                     break
  2434.  
  2435.  
  2436. class IkarusAuctionGuestBoard(IkashopBoardWithTitleBar):
  2437.  
  2438.     OFFER_VIEW_COUNT = 6
  2439.     OFFER_VIEW_HEIGHT = 28
  2440.  
  2441.     def __init__(self):
  2442.         super(IkarusAuctionGuestBoard, self).__init__()
  2443.         self._SettingUpBoard()
  2444.         self._LoadIkarusShopAuctionGuestBoard()
  2445.  
  2446.     def _SettingUpBoard(self):
  2447.         sw, sh = GetScreenSize()
  2448.         self.SetSize(513 + 13, 249)
  2449.         self.SetCloseEvent(self.Close)
  2450.         self.SetPosition(sw/2 + self.GetWidth() - 600, sh / 2 - self.GetHeight()/2 + 100)
  2451.         self.AddFlag("movable")
  2452.         self.AddFlag("float")
  2453.  
  2454.     def _LoadIkarusShopAuctionGuestBoard(self):
  2455.         # making info box
  2456.         self.infoBox = self.CreateWidget(ui.ImageBox, pos = (12, 36))
  2457.         self.infoBox.LoadImage("ikashop/lite/auction/info_box.png")
  2458.         self.infoBox.SetMouseWheelEvent(self._MouseWheelScrollOffers)
  2459.  
  2460.         self.minRaiseText = self.CreateWidget(ui.TextLine, pos = (458+13, 221-36), parent = self.infoBox)
  2461.         self.minRaiseText.SetPackedFontColor(0xFFFFFFFF)
  2462.         self.minRaiseText.SetHorizontalAlignRight()
  2463.  
  2464.         self.durationText = self.CreateWidget(ui.TextLine, pos = (141, 221-36), parent = self.infoBox)
  2465.         self.durationText.SetPackedFontColor(0xFFFFFFFF)
  2466.  
  2467.         # making slot
  2468.         self.slot = self.CreateWidget(ui.GridSlotWindow, pos = (36, 44), size = (32, 98), parent = self.infoBox)
  2469.         self.slot.ArrangeSlot(0, 1, 3, SLOT_SIZE, SLOT_SIZE, 0, 0)
  2470.         self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
  2471.         self.slot.SetOverInItemEvent(self._OverInItem)
  2472.         self.slot.SetOverOutItemEvent(self._OverOutItem)
  2473.  
  2474.         # making scrollbar
  2475.         self.offerScrollbar = self.CreateWidget(ui.ScrollBar, pos = (470+13, 4), parent = self.infoBox)
  2476.         self.offerScrollbar.SetScrollBarSize(self.infoBox.GetHeight() - 35)
  2477.         self.offerScrollbar.SetScrollEvent(self._ScrollOffers)
  2478.  
  2479.         # making cancel auction button
  2480.         self.raiseButton = self.CreateWidget(ui.Button, pos = (12, self.GetHeight() - 33))
  2481.         self.raiseButton.SetUpVisual("ikashop/lite/auction/raise_button/default.png")
  2482.         self.raiseButton.SetDownVisual("ikashop/lite/auction/raise_button/default.png")
  2483.         self.raiseButton.SetOverVisual("ikashop/lite/auction/raise_button/hover.png")
  2484.         self.raiseButton.SetText(locale.IKASHOP_ACUTION_GUEST_RAISE_AUCTION_BUTTON)
  2485.         self.raiseButton.SAFE_SetEvent(self._OnClickRaiseAuction)
  2486.         self.raiseButton.Show()
  2487.  
  2488.         # making offers
  2489.         self.offerViews = []
  2490.         for i in xrange(self.OFFER_VIEW_COUNT):
  2491.             self.offerViews.append(self.CreateWidget(
  2492.                 IkarusShopAuctionOfferView, pos = (115, 6 + i*self.OFFER_VIEW_HEIGHT), parent = self.infoBox))
  2493.  
  2494.     def _RefreshOffers(self):
  2495.         # calculating count difference
  2496.         diff = len(self.offers) - self.OFFER_VIEW_COUNT
  2497.         diff = max(diff, 0)
  2498.  
  2499.         # calculating ranges
  2500.         offset = self.offerScrollbar.GetPos()
  2501.         sindex = int(diff * offset)
  2502.         eindex = sindex + min(self.OFFER_VIEW_COUNT, len(self.offers))
  2503.  
  2504.         # iterating over views
  2505.         for i, view in enumerate(self.offerViews):
  2506.             ri = i + sindex
  2507.             view.Hide() if ri >= eindex \
  2508.                 else view.Setup(ri+1, self.offers[ri])
  2509.  
  2510.         # update scrollbar's middlebar height
  2511.         self.offerScrollbar.UpdateScrollbarLenght(self.OFFER_VIEW_HEIGHT * len(self.offers))
  2512.  
  2513.     def _MouseWheelScrollOffers(self, delta):
  2514.         if self.offerScrollbar.IsShow():
  2515.             self.offerScrollbar.OnDown() if delta < 0 \
  2516.                 else self.offerScrollbar.OnUp()
  2517.         return True
  2518.  
  2519.     def _ScrollOffers(self):
  2520.         if self.offerScrollbar.IsShow():
  2521.             self._RefreshOffers()
  2522.  
  2523.     def _UpdateScrollbarState(self):
  2524.         self.offerScrollbar.SetPos(0)
  2525.         if len(self.offers) <= self.OFFER_VIEW_COUNT:
  2526.             self.offerScrollbar.Hide()
  2527.         else:
  2528.             self.offerScrollbar.Show()
  2529.  
  2530.     def _OverInItem(self, slot):
  2531.         data = self.auctionInfo
  2532.         tooltip = self.GetToolTip()
  2533.         tooltip.ClearToolTip()
  2534.         tooltip.AddItemData(data['vnum'], data['sockets'], data['attrs'])
  2535.         if app.EXTEND_IKASHOP_ULTIMATE:
  2536.             tooltip.AppendTextLine(locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_NOT_AVAILABLE) if data['priceavg'] == 0 \
  2537.                 else tooltip.AppendTextLine(locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_VALUE.format(locale.NumberToMoneyString(data['priceavg'])))
  2538.         tooltip.ShowToolTip()
  2539.  
  2540.     def _OverOutItem(self, slot = 0):
  2541.         tooltip = self.GetToolTip()
  2542.         tooltip.ClearToolTip()
  2543.         tooltip.HideToolTip()
  2544.  
  2545.     def _OnClickRaiseAuction(self):
  2546.         self.OpenMoneyInputDialog(self._OnAcceptRaiseAuctionInput, value = self.minRaise)
  2547.         if app.EXTEND_IKASHOP_ULTIMATE:
  2548.             data = self.auctionInfo
  2549.             self.moneyInputDialog.SetPriceAverage(data['priceavg'])
  2550.  
  2551.     def _OnAcceptRaiseAuctionInput(self):
  2552.         self.moneyInputDialog.SoftClose()
  2553.  
  2554.         ok, value = ExtractInputPrice(self.moneyInputDialog)
  2555.         if not ok:
  2556.             self.OpenPopupDialog(locale.IKASHOP_BUSINESS_INVALID_ITEM_PRICE)
  2557.             return
  2558.  
  2559.         if ENABLE_CHEQUE_SYSTEM:
  2560.             valueTotal = value[0] + value[1] * YANG_PER_CHEQUE
  2561.             if self.minRaise > valueTotal:
  2562.                 self.OpenPopupDialog(locale.IKASHOP_AUCTION_GUEST_MIN_RAISE_REQUIRED)
  2563.                 return True
  2564.  
  2565.             if value[0] > player.GetElk() or value[1] > player.GetCheque():
  2566.                 self.OpenPopupDialog(locale.IKASHOP_AUCTION_GUEST_NOT_ENOUGH_MONEY)
  2567.                 return True
  2568.  
  2569.         else:
  2570.             if self.minRaise > value[0]:
  2571.                 self.OpenPopupDialog(locale.IKASHOP_AUCTION_GUEST_MIN_RAISE_REQUIRED)
  2572.                 return True
  2573.  
  2574.             if value[0] > player.GetElk():
  2575.                 self.OpenPopupDialog(locale.IKASHOP_AUCTION_GUEST_NOT_ENOUGH_MONEY)
  2576.                 return True
  2577.  
  2578.         ikashop.SendAuctionAddOffer(self.auctionInfo['owner'], *value)
  2579.         return True
  2580.  
  2581.     def SetOffers(self, offers):
  2582.         self.offers = sorted(offers, key = lambda val : val['datetime'], reverse=True)
  2583.         self._UpdateScrollbarState()
  2584.         self._RefreshOffers()
  2585.         self.RefreshMinRaise()
  2586.  
  2587.     def SetDuration(self, duration):
  2588.         self.durationText.SetText(locale.SecondToDHM(duration*60))
  2589.  
  2590.     def _GetMinRaise(self):
  2591.         if not self.offers:
  2592.             return self.auctionInfo['price']
  2593.  
  2594.         minraise = max([val['price'] for val in self.offers])
  2595.         if minraise < 1000:
  2596.             return minraise + 1000
  2597.  
  2598.         return minraise * (100+AUCTION_MIN_RAISE_PERCENTAGE) / 100
  2599.  
  2600.     def RefreshMinRaise(self):
  2601.         self.minRaise = self._GetMinRaise()
  2602.         self.minRaiseText.SetText(locale.IKASHOP_AUCTION_MIN_BID + '  ' + locale.NumberToString(self.minRaise))
  2603.  
  2604.     def Open(self, data):
  2605.         # storing data
  2606.         self.auctionInfo = data
  2607.  
  2608.         # refreshing duration & title
  2609.         seconds = data['duration'] * 60
  2610.         self.durationText.SetText(locale.SecondToDHM(seconds))
  2611.         self.SetTitleName(locale.IKASHOP_AUCTION_GUEST_NAME_FORMAT.format(data['ownername']))
  2612.  
  2613.         # refreshing item
  2614.         vnum = data['vnum']
  2615.         count = data['count'] if data['count'] > 1 else 0
  2616.         item.SelectItem(vnum)
  2617.         size = item.GetItemSize()[1]
  2618.         self.slot.ArrangeSlot(0, 1, size, SLOT_SIZE, SLOT_SIZE, 0, 0)
  2619.         self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
  2620.         self.slot.SetItemSlot(0, vnum, count)
  2621.  
  2622.         # refreshing offers
  2623.         self.SetOffers(data['offers'])
  2624.  
  2625.         if not self.IsShow():
  2626.             self.Show()
  2627.             self.SetTop()
  2628.  
  2629.     def Close(self):
  2630.         self.Hide()
  2631.         ikashop.SendAuctionExitFrom(self.auctionInfo['owner'])
  2632.  
  2633.  
  2634. class IkarusAuctionListBoard(IkarusShopListBoard):
  2635.  
  2636.     AUCTION_VIEW_COUNT = 4
  2637.  
  2638.     def __init__(self):
  2639.         super(IkarusAuctionListBoard, self).__init__()
  2640.         self._SettingUpBoard()
  2641.         self._LoadIkarusAuctionListBoard()
  2642.  
  2643.     def _SettingUpBoard(self):
  2644.         self.SetSize(395, 510)
  2645.         self.SetTitleName(locale.IKASHOP_AUCTION_LIST_BOARD_TITLE)
  2646.         super(IkarusAuctionListBoard, self)._SettingUpBoard()
  2647.  
  2648.     def _LoadIkarusAuctionListBoard(self):
  2649.         self._LoadIkarusShopListBoard()
  2650.         self._MakeListElements(IkarusSearchShopItem, self.AUCTION_VIEW_COUNT)
  2651.  
  2652.     def SetAuctions(self, auctions):
  2653.         shuffle(auctions)
  2654.         self.auctions = auctions
  2655.         self.SetElements(self.auctions)
  2656.         self.Show()
  2657.         self.SetTop()
  2658.  
  2659.     def SetSearchShopBoard(self, board):
  2660.         for view in self.views:
  2661.             view.SetSearchShopBoard(board)
  2662.  
  2663.     def Open(self):
  2664.         ikashop.SendAuctionListRequest()
  2665.  
  2666.     def Close(self):
  2667.         self.Hide()
  2668.  
  2669. class IkarusShopHistoryFilterView(IkarusShopWindow):
  2670.  
  2671.     def __init__(self):
  2672.         super(IkarusShopHistoryFilterView, self).__init__()
  2673.         self._LoadIkarusShopHistoryFilterView()
  2674.  
  2675.     def _LoadIkarusShopHistoryFilterView(self):
  2676.         # making background and fitting its size
  2677.         self.background = self.CreateWidget(ui.ImageBox)
  2678.         self.background.LoadImage("ikashop/lite/history_search/box.png")
  2679.         self.SetSize(self.background.GetWidth(), self.background.GetHeight())
  2680.  
  2681.         # making what
  2682.         self.whatText = self.CreateWidget(ui.TextLine, pos = (9, 5))
  2683.         self.whatText.SetPackedFontColor(0xFFFFFFFF)
  2684.  
  2685.         # making datetime
  2686.         self.datetimeText = self.CreateWidget(ui.TextLine, pos = (405-11, 5))
  2687.         self.datetimeText.SetPackedFontColor(0xFFFFFFFF)
  2688.         self.datetimeText.SetHorizontalAlignCenter()
  2689.  
  2690.         # info button
  2691.         self.infoButton = self.CreateWidget(ui.Button, pos = (294, 1))
  2692.         self.infoButton.SetUpVisual("ikashop/lite/history_search/info_button/default.png")
  2693.         self.infoButton.SetDownVisual("ikashop/lite/history_search/info_button/default.png")
  2694.         self.infoButton.SetOverVisual("ikashop/lite/history_search/info_button/hover.png")
  2695.  
  2696.         # search button
  2697.         self.searchButton = self.CreateWidget(ui.Button, pos = (294 + 27, 1))
  2698.         self.searchButton.SetUpVisual("ikashop/lite/search_shop/mini_search_button/default.png")
  2699.         self.searchButton.SetDownVisual("ikashop/lite/search_shop/mini_search_button/default.png")
  2700.         self.searchButton.SetOverVisual("ikashop/lite/search_shop/mini_search_button/hover.png")
  2701.         self.searchButton.SetToolTipText(locale.IKASHOP_SEARCH_SHOP_SEARCH_BUTTON_TEXT)
  2702.  
  2703.     def _ShowToolTip(self):
  2704.         tooltip = self.GetToolTip()
  2705.         tooltip.ClearToolTip()
  2706.         # adding item name
  2707.         tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_HISTORY_WHAT_FORMAT.format(self.data['name'], self.data['count']))
  2708.         # adding type/subtype
  2709.         if self.data['type'] != 0:
  2710.             tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_HEADER + ': ' + IkarusSearchShopBoard.ITEM_TYPES[self.data['type']])
  2711.             if self.data['subtype'] != 0:
  2712.                 subtypes = IkarusSearchShopBoard.SUB_TYPES[self.data['type']]
  2713.                 tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_HEADER + ': ' + subtypes[self.data['subtype']])
  2714.         # adding price min/max
  2715.         if self.data['price_min'] != 0:
  2716.             tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_ITEM_PRICE_MIN_HEADER + ': ' + locale.NumberToString(self.data['price_min']))
  2717.         if self.data['price_max'] != 0:
  2718.             tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_ITEM_PRICE_MAX_HEADER + ': ' + locale.NumberToString(self.data['price_max']))
  2719.         # adding level min/max
  2720.         if self.data['level_min'] != 0:
  2721.             tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_ITEM_LEVEL_MIN_HEADER + ': ' + locale.NumberToString(self.data['level_min']))
  2722.         if self.data['level_max'] != 0:
  2723.             tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_ITEM_LEVEL_MAX_HEADER + ': ' + locale.NumberToString(self.data['level_max']))
  2724.         # adding attributes
  2725.         tooltip.AppendAttributes(self.data['attrs'])
  2726.         # adding special filters
  2727.         if self.data['sash'] != 0:
  2728.             tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_SASH_ABSORB_HEADER + ': ' + IkarusSearchShopBoard.SASH_ABSORBS[self.data['sash']])
  2729.         if self.data['alchemy'] != 0:
  2730.             tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_ALCHEMY_GRADE_HEADER + ': ' + IkarusSearchShopBoard.ALCHEMY_GRADES[self.data['alchemy']])
  2731.         tooltip.ResizeToolTip()
  2732.         tooltip.ShowToolTip()
  2733.  
  2734.     def _RefreshToolTip(self):
  2735.         tooltip = self.GetToolTip()
  2736.         if tooltip.IsShow():
  2737.             if not self.infoButton.IsIn():
  2738.                 tooltip.HideToolTip()
  2739.         else:
  2740.             if self.infoButton.IsIn():
  2741.                 self._ShowToolTip()
  2742.  
  2743.     def Setup(self, data):
  2744.         self.data = data
  2745.         self.datetimeText.SetText(DatetimeFormat(data['datetime']))
  2746.         self.whatText.SetText(locale.IKASHOP_SEARCH_SHOP_HISTORY_WHAT_FORMAT.format(data['name'], data['count']))
  2747.  
  2748.     def SetSearchEvent(self, event):
  2749.         self.searchButton.SAFE_SetEvent(event, proxy(self))
  2750.  
  2751.     def OnUpdate(self):
  2752.         self._RefreshToolTip()
  2753.  
  2754. class IkarusHistoryFilterBoard(IkarusShopListBoard):
  2755.  
  2756.     HISTORY_FILTER_VIEW_COUNT = 10
  2757.  
  2758.     def __init__(self):
  2759.         super(IkarusHistoryFilterBoard, self).__init__()
  2760.         self._SettingUpBoard()
  2761.         self._LoadIkarusHistoryFilterBoard()
  2762.  
  2763.     def _SettingUpBoard(self):
  2764.         self.SetSize(494, 339)
  2765.         self.SetTitleName(locale.IKASHOP_HISTORY_FILTER_LIST_BOARD_TITLE)
  2766.         super(IkarusHistoryFilterBoard, self)._SettingUpBoard()
  2767.  
  2768.     def _LoadIkarusHistoryFilterBoard(self):
  2769.         self._LoadIkarusShopListBoard()
  2770.         self._MakeListElements(IkarusShopHistoryFilterView, self.HISTORY_FILTER_VIEW_COUNT)
  2771.         for view in self.views:
  2772.             view.SetSearchEvent(self._OnClickSearchOnHistoryElement)
  2773.  
  2774.     def _OnClickSearchOnHistoryElement(self, view):
  2775.         self.searchShopBoard.HistoryRedoSearch(view.data)
  2776.         self.Close()
  2777.  
  2778.     def SetSearchShopBoard(self, board):
  2779.         self.searchShopBoard = proxy(board)
  2780.  
  2781.     def SetFilters(self, filters):
  2782.         self.filters = sorted(filters, key = lambda elm : elm['datetime'], reverse=True)
  2783.         self.SetElements(self.filters)
  2784.  
  2785.     def Open(self):
  2786.         self.Show()
  2787.         self.SetTop()
  2788.  
  2789.     def Close(self):
  2790.         self.Hide()
  2791.  
  2792. class IkarusShopComboBox(IkarusShopWindow):
  2793.  
  2794.     DEFAULT_VIEW_COUNT = 5
  2795.     ELEMENT_HEIGHT = 14
  2796.  
  2797.     class ComboBoxView(ui.Button):
  2798.         def Destroy(self):
  2799.             SelfDestroyObject(self)
  2800.  
  2801.     def __init__(self):
  2802.         super(IkarusShopComboBox, self).__init__()
  2803.         self.viewCount = self.DEFAULT_VIEW_COUNT
  2804.         self.elementWidth = 0
  2805.         self.selectItemEvent = None
  2806.         self.views = []
  2807.         self.items = []
  2808.         self.elementImages = (
  2809.             "ikashop/lite/search_shop/combo_box_element/default.png",
  2810.             "ikashop/lite/search_shop/combo_box_element/default.png",
  2811.             "ikashop/lite/search_shop/combo_box_element/hover.png")
  2812.         self.selectedItem = 0
  2813.         self._LoadIkarusShopComboBox()
  2814.  
  2815.     def _LoadIkarusShopComboBox(self):
  2816.         self.SetMouseWheelEvent(self._MouseWheelScrollView)
  2817.  
  2818.         self.background = self.CreateWidget(ui.Bar3D)
  2819.         self.background.SetColor(0xFF999999, 0xFF000000, 0xFF777777)
  2820.  
  2821.         self.scrollbar = self.CreateWidget(ui.ScrollBar, show = False, parent = self.background)
  2822.         self.scrollbar.SetScrollEvent(self._ScrollView)
  2823.  
  2824.     def _MakeViews(self):
  2825.         for view in self.views:
  2826.             SelfDestroyObject(view)
  2827.  
  2828.         self.views = []
  2829.         images = self.elementImages
  2830.         for i in xrange(self.viewCount):
  2831.             view = self.CreateWidget(self.ComboBoxView, pos = (0, i*self.ELEMENT_HEIGHT), parent = self.background)
  2832.             view.SetUpVisual(images[0])
  2833.             view.SetDownVisual(images[1])
  2834.             view.SetOverVisual(images[2])
  2835.             view.SetWindowName("cacca")
  2836.             self.elementWidth = max(self.elementWidth, view.GetWidth())
  2837.             self.views.append(view)
  2838.  
  2839.     def _MouseWheelScrollView(self, delta):
  2840.         if self.scrollbar.IsShow():
  2841.             self.scrollbar.OnDown() if delta < 0\
  2842.                 else self.scrollbar.OnUp()
  2843.         return True
  2844.  
  2845.     def _ScrollView(self):
  2846.         if self.scrollbar.IsShow():
  2847.             self._RefreshView()
  2848.  
  2849.     def _RefreshView(self):
  2850.         # making view if required
  2851.         if not self.views:
  2852.             self._MakeViews()
  2853.  
  2854.         # calculating sindex
  2855.         pos = self.scrollbar.GetPos() if self.scrollbar.IsShow() else 0.0
  2856.         diff = max(len(self.items) - self.viewCount, 0)
  2857.         sindex = int(diff * pos)
  2858.         eindex = sindex + min(len(self.items), self.viewCount)
  2859.  
  2860.         # hiding all views
  2861.         for view in self.views:
  2862.             view.Hide()
  2863.  
  2864.         # setting up and showing only used views
  2865.         for i in xrange(sindex, eindex):
  2866.             ri = i - sindex
  2867.             view = self.views[ri]
  2868.             view.SetText(self.items[i])
  2869.             view.ButtonText.SetPosition(view.GetWidth()/2, view.GetHeight() /2 -1)
  2870.             view.SAFE_SetEvent(self.SelectItem, i)
  2871.             view.Show()
  2872.  
  2873.             color = 0xFFFFFFFF if i != self.selectedItem else 0xFFFFFF88
  2874.             view.ButtonText.SetPackedFontColor(color)
  2875.  
  2876.         # updating scrollbar's middlebar length
  2877.         self.scrollbar.UpdateScrollbarLenght(len(self.items) * self.ELEMENT_HEIGHT)
  2878.  
  2879.     def _UpdateSize(self):
  2880.         viewHeight = self.ELEMENT_HEIGHT * min(len(self.items), self.viewCount)
  2881.         self.SetSize(self.GetWidth(), viewHeight)
  2882.         self.scrollbar.SetScrollBarSize(viewHeight)
  2883.         self.background.SetSize(self.GetWidth(), self.GetHeight())
  2884.  
  2885.     def _UpdateScrollbar(self):
  2886.         if len(self.items) > self.viewCount:
  2887.             self.scrollbar.Show()
  2888.             self.scrollbar.SetPos(0)
  2889.             self.scrollbar.SetPosition(self.elementWidth+1, 0)
  2890.             self.SetSize(self.elementWidth + 1 + self.scrollbar.GetWidth(), self.GetHeight())
  2891.             self.background.SetSize(self.GetWidth(), self.GetHeight())
  2892.         else:
  2893.             self.scrollbar.Hide()
  2894.             self.SetSize(self.elementWidth, self.GetHeight())
  2895.             self.background.SetSize(self.GetWidth(), self.GetHeight())
  2896.  
  2897.     def Open(self):
  2898.         self.Show()
  2899.  
  2900.     def Close(self):
  2901.         self.Hide()
  2902.  
  2903.     def GetSelectedItem(self):
  2904.         return self.selectedItem
  2905.  
  2906.     def SelectItem(self, index):
  2907.         self.selectedItem = index
  2908.         self._RefreshView()
  2909.         self.Close()
  2910.         if self.selectItemEvent:
  2911.             self.selectItemEvent(index, self.items[index])
  2912.  
  2913.     def SetSelectItemEvent(self, event):
  2914.         self.selectItemEvent = event
  2915.  
  2916.     def SetItems(self, items):
  2917.         self.items = items
  2918.         if not self.views:
  2919.             self._MakeViews()
  2920.         self._UpdateSize()
  2921.         self._UpdateScrollbar()
  2922.         self._RefreshView()
  2923.  
  2924.     def SetViewCount(self, count):
  2925.         self.viewCount = count
  2926.         self._UpdateSize()
  2927.         self._UpdateScrollbar()
  2928.         self._MakeViews()
  2929.         self._RefreshView()
  2930.  
  2931.     def ChangeElementImages(self, images):
  2932.         self.elementImages = images
  2933.         self._MakeViews()
  2934.         self._UpdateSize()
  2935.         self._UpdateScrollbar()
  2936.         self._RefreshView()
  2937.  
  2938.     # used to check via proxy ref
  2939.     def IsMe(self, combobox):
  2940.         return self is combobox
  2941.  
  2942.  
  2943. if app.EXTEND_IKASHOP_ULTIMATE:
  2944.     class IkashopCheckBox(IkarusShopWindow):
  2945.  
  2946.         def __init__(self):
  2947.             super(IkashopCheckBox, self).__init__()
  2948.             self.checkEvent = None
  2949.             self.isEnabled = False
  2950.             self._LoadIkashopCheckBox()
  2951.  
  2952.         def _LoadIkashopCheckBox(self):
  2953.             self.text = self.CreateWidget(ui.TextLine)
  2954.             self.text.SetPackedFontColor(0xFFFFFFFF)
  2955.  
  2956.             self.base = self.CreateWidget(ui.ImageBox)
  2957.             self.base.SetOnMouseLeftButtonUpEvent(self.Check)
  2958.  
  2959.             self.checked = self.CreateWidget(ui.ImageBox, show = False)
  2960.             self.checked.SetOnMouseLeftButtonUpEvent(self.Uncheck)
  2961.  
  2962.         def _Resize(self):
  2963.             w = self.text.GetWidth() + 5 + max(self.base.GetWidth(), self.checked.GetWidth())
  2964.             h = max([self.text.GetHeight(), self.base.GetHeight(), self.checked.GetHeight()])
  2965.             self.base.SetPosition(self.text.GetWidth() + 5, 0)
  2966.             self.checked.SetPosition(self.text.GetWidth() + 5, 0)
  2967.             self.SetSize(w, h)
  2968.  
  2969.         def SetImages(self, base, checked):
  2970.             self.base.LoadImage(base)
  2971.             self.checked.LoadImage(checked)
  2972.             self._Resize()
  2973.  
  2974.         def SetText(self, text):
  2975.             self.text.SetText(text)
  2976.             self.text.FitText()
  2977.             self._Resize()
  2978.  
  2979.         def SetCheckEvent(self, event):
  2980.             self.checkEvent = event
  2981.  
  2982.         def Check(self, callback = 1):
  2983.             if self.isEnabled:
  2984.                 self.base.Hide()
  2985.                 self.checked.Show()
  2986.             if callback and self.checkEvent:
  2987.                 self.checkEvent()
  2988.  
  2989.         def Uncheck(self, callback = 1):
  2990.             self.base.Show()
  2991.             self.checked.Hide()
  2992.             if callback and self.checkEvent:
  2993.                 self.checkEvent()
  2994.  
  2995.         def IsChecked(self):
  2996.             return self.checked.IsShow()
  2997.  
  2998.         def Enable(self):
  2999.             self.isEnabled = True
  3000.  
  3001.         def Disable(self):
  3002.             self.isEnabled = False
  3003.  
  3004.         def IsEnabled(self):
  3005.             return self.isEnabled
  3006.  
  3007. class IkarusSearchShopItem(IkarusShopWindow):
  3008.  
  3009.     def __init__(self):
  3010.         super(IkarusSearchShopItem, self).__init__()
  3011.         self.data = {'id':-1}
  3012.         self._LoadIkarusSearchShopItem()
  3013.  
  3014.     def _LoadIkarusSearchShopItem(self):
  3015.         # making background
  3016.         self.background = self.CreateWidget(ui.ExpandedImageBox)
  3017.         self.background.LoadImage("ikashop/lite/search_shop/result_item_box.png")
  3018.         self.SetSize(self.background.GetWidth(), self.background.GetHeight())
  3019.  
  3020.         # making textlines
  3021.         self.itemName = self.CreateWidget(ui.TextLine, pos = (60, 17 - 6))
  3022.         self.sellerName = self.CreateWidget(ui.TextLine, pos = (78, 41 - 6))
  3023.         self.duration = self.CreateWidget(ui.TextLine, pos = (226, 41 - 6))
  3024.         self.price = self.CreateWidget(ui.TextLine, pos = (78, 58))
  3025.  
  3026.         if ENABLE_CHEQUE_SYSTEM:
  3027.             self.cheque = self.CreateWidget(ui.TextLine, pos = (128 + 70, 58))
  3028.             self.chequeIcon = self.CreateWidget(ui.ImageBox, pos = (110 + 70, 59))
  3029.             self.chequeIcon.LoadImage("d:/ymir work/ui/game/windows/cheque_icon.sub")
  3030.  
  3031.         if app.EXTEND_IKASHOP_ULTIMATE:
  3032.             self.priceAverage = self.CreateWidget(ui.TextLine, pos = (330-8, 58))
  3033.             self.priceAverage.SetHorizontalAlignRight()
  3034.  
  3035.         # making buttons
  3036.         self.buyButton = self.CreateWidget(ui.Button, pos = (261, 84))
  3037.         self.buyButton.SetUpVisual("ikashop/lite/search_shop/buy_button/default.png")
  3038.         self.buyButton.SetDownVisual("ikashop/lite/search_shop/buy_button/default.png")
  3039.         self.buyButton.SetOverVisual("ikashop/lite/search_shop/buy_button/hover.png")
  3040.         self.buyButton.SAFE_SetEvent(self._OnClickBuyButton)
  3041.         self.buyButton.SetText(locale.IKASHOP_SEARCH_SHOP_BUY_BUTTON_TEXT)
  3042.  
  3043.         self.offerButton = self.CreateWidget(ui.Button, pos = (189, 84))
  3044.         self.offerButton.SetUpVisual("ikashop/lite/search_shop/offer_button/default.png")
  3045.         self.offerButton.SetDownVisual("ikashop/lite/search_shop/offer_button/default.png")
  3046.         self.offerButton.SetOverVisual("ikashop/lite/search_shop/offer_button/hover.png")
  3047.         self.offerButton.SAFE_SetEvent(self._OnClickOfferButton)
  3048.         self.offerButton.SetText(locale.IKASHOP_SEARCH_SHOP_OFFER_BUTTON_TEXT)
  3049.  
  3050.         self.openSellingBoard = self.CreateWidget(ui.Button, pos = (50, 84), show = False)
  3051.         self.openSellingBoard.SetUpVisual("ikashop/lite/search_shop/offer_button/default.png")
  3052.         self.openSellingBoard.SetDownVisual("ikashop/lite/search_shop/offer_button/default.png")
  3053.         self.openSellingBoard.SetOverVisual("ikashop/lite/search_shop/offer_button/hover.png")
  3054.         self.openSellingBoard.SAFE_SetEvent(self._OnClickOpenSellingBoardButton)
  3055.  
  3056.         if app.EXTEND_IKASHOP_PRO:
  3057.             self.messageSellerButton = self.CreateWidget(ui.Button)
  3058.             self.messageSellerButton.SetUpVisual("ikashop/ultimate/seller_message/default.png")
  3059.             self.messageSellerButton.SetOverVisual("ikashop/ultimate/seller_message/hover.png")
  3060.             self.messageSellerButton.SetDownVisual("ikashop/ultimate/seller_message/default.png")
  3061.             self.messageSellerButton.SAFE_SetEvent(self._OnClickMessageSeller)
  3062.  
  3063.         # making slot item
  3064.         self.slot = self.CreateWidget(ui.GridSlotWindow, pos = (9, 7))
  3065.         self.slot.ArrangeSlot(0, 1, 3, SLOT_SIZE, SLOT_SIZE, 0, 0)
  3066.         self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
  3067.         self.slot.SetOverInItemEvent(self._OverInItem)
  3068.         self.slot.SetOverOutItemEvent(self._OverOutItem)
  3069.  
  3070.     def _OnClickBuyButton(self):
  3071.         item.SelectItem(self.data['vnum'])
  3072.         # making item name
  3073.         itemName = item.GetItemName()
  3074.         if self.data['count'] > 1:
  3075.             itemName += "({})".format(self.data['count'])
  3076.  
  3077.         # making item price
  3078.         if ENABLE_CHEQUE_SYSTEM:
  3079.             itemPrice = ""
  3080.             if self.data['price'] != 0:
  3081.                 itemPrice += locale.NumberToMoneyString(self.data['price'])
  3082.             if self.data['cheque'] != 0:
  3083.                 if itemPrice:
  3084.                     itemPrice += ', '
  3085.                 itemPrice += locale.NumberToCheque(self.data['cheque'])
  3086.         else:
  3087.             itemPrice = locale.NumberToMoneyString(self.data['price'])
  3088.  
  3089.         self.buyItemInfo = self.data['owner'], self.data['id'], self.data['price'] + self.data.get('cheque', 0) * YANG_PER_CHEQUE
  3090.         message = locale.IKASHOP_SHOP_GUEST_BUY_ITEM_QUESTION.format(itemName, itemPrice)
  3091.         self.OpenQuestionDialog(message, self._OnAcceptBuyItemQuestion)
  3092.  
  3093.     def _OnClickOfferButton(self):
  3094.         # checking offer min price
  3095.         if self.data['price'] + self.data.get('cheque', 0) * YANG_PER_CHEQUE < 10000:
  3096.             self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_MAKE_OFFER_ITEM_PRICE_TOO_LOW)
  3097.             return
  3098.  
  3099.         self.offerInfo = self.data['id'], self.data['price'], self.data.get('cheque', 0)
  3100.         self.OpenMoneyInputDialog(self._OnAcceptMakeOfferInput)
  3101.         if app.EXTEND_IKASHOP_ULTIMATE:
  3102.             self.moneyInputDialog.SetPriceAverage(self.data['priceavg'])
  3103.         return
  3104.  
  3105.     def _OnAcceptBuyItemQuestion(self):
  3106.         ikashop.SendBuyItem(*self.buyItemInfo)
  3107.         self.questionDialog.Hide()
  3108.  
  3109.     def _OnAcceptMakeOfferInput(self):
  3110.         self.moneyInputDialog.SoftClose()
  3111.  
  3112.         # validating value
  3113.         ok, value = ExtractInputPrice(self.moneyInputDialog)
  3114.         if not ok:
  3115.             self.OpenPopupDialog(locale.IKASHOP_BUSINESS_INVALID_ITEM_PRICE)
  3116.             return
  3117.  
  3118.         # checking for max offer price
  3119.         id, price, cheque = self.offerInfo
  3120.  
  3121.         if ENABLE_CHEQUE_SYSTEM:
  3122.             valueTotal = value[0] + value[1] * YANG_PER_CHEQUE
  3123.             priceTotal = price + cheque * YANG_PER_CHEQUE
  3124.             if valueTotal >= priceTotal:
  3125.                 self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_MUST_BE_LOWER_THAN_PRICE)
  3126.                 return True
  3127.  
  3128.             # checking for min offer price
  3129.             minoffer = priceTotal * MIN_OFFER_PCT / 100
  3130.             if valueTotal < minoffer:
  3131.                 self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_MUST_BE_HIGHER_THAN_PCT_OF_PRICE.format(MIN_OFFER_PCT))
  3132.                 return True
  3133.  
  3134.             # checking owned cash
  3135.             if value[0] > player.GetElk() or value[1] > player.GetCheque():
  3136.                 self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_NOT_ENOUGH_MONEY)
  3137.                 return True
  3138.  
  3139.         else:
  3140.             if value[0] >= price:
  3141.                 self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_MUST_BE_LOWER_THAN_PRICE)
  3142.                 return True
  3143.  
  3144.             # checking for min offer price
  3145.             minoffer = price * MIN_OFFER_PCT / 100
  3146.             if value[0] < minoffer:
  3147.                 self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_MUST_BE_HIGHER_THAN_PCT_OF_PRICE.format(MIN_OFFER_PCT))
  3148.                 return True
  3149.  
  3150.             # checking owned cash
  3151.             if value[0] > player.GetElk():
  3152.                 self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_NOT_ENOUGH_MONEY)
  3153.                 return True
  3154.  
  3155.         ikashop.SendOfferCreate(self.data['owner'], id, *value)
  3156.         return True
  3157.  
  3158.     def _OnClickOpenSellingBoardButton(self):
  3159.         if self.data['is_auction']:
  3160.             ikashop.SendAuctionOpenAuction(self.data['owner'])
  3161.         if app.EXTEND_IKASHOP_ULTIMATE:
  3162.             if not self.data['is_auction']:
  3163.                 self.searchShopBoard.RequestOpenSellerShop(
  3164.                     self.data['owner'], self.data['vnum'], self.data['count'], self.data['price'])
  3165.  
  3166.     def _OverInItem(self, slot):
  3167.         tooltip = self.GetToolTip()
  3168.         tooltip.ClearToolTip()
  3169.         tooltip.AddItemData(self.data['vnum'], self.data['sockets'], self.data['attrs'])
  3170.         tooltip.ShowToolTip()
  3171.  
  3172.     def _OverOutItem(self):
  3173.         tooltip = self.GetToolTip()
  3174.         tooltip.HideToolTip()
  3175.  
  3176.     if app.EXTEND_IKASHOP_PRO:
  3177.         def _OnClickMessageSeller(self):
  3178.             self.searchShopBoard.OpenWhisper(self.sellerName.GetText())
  3179.  
  3180.     def SetSearchShopBoard(self, board):
  3181.         self.searchShopBoard = proxy(board)
  3182.  
  3183.     def GetId(self):
  3184.         return self.data['id']
  3185.  
  3186.     def SetNotAvailable(self):
  3187.         if not self.data['is_auction']:
  3188.             self.slot.DisableSlot(0)
  3189.             self.itemName.SetPackedFontColor(0xFFFF8888)
  3190.             self.buyButton.Hide()
  3191.             self.offerButton.Hide()
  3192.  
  3193.     def SetAvailable(self):
  3194.         if not self.data['is_auction']:
  3195.             self.slot.EnableSlot(0)
  3196.             self.itemName.SetPackedFontColor(0xFFFFFFFF)
  3197.             self.buyButton.Show()
  3198.             self.offerButton.Show()
  3199.  
  3200.     def Setup(self, data):
  3201.         if data['is_auction']:
  3202.             self.buyButton.Hide()
  3203.             self.offerButton.Hide()
  3204.             self.background.LoadImage("ikashop/lite/search_shop/result_item_auction_box.png")
  3205.             self.openSellingBoard.SetText(locale.IKASHOP_SEARCH_SHOP_OPEN_AUCTION_BUTTON_TEXT)
  3206.             self.openSellingBoard.Show()
  3207.         else:
  3208.             self.buyButton.Show()
  3209.             self.offerButton.Show()
  3210.             self.background.LoadImage("ikashop/lite/search_shop/result_item_box.png")
  3211.             if app.EXTEND_IKASHOP_ULTIMATE:
  3212.                 self.openSellingBoard.SetText(locale.IKASHOP_SEARCH_SHOP_OPEN_SHOP_BUTTON_TEXT)
  3213.                 self.openSellingBoard.Show()
  3214.             else:
  3215.                 self.openSellingBoard.Hide()
  3216.  
  3217.         # setting itemname
  3218.         item.SelectItem(data['vnum'])
  3219.         itemName = item.GetItemName()
  3220.         if data['is_auction']:
  3221.             itemName += ' ' + locale.IKASHOP_SEARCH_SHOP_ITEM_NAME_AUCTION
  3222.         self.itemName.SetText(itemName)
  3223.  
  3224.         # setting seller name
  3225.         self.sellerName.SetText(data['seller_name'])
  3226.  
  3227.         if app.EXTEND_IKASHOP_PRO:
  3228.             sx, sy = self.sellerName.GetLocalPosition()
  3229.             self.messageSellerButton.SetPosition(sx + self.sellerName.GetTextSize()[0] + 10, sy)
  3230.  
  3231.         # setting duration
  3232.         self.duration.SetText(locale.SecondToDHM(data['duration']*60))
  3233.  
  3234.         # setting price
  3235.         self.price.SetText(locale.NumberToString(data['price']))
  3236.  
  3237.         if ENABLE_CHEQUE_SYSTEM:
  3238.             self.cheque.Show() if data['cheque'] != 0 else self.cheque.Hide()
  3239.             self.chequeIcon.Show() if data['cheque'] != 0 else self.chequeIcon.Hide()
  3240.             self.cheque.SetText(locale.NumberToString(data['cheque']))
  3241.  
  3242.         if app.EXTEND_IKASHOP_ULTIMATE:
  3243.             pa = locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_NOT_AVAILABLE_EMOJI if data['priceavg'] == 0 \
  3244.                 else locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_EMOJI.format(locale.NumberToMoneyString(data['priceavg']))
  3245.             self.priceAverage.SetText(pa)
  3246.  
  3247.         # setting slot
  3248.         itemcount = data['count'] if data['count'] > 1 else 0
  3249.         self.slot.ArrangeSlot(0, 1, item.GetItemSize()[1], SLOT_SIZE, SLOT_SIZE, 0, 0)
  3250.         self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
  3251.         self.slot.SetItemSlot(0, data['vnum'], itemcount)
  3252.         self.data = data
  3253.  
  3254.  
  3255. class IkarusSearchShopBoard(IkashopBoardWithTitleBar):
  3256.  
  3257.     RESULT_ITEM_VIEW_COUNT = 4
  3258.  
  3259.     ITEM_TYPES = (
  3260.         locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,
  3261.         locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_WEAPON,
  3262.         locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_ARMOR,
  3263.         locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_JEWEL,
  3264.         locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_COSTUME,
  3265.         locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_PET,
  3266.         locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_MOUNT,
  3267.         locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_ALCHEMY,
  3268.         locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_BOOK,
  3269.         locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_STONE,
  3270.         locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_MINERALS,
  3271.         locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_FISH,
  3272.     )
  3273.  
  3274.     SUBTYPE_WEAPON = (
  3275.         locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,
  3276.         locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_WEAPON_SWORD,
  3277.         locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_WEAPON_TWOHANDED,
  3278.         locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_WEAPON_BLADE,
  3279.         locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_WEAPON_DAGGER,
  3280.         locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_WEAPON_BOW,
  3281.         locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_WEAPON_BELL,
  3282.         locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_WEAPON_FAN,
  3283.     )
  3284.  
  3285.     if app.ENABLE_WOLFMAN_CHARACTER:
  3286.         SUBTYPE_WEAPON += (locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_WEAPON_CLAW,)
  3287.  
  3288.     SUBTYPE_ARMOR = (
  3289.         locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,
  3290.         locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_ARMOR_WARRIOR,
  3291.         locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_ARMOR_SURA,
  3292.         locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_ARMOR_ASSASSIN,
  3293.         locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_ARMOR_SHAMAN,
  3294.     )
  3295.  
  3296.     if app.ENABLE_WOLFMAN_CHARACTER:
  3297.         SUBTYPE_ARMOR += (locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_ARMOR_WOLFMAN,)
  3298.  
  3299.     SUBTYPE_JEWEL = (
  3300.         locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,
  3301.         locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_JEWEL_HELM,
  3302.         locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_JEWEL_SHIELD,
  3303.         locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_JEWEL_EAR,
  3304.         locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_JEWEL_NECK,
  3305.         locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_JEWEL_WRIST,
  3306.         locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_JEWEL_SHOES,
  3307.     )
  3308.  
  3309.     SUBTYPE_COSTUME = (
  3310.         locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,
  3311.         locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_COSTUME_BODY,
  3312.         locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_COSTUME_WEAPON,
  3313.         locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_COSTUME_HAIR,
  3314.     )
  3315.  
  3316.     if app.ENABLE_ACCE_COSTUME_SYSTEM:
  3317.         SUBTYPE_COSTUME += (locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_COSTUME_SASH,)
  3318.  
  3319.     SUBTYPE_PET = (
  3320.         locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,
  3321.         locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_PET_EGGS,
  3322.         locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_PET_SEALS,
  3323.     )
  3324.  
  3325.     SUBTYPE_MOUNT = (locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,)
  3326.     SUBTYPE_ALCHEMY = (locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,)
  3327.     SUBTYPE_BOOKS = (locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,)
  3328.     SUBTYPE_STONE = (locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,)
  3329.     SUBTYPE_MINERAL = (locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,)
  3330.     SUBTYPE_FISH = (locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,)
  3331.  
  3332.     SUB_TYPES = (
  3333.         (locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,),
  3334.         SUBTYPE_WEAPON,
  3335.         SUBTYPE_ARMOR,
  3336.         SUBTYPE_JEWEL,
  3337.         SUBTYPE_COSTUME,
  3338.         SUBTYPE_PET,
  3339.         SUBTYPE_MOUNT,
  3340.         SUBTYPE_ALCHEMY,
  3341.         SUBTYPE_BOOKS,
  3342.         SUBTYPE_STONE,
  3343.         SUBTYPE_MINERAL,
  3344.         SUBTYPE_FISH,
  3345.     )
  3346.  
  3347.     SASH_ABSORBS = (
  3348.         locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,
  3349.         locale.IKASHOP_SEARCH_SHOP_SASH_GRADE_VALUE0,
  3350.         locale.IKASHOP_SEARCH_SHOP_SASH_GRADE_VALUE1,
  3351.         locale.IKASHOP_SEARCH_SHOP_SASH_GRADE_VALUE2,
  3352.         locale.IKASHOP_SEARCH_SHOP_SASH_GRADE_VALUE3,
  3353.     )
  3354.  
  3355.     ALCHEMY_GRADES = (
  3356.         locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,
  3357.         locale.IKASHOP_SEARCH_SHOP_DRAGON_SOUL_GRADE_NORMAL,
  3358.         locale.IKASHOP_SEARCH_SHOP_DRAGON_SOUL_GRADE_BRILLIANT,
  3359.         locale.IKASHOP_SEARCH_SHOP_DRAGON_SOUL_GRADE_RARE,
  3360.         locale.IKASHOP_SEARCH_SHOP_DRAGON_SOUL_GRADE_ANCIENT,
  3361.         locale.IKASHOP_SEARCH_SHOP_DRAGON_SOUL_GRADE_LEGENDARY,
  3362.     )
  3363.  
  3364.     def __init__(self):
  3365.         super(IkarusSearchShopBoard, self).__init__()
  3366.         ikashop.SetSearchShopBoard(self)
  3367.         self.items = []
  3368.         self.lastOpen = 0
  3369.         self.markItemInfo = None
  3370.         if app.EXTEND_IKASHOP_ULTIMATE:
  3371.             self.shuffleItem = None
  3372.         self._MakeItemNameContainers()
  3373.         self._SettingUpBoard()
  3374.         self._LoadSearchShopWindow()
  3375.  
  3376.     def __del__(self):
  3377.         super(IkarusSearchShopBoard, self).__del__()
  3378.         ikashop.SetSearchShopBoard(None)
  3379.  
  3380.     def _MakeItemNameContainers(self):
  3381.         names = ikashop.GetItemNames()
  3382.         self.itemNames = set()
  3383.  
  3384.         for name in names:
  3385.             f = name.find("+")
  3386.             if f != -1 and len(name)-1 != f and name[f+1:].isdigit():
  3387.                 name = name[:f]
  3388.             self.itemNames.add(name.lower())
  3389.  
  3390.     def _SettingUpBoard(self):
  3391.         self.SetSize(604, 519)
  3392.         self.SetTitleName(locale.IKASHOP_SEARCH_SHOP_BOARD_TITLE)
  3393.         self.SetCloseEvent(self.Close)
  3394.         self.SetCenterPosition()
  3395.         self.AddFlag("movable")
  3396.         self.AddFlag("float")
  3397.  
  3398.     def _LoadLinkedBoard(self):
  3399.         self.shopGuestBoard = IkarusShopGuestBoard()
  3400.         self.auctionGuestBoard = IkarusAuctionGuestBoard()
  3401.         self.auctionListBoard = IkarusAuctionListBoard()
  3402.         self.historyFilterBoard = IkarusHistoryFilterBoard()
  3403.  
  3404.         self.auctionListBoard.SetSearchShopBoard(self)
  3405.         self.historyFilterBoard.SetSearchShopBoard(self)
  3406.         self.historyFilterBoard.SetFilters(ikashop.GetFilterHistory())
  3407.  
  3408.     def _LoadSearchShopWindow(self):
  3409.         self._LoadLinkedBoard()
  3410.         getBottom = lambda win : win.GetLocalPosition()[1] + win.GetHeight()
  3411.         getRight = lambda win : win.GetLocalPosition()[0] + win.GetWidth()
  3412.  
  3413.         largerComboBoxImages = (
  3414.             "ikashop/lite/search_shop/attribute_element/default.png",
  3415.             "ikashop/lite/search_shop/attribute_element/default.png",
  3416.             "ikashop/lite/search_shop/attribute_element/hover.png",
  3417.         )
  3418.  
  3419.         self.inputNameBox = self.CreateWidget(ui.ExpandedImageBox, pos = (14,40))
  3420.         self.inputNameBox.LoadImage("ikashop/lite/search_shop/input_name.png")
  3421.         self.inputNameBox.SetScale(155.0 / self.inputNameBox.GetWidth(), 1.0)
  3422.  
  3423.         self.searchButton = self.CreateWidget(ui.Button, pos = (14 + self.inputNameBox.GetWidth() + 2, 42))
  3424.         self.searchButton.SetUpVisual("ikashop/lite/search_shop/mini_search_button/default.png")
  3425.         self.searchButton.SetDownVisual("ikashop/lite/search_shop/mini_search_button/default.png")
  3426.         self.searchButton.SetOverVisual("ikashop/lite/search_shop/mini_search_button/hover.png")
  3427.         self.searchButton.SAFE_SetEvent(self._OnClickSearchButton)
  3428.         self.searchButton.SetToolTipText(locale.IKASHOP_SEARCH_SHOP_SEARCH_BUTTON_TEXT)
  3429.  
  3430.         iw = self.inputNameBox.GetWidth() - self.searchButton.GetWidth() - 6
  3431.         ih = self.inputNameBox.GetHeight() - 6
  3432.         self.inputNameEdit = self.CreateWidget(ui.EditLine, pos = (6, 6), size = (iw, ih), parent=self.inputNameBox)
  3433.         self.inputNameEdit.SetMax(ikashop.FILTER_NAME_MAX_LEN)
  3434.         self.inputNameEdit.SetEscapeEvent(ui.__mem_func__(self.inputNameEdit.KillFocus))
  3435.         self.inputNameEdit.SetUpdateEvent(self._OnUpdateInputName)
  3436.         self.inputNameBox.SetOnMouseLeftButtonUpEvent(self.inputNameEdit.SetFocus)
  3437.  
  3438.         self.inputNameSuggestion = self.CreateWidget(IkarusShopComboBox, pos = (14, getBottom(self.inputNameBox)+2))
  3439.         self.inputNameSuggestion.SetSelectItemEvent(self._OnSelectSuggestedItemName)
  3440.         self.inputNameSuggestion.ChangeElementImages(largerComboBoxImages)
  3441.         self.inputNameSuggestion.SetViewCount(6)
  3442.         self.inputNameSuggestion.SetItems(["",])
  3443.  
  3444.         self.resetFilterButton = self.CreateWidget(ui.Button, pos = (getRight(self.searchButton) + 3, 42))
  3445.         self.resetFilterButton.SetUpVisual("ikashop/lite/search_shop/reset_filter_button/default.png")
  3446.         self.resetFilterButton.SetDownVisual("ikashop/lite/search_shop/reset_filter_button/default.png")
  3447.         self.resetFilterButton.SetOverVisual("ikashop/lite/search_shop/reset_filter_button/hover.png")
  3448.         self.resetFilterButton.SAFE_SetEvent(self._OnClickResetFilters)
  3449.         self.resetFilterButton.SetToolTipText(locale.IKASHOP_SEARCH_SHOP_RESET_FILTER_BUTTON_TEXT)
  3450.  
  3451.         # item type filter
  3452.         self.itemTypeFilterBox = self.CreateWidget(ui.ExpandedImageBox, pos = (14, 72))
  3453.         self.itemTypeFilterBox.LoadImage("ikashop/lite/search_shop/filter_box.png")
  3454.  
  3455.         self.itemTypeHeader = self.CreateWidget(ui.TextLine, pos = (6, 13), parent = self.itemTypeFilterBox)
  3456.         self.itemTypeHeader.SetText(locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_HEADER)
  3457.  
  3458.         self.itemTypeSelectButton = self.CreateWidget(ui.Button, pos = (85, 8), parent = self.itemTypeFilterBox)
  3459.         self.itemTypeSelectButton.SetUpVisual("ikashop/lite/search_shop/combo_box_button/default.png")
  3460.         self.itemTypeSelectButton.SetDownVisual("ikashop/lite/search_shop/combo_box_button/default.png")
  3461.         self.itemTypeSelectButton.SetOverVisual("ikashop/lite/search_shop/combo_box_button/hover.png")
  3462.         self.itemTypeSelectButton.SAFE_SetEvent(self._OnClickItemTypeSelectButton)
  3463.  
  3464.         self.itemTypeSelectComboBox = self.CreateWidget(IkarusShopComboBox, pos = (14 + 85, 72 + 28))
  3465.         self.itemTypeSelectComboBox.SetItems(self.ITEM_TYPES)
  3466.         self.itemTypeSelectComboBox.SetSelectItemEvent(self._OnSelectItemType)
  3467.  
  3468.         # item subtype filter
  3469.         self.itemSubTypeHeader = self.CreateWidget(ui.TextLine, pos = (6, 39), parent = self.itemTypeFilterBox)
  3470.         self.itemSubTypeHeader.SetText(locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_HEADER)
  3471.  
  3472.         self.itemSubTypeSelectButton = self.CreateWidget(ui.Button, pos = (85, 8+26), parent = self.itemTypeFilterBox)
  3473.         self.itemSubTypeSelectButton.SetUpVisual("ikashop/lite/search_shop/combo_box_button/default.png")
  3474.         self.itemSubTypeSelectButton.SetDownVisual("ikashop/lite/search_shop/combo_box_button/default.png")
  3475.         self.itemSubTypeSelectButton.SetOverVisual("ikashop/lite/search_shop/combo_box_button/hover.png")
  3476.         self.itemSubTypeSelectButton.SAFE_SetEvent(self._OnClickItemSubTypeSelectButton)
  3477.  
  3478.         self.itemSubTypeSelectComboBox = self.CreateWidget(IkarusShopComboBox, pos = (14 + 86, 72 + 8 + 26 + 20))
  3479.         self.itemSubTypeSelectComboBox.SetSelectItemEvent(self._OnSelectItemSubType)
  3480.         self.itemSubTypeSelectComboBox.SetItems([locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,])
  3481.  
  3482.         # item price filter
  3483.         self.itemPriceFilterBox = self.CreateWidget(ui.ExpandedImageBox, pos = (14, getBottom(self.itemTypeFilterBox) + 5))
  3484.         self.itemPriceFilterBox.LoadImage("ikashop/lite/search_shop/filter_box.png")
  3485.  
  3486.         self.itemPriceMinHeader = self.CreateWidget(ui.TextLine, pos = (6, 13), parent = self.itemPriceFilterBox)
  3487.         self.itemPriceMinHeader.SetText(locale.IKASHOP_SEARCH_SHOP_ITEM_PRICE_MIN_HEADER)
  3488.  
  3489.         self.itemPriceMaxHeader = self.CreateWidget(ui.TextLine, pos = (6, 39), parent = self.itemPriceFilterBox)
  3490.         self.itemPriceMaxHeader.SetText(locale.IKASHOP_SEARCH_SHOP_ITEM_PRICE_MAX_HEADER)
  3491.  
  3492.         self.itemPriceMinBox = self.CreateWidget(ui.ImageBox, pos = (64, 8), parent = self.itemPriceFilterBox)
  3493.         self.itemPriceMinBox.LoadImage("ikashop/lite/search_shop/input_box.png")
  3494.  
  3495.         self.itemPriceMaxBox = self.CreateWidget(ui.ImageBox, pos = (64, 8+26), parent = self.itemPriceFilterBox)
  3496.         self.itemPriceMaxBox.LoadImage("ikashop/lite/search_shop/input_box.png")
  3497.  
  3498.         self.itemPriceMinEdit = self.CreateWidget(ui.EditLine, pos = (6, 6), parent = self.itemPriceMinBox)
  3499.         self.itemPriceMinEdit.SetMax(12)
  3500.         self.itemPriceMinEdit.SetEscapeEvent(ui.__mem_func__(self.itemPriceMinEdit.KillFocus))
  3501.         self.itemPriceMinEdit.SetNumberMode()
  3502.         self.itemPriceMinBox.SetOnMouseLeftButtonUpEvent(self.itemPriceMinEdit.SetFocus)
  3503.  
  3504.         self.itemPriceMaxEdit = self.CreateWidget(ui.EditLine, pos = (6, 6), parent = self.itemPriceMaxBox)
  3505.         self.itemPriceMaxEdit.SetMax(12)
  3506.         self.itemPriceMaxEdit.SetEscapeEvent(ui.__mem_func__(self.itemPriceMaxEdit.KillFocus))
  3507.         self.itemPriceMaxEdit.SetNumberMode()
  3508.         self.itemPriceMaxBox.SetOnMouseLeftButtonUpEvent(self.itemPriceMaxEdit.SetFocus)
  3509.  
  3510.         # item level filter
  3511.         self.itemLevelFilterBox = self.CreateWidget(ui.ExpandedImageBox, pos = (14, getBottom(self.itemPriceFilterBox) + 5))
  3512.         self.itemLevelFilterBox.LoadImage("ikashop/lite/search_shop/filter_box.png")
  3513.  
  3514.         self.itemLevelMinHeader = self.CreateWidget(ui.TextLine, pos = (6, 13), parent = self.itemLevelFilterBox)
  3515.         self.itemLevelMinHeader.SetText(locale.IKASHOP_SEARCH_SHOP_ITEM_LEVEL_MIN_HEADER)
  3516.  
  3517.         self.itemLevelMaxHeader = self.CreateWidget(ui.TextLine, pos = (6, 39), parent = self.itemLevelFilterBox)
  3518.         self.itemLevelMaxHeader.SetText(locale.IKASHOP_SEARCH_SHOP_ITEM_LEVEL_MAX_HEADER)
  3519.  
  3520.         self.itemLevelMinBox = self.CreateWidget(ui.ImageBox, pos = (64, 8), parent = self.itemLevelFilterBox)
  3521.         self.itemLevelMinBox.LoadImage("ikashop/lite/search_shop/input_box.png")
  3522.  
  3523.         self.itemLevelMaxBox = self.CreateWidget(ui.ImageBox, pos = (64, 8+26), parent = self.itemLevelFilterBox)
  3524.         self.itemLevelMaxBox.LoadImage("ikashop/lite/search_shop/input_box.png")
  3525.  
  3526.         self.itemLevelMinEdit = self.CreateWidget(ui.EditLine, pos = (6, 6), parent = self.itemLevelMinBox)
  3527.         self.itemLevelMinEdit.SetMax(12)
  3528.         self.itemLevelMinEdit.SetEscapeEvent(ui.__mem_func__(self.itemLevelMinEdit.KillFocus))
  3529.         self.itemLevelMinEdit.SetNumberMode()
  3530.         self.itemLevelMinBox.SetOnMouseLeftButtonUpEvent(self.itemLevelMinEdit.SetFocus)
  3531.  
  3532.         self.itemLevelMaxEdit = self.CreateWidget(ui.EditLine, pos = (6, 6), parent = self.itemLevelMaxBox)
  3533.         self.itemLevelMaxEdit.SetMax(12)
  3534.         self.itemLevelMaxEdit.SetEscapeEvent(ui.__mem_func__(self.itemLevelMaxEdit.KillFocus))
  3535.         self.itemLevelMaxEdit.SetNumberMode()
  3536.         self.itemLevelMaxBox.SetOnMouseLeftButtonUpEvent(self.itemLevelMaxEdit.SetFocus)
  3537.  
  3538.         # item attributes filter
  3539.         self.attributeSettings = GetAttributeSettings()
  3540.         self.attributeBonusToItem = {bonus[0]:index for index, bonus in enumerate(self.attributeSettings)}
  3541.  
  3542.         self.itemAttrsFilterBox = self.CreateWidget(ui.ExpandedImageBox, pos = (14, getBottom(self.itemLevelFilterBox) + 5))
  3543.         self.itemAttrsFilterBox.LoadImage("ikashop/lite/search_shop/filter_box.png")
  3544.         self.itemAttrsFilterBox.SetScale(1.0, 126.0 / self.itemAttrsFilterBox.GetHeight())
  3545.  
  3546.         self.attrSelectButtons = []
  3547.         self.attrComboBoxes = []
  3548.         self.attrValueBoxes = []
  3549.         self.attrValueEdits = []
  3550.  
  3551.         for i in xrange(ikashop.FILTER_ATTRIBUTE_NUM):
  3552.             # select button
  3553.             attrSelectButton = self.CreateWidget(ui.Button, pos = (6, 6 + i*23), parent = self.itemAttrsFilterBox)
  3554.             attrSelectButton.SetUpVisual("ikashop/lite/search_shop/attribute_select_button/default.png")
  3555.             attrSelectButton.SetDownVisual("ikashop/lite/search_shop/attribute_select_button/default.png")
  3556.             attrSelectButton.SetOverVisual("ikashop/lite/search_shop/attribute_select_button/hover.png")
  3557.             attrSelectButton.SAFE_SetEvent(self._OnClickAttributeSelectButton, i)
  3558.             attrSelectButton.SetText("")
  3559.             bx, by = attrSelectButton.ButtonText.GetLocalPosition()
  3560.             attrSelectButton.ButtonText.SetPosition(bx - 10, by)
  3561.             self.attrSelectButtons.append(attrSelectButton)
  3562.  
  3563.             attrComboBox = self.CreateWidget(IkarusShopComboBox, pos = (14 + 6, self.itemAttrsFilterBox.GetLocalPosition()[1] + 5 + i*23 + 20))
  3564.             attrComboBox.SetSelectItemEvent(lambda id, text, _self = proxy(self), _num = i : _self._OnSelectAttributeItem(_num, id, text))
  3565.             attrComboBox.ChangeElementImages(largerComboBoxImages)
  3566.             attrComboBox.SetViewCount(7)
  3567.             attrComboBox.SetItems([text for apply, text in self.attributeSettings])
  3568.             self.attrComboBoxes.append(attrComboBox)
  3569.  
  3570.             attrValueBox = self.CreateWidget(ui.ImageBox, pos = (148, 6 + i*23), parent = self.itemAttrsFilterBox)
  3571.             attrValueBox.LoadImage("ikashop/lite/search_shop/attribute_value_box.png")
  3572.             self.attrValueBoxes.append(attrValueBox)
  3573.  
  3574.             attrValueEdit = self.CreateWidget(ui.EditLine, pos = (9, 6), parent = attrValueBox)
  3575.             attrValueEdit.SetMax(4)
  3576.             attrValueEdit.SetEscapeEvent(ui.__mem_func__(attrValueEdit.KillFocus))
  3577.             attrValueEdit.SetNumberMode()
  3578.             attrValueBox.SetOnMouseLeftButtonUpEvent(attrValueEdit.SetFocus)
  3579.             self.attrValueEdits.append(attrValueEdit)
  3580.  
  3581.         # special filters
  3582.         self.itemSpecialFilterBox = self.CreateWidget(ui.ExpandedImageBox, pos = (14, getBottom(self.itemAttrsFilterBox) + 5))
  3583.         self.itemSpecialFilterBox.LoadImage("ikashop/lite/search_shop/filter_box.png")
  3584.  
  3585.         self.itemAlchemyGradeHeader = self.CreateWidget(ui.TextLine, pos = (6, 13), parent = self.itemSpecialFilterBox)
  3586.         self.itemAlchemyGradeHeader.SetText(locale.IKASHOP_SEARCH_SHOP_ALCHEMY_GRADE_HEADER)
  3587.  
  3588.         self.itemAlchemyGradeSelectButton = self.CreateWidget(ui.Button, pos = (85, 8), parent = self.itemSpecialFilterBox)
  3589.         self.itemAlchemyGradeSelectButton.SetUpVisual("ikashop/lite/search_shop/combo_box_button/default.png")
  3590.         self.itemAlchemyGradeSelectButton.SetDownVisual("ikashop/lite/search_shop/combo_box_button/default.png")
  3591.         self.itemAlchemyGradeSelectButton.SetOverVisual("ikashop/lite/search_shop/combo_box_button/hover.png")
  3592.         self.itemAlchemyGradeSelectButton.SAFE_SetEvent(self._OnClickAlchemyGradeSelectButton)
  3593.  
  3594.         self.itemAlchemyGradeSelectComboBox = self.CreateWidget(IkarusShopComboBox, pos = (14 + 85, getBottom(self.itemAttrsFilterBox) + 5 + 8 + 20))
  3595.         self.itemAlchemyGradeSelectComboBox.SetSelectItemEvent(self._OnSelectAlchemyGradeType)
  3596.         self.itemAlchemyGradeSelectComboBox.SetItems(self.ALCHEMY_GRADES)
  3597.  
  3598.         self.itemSashAbsHeader = self.CreateWidget(ui.TextLine, pos = (6, 39), parent = self.itemSpecialFilterBox)
  3599.         self.itemSashAbsHeader.SetText(locale.IKASHOP_SEARCH_SHOP_SASH_ABSORB_HEADER)
  3600.  
  3601.         self.itemSashAbsSelectButton = self.CreateWidget(ui.Button, pos = (85, 8+26), parent = self.itemSpecialFilterBox)
  3602.         self.itemSashAbsSelectButton.SetUpVisual("ikashop/lite/search_shop/combo_box_button/default.png")
  3603.         self.itemSashAbsSelectButton.SetDownVisual("ikashop/lite/search_shop/combo_box_button/default.png")
  3604.         self.itemSashAbsSelectButton.SetOverVisual("ikashop/lite/search_shop/combo_box_button/hover.png")
  3605.         self.itemSashAbsSelectButton.SAFE_SetEvent(self._OnClickSashGradeSelectButton)
  3606.  
  3607.         self.itemSashAbsSelectComboBox = self.CreateWidget(IkarusShopComboBox, pos = (14 + 86, getBottom(self.itemAttrsFilterBox) + 5 + 8 + 26 + 20))
  3608.         self.itemSashAbsSelectComboBox.SetItems(self.SASH_ABSORBS)
  3609.         self.itemSashAbsSelectComboBox.SetSelectItemEvent(self._OnSelectSashGrade)
  3610.         self.itemSashAbsSelectComboBox.SetViewCount(4)
  3611.  
  3612.         # buttons on the bottom
  3613.         self.auctionListButton = self.CreateWidget(ui.Button, pos = (14, getBottom(self.itemSpecialFilterBox) + 6))
  3614.         self.auctionListButton.SetUpVisual("ikashop/lite/search_shop/auction_list_button/default.png")
  3615.         self.auctionListButton.SetDownVisual("ikashop/lite/search_shop/auction_list_button/default.png")
  3616.         self.auctionListButton.SetOverVisual("ikashop/lite/search_shop/auction_list_button/hover.png")
  3617.         self.auctionListButton.SAFE_SetEvent(self._OnClickAuctionListButton)
  3618.         self.auctionListButton.SetText(locale.IKASHOP_SEARCH_SHOP_AUCTION_LIST_BUTTON_TEXT)
  3619.         tx, ty = self.auctionListButton.ButtonText.GetLocalPosition()
  3620.         self.auctionListButton.ButtonText.SetPosition(tx + 5, ty)
  3621.         self.auctionListButton.ButtonText.SetPackedFontColor(0xFFFFFFFF)
  3622.  
  3623.         hpos = (14 + self.itemSpecialFilterBox.GetWidth() - self.auctionListButton.GetWidth(), getBottom(self.itemSpecialFilterBox) + 6)
  3624.         self.historyButton = self.CreateWidget(ui.Button, pos = hpos)
  3625.         self.historyButton.SetUpVisual("ikashop/lite/search_shop/history_button/default.png")
  3626.         self.historyButton.SetDownVisual("ikashop/lite/search_shop/history_button/default.png")
  3627.         self.historyButton.SetOverVisual("ikashop/lite/search_shop/history_button/hover.png")
  3628.         self.historyButton.SAFE_SetEvent(self._OnClickHistoryButton)
  3629.         self.historyButton.SetText(locale.IKASHOP_SEARCH_SHOP_HISTORY_BUTTON_TEXT)
  3630.         tx, ty = self.historyButton.ButtonText.GetLocalPosition()
  3631.         self.historyButton.ButtonText.SetPosition(tx + 5, ty)
  3632.         self.historyButton.ButtonText.SetPackedFontColor(0xFFFFFFFF)
  3633.  
  3634.         self.resultBox = self.CreateWidget(ui.ExpandedImageBox, pos = (227, 40))
  3635.         self.resultBox.LoadImage("ikashop/lite/search_shop/result_box.png")
  3636.         self.resultBox.SetMouseWheelEvent(self._OnScrollMouseWheelResultItems)
  3637.         hs = float(self.resultBox.GetWidth() - 10) / self.resultBox.GetWidth()
  3638.         vs = 469.0 / self.resultBox.GetHeight()
  3639.         self.resultBox.SetScale(hs, vs)
  3640.  
  3641.         # making result items
  3642.         self.resultItems = []
  3643.         for i in xrange(self.RESULT_ITEM_VIEW_COUNT):
  3644.             item = self.CreateWidget(IkarusSearchShopItem, pos = (5, 4 + 116*i), parent = self.resultBox)
  3645.             item.SetSearchShopBoard(self)
  3646.             self.resultItems.append(item)
  3647.  
  3648.         # making result item scrollbar
  3649.         self.resultItemScrollBar = self.CreateWidget(ui.ScrollBar, pos = (self.resultBox.GetWidth() - 19, 3), parent = self.resultBox)
  3650.         self.resultItemScrollBar.SetScrollEvent(self._OnScrollResultItems)
  3651.         self.resultItemScrollBar.SetScrollBarSize(self.resultBox.GetHeight() - 6)
  3652.  
  3653.         # making automatically close the combo box
  3654.         # and setting them on top, with 0th element selected
  3655.         self.comboBoxes = []
  3656.         for value in vars(self).values() + self.attrComboBoxes:
  3657.             if isinstance(value, IkarusShopComboBox):
  3658.                 value.AddFlag("float")
  3659.                 value.SetTop()
  3660.                 value.SelectItem(0)
  3661.                 self._RegisterDialog(value)
  3662.                 self.comboBoxes.append(proxy(value))
  3663.  
  3664.         if app.EXTEND_IKASHOP_ULTIMATE:
  3665.             self.sortByPriceCheckbox = self.CreateWidget(IkashopCheckBox)
  3666.             self.sortByPriceCheckbox.SetImages("ikashop/ultimate/sort_checkbox/base.png", "ikashop/ultimate/sort_checkbox/checked.png")
  3667.             self.sortByPriceCheckbox.SetText(locale.IKASHOP_ULTIMATE_SORT_BY_PRICE_CHECKBOX)
  3668.             self.sortByPriceCheckbox.SetPosition(self.GetWidth() - 40 - self.sortByPriceCheckbox.GetWidth(), 7)
  3669.             self.sortByPriceCheckbox.SetCheckEvent(self._OnCheckSortByPriceCheckBox)
  3670.  
  3671.     def _ExtractFilterTypes(self):
  3672.         return \
  3673.             self.itemTypeSelectComboBox.GetSelectedItem(),\
  3674.             self.itemSubTypeSelectComboBox.GetSelectedItem()
  3675.  
  3676.     def _ExtractFilterPrice(self):
  3677.         minPrice = self.itemPriceMinEdit.GetText()
  3678.         minPrice = minPrice.lower().replace("k", "000")
  3679.         minPrice = long(minPrice) if minPrice and minPrice.isdigit() else long(0)
  3680.         maxPrice = self.itemPriceMaxEdit.GetText()
  3681.         maxPrice = maxPrice.lower().replace("k", "000")
  3682.         maxPrice = long(maxPrice) if maxPrice and maxPrice.isdigit() else long(0)
  3683.         return minPrice, maxPrice
  3684.  
  3685.     def _ExtractFilterLevel(self):
  3686.         minLevel = self.itemLevelMinEdit.GetText()
  3687.         minLevel = int(minLevel) if minLevel and minLevel.isdigit() else 0
  3688.         maxLevel = self.itemLevelMaxEdit.GetText()
  3689.         maxLevel = int(maxLevel) if maxLevel and maxLevel.isdigit() else 0
  3690.         return minLevel, maxLevel
  3691.  
  3692.     def _ExtractFilterAttributes(self):
  3693.         def extractOne(combo, edit):
  3694.             if combo.GetSelectedItem() == 0:
  3695.                 return 0,0
  3696.             bonus = self.attributeSettings[combo.GetSelectedItem()][0]
  3697.             value = edit.GetText()
  3698.             value = int(value) if value and value.isdigit() else 0
  3699.             return bonus, value
  3700.  
  3701.         ret = tuple(extractOne(self.attrComboBoxes[i], self.attrValueEdits[i]) for i in xrange(ikashop.FILTER_ATTRIBUTE_NUM))
  3702.         return ret
  3703.  
  3704.     def _ExtractFilterSpecial(self):
  3705.         sashAbs = self.itemSashAbsSelectComboBox.GetSelectedItem()
  3706.         dssGrade = self.itemAlchemyGradeSelectComboBox.GetSelectedItem()
  3707.         return sashAbs, dssGrade
  3708.  
  3709.     def _ExtractFilterSettings(self):
  3710.         # getting values
  3711.         inputName = self.inputNameEdit.GetText()
  3712.         type, subtype = self._ExtractFilterTypes()
  3713.         prices = self._ExtractFilterPrice()
  3714.         levels = self._ExtractFilterLevel()
  3715.         attributes = self._ExtractFilterAttributes()
  3716.         specials = self._ExtractFilterSpecial()
  3717.         # making arg tuple
  3718.         args = (inputName, type, subtype, prices, levels, attributes, specials)
  3719.         if not IsUsingFilter(args):
  3720.             return None
  3721.         return args
  3722.  
  3723.     def _OnClickSearchButton(self):
  3724.         self.inputNameEdit.KillFocus()
  3725.         filters = self._ExtractFilterSettings()
  3726.         if filters is None:
  3727.             self.OpenPopupDialog(locale.IKASHOP_SEARCH_SHOP_NO_FILTER_USED)
  3728.             return
  3729.         ikashop.SendFilterRequest(*filters)
  3730.  
  3731.     def _OnClickAuctionListButton(self):
  3732.         self.auctionListBoard.Toggle()
  3733.  
  3734.     def _OnClickItemTypeSelectButton(self):
  3735.         for combo in self.comboBoxes:
  3736.             if not combo.IsMe(self.itemTypeSelectComboBox) and combo.IsShow():
  3737.                 combo.Close()
  3738.         self.itemTypeSelectComboBox.Toggle()
  3739.  
  3740.     def _OnClickItemSubTypeSelectButton(self):
  3741.         for combo in self.comboBoxes:
  3742.             if not combo.IsMe(self.itemSubTypeSelectComboBox) and combo.IsShow():
  3743.                 combo.Close()
  3744.         self.itemSubTypeSelectComboBox.Toggle()
  3745.  
  3746.     def _OnSelectItemType(self, index, text):
  3747.         self.itemTypeSelectButton.SetText(text)
  3748.         self.itemSubTypeSelectComboBox.SetItems(self.SUB_TYPES[index])
  3749.         self.itemSubTypeSelectComboBox.SelectItem(0)
  3750.  
  3751.     def _OnSelectItemSubType(self, index, text):
  3752.         self.itemSubTypeSelectButton.SetText(text)
  3753.  
  3754.     def _OnSelectAttributeItem(self, num, index, text):
  3755.         usingButton = self.attrSelectButtons[num]
  3756.         for i in xrange(100):
  3757.             btext = text[:-i] if i > 0 else text
  3758.             if i != 0:
  3759.                 btext += ".."
  3760.             usingButton.SetText(btext)
  3761.             if usingButton.ButtonText.GetTextSize()[0] + 35 < usingButton.GetWidth():
  3762.                 break
  3763.  
  3764.     def _OnClickAttributeSelectButton(self, num):
  3765.         usingComboBox = self.attrComboBoxes[num]
  3766.         for combo in self.comboBoxes:
  3767.             if not combo.IsMe(usingComboBox) and combo.IsShow():
  3768.                 combo.Close()
  3769.         usingComboBox.Toggle()
  3770.  
  3771.     def _OnClickSashGradeSelectButton(self):
  3772.         for combo in self.comboBoxes:
  3773.             if not combo.IsMe(self.itemSashAbsSelectComboBox) and combo.IsShow():
  3774.                 combo.Close()
  3775.         self.itemSashAbsSelectComboBox.Toggle()
  3776.  
  3777.     def _OnSelectSashGrade(self, index, text):
  3778.         self.itemSashAbsSelectButton.SetText(text)
  3779.  
  3780.     def _OnClickAlchemyGradeSelectButton(self):
  3781.         for combo in self.comboBoxes:
  3782.             if not combo.IsMe(self.itemAlchemyGradeSelectComboBox) and combo.IsShow():
  3783.                 combo.Close()
  3784.         self.itemAlchemyGradeSelectComboBox.Toggle()
  3785.  
  3786.     def _OnSelectAlchemyGradeType(self, index, text):
  3787.         self.itemAlchemyGradeSelectButton.SetText(text)
  3788.  
  3789.     def _OnUpdateInputName(self, isFocus):
  3790.         if not isFocus or len(self.inputNameEdit.GetText()) < 3:
  3791.             self.inputNameSuggestion.Close()
  3792.             return
  3793.  
  3794.         text = self.inputNameEdit.GetText().lower()
  3795.         most_relevant = []
  3796.         less_relevant = []
  3797.  
  3798.         for name in self.itemNames:
  3799.             if name.startswith(text):
  3800.                 most_relevant.append(name)
  3801.             elif text in name:
  3802.                 less_relevant.append(name)
  3803.  
  3804.         most_relevant = sorted(most_relevant)
  3805.         less_relevant = sorted(less_relevant)
  3806.         suggestions = most_relevant + less_relevant
  3807.  
  3808.         self.inputNameSuggestion.SetItems(suggestions)
  3809.         if suggestions:
  3810.             self.inputNameSuggestion.Open()
  3811.         else:
  3812.             self.inputNameSuggestion.Close()
  3813.  
  3814.     def _OnSelectSuggestedItemName(self, index, name):
  3815.         self.inputNameEdit.SetText(name)
  3816.         self.inputNameEdit.KillFocus()
  3817.  
  3818.     def _OnClickResetFilters(self):
  3819.         # selecting 0 item on each combo box
  3820.         for combo in self.comboBoxes:
  3821.             if not combo.IsMe(self.inputNameSuggestion):
  3822.                 combo.SelectItem(0)
  3823.         # resetting edit line values
  3824.         self.itemPriceMinEdit.SetText("")
  3825.         self.itemPriceMaxEdit.SetText("")
  3826.         self.itemLevelMinEdit.SetText("")
  3827.         self.itemLevelMaxEdit.SetText("")
  3828.         self.inputNameEdit.SetText("")
  3829.         for edit in self.attrValueEdits:
  3830.             edit.SetText("")
  3831.  
  3832.     def _OnClickHistoryButton(self):
  3833.         self.historyFilterBoard.Toggle()
  3834.  
  3835.     def _OnScrollResultItems(self):
  3836.         self._RefreshResultItem()
  3837.  
  3838.     def _OnScrollMouseWheelResultItems(self, delta):
  3839.         self.resultItemScrollBar.OnDown() if delta < 0\
  3840.             else self.resultItemScrollBar.OnUp()
  3841.         return True
  3842.  
  3843.     def _RefreshResultItem(self):
  3844.         # calculating sindex
  3845.         pos = self.resultItemScrollBar.GetPos() if self.resultItemScrollBar.IsShow() else 0.0
  3846.         diff = max(len(self.items) - self.RESULT_ITEM_VIEW_COUNT, 0)
  3847.         sindex = int(diff * pos)
  3848.         eindex = sindex + min(len(self.items), self.RESULT_ITEM_VIEW_COUNT)
  3849.  
  3850.         # hiding all views
  3851.         for view in self.resultItems:
  3852.             view.Hide()
  3853.  
  3854.         # setting up and showing only used views
  3855.         for i in xrange(sindex, eindex):
  3856.             ri = i - sindex
  3857.             data = self.items[i]
  3858.             view = self.resultItems[ri]
  3859.             view.Setup(data)
  3860.             view.Show()
  3861.             view.SetAvailable() if data.get('deleted', 0) == 0 \
  3862.                 else view.SetNotAvailable()
  3863.  
  3864.         # updating scrollbar's middlebar length
  3865.         self.resultItemScrollBar.UpdateScrollbarLenght(4 + 116*len(self.items))
  3866.  
  3867.     def _UpdateScrollbarState(self):
  3868.         self.resultItemScrollBar.Show() if self.RESULT_ITEM_VIEW_COUNT < len(self.items)\
  3869.             else self.resultItemScrollBar.Hide()
  3870.         self.resultItemScrollBar.SetPos(0)
  3871.  
  3872.     def _ApplySearchFilterSettings(self, settings):
  3873.         # setting up name
  3874.         self.inputNameEdit.SetText(settings['name'])
  3875.         # setting up prices
  3876.         self.itemPriceMaxEdit.SetText(str(settings['price_max']) if settings['price_max'] != 0 else "")
  3877.         self.itemPriceMinEdit.SetText(str(settings['price_min']) if settings['price_min'] != 0 else "")
  3878.         # setting up levels
  3879.         self.itemLevelMaxEdit.SetText(str(settings['level_max']) if settings['level_max'] != 0 else "")
  3880.         self.itemLevelMinEdit.SetText(str(settings['level_min']) if settings['level_min'] != 0 else "")
  3881.         # setting up comboboxes
  3882.         self.itemTypeSelectComboBox.SelectItem(settings['type'])
  3883.         self.itemSubTypeSelectComboBox.SelectItem(settings['subtype'])
  3884.         self.itemSashAbsSelectComboBox.SelectItem(settings['sash'])
  3885.         self.itemAlchemyGradeSelectComboBox.SelectItem(settings['alchemy'])
  3886.         # setting up attributes
  3887.         for attrComboBox, attrEdit, sett in zip(self.attrComboBoxes, self.attrValueEdits, settings['attrs']):
  3888.             type, value = sett
  3889.             attrEdit.SetText(str(value) if value != 0 else "")
  3890.             attrComboBox.SelectItem(self.attributeBonusToItem[type])
  3891.  
  3892.     def HistoryRedoSearch(self, settings):
  3893.         self._ApplySearchFilterSettings(settings)
  3894.         self._OnClickSearchButton()
  3895.  
  3896.     def Open(self):
  3897.         now = app.GetTime()
  3898.         if self.lastOpen == 0 or now - self.lastOpen > 60 or len(self.items) == 0:
  3899.             ikashop.SendRandomSearchFillRequest()
  3900.             self._IsRandomFilling = True
  3901.             return
  3902.  
  3903.         self.lastOpen = now
  3904.         self.Show()
  3905.         self.SetTop()
  3906.  
  3907.     def Close(self):
  3908.         self.Hide()
  3909.         self.inputNameEdit.KillFocus()
  3910.  
  3911.     def DeleteSearchResultItem(self, id):
  3912.         for item in self.items:
  3913.             if item['id'] == id:
  3914.                 item['deleted'] = 1
  3915.  
  3916.         for view in self.resultItems:
  3917.             if view.GetId() == id:
  3918.                 view.SetNotAvailable()
  3919.  
  3920.     if app.EXTEND_IKASHOP_ULTIMATE:
  3921.         def RequestOpenSellerShop(self, owner, vnum, count, price):
  3922.             if not self.sortByPriceCheckbox.IsEnabled():
  3923.                 self.OpenPopupDialog(locale.IKASHOP_ULTIMATE_SORT_BY_PRICE_PREMIUM_FEATURE)
  3924.                 return
  3925.             self.markItemInfo = vnum, count, price
  3926.             ikashop.SendOpenShop(owner)
  3927.  
  3928.         def _OnSortByPrice(self):
  3929.             priceGetter = lambda item : item['price'] + item.get('cheque', 0) * YANG_PER_CHEQUE
  3930.             self.items = sorted(self.items, key = priceGetter) if self.sortByPriceCheckbox.IsChecked() \
  3931.                 else self.shuffleItem
  3932.             self._RefreshResultItem()
  3933.  
  3934.         def _OnCheckSortByPriceCheckBox(self):
  3935.             if not self.sortByPriceCheckbox.IsEnabled():
  3936.                 self.OpenPopupDialog(locale.IKASHOP_ULTIMATE_SORT_BY_PRICE_PREMIUM_FEATURE)
  3937.                 return
  3938.             self._OnSortByPrice()
  3939.  
  3940.         def ActiveSortByPriceFeature(self):
  3941.             self.sortByPriceCheckbox.Enable()
  3942.             self.sortByPriceCheckbox.Check(callback=0)
  3943.  
  3944.         def DeactiveSortByPriceFeature(self):
  3945.             self.sortByPriceCheckbox.Disable()
  3946.             self.sortByPriceCheckbox.Uncheck(callback=1)
  3947.  
  3948.     # BINARY CALLS
  3949.     def SetSearchResultItems(self, items):
  3950.         shuffle(items)
  3951.         self.items = items
  3952.         if app.EXTEND_IKASHOP_ULTIMATE:
  3953.             self.shuffleItem = items
  3954.         self._UpdateScrollbarState()
  3955.         if self.IsShow() == False:
  3956.             self.Show()
  3957.             self.SetTop()
  3958.             self.lastOpen = app.GetTime()
  3959.         if not self._IsRandomFilling:
  3960.             self.RegisterHistoryFilter()
  3961.         self._IsRandomFilling = False
  3962.  
  3963.     def OpenShopGuest(self, data):
  3964.         self.shopGuestBoard.Open(data)
  3965.         if self.markItemInfo:
  3966.             vnum, count, price = self.markItemInfo
  3967.             self.shopGuestBoard.MarkItems(vnum, count, price)
  3968.  
  3969.     def ShopExpiredGuesting(self, id):
  3970.         self.shopGuestBoard.CheckExpiring(id)
  3971.  
  3972.     def ShopGuestRemoveItem(self, itemid):
  3973.         self.shopGuestBoard.ShopGuestRemoveItem(itemid)
  3974.  
  3975.     def ShopGuestEditItem(self, itemid, price):
  3976.         self.shopGuestBoard.EditItem(itemid, price)
  3977.  
  3978.     def OpenAuctionGuest(self, data):
  3979.         self.auctionGuestBoard.Open(data)
  3980.  
  3981.     def SetAuctionList(self, auctions):
  3982.         self.auctionListBoard.SetAuctions(auctions)
  3983.  
  3984.     def RegisterHistoryFilter(self):
  3985.         filter = self._ExtractFilterSettings()
  3986.         ikashop.RegisterFilterHistory(len(self.items), *filter)
  3987.         self.historyFilterBoard.SetFilters(ikashop.GetFilterHistory())
  3988.  
  3989.     if app.EXTEND_IKASHOP_PRO:
  3990.         def SetOpenWhisper(self, event):
  3991.             self.openWhisperEvent = event
  3992.  
  3993.         def OpenWhisper(self, name):
  3994.             self.openWhisperEvent(name)
  3995.  
  3996. if app.EXTEND_IKASHOP_ULTIMATE:
  3997.     class IkarusShopSkinListView(IkarusShopWindow):
  3998.         def __init__(self):
  3999.             super(IkarusShopSkinListView, self).__init__()
  4000.             self._LoadIkarusShopSkinListView()
  4001.  
  4002.         def _LoadIkarusShopSkinListView(self):
  4003.             self.button = self.CreateWidget(ui.Button)
  4004.             self.button.SetUpVisual("ikashop/ultimate/skin_select_button/default.png")
  4005.             self.button.SetOverVisual("ikashop/ultimate/skin_select_button/hover.png")
  4006.             self.button.SetDownVisual("ikashop/ultimate/skin_select_button/default.png")
  4007.             self.button.SetText("")
  4008.             self.button.ButtonText.SetPackedFontColor(0xFFFFFFFF)
  4009.             self.button.ButtonText.SetHorizontalAlignLeft()
  4010.             self.button.ButtonText.SetPosition(20, self.button.GetHeight()/2)
  4011.             self.SetSize(self.button.GetWidth(), self.button.GetHeight())
  4012.  
  4013.         def Setup(self, data):
  4014.             index, name = data
  4015.             self.button.SetText(name)
  4016.             self.index = index
  4017.  
  4018.         def SetOnClick(self, event):
  4019.             self.button.SAFE_SetEvent(event, proxy(self))
  4020.  
  4021.  
  4022.     class IkarusShopSkinBoard(IkarusShopListBoard):
  4023.  
  4024.         SKIN_VIEW_COUNT = 6
  4025.         SHOP_SKIN_COUNT = 7
  4026.  
  4027.         def __init__(self):
  4028.             self.selected = None
  4029.             super(IkarusShopSkinBoard, self).__init__()
  4030.             ikashop.SetShopSkinBoard(self)
  4031.             self._SettingUpBoard()
  4032.             self._LoadIkarusShopSkinBoard()
  4033.  
  4034.         def _SettingUpBoard(self):
  4035.             # setting list board
  4036.             self.SetSize(500, 260)
  4037.             super(IkarusShopSkinBoard, self)._SettingUpBoard()
  4038.             self.SetTitleName(locale.IKASHOP_ULTIMATE_SHOP_SKIN_BOARD_TITLE)
  4039.  
  4040.         def Destroy(self):
  4041.             ikashop.SetShopSkinBoard(None)
  4042.             super(IkarusShopSkinBoard, self).Destroy()
  4043.  
  4044.         def _LoadIkarusShopSkinBoard(self):
  4045.             # simulating smaller size to reduce list board size only
  4046.             ui.Window.SetSize(self, 500, 220)
  4047.             super(IkarusShopSkinBoard, self)._LoadIkarusShopListBoard()
  4048.             ui.Window.SetSize(self, 500, 260)
  4049.  
  4050.             self._MakeListElements(IkarusShopSkinListView, self.SKIN_VIEW_COUNT)
  4051.             for view in self.views:
  4052.                 view.SetPosition(196, view.GetLocalPosition()[1])
  4053.                 view.SetOnClick(self._OnClickView)
  4054.  
  4055.             self.skinImage = self.CreateWidget(ui.ImageBox, x = 10, y = 37)
  4056.  
  4057.             self.acceptButton = self.CreateWidget(ui.Button, pos = (346 - 65 - 5, 225))
  4058.             self.acceptButton.SetUpVisual("ikashop/lite/search_shop/buy_button/default.png")
  4059.             self.acceptButton.SetDownVisual("ikashop/lite/search_shop/buy_button/default.png")
  4060.             self.acceptButton.SetOverVisual("ikashop/lite/search_shop/buy_button/hover.png")
  4061.             self.acceptButton.SAFE_SetEvent(self._OnClickAcceptButton)
  4062.             self.acceptButton.SetText(locale.IKASHOP_OFFER_LIST_ACCEPT_OFFER_BUTTON_TEXT)
  4063.  
  4064.             self.cancelButton = self.CreateWidget(ui.Button, pos = (346 + 4 + self.acceptButton.GetWidth() - 65 + 5, 225))
  4065.             self.cancelButton.SetUpVisual("ikashop/lite/search_shop/offer_button/default.png")
  4066.             self.cancelButton.SetDownVisual("ikashop/lite/search_shop/offer_button/default.png")
  4067.             self.cancelButton.SetOverVisual("ikashop/lite/search_shop/offer_button/hover.png")
  4068.             self.cancelButton.SAFE_SetEvent(self._OnClickCancelButton)
  4069.             self.cancelButton.SetText(locale.IKASHOP_OFFER_LIST_CANCEL_OFFER_BUTTON_TEXT)
  4070.  
  4071.         def Open(self):
  4072.             images = ["ikashop/ultimate/decoration/{}.png".format(i+1) for i in xrange(self.SHOP_SKIN_COUNT)]
  4073.             names = [locale.IKASHOP_ULTIMATE_SHOP_SKIN_NAME.format(i+1) for i in xrange(self.SHOP_SKIN_COUNT)]
  4074.             self.data = [{'name' : name, 'image' : image} for name, image in zip(names,images)]
  4075.  
  4076.             self.Show()
  4077.             self.SetTop()
  4078.             self.SetElements([(index, name) for index, name in enumerate(names)])
  4079.             self._SelectElement(0)
  4080.             self.elementScrollbar.SetPos(0)
  4081.  
  4082.         def Close(self):
  4083.             self.Hide()
  4084.  
  4085.         def _OnClickView(self, view):
  4086.             self._SelectElement(view.index)
  4087.             self._RefreshElements()
  4088.  
  4089.         def _SelectElement(self, index):
  4090.             image = self.data[index]['image']
  4091.             name = "|cFFFFFF99|h"+self.data[index]['name']+"|r"
  4092.  
  4093.             if self.selected != None:
  4094.                 self.elements[self.selected] = (self.selected, self.data[self.selected]['name'])
  4095.  
  4096.             self.skinImage.LoadImage(image)
  4097.             self.elements[index] = (index,name)
  4098.             self.selected = index
  4099.  
  4100.         def _OnClickAcceptButton(self):
  4101.             message = locale.IKASHOP_ULTIMATE_SHOP_SKIN_USAGE_QUESTION
  4102.             self.OpenQuestionDialog(message, self._OnAcceptSkinUsageQuestion)
  4103.  
  4104.         def _OnClickCancelButton(self):
  4105.             self.Close()
  4106.  
  4107.         def _OnAcceptSkinUsageQuestion(self):
  4108.             self.questionDialog.Hide()
  4109.             self.Close()
  4110.             ikashop.SendShopDecorationUse(self.selected+1)
Add Comment
Please, Sign In to add comment