Files
PathOfBuilding/Classes/BuildListControl.lua
2017-06-08 01:15:55 +10:00

241 lines
7.1 KiB
Lua

-- Path of Building
--
-- Class: Build List
-- Build list control.
--
local launch, main = ...
local ipairs = ipairs
local s_format = string.format
local BuildListClass = common.NewClass("BuildList", "ListControl", function(self, anchor, x, y, width, height, listMode)
self.ListControl(anchor, x, y, width, height, 20, false, listMode.list)
self.listMode = listMode
self.showRowSeparators = true
self.controls.path = common.New("PathControl", {"BOTTOM",self,"TOP"}, 0, -2, width, 24, main.buildPath, listMode.subPath, function(subPath)
listMode.subPath = subPath
listMode:BuildList()
self.selIndex = nil
self.selValue = nil
end)
function self.controls.path:CanReceiveDrag(type, build)
return type == "Build" and #self.folderList > 1
end
function self.controls.path:ReceiveDrag(type, build, source)
if type == "Build" then
for index, folder in ipairs(self.folderList) do
if index < #self.folderList and folder.button:IsMouseOver() then
if build.folderName then
main:MoveFolder(build.folderName, main.buildPath..build.subPath, main.buildPath..folder.path)
else
os.rename(build.fullFileName, listMode:GetDestName(folder.path, build.fileName))
end
listMode:BuildList()
end
end
end
end
self.dragTargetList = { self.controls.path, self }
end)
function BuildListClass:SelByFileName(selFileName)
for index, build in ipairs(self.list) do
if build.fileName == selFileName then
self:SelectIndex(index)
break
end
end
end
function BuildListClass:LoadBuild(build)
if build.folderName then
self.controls.path:SetSubPath(self.listMode.subPath .. build.folderName .. "/")
else
main:SetMode("BUILD", build.fullFileName, build.buildName)
end
end
function BuildListClass:NewFolder()
main:OpenNewFolderPopup(main.buildPath..self.listMode.subPath, function(newFolderName)
if newFolderName then
self.listMode:BuildList()
end
self.listMode:SelectControl(self)
end)
end
function BuildListClass:RenameBuild(build, copyOnName)
local controls = { }
controls.label = common.New("LabelControl", nil, 0, 20, 0, 16, "^7Enter the new name for this "..(build.folderName and "folder:" or "build:"))
controls.edit = common.New("EditControl", nil, 0, 40, 350, 20, build.folderName or build.buildName, nil, "\\/:%*%?\"<>|%c", 100, function(buf)
controls.save.enabled = false
if build.folderName then
if buf:match("%S") and buf:lower() ~= build.folderName:lower() then
controls.save.enabled = true
end
else
if buf:match("%S") and buf:lower() ~= build.buildName:lower() then
local newName = buf..".xml"
local newFile = io.open(main.buildPath..build.subPath..newName, "r")
if newFile then
newFile:close()
else
controls.save.enabled = true
end
end
end
end)
controls.save = common.New("ButtonControl", nil, -45, 70, 80, 20, "Save", function()
local newBuildName = controls.edit.buf
if build.folderName then
if copyOnName then
main:CopyFolder(build.fullFileName, main.buildPath..build.subPath..newBuildName)
else
local res, msg = os.rename(build.fullFileName, main.buildPath..build.subPath..newBuildName)
if not res then
main:OpenMessagePopup("Error", "Couldn't rename '"..build.fullFileName.."' to '"..newBuildName.."': "..msg)
return
end
end
self.listMode:BuildList()
else
local newFileName = newBuildName..".xml"
if copyOnName then
local res, msg = copyFile(build.fullFileName, main.buildPath..build.subPath..newFileName)
if not res then
main:OpenMessagePopup("Error", "Couldn't copy build: "..msg)
return
end
else
local res, msg = os.rename(build.fullFileName, main.buildPath..build.subPath..newFileName)
if not res then
main:OpenMessagePopup("Error", "Couldn't rename '"..build.fullFileName.."' to '"..newFileName.."': "..msg)
return
end
end
self.listMode:BuildList()
self:SelByFileName(newFileName)
end
main:ClosePopup()
self.listMode:SelectControl(self)
end)
controls.save.enabled = false
controls.cancel = common.New("ButtonControl", nil, 45, 70, 80, 20, "Cancel", function()
main:ClosePopup()
self.listMode:SelectControl(self)
end)
main:OpenPopup(370, 100, (copyOnName and "Copy " or "Rename ")..(build.folderName and "Folder" or "Build"), controls, "save", "edit")
end
function BuildListClass:DeleteBuild(build)
if build.folderName then
if NewFileSearch(build.fullFileName.."/*") or NewFileSearch(build.fullFileName.."/*", true) then
main:OpenMessagePopup("Delete Folder", "The folder is not empty.")
else
local res, msg = RemoveDir(build.fullFileName)
if not res then
main:OpenMessagePopup("Error", "Couldn't delete '"..build.fullFileName.."': "..msg)
return
end
self.listMode:BuildList()
self.selIndex = nil
self.selValue = nil
end
else
main:OpenConfirmPopup("Confirm Delete", "Are you sure you want to delete build:\n"..build.buildName.."\nThis cannot be undone.", "Delete", function()
os.remove(build.fullFileName)
self.listMode:BuildList()
self.selIndex = nil
self.selValue = nil
end)
end
end
function BuildListClass:GetColumnOffset(column)
if column == 1 then
return 0
elseif column == 2 then
return self:GetProperty("width") - 172
end
end
function BuildListClass:GetRowValue(column, index, build)
if column == 1 then
local label
if build.folderName then
label = ">> " .. build.folderName
else
label = build.buildName or "?"
end
if self.cutBuild and self.cutBuild.buildName == build.buildName and self.cutBuild.folderName == build.folderName then
return "^xC0B0B0"..label
else
return label
end
elseif column == 2 then
if build.buildName then
return s_format("%sLevel %d %s",
build.className and colorCodes[build.className:upper()] or "^7",
build.level or 1,
(build.ascendClassName ~= "None" and build.ascendClassName) or build.className or "?"
)
else
return ""
end
end
end
function BuildListClass:GetDragValue(index, build)
return "Build", build
end
function BuildListClass:CanReceiveDrag(type, build)
return type == "Build"
end
function BuildListClass:ReceiveDrag(type, build, source)
if type == "Build" then
if self.hoverValue and self.hoverValue.folderName then
if build.folderName then
main:MoveFolder(build.folderName, main.buildPath..build.subPath, main.buildPath..self.hoverValue.subPath..self.hoverValue.folderName.."/")
else
os.rename(build.fullFileName, self.listMode:GetDestName(self.listMode.subPath..self.hoverValue.folderName.."/", build.fileName))
end
self.listMode:BuildList()
end
end
end
function BuildListClass:CanDragToValue(index, build, source)
return build.folderName
end
function BuildListClass:OnSelClick(index, build, doubleClick)
if doubleClick then
self:LoadBuild(build)
self.selDragging = false
end
end
function BuildListClass:OnSelCopy(index, build)
self.copyBuild = build
self.cutBuild = nil
end
function BuildListClass:OnSelCut(index, build)
self.copyBuild = nil
self.cutBuild = build
end
function BuildListClass:OnSelDelete(index, build)
self:DeleteBuild(build)
end
function BuildListClass:OnSelKeyDown(index, build, key)
if key == "RETURN" then
self:LoadBuild(build)
elseif key == "F2" then
self:RenameBuild(build)
end
end