vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
-- Display the fish you're catching and/or have caught in a live display

FishingBuddy.WatchFrame = {};

local MAX_FISHINGWATCH_LINES = 20;
local WATCHDRAGGER_SHOW_DELAY = 0.2;

local WATCHDRAGGER_FADE_TIME = 0.15;

local DRAGFRAME_TEXTURES = {
        "Background",
        "TopLeft",
        "TopRight",
        "BottomLeft",
        "BottomRight",
        "Top",
        "Bottom",
        "Left",
        "Right"
};

local function ShowDraggerFrame()
   if ( not FishingWatchDragFrame:IsVisible() ) then
      local width = FishingWatchFrame:GetWidth();
      local height = FishingWatchFrame:GetHeight();
      FishingWatchDragFrame:SetHeight(height);
      FishingWatchDragFrame:SetWidth(width);
      FishingWatchDragFrame:Show();
      for index, value in DRAGFRAME_TEXTURES do
         UIFrameFadeIn(getglobal("FishingWatchDragFrame"..value), WATCHDRAGGER_FADE_TIME, 0, 0.25);
      end
   end
end

local function HideDraggerFrame()
   if ( FishingWatchDragFrame:IsVisible() ) then
      for index, value in DRAGFRAME_TEXTURES do
         UIFrameFadeOut(getglobal("FishingWatchDragFrame"..value), WATCHDRAGGER_FADE_TIME, 0.25, 0);
      end
      FishingWatchDragFrame:Hide();
      local qx, qy = UIParent:GetCenter();
      local wx, wy = FishingWatchDragFrame:GetCenter();
      local where = {};
      where.x = qx - wx;
      where.y = wy - qy;
      FishingBuddy.SetSetting("WatcherLocation", where);
   end
end

FishingBuddy.Commands[FishingBuddy.WATCHER] = {};
FishingBuddy.Commands[FishingBuddy.WATCHER].help = FishingBuddy.WATCHER_HELP;
FishingBuddy.Commands[FishingBuddy.WATCHER].func =
   function(what)
      if ( what and ( what == FishingBuddy.RESET ) ) then
         FishingWatchDragFrame:ClearAllPoints();
         FishingWatchDragFrame:SetPoint("CENTER", "UIParent",
                                        "CENTER", 0, 0);
         FishingWatchDragFrame:Hide();
         FishingBuddy.SetSetting("WatcherLocation", nil);
         return true;
      end
   end;

-- handle really old versions
local function UpdateUnknownZones(zone, subzone)
   if ( FishingBuddy_Info["FishingHoles"][FishingBuddy.UNKNOWN] ) then
      if ( FishingBuddy_Info["FishingHoles"][FishingBuddy.UNKNOWN][subzone] ) then
         if ( not FishingBuddy_Info["FishingHoles"][zone] ) then
            FishingBuddy_Info["FishingHoles"][zone] = { };
            tinsert(FishingBuddy.SortedZones, zone);
            table.sort(FishingBuddy.SortedZones);
         end
         if ( not FishingBuddy_Info["FishingHoles"][zone][subzone] ) then
            FishingBuddy_Info["FishingHoles"][zone][subzone] = { };
         end
         for k,v in FishingBuddy_Info["FishingHoles"][FishingBuddy.UNKNOWN][subzone] do
            FishingBuddy_Info["FishingHoles"][zone][subzone][k] = v;
         end
         FishingBuddy_Info["FishingHoles"][FishingBuddy.UNKNOWN][subzone] = nil;
      end
      FishingBuddy.Locations.DataChanged(zone, subzone);
      -- Duh, table.getn doesn't work because there aren't any integer
      -- keys in this table
      if ( next(FishingBuddy_Info["FishingHoles"][FishingBuddy.UNKNOWN]) == nil ) then
         FishingBuddy_Info["FishingHoles"][FishingBuddy.UNKNOWN] = nil;
         local pos;
         while ( pos < table.getn(FishingBuddy.SortedZones) ) do
            if ( FishingBuddy.SortedZones[pos] == FishingBuddy.UNKNOWN ) then
               break;
            end
            pos = pos + 1;
         end
         tremove(FishingBuddy.SortedZones, pos);
      end
   end
end

-- fix a bug where we were recording 'GetZoneText' instead
-- of 'GetRealZoneText'
local function UpdateRealZones(zone, subzone)
   local oldzone = GetZoneText();
   if ( FishingBuddy_Info["FishingHoles"][oldzone] and oldzone ~= zone ) then
      if ( not FishingBuddy_Info["FishingHoles"][zone] ) then
         FishingBuddy_Info["FishingHoles"][zone] = { };
      end
      for oldsubzone in FishingBuddy_Info["FishingHoles"][oldzone] do
         local sub = oldsubzone;
         if ( oldsubzone == oldzone ) then
            sub = subzone;
         end
         if ( not FishingBuddy_Info["FishingHoles"][zone][sub] ) then
            FishingBuddy_Info["FishingHoles"][zone][sub] = {};
         end
         for k,v in FishingBuddy_Info["FishingHoles"][oldzone][oldsubzone] do
            FishingBuddy_Info["FishingHoles"][zone][sub][k] = v;
         end
      end
      FishingBuddy_Info["FishingHoles"][oldzone] = nil;
   end
end

-- Fish watcher functions
FishingBuddy.WatchUpdate = function()
   if ( FishingWatchFrame:IsVisible() ) then
      FishingWatchFrame:Hide();
      for i=1, MAX_FISHINGWATCH_LINES, 1 do
         local line = getglobal("FishingWatchLine"..i);
         line:Hide();
      end
   end

   local zone, subzone = FishingBuddy.GetZoneInfo();

   UpdateUnknownZones(zone, subzone);
   UpdateRealZones(zone, subzone);

   local fz = FishingBuddy_Info["FishingHoles"][zone];
   if ( FishingBuddy.GetSetting("WatchFishies") == 0 or
        not fz or not fz[subzone] ) then
      return;
   end

   if ( FishingBuddy.GetSetting("WatchOnlyWhenFishing") == 1 and
       not FishingBuddy.IsFishingPole() ) then
      return;
   end

   local current = FishingBuddy.currentFishies;
   local ff = FishingBuddy_Info["Fishies"];
   local fishsort = {};
   local totalCount = 0;
   local totalCurrent = 0;
   local gotDiffs = false;
   for fishid in fz[subzone] do
      local info = {};
      info.text = ff[fishid].name;
      info.count = fz[subzone][fishid];
      totalCount = totalCount + info.count;
      if ( current[subzone] ) then
         info.current = current[subzone][fishid] or 0;
      else
         info.current = 0;
      end
      if ( info.current > 0 and info.current ~= info.count ) then
         gotDiffs = true;
      end
      totalCurrent = totalCurrent + info.current;
      tinsert(fishsort, info);
   end

   if ( totalCount == 0 ) then
      return;
   end

   FishingBuddy.FishSort(fishsort);

   local fishingWatchMaxWidth = 0;
   local tempWidth;
   local index = 1;
   local start = 1;
   local dopercent = FishingBuddy.GetSetting("WatchFishPercent");

   if ( FishingBuddy.GetSetting("WatchCurrentZone") == 1 ) then
      local entry = getglobal("FishingWatchLine"..index);
      local line = zone.." : "..subzone;
      entry:SetText(line);
      local tempWidth = entry:GetWidth();
      if ( tempWidth > fishingWatchMaxWidth ) then
         fishingWatchMaxWidth = tempWidth;
      end
      entry:Show();
      index = index + 1;
   end
   if ( FishingBuddy.GetSetting("WatchCurrentSkill") == 1 ) then
      local entry = getglobal("FishingWatchLine"..index);
      local skill, mods = FishingBuddy.GetCurrentSkill();
      local line = "Skill: |cff00ff00"..skill.."+"..mods.."|r";
      if ( StartedFishing ) then
         local elapsed = GetTime() - StartedFishing;
         local t = math.floor(elapsed);
         local seconds = math.mod(t, 60);
         t = math.floor(t / 60);
         local minutes = math.mod(t, 60);
         local hours = math.floor(t / 60);
         line = line.."  Elapsed: ";
         if ( hours < 10 ) then
            line = line.."0";
         end
         line = line..hours..":";
         if ( minutes < 10 ) then
            line = line.."0";
         end
         line = line..minutes..":";
         if ( seconds < 10 ) then
            line = line.."0";
         end
         line = line..seconds;
      end

      entry:SetText(line);
      local tempWidth = entry:GetWidth();
      if ( tempWidth > fishingWatchMaxWidth ) then
         fishingWatchMaxWidth = tempWidth;
      end
      entry:Show();
      index = index + 1;
   end
   
   for j=1,table.getn(fishsort),1 do
      local info = fishsort[j];
      if( index <= MAX_FISHINGWATCH_LINES ) then
         local entry = getglobal("FishingWatchLine"..index);
         local fishie = info.text;
         local amount = info.count;
         local s,e = string.find(fishie, FishingBuddy.RAW.." ");
         if ( s ) then
            if ( s > 1 ) then
               fishie = string.sub(fishie, 1, s-1)..string.sub(fishie, e+1);
            else
               fishie = string.sub(fishie, e+1);
            end
         else
            s,e = string.find(fishie, " "..FishingBuddy.RAW);
            if ( s ) then
               fishie = string.sub(fishie, 1, s-1)..string.sub(fishie, e+1);
            end
         end
         local fishietext = fishie.." ("..amount;
         if ( dopercent == 1 ) then
            local percent = format("%.1f", ( amount / totalCount ) * 100);
            fishietext = fishietext.." : "..percent.."%";
         end
         if ( gotDiffs ) then
            amount = info.current;
            local color;
            fishietext = fishietext..", |c"..FishingBuddy.Colors.GREEN..amount;
            if ( dopercent == 1 ) then
               local percent = format("%.1f", ( amount / totalCurrent ) * 100);
               fishietext = fishietext.." : "..percent.."%";
            end
            fishietext = fishietext.."|r";
         end
         fishietext = fishietext..")";
         entry:SetText(fishietext);
         tempWidth = entry:GetWidth();
         entry:Show();
         if ( tempWidth > fishingWatchMaxWidth ) then
            fishingWatchMaxWidth = tempWidth;
         end
      end
      index = index + 1;
   end

   FishingWatchFrame:SetHeight(index * 13);
   FishingWatchFrame:SetWidth(fishingWatchMaxWidth + 10);
   FishingWatchFrame:Show();
end

FishingBuddy.WatchFrame.OnLoad = function()
   local where = FishingBuddy.GetSetting("WatcherLocation");
   if ( not where ) then
      where = {};
      where.x = 0;
      where.y = 0;
   end
   FishingWatchDragFrame:ClearAllPoints();
   FishingWatchDragFrame:SetPoint("CENTER", "UIParent", "CENTER",
                                  where.x, where.y);
   FishingWatchDragFrame:Hide();

   this:ClearAllPoints();
   this:SetPoint("TOPRIGHT", "FishingWatchDragFrame", "TOPRIGHT", 0, 0);
end

local hover;
FishingBuddy.WatchFrame.OnUpdate = function(elapsed)
   if ( FishingWatchFrame:IsVisible() ) then
      if ( MouseIsOver(FishingWatchFrame) ) then
         local xPos, yPos = GetCursorPosition();
         if ( hover ) then
            if ( hover.xPos == xPos and hover.yPos == yPos ) then
               hover.hoverTime = hover.hoverTime + elapsed;
            else
               hover.hoverTime = 0;
               hover.xPos = xPos;
               hover.yPos = yPos;
            end
         else
            hover = {};
            hover.hoverTime = 0;
            hover.xPos = xPos;
            hover.yPos = yPos;
         end
         if ( hover.hoverTime > WATCHDRAGGER_SHOW_DELAY ) then
            ShowDraggerFrame();
         end
      else
         HideDraggerFrame();
         hover = nil;
      end
   elseif ( hover ) then
      HideDraggerFrame();
      hover = nil;
   end
end