@ -57,6 +57,7 @@ using namespace DFHack;
# include "df/building_trapst.h"
# include "df/building_type.h"
# include "df/building_workshopst.h"
# include "df/cri_unitst.h"
# include "df/d_init.h"
# include "df/game_mode.h"
# include "df/general_ref.h"
@ -459,7 +460,7 @@ DEFINE_GET_FOCUS_STRING_HANDLER(dwarfmode)
}
if ( ! newFocusString . size ( ) ) {
focusStrings . push_back ( baseFocus ) ;
focusStrings . push_back ( baseFocus + " /Default " ) ;
}
}
@ -475,15 +476,23 @@ DEFINE_GET_FOCUS_STRING_HANDLER(dungeonmode)
}
*/
bool Gui : : matchFocusString ( std : : string focusString , bool prefixMatch ) {
focusString = toLower ( focusString ) ;
std : : vector < std : : string > currentFocusStrings = getFocusStrings ( getCurViewscreen ( true ) ) ;
bool Gui : : matchFocusString ( std : : string focus_string , df : : viewscreen * top ) {
focus_string = toLower ( focus_string ) ;
if ( ! top )
top = getCurViewscreen ( true ) ;
std : : vector < std : : string > currentFocusStrings = getFocusStrings ( top ) ;
return std : : find_if ( currentFocusStrings . begin ( ) , currentFocusStrings . end ( ) , [ & focusString , & prefixMatch ] ( std : : string item ) {
return prefixMatch ? prefix_matches ( focusS tring, toLower ( item ) ) : focusString = = toLower ( item ) ;
return std : : find_if ( currentFocusStrings . begin ( ) , currentFocusStrings . end ( ) , [ & focus _string ] ( std : : string item ) {
return prefix_matches ( focus_s tring, toLower ( item ) ) ;
} ) ! = currentFocusStrings . end ( ) ;
}
static void push_dfhack_focus_string ( dfhack_viewscreen * vs , std : : vector < std : : string > & focusStrings )
{
auto name = vs - > getFocusString ( ) ;
focusStrings . push_back ( name . empty ( ) ? " dfhack " : " dfhack/ " + name ) ;
}
std : : vector < std : : string > Gui : : getFocusStrings ( df : : viewscreen * top )
{
std : : vector < std : : string > focusStrings ;
@ -493,10 +502,21 @@ std::vector<std::string> Gui::getFocusStrings(df::viewscreen* top)
if ( dfhack_viewscreen : : is_instance ( top ) )
{
auto name = static_cast < dfhack_viewscreen * > ( top ) - > getFocusString ( ) ;
focusStrings . push_back ( name . empty ( ) ? " dfhack " : " dfhack/ " + name ) ;
dfhack_viewscreen * vs = static_cast < dfhack_viewscreen * > ( top ) ;
if ( vs - > isFocused ( ) )
{
push_dfhack_focus_string ( vs , focusStrings ) ;
return focusStrings ;
}
top = Gui : : getDFViewscreen ( top ) ;
if ( dfhack_viewscreen : : is_instance ( top ) )
{
push_dfhack_focus_string ( static_cast < dfhack_viewscreen * > ( top ) , focusStrings ) ;
return focusStrings ;
}
else if ( virtual_identity * id = virtual_identity : : get ( top ) )
}
if ( virtual_identity * id = virtual_identity : : get ( top ) )
{
std : : string name = getNameChunk ( id , 11 , 2 ) ;
@ -504,7 +524,8 @@ std::vector<std::string> Gui::getFocusStrings(df::viewscreen* top)
if ( handler )
handler ( name , focusStrings , top ) ;
}
else
if ( ! focusStrings . size ( ) )
{
Core & core = Core : : getInstance ( ) ;
std : : string name = core . p - > readClassName ( * ( void * * ) top ) ;
@ -517,17 +538,7 @@ std::vector<std::string> Gui::getFocusStrings(df::viewscreen* top)
bool Gui : : default_hotkey ( df : : viewscreen * top )
{
// Default hotkey guard function
for ( ; top ; top = top - > parent )
{
if ( strict_virtual_cast < df : : viewscreen_dwarfmodest > ( top ) )
return true ;
/* TODO: understand how this changes for v50
if ( strict_virtual_cast < df : : viewscreen_dungeonmodest > ( top ) )
return true ;
*/
}
return false ;
return World : : isFortressMode ( ) | | World : : isAdventureMode ( ) ;
}
bool Gui : : anywhere_hotkey ( df : : viewscreen * ) {
@ -535,24 +546,7 @@ bool Gui::anywhere_hotkey(df::viewscreen *) {
}
bool Gui : : dwarfmode_hotkey ( df : : viewscreen * top ) {
return World : : isFortressMode ( ) ;
}
bool Gui : : unitjobs_hotkey ( df : : viewscreen * top )
{
/* TODO: understand how this changes for v50
// Require the unit or jobs list
return ! ! strict_virtual_cast < df : : viewscreen_joblistst > ( top ) | |
! ! strict_virtual_cast < df : : viewscreen_unitlistst > ( top ) ;
*/ return false ;
}
bool Gui : : item_details_hotkey ( df : : viewscreen * top )
{
/* TODO: understand how this changes for v50
// Require the main dwarf mode screen
return ! ! strict_virtual_cast < df : : viewscreen_itemst > ( top ) ;
*/ return false ;
return matchFocusString ( " dwarfmode " , top ) ;
}
static bool has_cursor ( )
@ -577,164 +571,82 @@ bool Gui::workshop_job_hotkey(df::viewscreen *top)
if ( ! dwarfmode_hotkey ( top ) )
return false ;
/* TODO: understand how this changes for v50
using namespace ui_sidebar_mode ;
using df : : global : : ui_workshop_in_add ;
using df : : global : : ui_workshop_job_cursor ;
switch ( plotinfo - > main . mode ) {
case QueryBuilding :
{
if ( ! ui_workshop_job_cursor ) // allow missing
return false ;
df : : building * selected = world - > selected_building ;
df : : building * selected = getAnyBuilding ( top ) ;
if ( ! virtual_cast < df : : building_workshopst > ( selected ) & &
! virtual_cast < df : : building_furnacest > ( selected ) )
return false ;
// No jobs?
if ( selected - > jobs . empty ( ) | |
selected - > jobs [ 0 ] - > job_type = = job_type : : DestroyBuilding )
return false ;
// Add job gui activated?
if ( ui_workshop_in_add & & * ui_workshop_in_add )
return false ;
return true ;
} ;
default :
return false ;
}
*/ return false ;
}
bool Gui : : build_selector_hotkey ( df : : viewscreen * top )
{
if ( ! dwarfmode_hotkey ( top ) )
return false ;
/* TODO: understand how this changes for v50
using namespace ui_sidebar_mode ;
using df : : global : : ui_build_selector ;
using df : : global : : buildreq ;
switch ( plotinfo - > main . mode ) {
case Build :
{
if ( ! ui_build_selector ) // allow missing
if ( ! dwarfmode_hotkey ( top ) )
return false ;
// Not selecting, or no choices?
if ( ui_build_selector - > building_type < 0 | |
ui_build_selector - > stage ! = 2 | |
ui_build_selector - > choices . empty ( ) )
if ( buildreq - > building_type < 0 | |
buildreq - > stage ! = 2 | |
buildreq - > choices . empty ( ) )
return false ;
return true ;
} ;
default :
return false ;
}
*/ return false ;
}
bool Gui : : view_unit_hotkey ( df : : viewscreen * top )
{
if ( ! dwarfmode_hotkey ( top ) )
return false ;
/* TODO: understand how this changes for v50
using df : : global : : ui_selected_unit ;
if ( plotinfo - > main . mode ! = ui_sidebar_mode : : ViewUnits )
return false ;
if ( ! ui_selected_unit ) // allow missing
return false ;
return vector_get ( world - > units . active , * ui_selected_unit ) ! = NULL ;
*/ return false ;
return ! ! getAnyUnit ( top ) ;
}
bool Gui : : unit_inventory _hotkey( df : : viewscreen * top )
bool Gui : : any_job_hotkey ( df : : viewscreen * top )
{
using df : : global : : ui_unit_view_mode ;
if ( ! view_unit_hotkey ( top ) )
return false ;
if ( ! ui_unit_view_mode )
return false ;
return ui_unit_view_mode - > value = = df : : ui_unit_view_mode : : Inventory ;
return matchFocusString ( " dwarfmode/Info/JOBS " , top )
| | matchFocusString ( " dwarfmode/Info/CREATURES/CITIZEN " , top )
| | workshop_job_hotkey ( top ) ;
}
df : : job * Gui : : getSelectedWorkshopJob ( color_ostream & out , bool quiet )
{
using df : : global : : ui_workshop_job_cursor ;
if ( ! workshop_job_hotkey ( Core : : getTopViewscreen ( ) ) ) {
if ( ! quiet )
out . printerr ( " Not in a workshop, or no job is highlighted. \n " ) ;
return NULL ;
}
df : : building * selected = world - > selected_building ;
int idx = * ui_workshop_job_cursor ;
if ( size_t ( idx ) > = selected - > jobs . size ( ) )
{
out . printerr ( " Invalid job cursor index: %d \n " , idx ) ;
auto bld = getSelectedBuilding ( out , true ) ;
if ( ! bld )
return NULL ;
}
return selected - > jobs [ idx ] ;
// no way to select a specific job; just get the first one
return bld - > jobs . size ( ) ? bld - > jobs [ 0 ] : NULL ;
}
bool Gui : : any_job_hotkey ( df : : viewscreen * top )
df : : job * Gui : : getSelectedJob ( color_ostream & out , bool quiet )
{
/* TODO: understand how this changes for v50
if ( VIRTUAL_CAST_VAR ( screen , df : : viewscreen_joblistst , top ) )
return vector_get ( screen - > jobs , screen - > cursor_pos ) ! = NULL ;
using df : : global : : game ;
if ( VIRTUAL_CAST_VAR ( screen , df : : viewscreen_unitlistst , top ) )
return vector_get ( screen - > jobs [ screen - > page ] , screen - > cursor_pos [ screen - > page ] ) ! = NULL ;
auto top = Core : : getTopViewscreen ( ) ;
if ( auto dfscreen = dfhack_viewscreen : : try_cast ( top ) )
return dfscreen - > getSelectedJob ( ) ;
return workshop_job_hotkey ( top ) ;
*/ return false ;
if ( matchFocusString ( " dwarfmode/Info/JOBS " ) ) {
auto & cri_job = game - > main_interface . info . jobs . cri_job ;
// no way to select specific jobs; just get the first one
return cri_job . size ( ) ? cri_job [ 0 ] - > jb : NULL ;
}
df : : job * Gui : : getSelectedJob ( color_ostream & out , bool quiet )
{
/* TODO: understand how this changes for v50
df : : viewscreen * top = Core : : getTopViewscreen ( ) ;
if ( VIRTUAL_CAST_VAR ( screen , df : : viewscreen_jobst , top ) )
{
return screen - > job ;
}
if ( VIRTUAL_CAST_VAR ( joblist , df : : viewscreen_joblistst , top ) )
{
df : : job * job = vector_get ( joblist - > jobs , joblist - > cursor_pos ) ;
if ( auto unit = getAnyUnit ( top ) ) {
df : : job * job = unit - > job . current_job ;
if ( ! job & & ! quiet )
out . printerr ( " Selected unit has no job \n " ) ;
return job ;
}
else if ( VIRTUAL_CAST_VAR ( unitlist , df : : viewscreen_unitlistst , top ) )
{
int page = unitlist - > page ;
df : : job * job = vector_get ( unitlist - > jobs [ page ] , unitlist - > cursor_pos [ page ] ) ;
if ( ! job & & ! quiet )
out . printerr ( " Selected unit has no job \n " ) ;
return job ;
}
else if ( auto dfscreen = dfhack_viewscreen : : try_cast ( top ) )
return dfscreen - > getSelectedJob ( ) ;
else
return getSelectedWorkshopJob ( out , quiet ) ;
*/ return getSelectedWorkshopJob ( out , quiet ) ;
}
df : : unit * Gui : : getAnyUnit ( df : : viewscreen * top )
@ -1865,8 +1777,9 @@ df::viewscreen *Gui::getViewscreenByIdentity (virtual_identity &id, int n)
return NULL ;
}
df : : viewscreen * Gui : : getDFViewscreen ( bool skip_dismissed ) {
df : : viewscreen * screen = Gui : : getCurViewscreen ( skip_dismissed ) ;
df : : viewscreen * Gui : : getDFViewscreen ( bool skip_dismissed , df : : viewscreen * screen ) {
if ( ! screen )
screen = Gui : : getCurViewscreen ( skip_dismissed ) ;
while ( screen & & dfhack_viewscreen : : is_instance ( screen ) ) {
screen = screen - > parent ;
if ( skip_dismissed )