diff --git a/app/src/code_review/code_review_view.rs b/app/src/code_review/code_review_view.rs index 70a035c9..93e4e193 100644 --- a/app/src/code_review/code_review_view.rs +++ b/app/src/code_review/code_review_view.rs @@ -6798,11 +6798,12 @@ impl CodeReviewView { match mode { PrimaryGitActionMode::Commit => { - let has_changes = self.has_uncommitted_changes(ctx); + let disabled = !self.has_uncommitted_changes(ctx); self.git_primary_action_button.update(ctx, |button, ctx| { button.set_label("Commit", ctx); button.set_icon(Some(Icon::GitCommit), ctx); - button.set_disabled(!has_changes, ctx); + button.set_disabled(disabled, ctx); + button.set_tooltip(disabled.then_some("No changes to commit"), ctx); button.set_on_click( |ctx| ctx.dispatch_typed_action(CodeReviewAction::OpenCommitDialog), ctx, @@ -6810,7 +6811,8 @@ impl CodeReviewView { button.set_adjoined_side(AdjoinedSide::Right, ctx); }); self.git_operations_chevron.update(ctx, |button, ctx| { - button.set_disabled(!has_changes, ctx); + button.set_disabled(disabled, ctx); + button.set_tooltip(disabled.then_some("No git actions available"), ctx); }); } PrimaryGitActionMode::Push => { @@ -6849,6 +6851,7 @@ impl CodeReviewView { self.git_primary_action_button.update(ctx, |button, ctx| { button.set_label(label, ctx); button.set_icon(Some(Icon::Github), ctx); + button.set_disabled(false, ctx); button.set_on_click( move |ctx| { ctx.dispatch_typed_action(CodeReviewAction::ViewPr(url.clone())) diff --git a/app/src/code_review/git_dialog/commit.rs b/app/src/code_review/git_dialog/commit.rs index b7592f53..7e0587b0 100644 --- a/app/src/code_review/git_dialog/commit.rs +++ b/app/src/code_review/git_dialog/commit.rs @@ -241,6 +241,16 @@ pub(super) fn is_ready_to_confirm(state: &CommitState, app: &AppContext) -> bool !state.file_changes.is_empty() && commit_message(state, app).is_some() } +/// Returns a tooltip to show on the disabled Confirm button when the +/// user needs to take action, or `None` when no tooltip is needed. +pub(super) fn confirm_tooltip(state: &CommitState, app: &AppContext) -> Option<&'static str> { + if !state.file_changes.is_empty() && commit_message(state, app).is_none() { + Some("Enter a commit message") + } else { + None + } +} + /// Kicks off an open-time AI commit-message generation. On success, writes /// the result into the message editor (unless the user has already typed /// something). On failure, silently swaps the placeholder to the manual diff --git a/app/src/code_review/git_dialog/mod.rs b/app/src/code_review/git_dialog/mod.rs index 5ebe1a91..fbf41506 100644 --- a/app/src/code_review/git_dialog/mod.rs +++ b/app/src/code_review/git_dialog/mod.rs @@ -644,13 +644,17 @@ impl GitDialog { if self.loading { return; } - let disabled = match &self.mode { - GitDialogMode::Commit(state) => !commit::is_ready_to_confirm(state, ctx), - GitDialogMode::Push(_) => false, - GitDialogMode::CreatePr(state) => !pr::is_ready_to_confirm(state), + let (disabled, tooltip) = match &self.mode { + GitDialogMode::Commit(state) => ( + !commit::is_ready_to_confirm(state, ctx), + commit::confirm_tooltip(state, ctx), + ), + GitDialogMode::Push(_) => (false, None), + GitDialogMode::CreatePr(state) => (!pr::is_ready_to_confirm(state), None), }; self.confirm_button.update(ctx, |b, ctx| { b.set_disabled(disabled, ctx); + b.set_tooltip(tooltip, ctx); }); }