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.
383 lines
19 KiB
383 lines
19 KiB
local _,rematch = ...
|
|
local L = rematch.localization
|
|
local C = rematch.constants
|
|
local settings = rematch.settings
|
|
rematch.saveDialog = {}
|
|
|
|
rematch.events:Register(rematch.saveDialog,"PLAYER_LOGIN",function(self)
|
|
|
|
-- this dialog is used for Save As, Edit Team, and save from target panel
|
|
-- subject = {
|
|
-- saveMode = one of C.SAVE_MODE_EDIT, C.SAVE_MODE_SAVEAS or C.SAVE_MODE_RECEIVE,
|
|
-- teamID = teamID of team being edited (only used on SAVE_MODE_EDIT)
|
|
-- fromOverwrite = true if returning to this from a NameConflict dialog (keep sideline intact)
|
|
-- }
|
|
rematch.dialog:Register("SaveTeam",{
|
|
title = L["Save Team"], -- Saved As, Edit Team, Receiving Team
|
|
accept = SAVE,
|
|
cancel = CANCEL,
|
|
other = RESET,
|
|
width = 290,
|
|
minHeight = 264,
|
|
stayOnOther = true,
|
|
layouts = {
|
|
Default = {"LayoutTabs","Text","ComboBox","GroupSelect","Spacer","TeamWithAbilities","Feedback"},
|
|
GroupPick = {"LayoutTabs","GroupPicker"},
|
|
Targets = {"LayoutTabs","TeamPicker"},
|
|
Preferences = {"LayoutTabs","Text","Line","Preferences","Help"},
|
|
WinRecord = {"LayoutTabs","Text","Line","WinRecord"},
|
|
},
|
|
refreshFunc = rematch.saveDialog.Refresh,
|
|
changeFunc = rematch.saveDialog.OnChange,
|
|
otherFunc = rematch.saveDialog.Reset,
|
|
acceptFunc = rematch.saveDialog.Accept,
|
|
})
|
|
|
|
-- this dialog is shown when SaveTeam dialog is accepted when another team shares the chosen name
|
|
-- subject = {
|
|
-- saveMode = saveMode of save dialog before this was summoned
|
|
-- teamID = teamID of save dialog before this was summoned
|
|
-- overwriteID = teamID that the save may overwrite
|
|
-- }
|
|
rematch.dialog:Register("NameConflict",{
|
|
title = L["Overwrite Team"],
|
|
accept = L["New Copy"],
|
|
cancel = CANCEL,
|
|
other = L["Overwrite"],
|
|
layout = {"Text","SmallText","TeamWithAbilities","SmallText2","OtherTeamWithAbilities"},
|
|
refreshFunc = function(self,info,subject,firstRun)
|
|
self.Text:SetText(L["Another team already has this name. Overwrite it or create a new copy?"])
|
|
self.SmallText:SetText(format(L["Old %s"],rematch.utils:GetFormattedTeamName(subject.overwriteID)))
|
|
self.TeamWithAbilities:FillFromTeamID(subject.overwriteID)
|
|
self.SmallText2:SetText(format(L["New %s"],rematch.utils:GetFormattedTeamName("sideline")))
|
|
self.OtherTeamWithAbilities:FillFromTeamID("sideline")
|
|
end,
|
|
cancelFunc = rematch.saveDialog.NameConflictCancel,
|
|
acceptFunc = rematch.saveDialog.NameConflictNewTeam,
|
|
otherFunc = rematch.saveDialog.NameConflictOverwrite,
|
|
})
|
|
|
|
-- this dialog is shown when the Save bottombar (not Save As) button is hit and at least one pet has changed
|
|
rematch.dialog:Register("SaveOverwrite",{
|
|
title = L["Saving Loaded Team"],
|
|
prompt = L["Save team?"],
|
|
accept = YES,
|
|
cancel = NO,
|
|
layout = {"Text","SmallText","TeamWithAbilities","SmallText2","OtherTeamWithAbilities"},
|
|
refreshFunc = function(self,info,subject,firstRun) -- subject is teamID being saved
|
|
rematch.dialog:SetTitle(rematch.utils:GetFormattedTeamName(subject))
|
|
self.Text:SetText(L["Pets have changed. Confirm you want to update the team with these new pets."])
|
|
self.SmallText:SetText(L["Update team from this:"])
|
|
self.TeamWithAbilities:FillFromTeamID(subject)
|
|
self.SmallText2:SetText(L["To this:"])
|
|
self.OtherTeamWithAbilities:FillFromTeamID("sideline")
|
|
end,
|
|
acceptFunc = function(self,info,subject)
|
|
rematch.savedTeams[subject] = rematch.savedTeams.sideline
|
|
rematch.saveDialog:BlingLoadedTeam()
|
|
end
|
|
})
|
|
|
|
rematch.dialog:Register("SendDialog",{
|
|
title = L["Sending Team"],
|
|
accept = OKAY,
|
|
layout = {"Icon","Spacer","Text","Spacer2"},
|
|
refreshFunc = function(self,info,subject,firstRun)
|
|
self.Icon:SetTexture("Interface\\Icons\\spell_Mekkatorque_bot_redwrench")
|
|
self.Icon:SetTexCoord(0.075,0.925,0.075,0.925)
|
|
self.Text:SetText(L["Not yet implemented\n\nSending teams directly to other Rematch users will be added later in the beta."])
|
|
end,
|
|
})
|
|
|
|
end)
|
|
|
|
function rematch.saveDialog:BlingTeamIDOrGroupID(data)
|
|
-- if not minimized, open to team panel to teamID and bling it
|
|
if rematch.layout:GetMode()~=0 then
|
|
rematch.savedTeams:TeamsChanged(true) -- prior TeamsChanged were throttled; we need teams to be updated in the group/list before going to it
|
|
rematch.layout:SummonView("teams")
|
|
rematch.teamsPanel.List:ScrollDataIntoView(data)
|
|
rematch.teamsPanel.List:BlingData(data)
|
|
end
|
|
end
|
|
|
|
-- this goes to the teamsPanel if it's not up, scrolls to the team, loads it if not loaded or blings loaded team if loaded
|
|
function rematch.saveDialog:LoadAndBlingTeamID(subject)
|
|
rematch.saveDialog:BlingTeamIDOrGroupID(subject.teamID)
|
|
-- minimized or not, load the team just saved unless in edit mode
|
|
if subject.teamID~=settings.currentTeamID and subject.saveMode~=C.SAVE_MODE_EDIT then
|
|
rematch.loadTeam:LoadTeamID(subject.teamID)
|
|
elseif subject.teamID==settings.currentTeamID then -- if we didn't load but team saved is loaded, bling it
|
|
rematch.saveDialog:BlingLoadedTeam()
|
|
end
|
|
end
|
|
|
|
-- blings the loadedTeamPanel and the loadouts
|
|
function rematch.saveDialog:BlingLoadedTeam()
|
|
rematch.loadedTeamPanel:BlingTeam()
|
|
if rematch.loadoutPanel:IsVisible() then
|
|
rematch.loadoutPanel:BlingLoadouts()
|
|
elseif rematch.miniLoadoutPanel:IsVisible() then
|
|
rematch.miniLoadoutPanel:BlingLoadouts()
|
|
end
|
|
end
|
|
|
|
-- when NameConflict dialog is cancelled, return to SaveTeam dialog
|
|
function rematch.saveDialog:NameConflictCancel(info,subject)
|
|
rematch.dialog:ShowDialog("SaveTeam",{saveMode=subject.saveMode, teamID=subject.teamID, fromOverwrite=true})
|
|
end
|
|
|
|
-- when saving a team that shares a name with another team and user chooses "New Copy", create a uniquely named team
|
|
function rematch.saveDialog:NameConflictNewTeam(info,subject)
|
|
-- make name unique
|
|
rematch.savedTeams.sideline.name = rematch.savedTeams:GetUniqueName(rematch.savedTeams.sideline.name)
|
|
-- create a new team
|
|
local team = rematch.savedTeams:Create() -- this will call a TeamsChanged
|
|
subject.teamID = team.teamID
|
|
rematch.saveDialog:LoadAndBlingTeamID(subject)
|
|
end
|
|
|
|
-- when saving a team that shares a name with another team and user chooses "Overwrite", replace with sideline team
|
|
function rematch.saveDialog:NameConflictOverwrite(info,subject)
|
|
rematch.events:Fire("REMATCH_TEAM_OVERWRITTEN",subject.overwriteID,subject.teamID,subject.saveMode)
|
|
if subject.saveMode==C.SAVE_MODE_EDIT then -- in SAVE_MODE_EDIT, delete overwriteID and update teamID with sideline
|
|
rematch.savedTeams[subject.overwriteID] = nil
|
|
rematch.savedTeams[subject.teamID] = rematch.savedTeams.sideline
|
|
else -- SAVE_MODE_SAVEAS/RECEIVE: overwrite overwriteID with sideline
|
|
rematch.savedTeams[subject.overwriteID] = rematch.savedTeams.sideline
|
|
subject.teamID = subject.overwriteID
|
|
end
|
|
rematch.saveDialog:LoadAndBlingTeamID(subject)
|
|
end
|
|
|
|
-- clicking Save on the dialog will either summon an Overwrite dialog or save the team, either to the original teamID or creating a new teamID
|
|
-- if sideline name <> original name and sideline name is used by another team: show overwrite dialog; don't save yet
|
|
-- elseif edit savemode: save to teamID
|
|
-- elseif user teamID and sideline.name = original.name: save to teamID
|
|
-- else: save to new team
|
|
function rematch.saveDialog:Accept(info,subject)
|
|
if rematch.saveDialog:IsTeamNameUsed() then -- if the team's name will overwrite another, bring up overwrite dialog
|
|
local overwriteID = rematch.savedTeams:GetTeamIDByName(rematch.savedTeams.sideline.name)
|
|
C_Timer.After(0,function() -- need to wait a frame since this accept will close the window after (accept can't run after hide due to resets onhide)
|
|
rematch.dialog:ShowDialog("NameConflict",{saveMode=subject.saveMode, teamID=subject.teamID, overwriteID=overwriteID})
|
|
end)
|
|
return
|
|
elseif subject.saveMode==C.SAVE_MODE_EDIT then
|
|
-- this is editing an existing team; save to same teamID
|
|
assert(rematch.savedTeams:IsUserTeam(subject.teamID),"Editing an invalid teamID: "..(subject.teamID or "nil"))
|
|
rematch.savedTeams[subject.teamID] = rematch.savedTeams.sideline
|
|
rematch.savedTeams:TeamsChanged()
|
|
elseif rematch.savedTeams:IsUserTeam(subject.teamID) and rematch.savedTeams.sideline.name:lower()==rematch.savedTeams.original.name:lower() then
|
|
-- a teamID is used and this is saving back to the original team name; this is a form of edit, save to same teamID
|
|
rematch.savedTeams[subject.teamID] = rematch.savedTeams.sideline
|
|
rematch.savedTeams:TeamsChanged()
|
|
else -- otherwise (not from a loaded team or name has changed) create a new teamID for this new team
|
|
local team = rematch.savedTeams:Create() -- this will call a TeamsChanged
|
|
subject.teamID = team.teamID
|
|
end
|
|
rematch.saveDialog:LoadAndBlingTeamID(subject)
|
|
rematch.queue:Process()
|
|
end
|
|
|
|
-- returns true if the sidelined team is different than the original team name and another team has that name
|
|
function rematch.saveDialog:IsTeamNameUsed()
|
|
if rematch.savedTeams.sideline.name:lower()~=rematch.savedTeams.original.name:lower() and rematch.savedTeams:GetTeamIDByName(rematch.savedTeams.sideline.name) then
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
function rematch.saveDialog:Refresh(info,subject,firstRun)
|
|
if firstRun then
|
|
rematch.dialog.OtherButton:Disable() -- -- disable Reset button
|
|
self.LayoutTabs:SetTabs({
|
|
{L["Team"],"Default"},
|
|
{L["Targets"],"Targets",function() return rematch.savedTeams.sideline.targets and true or false end, function() rematch.dialog.Canvas.TeamPicker:Clear() end},
|
|
{L["Preferences"],"Preferences",function() return rematch.savedTeams.sideline.preferences and true or false end, function() rematch.dialog.Canvas.Preferences:Set() end},
|
|
{L["Wins"],"WinRecord",function() return rematch.savedTeams.sideline.winrecord and true or false end, function() rematch.dialog.Canvas.WinRecord:Set() end}
|
|
})
|
|
self.CheckButton:SetText(L["Create a new copy of this team"])
|
|
self.Feedback:Set("warning",L["Another team has this name."])
|
|
self.Feedback:SetAlpha(0)
|
|
if subject.saveMode==C.SAVE_MODE_EDIT then
|
|
rematch.dialog:SetTitle(L["Edit Team"])
|
|
elseif subject.saveMode==C.SAVE_MODE_SAVEAS then
|
|
rematch.dialog:SetTitle(L["Save Team"])
|
|
elseif subject.saveMode==C.SAVE_MODE_RECEIVE then
|
|
rematch.dialog:SetTitle(L["Receiving Team"])
|
|
end
|
|
local team = rematch.savedTeams.sideline
|
|
local groupID = team.groupID
|
|
if not groupID or not rematch.savedGroups[groupID] then
|
|
team.groupID = "group:none"
|
|
groupID = "group:none"
|
|
end
|
|
-- name combobox setup
|
|
self.ComboBox:SetLabel(L["Name:"])
|
|
local names = {team.name}
|
|
if team.targets then
|
|
for _,npcID in ipairs(team.targets) do -- add targets for the team to list of names
|
|
rematch.utils:TableInsertDistinct(names,rematch.targetInfo:GetNpcName(npcID),true)
|
|
local questName = rematch.targetInfo:GetQuestName(npcID)
|
|
if questName then
|
|
rematch.utils:TableInsertDistinct(names,questName,true)
|
|
end
|
|
end
|
|
end
|
|
for _,npcID in ipairs(rematch.targetInfo:GetTargetHistory()) do -- add recent targets to list of names
|
|
rematch.utils:TableInsertDistinct(names,rematch.targetInfo:GetNpcName(npcID),true)
|
|
end
|
|
rematch.utils:TableInsertDistinct(names,L["New Team"]) -- and add a new team as options
|
|
self.ComboBox:SetList(names)
|
|
-- save this initial version in case a reset needed
|
|
if not subject.fromOverwrite then
|
|
rematch.savedTeams.original = rematch.savedTeams.sideline
|
|
end
|
|
-- update controls to sideline
|
|
rematch.saveDialog:UpdateControls("sideline")
|
|
-- when returning from an overwrite, these may be enabled
|
|
self.Feedback:SetAlpha(rematch.saveDialog:IsTeamNameUsed() and 1 or 0)
|
|
rematch.dialog.OtherButton:SetEnabled(not rematch.utils:AreSame(rematch.savedTeams.sideline,rematch.savedTeams.original,true))
|
|
-- set group picker to return to default always in save dialog
|
|
self.GroupPicker:SetReturn("Default")
|
|
end
|
|
-- all that follows happens every refresh (first or not)
|
|
local layout = rematch.dialog:GetOpenLayout()
|
|
if layout=="Default" then
|
|
self.Text:SetText(subject.saveMode==C.SAVE_MODE_RECEIVE and L["Someone sent you a group!"] or " ")
|
|
self.GroupSelect:Fill(rematch.savedTeams.sideline.groupID)
|
|
self.ComboBox:SetTextColor(rematch.utils:HexToRGB(settings.ColorTeamNames and rematch.savedGroups[rematch.savedTeams.sideline.groupID].color or "E8E8E8"))
|
|
elseif layout=="Preferences" then
|
|
self.Text:SetText(L["Leveling Preferences"])
|
|
self.Help:SetText(L["Leveling preferences override which pets are picked first in the leveling queue. All criteria are optional."])
|
|
elseif layout=="WinRecord" then
|
|
self.Text:SetText(L["Battles Won By This Team"])
|
|
end
|
|
self.LayoutTabs:Update()
|
|
end
|
|
|
|
-- updates the dialog's contents from a metateam name ("sideline", "original", "temporary", etc.); called in firstRun or a reset
|
|
function rematch.saveDialog:UpdateControls(metaTeam)
|
|
local team = rematch.savedTeams[metaTeam]
|
|
local group = rematch.savedGroups[team.groupID]
|
|
local canvas = rematch.dialog.Canvas
|
|
|
|
canvas.TeamWithAbilities:FillFromTeamID(metaTeam)
|
|
canvas.ComboBox:SetText(team.name)
|
|
canvas.ComboBox:SetTextColor(rematch.utils:HexToRGB(settings.ColorTeamNames and group.color or "E8E8E8"))
|
|
canvas.GroupSelect:Fill(team.groupID)
|
|
canvas.Preferences:Set(team.preferences or {})
|
|
canvas.WinRecord:Set(team.winrecord or {})
|
|
local targetList = {}
|
|
if team.targets then -- targets are stored as numeric npcIDs, lists need a string target:npcID
|
|
for _,npcID in ipairs(team.targets) do
|
|
tinsert(targetList,"target:"..npcID)
|
|
end
|
|
end
|
|
canvas.TeamPicker:SetList(C.LIST_TYPE_TARGET,targetList)
|
|
end
|
|
|
|
-- resets the save dialog to its original state
|
|
function rematch.saveDialog:Reset()
|
|
rematch.savedTeams.sideline = rematch.savedTeams.original -- copy original team back to sideline
|
|
rematch.saveDialog:UpdateControls("original") -- update dialog controls to original team
|
|
rematch.dialog.Canvas.LayoutTabs:GoToTab("Default")
|
|
end
|
|
|
|
-- any changes also changes the sidelined team
|
|
function rematch.saveDialog:OnChange(info,subject)
|
|
local sideline = rematch.savedTeams.sideline
|
|
sideline.name = self.ComboBox:GetText():trim()
|
|
-- if another team (other than one originally picked) has the same name, show warning
|
|
self.Feedback:SetAlpha(rematch.saveDialog:IsTeamNameUsed() and 1 or 0)
|
|
-- capture any potential changes in targets tab
|
|
local targetList = self.TeamPicker:GetList()
|
|
if #targetList>0 then
|
|
if not sideline.targets then
|
|
sideline.targets = {}
|
|
end
|
|
wipe(sideline.targets)
|
|
for _,targetID in ipairs(targetList) do
|
|
local npcID = rematch.targetInfo:GetNpcID(targetID) -- convert target:123 to a numeric npcID 123
|
|
if type(npcID)=="number" then
|
|
tinsert(sideline.targets,npcID)
|
|
end
|
|
end
|
|
else
|
|
sideline.targets = nil
|
|
end
|
|
-- capture any potential changes in preferences tab
|
|
local preferences = self.Preferences:Get()
|
|
if next(preferences) then
|
|
if not sideline.preferences then
|
|
sideline.preferences = {}
|
|
end
|
|
wipe(sideline.preferences)
|
|
for k,v in pairs(preferences) do
|
|
sideline.preferences[k] = v
|
|
end
|
|
else
|
|
sideline.preferences = nil
|
|
end
|
|
-- capture any potential changes in win record tab
|
|
self.WinRecord:Update()
|
|
local winrecord = self.WinRecord:Get()
|
|
if winrecord.battles>0 then
|
|
if not sideline.winrecord then
|
|
sideline.winrecord = {}
|
|
end
|
|
wipe(sideline.winrecord)
|
|
for k,v in pairs(winrecord) do
|
|
sideline.winrecord[k] = v
|
|
end
|
|
else
|
|
sideline.winrecord = nil -- no battles, delete winrecord
|
|
end
|
|
-- update layout tabs highlight for whether it has stuff and show clear button if so
|
|
self.LayoutTabs:Update()
|
|
-- update panel buttons at bottom of dialog
|
|
rematch.dialog.AcceptButton:SetEnabled((sideline.name or ""):trim():len()>0)
|
|
rematch.dialog.OtherButton:SetEnabled(not rematch.utils:AreSame(rematch.savedTeams.sideline,rematch.savedTeams.original,true))
|
|
end
|
|
|
|
-- loads the currently loaded pets and abilities into the sideline
|
|
-- if newTeam is true, then it will not use targets/preferences/winrecord/notes of currently loaded team
|
|
function rematch.saveDialog:SidelineLoadouts(newTeam)
|
|
rematch.savedTeams:Reset("sideline")
|
|
if settings.currentTeamID=="counter" then -- if sidelining a counter team, use the target's name but otherwise blank
|
|
local npcID = rematch.savedTeams.counter.targets and rematch.savedTeams.counter.targets[1]
|
|
local name = npcID and rematch.targetInfo:GetNpcName(npcID)
|
|
if npcID then -- if a legitimate target, new team will contain the target and name of target
|
|
rematch.savedTeams.sideline.targets = {npcID}
|
|
rematch.savedTeams.sideline.name = rematch.savedTeams:GetUniqueName(name)
|
|
else
|
|
rematch.savedTeams.sideline.name = rematch.savedTeams:GetUniqueName(L["New Team"])
|
|
end
|
|
rematch.savedTeams.sideline.groupID = "group:none"
|
|
elseif not newTeam and rematch.savedTeams:IsUserTeam(settings.currentTeamID) then
|
|
-- if sidelining loadouts with a team loaded, start with a copy of that team
|
|
rematch.savedTeams.sideline = rematch.savedTeams[settings.currentTeamID]
|
|
else -- for a new team, only fill in a name and group
|
|
rematch.savedTeams.sideline.name = rematch.savedTeams:GetUniqueName(L["New Team"])
|
|
rematch.savedTeams.sideline.groupID = "group:none"
|
|
end
|
|
-- next fill in current loadouts
|
|
for slot=1,3 do
|
|
local petID,ability1,ability2,ability3 = rematch.loadouts:GetSlotInfo(slot)
|
|
rematch.savedTeams.sideline.pets[slot] = petID
|
|
rematch.savedTeams.sideline.tags[slot] = rematch.petTags:Create(petID,ability1,ability2,ability3)
|
|
end
|
|
end
|
|
|
|
-- loads a teamID into the sideline (only user teams)
|
|
function rematch.saveDialog:SidelineTeamID(teamID)
|
|
assert(rematch.savedTeams:IsUserTeam(teamID),"Attempting to sideline invalid teamID "..(teamID or "nil"))
|
|
rematch.savedTeams:Reset("sideline")
|
|
rematch.savedTeams.sideline = rematch.savedTeams[teamID]
|
|
end
|
|
|
|
-- loads the string for a single team into the sideline
|
|
function rematch.saveDialog:SidelineString(teamString)
|
|
rematch.savedTeams:Reset("sideline")
|
|
end
|
|
|