Add startnode_input kwarg to EvMenu for sending input text to the startnode as if coming from a virtual previous node. This is used by the persistent save mechanism, to re-run the last node with exactly the same input. Resolves #969.

This commit is contained in:
Griatch 2016-10-22 18:31:22 +02:00
parent f423771423
commit 6a7431d784

View file

@ -221,9 +221,14 @@ class CmdEvMenuNode(Command):
# this will re-start a completely new evmenu call. # this will re-start a completely new evmenu call.
saved_options = caller.attributes.get("_menutree_saved") saved_options = caller.attributes.get("_menutree_saved")
if saved_options: if saved_options:
startnode = caller.attributes.get("_menutree_saved_startnode") startnode_tuple = caller.attributes.get("_menutree_saved_startnode")
try:
startnode, startnode_input = startnode_tuple
except ValueError: # old form of startnode stor
startnode, startnode_input = startnode_tuple, ""
if startnode: if startnode:
saved_options[1]["startnode"] = startnode saved_options[1]["startnode"] = startnode
saved_options[1]["startnode_input"] = startnode_input
# this will create a completely new menu call # this will create a completely new menu call
EvMenu(caller, *saved_options[0], **saved_options[1]) EvMenu(caller, *saved_options[0], **saved_options[1])
return True return True
@ -415,7 +420,7 @@ class EvMenu(object):
options_formatter=evtable_options_formatter, options_formatter=evtable_options_formatter,
node_formatter=underline_node_formatter, node_formatter=underline_node_formatter,
input_parser=evtable_parse_input, input_parser=evtable_parse_input,
persistent=False, **kwargs): persistent=False, startnode_input="", **kwargs):
""" """
Initialize the menu tree and start the caller onto the first node. Initialize the menu tree and start the caller onto the first node.
@ -497,7 +502,13 @@ class EvMenu(object):
with caution - if your menu is buggy you may end up in a state with caution - if your menu is buggy you may end up in a state
you can't get out of! Also note that persistent mode requires you can't get out of! Also note that persistent mode requires
that all formatters, menu nodes and callables are possible to that all formatters, menu nodes and callables are possible to
*pickle*. *pickle*. When the server is reloaded, the latest node shown will be completely
re-run with the same input arguments - so be careful if you are counting
up some persistent counter or similar - the counter may be run twice if
reload happens on the node that does that.
startnode_input (str, optional): Send an input text to `startnode` as if
a user input text from a fictional previous node. When the server reloads,
the latest visited node will be re-run using this kwarg.
Kwargs: Kwargs:
any (any): All kwargs will become initialization variables on `caller._menutree`, any (any): All kwargs will become initialization variables on `caller._menutree`,
@ -567,7 +578,7 @@ class EvMenu(object):
"nodetext_formatter": nodetext_formatter, "options_formatter": options_formatter, "nodetext_formatter": nodetext_formatter, "options_formatter": options_formatter,
"node_formatter": node_formatter, "input_parser": input_parser, "node_formatter": node_formatter, "input_parser": input_parser,
"persistent": persistent,})) "persistent": persistent,}))
caller.attributes.add("_menutree_saved_startnode", startnode) caller.attributes.add("_menutree_saved_startnode", (startnode, startnode_input))
except Exception as err: except Exception as err:
caller.msg(_ERROR_PERSISTENT_SAVING.format(error=err)) caller.msg(_ERROR_PERSISTENT_SAVING.format(error=err))
logger.log_trace(_TRACE_PERSISTENT_SAVING) logger.log_trace(_TRACE_PERSISTENT_SAVING)
@ -580,7 +591,7 @@ class EvMenu(object):
self.caller.cmdset.add(menu_cmdset, permanent=persistent) self.caller.cmdset.add(menu_cmdset, permanent=persistent)
# start the menu # start the menu
self.goto(self._startnode, "") self.goto(self._startnode, startnode_input)
def _parse_menudata(self, menudata): def _parse_menudata(self, menudata):
""" """
@ -737,7 +748,7 @@ class EvMenu(object):
return return
if self._persistent: if self._persistent:
self.caller.attributes.add("_menutree_saved_startnode", nodename) self.caller.attributes.add("_menutree_saved_startnode", (nodename, raw_string))
# validation of the node return values # validation of the node return values
helptext = "" helptext = ""