spaces->tab, equipper improvements, supertreefarm rewrite, follow improvements, sensor cleanup, milo multiple items allowed in recipes, remote canvas access
This commit is contained in:
@@ -7,62 +7,62 @@ local colors = _G.colors
|
||||
local context = Milo:getContext()
|
||||
|
||||
local machinesTab = UI.Tab {
|
||||
tabTitle = 'Machine',
|
||||
index = 3,
|
||||
backgroundColor = colors.cyan,
|
||||
grid = UI.ScrollingGrid {
|
||||
x = 2, ex = -2, y = 2, ey = -2,
|
||||
disableHeader = true,
|
||||
columns = {
|
||||
{ heading = 'Name', key = 'displayName'},
|
||||
},
|
||||
sortColumn = 'displayName',
|
||||
help = 'Double-click to set machine',
|
||||
},
|
||||
tabTitle = 'Machine',
|
||||
index = 3,
|
||||
backgroundColor = colors.cyan,
|
||||
grid = UI.ScrollingGrid {
|
||||
x = 2, ex = -2, y = 2, ey = -2,
|
||||
disableHeader = true,
|
||||
columns = {
|
||||
{ heading = 'Name', key = 'displayName'},
|
||||
},
|
||||
sortColumn = 'displayName',
|
||||
help = 'Double-click to set machine',
|
||||
},
|
||||
}
|
||||
|
||||
function machinesTab:setItem(item)
|
||||
self.item = item
|
||||
local machine = Craft.machineLookup[self.item.key]
|
||||
local t = Util.filter(context.storage.nodes, function(node)
|
||||
if node.category == 'machine' or node.category == 'custom' then -- TODO: - need a setting instead (ie. canCraft)
|
||||
return node.adapter and node.adapter.online and node.adapter.pushItems
|
||||
end
|
||||
end)
|
||||
self.grid:setValues(t)
|
||||
if machine then
|
||||
self.grid:setSelected('name', machine)
|
||||
end
|
||||
self.parent:setActive(self, item.has_recipe)
|
||||
self.item = item
|
||||
local machine = Craft.machineLookup[self.item.key]
|
||||
local t = Util.filter(context.storage.nodes, function(node)
|
||||
if node.category == 'machine' or node.category == 'custom' then -- TODO: - need a setting instead (ie. canCraft)
|
||||
return node.adapter and node.adapter.online and node.adapter.pushItems
|
||||
end
|
||||
end)
|
||||
self.grid:setValues(t)
|
||||
if machine then
|
||||
self.grid:setSelected('name', machine)
|
||||
end
|
||||
self.parent:setActive(self, item.has_recipe)
|
||||
end
|
||||
|
||||
function machinesTab.grid:getDisplayValues(row)
|
||||
row = Util.shallowCopy(row)
|
||||
row.displayName = row.displayName or row.name
|
||||
return row
|
||||
row = Util.shallowCopy(row)
|
||||
row.displayName = row.displayName or row.name
|
||||
return row
|
||||
end
|
||||
|
||||
function machinesTab.grid:getRowTextColor(row, selected)
|
||||
if row.name == Craft.machineLookup[self.parent.item.key] then
|
||||
return colors.yellow
|
||||
end
|
||||
return UI.Grid:getRowTextColor(row, selected)
|
||||
if row.name == Craft.machineLookup[self.parent.item.key] then
|
||||
return colors.yellow
|
||||
end
|
||||
return UI.Grid:getRowTextColor(row, selected)
|
||||
end
|
||||
|
||||
function machinesTab:eventHandler(event)
|
||||
if event.type == 'grid_select' then
|
||||
if event.selected.name == Craft.machineLookup[self.item.key] then
|
||||
Craft.machineLookup[self.item.key] = nil
|
||||
else
|
||||
Craft.machineLookup[self.item.key] = event.selected.name
|
||||
end
|
||||
Util.writeTable(Craft.MACHINE_LOOKUP, Craft.machineLookup)
|
||||
if event.type == 'grid_select' then
|
||||
if event.selected.name == Craft.machineLookup[self.item.key] then
|
||||
Craft.machineLookup[self.item.key] = nil
|
||||
else
|
||||
Craft.machineLookup[self.item.key] = event.selected.name
|
||||
end
|
||||
Util.writeTable(Craft.MACHINE_LOOKUP, Craft.machineLookup)
|
||||
|
||||
self.grid:draw()
|
||||
self:emit({ type = 'info_message', message = 'Saved' })
|
||||
self.grid:draw()
|
||||
self:emit({ type = 'info_message', message = 'Saved' })
|
||||
|
||||
return true
|
||||
end
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
return { itemTab = machinesTab }
|
||||
|
||||
@@ -7,91 +7,91 @@ local Util = require('util')
|
||||
local context = Milo:getContext()
|
||||
|
||||
local manageTab = UI.Tab {
|
||||
tabTitle = 'Manage',
|
||||
index = 1,
|
||||
form = UI.Form {
|
||||
x = 1, ex = -1, ey = -1,
|
||||
--manualControls = true,
|
||||
[1] = UI.TextEntry {
|
||||
formLabel = 'Name', formKey = 'displayName', help = 'Override display name',
|
||||
shadowText = 'Display name',
|
||||
required = true,
|
||||
limit = 120,
|
||||
},
|
||||
[2] = UI.TextEntry {
|
||||
width = 7,
|
||||
formLabel = 'Min', formKey = 'low', help = 'Craft if below min',
|
||||
validate = 'numeric',
|
||||
},
|
||||
[3] = UI.TextEntry {
|
||||
width = 7,
|
||||
formLabel = 'Max', formKey = 'limit', help = 'Send to trash if above max',
|
||||
validate = 'numeric',
|
||||
},
|
||||
[4] = UI.Checkbox {
|
||||
formLabel = 'Ignore Dmg', formKey = 'ignoreDamage',
|
||||
help = 'Ignore damage of item',
|
||||
},
|
||||
[5] = UI.Checkbox {
|
||||
formLabel = 'Ignore NBT', formKey = 'ignoreNbtHash',
|
||||
help = 'Ignore NBT of item',
|
||||
},
|
||||
},
|
||||
tabTitle = 'Manage',
|
||||
index = 1,
|
||||
form = UI.Form {
|
||||
x = 1, ex = -1, ey = -1,
|
||||
--manualControls = true,
|
||||
[1] = UI.TextEntry {
|
||||
formLabel = 'Name', formKey = 'displayName', help = 'Override display name',
|
||||
shadowText = 'Display name',
|
||||
required = true,
|
||||
limit = 120,
|
||||
},
|
||||
[2] = UI.TextEntry {
|
||||
width = 7,
|
||||
formLabel = 'Min', formKey = 'low', help = 'Craft if below min',
|
||||
validate = 'numeric',
|
||||
},
|
||||
[3] = UI.TextEntry {
|
||||
width = 7,
|
||||
formLabel = 'Max', formKey = 'limit', help = 'Send to trash if above max',
|
||||
validate = 'numeric',
|
||||
},
|
||||
[4] = UI.Checkbox {
|
||||
formLabel = 'Ignore Dmg', formKey = 'ignoreDamage',
|
||||
help = 'Ignore damage of item',
|
||||
},
|
||||
[5] = UI.Checkbox {
|
||||
formLabel = 'Ignore NBT', formKey = 'ignoreNbtHash',
|
||||
help = 'Ignore NBT of item',
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
function manageTab:setItem(item)
|
||||
self.item = item
|
||||
self.res = Util.shallowCopy(context.resources[item.key] or { })
|
||||
self.res.displayName = self.item.displayName
|
||||
self.form:setValues(self.res)
|
||||
self.item = item
|
||||
self.res = Util.shallowCopy(context.resources[item.key] or { })
|
||||
self.res.displayName = self.item.displayName
|
||||
self.form:setValues(self.res)
|
||||
|
||||
-- TODO: ignore damage should not be active if there is not a maxDamage value
|
||||
-- TODO: ignore damage should not be active if there is not a maxDamage value
|
||||
end
|
||||
|
||||
function manageTab:eventHandler(event)
|
||||
if event.type == 'form_cancel' then
|
||||
UI:setPreviousPage()
|
||||
if event.type == 'form_cancel' then
|
||||
UI:setPreviousPage()
|
||||
|
||||
elseif event.type == 'form_complete' then
|
||||
if self.form:save() then
|
||||
if self.res.displayName ~= self.item.displayName then
|
||||
self.item.displayName = self.res.displayName
|
||||
itemDB:add(self.item)
|
||||
itemDB:flush()
|
||||
if context.storage.cache[self.item.key] then
|
||||
context.storage.cache[self.item.key].displayName = self.res.displayName
|
||||
end
|
||||
--context.storage:setDirty()
|
||||
end
|
||||
elseif event.type == 'form_complete' then
|
||||
if self.form:save() then
|
||||
if self.res.displayName ~= self.item.displayName then
|
||||
self.item.displayName = self.res.displayName
|
||||
itemDB:add(self.item)
|
||||
itemDB:flush()
|
||||
if context.storage.cache[self.item.key] then
|
||||
context.storage.cache[self.item.key].displayName = self.res.displayName
|
||||
end
|
||||
--context.storage:setDirty()
|
||||
end
|
||||
|
||||
self.res.displayName = nil
|
||||
Map.prune(self.res, function(v)
|
||||
if type(v) == 'boolean' then
|
||||
return v
|
||||
elseif type(v) == 'string' then
|
||||
return #v > 0
|
||||
end
|
||||
return true
|
||||
end)
|
||||
self.res.displayName = nil
|
||||
Map.prune(self.res, function(v)
|
||||
if type(v) == 'boolean' then
|
||||
return v
|
||||
elseif type(v) == 'string' then
|
||||
return #v > 0
|
||||
end
|
||||
return true
|
||||
end)
|
||||
|
||||
local newKey = {
|
||||
name = self.item.name,
|
||||
damage = self.res.ignoreDamage and 0 or self.item.damage,
|
||||
nbtHash = not self.res.ignoreNbtHash and self.item.nbtHash or nil,
|
||||
}
|
||||
local newKey = {
|
||||
name = self.item.name,
|
||||
damage = self.res.ignoreDamage and 0 or self.item.damage,
|
||||
nbtHash = not self.res.ignoreNbtHash and self.item.nbtHash or nil,
|
||||
}
|
||||
|
||||
context.resources[self.item.key] = nil
|
||||
if not Util.empty(self.res) then
|
||||
context.resources[itemDB:makeKey(newKey)] = self.res
|
||||
end
|
||||
context.resources[self.item.key] = nil
|
||||
if not Util.empty(self.res) then
|
||||
context.resources[itemDB:makeKey(newKey)] = self.res
|
||||
end
|
||||
|
||||
Milo:saveResources()
|
||||
UI:setPreviousPage()
|
||||
end
|
||||
else
|
||||
return
|
||||
end
|
||||
return true
|
||||
Milo:saveResources()
|
||||
UI:setPreviousPage()
|
||||
end
|
||||
else
|
||||
return
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
return { itemTab = manageTab }
|
||||
|
||||
@@ -6,85 +6,89 @@ local UI = require('ui')
|
||||
local colors = _G.colors
|
||||
|
||||
local recipeTab = UI.Tab {
|
||||
tabTitle = 'Recipe',
|
||||
index = 2,
|
||||
backgroundColor = colors.cyan,
|
||||
grid = UI.ScrollingGrid {
|
||||
x = 2, ex = -2, y = 2, ey = -4,
|
||||
disableHeader = true,
|
||||
columns = {
|
||||
{ heading = 'Slot', key = 'slot', width = 2 },
|
||||
{ heading = 'Key', key = 'key' },
|
||||
},
|
||||
sortColumn = 'slot',
|
||||
},
|
||||
ignoreResultNBT = UI.Button {
|
||||
x = 2, y = -2,
|
||||
text = 'Ignore Result NBT', event = 'ignore_result_nbt',
|
||||
},
|
||||
ignoreNBT = UI.Button {
|
||||
x = -13, y = -2,
|
||||
text = 'Ignore NBT', event = 'ignore_nbt',
|
||||
},
|
||||
tabTitle = 'Recipe',
|
||||
index = 2,
|
||||
backgroundColor = colors.cyan,
|
||||
grid = UI.ScrollingGrid {
|
||||
x = 2, ex = -2, y = 2, ey = -4,
|
||||
disableHeader = true,
|
||||
columns = {
|
||||
{ heading = 'Slot', key = 'slot', width = 2 },
|
||||
{ heading = 'Count', key = 'count', width = 2 },
|
||||
{ heading = 'Key', key = 'key' },
|
||||
},
|
||||
sortColumn = 'slot',
|
||||
},
|
||||
ignoreResultNBT = UI.Button {
|
||||
x = 2, y = -2,
|
||||
text = 'Ignore Result NBT', event = 'ignore_result_nbt',
|
||||
},
|
||||
ignoreNBT = UI.Button {
|
||||
x = -13, y = -2,
|
||||
text = 'Ignore NBT', event = 'ignore_nbt',
|
||||
},
|
||||
}
|
||||
|
||||
function recipeTab:setItem(item)
|
||||
self.item = item
|
||||
self.recipe = Craft.findRecipe(self.item)
|
||||
self.item = item
|
||||
self.recipe = Craft.findRecipe(self.item)
|
||||
|
||||
self.parent:setActive(self, self.recipe)
|
||||
self.parent:setActive(self, self.recipe)
|
||||
|
||||
local t = { }
|
||||
if self.recipe then
|
||||
for k, v in pairs(self.recipe.ingredients) do
|
||||
table.insert(t, {
|
||||
slot = k,
|
||||
key = v,
|
||||
})
|
||||
end
|
||||
local key = itemDB:splitKey(self.recipe.result)
|
||||
self.ignoreResultNBT.inactive = not key.nbtHash
|
||||
end
|
||||
self.grid:setValues(t)
|
||||
local t = { }
|
||||
if self.recipe then
|
||||
for k, v in Craft.ingedients(self.recipe) do
|
||||
_syslog(k)
|
||||
_syslog(v)
|
||||
table.insert(t, {
|
||||
slot = k,
|
||||
key = v.key,
|
||||
count = v.count,
|
||||
})
|
||||
end
|
||||
local key = itemDB:splitKey(self.recipe.result)
|
||||
self.ignoreResultNBT.inactive = not key.nbtHash
|
||||
end
|
||||
self.grid:setValues(t)
|
||||
end
|
||||
|
||||
function recipeTab:eventHandler(event)
|
||||
if event.type == 'ignore_result_nbt' then
|
||||
-- remove old entry
|
||||
Milo:updateRecipe(self.recipe.result)
|
||||
if event.type == 'ignore_result_nbt' then
|
||||
-- remove old entry
|
||||
Milo:updateRecipe(self.recipe.result)
|
||||
|
||||
local item = itemDB:splitKey(self.recipe.result)
|
||||
item.nbtHash = nil
|
||||
self.recipe.result = itemDB:makeKey(item)
|
||||
local item = itemDB:splitKey(self.recipe.result)
|
||||
item.nbtHash = nil
|
||||
self.recipe.result = itemDB:makeKey(item)
|
||||
|
||||
-- add updated entry
|
||||
Milo:updateRecipe(self.recipe.result, self.recipe)
|
||||
-- add updated entry
|
||||
Milo:updateRecipe(self.recipe.result, self.recipe)
|
||||
|
||||
self.ignoreResultNBT.inactive = true
|
||||
self:emit({ type = 'info_message', message = 'Recipe updated' })
|
||||
self.ignoreResultNBT.inactive = true
|
||||
self:emit({ type = 'info_message', message = 'Recipe updated' })
|
||||
|
||||
elseif event.type == 'grid_focus_row' then
|
||||
local key = itemDB:splitKey(event.selected.key)
|
||||
self.ignoreNBT.inactive = not key.nbtHash
|
||||
self.ignoreNBT:draw()
|
||||
elseif event.type == 'grid_focus_row' then
|
||||
local key = itemDB:splitKey(event.selected.key)
|
||||
self.ignoreNBT.inactive = not key.nbtHash
|
||||
self.ignoreNBT:draw()
|
||||
|
||||
elseif event.type == 'ignore_nbt' then
|
||||
local selected = self.grid:getSelected()
|
||||
local item = itemDB:splitKey(selected.key)
|
||||
item.nbtHash = nil
|
||||
selected.key = itemDB:makeKey(item)
|
||||
self.grid:draw()
|
||||
elseif event.type == 'ignore_nbt' then
|
||||
local selected = self.grid:getSelected()
|
||||
local item = itemDB:splitKey(selected.key)
|
||||
item.nbtHash = nil
|
||||
selected.key = itemDB:makeKey(item)
|
||||
self.grid:draw()
|
||||
|
||||
self.recipe.ingredients = { }
|
||||
for _, v in pairs(self.grid.values) do
|
||||
self.recipe.ingredients[v.slot] = v.key
|
||||
end
|
||||
self.recipe.ingredients = { }
|
||||
for _, v in pairs(self.grid.values) do
|
||||
self.recipe.ingredients[v.slot] = v.key
|
||||
end
|
||||
|
||||
Milo:updateRecipe(self.recipe.result, self.recipe)
|
||||
self:emit({ type = 'info_message', message = 'Recipe updated' })
|
||||
Milo:updateRecipe(self.recipe.result, self.recipe)
|
||||
self:emit({ type = 'info_message', message = 'Recipe updated' })
|
||||
|
||||
return true
|
||||
end
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
return { itemTab = recipeTab }
|
||||
|
||||
@@ -7,49 +7,49 @@ local colors = _G.colors
|
||||
local context = Milo:getContext()
|
||||
|
||||
local resetTab = UI.Tab {
|
||||
tabTitle = 'Reset',
|
||||
index = 5,
|
||||
backgroundColor = colors.cyan,
|
||||
textArea = UI.TextArea {
|
||||
y = 2, ey = 6,
|
||||
textColor = colors.yellow,
|
||||
value = [[ Warning!
|
||||
tabTitle = 'Reset',
|
||||
index = 5,
|
||||
backgroundColor = colors.cyan,
|
||||
textArea = UI.TextArea {
|
||||
y = 2, ey = 6,
|
||||
textColor = colors.yellow,
|
||||
value = [[ Warning!
|
||||
|
||||
This will clear all setting,
|
||||
recipe, and machine for this item.]]
|
||||
},
|
||||
resetButton = UI.Button {
|
||||
x = 17, y = 7,
|
||||
event = 'reset',
|
||||
text = 'Reset',
|
||||
help = 'Clear recipe and all settings',
|
||||
},
|
||||
This will clear all setting,
|
||||
recipe, and machine for this item.]]
|
||||
},
|
||||
resetButton = UI.Button {
|
||||
x = 17, y = 7,
|
||||
event = 'reset',
|
||||
text = 'Reset',
|
||||
help = 'Clear recipe and all settings',
|
||||
},
|
||||
}
|
||||
|
||||
function resetTab:setItem(item)
|
||||
self.item = item
|
||||
self.item = item
|
||||
end
|
||||
|
||||
function resetTab:eventHandler(event)
|
||||
if event.type == 'reset' then
|
||||
if context.userRecipes[self.item.key] then
|
||||
Milo:updateRecipe(self.item.key, nil)
|
||||
end
|
||||
if event.type == 'reset' then
|
||||
if context.userRecipes[self.item.key] then
|
||||
Milo:updateRecipe(self.item.key, nil)
|
||||
end
|
||||
|
||||
if context.resources[self.item.key] then
|
||||
context.resources[self.item.key] = nil
|
||||
Milo:saveResources()
|
||||
end
|
||||
if context.resources[self.item.key] then
|
||||
context.resources[self.item.key] = nil
|
||||
Milo:saveResources()
|
||||
end
|
||||
|
||||
if Craft.machineLookup[self.item.key] then
|
||||
Craft.machineLookup[self.item.key] = nil
|
||||
Util.writeTable(Craft.MACHINE_LOOKUP, Craft.machineLookup)
|
||||
end
|
||||
if Craft.machineLookup[self.item.key] then
|
||||
Craft.machineLookup[self.item.key] = nil
|
||||
Util.writeTable(Craft.MACHINE_LOOKUP, Craft.machineLookup)
|
||||
end
|
||||
|
||||
UI:setPreviousPage()
|
||||
UI:setPreviousPage()
|
||||
|
||||
return true
|
||||
end
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
return { itemTab = resetTab }
|
||||
|
||||
Reference in New Issue
Block a user