Mercurial > wow > breuesk
diff Core.lua @ 0:47fac96968e1
First commit
author | John@Yosemite-PC |
---|---|
date | Fri, 02 Mar 2012 00:15:09 -0500 |
parents | |
children | 21c58930f74e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Core.lua Fri Mar 02 00:15:09 2012 -0500 @@ -0,0 +1,548 @@ +-- ideas: last attended data and/or remove people who haven't attended in X days +-- and/or just a "remove from all lists" option + + +-- order of implementation +-- ( ) lists fully functional (/script interface) +-- ( ) lists single-user functional via command line interface +-- ( ) single user + admin gui (manual suicides) +-- ( ) single user + admin gui (master loot) +-- ( ) communication and list trimming +-- ( ) admins +-- ( ) players gui +-- ( ) crypto / protection against tampering +-- ( ) alt tracking +-- ( ) reserves + +-- important things to remember: +-- 1) ipairs iterates from 1 until the first missing int index -> no gaps +-- 2) a.x === a["x"] +-- 3) a["1"] =/= a[1] + +bsk = LibStub("AceAddon-3.0"):NewAddon("bsk","AceConsole-3.0", "AceHook-3.0", "AceComm-3.0", "AceSerializer-3.0") +local L = LibStub("AceLocale-3.0"):GetLocale("bsk", false) + +local AceGUI = LibStub("AceGUI-3.0") + +function bsk:OnInitialize() + + self.db = LibStub("AceDB-3.0"):New("BskDB", self.defaults, "Default") + + self.options.args.profile = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db) + LibStub("AceConfig-3.0"):RegisterOptionsTable("bsk", self.options) + self.optionsFrame = LibStub("AceConfigDialog-3.0"):AddToBlizOptions("bsk", "bsk") + + self:RegisterChatCommand("bsk", "HandleCommand") + bsk:CreateWorkingStateFromChanges() +end + +function bsk:OnEnable() + --self:HandleCommand() +end + +function bsk:HandleCommand(paramIn) + local param = { strsplit(" ", paramIn) } + local FixPlayerName = function(p) + p = p:lower() + -- next two lines from sylvanaar + local MULTIBYTE_FIRST_CHAR = "^([\192-\255]?%a?[\128-\191]*)" + return string.gsub(p, MULTIBYTE_FIRST_CHAR, string.upper, 1) + end + + if param[1] == nil or param[1] == "" then + bsk:Print("need args") + return + end + if param[1] == "players" then + bsk:PrintPlayers() + elseif param[1] == "add" then + if param[2] == nil or param[2] == "" then + bsk:PrintTable(param) + return + end + if param[3] == nil or param[3] == "" then + bsk:PrintTable(param) + return + end + if param[2] == "player" then + --if param[3] == "all" then + -- bsk:Pop + --else + local player = FixPlayerName(param[3]) + bsk:AddPlayer(player) + --end + elseif param[2] == "list" then + bsk:CreateList(param[3]) + end + elseif param[1] == "suicide" then + if param[2] == nil or param[2] == "" or param[3] == nil or param[3] == "" then + bsk:PrintTable(param) + return + end + local player = FixPlayerName(param[2]) + bsk:Print(string.format("Fixed player name %s to %s",param[2],player)) + bsk:SuicidePlayer(player,param[3]) + elseif param[1] == "show" then + if param[2] == nil or param[2] == "" then + bsk:PrintTable(param) + return + end + bsk:PrintLists(param[2]) + end + + -- TODO: add options + -- + -- for now: launch GUI + -- + + --if self.frame == nil then + --self:CreateGUI() + --self:ShowGUI() + --else + --self:ShowGUI() + --end + +end +--MULTIBYTE_FIRST_CHAR = "^([\192-\255]?%a?[\128-\191]*)" +--function GetNamePattern(name) +-- local u = name:match(MULTIBYTE_FIRST_CHAR):upper() + +-- if not u or u:len() == 0 then Prat.Print("GetNamePattern: name error", name) return end +-- local l = u:lower() +-- local namepat +-- if u == l then +-- namepat = name:lower() +-- elseif u:len() == 1 then +-- namepat = "["..u..l.."]"..name:sub(2):lower() +-- elseif u:len() > 1 then +-- namepat = "" +-- for i=1,u:len() do +-- namepat = namepat .. "[" .. u:sub(i,i)..l:sub(i,i).."]" +-- end +-- namepat = namepat .. name:sub(u:len()+1) +-- end +-- return "%f[%a\192-\255]"..namepat.."%f[^%a\128-\255]" +--end +--AnyNamePattern = "%f[%a\192-\255]([%a\192-\255]+)%f[^%a\128-\255]" + + +function bsk:CreateGUI() + + -- Create a container frame + self.frame = AceGUI:Create("Frame") + self.frame:SetCallback("OnClose",function(widget) AceGUI:Release(widget) end) + self.frame:SetTitle("BSK") + self.frame:SetLayout("Flow") + self.frame:SetHeight(700) + self.frame:SetWidth(350) + local tab = AceGUI:Create("TabGroup") + tab:SetLayout("Flow") + tab:SetTabs( + { + { + text="Tab 1", + value="tab1" + }, + + { + text="Tab 2", + value="tab2" + }, + { + text="Tab 3", + value="tab3" + }, + { + text="Tab 4", + value="tab4" + } + } + ) + tab.width = "fill" + tab.height = "fill" + + tab:SetCallback("OnGroupSelected",ChangeTab) + tab:SelectTab("tab1") + self.frame:AddChild(tab) + + -- Create a button + --local btn = AceGUI:Create("Button") + --btn:SetWidth(170) + --btn:SetText("Button !") + --btn:SetCallback("OnClick", function() print("Click!") end) + -- Add the button to the container + --self.frame:AddChild(btn) +end + +bsk.defaults = { + profile = { + players = {}, + changes = {}, + listBase = {} + } +} + +bsk.options = { + name= 'bsk', + type = 'group', + args = + { + version = + { + type = "execute", + name = "Version query", + desc = "Check others' versions", + func = function(self) self:Print("TODO") end + } + } +} +function ChangeTab(container, event, group) + container:ReleaseChildren() + if group == "tab2" then + local desc = AceGUI:Create("Label") + desc:SetText("This is Tab 1") + desc:SetFullWidth(true) + container:AddChild(desc) + + local button = AceGUI:Create("Button") + button:SetText("Tab 1 Button") + button:SetWidth(200) + container:AddChild(button) + elseif group == "tab1" then + local item2 = {string="item2!", color = {r=1,g=0,b=0.5} } + local itemList = {"Item1", item2, "Item3", "Item4"} + + local myMultiSelect = AceGUI:Create("MultiSelect") + myMultiSelect:SetLabel("My Multi Select") + myMultiSelect:SetWidth(200) + myMultiSelect:SetHeight(400) + myMultiSelect:SetItemList(itemList) + myMultiSelect:SetMultiSelect(false) + container:AddChild(myMultiSelect) + end +end + + + + + + + + + + + +--[[---------------------------------- +-- MultiSelect widget for AceGUI-3.0 +-- Written by Shirokuma +--]]---------------------------------- + + +--[[----------------- +-- AceGUI +--]]----------------- +--local AceGUI = LibStub("AceGUI-3.0") + +--[[----------------- +-- Lua APIs +--]]----------------- +local format, pairs, tostring = string.format, pairs, tostring + +--[[----------------- +-- WoW APIs +--]]----------------- +local CreateFrame, UIParent = CreateFrame, UIParent + +--[[----------------- +-- Frame Elements +--]]----------------- +local FrameBackdrop = { + bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", + edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", + tile = true, tileSize = 16, edgeSize = 16, + insets = { left = 3, right = 3, top = 3, bottom = 3 } +} + + +--[[----------------- +-- Widget Info +--]]----------------- +local widgetType = "MultiSelect" +local widgetVersion = 1 + + +--[[----------------- +-- Event Code +--]]----------------- +local function Label_OnEnter(label) + local self = label.obj + local value = label + self:Fire("OnLabelEnter", value) +end + +local function Label_OnLeave(label) + local self = label.obj + local value = label + self:Fire("OnLabelEnter", value) +end + +local function Label_OnClick(label) + local self = label.obj + local value = label + self:Fire("OnLabelClick", value) + AceGUI:ClearFocus() +end + + +--[[----------------- +-- MultiSelect Code +--]]----------------- +do + local function OnAcquire(self) -- set up the default size + self:SetWidth(200) + self:SetHeight(400) + end + + local function SetWidth(self, w) -- override the SetWidth function to include the labelframe + self.frame:SetWidth(w) + self.labelframe:SetWidth(w-33) + end + + local function SetLabel(self, text) -- sets the multiselect label text + self.label:SetText(text) + end + + local function SetMultiSelect(self, value) -- set if multiple values can be selected simultaneously + self.multiselect = value + end + + local function AddItem(self, str, color) -- add an item (create a new item label object) + local color = color + local label = CreateFrame("Button", nil, self.labelframe) + label.selected = false + label.obj = self + label:SetHeight(18) + label:SetPoint("TOPLEFT", self.labelframe, "TOPLEFT", 0, -(getn(self.labels) * 18)) + label:SetPoint("TOPRIGHT", self.labelframe, "TOPRIGHT", 0, -(getn(self.labels) * 18)) + self.labels[getn(self.labels) + 1] = label + self.labelframe:SetHeight(getn(self.labels) * 18) + + local text = label:CreateFontString(nil,"OVERLAY","GameFontNormalSmall") + text:SetJustifyH("LEFT") + text:SetPoint("TOPLEFT",label,"TOPLEFT",5,0) + text:SetPoint("BOTTOMRIGHT",label,"BOTTOMRIGHT",-5,0) + if color ~= nil then + text:SetTextColor(color.r,color.g,color.b) + end + text:SetText(str) + label.text = text + + local highlight = label:CreateTexture(nil, "OVERLAY") + highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight") + highlight:SetBlendMode("ADD") + highlight:SetHeight(14) + highlight:ClearAllPoints() + highlight:SetPoint("RIGHT",label,"RIGHT",0,0) + highlight:SetPoint("LEFT",label,"LEFT",0,0) + highlight:Hide() + label.highlight = highlight + + label:SetScript("OnEnter", function(this) + this.highlight:Show() + Label_OnEnter(this) + end) + label:SetScript("OnLeave", function(this) + if not this.selected then + this.highlight:Hide() + end + end) + label:SetScript("OnClick", function(this) + if not this.selected then + this.selected = true + if not self.multiselect then + for index, items in pairs(self.labels) do + if self.labels[index] ~= this and self.labels[index].selected then + self.labels[index].selected = false + self.labels[index].highlight:Hide() + end + end + end + else + this.selected = false + end + Label_OnClick(this) + end) + end + + local function GetItem(self, text) -- find an object based on the text parameter + for _, value in pairs(self.labels) do + if value.text:GetText() == text then + return value + end + end + return nil + end + + local function GetText(self, value) -- get the text of a label object + for _,item in pairs(self.labels) do + if value == item then + return item.text:GetText() + end + end + return nil + end + + local function SetText(self, value, text) -- set the text of a label object + for _, item in pairs(self.labels) do + if value == item then + value.text:SetText(text) + end + end + end + + local function IsSelected(self, value) -- return if the label object is currently selected + for _, item in pairs(self.labels) do + if value == item then + return item.selected + end + end + return nil + end + + local function GetSelected(self) -- return a table of the currently selected label objects + local selectedList = {} + for _, item in pairs(self.labels) do + if item.selected then + table.insert(selectedList, item) + end + end + return selectedList + end + + local function SetItemList(self, list) -- create new labels from a list of strings + for _,item in pairs(self.labels) do + item:Hide() + item:ClearAllPoints() + end + + self.labels = {} + + if list then + for _,item in pairs(list) do + if type(item) == "string" then + self:AddItem(item) + elseif type(item) == "table" then + if item.string ~= nil and type(item.string) == "string" then + if item.color ~= nil then + if type(item.color) == "table" and item.color.r ~= nil and item.color.g ~= nil and item.color.b ~= nil then + self:AddItem(item.string, item.color) + else + assert(false and "setitemlist: item.color is set, but nonsense") + end + else + self:AddItem(item.string) + end + else + assert( false and "setitemlist: item is table without .string member") + end + else + assert(false and "SetItemList: nonsense list entry") + end + end + end + end + + local function RemoveItem(self, item) -- delete an item + local function RedrawFrame() + for index,value in pairs(self.labels) do + value:SetPoint("TOPLEFT", self.labelframe, "TOPLEFT", 0, (-(index-1) * 18)) + value:SetPoint("TOPRIGHT", self.labelframe, "TOPRIGHT", 0,(-(index-1) * 18)) + end + end + + for index, value in pairs(self.labels) do + if value == item then + table.remove(self.labels, index) + item:Hide() + item:ClearAllPoints() + RedrawFrame() + end + end + end + + local function SetSelected(self, item, value) + if value then + if not self.multiselect then -- test + for _, value in pairs(self.labels) do + value.selected = false + value.highlight:Hide() + end + end + item.selected = true + item.highlight:Show() + else + item.selected = false + item.highlight:Hide() + end + end + + local function Constructor() -- widget constructor + local frame = CreateFrame("Frame", nil, UIParent) + local backdrop = CreateFrame("Frame", nil, frame) + local self = {} + local labels = {} + + self.type = widgetType + self.frame = frame + self.backdrop = backdrop + self.labels = {} + self.multiselect = true + frame.obj = self + + local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall") + label:SetJustifyH("LEFT") + label:SetPoint("TOPLEFT", 5, 0) + label:SetPoint("TOPRIGHT", -5, 0) + label:SetHeight(14) + label:SetText("MultiSelect") + self.label = label + + backdrop:SetBackdrop(FrameBackdrop) + backdrop:SetBackdropColor(0, 0, 0) + backdrop:SetBackdropBorderColor(0.4, 0.4, 0.4) + backdrop:SetPoint("TOPLEFT", frame, "TOPLEFT", 5, -14) + backdrop:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -5, 0) + + local scrollframe = CreateFrame("ScrollFrame", format("%s@%s@%s", widgetType, "ScrollFrame", tostring(self)), frame, "UIPanelScrollFrameTemplate") + scrollframe:SetPoint("TOPLEFT", backdrop, "TOPLEFT", 5, -6) + scrollframe:SetPoint("BOTTOMRIGHT", backdrop, "BOTTOMRIGHT", -28, 6) + scrollframe.obj = self + self.scrollframe = scrollframe + + local labelframe = CreateFrame("Frame", nil, scrollframe) + labelframe:SetAllPoints() + labelframe.obj = self + scrollframe:SetScrollChild(labelframe) + self.labelframe = labelframe + + -- method listing + self.OnAcquire = OnAcquire + self.SetLabel = SetLabel + self.AddItem = AddItem + self.SetWidth = SetWidth + self.SetMultiSelect = SetMultiSelect + self.SetItemList = SetItemList + self.GetItem = GetItem + self.RemoveItem = RemoveItem + self.GetText = GetText + self.SetText = SetText + self.IsSelected = IsSelected + self.GetSelected = GetSelected + self.SetSelected = SetSelected + + AceGUI:RegisterAsWidget(self) + return self + end + AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion) +end +