------------------------------------------------------------------
--FCOGuildBankQuickSelect.lua
--Author: Baertram
--v0.0.2b
--[[
Quickly select the guild bank by numbers 1-5 (at an opened guild bank selection)
]]
------------------------------------------------------------------
--Array for all the variables
local locVars = {}
--Uncolored "FCOIS" pre chat text for the chat output
locVars.preChatText = "FCOGuildBankQuickSelect"
--Green colored "FCOIS" pre text for the chat output
locVars.preChatTextGreen = "|c22DD22"..locVars.preChatText.."|r "
--Red colored "FCOIS" pre text for the chat output
locVars.preChatTextRed = "|cDD2222"..locVars.preChatText.."|r "
--Blue colored "FCOIS" pre text for the chat output
locVars.preChatTextBlue = "|c2222DD"..locVars.preChatText.."|r "
--Addon variables
local addonVars = {}
addonVars.gAddonName = "FCOGuildBankQuickSelect"
addonVars.addonNameMenu = "FCO GuildBankQuickSelect"
addonVars.addonNameMenuDisplay = "|c00FF00FCO |cFFFF00GuildBankQuickSelect|r"
addonVars.addonAuthor = '|cFFFF00Baertram|r'
addonVars.addonVersion = 0.01 -- Changing this will reset SavedVariables!
addonVars.addonVersionOptions = '0.0.2b' -- version shown in the settings panel
addonVars.addonSavedVariablesName = "FCOGuildBankQuickSelect_Settings"
addonVars.gAddonLoaded = false
addonVars.hookedGuildSelectDialog = false
addonVars.currentSelectedGuildNumber = -1
--Original/Backup avriables
local origVars = {}
--origVars.GuildBankSelectorOnKeyDown = nil
origVars.GuildBankSelectorOnKeyUp = nil
origVars.GuildBankSelectorOnMouseWheelMU = nil
origVars.GuildBankSelectorOnMouseWheelG = nil
--Control names of ZO* standard controls etc.
local GUILDBANK_SELECT_POPUP = ZO_SelectGuildBankDialog
local GUILDBANK_SELECT_POPUP_GUILD = ZO_SelectGuildBankDialogGuild
local GUILDBANK_SELECT_POPUP_GUILD_COMBOBOX = GUILDBANK_SELECT_POPUP_GUILD.m_comboBox
local GUILDBANK_SELECT_POPUP_ACCEPT = ZO_SelectGuildBankDialogAccept
local GUILDBANK_SELECT_POPUP_ABORT = ZO_SelectGuildBankDialogCancel
local GUILDBANK_SELECT_POPUP_MODAL_UNDERLAY = ZO_SelectGuildBankDialogModalUnderlay
--===================== FUNCTIONS ==============================================
--Get the current selected item's index
local function FCOGuildBankQuickSelect_GetCurrentSelectedIndex(comboBoxCtrl)
d("blubb")
--Check the combobox if the last item is possible in there, otherwise select "All"
local comboboxItems = comboBoxCtrl.m_sortedItems
local currentItem = comboBoxCtrl.m_selectedItemText:GetText()
if currentItem == nil then return -1 end
local foundIndex = -1
if comboboxItems ~= nil then
for idx, itemTable in pairs(comboboxItems) do
if itemTable.name == currentItem then
--item was found, abort here
foundIndex = idx
break
end
end
end
return foundIndex
end
--Select the next entry in the guild selection combobox
local function FCOGuildBankQuickSelect_SelectGuildEntry(upDown, newIndex)
local maxIndex = #GUILDBANK_SELECT_POPUP_GUILD_COMBOBOX.m_sortedItems
if maxIndex == 0 or maxIndex == nil then return end
newIndex = newIndex or -1
if newIndex ~= nil and newIndex ~= -1 and newIndex >= 1 and newIndex <= maxIndex then
--Set the given new index
if GUILDBANK_SELECT_POPUP_GUILD_COMBOBOX then
GUILDBANK_SELECT_POPUP_GUILD_COMBOBOX:SelectItemByIndex(newIndex)
end
else
if upDown == nil then return end
--Get the next index by help of the upDown variable coming from the mouse wheel capture
--Get the current selected item index first
local currentIndex = addonVars.currentSelectedGuildNumber
if currentIndex == -1 then
currentIndex = FCOGuildBankQuickSelect_GetCurrentSelectedIndex(GUILDBANK_SELECT_POPUP_GUILD_COMBOBOX)
end
if currentIndex == nil or currentIndex == -1 or currentIndex < 1 or currentIndex > maxIndex then return end
--Scrolled up?
local newIndexToUse = -1
if upDown then
newIndexToUse = currentIndex - 1
else
--Scrolled down?
newIndexToUse = currentIndex + 1
end
--Did we scroll to the first index and below, then use maximum index
if newIndexToUse < 1 then
newIndexToUse = maxIndex
end
--Did we scroll to the last index and above, then use minimum index
if newIndexToUse > maxIndex then
newIndexToUse = 1
end
if newIndexToUse ~= -1 then
GUILDBANK_SELECT_POPUP_GUILD_COMBOBOX:SelectItemByIndex(newIndexToUse)
addonVars.currentSelectedGuildNumber = newIndexToUse
end
end
end
--Get the information about the pressed key and map it to a keybind
local function FCOGuildBankQuickSelect_GetKeybindByPressedKey(key)
local actionNameAccept = "DIALOG_PRIMARY"
local actionNameDecline = "DIALOG_NEGATIVE"
--KEYBIND_TEXT_OPTIONS_ABBREVIATED_NAME = 1
--KEYBIND_TEXT_OPTIONS_FULL_NAME = 2
--KEYBIND_TEXT_OPTIONS_FULL_NAME_SEPARATE_MODS = 3
local textOptions = KEYBIND_TEXT_OPTIONS_ABBREVIATED_NAME
--KEYBIND_TEXTURE_OPTIONS_NONE = 1
--KEYBIND_TEXTURE_OPTIONS_EMBED_MARKUP = 2
local textureOptions = KEYBIND_TEXTURE_OPTIONS_NONE
local bindingIndexAccept = 1 --1 or 2, primary or secondary binding
local bindingIndexDecline = 1 --1 or 2, primary or secondary binding
local bindingStringAccept = ZO_Keybindings_GetBindingStringFromAction(actionNameAccept, textOptions, textureOptions, bindingIndexAccept)
local bindingStringDecline = ZO_Keybindings_GetBindingStringFromAction(actionNameDecline, textOptions, textureOptions, bindingIndexDecline)
--d("bindingStringAccept: " .. tostring(bindingStringAccept))
--d("bindingStringDecline: " .. tostring(bindingStringDecline))
--d("Key: " .. tostring(key) .. "(".. GetKeyName(key) .. ")")
if GetKeyName(key) == bindingStringAccept then
return 1
elseif GetKeyName(key) == bindingStringDecline then
return 2
else
return -1
end
end
-- set handlers for the mouse wheel
local function FCOGuildBankQuickSelect_HandleMouseWheelEvents(doRegister)
doRegister = doRegister or false
if doRegister then
GUILDBANK_SELECT_POPUP_MODAL_UNDERLAY:SetMouseEnabled(true)
GUILDBANK_SELECT_POPUP_MODAL_UNDERLAY:SetHandler("OnMouseWheel", function(self, delta, ctrl, alt, shift)
if delta < 0 then
-- Mouse wheel down
FCOGuildBankQuickSelect_SelectGuildEntry(false, nil)
else
-- Mouse wheel up
FCOGuildBankQuickSelect_SelectGuildEntry(true, nil)
end
end)
GUILDBANK_SELECT_POPUP_GUILD:SetMouseEnabled(true)
GUILDBANK_SELECT_POPUP_GUILD:SetHandler("OnMouseWheel", function(self, delta, ctrl, alt, shift)
if delta < 0 then
-- Mouse wheel down
FCOGuildBankQuickSelect_SelectGuildEntry(false, nil)
else
-- Mouse wheel up
FCOGuildBankQuickSelect_SelectGuildEntry(true, nil)
end
end)
else
if origVars.GuildBankSelectorOnMouseWheelMU and origVars.GuildBankSelectorOnMouseWheelMU ~= nil then
--Use original handler for the mousewheel again
GUILDBANK_SELECT_POPUP_MODAL_UNDERLAY:SetHandler("OnMouseWheel", function(self, delta, ctrl, alt, shift)
origVars.GuildBankSelectorOnMouseWheelMU(self, delta, ctrl, alt, shift)
end)
end
if origVars.GuildBankSelectorOnMouseWheelG and origVars.GuildBankSelectorOnMouseWheelG ~= nil then
GUILDBANK_SELECT_POPUP_GUILD:SetHandler("OnMouseWheel", function(self, delta, ctrl, alt, shift)
origVars.GuildBankSelectorOnMouseWheelG(self, delta, ctrl, alt, shift)
end)
end
end
end
-- set handlers for keyboard events:
local function FCOGuildBankQuickSelect_HandleKeyboardEvents(self, key, ctrl, alt, shift, command)
--Check if the keybinding for accept or decline (or key ESCAPE) were pressed
local pressedKeyMappedToKeybindKey = -1
if key ~= KEY_ESCAPE then
pressedKeyMappedToKeybindKey = FCOGuildBankQuickSelect_GetKeybindByPressedKey(key)
end
if key == KEY_ESCAPE or pressedKeyMappedToKeybindKey ~= -1 then
if pressedKeyMappedToKeybindKey == 1 then
if GUILDBANK_SELECT_POPUP_ACCEPT.clickSound ~= nil then
PlaySound(GUILDBANK_SELECT_POPUP_ACCEPT.clickSound)
else
PlaySound(SOUNDS.DIALOG_ACCEPT)
end
GUILDBANK_SELECT_POPUP_ACCEPT:callback()
elseif key == KEY_ESCAPE or pressedKeyMappedToKeybindKey == 2 then
if GUILDBANK_SELECT_POPUP_ABORT.clickSound ~= nil then
PlaySound(GUILDBANK_SELECT_POPUP_ABORT.clickSound)
else
PlaySound(SOUNDS.DIALOG_DECLINE)
end
GUILDBANK_SELECT_POPUP_ABORT:callback()
end
else
--Check for the pressed key 1 to 5 or numpad 1 to 5 and change the guild accordingly
if key == KEY_1 or key == KEY_NUMPAD1 then
FCOGuildBankQuickSelect_SelectGuildEntry(nil, 1)
elseif key == KEY_2 or key == KEY_NUMPAD2 then
FCOGuildBankQuickSelect_SelectGuildEntry(nil, 2)
elseif key == KEY_3 or key == KEY_NUMPAD3 then
FCOGuildBankQuickSelect_SelectGuildEntry(nil, 3)
elseif key == KEY_4 or key == KEY_NUMPAD4 then
FCOGuildBankQuickSelect_SelectGuildEntry(nil, 4)
elseif key == KEY_5 or key == KEY_NUMPAD5 then
FCOGuildBankQuickSelect_SelectGuildEntry(nil, 5)
end
end
return false
end
--
local function FCOGuildBankQuickSelect_ChangeTweaks(doRegister)
if doRegister then
if GUILDBANK_SELECT_POPUP ~= nil then
--Register the OnKeyUp function for the guild bank select dialog
ZO_PreHookHandler(GUILDBANK_SELECT_POPUP, 'OnKeyUp', function(self, key, ctrl, alt, shift, command) FCOGuildBankQuickSelect_HandleKeyboardEvents(self, key, ctrl, alt, shift, command) end)
--GUILDBANK_SELECT_POPUP:SetHandler("OnKeyUp", function(self, key, ctrl, alt, shift, command) FCOGuildBankQuickSelect_HandleKeyboardEvents(self, key, ctrl, alt, shift, command) end)
FCOGuildBankQuickSelect_HandleMouseWheelEvents(true)
GUILDBANK_SELECT_POPUP:SetKeyboardEnabled(true)
addonVars.hookedGuildSelectDialog = true
end
else
if GUILDBANK_SELECT_POPUP ~= nil then
--Unregister OnKeyUp callback
if origVars.GuildBankSelectorOnKeyUp and origVars.GuildBankSelectorOnKeyUp ~= nil then
GUILDBANK_SELECT_POPUP:SetHandler("OnKeyUp", function(self, key, ctrl, alt, shift, command) origVars.GuildBankSelectorOnKeyUp(self, key, ctrl, alt, shift, command) end)
end
FCOGuildBankQuickSelect_HandleMouseWheelEvents(false)
GUILDBANK_SELECT_POPUP:SetKeyboardEnabled(false)
addonVars.hookedGuildSelectDialog = false
end
end
end
--un/register guild bank selection popup tweaks
local function registerGuildBankSelectionTweaks(doRegister, doOverride)
doOverride = doOverride or false
--If no guilds are given the functions make no sense here, so abort everything
local maxIndex = -1
if not doOverride then
if GUILDBANK_SELECT_POPUP_GUILD_COMBOBOX ~= nil then
maxIndex = #GUILDBANK_SELECT_POPUP_GUILD_COMBOBOX.m_sortedItems
end
if maxIndex == nil or maxIndex < 1 then
--Unregister existing tweaks now
FCOGuildBankQuickSelect_ChangeTweaks(false)
--Abort here as no guilds are enabled
return false
end
end
--Enable or disable the tweaks now
FCOGuildBankQuickSelect_ChangeTweaks(doRegister)
end
--==============================================================================
--==================== START EVENT CALLBACK FUNCTIONS===========================
--==============================================================================
--[[
--Event function if guild bank is opened
local function FCOGuildBankQuickSelect_Open_Guild_Bank()
if not addonVars.hookedGuildSelectDialog then
registerGuildBankSelectionTweaks(true, false)
end
end
]]
--Event function if guild bank is closed
local function FCOGuildBankQuickSelect_Close_Guild_Bank()
if addonVars.hookedGuildSelectDialog then
registerGuildBankSelectionTweaks(false, false)
end
end
--PreHook the OnShow callback function of the guildbank select dialog
local function FCOGuildBankQuickSelect_PreHookGuildSelectDialogOnShow(self)
--Reset the variable for the currently selected guild index
addonVars.currentSelectedGuildNumber = -1
if not addonVars.hookedGuildSelectDialog then
registerGuildBankSelectionTweaks(true, false)
end
end
-- Fires each time after addons were loaded and player is ready to move (after each zone change too)
local function FCOGuildBankQuickSelect_Player_Activated(...)
--Prevent this event to be fired again and again upon each zone change
EVENT_MANAGER:UnregisterForEvent(addonVars.gAddonName, EVENT_PLAYER_ACTIVATED)
--Backup the original handlers
--origVars.GuildBankSelectorOnKeyDown = GUILDBANK_SELECT_POPUP:GetHandler("OnKeyDown")
origVars.GuildBankSelectorOnKeyUp = GUILDBANK_SELECT_POPUP:GetHandler("OnKeyUp")
origVars.GuildBankSelectorOnMouseWheelMU = GUILDBANK_SELECT_POPUP_MODAL_UNDERLAY:GetHandler("OnMouseWheel")
origVars.GuildBankSelectorOnMouseWheelG = GUILDBANK_SELECT_POPUP_GUILD:GetHandler("OnMouseWheel")
--PreHook the OnShow handler for the guild bank select dialog
ZO_PreHookHandler(GUILDBANK_SELECT_POPUP, 'OnShow', function(self) FCOGuildBankQuickSelect_PreHookGuildSelectDialogOnShow(self) end)
--Set addon loaded = false
addonVars.gAddonLoaded = false
end
--==============================================================================
--===== HOOKS BEGIN ============================================================
--==============================================================================
--Create the hooks & pre-hooks
local function CreateHooks()
--nothing here atm
end
--Addon loads up
local function FCOGuildBankQuickSelect_Loaded(eventCode, addOnName)
--Is this addon found?
if(addOnName ~= addonVars.gAddonName) then
return
end
--Unregister this event again so it isn't fired again after this addon has beend reckognized
EVENT_MANAGER:UnregisterForEvent(addonVars.gAddonName, EVENT_ADD_ON_LOADED)
--Register for Guild Bank opened & closed
--EVENT_MANAGER:RegisterForEvent(addonVars.gAddonName, EVENT_OPEN_GUILD_BANK, FCOGuildBankQuickSelect_Open_Guild_Bank)
EVENT_MANAGER:RegisterForEvent(addonVars.gAddonName, EVENT_CLOSE_GUILD_BANK, FCOGuildBankQuickSelect_Close_Guild_Bank)
addonVars.gAddonLoaded = true
end
-- Register the event "addon loaded" for this addon
local function FCOGuildBankQuickSelect_Initialized()
EVENT_MANAGER:RegisterForEvent(addonVars.gAddonName, EVENT_ADD_ON_LOADED, FCOGuildBankQuickSelect_Loaded)
--Register for the zone change/player ready event
EVENT_MANAGER:RegisterForEvent(addonVars.gAddonName, EVENT_PLAYER_ACTIVATED, FCOGuildBankQuickSelect_Player_Activated)
end
--------------------------------------------------------------------------------
--- Call the start function for this addon to register events etc.
--------------------------------------------------------------------------------
FCOGuildBankQuickSelect_Initialized()