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 |