4110 lines
148 KiB
Python
4110 lines
148 KiB
Python
# cpython modules
|
|
import app
|
|
import player
|
|
import item
|
|
import net
|
|
import dbg
|
|
import wndMgr
|
|
import ikashop
|
|
import chr
|
|
|
|
# m2 python modules
|
|
import localeInfo as locale
|
|
import mouseModule as mouse
|
|
import ui
|
|
import uicommon
|
|
import uitooltip
|
|
|
|
# python modules
|
|
import datetime
|
|
from _weakref import proxy
|
|
from random import shuffle
|
|
|
|
AUCTION_MIN_RAISE_PERCENTAGE = 10
|
|
RESTORE_DURATION_COST = 1000000
|
|
MOVE_SHOP_ENTITY_COST = 100000
|
|
SLOT_SIZE = 32
|
|
MIN_OFFER_PCT = 30 # private offer min % of selling price
|
|
YANG_PER_CHEQUE = 100000000
|
|
|
|
ENABLE_DEFAULT_UI_BOARD = 1
|
|
ENABLE_CHEQUE_SYSTEM = getattr(app, "ENABLE_CHEQUE_SYSTEM", 0)
|
|
|
|
def debug(fmt, *args):
|
|
if args:
|
|
fmt = fmt.format(*args)
|
|
dbg.Tracen(fmt)
|
|
|
|
def debugStack():
|
|
import traceback
|
|
s = traceback.format_stack()
|
|
for line in s[:-1]:
|
|
debug(line)
|
|
|
|
def RomeNumber(num):
|
|
nums = {
|
|
1 : "I", 2 : "II", 3 : "III",
|
|
4 : "IV", 5 : "V", 6 : "VI",
|
|
7 : "VII", 8 : "VIII", 9 : "IX",
|
|
}
|
|
return nums.get(num, "X")
|
|
|
|
def DatetimeFormat(timestamp):
|
|
try:
|
|
# make datetime object
|
|
dts = datetime.datetime.fromtimestamp(timestamp)
|
|
# make today datetime object
|
|
dtn = datetime.datetime.now()
|
|
# checking for today
|
|
if dts.date() == dtn.date():
|
|
return locale.IKASHOP_DATETIME_TODAY.format(dts.hour, dts.minute)
|
|
# checking for yesterday
|
|
dty = dtn - datetime.timedelta(days=1)
|
|
if dty.date() == dts.date():
|
|
return locale.IKASHOP_DATETIME_YESTERDAY.format(dts.hour, dts.minute)
|
|
# checking for tomorrow
|
|
dty = dtn + datetime.timedelta(days=1)
|
|
if dty.date() == dts.date():
|
|
return locale.IKASHOP_DATETIME_TOMORROW.format(dts.hour, dts.minute)
|
|
# formatting dd/mm/yy hh:mm
|
|
return "{:02d}/{:02d}/{:02d} {:02d}:{:02d}".format(
|
|
dts.day, dts.month, dts.year%100, dts.hour, dts.minute)
|
|
except Exception as e:
|
|
dbg.TraceError("{}: {}".format(e, timestamp))
|
|
|
|
def GetScreenSize():
|
|
return wndMgr.GetScreenWidth(), wndMgr.GetScreenHeight()
|
|
|
|
class ProxyPrototype(object):
|
|
pass
|
|
|
|
def IsProxy(obj):
|
|
if not hasattr(IsProxy, "test"):
|
|
fakeInstance = ProxyPrototype()
|
|
IsProxy.test = proxy(fakeInstance)
|
|
return type(obj) == type(IsProxy.test)
|
|
|
|
def SelfDestroyObject(instance):
|
|
def DestroyValue(value):
|
|
if IsProxy(value):
|
|
return True
|
|
if isinstance(value, ui.Window):
|
|
if isinstance(value, IkarusShopWindow):
|
|
value.Destroy()
|
|
else:
|
|
SelfDestroyObject(value)
|
|
return True
|
|
elif type(value) in (list, tuple, dict, set):
|
|
values = value if type(value) != dict else value.values()
|
|
ret = [DestroyValue(val) for val in values]
|
|
return any(ret)
|
|
elif callable(value) and hasattr(value, '__self__'):
|
|
return True
|
|
return False
|
|
|
|
def MakeEmptyValue(value):
|
|
if type(value) in (list, tuple, dict, set):
|
|
return type(value)()
|
|
return None
|
|
|
|
# skipping all non-window instances
|
|
if not isinstance(instance, ui.Window):
|
|
return
|
|
|
|
# skipping all instances already destroyed
|
|
if getattr(instance, "_SelfDestroyed", False):
|
|
return
|
|
|
|
# desroying the instance
|
|
instance._SelfDestroyed = True
|
|
for name, value in vars(instance).items():
|
|
if value and DestroyValue(value):
|
|
setattr(instance, name, MakeEmptyValue(value))
|
|
|
|
def IsPressingCTRL():
|
|
return app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL)
|
|
|
|
def IsPressingSHIFT():
|
|
return app.IsPressed(app.DIK_LSHIFT) or app.IsPressed(app.DIK_RSHIFT)
|
|
|
|
def GetInventoryItemHash(win, pos):
|
|
vnum = player.GetItemIndex(win, pos)
|
|
count = player.GetItemCount(win, pos)
|
|
sockets = tuple(player.GetItemMetinSocket(win, pos, i) for i in xrange(player.METIN_SOCKET_MAX_NUM))
|
|
attrs = tuple(player.GetItemAttribute(win, pos, i) for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM))
|
|
return ikashop.GetItemHash(vnum, count, sockets, attrs)
|
|
|
|
def GetAttributeSettings():
|
|
def NoFormat(str):
|
|
removingStrings = ["%", "0", "+", ":"]
|
|
for value in removingStrings:
|
|
str = str.replace(value, "")
|
|
return str.strip()
|
|
|
|
values = []
|
|
attributeDict = uitooltip.ItemToolTip.AFFECT_DICT
|
|
for apply, text in attributeDict.items():
|
|
if not isinstance(text, str):
|
|
text = text(0)
|
|
values.append((apply, NoFormat(text)))
|
|
values.sort(key = lambda t : t[1])
|
|
values = [(0, locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT),] + values
|
|
return values
|
|
|
|
def IsUsingFilter(filters):
|
|
for filter in filters:
|
|
if isinstance(filter, tuple):
|
|
if IsUsingFilter(filter):
|
|
return True
|
|
elif filter:
|
|
return True
|
|
return False
|
|
|
|
def ExtractInputPrice(dialog):
|
|
if ENABLE_CHEQUE_SYSTEM:
|
|
cheque = dialog.GetCheque()
|
|
cheque = cheque.lower().replace("k", "000")
|
|
cheque = int(cheque) if cheque and cheque.isdigit() else 0
|
|
|
|
# extracting value
|
|
value = dialog.GetText()
|
|
value = value.lower().replace("k", "000")
|
|
value = long(value) if value and value.isdigit() else 0
|
|
|
|
if ENABLE_CHEQUE_SYSTEM:
|
|
if cheque == 0 and value == 0:
|
|
return False, None
|
|
price = value, cheque
|
|
else:
|
|
if value == 0:
|
|
return False, None
|
|
price = value,
|
|
return True, price
|
|
|
|
class IkarusShopWindow(ui.Window):
|
|
|
|
HALIGN_SETTER = {
|
|
"center" : ui.Window.SetWindowHorizontalAlignCenter,
|
|
"right" : ui.Window.SetWindowHorizontalAlignRight,
|
|
}
|
|
|
|
VALIGN_SETTER = {
|
|
"center" : ui.Window.SetWindowVerticalAlignCenter,
|
|
"bottom" : ui.Window.SetWindowVerticalAlignBottom,
|
|
}
|
|
|
|
def _ApplyWidgetAlignments(self, child, halign, valign):
|
|
if halign in self.HALIGN_SETTER:
|
|
self.HALIGN_SETTER[halign](child)
|
|
if valign in self.VALIGN_SETTER:
|
|
self.VALIGN_SETTER(child)
|
|
|
|
def _RegisterDialog(self, dialog):
|
|
if not hasattr(self, "_dialogs"):
|
|
self._dialogs = []
|
|
self._dialogs.append(dialog)
|
|
|
|
def SetTop(self):
|
|
super(IkarusShopWindow, self).SetTop()
|
|
if hasattr(self, "_dialogs"):
|
|
for dialog in self._dialogs:
|
|
dialog.SetTop()
|
|
|
|
def Hide(self):
|
|
super(IkarusShopWindow, self).Hide()
|
|
if hasattr(self, "_dialogs"):
|
|
for window in self._dialogs:
|
|
window.Hide()
|
|
|
|
def CreateWidget(self, type, x = 0, y = 0, show = True, pos = None, size = None, parent = None, halign = None, valign = None):
|
|
child = type()
|
|
child.SetParent(parent if parent else self)
|
|
if show:
|
|
child.Show()
|
|
if size:
|
|
child.SetSize(*size)
|
|
self._ApplyWidgetAlignments(child, halign, valign)
|
|
if pos:
|
|
x,y = pos
|
|
child.SetPosition(x,y)
|
|
return child
|
|
|
|
def Destroy(self):
|
|
super(IkarusShopWindow, self).Destroy()
|
|
# cleaning shitty undestroyable widgets
|
|
if hasattr(self, "questionDialog"):
|
|
SelfDestroyObject(self.questionDialog)
|
|
del self.questionDialog
|
|
if hasattr(self, "popupDialog"):
|
|
SelfDestroyObject(self.popupDialog)
|
|
del self.popupDialog
|
|
if hasattr(self, "moneyInputDialog"):
|
|
SelfDestroyObject(self.moneyInputDialog)
|
|
del self.moneyInputDialog
|
|
if hasattr(self, "itemToolTip"):
|
|
SelfDestroyObject(self.itemToolTip)
|
|
del self.itemToolTip
|
|
# cleaning itself
|
|
SelfDestroyObject(self)
|
|
|
|
def OpenQuestionDialog(self, question, acceptEvent, denyEvent = None):
|
|
if getattr(self, "questionDialog", None) == None:
|
|
self.questionDialog = uicommon.QuestionDialog()
|
|
self.questionDialog.SetAcceptText(locale.IKASHOP_QUESTION_DIALOG_CONTINUE_TEXT)
|
|
self.questionDialog.SetCancelText(locale.IKASHOP_QUESTION_DIALOG_CANCEL_TEXT)
|
|
self._RegisterDialog(self.questionDialog)
|
|
self.questionDialog.SetText(question)
|
|
self.questionDialog.SetWidth(self.questionDialog.textLine.GetTextSize()[0] + 40)
|
|
self.questionDialog.SetAcceptEvent(acceptEvent)
|
|
self.questionDialog.SetCancelEvent(denyEvent if denyEvent else self.questionDialog.Hide)
|
|
self.questionDialog.Open()
|
|
|
|
def OpenPopupDialog(self, message, seconds = 6):
|
|
if getattr(self, "popupDialog", None) == None:
|
|
self.popupDialog = uicommon.PopupDialog()
|
|
self._RegisterDialog(self.popupDialog)
|
|
self.popupDialog.SetText(message)
|
|
self.popupDialog.SetWidth(self.popupDialog.message.GetTextSize()[0] + 40)
|
|
self.popupDialog.Open()
|
|
self.popupDialog.SetAutoClose(seconds)
|
|
|
|
def OpenMoneyInputDialog(self, acceptEvent, denyEvent = None, value = 0, cheque = 0, nocheque = 0):
|
|
# checking for gold overflow
|
|
if ENABLE_CHEQUE_SYSTEM:
|
|
if not nocheque:
|
|
yangmax = 2**31
|
|
while yangmax <= value:
|
|
cheque += 1
|
|
value -= ikashop.YANG_PER_CHEQUE
|
|
|
|
if getattr(self, "moneyInputDialog", None) == None:
|
|
self.moneyInputDialog = uicommon.MoneyInputDialog()
|
|
self.moneyInputDialog.SetTitle(locale.IKASHOP_MONEY_INPUT_DIALOG_TITLE)
|
|
self._RegisterDialog(self.moneyInputDialog)
|
|
|
|
if ENABLE_CHEQUE_SYSTEM:
|
|
self.moneyInputDialog.HideCheque() if nocheque \
|
|
else self.moneyInputDialog.ShowCheque()
|
|
|
|
self.moneyInputDialog.Open()
|
|
self.moneyInputDialog.SetAcceptEvent(acceptEvent)
|
|
self.moneyInputDialog.SetCancelEvent(denyEvent if denyEvent else self.moneyInputDialog.Hide)
|
|
self.moneyInputDialog.SetValue(value if value != 0 else "")
|
|
if ENABLE_CHEQUE_SYSTEM:
|
|
self.moneyInputDialog.SetCheque(cheque if cheque != 0 else "")
|
|
|
|
def GetToolTip(self):
|
|
if getattr(self, "itemToolTip", None) == None:
|
|
self.itemToolTip = uitooltip.ItemToolTip()
|
|
self.itemToolTip.itemVnum = 1
|
|
self._RegisterDialog(self.itemToolTip)
|
|
return self.itemToolTip
|
|
|
|
def Toggle(self):
|
|
self.Close() if self.IsShow()\
|
|
else self.Open()
|
|
|
|
def ShowExclamationMark(self, pos = None):
|
|
rpos = pos if pos else (self.GetWidth() - 14, 1)
|
|
if not hasattr(self, "_ExclamationMark"):
|
|
self._ExclamationMark = self.CreateWidget(ui.ImageBox, pos = rpos )
|
|
self._ExclamationMark.LoadImage("ikashop/lite/mark.png")
|
|
self._ExclamationMark.Show()
|
|
|
|
def HideExclamationMark(self):
|
|
if hasattr(self, '_ExclamationMark'):
|
|
self._ExclamationMark.Hide()
|
|
|
|
if ENABLE_DEFAULT_UI_BOARD:
|
|
class IkashopBoardWithTitleBar(IkarusShopWindow):
|
|
def __init__(self):
|
|
super(IkashopBoardWithTitleBar, self).__init__()
|
|
self._LoadIkashopBoardWithTitleBar()
|
|
|
|
def _LoadIkashopBoardWithTitleBar(self):
|
|
self._internalBoard = self.CreateWidget(ui.BoardWithTitleBar, pos = (-2, -2))
|
|
self._internalBoard.SetSize(self.GetWidth()+6, self.GetHeight()+4)
|
|
|
|
def _UpdateView(self):
|
|
if hasattr(self, "_internalBoard"):
|
|
self._internalBoard.SetSize(self.GetWidth()+6, self.GetHeight()+4)
|
|
|
|
def SetSize(self, w, h):
|
|
super(IkashopBoardWithTitleBar, self).SetSize(w,h)
|
|
self._UpdateView()
|
|
|
|
def SetTitleName(self, title):
|
|
self._internalBoard.SetTitleName(title)
|
|
|
|
def SetCloseEvent(self, event, *args):
|
|
self._internalBoard.SetCloseEvent(ui.__mem_func__(event, *args))
|
|
|
|
def OnPressEscapeKey(self):
|
|
if self.IsShow():
|
|
self.Close()
|
|
return True
|
|
return False
|
|
|
|
else:
|
|
class IkashopBoardWithTitleBar(IkarusShopWindow):
|
|
|
|
SIDE_MARGIN = 16
|
|
|
|
def __init__(self):
|
|
super(IkashopBoardWithTitleBar, self).__init__()
|
|
self._LoadIkashopBoardWithTitleBar()
|
|
|
|
def _LoadIkashopBoardWithTitleBar(self):
|
|
# loading center
|
|
self.centerImage = self.CreateWidget(ui.ExpandedImageBox, x = 3, y = 30)
|
|
self.centerImage.LoadImage("ikashop/lite/common/board/center.png")
|
|
self.centerImage.AddFlag("not_pick")
|
|
|
|
# loading sides
|
|
self.leftSide = self.CreateWidget(ui.ExpandedImageBox, y = self.SIDE_MARGIN)
|
|
self.leftSide.LoadImage("ikashop/lite/common/board/left.png")
|
|
self.leftSide.AddFlag("not_pick")
|
|
|
|
self.rightSide = self.CreateWidget(ui.ExpandedImageBox, y = self.SIDE_MARGIN)
|
|
self.rightSide.LoadImage("ikashop/lite/common/board/right.png")
|
|
self.rightSide.AddFlag("not_pick")
|
|
|
|
self.bottomSide = self.CreateWidget(ui.ExpandedImageBox, x = self.SIDE_MARGIN)
|
|
self.bottomSide.LoadImage("ikashop/lite/common/board/bottom.png")
|
|
self.bottomSide.AddFlag("not_pick")
|
|
|
|
# loading corners
|
|
self.leftBottomCorner = self.CreateWidget(ui.ImageBox)
|
|
self.leftBottomCorner.LoadImage("ikashop/lite/common/board/lb_corner.png")
|
|
self.leftBottomCorner.AddFlag("not_pick")
|
|
|
|
self.rightBottomCorner = self.CreateWidget(ui.ImageBox)
|
|
self.rightBottomCorner.LoadImage("ikashop/lite/common/board/rb_corner.png")
|
|
self.rightBottomCorner.AddFlag("not_pick")
|
|
|
|
# loading titlebar
|
|
self.titleLeft = self.CreateWidget(ui.ImageBox)
|
|
self.titleLeft.LoadImage("ikashop/lite/common/board/titlebar/left.png")
|
|
self.titleLeft.AddFlag("not_pick")
|
|
|
|
self.titleRight = self.CreateWidget(ui.ImageBox)
|
|
self.titleRight.LoadImage("ikashop/lite/common/board/titlebar/right.png")
|
|
self.titleRight.AddFlag("not_pick")
|
|
|
|
self.titleCenter = self.CreateWidget(ui.ExpandedImageBox, x = self.titleLeft.GetWidth())
|
|
self.titleCenter.LoadImage("ikashop/lite/common/board/titlebar/center.png")
|
|
self.titleCenter.AddFlag("not_pick")
|
|
|
|
self.closeButton = self.CreateWidget(ui.Button, y = 3)
|
|
self.closeButton.SetUpVisual("ikashop/lite/common/board/titlebar/close/default.png")
|
|
self.closeButton.SetDownVisual("ikashop/lite/common/board/titlebar/close/default.png")
|
|
self.closeButton.SetOverVisual("ikashop/lite/common/board/titlebar/close/hover.png")
|
|
|
|
self.titleText = self.CreateWidget(ui.TextLine)
|
|
self.titleText.SetHorizontalAlignCenter()
|
|
self.titleText.SetFontName("Tahoma:20")
|
|
self.titleText.SetPackedFontColor(0xFFFFFFFF)
|
|
self.titleText.SetOutline(1)
|
|
self.titleText.AddFlag("not_pick")
|
|
|
|
def _UpdateView(self):
|
|
if getattr(self, "centerImage", None) == None:
|
|
return
|
|
|
|
width = float(self.GetWidth())
|
|
height = float(self.GetHeight())
|
|
|
|
# updating center
|
|
centerWidth = width - 6
|
|
centerHeight = height - 33
|
|
centerHorizontalScale = centerWidth / self.centerImage.GetWidth()
|
|
centerVerticalScale = centerHeight / self.centerImage.GetHeight()
|
|
self.centerImage.SetRenderingRect(0.0, 0.0, centerHorizontalScale - 1.0, centerVerticalScale - 1.0)
|
|
|
|
# updating sides
|
|
sideVerticalScale = (height - self.SIDE_MARGIN*2) / self.leftSide.GetHeight()
|
|
self.leftSide.SetRenderingRect(0.0, 0.0, 0.0, sideVerticalScale - 1.0)
|
|
sideVerticalScale = (height - self.SIDE_MARGIN*2) / self.rightSide.GetHeight()
|
|
self.rightSide.SetRenderingRect(0.0, 0.0, 0.0, sideVerticalScale - 1.0)
|
|
self.rightSide.SetPosition(width - self.rightSide.GetWidth(), self.SIDE_MARGIN)
|
|
sideHorizontalScale = (width - self.SIDE_MARGIN*2) / self.bottomSide.GetWidth()
|
|
self.bottomSide.SetRenderingRect(0.0, 0.0, sideHorizontalScale - 1.0, 0.0)
|
|
self.bottomSide.SetPosition(self.SIDE_MARGIN, height - self.bottomSide.GetHeight())
|
|
|
|
# updating corner positions
|
|
self.leftBottomCorner.SetPosition(0, height - self.leftBottomCorner.GetHeight())
|
|
self.rightBottomCorner.SetPosition(width - self.rightBottomCorner.GetWidth(), height - self.rightBottomCorner.GetHeight())
|
|
|
|
# updating titlebar
|
|
titlebarCenterWidth = width - self.titleLeft.GetWidth() - self.titleRight.GetWidth()
|
|
titlebarCenterWidth = max(10, titlebarCenterWidth)
|
|
titlebarCenterScale = titlebarCenterWidth / self.titleCenter.GetWidth()
|
|
self.titleCenter.SetScale(titlebarCenterScale, 1.0)
|
|
self.titleRight.SetPosition(titlebarCenterWidth + self.titleLeft.GetWidth(), 0)
|
|
self.closeButton.SetPosition(width - self.closeButton.GetWidth() - 6, self.closeButton.GetLocalPosition()[1])
|
|
self.titleText.SetPosition(width/2, 3)
|
|
|
|
def SetSize(self, w, h):
|
|
super(IkashopBoardWithTitleBar, self).SetSize(w,h)
|
|
self._UpdateView()
|
|
|
|
def SetTitleName(self, title):
|
|
self.titleText.SetText(title)
|
|
|
|
def SetCloseEvent(self, event, *args):
|
|
self.closeButton.SetEvent(event, *args)
|
|
|
|
def OnPressEscapeKey(self):
|
|
if self.IsShow():
|
|
self.Close()
|
|
return True
|
|
return False
|
|
|
|
|
|
class IkarusShopSafeboxBoard(IkashopBoardWithTitleBar):
|
|
|
|
GRID_COLUMNS = ikashop.SAFEBOX_GRID_WIDTH
|
|
GRID_ROWS = ikashop.SAFEBOX_GRID_HEIGHT
|
|
PAGE_COUNT = ikashop.SAFEBOX_PAGE_COUNT
|
|
|
|
|
|
def __init__(self):
|
|
super(IkarusShopSafeboxBoard, self).__init__()
|
|
self.items = []
|
|
self._SettingUpBoard()
|
|
self._LoadIkarusShopSafeboxBoard()
|
|
|
|
def _SettingUpBoard(self):
|
|
sw, sh = GetScreenSize()
|
|
self.SetSize(324, 438)
|
|
self.SetTitleName(locale.IKASHOP_SAFEBOX_BOARD_TITLE)
|
|
self.SetCloseEvent(self.Close)
|
|
self.SetPosition(sw/2 - self.GetWidth(), sh / 2 - self.GetHeight()/2)
|
|
self.AddFlag("movable")
|
|
self.AddFlag("float")
|
|
|
|
def _LoadIkarusShopSafeboxBoard(self):
|
|
# making slot box
|
|
self.slotBox = self.CreateWidget(ui.ImageBox, pos = (11, 35))
|
|
self.slotBox.LoadImage("ikashop/lite/safebox/slot_box.png")
|
|
|
|
self.slotWindow = self.CreateWidget(ui.GridSlotWindow, parent = self.slotBox, pos = (6,6))
|
|
self.slotWindow.ArrangeSlot(0, self.GRID_COLUMNS, self.GRID_ROWS, SLOT_SIZE, SLOT_SIZE, 0, 0)
|
|
self.slotWindow.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
|
|
self.slotWindow.SetOverInItemEvent(self._ShowToolTipOnItemSlot)
|
|
self.slotWindow.SetOverOutItemEvent(self._HideToolTipOnItemSlot)
|
|
self.slotWindow.SetSelectItemSlotEvent(self._OnClickItemSlot)
|
|
|
|
# making money box
|
|
self.moneyBox = self.CreateWidget(ui.ImageBox, pos = (11, 404))
|
|
self.moneyBox.LoadImage("ikashop/lite/safebox/money_box.png")
|
|
mx, my = self.moneyBox.GetLocalPosition()
|
|
|
|
self.moneyText = self.CreateWidget(ui.TextLine, parent = self.moneyBox, pos = (23, 4))
|
|
self.moneyText.SetFontName("Tahoma:11")
|
|
self.moneyText.SetPackedFontColor(0xFFFFFFFF)
|
|
self.moneyText.SetText(locale.NumberToString(2**31))
|
|
|
|
self.moneyClaimButton = self.CreateWidget(ui.Button, pos = (mx + self.moneyBox.GetWidth() + 2, my))
|
|
self.moneyClaimButton.SetUpVisual("ikashop/lite/safebox/buttons/claim_money/default.png")
|
|
self.moneyClaimButton.SetOverVisual("ikashop/lite/safebox/buttons/claim_money/hover.png")
|
|
self.moneyClaimButton.SetDownVisual("ikashop/lite/safebox/buttons/claim_money/default.png")
|
|
self.moneyClaimButton.SetToolTipText(locale.IKASHOP_SAFEBOX_CLAIM_MONEY_BUTTON_TEXT)
|
|
self.moneyClaimButton.SetEvent(self._OnClickClaimMoneyButton)
|
|
|
|
# making page selection box
|
|
self.selectPageButtons = []
|
|
for i in xrange(self.PAGE_COUNT):
|
|
selectPageButton = self.CreateWidget(ui.Button, pos = (158 + i*41, 405))
|
|
selectPageButton.SetUpVisual("ikashop/lite/safebox/buttons/select_page/default.png")
|
|
selectPageButton.SetDownVisual("ikashop/lite/safebox/buttons/select_page/default.png")
|
|
selectPageButton.SetOverVisual("ikashop/lite/safebox/buttons/select_page/hover.png")
|
|
selectPageButton.SetDisableVisual("ikashop/lite/safebox/buttons/select_page/disabled.png")
|
|
selectPageButton.SetText(RomeNumber(i+1))
|
|
selectPageButton.SAFE_SetEvent(self._OnSelectPage, i)
|
|
self.selectPageButtons.append(selectPageButton)
|
|
|
|
# making claim items button
|
|
self.itemsClaimButton = self.CreateWidget(ui.Button, pos = (158 + self.PAGE_COUNT*41 + 2, 405))
|
|
self.itemsClaimButton.SetUpVisual("ikashop/lite/safebox/buttons/claim_items/default.png")
|
|
self.itemsClaimButton.SetDownVisual("ikashop/lite/safebox/buttons/claim_items/default.png")
|
|
self.itemsClaimButton.SetOverVisual("ikashop/lite/safebox/buttons/claim_items/hover.png")
|
|
self.itemsClaimButton.SetToolTipText(locale.IKASHOP_SAFEBOX_CLAIM_ITEMS_BUTTON_TEXT)
|
|
self.itemsClaimButton.SAFE_SetEvent(self._OnClickClaimAllItemsButton)
|
|
|
|
# default opening first page
|
|
self._OnSelectPage(0)
|
|
|
|
def _OnSelectPage(self, num):
|
|
for button in self.selectPageButtons:
|
|
button.Enable()
|
|
self.selectPageButtons[num].Disable()
|
|
self.currentPage = num
|
|
self._RefreshPage()
|
|
|
|
def _RefreshPage(self):
|
|
cells = self.GRID_COLUMNS * self.GRID_ROWS
|
|
srange = cells * self.currentPage
|
|
erange = srange + cells
|
|
|
|
for i in xrange(srange, erange):
|
|
local = i - srange
|
|
if not i in self.items:
|
|
self.slotWindow.ClearSlot(local)
|
|
continue
|
|
data = self.items[i]
|
|
count = data['count'] if data['count'] > 1 else 0
|
|
self.slotWindow.SetItemSlot(local, data['vnum'], count)
|
|
|
|
self.slotWindow.RefreshSlot()
|
|
|
|
def _RefreshItems(self, items):
|
|
self.items = {item['cell'] : item for item in items}
|
|
self._RefreshPage()
|
|
|
|
def _ShowToolTipOnItemSlot(self, slot):
|
|
slot = slot + self.currentPage * (self.GRID_COLUMNS * self.GRID_ROWS)
|
|
if slot in self.items:
|
|
data = self.items[slot]
|
|
tooltip = self.GetToolTip()
|
|
tooltip.ClearToolTip()
|
|
tooltip.AddItemData(data['vnum'], data['sockets'], data['attrs'])
|
|
tooltip.AppendTextLine(locale.IKASHOP_SAFEBOX_CLAIM_ITEM_TOOLTIP)
|
|
tooltip.ShowToolTip()
|
|
|
|
def _HideToolTipOnItemSlot(self, slot=0):
|
|
tooltip = self.GetToolTip()
|
|
tooltip.ClearToolTip()
|
|
tooltip.HideToolTip()
|
|
|
|
def _OnClickItemSlot(self, cell):
|
|
cell = cell + self.currentPage * (self.GRID_COLUMNS * self.GRID_ROWS)
|
|
if cell in self.items:
|
|
data = self.items[cell]
|
|
ikashop.SendSafeboxGetItem(data['id'])
|
|
|
|
def _OnClickClaimAllItemsButton(self):
|
|
self.OpenQuestionDialog(
|
|
locale.IKASHOP_SAFEBOX_CLAIM_ALL_ITEMS_QUESTION, self._OnAcceptClaimAllItemsQuestion)
|
|
|
|
def _OnClickClaimMoneyButton(self):
|
|
|
|
|
|
ikashop.SendSafeboxGetValutes()
|
|
|
|
def _OnAcceptClaimAllItemsQuestion(self):
|
|
self.questionDialog.Hide()
|
|
for item in self.items.values():
|
|
ikashop.SendSafeboxGetItem(item['id'])
|
|
|
|
def Open(self):
|
|
self.SetTop()
|
|
if not self.IsShow():
|
|
ikashop.SendSafeboxOpen()
|
|
|
|
def Setup(self, yang, items):
|
|
if not self.IsShow():
|
|
self.Show()
|
|
self.SetTop()
|
|
|
|
self.moneyText.SetText(locale.NumberToString(yang))
|
|
self._RefreshItems(items)
|
|
|
|
def RemoveItem(self, itemid):
|
|
items = [data for data in self.items.values() if data['id'] != itemid]
|
|
self._RefreshItems(items)
|
|
|
|
def AddItem(self, item):
|
|
items = list(self.items.values()) + [item,]
|
|
self._RefreshItems(items)
|
|
|
|
def Destroy(self):
|
|
super(IkarusShopSafeboxBoard, self).Destroy()
|
|
|
|
def Close(self):
|
|
ikashop.SendSafeboxClose()
|
|
self.Hide()
|
|
|
|
class IkarusCreateAuctionDialog(IkashopBoardWithTitleBar):
|
|
|
|
def __init__(self):
|
|
super(IkarusCreateAuctionDialog, self).__init__()
|
|
self._LoadIkarusCreateAuctionDialog()
|
|
self._InsertedItem = None
|
|
self._ItemInfo = None
|
|
|
|
def _LoadIkarusCreateAuctionDialog(self):
|
|
self._SettingUpBoard()
|
|
|
|
# loading slot
|
|
self.slot = self.CreateWidget(ui.GridSlotWindow, pos = (self.GetWidth()/2- 17, 45))
|
|
self.slot.ArrangeSlot(0, 1, 3, SLOT_SIZE, SLOT_SIZE, 0, 0)
|
|
self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
|
|
self.slot.SetSelectEmptySlotEvent(self._OnClickEmptySlot)
|
|
self.slot.SetSelectItemSlotEvent(self._OnClickItemSlot)
|
|
self.slot.SetOverInItemEvent(self._ShowToolTipOnItemSlot)
|
|
self.slot.SetOverOutItemEvent(self._HideToolTipOnItemSlot)
|
|
|
|
# loading continue button
|
|
self.proceedButton = self.CreateWidget(ui.Button, pos = (self.GetWidth() / 2 - 53, self.GetHeight() - 40))
|
|
self.proceedButton.SetUpVisual("ikashop/lite/auction/raise_button/default.png")
|
|
self.proceedButton.SetDownVisual("ikashop/lite/auction/raise_button/default.png")
|
|
self.proceedButton.SetOverVisual("ikashop/lite/auction/raise_button/hover.png")
|
|
self.proceedButton.SetText(locale.IKASHOP_ACUTION_CREATE_CREATE_BUTTON)
|
|
self.proceedButton.SAFE_SetEvent(self._OnClickCreateAuction)
|
|
self.proceedButton.Show()
|
|
self.proceedButton.ButtonText.SetPosition(self.proceedButton.GetWidth()/2 + 12, self.proceedButton.GetHeight()/2-1)
|
|
|
|
def _SettingUpBoard(self):
|
|
sw, sh = GetScreenSize()
|
|
self.SetSize(145, 195)
|
|
self.SetTitleName(locale.IKASHOP_AUCTION_CREATE_BOARD_TITLE)
|
|
self.SetCloseEvent(self.Close)
|
|
self.SetPosition(sw/2 - self.GetWidth()/2, sh / 2 - self.GetHeight()/2)
|
|
self.AddFlag("movable")
|
|
self.AddFlag("float")
|
|
|
|
def _Reset(self):
|
|
# reset slots
|
|
for i in xrange(3):
|
|
self.slot.ClearSlot(i)
|
|
self.slot.RefreshSlot()
|
|
|
|
if hasattr(self, "moneyInputDialog"):
|
|
self.moneyInputDialog.SoftClose()
|
|
|
|
self._InsertedItem = None
|
|
self._ItemInfo = None
|
|
|
|
def _OnClickEmptySlot(self, slot):
|
|
if self._InsertedItem != None:
|
|
return
|
|
if mouse.mouseController.isAttached():
|
|
attachedType = mouse.mouseController.GetAttachedType()
|
|
attachedItemIndex = mouse.mouseController.GetAttachedItemIndex()
|
|
attachedItemSlotPos = mouse.mouseController.GetAttachedSlotNumber()
|
|
mouse.mouseController.DeattachObject()
|
|
# validating attached item
|
|
if attachedType in (player.SLOT_TYPE_DRAGON_SOUL_INVENTORY, player.SLOT_TYPE_INVENTORY):
|
|
win, pos = player.SlotTypeToInvenType(attachedType), attachedItemSlotPos
|
|
if player.ITEM_MONEY != attachedItemIndex:
|
|
self.InsertItemInSlot(win, pos)
|
|
|
|
def _OnClickItemSlot(self, slot):
|
|
if mouse.mouseController.isAttached():
|
|
return
|
|
self._Reset()
|
|
|
|
def _ShowToolTipOnItemSlot(self, slot):
|
|
win, pos = self._InsertedItem
|
|
tooltip = self.GetToolTip()
|
|
tooltip.SetInventoryItem(pos, win)
|
|
tooltip.AppendTextLine(locale.IKASHOP_AUCTION_CREATE_REMOVE_ITEM)
|
|
|
|
def _HideToolTipOnItemSlot(self, slot = 0):
|
|
tooltip = self.GetToolTip()
|
|
tooltip.ClearToolTip()
|
|
tooltip.HideToolTip()
|
|
|
|
def _OnClickCreateAuction(self):
|
|
self.OpenMoneyInputDialog(self._OnAcceptStartingPriceInput, nocheque = 1)
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
vnum, count, hash = self._ItemInfo
|
|
ikashop.SendPriceAverageRequest(vnum, count)
|
|
self.moneyInputDialog.SetPriceAverage(-1)
|
|
|
|
def _OnAcceptStartingPriceInput(self):
|
|
# extracting value
|
|
value = self.moneyInputDialog.GetText()
|
|
value = value.lower().replace("k", "000")
|
|
self.moneyInputDialog.SoftClose()
|
|
|
|
# validating value
|
|
if not value or not value.isdigit():
|
|
self.OpenPopupDialog(locale.IKASHOP_BUSINESS_INVALID_ITEM_PRICE)
|
|
return
|
|
|
|
if self._InsertedItem is None:
|
|
return
|
|
|
|
win, pos = self._InsertedItem
|
|
|
|
self.Close()
|
|
ikashop.SendAuctionCreate(win, pos, long(value))
|
|
return True
|
|
|
|
def InsertItemInSlot(self, win, pos):
|
|
vnum = player.GetItemIndex(win, pos)
|
|
count = player.GetItemCount(win, pos)
|
|
|
|
# checking item antifalg
|
|
item.SelectItem(vnum)
|
|
if item.IsAntiFlag(item.ANTIFLAG_GIVE) or item.IsAntiFlag(item.ANTIFLAG_MYSHOP):
|
|
self.OpenPopupDialog(locale.IKASHOP_BUSINESS_CANNOT_SELL_ITEM)
|
|
return
|
|
|
|
self._InsertedItem = win, pos
|
|
self._ItemInfo = vnum, count, GetInventoryItemHash(win, pos)
|
|
|
|
self.slot.SetItemSlot(0, vnum, count if count > 1 else 0)
|
|
self.slot.RefreshSlot()
|
|
|
|
def Open(self):
|
|
self._Reset()
|
|
self.Show()
|
|
self.SetTop()
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
player.RefreshInventory()
|
|
|
|
def Close(self):
|
|
self.Hide()
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
player.RefreshInventory()
|
|
|
|
def OnUpdate(self):
|
|
if self._ItemInfo != None:
|
|
win, pos = self._InsertedItem
|
|
vnum, count, hash = self._ItemInfo
|
|
|
|
if vnum != player.GetItemIndex(win, pos):
|
|
self._Reset()
|
|
elif count != player.GetItemCount(win, pos):
|
|
self._Reset()
|
|
elif hash != GetInventoryItemHash(win, pos):
|
|
self._Reset()
|
|
|
|
|
|
class IkarusShopAuctionOfferView(IkarusShopWindow):
|
|
|
|
def __init__(self):
|
|
super(IkarusShopAuctionOfferView, self).__init__()
|
|
self._LoadIkarusShopAuctionOfferView()
|
|
|
|
def _LoadIkarusShopAuctionOfferView(self):
|
|
# making background and fitting its size
|
|
self.background = self.CreateWidget(ui.ImageBox, pos = ())
|
|
self.background.LoadImage("ikashop/lite/auction/offer_box.png")
|
|
self.SetSize(self.background.GetWidth(), self.background.GetHeight())
|
|
|
|
# making name text
|
|
self.nameText = self.CreateWidget(ui.TextLine, pos = (28, 5))
|
|
self.nameText.SetPackedFontColor(0xFFFFFFFF)
|
|
self.nameText.SetFontName("Tahoma:11")
|
|
|
|
# making datetime
|
|
self.datetimeText = self.CreateWidget(ui.TextLine, pos = (168 + 13, 5))
|
|
self.datetimeText.SetPackedFontColor(0xFFFFFFFF)
|
|
self.datetimeText.SetHorizontalAlignCenter()
|
|
|
|
# making money text
|
|
self.moneyText = self.CreateWidget(ui.TextLine, pos = (256 + 13, 5))
|
|
self.moneyText.SetPackedFontColor(0xFFFFFFFF)
|
|
|
|
def Setup(self, pos, data):
|
|
name, datetime, price = data['buyername'], data['datetime'], data['price']
|
|
self.nameText.SetText("{}. {}".format(pos, name))
|
|
self.datetimeText.SetText(DatetimeFormat(datetime))
|
|
self.moneyText.SetText(locale.NumberToString(price))
|
|
self.Show()
|
|
|
|
class IkarusShopAuctionOwnerBoard(IkashopBoardWithTitleBar):
|
|
OFFER_VIEW_COUNT = 6
|
|
OFFER_VIEW_HEIGHT = 28
|
|
RAISE_FACTOR = 1.0 + float(AUCTION_MIN_RAISE_PERCENTAGE) / 100.0
|
|
|
|
def __init__(self):
|
|
super(IkarusShopAuctionOwnerBoard, self).__init__()
|
|
self._SettingUpBoard()
|
|
self._LoadIkarusShopAuctionOwnerBoard()
|
|
|
|
def _SettingUpBoard(self):
|
|
sw, sh = GetScreenSize()
|
|
self.SetSize(513 + 13, 249)
|
|
self.SetTitleName(locale.IKASHOP_AUCTION_BOARD_TITLE)
|
|
self.SetCloseEvent(self.Close)
|
|
self.SetPosition(sw/2 - self.GetWidth(), sh / 2 - self.GetHeight()/2 + 100)
|
|
self.AddFlag("movable")
|
|
self.AddFlag("float")
|
|
|
|
def _LoadIkarusShopAuctionOwnerBoard(self):
|
|
# making info box
|
|
self.infoBox = self.CreateWidget(ui.ImageBox, pos = (12, 36))
|
|
self.infoBox.LoadImage("ikashop/lite/auction/info_box.png")
|
|
self.infoBox.SetMouseWheelEvent(self._MouseWheelScrollOffers)
|
|
|
|
self.minRaiseText = self.CreateWidget(ui.TextLine, pos = (458+13, 221-36), parent = self.infoBox)
|
|
self.minRaiseText.SetPackedFontColor(0xFFFFFFFF)
|
|
self.minRaiseText.SetHorizontalAlignRight()
|
|
|
|
self.durationText = self.CreateWidget(ui.TextLine, pos = (141, 221-36), parent = self.infoBox)
|
|
self.durationText.SetPackedFontColor(0xFFFFFFFF)
|
|
|
|
# making slot
|
|
self.slot = self.CreateWidget(ui.GridSlotWindow, pos = (36, 44), size = (32, 98), parent = self.infoBox)
|
|
self.slot.ArrangeSlot(0, 1, 3, SLOT_SIZE, SLOT_SIZE, 0, 0)
|
|
self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
|
|
self.slot.SetOverInItemEvent(self._OverInItem)
|
|
self.slot.SetOverOutItemEvent(self._OverOutItem)
|
|
|
|
# making scrollbar
|
|
self.offerScrollbar = self.CreateWidget(ui.ScrollBar, pos = (470+13, 4), parent = self.infoBox)
|
|
self.offerScrollbar.SetScrollBarSize(self.infoBox.GetHeight() - 35)
|
|
self.offerScrollbar.SetScrollEvent(self._ScrollOffers)
|
|
|
|
# making cancel auction button
|
|
self.cancelAuctionButton = self.CreateWidget(ui.Button, pos = (12, self.GetHeight() - 33))
|
|
self.cancelAuctionButton.SetUpVisual("ikashop/lite/auction/cancel_button/default.png")
|
|
self.cancelAuctionButton.SetDownVisual("ikashop/lite/auction/cancel_button/default.png")
|
|
self.cancelAuctionButton.SetOverVisual("ikashop/lite/auction/cancel_button/hover.png")
|
|
self.cancelAuctionButton.SetText(locale.IKASHOP_ACUTION_CANCEL_AUCTION_BUTTON)
|
|
self.cancelAuctionButton.SAFE_SetEvent(self._OnClickCancelAuction)
|
|
self.cancelAuctionButton.Show()
|
|
|
|
# making offers
|
|
self.offerViews = []
|
|
for i in xrange(self.OFFER_VIEW_COUNT):
|
|
self.offerViews.append(self.CreateWidget(
|
|
IkarusShopAuctionOfferView, pos = (115, 6 + i*self.OFFER_VIEW_HEIGHT), parent = self.infoBox))
|
|
|
|
def _RefreshOffers(self):
|
|
# calculating count difference
|
|
diff = len(self.offers) - self.OFFER_VIEW_COUNT
|
|
diff = max(diff, 0)
|
|
|
|
# calculating ranges
|
|
offset = self.offerScrollbar.GetPos()
|
|
sindex = int(diff * offset)
|
|
eindex = sindex + min(self.OFFER_VIEW_COUNT, len(self.offers))
|
|
|
|
# iterating over views
|
|
for i, view in enumerate(self.offerViews):
|
|
ri = i + sindex
|
|
view.Hide() if ri >= eindex \
|
|
else view.Setup(ri+1, self.offers[ri])
|
|
|
|
# updating scrollbar middlebar length
|
|
viewHeight = self.OFFER_VIEW_HEIGHT
|
|
self.offerScrollbar.UpdateScrollbarLenght(viewHeight * len(self.offers))
|
|
|
|
def _MouseWheelScrollOffers(self, delta):
|
|
if self.offerScrollbar.IsShow():
|
|
self.offerScrollbar.OnDown() if delta < 0 \
|
|
else self.offerScrollbar.OnUp()
|
|
return True
|
|
|
|
def _ScrollOffers(self):
|
|
if self.offerScrollbar.IsShow():
|
|
self._RefreshOffers()
|
|
|
|
def _UpdateScrollbarState(self):
|
|
self.offerScrollbar.SetPos(0)
|
|
if len(self.offers) <= self.OFFER_VIEW_COUNT:
|
|
self.offerScrollbar.Hide()
|
|
else:
|
|
self.offerScrollbar.Show()
|
|
|
|
def _OverInItem(self, slot):
|
|
data = self.auctionInfo
|
|
tooltip = self.GetToolTip()
|
|
tooltip.ClearToolTip()
|
|
tooltip.AddItemData(data['vnum'], data['sockets'], data['attrs'])
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
tooltip.AppendTextLine(locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_NOT_AVAILABLE) if data['priceavg'] == 0 \
|
|
else tooltip.AppendTextLine(locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_VALUE.format(locale.NumberToMoneyString(data['priceavg'])))
|
|
tooltip.ShowToolTip()
|
|
|
|
def _OverOutItem(self, slot = 0):
|
|
tooltip = self.GetToolTip()
|
|
tooltip.ClearToolTip()
|
|
tooltip.HideToolTip()
|
|
|
|
def _OnClickCancelAuction(self):
|
|
if self.auctionInfo['offers']:
|
|
self.OpenPopupDialog(locale.IKASHOP_AUCTION_CANNOT_CANCEL)
|
|
return
|
|
|
|
self.OpenQuestionDialog(locale.IKASHOP_AUCTION_CANCEL_AUCTION_QUESTION, self._OnAcceptCancelAuction)
|
|
|
|
def _OnAcceptCancelAuction(self):
|
|
ikashop.SendMyAuctionCancel()
|
|
self.questionDialog.Close()
|
|
self.Close()
|
|
|
|
def SetOffers(self, offers):
|
|
self.offers = sorted(offers, key = lambda val : val['datetime'], reverse=True)
|
|
self._UpdateScrollbarState()
|
|
self._RefreshOffers()
|
|
self.RefreshMinRaise()
|
|
|
|
def SetDuration(self, duration):
|
|
self.durationText.SetText(locale.SecondToDHM(duration*60))
|
|
|
|
def _GetMinRaise(self):
|
|
if not self.offers:
|
|
return self.auctionInfo['price']
|
|
|
|
minraise = max([val['price'] for val in self.offers])
|
|
if minraise < 1000:
|
|
return minraise + 1000
|
|
|
|
return minraise * (100+AUCTION_MIN_RAISE_PERCENTAGE) / 100
|
|
|
|
def RefreshMinRaise(self):
|
|
self.minRaise = self._GetMinRaise()
|
|
self.minRaiseText.SetText(locale.IKASHOP_AUCTION_MIN_BID + ' ' + locale.NumberToString(self.minRaise))
|
|
|
|
def Open(self):
|
|
ikashop.SendMyAuctionOpen()
|
|
|
|
def Close(self):
|
|
self.Hide()
|
|
ikashop.SendMyAuctionClose()
|
|
|
|
def Setup(self, data):
|
|
# storing data
|
|
self.auctionInfo = data
|
|
|
|
# refreshing duration
|
|
seconds = data['duration'] * 60
|
|
self.durationText.SetText(locale.SecondToDHM(seconds))
|
|
|
|
# refreshing item
|
|
vnum = data['vnum']
|
|
count = data['count'] if data['count'] > 1 else 0
|
|
item.SelectItem(vnum)
|
|
size = item.GetItemSize()[1]
|
|
self.slot.ArrangeSlot(0, 1, size, SLOT_SIZE, SLOT_SIZE, 0, 0)
|
|
self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
|
|
self.slot.SetItemSlot(0, vnum, count)
|
|
|
|
# refreshing offers
|
|
self.SetOffers(data['offers'])
|
|
|
|
if not self.IsShow():
|
|
self.Show()
|
|
self.SetTop()
|
|
|
|
class IkarusShopListBoard(IkashopBoardWithTitleBar):
|
|
|
|
def _LoadIkarusShopListBoard(self):
|
|
# making board box
|
|
self.boardBox = self.CreateWidget(ui.ExpandedImageBox, pos = (11,36))
|
|
self.boardBox.LoadImage("ikashop/lite/list_box.png")
|
|
boardBoxHorizontalScale = float(self.GetWidth() - 22 - 16) / self.boardBox.GetWidth()
|
|
boardBoxVerticalScale = float(self.GetHeight() - 47) / self.boardBox.GetHeight()
|
|
self.boardBox.SetScale(boardBoxHorizontalScale, boardBoxVerticalScale)
|
|
self.boardBox.SetMouseWheelEvent(self._MouseWheelScrollElements)
|
|
|
|
# making scrollbar
|
|
self.elementScrollbar = self.CreateWidget(ui.ScrollBar, pos = (self.GetWidth() - 24, 36))
|
|
self.elementScrollbar.SetScrollBarSize(self.boardBox.GetHeight())
|
|
self.elementScrollbar.SetScrollEvent(self._ScrollElements)
|
|
|
|
# making empty header
|
|
self.emptyHeader = self.CreateWidget(ui.TextLine, pos = (self.GetWidth()/2, self.GetHeight()/2 - 10))
|
|
self.emptyHeader.SetFontName("Tahoma:14")
|
|
self.emptyHeader.SetPackedFontColor(0xFFFFFFFF)
|
|
self.emptyHeader.SetOutline(1)
|
|
self.emptyHeader.SetHorizontalAlignCenter()
|
|
self.emptyHeader.SetVerticalAlignCenter()
|
|
self.emptyHeader.SetText(locale.IKASHOP_GENERIC_LIST_EMPTY_HEADER)
|
|
|
|
def _SettingUpBoard(self):
|
|
sw, sh = GetScreenSize()
|
|
self.SetCloseEvent(getattr(self, "Close", self.Hide))
|
|
self.SetPosition(sw/2 + 20 - (self.GetWidth() - 200), sh / 2 - self.GetHeight()/2)
|
|
self.AddFlag("movable")
|
|
self.AddFlag("float")
|
|
|
|
def _MakeListElements(self, type, viewCount):
|
|
self.viewCount = viewCount
|
|
# making notifiction boxes
|
|
self.views = []
|
|
for i in xrange(self.viewCount):
|
|
view = self.CreateWidget(type, parent = self.boardBox)
|
|
space = view.GetHeight()+2
|
|
view.SetPosition(9, 7 + i * space)
|
|
self.views.append(view)
|
|
|
|
def _ScrollElements(self):
|
|
if self.elementScrollbar.IsShow():
|
|
self._RefreshElements()
|
|
|
|
def _MouseWheelScrollElements(self, delta):
|
|
if self.elementScrollbar.IsShow():
|
|
self.elementScrollbar.OnDown() if delta < 0 \
|
|
else self.elementScrollbar.OnUp()
|
|
return True
|
|
|
|
def _UpdateScrollbarState(self):
|
|
if len(self.elements) <= self.viewCount:
|
|
self.elementScrollbar.SetPos(0)
|
|
self.elementScrollbar.Hide()
|
|
else:
|
|
self.elementScrollbar.Show()
|
|
|
|
def _RefreshElements(self):
|
|
# calculating count difference
|
|
diff = len(self.elements) - self.viewCount
|
|
diff = max(diff, 0)
|
|
|
|
# calculating ranges
|
|
offset = self.elementScrollbar.GetPos()
|
|
sindex = int(diff * offset)
|
|
eindex = sindex + min(self.viewCount, len(self.elements))
|
|
|
|
# iterating over views
|
|
for i, view in enumerate(self.views):
|
|
ri = i + sindex
|
|
if ri >= eindex:
|
|
view.Hide()
|
|
else:
|
|
view.Setup(self.elements[ri])
|
|
view.Show()
|
|
|
|
# updating scrollbar middlebar length
|
|
viewHeight = self.views[0].GetHeight()+2
|
|
self.elementScrollbar.UpdateScrollbarLenght(viewHeight * len(self.elements))
|
|
|
|
def SetElements(self, elements):
|
|
self.elements = elements
|
|
self._UpdateScrollbarState()
|
|
self._RefreshElements()
|
|
|
|
self.emptyHeader.Show() if not elements \
|
|
else self.emptyHeader.Hide()
|
|
|
|
|
|
class IkarusShopOfferView(IkarusShopWindow):
|
|
|
|
def __init__(self):
|
|
super(IkarusShopOfferView, self).__init__()
|
|
self._LoadIkarusShopOfferView()
|
|
|
|
def _LoadIkarusShopOfferView(self):
|
|
# making background
|
|
self.background = self.CreateWidget(ui.ExpandedImageBox)
|
|
self.background.LoadImage("ikashop/lite/search_shop/result_item_box.png")
|
|
self.SetSize(self.background.GetWidth(), self.background.GetHeight())
|
|
|
|
# making textlines
|
|
self.itemName = self.CreateWidget(ui.TextLine, pos = (60, 17 - 6))
|
|
self.itemName.SetPackedFontColor(0xFFFFFFFF)
|
|
self.sellerName = self.CreateWidget(ui.TextLine, pos = (78, 41 - 6))
|
|
self.duration = self.CreateWidget(ui.TextLine, pos = (226, 41 - 6))
|
|
self.price = self.CreateWidget(ui.TextLine, pos = (78, 58))
|
|
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
self.priceAverage = self.CreateWidget(ui.TextLine, pos = (330-8, 58))
|
|
self.priceAverage.SetHorizontalAlignRight()
|
|
|
|
# making buttons
|
|
self.acceptOfferButton = self.CreateWidget(ui.Button, pos = (261, 84))
|
|
self.acceptOfferButton.SetUpVisual("ikashop/lite/search_shop/buy_button/default.png")
|
|
self.acceptOfferButton.SetDownVisual("ikashop/lite/search_shop/buy_button/default.png")
|
|
self.acceptOfferButton.SetOverVisual("ikashop/lite/search_shop/buy_button/hover.png")
|
|
self.acceptOfferButton.SAFE_SetEvent(self._OnClickAcceptOffer)
|
|
self.acceptOfferButton.SetText(locale.IKASHOP_OFFER_LIST_ACCEPT_OFFER_BUTTON_TEXT)
|
|
|
|
self.cancelOfferButton = self.CreateWidget(ui.Button, pos = (189, 84))
|
|
self.cancelOfferButton.SetUpVisual("ikashop/lite/search_shop/offer_button/default.png")
|
|
self.cancelOfferButton.SetDownVisual("ikashop/lite/search_shop/offer_button/default.png")
|
|
self.cancelOfferButton.SetOverVisual("ikashop/lite/search_shop/offer_button/hover.png")
|
|
self.cancelOfferButton.SAFE_SetEvent(self._OnClickCancelButton)
|
|
self.cancelOfferButton.SetText(locale.IKASHOP_SEARCH_SHOP_OFFER_BUTTON_TEXT)
|
|
|
|
# making slot item
|
|
self.slot = self.CreateWidget(ui.GridSlotWindow, pos = (9, 7))
|
|
self.slot.ArrangeSlot(0, 1, 3, SLOT_SIZE, SLOT_SIZE, 0, 0)
|
|
self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
|
|
self.slot.SetOverInItemEvent(self._OverInItem)
|
|
self.slot.SetOverOutItemEvent(self._OverOutItem)
|
|
|
|
def _OverInItem(self, slot):
|
|
tooltip = self.GetToolTip()
|
|
tooltip.ClearToolTip()
|
|
tooltip.AddItemData(self.itemData['vnum'], self.itemData['sockets'], self.itemData['attrs'])
|
|
tooltip.ShowToolTip()
|
|
|
|
def _OverOutItem(self):
|
|
tooltip = self.GetToolTip()
|
|
tooltip.HideToolTip()
|
|
|
|
def _OnClickAcceptOffer(self):
|
|
self.OpenQuestionDialog(locale.IKASHOP_OFFER_LIST_ACCEPT_OFFER_QUESTION, self._OnAcceptOffer)
|
|
|
|
def _OnClickCancelButton(self):
|
|
self.OpenQuestionDialog(locale.IKASHOP_OFFER_LIST_CANCEL_OFFER_QUESTION, self._OnCancelOffer)
|
|
|
|
def _OnAcceptOffer(self):
|
|
self.questionDialog.Hide()
|
|
ikashop.SendOfferAccept(self.data['id'])
|
|
|
|
def _OnCancelOffer(self):
|
|
self.questionDialog.Hide()
|
|
ikashop.SendOfferCancel(self.data['id'], self.data['ownerid'])
|
|
|
|
def Setup(self, data):
|
|
self.ShowExclamationMark() if data['incoming']\
|
|
else self.HideExclamationMark()
|
|
|
|
self.acceptOfferButton.Show() if data['incoming']\
|
|
else self.acceptOfferButton.Hide()
|
|
|
|
self.cancelOfferButton.SetText(locale.IKASHOP_OFFER_LIST_DENY_OFFER_BUTTON_TEXT) if data['incoming']\
|
|
else self.cancelOfferButton.SetText(locale.IKASHOP_OFFER_LIST_CANCEL_OFFER_BUTTON_TEXT)
|
|
|
|
self.cancelOfferButton.SetPosition(189, 84) if data['incoming']\
|
|
else self.cancelOfferButton.SetPosition(261, 84)
|
|
|
|
self.background.LoadImage("ikashop/lite/offer_list/incoming_offer.png") if data['incoming']\
|
|
else self.background.LoadImage("ikashop/lite/offer_list/outcoming_offer.png")
|
|
|
|
# setting itemname
|
|
itemData = data['item']
|
|
item.SelectItem(itemData['vnum'])
|
|
itemName = item.GetItemName()
|
|
self.itemName.SetText(itemName)
|
|
|
|
# setting seller name
|
|
self.sellerName.SetText(data['buyer_name']) if data['incoming']\
|
|
else self.sellerName.SetText(data['name'])
|
|
|
|
# setting duration
|
|
self.duration.SetText(DatetimeFormat(data['datetime']))
|
|
|
|
# setting price
|
|
self.price.SetText(locale.NumberToString(data['price']))
|
|
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
pa = locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_NOT_AVAILABLE_EMOJI if itemData['priceavg'] == 0 \
|
|
else locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_EMOJI.format(locale.NumberToMoneyString(itemData['priceavg']))
|
|
self.priceAverage.SetText(pa)
|
|
|
|
|
|
# setting slot
|
|
itemcount = itemData['count'] if itemData['count'] > 1 else 0
|
|
self.slot.ArrangeSlot(0, 1, item.GetItemSize()[1], SLOT_SIZE, SLOT_SIZE, 0, 0)
|
|
self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
|
|
self.slot.SetItemSlot(0, itemData['vnum'], itemcount)
|
|
self.data = data
|
|
self.itemData = itemData
|
|
|
|
class IkarusShopOffersBoard(IkarusShopListBoard):
|
|
|
|
OFFER_VIEW_COUNT = 3
|
|
|
|
def __init__(self):
|
|
super(IkarusShopOffersBoard, self).__init__()
|
|
self._SettingUpBoard()
|
|
self._LoadIkarusShopOffersBoard()
|
|
|
|
def _SettingUpBoard(self):
|
|
self.SetSize(395, 399)
|
|
self.SetTitleName(locale.IKASHOP_OFFER_LIST_BOARD_TITLE)
|
|
super(IkarusShopOffersBoard, self)._SettingUpBoard()
|
|
|
|
def _LoadIkarusShopOffersBoard(self):
|
|
self._LoadIkarusShopListBoard()
|
|
self._MakeListElements(IkarusShopOfferView, self.OFFER_VIEW_COUNT)
|
|
|
|
def SetOffers(self, offers):
|
|
self.offers = sorted(offers, key = lambda val : val['datetime'], reverse=True)
|
|
self.SetElements(self.offers)
|
|
self.Show()
|
|
self.SetTop()
|
|
|
|
def Open(self):
|
|
ikashop.SendOfferListRequest()
|
|
|
|
def Close(self):
|
|
self.Hide()
|
|
ikashop.SendOffersListClose()
|
|
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
class IkarusShopNotificationView(IkarusShopWindow):
|
|
|
|
|
|
def __init__(self):
|
|
super(IkarusShopNotificationView, self).__init__()
|
|
self._LoadIkarusShopNotificationView()
|
|
|
|
def _LoadIkarusShopNotificationView(self):
|
|
# making background and fitting its size
|
|
self.background = self.CreateWidget(ui.ImageBox)
|
|
self.background.LoadImage("ikashop/pro/notification/notification_box.png")
|
|
self.SetSize(self.background.GetWidth(), self.background.GetHeight())
|
|
|
|
# making what
|
|
self.whatText = self.CreateWidget(ui.TextLine, pos = (9, 5))
|
|
self.whatText.SetPackedFontColor(0xFFFFFFFF)
|
|
|
|
# making datetime
|
|
self.datetimeText = self.CreateWidget(ui.TextLine, pos = (405-11, 5))
|
|
self.datetimeText.SetPackedFontColor(0xFFFFFFFF)
|
|
self.datetimeText.SetHorizontalAlignCenter()
|
|
|
|
def Setup(self, data):
|
|
def GetItemName(what):
|
|
if what == 0:
|
|
return ""
|
|
item.SelectItem(what)
|
|
return item.GetItemName()
|
|
|
|
def extractPriceString(format):
|
|
if ENABLE_CHEQUE_SYSTEM:
|
|
s = format.split("|")
|
|
money = long(s[0])
|
|
cheque = long(s[1]) if len(s) > 1 else 0
|
|
price = ""
|
|
if money != 0:
|
|
price += locale.NumberToMoneyString(money)
|
|
if cheque != 0:
|
|
if price:
|
|
price += ', '
|
|
price += locale.NumberToCheque(cheque)
|
|
return price
|
|
return locale.NumberToMoneyString(long(format))
|
|
|
|
self.data = data
|
|
itemname = GetItemName(data['what'])
|
|
if data['type'] == ikashop.NOTIFICATION_SELLER_SELLER_SOLD_ITEM:
|
|
price = extractPriceString(data['format'])
|
|
message = locale.IKASHOP_PRO_NOTIFICATION_SELLER_SOLD_ITEM.format(itemname, price)
|
|
self.whatText.SetText(message)
|
|
elif data['type'] == ikashop.NOTIFICATION_SELLER_NEW_OFFER_ON_ITEM:
|
|
message = locale.IKASHOP_PRO_NOTIFICATION_SELLER_NEW_OFFER_ON_ITEM.format(itemname)
|
|
self.whatText.SetText(message)
|
|
elif data['type'] == ikashop.NOTIFICATION_SELLER_SHOP_EXPIRED:
|
|
message = locale.IKASHOP_PRO_NOTIFICATION_SELLER_SHOP_EXPIRED
|
|
self.whatText.SetText(message)
|
|
elif data['type'] == ikashop.NOTIFICATION_SELLER_ITEM_EXPIRED:
|
|
message = locale.IKASHOP_PRO_NOTIFICATION_SELLER_ITEM_EXPIRED.format(itemname)
|
|
self.whatText.SetText(message)
|
|
elif data['type'] == ikashop.NOTIFICATION_SELLER_AUCTION_NEW_OFFER:
|
|
message = locale.IKASHOP_PRO_NOTIFICATION_SELLER_AUCTION_NEW_OFFER.format(itemname)
|
|
self.whatText.SetText(message)
|
|
elif data['type'] == ikashop.NOTIFICATION_SELLER_AUCTION_EXPIRED:
|
|
message = locale.IKASHOP_PRO_NOTIFICATION_SELLER_AUCTION_EXPIRED.format(itemname)
|
|
self.whatText.SetText(message)
|
|
elif data['type'] == ikashop.NOTIFICATION_SELLER_AUCTION_SOLD:
|
|
price = long(data['format'])
|
|
message = locale.IKASHOP_PRO_NOTIFICATION_SELLER_AUCTION_SOLD.format(itemname, data['who'], locale.NumberToMoneyString(price))
|
|
self.whatText.SetText(message)
|
|
elif data['type'] == ikashop.NOTIFICATION_SELLER_OFFER_CANCELLED:
|
|
message = locale.IKASHOP_PRO_NOTIFICATION_SELLER_OFFER_CANCELLED.format(itemname)
|
|
self.whatText.SetText(message)
|
|
elif data['type'] == ikashop.NOTIFICATION_BUYER_OFFER_DENIED:
|
|
price = long(data['format'])
|
|
message = locale.IKASHOP_PRO_NOTIFICATION_BUYER_OFFER_DENIED.format(locale.NumberToMoneyString(price), itemname)
|
|
self.whatText.SetText(message)
|
|
elif data['type'] == ikashop.NOTIFICATION_BUYER_OFFER_ACCEPTED:
|
|
price = long(data['format'])
|
|
message = locale.IKASHOP_PRO_NOTIFICATION_BUYER_OFFER_ACCEPTED.format(locale.NumberToMoneyString(price), itemname)
|
|
self.whatText.SetText(message)
|
|
elif data['type'] == ikashop.NOTIFICATION_BUYER_OFFER_EXPIRED:
|
|
price = long(data['format'])
|
|
message = locale.IKASHOP_PRO_NOTIFICATION_BUYER_OFFER_EXPIRED.format(locale.NumberToMoneyString(price), itemname)
|
|
self.whatText.SetText(message)
|
|
elif data['type'] == ikashop.NOTIFICATION_BUYER_AUCTION_BUY:
|
|
price = long(data['format'])
|
|
message = locale.IKASHOP_PRO_NOTIFICATION_BUYER_AUCTION_BUY.format(itemname, locale.NumberToMoneyString(price))
|
|
self.whatText.SetText(message)
|
|
elif data['type'] == ikashop.NOTIFICATION_BUYER_AUCTION_RAISE:
|
|
message = locale.IKASHOP_PRO_NOTIFICATION_BUYER_AUCTION_RAISE.format(data['who'], itemname)
|
|
self.whatText.SetText(message)
|
|
elif data['type'] == ikashop.NOTIFICATION_BUYER_AUCTION_LOST:
|
|
price = long(data['format'])
|
|
message = locale.IKASHOP_PRO_NOTIFICATION_BUYER_AUCTION_LOST.format(data['who'], itemname, locale.NumberToMoneyString(price))
|
|
self.whatText.SetText(message)
|
|
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
if data['type'] == ikashop.NOTIFICATION_SELLER_DECORATION_EXPIRED:
|
|
self.whatText.SetText(locale.IKASHOP_ULTIMATE_NOTIFICATION_SELLER_DECORATION_EXPIRED)
|
|
|
|
self.datetimeText.SetText(DatetimeFormat(data['datetime']))
|
|
self.ShowExclamationMark() if not data['seen']\
|
|
else self.HideExclamationMark()
|
|
|
|
|
|
class IkarusShopNotificationBoard(IkarusShopListBoard):
|
|
|
|
NOTIFICATION_VIEW_COUNT = 10
|
|
|
|
def __init__(self):
|
|
super(IkarusShopNotificationBoard, self).__init__()
|
|
ikashop.LoadNotifications()
|
|
self._SettingUpBoard()
|
|
self._LoadIkarusShopNotificationBoard()
|
|
|
|
def _SettingUpBoard(self):
|
|
self.SetSize(494, 330)
|
|
self.SetTitleName(locale.IKASHOP_PRO_NOTIFICATION_BOARD_TITLE)
|
|
super(IkarusShopNotificationBoard, self)._SettingUpBoard()
|
|
|
|
def _LoadIkarusShopNotificationBoard(self):
|
|
self._LoadIkarusShopListBoard()
|
|
self._MakeListElements(IkarusShopNotificationView, self.NOTIFICATION_VIEW_COUNT)
|
|
|
|
def SetNotifications(self, notifications):
|
|
cached = ikashop.GetNotifications()
|
|
for i, notification in enumerate(notifications):
|
|
type = notification['type']
|
|
who = notification['who']
|
|
what = notification['what']
|
|
format = notification['format']
|
|
datetime = notification['datetime']
|
|
save = i == len(notifications)-1
|
|
ikashop.RegisterNotification(type, who, what, format, datetime, save)
|
|
notifications = cached + notifications
|
|
self.notifications = sorted(notifications, key = lambda val : val['datetime'], reverse=True)
|
|
self.SetElements(self.notifications)
|
|
self.Show()
|
|
self.SetTop()
|
|
|
|
def Open(self):
|
|
ikashop.SendNotificationListRequest()
|
|
|
|
def Close(self):
|
|
self.Hide()
|
|
ikashop.SendNotificationListClose()
|
|
|
|
class IkarusShopCounter(IkarusShopWindow):
|
|
def __init__(self):
|
|
super(IkarusShopCounter, self).__init__()
|
|
self._LoadIkarusShopCounter()
|
|
|
|
def _LoadIkarusShopCounter(self):
|
|
self.background = self.CreateWidget(ui.ImageBox)
|
|
self.background.LoadImage("ikashop/lite/business/counter.png")
|
|
|
|
self.counter = self.CreateWidget(ui.TextLine)
|
|
self.counter.SetOutline(1)
|
|
self.counter.SetPackedFontColor(0xFFFFFFFF)
|
|
self.counter.SetPosition(self.background.GetWidth()/2, self.background.GetHeight()/2 - 1)
|
|
self.counter.SetHorizontalAlignCenter()
|
|
self.counter.SetVerticalAlignCenter()
|
|
|
|
def SetCounter(self, count):
|
|
if count == 0:
|
|
self.Hide()
|
|
else:
|
|
self.counter.SetText(str(count) if count <= 9 else "9+")
|
|
self.Show()
|
|
|
|
class IkarusShopBusinessBoard(IkashopBoardWithTitleBar):
|
|
|
|
GRID_COLUMNS = ikashop.SHOP_GRID_WIDTH
|
|
GRID_ROWS = ikashop.SHOP_GRID_HEIGHT
|
|
PAGE_SIZE = GRID_COLUMNS * GRID_ROWS
|
|
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
PAGE_COUNT = 3
|
|
|
|
def __init__(self):
|
|
super(IkarusShopBusinessBoard, self).__init__()
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
self.selectedPage = 0
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
self.editedMarkedInfo = None
|
|
self.editedMarkedTime = None
|
|
self.editedMarkedColor = None
|
|
self.removingItemList = []
|
|
self._SettingUpBoard()
|
|
self._LoadLinkedBoards()
|
|
self._LoadShopBusinessWindow()
|
|
ikashop.SetBusinessBoard(self)
|
|
|
|
def __del__(self):
|
|
super(IkarusShopBusinessBoard, self).__del__()
|
|
ikashop.SetBusinessBoard(None)
|
|
|
|
def _SettingUpBoard(self):
|
|
self.SetSize(558, 404)
|
|
self.SetTitleName(locale.IKASHOP_BUSINESS_BOARD_TITLE)
|
|
self.SetCloseEvent(self.Close)
|
|
self.SetCenterPosition()
|
|
self.AddFlag("movable")
|
|
self.AddFlag("float")
|
|
|
|
def _LoadShopBusinessWindow(self):
|
|
# making slot box
|
|
self.slotBox = self.CreateWidget(ui.ImageBox, pos = (55,35 + 27))
|
|
self.slotBox.LoadImage("ikashop/lite/business/slot_box.png")
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
self.slotBox.SetMouseWheelEvent(self._OnScrollMouseWheel)
|
|
|
|
self.slotWindow = self.CreateWidget(ui.GridSlotWindow, parent = self.slotBox, pos = (6,6))
|
|
self.slotWindow.ArrangeSlot(0, self.GRID_COLUMNS, self.GRID_ROWS, SLOT_SIZE, SLOT_SIZE, 0, 0)
|
|
self.slotWindow.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
|
|
self.slotWindow.SetSelectEmptySlotEvent(self._OnClickEmptySlot)
|
|
self.slotWindow.SetSelectItemSlotEvent(self._OnClickItemSlot)
|
|
self.slotWindow.SetOverInItemEvent(self._ShowToolTipOnItemSlot)
|
|
self.slotWindow.SetOverOutItemEvent(self._HideToolTipOnItemSlot)
|
|
self.slotWindow.SetUnselectItemSlotEvent(self._OnRightClickItemSlot)
|
|
|
|
# making duration box
|
|
self.durationBox = self.CreateWidget(ui.ImageBox, pos = (55,35))
|
|
self.durationBox.LoadImage("ikashop/lite/business/duration_box.png")
|
|
|
|
self.durationText = self.CreateWidget(ui.TextLine, parent = self.durationBox, pos = (30, 4))
|
|
self.durationText.SetPackedFontColor(0xFFFFFFFF)
|
|
self.durationText.SetText("11d 22h 18m")
|
|
|
|
self.durationExpiredIcon = self.CreateWidget(ui.ImageBox, pos = (168 - 49, 3), parent = self.durationBox)
|
|
self.durationExpiredIcon.LoadImage("ikashop/lite/business/expired_icon.png")
|
|
|
|
self.durationIncreaseButton = self.CreateWidget(ui.Button, parent = self.durationBox, pos = (189 - 49, 3))
|
|
self.durationIncreaseButton.SetUpVisual("ikashop/lite/business/buttons/duration_up/default.png")
|
|
self.durationIncreaseButton.SetDownVisual("ikashop/lite/business/buttons/duration_up/default.png")
|
|
self.durationIncreaseButton.SetOverVisual("ikashop/lite/business/buttons/duration_up/hover.png")
|
|
self.durationIncreaseButton.SetToolTipText(locale.IKASHOP_BUSINESS_DURATION_INCREASE_BUTTON_TEXT)
|
|
self.durationIncreaseButton.SetEvent(self._OnClickDurationIncreaseButton)
|
|
self.durationIncreaseButton.ToolTipText.SetOutline(1)
|
|
|
|
# making bottom bar buttons
|
|
self.cancelShopButton = self.CreateWidget(ui.Button, pos = (604 - 92, 35))
|
|
self.cancelShopButton.SetUpVisual("ikashop/lite/business/buttons/cancel_shop/default.png")
|
|
self.cancelShopButton.SetDownVisual("ikashop/lite/business/buttons/cancel_shop/default.png")
|
|
self.cancelShopButton.SetOverVisual("ikashop/lite/business/buttons/cancel_shop/hover.png")
|
|
self.cancelShopButton.SetToolTipText(locale.IKASHOP_BUSINESS_CANCEL_SHOP_BUTTON_TEXT)
|
|
self.cancelShopButton.SAFE_SetEvent(self._OnClickCancelShopButton)
|
|
self.cancelShopButton.ToolTipText.SetOutline(1)
|
|
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
self.moveShopButton = self.CreateWidget(ui.Button, pos = (604 - 95 - self.cancelShopButton.GetWidth(), 35))
|
|
self.moveShopButton.SetUpVisual("ikashop/lite/business/buttons/move_shop/default.png")
|
|
self.moveShopButton.SetDownVisual("ikashop/lite/business/buttons/move_shop/default.png")
|
|
self.moveShopButton.SetOverVisual("ikashop/lite/business/buttons/move_shop/hover.png")
|
|
self.moveShopButton.SetToolTipText(locale.IKASHOP_PRO_BUSINESS_MOVE_SHOP_BUTTON_TEXT)
|
|
self.moveShopButton.SAFE_SetEvent(self._OnClickMoveShopButton)
|
|
self.moveShopButton.ToolTipText.SetOutline(1)
|
|
|
|
# making sidebar buttons
|
|
self.safeboxOpenButton = self.CreateWidget(ui.Button, pos = (7, 37))
|
|
self.safeboxOpenButton.SetUpVisual("ikashop/lite/business/buttons/safebox/default.png")
|
|
self.safeboxOpenButton.SetDownVisual("ikashop/lite/business/buttons/safebox/default.png")
|
|
self.safeboxOpenButton.SetOverVisual("ikashop/lite/business/buttons/safebox/hover.png")
|
|
self.safeboxOpenButton.SAFE_SetEvent(self.safeboxBoard.Toggle)
|
|
self.safeboxOpenButton.SetToolTipText(locale.IKASHOP_BUSINESS_SAFEBOX_OPEN_BUTTON_TEXT)
|
|
self.safeboxOpenButton.ToolTipText.SetOutline(1)
|
|
|
|
self.privateOfferOpenButton = self.CreateWidget(ui.Button, pos = (7, 37 + 33))
|
|
self.privateOfferOpenButton.SetUpVisual("ikashop/lite/business/buttons/offer/default.png")
|
|
self.privateOfferOpenButton.SetDownVisual("ikashop/lite/business/buttons/offer/default.png")
|
|
self.privateOfferOpenButton.SetOverVisual("ikashop/lite/business/buttons/offer/hover.png")
|
|
self.privateOfferOpenButton.SAFE_SetEvent(self.offersBoard.Toggle)
|
|
self.privateOfferOpenButton.SetToolTipText(locale.IKASHOP_BUSINESS_PRIVATE_OFFER_OPEN_BUTTON_TEXT)
|
|
self.privateOfferOpenButton.ToolTipText.SetOutline(1)
|
|
|
|
self.auctionOpenButton = self.CreateWidget(ui.Button, pos = (7, 37 + 33*2))
|
|
self.auctionOpenButton.SetUpVisual("ikashop/lite/business/buttons/auction/default.png")
|
|
self.auctionOpenButton.SetDownVisual("ikashop/lite/business/buttons/auction/default.png")
|
|
self.auctionOpenButton.SetOverVisual("ikashop/lite/business/buttons/auction/hover.png")
|
|
self.auctionOpenButton.SAFE_SetEvent(self.auctionBoard.Toggle)
|
|
self.auctionOpenButton.SetToolTipText(locale.IKASHOP_BUSINESS_AUCTION_OPEN_BUTTON_TEXT)
|
|
self.auctionOpenButton.ToolTipText.SetOutline(1)
|
|
|
|
self.safeboxItemCounter = self.CreateWidget(IkarusShopCounter, pos = (25, 0), parent = self.safeboxOpenButton)
|
|
self.privateOfferCounter = self.CreateWidget(IkarusShopCounter, pos = (25, 0), parent = self.privateOfferOpenButton)
|
|
self.auctionOfferCounter = self.CreateWidget(IkarusShopCounter, pos = (25, 0), parent = self.auctionOpenButton)
|
|
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
self.notificationOpenButton = self.CreateWidget(ui.Button, pos = (7, 352+12))
|
|
self.notificationOpenButton.SetUpVisual("ikashop/pro/business/buttons/notification/default.png")
|
|
self.notificationOpenButton.SetDownVisual("ikashop/pro/business/buttons/notification/default.png")
|
|
self.notificationOpenButton.SetOverVisual("ikashop/pro/business/buttons/notification/hover.png")
|
|
self.notificationOpenButton.SAFE_SetEvent(self.notificationBoard.Toggle)
|
|
self.notificationOpenButton.SetToolTipText(locale.IKASHOP_PRO_BUSINESS_NOTIFICATION_OPEN_BUTTON_TEXT)
|
|
self.notificationOpenButton.ToolTipText.SetOutline(1)
|
|
|
|
self.notificationCounter = self.CreateWidget(IkarusShopCounter, pos = (25, 0), parent = self.notificationOpenButton)
|
|
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
self.decorationBox = self.CreateWidget(ui.ImageBox, pos = (327+19, 35))
|
|
self.decorationBox.LoadImage("ikashop/ultimate/decoration_box.png")
|
|
|
|
self.decorationTime = self.CreateWidget(ui.TextLine, pos = (28, 5), parent = self.decorationBox)
|
|
self.decorationTime.SetPackedFontColor(0xFFFFFFFF)
|
|
|
|
self.lockedCells = []
|
|
for i in xrange(self.PAGE_SIZE):
|
|
col, row = i % self.GRID_COLUMNS, i // self.GRID_COLUMNS
|
|
lock = self.CreateWidget(ui.ImageBox, pos = (6 + 32*col,6 + 32*row), parent = self.slotBox, show = 0)
|
|
lock.LoadImage("ikashop/ultimate/lock_slot.png")
|
|
self.lockedCells.append(lock)
|
|
|
|
# making page selection box
|
|
self.selectPageButtons = []
|
|
for i in xrange(self.PAGE_COUNT):
|
|
selectPageButton = self.CreateWidget(ui.Button, pos = (269 - 48 + i*41, 35))
|
|
selectPageButton.SetUpVisual("ikashop/lite/safebox/buttons/select_page/default.png")
|
|
selectPageButton.SetDownVisual("ikashop/lite/safebox/buttons/select_page/default.png")
|
|
selectPageButton.SetOverVisual("ikashop/lite/safebox/buttons/select_page/hover.png")
|
|
selectPageButton.SetDisableVisual("ikashop/lite/safebox/buttons/select_page/disabled.png")
|
|
selectPageButton.SetText(RomeNumber(i+1))
|
|
selectPageButton.SAFE_SetEvent(self._OnSelectPage, i)
|
|
self.selectPageButtons.append(selectPageButton)
|
|
|
|
def _LoadLinkedBoards(self):
|
|
self.safeboxBoard = IkarusShopSafeboxBoard()
|
|
self.auctionBoard = IkarusShopAuctionOwnerBoard()
|
|
self.offersBoard = IkarusShopOffersBoard()
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
self.notificationBoard = IkarusShopNotificationBoard()
|
|
|
|
# HANDLING DURATION RESTORE PROCESS
|
|
def _OnClickDurationIncreaseButton(self):
|
|
# checking cash
|
|
if player.GetElk() < RESTORE_DURATION_COST:
|
|
self.OpenPopupDialog(locale.IKASHOP_BUSINESS_INCREASE_DURATION_NO_MONEY)
|
|
return
|
|
|
|
# opening question
|
|
question = locale.IKASHOP_BUSINESS_INCREASE_DURATION_QUESTION.format(locale.NumberToMoneyString(RESTORE_DURATION_COST))
|
|
self.OpenQuestionDialog(question, self._OnIncreaseDurationQuestionAccept)
|
|
|
|
def _OnIncreaseDurationQuestionAccept(self):
|
|
ikashop.SendShopCreate()
|
|
self.questionDialog.Hide()
|
|
|
|
# HANDLING INSERT ITEM PROCESS
|
|
def _OnClickEmptySlot(self, slot):
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
slot = self._LocalToGlobalSlot(slot)
|
|
|
|
if mouse.mouseController.isAttached():
|
|
attachedType = mouse.mouseController.GetAttachedType()
|
|
attachedItemIndex = mouse.mouseController.GetAttachedItemIndex()
|
|
attachedItemSlotPos = mouse.mouseController.GetAttachedSlotNumber()
|
|
mouse.mouseController.DeattachObject()
|
|
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
if attachedType == player.SLOT_TYPE_OFFLINESHOP:
|
|
ikashop.SendShopMoveItem(attachedItemSlotPos, slot)
|
|
return
|
|
|
|
# validating attached item
|
|
if attachedType in (player.SLOT_TYPE_DRAGON_SOUL_INVENTORY, player.SLOT_TYPE_INVENTORY):
|
|
win, pos = player.SlotTypeToInvenType(attachedType), attachedItemSlotPos
|
|
if player.ITEM_MONEY != attachedItemIndex:
|
|
self.InsertItemInSlot(win, pos, slot)
|
|
|
|
def InsertItemInSlot(self, win, pos, slot = None):
|
|
# checking shop isn't expired
|
|
if self.shopInfo['duration'] <= 0:
|
|
self.OpenPopupDialog(locale.IKASHOP_BUSINESS_CANNOT_SELL_ITEM_EXPIRED_SHOP)
|
|
return
|
|
|
|
# checking item antiflags
|
|
itemIndex = player.GetItemIndex(win, pos)
|
|
itemCount = player.GetItemCount(win, pos)
|
|
|
|
if itemIndex != 0:
|
|
item.SelectItem(itemIndex)
|
|
# checking item antifalg
|
|
if item.IsAntiFlag(item.ANTIFLAG_GIVE) or item.IsAntiFlag(item.ANTIFLAG_MYSHOP):
|
|
self.OpenPopupDialog(locale.IKASHOP_BUSINESS_CANNOT_SELL_ITEM)
|
|
return
|
|
|
|
# autodetecting price
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
itemHash = GetInventoryItemHash(win, pos)
|
|
detectedPrice = ikashop.GetItemPriceCache(itemIndex, itemHash, itemCount)
|
|
isFastCall = slot == None # <- slot is None while calling it from inventory
|
|
|
|
# autodetecting empty slot
|
|
items = [(sitem['vnum'], sitem['cell']) for sitem in self.shopInfo['items'].values()]
|
|
if slot == None:
|
|
slot = ikashop.GetFirstEmptyCell(item.GetItemSize()[1], items)
|
|
|
|
# checking for busy space
|
|
if slot == None:
|
|
self.OpenPopupDialog(locale.IKASHOP_BUSINESS_CANNOT_SELL_ITEM_NO_SPACE)
|
|
|
|
# checking shop space
|
|
else:
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
if not ikashop.CheckShopSpace(items, itemIndex, slot, self.shopInfo['lock']):
|
|
return
|
|
else:
|
|
if not ikashop.CheckShopSpace(items, itemIndex, slot):
|
|
return
|
|
|
|
# caching inserting item info
|
|
self.insertingPriceInfo = slot, win, pos
|
|
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
# checking price is already available
|
|
if isFastCall and detectedPrice:
|
|
price = detectedPrice['value'],
|
|
if ENABLE_CHEQUE_SYSTEM:
|
|
price += detectedPrice['cheque'],
|
|
ikashop.SendAddItem(win, pos, slot, *price)
|
|
return
|
|
|
|
# opening money input dialog
|
|
kargs = detectedPrice if detectedPrice else {}
|
|
self.priceCacheInfo = itemIndex, itemHash, itemCount
|
|
self.OpenMoneyInputDialog(self._OnAcceptInsertingItemPrice, **kargs)
|
|
|
|
else:
|
|
self.OpenMoneyInputDialog(self._OnAcceptInsertingItemPrice)
|
|
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
ikashop.SendPriceAverageRequest(itemIndex, itemCount)
|
|
self.moneyInputDialog.SetPriceAverage(-1)
|
|
|
|
def _OnAcceptInsertingItemPrice(self):
|
|
self.moneyInputDialog.SoftClose()
|
|
|
|
ok, price = ExtractInputPrice(self.moneyInputDialog)
|
|
if not ok:
|
|
self.OpenPopupDialog(locale.IKASHOP_BUSINESS_INVALID_ITEM_PRICE)
|
|
return
|
|
|
|
# sending add item
|
|
dest, win, slot = self.insertingPriceInfo
|
|
ikashop.SendAddItem(win, slot, dest, *price)
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
# registering item price into price cache
|
|
vnum, hash, count = self.priceCacheInfo
|
|
ikashop.RegisterItemPriceCache(vnum, hash, count, *price)
|
|
return True
|
|
|
|
# HANDLING EDIT PRICE/ REMOVE ITEM
|
|
def _OnClickItemSlot(self, slot):
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
if mouse.mouseController.isAttached():
|
|
return
|
|
slot = self._LocalToGlobalSlot(slot)
|
|
|
|
# checking item does exists
|
|
if slot in self.shopInfo['items']:
|
|
data = self.shopInfo['items'][slot]
|
|
|
|
# checking for edit item request
|
|
if IsPressingSHIFT():
|
|
self.insertingPriceInfo = data
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
self.insertingPriceAllSimilar = False
|
|
detectPrice = ikashop.GetItemPriceCache(data['vnum'], data['hash'], data['count'])
|
|
kargs = detectPrice if detectPrice else {}
|
|
self.OpenMoneyInputDialog(self._OnAcceptEditingItemPrice, **kargs)
|
|
else:
|
|
self.OpenMoneyInputDialog(self._OnAcceptEditingItemPrice)
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
self.moneyInputDialog.SetPriceAverage(data['priceavg'])
|
|
return
|
|
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
# checking for edit all similar items
|
|
if IsPressingCTRL():
|
|
self.insertingPriceInfo = data
|
|
self.insertingPriceAllSimilar = True
|
|
detectPrice = ikashop.GetItemPriceCache(data['vnum'], data['hash'], data['count'])
|
|
kargs = detectPrice if detectPrice else {}
|
|
self.OpenMoneyInputDialog(self._OnAcceptEditingItemPrice, **kargs)
|
|
self.SetEditedMarkedSlotInfo(data['vnum'], data['count'], data['hash'], (0.7, 0.7, 0.7), infinite=1)
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
self.moneyInputDialog.SetPriceAverage(data['priceavg'])
|
|
return
|
|
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
# attaching the item
|
|
mouse.mouseController.AttachObject(self, player.SLOT_TYPE_OFFLINESHOP, slot, data['vnum'], data['count'])
|
|
|
|
|
|
def _OnRightClickItemSlot(self, slot):
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
slot = self._LocalToGlobalSlot(slot)
|
|
if mouse.mouseController.isAttached():
|
|
return
|
|
|
|
# checking item does exists
|
|
if slot in self.shopInfo['items']:
|
|
data = self.shopInfo['items'][slot]
|
|
|
|
# checking for remove all similar items
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
if IsPressingCTRL():
|
|
self.removingVnum = data['vnum']
|
|
item.SelectItem(self.removingVnum)
|
|
question = locale.IKASHOP_PRO_BUSINESS_REMOVE_ALL_SIMILAR_ITEMS_QUESTION.format(item.GetItemName())
|
|
self.OpenQuestionDialog(question, self._OnAcceptRemoveAllSimilarItems)
|
|
|
|
# marking all removing items
|
|
for slot, data in self.shopInfo['items'].items():
|
|
if data['vnum'] == self.removingVnum:
|
|
self.AppendRemovingItemSlot(slot)
|
|
self._RefreshItems()
|
|
return
|
|
|
|
# starting edit item price process
|
|
ikashop.SendRemoveItem(data['id'])
|
|
|
|
def _OnAcceptRemoveAllSimilarItems(self):
|
|
self.questionDialog.Hide()
|
|
for item in self.shopInfo['items'].values():
|
|
if item['vnum'] == self.removingVnum:
|
|
ikashop.SendRemoveItem(item['id'])
|
|
|
|
def _OnAcceptEditingItemPrice(self):
|
|
self.moneyInputDialog.SoftClose()
|
|
ok, price = ExtractInputPrice(self.moneyInputDialog)
|
|
if not ok:
|
|
self.OpenPopupDialog(locale.IKASHOP_BUSINESS_INVALID_ITEM_PRICE)
|
|
return
|
|
|
|
# sending edit item
|
|
data = self.insertingPriceInfo
|
|
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
# registering price into price cache
|
|
ikashop.RegisterItemPriceCache(data['vnum'], data['hash'], data['count'], *price)
|
|
# editing all item prices
|
|
if self.insertingPriceAllSimilar:
|
|
for checkData in self.shopInfo['items'].values():
|
|
if data['hash'] == checkData['hash'] and data['count'] == checkData['count'] and data['vnum'] == checkData['vnum']:
|
|
if price[0] != checkData['price'] or (ENABLE_CHEQUE_SYSTEM and price[1] != checkData['cheque']):
|
|
ikashop.SendEditItem(checkData['id'], *price)
|
|
self.SetEditedMarkedSlotInfo(data['vnum'], data['count'], data['hash'], (0.5, 0.5, 0.1), price = price)
|
|
else:
|
|
ikashop.SendEditItem(data['id'], *price)
|
|
|
|
else:
|
|
ikashop.SendEditItem(data['id'], *price)
|
|
|
|
return True
|
|
|
|
# HANDLING TOOLTIP OVER IN OVER OUT
|
|
def _ShowToolTipOnItemSlot(self, slot):
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
slot = self._LocalToGlobalSlot(slot)
|
|
|
|
if slot in self.shopInfo['items']:
|
|
data = self.shopInfo['items'][slot]
|
|
tooltip = self.GetToolTip()
|
|
tooltip.ClearToolTip()
|
|
tooltip.AddItemData(data['vnum'], data['sockets'], data['attrs'])
|
|
if 'price' in data and data['price'] != 0:
|
|
tooltip.AppendPrice(data['price'])
|
|
if 'cheque' in data and data['cheque'] != 0:
|
|
tooltip.AppendCheque(data['cheque'])
|
|
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
tooltip.AppendTextLine(locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_NOT_AVAILABLE) if data['priceavg'] == 0 \
|
|
else tooltip.AppendTextLine(locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_VALUE.format(locale.NumberToMoneyString(data['priceavg'])))
|
|
|
|
# checking shop isn't expired
|
|
tooltip.AppendTextLine(locale.IKASHOP_BUSINESS_EDIT_ITEM_TOOLTIP)
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
tooltip.AppendTextLine(locale.IKASHOP_PRO_BUSINESS_EDIT_ALL_SIMILAR_ITEM_TOOLTIP)
|
|
tooltip.AppendTextLine(locale.IKASHOP_BUSINESS_REMOVE_ITEM_TOOLTIP)
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
tooltip.AppendTextLine(locale.IKASHOP_PRO_BUSINESS_REMOVE_ALL_SIMILAR_ITEM_TOOLTIP)
|
|
tooltip.ShowToolTip()
|
|
|
|
def _HideToolTipOnItemSlot(self, slot=0):
|
|
tooltip = self.GetToolTip()
|
|
tooltip.ClearToolTip()
|
|
tooltip.HideToolTip()
|
|
|
|
# HANDLING CANCEL SHOP REQUEST
|
|
def _OnClickCancelShopButton(self):
|
|
self.OpenQuestionDialog(locale.IKASHOP_BUSINESS_CANCEL_SHOP_QUESTION, self._OnAcceptCancelShopQuestion)
|
|
|
|
def _OnAcceptCancelShopQuestion(self):
|
|
self.questionDialog.Hide()
|
|
ikashop.SendForceCloseShop()
|
|
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
# HANDLING MOVE SHOP REQUEST
|
|
def _OnClickMoveShopButton(self):
|
|
# checking money
|
|
if player.GetElk() < MOVE_SHOP_ENTITY_COST:
|
|
self.OpenPopupDialog(locale.IKASHOP_PRO_BUSINESS_MOVE_SHOP_NO_MONEY)
|
|
return
|
|
# sending question
|
|
message = locale.IKASHOP_PRO_BUSINESS_MOVE_SHOP_QUESTION.format(locale.NumberToMoneyString(MOVE_SHOP_ENTITY_COST))
|
|
self.OpenQuestionDialog(message, self._OnAcceptMoveShopQuestion)
|
|
|
|
def _OnAcceptMoveShopQuestion(self):
|
|
self.questionDialog.Hide()
|
|
ikashop.SendMoveShopEntity()
|
|
|
|
# HANDLING AUCTION CREATION
|
|
def _OnAcceptCreateAuctionQuestion(self):
|
|
self.questionDialog.Hide()
|
|
|
|
if not hasattr(self, "createAuctionDialog"):
|
|
self.createAuctionDialog = IkarusCreateAuctionDialog()
|
|
self._RegisterDialog(self.createAuctionDialog)
|
|
|
|
self.createAuctionDialog.Open()
|
|
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
def _LocalToGlobalSlot(self, pos):
|
|
return self.selectedPage * self.PAGE_SIZE + pos
|
|
|
|
def _GlobalToLocalSlot(self, pos):
|
|
return pos % self.PAGE_SIZE
|
|
|
|
def _RefreshItems(self):
|
|
# resetting slots
|
|
for i in xrange(self.GRID_COLUMNS*self.GRID_ROWS):
|
|
self.slotWindow.ClearSlot(i)
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
self.slotWindow.DeactivateSlot(i)
|
|
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
for i in xrange(self.PAGE_SIZE):
|
|
self.lockedCells[i].Hide()
|
|
|
|
scell = self.PAGE_SIZE * self.selectedPage
|
|
ecell = scell + self.PAGE_SIZE
|
|
|
|
for cell in xrange(scell, ecell):
|
|
if cell >= self.shopInfo['lock']:
|
|
self.lockedCells[self._GlobalToLocalSlot(cell)].Show()
|
|
|
|
for cell in xrange(scell, ecell):
|
|
if cell in self.shopInfo['items']:
|
|
item = self.shopInfo['items'][cell]
|
|
pos = self._GlobalToLocalSlot(cell)
|
|
self.slotWindow.SetItemSlot(pos, item['vnum'], item['count'] if item['count'] > 1 else 0)
|
|
|
|
else:
|
|
# setting up slots
|
|
for item in self.shopInfo['items'].values():
|
|
self.slotWindow.SetItemSlot(item['cell'], item['vnum'], item['count'] if item['count'] > 1 else 0)
|
|
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
self._RefreshMarkedSlots()
|
|
|
|
self.slotWindow.RefreshSlot()
|
|
|
|
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
def _RefreshMarkedSlots(self):
|
|
# marking edited items
|
|
actualTime = app.GetTime()
|
|
if self.editedMarkedInfo != None and self.editedMarkedTime != None:
|
|
if self.editedMarkedTime > actualTime or self.editedMarkedTime == -1:
|
|
vnum, count, hash, price = self.editedMarkedInfo
|
|
for i in xrange(self.PAGE_SIZE):
|
|
slot = i
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
slot = self._LocalToGlobalSlot(i)
|
|
|
|
if slot in self.shopInfo['items']:
|
|
data = self.shopInfo['items'][slot]
|
|
if (data['vnum'], data['count'], data['hash']) == (vnum, count, hash):
|
|
if ENABLE_CHEQUE_SYSTEM:
|
|
itemPrice = (data['price'], data['cheque'])
|
|
else:
|
|
itemPrice = data['price'],
|
|
if price is None or itemPrice == price:
|
|
self.slotWindow.ActivateSlot(i, *self.editedMarkedColor)
|
|
|
|
# marking removing items
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
shownCellStart = self.selectedPage * self.PAGE_SIZE
|
|
shownCellEnd = shownCellStart + self.PAGE_SIZE
|
|
for slot in self.removingItemList:
|
|
if slot >= shownCellStart and slot < shownCellEnd:
|
|
local = self._GlobalToLocalSlot(slot)
|
|
self.slotWindow.ActivateSlot(local, 0.5, 0.1, 0.1)
|
|
|
|
else:
|
|
for slot in self.removingItemList:
|
|
self.slotWindow.ActivateSlot(slot, 0.5, 0.1, 0.1)
|
|
|
|
|
|
# PUBLIC INTERFACE
|
|
def Open(self):
|
|
ikashop.SendOpenShopOwner()
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
player.RefreshInventory()
|
|
|
|
def Close(self):
|
|
self.Hide()
|
|
ikashop.SendCloseMyShopBoard()
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
player.RefreshInventory()
|
|
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
def AppendRemovingItemSlot(self, slot):
|
|
if not slot in self.removingItemList:
|
|
self.removingItemList.append(slot)
|
|
|
|
def SetEditedMarkedSlotInfo(self, vnum, count, hash, color, infinite = 0, price = None):
|
|
self.editedMarkedInfo = vnum, count, hash, price
|
|
self.editedMarkedTime = app.GetTime() + 20.0 if not infinite else -1
|
|
self.editedMarkedColor = color
|
|
self._RefreshItems()
|
|
|
|
def OnUpdate(self):
|
|
# checking for edited item list
|
|
if self.editedMarkedTime != None and self.editedMarkedTime != -1 and self.editedMarkedTime < app.GetTime():
|
|
self.editedMarkedTime = None
|
|
self.editedMarkedInfo = None
|
|
self._RefreshItems()
|
|
|
|
# checking for closed money input dialog
|
|
if self.editedMarkedInfo != None and self.editedMarkedTime == -1 and not self.moneyInputDialog.IsShow():
|
|
self.editedMarkedTime = None
|
|
self.editedMarkedInfo = None
|
|
self._RefreshItems()
|
|
|
|
# checking for removing item list
|
|
if self.removingItemList:
|
|
if not self.questionDialog.IsShow():
|
|
self.removingItemList = []
|
|
self._RefreshItems()
|
|
|
|
def IsCreatingAuction(self):
|
|
return hasattr(self, "createAuctionDialog") and self.createAuctionDialog.IsShow()
|
|
|
|
# BINARY CALLS
|
|
def OpenShopOwner(self, data):
|
|
# refreshing duration
|
|
if data['duration'] > 0:
|
|
self.durationText.SetText(locale.SecondToDHM(data['duration']*60))
|
|
self.durationExpiredIcon.Hide()
|
|
if not app.EXTEND_IKASHOP_ULTIMATE:
|
|
self.durationIncreaseButton.Hide()
|
|
else:
|
|
self.durationText.SetText(locale.IKASHOP_BUSINESS_SHOP_EXPIRED_DURATION)
|
|
self.durationExpiredIcon.Show()
|
|
self.durationIncreaseButton.Show()
|
|
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
self.decorationBox.Show() if data['decoration'] != 0\
|
|
else self.decorationBox.Hide()
|
|
self.decorationTime.SetText(locale.SecondToDHM(data['decoration_time']*60))
|
|
|
|
|
|
# ordering items by cell and storing info
|
|
data['items'] = { item['cell'] : item for item in data['items'] }
|
|
self.shopInfo = data
|
|
|
|
self._RefreshItems()
|
|
|
|
if not self.IsShow():
|
|
self.Show()
|
|
self.SetTop()
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
self._OnSelectPage(0)
|
|
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
player.RefreshInventory()
|
|
|
|
def OpenShopOwnerEmpty(self):
|
|
# refreshing duration
|
|
self.durationText.SetText(locale.IKASHOP_BUSINESS_SHOP_EXPIRED_DURATION)
|
|
self.durationExpiredIcon.Show()
|
|
self.durationIncreaseButton.Show()
|
|
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
self.decorationBox.Hide()
|
|
|
|
# resetting slots
|
|
for i in xrange(self.GRID_COLUMNS*self.GRID_ROWS):
|
|
self.slotWindow.ClearSlot(i)
|
|
self.slotWindow.RefreshSlot()
|
|
|
|
# making shop info data
|
|
self.shopInfo = {'duration' : 0, 'items' : {}}
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
self.shopInfo['lock'] = ikashop.OFFSHOP_LOCK_INDEX_INIT
|
|
|
|
if not self.IsShow():
|
|
self.Show()
|
|
self.SetTop()
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
self._OnSelectPage(0)
|
|
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
player.RefreshInventory()
|
|
|
|
def ShopOwnerRemoveItem(self, itemid):
|
|
if 'items' in self.shopInfo:
|
|
self.shopInfo['items'] = {cell:item for cell,item in self.shopInfo['items'].items() if item['id'] != itemid}
|
|
self._RefreshItems()
|
|
|
|
def ShopOwnerEditItem(self, itemid, prices):
|
|
if 'items' in self.shopInfo:
|
|
for data in self.shopInfo['items'].values():
|
|
if data['id'] == itemid:
|
|
data['price'] = prices['price']
|
|
if prices.has_key('cheque'):
|
|
data['cheque'] = prices['cheque']
|
|
self._RefreshItems()
|
|
break
|
|
|
|
def SetupSafebox(self, yang, items):
|
|
self.safeboxBoard.Setup(yang, items)
|
|
|
|
def SafeboxRemoveItem(self, itemid):
|
|
self.safeboxBoard.RemoveItem(itemid)
|
|
|
|
def SafeboxAddItem(self, item):
|
|
self.safeboxBoard.AddItem(item)
|
|
|
|
def SetupAcutionOwner(self, data):
|
|
self.auctionBoard.Setup(data)
|
|
|
|
def OpenCreateAuctionQuestion(self):
|
|
question = locale.IKASHOP_BUSINESS_NO_AUCTION_CREATE_AUCTION_QUESTION
|
|
self.OpenQuestionDialog(question, self._OnAcceptCreateAuctionQuestion)
|
|
|
|
def AuctionInsertItemInSlot(self, win, pos):
|
|
self.createAuctionDialog.InsertItemInSlot(win, pos)
|
|
|
|
def SetOffers(self, offers):
|
|
self.offersBoard.SetOffers(offers)
|
|
|
|
def SetSafeboxCounter(self, count):
|
|
self.safeboxItemCounter.SetCounter(count)
|
|
|
|
def SetAuctionCounter(self, count):
|
|
self.auctionOfferCounter.SetCounter(count)
|
|
|
|
def SetOffersCounter(self, count):
|
|
self.privateOfferCounter.SetCounter(count)
|
|
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
def SetNotificationCounter(self, count):
|
|
self.notificationCounter.SetCounter(count)
|
|
|
|
def SetNotifications(self, notifications):
|
|
self.notificationBoard.SetNotifications(notifications)
|
|
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
def SetPriceAverage(self, price):
|
|
if hasattr(self, "moneyInputDialog"):
|
|
self.moneyInputDialog.SetPriceAverage(price)
|
|
if hasattr(self, "createAuctionDialog"):
|
|
if hasattr(self.createAuctionDialog, "moneyInputDialog"):
|
|
self.createAuctionDialog.moneyInputDialog.SetPriceAverage(price)
|
|
|
|
def _OnSelectPage(self, page):
|
|
self.selectedPage = page
|
|
for idx, button in enumerate(self.selectPageButtons):
|
|
button.Disable() if idx == page else button.Enable()
|
|
self._RefreshItems()
|
|
|
|
def _OnScrollMouseWheel(self, delta):
|
|
if delta > 0:
|
|
if self.selectedPage > 0:
|
|
self._OnSelectPage(self.selectedPage-1)
|
|
else:
|
|
if self.selectedPage + 1 < self.PAGE_COUNT:
|
|
self._OnSelectPage(self.selectedPage+1)
|
|
return True
|
|
|
|
def ServerPopupMessage(self, message):
|
|
message = getattr(locale, message, message)
|
|
self.OpenPopupDialog(message)
|
|
|
|
class IkarusShopGuestBoard(IkashopBoardWithTitleBar):
|
|
|
|
GRID_COLUMNS = ikashop.SHOP_GRID_WIDTH
|
|
GRID_ROWS = ikashop.SHOP_GRID_HEIGHT
|
|
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
PAGE_COUNT = 3
|
|
PAGE_SIZE = GRID_COLUMNS * GRID_ROWS
|
|
|
|
def __init__(self):
|
|
super(IkarusShopGuestBoard, self).__init__()
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
self.selectedPage = 0
|
|
self.lockImages = []
|
|
self.markedInfo = None
|
|
self._SettingUpBoard()
|
|
self._LoadIkarusShopGuestBoard()
|
|
|
|
def _SettingUpBoard(self):
|
|
self.SetSize(508, 404)
|
|
self.SetCloseEvent(self.Close)
|
|
self.AddFlag("movable")
|
|
self.AddFlag("float")
|
|
self.SetCenterPosition()
|
|
x,y = self.GetLocalPosition()
|
|
self.SetPosition(x+100,y)
|
|
|
|
def _LoadIkarusShopGuestBoard(self):
|
|
# making slot box
|
|
self.slotBox = self.CreateWidget(ui.ImageBox, pos = (5,35 + 27))
|
|
self.slotBox.LoadImage("ikashop/lite/business/slot_box.png")
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
self.slotBox.SetMouseWheelEvent(self._OnScrollMouseWheel)
|
|
|
|
self.slotWindow = self.CreateWidget(ui.GridSlotWindow, parent = self.slotBox, pos = (6,6))
|
|
self.slotWindow.ArrangeSlot(0, self.GRID_COLUMNS, self.GRID_ROWS, SLOT_SIZE, SLOT_SIZE, 0, 0)
|
|
self.slotWindow.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
|
|
self.slotWindow.SetSelectItemSlotEvent(self._OnClickItemSlot)
|
|
self.slotWindow.SetOverInItemEvent(self._ShowToolTipOnItemSlot)
|
|
self.slotWindow.SetOverOutItemEvent(self._HideToolTipOnItemSlot)
|
|
|
|
# making duration box
|
|
self.durationBox = self.CreateWidget(ui.ImageBox, pos = (5,35))
|
|
self.durationBox.LoadImage("ikashop/lite/business/duration_box.png")
|
|
|
|
self.durationText = self.CreateWidget(ui.TextLine, parent = self.durationBox, pos = (30, 4))
|
|
self.durationText.SetPackedFontColor(0xFFFFFFFF)
|
|
self.durationText.SetText("11d 22h 18m")
|
|
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
self.lockedCells = []
|
|
for i in xrange(self.PAGE_SIZE):
|
|
col, row = i % self.GRID_COLUMNS, i // self.GRID_COLUMNS
|
|
lock = self.CreateWidget(ui.ImageBox, pos = (6 + 32*col,6 + 32*row), parent = self.slotBox, show = 0)
|
|
lock.LoadImage("ikashop/ultimate/lock_slot.png")
|
|
self.lockedCells.append(lock)
|
|
|
|
# making page selection box
|
|
self.selectPageButtons = []
|
|
for i in xrange(self.PAGE_COUNT):
|
|
selectPageButton = self.CreateWidget(ui.Button, pos = (269 - 48 + i*41, 35))
|
|
selectPageButton.SetUpVisual("ikashop/lite/safebox/buttons/select_page/default.png")
|
|
selectPageButton.SetDownVisual("ikashop/lite/safebox/buttons/select_page/default.png")
|
|
selectPageButton.SetOverVisual("ikashop/lite/safebox/buttons/select_page/hover.png")
|
|
selectPageButton.SetDisableVisual("ikashop/lite/safebox/buttons/select_page/disabled.png")
|
|
selectPageButton.SetText(RomeNumber(i+1))
|
|
selectPageButton.SAFE_SetEvent(self._OnSelectPage, i)
|
|
self.selectPageButtons.append(selectPageButton)
|
|
|
|
def _OnClickItemSlot(self, slot):
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
slot = self._LocalToGlobalSlot(slot)
|
|
|
|
if slot in self.shopInfo['items']:
|
|
data = self.shopInfo['items'][slot]
|
|
|
|
# making item name
|
|
item.SelectItem(data['vnum'])
|
|
itemName = item.GetItemName()
|
|
if data['count'] > 1:
|
|
itemName += "({})".format(data['count'])
|
|
|
|
# making item price
|
|
if ENABLE_CHEQUE_SYSTEM:
|
|
itemPrice = ""
|
|
if data['price'] != 0:
|
|
itemPrice += locale.NumberToMoneyString(data['price'])
|
|
if data['cheque'] != 0:
|
|
if itemPrice:
|
|
itemPrice += ', '
|
|
itemPrice += locale.NumberToCheque(data['cheque'])
|
|
else:
|
|
itemPrice = locale.NumberToMoneyString(data['price'])
|
|
|
|
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
if IsPressingCTRL():
|
|
item.SelectItem(data['vnum'])
|
|
|
|
# making message
|
|
message = locale.IKASHOP_PRO_SHOP_GUEST_BUY_ALL_ITEMS_QUESTION.format(itemName, itemPrice)
|
|
self.buyAllInfo = data['vnum'], data['count'], data['price']
|
|
self.OpenQuestionDialog(message, self._OnAcceptBuyAllQuestion)
|
|
return
|
|
|
|
if IsPressingSHIFT():
|
|
# checking offer min price
|
|
if data['price'] + data.get('cheque', 0) * YANG_PER_CHEQUE < 10000:
|
|
self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_MAKE_OFFER_ITEM_PRICE_TOO_LOW)
|
|
return
|
|
|
|
self.offerInfo = data['id'], data['price'], data.get('cheque', 0)
|
|
self.OpenMoneyInputDialog(self._OnAcceptMakeOfferInput)
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
self.moneyInputDialog.SetPriceAverage(data['priceavg'])
|
|
return
|
|
|
|
self.buyItemInfo = self.shopInfo['id'], data['id'], data['price'] + data.get('cheque', 0) * YANG_PER_CHEQUE
|
|
message = locale.IKASHOP_SHOP_GUEST_BUY_ITEM_QUESTION.format(itemName, itemPrice)
|
|
self.OpenQuestionDialog(message, self._OnAcceptBuyItemQuestion)
|
|
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
def _OnAcceptBuyAllQuestion(self):
|
|
self.questionDialog.Hide()
|
|
for data in self.shopInfo['items'].values():
|
|
if (data['vnum'], data['count'], data['price']) == self.buyAllInfo:
|
|
ikashop.SendBuyItem(self.shopInfo['id'], data['id'], data['price'] + data.get('cheque', 0) * YANG_PER_CHEQUE)
|
|
|
|
def _OnAcceptBuyItemQuestion(self):
|
|
ikashop.SendBuyItem(*self.buyItemInfo)
|
|
self.questionDialog.Hide()
|
|
|
|
def _OnAcceptMakeOfferInput(self):
|
|
self.moneyInputDialog.SoftClose()
|
|
|
|
# validating value
|
|
ok, value = ExtractInputPrice(self.moneyInputDialog)
|
|
if not ok:
|
|
self.OpenPopupDialog(locale.IKASHOP_BUSINESS_INVALID_ITEM_PRICE)
|
|
return
|
|
|
|
# checking for max offer price
|
|
id, price, cheque = self.offerInfo
|
|
|
|
if ENABLE_CHEQUE_SYSTEM:
|
|
valueTotal = value[0] + value[1] * YANG_PER_CHEQUE
|
|
priceTotal = price + cheque * YANG_PER_CHEQUE
|
|
if valueTotal >= priceTotal:
|
|
self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_MUST_BE_LOWER_THAN_PRICE)
|
|
return True
|
|
|
|
# checking for min offer price
|
|
minoffer = priceTotal * MIN_OFFER_PCT / 100
|
|
if valueTotal < minoffer:
|
|
self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_MUST_BE_HIGHER_THAN_PCT_OF_PRICE.format(MIN_OFFER_PCT))
|
|
return True
|
|
|
|
# checking owned cash
|
|
if value[0] > player.GetElk() or value[1] > player.GetCheque():
|
|
self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_NOT_ENOUGH_MONEY)
|
|
return True
|
|
|
|
else:
|
|
if value[0] >= price:
|
|
self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_MUST_BE_LOWER_THAN_PRICE)
|
|
return True
|
|
|
|
# checking for min offer price
|
|
minoffer = price * MIN_OFFER_PCT / 100
|
|
if value[0] < minoffer:
|
|
self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_MUST_BE_HIGHER_THAN_PCT_OF_PRICE.format(MIN_OFFER_PCT))
|
|
return True
|
|
|
|
# checking owned cash
|
|
if value[0] > player.GetElk():
|
|
self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_NOT_ENOUGH_MONEY)
|
|
return True
|
|
|
|
ikashop.SendOfferCreate(self.shopInfo['id'], id, *value)
|
|
return True
|
|
|
|
def _ShowToolTipOnItemSlot(self, slot):
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
slot = self._LocalToGlobalSlot(slot)
|
|
|
|
if slot in self.shopInfo['items']:
|
|
data = self.shopInfo['items'][slot]
|
|
tooltip = self.GetToolTip()
|
|
tooltip.ClearToolTip()
|
|
tooltip.AddItemData(data['vnum'], data['sockets'], data['attrs'])
|
|
if 'price' in data and data['price'] != 0:
|
|
tooltip.AppendPrice(data['price'])
|
|
if 'cheque' in data and data['cheque'] != 0:
|
|
tooltip.AppendCheque(data['cheque'])
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
tooltip.AppendTextLine(locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_NOT_AVAILABLE) if data['priceavg'] == 0 \
|
|
else tooltip.AppendTextLine(locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_VALUE.format(locale.NumberToMoneyString(data['priceavg'])))
|
|
tooltip.AppendTextLine(locale.IKASHOP_SHOP_GUEST_BUY_ITEM_TOOLTIP)
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
tooltip.AppendTextLine(locale.IKASHOP_PRO_SHOP_GUEST_BUY_ALL_ITEM_TOOLTIP)
|
|
tooltip.AppendTextLine(locale.IKASHOP_SHOP_GUEST_OFFER_ITEM_TOOLTIP)
|
|
tooltip.ShowToolTip()
|
|
|
|
def _HideToolTipOnItemSlot(self, slot=0):
|
|
tooltip = self.GetToolTip()
|
|
tooltip.ClearToolTip()
|
|
tooltip.HideToolTip()
|
|
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
def _OnSelectPage(self, page):
|
|
self.selectedPage = page
|
|
for idx, button in enumerate(self.selectPageButtons):
|
|
button.Disable() if idx == page else button.Enable()
|
|
self._RefreshItems()
|
|
|
|
def _LocalToGlobalSlot(self, pos):
|
|
return self.selectedPage * self.PAGE_SIZE + pos
|
|
|
|
def _GlobalToLocalSlot(self, pos):
|
|
return pos % self.PAGE_SIZE
|
|
|
|
def _OnScrollMouseWheel(self, delta):
|
|
if delta > 0:
|
|
if self.selectedPage > 0:
|
|
self._OnSelectPage(self.selectedPage-1)
|
|
else:
|
|
if self.selectedPage + 1 < self.PAGE_COUNT:
|
|
self._OnSelectPage(self.selectedPage+1)
|
|
return True
|
|
|
|
def _RefreshItems(self):
|
|
# resetting slots
|
|
for i in xrange(self.GRID_COLUMNS*self.GRID_ROWS):
|
|
self.slotWindow.ClearSlot(i)
|
|
self.slotWindow.DeactivateSlot(i)
|
|
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
for i in xrange(self.PAGE_SIZE):
|
|
self.lockedCells[i].Hide()
|
|
|
|
scell = self.PAGE_SIZE * self.selectedPage
|
|
ecell = scell + self.PAGE_SIZE
|
|
|
|
for cell in xrange(scell, ecell):
|
|
if cell >= self.shopInfo['lock']:
|
|
self.lockedCells[self._GlobalToLocalSlot(cell)].Show()
|
|
|
|
|
|
if cell in self.shopInfo['items']:
|
|
item = self.shopInfo['items'][cell]
|
|
pos = self._GlobalToLocalSlot(cell)
|
|
self.slotWindow.SetItemSlot(pos, item['vnum'], item['count'] if item['count'] > 1 else 0)
|
|
|
|
else:
|
|
# setting up slots
|
|
for item in self.shopInfo['items'].values():
|
|
self.slotWindow.SetItemSlot(item['cell'], item['vnum'], item['count'] if item['count'] > 1 else 0)
|
|
|
|
self.slotWindow.RefreshSlot()
|
|
self._RefreshMarkedSlots()
|
|
|
|
def _RefreshMarkedSlots(self):
|
|
if not self.markedInfo:
|
|
return
|
|
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
scell = self.PAGE_SIZE * self.selectedPage
|
|
ecell = scell + self.PAGE_SIZE
|
|
shownCells = xrange(scell, ecell)
|
|
|
|
vnum, count, price = self.markedInfo
|
|
for cell, data in self.shopInfo['items'].items():
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
if cell not in shownCells:
|
|
continue
|
|
if (data['vnum'], data['count'], data['price']) == (vnum, count, price):
|
|
self.slotWindow.ActivateSlot(cell, 0.4, 0.4, 0.1)
|
|
self.slotWindow.RefreshSlot()
|
|
|
|
def Open(self, data):
|
|
# refreshing duration & title
|
|
self.durationText.SetText(locale.SecondToDHM(data['duration']*60))
|
|
self.SetTitleName(locale.IKASHOP_SHOP_NAME_FORMAT.format(data['name']))
|
|
|
|
# ordering items by cell and storing info
|
|
data['items'] = { item['cell'] : item for item in data['items'] }
|
|
self.shopInfo = data
|
|
|
|
self._RefreshItems()
|
|
|
|
if not self.IsShow():
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
self._OnSelectPage(0)
|
|
self.Show()
|
|
self.SetTop()
|
|
|
|
def Close(self):
|
|
self.Hide()
|
|
ikashop.SendCloseShopGuestBoard()
|
|
|
|
def MarkItems(self, vnum, count, price):
|
|
self.markedInfo = vnum, count, price
|
|
self._RefreshMarkedSlots()
|
|
|
|
def CheckExpiring(self, id):
|
|
if self.shopInfo['id'] == id:
|
|
self.Close()
|
|
self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_EXPIRED)
|
|
|
|
def ShopGuestRemoveItem(self, itemid):
|
|
if 'items' in self.shopInfo:
|
|
self.shopInfo['items'] = { cell : data for cell, data in self.shopInfo['items'].items() if data['id'] != itemid}
|
|
self._RefreshItems()
|
|
|
|
def EditItem(self, itemid, prices):
|
|
if 'items' in self.shopInfo:
|
|
for data in self.shopInfo['items'].values():
|
|
if data['id'] == itemid:
|
|
data['price'] = prices['price']
|
|
if 'cheque' in prices:
|
|
data['cheque'] = prices['cheque']
|
|
self._RefreshItems()
|
|
break
|
|
|
|
|
|
class IkarusAuctionGuestBoard(IkashopBoardWithTitleBar):
|
|
|
|
OFFER_VIEW_COUNT = 6
|
|
OFFER_VIEW_HEIGHT = 28
|
|
|
|
def __init__(self):
|
|
super(IkarusAuctionGuestBoard, self).__init__()
|
|
self._SettingUpBoard()
|
|
self._LoadIkarusShopAuctionGuestBoard()
|
|
|
|
def _SettingUpBoard(self):
|
|
sw, sh = GetScreenSize()
|
|
self.SetSize(513 + 13, 249)
|
|
self.SetCloseEvent(self.Close)
|
|
self.SetPosition(sw/2 + self.GetWidth() - 600, sh / 2 - self.GetHeight()/2 + 100)
|
|
self.AddFlag("movable")
|
|
self.AddFlag("float")
|
|
|
|
def _LoadIkarusShopAuctionGuestBoard(self):
|
|
# making info box
|
|
self.infoBox = self.CreateWidget(ui.ImageBox, pos = (12, 36))
|
|
self.infoBox.LoadImage("ikashop/lite/auction/info_box.png")
|
|
self.infoBox.SetMouseWheelEvent(self._MouseWheelScrollOffers)
|
|
|
|
self.minRaiseText = self.CreateWidget(ui.TextLine, pos = (458+13, 221-36), parent = self.infoBox)
|
|
self.minRaiseText.SetPackedFontColor(0xFFFFFFFF)
|
|
self.minRaiseText.SetHorizontalAlignRight()
|
|
|
|
self.durationText = self.CreateWidget(ui.TextLine, pos = (141, 221-36), parent = self.infoBox)
|
|
self.durationText.SetPackedFontColor(0xFFFFFFFF)
|
|
|
|
# making slot
|
|
self.slot = self.CreateWidget(ui.GridSlotWindow, pos = (36, 44), size = (32, 98), parent = self.infoBox)
|
|
self.slot.ArrangeSlot(0, 1, 3, SLOT_SIZE, SLOT_SIZE, 0, 0)
|
|
self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
|
|
self.slot.SetOverInItemEvent(self._OverInItem)
|
|
self.slot.SetOverOutItemEvent(self._OverOutItem)
|
|
|
|
# making scrollbar
|
|
self.offerScrollbar = self.CreateWidget(ui.ScrollBar, pos = (470+13, 4), parent = self.infoBox)
|
|
self.offerScrollbar.SetScrollBarSize(self.infoBox.GetHeight() - 35)
|
|
self.offerScrollbar.SetScrollEvent(self._ScrollOffers)
|
|
|
|
# making cancel auction button
|
|
self.raiseButton = self.CreateWidget(ui.Button, pos = (12, self.GetHeight() - 33))
|
|
self.raiseButton.SetUpVisual("ikashop/lite/auction/raise_button/default.png")
|
|
self.raiseButton.SetDownVisual("ikashop/lite/auction/raise_button/default.png")
|
|
self.raiseButton.SetOverVisual("ikashop/lite/auction/raise_button/hover.png")
|
|
self.raiseButton.SetText(locale.IKASHOP_ACUTION_GUEST_RAISE_AUCTION_BUTTON)
|
|
self.raiseButton.SAFE_SetEvent(self._OnClickRaiseAuction)
|
|
self.raiseButton.Show()
|
|
|
|
# making offers
|
|
self.offerViews = []
|
|
for i in xrange(self.OFFER_VIEW_COUNT):
|
|
self.offerViews.append(self.CreateWidget(
|
|
IkarusShopAuctionOfferView, pos = (115, 6 + i*self.OFFER_VIEW_HEIGHT), parent = self.infoBox))
|
|
|
|
def _RefreshOffers(self):
|
|
# calculating count difference
|
|
diff = len(self.offers) - self.OFFER_VIEW_COUNT
|
|
diff = max(diff, 0)
|
|
|
|
# calculating ranges
|
|
offset = self.offerScrollbar.GetPos()
|
|
sindex = int(diff * offset)
|
|
eindex = sindex + min(self.OFFER_VIEW_COUNT, len(self.offers))
|
|
|
|
# iterating over views
|
|
for i, view in enumerate(self.offerViews):
|
|
ri = i + sindex
|
|
view.Hide() if ri >= eindex \
|
|
else view.Setup(ri+1, self.offers[ri])
|
|
|
|
# update scrollbar's middlebar height
|
|
self.offerScrollbar.UpdateScrollbarLenght(self.OFFER_VIEW_HEIGHT * len(self.offers))
|
|
|
|
def _MouseWheelScrollOffers(self, delta):
|
|
if self.offerScrollbar.IsShow():
|
|
self.offerScrollbar.OnDown() if delta < 0 \
|
|
else self.offerScrollbar.OnUp()
|
|
return True
|
|
|
|
def _ScrollOffers(self):
|
|
if self.offerScrollbar.IsShow():
|
|
self._RefreshOffers()
|
|
|
|
def _UpdateScrollbarState(self):
|
|
self.offerScrollbar.SetPos(0)
|
|
if len(self.offers) <= self.OFFER_VIEW_COUNT:
|
|
self.offerScrollbar.Hide()
|
|
else:
|
|
self.offerScrollbar.Show()
|
|
|
|
def _OverInItem(self, slot):
|
|
data = self.auctionInfo
|
|
tooltip = self.GetToolTip()
|
|
tooltip.ClearToolTip()
|
|
tooltip.AddItemData(data['vnum'], data['sockets'], data['attrs'])
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
tooltip.AppendTextLine(locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_NOT_AVAILABLE) if data['priceavg'] == 0 \
|
|
else tooltip.AppendTextLine(locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_VALUE.format(locale.NumberToMoneyString(data['priceavg'])))
|
|
tooltip.ShowToolTip()
|
|
|
|
def _OverOutItem(self, slot = 0):
|
|
tooltip = self.GetToolTip()
|
|
tooltip.ClearToolTip()
|
|
tooltip.HideToolTip()
|
|
|
|
def _OnClickRaiseAuction(self):
|
|
self.OpenMoneyInputDialog(self._OnAcceptRaiseAuctionInput, value = self.minRaise)
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
data = self.auctionInfo
|
|
self.moneyInputDialog.SetPriceAverage(data['priceavg'])
|
|
|
|
def _OnAcceptRaiseAuctionInput(self):
|
|
self.moneyInputDialog.SoftClose()
|
|
|
|
ok, value = ExtractInputPrice(self.moneyInputDialog)
|
|
if not ok:
|
|
self.OpenPopupDialog(locale.IKASHOP_BUSINESS_INVALID_ITEM_PRICE)
|
|
return
|
|
|
|
if ENABLE_CHEQUE_SYSTEM:
|
|
valueTotal = value[0] + value[1] * YANG_PER_CHEQUE
|
|
if self.minRaise > valueTotal:
|
|
self.OpenPopupDialog(locale.IKASHOP_AUCTION_GUEST_MIN_RAISE_REQUIRED)
|
|
return True
|
|
|
|
if value[0] > player.GetElk() or value[1] > player.GetCheque():
|
|
self.OpenPopupDialog(locale.IKASHOP_AUCTION_GUEST_NOT_ENOUGH_MONEY)
|
|
return True
|
|
|
|
else:
|
|
if self.minRaise > value[0]:
|
|
self.OpenPopupDialog(locale.IKASHOP_AUCTION_GUEST_MIN_RAISE_REQUIRED)
|
|
return True
|
|
|
|
if value[0] > player.GetElk():
|
|
self.OpenPopupDialog(locale.IKASHOP_AUCTION_GUEST_NOT_ENOUGH_MONEY)
|
|
return True
|
|
|
|
ikashop.SendAuctionAddOffer(self.auctionInfo['owner'], *value)
|
|
return True
|
|
|
|
def SetOffers(self, offers):
|
|
self.offers = sorted(offers, key = lambda val : val['datetime'], reverse=True)
|
|
self._UpdateScrollbarState()
|
|
self._RefreshOffers()
|
|
self.RefreshMinRaise()
|
|
|
|
def SetDuration(self, duration):
|
|
self.durationText.SetText(locale.SecondToDHM(duration*60))
|
|
|
|
def _GetMinRaise(self):
|
|
if not self.offers:
|
|
return self.auctionInfo['price']
|
|
|
|
minraise = max([val['price'] for val in self.offers])
|
|
if minraise < 1000:
|
|
return minraise + 1000
|
|
|
|
return minraise * (100+AUCTION_MIN_RAISE_PERCENTAGE) / 100
|
|
|
|
def RefreshMinRaise(self):
|
|
self.minRaise = self._GetMinRaise()
|
|
self.minRaiseText.SetText(locale.IKASHOP_AUCTION_MIN_BID + ' ' + locale.NumberToString(self.minRaise))
|
|
|
|
def Open(self, data):
|
|
# storing data
|
|
self.auctionInfo = data
|
|
|
|
# refreshing duration & title
|
|
seconds = data['duration'] * 60
|
|
self.durationText.SetText(locale.SecondToDHM(seconds))
|
|
self.SetTitleName(locale.IKASHOP_AUCTION_GUEST_NAME_FORMAT.format(data['ownername']))
|
|
|
|
# refreshing item
|
|
vnum = data['vnum']
|
|
count = data['count'] if data['count'] > 1 else 0
|
|
item.SelectItem(vnum)
|
|
size = item.GetItemSize()[1]
|
|
self.slot.ArrangeSlot(0, 1, size, SLOT_SIZE, SLOT_SIZE, 0, 0)
|
|
self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
|
|
self.slot.SetItemSlot(0, vnum, count)
|
|
|
|
# refreshing offers
|
|
self.SetOffers(data['offers'])
|
|
|
|
if not self.IsShow():
|
|
self.Show()
|
|
self.SetTop()
|
|
|
|
def Close(self):
|
|
self.Hide()
|
|
ikashop.SendAuctionExitFrom(self.auctionInfo['owner'])
|
|
|
|
|
|
class IkarusAuctionListBoard(IkarusShopListBoard):
|
|
|
|
AUCTION_VIEW_COUNT = 4
|
|
|
|
def __init__(self):
|
|
super(IkarusAuctionListBoard, self).__init__()
|
|
self._SettingUpBoard()
|
|
self._LoadIkarusAuctionListBoard()
|
|
|
|
def _SettingUpBoard(self):
|
|
self.SetSize(395, 510)
|
|
self.SetTitleName(locale.IKASHOP_AUCTION_LIST_BOARD_TITLE)
|
|
super(IkarusAuctionListBoard, self)._SettingUpBoard()
|
|
|
|
def _LoadIkarusAuctionListBoard(self):
|
|
self._LoadIkarusShopListBoard()
|
|
self._MakeListElements(IkarusSearchShopItem, self.AUCTION_VIEW_COUNT)
|
|
|
|
def SetAuctions(self, auctions):
|
|
shuffle(auctions)
|
|
self.auctions = auctions
|
|
self.SetElements(self.auctions)
|
|
self.Show()
|
|
self.SetTop()
|
|
|
|
def SetSearchShopBoard(self, board):
|
|
for view in self.views:
|
|
view.SetSearchShopBoard(board)
|
|
|
|
def Open(self):
|
|
ikashop.SendAuctionListRequest()
|
|
|
|
def Close(self):
|
|
self.Hide()
|
|
|
|
class IkarusShopHistoryFilterView(IkarusShopWindow):
|
|
|
|
def __init__(self):
|
|
super(IkarusShopHistoryFilterView, self).__init__()
|
|
self._LoadIkarusShopHistoryFilterView()
|
|
|
|
def _LoadIkarusShopHistoryFilterView(self):
|
|
# making background and fitting its size
|
|
self.background = self.CreateWidget(ui.ImageBox)
|
|
self.background.LoadImage("ikashop/lite/history_search/box.png")
|
|
self.SetSize(self.background.GetWidth(), self.background.GetHeight())
|
|
|
|
# making what
|
|
self.whatText = self.CreateWidget(ui.TextLine, pos = (9, 5))
|
|
self.whatText.SetPackedFontColor(0xFFFFFFFF)
|
|
|
|
# making datetime
|
|
self.datetimeText = self.CreateWidget(ui.TextLine, pos = (405-11, 5))
|
|
self.datetimeText.SetPackedFontColor(0xFFFFFFFF)
|
|
self.datetimeText.SetHorizontalAlignCenter()
|
|
|
|
# info button
|
|
self.infoButton = self.CreateWidget(ui.Button, pos = (294, 1))
|
|
self.infoButton.SetUpVisual("ikashop/lite/history_search/info_button/default.png")
|
|
self.infoButton.SetDownVisual("ikashop/lite/history_search/info_button/default.png")
|
|
self.infoButton.SetOverVisual("ikashop/lite/history_search/info_button/hover.png")
|
|
|
|
# search button
|
|
self.searchButton = self.CreateWidget(ui.Button, pos = (294 + 27, 1))
|
|
self.searchButton.SetUpVisual("ikashop/lite/search_shop/mini_search_button/default.png")
|
|
self.searchButton.SetDownVisual("ikashop/lite/search_shop/mini_search_button/default.png")
|
|
self.searchButton.SetOverVisual("ikashop/lite/search_shop/mini_search_button/hover.png")
|
|
self.searchButton.SetToolTipText(locale.IKASHOP_SEARCH_SHOP_SEARCH_BUTTON_TEXT)
|
|
|
|
def _ShowToolTip(self):
|
|
tooltip = self.GetToolTip()
|
|
tooltip.ClearToolTip()
|
|
# adding item name
|
|
tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_HISTORY_WHAT_FORMAT.format(self.data['name'], self.data['count']))
|
|
# adding type/subtype
|
|
if self.data['type'] != 0:
|
|
tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_HEADER + ': ' + IkarusSearchShopBoard.ITEM_TYPES[self.data['type']])
|
|
if self.data['subtype'] != 0:
|
|
subtypes = IkarusSearchShopBoard.SUB_TYPES[self.data['type']]
|
|
tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_HEADER + ': ' + subtypes[self.data['subtype']])
|
|
# adding price min/max
|
|
if self.data['price_min'] != 0:
|
|
tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_ITEM_PRICE_MIN_HEADER + ': ' + locale.NumberToString(self.data['price_min']))
|
|
if self.data['price_max'] != 0:
|
|
tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_ITEM_PRICE_MAX_HEADER + ': ' + locale.NumberToString(self.data['price_max']))
|
|
# adding level min/max
|
|
if self.data['level_min'] != 0:
|
|
tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_ITEM_LEVEL_MIN_HEADER + ': ' + locale.NumberToString(self.data['level_min']))
|
|
if self.data['level_max'] != 0:
|
|
tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_ITEM_LEVEL_MAX_HEADER + ': ' + locale.NumberToString(self.data['level_max']))
|
|
# adding attributes
|
|
tooltip.AppendAttributes(self.data['attrs'])
|
|
# adding special filters
|
|
if self.data['sash'] != 0:
|
|
tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_SASH_ABSORB_HEADER + ': ' + IkarusSearchShopBoard.SASH_ABSORBS[self.data['sash']])
|
|
if self.data['alchemy'] != 0:
|
|
tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_ALCHEMY_GRADE_HEADER + ': ' + IkarusSearchShopBoard.ALCHEMY_GRADES[self.data['alchemy']])
|
|
tooltip.ResizeToolTip()
|
|
tooltip.ShowToolTip()
|
|
|
|
def _RefreshToolTip(self):
|
|
tooltip = self.GetToolTip()
|
|
if tooltip.IsShow():
|
|
if not self.infoButton.IsIn():
|
|
tooltip.HideToolTip()
|
|
else:
|
|
if self.infoButton.IsIn():
|
|
self._ShowToolTip()
|
|
|
|
def Setup(self, data):
|
|
self.data = data
|
|
self.datetimeText.SetText(DatetimeFormat(data['datetime']))
|
|
self.whatText.SetText(locale.IKASHOP_SEARCH_SHOP_HISTORY_WHAT_FORMAT.format(data['name'], data['count']))
|
|
|
|
def SetSearchEvent(self, event):
|
|
self.searchButton.SAFE_SetEvent(event, proxy(self))
|
|
|
|
def OnUpdate(self):
|
|
self._RefreshToolTip()
|
|
|
|
class IkarusHistoryFilterBoard(IkarusShopListBoard):
|
|
|
|
HISTORY_FILTER_VIEW_COUNT = 10
|
|
|
|
def __init__(self):
|
|
super(IkarusHistoryFilterBoard, self).__init__()
|
|
self._SettingUpBoard()
|
|
self._LoadIkarusHistoryFilterBoard()
|
|
|
|
def _SettingUpBoard(self):
|
|
self.SetSize(494, 339)
|
|
self.SetTitleName(locale.IKASHOP_HISTORY_FILTER_LIST_BOARD_TITLE)
|
|
super(IkarusHistoryFilterBoard, self)._SettingUpBoard()
|
|
|
|
def _LoadIkarusHistoryFilterBoard(self):
|
|
self._LoadIkarusShopListBoard()
|
|
self._MakeListElements(IkarusShopHistoryFilterView, self.HISTORY_FILTER_VIEW_COUNT)
|
|
for view in self.views:
|
|
view.SetSearchEvent(self._OnClickSearchOnHistoryElement)
|
|
|
|
def _OnClickSearchOnHistoryElement(self, view):
|
|
self.searchShopBoard.HistoryRedoSearch(view.data)
|
|
self.Close()
|
|
|
|
def SetSearchShopBoard(self, board):
|
|
self.searchShopBoard = proxy(board)
|
|
|
|
def SetFilters(self, filters):
|
|
self.filters = sorted(filters, key = lambda elm : elm['datetime'], reverse=True)
|
|
self.SetElements(self.filters)
|
|
|
|
def Open(self):
|
|
self.Show()
|
|
self.SetTop()
|
|
|
|
def Close(self):
|
|
self.Hide()
|
|
|
|
class IkarusShopComboBox(IkarusShopWindow):
|
|
|
|
DEFAULT_VIEW_COUNT = 5
|
|
ELEMENT_HEIGHT = 14
|
|
|
|
class ComboBoxView(ui.Button):
|
|
def Destroy(self):
|
|
SelfDestroyObject(self)
|
|
|
|
def __init__(self):
|
|
super(IkarusShopComboBox, self).__init__()
|
|
self.viewCount = self.DEFAULT_VIEW_COUNT
|
|
self.elementWidth = 0
|
|
self.selectItemEvent = None
|
|
self.views = []
|
|
self.items = []
|
|
self.elementImages = (
|
|
"ikashop/lite/search_shop/combo_box_element/default.png",
|
|
"ikashop/lite/search_shop/combo_box_element/default.png",
|
|
"ikashop/lite/search_shop/combo_box_element/hover.png")
|
|
self.selectedItem = 0
|
|
self._LoadIkarusShopComboBox()
|
|
|
|
def _LoadIkarusShopComboBox(self):
|
|
self.SetMouseWheelEvent(self._MouseWheelScrollView)
|
|
|
|
self.background = self.CreateWidget(ui.Bar3D)
|
|
self.background.SetColor(0xFF999999, 0xFF000000, 0xFF777777)
|
|
|
|
self.scrollbar = self.CreateWidget(ui.ScrollBar, show = False, parent = self.background)
|
|
self.scrollbar.SetScrollEvent(self._ScrollView)
|
|
|
|
def _MakeViews(self):
|
|
for view in self.views:
|
|
SelfDestroyObject(view)
|
|
|
|
self.views = []
|
|
images = self.elementImages
|
|
for i in xrange(self.viewCount):
|
|
view = self.CreateWidget(self.ComboBoxView, pos = (0, i*self.ELEMENT_HEIGHT), parent = self.background)
|
|
view.SetUpVisual(images[0])
|
|
view.SetDownVisual(images[1])
|
|
view.SetOverVisual(images[2])
|
|
view.SetWindowName("cacca")
|
|
self.elementWidth = max(self.elementWidth, view.GetWidth())
|
|
self.views.append(view)
|
|
|
|
def _MouseWheelScrollView(self, delta):
|
|
if self.scrollbar.IsShow():
|
|
self.scrollbar.OnDown() if delta < 0\
|
|
else self.scrollbar.OnUp()
|
|
return True
|
|
|
|
def _ScrollView(self):
|
|
if self.scrollbar.IsShow():
|
|
self._RefreshView()
|
|
|
|
def _RefreshView(self):
|
|
# making view if required
|
|
if not self.views:
|
|
self._MakeViews()
|
|
|
|
# calculating sindex
|
|
pos = self.scrollbar.GetPos() if self.scrollbar.IsShow() else 0.0
|
|
diff = max(len(self.items) - self.viewCount, 0)
|
|
sindex = int(diff * pos)
|
|
eindex = sindex + min(len(self.items), self.viewCount)
|
|
|
|
# hiding all views
|
|
for view in self.views:
|
|
view.Hide()
|
|
|
|
# setting up and showing only used views
|
|
for i in xrange(sindex, eindex):
|
|
ri = i - sindex
|
|
view = self.views[ri]
|
|
view.SetText(self.items[i])
|
|
view.ButtonText.SetPosition(view.GetWidth()/2, view.GetHeight() /2 -1)
|
|
view.SAFE_SetEvent(self.SelectItem, i)
|
|
view.Show()
|
|
|
|
color = 0xFFFFFFFF if i != self.selectedItem else 0xFFFFFF88
|
|
view.ButtonText.SetPackedFontColor(color)
|
|
|
|
# updating scrollbar's middlebar length
|
|
self.scrollbar.UpdateScrollbarLenght(len(self.items) * self.ELEMENT_HEIGHT)
|
|
|
|
def _UpdateSize(self):
|
|
viewHeight = self.ELEMENT_HEIGHT * min(len(self.items), self.viewCount)
|
|
self.SetSize(self.GetWidth(), viewHeight)
|
|
self.scrollbar.SetScrollBarSize(viewHeight)
|
|
self.background.SetSize(self.GetWidth(), self.GetHeight())
|
|
|
|
def _UpdateScrollbar(self):
|
|
if len(self.items) > self.viewCount:
|
|
self.scrollbar.Show()
|
|
self.scrollbar.SetPos(0)
|
|
self.scrollbar.SetPosition(self.elementWidth+1, 0)
|
|
self.SetSize(self.elementWidth + 1 + self.scrollbar.GetWidth(), self.GetHeight())
|
|
self.background.SetSize(self.GetWidth(), self.GetHeight())
|
|
else:
|
|
self.scrollbar.Hide()
|
|
self.SetSize(self.elementWidth, self.GetHeight())
|
|
self.background.SetSize(self.GetWidth(), self.GetHeight())
|
|
|
|
def Open(self):
|
|
self.Show()
|
|
|
|
def Close(self):
|
|
self.Hide()
|
|
|
|
def GetSelectedItem(self):
|
|
return self.selectedItem
|
|
|
|
def SelectItem(self, index):
|
|
self.selectedItem = index
|
|
self._RefreshView()
|
|
self.Close()
|
|
if self.selectItemEvent:
|
|
self.selectItemEvent(index, self.items[index])
|
|
|
|
def SetSelectItemEvent(self, event):
|
|
self.selectItemEvent = event
|
|
|
|
def SetItems(self, items):
|
|
self.items = items
|
|
if not self.views:
|
|
self._MakeViews()
|
|
self._UpdateSize()
|
|
self._UpdateScrollbar()
|
|
self._RefreshView()
|
|
|
|
def SetViewCount(self, count):
|
|
self.viewCount = count
|
|
self._UpdateSize()
|
|
self._UpdateScrollbar()
|
|
self._MakeViews()
|
|
self._RefreshView()
|
|
|
|
def ChangeElementImages(self, images):
|
|
self.elementImages = images
|
|
self._MakeViews()
|
|
self._UpdateSize()
|
|
self._UpdateScrollbar()
|
|
self._RefreshView()
|
|
|
|
# used to check via proxy ref
|
|
def IsMe(self, combobox):
|
|
return self is combobox
|
|
|
|
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
class IkashopCheckBox(IkarusShopWindow):
|
|
|
|
def __init__(self):
|
|
super(IkashopCheckBox, self).__init__()
|
|
self.checkEvent = None
|
|
self.isEnabled = False
|
|
self._LoadIkashopCheckBox()
|
|
|
|
def _LoadIkashopCheckBox(self):
|
|
self.text = self.CreateWidget(ui.TextLine)
|
|
self.text.SetPackedFontColor(0xFFFFFFFF)
|
|
|
|
self.base = self.CreateWidget(ui.ImageBox)
|
|
self.base.SetOnMouseLeftButtonUpEvent(self.Check)
|
|
|
|
self.checked = self.CreateWidget(ui.ImageBox, show = False)
|
|
self.checked.SetOnMouseLeftButtonUpEvent(self.Uncheck)
|
|
|
|
def _Resize(self):
|
|
w = self.text.GetWidth() + 5 + max(self.base.GetWidth(), self.checked.GetWidth())
|
|
h = max([self.text.GetHeight(), self.base.GetHeight(), self.checked.GetHeight()])
|
|
self.base.SetPosition(self.text.GetWidth() + 5, 0)
|
|
self.checked.SetPosition(self.text.GetWidth() + 5, 0)
|
|
self.SetSize(w, h)
|
|
|
|
def SetImages(self, base, checked):
|
|
self.base.LoadImage(base)
|
|
self.checked.LoadImage(checked)
|
|
self._Resize()
|
|
|
|
def SetText(self, text):
|
|
self.text.SetText(text)
|
|
self.text.FitText()
|
|
self._Resize()
|
|
|
|
def SetCheckEvent(self, event):
|
|
self.checkEvent = event
|
|
|
|
def Check(self, callback = 1):
|
|
if self.isEnabled:
|
|
self.base.Hide()
|
|
self.checked.Show()
|
|
if callback and self.checkEvent:
|
|
self.checkEvent()
|
|
|
|
def Uncheck(self, callback = 1):
|
|
self.base.Show()
|
|
self.checked.Hide()
|
|
if callback and self.checkEvent:
|
|
self.checkEvent()
|
|
|
|
def IsChecked(self):
|
|
return self.checked.IsShow()
|
|
|
|
def Enable(self):
|
|
self.isEnabled = True
|
|
|
|
def Disable(self):
|
|
self.isEnabled = False
|
|
|
|
def IsEnabled(self):
|
|
return self.isEnabled
|
|
|
|
class IkarusSearchShopItem(IkarusShopWindow):
|
|
|
|
def __init__(self):
|
|
super(IkarusSearchShopItem, self).__init__()
|
|
self.data = {'id':-1}
|
|
self._LoadIkarusSearchShopItem()
|
|
|
|
def _LoadIkarusSearchShopItem(self):
|
|
# making background
|
|
self.background = self.CreateWidget(ui.ExpandedImageBox)
|
|
self.background.LoadImage("ikashop/lite/search_shop/result_item_box.png")
|
|
self.SetSize(self.background.GetWidth(), self.background.GetHeight())
|
|
|
|
# making textlines
|
|
self.itemName = self.CreateWidget(ui.TextLine, pos = (60, 17 - 6))
|
|
self.sellerName = self.CreateWidget(ui.TextLine, pos = (78, 41 - 6))
|
|
self.duration = self.CreateWidget(ui.TextLine, pos = (226, 41 - 6))
|
|
self.price = self.CreateWidget(ui.TextLine, pos = (78, 58))
|
|
|
|
if ENABLE_CHEQUE_SYSTEM:
|
|
self.cheque = self.CreateWidget(ui.TextLine, pos = (128 + 70, 58))
|
|
self.chequeIcon = self.CreateWidget(ui.ImageBox, pos = (110 + 70, 59))
|
|
self.chequeIcon.LoadImage("d:/ymir work/ui/game/windows/cheque_icon.sub")
|
|
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
self.priceAverage = self.CreateWidget(ui.TextLine, pos = (330-8, 58))
|
|
self.priceAverage.SetHorizontalAlignRight()
|
|
|
|
# making buttons
|
|
self.buyButton = self.CreateWidget(ui.Button, pos = (261, 84))
|
|
self.buyButton.SetUpVisual("ikashop/lite/search_shop/buy_button/default.png")
|
|
self.buyButton.SetDownVisual("ikashop/lite/search_shop/buy_button/default.png")
|
|
self.buyButton.SetOverVisual("ikashop/lite/search_shop/buy_button/hover.png")
|
|
self.buyButton.SAFE_SetEvent(self._OnClickBuyButton)
|
|
self.buyButton.SetText(locale.IKASHOP_SEARCH_SHOP_BUY_BUTTON_TEXT)
|
|
|
|
self.offerButton = self.CreateWidget(ui.Button, pos = (189, 84))
|
|
self.offerButton.SetUpVisual("ikashop/lite/search_shop/offer_button/default.png")
|
|
self.offerButton.SetDownVisual("ikashop/lite/search_shop/offer_button/default.png")
|
|
self.offerButton.SetOverVisual("ikashop/lite/search_shop/offer_button/hover.png")
|
|
self.offerButton.SAFE_SetEvent(self._OnClickOfferButton)
|
|
self.offerButton.SetText(locale.IKASHOP_SEARCH_SHOP_OFFER_BUTTON_TEXT)
|
|
|
|
self.openSellingBoard = self.CreateWidget(ui.Button, pos = (50, 84), show = False)
|
|
self.openSellingBoard.SetUpVisual("ikashop/lite/search_shop/offer_button/default.png")
|
|
self.openSellingBoard.SetDownVisual("ikashop/lite/search_shop/offer_button/default.png")
|
|
self.openSellingBoard.SetOverVisual("ikashop/lite/search_shop/offer_button/hover.png")
|
|
self.openSellingBoard.SAFE_SetEvent(self._OnClickOpenSellingBoardButton)
|
|
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
self.messageSellerButton = self.CreateWidget(ui.Button)
|
|
self.messageSellerButton.SetUpVisual("ikashop/ultimate/seller_message/default.png")
|
|
self.messageSellerButton.SetOverVisual("ikashop/ultimate/seller_message/hover.png")
|
|
self.messageSellerButton.SetDownVisual("ikashop/ultimate/seller_message/default.png")
|
|
self.messageSellerButton.SAFE_SetEvent(self._OnClickMessageSeller)
|
|
|
|
# making slot item
|
|
self.slot = self.CreateWidget(ui.GridSlotWindow, pos = (9, 7))
|
|
self.slot.ArrangeSlot(0, 1, 3, SLOT_SIZE, SLOT_SIZE, 0, 0)
|
|
self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
|
|
self.slot.SetOverInItemEvent(self._OverInItem)
|
|
self.slot.SetOverOutItemEvent(self._OverOutItem)
|
|
|
|
def _OnClickBuyButton(self):
|
|
item.SelectItem(self.data['vnum'])
|
|
# making item name
|
|
itemName = item.GetItemName()
|
|
if self.data['count'] > 1:
|
|
itemName += "({})".format(self.data['count'])
|
|
|
|
# making item price
|
|
if ENABLE_CHEQUE_SYSTEM:
|
|
itemPrice = ""
|
|
if self.data['price'] != 0:
|
|
itemPrice += locale.NumberToMoneyString(self.data['price'])
|
|
if self.data['cheque'] != 0:
|
|
if itemPrice:
|
|
itemPrice += ', '
|
|
itemPrice += locale.NumberToCheque(self.data['cheque'])
|
|
else:
|
|
itemPrice = locale.NumberToMoneyString(self.data['price'])
|
|
|
|
self.buyItemInfo = self.data['owner'], self.data['id'], self.data['price'] + self.data.get('cheque', 0) * YANG_PER_CHEQUE
|
|
message = locale.IKASHOP_SHOP_GUEST_BUY_ITEM_QUESTION.format(itemName, itemPrice)
|
|
self.OpenQuestionDialog(message, self._OnAcceptBuyItemQuestion)
|
|
|
|
def _OnClickOfferButton(self):
|
|
# checking offer min price
|
|
if self.data['price'] + self.data.get('cheque', 0) * YANG_PER_CHEQUE < 10000:
|
|
self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_MAKE_OFFER_ITEM_PRICE_TOO_LOW)
|
|
return
|
|
|
|
self.offerInfo = self.data['id'], self.data['price'], self.data.get('cheque', 0)
|
|
self.OpenMoneyInputDialog(self._OnAcceptMakeOfferInput)
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
self.moneyInputDialog.SetPriceAverage(self.data['priceavg'])
|
|
return
|
|
|
|
def _OnAcceptBuyItemQuestion(self):
|
|
ikashop.SendBuyItem(*self.buyItemInfo)
|
|
self.questionDialog.Hide()
|
|
|
|
def _OnAcceptMakeOfferInput(self):
|
|
self.moneyInputDialog.SoftClose()
|
|
|
|
# validating value
|
|
ok, value = ExtractInputPrice(self.moneyInputDialog)
|
|
if not ok:
|
|
self.OpenPopupDialog(locale.IKASHOP_BUSINESS_INVALID_ITEM_PRICE)
|
|
return
|
|
|
|
# checking for max offer price
|
|
id, price, cheque = self.offerInfo
|
|
|
|
if ENABLE_CHEQUE_SYSTEM:
|
|
valueTotal = value[0] + value[1] * YANG_PER_CHEQUE
|
|
priceTotal = price + cheque * YANG_PER_CHEQUE
|
|
if valueTotal >= priceTotal:
|
|
self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_MUST_BE_LOWER_THAN_PRICE)
|
|
return True
|
|
|
|
# checking for min offer price
|
|
minoffer = priceTotal * MIN_OFFER_PCT / 100
|
|
if valueTotal < minoffer:
|
|
self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_MUST_BE_HIGHER_THAN_PCT_OF_PRICE.format(MIN_OFFER_PCT))
|
|
return True
|
|
|
|
# checking owned cash
|
|
if value[0] > player.GetElk() or value[1] > player.GetCheque():
|
|
self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_NOT_ENOUGH_MONEY)
|
|
return True
|
|
|
|
else:
|
|
if value[0] >= price:
|
|
self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_MUST_BE_LOWER_THAN_PRICE)
|
|
return True
|
|
|
|
# checking for min offer price
|
|
minoffer = price * MIN_OFFER_PCT / 100
|
|
if value[0] < minoffer:
|
|
self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_MUST_BE_HIGHER_THAN_PCT_OF_PRICE.format(MIN_OFFER_PCT))
|
|
return True
|
|
|
|
# checking owned cash
|
|
if value[0] > player.GetElk():
|
|
self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_NOT_ENOUGH_MONEY)
|
|
return True
|
|
|
|
ikashop.SendOfferCreate(self.data['owner'], id, *value)
|
|
return True
|
|
|
|
def _OnClickOpenSellingBoardButton(self):
|
|
if self.data['is_auction']:
|
|
ikashop.SendAuctionOpenAuction(self.data['owner'])
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
if not self.data['is_auction']:
|
|
self.searchShopBoard.RequestOpenSellerShop(
|
|
self.data['owner'], self.data['vnum'], self.data['count'], self.data['price'])
|
|
|
|
def _OverInItem(self, slot):
|
|
tooltip = self.GetToolTip()
|
|
tooltip.ClearToolTip()
|
|
tooltip.AddItemData(self.data['vnum'], self.data['sockets'], self.data['attrs'])
|
|
tooltip.ShowToolTip()
|
|
|
|
def _OverOutItem(self):
|
|
tooltip = self.GetToolTip()
|
|
tooltip.HideToolTip()
|
|
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
def _OnClickMessageSeller(self):
|
|
self.searchShopBoard.OpenWhisper(self.sellerName.GetText())
|
|
|
|
def SetSearchShopBoard(self, board):
|
|
self.searchShopBoard = proxy(board)
|
|
|
|
def GetId(self):
|
|
return self.data['id']
|
|
|
|
def SetNotAvailable(self):
|
|
if not self.data['is_auction']:
|
|
self.slot.DisableSlot(0)
|
|
self.itemName.SetPackedFontColor(0xFFFF8888)
|
|
self.buyButton.Hide()
|
|
self.offerButton.Hide()
|
|
|
|
def SetAvailable(self):
|
|
if not self.data['is_auction']:
|
|
self.slot.EnableSlot(0)
|
|
self.itemName.SetPackedFontColor(0xFFFFFFFF)
|
|
self.buyButton.Show()
|
|
self.offerButton.Show()
|
|
|
|
def Setup(self, data):
|
|
if data['is_auction']:
|
|
self.buyButton.Hide()
|
|
self.offerButton.Hide()
|
|
self.background.LoadImage("ikashop/lite/search_shop/result_item_auction_box.png")
|
|
self.openSellingBoard.SetText(locale.IKASHOP_SEARCH_SHOP_OPEN_AUCTION_BUTTON_TEXT)
|
|
self.openSellingBoard.Show()
|
|
else:
|
|
self.buyButton.Show()
|
|
self.offerButton.Show()
|
|
self.background.LoadImage("ikashop/lite/search_shop/result_item_box.png")
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
self.openSellingBoard.SetText(locale.IKASHOP_SEARCH_SHOP_OPEN_SHOP_BUTTON_TEXT)
|
|
self.openSellingBoard.Show()
|
|
else:
|
|
self.openSellingBoard.Hide()
|
|
|
|
# setting itemname
|
|
item.SelectItem(data['vnum'])
|
|
itemName = item.GetItemName()
|
|
if data['is_auction']:
|
|
itemName += ' ' + locale.IKASHOP_SEARCH_SHOP_ITEM_NAME_AUCTION
|
|
self.itemName.SetText(itemName)
|
|
|
|
# setting seller name
|
|
self.sellerName.SetText(data['seller_name'])
|
|
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
sx, sy = self.sellerName.GetLocalPosition()
|
|
self.messageSellerButton.SetPosition(sx + self.sellerName.GetTextSize()[0] + 10, sy)
|
|
|
|
# setting duration
|
|
self.duration.SetText(locale.SecondToDHM(data['duration']*60))
|
|
|
|
# setting price
|
|
self.price.SetText(locale.NumberToString(data['price']))
|
|
|
|
if ENABLE_CHEQUE_SYSTEM:
|
|
self.cheque.Show() if data['cheque'] != 0 else self.cheque.Hide()
|
|
self.chequeIcon.Show() if data['cheque'] != 0 else self.chequeIcon.Hide()
|
|
self.cheque.SetText(locale.NumberToString(data['cheque']))
|
|
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
pa = locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_NOT_AVAILABLE_EMOJI if data['priceavg'] == 0 \
|
|
else locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_EMOJI.format(locale.NumberToMoneyString(data['priceavg']))
|
|
self.priceAverage.SetText(pa)
|
|
|
|
# setting slot
|
|
itemcount = data['count'] if data['count'] > 1 else 0
|
|
self.slot.ArrangeSlot(0, 1, item.GetItemSize()[1], SLOT_SIZE, SLOT_SIZE, 0, 0)
|
|
self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
|
|
self.slot.SetItemSlot(0, data['vnum'], itemcount)
|
|
self.data = data
|
|
|
|
|
|
class IkarusSearchShopBoard(IkashopBoardWithTitleBar):
|
|
|
|
RESULT_ITEM_VIEW_COUNT = 4
|
|
|
|
ITEM_TYPES = (
|
|
locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_WEAPON,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_ARMOR,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_JEWEL,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_COSTUME,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_PET,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_MOUNT,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_ALCHEMY,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_BOOK,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_STONE,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_MINERALS,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_FISH,
|
|
)
|
|
|
|
SUBTYPE_WEAPON = (
|
|
locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_WEAPON_SWORD,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_WEAPON_TWOHANDED,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_WEAPON_BLADE,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_WEAPON_DAGGER,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_WEAPON_BOW,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_WEAPON_BELL,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_WEAPON_FAN,
|
|
)
|
|
|
|
if app.ENABLE_WOLFMAN_CHARACTER:
|
|
SUBTYPE_WEAPON += (locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_WEAPON_CLAW,)
|
|
|
|
SUBTYPE_ARMOR = (
|
|
locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_ARMOR_WARRIOR,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_ARMOR_SURA,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_ARMOR_ASSASSIN,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_ARMOR_SHAMAN,
|
|
)
|
|
|
|
if app.ENABLE_WOLFMAN_CHARACTER:
|
|
SUBTYPE_ARMOR += (locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_ARMOR_WOLFMAN,)
|
|
|
|
SUBTYPE_JEWEL = (
|
|
locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_JEWEL_HELM,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_JEWEL_SHIELD,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_JEWEL_EAR,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_JEWEL_NECK,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_JEWEL_WRIST,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_JEWEL_SHOES,
|
|
)
|
|
|
|
SUBTYPE_COSTUME = (
|
|
locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_COSTUME_BODY,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_COSTUME_WEAPON,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_COSTUME_HAIR,
|
|
)
|
|
|
|
if app.ENABLE_ACCE_COSTUME_SYSTEM:
|
|
SUBTYPE_COSTUME += (locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_COSTUME_SASH,)
|
|
|
|
SUBTYPE_PET = (
|
|
locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_PET_EGGS,
|
|
locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_PET_SEALS,
|
|
)
|
|
|
|
SUBTYPE_MOUNT = (locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,)
|
|
SUBTYPE_ALCHEMY = (locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,)
|
|
SUBTYPE_BOOKS = (locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,)
|
|
SUBTYPE_STONE = (locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,)
|
|
SUBTYPE_MINERAL = (locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,)
|
|
SUBTYPE_FISH = (locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,)
|
|
|
|
SUB_TYPES = (
|
|
(locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,),
|
|
SUBTYPE_WEAPON,
|
|
SUBTYPE_ARMOR,
|
|
SUBTYPE_JEWEL,
|
|
SUBTYPE_COSTUME,
|
|
SUBTYPE_PET,
|
|
SUBTYPE_MOUNT,
|
|
SUBTYPE_ALCHEMY,
|
|
SUBTYPE_BOOKS,
|
|
SUBTYPE_STONE,
|
|
SUBTYPE_MINERAL,
|
|
SUBTYPE_FISH,
|
|
)
|
|
|
|
SASH_ABSORBS = (
|
|
locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,
|
|
locale.IKASHOP_SEARCH_SHOP_SASH_GRADE_VALUE0,
|
|
locale.IKASHOP_SEARCH_SHOP_SASH_GRADE_VALUE1,
|
|
locale.IKASHOP_SEARCH_SHOP_SASH_GRADE_VALUE2,
|
|
locale.IKASHOP_SEARCH_SHOP_SASH_GRADE_VALUE3,
|
|
)
|
|
|
|
ALCHEMY_GRADES = (
|
|
locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,
|
|
locale.IKASHOP_SEARCH_SHOP_DRAGON_SOUL_GRADE_NORMAL,
|
|
locale.IKASHOP_SEARCH_SHOP_DRAGON_SOUL_GRADE_BRILLIANT,
|
|
locale.IKASHOP_SEARCH_SHOP_DRAGON_SOUL_GRADE_RARE,
|
|
locale.IKASHOP_SEARCH_SHOP_DRAGON_SOUL_GRADE_ANCIENT,
|
|
locale.IKASHOP_SEARCH_SHOP_DRAGON_SOUL_GRADE_LEGENDARY,
|
|
)
|
|
|
|
def __init__(self):
|
|
super(IkarusSearchShopBoard, self).__init__()
|
|
ikashop.SetSearchShopBoard(self)
|
|
self.items = []
|
|
self.lastOpen = 0
|
|
self.markItemInfo = None
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
self.shuffleItem = None
|
|
self._MakeItemNameContainers()
|
|
self._SettingUpBoard()
|
|
self._LoadSearchShopWindow()
|
|
|
|
def __del__(self):
|
|
super(IkarusSearchShopBoard, self).__del__()
|
|
ikashop.SetSearchShopBoard(None)
|
|
|
|
def _MakeItemNameContainers(self):
|
|
names = ikashop.GetItemNames()
|
|
self.itemNames = set()
|
|
|
|
for name in names:
|
|
f = name.find("+")
|
|
if f != -1 and len(name)-1 != f and name[f+1:].isdigit():
|
|
name = name[:f]
|
|
self.itemNames.add(name.lower())
|
|
|
|
def _SettingUpBoard(self):
|
|
self.SetSize(604, 519)
|
|
self.SetTitleName(locale.IKASHOP_SEARCH_SHOP_BOARD_TITLE)
|
|
self.SetCloseEvent(self.Close)
|
|
self.SetCenterPosition()
|
|
self.AddFlag("movable")
|
|
self.AddFlag("float")
|
|
|
|
def _LoadLinkedBoard(self):
|
|
self.shopGuestBoard = IkarusShopGuestBoard()
|
|
self.auctionGuestBoard = IkarusAuctionGuestBoard()
|
|
self.auctionListBoard = IkarusAuctionListBoard()
|
|
self.historyFilterBoard = IkarusHistoryFilterBoard()
|
|
|
|
self.auctionListBoard.SetSearchShopBoard(self)
|
|
self.historyFilterBoard.SetSearchShopBoard(self)
|
|
self.historyFilterBoard.SetFilters(ikashop.GetFilterHistory())
|
|
|
|
def _LoadSearchShopWindow(self):
|
|
self._LoadLinkedBoard()
|
|
getBottom = lambda win : win.GetLocalPosition()[1] + win.GetHeight()
|
|
getRight = lambda win : win.GetLocalPosition()[0] + win.GetWidth()
|
|
|
|
largerComboBoxImages = (
|
|
"ikashop/lite/search_shop/attribute_element/default.png",
|
|
"ikashop/lite/search_shop/attribute_element/default.png",
|
|
"ikashop/lite/search_shop/attribute_element/hover.png",
|
|
)
|
|
|
|
self.inputNameBox = self.CreateWidget(ui.ExpandedImageBox, pos = (14,40))
|
|
self.inputNameBox.LoadImage("ikashop/lite/search_shop/input_name.png")
|
|
self.inputNameBox.SetScale(155.0 / self.inputNameBox.GetWidth(), 1.0)
|
|
|
|
self.searchButton = self.CreateWidget(ui.Button, pos = (14 + self.inputNameBox.GetWidth() + 2, 42))
|
|
self.searchButton.SetUpVisual("ikashop/lite/search_shop/mini_search_button/default.png")
|
|
self.searchButton.SetDownVisual("ikashop/lite/search_shop/mini_search_button/default.png")
|
|
self.searchButton.SetOverVisual("ikashop/lite/search_shop/mini_search_button/hover.png")
|
|
self.searchButton.SAFE_SetEvent(self._OnClickSearchButton)
|
|
self.searchButton.SetToolTipText(locale.IKASHOP_SEARCH_SHOP_SEARCH_BUTTON_TEXT)
|
|
|
|
iw = self.inputNameBox.GetWidth() - self.searchButton.GetWidth() - 6
|
|
ih = self.inputNameBox.GetHeight() - 6
|
|
self.inputNameEdit = self.CreateWidget(ui.EditLine, pos = (6, 6), size = (iw, ih), parent=self.inputNameBox)
|
|
self.inputNameEdit.SetMax(ikashop.FILTER_NAME_MAX_LEN)
|
|
self.inputNameEdit.SetEscapeEvent(ui.__mem_func__(self.inputNameEdit.KillFocus))
|
|
self.inputNameEdit.SetUpdateEvent(self._OnUpdateInputName)
|
|
self.inputNameBox.SetOnMouseLeftButtonUpEvent(self.inputNameEdit.SetFocus)
|
|
|
|
self.inputNameSuggestion = self.CreateWidget(IkarusShopComboBox, pos = (14, getBottom(self.inputNameBox)+2))
|
|
self.inputNameSuggestion.SetSelectItemEvent(self._OnSelectSuggestedItemName)
|
|
self.inputNameSuggestion.ChangeElementImages(largerComboBoxImages)
|
|
self.inputNameSuggestion.SetViewCount(6)
|
|
self.inputNameSuggestion.SetItems(["",])
|
|
|
|
self.resetFilterButton = self.CreateWidget(ui.Button, pos = (getRight(self.searchButton) + 3, 42))
|
|
self.resetFilterButton.SetUpVisual("ikashop/lite/search_shop/reset_filter_button/default.png")
|
|
self.resetFilterButton.SetDownVisual("ikashop/lite/search_shop/reset_filter_button/default.png")
|
|
self.resetFilterButton.SetOverVisual("ikashop/lite/search_shop/reset_filter_button/hover.png")
|
|
self.resetFilterButton.SAFE_SetEvent(self._OnClickResetFilters)
|
|
self.resetFilterButton.SetToolTipText(locale.IKASHOP_SEARCH_SHOP_RESET_FILTER_BUTTON_TEXT)
|
|
|
|
# item type filter
|
|
self.itemTypeFilterBox = self.CreateWidget(ui.ExpandedImageBox, pos = (14, 72))
|
|
self.itemTypeFilterBox.LoadImage("ikashop/lite/search_shop/filter_box.png")
|
|
|
|
self.itemTypeHeader = self.CreateWidget(ui.TextLine, pos = (6, 13), parent = self.itemTypeFilterBox)
|
|
self.itemTypeHeader.SetText(locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_HEADER)
|
|
|
|
self.itemTypeSelectButton = self.CreateWidget(ui.Button, pos = (85, 8), parent = self.itemTypeFilterBox)
|
|
self.itemTypeSelectButton.SetUpVisual("ikashop/lite/search_shop/combo_box_button/default.png")
|
|
self.itemTypeSelectButton.SetDownVisual("ikashop/lite/search_shop/combo_box_button/default.png")
|
|
self.itemTypeSelectButton.SetOverVisual("ikashop/lite/search_shop/combo_box_button/hover.png")
|
|
self.itemTypeSelectButton.SAFE_SetEvent(self._OnClickItemTypeSelectButton)
|
|
|
|
self.itemTypeSelectComboBox = self.CreateWidget(IkarusShopComboBox, pos = (14 + 85, 72 + 28))
|
|
self.itemTypeSelectComboBox.SetItems(self.ITEM_TYPES)
|
|
self.itemTypeSelectComboBox.SetSelectItemEvent(self._OnSelectItemType)
|
|
|
|
# item subtype filter
|
|
self.itemSubTypeHeader = self.CreateWidget(ui.TextLine, pos = (6, 39), parent = self.itemTypeFilterBox)
|
|
self.itemSubTypeHeader.SetText(locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_HEADER)
|
|
|
|
self.itemSubTypeSelectButton = self.CreateWidget(ui.Button, pos = (85, 8+26), parent = self.itemTypeFilterBox)
|
|
self.itemSubTypeSelectButton.SetUpVisual("ikashop/lite/search_shop/combo_box_button/default.png")
|
|
self.itemSubTypeSelectButton.SetDownVisual("ikashop/lite/search_shop/combo_box_button/default.png")
|
|
self.itemSubTypeSelectButton.SetOverVisual("ikashop/lite/search_shop/combo_box_button/hover.png")
|
|
self.itemSubTypeSelectButton.SAFE_SetEvent(self._OnClickItemSubTypeSelectButton)
|
|
|
|
self.itemSubTypeSelectComboBox = self.CreateWidget(IkarusShopComboBox, pos = (14 + 86, 72 + 8 + 26 + 20))
|
|
self.itemSubTypeSelectComboBox.SetSelectItemEvent(self._OnSelectItemSubType)
|
|
self.itemSubTypeSelectComboBox.SetItems([locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,])
|
|
|
|
# item price filter
|
|
self.itemPriceFilterBox = self.CreateWidget(ui.ExpandedImageBox, pos = (14, getBottom(self.itemTypeFilterBox) + 5))
|
|
self.itemPriceFilterBox.LoadImage("ikashop/lite/search_shop/filter_box.png")
|
|
|
|
self.itemPriceMinHeader = self.CreateWidget(ui.TextLine, pos = (6, 13), parent = self.itemPriceFilterBox)
|
|
self.itemPriceMinHeader.SetText(locale.IKASHOP_SEARCH_SHOP_ITEM_PRICE_MIN_HEADER)
|
|
|
|
self.itemPriceMaxHeader = self.CreateWidget(ui.TextLine, pos = (6, 39), parent = self.itemPriceFilterBox)
|
|
self.itemPriceMaxHeader.SetText(locale.IKASHOP_SEARCH_SHOP_ITEM_PRICE_MAX_HEADER)
|
|
|
|
self.itemPriceMinBox = self.CreateWidget(ui.ImageBox, pos = (64, 8), parent = self.itemPriceFilterBox)
|
|
self.itemPriceMinBox.LoadImage("ikashop/lite/search_shop/input_box.png")
|
|
|
|
self.itemPriceMaxBox = self.CreateWidget(ui.ImageBox, pos = (64, 8+26), parent = self.itemPriceFilterBox)
|
|
self.itemPriceMaxBox.LoadImage("ikashop/lite/search_shop/input_box.png")
|
|
|
|
self.itemPriceMinEdit = self.CreateWidget(ui.EditLine, pos = (6, 6), parent = self.itemPriceMinBox)
|
|
self.itemPriceMinEdit.SetMax(12)
|
|
self.itemPriceMinEdit.SetEscapeEvent(ui.__mem_func__(self.itemPriceMinEdit.KillFocus))
|
|
self.itemPriceMinEdit.SetNumberMode()
|
|
self.itemPriceMinBox.SetOnMouseLeftButtonUpEvent(self.itemPriceMinEdit.SetFocus)
|
|
|
|
self.itemPriceMaxEdit = self.CreateWidget(ui.EditLine, pos = (6, 6), parent = self.itemPriceMaxBox)
|
|
self.itemPriceMaxEdit.SetMax(12)
|
|
self.itemPriceMaxEdit.SetEscapeEvent(ui.__mem_func__(self.itemPriceMaxEdit.KillFocus))
|
|
self.itemPriceMaxEdit.SetNumberMode()
|
|
self.itemPriceMaxBox.SetOnMouseLeftButtonUpEvent(self.itemPriceMaxEdit.SetFocus)
|
|
|
|
# item level filter
|
|
self.itemLevelFilterBox = self.CreateWidget(ui.ExpandedImageBox, pos = (14, getBottom(self.itemPriceFilterBox) + 5))
|
|
self.itemLevelFilterBox.LoadImage("ikashop/lite/search_shop/filter_box.png")
|
|
|
|
self.itemLevelMinHeader = self.CreateWidget(ui.TextLine, pos = (6, 13), parent = self.itemLevelFilterBox)
|
|
self.itemLevelMinHeader.SetText(locale.IKASHOP_SEARCH_SHOP_ITEM_LEVEL_MIN_HEADER)
|
|
|
|
self.itemLevelMaxHeader = self.CreateWidget(ui.TextLine, pos = (6, 39), parent = self.itemLevelFilterBox)
|
|
self.itemLevelMaxHeader.SetText(locale.IKASHOP_SEARCH_SHOP_ITEM_LEVEL_MAX_HEADER)
|
|
|
|
self.itemLevelMinBox = self.CreateWidget(ui.ImageBox, pos = (64, 8), parent = self.itemLevelFilterBox)
|
|
self.itemLevelMinBox.LoadImage("ikashop/lite/search_shop/input_box.png")
|
|
|
|
self.itemLevelMaxBox = self.CreateWidget(ui.ImageBox, pos = (64, 8+26), parent = self.itemLevelFilterBox)
|
|
self.itemLevelMaxBox.LoadImage("ikashop/lite/search_shop/input_box.png")
|
|
|
|
self.itemLevelMinEdit = self.CreateWidget(ui.EditLine, pos = (6, 6), parent = self.itemLevelMinBox)
|
|
self.itemLevelMinEdit.SetMax(12)
|
|
self.itemLevelMinEdit.SetEscapeEvent(ui.__mem_func__(self.itemLevelMinEdit.KillFocus))
|
|
self.itemLevelMinEdit.SetNumberMode()
|
|
self.itemLevelMinBox.SetOnMouseLeftButtonUpEvent(self.itemLevelMinEdit.SetFocus)
|
|
|
|
self.itemLevelMaxEdit = self.CreateWidget(ui.EditLine, pos = (6, 6), parent = self.itemLevelMaxBox)
|
|
self.itemLevelMaxEdit.SetMax(12)
|
|
self.itemLevelMaxEdit.SetEscapeEvent(ui.__mem_func__(self.itemLevelMaxEdit.KillFocus))
|
|
self.itemLevelMaxEdit.SetNumberMode()
|
|
self.itemLevelMaxBox.SetOnMouseLeftButtonUpEvent(self.itemLevelMaxEdit.SetFocus)
|
|
|
|
# item attributes filter
|
|
self.attributeSettings = GetAttributeSettings()
|
|
self.attributeBonusToItem = {bonus[0]:index for index, bonus in enumerate(self.attributeSettings)}
|
|
|
|
self.itemAttrsFilterBox = self.CreateWidget(ui.ExpandedImageBox, pos = (14, getBottom(self.itemLevelFilterBox) + 5))
|
|
self.itemAttrsFilterBox.LoadImage("ikashop/lite/search_shop/filter_box.png")
|
|
self.itemAttrsFilterBox.SetScale(1.0, 126.0 / self.itemAttrsFilterBox.GetHeight())
|
|
|
|
self.attrSelectButtons = []
|
|
self.attrComboBoxes = []
|
|
self.attrValueBoxes = []
|
|
self.attrValueEdits = []
|
|
|
|
for i in xrange(ikashop.FILTER_ATTRIBUTE_NUM):
|
|
# select button
|
|
attrSelectButton = self.CreateWidget(ui.Button, pos = (6, 6 + i*23), parent = self.itemAttrsFilterBox)
|
|
attrSelectButton.SetUpVisual("ikashop/lite/search_shop/attribute_select_button/default.png")
|
|
attrSelectButton.SetDownVisual("ikashop/lite/search_shop/attribute_select_button/default.png")
|
|
attrSelectButton.SetOverVisual("ikashop/lite/search_shop/attribute_select_button/hover.png")
|
|
attrSelectButton.SAFE_SetEvent(self._OnClickAttributeSelectButton, i)
|
|
attrSelectButton.SetText("")
|
|
bx, by = attrSelectButton.ButtonText.GetLocalPosition()
|
|
attrSelectButton.ButtonText.SetPosition(bx - 10, by)
|
|
self.attrSelectButtons.append(attrSelectButton)
|
|
|
|
attrComboBox = self.CreateWidget(IkarusShopComboBox, pos = (14 + 6, self.itemAttrsFilterBox.GetLocalPosition()[1] + 5 + i*23 + 20))
|
|
attrComboBox.SetSelectItemEvent(lambda id, text, _self = proxy(self), _num = i : _self._OnSelectAttributeItem(_num, id, text))
|
|
attrComboBox.ChangeElementImages(largerComboBoxImages)
|
|
attrComboBox.SetViewCount(7)
|
|
attrComboBox.SetItems([text for apply, text in self.attributeSettings])
|
|
self.attrComboBoxes.append(attrComboBox)
|
|
|
|
attrValueBox = self.CreateWidget(ui.ImageBox, pos = (148, 6 + i*23), parent = self.itemAttrsFilterBox)
|
|
attrValueBox.LoadImage("ikashop/lite/search_shop/attribute_value_box.png")
|
|
self.attrValueBoxes.append(attrValueBox)
|
|
|
|
attrValueEdit = self.CreateWidget(ui.EditLine, pos = (9, 6), parent = attrValueBox)
|
|
attrValueEdit.SetMax(4)
|
|
attrValueEdit.SetEscapeEvent(ui.__mem_func__(attrValueEdit.KillFocus))
|
|
attrValueEdit.SetNumberMode()
|
|
attrValueBox.SetOnMouseLeftButtonUpEvent(attrValueEdit.SetFocus)
|
|
self.attrValueEdits.append(attrValueEdit)
|
|
|
|
# special filters
|
|
self.itemSpecialFilterBox = self.CreateWidget(ui.ExpandedImageBox, pos = (14, getBottom(self.itemAttrsFilterBox) + 5))
|
|
self.itemSpecialFilterBox.LoadImage("ikashop/lite/search_shop/filter_box.png")
|
|
|
|
self.itemAlchemyGradeHeader = self.CreateWidget(ui.TextLine, pos = (6, 13), parent = self.itemSpecialFilterBox)
|
|
self.itemAlchemyGradeHeader.SetText(locale.IKASHOP_SEARCH_SHOP_ALCHEMY_GRADE_HEADER)
|
|
|
|
self.itemAlchemyGradeSelectButton = self.CreateWidget(ui.Button, pos = (85, 8), parent = self.itemSpecialFilterBox)
|
|
self.itemAlchemyGradeSelectButton.SetUpVisual("ikashop/lite/search_shop/combo_box_button/default.png")
|
|
self.itemAlchemyGradeSelectButton.SetDownVisual("ikashop/lite/search_shop/combo_box_button/default.png")
|
|
self.itemAlchemyGradeSelectButton.SetOverVisual("ikashop/lite/search_shop/combo_box_button/hover.png")
|
|
self.itemAlchemyGradeSelectButton.SAFE_SetEvent(self._OnClickAlchemyGradeSelectButton)
|
|
|
|
self.itemAlchemyGradeSelectComboBox = self.CreateWidget(IkarusShopComboBox, pos = (14 + 85, getBottom(self.itemAttrsFilterBox) + 5 + 8 + 20))
|
|
self.itemAlchemyGradeSelectComboBox.SetSelectItemEvent(self._OnSelectAlchemyGradeType)
|
|
self.itemAlchemyGradeSelectComboBox.SetItems(self.ALCHEMY_GRADES)
|
|
|
|
self.itemSashAbsHeader = self.CreateWidget(ui.TextLine, pos = (6, 39), parent = self.itemSpecialFilterBox)
|
|
self.itemSashAbsHeader.SetText(locale.IKASHOP_SEARCH_SHOP_SASH_ABSORB_HEADER)
|
|
|
|
self.itemSashAbsSelectButton = self.CreateWidget(ui.Button, pos = (85, 8+26), parent = self.itemSpecialFilterBox)
|
|
self.itemSashAbsSelectButton.SetUpVisual("ikashop/lite/search_shop/combo_box_button/default.png")
|
|
self.itemSashAbsSelectButton.SetDownVisual("ikashop/lite/search_shop/combo_box_button/default.png")
|
|
self.itemSashAbsSelectButton.SetOverVisual("ikashop/lite/search_shop/combo_box_button/hover.png")
|
|
self.itemSashAbsSelectButton.SAFE_SetEvent(self._OnClickSashGradeSelectButton)
|
|
|
|
self.itemSashAbsSelectComboBox = self.CreateWidget(IkarusShopComboBox, pos = (14 + 86, getBottom(self.itemAttrsFilterBox) + 5 + 8 + 26 + 20))
|
|
self.itemSashAbsSelectComboBox.SetItems(self.SASH_ABSORBS)
|
|
self.itemSashAbsSelectComboBox.SetSelectItemEvent(self._OnSelectSashGrade)
|
|
self.itemSashAbsSelectComboBox.SetViewCount(4)
|
|
|
|
# buttons on the bottom
|
|
self.auctionListButton = self.CreateWidget(ui.Button, pos = (14, getBottom(self.itemSpecialFilterBox) + 6))
|
|
self.auctionListButton.SetUpVisual("ikashop/lite/search_shop/auction_list_button/default.png")
|
|
self.auctionListButton.SetDownVisual("ikashop/lite/search_shop/auction_list_button/default.png")
|
|
self.auctionListButton.SetOverVisual("ikashop/lite/search_shop/auction_list_button/hover.png")
|
|
self.auctionListButton.SAFE_SetEvent(self._OnClickAuctionListButton)
|
|
self.auctionListButton.SetText(locale.IKASHOP_SEARCH_SHOP_AUCTION_LIST_BUTTON_TEXT)
|
|
tx, ty = self.auctionListButton.ButtonText.GetLocalPosition()
|
|
self.auctionListButton.ButtonText.SetPosition(tx + 5, ty)
|
|
self.auctionListButton.ButtonText.SetPackedFontColor(0xFFFFFFFF)
|
|
|
|
hpos = (14 + self.itemSpecialFilterBox.GetWidth() - self.auctionListButton.GetWidth(), getBottom(self.itemSpecialFilterBox) + 6)
|
|
self.historyButton = self.CreateWidget(ui.Button, pos = hpos)
|
|
self.historyButton.SetUpVisual("ikashop/lite/search_shop/history_button/default.png")
|
|
self.historyButton.SetDownVisual("ikashop/lite/search_shop/history_button/default.png")
|
|
self.historyButton.SetOverVisual("ikashop/lite/search_shop/history_button/hover.png")
|
|
self.historyButton.SAFE_SetEvent(self._OnClickHistoryButton)
|
|
self.historyButton.SetText(locale.IKASHOP_SEARCH_SHOP_HISTORY_BUTTON_TEXT)
|
|
tx, ty = self.historyButton.ButtonText.GetLocalPosition()
|
|
self.historyButton.ButtonText.SetPosition(tx + 5, ty)
|
|
self.historyButton.ButtonText.SetPackedFontColor(0xFFFFFFFF)
|
|
|
|
self.resultBox = self.CreateWidget(ui.ExpandedImageBox, pos = (227, 40))
|
|
self.resultBox.LoadImage("ikashop/lite/search_shop/result_box.png")
|
|
self.resultBox.SetMouseWheelEvent(self._OnScrollMouseWheelResultItems)
|
|
hs = float(self.resultBox.GetWidth() - 10) / self.resultBox.GetWidth()
|
|
vs = 469.0 / self.resultBox.GetHeight()
|
|
self.resultBox.SetScale(hs, vs)
|
|
|
|
# making result items
|
|
self.resultItems = []
|
|
for i in xrange(self.RESULT_ITEM_VIEW_COUNT):
|
|
item = self.CreateWidget(IkarusSearchShopItem, pos = (5, 4 + 116*i), parent = self.resultBox)
|
|
item.SetSearchShopBoard(self)
|
|
self.resultItems.append(item)
|
|
|
|
# making result item scrollbar
|
|
self.resultItemScrollBar = self.CreateWidget(ui.ScrollBar, pos = (self.resultBox.GetWidth() - 19, 3), parent = self.resultBox)
|
|
self.resultItemScrollBar.SetScrollEvent(self._OnScrollResultItems)
|
|
self.resultItemScrollBar.SetScrollBarSize(self.resultBox.GetHeight() - 6)
|
|
|
|
# making automatically close the combo box
|
|
# and setting them on top, with 0th element selected
|
|
self.comboBoxes = []
|
|
for value in vars(self).values() + self.attrComboBoxes:
|
|
if isinstance(value, IkarusShopComboBox):
|
|
value.AddFlag("float")
|
|
value.SetTop()
|
|
value.SelectItem(0)
|
|
self._RegisterDialog(value)
|
|
self.comboBoxes.append(proxy(value))
|
|
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
self.sortByPriceCheckbox = self.CreateWidget(IkashopCheckBox)
|
|
self.sortByPriceCheckbox.SetImages("ikashop/ultimate/sort_checkbox/base.png", "ikashop/ultimate/sort_checkbox/checked.png")
|
|
self.sortByPriceCheckbox.SetText(locale.IKASHOP_ULTIMATE_SORT_BY_PRICE_CHECKBOX)
|
|
self.sortByPriceCheckbox.SetPosition(self.GetWidth() - 40 - self.sortByPriceCheckbox.GetWidth(), 7)
|
|
self.sortByPriceCheckbox.SetCheckEvent(self._OnCheckSortByPriceCheckBox)
|
|
|
|
def _ExtractFilterTypes(self):
|
|
return \
|
|
self.itemTypeSelectComboBox.GetSelectedItem(),\
|
|
self.itemSubTypeSelectComboBox.GetSelectedItem()
|
|
|
|
def _ExtractFilterPrice(self):
|
|
minPrice = self.itemPriceMinEdit.GetText()
|
|
minPrice = minPrice.lower().replace("k", "000")
|
|
minPrice = long(minPrice) if minPrice and minPrice.isdigit() else long(0)
|
|
maxPrice = self.itemPriceMaxEdit.GetText()
|
|
maxPrice = maxPrice.lower().replace("k", "000")
|
|
maxPrice = long(maxPrice) if maxPrice and maxPrice.isdigit() else long(0)
|
|
return minPrice, maxPrice
|
|
|
|
def _ExtractFilterLevel(self):
|
|
minLevel = self.itemLevelMinEdit.GetText()
|
|
minLevel = int(minLevel) if minLevel and minLevel.isdigit() else 0
|
|
maxLevel = self.itemLevelMaxEdit.GetText()
|
|
maxLevel = int(maxLevel) if maxLevel and maxLevel.isdigit() else 0
|
|
return minLevel, maxLevel
|
|
|
|
def _ExtractFilterAttributes(self):
|
|
def extractOne(combo, edit):
|
|
if combo.GetSelectedItem() == 0:
|
|
return 0,0
|
|
bonus = self.attributeSettings[combo.GetSelectedItem()][0]
|
|
value = edit.GetText()
|
|
value = int(value) if value and value.isdigit() else 0
|
|
return bonus, value
|
|
|
|
ret = tuple(extractOne(self.attrComboBoxes[i], self.attrValueEdits[i]) for i in xrange(ikashop.FILTER_ATTRIBUTE_NUM))
|
|
return ret
|
|
|
|
def _ExtractFilterSpecial(self):
|
|
sashAbs = self.itemSashAbsSelectComboBox.GetSelectedItem()
|
|
dssGrade = self.itemAlchemyGradeSelectComboBox.GetSelectedItem()
|
|
return sashAbs, dssGrade
|
|
|
|
def _ExtractFilterSettings(self):
|
|
# getting values
|
|
inputName = self.inputNameEdit.GetText()
|
|
type, subtype = self._ExtractFilterTypes()
|
|
prices = self._ExtractFilterPrice()
|
|
levels = self._ExtractFilterLevel()
|
|
attributes = self._ExtractFilterAttributes()
|
|
specials = self._ExtractFilterSpecial()
|
|
# making arg tuple
|
|
args = (inputName, type, subtype, prices, levels, attributes, specials)
|
|
if not IsUsingFilter(args):
|
|
return None
|
|
return args
|
|
|
|
def _OnClickSearchButton(self):
|
|
self.inputNameEdit.KillFocus()
|
|
filters = self._ExtractFilterSettings()
|
|
if filters is None:
|
|
self.OpenPopupDialog(locale.IKASHOP_SEARCH_SHOP_NO_FILTER_USED)
|
|
return
|
|
ikashop.SendFilterRequest(*filters)
|
|
|
|
def _OnClickAuctionListButton(self):
|
|
self.auctionListBoard.Toggle()
|
|
|
|
def _OnClickItemTypeSelectButton(self):
|
|
for combo in self.comboBoxes:
|
|
if not combo.IsMe(self.itemTypeSelectComboBox) and combo.IsShow():
|
|
combo.Close()
|
|
self.itemTypeSelectComboBox.Toggle()
|
|
|
|
def _OnClickItemSubTypeSelectButton(self):
|
|
for combo in self.comboBoxes:
|
|
if not combo.IsMe(self.itemSubTypeSelectComboBox) and combo.IsShow():
|
|
combo.Close()
|
|
self.itemSubTypeSelectComboBox.Toggle()
|
|
|
|
def _OnSelectItemType(self, index, text):
|
|
self.itemTypeSelectButton.SetText(text)
|
|
self.itemSubTypeSelectComboBox.SetItems(self.SUB_TYPES[index])
|
|
self.itemSubTypeSelectComboBox.SelectItem(0)
|
|
|
|
def _OnSelectItemSubType(self, index, text):
|
|
self.itemSubTypeSelectButton.SetText(text)
|
|
|
|
def _OnSelectAttributeItem(self, num, index, text):
|
|
usingButton = self.attrSelectButtons[num]
|
|
for i in xrange(100):
|
|
btext = text[:-i] if i > 0 else text
|
|
if i != 0:
|
|
btext += ".."
|
|
usingButton.SetText(btext)
|
|
if usingButton.ButtonText.GetTextSize()[0] + 35 < usingButton.GetWidth():
|
|
break
|
|
|
|
def _OnClickAttributeSelectButton(self, num):
|
|
usingComboBox = self.attrComboBoxes[num]
|
|
for combo in self.comboBoxes:
|
|
if not combo.IsMe(usingComboBox) and combo.IsShow():
|
|
combo.Close()
|
|
usingComboBox.Toggle()
|
|
|
|
def _OnClickSashGradeSelectButton(self):
|
|
for combo in self.comboBoxes:
|
|
if not combo.IsMe(self.itemSashAbsSelectComboBox) and combo.IsShow():
|
|
combo.Close()
|
|
self.itemSashAbsSelectComboBox.Toggle()
|
|
|
|
def _OnSelectSashGrade(self, index, text):
|
|
self.itemSashAbsSelectButton.SetText(text)
|
|
|
|
def _OnClickAlchemyGradeSelectButton(self):
|
|
for combo in self.comboBoxes:
|
|
if not combo.IsMe(self.itemAlchemyGradeSelectComboBox) and combo.IsShow():
|
|
combo.Close()
|
|
self.itemAlchemyGradeSelectComboBox.Toggle()
|
|
|
|
def _OnSelectAlchemyGradeType(self, index, text):
|
|
self.itemAlchemyGradeSelectButton.SetText(text)
|
|
|
|
def _OnUpdateInputName(self, isFocus):
|
|
if not isFocus or len(self.inputNameEdit.GetText()) < 3:
|
|
self.inputNameSuggestion.Close()
|
|
return
|
|
|
|
text = self.inputNameEdit.GetText().lower()
|
|
most_relevant = []
|
|
less_relevant = []
|
|
|
|
for name in self.itemNames:
|
|
if name.startswith(text):
|
|
most_relevant.append(name)
|
|
elif text in name:
|
|
less_relevant.append(name)
|
|
|
|
most_relevant = sorted(most_relevant)
|
|
less_relevant = sorted(less_relevant)
|
|
suggestions = most_relevant + less_relevant
|
|
|
|
self.inputNameSuggestion.SetItems(suggestions)
|
|
if suggestions:
|
|
self.inputNameSuggestion.Open()
|
|
else:
|
|
self.inputNameSuggestion.Close()
|
|
|
|
def _OnSelectSuggestedItemName(self, index, name):
|
|
self.inputNameEdit.SetText(name)
|
|
self.inputNameEdit.KillFocus()
|
|
|
|
def _OnClickResetFilters(self):
|
|
# selecting 0 item on each combo box
|
|
for combo in self.comboBoxes:
|
|
if not combo.IsMe(self.inputNameSuggestion):
|
|
combo.SelectItem(0)
|
|
# resetting edit line values
|
|
self.itemPriceMinEdit.SetText("")
|
|
self.itemPriceMaxEdit.SetText("")
|
|
self.itemLevelMinEdit.SetText("")
|
|
self.itemLevelMaxEdit.SetText("")
|
|
self.inputNameEdit.SetText("")
|
|
for edit in self.attrValueEdits:
|
|
edit.SetText("")
|
|
|
|
def _OnClickHistoryButton(self):
|
|
self.historyFilterBoard.Toggle()
|
|
|
|
def _OnScrollResultItems(self):
|
|
self._RefreshResultItem()
|
|
|
|
def _OnScrollMouseWheelResultItems(self, delta):
|
|
self.resultItemScrollBar.OnDown() if delta < 0\
|
|
else self.resultItemScrollBar.OnUp()
|
|
return True
|
|
|
|
def _RefreshResultItem(self):
|
|
# calculating sindex
|
|
pos = self.resultItemScrollBar.GetPos() if self.resultItemScrollBar.IsShow() else 0.0
|
|
diff = max(len(self.items) - self.RESULT_ITEM_VIEW_COUNT, 0)
|
|
sindex = int(diff * pos)
|
|
eindex = sindex + min(len(self.items), self.RESULT_ITEM_VIEW_COUNT)
|
|
|
|
# hiding all views
|
|
for view in self.resultItems:
|
|
view.Hide()
|
|
|
|
# setting up and showing only used views
|
|
for i in xrange(sindex, eindex):
|
|
ri = i - sindex
|
|
data = self.items[i]
|
|
view = self.resultItems[ri]
|
|
view.Setup(data)
|
|
view.Show()
|
|
view.SetAvailable() if data.get('deleted', 0) == 0 \
|
|
else view.SetNotAvailable()
|
|
|
|
# updating scrollbar's middlebar length
|
|
self.resultItemScrollBar.UpdateScrollbarLenght(4 + 116*len(self.items))
|
|
|
|
def _UpdateScrollbarState(self):
|
|
self.resultItemScrollBar.Show() if self.RESULT_ITEM_VIEW_COUNT < len(self.items)\
|
|
else self.resultItemScrollBar.Hide()
|
|
self.resultItemScrollBar.SetPos(0)
|
|
|
|
def _ApplySearchFilterSettings(self, settings):
|
|
# setting up name
|
|
self.inputNameEdit.SetText(settings['name'])
|
|
# setting up prices
|
|
self.itemPriceMaxEdit.SetText(str(settings['price_max']) if settings['price_max'] != 0 else "")
|
|
self.itemPriceMinEdit.SetText(str(settings['price_min']) if settings['price_min'] != 0 else "")
|
|
# setting up levels
|
|
self.itemLevelMaxEdit.SetText(str(settings['level_max']) if settings['level_max'] != 0 else "")
|
|
self.itemLevelMinEdit.SetText(str(settings['level_min']) if settings['level_min'] != 0 else "")
|
|
# setting up comboboxes
|
|
self.itemTypeSelectComboBox.SelectItem(settings['type'])
|
|
self.itemSubTypeSelectComboBox.SelectItem(settings['subtype'])
|
|
self.itemSashAbsSelectComboBox.SelectItem(settings['sash'])
|
|
self.itemAlchemyGradeSelectComboBox.SelectItem(settings['alchemy'])
|
|
# setting up attributes
|
|
for attrComboBox, attrEdit, sett in zip(self.attrComboBoxes, self.attrValueEdits, settings['attrs']):
|
|
type, value = sett
|
|
attrEdit.SetText(str(value) if value != 0 else "")
|
|
attrComboBox.SelectItem(self.attributeBonusToItem[type])
|
|
|
|
def HistoryRedoSearch(self, settings):
|
|
self._ApplySearchFilterSettings(settings)
|
|
self._OnClickSearchButton()
|
|
|
|
def Open(self):
|
|
now = app.GetTime()
|
|
if self.lastOpen == 0 or now - self.lastOpen > 60 or len(self.items) == 0:
|
|
ikashop.SendRandomSearchFillRequest()
|
|
self._IsRandomFilling = True
|
|
return
|
|
|
|
self.lastOpen = now
|
|
self.Show()
|
|
self.SetTop()
|
|
|
|
def Close(self):
|
|
self.Hide()
|
|
self.inputNameEdit.KillFocus()
|
|
|
|
def DeleteSearchResultItem(self, id):
|
|
for item in self.items:
|
|
if item['id'] == id:
|
|
item['deleted'] = 1
|
|
|
|
for view in self.resultItems:
|
|
if view.GetId() == id:
|
|
view.SetNotAvailable()
|
|
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
def RequestOpenSellerShop(self, owner, vnum, count, price):
|
|
if not self.sortByPriceCheckbox.IsEnabled():
|
|
self.OpenPopupDialog(locale.IKASHOP_ULTIMATE_SORT_BY_PRICE_PREMIUM_FEATURE)
|
|
return
|
|
self.markItemInfo = vnum, count, price
|
|
ikashop.SendOpenShop(owner)
|
|
|
|
def _OnSortByPrice(self):
|
|
priceGetter = lambda item : item['price'] + item.get('cheque', 0) * YANG_PER_CHEQUE
|
|
self.items = sorted(self.items, key = priceGetter) if self.sortByPriceCheckbox.IsChecked() \
|
|
else self.shuffleItem
|
|
self._RefreshResultItem()
|
|
|
|
def _OnCheckSortByPriceCheckBox(self):
|
|
if not self.sortByPriceCheckbox.IsEnabled():
|
|
self.OpenPopupDialog(locale.IKASHOP_ULTIMATE_SORT_BY_PRICE_PREMIUM_FEATURE)
|
|
return
|
|
self._OnSortByPrice()
|
|
|
|
def ActiveSortByPriceFeature(self):
|
|
self.sortByPriceCheckbox.Enable()
|
|
self.sortByPriceCheckbox.Check(callback=0)
|
|
|
|
def DeactiveSortByPriceFeature(self):
|
|
self.sortByPriceCheckbox.Disable()
|
|
self.sortByPriceCheckbox.Uncheck(callback=1)
|
|
|
|
# BINARY CALLS
|
|
def SetSearchResultItems(self, items):
|
|
shuffle(items)
|
|
self.items = items
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
self.shuffleItem = items
|
|
self._UpdateScrollbarState()
|
|
if self.IsShow() == False:
|
|
self.Show()
|
|
self.SetTop()
|
|
self.lastOpen = app.GetTime()
|
|
if not self._IsRandomFilling:
|
|
self.RegisterHistoryFilter()
|
|
self._IsRandomFilling = False
|
|
|
|
def OpenShopGuest(self, data):
|
|
self.shopGuestBoard.Open(data)
|
|
if self.markItemInfo:
|
|
vnum, count, price = self.markItemInfo
|
|
self.shopGuestBoard.MarkItems(vnum, count, price)
|
|
|
|
def ShopExpiredGuesting(self, id):
|
|
self.shopGuestBoard.CheckExpiring(id)
|
|
|
|
def ShopGuestRemoveItem(self, itemid):
|
|
self.shopGuestBoard.ShopGuestRemoveItem(itemid)
|
|
|
|
def ShopGuestEditItem(self, itemid, price):
|
|
self.shopGuestBoard.EditItem(itemid, price)
|
|
|
|
def OpenAuctionGuest(self, data):
|
|
self.auctionGuestBoard.Open(data)
|
|
|
|
def SetAuctionList(self, auctions):
|
|
self.auctionListBoard.SetAuctions(auctions)
|
|
|
|
def RegisterHistoryFilter(self):
|
|
filter = self._ExtractFilterSettings()
|
|
ikashop.RegisterFilterHistory(len(self.items), *filter)
|
|
self.historyFilterBoard.SetFilters(ikashop.GetFilterHistory())
|
|
|
|
if app.EXTEND_IKASHOP_PRO:
|
|
def SetOpenWhisper(self, event):
|
|
self.openWhisperEvent = event
|
|
|
|
def OpenWhisper(self, name):
|
|
self.openWhisperEvent(name)
|
|
|
|
if app.EXTEND_IKASHOP_ULTIMATE:
|
|
class IkarusShopSkinListView(IkarusShopWindow):
|
|
def __init__(self):
|
|
super(IkarusShopSkinListView, self).__init__()
|
|
self._LoadIkarusShopSkinListView()
|
|
|
|
def _LoadIkarusShopSkinListView(self):
|
|
self.button = self.CreateWidget(ui.Button)
|
|
self.button.SetUpVisual("ikashop/ultimate/skin_select_button/default.png")
|
|
self.button.SetOverVisual("ikashop/ultimate/skin_select_button/hover.png")
|
|
self.button.SetDownVisual("ikashop/ultimate/skin_select_button/default.png")
|
|
self.button.SetText("")
|
|
self.button.ButtonText.SetPackedFontColor(0xFFFFFFFF)
|
|
self.button.ButtonText.SetHorizontalAlignLeft()
|
|
self.button.ButtonText.SetPosition(20, self.button.GetHeight()/2)
|
|
self.SetSize(self.button.GetWidth(), self.button.GetHeight())
|
|
|
|
def Setup(self, data):
|
|
index, name = data
|
|
self.button.SetText(name)
|
|
self.index = index
|
|
|
|
def SetOnClick(self, event):
|
|
self.button.SAFE_SetEvent(event, proxy(self))
|
|
|
|
|
|
class IkarusShopSkinBoard(IkarusShopListBoard):
|
|
|
|
SKIN_VIEW_COUNT = 6
|
|
SHOP_SKIN_COUNT = 7
|
|
|
|
def __init__(self):
|
|
self.selected = None
|
|
super(IkarusShopSkinBoard, self).__init__()
|
|
ikashop.SetShopSkinBoard(self)
|
|
self._SettingUpBoard()
|
|
self._LoadIkarusShopSkinBoard()
|
|
|
|
def _SettingUpBoard(self):
|
|
# setting list board
|
|
self.SetSize(500, 260)
|
|
super(IkarusShopSkinBoard, self)._SettingUpBoard()
|
|
self.SetTitleName(locale.IKASHOP_ULTIMATE_SHOP_SKIN_BOARD_TITLE)
|
|
|
|
def Destroy(self):
|
|
ikashop.SetShopSkinBoard(None)
|
|
super(IkarusShopSkinBoard, self).Destroy()
|
|
|
|
def _LoadIkarusShopSkinBoard(self):
|
|
# simulating smaller size to reduce list board size only
|
|
ui.Window.SetSize(self, 500, 220)
|
|
super(IkarusShopSkinBoard, self)._LoadIkarusShopListBoard()
|
|
ui.Window.SetSize(self, 500, 260)
|
|
|
|
self._MakeListElements(IkarusShopSkinListView, self.SKIN_VIEW_COUNT)
|
|
for view in self.views:
|
|
view.SetPosition(196, view.GetLocalPosition()[1])
|
|
view.SetOnClick(self._OnClickView)
|
|
|
|
self.skinImage = self.CreateWidget(ui.ImageBox, x = 10, y = 37)
|
|
|
|
self.acceptButton = self.CreateWidget(ui.Button, pos = (346 - 65 - 5, 225))
|
|
self.acceptButton.SetUpVisual("ikashop/lite/search_shop/buy_button/default.png")
|
|
self.acceptButton.SetDownVisual("ikashop/lite/search_shop/buy_button/default.png")
|
|
self.acceptButton.SetOverVisual("ikashop/lite/search_shop/buy_button/hover.png")
|
|
self.acceptButton.SAFE_SetEvent(self._OnClickAcceptButton)
|
|
self.acceptButton.SetText(locale.IKASHOP_OFFER_LIST_ACCEPT_OFFER_BUTTON_TEXT)
|
|
|
|
self.cancelButton = self.CreateWidget(ui.Button, pos = (346 + 4 + self.acceptButton.GetWidth() - 65 + 5, 225))
|
|
self.cancelButton.SetUpVisual("ikashop/lite/search_shop/offer_button/default.png")
|
|
self.cancelButton.SetDownVisual("ikashop/lite/search_shop/offer_button/default.png")
|
|
self.cancelButton.SetOverVisual("ikashop/lite/search_shop/offer_button/hover.png")
|
|
self.cancelButton.SAFE_SetEvent(self._OnClickCancelButton)
|
|
self.cancelButton.SetText(locale.IKASHOP_OFFER_LIST_CANCEL_OFFER_BUTTON_TEXT)
|
|
|
|
def Open(self):
|
|
images = ["ikashop/ultimate/decoration/{}.png".format(i+1) for i in xrange(self.SHOP_SKIN_COUNT)]
|
|
names = [locale.IKASHOP_ULTIMATE_SHOP_SKIN_NAME.format(i+1) for i in xrange(self.SHOP_SKIN_COUNT)]
|
|
self.data = [{'name' : name, 'image' : image} for name, image in zip(names,images)]
|
|
|
|
self.Show()
|
|
self.SetTop()
|
|
self.SetElements([(index, name) for index, name in enumerate(names)])
|
|
self._SelectElement(0)
|
|
self.elementScrollbar.SetPos(0)
|
|
|
|
def Close(self):
|
|
self.Hide()
|
|
|
|
def _OnClickView(self, view):
|
|
self._SelectElement(view.index)
|
|
self._RefreshElements()
|
|
|
|
def _SelectElement(self, index):
|
|
image = self.data[index]['image']
|
|
name = "|cFFFFFF99|h"+self.data[index]['name']+"|r"
|
|
|
|
if self.selected != None:
|
|
self.elements[self.selected] = (self.selected, self.data[self.selected]['name'])
|
|
|
|
self.skinImage.LoadImage(image)
|
|
self.elements[index] = (index,name)
|
|
self.selected = index
|
|
|
|
def _OnClickAcceptButton(self):
|
|
message = locale.IKASHOP_ULTIMATE_SHOP_SKIN_USAGE_QUESTION
|
|
self.OpenQuestionDialog(message, self._OnAcceptSkinUsageQuestion)
|
|
|
|
def _OnClickCancelButton(self):
|
|
self.Close()
|
|
|
|
def _OnAcceptSkinUsageQuestion(self):
|
|
self.questionDialog.Hide()
|
|
self.Close()
|
|
ikashop.SendShopDecorationUse(self.selected+1) |