KkthnxUI

KkthnxUI

244k Downloads

error

evilintent opened this issue ยท 0 comments

commented

local addonName, addon = ...
if not addon.healthCheck then return end
local L = addon.L

-- The sack
local window = nil

-- What state is the sack in?
local state = "BugSackTabAll"
local searchResults = {}
local searchThrough = nil

-- Frame state variables
local currentErrorIndex = nil -- Index of the error in the currentSackContents currently shown
local currentSackContents = nil -- List of all the errors currently navigated in the sack
local currentSackSession = nil -- Current session ID available in the sack
local currentErrorObject = nil

local tabs = nil

local countLabel, sessionLabel, textArea = nil, nil, nil
local nextButton, prevButton, sendButton = nil, nil, nil
local searchLabel, searchBox = nil, nil

local sessionFormat = "%s - |cffff4411%s|r - |cff44ff44%d|r" -- - -
local countFormat = "%d/%d" -- 1/10
local sourceFormat = L["Sent by %s (%s)"]
local localFormat = L["Local (%s)"]

-- Updates the total bug count and so forth.
local lastState = nil
local function updateSackDisplay(forceRefresh)
if state ~= lastState then forceRefresh = true end
lastState = state

if forceRefresh then
	currentErrorObject = nil
	currentErrorIndex = nil
else
	currentErrorObject = currentSackContents and currentSackContents[currentErrorIndex]
end

if state == "BugSackTabAll" then
	currentSackContents = addon:GetErrors()
	currentSackSession = BugGrabber:GetSessionId()
elseif state == "BugSackTabSession" then
	local s = BugGrabber:GetSessionId()
	currentSackContents = addon:GetErrors(s)
	currentSackSession = s
elseif state == "BugSackTabLast" then
	local s = BugGrabber:GetSessionId() - 1
	currentSackContents = addon:GetErrors(s)
	currentSackSession = s
elseif state == "BugSackSearch" then
	currentSackSession = -1
	currentSackContents = searchResults
end

local size = #currentSackContents
local eo = nil

if forceRefresh then
	-- We need to reset the currently shown error to the highest index
	eo = currentSackContents[size]
	currentErrorIndex = size
else
	-- we need to adapt the currentErrorIndex index to the new error list
	for i, v in next, currentSackContents do
		if v == currentErrorObject then
			currentErrorIndex = i
			eo = v
			break
		end
	end
end
if not eo then eo = currentSackContents[currentErrorIndex] end
if not eo then eo = currentSackContents[size] end
if currentSackSession == -1 and eo then currentSackSession = eo.session end

if size > 0 then
	local source = nil
	if eo.source then source = sourceFormat:format(eo.source, "error")
	else source = localFormat:format("error") end
	if eo.session == BugGrabber:GetSessionId() then
		sessionLabel:SetText(sessionFormat:format(L["Today"], source, eo.session))
	else
		sessionLabel:SetText(sessionFormat:format(eo.time, source, eo.session))
	end
	countLabel:SetText(countFormat:format(currentErrorIndex, size))
	textArea:SetText(addon:FormatError(eo))

	if currentErrorIndex >= size then
		nextButton:Disable()
	else
		nextButton:Enable()
	end
	if currentErrorIndex <= 1 then
		prevButton:Disable()
	else
		prevButton:Enable()
	end
	if sendButton then sendButton:Enable() end
else
	countLabel:SetText()
	if currentSackSession == BugGrabber:GetSessionId() then
		sessionLabel:SetText(("%s (%d)"):format(L["Today"], BugGrabber:GetSessionId()))
	else
		sessionLabel:SetText(("%d"):format(currentSackSession))
	end
	textArea:SetText(L["You have no bugs, yay!"])
	nextButton:Disable()
	prevButton:Disable()
	if sendButton then sendButton:Disable() end
end

for i, t in next, tabs do
	if state == t:GetName() then
		PanelTemplates_SelectTab(t)
	else
		PanelTemplates_DeselectTab(t)
	end
end

end
hooksecurefunc(addon, "UpdateDisplay", function()
if not window or not window:IsShown() then return end
-- can't just hook it right in because it would pass |self| as forceRefresh
updateSackDisplay(true)
end)

-- Only invoked when actually clicking a tab
local function setActiveMethod(tab)
searchLabel:Hide()
searchBox:Hide()
sessionLabel:Show()
wipe(searchResults)
--[[if searchThrough then
wipe(searchThrough)
searchThrough = nil
end]]

state = type(tab) == "table" and tab:GetName() or tab
updateSackDisplay(true)

end

local function clearSearch()
setActiveMethod("BugSackTabAll")
end

local function filterSack(editbox)
for i, t in next, tabs do
PanelTemplates_DeselectTab(t)
end
wipe(searchResults)

local text = editbox:GetText()
-- If there's no text in the box, we reset to all bugs so the search can start over
if not searchThrough or not text or text:trim():len() == 0 then
	state = "BugSackTabAll"
else
	for i, err in next, searchThrough do
		if err.message and err.message:find(text) then
			searchResults[#searchResults + 1] = err
		elseif err.stack and err.stack:find(text) then
			searchResults[#searchResults + 1] = err
		elseif err.locals and err.locals:find(text) then
			searchResults[#searchResults + 1] = err
		end
	end
	state = "BugSackSearch"
end
updateSackDisplay(true)

end

local function createBugSack()
window = CreateFrame("Frame", "BugSackFrame", UIParent)
window:Hide()

window:SetFrameStrata("DIALOG")
window:SetWidth(500)
window:SetHeight(310)
window:SetPoint("CENTER")
window:SetMovable(true)
window:EnableMouse(true)
window:RegisterForDrag("LeftButton")
window:SetScript("OnDragStart", window.StartMoving)
window:SetScript("OnDragStop", window.StopMovingOrSizing)
window:SetScript("OnShow", function()
	PlaySound(844) -- SOUNDKIT.IG_QUEST_LOG_OPEN
end)
window:SetScript("OnHide", function()
	currentErrorObject = nil
	currentSackSession = nil
	currentSackContents = nil
	PlaySound(845) -- SOUNDKIT.IG_QUEST_LOG_CLOSE
end)

local titlebg = window:CreateTexture(nil, "BORDER")
titlebg:SetTexture(251966) --"Interface\\PaperDollInfoFrame\\UI-GearManager-Title-Background"
titlebg:SetPoint("TOPLEFT", 9, -6)
titlebg:SetPoint("BOTTOMRIGHT", window, "TOPRIGHT", -28, -24)

local dialogbg = window:CreateTexture(nil, "BACKGROUND")
dialogbg:SetTexture(136548) --"Interface\\PaperDollInfoFrame\\UI-Character-CharacterTab-L1"
dialogbg:SetPoint("TOPLEFT", 8, -12)
dialogbg:SetPoint("BOTTOMRIGHT", -6, 8)
dialogbg:SetTexCoord(0.255, 1, 0.29, 1)

local topleft = window:CreateTexture(nil, "BORDER")
topleft:SetTexture(251963) --"Interface\\PaperDollInfoFrame\\UI-GearManager-Border"
topleft:SetWidth(64)
topleft:SetHeight(64)
topleft:SetPoint("TOPLEFT")
topleft:SetTexCoord(0.501953125, 0.625, 0, 1)

local topright = window:CreateTexture(nil, "BORDER")
topright:SetTexture(251963) --"Interface\\PaperDollInfoFrame\\UI-GearManager-Border"
topright:SetWidth(64)
topright:SetHeight(64)
topright:SetPoint("TOPRIGHT")
topright:SetTexCoord(0.625, 0.75, 0, 1)

local top = window:CreateTexture(nil, "BORDER")
top:SetTexture(251963) --"Interface\\PaperDollInfoFrame\\UI-GearManager-Border"
top:SetHeight(64)
top:SetPoint("TOPLEFT", topleft, "TOPRIGHT")
top:SetPoint("TOPRIGHT", topright, "TOPLEFT")
top:SetTexCoord(0.25, 0.369140625, 0, 1)

local bottomleft = window:CreateTexture(nil, "BORDER")
bottomleft:SetTexture(251963) --"Interface\\PaperDollInfoFrame\\UI-GearManager-Border"
bottomleft:SetWidth(64)
bottomleft:SetHeight(64)
bottomleft:SetPoint("BOTTOMLEFT")
bottomleft:SetTexCoord(0.751953125, 0.875, 0, 1)

local bottomright = window:CreateTexture(nil, "BORDER")
bottomright:SetTexture(251963) --"Interface\\PaperDollInfoFrame\\UI-GearManager-Border"
bottomright:SetWidth(64)
bottomright:SetHeight(64)
bottomright:SetPoint("BOTTOMRIGHT")
bottomright:SetTexCoord(0.875, 1, 0, 1)

local bottom = window:CreateTexture(nil, "BORDER")
bottom:SetTexture(251963) --"Interface\\PaperDollInfoFrame\\UI-GearManager-Border"
bottom:SetHeight(64)
bottom:SetPoint("BOTTOMLEFT", bottomleft, "BOTTOMRIGHT")
bottom:SetPoint("BOTTOMRIGHT", bottomright, "BOTTOMLEFT")
bottom:SetTexCoord(0.376953125, 0.498046875, 0, 1)

local left = window:CreateTexture(nil, "BORDER")
left:SetTexture(251963) --"Interface\\PaperDollInfoFrame\\UI-GearManager-Border"
left:SetWidth(64)
left:SetPoint("TOPLEFT", topleft, "BOTTOMLEFT")
left:SetPoint("BOTTOMLEFT", bottomleft, "TOPLEFT")
left:SetTexCoord(0.001953125, 0.125, 0, 1)

local right = window:CreateTexture(nil, "BORDER")
right:SetTexture(251963) --"Interface\\PaperDollInfoFrame\\UI-GearManager-Border"
right:SetWidth(64)
right:SetPoint("TOPRIGHT", topright, "BOTTOMRIGHT")
right:SetPoint("BOTTOMRIGHT", bottomright, "TOPRIGHT")
right:SetTexCoord(0.1171875, 0.2421875, 0, 1)

local close = CreateFrame("Button", nil, window, "UIPanelCloseButton")
close:SetPoint("TOPRIGHT", 2, 1)
close:SetScript("OnClick", addon.CloseSack)

countLabel = window:CreateFontString(nil, "ARTWORK", "GameFontNormal")
countLabel:SetPoint("TOPRIGHT", titlebg, -6, -3)
countLabel:SetJustifyH("RIGHT")
countLabel:SetTextColor(1, 1, 1, 1)

sessionLabel = CreateFrame("Button", nil, window)
sessionLabel:SetNormalFontObject("GameFontNormalLeft")
sessionLabel:SetHighlightFontObject("GameFontHighlightLeft")
sessionLabel:SetPoint("TOPLEFT", titlebg, 6, -1)
sessionLabel:SetPoint("BOTTOMRIGHT", titlebg, "BOTTOMRIGHT", -26, 1)
sessionLabel:SetScript("OnHide", function()
	window:StopMovingOrSizing()
end)
--[[sessionLabel:SetScript("OnMouseUp", function()
	window:StopMovingOrSizing()
end)
sessionLabel:SetScript("OnMouseDown", function()
	window:StartMoving()
end)]]
sessionLabel:SetScript("OnDoubleClick", function()
	sessionLabel:Hide()
	searchLabel:Show()
	searchBox:Show()
	searchThrough = currentSackContents
end)
local quickTips = "|cff44ff44Double-click|r to filter bug reports. After you are done with the search results, return to the full sack by selecting a tab at the bottom. |cff44ff44Left-click|r and drag to move the window. |cff44ff44Right-click|r to close the sack and open the interface options for BugSack."
sessionLabel:SetScript("OnEnter", function(self)
	GameTooltip:SetOwner(self, "ANCHOR_TOPLEFT", -8, 8)
	GameTooltip:AddLine("Quick tips")
	GameTooltip:AddLine(quickTips, 1, 1, 1, 1)
	GameTooltip:Show()
end)
sessionLabel:SetScript("OnLeave", function(self)
	if GameTooltip:IsOwned(self) then
		GameTooltip:Hide()
	end
end)

searchLabel = window:CreateFontString(nil, "ARTWORK", "GameFontNormal")
searchLabel:SetText("Filter:")
searchLabel:SetJustifyH("LEFT")
searchLabel:SetPoint("TOPLEFT", titlebg, 6, -3)
searchLabel:SetTextColor(1, 1, 1, 1)
searchLabel:Hide()

searchBox = CreateFrame("EditBox", nil, window)
searchBox:SetTextInsets(4, 4, 0, 0)
searchBox:SetMaxLetters(50)
searchBox:SetFontObject("ChatFontNormal")
searchBox:SetBackdrop({
	edgeFile = nil,
	bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
	insets = { left = 0, right = 0, top = 0, bottom = 0 },
	tile = true,
	tileSize = 16,
	edgeSize = 0,
})
searchBox:SetBackdropColor(0, 0, 0, 0.5)
searchBox:SetScript("OnShow", function(self)
	self:SetFocus()
end)
searchBox:SetScript("OnHide", function(self)
	self:ClearFocus()
	self:SetText("")
end)
searchBox:SetScript("OnEscapePressed", clearSearch)
searchBox:SetScript("OnTextChanged", filterSack)
searchBox:SetAutoFocus(false)
searchBox:SetPoint("TOPLEFT", searchLabel, "TOPRIGHT", 6, 1)
searchBox:SetPoint("BOTTOMRIGHT", titlebg, "BOTTOMRIGHT", -26, 1)
searchBox:Hide()

nextButton = CreateFrame("Button", "BugSackNextButton", window, "UIPanelButtonTemplate")
nextButton:SetPoint("BOTTOMRIGHT", window, -11, 16)
nextButton:SetFrameStrata("FULLSCREEN")
nextButton:SetWidth(130)
nextButton:SetText(L["Next >"])
nextButton:SetScript("OnClick", function()
	if IsShiftKeyDown() then
		currentErrorIndex = #currentSackContents
	else
		currentErrorIndex = currentErrorIndex + 1
	end
	updateSackDisplay()
end)

prevButton = CreateFrame("Button", "BugSackPrevButton", window, "UIPanelButtonTemplate")
prevButton:SetPoint("BOTTOMLEFT", window, 14, 16)
prevButton:SetFrameStrata("FULLSCREEN")
prevButton:SetWidth(130)
prevButton:SetText(L["< Previous"])
prevButton:SetScript("OnClick", function()
	if IsShiftKeyDown() then
		currentErrorIndex = 1
	else
		currentErrorIndex = currentErrorIndex - 1
	end
	updateSackDisplay()
end)

if addon.Serialize then
	sendButton = CreateFrame("Button", "BugSackSendButton", window, "UIPanelButtonTemplate")
	sendButton:SetPoint("LEFT", prevButton, "RIGHT")
	sendButton:SetPoint("RIGHT", nextButton, "LEFT")
	sendButton:SetFrameStrata("FULLSCREEN")
	sendButton:SetText(L["Send bugs"])
	sendButton:SetScript("OnClick", function()
		local eo = currentSackContents[currentErrorIndex]
		local popup = StaticPopup_Show("BugSackSendBugs", eo.session)
		popup.data = eo.session
		window:Hide()
	end)
end

local scroll = CreateFrame("ScrollFrame", "BugSackScroll", window, "UIPanelScrollFrameTemplate")
scroll:SetPoint("TOPLEFT", window, "TOPLEFT", 16, -36)
scroll:SetPoint("BOTTOMRIGHT", nextButton, "TOPRIGHT", -24, 8)

textArea = CreateFrame("EditBox", "BugSackScrollText", scroll)
textArea:SetTextColor(.5, .5, .5, 1)
textArea:SetAutoFocus(false)
textArea:SetMultiLine(true)
textArea:SetFontObject(_G[addon.db.fontSize] or GameFontHighlightSmall)
textArea:SetMaxLetters(99999)
textArea:EnableMouse(true)
textArea:SetScript("OnEscapePressed", textArea.ClearFocus)
textArea:SetWidth(450)

scroll:SetScrollChild(textArea)

local all = CreateFrame("Button", "BugSackTabAll", window, "CharacterFrameTabButtonTemplate")
all:SetFrameStrata("FULLSCREEN")
all:SetPoint("TOPLEFT", window, "BOTTOMLEFT", 0, 8)
all:SetText(L["All bugs"])
all:SetScript("OnLoad", nil)
all:SetScript("OnShow", nil)
all:SetScript("OnClick", setActiveMethod)
all.bugs = "all"

local session = CreateFrame("Button", "BugSackTabSession", window, "CharacterFrameTabButtonTemplate")
session:SetFrameStrata("FULLSCREEN")
session:SetPoint("LEFT", all, "RIGHT")
session:SetText(L["Current session"])
session:SetScript("OnLoad", nil)
session:SetScript("OnShow", nil)
session:SetScript("OnClick", setActiveMethod)
session.bugs = "currentSession"

local last = CreateFrame("Button", "BugSackTabLast", window, "CharacterFrameTabButtonTemplate")
last:SetFrameStrata("FULLSCREEN")
last:SetPoint("LEFT", session, "RIGHT")
last:SetText(L["Previous session"])
last:SetScript("OnLoad", nil)
last:SetScript("OnShow", nil)
last:SetScript("OnClick", setActiveMethod)
last.bugs = "previousSession"

tabs = {all, session, last}
local size = 500 / 3
for i, t in next, tabs do
	PanelTemplates_TabResize(t, nil, size, size)
	if i == 1 then
		PanelTemplates_SelectTab(t)
	else
		PanelTemplates_DeselectTab(t)
	end
end

end

-- Called when the sack is supposed to be opened or refreshed,
-- and can only be called by :OpenSack or something that is available
-- from the sack window, so we know that currentSackContents is set.
local function show()
if createBugSack then
createBugSack()
createBugSack = nil
end
updateSackDisplay(true)
window:Show()
end

function addon:CloseSack()
window:Hide()
end

function addon:OpenSack()
if window and window:IsShown() then
-- Window is already open, we just need to update various texts.
return
end

-- XXX we should show the most recent error (from this session) that has not previously been shown in the sack
-- XXX so, 5 errors are caught, the user clicks the icon, we start it at the first of those 5 errors.
--[[if not currentSackContents then
	currentSackContents = BugGrabber:GetDB(currentSackSession)
end]]
show()

end