summaryrefslogtreecommitdiff
path: root/rust
diff options
context:
space:
mode:
Diffstat (limited to 'rust')
-rw-r--r--rust/src/interaction/form.rs14
-rw-r--r--rust/src/interaction/handler.rs42
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,