1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
package com.intellij.codeInsight.codeVision.ui.model
import com.intellij.codeInsight.codeVision.*
import com.intellij.codeInsight.codeVision.settings.CodeVisionSettings
import com.intellij.codeInsight.codeVision.ui.popup.CodeVisionPopup
import com.intellij.openapi.components.service
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.editor.Inlay
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.TextRange
import com.jetbrains.rd.util.reactive.Property
import com.jetbrains.rd.util.reactive.ViewableMap
class ProjectCodeVisionModel private constructor(val project: Project) {
companion object {
fun getInstance(project: Project): ProjectCodeVisionModel = project.service()
const val MORE_PROVIDER_ID = "!More"
const val HIDE_PROVIDER_ID = "!Hide"
}
val maxVisibleLensCount = ViewableMap<CodeVisionAnchorKind, Int>()
val hoveredInlay = Property<Inlay<*>?>(null)
val hoveredEntry = Property<CodeVisionEntry?>(null)
val lensPopupActive = Property(false)
val moreEntry = AdditionalCodeVisionEntry(MORE_PROVIDER_ID, "More...")
val hideLens = CodeVisionEntryExtraActionModel(CodeVisionBundle.message("action.hide.this.metric.text"), HIDE_PROVIDER_ID)
private fun getCodeVisionHost() = CodeVisionHost.getInstance(project)
fun handleLensClick(editor: Editor, range: TextRange, entry: CodeVisionEntry) {
if (entry.providerId == MORE_PROVIDER_ID) {
showMore()
return
}
getCodeVisionHost().handleLensClick(editor, range, entry)
}
fun handleLensRightClick() {
showContextPopup()
}
fun handleLensExtraAction(editor: Editor, range: TextRange, entry: CodeVisionEntry, actionId: String) {
if (actionId == HIDE_PROVIDER_ID) {
CodeVisionSettings.instance().setProviderEnabled(entry.providerId, false)
CodeVisionHost.getInstance(project).invalidateProviderSignal.fire(CodeVisionHost.LensInvalidateSignal(null, listOf(entry.providerId)))
return
}
getCodeVisionHost().handleLensExtraAction(editor, range, entry, actionId)
}
fun getLensIndex(lens: CodeVisionEntry): Int {
return getCodeVisionHost().getNumber(lens.providerId) + 1
}
private fun showMore() {
val inlay = hoveredInlay.value ?: return
val model = inlay.getUserData(CodeVisionListData.KEY) ?: return
CodeVisionPopup.showMorePopup(
model.lifetime,
inlay,
moreEntry,
CodeVisionPopup.Disposition.MOUSE_POPUP_DISPOSITION,
model.rangeCodeVisionModel,
project
)
}
private fun showContextPopup() {
val inlay = hoveredInlay.value ?: return
val entry = hoveredEntry.value ?: return
if (entry.providerId == MORE_PROVIDER_ID) {
showMore()
return
}
val model = inlay.getUserData(CodeVisionListData.KEY) ?: return
CodeVisionPopup.showContextPopup(
model.lifetime,
inlay,
entry,
CodeVisionPopup.Disposition.MOUSE_POPUP_DISPOSITION,
model,
project
)
}
}
|