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