COMBATLOG_FILTERS_TO_DISPLAY = 4; CHATCONFIG_FILTER_HEIGHT = 16; GRAY_CHECKED = 1; UNCHECKED_ENABLED = 2; UNCHECKED_DISABLED = 3; CHATCONFIG_SELECTED_FILTER = nil; CHATCONFIG_SELECTED_FILTER_FILTERS = nil; CHATCONFIG_SELECTED_FILTER_COLORS = nil; CHATCONFIG_SELECTED_FILTER_SETTINGS = nil; CHATCONFIG_SELECTED_FILTER_OLD_SETTINGS = nil; MAX_COMBATLOG_FILTERS = 20; CHATCONFIG_CHANNELS_MAXWIDTH = 145; --Chat options CHAT_CONFIG_CHAT_LEFT = { [1] = { type = "SAY", checked = function () return IsListeningForMessageType("SAY"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "SAY"); end; }, [2] = { type = "EMOTE", checked = function () return IsListeningForMessageType("EMOTE"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "EMOTE"); end; }, [3] = { type = "YELL", checked = function () return IsListeningForMessageType("YELL"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "YELL"); end; }, [4] = { text = GUILD_CHAT, type = "GUILD", checked = function () return IsListeningForMessageType("GUILD"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "GUILD"); end; }, [5] = { text = OFFICER_CHAT, type = "OFFICER", checked = function () return IsListeningForMessageType("OFFICER"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "OFFICER"); end; }, [6] = { type = "GUILD_ACHIEVEMENT", checked = function () return IsListeningForMessageType("GUILD_ACHIEVEMENT"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "GUILD_ACHIEVEMENT"); end; }, [7] = { type = "ACHIEVEMENT", checked = function () return IsListeningForMessageType("ACHIEVEMENT"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "ACHIEVEMENT"); end; }, [8] = { type = "WHISPER", checked = function () return IsListeningForMessageType("WHISPER"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "WHISPER"); end; }, [9] = { type = "BN_WHISPER", noClassColor = 1, checked = function () return IsListeningForMessageType("BN_WHISPER"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "BN_WHISPER"); end; }, [10] = { type = "PARTY", checked = function () return IsListeningForMessageType("PARTY"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "PARTY"); end; }, [11] = { type = "PARTY_LEADER", checked = function () return IsListeningForMessageType("PARTY_LEADER"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "PARTY_LEADER"); end; }, [12] = { type = "RAID", checked = function () return IsListeningForMessageType("RAID"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "RAID"); end; }, [13] = { type = "RAID_LEADER", checked = function () return IsListeningForMessageType("RAID_LEADER"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "RAID_LEADER"); end; }, [14] = { type = "RAID_WARNING", checked = function () return IsListeningForMessageType("RAID_WARNING"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "RAID_WARNING"); end; }, [15] = { type = "BATTLEGROUND", checked = function () return IsListeningForMessageType("BATTLEGROUND"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "BATTLEGROUND"); end; }, [16] = { type = "BATTLEGROUND_LEADER", checked = function () return IsListeningForMessageType("BATTLEGROUND_LEADER"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "BATTLEGROUND_LEADER"); end; }, [17] = { type = "BN_CONVERSATION", noClassColor = 1, checked = function () return IsListeningForMessageType("BN_CONVERSATION"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "BN_CONVERSATION"); end; }, }; CHAT_CONFIG_CHAT_CREATURE_LEFT = { [1] = { text = SAY; type = "MONSTER_SAY", checked = function () return IsListeningForMessageType("MONSTER_SAY"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "MONSTER_SAY"); end; }, [2] = { text = EMOTE; type = "MONSTER_EMOTE", checked = function () return IsListeningForMessageType("MONSTER_EMOTE"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "MONSTER_EMOTE"); end; }, [3] = { text = YELL; type = "MONSTER_YELL", checked = function () return IsListeningForMessageType("MONSTER_YELL"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "MONSTER_YELL"); end; }, [4] = { text = WHISPER; type = "MONSTER_WHISPER", checked = function () return IsListeningForMessageType("MONSTER_WHISPER"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "MONSTER_WHISPER"); end; }, [5] = { type = "MONSTER_BOSS_EMOTE", checked = function () return IsListeningForMessageType("MONSTER_BOSS_EMOTE"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "MONSTER_BOSS_EMOTE"); end; }, [6] = { type = "MONSTER_BOSS_WHISPER", checked = function () return IsListeningForMessageType("MONSTER_BOSS_WHISPER"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "MONSTER_BOSS_WHISPER"); end; } }; CHAT_CONFIG_OTHER_COMBAT = { [1] = { type = "COMBAT_XP_GAIN", checked = function () return IsListeningForMessageType("COMBAT_XP_GAIN"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "COMBAT_XP_GAIN"); end; }, [2] = { type = "COMBAT_HONOR_GAIN", checked = function () return IsListeningForMessageType("COMBAT_HONOR_GAIN"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "COMBAT_HONOR_GAIN"); end; }, [3] = { type = "COMBAT_FACTION_CHANGE", checked = function () return IsListeningForMessageType("COMBAT_FACTION_CHANGE"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "COMBAT_FACTION_CHANGE"); end; }, [4] = { text = SKILLUPS, type = "SKILL", checked = function () return IsListeningForMessageType("SKILL"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "SKILL"); end; }, [5] = { text = ITEM_LOOT, type = "LOOT", checked = function () return IsListeningForMessageType("LOOT"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "LOOT"); end; }, [6] = { text = MONEY_LOOT, type = "MONEY", checked = function () return IsListeningForMessageType("MONEY"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "MONEY"); end; }, [7] = { type = "TRADESKILLS", checked = function () return IsListeningForMessageType("TRADESKILLS"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "TRADESKILLS"); end; }, [8] = { type = "OPENING", checked = function () return IsListeningForMessageType("OPENING"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "OPENING"); end; }, [9] = { type = "PET_INFO", checked = function () return IsListeningForMessageType("PET_INFO"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "PET_INFO"); end; }, [10] = { type = "COMBAT_MISC_INFO", checked = function () return IsListeningForMessageType("COMBAT_MISC_INFO"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "COMBAT_MISC_INFO"); end; }, }; CHAT_CONFIG_OTHER_PVP = { [1] = { type = "BG_SYSTEM_HORDE", checked = function () return IsListeningForMessageType("BG_HORDE"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "BG_HORDE"); end; }, [2] = { type = "BG_SYSTEM_ALLIANCE", checked = function () return IsListeningForMessageType("BG_ALLIANCE"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "BG_ALLIANCE"); end; }, [3] = { type = "BG_SYSTEM_NEUTRAL", checked = function () return IsListeningForMessageType("BG_NEUTRAL"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "BG_NEUTRAL"); end; }, } CHAT_CONFIG_OTHER_SYSTEM = { [1] = { text = SYSTEM_MESSAGES, type = "SYSTEM", checked = function () return IsListeningForMessageType("SYSTEM"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "SYSTEM"); end; }, [2] = { type = "ERRORS", checked = function () return IsListeningForMessageType("ERRORS"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "ERRORS"); end; }, [3] = { type = "IGNORED", checked = function () return IsListeningForMessageType("IGNORED"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "IGNORED"); end; }, [4] = { type = "CHANNEL", checked = function () return IsListeningForMessageType("CHANNEL"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "CHANNEL"); end; }, [5] = { type = "TARGETICONS", checked = function () return IsListeningForMessageType("TARGETICONS"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "TARGETICONS"); end; }, [6] = { type = "BN_INLINE_TOAST_ALERT", checked = function () return IsListeningForMessageType("BN_INLINE_TOAST_ALERT"); end; func = function (self, checked) ToggleChatMessageGroup(checked, "BN_INLINE_TOAST_ALERT"); end; }, } CHAT_CONFIG_CHANNEL_LIST = {}; -- Combat Options COMBAT_CONFIG_MESSAGESOURCES_BY = { [1] = { text = function () return ( UsesGUID("SOURCE") and COMBATLOG_FILTER_STRING_CUSTOM_UNIT or COMBATLOG_FILTER_STRING_ME); end; checked = function () return UsesGUID("SOURCE") or IsMessageDoneBy(COMBATLOG_FILTER_MINE); end; disabled = function () return UsesGUID("SOURCE"); end; func = function (self, checked) ToggleMessageSource(checked, COMBATLOG_FILTER_MINE); end; tooltip = FILTER_BY_ME_COMBATLOG_TOOLTIP; --Don't need to change tooltip because if it is the dummy box, it is disabled which means no tooltip }, [2] = { text = COMBATLOG_FILTER_STRING_MY_PET, checked = function () return IsMessageDoneBy(COMBATLOG_FILTER_MY_PET); end; hidden = function () return UsesGUID("SOURCE"); end; func = function (self, checked) ToggleMessageSource(checked, COMBATLOG_FILTER_MY_PET); end; tooltip = FILTER_BY_PET_COMBATLOG_TOOLTIP; }, [3] = { text = COMBATLOG_FILTER_STRING_FRIENDLY_UNITS, checked = function () return IsMessageDoneBy(COMBATLOG_FILTER_FRIENDLY_UNITS); end; hidden = function () return UsesGUID("SOURCE"); end; func = function (self, checked) ToggleMessageSource(checked, COMBATLOG_FILTER_FRIENDLY_UNITS); end; tooltip = FILTER_BY_FRIENDS_COMBATLOG_TOOLTIP; }, [4] = { text = COMBATLOG_FILTER_STRING_HOSTILE_PLAYERS, checked = function () return IsMessageDoneBy(COMBATLOG_FILTER_HOSTILE_PLAYERS); end; hidden = function () return UsesGUID("SOURCE"); end; func = function (self, checked) ToggleMessageSource(checked, COMBATLOG_FILTER_HOSTILE_PLAYERS); end; tooltip = FILTER_BY_HOSTILE_PLAYERS_COMBATLOG_TOOLTIP; }, [5] = { text = COMBATLOG_FILTER_STRING_HOSTILE_UNITS, checked = function () return IsMessageDoneBy(COMBATLOG_FILTER_HOSTILE_UNITS); end; hidden = function () return UsesGUID("SOURCE"); end; func = function (self, checked) ToggleMessageSource(checked, COMBATLOG_FILTER_HOSTILE_UNITS); end; tooltip = FILTER_BY_ENEMIES_COMBATLOG_TOOLTIP; }, [6] = { text = COMBATLOG_FILTER_STRING_NEUTRAL_UNITS, checked = function () return IsMessageDoneBy(COMBATLOG_FILTER_NEUTRAL_UNITS); end; hidden = function () return UsesGUID("SOURCE"); end; func = function (self, checked) ToggleMessageSource(checked, COMBATLOG_FILTER_NEUTRAL_UNITS); end; tooltip = FILTER_BY_NEUTRAL_COMBATLOG_TOOLTIP; }, [7] = { text = COMBATLOG_FILTER_STRING_UNKNOWN_UNITS, checked = function () return IsMessageDoneBy(COMBATLOG_FILTER_UNKNOWN_UNITS); end; hidden = function () return UsesGUID("SOURCE"); end; func = function (self, checked) ToggleMessageSource(checked, COMBATLOG_FILTER_UNKNOWN_UNITS); end; tooltip = FILTER_BY_UNKNOWN_COMBATLOG_TOOLTIP; }, } COMBAT_CONFIG_MESSAGESOURCES_TO = { [1] = { text = function () return ( UsesGUID("DEST") and COMBATLOG_FILTER_STRING_CUSTOM_UNIT or COMBATLOG_FILTER_STRING_ME); end; checked = function () return UsesGUID("DEST") or IsMessageDoneTo(COMBATLOG_FILTER_MINE); end; disabled = function () return UsesGUID("DEST"); end; func = function (self, checked) ToggleMessageDest(checked, COMBATLOG_FILTER_MINE); end; tooltip = FILTER_TO_ME_COMBATLOG_TOOLTIP; --Don't need to change tooltip because if it is the dummy box, it is disabled which means no tooltip }, [2] = { text = COMBATLOG_FILTER_STRING_MY_PET, checked = function () return IsMessageDoneTo(COMBATLOG_FILTER_MY_PET); end; hidden = function () return UsesGUID("DEST"); end; func = function (self, checked) ToggleMessageDest(checked, COMBATLOG_FILTER_MY_PET); end; tooltip = FILTER_TO_PET_COMBATLOG_TOOLTIP; }, [3] = { text = COMBATLOG_FILTER_STRING_FRIENDLY_UNITS, checked = function () return IsMessageDoneTo(COMBATLOG_FILTER_FRIENDLY_UNITS); end; hidden = function () return UsesGUID("DEST"); end; func = function (self, checked) ToggleMessageDest(checked, COMBATLOG_FILTER_FRIENDLY_UNITS); end; tooltip = FILTER_TO_FRIENDS_COMBATLOG_TOOLTIP; }, [4] = { text = COMBATLOG_FILTER_STRING_HOSTILE_PLAYERS, checked = function () return IsMessageDoneTo(COMBATLOG_FILTER_HOSTILE_PLAYERS); end; hidden = function () return UsesGUID("DEST"); end; func = function (self, checked) ToggleMessageDest(checked, COMBATLOG_FILTER_HOSTILE_PLAYERS); end; tooltip = FILTER_TO_HOSTILE_PLAYERS_COMBATLOG_TOOLTIP; }, [5] = { text = COMBATLOG_FILTER_STRING_HOSTILE_UNITS, checked = function () return IsMessageDoneTo(COMBATLOG_FILTER_HOSTILE_UNITS); end; hidden = function () return UsesGUID("DEST"); end; func = function (self, checked) ToggleMessageDest(checked, COMBATLOG_FILTER_HOSTILE_UNITS); end; tooltip = FILTER_TO_HOSTILE_COMBATLOG_TOOLTIP; }, [6] = { text = COMBATLOG_FILTER_STRING_NEUTRAL_UNITS, checked = function () return IsMessageDoneTo(COMBATLOG_FILTER_NEUTRAL_UNITS); end; hidden = function () return UsesGUID("DEST"); end; func = function (self, checked) ToggleMessageDest(checked, COMBATLOG_FILTER_NEUTRAL_UNITS); end; tooltip = FILTER_TO_NEUTRAL_COMBATLOG_TOOLTIP; }, [7] = { text = COMBATLOG_FILTER_STRING_UNKNOWN_UNITS, checked = function () return IsMessageDoneTo(COMBATLOG_FILTER_UNKNOWN_UNITS); end; hidden = function () return UsesGUID("DEST"); end; func = function (self, checked) ToggleMessageDest(checked, COMBATLOG_FILTER_UNKNOWN_UNITS); end; tooltip = FILTER_TO_UNKNOWN_COMBATLOG_TOOLTIP; }, } COMBAT_CONFIG_MESSAGETYPES_LEFT = { [1] = { text = MELEE, checked = function () return HasMessageTypeGroup(COMBAT_CONFIG_MESSAGETYPES_LEFT, 1) end; func = function (self, checked) ToggleMessageTypeGroup(checked, CombatConfigMessageTypesLeft, 1) end; tooltip = MELEE_COMBATLOG_TOOLTIP, subTypes = { [1] = { text = DAMAGE, type = "SWING_DAMAGE", checked = function () return HasMessageType("SWING_DAMAGE"); end; func = function (self, checked) ToggleMessageType(checked, "SWING_DAMAGE") end; tooltip = SWING_DAMAGE_COMBATLOG_TOOLTIP; }, [2] = { text = MISSES, type = "SWING_MISSED", checked = function () return HasMessageType("SWING_MISSED"); end; func = function (self, checked) ToggleMessageType(checked, "SWING_MISSED"); end; tooltip = SWING_MISSED_COMBATLOG_TOOLTIP; }, } }, [2] = { text = RANGED, checked = function () return HasMessageTypeGroup(COMBAT_CONFIG_MESSAGETYPES_LEFT, 2) end; func = function (self, checked) ToggleMessageTypeGroup(checked, CombatConfigMessageTypesLeft, 2) end; tooltip = RANGED_COMBATLOG_TOOLTIP, subTypes = { [1] = { text = DAMAGE, type = "RANGE_DAMAGE", checked = function () return HasMessageType("RANGE_DAMAGE"); end; func = function (self, checked) ToggleMessageType(checked, "RANGE_DAMAGE"); end; tooltip = RANGE_DAMAGE_COMBATLOG_TOOLTIP; }, [2] = { text = MISSES, type = "RANGE_MISSED", checked = function () return HasMessageType("RANGE_MISSED"); end; func = function (self, checked) ToggleMessageType(checked, "RANGE_MISSED"); end; tooltip = RANGE_MISSED_COMBATLOG_TOOLTIP; }, } }, [3] = { text = AURAS, checked = function () return HasMessageTypeGroup(COMBAT_CONFIG_MESSAGETYPES_LEFT, 3) end; func = function (self, checked) ToggleMessageTypeGroup(checked, CombatConfigMessageTypesLeft, 3) end; tooltip = AURAS_COMBATLOG_TOOLTIP, subTypes = { [1] = { text = BENEFICIAL, type = {"SPELL_AURA_APPLIED", "SPELL_AURA_APPLIED_DOSE", "SPELL_AURA_REMOVED", "SPELL_AURA_APPLIED_REMOVED_DOSE", "SPELL_AURA_REFRESH"}; checked = function () return not CHATCONFIG_SELECTED_FILTER_SETTINGS.hideBuffs end; func = function (self, checked) if ( checked ) then CHATCONFIG_SELECTED_FILTER_SETTINGS.hideBuffs = false; ToggleMessageType(checked, "SPELL_AURA_APPLIED", "SPELL_AURA_APPLIED_DOSE", "SPELL_AURA_REMOVED", "SPELL_AURA_APPLIED_REMOVED_DOSE", "SPELL_AURA_REFRESH"); else CHATCONFIG_SELECTED_FILTER_SETTINGS.hideBuffs = true; -- Only stop listening for the messages if hideDebuffs is also true if ( CHATCONFIG_SELECTED_FILTER_SETTINGS.hideDebuffs ) then ToggleMessageType(checked, "SPELL_AURA_APPLIED", "SPELL_AURA_APPLIED_DOSE", "SPELL_AURA_REMOVED", "SPELL_AURA_APPLIED_REMOVED_DOSE", "SPELL_AURA_REFRESH"); end end end; tooltip = BENEFICIAL_AURA_COMBATLOG_TOOLTIP; }, [2] = { text = HOSTILE, type = {"SPELL_AURA_APPLIED", "SPELL_AURA_APPLIED_DOSE", "SPELL_AURA_REMOVED", "SPELL_AURA_APPLIED_REMOVED_DOSE"}; checked = function () return not CHATCONFIG_SELECTED_FILTER_SETTINGS.hideDebuffs end; func = function (self, checked) if ( checked ) then CHATCONFIG_SELECTED_FILTER_SETTINGS.hideDebuffs = false; ToggleMessageType(checked, "SPELL_AURA_APPLIED", "SPELL_AURA_APPLIED_DOSE", "SPELL_AURA_REMOVED", "SPELL_AURA_APPLIED_REMOVED_DOSE"); else CHATCONFIG_SELECTED_FILTER_SETTINGS.hideDebuffs = true; -- Only stop listening for the messages if hideDebuffs is also true if ( CHATCONFIG_SELECTED_FILTER_SETTINGS.hideBuffs ) then ToggleMessageType(checked, "SPELL_AURA_APPLIED", "SPELL_AURA_APPLIED_DOSE", "SPELL_AURA_REMOVED", "SPELL_AURA_APPLIED_REMOVED_DOSE"); end end end; tooltip = HARMFUL_AURA_COMBATLOG_TOOLTIP; }, [3] = { text = DISPELS, type = {"SPELL_STOLEN", "SPELL_DISPEL_FAILED", "SPELL_DISPEL"}; checked = function () return HasMessageType("SPELL_STOLEN", "SPELL_DISPEL_FAILED", "SPELL_DISPEL"); end; func = function (self, checked) ToggleMessageType(checked, "SPELL_STOLEN", "SPELL_DISPEL_FAILED", "SPELL_DISPEL"); end; tooltip = DISPEL_AURA_COMBATLOG_TOOLTIP; }, [4] = { text = ENCHANTS, type = {"ENCHANT_APPLIED", "ENCHANT_REMOVED"}; checked = function () return HasMessageType("ENCHANT_APPLIED", "ENCHANT_REMOVED"); end; func = function (self, checked) ToggleMessageType(checked, "ENCHANT_APPLIED", "ENCHANT_REMOVED"); end; tooltip = ENCHANT_AURA_COMBATLOG_TOOLTIP; }, } }, [4] = { text = PERIODIC, checked = function () return HasMessageTypeGroup(COMBAT_CONFIG_MESSAGETYPES_LEFT, 4) end; func = function (self, checked) ToggleMessageTypeGroup(checked, CombatConfigMessageTypesLeft, 4) end; tooltip = SPELL_PERIODIC_COMBATLOG_TOOLTIP, subTypes = { [1] = { text = DAMAGE, type = "SPELL_PERIODIC_DAMAGE", checked = function () return HasMessageType("SPELL_PERIODIC_DAMAGE"); end; func = function (self, checked) ToggleMessageType(checked, "SPELL_PERIODIC_DAMAGE"); end; tooltip = SPELL_PERIODIC_DAMAGE_COMBATLOG_TOOLTIP, }, [2] = { text = MISSES, type = "SPELL_PERIODIC_MISSED", checked = function () return HasMessageType("SPELL_PERIODIC_MISSED"); end; func = function (self, checked) ToggleMessageType(checked, "SPELL_PERIODIC_MISSED"); end; tooltip = SPELL_PERIODIC_MISSED_COMBATLOG_TOOLTIP, }, [3] = { text = HEALS, type = "SPELL_PERIODIC_HEAL", checked = function () return HasMessageType("SPELL_PERIODIC_HEAL"); end; func = function (self, checked) ToggleMessageType(checked, "SPELL_PERIODIC_HEAL"); end; tooltip = SPELL_PERIODIC_HEAL_COMBATLOG_TOOLTIP, }, [4] = { text = OTHER, type = {"SPELL_PERIODIC_ENERGIZE", "SPELL_PERIODIC_DRAIN","SPELL_PERIODIC_LEECH"}; checked = function () return HasMessageType("SPELL_PERIODIC_ENERGIZE", "SPELL_PERIODIC_DRAIN", "SPELL_PERIODIC_LEECH"); end; func = function (self, checked) ToggleMessageType(checked, "SPELL_PERIODIC_ENERGIZE", "SPELL_PERIODIC_DRAIN", "SPELL_PERIODIC_LEECH"); end; tooltip = SPELL_PERIODIC_OTHER_COMBATLOG_TOOLTIP, }, } }, }; COMBAT_CONFIG_MESSAGETYPES_RIGHT = { [1] = { text = SPELLS, checked = function () return HasMessageTypeGroup(COMBAT_CONFIG_MESSAGETYPES_RIGHT, 1) end; func = function (self, checked) ToggleMessageTypeGroup(checked, CombatConfigMessageTypesRight, 1) end; tooltip = SPELLS_COMBATLOG_TOOLTIP, subTypes = { [1] = { text = DAMAGE, type = "SPELL_DAMAGE", checked = function () return HasMessageType("SPELL_DAMAGE"); end; func = function (self, checked) ToggleMessageType(checked, "SPELL_DAMAGE"); end; tooltip = SPELL_DAMAGE_COMBATLOG_TOOLTIP, }, [2] = { text = MISSES, type = "SPELL_MISSED", checked = function () return HasMessageType("SPELL_MISSED"); end; func = function (self, checked) ToggleMessageType(checked, "SPELL_MISSED"); end; tooltip = SPELL_MISSED_COMBATLOG_TOOLTIP, }, [3] = { text = HEALS, type = "SPELL_HEAL", checked = function () return HasMessageType("SPELL_HEAL"); end; func = function (self, checked) ToggleMessageType(checked, "SPELL_HEAL"); end; tooltip = SPELL_HEAL_COMBATLOG_TOOLTIP, }, [4] = { text = POWER_GAINS, type = "SPELL_ENERGIZE", checked = function () return HasMessageType("SPELL_ENERGIZE"); end; func = function (self, checked) ToggleMessageType(checked, "SPELL_ENERGIZE"); end; tooltip = POWER_GAINS_COMBATLOG_TOOLTIP, }, [5] = { text = DRAINS, type = {"SPELL_DRAIN", "SPELL_LEECH"}; checked = function () return HasMessageType("SPELL_ENERGIZE"); end; func = function (self, checked) ToggleMessageType(checked, "SPELL_ENERGIZE"); end; tooltip = SPELL_DRAIN_COMBATLOG_TOOLTIP, }, [5] = { text = INTERRUPTS, type = {"SPELL_INTERRUPT"}; checked = function () return HasMessageType("SPELL_INTERRUPT"); end; func = function (self, checked) ToggleMessageType(checked, "SPELL_INTERRUPT"); end; tooltip = SPELL_INTERRUPT_COMBATLOG_TOOLTIP, }, [5] = { text = SPECIAL, type = {"SPELL_INSTAKILL"}; checked = function () return HasMessageType("SPELL_INSTAKILL"); end; func = function (self, checked) ToggleMessageType(checked, "SPELL_INSTAKILL"); end; tooltip = SPELL_INSTAKILL_COMBATLOG_TOOLTIP, }, [6] = { text = EXTRA_ATTACKS, type = {"SPELL_EXTRA_ATTACKS"}; checked = function () return HasMessageType("SPELL_EXTRA_ATTACKS"); end; func = function (self, checked) ToggleMessageType(checked, "SPELL_EXTRA_ATTACKS"); end; tooltip = SPELL_EXTRA_ATTACKS_COMBATLOG_TOOLTIP, }, [7] = { text = SUMMONS, type = {"SPELL_SUMMON"}; checked = function () return HasMessageType("SPELL_SUMMON"); end; func = function (self, checked) ToggleMessageType(checked, "SPELL_SUMMON"); end; tooltip = SPELL_SUMMON_COMBATLOG_TOOLTIP, }, [8] = { text = RESURRECT, type = {"SPELL_RESURRECT"}; checked = function () return HasMessageType("SPELL_RESURRECT"); end; func = function (self, checked) ToggleMessageType(checked, "SPELL_RESURRECT"); end; tooltip = SPELL_RESURRECT_COMBATLOG_TOOLTIP, }, [9] = { text = BUILDING_DAMAGE, type = {"SPELL_BUILDING_DAMAGE"}; checked = function () return HasMessageType("SPELL_BUILDING_DAMAGE"); end; func = function (self, checked) ToggleMessageType(checked, "SPELL_BUILDING_DAMAGE"); end; tooltip = BUILDING_DAMAGE_COMBATLOG_TOOLTIP, }, [10] = { text = BUILDING_HEAL, type = {"SPELL_BUILDING_HEAL"}; checked = function () return HasMessageType("SPELL_BUILDING_HEAL"); end; func = function (self, checked) ToggleMessageType(checked, "SPELL_BUILDING_HEAL"); end; tooltip = BUILDING_HEAL_COMBATLOG_TOOLTIP, }, } }, [2] = { text = SPELL_CASTING, checked = function () return HasMessageTypeGroup(COMBAT_CONFIG_MESSAGETYPES_RIGHT, 2) end; func = function (self, checked) ToggleMessageTypeGroup(checked, CombatConfigMessageTypesRight, 2) end; tooltip = SPELL_CASTING_COMBATLOG_TOOLTIP, subTypes = { [1] = { text = START, type = "SPELL_CAST_START", checked = function () return HasMessageType("SPELL_CAST_START"); end; func = function (self, checked) ToggleMessageType(checked, "SPELL_CAST_START"); end; tooltip = SPELL_CAST_START_COMBATLOG_TOOLTIP, }, [2] = { text = SUCCESS, type = "SPELL_CAST_SUCCESS", checked = function () return HasMessageType("SPELL_CAST_SUCCESS"); end; func = function (self, checked) ToggleMessageType(checked, "SPELL_CAST_SUCCESS"); end; tooltip = SPELL_CAST_SUCCESS_COMBATLOG_TOOLTIP, }, [3] = { text = FAILURES, type = "SPELL_CAST_FAILED", checked = function () return HasMessageType("SPELL_CAST_FAILED"); end; func = function (self, checked) ToggleMessageType(checked, "SPELL_CAST_FAILED"); end; tooltip = SPELL_CAST_FAILED_COMBATLOG_TOOLTIP, }, } }, }; COMBAT_CONFIG_MESSAGETYPES_MISC = { [1] = { text = DAMAGE_SHIELD, checked = function () return HasMessageType("DAMAGE_SHIELD", "DAMAGE_SHIELD_MISSED"); end; func = function (self, checked) ToggleMessageType(checked, "DAMAGE_SHIELD", "DAMAGE_SHIELD_MISSED"); end; tooltip = DAMAGE_SHIELD_COMBATLOG_TOOLTIP, }, [2] = { text = ENVIRONMENTAL_DAMAGE, checked = function () return HasMessageType("ENVIRONMENTAL_DAMAGE"); end; func = function (self, checked) ToggleMessageType(checked, "ENVIRONMENTAL_DAMAGE"); end; tooltip = ENVIRONMENTAL_DAMAGE_COMBATLOG_TOOLTIP, }, [3] = { text = KILLS, checked = function () return HasMessageType("PARTY_KILL"); end; func = function (self, checked) ToggleMessageType(checked, "PARTY_KILL"); end; tooltip = KILLS_COMBATLOG_TOOLTIP, }, [4] = { text = DEATHS, type = {"UNIT_DIED", "UNIT_DESTROYED", "UNIT_DISSIPATES"}; checked = function () return HasMessageType("UNIT_DIED", "UNIT_DESTROYED", "UNIT_DISSIPATES"); end; func = function (self, checked) ToggleMessageType(checked, "UNIT_DIED", "UNIT_DESTROYED", "UNIT_DISSIPATES"); end; tooltip = DEATHS_COMBATLOG_TOOLTIP, }, }; COMBAT_CONFIG_UNIT_COLORS = { [1] = { text = COMBATLOG_FILTER_STRING_ME, type = "COMBATLOG_FILTER_MINE", }, [2] = { text = COMBATLOG_FILTER_STRING_MY_PET, type = "COMBATLOG_FILTER_MY_PET", }, [3] = { text = COMBATLOG_FILTER_STRING_FRIENDLY_UNITS, type = "COMBATLOG_FILTER_FRIENDLY_UNITS", }, [4] = { text = COMBATLOG_FILTER_STRING_HOSTILE_UNITS, type = "COMBATLOG_FILTER_HOSTILE_UNITS", }, [5] = { text = COMBATLOG_FILTER_STRING_HOSTILE_PLAYERS, type = "COMBATLOG_FILTER_HOSTILE_PLAYERS", }, [6] = { text = COMBATLOG_FILTER_STRING_NEUTRAL_UNITS, type = "COMBATLOG_FILTER_NEUTRAL_UNITS", }, [7] = { text = COMBATLOG_FILTER_STRING_UNKNOWN_UNITS, type = "COMBATLOG_FILTER_UNKNOWN_UNITS", }, } function ChatConfigFrame_OnLoad(self) self:RegisterEvent("PLAYER_ENTERING_WORLD"); end function ChatConfigFrame_OnEvent(self, event, ...) if ( event == "PLAYER_ENTERING_WORLD" ) then -- Chat Settings ChatConfig_CreateCheckboxes(ChatConfigChatSettingsLeft, CHAT_CONFIG_CHAT_LEFT, "ChatConfigCheckBoxWithSwatchAndClassColorTemplate", PLAYER_MESSAGES); ChatConfig_CreateCheckboxes(ChatConfigOtherSettingsCombat, CHAT_CONFIG_OTHER_COMBAT, "ChatConfigCheckBoxWithSwatchTemplate", COMBAT); ChatConfig_CreateCheckboxes(ChatConfigOtherSettingsPVP, CHAT_CONFIG_OTHER_PVP, "ChatConfigCheckBoxWithSwatchTemplate", PVP); ChatConfig_CreateCheckboxes(ChatConfigOtherSettingsSystem, CHAT_CONFIG_OTHER_SYSTEM, "ChatConfigCheckBoxWithSwatchTemplate", OTHER); ChatConfig_CreateCheckboxes(ChatConfigOtherSettingsCreature, CHAT_CONFIG_CHAT_CREATURE_LEFT, "ChatConfigCheckBoxWithSwatchTemplate", CREATURE_MESSAGES); -- CombatLog Settings ChatConfig_CreateCheckboxes(CombatConfigMessageSourcesDoneBy, COMBAT_CONFIG_MESSAGESOURCES_BY, "ChatConfigCheckBoxTemplate", DONE_BY); ChatConfig_CreateCheckboxes(CombatConfigMessageSourcesDoneTo, COMBAT_CONFIG_MESSAGESOURCES_TO, "ChatConfigCheckBoxTemplate", DONE_TO); ChatConfig_CreateTieredCheckboxes(CombatConfigMessageTypesLeft, COMBAT_CONFIG_MESSAGETYPES_LEFT, "ChatConfigCheckButtonTemplate", "ChatConfigSmallCheckButtonTemplate"); ChatConfig_CreateTieredCheckboxes(CombatConfigMessageTypesRight, COMBAT_CONFIG_MESSAGETYPES_RIGHT, "ChatConfigCheckButtonTemplate", "ChatConfigSmallCheckButtonTemplate"); ChatConfig_CreateTieredCheckboxes(CombatConfigMessageTypesMisc, COMBAT_CONFIG_MESSAGETYPES_MISC, "ChatConfigSmallCheckButtonTemplate", "ChatConfigSmallCheckButtonTemplate"); ChatConfig_CreateColorSwatches(CombatConfigColorsUnitColors, COMBAT_CONFIG_UNIT_COLORS, "ChatConfigSwatchTemplate", UNIT_COLORS); if ( COMBATLOG_FILTER_VERSION and COMBATLOG_FILTER_VERSION > Blizzard_CombatLog_Filter_Version ) then CombatConfig_SetCombatFiltersToDefault(); Blizzard_CombatLog_Filter_Version = COMBATLOG_FILTER_VERSION; end -- Default selections ChatConfigCategory_OnClick(ChatConfigCategoryFrameButton2); ChatConfig_UpdateCombatTabs(1); end end function ChatConfig_CreateCheckboxes(frame, checkBoxTable, checkBoxTemplate, title) local checkBoxNameString = frame:GetName().."CheckBox"; local checkBoxName, checkBox, check; local width, height; local padding = 8; local text; local checkBoxFontString; frame.checkBoxTable = checkBoxTable; if ( title ) then _G[frame:GetName().."Title"]:SetText(title); end for index, value in ipairs(checkBoxTable) do --If no checkbox then create it checkBoxName = checkBoxNameString..index; checkBox = _G[checkBoxName]; if ( not checkBox ) then checkBox = CreateFrame("Frame", checkBoxName, frame, checkBoxTemplate); end if ( not width ) then width = checkBox:GetWidth(); height = checkBox:GetHeight(); end if ( index > 1 ) then checkBox:SetPoint("TOPLEFT", checkBoxNameString..(index-1), "BOTTOMLEFT", 0, 0); else checkBox:SetPoint("TOPLEFT", frame, "TOPLEFT", 4, -4); end if ( value.text ) then text = value.text; else text = _G[value.type]; end if ( value.noClassColor ) then _G[checkBoxName.."ColorClasses"]:Hide(); end checkBox.type = value.type; checkBoxFontString = _G[checkBoxName.."CheckText"]; checkBoxFontString:SetText(text); check = _G[checkBoxName.."Check"]; check.func = value.func; check:SetID(index); check.tooltip = value.tooltip; if ( value.maxWidth ) then checkBoxFontString:SetWidth(0); if ( checkBoxFontString:GetWidth() > value.maxWidth ) then checkBoxFontString:SetWidth(value.maxWidth); check.tooltip = text; check.tooltipStyle = 0; end end end --Set Parent frame dimensions if ( #checkBoxTable > 0 ) then frame:SetWidth(width+padding); frame:SetHeight(#checkBoxTable*height+padding); end end function ChatConfig_CreateTieredCheckboxes(frame, checkBoxTable, checkBoxTemplate, subCheckBoxTemplate, columns, spacing) local checkBoxNameString = frame:GetName().."CheckBox"; local checkBoxName, checkBox, subCheckBoxName, subCheckBox, subCheckBoxNameString; local width, height; local padding = 8; local count = 0; local text, subText; local yOffset; local numColumns = 2; local columnIndex = 1; local itemsPerColumn; if ( columns ) then itemsPerColumn = ceil(#checkBoxTable/columns); end frame.checkBoxTable = checkBoxTable; for index, value in ipairs(checkBoxTable) do --If no checkbox then create it checkBoxName = checkBoxNameString..index; if ( not _G[checkBoxName] ) then checkBox = CreateFrame("CheckButton", checkBoxName, frame, checkBoxTemplate); if ( index > 1 ) then if ( columns ) then if ( mod(index, columns) == 1 ) then checkBox:SetPoint("TOPLEFT", checkBoxNameString..(index-columns), "BOTTOMLEFT", 0, yOffset); count = count+1; else checkBox:SetPoint("TOPLEFT", checkBoxNameString..(index-1), "TOPRIGHT", spacing, 0); end else checkBox:SetPoint("TOPLEFT", checkBoxNameString..(index-1), "BOTTOMLEFT", 0, yOffset); count = count+1; end else checkBox:SetPoint("TOPLEFT", frame, "TOPLEFT", 4, -4); count = count+1; end if ( value.text ) then text = value.text; else text = _G[value.type]; end _G[checkBoxName.."Text"]:SetText(text); if ( value.subTypes ) then subCheckBoxNameString = checkBoxName.."_"; for k, v in ipairs(value.subTypes) do subCheckBoxName = subCheckBoxNameString..k; if ( not _G[subCheckBoxName] ) then subCheckBox = CreateFrame("CheckButton", subCheckBoxName, checkBox, subCheckBoxTemplate); end if ( k > 1 ) then if ( mod(k, numColumns) == 0 ) then subCheckBox:SetPoint("LEFT", subCheckBoxNameString..(k-1), "RIGHT", 60, 0); else subCheckBox:SetPoint("TOPLEFT", subCheckBoxNameString..(k-2), "BOTTOMLEFT", 0, 2); end else subCheckBox:SetPoint("TOPLEFT", checkBox, "BOTTOMLEFT", 15, 2); end subCheckBox.func = v.func; subCheckBox.tooltip = v.tooltip; if ( v.text ) then subText = v.text; else subText = _G[v.type]; end _G[subCheckBoxName.."Text"]:SetText(subText); count = count+0.6; end yOffset = -(22*ceil(#value.subTypes/numColumns) + 16); else yOffset = 0; end checkBox.func = value.func; checkBox.tooltip = value.tooltip; if ( not width ) then width = checkBox:GetWidth(); height = checkBox:GetHeight(); end end end --Set Parent frame dimensions if ( count > 0 ) then frame:SetWidth(width+padding); frame:SetHeight(count*height+padding); end end function ChatConfig_CreateColorSwatches(frame, swatchTable, swatchTemplate, title) local nameString = frame:GetName().."Swatch"; local swatchName, swatch; local width, height; local padding = 8; local count = 0; local text; frame.swatchTable = swatchTable; if ( title ) then _G[frame:GetName().."Title"]:SetText(title); end for index, value in ipairs(swatchTable) do --If no checkbox then create it swatchName = nameString..index; if ( not _G[swatchName] ) then swatch = CreateFrame("Frame", swatchName, frame, swatchTemplate); if ( not width ) then width = swatch:GetWidth(); height = swatch:GetHeight(); end if ( index > 1 ) then swatch:SetPoint("TOPLEFT", nameString..(index-1), "BOTTOMLEFT", 0, 0); else swatch:SetPoint("TOPLEFT", frame, "TOPLEFT", 4, -4); end if ( value.text ) then text = value.text; else text = _G[value.type]; end _G[swatchName.."Text"]:SetText(text); count = count+1; end end --Set Parent frame dimensions if ( count > 0 ) then frame:SetWidth(width+padding); frame:SetHeight(count*height+padding); end end function ChatConfig_UpdateCheckboxes(frame) -- List of message types in current chat frame if ( not FCF_GetCurrentChatFrame() ) then return; end local height; local checkBoxTable = frame.checkBoxTable; local checkBoxNameString = frame:GetName().."CheckBox"; local checkBoxName, checkBox, baseName, colorSwatch; local topnum, padding = 0, 8; for index, value in ipairs(checkBoxTable) do baseName = checkBoxNameString..index; checkBox = _G[baseName.."Check"]; if ( checkBox ) then if ( not height ) then height = checkBox:GetParent():GetHeight(); end if ( type(value.checked) == "function" ) then checkBox:SetChecked(value.checked()); else checkBox:SetChecked(value.checked); end if ( type(value.disabled) == "function" ) then if( value.disabled() ) then BlizzardOptionsPanel_CheckButton_Disable(checkBox); else BlizzardOptionsPanel_CheckButton_Enable(checkBox, true); end else if ( value.disabled ) then BlizzardOptionsPanel_CheckButton_Disable(checkBox); else BlizzardOptionsPanel_CheckButton_Enable(checkBox, true); end end if ( type(value.hidden) == "function" ) then if ( value.hidden() ) then checkBox:GetParent():Hide(); else checkBox:GetParent():Show(); topnum = index; end else if ( value.hidden ) then checkBox:GetParent():Hide(); else checkBox:GetParent():Show(); topnum = index; end end if ( type(value.text) == "function" ) then --Dynamic text, we should update it _G[checkBoxNameString..index.."CheckText"]:SetText(value.text()); end colorSwatch = _G[baseName.."ColorSwatch"]; if ( colorSwatch ) then _G[baseName.."ColorSwatchNormalTexture"]:SetVertexColor(GetMessageTypeColor(value.type)); colorSwatch.type = value.type; end --Color class names local colorClasses = _G[baseName.."ColorClasses"]; if ( colorClasses ) then colorClasses:SetChecked(IsClassColoringMessageType(value.type)); end end frame:SetHeight( topnum * height + padding ); end -- Hide remaining checkboxes local count = #checkBoxTable+1; repeat checkBox = _G[checkBoxNameString..count]; if ( checkBox ) then checkBox:Hide(); end count = count+1; until not checkBox; end function ChatConfig_UpdateSwatches(frame) -- List of message types in current chat frame if ( not FCF_GetCurrentChatFrame() ) then return; end local table = frame.swatchTable; local nameString = frame:GetName().."Swatch"; local checkBoxName, checkBox, baseName, colorSwatch; for index, value in ipairs(table) do baseName = nameString..index; colorSwatch = _G[baseName.."ColorSwatch"]; if ( colorSwatch ) then _G[baseName.."ColorSwatchNormalTexture"]:SetVertexColor(GetChatUnitColor(value.type)); colorSwatch.type = value.type; end end end function ChatConfig_UpdateTieredCheckboxFrame(frame) -- List of message types in current chat frame if ( not FCF_GetCurrentChatFrame() ) then return; end for i=1, #frame.checkBoxTable do ChatConfig_UpdateTieredCheckboxes(frame, i); end end function ChatConfig_UpdateTieredCheckboxes(frame, index) local group = frame.checkBoxTable[index]; local groupChecked; local baseName = frame:GetName().."CheckBox"..index; local checkBox = _G[baseName]; if ( checkBox ) then groupChecked = group.checked; if ( type(groupChecked) == "function" ) then local checked = groupChecked(); checkBox:SetChecked(checked); --Set checked so we can use it later groupChecked = checked; else checkBox:SetChecked(groupChecked); end if ( type(group.disabled) == "function" ) then if( group.disabled() ) then checkBox:Disable(); else checkBox:Enable(); end else if ( group.disabled ) then checkBox:Disable(); else checkBox:Enable(); end end end local subCheckBox; if ( group.subTypes ) then for k, v in ipairs(group.subTypes) do subCheckBox = _G[baseName.."_"..k]; if ( type(v.checked) == "function" ) then subCheckBox:SetChecked(v.checked()); else subCheckBox:SetChecked(v.checked); end if ( type(v.disabled) == "function" ) then if( v.disabled() ) then subCheckBox:Disable(); else subCheckBox:Enable(); end else if ( v.disabled ) then subCheckBox:Disable(); else subCheckBox:Enable(); end end if ( groupChecked ) then BlizzardOptionsPanel_CheckButton_Enable(subCheckBox, true); else BlizzardOptionsPanel_CheckButton_Disable(subCheckBox); end end end end function CombatConfig_Colorize_Update() if ( not CHATCONFIG_SELECTED_FILTER_SETTINGS ) then return; end CombatConfigColorsColorizeUnitNameCheck:SetChecked(CHATCONFIG_SELECTED_FILTER_SETTINGS.unitColoring); -- Spell Names CombatConfigColorsColorizeSpellNamesCheck:SetChecked(CHATCONFIG_SELECTED_FILTER_SETTINGS.abilityColoring); if ( CHATCONFIG_SELECTED_FILTER_SETTINGS.abilityColoring ) then BlizzardOptionsPanel_CheckButton_Enable(CombatConfigColorsColorizeSpellNamesSchoolColoring, true); else BlizzardOptionsPanel_CheckButton_Disable(CombatConfigColorsColorizeSpellNamesSchoolColoring, true); end CombatConfigColorsColorizeSpellNamesSchoolColoring:SetChecked(CHATCONFIG_SELECTED_FILTER_SETTINGS.abilitySchoolColoring); CombatConfigColorsColorizeSpellNamesColorSwatchNormalTexture:SetVertexColor(GetTableColor(CHATCONFIG_SELECTED_FILTER_COLORS.defaults.spell)); -- Damage Number CombatConfigColorsColorizeDamageNumberCheck:SetChecked(CHATCONFIG_SELECTED_FILTER_SETTINGS.amountColoring); if ( CHATCONFIG_SELECTED_FILTER_SETTINGS.amountColoring ) then BlizzardOptionsPanel_CheckButton_Enable(CombatConfigColorsColorizeDamageNumberSchoolColoring, true); else BlizzardOptionsPanel_CheckButton_Disable(CombatConfigColorsColorizeDamageNumberSchoolColoring, true); end CombatConfigColorsColorizeDamageNumberSchoolColoring:SetChecked(CHATCONFIG_SELECTED_FILTER_SETTINGS.amountSchoolColoring); CombatConfigColorsColorizeDamageNumberColorSwatchNormalTexture:SetVertexColor(GetTableColor(CHATCONFIG_SELECTED_FILTER_COLORS.defaults.damage)); -- Damage School CombatConfigColorsColorizeDamageSchoolCheck:SetChecked(CHATCONFIG_SELECTED_FILTER_SETTINGS.schoolNameColoring); -- Line Coloring CombatConfigColorsColorizeEntireLineCheck:SetChecked(CHATCONFIG_SELECTED_FILTER_SETTINGS.lineColoring); if ( CHATCONFIG_SELECTED_FILTER_SETTINGS.lineColoring ) then BlizzardOptionsPanel_CheckButton_Enable(CombatConfigColorsColorizeEntireLineBySource, true); BlizzardOptionsPanel_CheckButton_Enable(CombatConfigColorsColorizeEntireLineByTarget, true); else BlizzardOptionsPanel_CheckButton_Disable(CombatConfigColorsColorizeEntireLineBySource); BlizzardOptionsPanel_CheckButton_Disable(CombatConfigColorsColorizeEntireLineByTarget); end if ( CHATCONFIG_SELECTED_FILTER_SETTINGS.lineColorPriority == 1 ) then CombatConfigColorsColorizeEntireLineBySource:SetChecked(1); CombatConfigColorsColorizeEntireLineByTarget:SetChecked(nil); else CombatConfigColorsColorizeEntireLineBySource:SetChecked(nil); CombatConfigColorsColorizeEntireLineByTarget:SetChecked(1); end -- Line Highlighting CombatConfigColorsHighlightingLine:SetChecked(CHATCONFIG_SELECTED_FILTER_SETTINGS.lineHighlighting); CombatConfigColorsHighlightingAbility:SetChecked(CHATCONFIG_SELECTED_FILTER_SETTINGS.abilityHighlighting); CombatConfigColorsHighlightingDamage:SetChecked(CHATCONFIG_SELECTED_FILTER_SETTINGS.amountHighlighting); CombatConfigColorsHighlightingSchool:SetChecked(CHATCONFIG_SELECTED_FILTER_SETTINGS.schoolNameHighlighting); local text, r, g, b = CombatLog_OnEvent(CHATCONFIG_SELECTED_FILTER, 0, "SPELL_DAMAGE", 0x0000000000000001, UnitName("player"), 0x511, 0xF13000012B000820, EXAMPLE_TARGET_MONSTER, 0x10a28 ,116, EXAMPLE_SPELL_FROSTBOLT, SCHOOL_MASK_FROST, 27, SCHOOL_MASK_FROST, nil, nil, nil, 1, nil, nil); CombatConfigColorsExampleString1:SetVertexColor(r, g, b); CombatConfigColorsExampleString1:SetText(text); text, r, g, b = CombatLog_OnEvent(CHATCONFIG_SELECTED_FILTER, 0, "SPELL_DAMAGE", 0xF13000024D002914, EXAMPLE_TARGET_MONSTER, 0x10a48, 0x0000000000000001, UnitName("player"), 0x511, 20793,EXAMPLE_SPELL_FIREBALL, SCHOOL_MASK_FIRE, 68, SCHOOL_MASK_FIRE, nil, nil, nil, nil, nil, nil); CombatConfigColorsExampleString2:SetVertexColor(r, g, b); CombatConfigColorsExampleString2:SetText(text); end function CombatConfig_Formatting_Update() CombatConfigFormattingShowTimeStamp:SetChecked(CHATCONFIG_SELECTED_FILTER_SETTINGS.timestamp); CombatConfigFormattingShowBraces:SetChecked(CHATCONFIG_SELECTED_FILTER_SETTINGS.braces); if ( CHATCONFIG_SELECTED_FILTER_SETTINGS.braces ) then BlizzardOptionsPanel_CheckButton_Enable(CombatConfigFormattingUnitNames, true); BlizzardOptionsPanel_CheckButton_Enable(CombatConfigFormattingSpellNames, true); BlizzardOptionsPanel_CheckButton_Enable(CombatConfigFormattingItemNames, true); else BlizzardOptionsPanel_CheckButton_Disable(CombatConfigFormattingUnitNames); BlizzardOptionsPanel_CheckButton_Disable(CombatConfigFormattingSpellNames); BlizzardOptionsPanel_CheckButton_Disable(CombatConfigFormattingItemNames); end CombatConfigFormattingUnitNames:SetChecked(CHATCONFIG_SELECTED_FILTER_SETTINGS.unitBraces); CombatConfigFormattingSpellNames:SetChecked(CHATCONFIG_SELECTED_FILTER_SETTINGS.spellBraces); CombatConfigFormattingItemNames:SetChecked(CHATCONFIG_SELECTED_FILTER_SETTINGS.itemBraces); CombatConfigFormattingFullText:SetChecked(CHATCONFIG_SELECTED_FILTER_SETTINGS.fullText); local text, r, g, b = CombatLog_OnEvent(CHATCONFIG_SELECTED_FILTER, 0, "SPELL_DAMAGE", 0x0000000000000001, UnitName("player"), 0x511, 0xF13000012B000820, EXAMPLE_TARGET_MONSTER, 0x10a28 ,116, EXAMPLE_SPELL_FROSTBOLT, SCHOOL_MASK_FROST, 27, SCHOOL_MASK_FROST, nil, nil, nil, 1, nil, nil); CombatConfigFormattingExampleString1:SetVertexColor(r, g, b); CombatConfigFormattingExampleString1:SetText(text); text, r, g, b = CombatLog_OnEvent(CHATCONFIG_SELECTED_FILTER, 0, "SPELL_DAMAGE", 0xF13000024D002914, EXAMPLE_TARGET_MONSTER, 0x10a48, 0x0000000000000001, UnitName("player"), 0x511, 20793,EXAMPLE_SPELL_FIREBALL, SCHOOL_MASK_FIRE, 68, SCHOOL_MASK_FIRE, nil, nil, nil, nil, nil, nil); CombatConfigFormattingExampleString2:SetVertexColor(r, g, b); CombatConfigFormattingExampleString2:SetText(text); end function CombatConfig_Settings_Update() CombatConfigSettingsShowQuickButton:SetChecked(CHATCONFIG_SELECTED_FILTER.hasQuickButton); if ( CHATCONFIG_SELECTED_FILTER.hasQuickButton ) then BlizzardOptionsPanel_CheckButton_Enable(CombatConfigSettingsSolo, true); BlizzardOptionsPanel_CheckButton_Enable(CombatConfigSettingsParty, true); BlizzardOptionsPanel_CheckButton_Enable(CombatConfigSettingsRaid, true); else BlizzardOptionsPanel_CheckButton_Disable(CombatConfigSettingsSolo); BlizzardOptionsPanel_CheckButton_Disable(CombatConfigSettingsParty); BlizzardOptionsPanel_CheckButton_Disable(CombatConfigSettingsRaid); end CombatConfigSettingsSolo:SetChecked(CHATCONFIG_SELECTED_FILTER.quickButtonDisplay.solo); CombatConfigSettingsParty:SetChecked(CHATCONFIG_SELECTED_FILTER.quickButtonDisplay.party); CombatConfigSettingsRaid:SetChecked(CHATCONFIG_SELECTED_FILTER.quickButtonDisplay.raid); end function CombatConfig_SetFilterName(name) CHATCONFIG_SELECTED_FILTER.name = name; ChatConfig_UpdateFilterList(); end function ToggleChatMessageGroup(checked, group) if ( checked ) then ChatFrame_AddMessageGroup(FCF_GetCurrentChatFrame(), group); else ChatFrame_RemoveMessageGroup(FCF_GetCurrentChatFrame(), group); end end function ColorClassesCheckBox_OnClick(self, checked) ToggleChatColorNamesByClassGroup(checked, self:GetParent().type); end function ToggleChatColorNamesByClassGroup(checked, group) local info = ChatTypeGroup[group]; if ( info ) then for key, value in pairs(info) do SetChatColorNameByClass(strsub(value, 10), checked); --strsub gets rid of CHAT_MSG_ end else SetChatColorNameByClass(group, checked); end end function ToggleChatChannel(checked, channel) if ( checked ) then ChatFrame_AddChannel(FCF_GetCurrentChatFrame(), channel); else ChatFrame_RemoveChannel(FCF_GetCurrentChatFrame(), channel); end end function ToggleMessageSource(checked, filter) if ( not CHATCONFIG_SELECTED_FILTER_FILTERS[1].sourceFlags ) then CHATCONFIG_SELECTED_FILTER_FILTERS[1].sourceFlags = {}; end local sourceFlags = CHATCONFIG_SELECTED_FILTER_FILTERS[1].sourceFlags; if ( checked ) then sourceFlags[filter] = true; else sourceFlags[filter] = false; end end function ToggleMessageDest(checked, filter) local destFlags; if ( UsesGUID( "SOURCE" ) ) then if ( not CHATCONFIG_SELECTED_FILTER_FILTERS[1].destFlags ) then CHATCONFIG_SELECTED_FILTER_FILTERS[1].destFlags = {}; end destFlags = CHATCONFIG_SELECTED_FILTER_FILTERS[1].destFlags; else if ( not CHATCONFIG_SELECTED_FILTER_FILTERS[2].destFlags ) then CHATCONFIG_SELECTED_FILTER_FILTERS[2].destFlags = {}; end destFlags = CHATCONFIG_SELECTED_FILTER_FILTERS[2].destFlags; end if ( checked ) then destFlags[filter] = true; else destFlags[filter] = false; end end -- Create parent is checked or unchecked if all children are unchecked function ToggleMessageTypeGroup(checked, frame, index) local subTypes = frame.checkBoxTable[index].subTypes; local eventList = CHATCONFIG_SELECTED_FILTER_FILTERS[1].eventList; if ( subTypes ) then local state; if ( checked ) then for k, v in ipairs(subTypes) do state = GetMessageTypeState(v.type); if ( state == GRAY_CHECKED or state == true ) then if ( type(v.type) == "table" ) then for k2, v2 in pairs(v.type) do eventList[v2] = true; end else eventList[v.type] = true; end else if ( type(v.type) == "table" ) then for k2, v2 in pairs(v.type) do eventList[v2] = UNCHECKED_ENABLED; end else eventList[v.type] = UNCHECKED_ENABLED; end end end else for k, v in ipairs(subTypes) do state = GetMessageTypeState(v.type); if ( state == true or state == GRAY_CHECKED) then if ( type(v.type) == "table" ) then for k2, v2 in pairs(v.type) do eventList[v2] = GRAY_CHECKED; end else eventList[v.type] = GRAY_CHECKED; end else if ( type(v.type) == "table" ) then for k2, v2 in pairs(v.type) do eventList[v2] = UNCHECKED_DISABLED; end else eventList[v.type] = UNCHECKED_DISABLED; end end end end end ChatConfig_UpdateTieredCheckboxes(frame, index); end function ToggleMessageType(checked, ...) local eventList = CHATCONFIG_SELECTED_FILTER_FILTERS[1].eventList; for _, type in pairs ( {...} ) do if ( checked ) then eventList[type] = true; else eventList[type] = false; end end end function IsListeningForMessageType(messageType) local messageTypeList = FCF_GetCurrentChatFrame().messageTypeList; for index, value in pairs(messageTypeList) do if ( value == messageType ) then return true; end end return false; end function IsClassColoringMessageType(messageType) local groupInfo = ChatTypeGroup[messageType]; if ( groupInfo ) then for key, value in pairs(groupInfo) do --If any of the sub-categories color by name, we'll consider the entire thing as colored by name. local info = ChatTypeInfo[strsub(value, 10)]; if ( info and info.colorNameByClass ) then --strsub gets rid of CHAT_MSG_ return true; end end return false; else local info = ChatTypeInfo[messageType]; return info and info.colorNameByClass; end end COMBATCONFIG_COLORPICKER_FUNCTIONS = { chatUnitColorSwatch = function() SetChatUnitColor(CHAT_CONFIG_CURRENT_COLOR_SWATCH.type, ColorPickerFrame:GetColorRGB()); _G[CHAT_CONFIG_CURRENT_COLOR_SWATCH:GetName().."NormalTexture"]:SetVertexColor(ColorPickerFrame:GetColorRGB()); CombatConfig_Colorize_Update(); end; chatUnitColorCancel = function() SetChatUnitColor(CHAT_CONFIG_CURRENT_COLOR_SWATCH.type, ColorPicker_GetPreviousValues()); _G[CHAT_CONFIG_CURRENT_COLOR_SWATCH:GetName().."NormalTexture"]:SetVertexColor(ColorPicker_GetPreviousValues()); CombatConfig_Colorize_Update(); end; spellColorSwatch = function() SetTableColor(CHATCONFIG_SELECTED_FILTER_COLORS.defaults.spell, ColorPickerFrame:GetColorRGB()); _G[CHAT_CONFIG_CURRENT_COLOR_SWATCH:GetName().."NormalTexture"]:SetVertexColor(ColorPickerFrame:GetColorRGB()); CombatConfig_Colorize_Update(); end; spellColorCancel = function() SetTableColor(CHATCONFIG_SELECTED_FILTER_COLORS.defaults.spell, ColorPicker_GetPreviousValues()); _G[CHAT_CONFIG_CURRENT_COLOR_SWATCH:GetName().."NormalTexture"]:SetVertexColor(ColorPicker_GetPreviousValues()); CombatConfig_Colorize_Update(); end; damageColorSwatch = function() SetTableColor(CHATCONFIG_SELECTED_FILTER_COLORS.defaults.damage, ColorPickerFrame:GetColorRGB()); _G[CHAT_CONFIG_CURRENT_COLOR_SWATCH:GetName().."NormalTexture"]:SetVertexColor(ColorPickerFrame:GetColorRGB()); CombatConfig_Colorize_Update(); end; damageColorCancel = function() SetTableColor(CHATCONFIG_SELECTED_FILTER_COLORS.defaults.damage, ColorPicker_GetPreviousValues()); _G[CHAT_CONFIG_CURRENT_COLOR_SWATCH:GetName().."NormalTexture"]:SetVertexColor(ColorPicker_GetPreviousValues()); CombatConfig_Colorize_Update(); end; messageTypeColorSwatch = function() local messageTypes = ColorPickerFrame.extraInfo; if ( messageTypes ) then for index, value in pairs(messageTypes) do ChangeChatColor(FCF_StripChatMsg(value), ColorPickerFrame:GetColorRGB()); end else ChangeChatColor(CHAT_CONFIG_CURRENT_COLOR_SWATCH.type, ColorPickerFrame:GetColorRGB()); end _G[CHAT_CONFIG_CURRENT_COLOR_SWATCH:GetName().."NormalTexture"]:SetVertexColor(ColorPickerFrame:GetColorRGB()); CombatConfig_Colorize_Update(); end; messageTypeColorCancel = function() local messageTypes = ColorPickerFrame.extraInfo; if ( messageTypes ) then for index, value in pairs(messageTypes) do ChangeChatColor(FCF_StripChatMsg(value), ColorPicker_GetPreviousValues()); end else ChangeChatColor(CHAT_CONFIG_CURRENT_COLOR_SWATCH.type, ColorPicker_GetPreviousValues()); end _G[CHAT_CONFIG_CURRENT_COLOR_SWATCH:GetName().."NormalTexture"]:SetVertexColor(ColorPicker_GetPreviousValues()); CombatConfig_Colorize_Update(); end; } function ChatUnitColor_OpenColorPicker(self) local info = UIDropDownMenu_CreateInfo(); info.r, info.g, info.b = GetChatUnitColor(self.type); CHAT_CONFIG_CURRENT_COLOR_SWATCH = self; info.swatchFunc = COMBATCONFIG_COLORPICKER_FUNCTIONS.chatUnitColorSwatch; info.cancelFunc = COMBATCONFIG_COLORPICKER_FUNCTIONS.chatUnitColorCancel; OpenColorPicker(info); end function SpellColor_OpenColorPicker(self) local info = UIDropDownMenu_CreateInfo(); CHAT_CONFIG_CURRENT_COLOR_SWATCH = self; info.r, info.g, info.b = GetTableColor(CHATCONFIG_SELECTED_FILTER_COLORS.defaults.spell); info.swatchFunc = COMBATCONFIG_COLORPICKER_FUNCTIONS.spellColorSwatch; info.cancelFunc = COMBATCONFIG_COLORPICKER_FUNCTIONS.spellColorCancel; OpenColorPicker(info); end function DamageColor_OpenColorPicker(self) local info = UIDropDownMenu_CreateInfo(); CHAT_CONFIG_CURRENT_COLOR_SWATCH = self; info.r, info.g, info.b = GetTableColor(CHATCONFIG_SELECTED_FILTER_COLORS.defaults.damage); info.swatchFunc = COMBATCONFIG_COLORPICKER_FUNCTIONS.damageColorSwatch; info.cancelFunc = COMBATCONFIG_COLORPICKER_FUNCTIONS.damageColorCancel; OpenColorPicker(info); end function MessageTypeColor_OpenColorPicker(self) local info = UIDropDownMenu_CreateInfo(); local messageTypeTable; info.r, info.g, info.b, messageTypeTable = GetMessageTypeColor(self.type); CHAT_CONFIG_CURRENT_COLOR_SWATCH = self; info.swatchFunc = COMBATCONFIG_COLORPICKER_FUNCTIONS.messageTypeColorSwatch; info.cancelFunc = COMBATCONFIG_COLORPICKER_FUNCTIONS.messageTypeColorCancel; info.extraInfo = nil; if ( messageTypeTable ) then info.extraInfo = messageTypeTable; end OpenColorPicker(info); end function GetMessageTypeColor(messageType) local group = ChatTypeGroup[messageType]; local type; if ( group ) then type = group[1]; else type = messageType; end local info = ChatTypeInfo[FCF_StripChatMsg(type)]; return info.r, info.g, info.b, group; end function GetChatUnitColor(type) local color = CHATCONFIG_SELECTED_FILTER_COLORS.unitColoring[_G[type]]; return color.r, color.g, color.b; end function SetChatUnitColor(type, r, g, b) SetTableColor(CHATCONFIG_SELECTED_FILTER_COLORS.unitColoring[_G[type]], r, g, b); end function GetSpellNameColor() local color = CHATCONFIG_SELECTED_FILTER_COLORS.defaults.spell; return color.r, color.g, color.b; end function SetSpellNameColor(r, g, b) SetTableColor(CHATCONFIG_SELECTED_FILTER_COLORS.defaults.spell, r, g, b); end -- Convenience functions for pulling and putting rgb values into tables function GetTableColor(color) return color.r, color.g, color.b; end function SetTableColor(color, r, g, b) color.r = r; color.g = g; color.b = b; end CHAT_CONFIG_CATEGORIES = { [1] = "ChatConfigChatSettings", [2] = "ChatConfigCombatSettings", [3] = "ChatConfigChannelSettings", [4] = "ChatConfigOtherSettings", }; function ChatConfigCategory_OnClick(self) self:UnlockHighlight(); for index, value in ipairs(CHAT_CONFIG_CATEGORIES) do if ( self:GetID() == index ) then _G[value]:Show(); self:LockHighlight(); else _G[value]:Hide(); _G["ChatConfigCategoryFrameButton"..index]:UnlockHighlight(); end end end function CreateChatChannelList(self, ...) if ( not FCF_GetCurrentChatFrame() ) then return; end local channelList = FCF_GetCurrentChatFrame().channelList; local zoneChannelList = FCF_GetCurrentChatFrame().zoneChannelList; local channel, channelID, tag; local checked; local count = 1; CHAT_CONFIG_CHANNEL_LIST = {}; for i=1, select("#", ...), 2 do channelID = select(i, ...); tag = "CHANNEL"..channelID; channel = select(i+1, ...); checked = nil; if ( channelList ) then for index, value in pairs(channelList) do if ( value == channel ) then checked = 1; end end end if ( zoneChannelList ) then for index, value in pairs(zoneChannelList) do if ( value == channel ) then checked = 1; end end end CHAT_CONFIG_CHANNEL_LIST[count] = {}; CHAT_CONFIG_CHANNEL_LIST[count].text = channelID.."."..channel; CHAT_CONFIG_CHANNEL_LIST[count].channelName = channel; CHAT_CONFIG_CHANNEL_LIST[count].type = tag; CHAT_CONFIG_CHANNEL_LIST[count].maxWidth = CHATCONFIG_CHANNELS_MAXWIDTH; CHAT_CONFIG_CHANNEL_LIST[count].checked = checked; CHAT_CONFIG_CHANNEL_LIST[count].func = function (self, checked) ToggleChatChannel(checked, CHAT_CONFIG_CHANNEL_LIST[self:GetID()].channelName); end; count = count+1; end end COMBAT_CONFIG_TABS = { [1] = { text = MESSAGE_SOURCES, frame = "CombatConfigMessageSources" }, [2] = { text = MESSAGE_TYPES, frame = "CombatConfigMessageTypes" }, [3] = { text = COLORS, frame = "CombatConfigColors" }, [4] = { text = FORMATTING, frame = "CombatConfigFormatting" }, [5] = { text = SETTINGS, frame = "CombatConfigSettings" }, }; CHAT_CONFIG_COMBAT_TAB_NAME = "CombatConfigTab"; function ChatConfigCombat_OnLoad() -- Create tabs local tab; local tabName = CHAT_CONFIG_COMBAT_TAB_NAME; local name, text; for index, value in ipairs(COMBAT_CONFIG_TABS) do name = tabName..index; if ( not _G[name] ) then tab = CreateFrame("BUTTON", name, ChatConfigBackgroundFrame, "ChatConfigTabTemplate"); if ( index > 1 ) then tab:SetPoint("BOTTOMLEFT", _G[tabName..(index-1)], "BOTTOMRIGHT", -1, 0); else tab:SetPoint("BOTTOMLEFT", ChatConfigBackgroundFrame, "TOPLEFT", 2, -1); end text = _G[name.."Text"]; text:SetText(value.text); tab:SetID(index); PanelTemplates_TabResize(tab, 0); end end end function ChatConfig_UpdateFilterList() local index; local offset = FauxScrollFrame_GetOffset(ChatConfigCombatSettingsFiltersScrollFrame); local button, buttonName, filter, text; for i=1, COMBATLOG_FILTERS_TO_DISPLAY do index = offset+i; buttonName = "ChatConfigCombatSettingsFiltersButton"..i; button = _G[buttonName]; if ( index <= #Blizzard_CombatLog_Filters.filters ) then text = Blizzard_CombatLog_Filters.filters[index].name; _G[buttonName.."NormalText"]:SetText(text); button.name = text; button:Show(); if ( index == ChatConfigCombatSettingsFilters.selectedFilter ) then button:LockHighlight(); else button:UnlockHighlight(); end else button:Hide(); end end if ( FauxScrollFrame_Update(ChatConfigCombatSettingsFiltersScrollFrame, #Blizzard_CombatLog_Filters.filters, COMBATLOG_FILTERS_TO_DISPLAY, CHATCONFIG_FILTER_HEIGHT ) ) then ChatConfigCombatSettingsFiltersButton1:SetPoint("TOPRIGHT", ChatConfigCombatSettingsFilters, "TOPRIGHT", -29, -7); else ChatConfigCombatSettingsFiltersButton1:SetPoint("TOPRIGHT", ChatConfigCombatSettingsFilters, "TOPRIGHT", -5, -7); end -- Update the combat log quick buttons Blizzard_CombatLog_Update_QuickButtons(); end function ChatConfigFilter_OnClick(id) if ( #Blizzard_CombatLog_Filters.filters > 0 ) then ChatConfigCombatSettingsFilters.selectedFilter = id; CHATCONFIG_SELECTED_FILTER = Blizzard_CombatLog_Filters.filters[ChatConfigCombatSettingsFilters.selectedFilter]; CHATCONFIG_SELECTED_FILTER_FILTERS = CHATCONFIG_SELECTED_FILTER.filters; CHATCONFIG_SELECTED_FILTER_COLORS = CHATCONFIG_SELECTED_FILTER.colors; CHATCONFIG_SELECTED_FILTER_SETTINGS = CHATCONFIG_SELECTED_FILTER.settings; end ChatConfig_UpdateFilterList(); ChatConfig_UpdateCombatSettings(); end function ChatConfig_UpdateCombatSettings() if ( #Blizzard_CombatLog_Filters.filters == 0 ) then ChatConfigCombatSettingsFiltersCopyFilterButton:Disable(); ChatConfigCombatSettingsFiltersDeleteButton:Disable(); ChatConfig_UpdateCombatTabs(0); for index, value in ipairs(COMBAT_CONFIG_TABS) do _G[value.frame]:Hide(); end return; elseif ( #Blizzard_CombatLog_Filters.filters == 1 ) then -- Don't allow them to delete the last filter for now ChatConfigCombatSettingsFiltersDeleteButton:Disable(); else ChatConfigCombatSettingsFiltersCopyFilterButton:Enable(); ChatConfigCombatSettingsFiltersDeleteButton:Enable(); end if ( CanCreateFilters() ) then ChatConfigCombatSettingsFiltersAddFilterButton:Enable(); else ChatConfigCombatSettingsFiltersAddFilterButton:Disable(); end ChatConfig_UpdateCheckboxes(CombatConfigMessageSourcesDoneBy); ChatConfig_UpdateCheckboxes(CombatConfigMessageSourcesDoneTo); ChatConfig_UpdateTieredCheckboxFrame(CombatConfigMessageTypesLeft); ChatConfig_UpdateTieredCheckboxFrame(CombatConfigMessageTypesRight); ChatConfig_UpdateTieredCheckboxFrame(CombatConfigMessageTypesMisc); ChatConfig_UpdateSwatches(CombatConfigColorsUnitColors); CombatConfig_Colorize_Update(); CombatConfig_Formatting_Update(); CombatConfig_Settings_Update(); CombatConfigSettingsNameEditBox:SetText(CHATCONFIG_SELECTED_FILTER.name); end function ChatConfig_UpdateChatSettings() ChatConfig_UpdateCheckboxes(ChatConfigChatSettingsLeft); -- Only do this if the ChannelSettings table has been created. It gets created OnShow() if ( ChatConfigChannelSettingsLeft.checkBoxTable ) then ChatConfig_UpdateCheckboxes(ChatConfigChannelSettingsLeft); end ChatConfig_UpdateCheckboxes(ChatConfigOtherSettingsCombat); ChatConfig_UpdateCheckboxes(ChatConfigOtherSettingsPVP); ChatConfig_UpdateCheckboxes(ChatConfigOtherSettingsSystem); ChatConfig_UpdateCheckboxes(ChatConfigOtherSettingsCreature); end function UsesGUID(direction) if ( direction == "SOURCE" and CHATCONFIG_SELECTED_FILTER_FILTERS[1].sourceFlags ) then for k,v in pairs( CHATCONFIG_SELECTED_FILTER_FILTERS[1].sourceFlags ) do if ( type(k) == "string" ) then return true; end end end if ( direction == "DEST" and CHATCONFIG_SELECTED_FILTER_FILTERS[1].destFlags ) then for k,v in pairs( CHATCONFIG_SELECTED_FILTER_FILTERS[1].destFlags ) do if ( type(k) == "string" ) then return true; end end end return false; end function IsMessageDoneBy(filter) local sourceFlags; if ( not CHATCONFIG_SELECTED_FILTER_FILTERS[1].sourceFlags ) then return true; end sourceFlags = CHATCONFIG_SELECTED_FILTER_FILTERS[1].sourceFlags; return sourceFlags[filter]; end function IsMessageDoneTo(filter) local destFlags; if ( UsesGUID( "SOURCE" ) or UsesGUID("DEST") ) then if ( not CHATCONFIG_SELECTED_FILTER_FILTERS[1].destFlags ) then return true; end destFlags = CHATCONFIG_SELECTED_FILTER_FILTERS[1].destFlags; else destFlags = Blizzard_CombatLog_Filters.filters[ChatConfigCombatSettingsFilters.selectedFilter].filters[2].destFlags; end return destFlags[filter]; end function HasMessageTypeGroup(checkBoxList, index) local subTypes = checkBoxList[index].subTypes; if ( subTypes ) then local state; for k, v in ipairs(subTypes) do state = GetMessageTypeState(v.type); if ( state == GRAY_CHECKED or state == UNCHECKED_DISABLED ) then return false; elseif ( state ) then --also catches UNCHECKED_ENABLED return true; end end end return false; end function HasMessageType(messageType) -- Only look at the first messageType passed in since we're treating them as a unit local isListening = GetMessageTypeState(messageType); if ( isListening == UNCHECKED_ENABLED or isListening == UNCHECKED_DISABLED ) then return false; elseif ( isListening ) then return true; else return false; end end function GetMessageTypeState(messageType) if ( type(messageType) == "table" ) then return CHATCONFIG_SELECTED_FILTER_FILTERS[1].eventList[messageType[1]]; else return CHATCONFIG_SELECTED_FILTER_FILTERS[1].eventList[messageType]; end end function ChatConfig_UpdateCombatTabs(selectedTabID) local tab, text, frame; for index, value in ipairs(COMBAT_CONFIG_TABS) do tab = _G[CHAT_CONFIG_COMBAT_TAB_NAME..index]; text = _G[CHAT_CONFIG_COMBAT_TAB_NAME..index.."Text"]; frame = _G[value.frame]; if ( (not Blizzard_CombatLog_Filters) or #Blizzard_CombatLog_Filters.filters == 0 ) then tab:SetAlpha(0.75); text:SetVertexColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b); elseif ( index == selectedTabID ) then tab:SetAlpha(1.0); text:SetVertexColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b); frame:Show(); else tab:SetAlpha(0.75); text:SetVertexColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b); frame:Hide(); end end end function ChatConfig_ShowCombatTabs() for index, _ in ipairs(COMBAT_CONFIG_TABS) do _G[CHAT_CONFIG_COMBAT_TAB_NAME..index]:Show(); end end function ChatConfig_HideCombatTabs() for index, _ in ipairs(COMBAT_CONFIG_TABS) do _G[CHAT_CONFIG_COMBAT_TAB_NAME..index]:Hide(); end end function CombatConfig_CreateCombatFilter(name, filter) local newFilter; if ( not filter ) then newFilter = CopyTable(DEFAULT_COMBATLOG_FILTER_TEMPLATE); else newFilter = CopyTable(filter); end if ( not name or name == "" ) then name = format(DEFAULT_COMBATLOG_FILTER_NAME, #Blizzard_CombatLog_Filters.filters); end newFilter.name = name; newFilter.tooltip = ""; tinsert(Blizzard_CombatLog_Filters.filters, newFilter); -- Scroll filters to top of list ChatConfigCombatSettingsFiltersScrollFrameScrollBar:SetValue(0); -- Select the new filter ChatConfigFilter_OnClick(#Blizzard_CombatLog_Filters.filters); -- If creating a filter when there wasn't any before then update the tabs with the first one selected if ( #Blizzard_CombatLog_Filters.filters == 1 ) then ChatConfig_UpdateCombatTabs(1); end end function CombatConfig_DeleteCurrentCombatFilter() -- Don't allow deletion of all filters if ( #Blizzard_CombatLog_Filters.filters <= 1 ) then return; end tremove(Blizzard_CombatLog_Filters.filters, ChatConfigCombatSettingsFilters.selectedFilter); -- If the deleted filter comes before or is the selected filter, force the current filter to the first if ( ChatConfigCombatSettingsFilters.selectedFilter <= Blizzard_CombatLog_Filters.currentFilter ) then Blizzard_CombatLog_QuickButton_OnClick(1); end -- Scroll filters to top of list ChatConfigCombatSettingsFiltersScrollFrameScrollBar:SetValue(0); -- Select the first filter ChatConfigFilter_OnClick(1); end function CombatConfig_SetCombatFiltersToDefault() Blizzard_CombatLog_Filters = CopyTable(Blizzard_CombatLog_Filter_Defaults); -- Have to call this because of the way the upvalues are setup in the combatlog Blizzard_CombatLog_RefreshGlobalLinks(); Blizzard_CombatLog_CurrentSettings = Blizzard_CombatLog_Filters.filters[1] ChatConfig_UpdateFilterList(); ChatConfigFilter_OnClick(1); ChatConfig_UpdateCombatTabs(1); end function ChatConfig_MoveFilterUp() local selectedFilter = ChatConfigCombatSettingsFilters.selectedFilter; if ( selectedFilter == 1 ) then return; end local newIndex = selectedFilter-1; tinsert(Blizzard_CombatLog_Filters.filters, newIndex, CHATCONFIG_SELECTED_FILTER); tremove(Blizzard_CombatLog_Filters.filters, selectedFilter+1); if ( selectedFilter == Blizzard_CombatLog_Filters.currentFilter ) then Blizzard_CombatLog_Filters.currentFilter = newIndex; elseif ( newIndex == Blizzard_CombatLog_Filters.currentFilter ) then Blizzard_CombatLog_Filters.currentFilter = Blizzard_CombatLog_Filters.currentFilter+1; end Blizzard_CombatLog_CurrentSettings = Blizzard_CombatLog_Filters.filters[Blizzard_CombatLog_Filters.currentFilter]; ChatConfigFilter_OnClick(newIndex); end function ChatConfig_MoveFilterDown() local selectedFilter = ChatConfigCombatSettingsFilters.selectedFilter; if ( selectedFilter >= #Blizzard_CombatLog_Filters.filters ) then selectedFilter = #Blizzard_CombatLog_Filters.filters; return; end local newIndex = selectedFilter+2; tinsert(Blizzard_CombatLog_Filters.filters, newIndex, CHATCONFIG_SELECTED_FILTER); tremove(Blizzard_CombatLog_Filters.filters, selectedFilter); if ( selectedFilter == Blizzard_CombatLog_Filters.currentFilter ) then Blizzard_CombatLog_Filters.currentFilter = selectedFilter+1; elseif ( selectedFilter+1 == Blizzard_CombatLog_Filters.currentFilter ) then Blizzard_CombatLog_Filters.currentFilter = selectedFilter; end Blizzard_CombatLog_CurrentSettings = Blizzard_CombatLog_Filters.filters[Blizzard_CombatLog_Filters.currentFilter]; ChatConfigFilter_OnClick(selectedFilter+1); end function ChatConfigCancel_OnClick() -- Copy the old settings back in place Blizzard_CombatLog_Filters = CopyTable(CHATCONFIG_SELECTED_FILTER_OLD_SETTINGS); -- Have to call this because of the way the upvalues are setup in the combatlog Blizzard_CombatLog_RefreshGlobalLinks(); CHATCONFIG_SELECTED_FILTER = Blizzard_CombatLog_Filters.filters[ChatConfigCombatSettingsFilters.selectedFilter]; -- Handle the case where the selected filter no longer exists!!! if ( not CHATCONFIG_SELECTED_FILTER ) then ChatConfigFilter_OnClick(1); HideUIPanel(ChatConfigFrame); return; end CHATCONFIG_SELECTED_FILTER_FILTERS = CHATCONFIG_SELECTED_FILTER.filters; CHATCONFIG_SELECTED_FILTER_COLORS = CHATCONFIG_SELECTED_FILTER.colors; CHATCONFIG_SELECTED_FILTER_SETTINGS = CHATCONFIG_SELECTED_FILTER.settings; HideUIPanel(ChatConfigFrame); end function CanCreateFilters() if ( #Blizzard_CombatLog_Filters.filters == MAX_COMBATLOG_FILTERS ) then return false; end return true; end function ChatConfigFrame_PlayCheckboxSound (checked) if ( checked ) then PlaySound("igMainMenuOptionCheckBoxOn"); else PlaySound("igMainMenuOptionCheckBoxOff"); end end