-- ------------------------------------------------------------------------------ -- -- 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