You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

193 lines
7.6 KiB

local _,L = ...
local rematch = Rematch
local dialog = RematchDialog
local settings, saved
rematch:InitModule(function()
settings = RematchSettings
saved = RematchSaved
dialog:UpdateTabPicker()
rematch:RegisterMenu("SaveAsTarget",{
{ text=L["No Target"], npcID=nil, func=rematch.PickNpcID },
{ text=function() return rematch:GetNameFromNpcID(rematch.recentTarget) end, hidden=function() return not rematch.recentTarget end, npcID=function() return rematch.recentTarget end, func=rematch.PickNpcID },
{ text=function() return rematch:GetTeamTitle(settings.loadedTeam) end, hidden=function() return type(settings.loadedTeam)~="number" or settings.loadedTeam==rematch.recentTarget or settings.loadedTeam==1 end, npcID=function() return settings.loadedTeam end, func=rematch.PickNpcID },
{ text=L["Noteworthy Targets"], subMenu="TargetMenu" }, -- defined in Npcs.lua
})
dialog.SaveAs.Target.tooltipTitle=L["Target For This Team"]
dialog.SaveAs.Target.tooltipBody=L["A target stored in a team is used to decide which team to load when you return to that target.\n\nYou can save an unlimited number of teams to fight a target, but a target can only be saved in one team."]
dialog.SaveAs.Name.Label:SetText(L["Name:"])
dialog.SaveAs.Target.Label:SetText(L["Target:"])
end)
function rematch:ShowSaveAsDialog(header)
rematch:ShowDialog("SaveAs",300,140+dialog.SaveAs:GetHeight(),header or L["Save As.."],L["Save this team?"],SAVE,rematch.SaveAsAccept,CANCEL)
dialog.SaveAs:SetPoint("TOP",0,-40)
dialog.SaveAs:Show()
dialog.TabPicker:SetPoint("TOPRIGHT",dialog.SaveAs.Target,"BOTTOMRIGHT",0,-6)
dialog.TabPicker:Show()
rematch:UpdateSaveAsDialog() -- fills in stuff
end
function dialog.SaveAs.Target:OnClick()
rematch:ToggleMenu("SaveAsTarget","TOPRIGHT",self,"BOTTOMRIGHT",0,2)
end
function rematch:UpdateSaveAsDialog()
dialog:UpdateTabPicker()
local team,key = rematch:GetSideline()
dialog:FillTeam(dialog.SaveAs.Team,team)
dialog.SaveAs.Name:SetFontObject(type(key)=="number" and "GameFontHighlight" or "GameFontNormal")
dialog.SaveAs.Name:SetText(rematch:GetSidelineTitle())
dialog.SaveAs.Target.Text:SetText(rematch:GetNameFromNpcID(key))
dialog.SaveAs.Themselves:Hide()
local height = 180
local yoff = -40
if rematch:GetSidelineContext("AskingOverwriteNotes") then
-- if saving from loadout, and team has notes (determined in CheckToOverwriteNotesAndPreferences)
-- which also sets this context, then attach a checkbox for "Save Notes & Preferences too"
dialog.CheckButton:SetPoint("TOPLEFT",dialog.SaveAs.Target,"BOTTOMLEFT",-32,yoff)
dialog.CheckButton.text:SetText(L["Save Notes & Preferences Too"])
dialog.CheckButton:Show()
dialog.CheckButton:SetChecked(settings.OverwriteNotes and true)
dialog.CheckButton:SetScript("OnClick",function(self) settings.OverwriteNotes=self:GetChecked() end)
height = height + 28
yoff = yoff - 28
end
dialog.SaveAs:SetHeight(height)
rematch:SaveAsUpdateWarning()
end
function rematch:SaveAsUpdateWarning()
local name = dialog.SaveAs.Name:GetText()
local team,key = rematch:GetSideline()
local warn
if name and name:len()==0 then
warn = L["All teams must have a name."]
elseif rematch:GetSidelineContext("originalKey")~=key and saved[key] then
if type(key)=="number" then
warn = L["This target already has a team."]
else
warn = L["A team already has this name."]
end
end
if warn then
dialog.Warning:SetPoint("TOP",dialog.SaveAs,"BOTTOM",0,-4)
dialog.Warning.Text:SetText(warn)
dialog.Warning:Show()
else
dialog.Warning:Hide()
end
dialog:SetHeight((warn and 140 or 108)+dialog.SaveAs:GetHeight())
end
-- call to change target in the SaveAs dialog
function rematch:SetSaveAsTarget(npcID)
local team,key = rematch:GetSideline()
if npcID~=key then
if npcID then
rematch:ChangeSidelineKey(npcID)
team,key = rematch:GetSideline() -- need to get them again since table changes
if saved[npcID] then
team.teamName = saved[npcID].teamName
else
team.teamName = rematch:GetNameFromNpcID(npcID)
end
else
rematch:ChangeSidelineKey(rematch:GetSidelineContext("originalName"))
team,key = rematch:GetSideline() -- need to get them again since table changes
team.teamName = nil
end
end
rematch:UpdateSaveAsDialog()
end
function dialog.SaveAs.Name:OnTextChanged()
local text = self:GetText()
if text:len()==0 then
dialog.Accept:Disable()
else
dialog.Accept:Enable()
if text~=rematch:GetSidelineTitle() then
local team,key = rematch:GetSideline()
if type(key)=="number" then
team.teamName = text -- if an npcID-indexed team, it can be any name
else
rematch:ChangeSidelineKey(text)
end
end
end
rematch:SaveAsUpdateWarning()
end
-- when the Save button is clicked in the SaveAs dialog
function rematch:SaveAsAccept()
local team,key = rematch:GetSideline()
if not saved[key] or not rematch:SidelinePetsDifferentThan(key) then
rematch:PushSideline()
rematch:ShowTeam(key)
else
rematch:ShowOverwriteDialog()
end
end
-- returns true if the sidelined team's pets are different than the team of the passed key
function rematch:SidelinePetsDifferentThan(key)
local team1 = rematch:GetSideline()
local team2 = saved[key]
if team1 and team2 then
for i=1,3 do
if team1[i][1]~=team2[i][1] then
return true -- a pet is different
end
end
if team1.notes~=team2.notes or team1.minHP~=team2.minHP or team1.maxXP~=team2.maxXP or team1.minXP~=team2.minXP or team1.maxHP~=team2.maxHP then
return true -- notes or preferences are different
end
return false -- the three pets are the same
end
return true -- one or both teams doesn't exist
end
-- shows an overwrite dialog to confirm whether to save a team
-- make noDialog true when declining shouldn't return to the SaveAs dialog
function rematch:ShowOverwriteDialog(noDialog,prompt)
rematch:ShowDialog("Overwrite",300,350,L["Overwrite Team"],prompt or L["Overwrite this team?"],YES,rematch.OverwriteAccept,NO,not noDialog and rematch.ShowSaveAsDialog or nil)
local team,key = rematch:GetSideline()
dialog.Text:SetSize(260,72)
if noDialog then -- no need to explain why overwrite happening, just show team name
dialog.Text:SetSize(260,32)
dialog.Text:SetJustifyH("CENTER")
dialog.Text:SetText(rematch:GetTeamTitle(key,true))
dialog:SetHeight(310)
else
if type(key)=="number" then
dialog.Text:SetText(format(L["The target %s%s\124r already has a team.\n\nA target can only have one team."],rematch.hexWhite,rematch:GetNameFromNpcID(key)))
else
dialog.Text:SetText(format(L["A team named %s%s\124r already exists.\n\nTeams without a target must have a unique name."],rematch.hexWhite,key))
end
end
dialog.Text:SetPoint("TOP",0,-32)
dialog.Text:Show()
dialog.OldTeam:SetPoint("TOP",dialog.Text,"BOTTOM")
dialog.OldTeam:Show()
dialog:FillTeam(dialog.OldTeam,saved[key])
dialog.Team:SetPoint("TOP",dialog.OldTeam,"BOTTOM",0,-32)
dialog.Team:Show()
dialog:FillTeam(dialog.Team,team)
end
-- when accept clicked on overwrite dialog
function rematch:OverwriteAccept()
local _,key = rematch:GetSideline()
rematch:PushSideline()
rematch:ShowTeam(key)
end
-- to be called after a loaded team is sidelined (Save As... or target's Save button)
-- will turn on AskingOverwriteNotes to know whether notes can potentially overwrite
function rematch:CheckToOverwriteNotesAndPreferences()
local team = settings.loadedTeam and saved[settings.loadedTeam]
if team and (team.notes or rematch:HasPreferences(team)) then
rematch:SetSidelineContext("AskingOverwriteNotes",true)
end
end