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.

226 lines
7.4 KiB

-- Dialog.lua: the ShowDialog() and support functions
local _,L = ...
local rematch = Rematch
local dialog = RematchDialog
dialog.context = {} -- wiped when a dialog is shown, used by SetContext(var,value) and GetContext(var)
-- list of widgets reused. custom ones should use dialog:RegisterWidget("name")
dialog.widgets = { "Pet", "Warning", "EditBox", "Slot", "TeamTabIconPicker", "Text",
"Team", "OldTeam", "SaveAs", "Preferences", "CheckButton", "Share", "TabPicker",
"ConflictRadios", "Send", "ShareIncludes", "CollectionReport", "ScaleSlider",
"ScriptFilter", "MultiLine", "SmallText",
}
rematch:InitModule(function()
rematch.Dialog = dialog
local petButton = dialog.Pet.Pet
petButton.noPickup = true -- don't allow pickup or right-click or dialog pet
petButton:SetScript("OnEnter",function(self) rematch:ShowPetCard(self,self.petID) end)
petButton:SetScript("OnLeave",function(self) rematch:HidePetCard(true) end)
petButton:SetScript("OnClick",function(self,button) rematch.PetListButtonOnClick(self,button) end)
dialog.TabPicker.Label:SetText(L["Tab:"])
rematch:ConvertTitlebarCloseButton(dialog.CloseButton)
end)
-- dialogName: a string to reference the dialog (rematch:IsDialogOpen("SaveDialog"))
-- width: any but recommend 300 for minimum (that fits third button)
-- height: any
-- title: string to display in titlebar of dialog
-- prompt: string to display in a "separate" inset at bottom of dialog (bottom y is 52 when this used)
-- acceptText: text to put in the second button to do whatever dialog is meant to do
-- acceptFunc: function to run when accept button is clicked
-- cancelText: text to put in the bottomright button to dismiss the dialog and cancel its action
-- cancelFunc: function to run when cancel button clicked or dialog dismissed/hidden
-- otherText: text to put in the bottomleft button for some other action (default name for renaming)
-- otherFunc: function to do when other button is clicked (note this doesn't prevent cancelFunc!)
function rematch:ShowDialog(dialogName,width,height,title,prompt,acceptText,acceptFunc,cancelText,cancelFunc,otherText,otherFunc)
dialog:ResetAll()
rematch:HideWidgets()
rematch:HideNotes()
-- set stuff passed as parameters
dialog.name = dialogName
dialog:SetSize(width or 300,height or 320)
dialog.Title:SetText(title)
dialog.Prompt:SetShown(prompt and true)
dialog.Prompt.Text:SetText(prompt or "")
dialog.Accept:SetShown(acceptText and true)
dialog.Accept:SetText(acceptText or "")
dialog.acceptFunc = acceptFunc
dialog.Cancel:SetText(cancelText)
dialog.cancelFunc = cancelFunc
dialog.Other:SetShown(otherText and true)
dialog.Other:SetText(otherText or "")
dialog.otherFunc = otherFunc
dialog:Show()
dialog.dialogName = dialogName
return dialog
end
function rematch:HideDialog()
dialog:Hide()
end
function dialog:OnHide()
rematch.timeUIChanged = GetTime()
if dialog.cancelFunc then
dialog.cancelFunc()
end
end
-- click of the Accept button at bottom of dialog
function dialog:AcceptOnClick()
if dialog.Accept:IsEnabled() then
dialog.cancelFunc = nil -- don't run the cancelFunc if accept clicked
dialog:Hide()
if dialog.acceptFunc then
dialog.acceptFunc()
end
end
end
function dialog:OtherOnClick()
if dialog.Other:IsEnabled() and dialog.otherFunc then
dialog.otherFunc()
end
end
-- returns true if name (ie "SaveAs") is visible; or any dialog if name not given
function rematch:IsDialogOpen(name)
if name then
return dialog:IsVisible() and dialog.dialogName==name
else
return dialog:IsVisible()
end
end
-- hides/unanchors/wipes/resets widgets and script handlers for a clean slate
function dialog:ResetAll()
wipe(dialog.context)
for _,widget in ipairs(dialog.widgets) do
dialog[widget]:Hide()
dialog[widget]:ClearAllPoints()
end
dialog.acceptFunc = nil
dialog.otherFunc = nil
dialog.EditBox:SetWidth(220)
dialog.EditBox:SetScript("OnTextChanged",dialog.EditBoxOnTextChanged)
dialog.EditBox:SetText("")
dialog.EditBox:SetScript("OnEnterPressed",dialog.EditBoxOnEnterPressed)
dialog.EditBox:SetScript("OnEscapePressed",dialog.EditBoxOnEscapePressed)
dialog.Accept:SetEnabled(true)
dialog.Other:SetEnabled(true)
dialog.Text:SetText("")
dialog.Text:SetFontObject(GameFontNormal)
dialog.Text:SetJustifyH("CENTER")
dialog.CheckButton.text:SetText("")
dialog.CheckButton.text:SetFontObject(GameFontNormal)
dialog.CheckButton:SetScript("OnClick",nil)
dialog.CheckButton:SetChecked(false)
dialog.CheckButton.tooltipTitle = nil
dialog.CheckButton.tooltipBody = nil
dialog.MultiLine.EditBox:SetScript("OnTextChanged",nil)
dialog.MultiLine.EditBox:SetText("")
dialog.MultiLine.EditBox:SetScript("OnEscapePressed",dialog.EditBoxOnEscapePressed)
dialog.MultiLine.EditBox:SetScript("OnEditFocusGained",nil)
end
function dialog:RegisterWidget(name)
tinsert(dialog.widgets,name)
end
function dialog:OnKeyDown(key)
if key==GetBindingKey("TOGGLEGAMEMENU") then
if rematch:IsDialogOpen("ScriptFilterDialog") and dialog.ScriptFilter.referenceOpen then
dialog.ScriptFilter:HideReference() -- if script filter open, hide reference
else
dialog:Hide() -- otherwise hide menu but don't pass ESC along
end
self:SetPropagateKeyboardInput(false)
else -- ESC not hit, send it along
self:SetPropagateKeyboardInput(true)
end
end
-- default behavior of EditBox: disable Accept if it's empty
function dialog:EditBoxOnTextChanged()
dialog.Accept:SetEnabled(self:GetText():trim():len()>0)
end
function dialog:EditBoxOnEnterPressed()
if dialog.Accept:IsEnabled() then
dialog.Accept:Click()
end
end
function dialog:EditBoxOnEscapePressed()
dialog:Hide()
end
function dialog:SetContext(var,value)
dialog.context[var] = value
return value
end
function dialog:GetContext(var)
return dialog.context[var]
end
function dialog:FillTeam(frame,team)
local saved = RematchSaved
for i=1,3 do
rematch:FillPetSlot(frame.Pets[i],team[i][1])
if frame.Pets[i].Missing then
frame.Pets[i].Missing:Hide()
end
for j=1,3 do
local button = frame.Pets[i].Abilities[j]
local abilityID = team[i][j+1]
if abilityID and abilityID~=0 then
button.abilityID = abilityID
button.Icon:SetTexture((select(3,C_PetBattles.GetAbilityInfoByID(abilityID))))
button.Icon:SetTexCoord(0.075,0.925,0.075,0.925)
else
button.abilityID = nil
button.Icon:SetTexture("Interface\\Buttons\\UI-EmptySlot-Disabled")
button.Icon:SetTexCoord(0.21875,0.765625,0.21875,0.765625)
end
end
end
end
-- sets dialog.Text to test, sizes to cx,cy dimensions and anchors it to ...
function dialog:ShowText(text,cx,cy,...)
dialog.Text:SetSize(cx,cy)
dialog.Text:SetText(text)
dialog.Text:SetPoint(...)
dialog.Text:Show()
end
function dialog:UpdateTabPicker()
local index = rematch.TeamTabs:GetSelectedTab()
local settings = RematchSettings
dialog.TabPicker.Text:SetText(settings.TeamGroups[index][1])
dialog.TabPicker.Icon:SetTexture(settings.TeamGroups[index][2])
local team = rematch:GetSideline()
if team then
team.tab = index>1 and index or nil
end
end
function dialog.TabPicker:OnClick()
rematch:ToggleMenu("TabPick","TOPRIGHT",self,"BOTTOMRIGHT",0,2)
end
function dialog:CancelOnClick()
if rematch:IsDialogOpen("ScriptFilterDialog") and dialog.ScriptFilter.referenceOpen then
dialog.ScriptFilter:HideReference()
else
dialog:Hide()
end
end