Add support for setting the active line from automation macros

The macro processing function can now return a second value, which is
the index of the line to make active, which must be one of the lines in
the selection. If it is not, or if the value is not present, then the
active line is left unchanged if it is in the new selection, or set to
the first line of the new selection if it is not.

Closes #1435.

Originally committed to SVN as r6398.
This commit is contained in:
Thomas Goyne 2012-01-31 00:44:16 +00:00
parent dad803e956
commit 725820efc0

View file

@ -707,10 +707,23 @@ namespace Automation4 {
lua_pushinteger(L, transform_selection(L, c)); lua_pushinteger(L, transform_selection(L, c));
try { try {
LuaThreadedCall(L, 3, 1, StrDisplay(c), c->parent, true); LuaThreadedCall(L, 3, 2, StrDisplay(c), c->parent, true);
subsobj->ProcessingComplete(StrDisplay(c)); subsobj->ProcessingComplete(StrDisplay(c));
AssDialogue *active_line = 0;
int active_idx = 0;
// Check for a new active row
if (lua_isnumber(L, -1)) {
active_idx = lua_tointeger(L, -1);
if (active_idx < 1 || active_idx > (int)c->ass->Line.size()) {
wxLogError("Active row %d is out of bounds (must be 1-%u)", active_idx, c->ass->Line.size());
active_idx = 0;
}
}
lua_pop(L, 1);
// top of stack will be selected lines array, if any was returned // top of stack will be selected lines array, if any was returned
if (lua_istable(L, -1)) { if (lua_istable(L, -1)) {
std::set<AssDialogue*> sel; std::set<AssDialogue*> sel;
@ -735,11 +748,15 @@ namespace Automation4 {
sel.insert(diag); sel.insert(diag);
last_idx = cur; last_idx = cur;
if (!active_line || active_idx == cur)
active_line = diag;
} }
lua_pop(L, 1); lua_pop(L, 1);
} }
c->selectionController->SetSelectedSet(sel); c->selectionController->SetSelectedSet(sel);
if (active_line && (active_idx > 0 || !sel.count(c->selectionController->GetActiveLine())))
c->selectionController->SetActiveLine(active_line);
} }
} }
catch (agi::UserCancelException const&) { catch (agi::UserCancelException const&) {