-
Notifications
You must be signed in to change notification settings - Fork 493
orders: add search overlay for manager orders #5677
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
base: develop
Are you sure you want to change the base?
Conversation
Adds search overlay to find and navigate manager orders with arrow indicators showing current search result. Search uses Alt+S to focus, Alt+P/N for prev/next navigation. Overlays are disabled by default.
ChrisJohnsen
left a comment
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 nice workaround for the inability to filter the view like in the other info panel search widgets.
I like the labeled magic numbers in OrderHighlightOverlay. DF's layout behavior is not fun thing to have to replicate, but I think this would be fairly clear to someone that hasn't looked at this stuff as much (at least as long as they have DF at hand to try out different window sizes).
Re: not being able to detect exiting the window: yeah, I have also wanted something
like a callback for "this overlay is no longer active (not going to be rendered)".
- Would utils.search_text be useful here? The main SortOverlay uses it for searching.
- Could the first match automatically be highlighted on Enter?
I can see how you might not want to highlight (thus likely move the scroll position) for each change in search input, but Enter seems like a nice place to jump to the first match. - The highlight should probably be cleared when the search text changes (especially when the highlighted order does not match the new search input).
- It might just be my color vision being flaky, but I completely did not notice the highlight arrow at first. Now that I know what to look for, it isn't hard to spot. But my first cycling through the matches was confusing because it wasn't obvious which order was being indicated.
Now there is 16 visible chars in search
I switched to using utils.search_text instead of the custom search logic
Added Enter/Shift+Enter to cycle through matches using the default submit/submit2 methods.
Fixed, now the highlight gets cleared whenever the search text changes.
I reshaped the arrow, moved it to the right side of icon and used more contrasting colors (black on white) to make it more visible. @ChrisJohnsen Thanks for all the detailed feedback! I made each change in a separate commit to make the review easier. Let me know if there's anything else that needs adjusting. |
ChrisJohnsen
left a comment
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.
Good spotting of the need to hide when job_details.open. The other functionality changes all seem good (with a new note about order deletion handling).
I've put some more thoughts on the specifics of the code in this review.
|
So, I hadn't looked into the details of But those The other caller is |
… results after sorting/clearing/importing orders
…r missing entries
…le-locals and inline arrow colors
…Overlay render. Return when disable cursor
I added df.delete(reaction.order) to free the C++ objects and set reactions = nil afterward. I'm not very familiar with memory leak issues, so please let me know if this fix looks correct or if there's anything else I should do. |
|
I need advice on where to put stockflow collect_reactions(): Option 1: Use
Option 2: Use
Option 3: Create a new
What approach would you recommend to get reactions? EDIT: used option 4: make DF instead of stockflow create order names |
ChrisJohnsen
left a comment
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 found couple of functionality things that I didn't notice before:
- cache invalidation between world loads,
- searchability after setting material for an order.
While looking at the details of customized orders I wondered if the overall size of the cache can be reduced.
Some functions can be made local (they don't access self, or won't once the methods the call are themselves made local):
perform_searchgetListStartYgetViewportSizecalculateSelectedOrderY
When adding/removing an order there is still a small UI bug: the "Search: X of Y" title remains unchanged even if a matching order is added or removed. You could refresh the search when the number of orders changes, or just revert to the plain "Search" title so that the (possibly) stale count isn't displayed.
I don't think there is a reason to try to use this version. Like you noted, the plugin is disabled. Its Lua code includes stuff that you don't need here.
I haven't really looked at scripts#1524 much yet. If it is causing problems for Quickfort, that will surely need to be addressed though. Quickfort is the only existing user of I don't know which exceptions you have seen from Quickfort, but it might be possible to make fewer changes to stockflow (keeping Quickfort working without changes) and make more adaptations in the order searching code (like extending "make earring" to "make earring willow" instead of making stockflow generate an additional "Make willow Earring" order).
Another copy of the code (e.g., with the scripts#1524 changes) probably isn't be best approach, if that's what you mean. It does seem the approach here of matching pre-described orders is kind of brittle. I suppose quickfort only needs to concern itself with the list of items/orders that it supports placing, so it doesn't need to support all possible user-configurable, mod-enabled, world-varying orders. If there was some other approach for recreating the UI text DF would display for any given order, that might work better than trying to match order attributes against a predefined, cached list. That would probably take some reverse engineering work to suss out what all DF considers when rendering the order names. |
Thanks for the suggestion, I used workshop button trick to make this works. Looks good and fast 👍 |
|
Interesting. I see that the similar Despite the similarity with For fun I also benched a Lua-only implementation. It is slower but not so slow that I noticed any problems in interactive use (55µs per query in a bench of a quarter million; ~35µs after some tweaking). So it could conceivably live on the Lua side if there isn't a good place for it on the C++ side. I noticed the addition of setting This last niggle also exists in There are a couple of small UI bugs:
|
| button->specflag = order->specflag; | ||
| button->job_item_flag = order->material_category; | ||
| button->specdata = order->specdata; | ||
| button->art_specifier = order->art_spec.type; |
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 isn't in getName. Was is needed for a particular kind of order?
If so, maybe getName should adopt it, too.
I didn't notice any orders that seemed to incorporate job_art_specifier_type details in the UI text, but I could easily have missed something.
| std::string desc; | ||
| auto button = df::allocate<df::interface_button_building_new_jobst>(); | ||
| button->mstring = order->reaction_name; | ||
| button->specdata.hist_figure_id = order->specdata.hist_figure_id; |
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.
For confirmation by someone that works more on the C++ side:
This may not be necessary since specdata is copied as a whole later?
It seemed to work for me when I leaving this one off (copying one of them was definitely needed for some orders (e.g. differently-sized clothes)).
ChrisJohnsen
left a comment
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.
Here is a review to tick the requested-review box. My previous comment also mentions a couple of remaining UI bugs.
|
Found a leftover while reviewing my local notes: If |

Add search to manager orders
Adds search box to find orders by job name + arrow indicators to show which one you're looking at.
What it does
Implementation
OrdersSearchOverlayfor search UI,OrderHighlightOverlayfor arrowsimportexportoverlay position to make room for search (and make new version of config)What didn't work
Related issues
Dwarf.Fortress.2025-12-30.12-33-18.mp4