Files
PathOfBuilding/Modules/BuildList.lua
Openarl 2806cbac3d 1.4.118 Initial commit
- Added/updated skill gems and bases
- Fixed curse stats with wrong sign
- Fixed wrong sources on quality mods
2018-12-09 16:29:54 +13:00

213 lines
7.1 KiB
Lua

-- Path of Building
--
-- Module: Build List
-- Displays the list of builds.
--
local pairs = pairs
local ipairs = ipairs
local t_insert = table.insert
local buildSortDropList = {
{ label = "Sort by Name", sortMode = "NAME" },
{ label = "Sort by Class", sortMode = "CLASS" },
{ label = "Sort by Last Edited", sortMode = "EDITED"},
}
local listMode = new("ControlHost")
function listMode:Init(selBuildName, subPath)
if self.initialised then
self.subPath = subPath or self.subPath
self.controls.buildList.controls.path:SetSubPath(self.subPath)
self.controls.buildList:SelByFileName(selBuildName and selBuildName..".xml")
self:BuildList()
self:SelectControl(self.controls.buildList)
return
end
self.anchor = new("Control", nil, 0, 4, 0, 0)
self.anchor.x = function()
return main.screenW / 2
end
self.subPath = subPath or ""
self.list = { }
self.controls.new = new("ButtonControl", {"TOP",self.anchor,"TOP"}, -259, 0, 60, 20, "New", function()
main:SetMode("BUILD", false, "Unnamed build")
end)
self.controls.newFolder = new("ButtonControl", {"LEFT",self.controls.new,"RIGHT"}, 8, 0, 90, 20, "New Folder", function()
self.controls.buildList:NewFolder()
end)
self.controls.open = new("ButtonControl", {"LEFT",self.controls.newFolder,"RIGHT"}, 8, 0, 60, 20, "Open", function()
self.controls.buildList:LoadBuild(self.controls.buildList.selValue)
end)
self.controls.open.enabled = function() return self.controls.buildList.selValue ~= nil end
self.controls.copy = new("ButtonControl", {"LEFT",self.controls.open,"RIGHT"}, 8, 0, 60, 20, "Copy", function()
self.controls.buildList:RenameBuild(self.controls.buildList.selValue, true)
end)
self.controls.copy.enabled = function() return self.controls.buildList.selValue ~= nil end
self.controls.rename = new("ButtonControl", {"LEFT",self.controls.copy,"RIGHT"}, 8, 0, 60, 20, "Rename", function()
self.controls.buildList:RenameBuild(self.controls.buildList.selValue)
end)
self.controls.rename.enabled = function() return self.controls.buildList.selValue ~= nil end
self.controls.delete = new("ButtonControl", {"LEFT",self.controls.rename,"RIGHT"}, 8, 0, 60, 20, "Delete", function()
self.controls.buildList:DeleteBuild(self.controls.buildList.selValue)
end)
self.controls.delete.enabled = function() return self.controls.buildList.selValue ~= nil end
self.controls.sort = new("DropDownControl", {"LEFT",self.controls.delete,"RIGHT"}, 8, 0, 140, 20, buildSortDropList, function(index, value)
main.buildSortMode = value.sortMode
self:SortList()
end)
self.controls.sort:SelByValue(main.buildSortMode, "sortMode")
self.controls.buildList = new("BuildListControl", {"TOP",self.anchor,"TOP"}, 0, 50, 640, 0, self)
self.controls.buildList.height = function()
return main.screenH - 58
end
self:BuildList()
self.controls.buildList:SelByFileName(selBuildName and selBuildName..".xml")
self:SelectControl(self.controls.buildList)
self.initialised = true
end
function listMode:Shutdown()
end
function listMode:GetArgs()
return self.controls.buildList.selValue and self.controls.buildList.selValue.buildName or false, self.subPath
end
function listMode:OnFrame(inputEvents)
for id, event in ipairs(inputEvents) do
if event.type == "KeyDown" then
if event.key == "v" and IsKeyDown("CTRL") then
if self.controls.buildList.copyBuild then
local build = self.controls.buildList.copyBuild
if build.subPath ~= self.subPath then
if build.folderName then
main:CopyFolder(build.folderName, main.buildPath..build.subPath, main.buildPath..self.subPath)
else
copyFile(build.fullFileName, self:GetDestName(self.subPath, build.fileName))
end
self:BuildList()
else
self.controls.buildList:RenameBuild(build, true)
end
self.controls.buildList.copyBuild = nil
elseif self.controls.buildList.cutBuild then
local build = self.controls.buildList.cutBuild
if build.subPath ~= self.subPath then
if build.folderName then
main:MoveFolder(build.folderName, main.buildPath..build.subPath, main.buildPath..self.subPath)
else
os.rename(build.fullFileName, self:GetDestName(self.subPath, build.fileName))
end
self:BuildList()
end
self.controls.buildList.cutBuild = nil
end
elseif event.key == "n" and IsKeyDown("CTRL") then
main:SetMode("BUILD", false, "Unnamed build")
elseif event.key == "MOUSE4" then
self.controls.buildList.controls.path:Undo()
elseif event.key == "MOUSE5" then
self.controls.buildList.controls.path:Redo()
end
end
end
self:ProcessControlsInput(inputEvents, main.viewPort)
main:DrawBackground(main.viewPort)
self:DrawControls(main.viewPort)
end
function listMode:GetDestName(subPath, fileName)
local i = 2
local destName = fileName
while true do
local test = io.open(destName, "r")
if test then
destName = fileName .. "[" .. i .. "]"
i = i + 1
else
break
end
end
return main.buildPath..subPath..destName
end
function listMode:BuildList()
wipeTable(self.list)
local handle = NewFileSearch(main.buildPath..self.subPath.."*.xml")
while handle do
local fileName = handle:GetFileName()
local build = { }
build.fileName = fileName
build.subPath = self.subPath
build.fullFileName = main.buildPath..self.subPath..fileName
build.modified = handle:GetFileModifiedTime()
build.buildName = fileName:gsub("%.xml$","")
local dbXML = common.xml.LoadXMLFile(build.fullFileName)
if dbXML and dbXML[1] and dbXML[1].elem == "PathOfBuilding" then
for _, node in ipairs(dbXML[1]) do
if type(node) == "table" and node.elem == "Build" then
build.level = tonumber(node.attrib.level)
build.className = node.attrib.className
build.ascendClassName = node.attrib.ascendClassName
end
end
end
t_insert(self.list, build)
if not handle:NextFile() then
break
end
end
handle = NewFileSearch(main.buildPath..self.subPath.."*", true)
while handle do
local folderName = handle:GetFileName()
t_insert(self.list, {
folderName = folderName,
subPath = self.subPath,
fullFileName = main.buildPath..self.subPath..folderName,
})
if not handle:NextFile() then
break
end
end
self:SortList()
end
function listMode:SortList()
local oldSelFileName = self.controls.buildList.selValue and self.controls.buildList.selValue.fileName
table.sort(self.list, function(a, b)
if a.folderName and b.folderName then
return naturalSortCompare(a.folderName, b.folderName)
elseif a.folderName and not b.folderName then
return true
elseif not a.folderName and b.folderName then
return false
end
if main.buildSortMode == "EDITED" then
return a.modified > b.modified
elseif main.buildSortMode == "CLASS" then
if a.className and not b.className then
return false
elseif not a.className and b.className then
return true
elseif a.className ~= b.className then
return a.className < b.className
elseif a.ascendClassName ~= b.ascendClassName then
return a.ascendClassName < b.ascendClassName
end
end
return naturalSortCompare(a.fileName, b.fileName)
end)
if oldSelFileName then
self.controls.buildList:SelByFileName(oldSelFileName)
end
end
return listMode