!7 cmodule ConfirmAction > DynModule { S text; transient Runnable action; Pt minimumSize() { ret pt(400, 200); } start { dm_onUserUtterance(s -> { if "yes" yes(); if "no" reset(); }); } visual withCenteredButtons( withMargin(fontSizePlus(10, dm_centeredLabel text())), "Yes", rThread yes, "No", rThread reset); void reset enter { setFields(text := "", action := null); dm_disableAllButtons(); dm_popInModule(); dm_hideModule(); } void yes enter { if (action == null) ret; if (!dm_moduleIsPoppedOut()) ret with reset(); print("Running action: " + text); Runnable r = action; reset(); callF(r); } // API void showAction(S text, Runnable action) { setFields(+text, +action); dm_enableAllButtons(); dm_popOutModule_alwaysOnTop(); } }