Added a synthetic “Working Tree / Index” first row whenever the selected repository has local or staged changes.
Displays separate changed and staged counts.
Updates dynamically from normal status refreshes without reloading commit history.
Selecting it opens the shared details view in “Uncommitted changes” mode.
Shows tracked changes from HEAD through the working tree, plus untracked-file patches.
Supports both sidebar and detached History views.
The History shortcut focuses working changes when present, otherwise the newest commit.
Added the History button beside Refresh.
Added consistent 2dp spacing between the ref dropdown and both buttons.
Added translations for the new labels.
Add a detached Git Commit History tab with a traditional table layout, persistent column widths, commit focusing, and a splitter-based commit details pane.
Register the git-show-history command and expose “Show in Git History” from commit details and history context menus. Add History and Git Commit tab icons, localized titles, appropriate tooltips, and ref-aware
tab naming.
Share the commit-details layout and behavior between standalone commit tabs and detached History views. Move view creation, widget binding, state management, controls, and asynchronous changed-file loading into
CommitDetailsState.
Display complete commit metadata and messages, GitHub links, copyable commit SHAs, colored changed-file statistics, and multi-file diffs with global expand/collapse and unified/split controls.
Improve detached-history lifecycle behavior, selection and focus handling, stale-request protection, tooltip formatting, and column recalculation. Restore “Load older commits” by preserving pagination-node
semantics while asynchronous loading is in progress.
Fix expandable History rows so merge subjects and metadata render correctly without regressing generic UITreeView cells. Add recursive commit lookup for focusing nested history entries.
Add deferred tooltip-created notifications and configure History tooltips only after their widgets exist.
Preserve tokenizer-applied UITextView color ranges during layout recalculation when custom styling is enabled, preventing changed-file statistics from losing their colors after splitter resizing.
Add the required Codicons and translations, expose UIWidget pseudo-class queries, reuse cached tree-expander drawable sources, and use SmallVector for nested stylesheet property resolution.
Add a History ref selector for HEAD, local branches, remote branches, and tags without requiring checkout. Reuse cached branch-model display strings to keep large ref lists efficient.
Make deferred main-thread callbacks lifetime-safe across ecode controllers and plugins. Initialize plugin dispatchers during UIReady and extend MainThreadLifetime to support delayed and tagged dispatch.
Fix expandable Git History rows, empty merge projections, and commit-description expansion. Display only the physical first line while collapsed and avoid duplicating it in the expanded body.
Add coverage for history ref handling and preserve stale-request guards during repository and revision changes.
Fix UIImageViewer dimension reporting for sprites by displaying the underlying texture dimensions.
The Git History interface remains a work in progress.
Display bounded first-parent commit history with asynchronous loading, independent pagination, and lazily expandable merge commits. Propagate inherited exclusions through nested merges to avoid repeating already represented history.
Add custom compact history rows, loading/error/retry states, keyboard navigation, repository and history-generation guards, and lifecycle invalidation after history-changing operations.
Add a commit details tab with full commit metadata and message, changed-line totals, GitHub links when available, and a multi-file diff viewer with global collapse and unified/split controls.
Extend UIDiffView with multi-file view controls and register the required Codicons.
The Git History interface and visual design remain a work in progress.
Fix caret positioning inside shaped ligature clusters.
Add explicit closest-glyph and interpolated ligature caret-positioning modes while keeping interpolation as the default for general text geometry.
Use the original closest-glyph behavior for caret and IME positioning in UICodeEditor, UITextEdit, UITextInput, and UIConsole, preventing cursor positions from being synthesized inside ligature glyphs.
Add regression coverage for both positioning modes.
Optimize SyntaxTokenizer by returning tokenizer results in a SmallVector, avoiding heap allocations in common cases.
- Avoid re-querying rowCount() after resolving a node for deletion, since this could traverse a lazy parent and delete the node before the operation finished using it.
- Use the resolved model index to begin row deletion, silently repair view selections before notifying model clients, and avoid traversal-capable index lookups while raw nodes are retained.
- Add ASAN regressions for Add/Move/Delete sequences involving unopened directories, moved directory descendants, stale selections, and re-entrant selection callbacks.
- introduce reusable settings models, documents, and plugin settings pages
- expose all registered plugin configuration options in the Settings panel
- support groups, choices, editable values, lists, secrets, and JSON objects
- stage plugin changes and persist them when the Settings window closes
- preserve raw JSON access for advanced configuration
- safely migrate legacy AI provider API keys
- add translated plugin setting labels and descriptions
- remove the obsolete plugin GUI configuration API
- fix autocomplete signature documentation persistence
- fix AI model catalog refresh interval loading
Mirror UIMenuBar hierarchies into AppKit while keeping eepp menus as the
source of truth.
Add semantic item activation and menu lifecycle hooks so native actions,
lazy menus, checkboxes, radio buttons, visibility, enabled state, and
submenus preserve existing eepp behavior. Support shortcuts and standard
About, Preferences, Quit, Window, Help, and Services menu integration.
Keep the platform adapter private to the UI implementation and support
safe installation, synchronization, and removal of the native menu.
Migrate ecode away from its hand-written Cocoa menu, assign semantic menu
roles, and populate the UI Language submenu synchronously so it is ready
on its first opening.
Add unit tests covering activation, menu lifecycle, roles, and submenu
preparation.
Refs: SpartanJ/ecode#823
- Decimal/text markers now inherit the current list-item font color.
- Marker X/Y coordinates are pixel-snapped, eliminating blurry rendering.
- The behavior is shared by <li> and textual <summary> markers.
- Added focused tests for inherited color and integer positioning.
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.
- 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.
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.
- 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.
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.
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.
- migrate TextRanges to SmallVector with capacity for two selections
- preserve vector, initializer-list, and single-range construction
- add coverage for inline storage, copying, and heap fallback
- export UIStyle::PropertyResolution for Windows shared builds
- 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
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.
Introduce contiguous PropertyId and ShorthandId enums backed by name-to-ID maps, replacing hash-valued property identifiers throughout the style system.
Replace PropertyIdSet's unordered set with a fixed-size bitset, eliminating heap allocations during style state changes while providing deterministic ascending iteration.
Keep name hashes for stylesheet storage and unknown or custom properties, while using dense typed IDs for registered-property lookup and dispatch.
Preserve property aliases and the public Checked compatibility identifier.
Add transaction-end reconciliation for interdependent image sizing properties, deferring percentage-based calculations until their containing block is resolved.
Keep formatting-context-owned sizes intact for table cells and inline content.
Add validation and tests for dense built-in registration, custom IDs, aliases, bitset operations, allocation-free storage, unknown properties, property application order, and image sizing regressions.
- MSVC:
- Removed lambda-based eeNew expansion in favor of typed MemoryManager::trackNew().
- Added macro expansion indirection.
- Enabled MSVC’s conforming preprocessor with /Zc:preprocessor across Premake 4/5 static libraries, shared libraries, and executables.
- Verified generated VS2022 projects contain the flag, including eterm-static and eepp-maps-static.
- Added explicit standard-library includes to memorymanagerglobal.cpp.
- Linux/macOS release tests:
- MemoryManager.tracesPlainNew is now compiled only with EE_MEMORY_MANAGER, since global tracing is intentionally debug-only.
Added new plan to improve PropertyIdSet.
- 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).
- stop statement at-rules such as @charset at their semicolon
- preserve the following selector and declaration block
- support feature-level not() expressions in media queries
- add regression coverage for @charset and negated media features
Fixes Lobsters theme variables being discarded, which caused mixed light and dark colors when loading its stylesheets.
- 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.
Snap dotted and dashed border geometry to physical pixels so centered
patterns cannot begin on ambiguous half-pixel coordinates. This makes
rectangular dot placement deterministic across llvmpipe and macOS GPU
drivers.
Update the old Reddit golden image to use the snapped dot phase.
Optimize compile-time header dependencies
- Extract lightweight singleton declarations.
- Remove unnecessary core.hpp, stream, pack, and container includes.
- Add explicit direct dependencies across system, network, graphics, and syntax headers.
- Forward-declare stream and pack types where possible.
- Normalize selected network headers to LF.
- 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
Resolve auto margins according to the element's formatting context instead of applying native block centering to every HTML child.
Inline-level replaced elements, inline-blocks, floats, and out-of-flow boxes now use zero-valued auto margins in rich-text measurement and positioning, while normal-flow blocks retain horizontal auto-margin resolution. This prevents asynchronously loaded images from feeding stale calculated margins back into their inline ancestors and producing unbounded document widths, as observed on the Asahi Linux site.
Add synchronous and threaded WebView regression coverage using the Asahi fixture, including its weighted host layout and asynchronous SVG loading.
Document the follow-up plan for explicit formatting-role margin resolution, shared image-content composition, and rebasing UIHTMLImage on UIHTMLWidget.