view Import.lua @ 93:f9df7cd7bfd6 tip

revert pet spell subText collation remove an empty script handler
author Nenue
date Tue, 04 Sep 2018 23:00:21 -0400
parents 131d9190db6b
children
line wrap: on
line source
-- KrakTool
-- Import.lua
-- Created: 7/10/2016 6:20 AM
-- %file-revision%
-- Tools for first-time setup and migration from other addons.

local kb = LibStub("LibKraken").register(KeyBinder, 'Import')
local print = DEVIAN_WORKSPACE and  function(...) print('kbi', ...) end or function() end


local SUMMON_RANDOM_FAVORITE_MOUNT_SPELL = 150544
local SUMMON_RANDOM_FAVORITE_MOUNT_SPELLNAME = "Summon Random Favorite Mount"
local results = {}
local importSet = setmetatable({}, {__tostring = function() return 'Global Bindings' end})
kb.importTypes = {}

local lineNumber = 0
local usedBinds, usedKeys = {}, {}
local profileName = ''
local specProfile
local msg = function(...) return KeyBinderImportLog:AddMessage(...) end

--- Core interfaces
kb.ImportScan = function()
  -- hang onto this
  SUMMON_RANDOM_FAVORITE_MOUNT_SPELLNAME = GetSpellInfo(SUMMON_RANDOM_FAVORITE_MOUNT_SPELL)

  local hasAnyData = false
  for addon, module in pairs(kb.importTypes) do
    if IsAddOnLoaded(addon) then
      local hasData = module.GetChanges(importSet)
      if hasData then
        kb:print("|cFFFFFF00"..addon.." is currently enabled.")
      end

      hasAnyData = (hasData or hasAnyData)
    end
  end
  if hasAnyData then
    kb:print("You can use /skb import |cFF00FF00<AddOn Name>|r to attempt to copy settings related to this character. This will also disable that AddOn.")
  end


  kb.ui()
  --KeyBinderImportLog:Show()

  return importSet
end

kb.ImportCommmit = function(self, text)
  kb.db.buttons = importSet.buttons
  kb.db.bound = importSet.bound
  kb.db.commands = importSet.commands
  kb.db.bindings = importSet.bindings
  kb.db.macros = importSet.macros
  kb.db[profileName] = importSet[profileName]
  kb.profile(profileName)


  kb:ApplyAllBindings()
  kb.ui()
  kb:print('Imported settings applied! Note that you will need to change active specializations and run the command again to create their respective Char+Spec profiles.')
end

--- Key Scan
kb.importTypes.KeyBinder = {}
kb.importTypes.BindPad = {}
local kbi = kb.importTypes.KeyBinder
local bp = kb.importTypes.BindPad

--- BindPad import process
-- because bindpad doesn't store class info, it is not possible to discern the identity of primary/secondary

local GetBindPadSlot = function(profile, slot, data)
  local actionType = data.type:lower()
  local command = data.action:gsub('CLICK BindPadKey:%s*', '')
  local clickAction = command:match('BindPadMacro:%s*(.+)%s*$')
  local macroName, macroText
  if clickAction then
    local clickType = 'spell'
    if clickAction == SUMMON_RANDOM_FAVORITE_MOUNT_SPELLNAME then
      clickType = 'mount'
      clickAction = 0
    else
      clickType = 'spell'
    end

    macroName, macroText, command = kb.RegisterAction(nil, clickType, clickAction)
    profile.macros[macroName] = {macroText, command}
  end
  print('[|cFF00FF00'.. data.type .. '|r] |cFFFF00FF' .. data.action .. '|r :: "' .. tostring(clickAction) .. '"')

  results[actionType] = (results[actionType] or 0) + 1
  profile.buttons[slot] = {
    command,
    command:gsub(data.type, ''),
    data.texture
  }
  profile.commands[command] = slot

  if usedBinds[data.action] then
    local key1, key2 = unpack(usedBinds[data.action])
    print('adding keybind |cFF00FFFF' .. command .. ' |cFF00FF00' .. (key1) .. ' |cFF00FF00' .. (key2 or ''))
    profile.bindings[key1] = command

    if key2 then
      profile.bindings[key2] = command
    end

    usedBinds[data.action] = nil

    msg('|cFF00FFFF'..tostring(profile)..'|r '..slot..': ' .. '|cFF00FFFF' .. command .. '|r |cFF00FF00' .. (key1 or '') .. (key2 and ('|r, |cFF00FF00key2') or '') )
  else
    print('|cFFFF4400no binding|r ' .. command)
  end
end

local GetBindPadProfile = function(profile, bp)
  local bpnames = {'CharacterSpecificTab1', 'CharacterSpecificTab2', 'CharacterSpecificTab3'} -- won't need this ever again, let it fall into gc

  -- resolve spec ID
  local specID = GetSpecialization()
  local globalID = GetSpecializationInfo(GetSpecialization())
  local activeProfile

  -- setup string coercions for debugging
  setmetatable(profile,{__tostring = function(t) return 'Character' end})
  if GetNumSpecGroups() > 1 then
    local activeGroup = GetActiveSpecGroup()
    activeProfile = bp.profileForTalentGroup[activeGroup]
    profile[specID] = kb.InitProfile(profile[specID] or {})
    specProfile = profile[specID]
    setmetatable(specProfile,{__tostring = function(t) return 'Spec #'..specID end})
  end

  print('-')

  results.spell = 0
  results.macro = 0
  results.click = 0
  results.item = 0

  table.wipe(usedBinds) -- [action] = {key1, key2}
  table.wipe(usedKeys)  -- [key]    = "action"
  for id, bpProfile in ipairs(bp) do

    local slots = 0

    if bpProfile.AllKeyBindings then
      for binding, command in pairs(bpProfile.AllKeyBindings) do
        -- each binding value
        if not usedKeys[binding] then
          usedKeys[binding] = command
        end

        usedBinds[command] = usedBinds[command]  or {}
        tinsert(usedBinds[command], binding)
      end
    end



    for i, name in ipairs(bpnames) do
      -- each tab
      if bpProfile[name] then
        for slot, data in pairs(bpProfile[name]) do
          if type(data) == 'table' then
            slots = slots + 1


            local profile = (id == activeProfile) and specProfile or profile
            lineNumber = lineNumber + 1
            GetBindPadSlot(profile, slot, data)

          else
            --print(type(data), slot, data)
          end
        end
      end
    end
  end
end


bp.GetChanges = function(importSet)
  -- ensure that subtables are there
  kb.InitProfile(importSet)
  if BindPadVars then
    local globalSlots = 0
    for k,v in pairs(BindPadVars) do
      --print(k, type(k))
      if type(k) == 'string' then
        local realm, name = k:match("^PROFILE_([%S]+)_(%S+)$")
        if realm == kb.playerRealm and name == kb.playerName then
          profileName = realm .. '_' .. name
          msg('Found character profile: |cFFFFFF00'.. tostring(realm) .. '|r-|cFF00FFFF'..tostring(name)..'|r')
          importSet[profileName] = kb.InitProfile({})
          importSet[profileName].imported = true
          GetBindPadProfile(importSet[profileName], v)
        end
      elseif type(k) == 'number' and type(v) == 'table' then
        globalSlots = globalSlots + 1
        GetBindPadSlot(importSet, globalSlots, v)
      end
    end
  end

  return results
end