Quantcast
-- ================================================================================ --
--				EMA - ( Ebony's MultiBoxing Assistant )    							--
--				Current Author: Jennifer Cally (Ebony)								--
--																					--
--				License: All Rights Reserved 2018-2020 Jennifer Cally					--
--																					--
--				Some Code Used from "Jamba" that is 								--
--				Released under the MIT License 										--
--				"Jamba" Copyright 2008-2015  Michael "Jafula" Miller				--
--																					--
-- ================================================================================ --

-- Create the addon using AceAddon-3.0 and embed some libraries.
local EMA = LibStub( "AceAddon-3.0" ):NewAddon(
	"Sync",
	"Module-1.0",
	"AceConsole-3.0",
	"AceEvent-3.0",
	"AceHook-3.0",
	"AceTimer-3.0"
)

-- Get the EMA Utilities Library.
local EMAUtilities = LibStub:GetLibrary( "EbonyUtilities-1.0" )
local EMAHelperSettings = LibStub:GetLibrary( "EMAHelperSettings-1.0" )

--  Constants and Locale for this module.
EMA.moduleName = "Sync"
EMA.settingsDatabaseName = "SyncProfileDB"
EMA.chatCommand = "ema-Sync"
local L = LibStub( "AceLocale-3.0" ):GetLocale( "Core" )
EMA.parentDisplayName = L["SYNC"]
EMA.moduleDisplayName = L["SYNC"]

-- Settings - the values to store and their defaults for the settings database.
EMA.settings = {
	profile = {
		mountWithTeam = false,
		dismountWithTeam = false,
		dismountWithMaster = false,
		mountInRange = false,

		--messageArea = EMAApi.DefaultMessageArea(),
		warningArea = EMAApi.DefaultWarningArea()
	},
}

-- Configuration.
function EMA:GetConfiguration()
	local configuration = {
		name = EMA.moduleDisplayName,
		handler = EMA,
		type = 'group',
		childGroups  = "tab",
		get = "EMAConfigurationGetSetting",
		set = "EMAConfigurationSetSetting",
		args = {
			config = {
				type = "input",
				name = L["OPEN_CONFIG"],
				desc = L["OPEN_CONFIG_HELP"],
				usage = "/ema-sync config",
				get = false,
				set = "",
			},
			push = {
				type = "input",
				name = L["Push Settings"],
				desc = L["Push the Mount settings to all characters in the team."],
				usage = "/EMA-sync push",
				get = false,
				set = "EMASendSettings",
				order = 4,
				guiHidden = true,
			},
		},
	}
	return configuration
end

-------------------------------------------------------------------------------------------------------------
-- Command this module sends.
-------------------------------------------------------------------------------------------------------------

EMA.COMMAND_MOUNT_ME = "EMAMountMe"
EMA.COMMAND_MOUNT_DISMOUNT = "EMAMountDisMount"

-------------------------------------------------------------------------------------------------------------
-- Messages module sends.
-------------------------------------------------------------------------------------------------------------


-------------------------------------------------------------------------------------------------------------
-- Addon initialization, enabling and disabling.
-------------------------------------------------------------------------------------------------------------

-- Initialise the module.
function EMA:OnInitialize()
	-- Create the settings control.
	EMA:SettingsCreate()
	-- Initialse the EMAModule part of this module.
	EMA:EMAModuleInitialize( EMA.settingsControl.widgetSettings.frame )
	-- Populate the settings.
	EMA:SettingsRefresh()
	-- BlizzUI Frames
	EMA:CreateEMAInterFaceSyncFrame()
end

-- Called when the addon is enabled.
function EMA:OnEnable()
--	EMA:RegisterEvent("PLAYER_REGEN_ENABLED")

	EMA:HookScript( InterfaceOptionsFrame, "OnShow", "InterfaceOptionsFrameOnShow" )
	EMA:RegisterMessage( EMAApi.MESSAGE_MESSAGE_AREAS_CHANGED, "OnMessageAreasChanged" )

end

-- Called when the addon is disabled.
function EMA:OnDisable()
	-- AceHook-3.0 will tidy up the hooks for us.
end

function EMA:SettingsCreate()
	EMA.settingsControl = {}
	-- Create the settings panel.
	EMAHelperSettings:CreateSettings(
		EMA.settingsControl,
		EMA.moduleDisplayName,
		EMA.parentDisplayName,
		EMA.SettingsPushSettingsClick
	)
	local bottomOfInfo = EMA:SettingsCreateMount( EMAHelperSettings:TopOfSettings() )
	EMA.settingsControl.widgetSettings.content:SetHeight( -bottomOfInfo )
	-- Help
	local helpTable = {}
	EMAHelperSettings:CreateHelp( EMA.settingsControl, helpTable, EMA:GetConfiguration() )
end

function EMA:SettingsPushSettingsClick( event )
	EMA:EMASendSettings()
end

function EMA:SettingsCreateMount( top )
	local checkBoxHeight = EMAHelperSettings:GetCheckBoxHeight()
	local left = EMAHelperSettings:LeftOfSettings()
	local headingHeight = EMAHelperSettings:HeadingHeight()
	local headingWidth = EMAHelperSettings:HeadingWidth( false )
	local dropdownHeight = EMAHelperSettings:GetDropdownHeight()
	local verticalSpacing = EMAHelperSettings:GetVerticalSpacing()
	local movingTop = top
	EMAHelperSettings:CreateHeading( EMA.settingsControl, L["PH"], movingTop, false )
	movingTop = movingTop - headingHeight
	EMA.settingsControl.checkBoxMountWithTeam = EMAHelperSettings:CreateCheckBox(
		EMA.settingsControl,
		headingWidth,
		left,
		movingTop,
		L["PH"],
		EMA.SettingsToggleMountWithTeam,
		L["PH"]
	)
	movingTop = movingTop - headingHeight
	EMA.settingsControl.checkBoxDismountWithTeam = EMAHelperSettings:CreateCheckBox(
		EMA.settingsControl,
		headingWidth,
		left,
		movingTop,
		L["PH"],
		EMA.SettingsToggleDisMountWithTeam,
		L["PH"]
	)
	movingTop = movingTop - headingHeight
	EMA.settingsControl.checkBoxDismountWithMaster = EMAHelperSettings:CreateCheckBox(
		EMA.settingsControl,
		headingWidth,
		left,
		movingTop,
		L["PH"],
		EMA.SettingsToggleDisMountWithMaster,
		L["PH"]
	)
	movingTop = movingTop - headingHeight
	EMA.settingsControl.checkBoxMountInRange = EMAHelperSettings:CreateCheckBox(
		EMA.settingsControl,
		headingWidth,
		left,
		movingTop,
		L["PH"],
		EMA.SettingsToggleMountInRange,
		L["PH"]
	)
-- DO WE NEED THIS?
--	movingTop = movingTop - checkBoxHeight
--	EMA.settingsControl.dropdownMessageArea = EMAHelperSettings:CreateDropdown(
--		EMA.settingsControl,
--		headingWidth,
--		left,
--		movingTop,
--		L["Message Area"]
--	)
--	EMA.settingsControl.dropdownMessageArea:SetList( EMAApi.MessageAreaList() )
--	EMA.settingsControl.dropdownMessageArea:SetCallback( "OnValueChanged", EMA.SettingsSetMessageArea )
	movingTop = movingTop - checkBoxHeight
	EMA.settingsControl.dropdownWarningArea = EMAHelperSettings:CreateDropdown(
		EMA.settingsControl,
		headingWidth,
		left,
		movingTop,
		L["Send Warning Area"]
	)
	EMA.settingsControl.dropdownWarningArea:SetList( EMAApi.MessageAreaList() )
	EMA.settingsControl.dropdownWarningArea:SetCallback( "OnValueChanged", EMA.SettingsSetWarningArea )
	movingTop = movingTop - dropdownHeight - verticalSpacing
	return movingTop
end

function EMA:OnMessageAreasChanged( message )
	--EMA.settingsControl.dropdownMessageArea:SetList( EMAApi.MessageAreaList() )
	EMA.settingsControl.dropdownWarningArea:SetList( EMAApi.MessageAreaList() )
end

function EMA:SettingsSetWarningArea( event, value )
	EMA.db.warningArea = value
	EMA:SettingsRefresh()
end

--function EMA:SettingsSetMessageArea( event, value )
--	EMA.db.messageArea = value
--	EMA:SettingsRefresh()
--end

function EMA:SettingsToggleMountWithTeam( event, checked )
	EMA.db.mountWithTeam = checked
	EMA:SettingsRefresh()
end

function EMA:SettingsToggleDisMountWithTeam( event, checked )
	EMA.db.dismountWithTeam = checked
	EMA:SettingsRefresh()
end

function EMA:SettingsToggleDisMountWithMaster( event, checked )
	EMA.db.dismountWithMaster = checked
	EMA:SettingsRefresh()
end

function EMA:SettingsToggleMountInRange( event, checked )
	EMA.db.mountInRange = checked
	EMA:SettingsRefresh()
end

-- Settings received.
function EMA:EMAOnSettingsReceived( characterName, settings )
	if characterName ~= EMA.characterName then
		-- Update the settings.
		EMA.db.mountWithTeam = settings.mountWithTeam
		EMA.db.dismountWithTeam = settings.dismountWithTeam
		EMA.db.dismountWithMaster = settings.dismountWithMaster
		EMA.db.mountInRange = settings.mountInRange
		EMA.db.messageArea = settings.messageArea
		EMA.db.warningArea = settings.warningArea
		-- Refresh the settings.
		EMA:SettingsRefresh()
		-- Tell the player.
		EMA:Print( L["Settings received from A."]( characterName ) )
	end
end

function EMA:BeforeEMAProfileChanged()
end

function EMA:OnEMAProfileChanged()
	EMA:SettingsRefresh()
end

function EMA:SettingsRefresh()
	EMA.settingsControl.checkBoxMountWithTeam:SetValue( EMA.db.mountWithTeam )
	EMA.settingsControl.checkBoxDismountWithTeam:SetValue( EMA.db.dismountWithTeam )
	EMA.settingsControl.checkBoxDismountWithMaster:SetValue( EMA.db.dismountWithMaster )
	EMA.settingsControl.checkBoxMountInRange:SetValue( EMA.db.mountInRange )
	--EMA.settingsControl.dropdownMessageArea:SetValue( EMA.db.messageArea )
	EMA.settingsControl.dropdownWarningArea:SetValue( EMA.db.warningArea )
	-- Set state.
	--EMA.settingsControl.checkBoxMountWithTeam:SetDisabled( not EMA.db.mountWithTeam )
	EMA.settingsControl.checkBoxDismountWithTeam:SetDisabled( not EMA.db.mountWithTeam )
	EMA.settingsControl.checkBoxDismountWithMaster:SetDisabled( not EMA.db.dismountWithTeam or not EMA.db.mountWithTeam )
	EMA.settingsControl.checkBoxMountInRange:SetDisabled( not EMA.db.mountWithTeam )
end

-------------------------------------------------------------------------------------------------------------
-- EMASync functionality.
-------------------------------------------------------------------------------------------------------------

--Frames Buttons

function EMA:ShowTooltip(frame, show, text)
	if show then
		GameTooltip:SetOwner(frame, "ANCHOR_TOP")
		GameTooltip:SetPoint("TOPLEFT", frame, "TOPRIGHT", 16, 0)
		GameTooltip:ClearLines()
		GameTooltip:AddLine( text , 1, 0.82, 0, 1)
		GameTooltip:Show()
	else
	GameTooltip:Hide()
	end
end


function EMA:CreateEMAInterFaceSyncFrame()
	EMAInterFaceSyncFrame = CreateFrame( "Frame", "InterFaceSyncFrame", InterfaceOptionsFrame )
    local frame = EMAInterFaceSyncFrame
	frame:SetWidth( 110 )
	frame:SetHeight( 30 )
	frame:SetFrameStrata( "HIGH" )
	frame:SetToplevel( true )
	frame:SetClampedToScreen( true )
	frame:EnableMouse( true )
	frame:SetMovable( true )
	frame:ClearAllPoints()
	frame:SetPoint("TOPRIGHT", InterfaceOptionsFrame, "TOPRIGHT", -5, -8 )
	--[[
		frame:SetBackdrop( {
		bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background",
		edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
		tile = true, tileSize = 15, edgeSize = 15,
		insets = { left = 5, right = 5, top = 5, bottom = 5 }
	} )
	]]
	table.insert( UISpecialFrames, "EMAInterFaceSyncFrame" )
	local syncButton = CreateFrame( "Button", "syncButton", frame, "UIPanelButtonTemplate" )
	syncButton:SetScript( "OnClick", function()  EMA:DoSyncInterfaceSettings() end )
	syncButton:SetPoint( "TOPLEFT", frame, "TOPLEFT", 10 , -5)
	syncButton:SetHeight( 20 )
	syncButton:SetWidth( 90 )
	syncButton:SetText( L["SYNC"] )
	syncButton:SetScript("OnEnter", function(self) EMA:ShowTooltip(syncButton, true, L["SYNC"] ) end)
	syncButton:SetScript("OnLeave", function(self) GameTooltip:Hide() end)
	syncButtonFrameButton = syncButton

end

function EMA:InterfaceOptionsFrameOnShow()
	--EMA:Print("test")
	-- This sorts out hooking on L or marcioMenu button
	--if EMA.db.showEMAQuestLogWithWoWQuestLog == true then
		if InterfaceOptionsFrame:IsVisible() then
			EMA:ToggleShowSyncInterfaceFrame( true )
		else
			EMA:ToggleShowSyncInterfaceFrame( false )
		end
	--end
end


function EMA:ToggleShowSyncInterfaceFrame( show )
    if show == true then
		EMAInterFaceSyncFrame:Show()
    else
		EMAInterFaceSyncFrame:Hide()
    end
end

function EMA:DoSyncInterfaceSettings()
    EMA:Print("[PH] Button Does Nothing" )
end


-- COMMS

-- A EMA command has been received.
function EMA:EMAOnCommandReceived( characterName, commandName, ... )
	if characterName ~= self.characterName then
		--[[
		if commandName == EMA.COMMAND_MOUNT_ME then
			--EMA:Print("command")
			EMA:TeamMount( characterName, ... )
		end
		]]
	end
end