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
- Each option now uses one complete XML template containing both its row and control.
- Those immutable XML templates are parsed once and reused through loadLayoutNodes().
- add searchable user and project settings panels
- organize settings into navigable categories and subsections
- apply supported configuration changes in real time
- add direct document and terminal settings accessors
- retain only contextual actions in the legacy settings menus
- replace legacy configuration dialogs with inline controls
- improve modal behavior, keyboard navigation, and persistence
- add validation for editable settings
- update and remove obsolete i18n strings
- add user and project settings windows with searchable tree navigation
- centralize setting definitions with reusable bool, choice, text, numeric, and action controls
- apply supported configuration changes reactively
- add inline validation and editable choices for complex value types
- disable project document options while inheriting global settings
- migrate font, theme, language, renderer, screenshot, and terminal settings
- improve keyboard navigation and modal shortcut isolation
- make configuration dialogs modal
- persist settings when the panel closes
- add responsive dark and light theme styling
- update translations for new settings labels and descriptions
- add regression coverage for modal keybinding propagation
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
Introduce modal user and project settings panels with searchable tree navigation and live configuration updates.
- centralize settings registration and presentation
- add user and project settings commands and shortcuts
- preserve operational actions in the existing settings menu
- support boolean, choice, numeric, and action-based settings
- restore renderer notifications and choice descriptions
- persist settings when closing the panel
- add translated settings strings for all supported locales
- fix live color preview updates
- 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.
* 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