WoW Addon: PetBattle Teams: Adding Feature: Searching Team by Name
Taming the World
Looking at my Blizzard Armory profile, we can see that I have more than 500 unique battle pets. I really like to "wowkemon".. it's fun and easy than raiding the latest raid in heroic mode ;)I have some World of Warcraft addons to help me build and choosing the right pet team as needed. One them is PetBattle Teams. It is pretty, easy to use and works - this last is a nice feature while talking about wow addons...
There is one feature, a most to have in my opinion, that is missing in PetBattle Teams:
- search for a team using its name.
It is obvious, useful and really wished, but missing.. Every time before a battle, while trying to find my team for the someone daily battle pet quest I wish to have a way to found my previous built team. I have thousands of teams... After seeing that others users also is requesting this feature, I decides to implement the mostly PetBattle Teams wished/missed feature.
I'm using Hack addon to test my Lua scripts. It is an in game Lua editor, like a mini-IDE. As a Hack user, I decides to implement the PetBattle Teams search by name feature using it.
The code to find the missed feature
I'm newbie while talking about Lua and Warcraft addons programming, so my code is a little fuzzy... my excuses for sharing this kind of mess, but it is working; maybe, someone also thinks it useful.local tm = LibStub("AceAddon-3.0"):GetAddon("PetBattleTeams"):GetModule("TeamManager");
FixPetTeams = FixPetTeams or tm;
function FixPetTeams:GetPetInfoBySpeciesIDLevel(reqSpecieID, reqLevel)
local numPets, _ = C_PetJournal.GetNumPets();
for idxPet=1, numPets do
local petID, speciesID, _, _, level, _, _, name = C_PetJournal.GetPetInfoByIndex(idxPet);
if (reqSpecieID == speciesID) and (level == reqLevel) then
return petID, name;
end
end
end
function FixPetTeams:fixPetID()
local PETS_PER_TEAM = 3;
local numTeams = self:GetNumTeams()
for team=1,numTeams do
for petIndex = 1, PETS_PER_TEAM do
local petSlotInfo = self.teams[team][petIndex];
local speciesID = petSlotInfo.speciesID;
if speciesID then
local petID, name = self:GetPetInfoBySpeciesIDLevel(speciesID, 25);
if petID then
petSlotInfo.petID = petID;
petSlotInfo.name = name;
print( name );
end
end
end
end
end
-- --------------------------------------------- --
-- Adds support to search teams by name.
--
local GUI = LibStub("AceAddon-3.0"):GetAddon("PetBattleTeams"):GetModule("GUI");
FixPetTeams.GUI = GUI;
local widget = PetBattleTeamFrame;
function FixPetTeams:findTeamByName(nameFilter)
if (not nameFilter) then return end
local numTeams = self:GetNumTeams();
nameFilter = strlower( tostring(nameFilter) );
if (strlen(nameFilter) < 1) then return end
local result = {};
for idxTeam=1,numTeams do
local teamInfo = self.teams[idxTeam];
local sName = teamInfo.name;
if (sName) then
sName = strlower(sName);
local posName = strfind(sName, nameFilter, 1, true);
if (posName) then
--print( teamInfo.name );
result[idxTeam] = teamInfo;
end
end
end
return result;
end
-- To use, just call:
-- FixPetTeams.GUI:addSearchSupport()
-- Just for convenience (or lazy people like me - mwb):
--
function GUI:addSearchSupport()
local findTeamEdit = widget.findTeamEdit or CreateFrame("EditBox", "FindTeamEdit", widget, "InputBoxTemplate");
widget.findTeamEdit = findTeamEdit;
_G.findTeamEdit = findTeamEdit;
findTeamEdit:SetPoint("TOP", widget, "BOTTOM");
findTeamEdit:SetAutoFocus(false);
--findTeamEdit:SetAllPoints();
findTeamEdit:Show();
return widget;
end
local function findTeamEdit_OnTextChanged(self)
local sNameFilter = self:GetText();
local resultFound = FixPetTeams:findTeamByName(sNameFilter);
if not resultFound then
print("-----------------------------");
return;
end
for idxTeam, teamInfo in ipairs(resultFound) do
print( sNameFilter );
end
end
local function findTeamEdit_OnEnterPressed(self)
local sNameFilter = self:GetText();
print("");
print("-----------------------------");
local resultFound = FixPetTeams:findTeamByName(sNameFilter);
if not resultFound then
return;
end
local idxCurTeam = FixPetTeams:GetSelected() or 0;
local idxNewTeam = 0;
local idxFirstTeam = 0;
for idxTeam, teamInfo in pairs(resultFound) do
print( "#" .. idxTeam .. " " .. teamInfo.name );
if (idxFirstTeam < 1) then
idxFirstTeam = idxTeam;
end
if (idxTeam > idxCurTeam) then
if (idxNewTeam==0 or idxNewTeam>idxTeam) then
idxNewTeam = idxTeam;
end
end
end
if (idxNewTeam < 1) then
idxNewTeam = idxFirstTeam;
end
--GUI:ResetScrollBar();
--PetBattleTeamsScrollFrame:Hide();
FixPetTeams:SetSelected(idxNewTeam);
--PetBattleTeamsScrollFrame:Show();
do
local self = PetBattleTeamsRosterFrame;
local teamFrames = self.scrollChild.teamFrames;
local rowHeight = teamFrames[1]:GetHeight();
local totalHeight = self.scrollFrame:GetVerticalScrollRange();
local tot = totalHeight;
local pos = tot / (rowHeight+64) * (idxNewTeam-1);
if (pos<0) then
pos = 0;
elseif (pos>tot) then
pos = tot;
end
self.scrollFrame:SetVerticalScroll(pos);
end
print( "TIME: " .. idxNewTeam);
end
local FIND_EDIT_GAIN_FOCUS_ALPHA = 0.95;
local FIND_EDIT_LOST_FOCUS_ALPHA = 0.3;
GUI:addSearchSupport();
widget:Hide();
findTeamEdit:Hide();
findTeamEdit:SetFrameStrata("DIALOG");
findTeamEdit:SetAlpha(FIND_EDIT_LOST_FOCUS_ALPHA);
--findTeamEdit:ClearAllPoints();
findTeamEdit:SetAllPoints(widget.selectedTeamText);
--findTeamEdit:SetSize(60, 25);
--findTeamEdit:SetPoint("TOP", widget.selectedTeamText, "BOTTOM");
findTeamEdit:SetScript("OnTextChanged", findTeamEdit_OnTextChanged);
findTeamEdit:SetScript("OnEnterPressed", findTeamEdit_OnEnterPressed);
findTeamEdit:SetScript("OnEnter", function(self)
widget.selectedTeamText:SetAlpha(FIND_EDIT_LOST_FOCUS_ALPHA);
end);
findTeamEdit:SetScript("OnLeave", function(self)
if (strlen(self:GetText())==0) then
widget.selectedTeamText:SetAlpha(FIND_EDIT_GAIN_FOCUS_ALPHA);
end
end);
findTeamEdit:SetScript("OnEditFocusGained", function(self)
self:SetAlpha(FIND_EDIT_GAIN_FOCUS_ALPHA);
widget.selectedTeamText:SetAlpha(FIND_EDIT_LOST_FOCUS_ALPHA);
end);
findTeamEdit:SetScript("OnEditFocusLost", function(self)
self:SetAlpha(FIND_EDIT_LOST_FOCUS_ALPHA);
widget.selectedTeamText:SetAlpha(FIND_EDIT_GAIN_FOCUS_ALPHA);
end);
--findTeamEdit:SetScript("OnEscapePressed", function(self) self:SetText("" end);
findTeamEdit:Show();
widget:Show();
How it works
It adds a small, non intrusive EditBox in top of the label "Selected Team". Just move your mouse to it and you will see some fade effect. Click it, type your team name and hit ENTER. If there is any team matching its name with you typed, it will be selected. If you have more than one team matching, just hit ENTER again to select the next matched team.![]() |
| Searching teams by its name |
To install it
For you convenience, you can download this file from: fixPetBattleTeams.lua.To run it, just copy/paste it into a new Hack page and check it to run every time that UI is loaded.
Cheers,
Doggod-Azralon - A mediocre lazy warlock, but also a very lazy programmer.
Labels: development, games, it, lua, wow










0 Comments:
Post a Comment
<< Home