Mercurial > wow > breuesk
view 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 source
-- 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