summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorAlexander Khosrowshahi <alexk@vector35.com>2025-06-09 12:27:47 -0400
committerAlex Khosrowshahi <71569995+spoonmilk@users.noreply.github.com>2025-06-30 08:09:24 -0700
commitdc2911dac66c838e508fc3872bcbaee62e6d482a (patch)
treebccdbc9bd81838267b3f56950df497c4b87c010f /python
parentee50478d7b494ae4e62ae08986ce0b9229bc0fbc (diff)
Add Checkbox input support to python api
Diffstat (limited to 'python')
-rw-r--r--python/interaction.py89
1 files changed, 89 insertions, 0 deletions
diff --git a/python/interaction.py b/python/interaction.py
index c1c55095..fe370008 100644
--- a/python/interaction.py
+++ b/python/interaction.py
@@ -486,6 +486,56 @@ class DirectoryNameField:
self._result = value
+class CheckboxField:
+ """
+ ``CheckboxField`` prompts the user to choose a yes/no option in a checkbox.
+ Result is stored in self.result as a boolean value.
+
+ :param str prompt: Prompt to be presented to the user
+ :param bool default: Default state of the checkbox (False == unchecked, True == checked)
+ """
+ def __init__(self, prompt, default):
+ self._prompt = prompt
+ self._result = None
+ self._default = default
+
+ def _fill_core_struct(self, value):
+ value.type = FormInputFieldType.CheckboxFormField
+ value.prompt = self._prompt
+ value.hasDefault = True
+ value.intDefault = 1 if self._default else 0
+
+ def _fill_core_result(self, value):
+ value.intResult = 1 if self.result else 0
+
+ def _get_result(self, value):
+ self._result = value.intResult != 0
+
+ @property
+ def prompt(self):
+ return self._prompt
+
+ @prompt.setter
+ def prompt(self, value):
+ self._prompt = value
+
+ @property
+ def result(self):
+ return self._result
+
+ @result.setter
+ def result(self, value):
+ self._result = value
+
+ @property
+ def default(self):
+ return self._default
+
+ @default.setter
+ def default(self, value):
+ self._default = value
+
+
class InteractionHandler:
_interaction_handler = None
@@ -505,6 +555,7 @@ class InteractionHandler:
self._cb.getOpenFileNameInput = self._cb.getOpenFileNameInput.__class__(self._get_open_filename_input)
self._cb.getSaveFileNameInput = self._cb.getSaveFileNameInput.__class__(self._get_save_filename_input)
self._cb.getDirectoryNameInput = self._cb.getDirectoryNameInput.__class__(self._get_directory_name_input)
+ self._cb.getCheckboxInput = self._cb.getCheckboxInput.__class__(self._get_checkbox_input)
self._cb.getFormInput = self._cb.getFormInput.__class__(self._get_form_input)
self._cb.showMessageBox = self._cb.showMessageBox.__class__(self._show_message_box)
self._cb.openUrl = self._cb.openUrl.__class__(self._open_url)
@@ -650,6 +701,16 @@ class InteractionHandler:
except:
log_error(traceback.format_exc())
+ def _get_checkbox_input(self, ctxt, result, prompt, default_choice):
+ try:
+ value = self.get_checkbox_input(prompt, default_choice)
+ if value is None:
+ return False
+ result[0] = value
+ return True
+ except:
+ log_error(traceback.format_exc())
+
def _get_form_input(self, ctxt, fields, count, title):
try:
field_objs = []
@@ -714,6 +775,14 @@ class InteractionHandler:
default=fields[i].stringDefault if fields[i].hasDefault else None
)
)
+ elif fields[i].type == FormInputFieldType.CheckboxFormField:
+ log_error(fields[i].hasDefault)
+ field_objs.append(
+ CheckboxField(
+ fields[i].prompt,
+ default=fields[i].intDefault != 0 if fields[i].hasDefault else None
+ )
+ )
else:
field_objs.append(LabelField(fields[i].prompt))
if not self.get_form_input(field_objs, title):
@@ -795,6 +864,9 @@ class InteractionHandler:
def get_directory_name_input(self, prompt, default_name):
return get_text_line_input(prompt, "Select Directory")
+ def get_checkbox_input(self, prompt, default_choice):
+ return get_checkbox_input(prompt, "Choose Option(s)", default_choice)
+
def get_form_input(self, fields, title):
return False
@@ -1361,6 +1433,22 @@ def get_directory_name_input(prompt: str, default_name: str = ""):
core.free_string(value)
return result.decode("utf-8")
+def get_checkbox_input(prompt: str, title: str, default: bool = False):
+ """
+ ``get_checkbox_input`` prompts the user for a checkbox input
+ :param prompt: String to prompt with
+ :param title: Title of the window when executed in the UI
+ :param default: Optional default state for the checkbox (false == unchecked, true == checked), False if not set.
+ :rtype: bool indicating the state of the checkbox
+ """
+ default_state = ctypes.c_int64()
+ default_state.value = 1 if default else 0
+ value = ctypes.c_int64()
+ if not core.BNGetCheckboxInput(value, prompt, title, default_state):
+ return None
+ result = value.value
+ assert result is not None
+ return result != 0
def get_form_input(fields, title):
"""
@@ -1382,6 +1470,7 @@ def get_form_input(fields, title):
OpenFileNameField Prompt for file to open
SaveFileNameField Prompt for file to save to
DirectoryNameField Prompt for directory name
+ CheckboxFormField Prompt for a checkbox
===================== ===================================================
This API is flexible and works both in the UI via a pop-up dialog and on the command-line.