WoWInterface SVN Cellular

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 55 to Rev 56
    Reverse comparison

Rev 55 → Rev 56

trunk/embeds.xml New file
0,0 → 1,5
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Script file="libs\LibStub.lua"/>
<Script file="libs\CallbackHandler-1.0.lua"/>
<Script file="libs\LibSharedMedia-3.0.lua"/>
</Ui>
\ No newline at end of file
trunk/locale/core.lua New file
0,0 → 1,8
local _,namespace=...
namespace.locale=GetLocale()
local L=setmetatable({},{__index=function(t,k)
local v=tostring(k)
rawset(t,k,v)
return v
end})
namespace.L=L
\ No newline at end of file
trunk/locale/enUS.lua New file
0,0 → 1,78
local ADDON_NAME,namespace=...
local L=namespace.L
if namespace.locale=="enUS" or namespace.locale=="enGB" then
L["Sorry, I am busy right now...I will chat with you later."] = "Sorry, I'm busy right now...I'll chat with you later."
L["I am Busy!"] = "I am busy."
L["Notes"] = "Notes"
L["Author"] = "Authors"
L["Version"] = "Version"
L["Hey self, entering cheap config mode."] = "Hey self, entering cheap config mode."
L[" is AFK: "] = " is afk"
L[" is DND: "] = " is dnd"
L[" is ignoring you."] = " is ignoring you"
L["See Cellular.lua in SavedVariables for more"] = "* See: WTF\Account\<Name>\<Server>\<Charakter>\SavedVariables\Cellular.lua for more *"
L["History usage is high"] = "History usage is high ( +%d KB ). Consider cleaning it."
L["Max windows reached"] = "Max. windows reached."
L[" Shift-click to execute"] = "Shift-click to execute"
L[" History must be enabled"] = "History must be enabled"
L["Hold shift and drag to resize."] = "Hold shift and drag to resize."
L["Hold shift and drag to move."] = "Hold shift and drag to move."
L["Hold shift and drag empty space."] = "Hold shift and drag empty space to move or bottom-right corner to resize windows."
L["Set your busy message."] = "Set your busy message"
L["history cleared."] = "History cleared."
L["history entries removed"] = "history entries removed."
L["This setting requires a reload."] = "This setting requires a reload and will effect all characters."
L["Show Message (or left-click)"] = "Show Message (or left-click)"
L["Close Tab (or middle-click)"] = "Close Tab (or middle-click)"
L["Options"] = "Options menu"
L["Frame"] = "Frame"
L["Text"] = "Text"
L["Behavior"] = "Behavior"
L["History"] = "History"
L["Texture Group"] = "Texture Group"
L["Background Texture"] = "Background Texture"
L["Background Color"] = "Background Color"
L["Border"] = "Border"
L["Border Color"] = "Border Color"
L["Show Side Buttons"] = "Show Side Buttons"
L["Frame Opacity"] = "Frame Opacity"
L["Frame Strata"] = "Frame Strata"
L["Reset Size and Position"] = "Reset Size and Position"
L["How to Move-Resize"] = "How to Move/Resize"
L["Show Name"] = "Show Name"
L["Show Timestamp"] = "Show Timestamp"
L["Fade Old Messages"] = "Fade Old Messages"
L["Title Font"] = "Title Font"
L["Title Style"] = "Title Style"
L["Message Font"] = "Message Font"
L["Message Style"] = "Message Style"
L["Message Font Size"] = "Message Font Size"
L["Incoming Font Color"] = "Incoming Font Color"
L["Outgoing Font Color"] = "Outgoing Font Color"
L["Use Tabs"] = "Use Tabs"
L["No battle.net"] = "No Battle.net"
L["Combat Auto-Minimize"] = "Combat Auto-Minimize"
L["Always Auto-Minimize"] = "Always Auto-Minimize"
L["Editbox Top Anchor"] = "Editbox Top Anchor"
L["Disable EditBox Move"] = "Disable EditBox Move"
L["Disable Block to Default"] = "Disable Block to Default"
L["Maximum Windows/Tabs"] = "Maximum Windows / Tabs"
L["Set Busy Message"] = "Set Busy Message"
L["Save Settings Per Character"] = "Save Settings Per Character"
L["Enable History"] = "Enable History"
L["Show Recent"] = "Show Recent"
L["Show Entry"] = "Show Entry"
L["Clear Entry (hold shift)"] = "Clear Entry (hold shift)"
L["Clear +6 Weeks (hold shift)"] = "Clear +6 Weeks (hold shift)"
L["Clear All (hold shift)"] = "Clear All (hold shift)"
L["None"] = "None"
L["Shadow"] = "Shadow"
L["Outline"] = "Outline"
L["Thick Outline"] = "Thick Outline"
L["Monochrome"] = "Monochrome"
L["BACKGROUND"] = "BACKGROUND"
L["LOW"] = "LOW"
L["MEDIUM"] = "MEDIUM"
L["HIGH"] = "HIGH"
L["DIALOG"] = "DIALOG"
return end
\ No newline at end of file
trunk/locale/deDE.lua New file
0,0 → 1,77
local ADDON_NAME,namespace=...
local L=namespace.L
if namespace.locale=="deDE"then
L["Sorry, I am busy right now...I will chat with you later."] = "Tut mir leid, aber ich bin gerade beschäftigt. Ich melde mich später."
L["I am Busy!"] = "Ich bin beschäftigt."
L["Notes"] = "Notizen"
L["Author"] = "Autoren"
L["Version"] = "Version"
L["Hey self, entering cheap config mode."] = "Nachricht an mich selbst: gehe in den einfachen Konfigurationsmodus."
L[" is AFK: "] = " ist nicht an der Tastatur (AFK)."
L[" is DND: "] = " möchte nicht gestört werden (DND)."
L[" is ignoring you."] = " ignoriert dich!"
L["See Cellular.lua in SavedVariables for more"] = "* Siehe: WTF\Account\<Name>\<Server>\<Charakter>\SavedVariables\Cellular.lua für mehr *"
L["History usage is high"] = "Verlauf ist zu groß. Ziehe eine Löschung in betracht."
L["Max windows reached"] = "Max. Fenster / Tabs erreicht."
L[" Shift-click to execute"] = "Umschalttaste (Shift) + linke Maustaste"
L[" History must be enabled"] = "Verlauf muß aktiviert sein"
L["Hold shift and drag to resize."] = "Halte die Umschalttaste (Shift) gedrückt und ziehe um die Fenstergröße zu ändern."
L["Hold shift and drag to move."] = "Halte die Umschalttaste (Shift) gedrückt um das Fenster zu bewegen."
L["Hold shift and drag empty space."] = "Halte die Umschalttaste (Shift) gedrückt und ziehe das Fenster in einen leeren Bereich, um es zu verschieben, oder die untere rechte Ecke, um die Größe zu ändern."
L["Set Busy Message"] = "Hier deine Beschäftigungsnachricht eingeben."
L["history cleared."] = "Verlauf gelöscht!"
L["history entries removed"] = "Verlaufseinträge gelöscht!"
L["This setting requires a reload."] = "Diese Einstellung benötigt ein neu laden des Spiels und betrifft auch alle Charaktere mit eingeschalteten Add-On."
L["Show Message (or left-click)"] = "Zeige Nachricht (oder linke Maustaste)"
L["Close Tab (or middle-click)"] = "Fenster / Tab schließen (oder mittlere Maustaste)"
L["Options"] = "Optionenmenü"
L["Frame"] = "Frame"
L["Text"] = "Text"
L["Behavior"] = "Verhalten"
L["History"] = "Verlauf"
L["Texture Group"] = "Texturgruppe"
L["Background Texture"] = "Hintergrundtextur"
L["Background Color"] = "Hintergrundfarbe"
L["Border"] = "Umrandung"
L["Border Color"] = "Umrandungsfarbe"
L["Show Side Buttons"] = "Zeige Seitentasten"
L["Frame Opacity"] = "Frame (Sichtbarkeit)"
L["Frame Strata"] = "Frame (Schicht)"
L["Reset Size and Position"] = "Größe und Position zurücksetzen"
L["How to Move-Resize"] = "Verschieben / Ändern der Größe"
L["Show Name"] = "Zeige Name"
L["Show Timestamp"] = "Zeige Uhrzeit"
L["Fade Old Messages"] = "Alte Mitteilungen ausblenden"
L["Title Font"] = "Schriftart für Überschrift"
L["Title Style"] = "Stil für Überschrift"
L["Message Font"] = "Schriftart für Mitteilungen"
L["Message Style"] = "Stil für Mitteilungen"
L["Message Font Size"] = "Schriftartgröße für Mitteilungen"
L["Incoming Font Color"] = "Eingehende Schriftartenfarbe"
L["Outgoing Font Color"] = "Ausgehende Schriftartenfarbe"
L["Use Tabs"] = "Benutze Fenster / Tabs"
L["No battle.net"] = "Kein Battle.net"
L["Combat Auto-Minimize"] = "Kampf selbstminimieren"
L["Always Auto-Minimize"] = "Immer selbstminimieren"
L["Editbox Top Anchor"] = "Oberer Anker für die Editierungsbox"
L["Disable EditBox Move"] = "Deaktivere Editierungsbox"
L["Disable Block to Default"] = "Deaktivere auf Standard blockieren"
L["Maximum Windows/Tabs"] = "Max. Fenster / Tabs"
L["Save Settings Per Character"] = "Einstellungen für einzelnen Charakter speichern"
L["Enable History"] = "Verlauf aktivieren"
L["Show Recent"] = "Zeige neueste"
L["Show Entry"] = "Zeige Eintrag"
L["Clear Entry (hold shift)"] = "Eintrag löschen + (Umschalttaste drücken)"
L["Clear +6 Weeks (hold shift)"] = "+6 Wochen löschen + (Umschalttaste drücken)"
L["Clear All (hold shift)"] = "Alle löschen + (Umschalttaste drücken)"
L["None"] = "Nichts"
L["Shadow"] = "Schatten"
L["Outline"] = "Kontur"
L["Thick Outline"] = "dicke Kontur"
L["Monochrome"] = "Schwarzweiß"
L["BACKGROUND"] = "Hintergrund"
L["LOW"] = "Niedrig"
L["MEDIUM"] = "Mittel"
L["HIGH"] = "Hoch"
L["DIALOG"] = "Dialog"
return end
\ No newline at end of file
trunk/Cellular.toc New file
0,0 → 1,22
## Interface: 90002
## Title: Cellular (Shadowlands)
## Notes: Instant messenger for whispers
## Author: TotalPackage, Shexyriar
## Version: 9.0.3
 
## SavedVariables: CellularDB
## SavedVariablesPerCharacter: CellularCharDB, Cellular_History
## OptionalDeps: LibSharedMedia-3.0
## LoadManagers: AddonLoader
 
## X-OriginalAuthor: TotalPackage
## X-Category: Chat/Communication
## X-LoadOn-Always: true
 
embeds.xml
 
locale\core.lua
locale\enUS.lua
locale\deDE.lua
 
core.lua
\ No newline at end of file
trunk/core.lua New file
0,0 → 1,1290
local Cellular=CreateFrame("Frame","Cellular",UIParent,BackdropTemplateMixin and "BackdropTemplate")
local a=Cellular
local smed=LibStub("LibSharedMedia-3.0")
local _G=getfenv(0)
local format,gsub,strmatch,gmatch=format,gsub,strmatch,gmatch
local cfeb,ChatFrame_GetMessageEventFilters=ChatFrame10EditBox or ChatFrame1EditBox,ChatFrame_GetMessageEventFilters
local db,svar
local you,attached,lastwindow,currenttab,eb
local nwin=0
local base,tabs,usedtabs,recentw,taborder={},{},{},{},{}
local l_p,l_rt,l_rp,l_x,l_y,r_p,r_rt,r_rp,r_x,r_y
local MinimizeWindow,GetWindow,CloseWindow,ShowOptions
local realmName=GetRealmName()
a:SetScript("OnEvent",function(this,event,...)
a[event](a,...)
end)
a:RegisterEvent("ADDON_LOADED")
function a:ADDON_LOADED(a1)
if a1~="Cellular"then return end
a:UnregisterEvent("ADDON_LOADED")
a.ADDON_LOADED=nil
CellularDB=CellularDB or{}
if CellularDB.char then
CellularCharDB=CellularCharDB or(CellularDB.profiles and CellularDB.profiles.Default)or CellularDB
db=CellularCharDB
else
db=(CellularDB.profiles and CellularDB.profiles.Default)or CellularDB
end
if db.dbinit~=2 then
db.dbinit=2
for k,v in pairs({
width=340,height=160,
pos={},
alpha=0.9,
bg="Tooltip",
bgcolor={0,0,0,1,},
border="Blizzard Tooltip",
bordercolor={0.7,0.7,0.7,1,},
incolor={1,0,1,1,},
outcolor={0,1,1,1,},
busymessage="Sorry, I'm busy right now...I'll chat with you later.",
history=true,enabletabs=false,char=false,
maxwindows=8,
fade=true,
automin=false,autominalways=false,
showname=true,showtime=true,showside=true,
fontmsg="Arial Narrow",fonttitle="Arial Narrow",fontsize=12,
})do
db[k]=(db[k]~=nil and db[k])or v
end
end
db.border=(type(db.border)=="string"and db.border)or(db.border and"Blizzard Tooltip")or"None"
a:SetAlpha(db.alpha)
Cellular_History=Cellular_History or{}
svar=Cellular_History
SlashCmdList.CELLULAR=ShowOptions
SLASH_CELLULAR1,SLASH_CELLULAR2="/cellular","/cell"
local panel=CreateFrame("Frame",BackdropTemplateMixin and "BackdropTemplate")
panel.name="Cellular"
panel:SetScript("OnShow",function(this)
local t1=this:CreateFontString(nil,"ARTWORK","GameFontNormalLarge")
t1:SetJustifyH("LEFT")
t1:SetJustifyV("TOP")
t1:SetPoint("TOPLEFT",16,-16)
t1:SetText(this.name)
local t2=this:CreateFontString(nil,"ARTWORK","GameFontHighlightSmall")
t2:SetJustifyH("LEFT")
t2:SetJustifyV("TOP")
t2:SetHeight(43)
t2:SetPoint("TOPLEFT",t1,"BOTTOMLEFT",0,-8)
t2:SetPoint("RIGHT",this,"RIGHT",-32,0)
t2:SetNonSpaceWrap(true)
t2:SetFormattedText("Notes: %s\nAuthor: %s\nVersion: %s",
GetAddOnMetadata("Cellular","Notes"),
GetAddOnMetadata("Cellular","Author"),
GetAddOnMetadata("Cellular","Version"))
local b=CreateFrame("Button",nil,this,"UIPanelButtonTemplate")
b:SetWidth(120)
b:SetHeight(20)
b:SetText("Options Menu")
b:SetScript("OnClick",ShowOptions)
b:SetPoint("TOPLEFT",t2,"BOTTOMLEFT",-2,-8)
this:SetScript("OnShow",nil)
end)
InterfaceOptions_AddCategory(panel)
local cevents={"CHAT_MSG_WHISPER","CHAT_MSG_WHISPER_INFORM","CHAT_MSG_AFK","CHAT_MSG_DND","CHAT_MSG_IGNORED",}
if not db.nobn then
tinsert(cevents,"CHAT_MSG_BN_WHISPER")
tinsert(cevents,"CHAT_MSG_BN_WHISPER_INFORM")
end
for _,v in ipairs(cevents)do
a:RegisterEvent(v)
end
you=UnitName("player")
a.pratloaded=select(4,GetAddOnInfo("Prat-3.0"))
CONFIGMODE_CALLBACKS=CONFIGMODE_CALLBACKS or{}
CONFIGMODE_CALLBACKS.Cellular=function(action,mode)
if action=="ON"then
SendChatMessage("Hey self, entering cheap config mode.","WHISPER",nil,you)
end
end
if not db.chatshow then
local _G=getfenv(0)
local function Unreg(frame)
if type(frame)~="table"then return end
for _,v in ipairs(cevents)do
frame:UnregisterEvent(v)
end
end
for i=1,NUM_CHAT_WINDOWS,1 do
Unreg(_G["ChatFrame"..i])
end
hooksecurefunc("ChatFrame_AddMessageGroup",Unreg)
hooksecurefunc("ChatFrame_RegisterForMessages",Unreg)
end
end
local function Filter(event,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14)
local cfilter=ChatFrame_GetMessageEventFilters(event)
if cfilter then
for _,filterFunc in next,cfilter do
local filter,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14=filterFunc(a,event,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14)
if filter then
return true
elseif n1 and n2 then
a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14=n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14
end
end
end
if a7<1 or(a7>=1 and _G.CHAT_SHOW_ICONS~="0")then
for tag in gmatch(a1,"%b{}")do
local termlist=ICON_TAG_LIST[strlower(gsub(tag,"[{}]",""))]
local icon=termlist and ICON_LIST[termlist]
if icon then
a1=gsub(a1,tag,icon.."0|t")
end
end
end
return a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14
end
function a:CHAT_MSG_WHISPER(...)
local a1,a2,_,_,_,a6,_,_,_,_,a11,a12=Filter("CHAT_MSG_WHISPER",...)
if a2 and a6~="GM"then
a:IncomingMessage(a2,a1,a6,nil,a11,a12)
end
end
function a:CHAT_MSG_BN_WHISPER(...)
local a1,a2,_,_,_,a6,_,_,_,_,a11,a12,a13,a14,a15=Filter("CHAT_MSG_BN_WHISPER",...)
if a2 then
a:IncomingMessage(a2,a1,a6,nil,a11,a12,a13)
end
end
function a:CHAT_MSG_WHISPER_INFORM(...)
local a1,a2=Filter("CHAT_MSG_WHISPER_INFORM",...)
if a2 and(not GMChatFrame_IsGM or not GMChatFrame_IsGM(a2))then
a:OutgoingMessage(a2,a1)
end
end
function a:CHAT_MSG_BN_WHISPER_INFORM(...)
local a1,a2,_,_,_,_,_,_,_,_,_,_,a13,a14,a15=Filter("CHAT_MSG_BN_WHISPER_INFORM",...)
if a2 then
a:OutgoingMessage(a2,a1,a13)
end
end
function a:CHAT_MSG_AFK(a1,a2)
a:IncomingMessage(a2,a2.." is AFK: "..a1,nil,2)
end
function a:CHAT_MSG_DND(a1,a2)
a:IncomingMessage(a2,a2.." is DND: "..a1,nil,3)
end
function a:CHAT_MSG_IGNORED(_,a2)
a:IncomingMessage(a2,a2.." is ignoring you.",nil,4)
end
local parstrings
function a:CHAT_MSG_SYSTEM(text)
if not taborder[1]or not text then return end
if not parstrings then
parstrings={
"|Hplayer:(.+)|h%[(.+)%]|h(.+)",ERR_FRIEND_OFFLINE_S,
JOINED_PARTY,LEFT_PARTY,ERR_DECLINE_GROUP_S,
ERR_RAID_MEMBER_ADDED_S,ERR_RAID_MEMBER_REMOVED_S,
ERR_GUILD_JOIN_S,ERR_GUILD_DECLINE_S,ERR_GUILD_LEAVE_S,
ERR_PETITION_DECLINED_S,ERR_PETITION_SIGNED_S,
}
for index,s in ipairs(parstrings)do
parstrings[index]=gsub(s,"%%s","(.+)")
end
end
for index,s in ipairs(parstrings)do
local name=strmatch(text,s)
if name then
return a:IncomingMessage(name,text,nil,1)
end
end
end
function a:CHAT_MSG_TEXT_EMOTE(emote,sender)
if taborder[1]and strfind(emote," you")then
a:IncomingMessage(sender,emote,nil,1)
end
end
local function UpdateTabOrder(id)
if not db.enabletabs then return end
currenttab=id or currenttab or 1
base[1].tab=currenttab
local n=#taborder+0.4
local tabsize=(db.width-(2*n+48))/n
local i=0
for _,tid in ipairs(taborder)do
i=i+1
local t=tabs[tid]
t:SetPoint("TOPLEFT",base[1],"TOPLEFT",((i-1)*tabsize)+(2*i)+8,-6)
if tid==currenttab then
if not t:GetParent().mini then
t.mininew=0
t.text:SetText(t.name)
t.msg:Show()
end
t:SetBackdropColor(0,0,0,0)
t.text:SetTextColor(t.text.r or 1,t.text.g or 1,t.text.b or 1,1)
i=i+0.4
else
t.msg:Hide()
t:SetBackdropColor(0.7,0.7,0.7,0.7)
t.text:SetTextColor(0.8,0.8,0.8,0.8)
end
t:SetPoint("BOTTOMRIGHT",base[1],"TOPLEFT",(i*tabsize)+(2*i)+8,-20)
end
if#taborder<1 then
CloseWindow(tabs[1])
end
end
local function RemoveTab(id,activeid)
if not id then return end
for index,tid in pairs(taborder)do
if tid==id or id=="a"then
local tab=tabs[tid]
usedtabs[tab.name]=nil
tab:Hide()
tab.text.r,tab.text.g,tab.text.b=nil,nil,nil
tremove(taborder,index)
if IsControlKeyDown()then
svar[tabs[(id=="a"and activeid)or tid].name]=nil
end
end
end
currenttab=(id==currenttab and taborder[1])or currenttab
if attached==id and cfeb:IsShown()then
ChatEdit_DeactivateChat(cfeb)
end
UpdateTabOrder()
end
local function ResetEditBox()
if not attached then return end
cfeb:ClearAllPoints()
cfeb:SetParent(l_rt)
cfeb:SetPoint(l_p,l_rt,l_rp,l_x,l_y)
if r_p then cfeb:SetPoint(r_p,r_rt,r_rp,r_x,r_y)end
attached=nil
end
local skipupdate
local sw=_G.SLASH_SMART_WHISPER1.." "
local function AttachEditBox(id,skiptext,skipset)
local tab=tabs[id]
if not tab:IsShown()then return end
if not db.noattach then
ChatEdit_ActivateChat(cfeb)
cfeb.setText=1
cfeb.text=sw..tab.name.." "
ChatEdit_UpdateHeader(cfeb)
ChatEdit_ParseText(cfeb,0)
if not attached then
l_p,l_rt,l_rp,l_x,l_y=cfeb:GetPoint(1)
r_p,r_rt,r_rp,r_x,r_y=cfeb:GetPoint(2)
end
cfeb:SetParent(tab:GetParent())
cfeb:ClearAllPoints()
if db.showtop then
cfeb:SetPoint("BOTTOMLEFT",tab:GetParent(),"TOPLEFT",0,-6)
cfeb:SetPoint("BOTTOMRIGHT",tab:GetParent(),"TOPRIGHT",0,-6)
else
cfeb:SetPoint("TOPLEFT",tab:GetParent(),"BOTTOMLEFT",0,6)
cfeb:SetPoint("TOPRIGHT",tab:GetParent(),"BOTTOMRIGHT",0,6)
end
attached=id
cfeb:SetFocus()
else
if tab.name and tab.name~=""then
local editBox=ChatEdit_ChooseBoxForSend()
local lastTell,lastTellType=ChatEdit_GetLastTellTarget();
if lastTell then
editBox:SetAttribute("chatType",lastTellType)
editBox:SetAttribute("tellTarget",tab.name)
ChatEdit_UpdateHeader(editBox)
if editBox~=ChatEdit_GetActiveWindow()then
ChatFrame_OpenChat("")
end
end
end
end
end
local function ToggleEditBox(id,hidediff)
if not db.noattach and(attached==id or(attached and hidediff))then
ChatEdit_DeactivateChat(cfeb)
elseif not hidediff and id then
AttachEditBox(id)
end
end
GetWindow=function(name,isSpecial,showmore,battleTag)
local id=usedtabs[name]
if(not id or not tabs[id]or not tabs[id]:IsShown())and not isSpecial then
local t
for _,tab in ipairs(tabs)do
if not tab:IsShown()then
t=tab
break
end
end
t=t or a:CreateWindow()
if t then
t.name=name
t.lastspecial=nil
t.tag=nil
t.msg:Clear()
t.msg:ScrollToBottom()
local history=svar[battleTag or name]
if history then
local n=#history
local numlines=(showmore and 50)or 15
if n>numlines then
t.msg:AddMessage("**See ..\\WTF \\Account \\<Account Name> \\<Server> \\<Character> \\SavedVariables \\Cellular.lua for more**",1,1,0)
end
for i=max(1,n-numlines),n,1 do
t.msg:AddMessage(history[i],0.6,0.6,0.6)
end
if not a.memchecked and(not db.memcheck or db.memcheck+21600<time())then
db.memcheck=time()
UpdateAddOnMemoryUsage()
local mem=GetAddOnMemoryUsage("Cellular")
if mem and mem>490 then
t.msg:AddMessage(format("History usage is high ( +%d KB ). Consider cleaning it.",mem-85),0.7,0.5,0.5)
end
end
a.memchecked=true
end
id=t.id
usedtabs[name]=id
tinsert(taborder,id)
t:GetParent():Show()
t:Show()
t.mininew=0
t.text:SetText(t.name)
t.msg:Show()
t:EnableMouse(db.enabletabs)
UpdateTabOrder(currenttab or taborder[1])
if id and(db.autominalways or(db.automin and InCombatLockdown()))and(not db.enabletabs or#taborder==1)then
MinimizeWindow(t:GetParent().Minimize)
end
end
end
return id
end
do
local ChatEdit_SetLastTellTarget,GetTime=ChatEdit_SetLastTellTarget,GetTime
local function HandleHistory(name,dname,text,battleTag)
recentw[name]=true
if not db.history then return end
local t=svar[battleTag or name]
if not t then
svar[battleTag or name]={}
t=svar[battleTag or name]
end
t[#t+1]=format("<%s>[%s] %s",date("%m-%d-%y %H:%M"),dname,text)
if eb and eb:IsShown()and eb.name==name then
eb.max=#t
end
end
local function HandleWindow(name,special,text,battleTag)
if not name then return end
local id=GetWindow(name,special,nil,battleTag)
if not id then
if not special then
print(format("|cff88ff88Cellular|r: Max windows reached - [%s] %s",name,text))
end
return
end
lastwindow=id
return tabs[id]
end
local function addmsg(fmsg,out,form,...)
local c=(out and db.outcolor)or db.incolor
fmsg:AddMessage(format(form,...),c[1],c[2],c[3],c[4])
end
local lastTell=0
function a:IncomingMessage(name,text,status,special,cid,guid,isbn)
local battleTag,presenceName,_,toonName
name=gsub(name,"-"..realmName,"")
if isbn then
_,presenceName,battleTag,_,toonName=C_BattleNet.GetAccountInfoByID(isbn)
end
local f=HandleWindow(name,special,text,battleTag)
if not f then return end
local ctime=GetTime()
if special then
if special==1 then
f.msg:AddMessage(format("[%s] %s",date("%H:%M:%S"),text),1,1,0)
else
if not f.lastspecial or ctime>f.lastspecial+90 or f.tag~=special then
f.lastspecial=ctime
f.tag=special
f.msg:AddMessage(format("[%s] %s",date("%H:%M:%S"),text),1,0,0)
end
end
return
end
status,cid=status or"",cid or""
if status~=""then
status=((status=="GM"or status=="DEV")and" |TInterface\\ChatFrame\\UI-ChatIcon-Blizz.blp:0:2:0:-3|t")or format(" (%s)",status)
end
local tname=gsub(name,"-(.+)","")
if isbn then
if db.showname and db.showtime then
addmsg(f.msg,nil,"|HBNplayer:%s:%s:%s:BN_WHISPER:%s|h[%s %s|h%s] %s",name,isbn,cid,name,gsub(date("%I:%M:%S"),"^0",""),tname,status,text)
elseif db.showtime then
addmsg(f.msg,nil,"|HBNplayer:%s:%s:%s:BN_WHISPER:%s|h[%s|h%s] %s",name,isbn,cid,name,gsub(date("%I:%M:%S"),"^0",""),status,text)
elseif db.showname then
addmsg(f.msg,nil,"|HBNplayer:%s:%s:%s:BN_WHISPER:%s|h[%s|h%s] %s",name,isbn,cid,name,tname,status,text)
else
addmsg(f.msg,nil,"|HBNplayer:%s:%s:%s:BN_WHISPER:%s|h[>|h%s] %s",name,isbn,cid,name,status,text)
end
else
if db.showname and db.showtime then
addmsg(f.msg,nil,"|Hplayer:%s:%s:WHISPER:%s|h[%s %s|h%s] %s",name,cid,strupper(name),gsub(date("%I:%M:%S"),"^0",""),tname,status,text)
elseif db.showtime then
addmsg(f.msg,nil,"|Hplayer:%s:%s:WHISPER:%s|h[%s|h%s] %s",name,cid,strupper(name),gsub(date("%I:%M:%S"),"^0",""),status,text)
elseif db.showname then
addmsg(f.msg,nil,"|Hplayer:%s:%s:WHISPER:%s|h[%s|h%s] %s",name,cid,strupper(name),tname,status,text)
else
addmsg(f.msg,nil,"|Hplayer:%s:%s:WHISPER:%s|h[>|h%s] %s",name,cid,strupper(name),status,text)
end
end
local r,g,b
if ChatTypeInfo.WHISPER and ChatTypeInfo.WHISPER.colorNameByClass and guid and guid~=""then
local _,englishClass,_,_,_=GetPlayerInfoByGUID(guid)
local cc=englishClass and(CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[englishClass]
r,g,b=cc and cc.r or 1,cc and cc.g or 1,cc and cc.b or 1
f.text.r,f.text.g,f.text.b=r,g,b
else
f.text.r,f.text.g,f.text.b=nil,nil,nil
end
if not f.msg:IsVisible()then
f.mininew=f.mininew+1
r,g,b=0.8,0,0
f.text:SetFormattedText("%s (%d)",f.name,f.mininew)
end
f.text:SetTextColor(r or 1,g or 1,b or 1,1)
ChatEdit_SetLastTellTarget(name,isbn and"BN_WHISPER"or"WHISPER")
HandleHistory(name,tname,text,battleTag)
if ctime>lastTell+2 then
if a.pratloaded and Prat.Addon:GetModule("Sounds",true)then
a.PLAYERLINK=name
Prat.Addon:GetModule("Sounds",true):Prat_PostAddMessage(nil,a,nil,"CHAT_MSG_WHISPER")
elseif ChatSounds_InitConfig then
ChatSounds_PlaySound(ChatSounds_Config[ChatSounds_Player].Incoming["WHISPER"])
elseif not ChatSoundsDB then
end
lastTell=ctime
end
end
function a:OutgoingMessage(name,text,isbn)
local battleTag,presenceName,_,toonName
name=gsub(name,"-"..realmName,"")
if isbn then
_,presenceName,battleTag,_,toonName=C_BattleNet.GetAccountInfoByID(isbn)
end
local f=HandleWindow(name,nil,text,battleTag)
if not f then return end
if db.showname and db.showtime then
addmsg(f.msg,true,"[%s %s] %s",gsub(date("%I:%M:%S"),"^0",""),you,text)
elseif db.showtime then
addmsg(f.msg,true,"[%s] %s",gsub(date("%I:%M:%S"),"^0",""),text)
elseif db.showname then
addmsg(f.msg,true,"[%s] %s",you,text)
else
addmsg(f.msg,true,"[<] %s",text)
end
HandleHistory(name,you,text,battleTag)
if a.pratloaded and Prat.Addon:GetModule("Sounds",true)then
a.PLAYERLINK=you
Prat.Addon:GetModule("Sounds",true):Prat_PostAddMessage(nil,a,nil,"CHAT_MSG_WHISPER_INFORM")
elseif ChatSounds_InitConfig then
ChatSounds_PlaySound(ChatSounds_Config[ChatSounds_Player].Outgoing["WHISPER"])
end
end
end
local buttons
local function ApplyFont(t,font,fontsize,fontstyle)
if fontstyle=="Shadow"then
t:SetFont(smed:Fetch("font",font),fontsize)
t:SetShadowColor(0,0,0,0.7)
t:SetShadowOffset(1,-1)
else
t:SetFont(smed:Fetch("font",font),fontsize,fontstyle~="None"and fontstyle)
t:SetShadowOffset(0,0)
end
end
do
local function Who(this)
C_FriendList.SendWho(tabs[this:GetParent().tab].name)
end
local function Busy(this)
local bm=db.busymessage
if bm and bm~=""then
SendChatMessage(bm,"WHISPER",nil,tabs[this:GetParent().tab].name)
end
end
local function Social(this)
if not IsShiftKeyDown()then return end
local b,n=this.text,tabs[this:GetParent().tab].name
if b==_G.CHAT_INVITE_SEND then
InviteUnit(n)
elseif b==_G.ADD_FRIEND then
AddFriend(n)
elseif b==_G.IGNORE_PLAYER then
AddIgnore(n)
end
end
local function Scroll(this)
local f=tabs[this:GetParent().tab].msg
f[this.text](f)
end
MinimizeWindow=function(this)
local p=this:GetParent()
local t=tabs[p.tab]
if not p.mini then
p.mini=1
p:SetHeight(28)
for b,k in pairs(buttons)do
if not k.dontmin then
p[b]:Hide()
end
end
p.resizer:Hide()
p.mininew=0
t.msg:Hide()
else
p.mini=nil
p:SetHeight(db.height)
for b,k in pairs(buttons)do
if db.showside or not k.side then
p[b]:Show()
end
end
p.resizer:Show()
t.mininew=0
t.text:SetText(t.name)
t.text:SetTextColor(t.text.r or 1,t.text.g or 1,t.text.b or 1,1)
t.msg:Show()
end
if eb and eb:IsShown()then eb:Hide()end
end
CloseWindow=function(this)
local p=this:GetParent()
if p.mini then MinimizeWindow(p.Minimize)end
if attached==p.tab then ChatEdit_DeactivateChat(cfeb)end
if eb and eb:IsShown()then eb:Hide()end
if db.enabletabs then
for i=1,#taborder,1 do
RemoveTab("a",p.tab)
end
currenttab=1
else
RemoveTab(p.tab)
end
p:Hide()
end
local EButtonClick
local function CreateEButton(texture,left,close)
local f=CreateFrame("Button",nil,eb)
f:SetWidth(16)
f:SetHeight(16)
f:SetNormalTexture(texture)
f:SetHighlightTexture("Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight")
EButtonClick=EButtonClick or function(this)
local p=this:GetParent()
p.i=(this.back and max(p.i-1,1))or min(p.max,p.i+1)
p:SetText(svar[p.name][p.i])
p:HighlightText()
p:SetFocus()
end
f:SetScript("OnClick",(not close and EButtonClick)or function(this)this:GetParent():Hide()end)
f:SetPoint("BOTTOMLEFT",left,"BOTTOMRIGHT",-1,0)
return f
end
local function Copy(this)
local p=this:GetParent()
local t=tabs[p.tab]
local h=svar[t.name]
if not h or not h[1]then return end
if not eb then
eb=CreateFrame("EditBox","CellularEB",UIParent)
ApplyFont(eb,db.fontmsg,db.fontsize,db.fontmsgstyle)
eb:SetMaxLetters(600)
eb.back=CreateEButton("Interface\\Buttons\\UI-SpellbookIcon-PrevPage-Up",eb)
eb.forward=CreateEButton("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Up",eb.back)
eb.close=CreateEButton("Interface\\Buttons\\UI-Panel-MinimizeButton-Up",eb.forward,true)
eb.back.back=true
eb:Hide()
eb:SetHeight(16)
eb:SetScript("OnEscapePressed",function(this)this:Hide()this:ClearFocus()end)
eb:SetScript("OnEditFocusLost",function(this)this:Hide()end)
end
if eb:IsShown()and eb.name==t.name then
eb:Hide()
else
eb.name=t.name
eb.max=#h
eb.i=eb.max
eb:SetText(h[eb.i])
eb:ClearAllPoints()
if db.showtop then
eb:SetPoint("LEFT",p,"BOTTOMLEFT",-4,-5)
eb:SetPoint("RIGHT",p,"BOTTOMRIGHT",-40,-5)
else
eb:SetPoint("LEFT",p,"TOPLEFT",-4,5)
eb:SetPoint("RIGHT",p,"TOPRIGHT",-40,5)
end
eb:Show()
eb:HighlightText()
eb:SetFocus()
end
end
buttons={
[_G.WHO]={p="TOPLEFT",x=6,y=-22,tt=1,path="Interface\\Icons\\INV_Misc_QuestionMark",func=Who,side=true,},
["\"I'm Busy!\""]={p="TOPLEFT",x=6,y=-42,tt=1,path="Interface\\Icons\\Spell_Holy_Silence",func=Busy,side=true,},
[_G.CHAT_INVITE_SEND]={p="TOPLEFT",x=6,y=-59,tt=2,path="Interface\\Icons\\Spell_Holy_PrayerofSpirit",func=Social,side=true,},
[_G.ADD_FRIEND]={p="TOPLEFT",x=6,y=-76,tt=2,path="Interface\\Icons\\Spell_ChargePositive",func=Social,side=true,},
[_G.IGNORE_PLAYER]={p="TOPLEFT",x=6,y=-95,tt=2,path="Interface\\Icons\\Spell_ChargeNegative",func=Social,side=true,},
[_G.CALENDAR_COPY_EVENT]={p="BOTTOMLEFT",x=6,y=6,tt=3,path="Interface\\Icons\\INV_Scroll_01",func=Copy,side=true,},
ScrollUp={p="BOTTOMRIGHT",x=-6,y=42,path="Interface\\ChatFrame\\UI-ChatIcon-ScrollUp-Up",func=Scroll,},
ScrollDown={p="BOTTOMRIGHT",x=-6,y=26,path="Interface\\ChatFrame\\UI-ChatIcon-ScrollDown-Up",func=Scroll,},
ScrollToBottom={p="BOTTOMRIGHT",x=-6,y=10,path="Interface\\ChatFrame\\UI-ChatIcon-ScrollEnd-Up",func=Scroll,},
[_G.CLOSE]={p="TOPRIGHT",x=-6,y=-6,tt=1,tpl="UIPanelButtonTemplate",func=CloseWindow,bt="x",dontmin=true,},
Minimize={p="TOPRIGHT",x=-22,y=-6,tt=1,tpl="UIPanelButtonTemplate",func=MinimizeWindow,bt="-",dontmin=true,},
}
end
local bdt={tileSize=16,edgeSize=16,insets={left=4,right=4,top=4,bottom=4,},}
local bdt2={bgFile="Interface\\Tooltips\\UI-Tooltip-Background",tile=true,tileSize=16,}
local function UpdateBaseVars(f)
bdt.bgFile=smed:Fetch(db.bglist or"statusbar",db.bg)
bdt.tile=(db.bg=="Tooltip")
bdt.edgeFile=smed:Fetch("border",db.border)
f:SetBackdrop(bdt)
f:SetBackdropColor(unpack(db.bgcolor))
f:SetBackdropBorderColor(unpack(db.bordercolor))
if db.strata then f:SetFrameStrata(db.strata)end
for b,k in pairs(buttons)do
if k.side and db.showside then
f[b]:Show()
elseif k.side then
f[b]:Hide()
end
end
end
local function UpdateTabVars(f)
ApplyFont(f.text,db.fonttitle,12,db.fonttitlestyle)
ApplyFont(f.msg,db.fontmsg,db.fontsize,db.fontmsgstyle)
f.msg:SetFading(db.fade)
f.msg:SetPoint("TOPLEFT",f:GetParent(),"TOPLEFT",db.showside and 24 or 8,-18)
f.msg:SetPoint("BOTTOMRIGHT",f:GetParent(),"BOTTOMRIGHT",-20,8)
end
local function UpdateSizes(reset)
if reset then
db.width,db.height=340,160
end
for _,f in pairs(base)do
f:SetWidth(db.width)
f:SetHeight(db.height)
end
end
local function UpdatePosition(this,reset)
db.pos[this.id]=db.pos[this.id]or{}
local t=db.pos[this.id]
if reset then
this:ClearAllPoints()
this:SetPoint("TOPLEFT",UIParent,"CENTER",(this.id-1)*20+100,-(this.id-1)*20)
t.p,t.rp,t.x,t.y="TOPLEFT","BOTTOMLEFT",this:GetLeft(),this:GetTop()
elseif(this:GetTop()-db.height/2)>(GetScreenHeight()/2)then
t.p,t.rp,t.x,t.y="TOPLEFT","BOTTOMLEFT",this:GetLeft(),this:GetTop()
else
t.p,t.rp,t.x,t.y="BOTTOMLEFT","BOTTOMLEFT",this:GetLeft(),this:GetBottom()
end
this:ClearAllPoints()
this:SetPoint(t.p,UIParent,t.rp,t.x,t.y)
end
do
local gtt=GameTooltip
local function BOnEnter(this)
gtt:SetOwner(this,"ANCHOR_BOTTOMLEFT")
gtt:SetText(this.text,1,1,1)
if this.tt then
if this.tt==2 then
gtt:AddLine(" Shift-click to execute",0,1,0)
elseif not db.history and this.tt==3 then
gtt:AddLine(" History must be enabled",0,1,0)
end
end
gtt:Show()
end
local function GttHide()gtt:Hide()end
local function BDown(this)this:SetAlpha(0.3)end
local function BUp(this)this:SetAlpha(0.6)end
local function ResizeStart(this)
if not IsShiftKeyDown()then
if not a.shiftsaid2 then
print("|cff00ff00Cellular|r: Hold shift and drag to resize.")
a.shiftsaid2=true
end
return
end
this:GetParent():StartSizing("BOTTOMRIGHT")
end
local function ResizeEnd(this)
local p=this:GetParent()
p:StopMovingOrSizing()
db.height,db.width=floor(p:GetHeight()+0.5),floor(p:GetWidth()+0.5)
UpdateSizes()
UpdateTabOrder()
UpdatePosition(p)
end
local function DragStart(this)
if not IsShiftKeyDown()then
if not a.shiftsaid then
print("|cff00ff00Cellular|r: Hold shift and drag to move.")
a.shiftsaid=true
end
return
end
this=this.msg and this:GetParent()or this
this:StartMoving()
end
local function DragStop(this)
this=this.msg and this:GetParent()or this
this:StopMovingOrSizing()
UpdatePosition(this)
end
local function Wheel(this,a1)
if not a1 then return end
local t=tabs[this.tab].msg
if a1>0 then
t:ScrollUp()
t:ScrollUp()
else
t:ScrollDown()
t:ScrollDown()
end
end
local function MainClick(this,a1)
if a1=="RightButton"then
ShowOptions()
else
ToggleEditBox(this.tab)
end
end
local function TabOnClick(this,a1)
if a1=="LeftButton"then
local id=this.id
ToggleEditBox(id,currenttab~=id)
if currenttab~=id then
UpdateTabOrder(id)
end
elseif a1=="RightButton"then
ShowOptions(nil,this.id)
elseif a1=="MiddleButton"then
RemoveTab(this.id)
end
end
local function TabOnEnter(this)
gtt:SetOwner(this,"ANCHOR_TOPLEFT")
gtt:SetText(this.text:GetText(),1,1,1)
gtt:Show()
end
function a:CreateBase(id)
if base[id]then return base[id]end
local f=CreateFrame("Button","CellularWindow"..id,a,BackdropTemplateMixin and "BackdropTemplate")
f:SetWidth(db.width)
f:SetHeight(db.height)
local pos=db.pos[id]
if pos then
f:SetPoint(pos.p or"TOPLEFT",UIParent,pos.rp or"TOPLEFT",pos.x,pos.y)
else
f:SetPoint("TOPLEFT",UIParent,"CENTER",(id-1)*20+100,-(id-1)*20)
end
f.id=id
f:SetMovable(true)
f:SetResizable(true)
f:EnableMouseWheel(true)
f:RegisterForClicks("LeftButtonUp","RightButtonUp")
f:RegisterForDrag("LeftButton")
f:SetScript("OnDragStart",DragStart)
f:SetScript("OnDragStop",DragStop)
f:SetScript("OnClick",MainClick)
f:SetScript("OnMouseWheel",Wheel)
f:SetClampedToScreen(true)
f:SetClampRectInsets(10,-10,-10,10)
f:SetMinResize(120,80)
local resize=CreateFrame("Button",nil,f,"UIPanelButtonGrayTemplate")
resize:SetWidth(8)
resize:SetHeight(8)
resize:SetPoint("BOTTOMRIGHT",f,"BOTTOMRIGHT",-4,4)
resize:SetScript("OnMouseDown",ResizeStart)
resize:SetScript("OnMouseUp",ResizeEnd)
if ChatFrame1ResizeButton then
resize:SetNormalTexture("Interface\\ChatFrame\\UI-ChatIM-SizeGrabber-Up")
resize:SetHighlightTexture("Interface\\ChatFrame\\UI-ChatIM-SizeGrabber-Highlight")
resize:SetWidth(14)
resize:SetHeight(14)
end
f.resizer=resize
for bn,t in pairs(buttons)do
local b=CreateFrame("Button",nil,f,t.tpl)
b:SetWidth(16)
b:SetHeight(16)
b.text=bn
b:SetPoint(t.p,f,t.p,t.x,t.y)
if t.path then
b:SetNormalTexture(t.path)
b:SetHighlightTexture("Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight")
end
b:SetScript("OnMouseDown",BDown)
b:SetScript("OnMouseUp",BUp)
b:SetScript("OnClick",t.func)
if t.tt then
b:SetScript("OnEnter",BOnEnter)
b:SetScript("OnLeave",GttHide)
b.tt=t.tt
end
b:SetText(t.bt)
b:SetAlpha(0.6)
f[bn]=b
end
UpdateBaseVars(f)
UpdatePosition(f)
base[id]=f
return f
end
function a:CreateTab(id,parent)
if tabs[id]then return tabs[id]end
local t=CreateFrame("Button",nil,parent,BackdropTemplateMixin and "BackdropTemplate")
t:SetPoint("TOPLEFT",parent,"TOPLEFT",8,-6)
t:SetPoint("BOTTOMRIGHT",parent,"TOPRIGHT",-8,-20)
t:RegisterForClicks("LeftButtonUp","RightButtonUp","MiddleButtonUp")
t:RegisterForDrag("LeftButton")
t:SetScript("OnClick",TabOnClick)
t:SetScript("OnEnter",TabOnEnter)
t:SetScript("OnLeave",GttHide)
t:SetScript("OnDragStart",DragStart)
t:SetScript("OnDragStop",DragStop)
t:SetBackdrop(bdt2)
t:SetBackdropColor(0,0,0,0)
t.id=id
t.text=t:CreateFontString(nil,"ARTWORK")
t.text:SetJustifyH("LEFT")
t.text:SetJustifyV("TOP")
t.text:SetAllPoints(t)
local m=CreateFrame("ScrollingMessageFrame",nil,t)
m:SetHyperlinksEnabled(true)
m:UnregisterAllEvents()
m:SetJustifyH("LEFT")
m:SetTimeVisible(120)
m:SetMaxLines(100)
m:SetScript("OnHyperlinkClick",ChatFrame_OnHyperlinkShow)
m:SetScript("OnHyperlinkEnter",ChatFrame1:GetScript("OnHyperlinkEnter"))
m:SetScript("OnHyperlinkLeave",GttHide)
m:Hide()
t.msg=m
UpdateTabVars(t)
tabs[id]=t
return t
end
function a:CreateWindow()
if nwin>=db.maxwindows then return end
nwin=nwin+1
if nwin==1 then
a:RegisterEvent("CHAT_MSG_SYSTEM")
a:RegisterEvent("CHAT_MSG_TEXT_EMOTE")
hooksecurefunc("ChatFrame_ReplyTell",function(chatframe)
local lastTell=ChatEdit_GetLastTellTarget()
if not lastTell or lastTell==""then return end
local id=GetWindow(lastTell)
if id then
AttachEditBox(id)
UpdateTabOrder(id)
end
end)
hooksecurefunc("ChatEdit_DeactivateChat",ResetEditBox)
end
if not db.enabletabs or(db.enabletabs and nwin==1)then
local f=a:CreateBase(nwin)
f.tab=nwin
return a:CreateTab(nwin,f)
else
return a:CreateTab(nwin,base[1])
end
end
end
local CellularDD
local info,list={},{}
local offsetvalue,offsetcount,lastb,showid
ShowOptions=function(a1,id)
showid=type(id)=="number"and id
if not CellularDD then
CellularDD=CreateFrame("Frame","CellularDD",Cellular,BackdropTemplateMixin and "BackdropTemplate")
CellularDD.displayMode="MENU"
hooksecurefunc("ToggleDropDownMenu",function(...)lastb=select(8,...)end)
local function UpdateSettings()
Cellular:SetAlpha(db.alpha)
for _,f in pairs(base)do
UpdateBaseVars(f)
end
for _,t in pairs(tabs)do
UpdateTabVars(t)
end
end
local function HideCheck(b)
if b and b.GetName and _G[b:GetName().."Check"]then
_G[b:GetName().."Check"]:Hide()
end
end
local function CloseMenu(b)
if not b or not b:GetParent()then return end
CloseDropDownMenus(b:GetParent():GetID())
end
local function RefreshMenu(b)
local tb=_G[gsub(lastb:GetName(),"ExpandArrow","")]
CloseMenu(b)
ToggleDropDownMenu(b:GetParent():GetID(),tb.value,nil,nil,nil,nil,tb.menuList,tb)
end
local function Exec(b,k,value)
HideCheck(b)
if(k=="less"or k=="more")and lastb then
local off=(k=="less"and-8)or 8
if offsetvalue==value then
offsetcount=offsetcount+off
else
offsetvalue,offsetcount=value,off
end
RefreshMenu(b)
elseif k=="showtab"then
CloseMenu(b)
ToggleEditBox(value,currenttab~=value)
if currenttab~=value then
UpdateTabOrder(value)
end
elseif k=="removetab"then
CloseMenu(b)
RemoveTab(value)
elseif k=="showoptions"then
CloseMenu(b)
ShowOptions()
elseif k=="resetsizes"then
UpdateSizes(true)
for id,f in pairs(base)do
UpdatePosition(f,true)
end
elseif k=="movehelp"then
print("|cff00ff00Cellular|r: Hold shift and drag empty space to move or bottom-right corner to resize windows.")
elseif k=="busymessage"then
StaticPopupDialogs["CellularBusy"]=StaticPopupDialogs["CellularBusy"]or{
text="Set your busy message.",
button1=ACCEPT,button2=CANCEL,
hasEditBox=1,maxLetters=60,editBoxWidth=350,
OnAccept=function(this)
db.busymessage=this.editBox:GetText()or""
end,
EditBoxOnEnterPressed=function(this)
db.busymessage=this:GetParent().editBox:GetText()or""
this:GetParent():Hide()
end,
EditBoxOnEscapePressed=function(this)
this:GetParent():Hide()
end,
OnShow=function(this)
this.editBox:SetText(db.busymessage or"")
this.editBox:SetFocus()
end,
OnHide=function(this)
this.editBox:SetText("")
end,
timeout=0,exclusive=1,whileDead=1,hideOnEscape=1,
}
StaticPopup_Show("CellularBusy")
elseif k=="clearall"and IsShiftKeyDown()then
for name in pairs(svar)do
svar[name]=nil
end
print("|cff00ff00Cellular|r: History cleared.")
elseif k=="clearold"and IsShiftKeyDown()then
local cdays=tonumber(date("%y"))*365.25+tonumber(date("%m"))*30.4+tonumber(date("%d"))
local cleared=0
for name,t in pairs(svar)do
while true do
if#t<1 then
svar[name]=nil
break
end
local m,d,y=strmatch(t[1],"<(%d+)-(%d+)-(%d+) ")
if m and d and y then
local days=tonumber(y)*365.25+tonumber(m)*30.4+tonumber(d)
if days+42<cdays then
cleared=cleared+1
tremove(t,1)
else
break
end
else
break
end
end
end
print("|cff00ff00Cellular|r: "..cleared.." history entries removed.")
end
end
local function Set(b,k)
if not k then return end
db[k]=not db[k]
if k=="enabletabs"then
if nwin<1 then return end
local v=db.enabletabs
for i,tab in pairs(tabs)do
local p=base[(v and 1)or i]or a:CreateBase((v and 1)or i)
tab:GetParent():Hide()
tab:SetParent(p)
tab:EnableMouse(db.enabletabs)
tab.msg:SetPoint("TOPLEFT",p,"TOPLEFT",db.showside and 24 or 8,-18)
tab.msg:SetPoint("BOTTOMRIGHT",p,"BOTTOMRIGHT",-20,8)
if not v then
if not tab:GetParent().mini then
tab.mininew=0
tab.text:SetText(tab.name)
tab.msg:Show()
end
tab:ClearAllPoints()
tab:SetPoint("TOPLEFT",p,"TOPLEFT",8,-6)
tab:SetPoint("BOTTOMRIGHT",p,"TOPRIGHT",-8,-20)
tab:SetBackdropColor(0,0,0,0)
tab.text:SetTextColor(tab.text.r or 1,tab.text.g or 1,tab.text.b or 1,1)
p.tab=tab.id
end
tab:GetParent():Hide()
end
for _,id in pairs(usedtabs)do
tabs[id]:GetParent():Show()
tabs[id]:Show()
end
UpdateTabOrder(lastwindow or taborder[1])
ChatEdit_DeactivateChat(cfeb)
elseif k=="char"or k=="chatshow"or k=="nobn"then
print("|cff00ff00Cellular|r: This setting requires a reload and will effect all characters.")
else
UpdateSettings()
end
end
local function SetSelect(b,a1)
HideCheck(b)
if a1=="show"or a1=="recent"then
GetWindow(b.value,nil,true)
elseif a1=="clear"then
if IsShiftKeyDown()then
svar[b.value]=nil
RefreshMenu(b)
end
else
db[a1]=tonumber(b.value)or b.value
local level,num=strmatch(b:GetName(),"DropDownList(%d+)Button(%d+)")
level,num=tonumber(level)or 0,tonumber(num)or 0
for i=1,UIDROPDOWNMENU_MAXBUTTONS,1 do
local b=_G["DropDownList"..level.."Button"..i.."Check"]
if b then
b[i==num and"Show"or"Hide"](b)
end
end
UpdateSettings()
end
end
local function SetColor(a1)
local dbc=db[UIDROPDOWNMENU_MENU_VALUE]
if not dbc then return end
if a1 then
local pv=ColorPickerFrame.previousValues
dbc[1],dbc[2],dbc[3],dbc[4]=pv.r,pv.g,pv.b,1-pv.opacity
else
dbc[1],dbc[2],dbc[3]=ColorPickerFrame:GetColorRGB()
dbc[4]=1-OpacitySliderFrame:GetValue()
end
UpdateSettings()
end
local function AddButton(lvl,text,keepshown)
info.text=text
info.keepShownOnClick=keepshown
UIDropDownMenu_AddButton(info,lvl)
wipe(info)
end
local function AddToggle(lvl,text,value)
info.arg1=value
info.func=Set
info.checked=db[value]
info.isNotRadio=true
AddButton(lvl,text,1)
end
local function AddExecute(lvl,text,arg1,arg2)
info.arg1=arg1
info.arg2=arg2
info.func=Exec
info.notCheckable=1
AddButton(lvl,text,1)
end
local function AddColor(lvl,text,value)
local dbc=db[value]
if not dbc then return end
info.hasColorSwatch=true
info.hasOpacity=1
info.r,info.g,info.b,info.opacity=dbc[1],dbc[2],dbc[3],1-(dbc[4]or 1)
info.swatchFunc,info.opacityFunc,info.cancelFunc=SetColor,SetColor,SetColor
info.value=value
info.notCheckable=1
info.func=UIDropDownMenuButton_OpenColorPicker
AddButton(lvl,text,nil)
end
local function AddList(lvl,text,value)
info.value=value
info.hasArrow=true
info.func=HideCheck
info.notCheckable=1
AddButton(lvl,text,1)
end
local function AddSelect(lvl,text,arg1,value)
info.arg1=arg1
info.func=SetSelect
info.value=value
if tonumber(value)and tonumber(db[arg1]or"blah")then
if floor(100*tonumber(value))==floor(100*tonumber(db[arg1]))then
info.checked=true
end
else
info.checked=(db[arg1]==value)
end
AddButton(lvl,text,1)
end
local function AddFakeSlider(lvl,value,minv,maxv,step,tbl)
local cvalue=0
local dbv=db[value]
if type(dbv)=="string"and tbl then
for i,v in ipairs(tbl)do
if dbv==v then
cvalue=i
break
end
end
else
cvalue=dbv or floor((maxv-minv)/2)
end
local adj=(offsetvalue==value and offsetcount)or 0
local starti=max(minv,cvalue-(7-adj)*step)
local endi=min(maxv,cvalue+(8+adj)*step)
if starti==minv then
endi=min(maxv,starti+16*step)
elseif endi==maxv then
starti=max(minv,endi-16*step)
end
if starti>minv then
AddExecute(lvl,"--","less",value)
end
if tbl then
for i=starti,endi,step do
AddSelect(lvl,tbl[i],value,tbl[i])
end
else
local fstring=(step>=1 and"%d")or(step>=0.1 and"%.1f")or"%.2f"
for i=starti,endi,step do
AddSelect(lvl,format(fstring,i),value,i)
end
end
if endi<maxv then
AddExecute(lvl,"++","more",value)
end
end
CellularDD.initialize=function(self,lvl)
if lvl==1 then
if showid then
AddExecute(lvl,"Show Message (or left-click)","showtab",showid)
AddExecute(lvl,"Close Tab (or middle-click)","removetab",showid)
info.isTitle=true
AddButton(lvl," ")
AddExecute(lvl,"Options","showoptions")
else
info.isTitle=true
info.notCheckable=1
AddButton(lvl,"|cff5555ffCellular|r")
AddList(lvl,"Frame","frame")
AddList(lvl,"Text","text")
AddList(lvl,"Behavior","behave")
AddList(lvl,"History","history")
end
elseif lvl==2 then
local sub=UIDROPDOWNMENU_MENU_VALUE
if sub=="frame"then
AddList(lvl,"Texture Group","bglist")
AddList(lvl,"Background Texture","bg")
AddColor(lvl,"Background Color","bgcolor")
AddList(lvl,"Border","border")
AddColor(lvl,"Border Color","bordercolor")
AddToggle(lvl,"Show Side Buttons","showside")
AddList(lvl,"Frame Opacity","alpha")
AddList(lvl,"Frame Strata","strata")
AddExecute(lvl,"Reset Size and Position","resetsizes")
AddExecute(lvl,"How to Move/Resize","movehelp")
elseif sub=="text"then
AddToggle(lvl,"Show Name","showname")
AddToggle(lvl,"Show Timestamp","showtime")
AddToggle(lvl,"Fade Old Messages","fade")
AddList(lvl,"Title Font","fonttitle")
AddList(lvl,"Title Style","fonttitlestyle")
AddList(lvl,"Message Font","fontmsg")
AddList(lvl,"Message Style","fontmsgstyle")
AddList(lvl,"Message Font Size","fontsize")
AddColor(lvl,"Incoming Font Color","incolor")
AddColor(lvl,"Outgoing Font Color","outcolor")
elseif sub=="behave"then
AddToggle(lvl,"Use Tabs","enabletabs")
AddToggle(lvl,"No battle.net","nobn")
AddToggle(lvl,"Combat Auto-Minimize","automin")
AddToggle(lvl,"Always Auto-Minimize","autominalways")
AddToggle(lvl,"Editbox Top Anchor","showtop")
AddToggle(lvl,"Disable EditBox Move","noattach")
AddToggle(lvl,"Disable Block to Default","chatshow")
AddList(lvl,"Maximum Windows/Tabs","maxwindows")
AddExecute(lvl,"Set Busy Message","busymessage")
AddToggle(lvl,"Save Settings Per Character","char")
elseif sub=="history"then
AddToggle(lvl,"Enable History","history")
AddList(lvl,"Show Recent","recent")
AddList(lvl,"Show Entry","show")
AddList(lvl,"Clear Entry (hold shift)","clear")
AddExecute(lvl,"Clear +6 Weeks (hold shift)","clearold")
AddExecute(lvl,"Clear All (hold shift)","clearall")
end
elseif lvl==3 then
local sub=UIDROPDOWNMENU_MENU_VALUE
if sub=="bglist"then
AddSelect(lvl,"background",sub,"background")
AddSelect(lvl,"statusbar",sub,"statusbar")
elseif sub=="bg"then
local t=smed:List(db.bglist or"statusbar")
AddFakeSlider(lvl,sub,1,#t,1,t)
elseif sub=="fonttitle"or sub=="fontmsg"then
local t=smed:List("font")
AddFakeSlider(lvl,sub,1,#t,1,t)
elseif sub=="border"then
local t=smed:List("border")
AddFakeSlider(lvl,sub,1,#t,1,t)
elseif sub=="fontsize"then
AddFakeSlider(lvl,sub,4,30,1)
elseif sub=="fonttitlestyle"or sub=="fontmsgstyle"then
AddSelect(lvl,"None",sub,"None")
AddSelect(lvl,"Shadow",sub,"Shadow")
AddSelect(lvl,"Outline",sub,"OUTLINE")
AddSelect(lvl,"Thick Outline",sub,"THICKOUTLINE")
AddSelect(lvl,"Monochrome",sub,"MONOCHROME")
elseif sub=="alpha"then
AddFakeSlider(lvl,sub,0,1,0.1)
elseif sub=="strata"then
AddSelect(lvl,"BACKGROUND",sub,"BACKGROUND")
AddSelect(lvl,"LOW",sub,"LOW")
AddSelect(lvl,"MEDIUM",sub,"MEDIUM")
AddSelect(lvl,"HIGH",sub,"HIGH")
AddSelect(lvl,"DIALOG",sub,"DIALOG")
elseif sub=="maxwindows"then
AddFakeSlider(lvl,sub,4,20,1)
elseif sub=="recent"or sub=="show"or sub=="clear"then
wipe(list)
for name in pairs(sub=="recent"and recentw or svar)do
tinsert(list,name)
end
table.sort(list)
AddFakeSlider(lvl,sub,1,#list,1,list)
end
end
end
end
ToggleDropDownMenu(1,nil,CellularDD,"cursor")
end
\ No newline at end of file
trunk/libs/LibSharedMedia-3.0.lua New file
0,0 → 1,205
local MAJOR,MINOR="LibSharedMedia-3.0",8020003
local lib=LibStub:NewLibrary(MAJOR,MINOR)
if not lib then return end
local _G=getfenv(0)
local pairs=_G.pairs
local type=_G.type
local band=_G.bit.band
local table_sort=_G.table.sort
local RESTRICTED_FILE_ACCESS=WOW_PROJECT_ID==WOW_PROJECT_MAINLINE
local locale=GetLocale()
local locale_is_western
local LOCALE_MASK=0
lib.LOCALE_BIT_koKR=1
lib.LOCALE_BIT_ruRU=2
lib.LOCALE_BIT_zhCN=4
lib.LOCALE_BIT_zhTW=8
lib.LOCALE_BIT_western=128
local CallbackHandler=LibStub:GetLibrary("CallbackHandler-1.0")
lib.callbacks=lib.callbacks or CallbackHandler:New(lib)
lib.DefaultMedia=lib.DefaultMedia or{}
lib.MediaList=lib.MediaList or{}
lib.MediaTable=lib.MediaTable or{}
lib.MediaType=lib.MediaType or{}
lib.OverrideMedia=lib.OverrideMedia or{}
local defaultMedia=lib.DefaultMedia
local mediaList=lib.MediaList
local mediaTable=lib.MediaTable
local overrideMedia=lib.OverrideMedia
lib.MediaType.BACKGROUND="background"
lib.MediaType.BORDER="border"
lib.MediaType.FONT="font"
lib.MediaType.STATUSBAR="statusbar"
lib.MediaType.SOUND="sound"
if not lib.MediaTable.background then lib.MediaTable.background={}end
lib.MediaTable.background["None"]=[[]]
lib.MediaTable.background["Blizzard Collections Background"]=[[Interface\Collections\CollectionsBackgroundTile]]
lib.MediaTable.background["Blizzard Dialog Background"]=[[Interface\DialogFrame\UI-DialogBox-Background]]
lib.MediaTable.background["Blizzard Dialog Background Dark"]=[[Interface\DialogFrame\UI-DialogBox-Background-Dark]]
lib.MediaTable.background["Blizzard Dialog Background Gold"]=[[Interface\DialogFrame\UI-DialogBox-Gold-Background]]
lib.MediaTable.background["Blizzard Garrison Background"]=[[Interface\Garrison\GarrisonUIBackground]]
lib.MediaTable.background["Blizzard Garrison Background 2"]=[[Interface\Garrison\GarrisonUIBackground2]]
lib.MediaTable.background["Blizzard Garrison Background 3"]=[[Interface\Garrison\GarrisonMissionUIInfoBoxBackgroundTile]]
lib.MediaTable.background["Blizzard Low Health"]=[[Interface\FullScreenTextures\LowHealth]]
lib.MediaTable.background["Blizzard Marble"]=[[Interface\FrameGeneral\UI-Background-Marble]]
lib.MediaTable.background["Blizzard Out of Control"]=[[Interface\FullScreenTextures\OutOfControl]]
lib.MediaTable.background["Blizzard Parchment"]=[[Interface\AchievementFrame\UI-Achievement-Parchment-Horizontal]]
lib.MediaTable.background["Blizzard Parchment 2"]=[[Interface\AchievementFrame\UI-GuildAchievement-Parchment-Horizontal]]
lib.MediaTable.background["Blizzard Rock"]=[[Interface\FrameGeneral\UI-Background-Rock]]
lib.MediaTable.background["Blizzard Tabard Background"]=[[Interface\TabardFrame\TabardFrameBackground]]
lib.MediaTable.background["Blizzard Tooltip"]=[[Interface\Tooltips\UI-Tooltip-Background]]
lib.MediaTable.background["Solid"]=[[Interface\Buttons\WHITE8X8]]
lib.DefaultMedia.background="None"
if not lib.MediaTable.border then lib.MediaTable.border={}end
lib.MediaTable.border["None"]=[[]]
lib.MediaTable.border["Blizzard Achievement Wood"]=[[Interface\AchievementFrame\UI-Achievement-WoodBorder]]
lib.MediaTable.border["Blizzard Chat Bubble"]=[[Interface\Tooltips\ChatBubble-Backdrop]]
lib.MediaTable.border["Blizzard Dialog"]=[[Interface\DialogFrame\UI-DialogBox-Border]]
lib.MediaTable.border["Blizzard Dialog Gold"]=[[Interface\DialogFrame\UI-DialogBox-Gold-Border]]
lib.MediaTable.border["Blizzard Party"]=[[Interface\CHARACTERFRAME\UI-Party-Border]]
lib.MediaTable.border["Blizzard Tooltip"]=[[Interface\Tooltips\UI-Tooltip-Border]]
lib.DefaultMedia.border="None"
if not lib.MediaTable.font then lib.MediaTable.font={}end
local SML_MT_font=lib.MediaTable.font
if locale=="koKR"then
LOCALE_MASK=lib.LOCALE_BIT_koKR
SML_MT_font["굵은 글꼴"]=[[Fonts\2002B.TTF]]
SML_MT_font["기본 글꼴"]=[[Fonts\2002.TTF]]
SML_MT_font["데미지 글꼴"]=[[Fonts\K_Damage.TTF]]
SML_MT_font["퀘스트 글꼴"]=[[Fonts\K_Pagetext.TTF]]
lib.DefaultMedia["font"]="기본 글꼴"
elseif locale=="zhCN"then
LOCALE_MASK=lib.LOCALE_BIT_zhCN
SML_MT_font["伤害数字"]=[[Fonts\ARKai_C.ttf]]
SML_MT_font["默认"]=[[Fonts\ARKai_T.ttf]]
SML_MT_font["聊天"]=[[Fonts\ARHei.ttf]]
lib.DefaultMedia["font"]="默认"
elseif locale=="zhTW"then
LOCALE_MASK=lib.LOCALE_BIT_zhTW
SML_MT_font["提示訊息"]=[[Fonts\bHEI00M.ttf]]
SML_MT_font["聊天"]=[[Fonts\bHEI01B.ttf]]
SML_MT_font["傷害數字"]=[[Fonts\bKAI00M.ttf]]
SML_MT_font["預設"]=[[Fonts\bLEI00D.ttf]]
lib.DefaultMedia["font"]="預設"
elseif locale=="ruRU"then
LOCALE_MASK=lib.LOCALE_BIT_ruRU
SML_MT_font["2002"]=[[Fonts\2002.TTF]]
SML_MT_font["2002 Bold"]=[[Fonts\2002B.TTF]]
SML_MT_font["AR CrystalzcuheiGBK Demibold"]=[[Fonts\ARHei.TTF]]
SML_MT_font["AR ZhongkaiGBK Medium (Combat)"]=[[Fonts\ARKai_C.TTF]]
SML_MT_font["AR ZhongkaiGBK Medium"]=[[Fonts\ARKai_T.TTF]]
SML_MT_font["Arial Narrow"]=[[Fonts\ARIALN.TTF]]
SML_MT_font["Friz Quadrata TT"]=[[Fonts\FRIZQT___CYR.TTF]]
SML_MT_font["MoK"]=[[Fonts\K_Pagetext.TTF]]
SML_MT_font["Morpheus"]=[[Fonts\MORPHEUS_CYR.TTF]]
SML_MT_font["Nimrod MT"]=[[Fonts\NIM_____.ttf]]
SML_MT_font["Skurri"]=[[Fonts\SKURRI_CYR.TTF]]
lib.DefaultMedia.font="Friz Quadrata TT"
else
LOCALE_MASK=lib.LOCALE_BIT_western
locale_is_western=true
SML_MT_font["2002"]=[[Fonts\2002.TTF]]
SML_MT_font["2002 Bold"]=[[Fonts\2002B.TTF]]
SML_MT_font["AR CrystalzcuheiGBK Demibold"]=[[Fonts\ARHei.TTF]]
SML_MT_font["AR ZhongkaiGBK Medium (Combat)"]=[[Fonts\ARKai_C.TTF]]
SML_MT_font["AR ZhongkaiGBK Medium"]=[[Fonts\ARKai_T.TTF]]
SML_MT_font["Arial Narrow"]=[[Fonts\ARIALN.TTF]]
SML_MT_font["Friz Quadrata TT"]=[[Fonts\FRIZQT__.TTF]]
SML_MT_font["MoK"]=[[Fonts\K_Pagetext.TTF]]
SML_MT_font["Morpheus"]=[[Fonts\MORPHEUS_CYR.TTF]]
SML_MT_font["Nimrod MT"]=[[Fonts\NIM_____.ttf]]
SML_MT_font["Skurri"]=[[Fonts\SKURRI_CYR.TTF]]
lib.DefaultMedia.font="Friz Quadrata TT"
end
if not lib.MediaTable.statusbar then lib.MediaTable.statusbar={}end
lib.MediaTable.statusbar["Blizzard"]=[[Interface\TargetingFrame\UI-StatusBar]]
lib.MediaTable.statusbar["Blizzard Character Skills Bar"]=[[Interface\PaperDollInfoFrame\UI-Character-Skills-Bar]]
lib.MediaTable.statusbar["Blizzard Raid Bar"]=[[Interface\RaidFrame\Raid-Bar-Hp-Fill]]
lib.MediaTable.statusbar["Solid"]=[[Interface\Buttons\WHITE8X8]]
lib.DefaultMedia.statusbar="Blizzard"
if not lib.MediaTable.sound then lib.MediaTable.sound={}end
lib.MediaTable.sound["None"]=RESTRICTED_FILE_ACCESS and 1 or[[Interface\Quiet.ogg]]
lib.DefaultMedia.sound="None"
local function rebuildMediaList(mediatype)
local mtable=mediaTable[mediatype]
if not mtable then return end
if not mediaList[mediatype]then mediaList[mediatype]={}end
local mlist=mediaList[mediatype]
local i=0
for k in pairs(mtable)do
i=i+1
mlist[i]=k
end
table_sort(mlist)
end
function lib:Register(mediatype,key,data,langmask)
if type(mediatype)~="string"then
error(MAJOR..":Register(mediatype, key, data, langmask) - mediatype must be string, got "..type(mediatype))
end
if type(key)~="string"then
error(MAJOR..":Register(mediatype, key, data, langmask) - key must be string, got "..type(key))
end
mediatype=mediatype:lower()
if mediatype==lib.MediaType.FONT and((langmask and band(langmask,LOCALE_MASK)==0)or not(langmask or locale_is_western))then
return false
end
if type(data)=="string"and(mediatype==lib.MediaType.BACKGROUND or mediatype==lib.MediaType.BORDER or mediatype==lib.MediaType.STATUSBAR or mediatype==lib.MediaType.SOUND)then
local path=data:lower()
if RESTRICTED_FILE_ACCESS and not path:find("^interface")then
return false
end
if mediatype==lib.MediaType.SOUND and not(path:find(".ogg",nil,true)or path:find(".mp3",nil,true))then
return false
end
end
if not mediaTable[mediatype]then mediaTable[mediatype]={}end
local mtable=mediaTable[mediatype]
if mtable[key]then return false end
mtable[key]=data
rebuildMediaList(mediatype)
self.callbacks:Fire("LibSharedMedia_Registered",mediatype,key)
return true
end
function lib:Fetch(mediatype,key,noDefault)
local mtt=mediaTable[mediatype]
local overridekey=overrideMedia[mediatype]
local result=mtt and((overridekey and mtt[overridekey]or mtt[key])or(not noDefault and defaultMedia[mediatype]and mtt[defaultMedia[mediatype]]))or nil
return result~=""and result or nil
end
function lib:IsValid(mediatype,key)
return mediaTable[mediatype]and(not key or mediaTable[mediatype][key])and true or false
end
function lib:HashTable(mediatype)
return mediaTable[mediatype]
end
function lib:List(mediatype)
if not mediaTable[mediatype]then
return nil
end
if not mediaList[mediatype]then
rebuildMediaList(mediatype)
end
return mediaList[mediatype]
end
function lib:GetGlobal(mediatype)
return overrideMedia[mediatype]
end
function lib:SetGlobal(mediatype,key)
if not mediaTable[mediatype]then
return false
end
overrideMedia[mediatype]=(key and mediaTable[mediatype][key])and key or nil
self.callbacks:Fire("LibSharedMedia_SetGlobal",mediatype,overrideMedia[mediatype])
return true
end
function lib:GetDefault(mediatype)
return defaultMedia[mediatype]
end
function lib:SetDefault(mediatype,key)
if mediaTable[mediatype]and mediaTable[mediatype][key]and not defaultMedia[mediatype]then
defaultMedia[mediatype]=key
return true
else
return false
end
end
trunk/libs/LibStub.lua New file
0,0 → 1,23
local LIBSTUB_MAJOR,LIBSTUB_MINOR="LibStub",2
local LibStub=_G[LIBSTUB_MAJOR]
if not LibStub or LibStub.minor<LIBSTUB_MINOR then
LibStub=LibStub or{libs={},minors={}}
_G[LIBSTUB_MAJOR]=LibStub
LibStub.minor=LIBSTUB_MINOR
function LibStub:NewLibrary(major,minor)
assert(type(major)=="string","Bad argument #2 to `NewLibrary' (string expected)")
minor=assert(tonumber(strmatch(minor,"%d+")),"Minor version must either be a number or contain a number.")
local oldminor=self.minors[major]
if oldminor and oldminor>=minor then return nil end
self.minors[major],self.libs[major]=minor,self.libs[major]or{}
return self.libs[major],oldminor
end
function LibStub:GetLibrary(major,silent)
if not self.libs[major]and not silent then
error(("Cannot find a library instance of %q."):format(tostring(major)),2)
end
return self.libs[major],self.minors[major]
end
function LibStub:IterateLibraries()return pairs(self.libs)end
setmetatable(LibStub,{__call=LibStub.GetLibrary})
end
trunk/libs/CallbackHandler-1.0.lua New file
0,0 → 1,140
local MAJOR,MINOR="CallbackHandler-1.0",7
local CallbackHandler=LibStub:NewLibrary(MAJOR,MINOR)
if not CallbackHandler then return end
local meta={__index=function(tbl,key)tbl[key]={}return tbl[key]end}
local tconcat=table.concat
local assert,error,loadstring=assert,error,loadstring
local setmetatable,rawset,rawget=setmetatable,rawset,rawget
local next,select,pairs,type,tostring=next,select,pairs,type,tostring
local xpcall=xpcall
local function errorhandler(err)
return geterrorhandler()(err)
end
local function Dispatch(handlers,...)
local index,method=next(handlers)
if not method then return end
repeat
xpcall(method,errorhandler,...)
index,method=next(handlers,index)
until not method
end
function CallbackHandler:New(target,RegisterName,UnregisterName,UnregisterAllName)
RegisterName=RegisterName or"RegisterCallback"
UnregisterName=UnregisterName or"UnregisterCallback"
if UnregisterAllName==nil then
UnregisterAllName="UnregisterAllCallbacks"
end
local events=setmetatable({},meta)
local registry={recurse=0,events=events}
function registry:Fire(eventname,...)
if not rawget(events,eventname)or not next(events[eventname])then return end
local oldrecurse=registry.recurse
registry.recurse=oldrecurse+1
Dispatch(events[eventname],eventname,...)
registry.recurse=oldrecurse
if registry.insertQueue and oldrecurse==0 then
for eventname,callbacks in pairs(registry.insertQueue)do
local first=not rawget(events,eventname)or not next(events[eventname])
for self,func in pairs(callbacks)do
events[eventname][self]=func
if first and registry.OnUsed then
registry.OnUsed(registry,target,eventname)
first=nil
end
end
end
registry.insertQueue=nil
end
end
target[RegisterName]=function(self,eventname,method,...)
if type(eventname)~="string"then
error("Usage: "..RegisterName.."(eventname, method[, arg]): 'eventname' - string expected.",2)
end
method=method or eventname
local first=not rawget(events,eventname)or not next(events[eventname])
if type(method)~="string"and type(method)~="function"then
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - string or function expected.",2)
end
local regfunc
if type(method)=="string"then
if type(self)~="table"then
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): self was not a table?",2)
elseif self==target then
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): do not use Library:"..RegisterName.."(), use your own 'self'",2)
elseif type(self[method])~="function"then
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - method '"..tostring(method).."' not found on self.",2)
end
if select("#",...)>=1 then
local arg=select(1,...)
regfunc=function(...)self[method](self,arg,...)end
else
regfunc=function(...)self[method](self,...)end
end
else
if type(self)~="table"and type(self)~="string"and type(self)~="thread"then
error("Usage: "..RegisterName.."(self or \"addonId\", eventname, method): 'self or addonId': table or string or thread expected.",2)
end
if select("#",...)>=1 then
local arg=select(1,...)
regfunc=function(...)method(arg,...)end
else
regfunc=method
end
end
if events[eventname][self]or registry.recurse<1 then
events[eventname][self]=regfunc
if registry.OnUsed and first then
registry.OnUsed(registry,target,eventname)
end
else
registry.insertQueue=registry.insertQueue or setmetatable({},meta)
registry.insertQueue[eventname][self]=regfunc
end
end
target[UnregisterName]=function(self,eventname)
if not self or self==target then
error("Usage: "..UnregisterName.."(eventname): bad 'self'",2)
end
if type(eventname)~="string"then
error("Usage: "..UnregisterName.."(eventname): 'eventname' - string expected.",2)
end
if rawget(events,eventname)and events[eventname][self]then
events[eventname][self]=nil
if registry.OnUnused and not next(events[eventname])then
registry.OnUnused(registry,target,eventname)
end
end
if registry.insertQueue and rawget(registry.insertQueue,eventname)and registry.insertQueue[eventname][self]then
registry.insertQueue[eventname][self]=nil
end
end
if UnregisterAllName then
target[UnregisterAllName]=function(...)
if select("#",...)<1 then
error("Usage: "..UnregisterAllName.."([whatFor]): missing 'self' or \"addonId\" to unregister events for.",2)
end
if select("#",...)==1 and...==target then
error("Usage: "..UnregisterAllName.."([whatFor]): supply a meaningful 'self' or \"addonId\"",2)
end
for i=1,select("#",...)do
local self=select(i,...)
if registry.insertQueue then
for eventname,callbacks in pairs(registry.insertQueue)do
if callbacks[self]then
callbacks[self]=nil
end
end
end
for eventname,callbacks in pairs(events)do
if callbacks[self]then
callbacks[self]=nil
if registry.OnUnused and not next(callbacks)then
registry.OnUnused(registry,target,eventname)
end
end
end
end
end
end
return registry
end