tibia-client/modules/game_viplist/viplist.lua

203 lines
5.5 KiB
Lua
Raw Normal View History

vipWindow = nil
vipButton = nil
addVipWindow = nil
2011-09-02 06:29:00 +02:00
function init()
connect(g_game, { onGameStart = refresh,
onGameEnd = clear,
onAddVip = onAddVip,
onVipStateChange = onVipStateChange })
2012-03-29 01:48:33 +02:00
g_keyboard.bindKeyDown('Ctrl+P', toggle)
2012-03-29 01:48:33 +02:00
vipButton = modules.client_topmenu.addRightGameToggleButton('vipListButton', tr('VIP List') .. ' (Ctrl+P)', '/images/topbuttons/viplist', toggle)
vipButton:setOn(true)
vipWindow = g_ui.loadUI('viplist', modules.game_interface.getRightPanel())
refresh()
2012-08-21 23:40:47 +02:00
vipWindow:setup()
end
function terminate()
2012-06-26 00:13:30 +02:00
g_keyboard.unbindKeyDown('Ctrl+P')
disconnect(g_game, { onGameStart = refresh,
onGameEnd = clear,
onAddVip = onAddVip,
onVipStateChange = onVipStateChange })
2012-03-29 01:48:33 +02:00
vipWindow:destroy()
2012-01-23 14:47:15 +01:00
vipButton:destroy()
end
function refresh()
clear()
for id,vip in pairs(g_game.getVips()) do
onAddVip(id, unpack(vip))
end
2012-08-21 01:56:16 +02:00
vipWindow:setContentMinimumHeight(38)
end
function clear()
2012-03-29 01:48:33 +02:00
local vipList = vipWindow:getChildById('contentsPanel')
vipList:destroyChildren()
end
function toggle()
2012-06-21 21:31:22 +02:00
if vipButton:isOn() then
vipWindow:close()
vipButton:setOn(false)
else
vipWindow:open()
vipButton:setOn(true)
end
end
function onMiniWindowClose()
2012-06-21 21:31:22 +02:00
vipButton:setOn(false)
2011-09-02 06:29:00 +02:00
end
function createAddWindow()
addVipWindow = g_ui.displayUI('addvip')
2012-01-04 19:11:11 +01:00
end
function destroyAddWindow()
2012-01-04 19:11:11 +01:00
addVipWindow:destroy()
addVipWindow = nil
end
function addVip()
2012-02-08 22:23:15 +01:00
g_game.addVip(addVipWindow:getChildById('name'):getText())
destroyAddWindow()
2012-01-04 19:11:11 +01:00
end
function hideOffline(state)
settings = {}
settings['hideOffline'] = state
g_settings.mergeNode('VipList', settings)
refresh()
end
function isHiddingOffline()
local settings = g_settings.getNode('VipList')
if not settings then
return false
end
return settings['hideOffline']
end
function onAddVip(id, name, state)
local vipList = vipWindow:getChildById('contentsPanel')
2012-06-26 00:13:30 +02:00
local label = g_ui.createWidget('VipListLabel')
2012-07-27 00:13:47 +02:00
label.onMousePress = onVipListLabelMousePress
2011-09-02 06:29:00 +02:00
label:setId('vip' .. id)
label:setText(name)
if state == VipState.Online then
2012-01-09 19:45:28 +01:00
label:setColor('#00ff00')
elseif state == VipState.Pending then
label:setColor('#ffca38')
2011-09-02 06:29:00 +02:00
else
2012-01-09 19:45:28 +01:00
label:setColor('#ff0000')
2011-09-02 06:29:00 +02:00
end
label.vipState = state
label:setPhantom(false)
2012-02-08 22:23:15 +01:00
connect(label, { onDoubleClick = function () g_game.openPrivateChannel(label:getText()) return true end } )
if state == VipState.Offline and isHiddingOffline() then
label:setVisible(false)
end
2012-01-11 19:08:56 +01:00
local nameLower = name:lower()
local childrenCount = vipList:getChildCount()
2012-01-11 23:31:23 +01:00
for i=1,childrenCount do
2012-01-11 19:08:56 +01:00
local child = vipList:getChildByIndex(i)
if state == VipState.Online and child.vipState ~= VipState.Online then
2012-01-11 19:08:56 +01:00
vipList:insertChild(i, label)
return
end
if (state ~= VipState.Online and child.vipState ~= VipState.Online)
or (state == VipState.Online and child.vipState == VipState.Online) then
2012-01-11 23:31:23 +01:00
local childText = child:getText():lower()
local length = math.min(childText:len(), nameLower:len())
2012-01-11 23:31:23 +01:00
for j=1,length do
if nameLower:byte(j) < childText:byte(j) then
vipList:insertChild(i, label)
return
elseif nameLower:byte(j) > childText:byte(j) then
break
elseif j == nameLower:len() then -- We are at the end of nameLower, and its shorter than childText, thus insert before
vipList:insertChild(i, label)
2012-01-11 23:31:23 +01:00
end
2012-01-11 19:08:56 +01:00
end
end
end
2012-01-11 19:08:56 +01:00
vipList:insertChild(childrenCount+1, label)
2011-09-02 06:29:00 +02:00
end
function onVipStateChange(id, state)
local vipList = vipWindow:getChildById('contentsPanel')
2011-09-02 06:29:00 +02:00
local label = vipList:getChildById('vip' .. id)
2012-01-11 19:08:56 +01:00
local text = label:getText()
2012-04-27 22:21:11 +02:00
label:destroy()
onAddVip(id, text, state)
2011-09-02 06:29:00 +02:00
end
function onVipListMousePress(widget, mousePos, mouseButton)
2012-01-04 19:11:11 +01:00
if mouseButton ~= MouseRightButton then return end
2012-03-29 01:48:33 +02:00
local vipList = vipWindow:getChildById('contentsPanel')
2012-01-04 19:11:11 +01:00
2012-06-26 00:13:30 +02:00
local menu = g_ui.createWidget('PopupMenu')
menu:addOption(tr('Add new VIP'), function() createAddWindow() end)
if not isHiddingOffline() then
menu:addOption(tr('Hide Offline'), function() hideOffline(true) end)
else
menu:addOption(tr('Show Offline'), function() hideOffline(false) end)
end
2012-01-04 19:11:11 +01:00
menu:display(mousePos)
2012-01-04 19:11:11 +01:00
return true
end
function onVipListLabelMousePress(widget, mousePos, mouseButton)
2012-01-04 15:30:28 +01:00
if mouseButton ~= MouseRightButton then return end
2012-03-29 01:48:33 +02:00
local vipList = vipWindow:getChildById('contentsPanel')
2012-01-04 15:30:28 +01:00
2012-06-26 00:13:30 +02:00
local menu = g_ui.createWidget('PopupMenu')
menu:addOption(tr('Send Message'), function() g_game.openPrivateChannel(widget:getText()) end)
menu:addOption(tr('Add new VIP'), function() createAddWindow() end)
menu:addOption(tr('Remove %s', widget:getText()), function() if widget then g_game.removeVip(widget:getId():sub(4)) vipList:removeChild(widget) end end)
2012-01-04 19:11:11 +01:00
menu:addSeparator()
2013-02-26 03:16:15 +01:00
menu:addOption(tr('Copy Name'), function() g_window.setClipboardText(widget:getText()) end)
if modules.game_console.getOwnPrivateTab() then
menu:addSeparator()
menu:addOption(tr('Invite to private chat'), function() g_game.inviteToOwnChannel(creatureName) end)
menu:addOption(tr('Exclude from private chat'), function() g_game.excludeFromOwnChannel(creatureName) end)
end
2013-02-26 03:16:15 +01:00
if not isHiddingOffline() then
menu:addOption(tr('Hide Offline'), function() hideOffline(true) end)
else
menu:addOption(tr('Show Offline'), function() hideOffline(false) end)
end
2012-01-04 15:30:28 +01:00
menu:display(mousePos)
2012-01-04 19:11:11 +01:00
return true
2012-01-04 15:30:28 +01:00
end