!7 concept AList { S name, comment; Int length; // if known long lastChanged; // All other fields are dynamic (in fieldValues). } sclass ListMaker > DynCRUD { bool voiceMode = true; *() { super(AList); } start { dm_onTopInput(voidfunc(S s) { if (voiceMode) reactToInput(s) }); } void reactToInput(fS s) { switch to dm_q(); if (matchEnd_vbar("new list", s)) addDialog(); } void addDialog enter { dm_say("Making a list"); final JTextField tfName = jTextField(); dm_callModule(dm_voiceTargetsModule(), 'addVoiceTarget, dm_moduleID(), tfName, func(S s) -> bool { if "cancel" ret true with disposePIFrame(tfName); false; }); showFormTitled("Name for new list", "Name", tfName, r { name = or2(gtt(tfName), "A list made on " + ymd_hms()); cnew(AList, +name, lastChanged := now()); }); dm_say("What should it be called?"); } visualize { ret northAndCenter( withMargin(dm_fieldCheckBox('voiceMode)), super.visualize()); } }