siglus_scene_vm/runtime/forms/
input.rs1use anyhow::Result;
2
3use crate::runtime::{CommandContext, Value};
4
5use super::key;
6
7fn current_chain(ctx: &CommandContext) -> Option<&[i32]> {
8 let vm_call = ctx.vm_call.as_ref()?;
9 Some(vm_call.element.as_slice())
10}
11
12pub fn dispatch(ctx: &mut CommandContext, form_id: u32, _args: &[Value]) -> Result<bool> {
13 let Some(chain) = current_chain(ctx) else {
14 return Ok(false);
15 };
16 if chain.len() < 2 || chain[0] != form_id as i32 {
17 return Ok(false);
18 }
19
20 let op = chain[1] as i64;
21 match op {
22 o if o == ctx.ids.input_op_clear as i64 => {
23 ctx.script_input.clear_all();
24 Ok(true)
25 }
26 o if o == ctx.ids.input_op_next as i64 => {
27 ctx.script_input.next_frame();
28 Ok(true)
29 }
30 o if o == ctx.ids.input_op_decide as i64 => {
31 if chain.len() == 2 {
32 ctx.push(Value::Element(chain.to_vec()));
33 } else {
34 let subop = chain[2] as i64;
35 let v = key::query(ctx, ctx.ids.exkey_decide as i64, subop);
36 ctx.push(Value::Int(v));
37 }
38 Ok(true)
39 }
40 o if o == ctx.ids.input_op_cancel as i64 => {
41 if chain.len() == 2 {
42 ctx.push(Value::Element(chain.to_vec()));
43 } else {
44 let subop = chain[2] as i64;
45 let v = key::query(ctx, ctx.ids.exkey_cancel as i64, subop);
46 ctx.push(Value::Int(v));
47 }
48 Ok(true)
49 }
50 _ => Ok(false),
51 }
52}