Initialize SystemFontResolver when enabled and make its lifecycle and font-list
population thread-safe.
Use native codepoint fallback matching through Fontconfig on Linux, BSD, and
Haiku, DirectWrite on Windows, and Core Text on macOS and iOS. Preserve the
cached FreeType scan as a fallback when native matching is unavailable.
Enable system fonts by default for UIApplication and warm the font database in
the background. Allow applications to override the policy and disable the
automatic default in the unit-test runner.
Fix glyph fallback checks to respect the resolver's enabled state and add
coverage for concurrent warm-up and shaped symbol fallback.
Update efsw.
* Add fast paths for printable ASCII, row clearing, scrolling, history recycling, dirty tracking, and history width detection.
* Use runtime-dispatched AVX2 and NEON scanning for trailing blank cells, increase the PTY read buffer, and bound PTY processing and presentation to keep sustained output responsive.
* Preserve selection redraws, wide glyph cleanup, VT100 graphics handling, history reflow, and final buffered PTY output after process exit.
* Add regression coverage for deferred redraws, saturated reads, process termination, history scrolling, wide glyphs, and graphics character sets.
- Added exact RGB equality and alpha-only fast paths.
- Added optional createDiffImage, defaulting to true.
- Updated screenshot comparisons to compare-only first and generate visual output only on failure.
- Flattened iteration into a pointer-walking loop.
- Added a 256-entry sRGB-to-linear lookup table.
- Preserved CIEDE2000, thresholds, alpha comparison, maxDeltaE, and visual rendering semantics.
- Added six focused correctness tests in src/tests/unit_tests/image_diff_tests.cpp.
Introduce observable and computed values, typed widget bindings, validation groups, UI properties, commands, and UI-thread delivery.
Add observable vector and list model support for incrementally updated collections, with filtering and source-row mapping.
Modernize the Flight Booker and CRUD examples and add focused data handling and collection examples demonstrating the new APIs.
Organize the UI binding headers under ui/databinding, expand test coverage for notification and lifetime semantics, and document API selection, validation, ownership, threading, and performance behavior.
Scan newly added directory subtrees even after the initial project scan has finished, ensuring their files are added to ProjectDirectoryTree and become available to the universal locator.
Preserve initial-scan cancellation, respect hidden-file settings and accepted patterns, and avoid inserting duplicate files.
The child margins were already included. The real issue was that a wrap-content UILinearLayout allocated weighted space from the parent’s full dimensions, ignoring the parent’s content padding. Added a regression reproducing a padded parent, weighted input, and fixed siblings with margins.
Added removeKeyBindingCommand in UISceneNode and UIWindow.
Add an optional Tab Out behavior that moves a single cursor past configured trailing characters when pressing Tab. Expose the feature in Global Document Settings, keep it disabled by default, persist its configuration, and preserve existing selection and multi-cursor indentation behavior (SpartanJ/ecode#951).
- queue and batch filesystem model updates on the main thread
- process directory-tree updates and worker-affine listeners asynchronously
- coalesce adjacent modified events for the same path
- preserve captured file metadata across delayed event delivery
- add event, path, and thread-affinity filters for listener subscriptions
- configure optimized per-plugin filesystem subscriptions
- make listener removal wait for active callbacks safely
- handle self-removal without deadlocking
- support allocation-free matching of moved source paths
- synchronize project directory-tree mutations with active searches
- centralize diff-view button visibility around find/replace state
- improve code editor wrap-content and scrollbar sizing
- add queue, listener, and filesystem-model regression tests
Fix combobox button click not closing the popup listbox when clicking the button with a visible popup listbox.
Fix some incorrect size policies in UIFileDialog.
- dispatch filesystem events on the main thread in FileSystemListener, preserving model, tree, document, and callback ordering
- add address + generation node identity to close the allocator-reuse hole
- return null/empty results for stale indexes instead of root data
- assert the main-thread contract and token-guard queued listener actions
- add attached-view and stale-selection crash regression tests
Fixes crash reported in discussion SpartanJ/ecode#952
Fetch and cache the models.dev catalog asynchronously, replacing bundled model lists when catalog data is available while preserving local and user-configured providers.
Update live AI Assistant instances after refresh, defer startup requests until the UI is ready, and cancel in-flight catalog requests during shutdown. Prioritize providers with configured credentials and infer each provider's cheapest title-generation model from catalog pricing.
Add model reasoning metadata, effort controls, request serialization, chat persistence, and localized UI labels. Refresh the bundled fallback models and support API keys for arbitrary catalog providers.
Fix ACP Agent mode message chunks enqueue ordering issue (ACP thought chunks were enqueued twice while answer chunks were enqueued once).
Fix UIDropDownList WrapContent sizing so dropdown width follows its text, skin, and padding, and tighten UIDropDown automatic height sizing.
Add FileSystem::dirRemoveAll() to normalize trailing separators and use the non-throwing std::filesystem::remove_all overload.
Migrate ecode and unit-test cleanup call sites to the centralized helper, preventing Haiku from crashing when removing directories with trailing slashes during shutdown.
getNodeFromPath() now translates paths under the configured root—such as /var/...—to the canonical root—such as /private/var/.. before calling realpath(). This keeps moved/deleted paths resolvable after the original leaf disappears.
- enable efsw cross-directory move reporting in ecode
- transfer FileSystemModel nodes between materialized parents
- preserve selections, descendant paths, and lazy destination branches
- update open document paths when parent directories move
- fix persistent indexes across insert, delete, and move operations
- clear stale tree-view metadata before model nodes are deleted
- safely handle getRealPath() failures for stale paths
- add model operation and filesystem move regression tests
- update efsw and SOIL2 submodules
Require the requested family when matching CoreText descriptors to prevent
substitutions such as Verdana resolving to Helvetica.
Validate the matched descriptor family and derive TTC face indices by matching
CoreText PostScript names against the font's FreeType faces instead of using
the descriptor array position.
Add macOS regression coverage for resolving and loading Verdana styles.
Support explicit liga, calt, clig, and dlig shaping features and include
text hints in layout caching, measurement, drawing, and character
position calculations.
Propagate scene-wide font feature defaults through UI text producers,
with granular widget overrides and recursive cache invalidation. Update
UICodeEditor and UIConsole to use shaped positioning when font features
are enabled, including with monospaced fonts.
Add separate UI and editor font feature settings to ecode, persist them
as comma-separated OpenType tags, and apply changes immediately. Add
localized menu labels, reusable Text feature conversion helpers, and
regression coverage for shaping, positioning, propagation, and parsing.
Preserve explicitly selected font styles and correctly reconcile external fonts with the asynchronously loaded system font list.
Group same-family external fonts under the Style column when styles are visible, and expose them as distinct family entries when styles are hidden. Include filenames in localized external-font labels to distinguish alternate
font versions.
Ensure system-listed regular faces remain available after asynchronous loading and add regression coverage for collisions, selection, and hidden style behavior.
Implement spec-oriented paint phases for normal flow, floats, and
positioned descendants, including atomic stacking groups and applicable
z-index handling for flex and grid items.
Share cached ordering between drawing and hit testing, propagate
invalidation across stacking scopes, and preserve ancestor transforms
and clipping for promoted descendants.
Add regression coverage for paint order, hit testing, reparenting,
clipping, flex ordering, and the old Reddit layout. Document the
supported stacking model and remove the completed implementation plan.
- add a reusable right-side panel managed at the application level
- migrate debugger tabs to UITabWidgetSplitter instances
- support moving and splitting debugger tabs across bottom and right panels
- restrict debugger tab drops to debugger-owned panel targets
- serialize debugger tab layouts, panel state, and table column widths
- add pixel and percentage column-width modes to UIAbstractTableView
- support XML/CSS configuration and an optional width-mode context menu
- preserve percentage totals across resizing, fit-to-content, minimum widths,
scrollbar changes, and pixel-density rounding
- add splitter edge hiding while preserving splitter-always-show precedence
- use EventConnection ownership for safe widget and controller lifetimes
- validate serialized splitter layouts with structural limits
- display project-relative source paths in debugger stack frames
- add ecode localization strings, CSS documentation, tests, and agent rules
Refactor IniFile storage to keep keys and values in unified SmallVector-backed
records, avoiding parallel vector growth and allocations for common small
configurations.
Use std::string_view by value throughout the IniFile input API to prevent
temporary std::string allocations for keys, value names, paths, and comments.
Write serialized components directly to streams instead of constructing a
temporary string for every line.
Return ProjectBuildConfiguration by const reference to avoid copying it during
project saves, and use inline storage for DocumentView visual lines to avoid
heap allocations while rendering the code editor minimap.
Add IniFile tests covering parsing, mutation, ordered serialization, and a
byte-for-byte ecode project-state round trip.
Enable multiple selection in the Git status tree and apply stage, unstage, discard, open, and diff actions to all applicable files.
Open selected diffs in a single multi-file diff view, including portable handling for untracked files, and group mutating operations by repository.
Make the commit dialog resizable, allow its text editor to grow with the window, and wrap commit messages by word.
Add an unlocked take-screenshot command and expose it under Settings -> Window with a default Print Screen binding.
Allow configuring the screenshot destination, filename pattern, and output format. Save screenshots under the ecode configuration directory by default, notify users after capture, and provide an action to open the result in the integrated image viewer.
Addresses a request in SpartanJ/ecode#950.
Allow UIFontPickerDialog sections to be hidden and make ecode's UI, editor, and terminal font dialogs select both the font and its size.
Keep external fonts selectable across asynchronous font enumeration, including when they share a family name with a system font, and label them as external. Also normalize UILinearLayout weights across visible children so hidden picker columns release their space correctly.
Update font picker previews, size units, menu labels, translations, and lifetime handling.
Addresses SpartanJ/ecode#944.
SDL2 prevents the default action for Ctrl/Cmd key events on Emscripten,
which stops browsers from emitting the native paste event.
Intercept Ctrl/Cmd+V before SDL2 consumes it, allow the browser paste
event to update the internal clipboard, and replay the keydown so the
application executes its normal paste command.
Also refresh the clipboard through the asynchronous Clipboard API when
opening a context menu, enabling paste actions triggered without a
keyboard shortcut.
Export Emscripten's ccall runtime method so the browser clipboard helper
can reliably invoke its C++ callbacks in optimized builds, and disable
clang-format for the header containing embedded JavaScript.