=============
Highlights of this release
--------------------------
This release features some significant refactoring and reorganisation of the
Pyface API aimed at making it generally more coherent. Specific changes
include:
* adding intermediate interfaces and classes to collect common roles and
behaviours.
* adding hooks to control widget sizing behaviour within layouts/sizers.
* deprecating behavior where a class creates the underlying toolkit widget in
the __init__ method. This was done by a small minority of Widget classes,
now all widgets are able to use two-step creation (first the
instance, then the toolkit object via the create() method).
* creating Qt versions of some widgets, and filling in some gaps in widget
types (particularly for Fields)
* providing image classes that wrap PIL images and NumPy arrays that allow
dynamic images and icons in addition to the resource-based versions.
* providing a toolkit-independent Font class and corresponding trait that
supports similar use-cases to the existing TraitsUI Font trait.
* extracting the menu and toolbar Schema system from Tasks and making it more
generally useable.
All changes should be backwards compatible, and deprecated APIs have a clear
path forward.
Additionally, this release adds experimental support for Qt 6 in the pyface.qt
API. Downstream packages can use the "pyqt6" and "pyside6" values for
``QT_API`` and CI is being run and passing with PySide6. We generally plan to
move the default development environment to Python 3.8 and PySide6 over the
next few months.
Corresponding to this, PyQt4 support is deprecated, CI is no longer being run
for PyQt4 (which has been at end-of-life since 2015) and remaining support for
PyQt4 will be removed in the next major release.
Detailed changes
----------------
Thanks to:
* Aaron Ayres
* Kit Choi
* Nicola Di Mitri
* Mark Dickinson
* Rahul Poruri
* Diego Ramirez
* Palash Vishnani
* Corran Webster
Enhancements
* Make Action Schemas a generic feature, not specific to Tasks (1076, 1079)
* Add a FontDialog class (1067)
* Allow experimental use of Qt6 backends (1050, 1057, 1059)
* Add DropHandler classes to public API (1049)
* Make Color and Font traits available in pyface.ui_traits and no longer import
them from traits.api (1043)
* Add multi-file selection for IFileDialog (1031)
* Support widgets and context menus for any concrete widget (1019, 1020,
1066)
* Add an ILayoutWidget interface and LayoutWidget base class for widgets which
can be used as layout/sizer items and refactor appropriate classes to use
it (1016, 1018)
* Add an _initialize_control method to base IWidget interface (1013)
* Deprecate creation of widgets in __init__, use separate create call (993)
* Add ILayeredPanel and Qt implementation of LayeredPanel (982)
* Improvements to PythonEditor and PythonWidget classes (980)
* Improvements to SplitWidget widget (977)
* Improvements to HeadingText widget (976)
* Add toggle field widget classes (962)
* Improvements to image support allowing dynamic images from PIL, NumPy (693,
959, 960, 970, 997, 1002, 1004)
* Further conversion to use observe system (954, 963, 985, 1005, 1026)
* Replace use of pkg_resources by importlib (943, 991, 994, 1000)
* Remove code branches for unsupported toolkit versions (938, 939)
* Replace uses of sys.exc_traceback with sys.exc_info()[2] (936)
* Replace old trait handlers with the new equivalents (931, 1041, 1043)
* Add a text_format argument to MessageDialogs for Qt (907)
* Add an enum type for DataViews (782)
* Add a ColorDialog class (711, 1065, 1066)
* Add a toolkit-independent Font class and associated traits (609, 1066)
* Add a TimeField widget class (507)
Fixes
* Support for PyQt6-style enums (1098)
* Fix an issue with circular references in EventFilters (1093)
* Select colors from palettes for better dark mode support (1089)
* Fix an issue with undocked dock panes not updating (1044)
* Remove uses of old trait constructors such as Either and Trait() (728,
1041)
* Fix SplitEditorAreaPane tab label and tooltip update bugs (1038)
* Fix broken local imports (1034, 1036)
* Fix active_task observer (1026)
* Fixes to make examples work (988)
* Better support for newer Python and Qt versions (958, 964, 965)
* Fix use of wx.StyledTextControl (951)
* Fix sizing of ImageButton when image changes (932)
* Fixes for observe integration (915)
* Code quality improvements (914, 919, 920, 921, 922, 923, 935, 945,
946, 947, 920, 921, 922, 923, 1007, 1008, 1046, 1048, 1070, 1072,
1074)
* Fix DockItem trait definitions (902)
Documentation
* Update discussion of toolkit support (1101)
* Documentation for standard dialogs (1053)
* Improvments to GUITestAssistant documenation (1047)
* Clean up unused links (1012)
* Documentation for ImageLibrary system (1001)
* Documentation for GuiTestAssistant and ModalDialogTester (933)
* Add documentation for contents of API modules (903)
Build, Tests and Continuous Integration
* Ensure tests run cleanly in Python 3.8 and when some packages missing (1090)
* Flake8 style check in CI (1073)
* Use most recent EDM version (1058)
* Support MacOS Big Sur in CI (1056)
* Add flake8 command to etstool.py (1027)
* Rename "master" branch to "main" (1011)
* Tests for ImageLibrary system (1003)
* Allow manual triggering of cron CI jobs (975)
* Generic modules for testing classes (926, 956)
* Move CI to github actions (950, 961, 967, 1056)
* Drop PyQt4 from CI (949, 955)
* Improvements to CI (908)