From 824b77d4f0ea608542261bdb3e6c0fdf59618f3d Mon Sep 17 00:00:00 2001 From: tercio Date: Thu, 14 Aug 2014 18:14:40 -0300 Subject: [PATCH] - Improvements done on Report Death and Spell List from Player Detail Window. - Added option for disable window group (snap). - Added option for select the icon pack instead of type the file name. - Fixed several bugs on profile and skins support. - Few fixes on Time Attack plugin. - New API: instance:SetMode (DETAILS_MODE_* SOLO RAID GROUP ALL) change the instance mode. - New API: instance:SetDisplay (segment, attribute, subattribute) change instance's display. - New API: framework:ShowTutorialAlertFrame (maintext, desctext, clickfunc) show an alert on the left side of screen. - New API: _detalhes:GetMaxInstancesAmount() return how many windows can be opened. - New API: _detalhes:GetFreeInstancesAmount() return how many windows can still be created. - New API: _detalhes:GetTutorialCVar (key, default) return a value from tutorial table. - New API: _detalhes:SetTutorialCVar (key, value) set a value on tutorial table. --- boot.lua | 17 +- classes/classe_instancia.lua | 126 ++---- classes/classe_instancia_include.lua | 12 +- classes/classe_others.lua | 41 +- core/plugins.lua | 4 + core/plugins_solo.lua | 12 +- core/timemachine.lua | 2 +- framework/button.lua | 149 ++++++- framework/framework.lua | 85 ++++ framework/label.lua | 9 + functions/profiles.lua | 56 ++- functions/savedata.lua | 3 +- gumps/janela_info.lua | 13 +- gumps/janela_options.lua | 337 +++++++++++---- gumps/janela_principal.lua | 385 ++++++------------ images/classes_small_bw.tga | Bin 0 -> 38604 bytes images/icons.tga | Bin 525802 -> 539962 bytes .../Details_TimeAttack/Details_TimeAttack.lua | 140 +++++-- .../Details_TinyThreat/Details_TinyThreat.lua | 46 ++- startup.lua | 2 +- 20 files changed, 878 insertions(+), 561 deletions(-) create mode 100644 images/classes_small_bw.tga diff --git a/boot.lua b/boot.lua index 2606f81c..2ffe6372 100644 --- a/boot.lua +++ b/boot.lua @@ -4,8 +4,8 @@ _ = nil _detalhes = LibStub("AceAddon-3.0"):NewAddon("_detalhes", "AceTimer-3.0", "AceComm-3.0", "AceSerializer-3.0", "NickTag-1.0") - _detalhes.build_counter = 32 --it's 33 for release - _detalhes.userversion = "v1.22.0" + _detalhes.build_counter = 32 --it's 36 for release + _detalhes.userversion = "v1.22.2" _detalhes.realversion = 25 _detalhes.version = _detalhes.userversion .. " (core " .. _detalhes.realversion .. ")" @@ -21,9 +21,15 @@ do --[[ |cFFFFFF00a1.22.0 (|cFFFFCC00Ago 10, 2014|r|cFFFFFF00)|r:\n\n |cFFFFFF00-|r Added support for hotcorners.\n\n +|cFFFFFF00-|r Few improvements on report for Deaths and Spells over Player Detail Window.\n\n +|cFFFFFF00-|r Added option for disable window groups.\n\n +|cFFFFFF00-|r Added option for select the icon pack to use, also added black white icon pack.\n\n +|cFFFFFF00-|r Fixed many bugs involving skins and profiles, thing should run more smooth now.\n\n +|cFFFFFF00-|r Plugin Time Attack now correctly saves the attempt when pressing the big save button.\n\n + --]] - Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00a1.22.0 (|cFFFFCC00Ago 10, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added support for hotcorners.\n\n|cFFFFFF00v1.21.4 (|cFFFFCC00Ago 9, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added Shaman's Ancestral Guidance on cooldowns list |cFF999999(thanks @skmzarn-mmochampion forum)|r.\n\n|cFFFFFF00-|r Added a profile selection screen when Details! are running for the first time on a character.\n\n|cFFFFFF00-|r Added Menu Text Size option over miscellaneous section on options panel |cFF999999(thanks @ Revi-mmochampion forum)|r.\n\n|cFFFFFF00-|r Fixed a bug over Healing Player Details Window where pets wasn't being shown |cFF999999(thanks @Mystery2012-mmochampion forum)|r.\n\n|cFFFFFF00-|r Fixed issue with summoning pets with unknown owners where it was breaking the summon of all the others pets. |cFF999999(thanks @ThunderLost-curse website)|r.\n\n|cFFFFFF00-|r Hot Corners isn't no more a part of Details!, instead of that, Hot Corner is now a standalone addon which needs to be installed separately for who wants to use it.\n\n|cFFFFFF00-|r Skin data is now stored inside the profiles, many code parts got rewrite, still may have few bugs but it's more reliable then before.\n\n|cFFFFFF00-|r Rework on Auras and Voidzones: now shows damage, dps and percentage. Also its tooltip got fixes and now shows the correct damage done to players.\n\n|cFFFFFF00-|r Tooltip for Enemies now shows damage taken from players |cFF999999(thanks @Arieth-mmochampion forum)|r.\n\n|cFFFFFF00-|r Right clicking a real-time enemy bar, makes it back to Enemies display instead of show Bookmark panel |cFF999999(thanks @Arieth-mmochampion forum)|r.\n\n|cFFFFFF00-|r Tank comparison from previous segment now uses the same percentage method from player comparison panel.\n\n|cFFFFFF00-|r Fix bug with the slash command 'show' where was ignoring the window limit set on options panel |cFF999999(thanks @Castiel-US-Azralon realm)|r.\n\n|cFFFFFF00-|r Fixed few bugs with scroll bars, including scrolls on dropdown menu and player detail window |cFF999999(thanks @Revi-mmochampion forum)|r.\n\n|cFFFFFF00v1.20.2 (|cFFFFCC00Aug 1, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added a option under Miscellaneous section to provide spell link instead of spell name for helpful spells when reporting a death |cFF999999(thanks @skmzarn-mmochampion forum)|r.\n\n|cFFFFFF00-|r Improvements done on how deaths are handled, now latest events before death will be more precise.\n\n|cFFFFFF00-|r Implemented Damage Taken from environment like lava, gravity, etc.\n\n|cFFFFFF00-|r Added Warlock's Fire and Brimstone spell on customized spells.\n\n|cFFFFFF00-|r Added dwarf racial Stone Form on cooldown list |cFF999999(thanks @Mystery2012-mmochampion forum)|r.\n\n|cFFFFFF00-|r Bookmark now are shared between all characters.\n\n|cFFFFFF00-|r Fixed few inconsistencies with trash recognition.\n\n|cFFFFFF00-|r Fixed Cloud Capture where sometimes it wasn't sharing.\n\n|cFFFFFF00-|r Fixed report where it wasn't sharing for guild and raid when the player name box were empty.\n\n|cFFFFFF00-|r Report box now also saves the position and the last channel used to report |cFF999999(thanks @skmzarn-mmochampion forum)|r.\n\n|cFFFFFF00-|r You Are Not Prepared plugin now have tooltips for spells and its window auto opens after a boss encounter.\n\n|cFFFFFF00-|r Advanced Death Logs plugin got full rewrite (and still are in development).\n\n|cFFFFFF00v1.19.0 - v1.19.1 - v1.19.2 (|cFFFFCC00Jul 21, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Details! is now able to be translated by its community for all supported languages through Curse Forge Web Site:\n\n|cFFFFFF00http://wow.curseforge.com/addons/details/localization/|r\n\n|cFFFFFF00-|r Slash commands now are multi language, accepting both english and the localized language.\n\n|cFFFFFF00-|r Added Data Broker for: Combat Time, Player Dps and Player Hps.\n\n|cFFFFFF00-|r Rework on plugins: Timeline, You Are Not Prepared, Tiny Threat, Encounter Details. All those plugins got a options panel and few improvaments.\n\n|cFFFFFF00-|r Trash segments won't be saved anymore.\n\n|cFFFFFF00-|r Added support for plugins options.\n\n|cFFFFFF00-|r Revamp on Deaths report lines, adding links for harmful spells and changing the text order |cFF999999(thanks @skmzarn-mmochampion forum)|r.\n\n|cFFFFFF00-|r Modified the percentage used on Comparison panel |cFF999999(thanks @Mystery2012-mmochampion forum)|r.\n\n|cFFFFFF00-|r Fixed the Raid Dps and Hps data exported by Data Broker |cFF999999(thanks @Arieth-mmochampion forum)|r.\n\n|cFFFFFF00v1.18.4 - v1.18.5 - v1.18.6 (|cFFFFCC00Jul 13, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added option to customize the bar left text.\n\n|cFFFFFF00-|r Added option for show or hide bar placement number.\n\n|cFFFFFF00-|r Spell icon is shown in the bar when the enemy character is a environment spell type.\n\n|cFFFFFF00-|r Changed the non-player enemy icon (monsters).\n\n|cFFFFFF00-|r Fixed bug on flex performance profile |cFF999999(thanks @skmzarn-mmochampion forum)|r.\n\n|cFFFFFF00-|r Added new version tracker which should alert you when a newer Details! version is found.\n\n|cFFFFFF00-|r Added Enemy Damage Taken by clicking with middle mouse button over a enemy bar (enemies display).\n\n|cFFFFFF00-|r Added import/export for saved skins and custom displays created.\n\n|cFFFFFF00-|r Small changes on ElvUI Frame Style skin (need reaply).\n\n|cFFFFFF00-|r Fixed the death recognition for bosses, now it should show the correct color over segments menu.\n\n|cFFFFFF00-|r Fixed Dps inacuracy when plyaing solo (no party or raid group).\n\n|cFFFFFF00-|r Fixed the duration time of buffs applied before the pull, like pre-potions.\n\n|cFFFFFF00v1.17.5 (|cFFFFCC00Jun 30, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Shortcut panel is now known as Bookmarks and a revamp has done on its panel.\n\n|cFFFFFF00-|r NickTag now doesnt check anymore if a received nickname from other guild member is invalid.\n\n|cFFFFFF00-|r Healthstone now is considered a cooldown.\n\n|cFFFFFF00-|r Few improvements on Default Skin, Minimalistic Skin and ElvUI Frame Style Skin.\n\n|cFFFFFF00-|r Revamp on Image Editor, many bugs solves and now it is usable.\n\n|cFFFFFF00-|r 'Hide' slash command now hides all opened windows; 'Show', open all closed windows and 'New' create a new window.\n\n|cFFFFFF00-|r Added Devotion Aura, Rallying Cry as cooldowns.\n\n|cFFFFFF00-|r Added options for lock, unlock, break snap, close, reopen and create new window.\n\n|cFFFFFF00-|r Added a options panel for HotCorners, access it through options button or slash hotcorner command.\n\n|cFFFFFF00-|r Added 'Logos' and 'Raid & Dungeons' sections for Wallpapers. \n\n|cFFFFFF00-|r Added a option to load a image from the computer to use as wallpaper.\n\n|cFFFFFF00-|r Fixed the percent issue with Healing Done and HPS while in combat.\n\n|cFFFFFF00-|r Fixed non-combat switch by role where changing role wasnt changing the shown attribute.\n\n|cFFFFFF00-|r Fixed 'While in Combat' hiding schema |cFF999999(thanks @skmzarn-mmochampion forum)|r.\n\n|cFFFFFF00-|r Fixed several bugs on Interact Auto Transparency.\n\n|cFFFFFF00-|r Fixed the report window alert when opening the report window and it already is opened |cFF999999(thanks @Rasstapp-mmochampion forum)|r.\n\n|cFFFFFF00-|r Fixed the gap between last row created and the end of the window.\n\n|cFFFFFF00-|r Fixed all tooltips bugs on Wallpaper Section on Options Panel.\n\n|cFFFFFF00a1.17.0 (|cFFFFCC00Jun 21, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Support for Custom Displays has been rewrited, to access the new panel go to Sword Menu -> Custom -> Create New Display.\n\n|cFFFFFF00-|r Added a custom display for show potion usage.\n\n|cFFFFFF00-|r Fixed a bug where the player pet wasnt being tracked after logon in the game. This bug was affecting directly classes with pets playing out of a raid group." + Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00a1.22.2 (|cFFFFCC00Ago 14, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Few improvements on report for Deaths and Spells over Player Detail Window.\n\n|cFFFFFF00-|r Added option for disable window groups.\n\n|cFFFFFF00-|r Added option for select the icon pack to use, also added black white icon pack.\n\n|cFFFFFF00-|r Fixed many bugs involving skins and profiles, thing should run more smooth now.\n\n|cFFFFFF00-|r Plugin Time Attack now correctly saves the attempt when pressing the big save button.\n\n|cFFFFFF00-|r Added support for hotcorners.\n\n|cFFFFFF00v1.21.4 (|cFFFFCC00Ago 9, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added Shaman's Ancestral Guidance on cooldowns list |cFF999999(thanks @skmzarn-mmochampion forum)|r.\n\n|cFFFFFF00-|r Added a profile selection screen when Details! are running for the first time on a character.\n\n|cFFFFFF00-|r Added Menu Text Size option over miscellaneous section on options panel |cFF999999(thanks @ Revi-mmochampion forum)|r.\n\n|cFFFFFF00-|r Fixed a bug over Healing Player Details Window where pets wasn't being shown |cFF999999(thanks @Mystery2012-mmochampion forum)|r.\n\n|cFFFFFF00-|r Fixed issue with summoning pets with unknown owners where it was breaking the summon of all the others pets. |cFF999999(thanks @ThunderLost-curse website)|r.\n\n|cFFFFFF00-|r Hot Corners isn't no more a part of Details!, instead of that, Hot Corner is now a standalone addon which needs to be installed separately for who wants to use it.\n\n|cFFFFFF00-|r Skin data is now stored inside the profiles, many code parts got rewrite, still may have few bugs but it's more reliable then before.\n\n|cFFFFFF00-|r Rework on Auras and Voidzones: now shows damage, dps and percentage. Also its tooltip got fixes and now shows the correct damage done to players.\n\n|cFFFFFF00-|r Tooltip for Enemies now shows damage taken from players |cFF999999(thanks @Arieth-mmochampion forum)|r.\n\n|cFFFFFF00-|r Right clicking a real-time enemy bar, makes it back to Enemies display instead of show Bookmark panel |cFF999999(thanks @Arieth-mmochampion forum)|r.\n\n|cFFFFFF00-|r Tank comparison from previous segment now uses the same percentage method from player comparison panel.\n\n|cFFFFFF00-|r Fix bug with the slash command 'show' where was ignoring the window limit set on options panel |cFF999999(thanks @Castiel-US-Azralon realm)|r.\n\n|cFFFFFF00-|r Fixed few bugs with scroll bars, including scrolls on dropdown menu and player detail window |cFF999999(thanks @Revi-mmochampion forum)|r.\n\n|cFFFFFF00v1.20.2 (|cFFFFCC00Aug 1, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added a option under Miscellaneous section to provide spell link instead of spell name for helpful spells when reporting a death |cFF999999(thanks @skmzarn-mmochampion forum)|r.\n\n|cFFFFFF00-|r Improvements done on how deaths are handled, now latest events before death will be more precise.\n\n|cFFFFFF00-|r Implemented Damage Taken from environment like lava, gravity, etc.\n\n|cFFFFFF00-|r Added Warlock's Fire and Brimstone spell on customized spells.\n\n|cFFFFFF00-|r Added dwarf racial Stone Form on cooldown list |cFF999999(thanks @Mystery2012-mmochampion forum)|r.\n\n|cFFFFFF00-|r Bookmark now are shared between all characters.\n\n|cFFFFFF00-|r Fixed few inconsistencies with trash recognition.\n\n|cFFFFFF00-|r Fixed Cloud Capture where sometimes it wasn't sharing.\n\n|cFFFFFF00-|r Fixed report where it wasn't sharing for guild and raid when the player name box were empty.\n\n|cFFFFFF00-|r Report box now also saves the position and the last channel used to report |cFF999999(thanks @skmzarn-mmochampion forum)|r.\n\n|cFFFFFF00-|r You Are Not Prepared plugin now have tooltips for spells and its window auto opens after a boss encounter.\n\n|cFFFFFF00-|r Advanced Death Logs plugin got full rewrite (and still are in development).\n\n|cFFFFFF00v1.19.0 - v1.19.1 - v1.19.2 (|cFFFFCC00Jul 21, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Details! is now able to be translated by its community for all supported languages through Curse Forge Web Site:\n\n|cFFFFFF00http://wow.curseforge.com/addons/details/localization/|r\n\n|cFFFFFF00-|r Slash commands now are multi language, accepting both english and the localized language.\n\n|cFFFFFF00-|r Added Data Broker for: Combat Time, Player Dps and Player Hps.\n\n|cFFFFFF00-|r Rework on plugins: Timeline, You Are Not Prepared, Tiny Threat, Encounter Details. All those plugins got a options panel and few improvaments.\n\n|cFFFFFF00-|r Trash segments won't be saved anymore.\n\n|cFFFFFF00-|r Added support for plugins options.\n\n|cFFFFFF00-|r Revamp on Deaths report lines, adding links for harmful spells and changing the text order |cFF999999(thanks @skmzarn-mmochampion forum)|r.\n\n|cFFFFFF00-|r Modified the percentage used on Comparison panel |cFF999999(thanks @Mystery2012-mmochampion forum)|r.\n\n|cFFFFFF00-|r Fixed the Raid Dps and Hps data exported by Data Broker |cFF999999(thanks @Arieth-mmochampion forum)|r.\n\n|cFFFFFF00v1.18.4 - v1.18.5 - v1.18.6 (|cFFFFCC00Jul 13, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added option to customize the bar left text.\n\n|cFFFFFF00-|r Added option for show or hide bar placement number.\n\n|cFFFFFF00-|r Spell icon is shown in the bar when the enemy character is a environment spell type.\n\n|cFFFFFF00-|r Changed the non-player enemy icon (monsters).\n\n|cFFFFFF00-|r Fixed bug on flex performance profile |cFF999999(thanks @skmzarn-mmochampion forum)|r.\n\n|cFFFFFF00-|r Added new version tracker which should alert you when a newer Details! version is found.\n\n|cFFFFFF00-|r Added Enemy Damage Taken by clicking with middle mouse button over a enemy bar (enemies display).\n\n|cFFFFFF00-|r Added import/export for saved skins and custom displays created.\n\n|cFFFFFF00-|r Small changes on ElvUI Frame Style skin (need reaply).\n\n|cFFFFFF00-|r Fixed the death recognition for bosses, now it should show the correct color over segments menu.\n\n|cFFFFFF00-|r Fixed Dps inacuracy when plyaing solo (no party or raid group).\n\n|cFFFFFF00-|r Fixed the duration time of buffs applied before the pull, like pre-potions.\n\n|cFFFFFF00v1.17.5 (|cFFFFCC00Jun 30, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Shortcut panel is now known as Bookmarks and a revamp has done on its panel.\n\n|cFFFFFF00-|r NickTag now doesnt check anymore if a received nickname from other guild member is invalid.\n\n|cFFFFFF00-|r Healthstone now is considered a cooldown.\n\n|cFFFFFF00-|r Few improvements on Default Skin, Minimalistic Skin and ElvUI Frame Style Skin.\n\n|cFFFFFF00-|r Revamp on Image Editor, many bugs solves and now it is usable.\n\n|cFFFFFF00-|r 'Hide' slash command now hides all opened windows; 'Show', open all closed windows and 'New' create a new window.\n\n|cFFFFFF00-|r Added Devotion Aura, Rallying Cry as cooldowns.\n\n|cFFFFFF00-|r Added options for lock, unlock, break snap, close, reopen and create new window.\n\n|cFFFFFF00-|r Added a options panel for HotCorners, access it through options button or slash hotcorner command.\n\n|cFFFFFF00-|r Added 'Logos' and 'Raid & Dungeons' sections for Wallpapers. \n\n|cFFFFFF00-|r Added a option to load a image from the computer to use as wallpaper.\n\n|cFFFFFF00-|r Fixed the percent issue with Healing Done and HPS while in combat.\n\n|cFFFFFF00-|r Fixed non-combat switch by role where changing role wasnt changing the shown attribute.\n\n|cFFFFFF00-|r Fixed 'While in Combat' hiding schema |cFF999999(thanks @skmzarn-mmochampion forum)|r.\n\n|cFFFFFF00-|r Fixed several bugs on Interact Auto Transparency.\n\n|cFFFFFF00-|r Fixed the report window alert when opening the report window and it already is opened |cFF999999(thanks @Rasstapp-mmochampion forum)|r.\n\n|cFFFFFF00-|r Fixed the gap between last row created and the end of the window.\n\n|cFFFFFF00-|r Fixed all tooltips bugs on Wallpaper Section on Options Panel.\n\n|cFFFFFF00a1.17.0 (|cFFFFCC00Jun 21, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Support for Custom Displays has been rewrited, to access the new panel go to Sword Menu -> Custom -> Create New Display.\n\n|cFFFFFF00-|r Added a custom display for show potion usage.\n\n|cFFFFFF00-|r Fixed a bug where the player pet wasnt being tracked after logon in the game. This bug was affecting directly classes with pets playing out of a raid group." Loc ["STRING_DETAILS1"] = "|cffffaeaeDetails!:|r " --> startup @@ -202,6 +208,11 @@ do [_detalhes._detalhes_props["MODO_ALL"]] = Loc ["STRING_MODE_ALL"], [_detalhes._detalhes_props["MODO_RAID"]] = Loc ["STRING_MODE_RAID"] } + + --[[global]] DETAILS_MODE_SOLO = 1 + --[[global]] DETAILS_MODE_RAID = 4 + --[[global]] DETAILS_MODE_GROUP = 2 + --[[global]] DETAILS_MODE_ALL = 3 _detalhes.icones = { --> report window diff --git a/classes/classe_instancia.lua b/classes/classe_instancia.lua index b8e295df..90f5ed53 100644 --- a/classes/classe_instancia.lua +++ b/classes/classe_instancia.lua @@ -220,6 +220,14 @@ function _detalhes:GetDisplay() return self.atributo, self.sub_atributo end +function _detalhes:GetMaxInstancesAmount() + return _detalhes.instances_amount +end + +function _detalhes:GetFreeInstancesAmount() + return _detalhes.instances_amount - #_detalhes.tabela_instancias +end + ------------------------------------------------------------------------------------------------------------------------ --> retorna se a instância esta ou não ativa @@ -255,7 +263,8 @@ end self.verticalSnap = config.verticalSnap self.sub_atributo_last = config.sub_atributo_last self.isLocked = config.isLocked - + self.last_raid_plugin = config.last_raid_plugin + end end @@ -367,8 +376,8 @@ end self.baseframe.lock_button:SetWidth (self.baseframe.lock_button.label:GetStringWidth()+2) self.baseframe.lock_button:ClearAllPoints() self.baseframe.lock_button:SetPoint ("bottomright", self.baseframe, "bottomright", -3, 0) - self.baseframe.resize_direita:SetAlpha (1) - self.baseframe.resize_esquerda:SetAlpha (1) + self.baseframe.resize_direita:SetAlpha (0) + self.baseframe.resize_esquerda:SetAlpha (0) end end end @@ -468,14 +477,6 @@ end return false end - --> check is is open - --if (instance:IsEnabled()) then - -- instance:ShutDown() - --end - - -- deletei a janela 1 - -- a janela 2 ficou com snap [1] = 1 [3] = 3 - --> break snaps of previous and next window local left_instance = _detalhes:GetInstance (id-1) if (left_instance) then @@ -511,84 +512,6 @@ end table.remove (_detalhes.tabela_instancias, id) - if (true) then - return - end - - table.remove (_detalhes.local_instances_config, id) - _detalhes:SaveProfile() - _detalhes:SaveLocalInstanceConfig() - table.insert (_detalhes.tabela_instancias, 3, instance) - _detalhes:ApplyProfile (_detalhes:GetCurrentProfileName(), true) - - if (true) then - return - end - - --> break snaps of previous and next window - local left_instance = _detalhes:GetInstance (id-1) - if (left_instance) then - for index, instance_id in _pairs (left_instance.snap) do - if (index == id) then --snap na proxima instancia - left_instance.snap [index] = nil - end - end - end - local right_instance = _detalhes:GetInstance (id+1) - if (right_instance) then - for index, instance_id in _pairs (right_instance.snap) do - if (index == id) then --snap na proxima instancia - right_instance.snap [index] = nil - end - end - end - - --> copy skins from next instances - for i = id+1, #_detalhes.tabela_instancias do - local current_instance = _detalhes:GetInstance (i-1) - local next_instance = _detalhes:GetInstance (i) - - if (next_instance) then - local exported = next_instance:ExportSkin() - - end - end - - --fixas os snaps nas janelas superiores - for i = id+1, #_detalhes.tabela_instancias do - local this_instance = _detalhes:GetInstance (i) - - --down the id - this_instance.meu_id = i-1 - - --fix the snaps - for index, id in _pairs (this_instance.snap) do - if (id == i+1) then --snap na proxima instancia - this_instance.snap [index] = i - elseif (id == i-1) then --snap na instancia anterior - this_instance.snap [index] = i-2 - end - end - end - - - - - - --remover do container tabela_instancias - - -- fiz alterações das outras instancias, precisa salvar agora? // ele salva ao sair ou mudar o profile - -- remover a instancia do container deste profile - - --local profile = _detalhes:GetProfile (current_profile_name) - --local saved_skins = profile.instances - --tremove (saved_skins, id) - - --tremove (_detalhes.tabela_instancias, id) - - --> save the current profile - _detalhes:SaveProfile() - end @@ -619,6 +542,18 @@ end end local new_instance = _detalhes:NovaInstancia (next_id) + + if (_detalhes.standard_skin) then + for key, value in pairs (_detalhes.standard_skin) do + if (type (value) == "table") then + new_instance [key] = table_deepcopy (value) + else + new_instance [key] = value + end + end + new_instance:ChangeSkin() + end + return new_instance elseif (id) then @@ -1795,6 +1730,13 @@ function _detalhes:AtualizaSegmentos_AfterCombat (instancia, historico) end +function _detalhes:SetDisplay (segmento, atributo, sub_atributo, iniciando_instancia, InstanceMode) + if (not self.meu_id) then + return + end + return self:TrocaTabela (segmento, atributo, sub_atributo, iniciando_instancia, InstanceMode) +end + function _detalhes:TrocaTabela (instancia, segmento, atributo, sub_atributo, iniciando_instancia, InstanceMode) if (self and self.meu_id and not instancia) then --> self é uma instância @@ -2334,6 +2276,10 @@ function _detalhes:ChangeIcon (icon) end end +function _detalhes:SetMode (qual) + return self:AlteraModo (qual) +end + function _detalhes:AlteraModo (instancia, qual, from_mode_menu) if (_type (instancia) == "number") then @@ -2797,7 +2743,7 @@ function _detalhes:envia_relatorio (linhas, custom) local segmento = self.segmento local luta = nil - + if (not custom) then if (segmento == -1) then --overall luta = Loc ["STRING_REPORT_LAST"] .. " " .. #_detalhes.tabela_historico.tabelas .. " " .. Loc ["STRING_REPORT_FIGHTS"] diff --git a/classes/classe_instancia_include.lua b/classes/classe_instancia_include.lua index df9876e6..d0f2dc7d 100644 --- a/classes/classe_instancia_include.lua +++ b/classes/classe_instancia_include.lua @@ -2,7 +2,7 @@ local _detalhes = _G._detalhes local SharedMedia = LibStub:GetLibrary("LibSharedMedia-3.0") -function _detalhes:ResetInstanceConfig() +function _detalhes:ResetInstanceConfig (maintainsnap) for key, value in pairs (_detalhes.instance_defaults) do if (type (value) == "table") then self [key] = table_deepcopy (value) @@ -10,10 +10,12 @@ function _detalhes:ResetInstanceConfig() self [key] = value end end - self.snap = {} - self.horizontalSnap = nil - self.verticalSnap = nil - self:LockInstance (false) + if (not maintainsnap) then + self.snap = {} + self.horizontalSnap = nil + self.verticalSnap = nil + self:LockInstance (false) + end end function _detalhes:LoadInstanceConfig() diff --git a/classes/classe_others.lua b/classes/classe_others.lua index 34550388..ef1355ae 100644 --- a/classes/classe_others.lua +++ b/classes/classe_others.lua @@ -300,9 +300,14 @@ function atributo_misc:ReportSingleDeadLine (morte, instancia) if (evento [1] and type (evento [1]) == "boolean") then --> damage if (evento [3]) then local elapsed = _cstr ("%.1f", evento [4] - time_of_death) .."s" - local spelllink = GetSpellLink (evento [2]) - local source = _detalhes:GetOnlyName (evento [6]) local spellname, _, spellicon = _GetSpellInfo (evento [2]) + local spelllink + if (evento [2] > 10) then + spelllink = GetSpellLink (evento [2]) + else + spelllink = spellname + end + local source = _detalhes:GetOnlyName (evento [6]) local amount = evento [3] local hp = _math_floor (evento [5] / max_health * 100) if (hp > 100) then @@ -331,36 +336,16 @@ function atributo_misc:ReportSingleDeadLine (morte, instancia) end end - -- ELAPSED | HP | LINK | SOURCE - local bigger_len = 0 - for index, table in _ipairs (report_array) do - local spell = table [2] --[[ - _detalhes.fontstring_len:SetText (spell) - local stringlen = _detalhes.fontstring_len:GetStringWidth() - while (stringlen < default_len) do - spell = spell .. " " - _detalhes.fontstring_len:SetText (spell) - stringlen = _detalhes.fontstring_len:GetStringWidth() - end - table [2] = spell--]] - reportar [#reportar+1] = table [1] .. table [4] .. spell .. table [3] + for index = #report_array, 1, -1 do + local table = report_array [index] + reportar [#reportar+1] = table [1] .. table [4] .. table [2] .. table [3] end - return _detalhes:Reportar (reportar, {_no_current = true, _no_inverse = true, _custom = true}) + --for index, table in _ipairs (report_array) do + -- reportar [#reportar+1] = table [1] .. table [4] .. table [2] .. table [3] + --end - --[[ - local barra = instancia.barras [morte.minha_barra] - local reportar = {"Details! " .. Loc ["STRING_REPORT_SINGLE_DEATH"] .. " " .. morte [3] .. " " .. barra.texto_esquerdo:GetText()} --> localize-me - for i = 1, GameCooltip:GetNumLines() do - local texto_left, texto_right = GameCooltip:GetText (i) - - if (texto_left and texto_right) then - texto_left = texto_left:gsub (("|T(.*)|t "), "") - reportar [#reportar+1] = ""..texto_left.." "..texto_right.."" - end - end return _detalhes:Reportar (reportar, {_no_current = true, _no_inverse = true, _custom = true}) - --]] end function atributo_misc:ReportSingleCooldownLine (misc_actor, instancia) diff --git a/core/plugins.lua b/core/plugins.lua index eafa85e4..d4ea9045 100644 --- a/core/plugins.lua +++ b/core/plugins.lua @@ -141,6 +141,10 @@ _detalhes.PluginCount.STATUSBAR = _detalhes.PluginCount.STATUSBAR + 1 end + if (saved_table) then + PluginObject.db = saved_table + end + if (PluginObject.__enabled) then return true, saved_table, true else diff --git a/core/plugins_solo.lua b/core/plugins_solo.lua index 542a1d91..39765809 100644 --- a/core/plugins_solo.lua +++ b/core/plugins_solo.lua @@ -165,8 +165,16 @@ return end - --> jump to the next - if (_switchTo == -1) then + --> if passed the absolute plugin name + if (type (_switchTo) == "string") then + for index, ptable in ipairs (_detalhes.SoloTables.Menu) do + if (ptable [3].__enabled and ptable [4] == _switchTo) then + _switchTo = index + break + end + end + + elseif (_switchTo == -1) then _switchTo = _detalhes.SoloTables.Mode + 1 if (_switchTo > #_detalhes.SoloTables.Plugins) then _switchTo = 1 diff --git a/core/timemachine.lua b/core/timemachine.lua index 122cc955..a28f154c 100644 --- a/core/timemachine.lua +++ b/core/timemachine.lua @@ -38,7 +38,7 @@ for nome, jogador in _ipairs (tabela) do if (jogador) then - local ultima_acao = jogador.last_event+3 + local ultima_acao = jogador.last_event+10 if (ultima_acao > _tempo) then --> okey o jogador esta dando dps if (jogador.on_hold) then --> o dps estava pausado, retornar a ativa diff --git a/framework/button.lua b/framework/button.lua index 84e6d1c9..b9c9b5d7 100644 --- a/framework/button.lua +++ b/framework/button.lua @@ -309,7 +309,10 @@ local ButtonMetaFunctions = {} end -- textcolor - function ButtonMetaFunctions:SetTextColor (color) + function ButtonMetaFunctions:SetTextColor (color, arg2, arg3, arg4) + if (arg2) then + return self.button.text:SetTextColor (color, arg2, arg3, arg4 or 1) + end local _value1, _value2, _value3, _value4 = gump:ParseColors (color) return self.button.text:SetTextColor (_value1, _value2, _value3, _value4) end @@ -397,7 +400,12 @@ local ButtonMetaFunctions = {} self.icon:SetTexCoord (0, 1, 0, 1) end if (overlay) then - self.icon:SetVertexColor (unpack (overlay)) + if (type (overlay) == "string") then + local r, g, b, a = gump:ParseColors (overlay) + self.icon:SetVertexColor (r, g, b, a) + else + self.icon:SetVertexColor (unpack (overlay)) + end else self.icon:SetVertexColor (1, 1, 1, 1) end @@ -471,31 +479,67 @@ local ButtonMetaFunctions = {} end --> custom textures - function ButtonMetaFunctions:InstallCustomTexture (texture, rect, coords) + function ButtonMetaFunctions:InstallCustomTexture (texture, rect, coords, use_split) self.button:SetNormalTexture (nil) self.button:SetPushedTexture (nil) self.button:SetDisabledTexture (nil) self.button:SetHighlightTexture (nil) + + local button = self.button - texture = texture or "Interface\\AddOns\\Details\\images\\default_button" - self.button.texture = self.button:CreateTexture (nil, "artwork") + if (use_split) then + + --> 4 corners + button.textureTopLeft = button:CreateTexture (nil, "artwork"); button.textureTopLeft:SetSize (8, 8); button.textureTopLeft:SetPoint ("topleft", button) + button.textureTopRight = button:CreateTexture (nil, "artwork"); button.textureTopRight:SetSize (8, 8); button.textureTopRight:SetPoint ("topright", button) + button.textureBottomLeft = button:CreateTexture (nil, "artwork"); button.textureBottomLeft:SetSize (8, 8); button.textureBottomLeft:SetPoint ("bottomleft", button) + button.textureBottomRight = button:CreateTexture (nil, "artwork"); button.textureBottomRight:SetSize (8, 8); button.textureBottomRight:SetPoint ("bottomright", button) + + button.textureLeft = button:CreateTexture (nil, "artwork"); button.textureLeft:SetWidth (4); button.textureLeft:SetPoint ("topleft", button.textureTopLeft, "bottomleft"); button.textureLeft:SetPoint ("bottomleft", button.textureBottomLeft, "topleft") + button.textureRight = button:CreateTexture (nil, "artwork"); button.textureRight:SetWidth (4); button.textureRight:SetPoint ("topright", button.textureTopRight, "bottomright"); button.textureRight:SetPoint ("bottomright", button.textureBottomRight, "topright") + button.textureTop = button:CreateTexture (nil, "artwork"); button.textureTop:SetHeight (4); button.textureTop:SetPoint ("topleft", button.textureTopLeft, "topright"); button.textureTop:SetPoint ("topright", button.textureTopRight, "topleft"); + button.textureBottom = button:CreateTexture (nil, "artwork"); button.textureBottom:SetHeight (4); button.textureBottom:SetPoint ("bottomleft", button.textureBottomLeft, "bottomright"); button.textureBottom:SetPoint ("bottomright", button.textureBottomRight, "bottomleft"); + + button.textureLeft:SetTexCoord (0, 4/128, 9/128, 24/128) + button.textureRight:SetTexCoord (124/128, 1, 9/128, 24/128) + button.textureTop:SetTexCoord (9/128, 120/128, 0, 4/128) + button.textureBottom:SetTexCoord (9/128, 119/128, 28/128, 32/128) + + button.textureTopLeft:SetTexCoord (0, 8/128, 0, 8/128) + button.textureTopRight:SetTexCoord (121/128, 1, 0, 8/128) + button.textureBottomLeft:SetTexCoord (0, 8/128, 24/128, 32/128) + button.textureBottomRight:SetTexCoord (120/128, 1, 24/128, 32/128) + + button.textureTopLeft:SetTexture ([[Interface\AddOns\Details\images\default_button]]) + button.textureTopRight:SetTexture ([[Interface\AddOns\Details\images\default_button]]) + button.textureBottomLeft:SetTexture ([[Interface\AddOns\Details\images\default_button]]) + button.textureBottomRight:SetTexture ([[Interface\AddOns\Details\images\default_button]]) + button.textureLeft:SetTexture ([[Interface\AddOns\Details\images\default_button]]) + button.textureRight:SetTexture ([[Interface\AddOns\Details\images\default_button]]) + button.textureTop:SetTexture ([[Interface\AddOns\Details\images\default_button]]) + button.textureBottom:SetTexture ([[Interface\AddOns\Details\images\default_button]]) - if (not rect) then - self.button.texture:SetAllPoints (self.button) else - self.button.texture:SetPoint ("topleft", self.button, "topleft", rect.x1, rect.y1) - self.button.texture:SetPoint ("bottomright", self.button, "bottomright", rect.x2, rect.y2) + texture = texture or "Interface\\AddOns\\Details\\images\\default_button" + self.button.texture = self.button:CreateTexture (nil, "artwork") + + if (not rect) then + self.button.texture:SetAllPoints (self.button) + else + self.button.texture:SetPoint ("topleft", self.button, "topleft", rect.x1, rect.y1) + self.button.texture:SetPoint ("bottomright", self.button, "bottomright", rect.x2, rect.y2) + end + + if (coords) then + self.button.texture.coords = coords + self.button.texture:SetTexCoord (_unpack (coords.Normal)) + else + self.button.texture:SetTexCoord (0, 1, 0, 0.24609375) + end + + self.button.texture:SetTexture (texture) end - - if (coords) then - self.button.texture.coords = coords - self.button.texture:SetTexCoord (_unpack (coords.Normal)) - else - self.button.texture:SetTexCoord (0, 1, 0, 0.24609375) - end - - self.button.texture:SetTexture (texture) end ------------------------------------------------------------------------------------------------------------ @@ -503,6 +547,18 @@ local ButtonMetaFunctions = {} local OnEnter = function (button) + if (button.textureTopLeft) then + button.textureLeft:SetTexCoord (0, 4/128, 40/128, 56/128) + button.textureRight:SetTexCoord (124/128, 1, 40/128, 56/128) + button.textureTop:SetTexCoord (9/128, 120/128, 33/128, 37/128) + button.textureBottom:SetTexCoord (9/128, 119/128, 60/128, 64/128) + + button.textureTopLeft:SetTexCoord (0, 8/128, 33/128, 40/128) + button.textureTopRight:SetTexCoord (121/128, 1, 33/128, 40/128) + button.textureBottomLeft:SetTexCoord (0, 8/128, 56/128, 64/128) + button.textureBottomRight:SetTexCoord (120/128, 1, 56/128, 64/128) + end + if (button.MyObject.OnEnterHook) then local interrupt = button.MyObject.OnEnterHook (button) if (interrupt) then @@ -511,7 +567,7 @@ local ButtonMetaFunctions = {} end button.MyObject.is_mouse_over = true - + if (button.texture) then if (button.texture.coords) then button.texture:SetTexCoord (_unpack (button.texture.coords.Highlight)) @@ -535,6 +591,19 @@ local ButtonMetaFunctions = {} end local OnLeave = function (button) + + if (button.textureLeft and not button.MyObject.is_mouse_down) then + button.textureLeft:SetTexCoord (0, 4/128, 9/128, 24/128) + button.textureRight:SetTexCoord (124/128, 1, 9/128, 24/128) + button.textureTop:SetTexCoord (9/128, 120/128, 0, 4/128) + button.textureBottom:SetTexCoord (9/128, 119/128, 28/128, 32/128) + + button.textureTopLeft:SetTexCoord (0, 8/128, 0, 8/128) + button.textureTopRight:SetTexCoord (121/128, 1, 0, 8/128) + button.textureBottomLeft:SetTexCoord (0, 8/128, 24/128, 32/128) + button.textureBottomRight:SetTexCoord (120/128, 1, 24/128, 32/128) + end + if (button.MyObject.OnLeaveHook) then local interrupt = button.MyObject.OnLeaveHook (button) if (interrupt) then @@ -551,7 +620,7 @@ local ButtonMetaFunctions = {} button.texture:SetTexCoord (0, 1, 0, 0.24609375) end end - + if (button.MyObject.have_tooltip) then if (GameCooltip:GetText (1) == button.MyObject.have_tooltip) then GameCooltip:Hide() @@ -589,6 +658,18 @@ local ButtonMetaFunctions = {} return end + if (button.textureTopLeft) then + button.textureLeft:SetTexCoord (0, 4/128, 72/128, 88/128) + button.textureRight:SetTexCoord (124/128, 1, 72/128, 88/128) + button.textureTop:SetTexCoord (9/128, 120/128, 65/128, 68/128) + button.textureBottom:SetTexCoord (9/128, 119/128, 92/128, 96/128) + + button.textureTopLeft:SetTexCoord (0, 8/128, 65/128, 71/128) + button.textureTopRight:SetTexCoord (121/128, 1, 65/128, 71/128) + button.textureBottomLeft:SetTexCoord (0, 8/128, 88/128, 96/128) + button.textureBottomRight:SetTexCoord (120/128, 1, 88/128, 96/128) + end + if (button.MyObject.OnMouseDownHook) then local interrupt = button.MyObject.OnMouseDownHook (button, buttontype) if (interrupt) then @@ -652,6 +733,30 @@ local ButtonMetaFunctions = {} return end + if (button.textureLeft) then + if (button.MyObject.is_mouse_over) then + button.textureLeft:SetTexCoord (0, 4/128, 40/128, 56/128) + button.textureRight:SetTexCoord (124/128, 1, 40/128, 56/128) + button.textureTop:SetTexCoord (9/128, 120/128, 33/128, 37/128) + button.textureBottom:SetTexCoord (9/128, 119/128, 60/128, 64/128) + + button.textureTopLeft:SetTexCoord (0, 8/128, 33/128, 40/128) + button.textureTopRight:SetTexCoord (121/128, 1, 33/128, 40/128) + button.textureBottomLeft:SetTexCoord (0, 8/128, 56/128, 64/128) + button.textureBottomRight:SetTexCoord (120/128, 1, 56/128, 64/128) + else + button.textureLeft:SetTexCoord (0, 4/128, 9/128, 24/128) + button.textureRight:SetTexCoord (124/128, 1, 9/128, 24/128) + button.textureTop:SetTexCoord (9/128, 120/128, 0, 4/128) + button.textureBottom:SetTexCoord (9/128, 119/128, 28/128, 32/128) + + button.textureTopLeft:SetTexCoord (0, 8/128, 0, 8/128) + button.textureTopRight:SetTexCoord (121/128, 1, 0, 8/128) + button.textureBottomLeft:SetTexCoord (0, 8/128, 24/128, 32/128) + button.textureBottomRight:SetTexCoord (120/128, 1, 24/128, 32/128) + end + end + if (button.MyObject.OnMouseUpHook) then local interrupt = button.MyObject.OnMouseUpHook (button, buttontype) if (interrupt) then @@ -660,7 +765,7 @@ local ButtonMetaFunctions = {} end button.MyObject.is_mouse_down = false - + if (button.texture) then if (button.texture.coords) then if (button.MyObject.is_mouse_over) then @@ -676,7 +781,7 @@ local ButtonMetaFunctions = {} end end end - + if (button.MyObject.capsule_textalign) then if (button.MyObject.icon) then button.MyObject.icon:SetPoint ("left", button, "left", 4, 0) diff --git a/framework/framework.lua b/framework/framework.lua index 9ad1f20e..40814dab 100644 --- a/framework/framework.lua +++ b/framework/framework.lua @@ -180,6 +180,26 @@ function gump:BuildMenu (parent, menu, x_offset, y_offset, height) slider:SetPoint ("left", label, "right", 2) label:SetPoint (cur_x, cur_y) + local size = label.widget:GetStringWidth() + 60 + 4 + if (size > max_x) then + max_x = size + end + + elseif (widget_table.type == "color" or widget_table.type == "color") then + local colorpick = self:NewColorPickButton (parent, "$parentWidget" .. index, nil, widget_table.set) + colorpick.tooltip = widget_table.desc + + local default_value, g, b, a = widget_table.get() + if (type (default_value) == "table") then + colorpick:SetColor (unpack (default_value)) + else + colorpick:SetColor (default_value, g, b, a) + end + + local label = self:NewLabel (parent, nil, "$parentLabel" .. index, nil, widget_table.name, "GameFontNormal", 12) + colorpick:SetPoint ("left", label, "right", 2) + label:SetPoint (cur_x, cur_y) + local size = label.widget:GetStringWidth() + 60 + 4 if (size > max_x) then max_x = size @@ -194,4 +214,69 @@ function gump:BuildMenu (parent, menu, x_offset, y_offset, height) end +end + +function gump:ShowTutorialAlertFrame (maintext, desctext, clickfunc) + + local TutorialAlertFrame = _G.DetailsTutorialAlertFrame + + if (not TutorialAlertFrame) then + + TutorialAlertFrame = CreateFrame ("ScrollFrame", "DetailsTutorialAlertFrame", UIParent, "WatchFrameAutoQuestPopUpTemplate") + TutorialAlertFrame.isFirst = true + TutorialAlertFrame:SetPoint ("left", UIParent, "left", -20, 100) + + TutorialAlertFrame:SetWidth (290) + TutorialAlertFrame.ScrollChild:SetWidth (256) + + local scrollname = TutorialAlertFrame.ScrollChild:GetName() + _G [scrollname .. "BorderTopLeft"]:SetVertexColor (1, 0.8, 0, 1) + _G [scrollname .. "BorderTopRight"]:SetVertexColor (1, 0.8, 0, 1) + _G [scrollname .. "BorderBotLeft"]:SetVertexColor (1, 0.8, 0, 1) + _G [scrollname .. "BorderBotRight"]:SetVertexColor (1, 0.8, 0, 1) + _G [scrollname .. "BorderLeft"]:SetVertexColor (1, 0.8, 0, 1) + _G [scrollname .. "BorderRight"]:SetVertexColor (1, 0.8, 0, 1) + _G [scrollname .. "BorderBottom"]:SetVertexColor (1, 0.8, 0, 1) + _G [scrollname .. "BorderTop"]:SetVertexColor (1, 0.8, 0, 1) + + local iconbg = _G [scrollname .. "QuestIconBg"] + iconbg:SetTexture ([[Interface\MainMenuBar\UI-MainMenuBar-EndCap-Human]]) + iconbg:SetTexCoord (0, 1, 0, 1) + iconbg:SetSize (100, 100) + iconbg:ClearAllPoints() + iconbg:SetPoint ("bottomleft", TutorialAlertFrame.ScrollChild, "bottomleft") + + _G [scrollname .. "Exclamation"]:SetVertexColor (1, 0.8, 0, 1) + _G [scrollname .. "QuestionMark"]:SetVertexColor (1, 0.8, 0, 1) + + _G [scrollname .. "TopText"]:SetText ("Details!") --string + _G [scrollname .. "QuestName"]:SetText ("") --string + _G [scrollname .. "BottomText"]:SetText ("") --string + + TutorialAlertFrame.ScrollChild.IconShine:SetTexture ([[Interface\MainMenuBar\UI-MainMenuBar-EndCap-Human]]) + + TutorialAlertFrame:SetScript ("OnMouseUp", function (self) + if (self.clickfunc and type (self.clickfunc) == "function") then + self.clickfunc() + end + self:Hide() + end) + TutorialAlertFrame:Hide() + end + + if (type (maintext) == "string") then + TutorialAlertFrame.ScrollChild.QuestName:SetText (maintext) + else + TutorialAlertFrame.ScrollChild.QuestName:SetText ("") + end + + if (type (desctext) == "string") then + TutorialAlertFrame.ScrollChild.BottomText:SetText (desctext) + else + TutorialAlertFrame.ScrollChild.BottomText:SetText ("") + end + + TutorialAlertFrame.clickfunc = clickfunc + TutorialAlertFrame:Show() + WatchFrame_SlideInFrame (TutorialAlertFrame, "AUTOQUEST") end \ No newline at end of file diff --git a/framework/label.lua b/framework/label.lua index 4f9dc161..f1ac9ec2 100644 --- a/framework/label.lua +++ b/framework/label.lua @@ -195,6 +195,15 @@ local LabelMetaFunctions = {} function LabelMetaFunctions:Hide() return self.label:Hide() end + +-- textcolor + function LabelMetaFunctions:SetTextColor (color, arg2, arg3, arg4) + if (arg2) then + return self.label:SetTextColor (color, arg2, arg3, arg4 or 1) + end + local _value1, _value2, _value3, _value4 = gump:ParseColors (color) + return self.label:SetTextColor (_value1, _value2, _value3, _value4) + end -- setpoint function LabelMetaFunctions:SetPoint (v1, v2, v3, v4, v5) diff --git a/functions/profiles.lua b/functions/profiles.lua index 070ea8d2..6a1146ac 100644 --- a/functions/profiles.lua +++ b/functions/profiles.lua @@ -147,14 +147,42 @@ function _detalhes:ResetProfile (profile_name) return false end - --> reset + --> reset all already created instances + for index, instance in _detalhes:ListInstances() do + if (not instance.baseframe) then + instance:AtivarInstancia() + end + instance.skin = "" + instance:ChangeSkin ("Minimalistic") + end + + for index, instance in pairs (_detalhes.unused_instances) do + if (not instance.baseframe) then + instance:AtivarInstancia() + end + instance.skin = "" + instance:ChangeSkin ("Minimalistic") + end - profile.instances = {} - local profile = table_deepcopy (_detalhes.default_profile) - profile.instances = instances + --> reset the profile + table.wipe (profile.instances) + + --> export first instance + local instance = _detalhes:GetInstance (1) + local exported = instance:ExportSkin() + exported.__was_opened = instance:IsEnabled() + exported.__pos = table_deepcopy (instance:GetPosition()) + exported.__locked = instance.isLocked + exported.__snap = {} + exported.__snapH = false + exported.__snapV = false + profile.instances [1] = exported + instance.horizontalSnap = false + instance.verticalSnap = false + instance.snap = {} _detalhes:ApplyProfile (profile_name, true) - + --> end return true end @@ -302,7 +330,6 @@ function _detalhes:ApplyProfile (profile_name, nosave, is_copy) --> load data saved for this character only instance:LoadLocalInstanceConfig() - if (skin.__was_opened) then instance:AtivarInstancia() else @@ -311,7 +338,6 @@ function _detalhes:ApplyProfile (profile_name, nosave, is_copy) --> load data saved again instance:LoadLocalInstanceConfig() - --> check window positioning if (_detalhes.profile_save_pos) then if (skin.__pos) then @@ -335,7 +361,7 @@ function _detalhes:ApplyProfile (profile_name, nosave, is_copy) instance.posicao.normal = {x = 1, y = 1, w = 300, h = 200} end end - + --> open the instance if (instance:IsEnabled()) then if (not instance.baseframe) then @@ -351,6 +377,7 @@ function _detalhes:ApplyProfile (profile_name, nosave, is_copy) end instances_loaded = instances_loaded + 1 + end --> move unused instances for unused container @@ -675,6 +702,7 @@ local default_profile = { max_window_size = {width = 480, height = 450}, new_window_size = {width = 300, height = 95}, window_clamp = {-8, 0, 21, -14}, + disable_window_groups = false, --> segments segments_amount = 12, @@ -833,7 +861,17 @@ local default_global_data = { _detalhes.default_global_data = default_global_data - +function _detalhes:GetTutorialCVar (key, default) + local value = _detalhes.tutorial [key] + if (value == nil and default) then + _detalhes.tutorial [key] = default + value = default + end + return value +end +function _detalhes:SetTutorialCVar (key, value) + _detalhes.tutorial [key] = value +end function _detalhes:SaveProfileSpecial() diff --git a/functions/savedata.lua b/functions/savedata.lua index c24a9726..b9edebc1 100644 --- a/functions/savedata.lua +++ b/functions/savedata.lua @@ -32,7 +32,8 @@ function _detalhes:SaveLocalInstanceConfig() horizontalSnap = instance.horizontalSnap, verticalSnap = instance.verticalSnap, sub_atributo_last = instance.sub_atributo_last, - isLocked = instance.isLocked + isLocked = instance.isLocked, + last_raid_plugin = instance.last_raid_plugin } if (_detalhes.local_instances_config [index].isLocked == nil) then diff --git a/gumps/janela_info.lua b/gumps/janela_info.lua index 59cd0d77..4b8af0ba 100644 --- a/gumps/janela_info.lua +++ b/gumps/janela_info.lua @@ -3104,10 +3104,19 @@ function _detalhes.janela_info:monta_relatorio (botao) local report_lines if (botao == 1) then --> botão da esquerda - report_lines = {"Details! " .. Loc ["STRING_ACTORFRAME_REPORTTO"] .. " " .. _detalhes.sub_atributos [atributo].lista [sub_atributo] .. " " .. Loc ["STRING_ACTORFRAME_REPORTOF"] .. " " .. player.nome} + report_lines = {"Details! " .. Loc ["STRING_ACTORFRAME_SPELLSOF"] .. " " .. player.nome .. " (" .. _detalhes.sub_atributos [atributo].lista [sub_atributo] .. ")"} for index, barra in _ipairs (info.barras1) do if (barra:IsShown()) then - report_lines [#report_lines+1] = barra.texto_esquerdo:GetText().." -> ".. _detalhes:comma_value (barra.texto_direita:GetText()) + local spellid = barra.show + if (spellid > 10) then + local link = GetSpellLink (spellid) + report_lines [#report_lines+1] = index .. ". " .. link .. ": " .. barra.texto_direita:GetText() + else + local spellname = barra.texto_esquerdo:GetText():gsub ((".*%."), "") + spellname = spellname:gsub ("|c%x%x%x%x%x%x%x%x", "") + spellname = spellname:gsub ("|r", "") + report_lines [#report_lines+1] = index .. ". " .. spellname .. ": " .. barra.texto_direita:GetText() + end end if (index == amt) then break diff --git a/gumps/janela_options.lua b/gumps/janela_options.lua index edb17285..43e48164 100644 --- a/gumps/janela_options.lua +++ b/gumps/janela_options.lua @@ -39,6 +39,11 @@ local slider_backdrop = {edgeFile = "Interface\\Buttons\\UI-SliderBar-Border", e bgFile = [[Interface\ACHIEVEMENTFRAME\UI-GuildAchievement-Parchment-Horizontal-Desaturated]], tile = true, tileSize = 130, insets = {left = 1, right = 1, top = 5, bottom = 5}} local slider_backdrop_color = {1, 1, 1, 1} +local button_color_rgb = {1, 0.93, 0.74} + +local font_select_icon, font_select_texcoord = [[Interface\AddOns\Details\images\icons]], {472/512, 513/512, 186/512, 230/512} +local texture_select_icon, texture_select_texcoord = [[Interface\AddOns\Details\images\icons]], {472/512, 513/512, 186/512, 230/512} + local dropdown_backdrop = {edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", edgeSize = 10, bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", tile = true, tileSize = 16, insets = {left = 1, right = 1, top = 0, bottom = 1}} local dropdown_backdrop_onenter = {0, 0, 0, 1} @@ -1045,10 +1050,13 @@ function window:CreateFrame20() _detalhes.tooltip.fontface = fontName end + --local icon, texcoord = [[Interface\AddOns\Details\images\icons]], {479/512, 506/512, 186/512, 221/512} + local build_tooltip_menu = function() local fonts = {} for name, fontPath in pairs (SharedMedia:HashTable ("font")) do - fonts [#fonts+1] = {value = name, label = name, onclick = on_select_tooltip_font, font = fontPath, descfont = name, desc = "Our thoughts strayed constantly\nAnd without boundary\nThe ringing of the division bell had began."} + + fonts [#fonts+1] = {value = name, icon = font_select_icon, texcoord = font_select_texcoord, label = name, onclick = on_select_tooltip_font, font = fontPath, descfont = name, desc = "Our thoughts strayed constantly\nAnd without boundary\nThe ringing of the division bell had began."} end table.sort (fonts, function (t1, t2) return t1.label < t2.label end) return fonts @@ -1177,9 +1185,12 @@ function window:CreateFrame20() local unlock_function = function() DetailsTooltipAnchor:MoveAnchor() end - local unlock_anchor_button = g:NewButton (frame20, nil, "$parentUnlockAnchorButton", "UnlockAnchorButton", 160, 20, unlock_function, nil, nil, nil, Loc ["STRING_OPTIONS_TOOLTIPS_ANCHOR_TO_CHOOSE"]) + local unlock_anchor_button = g:NewButton (frame20, nil, "$parentUnlockAnchorButton", "UnlockAnchorButton", 160, 20, unlock_function, nil, nil, nil, Loc ["STRING_OPTIONS_TOOLTIPS_ANCHOR_TO_CHOOSE"], 1) unlock_anchor_button:InstallCustomTexture() - + frame20.UnlockAnchorButton:SetTextColor (button_color_rgb) + + frame20.UnlockAnchorButton:SetIcon ([[Interface\COMMON\UI-ModelControlPanel]], nil, nil, nil, {20/64, 34/64, 38/128, 52/128}, nil, 4) + if (_detalhes.tooltip.anchored_to == 1) then unlock_anchor_button:Disable() else @@ -1187,7 +1198,7 @@ function window:CreateFrame20() end frame20.UnlockAnchorButton:SetPoint ("left", frame20.UnlockAnchorButtonLabel, "right", 0, 0) - window:CreateLineBackground2 (frame20, "UnlockAnchorButton", "UnlockAnchorButtonLabel", Loc ["STRING_OPTIONS_TOOLTIPS_ANCHOR_TO_CHOOSE_DESC"]) + window:CreateLineBackground2 (frame20, "UnlockAnchorButton", "UnlockAnchorButton", Loc ["STRING_OPTIONS_TOOLTIPS_ANCHOR_TO_CHOOSE_DESC"], nil, {1, 0.8, 0}, button_color_rgb) --main anchor g:NewLabel (frame20, _, "$parentTooltipAnchorLabel", "TooltipAnchorLabel", Loc ["STRING_OPTIONS_TOOLTIPS_ANCHOR_TO"], "GameFontHighlightLeft") @@ -1817,12 +1828,12 @@ function window:CreateFrame18() instance:InstanceReset() end local totalbar_pickicon = function() - g:IconPick (totalbar_pickicon_callback) + g:IconPick (totalbar_pickicon_callback, true) end g:NewLabel (frame18, _, "$parentTotalBarIconLabel", "totalBarIconLabel", Loc ["STRING_OPTIONS_SHOW_TOTALBAR_ICON"], "GameFontHighlightLeft") g:NewImage (frame18, nil, 20, 20, nil, nil, "totalBarIconTexture", "$parentTotalBarIconTexture") g:NewButton (frame18, _, "$parentTotalBarIconButton", "totalBarIconButton", 20, 20, totalbar_pickicon) - frame18.totalBarIconButton:InstallCustomTexture() + frame18.totalBarIconButton:InstallCustomTexture (nil, nil, nil, true) frame18.totalBarIconButton:SetPoint ("left", frame18.totalBarIconLabel, "right", 2, 0) frame18.totalBarIconTexture:SetPoint ("left", frame18.totalBarIconLabel, "right", 2, 0) @@ -1925,6 +1936,17 @@ function window:CreateFrame18() end) window:CreateLineBackground2 (frame18, "MenuTextSizeSlider", "MenuTextSizeLabel", Loc ["STRING_OPTIONS_MENU_FONT_SIZE_DESC"]) + + --> disable groups + g:NewLabel (frame18, _, "$parentDisableGroupsLabel", "DisableGroupsLabel", Loc ["STRING_OPTIONS_DISABLE_GROUPS"], "GameFontHighlightLeft") + g:NewSwitch (frame18, _, "$parentDisableGroupsSlider", "DisableGroupsSlider", 60, 20, _, _, _detalhes.disable_window_groups) + + frame18.DisableGroupsSlider:SetPoint ("left", frame18.DisableGroupsLabel, "right", 2) + frame18.DisableGroupsSlider.OnSwitch = function (_, _, value) + _detalhes.disable_window_groups = value + end + + window:CreateLineBackground2 (frame18, "DisableGroupsSlider", "DisableGroupsLabel", Loc ["STRING_OPTIONS_DISABLE_GROUPS_DESC"]) --> Report g:NewLabel (frame18, _, "$parentReportHelpfulLinkLabel", "ReportHelpfulLinkLabel", Loc ["STRING_OPTIONS_REPORT_HEALLINKS"], "GameFontHighlightLeft") @@ -1973,14 +1995,13 @@ function window:CreateFrame18() local right_side = { {"instancesMiscLabel", 1, true}, {"deleteInstanceLabel", 2}, - - {"totalBarAnchorLabel", 4, true}, - {"totalBarIconLabel", 5}, - {"totalBarPickColorLabel", 6}, - {"totalBarLabel", 7}, - {"totalBarOnlyInGroupLabel", 8}, - - {"MenuTextSizeLabel", 3} + {"MenuTextSizeLabel", 3}, + {"DisableGroupsLabel", 4}, + {"totalBarAnchorLabel", 5, true}, + {"totalBarIconLabel", 6}, + {"totalBarPickColorLabel", 7}, + {"totalBarLabel", 8}, + {"totalBarOnlyInGroupLabel", 9}, } window:arrange_menu (frame18, right_side, window.right_start_at, -90) @@ -2410,6 +2431,8 @@ function window:CreateFrame16() addbutton:InstallCustomTexture() addbutton:SetPoint ("bottomright", panel, "topright", -30, 0) addbutton:SetIcon ([[Interface\PaperDollInfoFrame\Character-Plus]], 12, 12, nil, nil, nil, 4) + window:CreateLineBackground2 (frame16, "addbutton", "addbutton", nil, nil, {1, 0.8, 0}, button_color_rgb) + addbutton:SetTextColor (button_color_rgb) local left = g:NewImage (frame16, "Interface\\PaperDollInfoFrame\\PaperDollSidebarTabs", 64, 13, "artwork", {0, 1, 0, 0.05078125}) left:SetPoint ("bottomright", addbutton, "bottomleft", 34, 0) @@ -2500,6 +2523,8 @@ function window:CreateFrame16() importbutton:InstallCustomTexture() importbutton:SetPoint ("right", addbutton, "left", -4, 0) importbutton:SetIcon ([[Interface\Buttons\UI-GuildButton-PublicNote-Up]], 14, 14, nil, nil, nil, 4) + window:CreateLineBackground2 (frame16, "importbutton", "importbutton", nil, nil, {1, 0.8, 0}, button_color_rgb) + importbutton:SetTextColor (button_color_rgb) local left = g:NewImage (frame16, "Interface\\PaperDollInfoFrame\\PaperDollSidebarTabs", 64, 13, "artwork", {0, 1, 0, 0.05078125}) left:SetPoint ("bottomright", importbutton, "bottomleft", 34, 0) @@ -2553,6 +2578,7 @@ function window:CreateFrame16() addframe:Hide(); end + local addcapturebutton = g:NewButton (addframe, nil, "$parentAddCaptureButton", "addCapturebutton", 100, 21, addcapture, nil, nil, nil, Loc ["STRING_OPTIONS_CHART_ADD2"]) addcapturebutton:InstallCustomTexture() @@ -2567,6 +2593,12 @@ function window:CreateFrame16() addcapturebutton:SetIcon ([[Interface\Buttons\UI-CheckBox-Check]], 18, 18, nil, nil, nil, 4) closebutton:SetIcon ([[Interface\PetBattles\DeadPetIcon]], 14, 14, nil, nil, nil, 4) + window:CreateLineBackground2 (addframe.widget, closebutton, closebutton, nil, nil, {1, 0.8, 0}, button_color_rgb) + closebutton:SetTextColor (button_color_rgb) + + window:CreateLineBackground2 (addframe.widget, addcapturebutton, addcapturebutton, nil, nil, {1, 0.8, 0}, button_color_rgb) + addcapturebutton:SetTextColor (button_color_rgb) + addcapturebutton:SetPoint ("bottomright", addframe, "bottomright", -5, 5) closebutton:SetPoint ("right", addcapturebutton, "left", -4, 0) @@ -2731,6 +2763,8 @@ function window:CreateFrame15() --> close button local closebutton = g:NewButton (addframe, nil, "$parentAddCloseButton", "addClosebutton", 100, 21, function() addframe:Hide(); table.wipe (all_cached_spells) end, nil, nil, nil, Loc ["STRING_OPTIONS_SPELL_CLOSE"]) closebutton:InstallCustomTexture() + local bg = window:CreateLineBackground2 (addframe.widget, closebutton, closebutton, nil, nil, {1, 0.8, 0}, button_color_rgb) + closebutton:SetTextColor (button_color_rgb) --> confirm add spell local addspell = function() @@ -2765,6 +2799,9 @@ function window:CreateFrame15() end local addspellbutton = g:NewButton (addframe, nil, "$parentAddSpellButton", "addSpellbutton", 100, 21, addspell, nil, nil, nil, Loc ["STRING_OPTIONS_SPELL_ADD"]) addspellbutton:InstallCustomTexture() + local bg2 = window:CreateLineBackground2 (addframe.widget, addspellbutton, addspellbutton, nil, nil, {1, 0.8, 0}, button_color_rgb) + addspellbutton:SetTextColor (button_color_rgb) + bg:SetFrameLevel (bg2:GetFrameLevel()-1) addspellbutton:SetIcon ([[Interface\Buttons\UI-CheckBox-Check]], 18, 18, nil, nil, nil, 4) closebutton:SetIcon ([[Interface\PetBattles\DeadPetIcon]], 14, 14, nil, nil, nil, 4) @@ -2802,6 +2839,10 @@ function window:CreateFrame15() end local addbutton = g:NewButton (frame15, nil, "$parentAddButton", "addbutton", 100, 21, add, nil, nil, nil, Loc ["STRING_OPTIONS_SPELL_ADDSPELL"]) addbutton:InstallCustomTexture() + + window:CreateLineBackground2 (frame15, "addbutton", "addbutton", nil, nil, {1, 0.8, 0}, button_color_rgb) + addbutton:SetTextColor (button_color_rgb) + addbutton:SetPoint ("bottomright", panel, "topright", -30, 0) addbutton:SetIcon ([[Interface\PaperDollInfoFrame\Character-Plus]], 12, 12, nil, nil, nil, 4) @@ -2876,11 +2917,11 @@ function window:CreateFrame14() local on_select_attribute_font = function (self, instance, fontName) instance:AttributeMenu (nil, nil, nil, fontName) end - + local build_font_menu = function() local fonts = {} for name, fontPath in pairs (SharedMedia:HashTable ("font")) do - fonts [#fonts+1] = {value = name, label = name, onclick = on_select_attribute_font, font = fontPath, descfont = name, desc = "Our thoughts strayed constantly\nAnd without boundary\nThe ringing of the division bell had began."} + fonts [#fonts+1] = {value = name, label = name, icon = font_select_icon, texcoord = font_select_texcoord, onclick = on_select_attribute_font, font = fontPath, descfont = name, desc = "Our thoughts strayed constantly\nAnd without boundary\nThe ringing of the division bell had began."} end table.sort (fonts, function (t1, t2) return t1.label < t2.label end) return fonts @@ -3027,15 +3068,55 @@ function window:CreateFrame1() _G.AvatarPickFrame:Show() end - g:NewButton (frame1, _, "$parentAvatarFrame", "chooseAvatarButton", frame1.nicknameLabel:GetStringWidth() + SLIDER_WIDTH + 2, 18, openAtavarPickFrame, nil, nil, nil, Loc ["STRING_OPTIONS_AVATAR"]) - frame1.chooseAvatarButton:InstallCustomTexture() - - window:CreateLineBackground2 (frame1, "chooseAvatarButton", "chooseAvatarButton", Loc ["STRING_OPTIONS_AVATAR_DESC"]) + --g:NewButton (frame1, _, "$parentAvatarFrame", "chooseAvatarButton", frame1.nicknameLabel:GetStringWidth() + SLIDER_WIDTH + 2, 18, openAtavarPickFrame, nil, nil, nil, Loc ["STRING_OPTIONS_AVATAR"], 1) + g:NewButton (frame1, _, "$parentAvatarFrame", "chooseAvatarButton", 275, 85, openAtavarPickFrame, nil, nil, nil, "", 1) -- + frame1.chooseAvatarButton:InstallCustomTexture (nil, nil, nil, true) + frame1.chooseAvatarButton:SetTextColor (button_color_rgb) + --frame1.chooseAvatarButton:SetIcon ([[Interface\Buttons\UI-Panel-MinimizeButton-Up]], nil, nil, nil, {0.143125, 0.8653125, 0.1446875, 0.8653125}) + g:NewLabel (frame1, _, "$parentChooseAvatarLabel", "ChooseAvatarLabel", Loc ["STRING_OPTIONS_AVATAR"], "GameFontHighlightLeft") + frame1.ChooseAvatarLabel:SetPoint ("topright", frame1.chooseAvatarButton, "topright", -10, -10) + frame1.ChooseAvatarLabel:SetTextColor (button_color_rgb) + --> avatar preview g:NewImage (frame1, nil, 128, 64, nil, nil, "avatarPreview", "$parentAvatarPreviewTexture") g:NewImage (frame1, nil, 275, 60, nil, nil, "avatarPreview2", "$parentAvatarPreviewTexture2") - g:NewLabel (frame1, _, "$parentAvatarNicknameLabel", "avatarNickname", UnitName ("player"), "GameFontHighlightSmall") + g:NewLabel (frame1, _, "$parentAvatarNicknameLabel", "avatarNickname", UnitName ("player"), "GameFontHighlightSmall") + + --> avatar button + frame1.chooseAvatarButton:SetHook ("OnEnter", function() + frame1.ChooseAvatarLabel:SetTextColor (1, 1, 1) + + _detalhes:CooltipPreset (2) + GameCooltip:AddLine (Loc ["STRING_OPTIONS_AVATAR_DESC"]) + GameCooltip:ShowCooltip (frame1.chooseAvatarButton.widget, "tooltip") + --frame1.avatarPreview:SetBlendMode ("ADD") + frame1.avatarPreview2:SetBlendMode ("ADD") + return true + end) + frame1.chooseAvatarButton:SetHook ("OnLeave", function() + frame1.ChooseAvatarLabel:SetTextColor (button_color_rgb) + GameCooltip:Hide() + --frame1.avatarPreview:SetBlendMode ("BLEND") + frame1.avatarPreview2:SetBlendMode ("BLEND") + return true + end) + frame1.chooseAvatarButton:SetHook ("OnMouseDown", function() + local avatar_x_anchor = window.right_start_at + frame1.avatarPreview:SetPoint (avatar_x_anchor+2, -158) + frame1.avatarPreview2:SetPoint (avatar_x_anchor+2, -160) + frame1.avatarNickname:SetPoint (avatar_x_anchor+110, -192) + frame1.ChooseAvatarLabel:SetPoint ("topright", frame1.chooseAvatarButton, "topright", -9, -11) + end) + frame1.chooseAvatarButton:SetHook ("OnMouseUp", function() + local avatar_x_anchor = window.right_start_at + frame1.avatarPreview:SetPoint (avatar_x_anchor+1, -157) + frame1.avatarPreview2:SetPoint (avatar_x_anchor+1, -159) + frame1.avatarNickname:SetPoint (avatar_x_anchor+109, -191) + frame1.ChooseAvatarLabel:SetPoint ("topright", frame1.chooseAvatarButton, "topright", -10, -10) + end) + + --window:CreateLineBackground2 (frame1, "chooseAvatarButton", "chooseAvatarButton", Loc ["STRING_OPTIONS_AVATAR_DESC"], nil, {1, 0.8, 0}, button_color_rgb) _detalhes:SetFontSize (frame1.avatarNickname.widget, 18) @@ -3222,34 +3303,34 @@ function window:CreateFrame1() --lock unlock g:NewButton (frame1, _, "$parentLockButton", "LockButton", buttons_width, 18, _detalhes.lock_instance_function, nil, nil, nil, Loc ["STRING_OPTIONS_WC_LOCK"], 1) frame1.LockButton:InstallCustomTexture() - window:CreateLineBackground2 (frame1, "LockButton", "LockButton", Loc ["STRING_OPTIONS_WC_LOCK_DESC"], nil, {1, 0.8, 0}, {1, 1, 1}) + window:CreateLineBackground2 (frame1, "LockButton", "LockButton", Loc ["STRING_OPTIONS_WC_LOCK_DESC"], nil, {1, 0.8, 0}, button_color_rgb) frame1.LockButton:SetIcon ([[Interface\PetBattles\PetBattle-LockIcon]], nil, nil, nil, {0.0703125, 0.9453125, 0.0546875, 0.9453125}) - frame1.LockButton:SetTextColor (1, 1, 1, 1) + frame1.LockButton:SetTextColor (button_color_rgb) --break snap g:NewButton (frame1, _, "$parentBreakSnapButton", "BreakSnapButton", buttons_width, 18, _G.DetailsOptionsWindow.instance.Desagrupar, -1, nil, nil, Loc ["STRING_OPTIONS_WC_UNSNAP"], 1) frame1.BreakSnapButton:InstallCustomTexture() - window:CreateLineBackground2 (frame1, "BreakSnapButton", "BreakSnapButton", Loc ["STRING_OPTIONS_WC_UNSNAP_DESC"], nil, {1, 0.8, 0}, {1, 1, 1}) + window:CreateLineBackground2 (frame1, "BreakSnapButton", "BreakSnapButton", Loc ["STRING_OPTIONS_WC_UNSNAP_DESC"], nil, {1, 0.8, 0}, button_color_rgb) frame1.BreakSnapButton:SetIcon ([[Interface\AddOns\Details\images\icons]], nil, nil, nil, {160/512, 179/512, 142/512, 162/512}) - frame1.BreakSnapButton:SetTextColor (1, 1, 1, 1) + frame1.BreakSnapButton:SetTextColor (button_color_rgb) --close g:NewButton (frame1, _, "$parentCloseButton", "CloseButton", buttons_width, 18, _detalhes.close_instancia_func, _G.DetailsOptionsWindow.instance, nil, nil, Loc ["STRING_OPTIONS_WC_CLOSE"], 1) frame1.CloseButton:InstallCustomTexture() - window:CreateLineBackground2 (frame1, "CloseButton", "CloseButton", Loc ["STRING_OPTIONS_WC_CLOSE_DESC"], nil, {1, 0.8, 0}, {1, 1, 1}) + window:CreateLineBackground2 (frame1, "CloseButton", "CloseButton", Loc ["STRING_OPTIONS_WC_CLOSE_DESC"], nil, {1, 0.8, 0}, button_color_rgb) frame1.CloseButton:SetIcon ([[Interface\Buttons\UI-Panel-MinimizeButton-Up]], nil, nil, nil, {0.143125, 0.8653125, 0.1446875, 0.8653125}) - frame1.CloseButton:SetTextColor (1, 1, 1, 1) + frame1.CloseButton:SetTextColor (button_color_rgb) --create g:NewButton (frame1, _, "$parentCreateWindowButton", "CreateWindowButton", buttons_width, 18, function() _detalhes.CriarInstancia (nil, nil, true) end, nil, nil, nil, Loc ["STRING_OPTIONS_WC_CREATE"], 1) frame1.CreateWindowButton:InstallCustomTexture() - window:CreateLineBackground2 (frame1, "CreateWindowButton", "CreateWindowButton", Loc ["STRING_OPTIONS_WC_CREATE_DESC"], nil, {1, 0.8, 0}, {1, 1, 1}) + window:CreateLineBackground2 (frame1, "CreateWindowButton", "CreateWindowButton", Loc ["STRING_OPTIONS_WC_CREATE_DESC"], nil, {1, 0.8, 0}, button_color_rgb) frame1.CreateWindowButton:SetIcon ([[Interface\Buttons\UI-AttributeButton-Encourage-Up]]) - frame1.CreateWindowButton:SetTextColor (1, 1, 1, 1) + frame1.CreateWindowButton:SetTextColor (button_color_rgb) --> anchors @@ -3270,9 +3351,9 @@ function window:CreateFrame1() frame1.nicknameLabel:SetPoint (avatar_x_anchor, -115) frame1.chooseAvatarButton:SetPoint (avatar_x_anchor+1, -140) - frame1.avatarPreview:SetPoint (avatar_x_anchor-8, -157) - frame1.avatarPreview2:SetPoint (avatar_x_anchor-8, -159) - frame1.avatarNickname:SetPoint (avatar_x_anchor+100, -191) + frame1.avatarPreview:SetPoint (avatar_x_anchor+1, -157) + frame1.avatarPreview2:SetPoint (avatar_x_anchor+1, -159) + frame1.avatarNickname:SetPoint (avatar_x_anchor+109, -191) frame1.realmNameLabel:SetPoint (avatar_x_anchor, -235) @@ -3781,21 +3862,25 @@ function window:CreateFrame13() --> reset profile + function _detalhes:RefreshOptionsAfterProfileReset() + _detalhes:OpenOptionsWindow (_detalhes:GetInstance(1)) + end + local reset_profile = function() local current_instance = _G.DetailsOptionsWindow.instance _detalhes:ResetProfile (_detalhes:GetCurrentProfileName()) - _detalhes:OpenOptionsWindow (current_instance) + _detalhes:ScheduleTimer ("RefreshOptionsAfterProfileReset", 1) end local profile_reset_button = g:NewButton (frame13, _, "$parentProfileResetButton", "profileResetButton", 128, 19, reset_profile, nil, nil, nil, Loc ["STRING_OPTIONS_PROFILES_RESET"]) profile_reset_button:InstallCustomTexture() + frame13.profileResetButton:SetIcon ([[Interface\Buttons\UI-RefreshButton]], 14, 14, nil, {0, 1, 0, 1}, nil, 4) + frame13.profileResetButton:SetTextColor (button_color_rgb) local hiddenlabel = g:NewLabel (frame13, _, "$parentProfileResetButtonLabel", "profileResetButtonLabel", "", "GameFontHighlightLeft") hiddenlabel:SetPoint ("left", profile_reset_button, "left") - window:CreateLineBackground2 (frame13, profile_reset_button, hiddenlabel, Loc ["STRING_OPTIONS_PROFILES_RESET_DESC"]) - - --profile_reset_button.button.texture:SetVertexColor (1, .8, 0) + window:CreateLineBackground2 (frame13, "profileResetButton", "profileResetButton", Loc ["STRING_OPTIONS_PROFILES_RESET_DESC"], nil, {1, 0.8, 0}, button_color_rgb) --> save window position within profile @@ -3822,12 +3907,13 @@ function window:CreateFrame13() local left_side = { {"ProfileAnchorLabel", 1, true}, {current_profile_label, 2}, - {select_profile_label, 3}, - {profile_name_label, 4}, - {select_profileCopy_label, 5}, - {select_profileErase_label, 6}, - {profile_reset_button, 7}, - {"PosAndSizeLabel", 8, true}, + {"PosAndSizeLabel", 3}, + {select_profile_label, 4, true}, + {profile_name_label, 5, true}, + {select_profileCopy_label, 6}, + {select_profileErase_label, 7}, + {profile_reset_button, 8, true}, + } window:arrange_menu (frame13, left_side, x, window.top_start_at) @@ -3904,11 +3990,6 @@ function window:CreateFrame3() local titulo_skin = g:NewLabel (frame3, _, "$parentTituloSkin", "tituloSkinLabel", Loc ["STRING_OPTIONS_SKIN_A"], "GameFontNormal", 16) local titulo_skin_desc = g:NewLabel (frame3, _, "$parentTituloSkin2", "tituloSkin2Label", Loc ["STRING_OPTIONS_SKIN_A_DESC"], "GameFontNormal", 9, "white") titulo_skin_desc.width = 320 - - --> Save Load - -- local titulo_save = g:NewLabel (frame3, _, "$parentTituloPersona", "tituloBarsLabel", Loc ["STRING_OPTIONS_SAVELOAD"], "GameFontNormal", 16) - -- local titulo_save_desc = g:NewLabel (frame3, _, "$parentTituloPersona2", "tituloBars2Label", Loc ["STRING_OPTIONS_SAVELOAD_DESC"], "GameFontNormal", 9, "white") - -- titulo_save_desc.width = 320 --> create functions and frames first: @@ -3954,9 +4035,6 @@ function window:CreateFrame3() loadStyle (nil, _G.DetailsOptionsWindow.instance, _detalhes.instance_defaults) end - --g:NewButton (frame3, _, "$parentResetToDefaultButton", "resetToDefaults", 160, 16, resetToDefaults, nil, nil, nil, Loc ["STRING_OPTIONS_SAVELOAD_RESET"]) - --frame3.resetToDefaults:InstallCustomTexture() - --> select skin local onSelectSkin = function (_, instance, skin_name) instance:ChangeSkin (skin_name) @@ -4019,6 +4097,7 @@ function window:CreateFrame3() _G.DetailsOptionsWindow3CustomSkinLoadDropdown.MyObject:Refresh() _G.DetailsOptionsWindow3CustomSkinRemoveDropdown.MyObject:Refresh() + _G.DetailsOptionsWindow3CustomSkinExportDropdown.MyObject:Refresh() end @@ -4060,21 +4139,25 @@ function window:CreateFrame3() _detalhes:Msg (Loc ["STRING_OPTIONS_SAVELOAD_STDSAVE"]) end - g:NewButton (frame3, _, "$parentToAllStyleButton", "applyToAll", 160, 18, applyToAll, nil, nil, nil, Loc ["STRING_OPTIONS_SAVELOAD_APPLYTOALL"], 1) - frame3.applyToAll:InstallCustomTexture() - g:NewButton (frame3, _, "$parentMakeDefaultButton", "makeDefault", 160, 18, makeDefault, nil, nil, nil, Loc ["STRING_OPTIONS_SAVELOAD_MAKEDEFAULT"]) - frame3.makeDefault:InstallCustomTexture() - g:NewLabel (frame3, _, "$parentToAllStyleLabel", "toAllStyleLabel", "", "GameFontHighlightLeft") g:NewLabel (frame3, _, "$parentmakeDefaultLabel", "makeDefaultLabel", "", "GameFontHighlightLeft") + g:NewButton (frame3, _, "$parentToAllStyleButton", "applyToAll", 160, 18, applyToAll, nil, nil, nil, Loc ["STRING_OPTIONS_SAVELOAD_APPLYTOALL"], 1) + frame3.applyToAll:InstallCustomTexture() + window:CreateLineBackground2 (frame3, "applyToAll", "applyToAll", Loc ["STRING_OPTIONS_SAVELOAD_APPLYALL_DESC"], nil, {1, 0.8, 0}, button_color_rgb) + + g:NewButton (frame3, _, "$parentMakeDefaultButton", "makeDefault", 160, 18, makeDefault, nil, nil, nil, Loc ["STRING_OPTIONS_SAVELOAD_MAKEDEFAULT"]) + frame3.makeDefault:InstallCustomTexture() + window:CreateLineBackground2 (frame3, "makeDefault", "makeDefault", Loc ["STRING_OPTIONS_SAVELOAD_STD_DESC"], nil, {1, 0.8, 0}, button_color_rgb) + frame3.toAllStyleLabel:SetPoint ("left", frame3.applyToAll, "left") frame3.makeDefaultLabel:SetPoint ("left", frame3.makeDefault, "left") - window:CreateLineBackground2 (frame3, "applyToAll", "toAllStyleLabel", Loc ["STRING_OPTIONS_SAVELOAD_APPLYALL_DESC"]) - - window:CreateLineBackground2 (frame3, "makeDefault", "makeDefaultLabel", Loc ["STRING_OPTIONS_SAVELOAD_STD_DESC"]) - + frame3.makeDefault:SetIcon ([[Interface\Buttons\UI-CheckBox-Check]], 14, 14, nil, {4/32, 28/32, 4/32, 28/32}, "yellow", 4) + frame3.applyToAll:SetIcon ([[Interface\Buttons\UI-HomeButton]], 14, 14, nil, {1/16, 14/16, 0, 1}, nil, 4) + frame3.makeDefault:SetTextColor (button_color_rgb) + frame3.applyToAll:SetTextColor (button_color_rgb) + --> Load Custom Skin g:NewLabel (frame3, _, "$parentLoadCustomSkinLabel", "loadCustomSkinLabel", Loc ["STRING_OPTIONS_SAVELOAD_LOAD"], "GameFontHighlightLeft") -- @@ -4146,6 +4229,7 @@ function window:CreateFrame3() _G.DetailsOptionsWindow3CustomSkinRemoveDropdown.MyObject:Select (false) _G.DetailsOptionsWindow3CustomSkinLoadDropdown.MyObject:Refresh() _G.DetailsOptionsWindow3CustomSkinRemoveDropdown.MyObject:Refresh() + _G.DetailsOptionsWindow3CustomSkinExportDropdown.MyObject:Refresh() _detalhes:Msg (Loc ["STRING_OPTIONS_SKIN_REMOVED"]) end @@ -4242,11 +4326,13 @@ function window:CreateFrame3() g:NewButton (frame3, _, "$parentImportButton", "ImportButton", 160, 18, import_saved, nil, nil, nil, Loc ["STRING_OPTIONS_SAVELOAD_IMPORT"]) frame3.ImportButton:InstallCustomTexture() - + frame3.ImportButton:SetIcon ([[Interface\Buttons\UI-GuildButton-PublicNote-Up]], 14, 14, nil, nil, nil, 4) + frame3.ImportButton:SetTextColor (button_color_rgb) + g:NewLabel (frame3, _, "$parentImportLabel", "ImportLabel", "", "GameFontHighlightLeft") frame3.ImportLabel:SetPoint ("left", frame3.ImportButton, "left") - window:CreateLineBackground2 (frame3, "ImportButton", "ImportLabel", Loc ["STRING_OPTIONS_SAVELOAD_IMPORT_DESC"]) + window:CreateLineBackground2 (frame3, "ImportButton", "ImportButton", Loc ["STRING_OPTIONS_SAVELOAD_IMPORT_DESC"], nil, {1, 0.8, 0}, button_color_rgb) --> extra Options g:NewLabel (frame3, _, "$parentSkinExtraOptionsAnchor", "SkinExtraOptionsAnchor", Loc ["STRING_OPTIONS_SKIN_EXTRA_OPTIONS_ANCHOR"], "GameFontNormal") @@ -4370,6 +4456,12 @@ function window:CreateFrame4() window:CreateLineBackground2 (frame4, "BarSpacementSlider", "BarSpacementLabel", Loc ["STRING_OPTIONS_BAR_SPACING_DESC"]) --> Top Texture + + local texture_icon = [[Interface\TARGETINGFRAME\UI-PhasingIcon]] + local texture_icon = [[Interface\AddOns\Details\images\icons]] + local texture_icon_size = {14, 14} + local texture_texcoord = {469/512, 505/512, 249/512, 284/512} + --anchor g:NewLabel (frame4, _, "$parentRowUpperTextureAnchor", "rowUpperTextureLabel", Loc ["STRING_OPTIONS_TEXT_TEXTUREU_ANCHOR"], "GameFontNormal") @@ -4382,7 +4474,7 @@ function window:CreateFrame4() local textures = SharedMedia:HashTable ("statusbar") local texTable = {} for name, texturePath in pairs (textures) do - texTable[#texTable+1] = {value = name, label = name, statusbar = texturePath, onclick = onSelectTexture} + texTable[#texTable+1] = {value = name, label = name, iconsize = texture_icon_size, statusbar = texturePath, onclick = onSelectTexture, icon = texture_icon, texcoord = texture_texcoord} end table.sort (texTable, function (t1, t2) return t1.label < t2.label end) return texTable @@ -4436,7 +4528,7 @@ function window:CreateFrame4() local textures2 = SharedMedia:HashTable ("statusbar") local texTable2 = {} for name, texturePath in pairs (textures2) do - texTable2[#texTable2+1] = {value = name, label = name, statusbar = texturePath, onclick = onSelectTextureBackground} + texTable2[#texTable2+1] = {value = name, label = name, iconsize = texture_icon_size, statusbar = texturePath, onclick = onSelectTextureBackground, icon = texture_icon, texcoord = texture_texcoord} end table.sort (texTable2, function (t1, t2) return t1.label < t2.label end) return texTable2 @@ -4478,17 +4570,55 @@ function window:CreateFrame4() --> Icons - --anchors + --> anchors g:NewLabel (frame4, _, "$parentIconsAnchor", "rowIconsLabel", Loc ["STRING_OPTIONS_TEXT_ROWICONS_ANCHOR"], "GameFontNormal") - --icon file - g:NewLabel (frame4, _, "$parentIconFileLabel", "iconFileLabel", Loc ["STRING_OPTIONS_BAR_ICONFILE"], "GameFontHighlightLeft") + --> icon file + + --> textbox g:NewTextEntry (frame4, _, "$parentIconFileEntry", "iconFileEntry", 180, 20) - frame4.iconFileEntry:SetPoint ("left", frame4.iconFileLabel, "right", 2, 0) + + g:NewLabel (frame4, _, "$parentIconFileLabel", "iconFileLabel", Loc ["STRING_OPTIONS_BAR_ICONFILE"], "GameFontHighlightLeft") + g:NewLabel (frame4, _, "$parentIconFileLabel2", "iconFileLabel2", "", "GameFontHighlightLeft") + + --> dropdown + local OnSelectIconFile = function (_, _, iconpath) + _G.DetailsOptionsWindow.instance:SetBarSettings (nil, nil, nil, nil, nil, nil, nil, nil, iconpath) + frame4.iconFileEntry:SetText (iconpath) + end + + local iconsize = {16, 16} + local icontexture = [[Interface\WorldStateFrame\ICONS-CLASSES]] + local iconcoords = {0.25, 0.50, 0, 0.25} + local list = { + {value = [[]], label = Loc ["STRING_OPTIONS_BAR_ICONFILE1"], onclick = OnSelectIconFile, icon = icontexture, texcoord = iconcoords, iconsize = iconsize, iconcolor = {1, 1, 1, .3}}, + {value = [[Interface\AddOns\Details\images\classes_small]], label = Loc ["STRING_OPTIONS_BAR_ICONFILE2"], onclick = OnSelectIconFile, icon = icontexture, texcoord = iconcoords, iconsize = iconsize}, + {value = [[Interface\AddOns\Details\images\classes_small_bw]], label = Loc ["STRING_OPTIONS_BAR_ICONFILE3"], onclick = OnSelectIconFile, icon = icontexture, texcoord = iconcoords, iconsize = iconsize}, + {value = [[Interface\AddOns\Details\images\classes_small_alpha]], label = Loc ["STRING_OPTIONS_BAR_ICONFILE4"], onclick = OnSelectIconFile, icon = icontexture, texcoord = iconcoords, iconsize = iconsize}, + {value = [[Interface\AddOns\Details\images\classes]], label = Loc ["STRING_OPTIONS_BAR_ICONFILE5"], onclick = OnSelectIconFile, icon = icontexture, texcoord = iconcoords, iconsize = iconsize}, + } + local BuiltIconList = function() + return list + end + + local d = g:NewDropDown (frame4, _, "$parentIconSelectDropdown", "IconSelectDropdown", DROPDOWN_WIDTH, 20, BuiltIconList, instance.row_info.icon_file) + d.onenter_backdrop = dropdown_backdrop_onenter + d.onleave_backdrop = dropdown_backdrop_onleave + d:SetBackdrop (dropdown_backdrop) + d:SetBackdropColor (unpack (dropdown_backdrop_onleave)) + + d:SetPoint ("left", frame4.iconFileLabel, "right", 2) + window:CreateLineBackground2 (frame4, "IconSelectDropdown", "iconFileLabel", Loc ["STRING_OPTIONS_BAR_ICONFILE_DESC2"]) + -- + + frame4.iconFileEntry:SetPoint ("topleft", frame4.iconFileLabel, "bottomleft", 0, -3) + --frame4.iconFileEntry:SetPoint ("topright", frame4.IconSelectDropdown, "bottomright", 0, 0) frame4.iconFileEntry.tooltip = "- Press escape to restore default value.\n- Leave empty to hide icons." frame4.iconFileEntry:SetHook ("OnEnterPressed", function() _G.DetailsOptionsWindow.instance:SetBarSettings (nil, nil, nil, nil, nil, nil, nil, nil, frame4.iconFileEntry.text) + d:Select (false) + d:Select (frame4.iconFileEntry.text) end) frame4.iconFileEntry:SetHook ("OnEscapePressed", function() frame4.iconFileEntry:SetText ([[Interface\AddOns\Details\images\classes_small]]) @@ -4519,7 +4649,7 @@ function window:CreateFrame4() frame4.noIconButton:GetNormalTexture():SetDesaturated (true) frame4.noIconButton.tooltip = "Clear icon file / Restore default" - --bar start at + --> bar start at g:NewSwitch (frame4, _, "$parentBarStartSlider", "barStartSlider", 60, 20, nil, nil, instance.row_info.start_after_icon) g:NewLabel (frame4, _, "$parentBarStartLabel", "barStartLabel", Loc ["STRING_OPTIONS_BARSTART"], "GameFontHighlightLeft") @@ -4548,11 +4678,12 @@ function window:CreateFrame4() instance:SetBarBackdropSettings (nil, nil, nil, textureName) end + local iconsize = {16, 16} local buildTextureBackdropMenu = function() local textures2 = SharedMedia:HashTable ("border") local texTable2 = {} for name, texturePath in pairs (textures2) do - texTable2 [#texTable2+1] = {value = name, label = name, onclick = onSelectTextureBackdrop} + texTable2 [#texTable2+1] = {value = name, label = name, onclick = onSelectTextureBackdrop, icon = [[Interface\DialogFrame\UI-DialogBox-Corner]], texcoord = {0.09375, 1, 0, 0.78}, iconsize = iconsize} end table.sort (texTable2, function (t1, t2) return t1.label < t2.label end) return texTable2 @@ -4563,7 +4694,7 @@ function window:CreateFrame4() d.onenter_backdrop = dropdown_backdrop_onenter d.onleave_backdrop = dropdown_backdrop_onleave d:SetBackdrop (dropdown_backdrop) - d:SetBackdropColor (unpack (dropdown_backdrop_onleave)) + d:SetBackdropColor (unpack (dropdown_backdrop_onleave)) frame4.BackdropBorderTextureDropdown:SetPoint ("left", frame4.BackdropBorderTextureLabel, "right", 2) window:CreateLineBackground2 (frame4, "BackdropBorderTextureDropdown", "BackdropBorderTextureLabel", Loc ["STRING_OPTIONS_BAR_BACKDROP_TEXTURE_DESC"]) @@ -4608,13 +4739,14 @@ function window:CreateFrame4() --icon {frame4.rowIconsLabel, 6, true}, {frame4.iconFileLabel, 7}, - {frame4.barStartLabel, 8}, + {frame4.iconFileLabel2, 8}, + {frame4.barStartLabel, 9}, --backdrop - {frame4.BackdropAnchorLabel, 9, true}, - {frame4.BackdropEnabledLabel, 10}, - {frame4.BackdropBorderTextureLabel, 11}, - {frame4.BackdropSizeLabel, 12}, - {frame4.BackdropColorLabel, 13}, + {frame4.BackdropAnchorLabel, 10, true}, + {frame4.BackdropEnabledLabel, 11}, + {frame4.BackdropBorderTextureLabel, 12}, + {frame4.BackdropSizeLabel, 13}, + {frame4.BackdropColorLabel, 14}, } local right_side = { @@ -4696,7 +4828,7 @@ function window:CreateFrame5() local fontObjects = SharedMedia:HashTable ("font") local fontTable = {} for name, fontPath in pairs (fontObjects) do - fontTable[#fontTable+1] = {value = name, label = name, onclick = onSelectFont, font = fontPath, descfont = name, desc = Loc ["STRING_MUSIC_DETAILS_ROBERTOCARLOS"]} + fontTable[#fontTable+1] = {value = name, label = name, icon = font_select_icon, texcoord = font_select_texcoord, onclick = onSelectFont, font = fontPath, descfont = name, desc = Loc ["STRING_MUSIC_DETAILS_ROBERTOCARLOS"]} end table.sort (fontTable, function (t1, t2) return t1.label < t2.label end) return fontTable @@ -5190,12 +5322,17 @@ function window:CreateFrame6() local onBackdropSelect = function (_, instance, backdropName) instance:SetBackdropTexture (backdropName) end - local backdropObjects = SharedMedia:HashTable ("background") - local backdropTable = {} - for name, backdropPath in pairs (backdropObjects) do - backdropTable[#backdropTable+1] = {value = name, label = name, onclick = onBackdropSelect} + + local backdrop_icon_size = {16, 16} + local backdrop_icon_color = {.6, .6, .6} + + local buildBackdropMenu = function() + local backdropTable = {} + for name, backdropPath in pairs (SharedMedia:HashTable ("background")) do + backdropTable[#backdropTable+1] = {value = name, label = name, onclick = onBackdropSelect, icon = [[Interface\ITEMSOCKETINGFRAME\UI-EMPTYSOCKET]], iconsize = backdrop_icon_size, iconcolor = backdrop_icon_color} + end + return backdropTable end - local buildBackdropMenu = function() return backdropTable end local d = g:NewDropDown (frame6, _, "$parentBackdropDropdown", "backdropDropdown", DROPDOWN_WIDTH, 20, buildBackdropMenu, nil) d.onenter_backdrop = dropdown_backdrop_onenter @@ -5698,7 +5835,7 @@ function window:CreateFrame8() local fontObjects = SharedMedia:HashTable ("font") local fontTable = {} for name, fontPath in pairs (fontObjects) do - fontTable[#fontTable+1] = {value = name, label = name, onclick = instance_text_color_onselectfont, font = fontPath, descfont = name, desc = "If there's a bustle in your hedgerow, don't be alarmed now\nIt's just a spring clean for the may queen."} + fontTable[#fontTable+1] = {value = name, label = name, icon = font_select_icon, texcoord = font_select_texcoord, onclick = instance_text_color_onselectfont, font = fontPath, descfont = name, desc = "If there's a bustle in your hedgerow, don't be alarmed now\nIt's just a spring clean for the may queen."} end table.sort (fontTable, function (t1, t2) return t1.label < t2.label end) return fontTable @@ -6165,13 +6302,14 @@ function window:CreateFrame9() frame9.anchorDropdown:SetPoint ("left", frame9.anchorLabel, "right", 2) -- frame9.editImage:InstallCustomTexture() - + window:CreateLineBackground2 (frame9, "editImage", "editImage", Loc ["STRING_OPTIONS_WP_EDIT_DESC"], nil, {1, 0.8, 0}, button_color_rgb) + frame9.editImage:SetTextColor (button_color_rgb) + frame9.editImage:SetIcon ([[Interface\AddOns\Details\images\icons]], 14, 14, nil, {469/512, 505/512, 290/512, 322/512}, nil, 4) + window:CreateLineBackground2 (frame9, "useBackgroundSlider", "enablewallpaperLabel", Loc ["STRING_OPTIONS_WP_ENABLE_DESC"]) window:CreateLineBackground2 (frame9, "anchorDropdown", "anchorLabel", Loc ["STRING_OPTIONS_WP_ALIGN_DESC"]) - - window:CreateLineBackground2 (frame9, "editImage", "editImage", Loc ["STRING_OPTIONS_WP_EDIT_DESC"]) - + window:CreateLineBackground2 (frame9, "backgroundDropdown", "wallpapergroupLabel", Loc ["STRING_OPTIONS_WP_GROUP_DESC"]) window:CreateLineBackground2 (frame9, "backgroundDropdown2", "selectwallpaperLabel", Loc ["STRING_OPTIONS_WP_GROUP2_DESC"]) @@ -6401,7 +6539,9 @@ function window:CreateFrame9() g:NewButton (frame9, _, "$parentLoadImage", "LoadImage", 200, 18, load_image, nil, nil, nil, Loc ["STRING_OPTIONS_WALLPAPER_LOAD"]) frame9.LoadImage:InstallCustomTexture() - window:CreateLineBackground2 (frame9, "LoadImage", "LoadImage", Loc ["STRING_OPTIONS_WALLPAPER_LOAD_DESC"]) + window:CreateLineBackground2 (frame9, "LoadImage", "LoadImage", Loc ["STRING_OPTIONS_WALLPAPER_LOAD_DESC"], nil, {1, 0.8, 0}, button_color_rgb) + frame9.LoadImage:SetTextColor (button_color_rgb) + frame9.LoadImage:SetIcon ([[Interface\AddOns\Details\images\icons]], 11, 14, nil, {437/512, 467/512, 191/512, 239/512}, nil, 5) --> Anchors @@ -6952,6 +7092,11 @@ function window:CreateFrame12() g:NewButton (bframe, nil, "$parentOptionsButton"..i, "OptionsButton"..i, 86, 16, pluginObject.OpenOptionsPanel, nil, nil, nil, Loc ["STRING_OPTIONS_PLUGINS_OPTIONS"]) bframe ["OptionsButton"..i]:SetPoint ("topleft", frame4, "topleft", 510, y-2) bframe ["OptionsButton"..i]:InstallCustomTexture() + + window:CreateLineBackground2 (bframe, "OptionsButton"..i, "OptionsButton"..i, nil, nil, {1, 0.8, 0}, button_color_rgb) + bframe ["OptionsButton"..i]:SetTextColor (button_color_rgb) + bframe ["OptionsButton"..i]:SetIcon ([[Interface\Buttons\UI-OptionsButton]], 14, 14, nil, {0, 1, 0, 1}, nil, 3) + end i = i + 1 @@ -7029,6 +7174,10 @@ function window:CreateFrame12() g:NewButton (bframe, nil, "$parentOptionsButton"..i, "OptionsButton"..i, 86, 16, pluginObject.OpenOptionsPanel, nil, nil, nil, Loc ["STRING_OPTIONS_PLUGINS_OPTIONS"]) bframe ["OptionsButton"..i]:SetPoint ("topleft", frame4, "topleft", 510, y-2) bframe ["OptionsButton"..i]:InstallCustomTexture() + + window:CreateLineBackground2 (bframe, "OptionsButton"..i, "OptionsButton"..i, nil, nil, {1, 0.8, 0}, button_color_rgb) + bframe ["OptionsButton"..i]:SetTextColor (button_color_rgb) + bframe ["OptionsButton"..i]:SetIcon ([[Interface\Buttons\UI-OptionsButton]], 14, 14, nil, {0, 1, 0, 1}, nil, 3) end i = i + 1 @@ -7106,6 +7255,10 @@ function window:CreateFrame12() g:NewButton (bframe, nil, "$parentOptionsButton"..i, "OptionsButton"..i, 86, 16, pluginObject.OpenOptionsPanel, nil, nil, nil, Loc ["STRING_OPTIONS_PLUGINS_OPTIONS"]) bframe ["OptionsButton"..i]:SetPoint ("topleft", frame4, "topleft", 510, y-2) bframe ["OptionsButton"..i]:InstallCustomTexture() + + window:CreateLineBackground2 (bframe, "OptionsButton"..i, "OptionsButton"..i, nil, nil, {1, 0.8, 0}, button_color_rgb) + bframe ["OptionsButton"..i]:SetTextColor (button_color_rgb) + bframe ["OptionsButton"..i]:SetIcon ([[Interface\Buttons\UI-OptionsButton]], 14, 14, nil, {0, 1, 0, 1}, nil, 3) end i = i + 1 @@ -7328,6 +7481,10 @@ function window:update_all (editing_instance) _G.DetailsOptionsWindow4BackdropSizeHeight.MyObject:SetValue (editing_instance.row_info.backdrop.size) _G.DetailsOptionsWindow4BackdropColorPick.MyObject:SetColor (unpack (editing_instance.row_info.backdrop.color)) + _G.DetailsOptionsWindow4IconFileEntry:SetText (editing_instance.row_info.icon_file) + _G.DetailsOptionsWindow4IconSelectDropdown.MyObject:Select (false) + _G.DetailsOptionsWindow4IconSelectDropdown.MyObject:Select (editing_instance.row_info.icon_file) + --> window 5 _G.DetailsOptionsWindow5PercentDropdown.MyObject:SetFixedParameter (editing_instance) @@ -7476,6 +7633,8 @@ function window:update_all (editing_instance) --report _G.DetailsOptionsWindow18ReportHelpfulLinkSlider.MyObject:SetValue (_detalhes.report_heal_links) + --disabled groups + _G.DetailsOptionsWindow18DisableGroupsSlider.MyObject:SetValue (_detalhes.disable_window_groups) --auto switch local switch_tank_in_combat = editing_instance.switch_tank_in_combat @@ -7757,7 +7916,7 @@ function window:update_all (editing_instance) GameCooltip:ShowCooltip (_G.DetailsOptionsWindowInstanceSelectDropdown, "tooltip") end - _G.DetailsOptionsWindow4IconFileEntry:SetText (editing_instance.row_info.icon_file) + --profiles _G.DetailsOptionsWindow13CurrentProfileLabel2.MyObject:SetText (_detalhes_database.active_profile) diff --git a/gumps/janela_principal.lua b/gumps/janela_principal.lua index c8490fcb..ceb17267 100644 --- a/gumps/janela_principal.lua +++ b/gumps/janela_principal.lua @@ -486,7 +486,10 @@ local movement_onupdate = function (self, elapsed) local function move_janela (baseframe, iniciando, instancia) instancia_alvo = _detalhes.tabela_instancias [instancia.meu_id-1] - + if (_detalhes.disable_window_groups) then + instancia_alvo = nil + end + if (iniciando) then baseframe.isMoving = true @@ -496,15 +499,8 @@ local function move_janela (baseframe, iniciando, instancia) local _, ClampLeft, ClampRight = instancia:InstanciasHorizontais() local _, ClampBottom, ClampTop = instancia:InstanciasVerticais() - if (ClampTop == 0) then - ClampTop = 0 - end - if (ClampBottom == 0) then - ClampBottom = 0 - end - baseframe:SetClampRectInsets (-ClampLeft, ClampRight, ClampTop, -ClampBottom) - + if (instancia_alvo) then tempo_fades = 1.0 @@ -832,85 +828,43 @@ local function instancias_verticais (instancia, altura, esquerda, direita) end end -function _detalhes:InstanciasVerticais (instancia) - - instancia = self or instancia - - local linha_vertical, baixo, cima = {}, 0, 0 - - local checking = instancia - local first = true - - local check_index_anterior = _detalhes.tabela_instancias [instancia.meu_id-1] - if (check_index_anterior) then --> possiu uma instância antes de mim - if (check_index_anterior.snap[4] and check_index_anterior.snap[4] == instancia.meu_id) then --> o index negativo vai para baixo - for i = instancia.meu_id-1, 1, -1 do - local esta_instancia = _detalhes.tabela_instancias [i] - if (esta_instancia.snap[4] and esta_instancia.snap [4] == checking.meu_id) then - linha_vertical [#linha_vertical+1] = esta_instancia - if (first) then - baixo = baixo + esta_instancia.baseframe:GetHeight()+48 - first = false - else - baixo = baixo + esta_instancia.baseframe:GetHeight()+34 - end - checking = esta_instancia - else - break - end - end - elseif (check_index_anterior.snap[2] and check_index_anterior.snap[2] == instancia.meu_id) then --> o index negativo vai para cima - for i = instancia.meu_id-1, 1, -1 do - local esta_instancia = _detalhes.tabela_instancias [i] - if (esta_instancia.snap[2] and esta_instancia.snap[2] == checking.meu_id) then - linha_vertical [#linha_vertical+1] = esta_instancia - if (first) then - cima = cima + esta_instancia.baseframe:GetHeight() + 64 - first = false - else - cima = cima + esta_instancia.baseframe:GetHeight() + 34 - end - checking = esta_instancia - else - break - end - end - end +local check_snap_side = function (instanceid, snap, id, container) + local instance = _detalhes:GetInstance (instanceid) + if (instance and instance.snap [snap] and instance.snap [snap] == id) then + tinsert (container, instance) + return true end +end + +function _detalhes:InstanciasVerticais (instance) + + instance = self or instance - checking = instancia - first = true + local on_top = {} + local on_bottom = {} + local id = instance:GetId() - local check_index_posterior = _detalhes.tabela_instancias [instancia.meu_id+1] - if (check_index_posterior) then - if (check_index_posterior.snap[4] and check_index_posterior.snap[4] == instancia.meu_id) then --> o index posterior vai para a esquerda - for i = instancia.meu_id+1, #_detalhes.tabela_instancias do - local esta_instancia = _detalhes.tabela_instancias [i] - if (esta_instancia.snap[4] and esta_instancia.snap[4] == checking.meu_id) then - linha_vertical [#linha_vertical+1] = esta_instancia - if (first) then - baixo = baixo + esta_instancia.baseframe:GetHeight()+48 - first = true - else - baixo = baixo + esta_instancia.baseframe:GetHeight()+34 - end - checking = esta_instancia + --lower instances + local this_instance = _detalhes:GetInstance (id-1) + if (this_instance) then + --> top side + if (this_instance.snap [2] and this_instance.snap [2] == id) then + local cid = id + local snapid = 2 + for i = cid-1, 1, -1 do + if (check_snap_side (i, 2, cid, on_top)) then + cid = cid - 1 else break end end - elseif (check_index_posterior.snap[2] and check_index_posterior.snap[2] == instancia.meu_id) then --> o index posterior vai para a direita - for i = instancia.meu_id+1, #_detalhes.tabela_instancias do - local esta_instancia = _detalhes.tabela_instancias [i] - if (esta_instancia.snap[2] and esta_instancia.snap[2] == checking.meu_id) then - linha_vertical [#linha_vertical+1] = esta_instancia - if (first) then - cima = cima + esta_instancia.baseframe:GetHeight() + 64 - first = false - else - cima = cima + esta_instancia.baseframe:GetHeight() + 34 - end - checking = esta_instancia + --> bottom side + elseif (this_instance.snap [4] and this_instance.snap [4] == id) then + local cid = id + local snapid = 4 + for i = cid-1, 1, -1 do + if (check_snap_side (i, 4, cid, on_bottom)) then + cid = cid - 1 else break end @@ -918,10 +872,65 @@ function _detalhes:InstanciasVerticais (instancia) end end + --upper instances + local this_instance = _detalhes:GetInstance (id+1) + if (this_instance) then + --> top side + if (this_instance.snap [2] and this_instance.snap [2] == id) then + local cid = id + local snapid = 2 + for i = cid+1, _detalhes:GetNumInstancesAmount() do + if (check_snap_side (i, 2, cid, on_top)) then + cid = cid + 1 + else + break + end + end + --> bottom side + elseif (this_instance.snap [4] and this_instance.snap [4] == id) then + local cid = id + local snapid = 4 + for i = cid+1, _detalhes:GetNumInstancesAmount() do + if (check_snap_side (i, 4, cid, on_bottom)) then + cid = cid + 1 + else + break + end + end + end + end + --> calc top clamp + local top_clamp = 0 + local bottom_clamp = 0 - return linha_vertical, baixo, cima + if (instance.toolbar_side == 1) then + top_clamp = top_clamp + 20 + elseif (instance.toolbar_side == 2) then + bottom_clamp = bottom_clamp + 20 + end + if (instance.show_statusbar) then + bottom_clamp = bottom_clamp + 14 + end + for cid, this_instance in _ipairs (on_top) do + if (this_instance.show_statusbar) then + top_clamp = top_clamp + 14 + end + top_clamp = top_clamp + 20 + top_clamp = top_clamp + this_instance.baseframe:GetHeight() + end + + for cid, this_instance in _ipairs (on_bottom) do + if (this_instance.show_statusbar) then + bottom_clamp = bottom_clamp + 14 + end + bottom_clamp = bottom_clamp + 20 + bottom_clamp = bottom_clamp + this_instance.baseframe:GetHeight() + tinsert (on_top, this_instance) + end + + return on_top, bottom_clamp, top_clamp end --[[ @@ -4548,7 +4557,7 @@ function _detalhes:ChangeSkin (skin_name) end --> reset all config - self:ResetInstanceConfig() + self:ResetInstanceConfig (true) --> overwrites local overwrite_cprops = this_skin.instance_cprops @@ -5961,7 +5970,7 @@ function gump:CriaCabecalho (baseframe, instancia) baseframe.cabecalho.modo_selecao = gump:NewButton (baseframe, nil, "DetailsModeButton"..instancia.meu_id, nil, 16, 16, _detalhes.empty_function, nil, nil, [[Interface\AddOns\Details\images\modo_icone]]) baseframe.cabecalho.modo_selecao:SetPoint ("bottomleft", baseframe.cabecalho.ball, "bottomright", instancia.menu_anchor [1], instancia.menu_anchor [2]) baseframe.cabecalho.modo_selecao:SetFrameLevel (baseframe:GetFrameLevel()+5) - + --> Generating Cooltip menu from table template local modeMenuTable = { @@ -6420,180 +6429,44 @@ function gump:CriaCabecalho (baseframe, instancia) --> fim botão reset ---> Botão de Ajuda ---------------------------------------------------------------------------------------------------------------------------------------------------- - --> disabled - if (instancia.meu_id == 1 and _detalhes.tutorial.logons < 0) then - - --> help button - local helpButton = CreateFrame ("button", "DetailsMainWindowHelpButton", baseframe, "MainHelpPlateButton") - helpButton:SetWidth (28) - helpButton:SetHeight (28) - helpButton.I:SetWidth (22) - helpButton.I:SetHeight (22) - helpButton.Ring:SetWidth (28) - helpButton.Ring:SetHeight (28) - helpButton.Ring:SetPoint ("center", 5, -6) - - helpButton:SetPoint ("topright", baseframe, "topleft", 37, 37) - - helpButton:SetFrameLevel (0) - helpButton:SetFrameStrata ("LOW") +--[[ - local mainWindowHelp = { - FramePos = {x = 0, y = 10}, - FrameSize = {width = 300, height = 85}, - - --> modo, segmento e atributo - [1] ={HighLightBox = {x = 25, y = 10, width = 60, height = 20}, - ButtonPos = { x = 32, y = 40}, - ToolTipDir = "right", - ToolTipText = Loc ["STRING_HELP_MENUS"] - }, - --> delete - [2] ={HighLightBox = {x = 195, y = 10, width = 47, height = 20}, - ButtonPos = { x = 197, y = 5}, - ToolTipDir = "left", - ToolTipText = Loc ["STRING_HELP_ERASE"] - }, - --> menu da instancia - [3] ={HighLightBox = {x = 244, y = 10, width = 30, height = 20}, - ButtonPos = { x = 237, y = 5}, - ToolTipDir = "right", - ToolTipText = Loc ["STRING_HELP_INSTANCE"] - }, - --> stretch - [4] ={HighLightBox = {x = 244, y = 30, width = 30, height = 20}, - ButtonPos = { x = 237, y = 57}, - ToolTipDir = "right", - ToolTipText = Loc ["STRING_HELP_STRETCH"] - }, - --> status bar - [5] ={HighLightBox = {x = 0, y = -101, width = 300, height = 20}, - ButtonPos = { x = 126, y = -88}, - ToolTipDir = "left", - ToolTipText = Loc ["STRING_HELP_STATUSBAR"] - }, - --> switch menu - [6] ={HighLightBox = {x = 0, y = -10, width = 300, height = 95}, - ButtonPos = { x = 127, y = -37}, - ToolTipDir = "left", - ToolTipText = Loc ["STRING_HELP_SWITCH"] - }, - --> resizer - [7] ={HighLightBox = {x = 250, y = -81, width = 50, height = 20}, - ButtonPos = { x = 253, y = -52}, - ToolTipDir = "right", - ToolTipText = Loc ["STRING_HELP_RESIZE"] - }, - } - - helpButton:SetScript ("OnClick", function() - if (not HelpPlate_IsShowing (mainWindowHelp)) then - - instancia:SetSize (300, 95) - - HelpPlate_Show (mainWindowHelp, baseframe, helpButton, true) - else - HelpPlate_Hide (true) - end - end) - - end +--> teste com shadows ----------> consolidate frame ---------------------------------------------------------------------------------------------------------------------------------------------------- +--modo + local shadow = baseframe.cabecalho.modo_selecao:CreateTexture ("sombra", "background") + shadow:SetPoint ("center", baseframe.cabecalho.modo_selecao.widget, "center") + shadow:SetTexture ("Interface\\PetBattles\\PetBattle-SelectedPetGlow") + shadow:SetVertexColor (0, 0, 0, 1) + shadow:SetSize (22, 22) +--segmentos + local shadow = baseframe.cabecalho.segmento:CreateTexture ("sombra2", "background") + shadow:SetPoint ("center", baseframe.cabecalho.segmento.widget, "center") + shadow:SetTexture ("Interface\\PetBattles\\PetBattle-SelectedPetGlow") + shadow:SetVertexColor (0, 0, 0, 1) + shadow:SetSize (22, 22) +--atributo + local shadow = baseframe.cabecalho.atributo:CreateTexture ("sombra3", "background") + shadow:SetPoint ("center", baseframe.cabecalho.atributo.widget, "center") + shadow:SetTexture ("Interface\\PetBattles\\PetBattle-SelectedPetGlow") + shadow:SetVertexColor (0, 0, 0, 1) + shadow:SetSize (12, 16) + shadow:SetTexCoord (0.0, 0.0, 0.3, 0.3, 0.7, 0.7, 1, 1) +--report + local shadow = baseframe.cabecalho.report:CreateTexture ("sombra4", "background") + shadow:SetPoint ("center", baseframe.cabecalho.report.widget, "center") + shadow:SetTexture ("Interface\\PetBattles\\PetBattle-SelectedPetGlow") + shadow:SetVertexColor (0, 0, 0, 1) + shadow:SetSize (22, 22) + +--baseToolbar.novo, baseToolbar.fechar, baseToolbar.reset}baseToolbar.modo_selecao, baseToolbar.segmento, baseToolbar.atributo, baseToolbar.report - local consolidateFrame = CreateFrame ("frame", "DetailsConsolidateFrame" .. instancia.meu_id, _detalhes.listener) - consolidateFrame:SetWidth (21) - consolidateFrame:SetHeight (83) - consolidateFrame:SetFrameLevel (baseframe:GetFrameLevel()-1) - --consolidateFrame:SetPoint ("bottomleft", baseframe.cabecalho.ball, "bottomright", 0, 20) - consolidateFrame:SetFrameStrata ("FULLSCREEN") - consolidateFrame:Hide() - instancia.consolidateFrame = consolidateFrame - ----------> consolidate texture - - local frameTexture = consolidateFrame:CreateTexture (nil, "background") - frameTexture:SetTexture ([[Interface\AddOns\Details\images\consolidate_frame]]) - frameTexture:SetPoint ("top", consolidateFrame, "top", .5, 0) - frameTexture:SetWidth (32) - frameTexture:SetHeight (83) - frameTexture:SetTexCoord (0, 1, 0, 0.6484375) - ----------> consolidate button - - local consolidateButton = CreateFrame ("button", "DetailsConsolidateButton" .. instancia.meu_id, baseframe) - consolidateButton:SetWidth (16) - consolidateButton:SetHeight (16) - consolidateButton:SetFrameLevel (baseframe.UPFrame:GetFrameLevel()+1) - consolidateButton:SetPoint ("bottomleft", baseframe.cabecalho.ball, "bottomright", 6, 2) - consolidateFrame:SetPoint ("bottom", consolidateButton, "top", 3, 0) - - local normal_texture = consolidateButton:CreateTexture (nil, "overlay") - normal_texture:SetTexture ([[Interface\GossipFrame\HealerGossipIcon]]) - normal_texture:SetVertexColor (.9, .8, 0) - normal_texture:SetWidth (16) - normal_texture:SetHeight (16) - normal_texture:SetPoint ("center", consolidateButton, "center") - - consolidateButton:Hide() - instancia.consolidateButton = consolidateButton - instancia.consolidateButtonTexture = normal_texture - ----------> consolidate scripts - - consolidateFrame:SetScript ("OnEnter", function (self) - consolidateFrame.mouse_over = true - self:SetScript ("OnUpdate", nil) - end) - - consolidateFrame:SetScript ("OnLeave", function (self) - consolidateFrame.mouse_over = false - local passou = 0 - self:SetScript ("OnUpdate", function (self, elapsed) - passou = passou+elapsed - if (passou > 0.5) then - if (not _G.GameCooltip.active and not baseframe.cabecalho.button_mouse_over) then - consolidateFrame:Hide() - normal_texture:SetBlendMode ("BLEND") - self:SetScript ("OnUpdate", nil) - end - passou = 0 - end - end) - end) - - consolidateButton:SetScript ("OnEnter", function (self) - gump:Fade (baseframe.button_stretch, "alpha", 0.3) - local passou = 0 - consolidateFrame:SetScript ("OnUpdate", nil) - normal_texture:SetBlendMode ("ADD") - self:SetScript ("OnUpdate", function (self, elapsed) - passou = passou+elapsed - if (passou > 0.3) then - consolidateFrame:SetPoint ("bottom", self, "top", 3, 0) - consolidateFrame:Show() - self:SetScript ("OnUpdate", nil) - end - end) - end) - - consolidateButton:SetScript ("OnLeave", function (self) - gump:Fade (baseframe.button_stretch, -1) - local passou = 0 - self:SetScript ("OnUpdate", function (self, elapsed) - passou = passou+elapsed - if (passou > 0.3) then - if (not consolidateFrame.mouse_over and not baseframe.cabecalho.button_mouse_over and not _G.GameCooltip.active) then - consolidateFrame:Hide() - normal_texture:SetBlendMode ("BLEND") - end - self:SetScript ("OnUpdate", nil) - end - end) - end) - - - + local shadow = UIParent:CreateTexture ("SombraTeste", "background") + shadow:SetPoint ("center", UIParent, "center", 200, 0) + shadow:SetTexture ("Interface\\PetBattles\\PetBattle-SelectedPetGlow") + shadow:SetVertexColor (0, 0, 0, 1) + shadow:SetSize (300, 300) + shadow:SetTexCoord (0.0, 0.0, 0.3, 0.3, 0.7, 0.7, 1, 1) + --]] end diff --git a/images/classes_small_bw.tga b/images/classes_small_bw.tga new file mode 100644 index 0000000000000000000000000000000000000000..e830b0d4f6232a29199b18a1be68a83aefc6e772 GIT binary patch literal 38604 zcma*wcbH^V)iv<0s_w4tneLhH>6xCMp1}ddESMu^1w|2*B<7rR&dP0&oO6_%1rufk z69|~aoO8~Y(|PN+?suvOAHVl`=MSpthI95_d+oLNIrq*mGO}W%{@HhA-;u2+t{wa= zD>|J{86O`nt5&Tl>(;F+8#it&n>KCA_u1LmGCe(A`u%=!-No*>#(zc~T3lQ#+i$;p zxz(+1Rkqn?o6_9uW;ZL%O>T0N(rmr;)}?ExnVFf~dZxPuV|2>s=xAxCrl!h%4qfd( z<11FI$S8NZ)1C5p``h2X-1^qHE{18g+G?xPH`eCOn=_9C&Y07&xw*NL@s~J|VJ|am z_YQZs!|7Q#PB&(6&6+jk9{0FMu;XS-xiqH?a=Y8zt~~2m&nivRl;$vNtTS+85x#e+>dtB&r*Sp@eJpADgkKacb zbu~Yq|NQ5dOE0}NzFu<4CHemKuYbLK;~U>7T)*zR>*D#9S6*4({qA>{PkiDN<-`+D zOi&LoO3-`IgC3Od!kRY;;lRU&3p4yR&l}$GhLB~?J@-spD?Tt|i@OZzyW|k}8jlm5 zNRD;ya+kXlaD(X04kz|g5Pstu-x#V%;X@8NBpGnWJKnLp`OR-m6pZ%7CqA+4w9`(B zK=P&wsf#YUsPMb_<~P4trhf2)ACw>d@Q3C5-~WE`{oCLEcFum`3tuRo`OIg^$3On@ z^1k=IFX&(ji(|#Od_!_V!Zv6)%f|*8R!Z%C_uaR=)M z)QCo)7+BgX()fGd`(F9VSH4o3?|%2Yr3;Fm{p@Gur$7B^X@2sPpOn5M-}%mWa?NKy z``L2!)mN8~e)OZ|z3+W*q~btEZ(=?m5T61#Xa>o_MXuIVqzddh_~3)1CNF&93!|Id ztfK9DZo0pc#qZnP<~D)Q`QuG8>a05}R{(W@Gp$b0JzM|=5CG#6pTu5PQy;OKoSba+ zHQ?a>kAM8*02C-je({T6l;)Se{AF43t6%-9_ysD=fgR?2?sK0DIDk6txZ@Jp7_*7E z<0q}E@%G6n&TxSqyAA``h%2fRHu&TNTWJLTxQESkJYKt372w+u4kR&0ToOSaHQ|kF3T{1^(IB5g=tc=Jb%NfFz>9FKW)P#*mECvWJs`gBb+1eHc>LoZU!L@& zCzYo??P=j3J*WME#6O|S)Kdb^P}+`aH{5VT0bBj<6QGX!1a<@Mq;nU##N80Vax=4d z$Fz#0B8D+^%#}6Oq$wQXt|)+#8u^5%F<^qo#zkE5FkVFy!tSS^&K(-YJ8BfD`h;p4 zp&mj$``OPPBAcV(WbB{AZt;EOBOe)VY7Z(Wl}KIOKKtxbaP#%Ae|=INZ>2Zb_t;~P z@{or-B=)d34Zy@Z-tmq|9U*{#;`rx3|2eRtYB&q)5x!l4v3TZqS8a$ z{{`Z;X4Q>>>%}jAaabv7&_fa(bkITNfCCOFZ+g?4%AtoI8tbJckFXtx=6KYj9+lr{ zmYnFbNQb7fkOmOCT0sB!$3K<^=AA$N=}$Qmkr)Z|4vp(&*#YPM_S-K(I`!03BYOLT zc{A%^P8$CccND9tinw)cSj%x69`t*w(sKyCT=amsJOuv=vq@ z?S4qwq{)Bvt6yC@nnn)fve3D=%PzY_PRT2kNGa>lfpgD2H@%g9w=Hl|h*AhCoG~i6 zF1S<8K}X3?4ODKNc-!0FmKsD{!3bwCBQpGb|JJv@75f>d(mSV7a*uwL|FK~+R0tz9 zIIG}PWa$#%2x(e z{>ea}`dbSC7zvB(AYR*lh|3aIQl!|iS)M}_3d|;zn2n8?U5g^N$}2f98_-Zjim_6F zV;GM8^oABey{?P!t7Z=P^y#7()H`N1VgvPn4fW>23ok57C!KUs>404zmrn?sVa$crBotr@FcK$a#@d-3BZAL~k# zR}gKix%x(^iehy7jdT2WcX02^5l8S#JHdKtfB*a6zW~2^>s#Mix*7^uh8N2Lm=jus zQV{ebmc|Cs1s{I+;pK=UjtKGnW~d|}Jc#OAfm3jI-F4TP7n3&Fq(OUvj1qtbIN%99 zpnWGKAhMXR0dSwt0p7iY$aaVnvPcoe8wFuA0EhsPr63}rY7GJ`QCS)Yl%Ro6%9ud_ z(Z|}Ck8}bpB&4>dmQLdegES+JS|0PX^k)V58}N+)Kl>#kHx7aM6^Dc%z2Pj~a^q`X z``Yq~SG*#jkde$00wx`H*kP$dGD@rHTFL|dz4qEG&}YaFWuQ9Y=Y%~YK-Rt+=yp*A zM58DWSqF~dHpOKi$6eKkMTbrewPqDPpdA>DOR8uEo7UhgQdQ=ws4AqK$zpKYRa6JH zP{>Mxng|!Tjas2*5vb9th1pfu-ogyGCGlwi$Mg=C^CInW+RVDj#x^Ym zzfn+_;paFh)^^(l*3u;cqhj&c$38YqAcDa$jmTDVns@AHp`6o%!4X~(Ok)QdJ%K#{ z)P)_Hr4f=#@y7>=saT26mTN?%6ngd=+@Gdx$t)vQ!>L;xT@FSk#M$h5%2S>ah~4f? zC>Da}5d*aiPXX5rjssN1vH@dHi$J9mKniv=S?by<#VD$psm9?$i)&Mip*B#lFgP`? z$O2>&Gnk{j*|1^5u+Sq7kF66m2{Hy6b^k!Q!g}pJn`^99d$M5$C6S3(inU5S#3O(~ zt9#mMr$yFbl_ohJ48qp#m#{2{mysG}m08rJVP*qq97xVM%2qb9myhAyz^Gno7y;B6 z2ZK>q)fUSlgkM>Z&fx_G;BE9~;EgeiND|E;=g&Cfj3922S|?2F4-jPVi9bRG0U^WZ9i89il}~%R|S`skNS_XXB5J~Y_-Dd&^&|bF$Xp*SV1JasF-{-jl$wDj> zo6o1ROk&jnDM)%+xn@K4TY|>h|L{9u=_4|!B%&IAAR?Ays?G@}8c`uL@(6Zh2X<6~ z*G>#3tje>mu3He6bTssK)Mx}npq=G)D?sL`U8t2T5lR{-%Y}1kX(==!9N8SdI404z zTsUIlY?yToYtnF?NcBJsW?A5DoEW2jt^pkN<{qZDQ~+L`)b~JeRh)vbLf~RPNl(oT z3i5b~krTdE33jyz5O}K`i&JsSR9&X=(Rg8N=DONkqj~^>N#Gf4t~}0NQQIzMj$n(O zK3MG3Zv8q@<8&zAF_t-^6q(~1a||ljbdD>6_qx};GM`WD5{v|p?;?Xw;>_l7y4{2K z^CW{^=RbLdE6QMHxs@;fWgidNbcritz_^(B< z@hxo5gIJ=LUn2&MrTMnxvUc~tx6sw?eK2xRJx~|4hUzShHP{8NikNoXggosp!VZy? ztd3ud4Jo_65o?5qGNVw1kQ|trw<2|+0{jrUO>UGKerf4JHe{qljoR_ z?CUtr&S>3g4j{2lz&eY6C{OS7z^3+THx38@z*V_;z8hlcD48OSYJ%EeDV8%`!Dc7G zqcS~HsOY>1?uO|zOWsNbq;QXWtsNMbdq*N0E?H>-YjZ~3KxkkZNOD>5c{o$+#XH~m z&a(8L_q?Y}s3K&OgsNlE!yR`D3oCWe}Kp2CbsVW>>jYd*rq-YT7rjsWn!ia#1$nj0w&<>#U+h zR}cY+xx3Cj^NXdqd0&C&bf1kP;SHo zrBf{HHl$qjcwbyxseAzlWBgWdDhC0G?$(m{YvpOHL|lbHgCIn*3tz*;L7Gj)V4aWB z4@`-}U=HAA-7;dl&aP1*SKuEWo_Xe(>Bz141@6lC^I~RfMx+`a)?eqhHZ|aO`{@=q5`W?@q!C3NclNu8CI}x3`_>4_ZC4M zw7SJ6SF7`&!zl2Yh;b$YD^^?YYP&7mr40UxCQ)Ms`G~9YG?P(g!3i9wy$1{QA4V~& zdMQXoGAdYV^UN9~uwrMOEtPOH5AJmqHX-03tVR=JS%R5Z3Q!?n1$%`AEeJAU0xbKr z+!RSRYYlLoMXb@%ldQ9sVHGct#~TXbGA7`QwV_1Qh=l=X{02R!Im%M6F6;=fL-Ehp$jaDB{{FT=9;_#L^7_r>Z+W#l+&wQ@Y&_@ zY|3xxYb-GEIsi{A%>Xo_u1I$;@|Kr2;J7Rsa9cV89NQW<^(3b8uohz*ZSS^zaTpy4 z5oThfPxN59j01wesL$rri5i=jVP(4A!96k=%dJ@0rBK^Y;1N2RR4~;CRCK@PIm;{q z$w@$t%Nu}fN5QRPK~p6@xA6>EDlZnEfByNAZlWULB^9}s1*QW4hKS|g{`R+2Z~POi z%r?boA#*k7fy_xWTY0;aavQbwM$x%#WRAPQgG^k*A0gqcV_*8xm-5aJ7mZ$PJjS{o zfk=`2z(P0_WF3Nz47Bc(H<$}nP`g$cg+oK=`>2EaMy!?qUVx1hfTM*A(t>L?b$}?w z0A!ScClTt)NdR;VBovDJGEf3iZ*U2WT8r)4qoL|9Vx*%!Nre&UW96izwMNh>n1Kqr z2Ae4`hwxTS01@E z*tVuJLDQdK)A|QV?Lsvl+@i^J006?E7$-d$<2B!=4F2@NCviN`V3LQ;_A>3w$$$X8 zgRzuAeTl+hc|lanO&N{tnz|(*L>vHs0wes+5kJqu&_Gd>cOKTN9ss7e(Dq%@8v{Gp zEZ^uO)&bWsEaoHd>voH^A7;Bw7`^0c&sMp&aF9plXD_Wq0penAZNiPg?kYagP*Mf( z35{Bf4z1HROCts;UtyhauEaWR*;l{%)iB$0R&wQ2X95o3WA+g2MclLmaHoK}1Mf8n z1PkEO*}T${gaBD11#kkP=Tve4FQt`UX$))xu?%8eJep&B`66)Bi0kLK!y@Df~pg@9>nSz=&(A)po8=#$gg$M*v)PLG9@;uP$)FC zstSlQrUwBMSUr*>A`%!#9M%~yGkl%}k*B2Ybd_?Ynj8IqS>a-bm{%?e}77)C9DGB z;TpAWP^nAV9OXbDUW0*juBy12EqGi}#xNT|R9A~nny52*Ay4GNf>_CI7%=9SHKc%f z^TT^dMhwK85d~b}1#SJ*-+-G`;Ws})soL-x?c7U3(EwrCjv`1Vv-IHXa35L-oBK!! zywrm;AlmlC)XypP*U{RNDHT{o8_2${LKLZ*A!ucx4HxB_sOK{NWEr8bnZ(Nk|34Qx;*6{Fu=~jaOjsl7zO9Jb;=q z3n1sL`a#NAvnsGwjTGJW&e@0Hh;jpNOBxpG2V92;&IRf&I+-Ehb8wN6X#gA{nHowm zg8za-tMOE)gD9Fa$B2_sD0_q(z~<7U2%rE#sg__i1n9O~uKNPORTjwvjvCrpN5c(F zLhsYk#8h={NF=1cGT}b!Aq>N5<_F~aV3Be~MQf=t1H-gxn1s(9Hw!>5UiHCvibaG8 zvjm0nto7Z!g5gyR;6Sr>%koGt6BS4(w!q&4XvI&#Blp+`aDZ{ytvY()-HN-|GOH!0dQfs-xsk%_rm#7Lpfo=B#0P>G|s}PhNyMW9R=QUUu zMwzV%fTeE8Reb_hE0nF1aCQXfEK&O6 zs`waAGmm4`hwBnJTQF0uQWC7;ls^oR+R{}RDl0&&NSP!M&v28pXuF&Nhu=&QU;#9O z!s9#Hp}PX9H@4zxsK%54xC%=-42-%hFQ**Cq6%>2!}N=_pTIkPvG9Nwu~aDV@P@?T zI_~2&Q6a6amC?4sWGe#Va=IS*qqy5@ z@h}@C+%y}{YUk<`eAo+Ctfk3_0S>vU=$VPn+A{@HA#*)zoX2#5lr4hGXB7wqg$=B5 zGIpTN)9IClpsA8n8PSc3h#`Gy_zj^^(g!zsnsHiV*#b6A7C?2WMhd9&_#-*FC%MQ9 z7zhNAG`kWCsDJ}DhA4|vRuVgpAwnrAVb-2_OI~Wv(4E z`hZWnsD~np6xgRkSMpHGHA1E&gPI^=JemmuyIgn#>9Ln8BV=;WlHOl^`}^Pjo?}5X-FLj6LuYXzvRYy~K`>=G+Xx(zqKyg!dnTfu zjN}ij#Q@bZYL{NQQ;o`zS=Wo5)vT;_AKO(J=?GJJyN(Kom#n3LQVjMu)Bs|f_lgO! znw2J~(xkX?V8lGjSgupJnT=$^kA}nqG@!CjK_QAjNOT}J-z=Lzt38m1+FRRBfBoxU z)Aok+Ypp}P-scWYh4xj}6JaA!N!5&my4FnU9*a0HhvXDM1Q@vjTmEj_u*X{j5+cbx z(#R|1MpE|}$9V|&L}%pE00EqeND3)N>jWNYk(V9_D1r;b*+U{mE_Er6$ZILf1yW=^ z%WMTrPI={8&x}vR&%#TEk&{eOW&Zikf5x14D~^DPxcv`*j3|4I=B?nm3nVN?RYEyN z_lX*-u*Rp~!ikZ_ZE^y{sd=M7Qnpzl1C#v_oZ}zKlcQ9K)__pa2A@0RgllXwsFV}~ z3rT2|PNUL}E#Na0nw!ii5`_s$BSi&`+c@ZtPMAD`4TI`#I1c&)6zmCnBa$jynPx^U zx7N{s!%7lqJwX;cMj)>05!Wy(f|pJntV(N+wC|ljbpwPn61d?z-th)c^lao?vZ^m; zu9gUge8o2zM);(xEYmcoAI4PbjdhOM@(RkdpMG&v(Nv1W18|0-ZJsPjISV11_d4^2 zmpzrmwyaba{k&2$MU8+@6M>+9xZJ1qQ=k8q5_NPELZA4RvkQ*UQK=0k z5aAOIvr`BT&^WG*Bn3HCrpb?nB0N(DbC4L=!@Y z`pq0->^O6j9N*oOw~MBvoTfTul_O(zm3PPq}h5$1(4cS zX*Q;@6+;DpK!a3f2n+yl1wa5H`~t1hcAw%67}uT$jLZFJM2zzOT>gHgUn(*P7!6&f zp*h2ml>sUn5p}I-$ZjMR0kLLy-kiGHBprN*aNbcGF=8Y(Y* zT@^bqrh!!cffP^y$xt+j#8XkaXMtoe$&gXTj zhtS83E<&gz%+EV`gNfUJc!3kPc(N1jSv4BE47+li0TcCeSjc zeInJ(ToTk(*r)soW^m~sx@Bwrd6b5KNvb~UEfe7HE{TOlmYMj{-VJMax9H%Pb3v!i z7n_t-qRnJfh#Dy`sBS_L9VexgC!AHHRCC95dTJ~sDasJ{qW0 ze2oMsNe)uDM#};k0i=Pn&upwGQ{;=ayxIaT&4E88llf|xT^*Mz%Z3|rD=&63PP@^* z3GW^}#1xqlSo$*0>J2-HGR@R*s$|2fx)ea!2UH8EVxbdEp_;G`vQsA4WTWjCLnG7T_Y0FM2P_MLHuhCSq#t>>A&EIGVrPFgVb@eFZZ(1j#9$>Aj%_L1%0j&?7vO z-jK6AlIG&k@=-H{1Hp5JWQPRKVh8?OlIerA0~YJ_i+{NzZ@8yH7!0%+mYEk%?7~WK z`36C3%rB1oVz*BSvcdPv7zb7mevd^grt~2~WC-ThF3@+C zFQuc)c!V-oK%J#mh*0$s?;JyWy@Esnnf}HGfd@QN7L+~(!>F;SE1fv0*hMR+xdj#_ zLr+542nE-qmEOs&M_p>6u2AIZN0&|`fkces8~CW&Qpt19IcHd*k=r^+nz=(4qiliM zy!sU1-KV4Bqxzvokjg?rWmS;j{9)oGSE-VzWdgNQ;N_0Y2QlWy!0c?`Vw(3gA|^|O zL)GIZaH_jp7ZBrMoI7oG(JD|ohtWz>AnrMe%dRwYU|x+yv{<%kSQHcY32n8Rwg?c` z37yQ~m%M7nmM;L3oo0+jc^eM2vH?3W87)+Mm0xCnkfLjmbu+YC6J-gD5c~zJO5&W( zf>IgJtU)>%m2Y9|1eUr{%8)|e@x_9VU;sBf>0lxEvh>^FKAd+%pMYZ^rR9ZW7J1z-ocw9WoZ*Hv0y=4KmW5zjefNI4@7Rdot#Jn1I{Qd~16_O8{0Q&w`u zFxN6(p5U(rNquxLd+;dxlj}h3nXu<@z)_1eWHz%{FC**-{o^11$bO}kT_wVLy|PbL zhrr2d0Gd7UuLqv4R}l3P`0qDGCu2rd4K--wMVK^fa?y?>$)p*oqX(rb0@)EA3LhU@ z$mttqViu_&Ez}4{D0(jKNLbtq+~d|4?!!<{fXO}9B>7h}M@a;*l|lx~n})zmf|7&* ziuv{&g~!!g5FStmi0nlqEmz0{<5OEr09UPvzyo}u0Yr}l^RC;Zf^YBC=q!~tytC0v zJZgIt9Oh-N9+`5R3size(zI}(ml0Yzkjo0bpdPH`n#}?2sfSy5&qsA6i=P&51q(PB zsHJ8Qp&&BSG?#Wv0F0!0UiqNXpvFMX2$#%oTz87eLf{&#$4S@V6kh5IjmT-EW4$n_ z|AMQ);w>0s=@dsCAsS}IIob;tiLDyoop(No3@`F#`;icb_Qum1I~f5mFhvfKzYq(aXML1GC(6Kb=end|vv$t(m4rgolS z7@s^vmnXp~>^2XSPB~(9HG{-jh}#!#ytO`Kub1G+maP8=J)Ho0gkyXnWPaHKJ;Y)c z!4jZh6W(Tv!`RAPA_X`g(>P@|`H{bQ?5UDX80KmuQz;hJ3_4DY1sR~m5)k_jdK~2p z&zYpZAXiG8>lI6on^)EnJ#u0uL8II<$8}-wR_2z2j!6xd+$P2;dzx#w&<&%3#{&LsUH;iy$BB#Kr928}H37>j(oy$7>~sps`X=mESn9Np=w| zHN@ydOF&o&QZwuI2$wtMzdW$8HnWn=PYhSTSSx5UPAKeh+Jy5rUE~m0@$B6&xb`jASncx2J*`3%~@)EsD<+1orbHCQ=q zYKDUm19e*o+(4ZB!)6bcF~-%d65as0k%Y)mZZKPKh25%`cA(VU#c$rmx$(2Uxu7ihWhZpXqB1Y5xI!5&5J+J*nboj|Ue*{c*Lmw5` zSnf$X)CNm~iWil6Dwj$|XX$6#qp4w}jND<1h829nKrPAxreL|LfI(7Z0x*Ck_qdGJ zGMZq@a&xLL&Zz=y!e~LXCQx%^wDphgSu3q2WSFjL#$v41R>&9DlN4oLcJhuK+aA&* z0zvi~O&+SstVl`Ezw(2`D2aTCg*0*tChmk8`PH!zdwT;cK@w!)i!i`|uvJrTGfD;pj1$+@eRYuZG3|dNH0!bziGXTpFzk$zHP7yyOByL;> zs%vG7OaQw3wWeSS*mJ_9+rluRa;0+r?|=V043j^CK^};j4pLC$z1f^6nPkZQfg%5* z3Hyk&fFnk7VVpW>my~y1BnlBbe;Ud+YBVAD$NL;eo9yk>ZJt;jmJev!{>$AI3)&4S z@8Il^<74y|K){fFfCWZISj$WTgh`4QK)@>bX{Geju``$$P-15ze?YEvvK!HsxH4%bIf1iXyr;whAsHct@3B1m*>842W@+ji`gu zwTR=UCLC}Iwm)9H@ocSgX=btW-+Tnh#w3ElxH@&Zr>RtV{l5dhK;x;YZNQ@fGAHwR~Xfu;P7gWzdeRExNRny z>n_xY5cOClU$C1E*$SE06_EijfRwAoWU1Wngicc`U+M~7;g!=UBHzv9HynJT2WkY; zOg@QW*n#|}04ryu9kyxdz#izvm`XS4G~S6Du-jfiPawL&11!n!N^YB$>B8quJN(); zod_tnX8yWuXpe}1Kzi(P_e^SW#C2Ycx^~zD=vu z;)iTxT;Xtn`xew9rkB&cI4@e94q|x&X1LtVoP(5}NU3Ez9QiI>GDD41soKZwaLV8M zik--cgz5@H!YU)q$p>iJ!GaL_F}W@hNtzmievs6rLep{ig7{>b74AC)8~Pxyi>8`b z*b+6E>)ntqxxHRIty$zR>sd#!&|MuTwo(Qw*s1Y$3|r`3jVzn|{Zy?nk)}ad6c3Z5 zGp2$%_W-AQ>2(l7R7|TMQ$Y20M@f+Q3bh%SgBPVTtK+YJdWJ#l3Uspjg2sXBv(v0!yB2XHd6yKYmZq? zWphSuz!R2bgCzezDEHlLXr{P`Dd(}hYWO% z@R;w?XovU$or9Q}Q75>?T})7wsJp+F?2q2wTv38N%g!@dQ^Pd9b}D_AI-@3ly&>Tb z(}DJQLjD(mVi)m-+YOaw0@%|3^JA$Qw_Y_N?6D*oD63w!DNU z!*$>iSv1gEs+!9=?Hb3H{D=a$vT|uRopRI-iS6L_b_duI{;>cmOKyyL zdCfiSGEVTzp|-notd8nlzw765zGRHJ9SY^&WTVr7q{Na`;NpOUaW3HCxN+zZ`PAk|^0d+4h;^3@$QPW?+rDAwwHKz%~ zNr}TYBl=Cp*sC8=YHfAo9iBX`ri(0X8337i5LYO)MkLMZp6NPSAOHi`tag+X2`3qV z;~o`4tEI}5SJQAQN|wD$DM7iE8{hNq$@eLZc1AnMU}vx%Ofn-d%vROYS(-x%qZrUN;_A1s)x`x^1lsJ$wlQGo)MRP_lR6mgghRUhrs#OG@ z`S{9Ui&z1u(FPo@_+8wFjQ{m@| z9X4w$_ZUYMhcK=Y9sM3~rK3@qi4|s2Brpq)tr`UhdpKPS294uV9)vHbiI%>&2vVIT z8#G-Otb$bksRoeRg%=DU;2}DY4YPs}%jlpK6;!{IF@52+y~%SdWs^KqQ~=+u27ME7 zV_+>}5)Ys1JR((j;*mL{sxEHB;1au3q6Aan($!> zpaIU6sNot(=V>~22#z4xAERSJ01&K}NBUXYj#frOL~m=q3#5c$4VIDtl~w;l3KT#Y z=C>6Z=P-q`JYd6q15GeA79o>RZOy8i%Q&q{U=|#hK9%q?_Es|6WxW!}~ z0hnm{bgg5sm#89Z9Dp0c{L9)hFCIj&#>48vP*Q~%GFmK%re_X1d2tXIv7#}siz z12I91IF)Qw@kCR@#|X%&Ei|cNeh*PSfsln$~O5&*-=qx6vHRLw;961%5U}+P^brLTo>`Dub-T|MRFy9J zF5!fNl}3~9$RspI_K9$&%ZB8Lqm9E|S&97rB{WsLC<(abhiTbE}3j=G#tVvM3q(s0z-6$$%8&Iy3AIF4sJytXF? zU{Zfx_+&a7$QMt+tHeA}8ep3<#DniJfsF%)mdFt> zi(&awACK5C!hYxK-*zM7I9p-XUd9)<6kU!@|ubK}4;0rbV$1hAwQ>A5HUlGTW9OJB7` zY>z3FGm4vd!Ec&YDL`6lI;^v+ZG_{M@~BMWIU_)Ar~oTOnr|b}RK1`ESZKU6Kq_j( zZa3R@nm_zDDzH|dYl8SZCH9(jYKJ|eZ z;U8&%fB@P4!u4S)t*ZJf`HVq;)C94y^{khLqhcw^A*F60P8%OYL|#ac9eRu^ddkEn zyRNc}w93MUe)d!xt(@5iZg!aaI&(ZAL@*>Iu22oqR0x0m*N5^StK@8AGh=~7hFyXS ztRX&f)3&1bPhZ-n;enna8w9A74jmiKjh7FfZcWrZA1G5zeKu6Q|Y(@4awwB{&9F%YDlfo zY`Ds3rCpR*B{JeDf3U}xiDUjR;}WQGsE->|N4_gWa$OcVNx@^sLXDG=DVauEjLc>R z*bp6>gTV)l>ec1Ag4;ZSB$w<+JvK+B*La}s~RKsFQw#oLk z1X+K2D=U5E1ojz|qQJ$1i>~YC)Ka`}r21+rB{5(l{Sftvf#bMM)%Za{oTG;rt20P* zw4ugG!IHVQNsQz-tc`?)R1LTF-u(9z3IDCz{Lv=KD9Eu>HB%0?Vv1ejwBG#A(jf~J zNO=3sGE*rRZSTa$78^ah7HK?{$qF-HXcPp^z<1e%yNS^}ZmD$U=AXFm12f@ES?ZF7 zPZ|ZHs|6HCs;)h>_uw2HR4*J%)4GB37!hxDGZ?L+z}RfMaoNs(za96R)|tWmSWH2w zhMGyW_#$3drj{))kk(5+!UI03$qA`fij zLIXti3#Ma=yH3nGI~W8{QcES*A_K7$E}kKikhWps8xdAEwIQHqi;+FagOm0Em5iqE z=7p3ZCFBhKq>+%BjkV5c2?!FBEr)5)4z(N7E_bV_V=4FLlyC{5DFLK5FkVVql~#Sw z*I|b+(GEF@9fA`*&&$Ldp+wG@4X5Oau<1+mUHTx(D!(uq3FMM}WDc-U0}BA5*1G|R zqbzpb0wY12@J(=yD#uyiZm_EH0v9+Y0c$K3*TW)+$Sfo^w|@&mX0@SGd3B~VPqj0% zvE`}l4H$r$76~iuXPIo_z0qsMVxwiF*<_}%U4ux=q1r%78Ci>g(1|=CO(FVjCsqJu zw6J)=6}W_ob8>^+1C#V%ko)C=!j$Jh?ZXuwEeIIFs$zkm0;0*1V_s4xUkaEV9*^h* zPd;i6uo&cMr4dlTeCDwVHK`z@V!!ow`~DJtzmQ3mtmS61T~X#L5f)- zzzJ9W(u^G?n7|DD!lMyI4H<&!!U$iXa*Z^w4l<|vC=ZL|v+P25__+twhjzuG1wTPb z$=#;15EM|G((tM!3BYHo7j;JR>pqC0T1$3RZLE^qLM@@e8VA=C8~_tSc?cGa^$s;n z6D0o#vifJ!PRAk3FkO|>WsnnASRK1p=T4>p6@SL`A6QT3bg}B1x{|>3CjyaeJ4qPFH7=|lV;y~YSbO|@sm=u`!%rLS6Z2L57 zTy3m0ie``%GD*GEjOE|n&BDA#k#yRM3_S>@llnW_r|*EAR5CD+xgaiNAgMeKbz_L7 zF=)7L9fr4E9DY(AD>&((WZBWAsa6maw1LwM$ALy@#2b?(2Hg`QsV8<;lo;!{m`HRh zfMI8vjhO*|TU`($26NNSnnsIOp)2G(g^~!I7JB+d9Z;SLS=No4Ks&AS(hC;5nz%Oj zwi?=il4KT&+Ez;+`bd6J&39BYF0(n$ZKMx<@_$HT33U@^Dj))^5h_2mr#5Fjar9xUNO z2o&(wpeyqM=~BgjDF|;JAOJE~?+koFz%Jb%V8m7NQIz8H0x4J3Xr0j+B`8)DQp)DP zPpyyi5?-OG``VakCjs}YQn8hj62uyi%(hSV<-HJa%XjRxew2E#Wx{IJ{n{;mlq23L zhcrz3=gN(G0Aqkzs=`4g*cntbWkD4R0i=BL5?Reh2xt(`bqlVSnL^+`0jJ0MCxlN3 zvcQ;Sq}zqS0!SF7k1csQK(^Id(35QDh`vZ0R!zqA1avK_1sx%^K&XGc%(j)%f`tO= zA%vQVV_=b}4AjDdn4xtSvfbKJxYW69N_7B$udR5v?bPlD=ATwpHLPd>joXB~(VNqz?aVVB~I5^`L)mGYIBvz?a z)`5Vw>b5eXi#krJNCZ?|Jjdh~WX4lDyF<8ZKgxvKDl2HMjl0!uoAu7yIlv68ajl&i zR^TDl1fDTm0VX)O3~+s8Sh_-zlMt)E+DmX+&{4;{7E5I9_wa}NaTJ+Lupo7d5u2U+)jO901=EPWE zAl*0$ZcN2{{TFzdfiql@(BALHLc0kdR|EVW?f`V%%|Tff<9p`U=?W9gOd;*69C{TV z<+?s7Nf5gQWR(;M(FeJt@F)>B&K2qx#3##wc+&4?-oG@dOYc9JO{4ME#%S z2eS5`mI0P1U@zuM#+aDDkOdYqW&He;dXf}83K;I^+Wa3Vgt9H3lAB+Mfkc#=rVnkN zSEek?^+MPx!+>cY1zXJ^pN+{X3}>}`LLU`~^%gFqL-q=c);t#FMWn&6u}rG`kpl6c zd`sv&qCL*ucb7_YW_bHDsNr%8FDP+R8NeuolH%g7qU1ZHXcuFptH_fQ4(O4M(LzSu zs9|JbRNjFW2uct5+T|!EHA8~kQ;f|`2B>_N8gn{r5<+S;_^gyg`VoB%j%pm8W2K%& zXCwH2lP$fGywX9(-@F7jC6?5S^4c^|5@-iKA^K=9E%cS5Av(D||Nm6gHdQrjU}- zF_|O?;07sz2nBvhW;#sPTo-Pi>aM(0miIf`|1B&pWnr5)5Ob9y?HiE#;(9d9x-g@- jATH(d!J+)wbN9V=+Alkm~A1|NJxe0fioag)e&Uwzggm#Ph(W3eHjO2{y5e#)} z6(azkJ)_|dn={3lv6%7Bo^^JN58vH$z>!fxf9IUfTo_vK?z!m7SWjO?d3Gb770~Et zlhLN3%|V-uHXTg`jc$q?{Cs~m#wPk#)O8QZ9wjt#-BP)!OWf$69`mQIzw1iVvT>w+ z=j=q=V(&ux+0Ti#;3t|1Ih)OCeZ+8=`sWp@{fyxCLul=2 z=`@vj_hsWSe!}RI+f2pbLVS=h%Asj67kuZTa;BnDNryjzekABef__G2e(GpbKO&LxIxA#{)`0K*eGAb z2l2OEb<(6@BXhInl=L?vtu2k>4F>~86)txTGcL3WXzTRy@tpZ+a`$nAeoO-ywsO*# z9LS!rnAGt7_5}+Ugc@7i@A38V5lcovA{^k0uH8A;#Mp2zL+*5#9c}^@s1mZ0zm&o<4mlX>V(jVD5-*9PArs&7K{A#}}i?S>Xo# zbiQCT$^6)oJ;V>u(Q>p?yY}siarby6hy5)%_sNhF6eeCFc0JUspzni4e%HYeaE zBSYqg8tIrH4Ls)n^Meg3%oT@*Xsho^zQ5oiDNKJUF6Cwp-ZL?-m^y7LDFz=>RM{LI z4#P?|XO_5oe9j2xy^NWkB`K^rI;8yNX^GPQ7ZTdpUdfmLJn1npzMJ{|58shV{t}HL z^CcI>xFGXofxE|jO~v>7=;|N6R`}x7pyKM|64f1!lIgmwV)cu)owQGM66I%pN+k3h z8jDg6n{z3eq5Qrt79L+Cr>GvRxbFM_@uR%)rg+NPV$t-Q!cJu^{dC&&Pst!QqfJ7i z%Y5C6VH}mQqLfNlG12BD`eO>8ALc22c}Al6#VLu}Af8`@NVc1dN-`kW-hS~Ph_ z+|bxARj(NaAVq&JKOQWsSI5f`KyBk9l6mA=&zDXu;tQQoXCnRbmYP&*o%!I-^@xL8kIIO7JD zxbh9-1ykySss+RcQS>S~6^*A#8+7{>*PW9netAYb^<1$?{bX7NT) zA5`5R^Fhe(V}7_XRcX^5k;2NOl1Y2K#FGzknwbl~^TuNY2a{SC*qrrQ3v?WY-&!J>>IAm6?rph_&>WJY}uB zVx_MxidB9v?_+(uD;W20MU!{O4PKv6!T5nCoeM*U#3o+k z+4$;z`|Y+!+v3V$TMy}csz)3kZ> z=8Uht`YNBnU`*_;)-PpBWZfgRu90{MZ{lm`iWMtDOiWCu?yA3E+FhZq|E;@P_X%@Q z#{A#i)py^07iMc~OLbRmvhK>x&aQFxzq_l?S1^B;aiaPX!inVOa9tmDz zcU3FvuKfM|TUM@IN!F5y-PP@t%A4zd#evW{4j6l&YhznAt933*jVhXOeB$!k;CWC{j0Z{ zzm7Q~^J9hXsa}s#HoiYFfByUw9KjG~spP_i3zFpIWO06e{-B|uVa3#`@AOu4zhQpO zlq!<6CF8SCs{7tqvt}i&S+iycXIgUT&>@MQo}L7=x5vQ1AoKh0zb8{Xv9~&~iMdVY z%VMH0QU&)-nKI?|x^?RY*REYF*|lqz}>4#=OtmO!*=o zL$Q+eRH*$E% zk|l*3H*OsH;)^dNd-v`Y_%pX`^Jtp%^`5@f^S*3qK zy@ccZ3duMykHpBc<>QY(4#Z;#nSInWn67srU_X_q*K{ z>MqoHqw&OlO{QNCwW8Kw!Q>M1;v#IOHyQ{f#=RU_V z3o!m6*L&yV7uBUSfSjolngX1J5Tl<^9ge#GUyEOXKZ%Y&=KK2RGPt)jeTe zR90~yI-}u6E{d}&h`E}jM(vTqJ&I_IR~*Ao%<(zYUQ))DWJg%|N=K7>$?=S2sPk~*O;(&dMMYj&Rf)lp$9U*C9da~k5t4b- zuR~qzee01*j7cay`ZfdGbGj{1f1L-lyB+-RF{aF&tgN|cn(~af>PqSwstT&=%EU8E zQCX4BB;FYeYFUzb&fziVvGm{bthRjno-cJO`nZ?tM=Gv2p=ZYcHe>on>MHY=%}|;B z(KMy$v(*&Trm4!SOjedxQlY%F6qFPhOco12fJw#2P*hM*oVDZ=&4pUqK2w=BZz?5e z>F1K!GbJ0vzjj#zXSkjDKD@_0 z$ZUUjme0ZL=7b}a!$rTN?JDfc+L^~s*_+l7vzwFW|Lsi+Wo@Q{vVv4ikNcTB{}qtN z7r!6hdaY)#^h)($31K4*NIFyWsUN5*YA%_sGH3C0^$(WLn7-(f*&nUf`gp^stGj=5 z4KzL$o&W4uYE9I!oYthj3cAww=Xa*=%kN6toy$*V@5*UUV*Qfcp7>ifFF~JMk#s&V z%z2XHyhR$)aJogz6S8pTlRe~T=Avb@FQiw;=phlE>cQg6vVe3OCDnUef{Z3FSv&W` z&AV28{^!{rf4Jvx_DEp7>#5{w&dKzKH%Bv@Vvl6;;tyx?;tpo=V*kwG#qP^!j@^fG z?9J^+-h;Lq-|xujOtOxR4upWyb`MqEEDRJDte8!O^l~q2^Tdc0Crws4^62?}gAU-` zs2eQTtsN}8N>J4dlwPYFEU!iRw>`>Of{o{BJoONxxw<`_M>azvOnN*d`~2O5T`0byj`qVW&8M z`79|UCl+gL&L~Kmj-UU4~ z5vIGI#Mu53l=kQ^PGR7QxbiUVl$xlMY4xv9WHiJc%W91K3t=6~YL5Rst0n$GUPsD) zoVBsAc4COOrA^t;*WBTv8lMsJcHWwlS>KLPnl^K$%Eh2J4;?z8)v#fx@-7+)>n76D zL%V^LPQEG#)Uxos@zaBF)7==-pTTL5j=d@j{5!59>=cG{Dx>c8-|z>t2&kbXxskA?LshGbtaEXQPr2db%suN3AkoGzubK%J#M7Si-tvnO475%1y9 z4m{JQ;TprH;p%&hLsfS%tXpWe>xV1;jw*PjW#M;Yhikam9t`OqhI9hMJRM&V{!eOc z)S1ls*fZHp@uxAIzjJsACvsX652MBphJ)S}5+ zHIdS_7jYi0UC?UNDr&H35!IVDi|UM#mI0a}PgMI)OhM3Q3tzooT*FQGdBtEzsUF%K zuK(Hi^6-mkH8B^n8{#kL@DeZPwIpB2Z%H|q-3hP$B>j{lJd=uKD9>7`u!));`yw& zF$x+uG1o)lJl(sY-JyM?(Y8(0V2Lzvl4?yU8>u@R!zC1MP!v!rhk{bvwK@6zXXDDk zE~VB)U&*eI*U4>4)WOkT;kKq;DrieT$8AqLQ^?OaUDTEJcTrd7iNdaoBRD}18-$gF z!Xy2(!YCzKC8Q{5HfKh_Ky?BP)+NJ0Z4wNk4b>#VAnqHej)#7p%w z{5AAf#DK6O3SXmOpd79274(;JpuaQ{gp|DmK?z!E1X?%@S4RLpBLIPLnisP&CsNQ0 ziSzL6fex3B5uRiFNRu7XuqL`dvuqn}JpZ~NSj)^?_h+JoC(*Wto+Z0$zs&PH7h4)~ zIi))4YIZ|{ZXPdLH@_uS7YSS|Y)ijf(4Kw~DV#6v%07$s4_xGT^J0i#T+?!&gQ1wbT zt3FOIkC$|V+nRQxs4YXUs3Y@QVS9#7AwTm961ZH_lXIb@JLjLG?kwNtfm$gA)PnLv zEvPi-aG>l`?_Cq}$;MUVZ}T^6VD3yLXMYx^|AXI3o$nkS1GPdmMYA<4Rmn z=nng!dwV>itPlFfKR6kd<$W%uDELZp<*Vyib#XWIc`3IGThnhBwP)Tg>BzoW%+Jy* z?##Mg+LfzY){}P??Gn;3t?DcC>lkgmt{=w@nL2;TOj6J(Ehx0)M1i0x2}vYUBzh{w zXrMk&7wj$+g(6W#PwDG_DWeN%bjoN@Bv@UDLrNo@q9MQxX-*mAz}d5ol{AsUorpwl ze<5^x^@{nAd&KRJx<}g{qApxe7fwjS8M8$JziP;`83|;L}t!a`YXs_Hm}$%KNiIt@vrKp&xjnjpHMXi&P4(jYLpFgr;02&z+|uR0mnz12ye z)Q9{86^YP?{CX?mF>hW$C*}r~C#Vh~R*aSuQWXF=v%h5}PNZ-bDFpOGk8hv2(_2Qu zqkFX74R!GVb@8YVI&UVHMEvad++epSMZx(*h?Ig(QU&J*QnGm?y_k7J(_yY&ku)=+%V`WLKd=` zAuNA|90EyotllzS7v^fr)|_#kEj8y4>|NzzN?B}oOMB6CZt%MgrLJqA>!QE5P4Y(A}?+P&ZSN8 z^1=oPKDrztFMI`!@sB`QlZv&HFyMfoJQ|u)r8*$DRGgq~tk*Iv%tH#3*%3)T&j+CQ znNZRli1rlC7io;?;wchhr$ zBGOkya^$Ttg!SnlY{&$^-#!BCPiSE9aFY@!x#5Pqv06rhuz%KJHpNmIMXe`TF@)uB zkioO@+6Xkxm7T1h2^1!=Ba?hXaHP+1&V$jO^-FpJP#1mzB!RkkHUt90w6dt5ag9I< zRtHI47|)2xNQy#1a~eefYl3lkXTEWHSH2PIzz8WAAq6&4xQ`T0d%UpxFA6hSa&hHv z$VCb{sEI5}7lZ^MBCN|otz_cd50!3qB@0IQ>oQNPFNKO&1pe05}ZZ*SkK?55IP8g5Yz+FM6gU30Yn!_GTLlR{4;^tfsH)R2Pq%jlJM;g*$q&^ie@c|^Q5Pj`OaQ;e; zV&Jw(86wWFhyI2X7;Z1d@nfABTTSr209WDWwBRucWq+`2CQ>kvX@O86ns`A-peBM) z6C^{zMqt1+y*%a@=Mba4L<xIvbX zA7lY}Xx!)4P!#R}&$ZWr$5vH}g8ODw2tT_H_}D=ae$?tp7FIgxxrDfWyk&rO;o@H` z=Lr-h8*q~SLQwT%6p)1A1<8;B=nFz3kzyFSpIPxnM#1_JQqT^|^gfUMf-ZJVw{sg3 z+1M)>m3HKsU^bXyJus{6DKJ3-Ca3|EYC(x%m7vH1Zzl_Tw$-&nY!gMP`@_rZvJ6 zV|=wl2IswH3}`e`9pA2!t*C^7mQoP%iZL$=VF-B$>hmElB?i*squ`N;C)hbX0OyAu z;Na*C5l?I(FEat2pW6x^o1|62O~#CH$L0EDW`kQ6&12grKpI$`9zT16(S=*UJ;E z?VaJFR{+@CJ3#T%I~Z0Kyt%m(>jM3)63(ro`iDVYKD9;&>(Zzdg>+v1HOWZf#aLZf ze2KMuf)+3%#HHsl7F0k%)@N_Pjie#4Mb(87E;w;n0HhM|T$)Dss(9bC*0 zywfPdd(nn8Xw3*2qp<%P>-dDafEh7f7bps2dLXZ)J`fJ}IaTpHUBZm_BZt2N5?oK? zBh5>1ieKoZSHITJZ%j7Ej>)u~pMM|o!Lqu$$O;))A_L1>VX0-EuRSQzPRfVP~M5UsZpQqBLM?mb4@xX_j<<-mD;lXX`{fg#O^S#EY32(># zAk35+d!Tgemt%`VZe~=!zL(#WVp7tUeILhefn&F-?kTpZ=`FFY6_i@x{9D!ams{Yg z18=zYqTfqL96Me1^qJg1>0>WX(`?I+15sx^40Y7NV0#q|v`HC^@GD>tb>Q_P5*{5~ z3vL^*Khiq~+)yV#i9?j$FYw?S*$SzJDl7fC3{ z{fj~?Hx7oo8z>5*t_Bzpw8LO$9gOg+V6d$myq-sZ+p$gHyjc3h-4mQha@aEQb?6p!s+);)U!le`p@dVm*(Xfb2WW0Ma=6Eb-x)$egD-@ulInvufiE3V3N|rR_Nu zNW%(gpdO0tkc4fWpxhQ|*wpt|pf1XsP!m_)(s*}`XyYcpP!A7v+=@D{f+4(P5H^>A zxTgU%QVrhEUm^`Hc=(+v+|u3&kp_Q4eS{^1o?Zv;TS&h!2i&)+QJScDZUl8PE|6k* z6db;wL5$w_*lnUFx+a@;cx|cKy260 zUx6&jUGRD4m8X;{=mKpDAp}hcedQ<>? zZFOL1>jn>ubf7mU5WfvQ03=g<`~$&GUk5y{9fC(!4?+z402Fx}Kv}2*ymq<;)))SS zSNDF0Vz0Z9?_~sep8CLjVgR|1ZbNfsC}vz4h+2zL3ooUaafVat#M&X#!b~ZJR8kk- z=@-T{F~-3?zcyu;`%8;M{&6m+UuOB~B$QD3U`XXdTaIOAXMqiB!LGKa#Gy`5=G-8x zaBAqUWIHwvR56GeTnPn#j`M#}P;DZy4Z;Xkoxa)}ytBX>nG-2x zpdV(-S?$K!Dx-j16RD1=|H=qy*EEsA9#4+-(cmQa^U>UA*HbH_^z$2%jfz?_?qj!P zRn=L5Iw-cU>nU}t?<;p{?5}cZ8mM+g1Ox-o!$YKS?SG*#ouYs-4|KJFotqE%T3v^} zH&)mf;qxSXTIBuM9c&$(!Nt`L931R{>xKU`k?jjm76utFy@73J11V4L!DwR^uD3N* zufY~#GtMCQC8Q%CAww>WFn=oI)SfJ&z+0kaTb_s7>9Esh}N^ z>3anwa4Wku-k^||Zd%%wV^P_`wXW_evO@%9_|A>O%7@JZHLkqD8W-L`jSC`hKyzyy zX}lINE(GkJ^~c-i8Er%eAcFp`R)&c zd+@Nl15eB@gOAAtaJDc2Hr`GoxZeUX52qYU$RM^Er1c_g7llG@w6hA@^P;2(R_g50 zrqMXbzO1DaC=e}-t&|i6DGIV&_GOZyP*9(CFfi%iIlP6Wnj~&xicxV(=Kb<^EQmw| z-Ngr;I7^nHfM0^uQ=r?)RW@o@0Cr99W(1`LvQkoA)@(zE3Y2!o|>gnsOZSI#Y*7RB&>G9XY3EqPztr42;vcfATS;h zSzvZ}Ac*VFq92mK@nhfcPIc7iC?*S$2u26{K{6}=80y2q*n`%E<$@R=SC9@YpzXMt zwxP9vsHYi?2O=D>2(y1w(1um8mim1ND{4=5Ca_6Kp!d~g!!X{XHYEp-7^CcH`f;9| zf)}g`83m?>CQ^t>^_O)`6Ye7tMqwzScbIRGS{8K_?;9?}mxSqMRma}tHl`Ytv}T!C zcNN+;^p!g{39FoC1YGget!1FjvvsK6qh+Yhy?L+>Nz}O@39pV(-Zj4nhySXMnjOXX z zfH4##7x3XzUm}7CZ|$qU6qOrz=tZjM`MBcHtLarSw@6_uZ_71D8Q5SYu;=wxJMo0o z&b$H4iGiAjErWILt%LQRZ9|QiA9W;0+*^n1pYX*kuf;HY;5z%*`;TC!brfR}B0ro9%%Nqn}3OE-Y*1*qu+7V!%&gaV(=)Rqs+rBNV9RG7N7j;zTg;q^6_zL|BH` zK_qY{wkYHZ-agzaYR)jI#2e`PzA`H$V2e_4KnXaZ1RkKdwGA~q>JT;gbd9!!;3Ira zKR%`rKz9I7SYwx55P90%{;K-SS?cdo(CjFYQ4ot!21sIL5NY&NG)4xbG)5^JNJ7{t zqwzLLM7>A?X^1hI1Pw({j>UDoW^GPGB$}f%R6!n>jmZJ%|o?z z?V={9PI1cv6uN8cP{WfJVck<+Pqj~Vdy!*W!K+)|&utIiF+Qbr;K-I`Uw*x0?t;ZL z)iq|Q(=a2bFCdX;Ec((vOVNl9sO5hqj3R^45voW?Fg1uOMu&uyDn0Aca6YOmaY)2cuLT^k8l1h7pnnWcG2?64X1nv8a3H47@12(K5fA zEy*wa{X2(YJvwHZa8{?YikSLEWMGpt=FFRHost*%9L0SD|BiS)qxuayw=VHU0ypep zXsqWy9s&1{SvcwL)wy+OOS8?+Hr zs|amOwV1;=3q*;Sl$uoS=4W_Is$Q7XCr1SO^83YK;g#~H9Mv3FJX4=cI!$pJKI;3+ z%2jWtq5Xw5e`?!!2JLz|UsV@Oif60{NWk!NX&U&EhMLAq6;(BL1^4kUFH#ZE`4u_Pfk-;avcQm! z8#;MM-jG)|c|+ruWlP^Fbd+V{u}nOc3GJo$T9hd4Y$%T&l7JR|lp^JG9{JGPv|Rch hE@4Hi!D;bS5V&EWDWl1om6vht}VwpYTNqeT3icl3;zPMvcgk_o)uXJfO31<|En*TON}c z`aPiprM@uB*%R8vawNPxj$@#^C$ERQC-7$Y z(~FP7>)sp>tyB36Oq|YLFvpjF!Ma&^{p=F!j=#A9Je2>-?Np84Dh1H(89_3}j= z0T)}?2HTeM0Q8FFh3M11npZ;Kb?CoBd%b~A!7K6XEy@8K&x3n*@FMtO7cYQuNv!5l zp*0?0H7A$0_7KOy)?>U0?oQ)$7<7hnVP6*ShgZ+@P8jasHSnR6tx@-&LX?mo~nJJz!KlcY7*r?Hq^P(a9FLwToB6?(h2knY}y(dCH)^uE!`g zGksB?B{?*1~=@1NQFd!Iri1a-GCc>x>4b+ea?3wcwN z)WgZ^r53)6muJwKpyz}{d5Y|{SIS`Z0V#$14oeOkJRx~7_oQ5a{+V(dUe1+ZSbIql zVL+jrfR1800?oH11*VnBTG;SFhUPoIO4R?X=29!GV4h2s!RBWDI|f?iEvwx4UfN-4 zr=Byrqz!r74{2r7KXr|`rUmxNhv87DwGT@3a468C$@GK`FSP Main Frame local TimeAttackFrame = TimeAttack.Frame -local function CreatePluginFrames (data) +local function CreatePluginFrames() --> catch Details! main object local _detalhes = _G._detalhes local DetailsFrameWork = _detalhes.gump local instance --> shortcut for details instance wich are holding solo plugins local GameCooltip = GameCooltip - - --> default rank table - TimeAttack.data = data or {time = 180, dps = 0, history = {}} TimeAttack.try = 1 --> OnEvent Table @@ -44,7 +41,9 @@ local function CreatePluginFrames (data) elseif (event == "PLUGIN_DISABLED") then elseif (event == "PLUGIN_ENABLED") then - + + elseif (event == "DETAILS_STARTED") then + TimeAttack:CheckTimeAttackTutorial() end end @@ -111,10 +110,10 @@ local function CreatePluginFrames (data) local TimeDesc = DetailsFrameWork:NewLabel (TimeAttackFrame, TimeAttackFrame, nil, "TimeDesc", Loc ["STRING_TIME_SELECTION"]) TimeDesc:SetPoint ("topleft", TimeAttackFrame, 15, -260) --> slider - local TimeAmount = DetailsFrameWork:NewSlider (TimeAttackFrame, nil, "DetailsTimeAttackTimeSelect", "TimeSelect", 270, 20, 30, 330, 10, TimeAttack.data.time) - --local TimeAmount = DetailsFrameWork:NewSlider2 (TimeAttackFrame, "DetailsTimeAttackTimeSelect", "TimeSelect", 270, 20, 30, 330, 10, TimeAttack.data.time) + + local TimeAmount = DetailsFrameWork:NewSlider (TimeAttackFrame, nil, "DetailsTimeAttackTimeSelect", "TimeSelect", 270, 20, 30, 330, 1, TimeAttack.db.time) TimeAmount:SetPoint ("topleft", TimeAttackFrame, 15, -270) - TimeAmount.OnChangeHook = function (_, _, value) TimeAttack.data.time = value end + TimeAmount.OnChangeHook = function (_, _, value) TimeAttack.db.time = value end --> main time/damage/dps texts local clock = DetailsFrameWork:NewLabel (TimeAttackFrame, TimeAttackFrame, nil, "TIMER", "00:00:00", "GameFontHighlightLarge") @@ -152,7 +151,7 @@ local function CreatePluginFrames (data) NowShowing = 1, --> 1 for recently 2 for saved LabelsCreated = {}, Recently = {}, - Hystory = TimeAttack.data.history + Hystory = TimeAttack.db.history } HistoryPanelObject.__index = HistoryPanelObject @@ -189,7 +188,7 @@ local function CreatePluginFrames (data) if (HistoryPanelObject.NowShowing == 1) then --> recently table.remove (HistoryPanelObject.Recently, index) else --> history - table.remove (TimeAttack.data.history, index) + table.remove (TimeAttack.db.history, index) end HistoryPanelObject:Refresh() end @@ -207,8 +206,8 @@ local function CreatePluginFrames (data) NewSave.Date = ToSaveTimeObject.Date NewSave.note = ToSaveTimeObject.note - table.insert (TimeAttack.data.history, 1, NewSave) - table.remove (TimeAttack.data.history, 25) + table.insert (TimeAttack.db.history, 1, NewSave) + table.remove (TimeAttack.db.history, 25) HistoryPanelObject:AddHistory (NewSave) ToSaveTimeObject.FinishSaved = true HistoryPanelObject:Refresh() @@ -226,8 +225,8 @@ local function CreatePluginFrames (data) NewSave.ItemLevel = TimeAttack.Time.FinishIlevel NewSave.Date = TimeAttack.Time.Date TimeAttack.Time.FinishSaved = true - table.insert (TimeAttack.data.history, 1, NewSave) - table.remove (TimeAttack.data.history, 25) + table.insert (TimeAttack.db.history, 1, NewSave) + table.remove (TimeAttack.db.history, 25) HistoryPanelObject:AddHistory (NewSave) HistoryPanelObject:Refresh() TimeAttackFrame ["SaveButton"]:Disable() @@ -275,9 +274,12 @@ local function CreatePluginFrames (data) function HistoryPanelObject:RefreshLabel (AttemptTable, AlreadySaved, First) self.table = AttemptTable + if (AlreadySaved) then --> showing historic - self.remove:SetPoint ("left", self.background.frame, "left") - self.note:SetPoint ("left", self.remove.button, "right") + + self.remove:SetPoint ("left", self.background.frame, "left", 20, 0) + self.note:SetPoint ("left", self.remove, "right") + if (AttemptTable.note) then self.note:SetNormalTexture ("Interface\\Buttons\\UI-GuildButton-PublicNote-Up") self.note.tooltip = AttemptTable.note @@ -289,9 +291,12 @@ local function CreatePluginFrames (data) local diamesano = string.gsub (AttemptTable.Date, "(.-)%s", "") self.text:SetText (diamesano) + self.rownumber:SetText ("#" .. self.index) + elseif (not AttemptTable.FinishSaved) then --> não foi salvo ainda self.remove:Show() self.save:Show() + self.remove:SetPoint ("left", self.background.frame, "left", 16, 0) self.note:SetPoint ("left", self.save.button, "right") if (AttemptTable.note) then self.note:SetNormalTexture ("Interface\\Buttons\\UI-GuildButton-PublicNote-Up") @@ -301,12 +306,16 @@ local function CreatePluginFrames (data) self.note.tooltip = Loc ["STRING_SETNOTE"] end if (First) then - self.text:SetText ("-".. TimeAttack:ToK (First-AttemptTable.FinishDamage).." (#"..AttemptTable.N..")") + self.text:SetText ("-".. TimeAttack:ToK (First-AttemptTable.FinishDamage)) else - self.text:SetText (TimeAttack:ToK (AttemptTable.FinishDamage).." (#"..AttemptTable.N..")") + self.text:SetText (TimeAttack:ToK (AttemptTable.FinishDamage)) end + self.rownumber:SetText ("#" .. AttemptTable.N) + self.rownumber:SetPoint ("left", self.background.frame) + else --> ta mostrando recentes e ja foi salvo self.remove:Show() + self.remove:SetPoint ("left", self.background.frame, "left", 16, 0) self.note:SetPoint ("left", self.remove.button, "right") if (AttemptTable.note) then self.note:SetNormalTexture ("Interface\\Buttons\\UI-GuildButton-PublicNote-Up") @@ -317,11 +326,14 @@ local function CreatePluginFrames (data) end self.save:Hide() if (First) then - self.text:SetText ("-".. TimeAttack:ToK (First-AttemptTable.FinishDamage).." (#"..AttemptTable.N..")") + self.text:SetText ("-".. TimeAttack:ToK (First-AttemptTable.FinishDamage)) else - self.text:SetText (TimeAttack:ToK (AttemptTable.FinishDamage).." (#"..AttemptTable.N..")") + self.text:SetText (TimeAttack:ToK (AttemptTable.FinishDamage)) end + self.rownumber:SetText ("#" .. AttemptTable.N) + self.rownumber:SetPoint ("left", self.background.frame) end + self.background:Show() end @@ -353,7 +365,7 @@ local function CreatePluginFrames (data) GameCooltip:Reset() - local TimeObject = TimeAttack.data.history [self.index] + local TimeObject = TimeAttack.db.history [self.index] GameCooltip:AddLine (TimeAttack:comma_value (TimeObject.DamageDone)) GameCooltip:AddIcon ("Interface\\TARGETINGFRAME\\PetBadge-Undead") @@ -387,7 +399,7 @@ local function CreatePluginFrames (data) if (HistoryPanelObject.NowShowing == 1) then --> recently HistoryPanelObject.Recently [editbox.editing].note = texto else - TimeAttack.data.history [editbox.editing].note = texto + TimeAttack.db.history [editbox.editing].note = texto end end editbox:SetText ("") @@ -427,8 +439,8 @@ local function CreatePluginFrames (data) if (HistoryPanelObject.NowShowing == 1 and HistoryPanelObject.Recently [index].note) then --> recently NoteInsertField:SetText (HistoryPanelObject.Recently [index].note) - elseif (HistoryPanelObject.NowShowing == 2 and TimeAttack.data.history [index].note) then - NoteInsertField:SetText (TimeAttack.data.history [index].note) + elseif (HistoryPanelObject.NowShowing == 2 and TimeAttack.db.history [index].note) then + NoteInsertField:SetText (TimeAttack.db.history [index].note) else NoteInsertField:SetText ("") end @@ -470,21 +482,26 @@ local function CreatePluginFrames (data) LabelText:SetPoint ("right", LabelBackground.frame, 0, 0) LabelText:SetJustifyH ("right") + local RowNumber = DetailsFrameWork:NewLabel (LabelBackground.frame, LabelBackground.frame, nil, "rownumber", "#1", "GameFontHighlightSmall") + RowNumber:SetPoint ("left", LabelBackground.frame) + RowNumber:SetJustifyH ("left") + --local LabelRemoveButton = DetailsFrameWork:NewDetailsButton (LabelBackground.frame, LabelBackground.frame, _, remove, index, index, 10, 10, "Interface\\PetBattles\\DeadPetIcon") - local LabelRemoveButton = DetailsFrameWork:NewButton (LabelBackground.frame, nil, "DetailsTimeAttackRemoveButton"..index, "RemoveButton"..index, 10, 10, remove, index, index, "Interface\\PetBattles\\DeadPetIcon") - LabelRemoveButton:SetPoint ("left", LabelBackground.frame) + local LabelRemoveButton = DetailsFrameWork:NewButton (LabelBackground.frame, nil, "DetailsTimeAttackRemoveButton"..index, "RemoveButton"..index, 12, 12, remove, index, index, "Interface\\PetBattles\\DeadPetIcon") + LabelRemoveButton:SetPoint ("left", LabelBackground.frame, "left", 16, 0) LabelRemoveButton.tooltip = Loc ["STRING_REMOVERECORD"] --local LabelSaveButton = DetailsFrameWork:NewDetailsButton (LabelBackground.frame, LabelBackground.frame, _, save, index, index, 10, 10, "Interface\\Scenarios\\ScenarioIcon-Check") - local LabelSaveButton = DetailsFrameWork:NewButton (LabelBackground.frame, nil, "DetailsTimeAttackSaveButton"..index, "SaveButton"..index, 10, 10, save, index, index, "Interface\\Scenarios\\ScenarioIcon-Check") - LabelSaveButton:SetPoint ("left", LabelRemoveButton.button, "right", 0, 0) + local LabelSaveButton = DetailsFrameWork:NewButton (LabelBackground.frame, nil, "DetailsTimeAttackSaveButton"..index, "SaveButton"..index, 12, 12, save, index, index, "Interface\\Scenarios\\ScenarioIcon-Check") + LabelSaveButton:SetPoint ("left", LabelRemoveButton.button, "right", -1, 0) LabelSaveButton.tooltip = Loc ["STRING_SAVERECORD"] --local LabelSetnoteButton = DetailsFrameWork:NewDetailsButton (LabelBackground.frame, LabelBackground.frame, _, WriteNoteStart, index, index, 10, 10, "Interface\\Buttons\\UI-GuildButton-PublicNote-Disabled") - local LabelSetnoteButton = DetailsFrameWork:NewButton (LabelBackground.frame, nil, "DetailsTimeAttackSetNoteButton"..index, "SetNoteButton"..index, 10, 10, WriteNoteStart, index, index, "Interface\\Buttons\\UI-GuildButton-PublicNote-Disabled") - LabelSetnoteButton:SetPoint ("left", LabelSaveButton.button, "right", 0, 0) + local LabelSetnoteButton = DetailsFrameWork:NewButton (LabelBackground.frame, nil, "DetailsTimeAttackSetNoteButton"..index, "SetNoteButton"..index, 12, 12, WriteNoteStart, index, index, "Interface\\Buttons\\UI-GuildButton-PublicNote-Disabled") + LabelSetnoteButton:SetPoint ("left", LabelSaveButton.button, "right", -2, 0) LabelSetnoteButton.tooltip = Loc ["STRING_SETNOTE"] + LabelBoxObject.rownumber = RowNumber LabelBoxObject.text = LabelText LabelBoxObject.background = LabelBackground LabelBoxObject.remove = LabelRemoveButton @@ -523,7 +540,7 @@ local function CreatePluginFrames (data) end elseif (self.NowShowing == 2) then - for index, AttemptTable in ipairs (TimeAttack.data.history) do + for index, AttemptTable in ipairs (TimeAttack.db.history) do local thisLabel = self.LabelsCreated [index] if (not thisLabel) then thisLabel = self:CreateNewLabel (index) @@ -531,7 +548,7 @@ local function CreatePluginFrames (data) thisLabel:RefreshLabel (AttemptTable, true) end - for amt = #TimeAttack.data.history+1, #self.LabelsCreated do + for amt = #TimeAttack.db.history+1, #self.LabelsCreated do local thisLabel = self.LabelsCreated [amt] thisLabel.background:Hide() end @@ -660,21 +677,64 @@ local function CreatePluginFrames (data) end +function TimeAttack:CheckTimeAttackTutorial() + --TimeAttack:SetTutorialCVar ("TIME_ATTACK_TUTORIAL1", nil) + if (not TimeAttack:GetTutorialCVar ("TIME_ATTACK_TUTORIAL1")) then + TimeAttackFrame:RegisterEvent ("PLAYER_TARGET_CHANGED") + end +end + +function TimeAttack:CheckTargetForTutorial() + local guid = UnitGUID ("target") + if (guid) then + local mobid = tonumber (guid:sub (6, 10), 16) + if (mobid == 31144 or mobid == 32666 or mobid == 31146 or mobid == 32667 or mobid == 67127 or mobid == 46647) then + TimeAttack:SetTutorialCVar ("TIME_ATTACK_TUTORIAL1", true) + TimeAttackFrame:UnregisterEvent ("PLAYER_TARGET_CHANGED") + TimeAttack:ShowTargetTutorial() + end + end +end + +function TimeAttack:ShowTargetTutorial() + if (TimeAttack:GetFreeInstancesAmount() > 0) then + local func = function() + local newinstance = TimeAttack:CreateInstance (true) --> force create a new one + if (newinstance) then + newinstance:SetMode (DETAILS_MODE_SOLO) + TimeAttack.SoloTables:switch (nil, "DETAILS_PLUGIN_TIME_ATTACK") + end + end + TimeAttack:GetFramework():ShowTutorialAlertFrame ("Open Time Attack", "plugin for measure dps", func) + end +end + function TimeAttack:OnEvent (_, event, ...) - if (event == "ADDON_LOADED") then + if (event == "PLAYER_TARGET_CHANGED") then + TimeAttack:CheckTargetForTutorial() + + elseif (event == "ADDON_LOADED") then local AddonName = select (1, ...) if (AddonName == "Details_TimeAttack") then if (_G._detalhes) then - - --> create widgets - CreatePluginFrames (_detalhes_databaseTimeAttack) local MINIMAL_DETAILS_VERSION_REQUIRED = 1 + local default_settings = { + time = 60, + dps = 0, + history = {}, + } + + if (_detalhes_databaseTimeAttack) then + default_settings.history = _detalhes_databaseTimeAttack.history + _detalhes_databaseTimeAttack = nil + end + --> Install - local install = _G._detalhes:InstallPlugin ("SOLO", Loc ["STRING_PLUGIN_NAME"], "Interface\\Icons\\SPELL_HOLY_BORROWEDTIME", TimeAttack, "DETAILS_PLUGIN_TIME_ATTACK", MINIMAL_DETAILS_VERSION_REQUIRED, "Details! Team", "v1.04") + local install, saveddata = _G._detalhes:InstallPlugin ("SOLO", Loc ["STRING_PLUGIN_NAME"], "Interface\\Icons\\SPELL_HOLY_BORROWEDTIME", TimeAttack, "DETAILS_PLUGIN_TIME_ATTACK", MINIMAL_DETAILS_VERSION_REQUIRED, "Details! Team", "v1.04", default_settings) if (type (install) == "table" and install.error) then print (install.errortext) return @@ -683,10 +743,10 @@ function TimeAttack:OnEvent (_, event, ...) --> Register needed events _G._detalhes:RegisterEvent (TimeAttack, "COMBAT_PLAYER_ENTER") + --> create widgets + CreatePluginFrames() + end end - - elseif (event == "PLAYER_LOGOUT") then - _detalhes_databaseTimeAttack = TimeAttack.data end end diff --git a/plugins/Details_TinyThreat/Details_TinyThreat.lua b/plugins/Details_TinyThreat/Details_TinyThreat.lua index 82ce66ad..da846672 100644 --- a/plugins/Details_TinyThreat/Details_TinyThreat.lua +++ b/plugins/Details_TinyThreat/Details_TinyThreat.lua @@ -378,14 +378,18 @@ local function CreatePluginFrames (data) thisRow:SetRightText (ThreatMeter:ToK2 (threat_actor [6]) .. " (" .. _cstr ("%.1f", pct) .. "%)") thisRow:SetValue (pct) - if (index == 2) then - thisRow:SetColor (pct*0.01, _math_abs (pct-100)*0.01, 0, 1) + if (ThreatMeter.options.useplayercolor and threat_actor [1] == player) then + thisRow:SetColor (_unpack (ThreatMeter.options.playercolor)) else - thisRow:SetColor (pct*0.01, _math_abs (pct-100)*0.01, 0, .3) - if (pct >= 50) then - thisRow:SetColor ( 1, _math_abs (pct - 100)/100, 0, 1) + if (index == 2) then + thisRow:SetColor (pct*0.01, _math_abs (pct-100)*0.01, 0, 1) else - thisRow:SetColor (pct/100, 1, 0, 1) + thisRow:SetColor (pct*0.01, _math_abs (pct-100)*0.01, 0, .3) + if (pct >= 50) then + thisRow:SetColor ( 1, _math_abs (pct - 100)/100, 0, 1) + else + thisRow:SetColor (pct/100, 1, 0, 1) + end end end @@ -412,7 +416,11 @@ local function CreatePluginFrames (data) thisRow._icon:SetTexCoord (_unpack (RoleIconCoord [role])) thisRow:SetRightText (ThreatMeter:ToK2 (threat_actor [6]) .. " (" .. _cstr ("%.1f", threat_actor [2]) .. "%)") thisRow:SetValue (threat_actor [2]) - thisRow:SetColor (threat_actor [2]*0.01, _math_abs (threat_actor [2]-100)*0.01, 0, .3) + if (ThreatMeter.options.useplayercolor) then + thisRow:SetColor (_unpack (ThreatMeter.options.playercolor)) + else + thisRow:SetColor (threat_actor [2]*0.01, _math_abs (threat_actor [2]-100)*0.01, 0, .3) + end end end end @@ -535,6 +543,23 @@ local build_options_panel = function() name = "Update Speed", usedecimals = true, }, + { + type = "toggle", + get = function() return ThreatMeter.saveddata.useplayercolor end, + set = function (self, fixedparam, value) ThreatMeter.saveddata.useplayercolor = value end, + desc = "When enabled, your bar get the following color.", + name = "Player Color Enabled" + }, + { + type = "color", + get = function() return ThreatMeter.saveddata.playercolor end, + set = function (self, r, g, b, a) + local current = ThreatMeter.saveddata.playercolor + current[1], current[2], current[3], current[4] = r, g, b, a + end, + desc = "If Player Color is enabled, your bar have this color.", + name = "Color" + }, } _detalhes.gump:BuildMenu (options_frame, menu, 15, -65, 260) @@ -598,6 +623,8 @@ function ThreatMeter:OnEvent (_, event, ...) ThreatMeter.saveddata.updatespeed = ThreatMeter.saveddata.updatespeed or 1 ThreatMeter.saveddata.animate = ThreatMeter.saveddata.animate or false ThreatMeter.saveddata.showamount = ThreatMeter.saveddata.showamount or false + ThreatMeter.saveddata.useplayercolor = ThreatMeter.saveddata.useplayercolor or false + ThreatMeter.saveddata.playercolor = ThreatMeter.saveddata.playercolor or {1, 1, 1} ThreatMeter.options = ThreatMeter.saveddata @@ -631,17 +658,12 @@ function ThreatMeter:OnEvent (_, event, ...) elseif (command == Loc ["STRING_SLASH_AMOUNT"]) then else - ThreatMeter:Msg (Loc ["STRING_COMMAND_LIST"]) print ("|cffffaeae/tinythreat " .. Loc ["STRING_SLASH_SPEED"] .. "|r: " .. Loc ["STRING_SLASH_SPEED_DESC"]) end - - end - ThreatMeter.initialized = true - end end diff --git a/startup.lua b/startup.lua index a5558bed..1680b51c 100644 --- a/startup.lua +++ b/startup.lua @@ -432,6 +432,6 @@ function _G._detalhes:Start() if (self.is_first_run) then _detalhes:OpenWelcomeWindow() end - + end