Files
coa-tsm/TradeSkillMaster/Assistant/Assistant.lua
T
Andrew6810 f3e579cb57 init
2022-11-05 21:19:42 -07:00

289 lines
8.6 KiB
Lua

-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- http://www.curse.com/addons/wow/tradeskill-master --
-- --
-- A TradeSkillMaster Addon (http://tradeskillmaster.com) --
-- All Rights Reserved* - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
local TSM = select(2, ...)
local Assistant = TSM:NewModule("Assistant")
local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster") -- loads the localization table
local private = {}
TSMAPI:RegisterForTracing(private, "TradeSkillMaster.Assistant_private")
local MAX_ASSISTANT_BUTTONS = 6
function Assistant:Open()
if not private.frame then
if not private:ValidateQuestions(Assistant.INFO) then
TSM:Print(L["No Assistant guides available for the modules which you have installed."])
return
end
private.frame = private:CreateAssistantFrame()
end
private.frame:Show()
end
-- Removes questions which aren't possible due to missing steps (probably due to missing modules)
function private:ValidateQuestions(questionInfo)
if not questionInfo.buttons then return false end
for i=#questionInfo.buttons, 1, -1 do
if questionInfo.buttons[i].guides then
local hasAllGuides = true
for _, guide in ipairs(questionInfo.buttons[i].guides) do
if not Assistant.STEPS[guide] then
hasAllGuides = false
break
end
end
if not hasAllGuides then
tremove(questionInfo.buttons, i)
end
elseif questionInfo.buttons[i].children then
if not private:ValidateQuestions(questionInfo.buttons[i].children) then
tremove(questionInfo.buttons, i)
end
end
end
return #questionInfo.buttons > 0
end
function private:CreateAssistantFrame()
local frameDefaults = {
x = 50,
y = 300,
width = 400,
height = 250,
scale = 1,
}
local frame = TSMAPI:CreateMovableFrame("TSMAssistantFrame", frameDefaults)
TSMAPI.Design:SetFrameBackdropColor(frame)
frame:Hide()
frame:SetScript("OnShow", function(self)
self.guideFrame:Hide()
self.questionFrame:Show()
end)
frame:SetScript("OnHide", function(self)
private.currentStep = nil
end)
local title = frame:CreateFontString()
title:SetFont(TSMAPI.Design:GetContentFont(), 18)
TSMAPI.Design:SetWidgetLabelColor(title)
title:SetPoint("TOP", frame, 0, -3)
title:SetText(L["TSM Assistant"])
TSMAPI.GUI:CreateHorizontalLine(frame, -25)
local closeBtn = TSMAPI.GUI:CreateButton(frame, 18)
closeBtn:SetPoint("TOPRIGHT", -3, -3)
closeBtn:SetWidth(19)
closeBtn:SetHeight(19)
closeBtn:SetText("X")
closeBtn:SetScript("OnClick", function() frame:Hide() end)
frame.questionFrame = private:CreateQuestionFrame(frame)
frame.guideFrame = private:CreateGuideFrame(frame)
return frame
end
function private:CreateQuestionFrame(parent)
local frame = CreateFrame("Frame", nil, parent)
frame:SetAllPoints()
frame:Hide()
frame:SetScript("OnShow", function(self)
private.pageInfo = Assistant.INFO
self.restartButton:Hide()
self:Update()
end)
function frame.Update(self)
-- update the title question
self.questionText:SetText(private.pageInfo.title)
-- hide all the buttons
for _, button in ipairs(self.buttons) do
button:Hide()
end
-- update buttons
for i, buttonInfo in ipairs(private.pageInfo.buttons) do
self.buttons[i]:Show()
self.buttons[i]:SetText(buttonInfo.text)
self.buttons[i].info = buttonInfo
end
end
local questionText = TSMAPI.GUI:CreateTitleLabel(frame, 16)
questionText:SetPoint("TOPLEFT", 5, -30)
questionText:SetPoint("TOPRIGHT", -5, -30)
questionText:SetHeight(20)
questionText:SetJustifyH("LEFT")
questionText:SetJustifyV("CENTER")
frame.questionText = questionText
local function OnAnswerButtonClicked(self)
if self.info.children then
private.frame.questionFrame.restartButton:Show()
private.pageInfo = self.info.children
private.frame.questionFrame:Update()
elseif self.info.guides then
private.steps = {}
for _, guideKey in ipairs(self.info.guides) do
for _, step in ipairs(Assistant.STEPS[guideKey]) do
tinsert(private.steps, step)
end
end
private.frame.questionFrame:Hide()
private.frame.guideFrame:Show()
end
end
frame.buttons = {}
for i=1, MAX_ASSISTANT_BUTTONS do
local button = TSMAPI.GUI:CreateButton(frame, 14)
button:SetHeight(20)
if i == 1 then
button:SetPoint("TOPLEFT", frame.questionText, "BOTTOMLEFT", 0, -5)
button:SetPoint("TOPRIGHT", frame.questionText, "BOTTOMRIGHT", 0, -5)
else
button:SetPoint("TOPLEFT", frame.buttons[i-1], "BOTTOMLEFT", 0, -5)
button:SetPoint("TOPRIGHT", frame.buttons[i-1], "BOTTOMRIGHT", 0, -5)
end
button:SetScript("OnClick", OnAnswerButtonClicked)
tinsert(frame.buttons, button)
end
local restartButton = TSMAPI.GUI:CreateButton(frame, 14)
restartButton:SetHeight(20)
restartButton:SetPoint("BOTTOMLEFT", 5, 5)
restartButton:SetPoint("BOTTOMRIGHT", -5, 5)
restartButton:SetText(L["Restart Assistant"])
restartButton:SetScript("OnClick", function(self)
self:Hide()
private.pageInfo = Assistant.INFO
private.frame.questionFrame:Update()
end)
frame.restartButton = restartButton
return frame
end
function private:CreateGuideFrame(parent)
local frame = CreateFrame("Frame", nil, parent)
frame:SetAllPoints()
frame:Hide()
frame:SetScript("OnShow", function(self)
private.currentStep = 1
private.checkPoint = 1
Assistant:ClearStepData()
self:Update()
private:StartStepWaitThread()
end)
function frame.Update(self)
if private.currentStep == -1 then
self.stepTitle:SetText(L["Done!"])
self.stepDesc:SetText(L["You have successfully completed this guide. If you require further assistance, visit out our website:"].."\n\n".."http://tradeskillmaster.com")
self.button:Hide()
self.restartButton:Show()
else
local stepInfo = private.steps[private.currentStep]
self.stepTitle:SetText(stepInfo.title)
if stepInfo.getDescArgs then
self.stepDesc:SetText(format(stepInfo.description, stepInfo.getDescArgs()))
else
self.stepDesc:SetText(stepInfo.description)
end
if stepInfo.doneButton then
self.button:Show()
self.button:SetText(stepInfo.doneButton)
self.button:SetScript("OnClick", function() stepInfo:onDoneButtonClicked() end)
self.stepDesc:SetWidth(min(self.stepDesc:GetStringWidth(), self:GetWidth()-10))
else
self.button:Hide()
self.stepDesc:SetWidth(self:GetWidth()-10)
end
self.restartButton:Hide()
end
end
local stepTitle = TSMAPI.GUI:CreateTitleLabel(frame, 16)
stepTitle:SetPoint("TOPLEFT", 5, -30)
stepTitle:SetPoint("TOPRIGHT", -5, -30)
stepTitle:SetHeight(20)
stepTitle:SetJustifyH("LEFT")
stepTitle:SetJustifyV("CENTER")
stepTitle:SetText("DEFAULT")
frame.stepTitle = stepTitle
local stepDesc = TSMAPI.GUI:CreateLabel(frame, "normal")
stepDesc:SetPoint("TOPLEFT", 5, -55)
stepDesc:SetJustifyH("LEFT")
stepDesc:SetJustifyV("TOP")
frame.stepDesc = stepDesc
local button = TSMAPI.GUI:CreateButton(frame, 14)
button:SetHeight(20)
button:SetPoint("TOPLEFT", frame.stepDesc, "BOTTOMLEFT", 0, -5)
button:SetPoint("TOPRIGHT", frame.stepDesc, "BOTTOMRIGHT", 0, -5)
button:SetScript("OnClick", function() end)
frame.button = button
local restartButton = TSMAPI.GUI:CreateButton(frame, 14)
restartButton:SetHeight(20)
restartButton:SetPoint("BOTTOMLEFT", 5, 5)
restartButton:SetPoint("BOTTOMRIGHT", -5, 5)
restartButton:SetText(L["Restart Assistant"])
restartButton:SetScript("OnClick", function(self)
parent:Hide()
Assistant:Open()
end)
frame.restartButton = restartButton
return frame
end
function private:StartStepWaitThread()
TSMAPI.Threading:Start(private.GuideThread, 0.1, private.StepComplete)
end
function private:IsStepDone(step)
if step.isDone and step:isDone() then
return true
end
end
function private:GetCurrentStep()
for i=private.checkPoint, #private.steps do
if not private:IsStepDone(private.steps[i]) then
return i
elseif private.steps[i].isCheckPoint then
private.checkPoint = i+1
end
end
end
function private.GuideThread(self)
-- loop until the player finishes the step or we abort
while private.currentStep do
local stepNum = private:GetCurrentStep()
if not stepNum then return end
if stepNum ~= private.currentStep then
private.currentStep = stepNum
end
private.frame.guideFrame:Update()
self:Sleep(0.1)
end
end
function private.StepComplete()
if private.currentStep then
private.currentStep = -1
private.frame.guideFrame:Update()
end
end