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