# Version 3.14 #

## 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](https://github.com/PlotPyStack/guidata/issues/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()`

## 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

## 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., `release` ↔ `develop`)
  * 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
