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.
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
- 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.
- 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
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.
- 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.
- reuse formatting, document text, property resolution, and layout storage
- use inline containers for interpolations, callbacks, wrapping, and matcher state
- optimize single-line insertion by mutating document lines without splitting
- iterate PATH entries directly in Sys::which and reuse candidate buffers
- avoid temporary clocks and string copies in frequent ecode plugin updates
- retain documents during autocomplete cache jobs and prevent duplicate scheduling
- fix PatternMatcher copy assignment and MSVC move-only container compilation
- expand coverage for matching, text insertion, reusable strings, and Sys::which
- reuse reentrant property-resolution storage during variable substitution
- skip redundant resolution-slot copies using structural source comparison
- retain variable cache capacity and resolve variables in place
- avoid copying canonical names for definition-backed properties
- propagate resolved inherited properties by reference through widget trees
- parse animation and transition declarations with allocation-light string views
- share declaration tokenization between animation and transition parsers
- avoid empty animation-map and action-query allocations
- parse border radii without temporary split vectors
- accept string views when converting UI lengths
- format color hex values directly without string streams
- use inline storage for small polygon point collections
- preserve animation parsing semantics and fix longhand direction handling
- save eeiv configuration when closing through keyboard shortcuts
- extend animation, variable-resolution, property-name, and color tests
Probable reproduction:
1. Open global search.
2. Enter a search term.
3. Start “replace in files” with Mod+R.
4. Before the asynchronous search finishes, switch to document search.
5. Immediately reopen normal global search.
The replace tree becomes active as soon as the search starts, but its model is only assigned when the asynchronous result arrives. Reopening normal global search tried to reuse that still-null model and called rowCount() on it. The loader is also closed during this transition, explaining the SceneNode::checkClose() trace from another timing of the same sequence.
The fix:
- Only transfers replace results when the replace model exists.
- Adds a defensive null check to updateGlobalSearchBarResults().
Replace boolean output-parameter converters with UIValueResult so conversion failures can provide numeric codes and optional diagnostics without exposing partially converted values.
Expose observable converter error state from UIDataBind, UIProperty, and UIValueBinding.
Reject invalid widget input without changing the model or propagating it to sibling widgets, while keeping programmatic model updates authoritative.
Migrate ecode's custom output parser converter, expand binding tests, and document the data-handling architecture and next form-validation
phase.
Introduce EventConnection and EventConnectionList for scoped Node event listeners that safely handle either emitter or observer destruction order.
Add ObservableValue and UIValueBinding for UI-independent observable state, along with a shared UIValueConverter policy used by both observable and raw data bindings.
Harden UIDataBind and UIProperty lifetime behavior, documentation, conversion, operators, and multi-widget handling. Preserve UIProperty as the lightweight option for UI-local owned values and UIDataBind for explicitly managed external values.
Use inline ordered callback storage to preserve registration-order dispatch without per-listener tree allocations.
Migrate submenu observation to scoped connections, safely clear ecode run configuration bindings before model erasure, and simplify the 7GUIs Counter example with UIProperty.
Add lifecycle, ordering, conversion, binding, and mutation regression tests.
- intercept global new/delete operations in debug memory-manager builds
- distinguish anonymous global allocations from source-tracked leaks
- modernize eeNew to support constructor-expression syntax
- improve memory reports with tabulated leaks and separate largest allocations
- cache autocomplete shortcuts instead of hashing string keys on key events
- reuse UIStyle property sets across state changes
- reuse Text shadow colors and avoid temporary outline-color copies
- use inline storage for temporary linear-gradient rendering data
- make unit tests resolve assets from the executable directory
- add memory-manager and PropertyIdSet regression coverage
Model HTML images as replaced UIHTMLWidget elements with independent loading, sizing, and rendering behavior.
Resolve auto margins according to each element's formatting context, including normal-flow blocks, positioned elements, flex items, and grid items. Preserve intrinsic sizing for block-level images with width:auto and constrain them through CSS min/max dimensions.
Correct absolute-positioned containing-block coordinates and rich-text handling of atomic inline elements. Add regression coverage for centered images, deferred image loading, grid margins, positioned elements, and document flow after image loading.
Document the remaining work required for dynamically changing non-atomic inline elements.
Avoid saving eeiv configuration during destruction (fixes window state saving).
- move chrono implementation details out of the public Clock header
- define Sys system time as Unix epoch milliseconds
- add getUnixTimestamp() for epoch timestamps in seconds
- replace chrono wall-clock usage in ecode plugins with Sys APIs
- update existing Sys time callers for the new millisecond contract
- remove redundant chrono inclusion from HTTP tests
- remove the completed user-defined snippets plan
This prevents chrono and std::format internals from being instantiated across large portions of the project while preserving timestamp precision.
- implement per-side CSS border styles and patterned rendering
- preserve rectangular rasterization for thin dotted borders
- separate CSS and native-widget border defaults
- correct inline atomic-box and vertical-align baseline layout
- collapse adjacent block margins in rich-text flow
- preserve forced line breaks and formatting margins
- size HTML text inputs from font ascent and descent
- expose replaced-control text baselines to inline layout
- enforce single-owner painting for inline backgrounds and borders
- enable and update the old Reddit visual regression golden
- add generic layout, border, and form-control regression tests
- document spec-first HTML work and project build conventions
eeiv: Add drag & drop of images and folders. Added small welcome screen.
eterm: Detect windows below the default width and height and resize the window to fix the screen.
ecode image viewing will not auto-scale images to the pixel density.
eeiv: Modernizing eeiv to use eepp GUI, already working just like before, there are probably a few things to fix.
- support runtime locator provider registration and removal
- filter snippets with workspace-relative include/exclude globs
- add the remaining VS Code-compatible snippet variables
- support camelcase, pascalcase, snakecase, and kebabcase modifiers
- reuse the existing insertion flow for locator-selected snippets
- expand snippet parser and store test coverage
- update the implementation plan and C/C++ example snippets
Refs: SpartanJ/ecode#111
Fix:
- User fallback now uses "user-fallback-font".
- Built-in CJK and custom fallback fonts remain registered together.
- Added and passed a regression test verifying both fallback resources remain in the chain.
Fixes in premake5.lua:
- Removed obsolete PRECISE_F32=1; Wasm already provides precise float behavior.
- Moved ENVIRONMENT=worker,web to final application link options.
Fixed MarkdownView not getting the correct CSS style from the base theme.
- migrate themes, skins, icons, shaders, and shader programs to resource handles
- make UIThemeManager scene-owned and publish resources through scopes and catalogs
- retain shaders through their programs and expose non-owning GPU registries
- replace FrameBuffer and VertexBuffer factory ownership with unique pointers
- migrate engine, UI, tools, examples, tests, and eterm to the new ownership APIs
- remove the obsolete raw-owning ResourceManager templates
- document the completed Stage 7 architecture and remaining validation work
- add ownership, registry, and scoped shader-program coverage
- replace FontManager with per-ResourceScope FontService instances
- publish font factories into explicit or default resource scopes
- import default resources into UI scene scopes unless explicitly disabled
- keep related font faces strongly owned without hot-path weak_ptr locking
- add cached glyph advance queries without creating texture pages
- fix font picker preview ownership, cleanup, and rapid switching
- selectively evict TextLayout cache entries when referenced fonts unload
- document FontService, ResourceCatalog, and cache invalidation semantics
- migrate examples, tools, benchmarks, and tests to the scoped font API
- expand coverage for font ownership, texture release, and layout caching
- replace TextureAtlasManager and GlobalTextureAtlas with catalog-backed atlas ownership
- make TextureAtlas and TextureRegion creation return explicit resource handles
- let atlases retain their textures and regions through shared ownership
- add atlas publication, lookup, removal, and enumeration to ResourceCatalog and ResourceScope
- make TextureAtlasLoader publish atlases and regions into an explicit resource scope
- move theme atlas ownership into each theme resource catalog
- migrate maps, editors, examples, and tests away from the global atlas manager
- add scope-aware Sprite pattern-loading overloads while preserving default-scope compatibility
- fix re-entrant style-state invalidation when applying styles creates new widgets
- add atlas ownership, scoped Sprite lookup, and style-state regression coverage
- update the resource ownership plan and texture atlas editor launch configuration