From d1f31f29e33a26d054449f12439ef036332ea045 Mon Sep 17 00:00:00 2001 From: Julia Beliaeva Date: Fri, 1 Sep 2023 20:36:10 +0200 Subject: [PATCH] [git-index] add shortcut text to the hover icon tooltips GitOrigin-RevId: 60886a3dbe05c62982ffc08dd69f944c912d8e8b --- .../index/actions/StagingAreaOperation.kt | 6 +++++- .../src/git4idea/index/ui/GitStageTree.kt | 16 +++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/plugins/git4idea/src/git4idea/index/actions/StagingAreaOperation.kt b/plugins/git4idea/src/git4idea/index/actions/StagingAreaOperation.kt index 449310ed95c4..c20b4bbb4487 100644 --- a/plugins/git4idea/src/git4idea/index/actions/StagingAreaOperation.kt +++ b/plugins/git4idea/src/git4idea/index/actions/StagingAreaOperation.kt @@ -1,7 +1,8 @@ -// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package git4idea.index.actions import com.intellij.icons.AllIcons +import com.intellij.openapi.keymap.KeymapUtil import com.intellij.openapi.project.Project import com.intellij.openapi.util.NlsActions import com.intellij.openapi.util.NlsContexts @@ -23,6 +24,7 @@ interface StagingAreaOperation { val progressTitle: @NlsContexts.ProgressTitle String val icon: Icon? val errorMessage: @NlsContexts.NotificationContent String + val shortcutText: String? get() = null fun matches(statusNode: GitFileStatusNode): Boolean @@ -35,6 +37,7 @@ object GitAddOperation : StagingAreaOperation { override val progressTitle get() = GitBundle.message("stage.add.process") override val icon = AllIcons.General.Add override val errorMessage: String get() = GitBundle.message("stage.add.error.title") + override val shortcutText: String get() = KeymapUtil.getFirstKeyboardShortcutText("Git.Stage.Add") override fun matches(statusNode: GitFileStatusNode) = statusNode.kind == NodeKind.UNSTAGED || statusNode.kind == NodeKind.UNTRACKED @@ -61,6 +64,7 @@ object GitResetOperation : StagingAreaOperation { override val progressTitle get() = GitBundle.message("stage.reset.process") override val icon = AllIcons.General.Remove override val errorMessage: String get() = GitBundle.message("stage.reset.error.title") + override val shortcutText: String get() = KeymapUtil.getFirstKeyboardShortcutText("Git.Stage.Reset") override fun matches(statusNode: GitFileStatusNode) = statusNode.kind == NodeKind.STAGED diff --git a/plugins/git4idea/src/git4idea/index/ui/GitStageTree.kt b/plugins/git4idea/src/git4idea/index/ui/GitStageTree.kt index 97dfb13d4d8c..19a80e64e674 100644 --- a/plugins/git4idea/src/git4idea/index/ui/GitStageTree.kt +++ b/plugins/git4idea/src/git4idea/index/ui/GitStageTree.kt @@ -11,6 +11,8 @@ import com.intellij.openapi.actionSystem.* import com.intellij.openapi.fileChooser.actions.VirtualFileDeleteProvider import com.intellij.openapi.fileEditor.OpenFileDescriptor import com.intellij.openapi.project.Project +import com.intellij.openapi.util.text.HtmlBuilder +import com.intellij.openapi.util.text.HtmlChunk import com.intellij.openapi.vcs.FilePath import com.intellij.openapi.vcs.FileStatus import com.intellij.openapi.vcs.VcsBundle @@ -20,11 +22,13 @@ import com.intellij.openapi.vcs.changes.UnversionedViewDialog import com.intellij.openapi.vcs.changes.ui.* import com.intellij.openapi.vcs.changes.ui.VcsTreeModelData.allUnder import com.intellij.openapi.vfs.VirtualFile +import com.intellij.ui.ColorUtil import com.intellij.ui.SimpleTextAttributes import com.intellij.ui.tree.TreeVisitor import com.intellij.util.FontUtil import com.intellij.util.containers.ContainerUtil import com.intellij.util.containers.JBIterable +import com.intellij.util.ui.JBUI import com.intellij.util.ui.tree.TreeUtil import git4idea.conflicts.GitConflictsUtil.getConflictType import git4idea.i18n.GitBundle @@ -178,8 +182,18 @@ abstract class GitStageTree(project: Project, } } + private val StagingAreaOperation.tooltipText: String + get() { + val shortcut = shortcutText + if (shortcut == null) return actionText.get() + return HtmlBuilder() + .append(actionText.get()).nbsp(2) + .append(HtmlChunk.font(ColorUtil.toHex(JBUI.CurrentTheme.Tooltip.shortcutForeground())).addText(shortcut)) + .wrapWith("html").toString() + } + private inner class GitStageHoverIcon(val operation: StagingAreaOperation) - : HoverIcon(operation.icon!!, operation.actionText.get()) { + : HoverIcon(operation.icon!!, operation.tooltipText) { override fun invokeAction(node: ChangesBrowserNode<*>) { val nodes = allUnder(node).userObjects(GitFileStatusNode::class.java) performStageOperation(nodes, operation)