Skip to content

Releases: PlotPyStack/guidata

v3.14.4

02 Jun 13:49
v3.14.4
2a74138

Choose a tag to compare

guidata Version 3.14.4

🛠️ Bug fixes:

  • DataSetEditGroupBox / computed items: Fixed input field corruption when typing into a LineEditWidget whose DataSet contains other items declared via set_computed(...) (or any display.callback) — typing multiple characters in a row (e.g. 52 after selecting all) was silently truncated and re-interpreted between keystrokes (producing 5.02 instead of 52, or 0.0.25 instead of 0.25). The reactive update of computed siblings was recursively re-entering the same callback with a different exclusion target and overwriting the field the user was editing. Bug introduced in v3.13.0 (commit 0af365e, "Add support for computed properties in datasets") (fixes Issue #104)
  • High-DPI display scaling: Enabled automatic high-DPI scaling attributes (AA_EnableHighDpiScaling, AA_UseHighDpiPixmaps, HighDpiScaleFactorRoundingPolicy.PassThrough) before QApplication creation in qapplication() — on Qt5, UI elements were not scaled on high-DPI monitors (150%/200%/300% Windows display scaling), making text and widgets appear disproportionately small. Qt6 already enables these by default, so the calls are no-ops there. This single change resolves a large portion of visible symptoms downstream (PlotPy, PythonQwt, DataLab) (partial fix for Issue #101)
  • CheckBoxWidget clipping: Fixed checkbox visual clipping when the checkbox text is empty — in mixed-widget grid layouts (especially at high DPI), the checkbox's natural height was smaller than other input widgets (QComboBox, QLineEdit), causing it to be cut off. The minimum height is now aligned to a standard input widget height
  • gbuild CLI command: Fixed gbuild entry point referencing a main function that did not exist in securebuild.py — running the gbuild command after installing guidata raised an AttributeError. The argument parsing code was moved from a top-level if __name__ block into a proper main() function (fixes Issue #99)
  • Cleanup utility (gclean): Fixed clean_wix_installer_files removing git-tracked files (e.g. .bmp, .wxs templates) when their extension matched generated artefact patterns — tracked files are now excluded from glob-based removal

♻️ Internal changes:

  • Debug environment variable: Renamed debug environment variable from DEBUG to GUIDATA_DEBUG to avoid collisions with unrelated tooling or third-party conventions that also use the generic DEBUG name

v3.14.3

20 Apr 08:19

Choose a tag to compare

guidata Version 3.14.3

🛠️ Bug fixes:

  • FilesOpenItem: Fixed AttributeError raised when calling from_string(None) and TypeError raised when serializing an item whose value was never set — None values are now handled gracefully (empty list / empty sequence)
  • FilesOpenItem: Replaced unsafe eval() call with ast.literal_eval() when parsing list-literal strings — eliminates an arbitrary code execution risk when reading list-of-paths values from configuration files or command-line arguments
  • PreviewTableModel (import wizard): Fixed mutable default argument bug where multiple PreviewTableModel instances shared the same underlying data list, causing cross-instance mutations
  • Dockable console: Fixed floating dock widget that could not be reopened after closing — when a dock widget was closed while floating (via the window's X button), it now automatically re-docks inside the main window when re-shown, instead of remaining hidden as a floating window
  • Dark mode toolbar overflow button: Fixed toolbar overflow button (the >> chevron) being invisible in dark mode — added proper QSS styling with gradient backgrounds and hover/pressed states for the qt_toolbar_ext_button

♻️ Internal changes:

  • Development environment: Added scripts/run_with_env.py utility to run commands within multiple Python environment contexts (WinPython, venv, etc.), with .env file support for PYTHONPATH configuration
  • Translation file cleanup: Enhanced PO file cleanup to remove additional headers (PO-Revision-Date, Generated-By, Project-Id-Version, Report-Msgid-Bugs-To, Language-Team) that cause unnecessary diffs in version control. Also cleanup the POT template file after extraction.

v3.14.2

26 Feb 09:13

Choose a tag to compare

guidata Version 3.14.2

🛠️ Bug fixes:

  • Old QtPy compatibility: Fixed ImportError when using QtPy < 2.0.0 (guidata supports QtPy >= 1.9) — the PYSIDE6 constant was not available before QtPy 2.0.0
  • MultipleChoiceItem validation: Fixed DataItemValidationError when accepting a dialog containing a MultipleChoiceItem with validation enabled — the widget was passing a list instead of the expected tuple, causing a validation failure when closing the dialog (fixes Issue #98)
  • PyQt6 compatibility: Fixed RuntimeError: wrapped C/C++ object has been deleted when closing dialogs in automated tests with PyQt6 — exec_dialog() now checks object validity before calling deleteLater(), since Qt may already have destroyed the C++ object during exec()

v3.14.1

14 Feb 15:29
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

guidata Version 3.14.1

  • Added official support for Python 3.14

🛠️ Bug fixes:

  • PySide6 compatibility: Added is_qobject_valid() utility function to safely check if a QObject's underlying C++ object is still valid
    • With PySide6, accessing methods on a deleted C++ object causes a segfault instead of raising RuntimeError (as PyQt does)
    • Uses shiboken.isValid() on PySide2/PySide6 and objectName() try/except on PyQt5/PyQt6
    • Updated close_widgets_and_quit() to use is_qobject_valid() instead of a bare try/except for widget validity checks
    • Updated close_dialog_and_quit() to check widget validity before and after processEvents(), preventing segfaults when Qt deletes widgets during event processing

♻️ Code improvements:

  • Refactored refresh action lambda in IconBrowserWindow for improved readability
  • Simplified widget name retrieval in close_widgets_and_quit() function

v3.14.0

31 Jan 17:34
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

Version 3.14

guidata Version 3.14.0

✨ New features:

  • Jupyter notebook HTML representation: Added rich HTML display support for DataSet and LabeledEnum objects

    • New _repr_html_() method on DataSet class for styled HTML table rendering in Jupyter notebooks
    • New _repr_html_() method on LabeledEnum class for formatted display of enum values with labels
    • CSS styling with .guidata-dataset-table class for consistent visual appearance
    • Automatically called by Jupyter when displaying objects as cell output
    • HTML representation now includes attribute names in a third column for easier programmatic access
  • Interactive Python experience: Improved DataSet representation in Python interpreters

    • New __repr__() method on DataSet class shows attribute names instead of labels
    • Makes it easy to discover attribute names when working interactively in a Python shell or notebook
    • print(dataset) still shows user-friendly labels, while repr(dataset) or just typing the variable shows attribute names
  • Secure build utility: Added --prebuild option to run commands before package build

    • New --prebuild command-line argument for guidata.utils.securebuild
    • Executes custom commands in the temporary build directory before python -m build
    • Useful for compiling translations or other pre-build tasks in the clean clone environment
    • Automatically replaces python with the current interpreter to avoid PATH issues on Windows
    • Converts relative PYTHONPATH entries to absolute paths for correct module resolution
    • Usage: python -m guidata.utils.securebuild --prebuild "python -m guidata.utils.translations compile --name myapp --directory ."
  • New cleanup-doc command for Sphinx documentation translation files

    • Added cleanup_doc_translations() function to clean up .po files in doc/locale/ directories
    • Removes POT-Creation-Date and Last-Translator headers from all Sphinx-generated translation files
    • Usage: python -m guidata.utils.translations cleanup-doc --directory .
    • Helps avoid merge conflicts when cherry-picking commits between branches (e.g., releasedevelop)
    • Optional --locale-dir argument to specify custom locale directory path (defaults to doc/locale)
  • Translation file generation: Ignore POT-Creation-Date and Last-Translator headers to reduce unnecessary diffs

    • Added _cleanup_po_file() helper function to remove the POT-Creation-Date and Last-Translator headers from generated .po files
    • This prevents spurious diffs in version control when regeneration occurs at different times
    • Integrated cleanup step into generate_translation_files() after .po file creation
    • Ensures cleaner translation file management and reduces noise in commit history
  • Icon Browser utility: Added a new GUI tool for browsing and exploring icon collections

    • New guidata.widgets.iconbrowser module with IconBrowserWindow widget
    • Command-line tool: giconbrowser [folder] or python -m guidata.widgets.iconbrowser [folder]
    • Features a split-pane interface with tree view for folder navigation and icon grid display
    • Tree view shows folder hierarchy with open/closed folder icons and file counts
    • Single-click on icons opens file location in system file explorer (Windows/macOS/Linux)
    • Adjustable thumbnail sizes (16-256 pixels) via toolbar
    • Supports PNG, SVG, ICO, JPG, GIF, and BMP formats
    • Responsive grid layout adapts to window resizing
    • Useful for developers managing icons for their applications and libraries
    • Refresh action to toolbar for reloading current folder after external changes
  • Cleanup utility enhancements: Improved the guidata.utils.cleanup module

    • Added case sensitivity option for glob patterns (default: case-insensitive matching)
    • Improved module name detection from pyproject.toml when name differs from directory name
    • Enhanced documentation cleanup to support removing PDF files with library name prefix
    • These improvements make the cleanup utility more robust and flexible for different project structures

v3.13.4

03 Dec 17:57
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

Version 3.13

Version 3.13.4 (2025-12-03)

🛠️ Bug fixes:

  • BoolItem numpy compatibility: Fixed numpy.bool_ type conversion issue

    • BoolItem now ensures all assigned values are converted to Python bool type
    • Added __set__ override to convert numpy.bool_ values to native Python bool
    • Fixes compatibility issues with Qt APIs that strictly require Python bool (e.g., QAction.setChecked())
    • Prevents TypeError: setChecked(self, a0: bool): argument 1 has unexpected type 'numpy.bool'
    • Affects applications using BoolItem values with Qt widgets after HDF5 deserialization
    • Maintains backward compatibility as bool(bool) is a no-op
    • This closes Issue #96 - BoolItem: numpy.bool_ compatibility fix
  • Fix documentation build error due to the fact that Qt is needed for some parts of the building process

guidata Version 3.13.3 (2025-11-10)

🛠️ Bug fixes:

  • ButtonItem callbacks: Fixed critical regression breaking callbacks with 4 parameters
    • In v3.13.2, the auto-apply feature unconditionally passed a 5th parameter (trigger_auto_apply) to all ButtonItem callbacks
    • This broke all existing callbacks expecting only 4 parameters (instance, item, value, parent)
    • Now uses inspect.signature() to check callback parameter count at runtime
    • Callbacks with fewer than 5 parameters receive only the standard 4 arguments
    • Callbacks with 5+ parameters receive the additional trigger_auto_apply function
    • Maintains full backward compatibility while supporting the new auto-apply feature
    • Fixes TypeError: callback() takes 4 positional arguments but 5 were given

guidata Version 3.13.2 (2025-11-03)

✨ New features:

  • DataSet setter methods: Added public setter methods for title, comment, and icon

    • New set_title() method: Sets the DataSet's title
    • New set_comment() method: Sets the DataSet's comment
    • New set_icon() method: Sets the DataSet's icon
    • These methods provide a clean public API to modify DataSet metadata previously stored in private attributes
    • Useful for applications that need to dynamically update DataSet metadata programmatically
  • Auto-apply for DictItem and FloatArrayItem in DataSetEditGroupBox: Improved user experience when editing dictionaries and arrays

    • When a DictItem or FloatArrayItem is modified within a DataSetEditGroupBox (with an Apply button), changes are now automatically applied when the editor dialog is validated
    • Previously, users had to click "Save & Close" in the dictionary/array editor, then click the "Apply" button in the dataset widget layout
    • Now, clicking "Save & Close" automatically triggers the apply action, making changes immediately effective
    • Implementation: The auto-apply trigger function is passed as an optional 5th parameter to button callbacks
    • This behavior only applies to dataset layouts with an Apply button (DataSetEditGroupBox), not to standalone editors
    • Provides more intuitive workflow and reduces the number of clicks required to apply changes
    • Affects both DictItem (dictionary editor) and FloatArrayItem (array editor)

🛠️ Bug fixes:

  • Git report utility: Fixed UnicodeDecodeError on Windows when commit messages contain non-ASCII characters

    • The guidata.utils.gitreport module now explicitly uses UTF-8 encoding when reading Git command output
    • Previously, on Windows systems with cp1252 default encoding, Git commit messages containing Unicode characters (emoji, accented characters, etc.) would cause a UnicodeDecodeError
    • Fixed by adding encoding="utf-8" parameter to all subprocess.check_output() calls in _extract_git_information()
    • This ensures proper decoding of Git output which is always UTF-8 encoded, regardless of the system's default encoding
  • DataSet.to_html(): Improved color contrast for dark mode

    • Changed title and comment color from standard blue (#0000FF) to a lighter shade (#5294e2)
    • Provides better visibility in dark mode while maintaining good appearance in light mode
    • Affects the HTML representation of DataSets displayed in applications with dark themes
  • ChoiceItem validation: Fixed tuple/list equivalence during JSON deserialization

    • When a ChoiceItem has tuple values (e.g., ((10, 90), "10% - 90%")), JSON serialization converts tuples to lists
    • During deserialization, validation failed because [10, 90] was not recognized as equivalent to (10, 90)
    • Modified ChoiceItem.check_value() to compare sequence contents when both the value and choice are sequences (list/tuple)
    • This ensures that ChoiceItems with tuple values work correctly with dataset_to_json()/json_to_dataset() round-trips
    • Added regression test in test_choice_tuple_serialization.py
  • Fix the AboutInfo.about method: renamed parameter addinfos to addinfo for consistency

guidata Version 3.13.1 (2025-10-28)

🛠️ Bug fixes:

  • DataSet.to_string(): Fixed missing labels for BoolItem when only text is provided

    • When a BoolItem is defined with only the text parameter (first argument) and no explicit label parameter (second argument), the label was displayed as empty in to_string() output, resulting in : ☐ or : ☑ instead of the expected Item text: ☐
    • Added fallback logic to use the text property as label when label is empty, matching the behavior already implemented in to_html()
    • This ensures consistency between text and HTML representations of DataSets containing BoolItems
  • Qt scraper: Fixed thumbnail generation for sphinx-gallery examples in subdirectories

    • The qt_scraper now correctly detects and handles examples organized in subsections (e.g., examples/features/, examples/advanced/)
    • Thumbnails are now saved in the correct subdirectory-specific images/thumb/ folders instead of the top-level directory
    • Image paths in generated RST files now include the subdirectory path
    • Added new _get_example_subdirectory() helper function to extract subdirectory from source file path and avoid code duplication

guidata Version 3.13.0 (2025-10-24)

✨ New features:

  • JSON Serialization for DataSets: Added new functions for serializing/deserializing DataSet objects to/from JSON:
    • New dataset.dataset_to_json() function: Serialize a DataSet instance to a JSON string
    • New dataset.json_to_dataset() function: Deserialize a JSON string back to a DataSet instance
    • The JSON format includes class module and name information for automatic type restoration
    • Enables easy data interchange, storage, and transmission of DataSet configurations
    • Example usage:
from guidata.dataset import dataset_to_json, json_to_dataset

# Serialize to JSON
json_str = dataset_to_json(my_dataset)

# Deserialize from JSON
restored_dataset = json_to_dataset(json_str)
  • DataSet Class-Level Configuration: Added support for configuring DataSet metadata at the class definition level using __init_subclass__:
    • DataSet title, comment, icon, and readonly state can now be configured directly in the class inheritance declaration
    • Uses Python's standard __init_subclass__ mechanism (PEP 487) for explicit, type-safe configuration
    • Configuration is embedded in the class definition, making it impossible to accidentally remove or forget
    • Instance parameters can still override class-level settings for flexibility
    • Improved docstring handling: When title is explicitly set (even to empty string), the entire docstring becomes the comment
    • Backward compatibility: When no title is set at all, docstring first line is still used as title (old behavior)
    • Example usage:
class MyParameters(DataSet,
                    title="Analysis Parameters",
                    comment="Configure your analysis options",
                    icon="params.png"):
    """This docstring is for developer documentation only"""

    threshold = FloatItem("Threshold", default=0.5)
    method = StringItem("Method", default="auto")

# No need to pass title when instantiating
params = MyParameters()

# Can still override at instance level if needed
params_custom = MyParameters(title="Custom Title")
  • Priority order: instance parameter > class-level config > empty/default

  • Makes it explicit when title is intentionally set vs. accidentally left empty

  • Improves code clarity by separating user-facing metadata from developer documentation

  • SeparatorItem: Added a new visual separator data item for better dataset organization:

    • New SeparatorItem class allows inserting visual separators between sections in datasets
    • In textual representation, separators appear as a line of dashes (--------------------------------------------------)
    • In GUI dialogs, separators display as horizontal gray lines spanning the full width
    • Separators don't store any data - they are purely visual elements for organizing forms
    • Example usage:
class PersonDataSet(DataSet):
    name = StringItem("Name", default="John Doe")
    age = IntItem("Age", default=30)

    # Visual separator with label
    sep1 = SeparatorItem("Contact Information")

    email = StringItem("Email", default="john@example.com")
    phone = StringItem("Phone", default="123-456-7890")

    # Visual separator without label
    sep2 = SeparatorItem()

    notes = StringItem("Notes", default="Additional notes")
  • Improves readability and visual organization of complex datasets

  • Fully integrated with existing DataSet serialization/deserialization (separators are ignored during save/load)

  • Compatible with both edit and show modes in dataset dialogs

  • Computed Items: Added support for computed/calculated data items in datasets:

    • New ...
Read more

v3.13.3

12 Nov 15:46
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

Version 3.13.3

🛠️ Bug fixes:

  • ButtonItem callbacks: Fixed critical regression breaking callbacks with 4 parameters
    • In v3.13.2, the auto-apply feature unconditionally passed a 5th parameter (trigger_auto_apply) to all ButtonItem callbacks
    • This broke all existing callbacks expecting only 4 parameters (instance, item, value, parent)
    • Now uses inspect.signature() to check callback parameter count at runtime
    • Callbacks with fewer than 5 parameters receive only the standard 4 arguments
    • Callbacks with 5+ parameters receive the additional trigger_auto_apply function
    • Maintains full backward compatibility while supporting the new auto-apply feature
    • Fixes TypeError: callback() takes 4 positional arguments but 5 were given

Version 3.13.2

✨ New features:

  • DataSet setter methods: Added public setter methods for title, comment, and icon

    • New set_title() method: Sets the DataSet's title
    • New set_comment() method: Sets the DataSet's comment
    • New set_icon() method: Sets the DataSet's icon
    • These methods provide a clean public API to modify DataSet metadata previously stored in private attributes
    • Useful for applications that need to dynamically update DataSet metadata programmatically
  • Auto-apply for DictItem and FloatArrayItem in DataSetEditGroupBox: Improved user experience when editing dictionaries and arrays

    • When a DictItem or FloatArrayItem is modified within a DataSetEditGroupBox (with an Apply button), changes are now automatically applied when the editor dialog is validated
    • Previously, users had to click "Save & Close" in the dictionary/array editor, then click the "Apply" button in the dataset widget layout
    • Now, clicking "Save & Close" automatically triggers the apply action, making changes immediately effective
    • Implementation: The auto-apply trigger function is passed as an optional 5th parameter to button callbacks
    • This behavior only applies to dataset layouts with an Apply button (DataSetEditGroupBox), not to standalone editors
    • Provides more intuitive workflow and reduces the number of clicks required to apply changes
    • Affects both DictItem (dictionary editor) and FloatArrayItem (array editor)

🛠️ Bug fixes:

  • Git report utility: Fixed UnicodeDecodeError on Windows when commit messages contain non-ASCII characters

    • The guidata.utils.gitreport module now explicitly uses UTF-8 encoding when reading Git command output
    • Previously, on Windows systems with cp1252 default encoding, Git commit messages containing Unicode characters (emoji, accented characters, etc.) would cause a UnicodeDecodeError
    • Fixed by adding encoding="utf-8" parameter to all subprocess.check_output() calls in _extract_git_information()
    • This ensures proper decoding of Git output which is always UTF-8 encoded, regardless of the system's default encoding
  • DataSet.to_html(): Improved color contrast for dark mode

    • Changed title and comment color from standard blue (#0000FF) to a lighter shade (#5294e2)
    • Provides better visibility in dark mode while maintaining good appearance in light mode
    • Affects the HTML representation of DataSets displayed in applications with dark themes
  • ChoiceItem validation: Fixed tuple/list equivalence during JSON deserialization

    • When a ChoiceItem has tuple values (e.g., ((10, 90), "10% - 90%")), JSON serialization converts tuples to lists
    • During deserialization, validation failed because [10, 90] was not recognized as equivalent to (10, 90)
    • Modified ChoiceItem.check_value() to compare sequence contents when both the value and choice are sequences (list/tuple)
    • This ensures that ChoiceItems with tuple values work correctly with dataset_to_json()/json_to_dataset() round-trips
    • Added regression test in test_choice_tuple_serialization.py
  • Fix the AboutInfo.about method: renamed parameter addinfos to addinfo for consistency

Version 3.13.1

🛠️ Bug fixes:

  • DataSet.to_string(): Fixed missing labels for BoolItem when only text is provided

    • When a BoolItem is defined with only the text parameter (first argument) and no explicit label parameter (second argument), the label was displayed as empty in to_string() output, resulting in : ☐ or : ☑ instead of the expected Item text: ☐
    • Added fallback logic to use the text property as label when label is empty, matching the behavior already implemented in to_html()
    • This ensures consistency between text and HTML representations of DataSets containing BoolItems
  • Qt scraper: Fixed thumbnail generation for sphinx-gallery examples in subdirectories

    • The qt_scraper now correctly detects and handles examples organized in subsections (e.g., examples/features/, examples/advanced/)
    • Thumbnails are now saved in the correct subdirectory-specific images/thumb/ folders instead of the top-level directory
    • Image paths in generated RST files now include the subdirectory path
    • Added new _get_example_subdirectory() helper function to extract subdirectory from source file path and avoid code duplication

Version 3.13.0

✨ New features:

  • JSON Serialization for DataSets: Added new functions for serializing/deserializing DataSet objects to/from JSON:
    • New dataset.dataset_to_json() function: Serialize a DataSet instance to a JSON string
    • New dataset.json_to_dataset() function: Deserialize a JSON string back to a DataSet instance
    • The JSON format includes class module and name information for automatic type restoration
    • Enables easy data interchange, storage, and transmission of DataSet configurations
    • Example usage:
from guidata.dataset import dataset_to_json, json_to_dataset

# Serialize to JSON
json_str = dataset_to_json(my_dataset)

# Deserialize from JSON
restored_dataset = json_to_dataset(json_str)
  • DataSet Class-Level Configuration: Added support for configuring DataSet metadata at the class definition level using __init_subclass__:
    • DataSet title, comment, icon, and readonly state can now be configured directly in the class inheritance declaration
    • Uses Python's standard __init_subclass__ mechanism (PEP 487) for explicit, type-safe configuration
    • Configuration is embedded in the class definition, making it impossible to accidentally remove or forget
    • Instance parameters can still override class-level settings for flexibility
    • Improved docstring handling: When title is explicitly set (even to empty string), the entire docstring becomes the comment
    • Backward compatibility: When no title is set at all, docstring first line is still used as title (old behavior)
    • Example usage:
class MyParameters(DataSet,
                    title="Analysis Parameters",
                    comment="Configure your analysis options",
                    icon="params.png"):
    """This docstring is for developer documentation only"""

    threshold = FloatItem("Threshold", default=0.5)
    method = StringItem("Method", default="auto")

# No need to pass title when instantiating
params = MyParameters()

# Can still override at instance level if needed
params_custom = MyParameters(title="Custom Title")
  • Priority order: instance parameter > class-level config > empty/default

  • Makes it explicit when title is intentionally set vs. accidentally left empty

  • Improves code clarity by separating user-facing metadata from developer documentation

  • SeparatorItem: Added a new visual separator data item for better dataset organization:

    • New SeparatorItem class allows inserting visual separators between sections in datasets
    • In textual representation, separators appear as a line of dashes (--------------------------------------------------)
    • In GUI dialogs, separators display as horizontal gray lines spanning the full width
    • Separators don't store any data - they are purely visual elements for organizing forms
    • Example usage:
class PersonDataSet(DataSet):
    name = StringItem("Name", default="John Doe")
    age = IntItem("Age", default=30)

    # Visual separator with label
    sep1 = SeparatorItem("Contact Information")

    email = StringItem("Email", default="john@example.com")
    phone = StringItem("Phone", default="123-456-7890")

    # Visual separator without label
    sep2 = SeparatorItem()

    notes = StringItem("Notes", default="Additional notes")
  • Improves readability and visual organization of complex datasets

  • Fully integrated with existing DataSet serialization/deserialization (separators are ignored during save/load)

  • Compatible with both edit and show modes in dataset dialogs

  • Computed Items: Added support for computed/calculated data items in datasets:

    • New ComputedProp class allows defining items whose values are automatically calculated from other items
    • Items can be marked as computed using the set_computed(method_name) method
    • Computed items are automatically read-only and update in real-time when their dependencies change
    • Example usage:
class DataSet(gdt.DataSet):

    def compute_sum(self) -> float:
        return self.x + self.y

    x = gdt.FloatItem("X", default=1.0)
    y = gdt.FloatItem("Y", default=2.0)
    sum_xy = gdt.FloatItem("Sum", default=0.0).set_computed(compute_sum)
  • Computed items automatically display with visual distinction (neutral background color) in GUI forms

  • Supports complex calculations and can access any other items in the dataset

  • Improved Visual Distinction for Read-only Fields: Enhanced user interface to clearly identify non-editable fields:

    • Read-only text fields now display with a subtle gray background and darker text color
    • Visual styling automatica...
Read more

v3.13.2

06 Nov 07:55
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

Version 3.13.2

✨ New features:

  • DataSet setter methods: Added public setter methods for title, comment, and icon

    • New set_title() method: Sets the DataSet's title
    • New set_comment() method: Sets the DataSet's comment
    • New set_icon() method: Sets the DataSet's icon
    • These methods provide a clean public API to modify DataSet metadata previously stored in private attributes
    • Useful for applications that need to dynamically update DataSet metadata programmatically
  • Auto-apply for DictItem and FloatArrayItem in DataSetEditGroupBox: Improved user experience when editing dictionaries and arrays

    • When a DictItem or FloatArrayItem is modified within a DataSetEditGroupBox (with an Apply button), changes are now automatically applied when the editor dialog is validated
    • Previously, users had to click "Save & Close" in the dictionary/array editor, then click the "Apply" button in the dataset widget layout
    • Now, clicking "Save & Close" automatically triggers the apply action, making changes immediately effective
    • Implementation: The auto-apply trigger function is passed as an optional 5th parameter to button callbacks
    • This behavior only applies to dataset layouts with an Apply button (DataSetEditGroupBox), not to standalone editors
    • Provides more intuitive workflow and reduces the number of clicks required to apply changes
    • Affects both DictItem (dictionary editor) and FloatArrayItem (array editor)

🛠️ Bug fixes:

  • Git report utility: Fixed UnicodeDecodeError on Windows when commit messages contain non-ASCII characters

    • The guidata.utils.gitreport module now explicitly uses UTF-8 encoding when reading Git command output
    • Previously, on Windows systems with cp1252 default encoding, Git commit messages containing Unicode characters (emoji, accented characters, etc.) would cause a UnicodeDecodeError
    • Fixed by adding encoding="utf-8" parameter to all subprocess.check_output() calls in _extract_git_information()
    • This ensures proper decoding of Git output which is always UTF-8 encoded, regardless of the system's default encoding
  • DataSet.to_html(): Improved color contrast for dark mode

    • Changed title and comment color from standard blue (#0000FF) to a lighter shade (#5294e2)
    • Provides better visibility in dark mode while maintaining good appearance in light mode
    • Affects the HTML representation of DataSets displayed in applications with dark themes
  • ChoiceItem validation: Fixed tuple/list equivalence during JSON deserialization

    • When a ChoiceItem has tuple values (e.g., ((10, 90), "10% - 90%")), JSON serialization converts tuples to lists
    • During deserialization, validation failed because [10, 90] was not recognized as equivalent to (10, 90)
    • Modified ChoiceItem.check_value() to compare sequence contents when both the value and choice are sequences (list/tuple)
    • This ensures that ChoiceItems with tuple values work correctly with dataset_to_json()/json_to_dataset() round-trips
    • Added regression test in test_choice_tuple_serialization.py
  • Fix the AboutInfo.about method: renamed parameter addinfos to addinfo for consistency

Version 3.13.1

🛠️ Bug fixes:

  • DataSet.to_string(): Fixed missing labels for BoolItem when only text is provided

    • When a BoolItem is defined with only the text parameter (first argument) and no explicit label parameter (second argument), the label was displayed as empty in to_string() output, resulting in : ☐ or : ☑ instead of the expected Item text: ☐
    • Added fallback logic to use the text property as label when label is empty, matching the behavior already implemented in to_html()
    • This ensures consistency between text and HTML representations of DataSets containing BoolItems
  • Qt scraper: Fixed thumbnail generation for sphinx-gallery examples in subdirectories

    • The qt_scraper now correctly detects and handles examples organized in subsections (e.g., examples/features/, examples/advanced/)
    • Thumbnails are now saved in the correct subdirectory-specific images/thumb/ folders instead of the top-level directory
    • Image paths in generated RST files now include the subdirectory path
    • Added new _get_example_subdirectory() helper function to extract subdirectory from source file path and avoid code duplication

Version 3.13.0

✨ New features:

  • JSON Serialization for DataSets: Added new functions for serializing/deserializing DataSet objects to/from JSON:
    • New dataset.dataset_to_json() function: Serialize a DataSet instance to a JSON string
    • New dataset.json_to_dataset() function: Deserialize a JSON string back to a DataSet instance
    • The JSON format includes class module and name information for automatic type restoration
    • Enables easy data interchange, storage, and transmission of DataSet configurations
    • Example usage:
from guidata.dataset import dataset_to_json, json_to_dataset

# Serialize to JSON
json_str = dataset_to_json(my_dataset)

# Deserialize from JSON
restored_dataset = json_to_dataset(json_str)
  • DataSet Class-Level Configuration: Added support for configuring DataSet metadata at the class definition level using __init_subclass__:
    • DataSet title, comment, icon, and readonly state can now be configured directly in the class inheritance declaration
    • Uses Python's standard __init_subclass__ mechanism (PEP 487) for explicit, type-safe configuration
    • Configuration is embedded in the class definition, making it impossible to accidentally remove or forget
    • Instance parameters can still override class-level settings for flexibility
    • Improved docstring handling: When title is explicitly set (even to empty string), the entire docstring becomes the comment
    • Backward compatibility: When no title is set at all, docstring first line is still used as title (old behavior)
    • Example usage:
class MyParameters(DataSet,
                    title="Analysis Parameters",
                    comment="Configure your analysis options",
                    icon="params.png"):
    """This docstring is for developer documentation only"""

    threshold = FloatItem("Threshold", default=0.5)
    method = StringItem("Method", default="auto")

# No need to pass title when instantiating
params = MyParameters()

# Can still override at instance level if needed
params_custom = MyParameters(title="Custom Title")
  • Priority order: instance parameter > class-level config > empty/default

  • Makes it explicit when title is intentionally set vs. accidentally left empty

  • Improves code clarity by separating user-facing metadata from developer documentation

  • SeparatorItem: Added a new visual separator data item for better dataset organization:

    • New SeparatorItem class allows inserting visual separators between sections in datasets
    • In textual representation, separators appear as a line of dashes (--------------------------------------------------)
    • In GUI dialogs, separators display as horizontal gray lines spanning the full width
    • Separators don't store any data - they are purely visual elements for organizing forms
    • Example usage:
class PersonDataSet(DataSet):
    name = StringItem("Name", default="John Doe")
    age = IntItem("Age", default=30)

    # Visual separator with label
    sep1 = SeparatorItem("Contact Information")

    email = StringItem("Email", default="john@example.com")
    phone = StringItem("Phone", default="123-456-7890")

    # Visual separator without label
    sep2 = SeparatorItem()

    notes = StringItem("Notes", default="Additional notes")
  • Improves readability and visual organization of complex datasets

  • Fully integrated with existing DataSet serialization/deserialization (separators are ignored during save/load)

  • Compatible with both edit and show modes in dataset dialogs

  • Computed Items: Added support for computed/calculated data items in datasets:

    • New ComputedProp class allows defining items whose values are automatically calculated from other items
    • Items can be marked as computed using the set_computed(method_name) method
    • Computed items are automatically read-only and update in real-time when their dependencies change
    • Example usage:
class DataSet(gdt.DataSet):

    def compute_sum(self) -> float:
        return self.x + self.y

    x = gdt.FloatItem("X", default=1.0)
    y = gdt.FloatItem("Y", default=2.0)
    sum_xy = gdt.FloatItem("Sum", default=0.0).set_computed(compute_sum)
  • Computed items automatically display with visual distinction (neutral background color) in GUI forms

  • Supports complex calculations and can access any other items in the dataset

  • Improved Visual Distinction for Read-only Fields: Enhanced user interface to clearly identify non-editable fields:

    • Read-only text fields now display with a subtle gray background and darker text color
    • Visual styling automatically adapts to your theme (light or dark mode)
    • Applies to computed fields, locked parameters, and any field marked as read-only
    • Makes it immediately clear which fields you can edit and which are display-only
    • Validation errors are still highlighted with orange background when they occur
  • DataSet HTML Export: Added HTML representation method for datasets:

    • New to_html() method on DataSet class generates HTML representation similar to Sigima's TableResult format
    • Features blue-styled title and comment section derived from the dataset's docstring
    • Two-column table layout with right-aligned item names and left-aligned values
    • Special handling for BoolItem with checkbox characters (☑ for True, ☐ for False)
    • Monospace font styling ...
Read more

v3.13.1

28 Oct 14:07
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

Version 3.13.1

🛠️ Bug fixes:

  • DataSet.to_string(): Fixed missing labels for BoolItem when only text is provided

    • When a BoolItem is defined with only the text parameter (first argument) and no explicit label parameter (second argument), the label was displayed as empty in to_string() output, resulting in : ☐ or : ☑ instead of the expected Item text: ☐
    • Added fallback logic to use the text property as label when label is empty, matching the behavior already implemented in to_html()
    • This ensures consistency between text and HTML representations of DataSets containing BoolItems
  • Qt scraper: Fixed thumbnail generation for sphinx-gallery examples in subdirectories

    • The qt_scraper now correctly detects and handles examples organized in subsections (e.g., examples/features/, examples/advanced/)
    • Thumbnails are now saved in the correct subdirectory-specific images/thumb/ folders instead of the top-level directory
    • Image paths in generated RST files now include the subdirectory path
    • Added new _get_example_subdirectory() helper function to extract subdirectory from source file path and avoid code duplication

Version 3.13.0

✨ New features:

  • JSON Serialization for DataSets: Added new functions for serializing/deserializing DataSet objects to/from JSON:
    • New dataset.dataset_to_json() function: Serialize a DataSet instance to a JSON string
    • New dataset.json_to_dataset() function: Deserialize a JSON string back to a DataSet instance
    • The JSON format includes class module and name information for automatic type restoration
    • Enables easy data interchange, storage, and transmission of DataSet configurations
    • Example usage:
from guidata.dataset import dataset_to_json, json_to_dataset

# Serialize to JSON
json_str = dataset_to_json(my_dataset)

# Deserialize from JSON
restored_dataset = json_to_dataset(json_str)
  • DataSet Class-Level Configuration: Added support for configuring DataSet metadata at the class definition level using __init_subclass__:
    • DataSet title, comment, icon, and readonly state can now be configured directly in the class inheritance declaration
    • Uses Python's standard __init_subclass__ mechanism (PEP 487) for explicit, type-safe configuration
    • Configuration is embedded in the class definition, making it impossible to accidentally remove or forget
    • Instance parameters can still override class-level settings for flexibility
    • Improved docstring handling: When title is explicitly set (even to empty string), the entire docstring becomes the comment
    • Backward compatibility: When no title is set at all, docstring first line is still used as title (old behavior)
    • Example usage:
class MyParameters(DataSet,
                    title="Analysis Parameters",
                    comment="Configure your analysis options",
                    icon="params.png"):
    """This docstring is for developer documentation only"""

    threshold = FloatItem("Threshold", default=0.5)
    method = StringItem("Method", default="auto")

# No need to pass title when instantiating
params = MyParameters()

# Can still override at instance level if needed
params_custom = MyParameters(title="Custom Title")
  • Priority order: instance parameter > class-level config > empty/default

  • Makes it explicit when title is intentionally set vs. accidentally left empty

  • Improves code clarity by separating user-facing metadata from developer documentation

  • SeparatorItem: Added a new visual separator data item for better dataset organization:

    • New SeparatorItem class allows inserting visual separators between sections in datasets
    • In textual representation, separators appear as a line of dashes (--------------------------------------------------)
    • In GUI dialogs, separators display as horizontal gray lines spanning the full width
    • Separators don't store any data - they are purely visual elements for organizing forms
    • Example usage:
class PersonDataSet(DataSet):
    name = StringItem("Name", default="John Doe")
    age = IntItem("Age", default=30)

    # Visual separator with label
    sep1 = SeparatorItem("Contact Information")

    email = StringItem("Email", default="john@example.com")
    phone = StringItem("Phone", default="123-456-7890")

    # Visual separator without label
    sep2 = SeparatorItem()

    notes = StringItem("Notes", default="Additional notes")
  • Improves readability and visual organization of complex datasets

  • Fully integrated with existing DataSet serialization/deserialization (separators are ignored during save/load)

  • Compatible with both edit and show modes in dataset dialogs

  • Computed Items: Added support for computed/calculated data items in datasets:

    • New ComputedProp class allows defining items whose values are automatically calculated from other items
    • Items can be marked as computed using the set_computed(method_name) method
    • Computed items are automatically read-only and update in real-time when their dependencies change
    • Example usage:
class DataSet(gdt.DataSet):

    def compute_sum(self) -> float:
        return self.x + self.y

    x = gdt.FloatItem("X", default=1.0)
    y = gdt.FloatItem("Y", default=2.0)
    sum_xy = gdt.FloatItem("Sum", default=0.0).set_computed(compute_sum)
  • Computed items automatically display with visual distinction (neutral background color) in GUI forms

  • Supports complex calculations and can access any other items in the dataset

  • Improved Visual Distinction for Read-only Fields: Enhanced user interface to clearly identify non-editable fields:

    • Read-only text fields now display with a subtle gray background and darker text color
    • Visual styling automatically adapts to your theme (light or dark mode)
    • Applies to computed fields, locked parameters, and any field marked as read-only
    • Makes it immediately clear which fields you can edit and which are display-only
    • Validation errors are still highlighted with orange background when they occur
  • DataSet HTML Export: Added HTML representation method for datasets:

    • New to_html() method on DataSet class generates HTML representation similar to Sigima's TableResult format
    • Features blue-styled title and comment section derived from the dataset's docstring
    • Two-column table layout with right-aligned item names and left-aligned values
    • Special handling for BoolItem with checkbox characters (☑ for True, ☐ for False)
    • Monospace font styling for consistent alignment and professional appearance
    • Proper handling of None values (displayed as "-") and nested ObjectItem datasets
    • Example usage:
class PersonDataSet(DataSet):
    """Personal Information Dataset

    This dataset collects basic personal information.
    """
    name = StringItem("Full Name", default="John Doe")
    age = IntItem("Age", default=30)
    active = BoolItem("Account Active", default=True)

dataset = PersonDataSet()
html_output = dataset.to_html()  # Generate HTML representation
  • Ideal for reports, documentation, and web-based dataset visualization

  • Comprehensive unit test coverage ensures reliability across all item types

  • guidata.configtools.get_icon:

    • This function retrieves a QIcon from the specified image file.
    • Now supports Qt standard icons (e.g. "MessageBoxInformation" or "DialogApplyButton").
  • Removed requirements-min.txt generation feature from guidata.utils.genreqs:

    • The minimal requirements feature was causing platform compatibility issues when specific minimum versions weren't available on all platforms (e.g., SciPy==1.7.3 works on Windows but fails on Linux)
    • Removed __extract_min_requirements() function and --min CLI flag
    • The genreqs tool now only generates requirements.txt and requirements.rst files
    • Updated documentation and MANIFEST.in files to remove references to requirements-min.txt
  • Added a readonly parameter to StringItem and TextItem in guidata.dataset.dataitems:

    • This allows these items to be set as read-only, preventing user edits in the GUI.
    • The readonly property is now respected in the corresponding widgets (see guidata.dataset.qtitemwidgets).
    • Example usage:
text = gds.TextItem("Text", default="Multi-line text", readonly=True)
string = gds.StringItem("String", readonly=True)
  • Note: Any other item type can also be turned into read-only mode by using set_prop("display", readonly=True). This is a generic mechanism, but the main use case is for StringItem and TextItem (hence the dedicated input parameter for convenience).

  • Issue #94 - Make dataset description text selectable

  • New guidata.utils.cleanup utility:

    • Added a comprehensive repository cleanup utility similar to genreqs and securebuild
    • Provides both programmatic API (from guidata.utils.cleanup import run_cleanup) and command-line interface (python -m guidata.utils.cleanup)
    • Automatically detects repository type and cleans Python cache files, build artifacts, temporary files, coverage data, backup files, and empty directories
    • Features comprehensive Google-style docstrings and full typing annotations
    • Cross-platform compatible with proper logging and error handling
    • Can be integrated into project workflows via VSCode tasks or build scripts
  • New validation modes for DataItem objects:

    • Validation modes allow you to control how DataItem values are validated when they are set.
    • ValidationMode.DISABLED: no validation is performed (default behavior, for backward compatibility)
    • ValidationMode.ENABLED: va...
Read more

v3.13.0

24 Oct 14:26
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

✨ New features:

  • JSON Serialization for DataSets: Added new functions for serializing/deserializing DataSet objects to/from JSON:
    • New dataset.dataset_to_json() function: Serialize a DataSet instance to a JSON string
    • New dataset.json_to_dataset() function: Deserialize a JSON string back to a DataSet instance
    • The JSON format includes class module and name information for automatic type restoration
    • Enables easy data interchange, storage, and transmission of DataSet configurations
    • Example usage:
from guidata.dataset import dataset_to_json, json_to_dataset

# Serialize to JSON
json_str = dataset_to_json(my_dataset)

# Deserialize from JSON
restored_dataset = json_to_dataset(json_str)
  • DataSet Class-Level Configuration: Added support for configuring DataSet metadata at the class definition level using __init_subclass__:
    • DataSet title, comment, icon, and readonly state can now be configured directly in the class inheritance declaration
    • Uses Python's standard __init_subclass__ mechanism (PEP 487) for explicit, type-safe configuration
    • Configuration is embedded in the class definition, making it impossible to accidentally remove or forget
    • Instance parameters can still override class-level settings for flexibility
    • Improved docstring handling: When title is explicitly set (even to empty string), the entire docstring becomes the comment
    • Backward compatibility: When no title is set at all, docstring first line is still used as title (old behavior)
    • Example usage:
class MyParameters(DataSet,
                    title="Analysis Parameters",
                    comment="Configure your analysis options",
                    icon="params.png"):
    """This docstring is for developer documentation only"""

    threshold = FloatItem("Threshold", default=0.5)
    method = StringItem("Method", default="auto")

# No need to pass title when instantiating
params = MyParameters()

# Can still override at instance level if needed
params_custom = MyParameters(title="Custom Title")
  • Priority order: instance parameter > class-level config > empty/default

  • Makes it explicit when title is intentionally set vs. accidentally left empty

  • Improves code clarity by separating user-facing metadata from developer documentation

  • SeparatorItem: Added a new visual separator data item for better dataset organization:

    • New SeparatorItem class allows inserting visual separators between sections in datasets
    • In textual representation, separators appear as a line of dashes (--------------------------------------------------)
    • In GUI dialogs, separators display as horizontal gray lines spanning the full width
    • Separators don't store any data - they are purely visual elements for organizing forms
    • Example usage:
class PersonDataSet(DataSet):
    name = StringItem("Name", default="John Doe")
    age = IntItem("Age", default=30)

    # Visual separator with label
    sep1 = SeparatorItem("Contact Information")

    email = StringItem("Email", default="john@example.com")
    phone = StringItem("Phone", default="123-456-7890")

    # Visual separator without label
    sep2 = SeparatorItem()

    notes = StringItem("Notes", default="Additional notes")
  • Improves readability and visual organization of complex datasets

  • Fully integrated with existing DataSet serialization/deserialization (separators are ignored during save/load)

  • Compatible with both edit and show modes in dataset dialogs

  • Computed Items: Added support for computed/calculated data items in datasets:

    • New ComputedProp class allows defining items whose values are automatically calculated from other items
    • Items can be marked as computed using the set_computed(method_name) method
    • Computed items are automatically read-only and update in real-time when their dependencies change
    • Example usage:
class DataSet(gdt.DataSet):

    def compute_sum(self) -> float:
        return self.x + self.y

    x = gdt.FloatItem("X", default=1.0)
    y = gdt.FloatItem("Y", default=2.0)
    sum_xy = gdt.FloatItem("Sum", default=0.0).set_computed(compute_sum)
  • Computed items automatically display with visual distinction (neutral background color) in GUI forms

  • Supports complex calculations and can access any other items in the dataset

  • Improved Visual Distinction for Read-only Fields: Enhanced user interface to clearly identify non-editable fields:

    • Read-only text fields now display with a subtle gray background and darker text color
    • Visual styling automatically adapts to your theme (light or dark mode)
    • Applies to computed fields, locked parameters, and any field marked as read-only
    • Makes it immediately clear which fields you can edit and which are display-only
    • Validation errors are still highlighted with orange background when they occur
  • DataSet HTML Export: Added HTML representation method for datasets:

    • New to_html() method on DataSet class generates HTML representation similar to Sigima's TableResult format
    • Features blue-styled title and comment section derived from the dataset's docstring
    • Two-column table layout with right-aligned item names and left-aligned values
    • Special handling for BoolItem with checkbox characters (☑ for True, ☐ for False)
    • Monospace font styling for consistent alignment and professional appearance
    • Proper handling of None values (displayed as "-") and nested ObjectItem datasets
    • Example usage:
class PersonDataSet(DataSet):
    """Personal Information Dataset

    This dataset collects basic personal information.
    """
    name = StringItem("Full Name", default="John Doe")
    age = IntItem("Age", default=30)
    active = BoolItem("Account Active", default=True)

dataset = PersonDataSet()
html_output = dataset.to_html()  # Generate HTML representation
  • Ideal for reports, documentation, and web-based dataset visualization

  • Comprehensive unit test coverage ensures reliability across all item types

  • guidata.configtools.get_icon:

    • This function retrieves a QIcon from the specified image file.
    • Now supports Qt standard icons (e.g. "MessageBoxInformation" or "DialogApplyButton").
  • Removed requirements-min.txt generation feature from guidata.utils.genreqs:

    • The minimal requirements feature was causing platform compatibility issues when specific minimum versions weren't available on all platforms (e.g., SciPy==1.7.3 works on Windows but fails on Linux)
    • Removed __extract_min_requirements() function and --min CLI flag
    • The genreqs tool now only generates requirements.txt and requirements.rst files
    • Updated documentation and MANIFEST.in files to remove references to requirements-min.txt
  • Added a readonly parameter to StringItem and TextItem in guidata.dataset.dataitems:

    • This allows these items to be set as read-only, preventing user edits in the GUI.
    • The readonly property is now respected in the corresponding widgets (see guidata.dataset.qtitemwidgets).
    • Example usage:
text = gds.TextItem("Text", default="Multi-line text", readonly=True)
string = gds.StringItem("String", readonly=True)
  • Note: Any other item type can also be turned into read-only mode by using set_prop("display", readonly=True). This is a generic mechanism, but the main use case is for StringItem and TextItem (hence the dedicated input parameter for convenience).

  • Issue #94 - Make dataset description text selectable

  • New guidata.utils.cleanup utility:

    • Added a comprehensive repository cleanup utility similar to genreqs and securebuild
    • Provides both programmatic API (from guidata.utils.cleanup import run_cleanup) and command-line interface (python -m guidata.utils.cleanup)
    • Automatically detects repository type and cleans Python cache files, build artifacts, temporary files, coverage data, backup files, and empty directories
    • Features comprehensive Google-style docstrings and full typing annotations
    • Cross-platform compatible with proper logging and error handling
    • Can be integrated into project workflows via VSCode tasks or build scripts
  • New validation modes for DataItem objects:

    • Validation modes allow you to control how DataItem values are validated when they are set.
    • ValidationMode.DISABLED: no validation is performed (default behavior, for backward compatibility)
    • ValidationMode.ENABLED: validation is performed, but warnings are raised instead of exceptions
    • ValidationMode.STRICT: validation is performed, and exceptions are raised if the value is invalid
    • To use these validation modes, you need to set the option:
from guidata.config import set_validation_mode, ValidationMode

set_validation_mode(ValidationMode.STRICT)
  • New check_callback parameter for FloatArrayItem:

    • The check_callback parameter allows you to specify a custom validation function for the item.
    • This function will be called to validate the item's value whenever it is set.
    • If the function returns False, the value will be considered invalid.
  • New allow_none parameter for DataItem objects:

    • The allow_none parameter allows you to specify whether None is a valid value for the item, which can be especially useful when validation modes are used.
    • If allow_none is set to True, None is considered a valid value regardless of other constraints.
    • If allow_none is set to False, None is considered an invalid value.
    • The default value for allow_none is False, except for FloatArrayItem, ColorItem and ChoiceItem and its subclasses, where it ...
Read more