|
fpGUI v2.0.0 is available
I'm glad to announce the v2.0.0 release of fpGUI.
Source Code
from SourceForge:
git clone git://git.code.sf.net/p/fpgui/code fpgui
from GitHub:
git clone git://github.com/graemeg/fpGUI.git
or
git clone https://github.com/graemeg/fpGUI.git
For more details, please visit the fpGUI home page:
http://fpgui.sourceforge.net
It only took 10 years since the last "official release". Oops. :-D
As you can imagine, a full changelog would be massive, so here
are some highlights of the larger work.
== AggPas (Anty-Grain Geomery) canvas ==
A 100% implemented in Object Pascal, 2D graphics canvas with
advanced anti-aliasing and transparency now included. You can
use the native platform graphic rendering, or opt for AggCanvas,
which gives consistent and high quality rendering on all platforms
== Alien Windows branch was merged in ==
Before, every widget had it's own platform window handle. Now, the
top-level window is the only window that has a native OS window
handle, and all widgets on that form has "virtual handles". This
means much less resources needed by the OS, more consistent
drawing, clipping and event handling. It also allows all widgets to
fully
support transparency.
== Layout Manager System ==
fpGUI now has a pluggable layout manager architecture inspired by
Java Swing's LayoutManager interface. Instead of manually
calculating widget positions, you can assign a layout manager to
any container and let it handle positioning, sizing, and resize
behaviour automatically.
The layout manager system coexists with the existing
Align/Anchors mechanism. It is entirely optional -- existing code
continues to work without changes.
Three layout managers are included:
* FlowLayout - arranges widgets in a horizontal row with
automatic wrapping
* BorderLayout - five-region docking (North/South/East/West
and Center)
* MigLayout - a full port of Java's MigLayout v11.4.2 (see
below)
A quick start guide is available at:
docs/layout_managers_quick_start.adoc
== MigLayout v11.4.2 Port ==
The headline feature is a comprehensive port of MigLayout v11.4.2
from Java to Object Pascal. MigLayout is one of the most powerful
and flexible layout managers available in the Java ecosystem, and
fpGUI now has a native implementation.
Supported features:
* Grid-based layout with automatic wrapping
* Column and row spanning (SpanX/SpanY)
* Growth priorities (GrowX/GrowY) for distributing extra space
* Cell alignment (left/center/right/top/bottom/fill)
* Docking (North/South/East/West) outside the normal grid
* Component gaps with physical unit support (px, mm, cm, inch,
pt)
* Platform-aware default gaps and sizing
* Fluent constraint API with automatic reference counting
* Constraint string parser for concise constraint definitions
* Debug visualisation overlay for layout inspection
* Multi-DPI / HiDPI support via logic units
* Platform-specific button ordering (OK/Cancel vs Cancel/OK)
The port includes 396 unit tests, all passing cleanly.
A comprehensive demo application is available at
examples/gui/lm-mig/ with eight feature panels demonstrating
basic grids, alignment, spanning, growth, complex layouts,
constraint parsing, button ordering, and docking.
== FPReport (FPC's reporting system) integrated into fpGUI ==
What to generate reports, display them in your application, export
them to PDF of PNG. Now it's possible.
== Widget Sizing API ==
A new sizing model separates a widget's intended size from its
actual rendered size.
Widgets now have:
* Width/Height - the developer's preferred (intended) size
* ActualWidth/ActualHeight - the actual rendered size after
layout
* PreferredSize - explicit preferred size that layout managers
read
* MinWidth/MinHeight - minimum size constraints
Some widgets (TfpgLabel, TfpgButton) now calculate their
preferred size automatically based on content and font, so
explicit sizing is often unnecessary.
SetPosition() has been deprecated in favour of setting individual
properties (Left, Top, Width, Height). The uidesigner has been
updated to generate the new property-based code.
== PasBuild Build System ==
The project has adopted PasBuild as its build tool. The
repository structure has been reorganised:
* Framework source: framework/src/main/pascal/corelib/
* Test source: framework/src/test/pascal/
* Build output: framework/target/
UIDesigner is now managed by the new build tool as well, and will
by default compile after the framework is compiled. You can
compile them independently if you want.
See PasBuild documentation for more details:
https://github.com/graemeg/PasBuild
Build commands:
pasbuild compile -p unix,agg (build framework)
pasbuild test -p unix,agg (run unit tests)
All example extrafpc.cfg files have been updated for the new
directory structure.
== macOS Cocoa Backend ==
An initial macOS Cocoa backend has been implemented
(experimental). This adds native macOS support alongside the
existing X11 and GDI backends.
== HiDPI and Rendering Improvements ==
* Fixed DPI scaling for widgets designed at 96dpi but displayed
at higher densities
* Focus rectangle line width now scales for HiDPI displays
* Font height calculation improved (ascent + descent) to
prevent text clipping
* AggCanvas text baseline positioning fixed for descender
characters
* Canvas dimension guards added across X11/GDI/Cocoa backends
to prevent range errors during extreme resize operations
* AggPas 32-bit and 64-bit compatibility fixes
== DocView Application ==
Lots of DocView (help viewer) improvements, and several UI
windows/dialogs have been migrated to MigLayout:
* Contents tab
* Index tab
* Search tab
* Notes & History tabs
The File Open/Save and Directory Select dialogs have also been
converted to use MigLayout management.
I'll be migrating more applications, tools and example to MigLayout
for better HiDPI support.
== Other Notable Changes ==
* Deprecated function calls replaced with method equivalents
across the codebase
* Command line parameter handling migrated to ICmdLineParams
interface
* TStringHashList replaced with FPC's TFPDataHashTable for PO
file handling
* TagPointer deprecated (FPC's TComponent.Tag now supports
64-bit)
* Font property moved to base widget class
* Visible property moved to WidgetBase class
* StyleManager assert logic fixes
* Bug #83 (broken localise) fixed
* Tab sheet resize flicker eliminated
* TreeView scrollbar flicker fixed
* Multiple memory leak fixes in MigLayout constraint handling
* All compiler warnings from fpGUI code has been resolved
* All range-check errors have been fixed
== Breaking Changes ==
* SetPosition() is deprecated - use Left/Top/Width/Height
properties instead
* Directory structure changed - extrafpc.cfg paths updated
* TagPointer is deprecated - use Tag (now 64-bit capable)
instead
* Deprecated function calls removed (use method equivalents)
== Documentation ==
* docs/layout_managers_quick_start.adoc
- 10-minute introduction to layout managers
* docs/miglayout_v11_port_plan.adoc
- detailed MigLayout port plan
* docs/layout_manager_implementation_plan.adoc
- architecture design document
* docs/toolkit_sizing_comparison.adoc
- widget sizing API design guide
* docs/api_design_intent_pathway.adoc
- API design intent documentation
Example demos for all three layout managers are in:
* examples/gui/lm-flow/
* examples/gui/lm-border/
* examples/gui/lm-mig/
And there are lots more, but too much to mention here. :)
Feedback, bug reports, and questions are welcome as always.
I mostly monitor the GitHub bugtracker and the fpGUI support
newsgroup - see website for details.
For more details, please visit the fpGUI home page:
http://fpgui.sourceforge.net
|