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.

405 lines
11 KiB

local SLE, T, E, L, V, P, G = unpack(select(2, ...))
local B = SLE.Blizzard
local _G = _G
--Frames to move
B.Frames = {
AddonList = true,
AudioOptionsFrame = true,
BankFrame = true,
CharacterFrame = true,
ChatConfigFrame = true,
DressUpFrame = true,
FriendsFrame = true,
FriendsFriendsFrame = true,
GameMenuFrame = true,
GhostFrame = true,
GossipFrame = true,
GuildInviteFrame = true,
GuildRegistrarFrame = true,
HelpFrame = true,
InterfaceOptionsFrame = true,
ItemTextFrame = true,
LFDRoleCheckPopup = true,
LFGDungeonReadyDialog = true,
LFGDungeonReadyStatus = true,
LootFrame = true,
MailFrame = true,
MerchantFrame = true,
PVEFrame = true,
PetStableFrame = true,
PetitionFrame = true,
PVPReadyDialog = true,
QuestFrame = true,
QuestLogPopupDetailFrame = true,
RaidBrowserFrame = true,
RaidInfoFrame = true,
RaidParentFrame = true,
ReadyCheckFrame = true,
ReportCheatingDialog = true,
RolePollPopup = true,
SpellBookFrame = true,
SplashFrame = true,
StackSplitFrame = true,
TabardFrame = true,
TaxiFrame = true,
TimeManagerFrame = true,
TradeFrame = true,
TutorialFrame = true,
VideoOptionsFrame = true,
WorldMapFrame = true,
}
--These should be only temporary movable due to complications
B.TempOnly = {
BonusRollFrame = true,
BonusRollLootWonFrame = true,
BonusRollMoneyWonFrame = true,
}
--Blizz addons that load later
B.AddonsList = {
Blizzard_AchievementUI = {
AchievementFrame = true,
},
Blizzard_AlliedRacesUI = {
AlliedRacesFrame = true,
},
Blizzard_ArchaeologyUI = {
ArchaeologyFrame = true,
},
Blizzard_AuctionUI = {
AuctionFrame = true,
},
Blizzard_AuctionHouseUI = {
AuctionHouseFrame = true,
},
Blizzard_AzeriteUI = {
AzeriteEmpoweredItemUI = true,
},
Blizzard_BarberShopUI = {
BarberShopFrame = true,
},
Blizzard_BindingUI = {
KeyBindingFrame = true,
},
Blizzard_BlackMarketUI = {
BlackMarketFrame = true,
},
Blizzard_Calendar = {
CalendarCreateEventFrame = true,
CalendarFrame = true,
},
Blizzard_ChallengesUI = {
ChallengesKeystoneFrame = true,
-- ChallengesLeaderboardFrame = false,
},
Blizzard_Channels = {
ChannelFrame = true,
},
Blizzard_Collections = {
CollectionsJournal = false,
WardrobeFrame = true,
},
Blizzard_Communities = {
CommunitiesFrame = true,
},
Blizzard_CovenantSanctum = {
CovenantSanctumFrame = true,
},
Blizzard_EncounterJournal = {
EncounterJournal = true,
},
Blizzard_GarrisonUI = {
GarrisonLandingPage = true,
GarrisonMissionFrame = true,
GarrisonCapacitiveDisplayFrame = true,
GarrisonBuildingFrame = true,
GarrisonRecruiterFrame = true,
GarrisonRecruitSelectFrame = true,
GarrisonShipyardFrame = true,
OrderHallMissionFrame = true,
BFAMissionFrame = true,
CovenantMissionFrame = true,
},
Blizzard_GMChatUI = {
GMChatStatusFrame = true,
},
Blizzard_GMSurveyUI = {
GMSurveyFrame = true,
},
Blizzard_GuildBankUI = {
GuildBankFrame = true,
},
Blizzard_GuildControlUI = {
GuildControlUI = true,
},
Blizzard_GuildUI = {
GuildFrame = true,
GuildLogFrame = true,
},
Blizzard_InspectUI = {
InspectFrame = true,
},
Blizzard_ItemAlterationUI = {
TransmogrifyFrame = true,
},
Blizzard_ItemSocketingUI = {
ItemSocketingFrame = true,
},
Blizzard_ItemUpgradeUI = {
ItemUpgradeFrame = true,
},
-- Blizzard_LookingForGuildUI = {
-- LookingForGuildFrame = true,
-- },
Blizzard_MacroUI = {
MacroFrame = true,
},
Blizzard_OrderHallUI = {
OrderHallTalentFrame = true,
},
Blizzard_QuestChoice = {
QuestChoiceFrame = true,
},
Blizzard_Soulbinds = {
SoulbindViewer = true,
},
Blizzard_ScrappingMachineUI = {
ScrappingMachineFrame = true,
},
Blizzard_TalentUI = {
PlayerTalentFrame = true,
},
Blizzard_TradeSkillUI = {
TradeSkillFrame = true,
},
Blizzard_TrainerUI = {
ClassTrainerFrame = true,
},
Blizzard_VoidStorageUI = {
VoidStorageFrame = true,
},
}
--These should not be on screen at the same time
B.ExlusiveFrames = {
QuestFrame = { 'GossipFrame', },
GossipFrame = { 'QuestFrame', },
GameMenuFrame = { 'VideoOptionsFrame', 'InterfaceOptionsFrame', 'HelpFrame',},
VideoOptionsFrame = { 'GameMenuFrame',},
InterfaceOptionsFrame = { 'GameMenuFrame',},
HelpFrame = { 'GameMenuFrame',},
}
--Don't even ask
B.FramesAreaAlter = {
GarrisonMissionFrame = 'left',
OrderHallMissionFrame = 'left',
BFAMissionFrame = 'left',
}
B.SpecialDefaults = {
GarrisonMissionFrame = { 'CENTER', _G.UIParent, 'CENTER', 0, 0 },
OrderHallMissionFrame = { 'CENTER', _G.UIParent, 'CENTER', 0, 0 },
BFAMissionFrame = { 'CENTER', _G.UIParent, 'CENTER', 0, 0 },
}
B.OriginalDefaults = {} --Don't even ask 2: The Reckoning
local function OnDragStart(self)
if _G.UnitAffectingCombat('player') then return end --Not allowed to move in combat, cause reasons.
local Name = self:GetName()
if not E.private.sle.module.blizzmove.remember and not B.OriginalDefaults[Name] then --Don't even ask 3: Return of the bullshit
local a, _, c, d, e = self:GetPoint()
local b = self:GetParent():GetName() or _G.UIParent
B.OriginalDefaults[Name] = {a, b, c, d, e}
end
self.IsMoving = true
self:StartMoving()
end
--When stop moving (or hiding), remember frame's positions.
local function OnDragStop(self)
self:StopMovingOrSizing()
local Name = self:GetName()
if E.private.sle.module.blizzmove.remember and not B.TempOnly[Name] then --Saving positions only if option is enabled and frame is not temporary movable
local a, _, c, d, e = self:GetPoint()
local b = self:GetParent():GetName() or _G.UIParent
if Name == 'QuestFrame' or Name == 'GossipFrame' then --These 2 frames should always be in the same place. So having coordinates for them at the same time
E.private.sle.module.blizzmove.points['GossipFrame'] = {a, b, c, d, e}
E.private.sle.module.blizzmove.points['QuestFrame'] = {a, b, c, d, e}
else
E.private.sle.module.blizzmove.points[Name] = {a, b, c, d, e}
end
self:SetUserPlaced(true)
elseif self:IsUserPlaced() then --Unfuck the game
self:ClearAllPoints()
self:SetUserPlaced(false)
end
self.IsMoving = false
end
--On show set saved position
local function LoadPosition(self)
if self.IsMoving == true then return end
local Name = self:GetName()
if not self:GetPoint() then --Some frames don't have set positions when show script runs (e.g. CharacterFrame). For those set default position and save that.
if B.SpecialDefaults[Name] then
local a,b,c,d,e = unpack(B.SpecialDefaults[Name])
self:SetPoint(a,b,c,d,e, true)
elseif B.OriginalDefaults[Name] then
local a,b,c,d,e = unpack(B.OriginalDefaults[Name])
self:SetPoint(a,b,c,d,e, true)
else
self:SetPoint('TOPLEFT', UIParent, 'TOPLEFT', 16, -116, true)
end
OnDragStop(self)
end
if E.private.sle.module.blizzmove.remember and E.private.sle.module.blizzmove.points[Name] then
self:ClearAllPoints()
local a,b,c,d,e = unpack(E.private.sle.module.blizzmove.points[Name])
self:SetPoint(a,b,c,d,e, true)
end
if B.ExlusiveFrames[Name] then for _, name in pairs(B.ExlusiveFrames[Name]) do _G[name]:Hide() end end --If this frame has others that should not be shown at the same time, hide those
end
--Hooking this to movable frames' SetPoint.
--Blizz love to move some frames when stuff happens, so if SetPoint is not passing an additional arg we call SetPoint again with saved position.
function B:RewritePoint(anchor, parent, point, x, y, SLEcalled)
if not SLEcalled then LoadPosition(self) end
end
function B:MakeMovable(Name, AddOn)
if Name == true then
E:Delay(1, function() B:Addons(nil, AddOn) end)
return
end
local frame = _G[Name]
if not frame then --Frame in the list was removed since the last time I checked
SLE:Print("Frame to move doesn't exist: "..(Name or 'Unknown'), 'error')
return
end
if Name == 'AchievementFrame' then AchievementFrameHeader:EnableMouse(false) end --Cause achievement frame is a bitch
frame:EnableMouse(true)
frame:SetMovable(true)
frame:SetClampedToScreen(true)
frame:RegisterForDrag('LeftButton')
frame:HookScript('OnShow', LoadPosition)
frame:HookScript('OnDragStart', OnDragStart)
frame:HookScript('OnDragStop', OnDragStop)
frame:HookScript('OnHide', OnDragStop)
hooksecurefunc(frame, 'SetPoint', B.RewritePoint)
end
function B:Addons(event, addon)
if not B.AddonsList[addon] then return end
if type(B.AddonsList[addon]) == 'table' then
for FrameName, state in pairs(B.AddonsList[addon]) do
if state then B:MakeMovable(FrameName, addon) end
end
else
if B.AddonsList[addon] then B:MakeMovable(addon) end
end
B.addonCount = B.addonCount + 1
--If every blizz addon is loaded we don't need to listen to these event
if B.addonCount == #B.AddonsList then B:UnregisterEvent(event) end
end
function B:ErrorFrameSize()
_G.UIErrorsFrame:SetSize(B.db.errorframe.width, B.db.errorframe.height) --512 x 60
end
local function CompatibilityChecks()
if SLE._Compatibility['Mapster'] then B.Frames['WorldMapFrame'] = false end
if SLE._Compatibility['TradeSkillMaster'] then B.Frames['MerchantFrame'] = false end
end
function B:SLETalkingHead()
if E.db.sle.skins.talkinghead.hide then
E:DisableMover(_G.TalkingHeadFrame.mover:GetName())
else
E:EnableMover(_G.TalkingHeadFrame.mover:GetName())
end
end
function B:UpdateAll()
B.db = E.db.sle.blizzard
B:ErrorFrameSize()
B:SLETalkingHead()
end
local f = CreateFrame('Frame')
f:RegisterEvent('PLAYER_ENTERING_WORLD')
f:RegisterEvent('ADDON_LOADED')
f:SetScript('OnEvent', function(self, event, addon)
-- SLE:Print('PEW Function Hooked')
if event == 'PLAYER_ENTERING_WORLD' and IsAddOnLoaded('Blizzard_TalkingHeadUI') then
hooksecurefunc('TalkingHeadFrame_PlayCurrent', function()
-- SLE:Print('TalkingHead Frame initilized PlayCurrent function from PEW hook')
if E.db.sle.skins.talkinghead.hide then
_G.TalkingHeadFrame:Hide()
end
end)
self:UnregisterEvent(event)
end
if event == 'ADDON_LOADED' and addon == 'Blizzard_TalkingHeadUI' then
hooksecurefunc('TalkingHeadFrame_PlayCurrent', function()
-- SLE:Print('TalkingHead Frame initilized PlayCurrent function from ADDONLOADED hook')
if E.db.sle.skins.talkinghead.hide then
_G.TalkingHeadFrame:Hide()
end
end)
self:UnregisterEvent(event)
end
end)
function B:Initialize()
B.db = E.db.sle.blizzard
if not SLE.initialized then return end
B.addonCount = 0
PVPReadyDialog:Hide()
if E.private.sle.module.blizzmove.enable then
CompatibilityChecks()
for FrameName, state in pairs(B.Frames) do
if state then B:MakeMovable(FrameName) end
end
self:RegisterEvent('ADDON_LOADED', 'Addons')
-- Check Forced Loaded AddOns
for AddOn, Table in pairs(B.AddonsList) do
if IsAddOnLoaded(AddOn) then
for _, frame in pairs(Table) do
B:MakeMovable(frame, AddOn)
end
end
end
--Removing stuff from auto positioning
self:Hook('UIParent_ManageFramePosition', function()
for FrameName, state in pairs(B.Frames) do
local frame = _G[FrameName]
if state and frame and frame:IsShown() then
if FrameName == 'CharacterFrame' or FrameName == 'WorldMapFrame' then return end
LoadPosition(frame)
end
end
end, true)
end
B:ErrorFrameSize()
SLE.UpdateFunctions["Blizzard"] = B.UpdateAll
B:SLETalkingHead()
end
SLE:RegisterModule(B:GetName())