diff --git a/BindConfig.lua b/BindConfig.lua
new file mode 100755
index 0000000..5b7aad2
--- /dev/null
+++ b/BindConfig.lua
@@ -0,0 +1,351 @@
+local addonName, addon = ...
+local L = addon.L
+
+local MAX_ROWS = 12
+
+function CliqueConfig:OnShow()
+ if not self.initialized then
+ self:SetupGUI()
+ self:HijackSpellbook()
+ self.initialized = true
+ end
+
+ self:UpdateList()
+ self:EnableSpellbookButtons()
+end
+
+
+function CliqueConfig:SetupGUI()
+ self.rows = {}
+ for i = 1, MAX_ROWS do
+ self.rows[i] = CreateFrame("Button", "CliqueRow" .. i, self.page1, "CliqueRowTemplate")
+ end
+
+ self.rows[1]:ClearAllPoints()
+ self.rows[1]:SetPoint("TOPLEFT", "CliqueConfigPage1Column1", "BOTTOMLEFT", 0, -3)
+ self.rows[1]:SetPoint("RIGHT", CliqueConfigPage1Column2, "RIGHT", 0, 0)
+
+ for i = 2, MAX_ROWS do
+ self.rows[i]:ClearAllPoints()
+ self.rows[i]:SetPoint("TOPLEFT", self.rows[i - 1], "BOTTOMLEFT")
+ self.rows[i]:SetPoint("RIGHT", CliqueConfigPage1Column2, "RIGHT", 0, 0)
+ end
+
+ -- Set text elements using localized values
+ _G[self:GetName() .. "TitleText"]:SetText(L["Clique Binding Configuration"])
+
+ self.dialog = _G["CliqueDialog"]
+ self.dialog.title = _G["CliqueDialogTitleText"]
+
+ self.dialog.title:SetText(L["Clique: Set binding"])
+ self.dialog.button_accept:SetText(L["Accept"])
+ self.dialog.bindText:SetText(L["Alt-Control-Shift-F"])
+
+ self.dialog.button_binding:SetText(L["Set binding"])
+ local desc = L["In order to specify a binding, move your mouse over the button labelled 'Set binding' and either click with your mouse or press a key on your keyboard. You can modify the binding by holding down a combination of the alt, control and shift keys on your keyboard."]
+ self.dialog.desc:SetText(desc)
+
+ self.page1.column1:SetText(L["Action"])
+ self.page1.column2:SetText(L["Binding"])
+
+ -- Set columns up to handle sorting
+ self.page1.column1.sortType = "name"
+ self.page1.column2.sortType = "key"
+ self.page1.sortType = self.page1.column2.sortType
+
+ self.page1.button_spell:SetText(L["Bind spell"])
+ self.page1.button_other:SetText(L["Bind other"])
+ self.page1.button_options:SetText(L["Options"])
+
+ self.page2.button_save:SetText(L["Save"])
+ self.page2.button_cancel:SetText(L["Cancel"])
+
+ self.page1:Show()
+end
+
+function CliqueConfig:Column_OnClick(frame, button)
+ self.page1.sortType = frame.sortType
+ self:UpdateList()
+end
+
+function CliqueConfig:HijackSpellbook()
+ self.spellbookButtons = {}
+
+ for idx = 1, 12 do
+ local parent = getglobal("SpellButton" .. idx)
+ local button = CreateFrame("Button", "CliqueSpellbookButton" .. idx, parent, "CliqueSpellbookButtonTemplate")
+ button.spellbutton = parent
+ button:EnableKeyboard(false)
+ button:EnableMouseWheel(true)
+ button:RegisterForClicks("AnyDown")
+ button:SetID(parent:GetID())
+ self.spellbookButtons[idx] = button
+ end
+
+ local function showHideHandler(frame)
+ self:EnableSpellbookButtons()
+ end
+ SpellBookFrame:HookScript("OnShow", showHideHandler)
+ SpellBookFrame:HookScript("OnHide", showHideHandler)
+
+ -- TODO: This isn't a great way to do this, but for now
+ hooksecurefunc("SpellBookSkillLineTab_OnClick", showHideHandler)
+ self:EnableSpellbookButtons()
+end
+
+function CliqueConfig:EnableSpellbookButtons()
+ local enabled;
+
+ if self.page1:IsVisible() and SpellBookFrame:IsVisible() then
+ enabled = true
+ self:SetNotification("Your spellbook is open. You can mouse over a spell in your spellbook and click or press a key conbination to add it to your bindings configuration")
+ else
+ method = false
+ self:ClearNotification()
+ end
+
+ if self.spellbookButtons then
+ for idx, button in ipairs(self.spellbookButtons) do
+ if enabled and button.spellbutton:IsEnabled() == 1 then
+ button:Show()
+ else
+ button:Hide()
+ end
+ end
+ end
+end
+
+-- Spellbook button functions
+function CliqueConfig:Spellbook_EnableKeyboard(button, motion)
+ button:EnableKeyboard(true)
+end
+
+function CliqueConfig:Spellbook_DisableKeyboard(button, motion)
+ button:EnableKeyboard(false)
+end
+
+invalidKeys = {
+ ["UNKNOWN"] = true,
+ ["LSHIFT"] = true,
+ ["RSHIFT"] = true,
+ ["LCTRL"] = true,
+ ["RCTRL"] = true,
+ ["LALT"] = true,
+ ["RALT"] = true,
+}
+
+function CliqueConfig:Spellbook_OnBinding(button, key)
+ -- We can't bind modifiers or invalid keys
+ if invalidKeys[key] then
+ return
+ elseif key == "ESCAPE" then
+ HideUIPanel(CliqueConfig)
+ return
+ end
+
+ -- Remap any mouse buttons
+ if key == "LeftButton" then
+ key = "BUTTON1"
+ elseif key == "RightButton" then
+ key = "BUTTON2"
+ elseif key == "MiddleButton" then
+ key = "BUTTON3"
+ else
+ buttonNum = key:match("Button(%d+)")
+ if buttonNum and tonumber(buttonNum) <= 31 then
+ key = "BUTTON" .. buttonNum
+ end
+ end
+
+ -- TODO: Support NOT splitting the modifier keys
+ local prefix = addon:GetPrefixString(true)
+
+ local slot = SpellBook_GetSpellBookSlot(button:GetParent());
+ local name, subtype = GetSpellBookItemName(slot, SpellBookFrame.bookType)
+ local texture = GetSpellBookItemTexture(slot, SpellBookFrame.bookType)
+
+ local succ, err = addon:AddBinding{
+ key = prefix .. key,
+ type = "spell",
+ spell = name,
+ icon = texture
+ }
+
+ if not succ then
+ CliqueConfig:SetNotification(err)
+ else
+ CliqueConfig:UpdateList()
+ end
+end
+
+function CliqueConfig:Button_OnClick(button)
+ -- Click handler for "Bind spell" button
+ if button == self.page1.button_spell then
+ if SpellBookFrame and not SpellBookFrame:IsVisible() then
+ ShowUIPanel(SpellBookFrame)
+ end
+
+ -- Click handler for "Bind other" button
+ elseif button == self.page1.button_other then
+ local config = CliqueConfig
+ local menu = {
+ {
+ text = L["Select a binding type"],
+ isTitle = true
+ },
+ {
+ text = L["Target clicked unit"],
+ func = function()
+ config.page1:Hide()
+ config.page2.bindType = "target"
+ config.page2:Show()
+ end,
+ },
+ {
+ text = L["Open unit menu"],
+ func = function()
+ config.page1:Hide()
+ config.page2.bindType = "menu"
+ config.page2:Show()
+ end,
+ },
+ {
+ text = L["Run custom macro"],
+ func = function()
+ config.page1:Hide()
+ config.page2.bindType = "macro"
+ config.page2:Show()
+ end,
+ },
+ }
+ UIDropDownMenu_SetAnchor(self.dropdown, 0, 0, "BOTTOMLEFT", self.page1.button_other, "TOP")
+ EasyMenu(menu, self.dropdown, nil, 0, 0, nil, nil)
+
+ -- Click handler for "Edit" button
+ elseif button == self.page1.button_options then
+ InterfaceOptionsFrame_OpenToCategory("Clique")
+ elseif button == self.page2.button_cancel then
+ self.page2:Hide()
+ self.page1:Show()
+ elseif button == self.page2.button_cancel then
+ self.page2:Hide()
+ self.page1:Show()
+ end
+end
+
+function CliqueConfig:SetNotification(text)
+end
+
+function CliqueConfig:ClearNotification()
+end
+
+local memoizeBindings = setmetatable({}, {__index = function(t, k, v)
+ local binbits = addon:GetBinaryBindingKey(k)
+ rawset(t, k, binbits)
+ return binbits
+end})
+
+local compareFunctions;
+compareFunctions = {
+ name = function(a, b)
+ local texta = addon:GetBindingActionText(a)
+ local textb = addon:GetBindingActionText(b)
+ if texta == textb then
+ return compareFunctions.key(a, b)
+ end
+ return texta < textb
+ end,
+ key = function(a, b)
+ local keya = addon:GetBindingKey(a)
+ local keyb = addon:GetBindingKey(b)
+ if keya == keyb then
+ return memoizeBindings[a] < memoizeBindings[b]
+ else
+ return keya < keyb
+ end
+ end,
+ binding = function(a, b)
+ local mem = memoizeBindings
+ return mem[a] < mem[b]
+ end,
+}
+
+CliqueConfig.binds = {}
+function CliqueConfig:UpdateList()
+ local page = self.page1
+ local binds = Clique.profile.binds
+
+ -- GUI not created yet
+ if not page then
+ return
+ end
+
+ -- Sort the bindings
+ local sort = {}
+ for uid, entry in pairs(binds) do
+ sort[#sort + 1] = entry
+ end
+
+ if page.sortType then
+ table.sort(sort, compareFunctions[page.sortType])
+ else
+ table.sort(sort, compareFunctions.key)
+ end
+
+ -- Enable or disable the scroll bar
+ if #sort > MAX_ROWS - 1 then
+ -- Set up the scrollbar for the item list
+ page.slider:SetMinMaxValues(0, #sort - MAX_ROWS)
+
+ -- Adjust and show
+ if not page.slider:IsShown() then
+ -- Adjust column positions
+ for idx, row in ipairs(self.rows) do
+ row.bind:SetWidth(90)
+ end
+ page.slider:SetValue(0)
+ page.slider:Show()
+ end
+ elseif page.slider:IsShown() then
+ -- Move column positions back and hide the slider
+ for idx, row in ipairs(self.rows) do
+ row.bind:SetWidth(105)
+ end
+ page.slider:Hide()
+ end
+
+ -- Update the rows in the list
+ local offset = page.slider:GetValue() or 0
+ for idx, row in ipairs(self.rows) do
+ local offsetIndex = offset + idx
+ if sort[offsetIndex] then
+ local bind = sort[offsetIndex]
+ row.icon:SetTexture(addon:GetBindingIcon(bind))
+ row.name:SetText(addon:GetBindingActionText(bind))
+ --row.type:SetText(bind.type)
+ row.bind:SetText(addon:GetBindingKeyComboText(bind))
+ row:Show()
+ else
+ row:Hide()
+ end
+ end
+end
+
+function CliqueConfig:ClearEditPage()
+end
+
+function CliqueConfig:ShowEditPage()
+ self:ClearEditPage()
+ self.page1:Hide()
+ self.page3:Show()
+end
+
+function CliqueConfig:Save_OnClick(button, button, down)
+end
+
+function CliqueConfig:Cancel_OnClick(button, button, down)
+ self:ClearEditPage()
+ self.page3:Hide()
+ self.page1:Show()
+end
+
diff --git a/Clique.toc b/Clique.toc
index a432574..0942c8c 100755
--- a/Clique.toc
+++ b/Clique.toc
@@ -13,12 +13,12 @@ ClickCastTemplate.xml
Clique.xml
-CliqueUtils.lua
Clique.lua
-CliqueConfig.lua
-CliqueOptionsPanel.lua
+Utils.lua
+BindConfig.lua
+OptionsPanel.lua
-CliqueTest.xml
-CliqueTest.lua
+HeaderTest.xml
+HeaderTest.lua
BlizzardFrames.lua
diff --git a/CliqueConfig.lua b/CliqueConfig.lua
deleted file mode 100755
index 5b7aad2..0000000
--- a/CliqueConfig.lua
+++ /dev/null
@@ -1,351 +0,0 @@
-local addonName, addon = ...
-local L = addon.L
-
-local MAX_ROWS = 12
-
-function CliqueConfig:OnShow()
- if not self.initialized then
- self:SetupGUI()
- self:HijackSpellbook()
- self.initialized = true
- end
-
- self:UpdateList()
- self:EnableSpellbookButtons()
-end
-
-
-function CliqueConfig:SetupGUI()
- self.rows = {}
- for i = 1, MAX_ROWS do
- self.rows[i] = CreateFrame("Button", "CliqueRow" .. i, self.page1, "CliqueRowTemplate")
- end
-
- self.rows[1]:ClearAllPoints()
- self.rows[1]:SetPoint("TOPLEFT", "CliqueConfigPage1Column1", "BOTTOMLEFT", 0, -3)
- self.rows[1]:SetPoint("RIGHT", CliqueConfigPage1Column2, "RIGHT", 0, 0)
-
- for i = 2, MAX_ROWS do
- self.rows[i]:ClearAllPoints()
- self.rows[i]:SetPoint("TOPLEFT", self.rows[i - 1], "BOTTOMLEFT")
- self.rows[i]:SetPoint("RIGHT", CliqueConfigPage1Column2, "RIGHT", 0, 0)
- end
-
- -- Set text elements using localized values
- _G[self:GetName() .. "TitleText"]:SetText(L["Clique Binding Configuration"])
-
- self.dialog = _G["CliqueDialog"]
- self.dialog.title = _G["CliqueDialogTitleText"]
-
- self.dialog.title:SetText(L["Clique: Set binding"])
- self.dialog.button_accept:SetText(L["Accept"])
- self.dialog.bindText:SetText(L["Alt-Control-Shift-F"])
-
- self.dialog.button_binding:SetText(L["Set binding"])
- local desc = L["In order to specify a binding, move your mouse over the button labelled 'Set binding' and either click with your mouse or press a key on your keyboard. You can modify the binding by holding down a combination of the alt, control and shift keys on your keyboard."]
- self.dialog.desc:SetText(desc)
-
- self.page1.column1:SetText(L["Action"])
- self.page1.column2:SetText(L["Binding"])
-
- -- Set columns up to handle sorting
- self.page1.column1.sortType = "name"
- self.page1.column2.sortType = "key"
- self.page1.sortType = self.page1.column2.sortType
-
- self.page1.button_spell:SetText(L["Bind spell"])
- self.page1.button_other:SetText(L["Bind other"])
- self.page1.button_options:SetText(L["Options"])
-
- self.page2.button_save:SetText(L["Save"])
- self.page2.button_cancel:SetText(L["Cancel"])
-
- self.page1:Show()
-end
-
-function CliqueConfig:Column_OnClick(frame, button)
- self.page1.sortType = frame.sortType
- self:UpdateList()
-end
-
-function CliqueConfig:HijackSpellbook()
- self.spellbookButtons = {}
-
- for idx = 1, 12 do
- local parent = getglobal("SpellButton" .. idx)
- local button = CreateFrame("Button", "CliqueSpellbookButton" .. idx, parent, "CliqueSpellbookButtonTemplate")
- button.spellbutton = parent
- button:EnableKeyboard(false)
- button:EnableMouseWheel(true)
- button:RegisterForClicks("AnyDown")
- button:SetID(parent:GetID())
- self.spellbookButtons[idx] = button
- end
-
- local function showHideHandler(frame)
- self:EnableSpellbookButtons()
- end
- SpellBookFrame:HookScript("OnShow", showHideHandler)
- SpellBookFrame:HookScript("OnHide", showHideHandler)
-
- -- TODO: This isn't a great way to do this, but for now
- hooksecurefunc("SpellBookSkillLineTab_OnClick", showHideHandler)
- self:EnableSpellbookButtons()
-end
-
-function CliqueConfig:EnableSpellbookButtons()
- local enabled;
-
- if self.page1:IsVisible() and SpellBookFrame:IsVisible() then
- enabled = true
- self:SetNotification("Your spellbook is open. You can mouse over a spell in your spellbook and click or press a key conbination to add it to your bindings configuration")
- else
- method = false
- self:ClearNotification()
- end
-
- if self.spellbookButtons then
- for idx, button in ipairs(self.spellbookButtons) do
- if enabled and button.spellbutton:IsEnabled() == 1 then
- button:Show()
- else
- button:Hide()
- end
- end
- end
-end
-
--- Spellbook button functions
-function CliqueConfig:Spellbook_EnableKeyboard(button, motion)
- button:EnableKeyboard(true)
-end
-
-function CliqueConfig:Spellbook_DisableKeyboard(button, motion)
- button:EnableKeyboard(false)
-end
-
-invalidKeys = {
- ["UNKNOWN"] = true,
- ["LSHIFT"] = true,
- ["RSHIFT"] = true,
- ["LCTRL"] = true,
- ["RCTRL"] = true,
- ["LALT"] = true,
- ["RALT"] = true,
-}
-
-function CliqueConfig:Spellbook_OnBinding(button, key)
- -- We can't bind modifiers or invalid keys
- if invalidKeys[key] then
- return
- elseif key == "ESCAPE" then
- HideUIPanel(CliqueConfig)
- return
- end
-
- -- Remap any mouse buttons
- if key == "LeftButton" then
- key = "BUTTON1"
- elseif key == "RightButton" then
- key = "BUTTON2"
- elseif key == "MiddleButton" then
- key = "BUTTON3"
- else
- buttonNum = key:match("Button(%d+)")
- if buttonNum and tonumber(buttonNum) <= 31 then
- key = "BUTTON" .. buttonNum
- end
- end
-
- -- TODO: Support NOT splitting the modifier keys
- local prefix = addon:GetPrefixString(true)
-
- local slot = SpellBook_GetSpellBookSlot(button:GetParent());
- local name, subtype = GetSpellBookItemName(slot, SpellBookFrame.bookType)
- local texture = GetSpellBookItemTexture(slot, SpellBookFrame.bookType)
-
- local succ, err = addon:AddBinding{
- key = prefix .. key,
- type = "spell",
- spell = name,
- icon = texture
- }
-
- if not succ then
- CliqueConfig:SetNotification(err)
- else
- CliqueConfig:UpdateList()
- end
-end
-
-function CliqueConfig:Button_OnClick(button)
- -- Click handler for "Bind spell" button
- if button == self.page1.button_spell then
- if SpellBookFrame and not SpellBookFrame:IsVisible() then
- ShowUIPanel(SpellBookFrame)
- end
-
- -- Click handler for "Bind other" button
- elseif button == self.page1.button_other then
- local config = CliqueConfig
- local menu = {
- {
- text = L["Select a binding type"],
- isTitle = true
- },
- {
- text = L["Target clicked unit"],
- func = function()
- config.page1:Hide()
- config.page2.bindType = "target"
- config.page2:Show()
- end,
- },
- {
- text = L["Open unit menu"],
- func = function()
- config.page1:Hide()
- config.page2.bindType = "menu"
- config.page2:Show()
- end,
- },
- {
- text = L["Run custom macro"],
- func = function()
- config.page1:Hide()
- config.page2.bindType = "macro"
- config.page2:Show()
- end,
- },
- }
- UIDropDownMenu_SetAnchor(self.dropdown, 0, 0, "BOTTOMLEFT", self.page1.button_other, "TOP")
- EasyMenu(menu, self.dropdown, nil, 0, 0, nil, nil)
-
- -- Click handler for "Edit" button
- elseif button == self.page1.button_options then
- InterfaceOptionsFrame_OpenToCategory("Clique")
- elseif button == self.page2.button_cancel then
- self.page2:Hide()
- self.page1:Show()
- elseif button == self.page2.button_cancel then
- self.page2:Hide()
- self.page1:Show()
- end
-end
-
-function CliqueConfig:SetNotification(text)
-end
-
-function CliqueConfig:ClearNotification()
-end
-
-local memoizeBindings = setmetatable({}, {__index = function(t, k, v)
- local binbits = addon:GetBinaryBindingKey(k)
- rawset(t, k, binbits)
- return binbits
-end})
-
-local compareFunctions;
-compareFunctions = {
- name = function(a, b)
- local texta = addon:GetBindingActionText(a)
- local textb = addon:GetBindingActionText(b)
- if texta == textb then
- return compareFunctions.key(a, b)
- end
- return texta < textb
- end,
- key = function(a, b)
- local keya = addon:GetBindingKey(a)
- local keyb = addon:GetBindingKey(b)
- if keya == keyb then
- return memoizeBindings[a] < memoizeBindings[b]
- else
- return keya < keyb
- end
- end,
- binding = function(a, b)
- local mem = memoizeBindings
- return mem[a] < mem[b]
- end,
-}
-
-CliqueConfig.binds = {}
-function CliqueConfig:UpdateList()
- local page = self.page1
- local binds = Clique.profile.binds
-
- -- GUI not created yet
- if not page then
- return
- end
-
- -- Sort the bindings
- local sort = {}
- for uid, entry in pairs(binds) do
- sort[#sort + 1] = entry
- end
-
- if page.sortType then
- table.sort(sort, compareFunctions[page.sortType])
- else
- table.sort(sort, compareFunctions.key)
- end
-
- -- Enable or disable the scroll bar
- if #sort > MAX_ROWS - 1 then
- -- Set up the scrollbar for the item list
- page.slider:SetMinMaxValues(0, #sort - MAX_ROWS)
-
- -- Adjust and show
- if not page.slider:IsShown() then
- -- Adjust column positions
- for idx, row in ipairs(self.rows) do
- row.bind:SetWidth(90)
- end
- page.slider:SetValue(0)
- page.slider:Show()
- end
- elseif page.slider:IsShown() then
- -- Move column positions back and hide the slider
- for idx, row in ipairs(self.rows) do
- row.bind:SetWidth(105)
- end
- page.slider:Hide()
- end
-
- -- Update the rows in the list
- local offset = page.slider:GetValue() or 0
- for idx, row in ipairs(self.rows) do
- local offsetIndex = offset + idx
- if sort[offsetIndex] then
- local bind = sort[offsetIndex]
- row.icon:SetTexture(addon:GetBindingIcon(bind))
- row.name:SetText(addon:GetBindingActionText(bind))
- --row.type:SetText(bind.type)
- row.bind:SetText(addon:GetBindingKeyComboText(bind))
- row:Show()
- else
- row:Hide()
- end
- end
-end
-
-function CliqueConfig:ClearEditPage()
-end
-
-function CliqueConfig:ShowEditPage()
- self:ClearEditPage()
- self.page1:Hide()
- self.page3:Show()
-end
-
-function CliqueConfig:Save_OnClick(button, button, down)
-end
-
-function CliqueConfig:Cancel_OnClick(button, button, down)
- self:ClearEditPage()
- self.page3:Hide()
- self.page1:Show()
-end
-
diff --git a/CliqueOptionsPanel.lua b/CliqueOptionsPanel.lua
deleted file mode 100644
index 27f067b..0000000
--- a/CliqueOptionsPanel.lua
+++ /dev/null
@@ -1,15 +0,0 @@
-local addonName, addon = ...
-
-local panel = CreateFrame("Frame")
-panel.name = "Clique"
-
-panel:SetScript("OnShow", function(self)
- if not panel.initialized then
- panel:CreateOptions()
- end
-end)
-
-function panel:CreateOptions()
-end
-
-InterfaceOptions_AddCategory(panel)
diff --git a/CliqueTest.lua b/CliqueTest.lua
deleted file mode 100644
index 74d286a..0000000
--- a/CliqueTest.lua
+++ /dev/null
@@ -1,56 +0,0 @@
-local addonName, addon = ...
-
-function addon:RunTest()
- function CliqueTest_Unit_OnShow(self)
- local unit = self:GetAttribute("unit")
- if not unit or not UnitExists(unit) then
- return
- end
- local name = UnitName(unit)
- self.name:SetText(name)
- self.healthBar:SetMinMaxValues(0, UnitHealthMax(unit))
- self.powerBar:SetMinMaxValues(0, UnitPowerMax(unit))
- self.healthBar:SetValue(UnitHealth(unit))
- self.powerBar:SetValue(UnitPower(unit))
- end
-
- -- Create a fake "group header" to test things properly
- local groupheader = CreateFrame("Button", "MyGroupHeader", UIParent, "SecureGroupHeaderTemplate")
- SecureHandler_OnLoad(groupheader)
-
- -- Ensure the group header has a reference to the click-cast header
- groupheader:SetFrameRef("clickcast_header", addon.header)
-
- -- Set header attributes
- groupheader:SetAttribute("showParty", true)
- groupheader:SetAttribute("showRaid", true)
- groupheader:SetAttribute("showPlayer", true)
- groupheader:SetAttribute("showSolo", true)
- groupheader:SetAttribute("maxColumns", 8)
- groupheader:SetAttribute("unitsPerColumn", 5)
- groupheader:SetAttribute("columnAnchorPoint", "TOP")
- groupheader:SetAttribute("point", "LEFT")
- groupheader:SetAttribute("template", "CliqueTest_UnitTemplate")
- groupheader:SetAttribute("templateType", "Button")
- groupheader:SetAttribute("xOffset", -1)
- groupheader:SetAttribute("yOffset", -1)
-
- -- Set up the group header to display a solo/party/raid frame
- groupheader:SetAttribute("initialConfigFunction", [==[
- self:SetAttribute("shift-type1", "spell")
- self:SetAttribute("shift-spell1", "Regrowth")
-
- self:SetAttribute("type-cliquebutton1", "spell")
- self:SetAttribute("spell-cliquebutton1", "Lifebloom")
-
- -- Register this frame with the global click-cast header
- local header = self:GetParent():GetFrameRef("clickcast_header")
- header:SetAttribute("clickcast_button", self)
- header:RunAttribute("clickcast_register")
- ]==])
-
- groupheader:SetPoint("CENTER", UIParent, "CENTER", 0, 0)
- groupheader:Show()
-end
-
-
diff --git a/CliqueTest.xml b/CliqueTest.xml
deleted file mode 100644
index 615f47e..0000000
--- a/CliqueTest.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<Ui
- xmlns="http://www.blizzard.com/wow/ui/"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.blizzard.com/wow/ui/
- http://wowprogramming.com/FrameXML/UI.xsd">
-
- <Button name="CliqueTest_UnitTemplate" inherits="ClickCastUnitTemplate,SecureActionButtonTemplate" virtual="true">
- <Size x="34" y="34"/>
- <Anchors>
- <Anchor point="TOPLEFT">
- <Offset x="1" y="-1"/>
- </Anchor>
- </Anchors>
- <Layers>
- <Layer level="OVERLAY">
- <FontString name="$parent_Name" parentKey="name"
- inherits="GameFontHighlight" setAllPoints="true"/>
- <Texture name="$parent_Selected" parentKey="selected" setAllPoints="true"
- file="Interface\Buttons\CheckButtonHilight" alphaMode="ADD" hidden="true"/>
- </Layer>
- </Layers>
- <Frames>
- <StatusBar name="$parent_HealthBar" parentKey="healthBar">
- <Size x="34" y="30"/>
- <Anchors>
- <Anchor point="TOPLEFT"/>
- </Anchors>
- <BarTexture file="Interface\Buttons\UI-Listbox-Highlight2"/>
- <BarColor r="1.0" g="1.0" b="1.0" a="0.6"/>
- </StatusBar>
- <StatusBar name="$parent_PowerBar" parentKey="powerBar">
- <Size x="34" y="3"/>
- <Anchors>
- <Anchor point="TOPLEFT" relativeTo="$parent_HealthBar"
- relativePoint="BOTTOMLEFT">
- <Offset x="0" y="-1"/>
- </Anchor>
- </Anchors>
- <BarTexture file="Interface\TargetingFrame\UI-TargetingFrame-BarFill"/>
- <BarColor r="1.0" g="1.0" b="1.0" a="0.6"/>
- </StatusBar>
- </Frames>
- <Scripts>
- <OnShow>
- CliqueTest_Unit_OnShow(self)
- </OnShow>
- <PostClick>
- print("post-click:", self, button)
- </PostClick>
- </Scripts>
- <HighlightTexture file="Interface\Buttons\ButtonHilight-Square" alphaMode="ADD"/>
- </Button>
-</Ui>
diff --git a/CliqueUtils.lua b/CliqueUtils.lua
deleted file mode 100644
index e7b29ac..0000000
--- a/CliqueUtils.lua
+++ /dev/null
@@ -1,142 +0,0 @@
-local addonName, addon = ...
-local L = addon.L
-
--- Returns the prefix string for the current keyboard state.
---
--- Arguments:
--- split - Whether or not to split the modifier keys into left and right components
-
-function addon:GetPrefixString(split)
- shift, lshift, rshift = IsShiftKeyDown(), IsLeftShiftKeyDown(), IsRightShiftKeyDown()
- ctrl, lctrl, rctrl = IsControlKeyDown(), IsLeftControlKeyDown(), IsRightControlKeyDown()
- alt, lalt, ralt = IsAltKeyDown(), IsLeftAltKeyDown() IsRightAltKeyDown()
-
- if not extended then
- shift = shift or lshift or rshift
- ctrl = ctrl or lctrl or rctrl
- alt = alt or lalt or ralt
-
- lshift, rshift = false, false
- lctrl, rctrl = false, false
- lalt, ralt = false, false
- end
-
- local prefix = ""
- if shift then
- prefix = ((lshift and "LSHIFT-") or (rshift and "RSHIFT-") or "SHIFT-") .. prefix
- end
- if ctrl then
- prefix = ((lctrl and "LCTRL-") or (rctrl and "RCTRL-") or "CTRL-") .. prefix
- end
- if alt then
- prefix = ((lalt and "LALT-") or (ralt and "RALT-") or "ALT-") .. prefix
- end
-
- return prefix
-end
-
-local convertMap = setmetatable({
- LSHIFT = L["LShift"],
- RSHIFT = L["RShift"],
- SHIFT = L["Shift"],
- LCTRL = L["LCtrl"],
- RCTRL = L["RCtrl"],
- CTRL = L["Ctrl"],
- LALT = L["LAlt"],
- RALT = L["RAlt"],
- ALT = L["Alt"],
- BUTTON1 = L["LeftButton"],
- BUTTON2 = L["RightButton"],
- BUTTON3 = L["MiddleButton"],
-}, {
- __index = function(t, k, v)
- if k:match("^BUTTON(%d+)$") then
- return k:gsub("^BUTTON(%d+)$", "Button%1")
- else
- return k:sub(1,1) .. k:sub(2, -1):lower()
- end
- end,
-})
-
-local function convert(item, ...)
- if not item then
- return ""
- else
- local mapItem = convertMap[item]
- item = mapItem and mapItem or item
-
- if select("#", ...) > 0 then
- return item, "-", convert(...)
- else
- return item, convert(...)
- end
- end
-end
-
-function addon:GetBindingIcon(binding)
- local btype = binding.type
- if btype == "menu" then
- --return "Interface\\Icons\\Trade_Engineering"
- return nil
- elseif btype == "target" then
- --return "Interface\\Icons\\Ability_Mage_IncantersAbsorbtion"
- return nil
- else
- return binding.icon or "Interface\\Icons\\INV_Misc_QuestionMark"
- end
-end
-
-function addon:GetBindingKeyComboText(binding)
- return strconcat(convert(strsplit("-", binding.key)))
-end
-
-function addon:GetBindingActionText(binding)
- local btype = binding.type
- if btype == "menu" then
- return L["Show unit menu"]
- elseif btype == "target" then
- return L["Target clicked unit"]
- elseif btype == "spell" then
- if binding.rank then
- return L["Cast %s (Rank %d)"]:format(binding.spell, binding.rank)
- end
- return L["Cast %s"]:format(binding.spell)
- else
- for k,v in pairs(binding) do
- print("binding", k, v)
- end
-
- return L["Unknown binding type '%s'"]:format(tostring(btype))
- end
-end
-
-function addon:GetBindingKey(binding)
- local key = binding.key:match("[^%-]+$")
- return key
-end
-
-local binMap = {
- ALT = 1,
- LALT = 2,
- RALT = 3,
- CTRL = 4,
- LCTRL = 5,
- LCTRL = 6,
- SHIFT = 7,
- LSHIFT = 8,
- RSHIFT = 9,
-}
-
-function addon:GetBinaryBindingKey(binding)
- ret = {"0", "0", "0", "0", "0", "0", "0", "0", "0"}
- splits = {strsplit("-", binding.key)}
- for idx, modifier in ipairs(splits) do
- local bit = binMap[modifier]
- if bit then
- ret[bit] = "1"
- else
- ret[10] = modifier
- end
- end
- return table.concat(ret)
-end
diff --git a/HeaderTest.lua b/HeaderTest.lua
new file mode 100644
index 0000000..74d286a
--- /dev/null
+++ b/HeaderTest.lua
@@ -0,0 +1,56 @@
+local addonName, addon = ...
+
+function addon:RunTest()
+ function CliqueTest_Unit_OnShow(self)
+ local unit = self:GetAttribute("unit")
+ if not unit or not UnitExists(unit) then
+ return
+ end
+ local name = UnitName(unit)
+ self.name:SetText(name)
+ self.healthBar:SetMinMaxValues(0, UnitHealthMax(unit))
+ self.powerBar:SetMinMaxValues(0, UnitPowerMax(unit))
+ self.healthBar:SetValue(UnitHealth(unit))
+ self.powerBar:SetValue(UnitPower(unit))
+ end
+
+ -- Create a fake "group header" to test things properly
+ local groupheader = CreateFrame("Button", "MyGroupHeader", UIParent, "SecureGroupHeaderTemplate")
+ SecureHandler_OnLoad(groupheader)
+
+ -- Ensure the group header has a reference to the click-cast header
+ groupheader:SetFrameRef("clickcast_header", addon.header)
+
+ -- Set header attributes
+ groupheader:SetAttribute("showParty", true)
+ groupheader:SetAttribute("showRaid", true)
+ groupheader:SetAttribute("showPlayer", true)
+ groupheader:SetAttribute("showSolo", true)
+ groupheader:SetAttribute("maxColumns", 8)
+ groupheader:SetAttribute("unitsPerColumn", 5)
+ groupheader:SetAttribute("columnAnchorPoint", "TOP")
+ groupheader:SetAttribute("point", "LEFT")
+ groupheader:SetAttribute("template", "CliqueTest_UnitTemplate")
+ groupheader:SetAttribute("templateType", "Button")
+ groupheader:SetAttribute("xOffset", -1)
+ groupheader:SetAttribute("yOffset", -1)
+
+ -- Set up the group header to display a solo/party/raid frame
+ groupheader:SetAttribute("initialConfigFunction", [==[
+ self:SetAttribute("shift-type1", "spell")
+ self:SetAttribute("shift-spell1", "Regrowth")
+
+ self:SetAttribute("type-cliquebutton1", "spell")
+ self:SetAttribute("spell-cliquebutton1", "Lifebloom")
+
+ -- Register this frame with the global click-cast header
+ local header = self:GetParent():GetFrameRef("clickcast_header")
+ header:SetAttribute("clickcast_button", self)
+ header:RunAttribute("clickcast_register")
+ ]==])
+
+ groupheader:SetPoint("CENTER", UIParent, "CENTER", 0, 0)
+ groupheader:Show()
+end
+
+
diff --git a/HeaderTest.xml b/HeaderTest.xml
new file mode 100644
index 0000000..615f47e
--- /dev/null
+++ b/HeaderTest.xml
@@ -0,0 +1,53 @@
+<Ui
+ xmlns="http://www.blizzard.com/wow/ui/"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.blizzard.com/wow/ui/
+ http://wowprogramming.com/FrameXML/UI.xsd">
+
+ <Button name="CliqueTest_UnitTemplate" inherits="ClickCastUnitTemplate,SecureActionButtonTemplate" virtual="true">
+ <Size x="34" y="34"/>
+ <Anchors>
+ <Anchor point="TOPLEFT">
+ <Offset x="1" y="-1"/>
+ </Anchor>
+ </Anchors>
+ <Layers>
+ <Layer level="OVERLAY">
+ <FontString name="$parent_Name" parentKey="name"
+ inherits="GameFontHighlight" setAllPoints="true"/>
+ <Texture name="$parent_Selected" parentKey="selected" setAllPoints="true"
+ file="Interface\Buttons\CheckButtonHilight" alphaMode="ADD" hidden="true"/>
+ </Layer>
+ </Layers>
+ <Frames>
+ <StatusBar name="$parent_HealthBar" parentKey="healthBar">
+ <Size x="34" y="30"/>
+ <Anchors>
+ <Anchor point="TOPLEFT"/>
+ </Anchors>
+ <BarTexture file="Interface\Buttons\UI-Listbox-Highlight2"/>
+ <BarColor r="1.0" g="1.0" b="1.0" a="0.6"/>
+ </StatusBar>
+ <StatusBar name="$parent_PowerBar" parentKey="powerBar">
+ <Size x="34" y="3"/>
+ <Anchors>
+ <Anchor point="TOPLEFT" relativeTo="$parent_HealthBar"
+ relativePoint="BOTTOMLEFT">
+ <Offset x="0" y="-1"/>
+ </Anchor>
+ </Anchors>
+ <BarTexture file="Interface\TargetingFrame\UI-TargetingFrame-BarFill"/>
+ <BarColor r="1.0" g="1.0" b="1.0" a="0.6"/>
+ </StatusBar>
+ </Frames>
+ <Scripts>
+ <OnShow>
+ CliqueTest_Unit_OnShow(self)
+ </OnShow>
+ <PostClick>
+ print("post-click:", self, button)
+ </PostClick>
+ </Scripts>
+ <HighlightTexture file="Interface\Buttons\ButtonHilight-Square" alphaMode="ADD"/>
+ </Button>
+</Ui>
diff --git a/OptionsPanel.lua b/OptionsPanel.lua
new file mode 100644
index 0000000..27f067b
--- /dev/null
+++ b/OptionsPanel.lua
@@ -0,0 +1,15 @@
+local addonName, addon = ...
+
+local panel = CreateFrame("Frame")
+panel.name = "Clique"
+
+panel:SetScript("OnShow", function(self)
+ if not panel.initialized then
+ panel:CreateOptions()
+ end
+end)
+
+function panel:CreateOptions()
+end
+
+InterfaceOptions_AddCategory(panel)
diff --git a/Utils.lua b/Utils.lua
new file mode 100644
index 0000000..e7b29ac
--- /dev/null
+++ b/Utils.lua
@@ -0,0 +1,142 @@
+local addonName, addon = ...
+local L = addon.L
+
+-- Returns the prefix string for the current keyboard state.
+--
+-- Arguments:
+-- split - Whether or not to split the modifier keys into left and right components
+
+function addon:GetPrefixString(split)
+ shift, lshift, rshift = IsShiftKeyDown(), IsLeftShiftKeyDown(), IsRightShiftKeyDown()
+ ctrl, lctrl, rctrl = IsControlKeyDown(), IsLeftControlKeyDown(), IsRightControlKeyDown()
+ alt, lalt, ralt = IsAltKeyDown(), IsLeftAltKeyDown() IsRightAltKeyDown()
+
+ if not extended then
+ shift = shift or lshift or rshift
+ ctrl = ctrl or lctrl or rctrl
+ alt = alt or lalt or ralt
+
+ lshift, rshift = false, false
+ lctrl, rctrl = false, false
+ lalt, ralt = false, false
+ end
+
+ local prefix = ""
+ if shift then
+ prefix = ((lshift and "LSHIFT-") or (rshift and "RSHIFT-") or "SHIFT-") .. prefix
+ end
+ if ctrl then
+ prefix = ((lctrl and "LCTRL-") or (rctrl and "RCTRL-") or "CTRL-") .. prefix
+ end
+ if alt then
+ prefix = ((lalt and "LALT-") or (ralt and "RALT-") or "ALT-") .. prefix
+ end
+
+ return prefix
+end
+
+local convertMap = setmetatable({
+ LSHIFT = L["LShift"],
+ RSHIFT = L["RShift"],
+ SHIFT = L["Shift"],
+ LCTRL = L["LCtrl"],
+ RCTRL = L["RCtrl"],
+ CTRL = L["Ctrl"],
+ LALT = L["LAlt"],
+ RALT = L["RAlt"],
+ ALT = L["Alt"],
+ BUTTON1 = L["LeftButton"],
+ BUTTON2 = L["RightButton"],
+ BUTTON3 = L["MiddleButton"],
+}, {
+ __index = function(t, k, v)
+ if k:match("^BUTTON(%d+)$") then
+ return k:gsub("^BUTTON(%d+)$", "Button%1")
+ else
+ return k:sub(1,1) .. k:sub(2, -1):lower()
+ end
+ end,
+})
+
+local function convert(item, ...)
+ if not item then
+ return ""
+ else
+ local mapItem = convertMap[item]
+ item = mapItem and mapItem or item
+
+ if select("#", ...) > 0 then
+ return item, "-", convert(...)
+ else
+ return item, convert(...)
+ end
+ end
+end
+
+function addon:GetBindingIcon(binding)
+ local btype = binding.type
+ if btype == "menu" then
+ --return "Interface\\Icons\\Trade_Engineering"
+ return nil
+ elseif btype == "target" then
+ --return "Interface\\Icons\\Ability_Mage_IncantersAbsorbtion"
+ return nil
+ else
+ return binding.icon or "Interface\\Icons\\INV_Misc_QuestionMark"
+ end
+end
+
+function addon:GetBindingKeyComboText(binding)
+ return strconcat(convert(strsplit("-", binding.key)))
+end
+
+function addon:GetBindingActionText(binding)
+ local btype = binding.type
+ if btype == "menu" then
+ return L["Show unit menu"]
+ elseif btype == "target" then
+ return L["Target clicked unit"]
+ elseif btype == "spell" then
+ if binding.rank then
+ return L["Cast %s (Rank %d)"]:format(binding.spell, binding.rank)
+ end
+ return L["Cast %s"]:format(binding.spell)
+ else
+ for k,v in pairs(binding) do
+ print("binding", k, v)
+ end
+
+ return L["Unknown binding type '%s'"]:format(tostring(btype))
+ end
+end
+
+function addon:GetBindingKey(binding)
+ local key = binding.key:match("[^%-]+$")
+ return key
+end
+
+local binMap = {
+ ALT = 1,
+ LALT = 2,
+ RALT = 3,
+ CTRL = 4,
+ LCTRL = 5,
+ LCTRL = 6,
+ SHIFT = 7,
+ LSHIFT = 8,
+ RSHIFT = 9,
+}
+
+function addon:GetBinaryBindingKey(binding)
+ ret = {"0", "0", "0", "0", "0", "0", "0", "0", "0"}
+ splits = {strsplit("-", binding.key)}
+ for idx, modifier in ipairs(splits) do
+ local bit = binMap[modifier]
+ if bit then
+ ret[bit] = "1"
+ else
+ ret[10] = modifier
+ end
+ end
+ return table.concat(ret)
+end