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.

434 lines
17 KiB

3 years ago
local addonName, platerInternal = ...
4 years ago
local Plater = _G.Plater
local GameCooltip = GameCooltip2
local DF = DetailsFramework
local _
local UnitPower = _G.UnitPower
local UnitPowerMax = _G.UnitPowerMax
local abs = _G.abs
local hookbox_label_y = -130
local CONST_GLOBALSETTINGS_X = 240
local CONST_GLOBALSETTINGS_Y = hookbox_label_y
local CONST_SCROLLBOX_WIDTH = 200
local CONST_SCROLLBOX_HEIGHT = 495
local CONST_SCROLLBOX_LINES = 20
local CONST_SCROLLBOX_LINE_HEIGHT = 20
local CONST_SCROLLBOX_LINE_BACKDROP = {bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true, edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1}
local CONST_SCROLLBOX_LINE_BACKDROP_COLOR = {0, 0, 0, 0.5}
local CONST_SCROLLBOX_LINE_BACKDROP_COLOR_SELECTED = {.6, .6, .1, 0.7}
local CONST_SCROLLBOX_LINE_BACKDROP_COLOR_HOVER = {.3, .3, .3, 0.5}
local CONST_OPTIONSFRAME_WIDTH = 864
local CONST_ENUMNAME_COMBOPOINT = "ComboPoints"
local CONST_ENUMNAME_HOLYPOWER = "HolyPower"
local CONST_ENUMNAME_RUNES = "Runes"
local CONST_ENUMNAME_ARCANECHARGES = "ArcaneCharges"
local CONST_ENUMNAME_CHI = "Chi"
local CONST_ENUMNAME_SOULCHARGES = "SoulShards"
3 years ago
local CONST_ENUMNAME_ESSENCE = "Essence"
4 years ago
3 years ago
local startX, startY, heightSize = 10, platerInternal.optionsYStart, 755
4 years ago
--templates
local options_text_template = DF:GetTemplate("font", "OPTIONS_FONT_TEMPLATE")
local options_dropdown_template = DF:GetTemplate("dropdown", "OPTIONS_DROPDOWN_TEMPLATE")
local options_switch_template = DF:GetTemplate("switch", "OPTIONS_CHECKBOX_TEMPLATE")
local options_slider_template = DF:GetTemplate("slider", "OPTIONS_SLIDER_TEMPLATE")
local options_button_template = DF:GetTemplate("button", "OPTIONS_BUTTON_TEMPLATE")
--localization
local L = LibStub ("AceLocale-3.0"):GetLocale ("PlaterNameplates", true)
function Plater.Resources.GetResourceEnumNameForPlayer()
local playerSerial = Plater.PlayerGUID or UnitGUID("player")
local playerClassLoc, playerClass = UnitClass("player")
if (not Plater.db.profile.resources_settings.chr[playerSerial]) then
if (playerClass == "ROGUE" or playerClass == "DRUID") then
Plater.db.profile.resources_settings.chr[playerSerial] = CONST_ENUMNAME_COMBOPOINT
return CONST_ENUMNAME_COMBOPOINT
elseif (playerClass == "WARLOCK") then
Plater.db.profile.resources_settings.chr[playerSerial] = CONST_ENUMNAME_SOULCHARGES
return CONST_ENUMNAME_SOULCHARGES
elseif (playerClass == "MONK") then
Plater.db.profile.resources_settings.chr[playerSerial] = CONST_ENUMNAME_CHI
return CONST_ENUMNAME_CHI
elseif (playerClass == "MAGE") then
Plater.db.profile.resources_settings.chr[playerSerial] = CONST_ENUMNAME_ARCANECHARGES
return CONST_ENUMNAME_ARCANECHARGES
elseif (playerClass == "DEATHKNIGHT") then
Plater.db.profile.resources_settings.chr[playerSerial] = CONST_ENUMNAME_RUNES
return CONST_ENUMNAME_RUNES
elseif (playerClass == "PALADIN") then
Plater.db.profile.resources_settings.chr[playerSerial] = CONST_ENUMNAME_HOLYPOWER
return CONST_ENUMNAME_HOLYPOWER
3 years ago
elseif (playerClass == "EVOKER") then
Plater.db.profile.resources_settings.chr[playerSerial] = CONST_ENUMNAME_ESSENCE
return CONST_ENUMNAME_ESSENCE
4 years ago
end
end
return Plater.db.profile.resources_settings.chr[playerSerial]
end
--return the resource Id for the player, resourceId is used to query how much resources the player has UnitPower and UnitPowerMax
function Plater.Resources.GetResourceIdForPlayer()
local playerClassLoc, playerClass = UnitClass("player")
if (playerClass == "ROGUE" or playerClass == "DRUID") then
return Enum.PowerType[CONST_ENUMNAME_COMBOPOINT]
elseif (playerClass == "WARLOCK") then
return Enum.PowerType[CONST_ENUMNAME_SOULCHARGES]
elseif (playerClass == "MONK") then
return Enum.PowerType[CONST_ENUMNAME_CHI]
elseif (playerClass == "MAGE") then
return Enum.PowerType[CONST_ENUMNAME_ARCANECHARGES]
elseif (playerClass == "DEATHKNIGHT") then
return Enum.PowerType[CONST_ENUMNAME_RUNES]
elseif (playerClass == "PALADIN") then
return Enum.PowerType[CONST_ENUMNAME_HOLYPOWER]
3 years ago
elseif (playerClass == "EVOKER") then
return Enum.PowerType[CONST_ENUMNAME_ESSENCE]
4 years ago
end
--return none if not found, this will trigger an error on new resources in the future
end
function Plater.Resources.BuildResourceOptionsTab(frame)
--if there's no default resource name for this character yet, calling this will set a default
Plater.Resources.GetResourceEnumNameForPlayer()
--left menu
local resourceDisplaysAvailable = { --name should be able to get from the client
{name = "Combo Point", defaultClass = {"DRUID", "ROGUE"}, enumName = CONST_ENUMNAME_COMBOPOINT, iconTexture = false, iconAtlas = "ClassOverlay-ComboPoint"}, --4
{name = "Holy Power", defaultClass = {"PALADIN"}, enumName = CONST_ENUMNAME_HOLYPOWER, iconTexture = [[Interface\PLAYERFRAME\ClassOverlayHolyPower]], iconCoords = {0.530999, 0.6619999, 0.01600000, 0.3479999}}, --9
{name = "Runes", defaultClass = {"DEATHKNIGHT"}, enumName = CONST_ENUMNAME_RUNES, iconTexture = [[Interface\PLAYERFRAME\UI-PlayerFrame-Deathknight-SingleRune]], iconCoords = {0, 1, 0, 1}}, --5
4 years ago
{name = "Arcane Charges", defaultClass = {"MAGE"}, enumName = CONST_ENUMNAME_ARCANECHARGES, iconTexture = [[Interface\PLAYERFRAME\MageArcaneCharges]], iconCoords = {64/256, 91/256, 64/128, 91/128}}, --16
{name = "Chi", defaultClass = {"MONK"}, enumName = CONST_ENUMNAME_CHI, iconTexture = [[Interface\PLAYERFRAME\MonkLightPower]], iconCoords = {0.1, .9, 0.1, .9}}, --12
{name = "Soul Shards", defaultClass = {"WARLOCK"}, enumName = CONST_ENUMNAME_SOULCHARGES, iconTexture = [[Interface\PLAYERFRAME\UI-WARLOCKSHARD]], iconCoords = {0/64, 18/64, 0/128, 18/128}}, --7
3 years ago
{name = "Essence", defaultClass = {"EVOKER"}, enumName = CONST_ENUMNAME_ESSENCE, iconTexture = false, iconAtlas = "UF-Essence-Icon"}, --8
4 years ago
}
local refreshResourceScrollBox = function(self, data, offset, totalLines)
for i = 1, totalLines do
local index = i + offset
local resource = data[index]
if (resource) then
local isSelected = Plater.db.profile.resources_settings.chr[Plater.PlayerGUID] == resource.enumName
local line = self:GetLine(i)
line.resource = resource
line.checkBox:SetValue(isSelected)
line.text:SetText(resource.name)
if (isSelected) then
line:SetBackdropColor(unpack(CONST_SCROLLBOX_LINE_BACKDROP_COLOR_SELECTED))
line.isSelected = true
else
line:SetBackdropColor(unpack(CONST_SCROLLBOX_LINE_BACKDROP_COLOR))
line.isSelected = false
end
if (resource.iconTexture) then
line.icon:SetTexture(resource.iconTexture)
if (resource.iconCoords) then
line.icon:SetTexCoord(unpack(resource.iconCoords))
else
line.icon:SetTexCoord(unpack(0, 1, 0, 1))
end
elseif (resource.iconAtlas) then
line.icon:SetAtlas(resource.iconAtlas)
end
end
end
end
local selectResourceScrollBox = DF:CreateScrollBox(frame, "$parentResourceScrollBox", refreshResourceScrollBox, resourceDisplaysAvailable, CONST_SCROLLBOX_WIDTH, CONST_SCROLLBOX_HEIGHT, CONST_SCROLLBOX_LINES, CONST_SCROLLBOX_LINE_HEIGHT)
DF:ReskinSlider(selectResourceScrollBox)
selectResourceScrollBox:SetPoint("topleft", frame, "topleft", 5, hookbox_label_y)
frame.selectResourceScrollBox = selectResourceScrollBox
local selectResourceLabel = DF:CreateLabel(frame, "Select which resource to use on this character:", 12, "orange")
selectResourceLabel:SetPoint("bottomleft", selectResourceScrollBox, "topleft", 0, 4)
local onEnterResourceLine = function(self)
if (not self.isSelected) then
self:SetBackdropColor(unpack(CONST_SCROLLBOX_LINE_BACKDROP_COLOR_HOVER))
end
end
local onLeaveResourceLine = function(self)
if (not self.isSelected) then
self:SetBackdropColor(unpack(CONST_SCROLLBOX_LINE_BACKDROP_COLOR))
end
end
local onSelectResource = function(self)
end
local toggleResource = function(self)
local line = self:GetParent()
local resource = line.resource
Plater.db.profile.resources_settings.chr[Plater.PlayerGUID] = resource.enumName
selectResourceScrollBox:Refresh()
Plater.Resources.UpdateResourceFrameToUse()
end
local resourceListCreateLine = function(self, index)
--create a new line
local line = CreateFrame("button", "$parentLine" .. index, self, BackdropTemplateMixin and "BackdropTemplate")
--set its parameters
line:SetPoint("topleft", self, "topleft", 0, -((index-1) * (CONST_SCROLLBOX_LINE_HEIGHT+1)))
line:SetSize(CONST_SCROLLBOX_WIDTH, CONST_SCROLLBOX_LINE_HEIGHT)
line:SetScript("OnEnter", onEnterResourceLine)
line:SetScript("OnLeave", onLeaveResourceLine)
line:SetScript("OnMouseUp", onSelectResource)
line:SetBackdrop(CONST_SCROLLBOX_LINE_BACKDROP)
line:SetBackdropColor(unpack(CONST_SCROLLBOX_LINE_BACKDROP_COLOR))
line:SetBackdropBorderColor (0, 0, 0, 0)
local checkBox = DF:CreateSwitch(line, toggleResource, false, 20, 20, _, _, "checkbox", "$parentToggleResourceActivation" .. index, _, _, _, _, DF:GetTemplate("switch", "OPTIONS_CHECKBOX_BRIGHT_TEMPLATE"))
checkBox:SetAsCheckBox()
checkBox:SetPoint("left", line, "left", 2, 0)
checkBox.index = index
local resourceIcon = line:CreateTexture("$parentIcon", "artwork")
resourceIcon:SetPoint("left", checkBox.widget, "right", 2, 0)
resourceIcon:SetSize(CONST_SCROLLBOX_LINE_HEIGHT-2, CONST_SCROLLBOX_LINE_HEIGHT-2)
local resourceName = line:CreateFontString("$parentName", "artwork", "GameFontNormal")
resourceName:SetPoint("left", resourceIcon, "right", 2, 0)
line.checkBox = checkBox
line.text = resourceName
line.icon = resourceIcon
return line
end
for i = 1, CONST_SCROLLBOX_LINES do
selectResourceScrollBox:CreateLine(resourceListCreateLine)
end
selectResourceScrollBox:Refresh()
--hide for now and move other settings over ~TODO
selectResourceLabel:Hide()
selectResourceScrollBox:Hide()
4 years ago
--center options
--TODO disabled for now
--local optionsFrame = CreateFrame("frame", "$parentOptionsFrame", frame, "BackdropTemplate")
--optionsFrame:SetWidth(CONST_OPTIONSFRAME_WIDTH)
--optionsFrame:SetPoint("topleft", selectResourceScrollBox, "topright", 26, 0)
--optionsFrame:SetPoint("bottomleft", selectResourceScrollBox, "bottomright", 26, 0)
--DF:ApplyStandardBackdrop(optionsFrame)
4 years ago
--anchor table
local anchor_names = {
L["OPTIONS_ANCHOR_TOPLEFT"],
L["OPTIONS_ANCHOR_LEFT"],
L["OPTIONS_ANCHOR_BOTTOMLEFT"],
L["OPTIONS_ANCHOR_BOTTOM"],
L["OPTIONS_ANCHOR_BOTTOMRIGHT"],
L["OPTIONS_ANCHOR_RIGHT"],
L["OPTIONS_ANCHOR_TOPRIGHT"],
L["OPTIONS_ANCHOR_TOP"],
L["OPTIONS_ANCHOR_CENTER"],
L["OPTIONS_ANCHOR_INNERLEFT"],
L["OPTIONS_ANCHOR_INNERRIGHT"],
L["OPTIONS_ANCHOR_INNERTOP"],
L["OPTIONS_ANCHOR_INNERBOTTOM"],
}
local build_anchor_side_table = function(member1, member2)
local t = {}
for i = 1, 13 do
tinsert(t, {
label = anchor_names[i],
value = i,
onclick = function(_, _, value)
Plater.db.profile.resources_settings[member1][member2].side = value
Plater.RefreshDBUpvalues()
Plater.UpdateAllPlates()
Plater.UpdateAllNames()
end
}
)
end
return t
end
--[=[
-show = false, --if the resource bar from plater is enabled
-personal_bar = false, --if the resource bar shows in the personal bar intead of the current target
align = "horizontal", --combo points are horizontal alignment
grow_direction = "center",
-show_depleted = true,
-show_number = false,
-anchor = {side = 8, x = 0, y = 40},
-scale = 0.8,
-padding = 2,
--]=]
local globalResourceOptions = {
{type = "label", get = function() return "Global Settings:" end, text_template = DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")},
--use plater resources
{
type = "toggle",
get = function() return Plater.db.profile.resources_settings.global_settings.show end,
set = function (self, fixedparam, value)
Plater.db.profile.resources_settings.global_settings.show = value
if value then
PlaterDBChr.resources_on_target = false
end
4 years ago
Plater.UpdateAllPlates()
end,
3 years ago
name = "Use Plater Resources",
desc = "Use Plater Resources",
4 years ago
},
--show on personal bar
{
type = "toggle",
get = function() return Plater.db.profile.resources_settings.global_settings.personal_bar end,
set = function (self, fixedparam, value)
Plater.db.profile.resources_settings.global_settings.personal_bar = value
Plater.UpdateAllPlates()
end,
name = "Show On Personal Bar",
desc = "Show On Personal Bar",
},
--show depleted
{
type = "toggle",
get = function() return Plater.db.profile.resources_settings.global_settings.show_depleted end,
set = function (self, fixedparam, value)
Plater.db.profile.resources_settings.global_settings.show_depleted = value
Plater.UpdateAllPlates()
end,
name = "Show Background",
desc = "Show Background",
},
--show resource number
{
type = "toggle",
get = function() return Plater.db.profile.resources_settings.global_settings.show_number end,
set = function (self, fixedparam, value)
Plater.db.profile.resources_settings.global_settings.show_number = value
Plater.UpdateAllPlates()
end,
name = "Show Amount",
desc = "Show Amount",
},
--anchor
{
type = "select",
get = function() return Plater.db.profile.resources_settings.global_settings.anchor.side end,
values = function() return build_anchor_side_table("global_settings", "anchor") end,
name = L["OPTIONS_ANCHOR"],
desc = "Which side of the nameplate this widget is attach to.",
},
--anchor x offset
{
type = "range",
get = function() return Plater.db.profile.resources_settings.global_settings.anchor.x end,
set = function (self, fixedparam, value)
Plater.db.profile.resources_settings.global_settings.anchor.x = value
Plater.UpdateAllPlates()
end,
min = -100,
max = 100,
step = 1,
usedecimals = true,
name = L["OPTIONS_XOFFSET"],
desc = "Slightly move horizontally.",
},
--anchor y offset
{
type = "range",
get = function() return Plater.db.profile.resources_settings.global_settings.anchor.y end,
set = function (self, fixedparam, value)
Plater.db.profile.resources_settings.global_settings.anchor.y = value
Plater.UpdateAllPlates()
end,
min = -100,
max = 100,
step = 1,
usedecimals = true,
name = L["OPTIONS_YOFFSET"],
desc = "Slightly move vertically.",
},
--scale
{
type = "range",
get = function() return Plater.db.profile.resources_settings.global_settings.scale end,
set = function (self, fixedparam, value)
Plater.db.profile.resources_settings.global_settings.scale = value
--call update on the resource bar
Plater.UpdateAllPlates()
end,
min = 0.6,
max = 2,
step = 0.1,
usedecimals = true,
name = "Scale",
desc = "Scale",
},
--padding
{
type = "range",
get = function() return Plater.db.profile.resources_settings.global_settings.padding end,
set = function (self, fixedparam, value)
Plater.db.profile.resources_settings.global_settings.padding = value
--call update on the resource bar
Plater.UpdateAllPlates()
end,
min = -10,
max = 10,
step = 1,
name = "Padding",
desc = "Padding",
},
}
local optionChangedCallback = function()
Plater.Resources.RefreshResourcesDBUpvalues()
end
_G.C_Timer.After(1.4, function()
--TODO to other frame for now
--DF:BuildMenu(optionsFrame, globalResourceOptions, 5, -5, CONST_SCROLLBOX_HEIGHT, true, options_text_template, options_dropdown_template, options_switch_template, true, options_slider_template, options_button_template, optionChangedCallback)
3 years ago
globalResourceOptions.always_boxfirst = true
DF:BuildMenu(frame, globalResourceOptions, startX, startY, heightSize, false, options_text_template, options_dropdown_template, options_switch_template, true, options_slider_template, options_button_template, optionChangedCallback)
--for widgetId, widget in pairs(frame.widgetids) do
-- print(widget.hasLabel:GetText())
--end
4 years ago
end)
end