CRM64Pro GDK v0.17.0 Major GUI update

CRM64Pro GDK  v0.17.0 is now available, and this release is centered on a broad refactor and expansion of the GUI system.

After the networking work in v0.16.0, this version moves the same kind of cleanup and modernization into the user-interface layer. The goal was not only to add more widgets, but also to make GUI code easier to inspect, easier to drive from tools, and easier to style consistently across games, editors and internal utilities.

The old GUI API had grown organically over time. It worked, but too much behavior lived on the common Widget base class, and several controls shared ambiguous method names even when their meaning was different. In v0.17.0 the widget model has been tightened: common functionality stays on Widget, while widget-specific behavior now lives on the concrete widget classes.

What’s new in the GUI system

The first big change is inspection and dynamic creation. Widgets now expose basic identity through getID(), getName() and getType(), while panels can enumerate and inspect their child widgets. This is especially useful for editor workflows, importers, debug tools and any runtime-driven UI that needs to reason about a panel without hardcoding every control.

Typed creation and lookup have also been expanded. Panels now provide creation/getter pairs for controls such as progress bars, sliders, text edits, number edits, lists and combo boxes. For dynamic systems there is also a generic type-based creation path, but normal application code can use the clearer typed API.

Callbacks are now much more direct. Instead of relying only on polling widget events, controls can use event-style callbacks such as setOnAction(), setOnHoverEnter(), setOnHoverExit(), setOnPressed() and setOnFocusLost(). Value-oriented widgets add semantic callbacks for committed values, selection changes, value changes and toggles.

Themes, layouts and widgets

v0.17.0 introduces runtime GUI theming. The engine now includes built-in Default, Dark and Flat themes, and applications can create custom themes through GUIMgr. Styling is handled through GUITheme and GUIThemeSkin, with a cascade from widget override to panel theme, then global theme, then the built-in default.

Panels also gained flow layouts. Horizontal and vertical flow modes can arrange child widgets using spacing, padding, justification and alignment. Existing manual positioning remains available, but tool panels and quick runtime UIs can now be assembled with less layout code.

Several widgets received substantial upgrades or new implementations:

  • WidgetTextEdit now supports persistent keyboard focus, mouse selection, clipboard shortcuts, selection-aware editing, undo and redo.
  • WidgetNumberEdit adds numeric editing with integer or floating-point input plus configurable minimum, maximum and step values.
  • WidgetComboBox adds a themed drop-down control with popup item list, hover state, selection highlighting and optional autosort.
  • WidgetList now supports interactive multi-selection with Ctrl+Click toggles, Shift+Click range selection, multi-row rendering and selection APIs.
  • WidgetFrame adds a lightweight themed primitive for horizontal lines, vertical lines, outlined rectangles and filled rectangles.

Cleaner widget semantics

A lot of work in this release went into making widget behavior more predictable. Disabled widgets now remain visible and mutable from code, while user interaction stays blocked. Programmatic setters follow a silent-update policy, so code-driven changes do not unexpectedly emit user-style events. User interaction and explicit edit commits still emit the richer widget events and callbacks.

The event model has also been expanded. In addition to action, hover and focus events, widgets can now report selection changes, value changes, toggled state and committed values. This makes it easier to distinguish between “the user is dragging a slider”, “the user committed a value”, and “the application changed a value directly”.

Font and rendering fixes

The Font manager now exposes built-in GUI fonts by name through getBuiltin(). The embedded Arial and Courier New fonts can be requested with simple names such as Arial12Black or CourierNew10White, which is cleaner than routing common GUI fonts through the GUI manager.

There are also some focused fixes outside the GUI layer. In GFX, filled circle rendering was corrected to avoid repeated side overdraw, and the implementation now uses midpoint scanline filling for better performance.

Important migration notes

This is a larger GUI API cleanup, so there are breaking changes. The most important one is that widget-specific methods have moved out of the base Widget class. Code should now call those methods on the appropriate concrete widget type.

  • Use typed creation/getter methods such as createSlider(), getSlider(), createTextEdit() and getTextEdit().
  • Use enable(), disable(), show() and hide() instead of the old activation/state methods.
  • Use clearer background method names such as setBackgroundColor(), setBackgroundImage() and setBackgroundSprite().
  • Use the new value and selection naming scheme, for example setSelectedIndex(), getSelectedText(), setRange(min,max) and getRange(&min,&max).

Font CDC compatibility is also affected. Bitmap glyph metrics now derive their bounds from image separators, and existing font CDC resources should be re-imported and re-saved. EditorC64 will be able to auto-update them.

What this means for CRM64Pro v0.17.0

For users of CRM64Pro, v0.17.0 makes the GUI system more suitable for real tools and larger runtime interfaces. There are more controls, better callbacks, stronger inspection APIs, theme support, layout support, and a cleaner split between common widget behavior and concrete widget behavior.

This release does require some migration work for older GUI code, but the result is a clearer API and a GUI layer that is easier to extend. It is the kind of refactor that should make future editor, debug and in-game UI work much less awkward.


Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.