summaryrefslogtreecommitdiff
path: root/library/modules
diff options
context:
space:
mode:
authorAlexander Gavrilov2012-08-24 13:20:08 +0400
committerAlexander Gavrilov2012-08-24 13:20:08 +0400
commite825dc5ddb1f2c0798b571ebcb02a52e184fc689 (patch)
treef5fe92c3ea5b2f56e677f8d9d0b670e252317b4c /library/modules
parentb12b9fa91e3be0d4d157f144f4b20202cdb72917 (diff)
downloaddfhack-e825dc5ddb1f2c0798b571ebcb02a52e184fc689.tar.gz
dfhack-e825dc5ddb1f2c0798b571ebcb02a52e184fc689.tar.bz2
dfhack-e825dc5ddb1f2c0798b571ebcb02a52e184fc689.tar.xz
Tweak the API for current viewscreen, and dispatch show/dismiss from C++.
Diffstat (limited to 'library/modules')
-rw-r--r--library/modules/Gui.cpp16
-rw-r--r--library/modules/Screen.cpp30
2 files changed, 37 insertions, 9 deletions
diff --git a/library/modules/Gui.cpp b/library/modules/Gui.cpp
index 9d3ee96e..91a17e99 100644
--- a/library/modules/Gui.cpp
+++ b/library/modules/Gui.cpp
@@ -983,17 +983,19 @@ void Gui::showPopupAnnouncement(std::string message, int color, bool bright)
world->status.popups.push_back(popup);
}
-df::viewscreen * Gui::GetCurrentScreen()
+df::viewscreen *Gui::getCurViewscreen(bool skip_dismissed)
{
df::viewscreen * ws = &gview->view;
- while(ws)
+ while (ws && ws->child)
+ ws = ws->child;
+
+ if (skip_dismissed)
{
- if(ws->child)
- ws = ws->child;
- else
- return ws;
+ while (ws && Screen::isDismissed(ws) && ws->parent)
+ ws = ws->parent;
}
- return 0;
+
+ return ws;
}
bool Gui::getViewCoords (int32_t &x, int32_t &y, int32_t &z)
diff --git a/library/modules/Screen.cpp b/library/modules/Screen.cpp
index 9b6839a4..c2377f2c 100644
--- a/library/modules/Screen.cpp
+++ b/library/modules/Screen.cpp
@@ -235,14 +235,26 @@ bool Screen::show(df::viewscreen *screen, df::viewscreen *before)
if (screen->child)
screen->child->parent = screen;
+ if (dfhack_viewscreen::is_instance(screen))
+ static_cast<dfhack_viewscreen*>(screen)->onShow();
+
return true;
}
-void Screen::dismiss(df::viewscreen *screen)
+void Screen::dismiss(df::viewscreen *screen, bool to_first)
{
CHECK_NULL_POINTER(screen);
- screen->breakdown_level = interface_breakdown_types::STOPSCREEN;
+ if (screen->breakdown_level != interface_breakdown_types::NONE)
+ return;
+
+ if (to_first)
+ screen->breakdown_level = interface_breakdown_types::TOFIRST;
+ else
+ screen->breakdown_level = interface_breakdown_types::STOPSCREEN;
+
+ if (dfhack_viewscreen::is_instance(screen))
+ static_cast<dfhack_viewscreen*>(screen)->onDismiss();
}
bool Screen::isDismissed(df::viewscreen *screen)
@@ -261,6 +273,8 @@ static std::set<df::viewscreen*> dfhack_screens;
dfhack_viewscreen::dfhack_viewscreen() : text_input_mode(false)
{
dfhack_screens.insert(this);
+
+ last_size = Screen::getWindowSize();
}
dfhack_viewscreen::~dfhack_viewscreen()
@@ -576,3 +590,15 @@ void dfhack_lua_viewscreen::feed(std::set<df::interface_key> *keys)
lua_pushlightuserdata(Lua::Core::State, keys);
safe_call_lua(do_input, 1, 0);
}
+
+void dfhack_lua_viewscreen::onShow()
+{
+ lua_pushstring(Lua::Core::State, "onShow");
+ safe_call_lua(do_notify, 1, 0);
+}
+
+void dfhack_lua_viewscreen::onDismiss()
+{
+ lua_pushstring(Lua::Core::State, "onDismiss");
+ safe_call_lua(do_notify, 1, 0);
+}