diff options
Diffstat (limited to 'rust')
| -rw-r--r-- | rust/src/interaction/form.rs | 14 | ||||
| -rw-r--r-- | rust/src/interaction/handler.rs | 42 |
2 files changed, 56 insertions, 0 deletions
diff --git a/rust/src/interaction/form.rs b/rust/src/interaction/form.rs index 06799681..53549bf3 100644 --- a/rust/src/interaction/form.rs +++ b/rust/src/interaction/form.rs @@ -112,6 +112,11 @@ pub enum FormInputField { default: Option<String>, value: Option<String>, }, + Checkbox { + prompt: String, + default: Option<bool>, + value: bool, + }, } impl FormInputField { @@ -130,6 +135,7 @@ impl FormInputField { let int_default = value.hasDefault.then_some(value.intDefault); let address_default = value.hasDefault.then_some(value.addressDefault); let index_default = value.hasDefault.then_some(value.indexDefault); + let bool_default = value.hasDefault.then_some(value.intResult != 0); let extension = raw_to_string(value.ext); let current_address = value.currentAddress; let string_result = raw_to_string(value.stringResult); @@ -186,6 +192,11 @@ impl FormInputField { default: string_default, value: string_result, }, + BNFormInputFieldType::CheckboxFormField => Self::Checkbox { + prompt, + default: bool_default, + value: value.intResult != 0, + }, } } @@ -258,6 +269,7 @@ impl FormInputField { FormInputField::OpenFileName { .. } => BNFormInputFieldType::OpenFileNameFormField, FormInputField::SaveFileName { .. } => BNFormInputFieldType::SaveFileNameFormField, FormInputField::DirectoryName { .. } => BNFormInputFieldType::DirectoryNameFormField, + FormInputField::Checkbox { .. } => BNFormInputFieldType::CheckboxFormField, } } @@ -274,6 +286,7 @@ impl FormInputField { FormInputField::OpenFileName { prompt, .. } => Some(prompt.clone()), FormInputField::SaveFileName { prompt, .. } => Some(prompt.clone()), FormInputField::DirectoryName { prompt, .. } => Some(prompt.clone()), + FormInputField::Checkbox { prompt, .. } => Some(prompt.clone()), } } @@ -325,6 +338,7 @@ impl FormInputField { FormInputField::OpenFileName { default, .. } => Some(default.is_some()), FormInputField::SaveFileName { default, .. } => Some(default.is_some()), FormInputField::DirectoryName { default, .. } => Some(default.is_some()), + FormInputField::Checkbox { default, .. } => Some(default.is_some()), } } diff --git a/rust/src/interaction/handler.rs b/rust/src/interaction/handler.rs index f854f612..11929c94 100644 --- a/rust/src/interaction/handler.rs +++ b/rust/src/interaction/handler.rs @@ -27,6 +27,7 @@ pub fn register_interaction_handler<R: InteractionHandler>(custom: R) { getOpenFileNameInput: Some(cb_get_open_file_name_input::<R>), getSaveFileNameInput: Some(cb_get_save_file_name_input::<R>), getDirectoryNameInput: Some(cb_get_directory_name_input::<R>), + getCheckboxInput: Some(cb_get_checkbox_input::<R>), getFormInput: Some(cb_get_form_input::<R>), showMessageBox: Some(cb_show_message_box::<R>), openUrl: Some(cb_open_url::<R>), @@ -245,6 +246,26 @@ pub trait InteractionHandler: Sync + Send + 'static { form.get_field_with_name(prompt) .and_then(|f| f.try_value_string()) } + + fn get_checkbox_input( + &mut self, + prompt: &str, + title: &str, + default: Option<i64>, + ) -> Option<i64> { + let mut form = Form::new(title.to_owned()); + form.add_field(FormInputField::Checkbox { + prompt: prompt.to_string(), + default: default.map(|b| b == 1), + value: default.map(|b| b == 1)?, + }); + if !self.get_form_input(&mut form) { + return None; + } + form.get_field_with_name(prompt) + .and_then(|f| f.try_value_int()) + .map(|b| if b != 0 { 1 } else { 0 }) + } } pub struct InteractionHandlerTask { @@ -543,6 +564,27 @@ unsafe extern "C" fn cb_get_directory_name_input<R: InteractionHandler>( } } +unsafe extern "C" fn cb_get_checkbox_input<R: InteractionHandler>( + ctxt: *mut c_void, + result_ffi: *mut i64, + prompt: *const c_char, + title: *const c_char, + default_choice: *const i64, +) -> bool { + let ctxt = ctxt as *mut R; + let prompt = raw_to_string(prompt).unwrap(); + let title = raw_to_string(title).unwrap(); + let default = (!default_choice.is_null()).then(|| *default_choice); + let result = (*ctxt).get_checkbox_input(&prompt, &title, default); + if let Some(result) = result { + unsafe { *result_ffi = result }; + true + } else { + unsafe { *result_ffi = 0 }; + false + } +} + unsafe extern "C" fn cb_get_form_input<R: InteractionHandler>( ctxt: *mut c_void, fields: *mut BNFormInputField, |
