summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--LUA_API.rst4
-rw-r--r--Lua API.html3
-rw-r--r--library/LuaApi.cpp1
-rw-r--r--library/include/modules/Gui.h4
-rw-r--r--library/modules/Gui.cpp58
5 files changed, 70 insertions, 0 deletions
diff --git a/LUA_API.rst b/LUA_API.rst
index c5f9a1c5..898ab79c 100644
--- a/LUA_API.rst
+++ b/LUA_API.rst
@@ -777,6 +777,10 @@ Gui module
last case, the highlighted *contained item* is returned, not
the container itself.
+* ``dfhack.gui.getSelectedBuilding([silent])``
+
+ Returns the building selected via *'q'*, *'t'*, *'k'* or *'i'*.
+
* ``dfhack.gui.showAnnouncement(text,color[,is_bright])``
Adds a regular announcement with given text, color, and brightness.
diff --git a/Lua API.html b/Lua API.html
index 07f038bc..97770ff7 100644
--- a/Lua API.html
+++ b/Lua API.html
@@ -1032,6 +1032,9 @@ a full-screen item view of a container. Note that in the
last case, the highlighted <em>contained item</em> is returned, not
the container itself.</p>
</li>
+<li><p class="first"><tt class="docutils literal"><span class="pre">dfhack.gui.getSelectedBuilding([silent])</span></tt></p>
+<p>Returns the building selected via <em>'q'</em>, <em>'t'</em>, <em>'k'</em> or <em>'i'</em>.</p>
+</li>
<li><p class="first"><tt class="docutils literal"><span class="pre">dfhack.gui.showAnnouncement(text,color[,is_bright])</span></tt></p>
<p>Adds a regular announcement with given text, color, and brightness.
The is_bright boolean actually seems to invert the brightness.</p>
diff --git a/library/LuaApi.cpp b/library/LuaApi.cpp
index d73d14cf..b2d41dc1 100644
--- a/library/LuaApi.cpp
+++ b/library/LuaApi.cpp
@@ -760,6 +760,7 @@ static const LuaWrapper::FunctionReg dfhack_gui_module[] = {
WRAPM(Gui, getSelectedJob),
WRAPM(Gui, getSelectedUnit),
WRAPM(Gui, getSelectedItem),
+ WRAPM(Gui, getSelectedBuilding),
WRAPM(Gui, showAnnouncement),
WRAPM(Gui, showZoomAnnouncement),
WRAPM(Gui, showPopupAnnouncement),
diff --git a/library/include/modules/Gui.h b/library/include/modules/Gui.h
index 97e8bd42..b06408f6 100644
--- a/library/include/modules/Gui.h
+++ b/library/include/modules/Gui.h
@@ -91,6 +91,10 @@ namespace DFHack
DFHACK_EXPORT bool any_item_hotkey(df::viewscreen *top);
DFHACK_EXPORT df::item *getSelectedItem(color_ostream &out, bool quiet = false);
+ // A building is selected via 'q', 't' or 'i' (civzone)
+ DFHACK_EXPORT bool any_building_hotkey(df::viewscreen *top);
+ DFHACK_EXPORT df::building *getSelectedBuilding(color_ostream &out, bool quiet = false);
+
// Show a plain announcement, or a titan-style popup message
DFHACK_EXPORT void showAnnouncement(std::string message, int color = 7, bool bright = true);
DFHACK_EXPORT void showZoomAnnouncement(df::announcement_type type, df::coord pos, std::string message, int color = 7, bool bright = true);
diff --git a/library/modules/Gui.cpp b/library/modules/Gui.cpp
index 1662f446..10a20dc2 100644
--- a/library/modules/Gui.cpp
+++ b/library/modules/Gui.cpp
@@ -933,6 +933,64 @@ df::item *Gui::getSelectedItem(color_ostream &out, bool quiet)
return item;
}
+static df::building *getAnyBuilding(df::viewscreen *top)
+{
+ using namespace ui_sidebar_mode;
+ using df::global::ui;
+ using df::global::ui_look_list;
+ using df::global::ui_look_cursor;
+ using df::global::world;
+ using df::global::ui_sidebar_menus;
+
+ if (!Gui::dwarfmode_hotkey(top))
+ return NULL;
+
+ switch (ui->main.mode) {
+ case LookAround:
+ {
+ if (!ui_look_list || !ui_look_cursor)
+ return NULL;
+
+ auto item = vector_get(ui_look_list->items, *ui_look_cursor);
+ if (item && item->type == df::ui_look_list::T_items::Building)
+ return item->building;
+ else
+ return NULL;
+ }
+ case QueryBuilding:
+ case BuildingItems:
+ {
+ return world->selected_building;
+ }
+ case Zones:
+ case ZonesPenInfo:
+ case ZonesPitInfo:
+ case ZonesHospitalInfo:
+ {
+ if (ui_sidebar_menus)
+ return ui_sidebar_menus->zone.selected;
+ return NULL;
+ }
+ default:
+ return NULL;
+ }
+}
+
+bool Gui::any_building_hotkey(df::viewscreen *top)
+{
+ return getAnyBuilding(top) != NULL;
+}
+
+df::building *Gui::getSelectedBuilding(color_ostream &out, bool quiet)
+{
+ df::building *building = getAnyBuilding(Core::getTopViewscreen());
+
+ if (!building && !quiet)
+ out.printerr("No building is selected in the UI.\n");
+
+ return building;
+}
+
//
static void doShowAnnouncement(