-
Notifications
You must be signed in to change notification settings - Fork 198
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Stocks script based on pre-v50 stocks plugin #802
base: master
Are you sure you want to change the base?
Conversation
@@ -0,0 +1,544 @@ | |||
-- a v50 script remake of the older stocks plugin |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should just name this "stocks", if it's a drop-in replacement and we aren't intending on resurrecting the plugin.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I had it named stocks.lua originally but somehow DFHack was bringing up an old stocks plugin description and upon running the command, I would get errors about possible compatibility problems, etc. For now, I just renamed it to stocks2 since I wasn't sure what the fix was.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Summarizing/expanding upon our conversation on discord:
The conflict is with the existing docs/plugins/stock.rst in the DFHack/dfhack repo. We may decide to keep that plugin as a host for item filtering logic that needs to be in C++ for performance reasons. If we need to move code to C++, another alternative might be to move the logic into the core library. We'll have to see what's best once we get a better handle on requirements.
For now, the easiest solution is to move stocks2.lua
to gui/stocks.lua
(and likewise for the docs file). That will resolve the naming conflict.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a very good start, but the UX is not quite up to "modern" standards. Check out the AssignAnimal
class in https://github.com/DFHack/dfhack/blob/develop/plugins/lua/zone.lua#L28 for example usage of HotkeyLabel, CycleHotkeyLabel, ToggleHotkeyLabel, FilteredList, searching, sorting, state management, and multi-select with shift-click.
}) | ||
|
||
function StocksScreen:init() | ||
self:addviews({StocksWindow{}}) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
self:addviews({StocksWindow{}}) | |
self:addviews{StocksWindow{}} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Lua provides some syntactic sugar for this case where the only argument being passed is a list/table
@@ -0,0 +1,544 @@ | |||
-- a v50 script remake of the older stocks plugin |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Summarizing/expanding upon our conversation on discord:
The conflict is with the existing docs/plugins/stock.rst in the DFHack/dfhack repo. We may decide to keep that plugin as a host for item filtering logic that needs to be in C++ for performance reasons. If we need to move code to C++, another alternative might be to move the logic into the core library. We'll have to see what's best once we get a better handle on requirements.
For now, the easiest solution is to move stocks2.lua
to gui/stocks.lua
(and likewise for the docs file). That will resolve the naming conflict.
@@ -0,0 +1,14 @@ | |||
stocks2 | |||
======== |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
the underline has to match the length of the string that it is underlining
======== | ||
|
||
.. dfhack-tool:: | ||
:summary: Alternative to the stocks screen based on the pre-v50 stocks plugin by Falconne. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
:summary: Alternative to the stocks screen based on the pre-v50 stocks plugin by Falconne. | |
:summary: Stock management screen with search and filtering. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
summaries should be ~53 chars
|
||
.. dfhack-tool:: | ||
:summary: Alternative to the stocks screen based on the pre-v50 stocks plugin by Falconne. | ||
:tags: stocks |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
:tags: stocks | |
:tags: fort productivity items |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
function StocksWindow:show_qual_and_wear() | ||
local quality_labels = {"Ordinary", "WellCrafted", "FinelyCrafted", "Superior", "Exceptional", "Masterful", "Artifact"} | ||
self.subviews.filters_qual_wear:setText( | ||
{ | ||
{ text = "-+", pen = COLOR_LIGHTGREEN}, { text = ": Min Qual: ", pen = COLOR_WHITE }, { text = quality_labels[min_qual + 1], pen = COLOR_BROWN }, NEWLINE, | ||
{ text = "/*", pen = COLOR_LIGHTGREEN}, { text = ": Max Qual: ", pen = COLOR_WHITE }, { text = quality_labels[max_qual + 1], pen = COLOR_BROWN }, NEWLINE, | ||
{ text = "Shift-W", pen = COLOR_LIGHTGREEN}, { text = ": Min Wear: ", pen = COLOR_WHITE }, { text = tostring(min_wear), pen = COLOR_BROWN } | ||
} | ||
) | ||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should be handed by the RangeSlider
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You can copy the condition and wear sliders from here: https://github.com/DFHack/scripts/blob/master/internal/caravan/common.lua#L124
function StocksWindow:show_filters() | ||
|
||
local function get_pen(state) | ||
if state then | ||
return COLOR_WHITE | ||
else | ||
return COLOR_GREY | ||
end | ||
end | ||
|
||
self.subviews.filters_label:setText( | ||
{ | ||
{ text = "J", pen = COLOR_LIGHTBLUE}, { text = ": In Job ", pen = get_pen(filter_states.in_job) }, | ||
{ text = "X", pen = COLOR_CYAN }, { text = ": Rotten", pen = get_pen(filter_states.rotten) }, NEWLINE, | ||
{ text = "O", pen = COLOR_GREEN}, { text = ": Owned ", pen = get_pen(filter_states.owned) }, | ||
{ text = "F", pen = COLOR_RED}, { text = ": Forbidden", pen = get_pen(filter_states.forbidden) }, NEWLINE, | ||
{ text = "D", pen = COLOR_MAGENTA}, { text = ": Dump ", pen = get_pen(filter_states.dump) }, | ||
{ text = "E", pen = COLOR_LIGHTRED}, { text = ": On Fire", pen = get_pen(filter_states.on_fire) }, NEWLINE, | ||
{ text = "M", pen = COLOR_BLUE}, { text = ": Melt ", pen = get_pen(filter_states.melt) }, | ||
{ text = "I", pen = COLOR_WHITE}, { text = ": In Inventory", pen = get_pen(filter_states.in_inv) }, NEWLINE, | ||
{ text = "C", pen = COLOR_LIGHTRED}, { text = ": Caged ", pen = get_pen(filter_states.caged) }, | ||
{ text = "T", pen = COLOR_LIGHTGREEN}, { text = ": Trade", pen = get_pen(filter_states.trade) }, NEWLINE, | ||
{ text = "N", pen = COLOR_GREY}, { text = ": No Flags", pen = get_pen(filter_states.no_flags) }, | ||
} | ||
) | ||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These should be handled by ToggleHotkeyLabel
options
local utils = require("utils") | ||
|
||
local item_desc_width = 38 | ||
local item_table = {} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You shouldn't have to track this state yourself. It will be accessible as the choices in the FilteredList
frame = {t = 3, l = 0}, | ||
view_id = "item_count_label" | ||
}), | ||
widgets.List({ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should be a FilteredList instead of just a List so you don't have to manage searching yourself.
table.insert(list_contents, { | ||
text = { | ||
{text = full_item_desc, width = item_desc_width, rjustify = false, pad_char = ' '}, ' ', | ||
{text = job_char, width = 1, pen = COLOR_LIGHTBLUE}, | ||
{text = rotten_char, width = 1, pen = COLOR_CYAN}, | ||
{text = owned_char, width = 1, pen = COLOR_GREEN}, | ||
{text = forbidden_char, width = 1, pen = COLOR_RED}, | ||
{text = dump_char, width = 1, pen = COLOR_LIGHTMAGENTA}, | ||
{text = on_fire_char, width = 1, pen = COLOR_LIGHTRED}, | ||
{text = melt_char, width = 1, pen = COLOR_BLUE}, | ||
{text = in_inv_char, width = 1, pen = COLOR_WHITE}, " ", | ||
{text = quality_label, width = 13, rjustify = false, pad_char = ' ', pen = quality_pen}, | ||
}, | ||
ref = v.ref, | ||
}) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
all this can be dynamically rendered by the text entry attached to the list choice. that would also make it responsive to changes to the item from outside of this tool's control.
Example: https://github.com/DFHack/dfhack/blob/develop/plugins/lua/zone.lua#L421
Oh, and also please add a line to the "New tools" section of the changelog: https://github.com/DFHack/scripts/blob/master/changelog.txt#L29 |
This script is intended to clone the functionality of the pre-v50 stocks plugin from Falconne. The layout of the panels and hotkeys is nearly identical, with one exception being that filters are based on alt- hotkeys rather than ctrl- hotkeys.
Remaining features to implement: