Improve Git History navigation and commit details

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.
This commit is contained in:
Martín Lucas Golini
2026-08-29 02:15:26 -03:00
parent ef962fc61f
commit 61d9d3c7bc
15 changed files with 551 additions and 204 deletions
+1 -1
View File
@@ -141,7 +141,7 @@ class EE_API UIStyle : public UIState {
/** Lazily allocated for styles that use substitutions. The common, non-reentrant resolution
* needs no container allocation; nested slots are retained for later reuse. */
std::unique_ptr<CSS::StyleSheetProperty> mPropertyResolutionSlot;
std::vector<std::unique_ptr<CSS::StyleSheetProperty>> mNestedPropertyResolutionSlots;
SmallVector<std::unique_ptr<CSS::StyleSheetProperty>, 2> mNestedPropertyResolutionSlots;
bool mChangingState;
bool mForceReapplyProperties;
bool mDisableAnimations;
+11
View File
@@ -1342,6 +1342,17 @@ class EE_API UIWidget : public UINode {
*/
bool hasPseudoClass( const std::string& pseudoCls ) const;
/**
* @brief Checks if this widget has a specific pseudo-class.
*
* Determines whether this widget currently has the specified pseudo-class
* (e.g., hover, focus, active).
*
* @param pseudoCls The pseudo-class to check.
* @return True if the widget has the pseudo-class, false otherwise.
*/
bool hasPseudoClass( StyleSheetSelectorRule::PseudoClasses pseudoCls ) const;
/**
* @brief Checks if the tooltip is enabled for this widget.
*