Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 60 additions & 3 deletions src/Classes/BuildListControl.lua
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,28 @@ local ipairs = ipairs
local s_format = string.format
local buildListHelpers = require("Modules.BuildListHelpers")

---@class BuildListEntry
---@field subPath string
---@field fullFileName string
---@field fileName? string
---@field folderName? string
---@field buildName? string
---@field className? string
---@field ascendClassName? string
---@field level? integer

---@class BuildListMode: ControlHost
---@field subPath string
---@field list BuildListEntry[]

---@class BuildListControl: ListControl
---@field listMode BuildListMode
local BuildListClass = newClass("BuildListControl", "ListControl")

---@param anchor Anchor?
---@param rect Rect?
---@param listMode any
---@param anchor? Anchor
---@param rect? Rect
---@param listMode BuildListMode
---@return BuildListControl
function BuildListClass:BuildListControl(anchor, rect, listMode)
self:ListControl(anchor, rect, 20, "VERTICAL", false, listMode.list)
self.listMode = listMode
Expand All @@ -30,9 +46,15 @@ function BuildListClass:BuildListControl(anchor, rect, listMode)
self.selDragActive = false
self.otherDragSource = false
end)
---@param type string
---@param build BuildListEntry
---@return boolean
function self.controls.path:CanReceiveDrag(type, build)
return type == "Build" and #self.folderList > 1
end
---@param type string
---@param build BuildListEntry
---@param source ListControl
function self.controls.path:ReceiveDrag(type, build, source)
if type == "Build" then
for index, folder in ipairs(self.folderList) do
Expand Down Expand Up @@ -62,6 +84,7 @@ function BuildListClass:BuildListControl(anchor, rect, listMode)
return self
end

---@param fullFileName string
function BuildListClass:SelByFullFileName(fullFileName)
if fullFileName then
for index, build in ipairs(self.list) do
Expand All @@ -75,6 +98,7 @@ function BuildListClass:SelByFullFileName(fullFileName)
self.selValue = nil
end

---@param build BuildListEntry
function BuildListClass:LoadBuild(build)
if build.folderName then
self.controls.path:SetSubPath(build.subPath .. build.folderName .. "/")
Expand All @@ -92,6 +116,8 @@ function BuildListClass:NewFolder()
end)
end

---@param build BuildListEntry
---@param copyOnName? boolean
function BuildListClass:RenameBuild(build, copyOnName)
local controls = { }
controls.label = new("LabelControl"):LabelControl(nil, {0, 20, 0, 16}, "^7Enter the new name for this "..(build.folderName and "folder:" or "build:"))
Expand Down Expand Up @@ -159,6 +185,7 @@ function BuildListClass:RenameBuild(build, copyOnName)
main:OpenPopup(370, 100, (copyOnName and "Copy " or "Rename ")..(build.folderName and "Folder" or "Build"), controls, "save", "edit")
end

---@param build BuildListEntry
function BuildListClass:DeleteBuild(build)
if build.folderName then
if NewFileSearch(build.fullFileName.."/*") or NewFileSearch(build.fullFileName.."/*", true) then
Expand Down Expand Up @@ -188,6 +215,10 @@ function BuildListClass:DeleteBuild(build)
end
end

---@param column integer
---@param index integer
---@param build BuildListEntry
---@return string?
function BuildListClass:GetRowValue(column, index, build)
if column == 1 then
local label
Expand Down Expand Up @@ -223,14 +254,24 @@ function BuildListClass:GetRowValue(column, index, build)
end
end

---@param index integer
---@param build BuildListEntry
---@return string
---@return BuildListEntry
function BuildListClass:GetDragValue(index, build)
return "Build", build
end

---@param type string
---@param build BuildListEntry
---@return boolean
function BuildListClass:CanReceiveDrag(type, build)
return type == "Build"
end

---@param type string
---@param build BuildListEntry
---@param source? ListControl
function BuildListClass:ReceiveDrag(type, build, source)
if type == "Build" then
if self.hoverValue and self.hoverValue.folderName then
Expand All @@ -252,10 +293,17 @@ function BuildListClass:ReceiveDrag(type, build, source)
end
end

---@param index integer
---@param build BuildListEntry
---@param source? ListControl
---@return boolean
function BuildListClass:CanDragToValue(index, build, source)
return build.folderName and source.selValue ~= build and buildListHelpers.CanMoveToSubPath(source.selValue, build.subPath .. build.folderName .. "/")
end

---@param index integer
---@param build BuildListEntry
---@param doubleClick? boolean
function BuildListClass:OnSelClick(index, build, doubleClick)
if doubleClick then
self:LoadBuild(build)
Expand All @@ -264,20 +312,29 @@ function BuildListClass:OnSelClick(index, build, doubleClick)
end
end

---@param index integer
---@param build BuildListEntry
function BuildListClass:OnSelCopy(index, build)
self.copyBuild = build
self.cutBuild = nil
end

---@param index integer
---@param build BuildListEntry
function BuildListClass:OnSelCut(index, build)
self.copyBuild = nil
self.cutBuild = build
end

---@param index integer
---@param build BuildListEntry
function BuildListClass:OnSelDelete(index, build)
self:DeleteBuild(build)
end

---@param index integer
---@param build BuildListEntry
---@param key string
function BuildListClass:OnSelKeyDown(index, build, key)
if key == "RETURN" then
self:LoadBuild(build)
Expand Down
24 changes: 24 additions & 0 deletions src/Classes/ButtonControl.lua
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,23 @@
-- Basic button control.
--
---@class ButtonControl: Control, TooltipHost
---@field label Prop<string>
---@field onClick fun(): Control?
---@field onHover? fun(): Control?
---@field forceTooltip? boolean
---@field image? ImageHandle
---@field clicked? boolean
---@field locked? Prop<boolean>
---@field enterFunc? fun()
local ButtonClass = newClass("ButtonControl", "Control", "TooltipHost")

---@param anchor? Anchor
---@param rect? Rect
---@param label Prop<string>
---@param onClick fun(): Control?
---@param onHover? fun(): Control?
---@param forceTooltip? boolean
---@return ButtonControl
function ButtonClass:ButtonControl(anchor, rect, label, onClick, onHover, forceTooltip)
self:Control(anchor, rect)
self:TooltipHost()
Expand All @@ -22,6 +37,7 @@ function ButtonClass:Click()
end
end

---@param path? string
function ButtonClass:SetImage(path)
if path then
self.image = NewImageHandle()
Expand All @@ -31,13 +47,17 @@ function ButtonClass:SetImage(path)
end
end

---@return boolean
function ButtonClass:IsMouseOver()
if not self:IsShown() then
return false
end
return self:IsMouseInBounds()
end

---@param viewPort Rect
---@param noTooltip? boolean
---@return Control?
function ButtonClass:Draw(viewPort, noTooltip)
local x, y = self:GetPos()
local width, height = self:GetSize()
Expand Down Expand Up @@ -104,6 +124,8 @@ function ButtonClass:Draw(viewPort, noTooltip)
end
end

---@param key string
---@return ButtonControl?
function ButtonClass:OnKeyDown(key)
if not self:IsShown() or not self:IsEnabled() then
return
Expand All @@ -116,6 +138,8 @@ function ButtonClass:OnKeyDown(key)
return self
end

---@param key string
---@return Control?
function ButtonClass:OnKeyUp(key)
if not self:IsShown() or not self:IsEnabled() then
return
Expand Down
55 changes: 52 additions & 3 deletions src/Classes/CalcBreakdownControl.lua
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,26 @@ local m_pi = math.pi
local band = bit.band

---@class CalcBreakdownControl: Control, ControlHost
---@field calcsTab CalcsTab
---@field sourceData? CalcSectionEntry[]
---@field pinned boolean
---@field forceActor? "player"|"minion"
---@field tooltip Tooltip
---@field nodeViewer PassiveTreeView
---@field rangeGuide ImageHandle
---@field uiOverlay ImageHandle
---@field borderThickness integer
---@field pinnedColour number[]
---@field borderColour number[]
---@field sectionList table[]
---@field contentWidth number
---@field contentHeight number
---@field clearDisplayFunc? fun()
---@field envName? string
local CalcBreakdownClass = newClass("CalcBreakdownControl", "Control", "ControlHost")

---@param calcsTab CalcsTab
---@return CalcBreakdownControl
function CalcBreakdownClass:CalcBreakdownControl(calcsTab)
self:Control()
self:ControlHost()
Expand All @@ -39,13 +56,16 @@ function CalcBreakdownClass:CalcBreakdownControl(calcsTab)
return self
end

---@return boolean|Control?
function CalcBreakdownClass:IsMouseOver()
if not self:IsShown() then
return
end
return self:IsMouseInBounds() or self:GetMouseOverControl()
end

---@return Actor? actor
---@return table env
function CalcBreakdownClass:GetActor()
local env = self.calcsTab[self.envName or "calcsEnv"]
local actor = self.calcsTab.input.showMinion and env.minion or env.player
Expand All @@ -54,9 +74,9 @@ function CalcBreakdownClass:GetActor()
end
return actor, env
end
---@param displayData any
---@param pinned any
---@param forceActor "player"|"minion"|nil
---@param displayData? CalcSectionEntry[]
---@param pinned boolean
---@param forceActor? "player"|"minion"
function CalcBreakdownClass:SetBreakdownData(displayData, pinned, forceActor)
self.pinned = pinned
if displayData == self.sourceData then
Expand Down Expand Up @@ -144,6 +164,7 @@ function CalcBreakdownClass:SetBreakdownData(displayData, pinned, forceActor)
end

-- Add sections based on the breakdown data generated by the Calcs module
---@param sectionData CalcSectionEntry
function CalcBreakdownClass:AddBreakdownSection(sectionData)
local actor = self:GetActor()
local breakdown
Expand Down Expand Up @@ -297,6 +318,8 @@ function CalcBreakdownClass:AddBreakdownSection(sectionData)
end

-- Add a table section showing a list of modifiers
---@param sectionData CalcSectionEntry
---@param modList? { value: unknown, mod: Mod }[]
function CalcBreakdownClass:AddModSection(sectionData, modList)
local actor = self:GetActor()
local build = self.calcsTab.build
Expand Down Expand Up @@ -526,18 +549,29 @@ function CalcBreakdownClass:AddModSection(sectionData, modList)
end
end

---@param modName string
---@return string
function CalcBreakdownClass:FormatModName(modName)
return modName:gsub("([%l%d]:?)(%u)","%1 %2"):gsub("(%l)(%d)","%1 %2")
end

---@param var? string
---@param varList? string[]
---@return string
function CalcBreakdownClass:FormatVarNameOrList(var, varList)
return var and self:FormatModName(var) or self:FormatModName(table.concat(varList, " / "))
end

---@param mod Mod
---@param base number
---@return string
function CalcBreakdownClass:FormatModBase(mod, base)
return mod.type == "BASE" and string.format("%+g", math.abs(base)) or math.abs(base).."%"
end

---@param value unknown
---@param modType NumericModTypes|string
---@return string
function CalcBreakdownClass:FormatModValue(value, modType)
if modType == "BASE" then
return string.format("%+g base", value)
Expand Down Expand Up @@ -568,6 +602,10 @@ function CalcBreakdownClass:FormatModValue(value, modType)
end
end

---@param viewPort Rect
---@param x number
---@param y number
---@param section table
function CalcBreakdownClass:DrawBreakdownTable(viewPort, x, y, section)
local cursorX, cursorY = GetCursorPos()
if section.label then
Expand Down Expand Up @@ -652,6 +690,11 @@ function CalcBreakdownClass:DrawBreakdownTable(viewPort, x, y, section)
end
end

---@param x number
---@param y number
---@param width number
---@param height number
---@param radius number
function CalcBreakdownClass:DrawRadiusVisual(x, y, width, height, radius)
SetDrawColor(0.75, 0.75, 0.75)
DrawImage(self.rangeGuide, x, y, width, height)
Expand Down Expand Up @@ -687,6 +730,7 @@ function CalcBreakdownClass:DrawRadiusVisual(x, y, width, height, radius)
DrawImage(self.uiOverlay, x, y, width, height)
end

---@param viewPort Rect
function CalcBreakdownClass:Draw(viewPort)
local sourceData = self.sourceData
local scrollBar = self.controls.scrollBar
Expand Down Expand Up @@ -752,6 +796,9 @@ function CalcBreakdownClass:Draw(viewPort)
SetDrawLayer(nil, 0)
end

---@param key string
---@param doubleClick? boolean
---@return Control?
function CalcBreakdownClass:OnKeyDown(key, doubleClick)
if not self:IsShown() or not self:IsEnabled() then
return
Expand All @@ -776,6 +823,8 @@ function CalcBreakdownClass:OnKeyDown(key, doubleClick)
return self
end

---@param key string
---@return CalcBreakdownControl?
function CalcBreakdownClass:OnKeyUp(key)
if not self:IsShown() or not self:IsEnabled() then
return
Expand Down
Loading