You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

912 lines
32 KiB

local WIT, core = ...
local AceGUI = LibStub("AceGUI-3.0")
local ITEM_LINK_REGEX = "(.+)"
local ITEM_ID_REGEX = "(.+)Hitem:([0-9]+):(.+)"
local LOOT_ITEM_SELF_REGEX = LOOT_ITEM_SELF:gsub("%%s", ITEM_LINK_REGEX)
local LOOT_ITEM_SELF_MULTIPLE_REGEX = LOOT_ITEM_SELF_MULTIPLE:gsub("%%s", ITEM_LINK_REGEX):gsub("%%d", "(%%d+)")
local LOOT_ITEM_SELF_ITEMID_REGEX = LOOT_ITEM_SELF:gsub("%%s", ITEM_ID_REGEX)
local LOOT_ITEM_SELF_ITEMID_MULTIPLE_REGEX = LOOT_ITEM_SELF_MULTIPLE:gsub("%%s", ITEM_ID_REGEX):gsub("%%d", "(%%d+)")
local LOOT_ITEM_REGEX = LOOT_ITEM:gsub("%%s", ITEM_LINK_REGEX)
local LOOT_ITEM_MULTIPLE_REGEX = LOOT_ITEM_MULTIPLE:gsub("%%s", ITEM_LINK_REGEX):gsub("%%d", "(%%d+)")
local LOOT_ITEM_ITEMID_REGEX = LOOT_ITEM:gsub("%%s", ITEM_LINK_REGEX, 1):gsub("%%s", ITEM_ID_REGEX)
local LOOT_ITEM_ITEMID_MULTIPLE_REGEX = LOOT_ITEM_MULTIPLE:gsub("%%s", ITEM_LINK_REGEX, 1):gsub("%%s", ITEM_ID_REGEX):gsub("%%d", "(%%d+)")
local BPET_ID_REGEX = "Hbattlepet:(%d+):"
local GOLD_AMOUNT_REGEX = GOLD_AMOUNT:gsub("%%d", "(%%d+)")
local SILVER_AMOUNT_REGEX = SILVER_AMOUNT:gsub("%%d", "(%%d+)")
local COPPER_AMOUNT_REGEX = COPPER_AMOUNT:gsub("%%d", "(%%d+)")
local self = nil
local UpdateUI = nil
function core.NewCustomFarmId()
return "C" .. string.format("%06d", math.random(1, 999999)) .. time()
end
local function NewSession()
return {
Id = core.NewCustomFarmId(),
StartTime = nil,
Time = 0,
CurrentTime = nil,
IsRunning = false,
IsPaused = false,
NameMapId = core.LocationHelper.GetPlayerCurrentMapId(),
Mode = "location",
MapId = core.LocationHelper.GetPlayerCurrentMapId(),
Money = 0,
IsCustom = true,
Results = {}
}
end
local function GetCurrentDuration()
local seconds = self.Session.Time
if self.Session.IsRunning then
seconds = seconds + time() - self.Session.StartTime
end
return seconds
end
local function ResumeSession()
if not self.Session.IsRunning then
self.Session.IsRunning = true
self.Session.IsPaused = false
self.Session.StartTime = time()
self.Session.CurrentTime = self.Session.StartTime
end
UpdateUI()
end
local function PauseSession()
if self.Session.IsRunning then
self.Session.IsRunning = false
self.Session.IsPaused = true
self.Session.Time = self.Session.Time + time() - self.Session.StartTime
self.Session.StartTime = nil
end
UpdateUI()
end
local function StopSession()
self.Session.IsPaused = false
if self.Session.IsRunning then
self.Session.IsRunning = false
self.Session.Time = self.Session.Time + time() - self.Session.StartTime
self.Session.StartTime = nil
end
UpdateUI()
end
UpdateUI = function()
local seconds = GetCurrentDuration()
local isFarmEnded = false
if self.Session.IsRunning and self.Session.Timer and self.Session.Timer <= seconds then
StopSession()
PlaySound(15757, "master")
return
end
if self.Session.Timer then
seconds = self.Session.Timer - seconds
if seconds <= 0 then
isFarmEnded = true
seconds = GetCurrentDuration()
end
end
local hours = math.floor(seconds / 60 / 60)
seconds = seconds - hours * 60 * 60
local minutes = math.floor(seconds / 60)
seconds = seconds - minutes * 60
local timeResource = isFarmEnded and "FarmEndedFormat" or self.Session.Timer and "TimeLeftFormat" or "TimeLabelFormat"
self.UI.TimeLabel:SetText(string.format(core.GetString(timeResource), hours, minutes, seconds))
self.UI.TimeLabel:SetWidth(self.UI.TimeLabel.label:GetStringWidth() + 5)
self.UI.ButtonsPanel:DoLayout()
local location = ""
if self.Session.MapId then
location = core.LocationHelper.GetMapName(self.Session.MapId)
end
local name = self.Session.Mode == "location" and core.LocationHelper.GetMapName(self.Session.NameMapId)
or self.Session.Mode == "item" and (self.Session.ItemLink or core.TSMHelper.GetItemLink(self.Session.ItemId))
or self.Session.Name
self.UI.TitleLabel:SetText(string.format(core.GetString("NameLabelFormat"), name))
self.UI.LocationLabel:SetText(string.format(core.GetString("LocationLabelFormat"), location))
self.UI.MoneyLabel:SetText(string.format(core.GetString("RawGoldLabelFormat"), core.TSMHelper.ToMoneyString(self.Session.Money)))
local itemValue = 0
for _, item in pairs(self.Session.Results) do
local unitPrice = core.TSMHelper.GetItemPrice(item.Id == core.TSMHelper.PetCageItemId and 'p:'.. item.PetId or item.Id) or 0
itemValue = itemValue + unitPrice * item.Quantity
end
self.UI.ItemValueLabel:SetText(string.format(core.GetString("ItemsValueLabelFormat"), core.TSMHelper.ToMoneyString(itemValue)))
self.UI.TotalValueLabel:SetText(string.format(core.GetString(self.Mode == "Compact" and "TotalValueLabelFormatCompact" or "TotalValueLabelFormat"), core.TSMHelper.ToMoneyString(itemValue + self.Session.Money)))
self.UI.IsGroupFarmCheckBox:SetValue(self.Session.IsGroupFarm or false)
self.UI.IsGroupFarmCheckBox:SetLabel(string.format(core.GetString(self.Session.IsGroupFarm and "TrackGroupLootPlayers" or "TrackGroupLoot"), self.Session.NumberOfPlayers or 1))
local route = self.Session.RouteZone ~= nil and {
Name = self.Session.RouteName,
Data = self.Session.RouteData,
Zone = { Id = self.Session.RouteZone, Name = C_Map.GetMapInfo(self.Session.RouteZone).name }
} or nil
self.UI.RoutePicker:SetValue(route)
self.UI.PlayButton:Toggle(not self.Session.IsRunning and not isFarmEnded)
self.UI.PauseButton:Toggle(self.Session.IsRunning)
self.UI.StopButton:Toggle(self.Session.IsRunning or self.Session.IsPaused)
self.LastUpdated = time()
end
local function ResetSession()
self.Session = NewSession()
core.Config.SetCurrentRecorderSession(self.Session)
if self.UI.LootGrid then
self.UI.LootGrid.Show(self.Session.Results)
end
UpdateUI()
end
local function NormaliseSession(session, createCopy)
session = createCopy and core.TableHelper.DeepCopy(session) or session
session.Mode = session.Mode or session.ItemId and "item" or session.NameMapId and "location" or "text"
if session.Mode == "location" then
session.Name = nil
session.ItemId = nil
elseif session.Mode == "item" then
session.Name = nil
session.NameMapId = nil
else
session.ItemId = nil
session.NameMapId = nil
session.Name = session.Name or ""
end
if session.Routes and #session.Routes == 1 then
session.RouteZone = session.Routes[1].RouteZone
session.RouteKey = session.Routes[1].RouteKey
session.RouteName = session.Routes[1].RouteName
session.RouteData = session.Routes[1].RouteData
session.Routes = nil
end
return session
end
local function SetCurrentLocation()
self.Session.MapId = core.LocationHelper.GetPlayerCurrentMapId()
UpdateUI()
end
local function SetNameAsCurrentLocation()
self.Session.NameMapId = core.LocationHelper.GetPlayerCurrentMapId()
self.Session.ItemId = nil
self.Session.PetId = nil
self.Session.ItemLink = nil
self.Session.Name = nil
self.Session.Mode = "location"
UpdateUI()
end
local function SetFarmName()
local type, id, itemLink = GetCursorInfo()
if type == 'item' then
if id == core.TSMHelper.PetCageItemId then
self.Session.PetId = tonumber(itemLink:match(BPET_ID_REGEX))
self.Session.ItemLink = itemLink
else
self.Session.PetId = nil
self.Session.ItemLink = nil
end
self.Session.ItemId = id
self.Session.Name = nil
self.Session.NameMapId = nil
self.Session.Mode = "item"
UpdateUI()
else
if IsShiftKeyDown() and self.Session.Mode == "item" and self.Session.ItemId then
ChatEdit_InsertLink(self.Session.ItemLink or core.TSMHelper.GetItemLink(self.Session.ItemId))
return
end
local onAccept = function(dialog)
local name = dialog.editBox:GetText()
if strlen(name) > 0 then
self.Session.Name = name
self.Session.ItemId = nil
self.Session.PetId = nil
self.Session.ItemLink = nil
self.Session.NameMapId = nil
self.Session.Mode = "text"
UpdateUI()
end
end
core.UI.ShowDialog({
Text = core.GetString("SetFarmNameMessage"),
Button1 = core.GetString("Set"),
Button2 = core.GetString("Cancel"),
Button3 = core.GetString("UseLocation"),
HasEditBox = true,
TextBoxValue = self.Session.Name or "",
OnAccept = onAccept,
OnAlt = SetNameAsCurrentLocation
})
end
end
local function SetRawGold()
core.UI.InputDialog({ Text = core.GetString("ChangeRawGoldMessage"), HasEditBox = true, IsNumeric = true, TextBoxValue = tostring(self.Session.Money), OnAccept = function(dialog)
local value = tonumber(dialog.editBox:GetText())
if value ~= nil then
self.Session.Money = value
UpdateUI()
end
end })
end
local function SetTime()
if self.Session.IsRunning then
print(core.GetString("RecordingInProgress"))
return
end
local currentTime = math.ceil(GetCurrentDuration() / 60)
core.UI.InputDialog({ Text = core.GetString("SetTimeMessage"), HasEditBox = true, IsNumeric = true, TextBoxValue = tostring(currentTime), OnAccept = function(dialog)
local value = tonumber(dialog.editBox:GetText())
if value ~= nil then
self.Session.Time = value * 60
UpdateUI()
end
end })
end
local function SetTimer()
if self.Session.IsRunning then
print(core.GetString("RecordingInProgress"))
return
end
local currentTimer = self.Session.Timer and math.ceil(self.Session.Timer / 60) or 60
local onAccept = function(dialog)
local value = tonumber(dialog.editBox:GetText())
if value ~= nil and value ~= 0 then
self.Session.Timer = value * 60
UpdateUI()
end
end
local onAlt = function(dialog)
self.Session.Timer = nil
UpdateUI()
end
core.UI.InputDialog({
Text = core.GetString("SetTimerMessage"),
Button3 = core.GetString("ClearTimer"),
HasEditBox = true,
IsNumeric = true,
TextBoxValue = tostring(currentTimer),
OnAccept = onAccept,
OnAlt = onAlt
})
end
function SortJunk(row)
for _, item in pairs(core.TableHelper.ShallowCopy(self.Session.Results)) do
if not item.PetId and core.ScrapHelper.IsJunk(item.Id) then
local itemSellPrice = nil
if item.ItemLink then
_, _, _, _, _, _, _, _, _, _, itemSellPrice = GetItemInfo(item.ItemLink)
end
itemSellPrice = itemSellPrice or core.TSMHelper.GetItemVendorSellPrice(item.Id)
self.Session.Money = self.Session.Money + (itemSellPrice or 0) * (item.Quantity or 0)
core.TableHelper.RemoveValue(self.Session.Results, item)
end
end
self.UI.LootGrid.ClearCache()
self.UI.LootGrid.Reload()
UpdateUI()
end
local function SetIsGroupFarm(isGroup)
if isGroup then
self.UI.IsGroupFarmCheckBox:SetValue(false)
core.UI.InputDialog({ Text = core.GetString("SetNumberOfPlayers"), HasEditBox = true, IsNumeric = true, TextBoxValue = self.Session.NumberOfPlayers or "5", OnAccept = function(dialog)
local value = tonumber(dialog.editBox:GetText())
if value ~= nil and value > 0 and value <= 50 then
self.Session.NumberOfPlayers = value
self.Session.IsGroupFarm = true
UpdateUI()
end
end })
else
self.Session.IsGroupFarm = false
end
UpdateUI()
end
local function SetupRoute(session)
if session.RouteZone and session.RouteKey and session.RouteName and session.RouteData then
local route = {
RouteZone = session.RouteZone,
RouteKey = session.RouteKey,
RouteName = session.RouteName,
RouteData = session.RouteData
}
session.Routes = { route }
session.RouteZone = nil
session.RouteKey = nil
session.RouteName = nil
session.RouteData = nil
end
end
local function Save()
local farms = core.Config.GetUserFarms()
local data = NormaliseSession(self.Session, true)
SetupRoute(data)
for i, farm in pairs(farms) do
if farm.Id == data.Id then
tremove(farms, i)
end
end
table.insert(farms, data)
core.UserDataModule.ClearCache()
core.DashboardModule.ClearCache()
if core.UI.MainWindow.CurrentModule() == core.UserDataModule then
core.UI.MainWindow.ShowModule(core.UserDataModule)
elseif core.UI.MainWindow.CurrentModule() == core.DashboardModule then
core.UI.MainWindow.ShowModule(core.DashboardModule)
end
end
local function OnRouteChanged(s, event, route)
self.Session.RouteZone = route and route.Zone.Id or nil
self.Session.RouteKey = route and route.Name:gsub("%s", "\255") or nil
self.Session.RouteName = route and route.Name or nil
self.Session.RouteData = route and route.Data or nil
end
local function ClearRoute()
self.Session.RouteZone = nil
self.Session.RouteKey = nil
self.Session.RouteName = nil
self.Session.RouteData = nil
self.ImportedRouteLabel:SetText(GetRouteName())
end
local function ProcessItem(itemId, quantity, itemLink, itemRarity, bindType, itemSellPrice)
local addItem = (bindType ~= 1 or core.TSMHelper.HasCustomPrice(itemId)) and not core.ScrapHelper.IsJunk(itemId) and itemRarity >= core.Config.GetRecorderMinQuality() and (core.TSMHelper.GetItemPrice(itemId) or -1) >= core.Config.GetRecorderMinPrice()
if addItem then
local item
for _, i in pairs(self.Session.Results) do
if i.Id == itemId then
item = i
end
end
if item then
item.Quantity = item.Quantity + quantity
else
table.insert(self.Session.Results, { Id = itemId, Quantity = quantity, ItemLink = itemLink })
end
else
self.Session.Money = self.Session.Money + (itemSellPrice or 0) * quantity
end
self.UI.LootGrid.ClearCache()
self.UI.LootGrid.Reload()
UpdateUI()
end
local function OnEvent(_, event, arg)
if self.Session.IsPaused and (event == "CHAT_MSG_MONEY" or (event == "CHAT_MSG_LOOT" and arg:match(LOOT_ITEM_SELF_REGEX))) then
ResumeSession()
end
if not self.Session.IsRunning then return end
if event == "CHAT_MSG_LOOT" then
local itemId, quantity, itemLink
_, itemId, _, quantity = arg:match(LOOT_ITEM_SELF_ITEMID_MULTIPLE_REGEX)
itemLink = arg:match(LOOT_ITEM_SELF_MULTIPLE_REGEX)
if not itemId then
_, itemId = arg:match(LOOT_ITEM_SELF_ITEMID_REGEX)
itemLink, sss = arg:match(LOOT_ITEM_SELF_REGEX)
quantity = 1
end
if not itemId and self.Session.IsGroupFarm then
_, _, itemId, _, quantity = arg:match(LOOT_ITEM_ITEMID_MULTIPLE_REGEX)
_, itemLink = arg:match(LOOT_ITEM_MULTIPLE_REGEX)
if not itemId then
_, _, itemId = arg:match(LOOT_ITEM_ITEMID_REGEX)
_, itemLink, sss = arg:match(LOOT_ITEM_REGEX)
quantity = 1
end
end
if itemId then
itemId = tonumber(itemId)
if type(quantity) == "string" then quantity = tonumber(quantity) end
local itemName, _, itemRarity, _, _, _, _, _, _, _, itemSellPrice, _, _, bindType = GetItemInfo(itemLink)
if itemName ~= nil then
ProcessItem(itemId, quantity, itemLink, itemRarity, bindType, itemSellPrice)
else
local queuedItem = {}
for i, item in pairs(self.ItemQueue) do
if item.Id == itemId then
queuedItem = tremove(farms, i)
end
end
queuedItem.Id = itemId
queuedItem.Quantity = (queuedItem.Quantity or 0) + quantity
queuedItem.ItemLink = itemLink
table.insert(self.ItemQueue, queuedItem)
end
end
UpdateUI()
elseif event == "GET_ITEM_INFO_RECEIVED" then
for i, item in pairs(self.ItemQueue) do
if item.Id == arg then
local itemName, _, itemRarity, _, _, _, _, _, _, _, itemSellPrice, _, _, bindType = GetItemInfo(item.ItemLink)
if itemName ~= nil then
ProcessItem(item.Id, item.Quantity, item.ItemLink, itemRarity, bindType, itemSellPrice)
tremove(self.ItemQueue, i)
end
end
end
elseif event == "CHAT_MSG_MONEY" then
local gold = arg:match(GOLD_AMOUNT_REGEX)
local silver = arg:match(SILVER_AMOUNT_REGEX)
local copper = arg:match(COPPER_AMOUNT_REGEX)
local sum = ((gold or 0)*100 + (silver or 0))*100 + (copper or 0)
self.Session.Money = self.Session.Money + sum
UpdateUI()
end
end
local function LoadSession(session)
self.Session = NormaliseSession(session, true)
core.Config.SetCurrentRecorderSession(self.Session)
self.UI.LootGrid.Show(self.Session.Results)
UpdateUI()
end
local function OnUpdate()
if self.Session.IsRunning and self.LastUpdated ~= time() then
UpdateUI()
end
end
local function AddItem()
local type, id, itemLink = GetCursorInfo()
if type == 'item' then
local item
local petId = (id == core.TSMHelper.PetCageItemId and tonumber(itemLink:match(BPET_ID_REGEX))) or nil
for _, i in pairs(self.Session.Results) do
if i.Id == id and i.PetId == petId then
item = i
end
end
if item then
item.Quantity = item.Quantity + 1
else
item = { Id = id, Quantity = 1, ItemLink = itemLink }
if petId then
item.PetId = petId
end
table.insert(self.Session.Results, item)
end
self.UI.LootGrid.ClearCache()
self.UI.LootGrid.Reload()
end
end
local function SetMode(mode)
self.Mode = mode
WITDB.Settings.Recorder.Mode = mode
self.UI.CompactModeButton:Enable()
self.UI.DetailsModeButton:Enable()
self.UI.EditModeButton:Enable()
if mode == "Compact" then
self.UI.CompactModeButton:Disable()
self.UI.Frame:SetWidth(155)
self.UI.Frame:SetHeight(130)
elseif mode == "Details" then
self.UI.DetailsModeButton:Disable()
self.UI.Frame:SetWidth(285)
self.UI.Frame:SetHeight(155)
elseif mode == "Edit" then
self.UI.EditModeButton:Disable()
self.UI.Frame:SetWidth(420)
self.UI.Frame:SetHeight(536)
end
if WITDB.Settings.Recorder.Top then
self.UI.Frame:ClearAllPoints()
self.UI.Frame:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", WITDB.Settings.Recorder.Left, WITDB.Settings.Recorder.Top)
end
wipe(self.UI.Frame.children)
wipe(self.UI.Hidden.children)
local compactTarget = self.UI.Frame
local detailsTarget = mode == "Compact" and self.UI.Hidden or self.UI.Frame
local editTarget = mode == "Edit" and self.UI.Frame or self.UI.Hidden
compactTarget:AddChild(self.UI.ButtonsPanel)
detailsTarget:AddChild(self.UI.TitleLabel)
detailsTarget:AddChild(self.UI.LocationLabel)
editTarget:AddChild(self.UI.RoutePicker)
detailsTarget:AddChild(self.UI.MoneyLabel)
detailsTarget:AddChild(self.UI.ItemValueLabel)
compactTarget:AddChild(self.UI.TotalValueLabel)
editTarget:AddChild(self.UI.IsGroupFarmCheckBox)
editTarget:AddChild(self.UI.AddItemIcon)
editTarget:AddChild(self.UI.LootFrame)
self.UI.LootFrame:DoLayout()
editTarget:AddChild(self.UI.SortJunkButton)
compactTarget:AddChild(self.UI.ResetInstancesButton)
UpdateUI()
end
local function SetFrameTooltip(frame, text)
frame:SetScript("OnEnter", function()
GameTooltip:SetOwner(frame, "ANCHOR_PRESERVE")
GameTooltip:ClearAllPoints()
GameTooltip:SetPoint("TOP", frame, "BOTTOM")
GameTooltip:ClearLines()
GameTooltip:AddLine(text)
GameTooltip:Show()
end)
frame:SetScript("OnLeave", function()
GameTooltip:Hide()
end)
end
local function lootContextMenu(module, row)
return {
{
Name = "SetQuantity",
DisplayName = core.GetString("SetQuantity"),
Action = function(row)
core.UI.InputDialog({ Text = core.GetString("SetQuantityMessage"), HasEditBox = true, IsNumeric = true, Data = row.Data, TextBoxValue = tostring(row.Data.Quantity), OnAccept = function(dialog, data)
local value = tonumber(dialog.editBox:GetText())
if value ~= nil and value > 0 then
data.Quantity = value
self.UI.LootGrid.ClearCache()
self.UI.LootGrid.Reload()
UpdateUI()
end
end })
end,
ActionArg = row,
},
{
Name = "Vendor",
DisplayName = core.GetString("Vendor"),
Action = function(row)
local itemSellPrice = nil
if row.Data.ItemLink then
_, _, _, _, _, _, _, _, _, _, itemSellPrice = GetItemInfo(row.Data.ItemLink)
end
itemSellPrice = itemSellPrice or core.TSMHelper.GetItemVendorSellPrice(row.Data.Id)
self.Session.Money = self.Session.Money + (itemSellPrice or 0) * (row.Data.Quantity or 0)
core.TableHelper.RemoveValue(self.Session.Results, row.Data)
self.UI.LootGrid.ClearCache()
self.UI.LootGrid.Reload()
UpdateUI()
end,
ActionArg = row,
},
{
Name = "Remove",
DisplayName = core.GetString("Remove"),
Action = function(row)
core.TableHelper.RemoveValue(self.Session.Results, row.Data)
self.UI.LootGrid.ClearCache()
self.UI.LootGrid.Reload()
UpdateUI()
end,
ActionArg = row,
},
}
end
local function timerMenu()
return {
Children =
{
{
Name = "Change",
DisplayName = core.GetString("Change"),
Action = SetTime
},
{
Name = "SetTimer",
DisplayName = core.GetString("SetTimer"),
Action = SetTimer
},
}
}
end
local function Init()
self.UI = {}
self.UI.Frame = AceGUI:Create("Window")
self.UI.Frame:SetTitle(core.GetString("Recorder"))
self.UI.Frame.titletext:SetJustifyH("LEFT")
self.UI.Frame:EnableResize(false)
if WITDB.Settings.Recorder.Top then
self.UI.Frame:ClearAllPoints()
self.UI.Frame:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", WITDB.Settings.Recorder.Left, WITDB.Settings.Recorder.Top)
end
self.UI.Frame.title:HookScript("OnMouseUp", function()
WITDB.Settings.Recorder.Top = self.UI.Frame.frame:GetTop()
WITDB.Settings.Recorder.Left = self.UI.Frame.frame:GetLeft()
end)
self.UI.EditModeButton = CreateFrame("Button", nil, self.UI.Frame.frame, "UIPanelButtonTemplate")
self.UI.EditModeButton:SetPoint("TOPRIGHT", self.UI.Frame.closebutton, "TOPLEFT", 4, -4)
self.UI.EditModeButton:SetWidth(24)
self.UI.EditModeButton:SetNormalTexture("Interface\\AddOns\\WIT\\Images\\Icons\\mode_edit")
self.UI.EditModeButton:SetScript("OnClick", function() SetMode("Edit") end)
SetFrameTooltip(self.UI.EditModeButton, core.GetString("EditMode"))
self.UI.DetailsModeButton = CreateFrame("Button", nil, self.UI.Frame.frame, "UIPanelButtonTemplate")
self.UI.DetailsModeButton:SetPoint("TOPRIGHT", self.UI.EditModeButton, "TOPLEFT")
self.UI.DetailsModeButton:SetWidth(24)
self.UI.DetailsModeButton:SetNormalTexture("Interface\\AddOns\\WIT\\Images\\Icons\\mode_details")
self.UI.DetailsModeButton:SetScript("OnClick", function() SetMode("Details") end)
SetFrameTooltip(self.UI.DetailsModeButton, core.GetString("StandardMode"))
self.UI.CompactModeButton = CreateFrame("Button", nil, self.UI.Frame.frame, "UIPanelButtonTemplate")
self.UI.CompactModeButton:SetPoint("TOPRIGHT", self.UI.DetailsModeButton, "TOPLEFT")
self.UI.CompactModeButton:SetWidth(24)
self.UI.CompactModeButton:SetNormalTexture("Interface\\AddOns\\WIT\\Images\\Icons\\mode_compact")
self.UI.CompactModeButton:SetScript("OnClick", function() SetMode("Compact") end)
SetFrameTooltip(self.UI.CompactModeButton, core.GetString("CompactMode"))
self.UI.Frame.title:SetPoint("BOTTOMRIGHT", self.UI.CompactModeButton, "BOTTOMLEFT")
self.UI.NewButton = core.UI.ActionIcon({ Icon = "Interface\\AddOns\\WIT\\Images\\Icons\\new" })
self.UI.NewButton:OnClick(function()
core.UI.ConfirmableDialog({ Text = core.GetString("NewSessionConfirmationMessage"), OnAccept = function()
ResetSession()
end })
end)
self.UI.SaveButton = core.UI.ActionIcon({ Icon = "Interface\\AddOns\\WIT\\Images\\Icons\\save" })
self.UI.SaveButton:OnClick(Save)
self.UI.PlayButton = core.UI.ActionIcon({ Icon = "Interface\\AddOns\\WIT\\Images\\Icons\\play" })
self.UI.PlayButton:OnClick(ResumeSession)
self.UI.PauseButton = core.UI.ActionIcon({ Icon = "Interface\\AddOns\\WIT\\Images\\Icons\\pause" })
self.UI.PauseButton:OnClick(PauseSession)
self.UI.StopButton = core.UI.ActionIcon({ Icon = "Interface\\AddOns\\WIT\\Images\\Icons\\stop" })
self.UI.StopButton:OnClick(StopSession)
self.UI.RoutePicker = core.UI.RoutePicker()
self.UI.RoutePicker:SetCallback("OnValueChanged", OnRouteChanged)
self.UI.TimeLabel = AceGUI:Create("InteractiveLabel")
core.UI.ApplyContextMenuToFrame(self.UI.TimeLabel, timerMenu())
self.UI.TitleLabel = AceGUI:Create("InteractiveLabel")
self.UI.TitleLabel:SetFullWidth(true)
self.UI.TitleLabel:SetCallback("OnClick", SetFarmName)
self.UI.TitleLabel:SetCallback("OnEnter", function()
GameTooltip:SetOwner(self.UI.TitleLabel.frame, "ANCHOR_PRESERVE")
GameTooltip:ClearAllPoints()
if self.Session.Mode == "item" and self.Session.ItemId then
local x = self.UI.TitleLabel.label:GetStringWidth() + 5
GameTooltip:SetPoint("LEFT", self.UI.TitleLabel.frame, "LEFT", x, 0)
if self.Session.PetId then
BattlePetToolTip_ShowLink(self.Session.ItemLink)
else
GameTooltip:SetHyperlink("item:" .. self.Session.ItemId)
GameTooltip:Show()
end
else
GameTooltip:SetPoint("TOP", self.UI.TitleLabel.frame, "BOTTOM")
GameTooltip:ClearLines()
GameTooltip:AddLine(core.GetString("SetFarmNameTooltip"))
GameTooltip:Show()
end
end)
self.UI.TitleLabel:SetCallback("OnLeave", function()
if self.Session.PetId then
BattlePetTooltip:Hide()
else
GameTooltip:Hide()
end
end)
self.UI.LocationLabel = AceGUI:Create("InteractiveLabel")
self.UI.LocationLabel:SetFullWidth(true)
self.UI.LocationLabel:SetCallback("OnClick", function() core.UI.ConfirmableDialog({ Text = core.GetString("SessionSetCurrentLocationConfirmationMessage"), OnAccept = SetCurrentLocation }) end)
self.UI.MoneyLabel = AceGUI:Create("InteractiveLabel")
self.UI.MoneyLabel:SetFullWidth(true)
self.UI.MoneyLabel:SetCallback("OnClick", SetRawGold)
self.UI.ItemValueLabel = AceGUI:Create("Label")
self.UI.ItemValueLabel:SetFullWidth(true)
self.UI.TotalValueLabel = AceGUI:Create("Label")
self.UI.TotalValueLabel:SetFullWidth(true)
self.UI.IsGroupFarmCheckBox = AceGUI:Create("CheckBox")
self.UI.IsGroupFarmCheckBox:SetLabel(core.GetString("TrackGroupLoot"))
self.UI.IsGroupFarmCheckBox:SetCallback("OnValueChanged", function(_, _, isChecked) SetIsGroupFarm(isChecked) end)
SetFrameTooltip(self.UI.IsGroupFarmCheckBox.frame, core.GetString("TrackGroupLootTooltip"))
self.UI.ResetInstancesButton = AceGUI:Create("Button")
self.UI.ResetInstancesButton:SetText(core.GetString("ResetAllInstances"))
self.UI.ResetInstancesButton:SetFullWidth(true)
self.UI.ResetInstancesButton:SetCallback("OnClick", ResetInstances)
self.UI.SortJunkButton = AceGUI:Create("Button")
self.UI.SortJunkButton:SetText(core.GetString("SortJunk"))
self.UI.SortJunkButton:SetFullWidth(true)
self.UI.SortJunkButton:SetCallback("OnClick", SortJunk)
self.UI.SortJunkButton:SetCallback("OnEnter", function()
GameTooltip:SetOwner(self.UI.SortJunkButton.frame, "ANCHOR_PRESERVE")
GameTooltip:ClearAllPoints()
GameTooltip:SetPoint("LEFT", self.UI.SortJunkButton.frame, "RIGHT")
GameTooltip:ClearLines()
GameTooltip:AddLine(core.GetString("SortJunkTooltip"))
GameTooltip:Show()
end)
self.UI.SortJunkButton:SetCallback("OnLeave", function()
GameTooltip:Hide()
end)
self.UI.SortJunkButton:SetDisabled(not core.ScrapHelper.IsScrapAvailable())
self.UI.ButtonsPanel = AceGUI:Create("SimpleGroup")
self.UI.ButtonsPanel:SetLayout("Flow")
self.UI.ButtonsPanel:SetFullWidth(true)
self.UI.ButtonsPanel:AddChild(self.UI.NewButton)
self.UI.ButtonsPanel:AddChild(self.UI.SaveButton)
self.UI.ButtonsPanel:AddChild(self.UI.PlayButton)
self.UI.ButtonsPanel:AddChild(self.UI.PauseButton)
self.UI.ButtonsPanel:AddChild(self.UI.StopButton)
self.UI.ButtonsPanel:AddChild(self.UI.TimeLabel)
self.UI.AddItemIcon = AceGUI:Create("Icon")
self.UI.AddItemIcon:SetLabel(core.GetString("AddItem"))
self.UI.AddItemIcon:SetImageSize(48, 48)
self.UI.AddItemIcon:SetFullWidth(true)
self.UI.AddItemIcon:SetImage("Interface\\BUTTONS\\UI-EmptySlot")
self.UI.AddItemIcon:SetCallback("OnClick", AddItem)
self.UI.LootFrame = AceGUI:Create("SimpleGroup")
self.UI.LootFrame:SetFullWidth(true)
self.UI.LootFrame:SetHeight(250)
self.UI.LootFrame:SetLayout("Fill")
local scrollFrame = AceGUI:Create("WITScrollFrame")
scrollFrame:SetLayout("WITList")
local columns = {
core.GridColumns.ContextMenuColumn({ GetMenu = lootContextMenu }),
core.GridColumns.ItemNameColumn({ ItemIdProperty = "Id" }),
core.GridColumns.ItemValueColumn()
}
local options = {
MinWidth = 390,
Columns = columns,
Sort = { Column = columns[2], Direction = "ASC" }
}
self.UI.LootGrid = core.UI.Grid(options)
self.UI.LootGrid.Show(self.Session.Results)
self.UI.LootGrid:SetCallback("OnReload", function() scrollFrame:DoLayout() scrollFrame:FixScroll() end)
scrollFrame:AddChild(self.UI.LootGrid)
self.UI.LootFrame:AddChild(scrollFrame)
self.UI.Hidden = AceGUI:Create("SimpleGroup")
self.UI.Hidden.frame:Hide()
end
function core.ResetRecorderPosition()
wipe(WITDB.Settings.Recorder)
if self then
self.UI.Frame:ClearAllPoints()
self.UI.Frame:SetPoint("CENTER",UIParent,"CENTER")
end
end
function core.Recorder()
if self then return self end
self = {}
self.ItemQueue = {}
self.Session = NormaliseSession(core.Config.GetCurrentRecorderSession() or NewSession())
core.Config.SetCurrentRecorderSession(self.Session)
if self.Session.IsRunning and self.Session.CurrentTime ~= nil then
self.Session.Time = self.Session.Time + self.Session.CurrentTime - self.Session.StartTime
self.Session.IsRunning = false
end
Init()
SetMode(WITDB.Settings.Recorder.Mode or "Details")
self.UI.Frame.frame:RegisterEvent("CHAT_MSG_LOOT")
self.UI.Frame.frame:RegisterEvent("CHAT_MSG_MONEY")
self.UI.Frame.frame:RegisterEvent("GET_ITEM_INFO_RECEIVED")
self.UI.Frame.frame:SetScript("OnEvent", OnEvent)
self.UI.Frame.frame:SetScript("OnUpdate", OnUpdate)
self.Show = function(mode)
self.UI.Frame:Show()
end
self.LoadSession = LoadSession
return self
end