summaryrefslogtreecommitdiff
path: root/platform/lang-impl/src/com/intellij/codeInsight/codeVision/ui/model/CodeVisionListData.kt
blob: c2bfe43d179d76c3fb7bbcbd6619c93436a4b521 (plain)
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
package com.intellij.codeInsight.codeVision.ui.model

import com.intellij.codeInsight.codeVision.CodeVisionAnchorKind
import com.intellij.codeInsight.codeVision.CodeVisionEntry
import com.intellij.openapi.editor.Inlay
import com.intellij.openapi.editor.impl.EditorImpl
import com.intellij.openapi.util.Key
import com.intellij.openapi.util.registry.Registry
import com.jetbrains.rd.util.lifetime.Lifetime
import com.jetbrains.rd.util.reactive.map
import com.jetbrains.rd.util.throttleLast
import java.time.Duration

class CodeVisionListData(
  val lifetime: Lifetime,
  val projectModel: ProjectCodeVisionModel,
  val rangeCodeVisionModel: RangeCodeVisionModel,
  val inlay: Inlay<*>,
  val anchoredLens: List<CodeVisionEntry>,
  val anchor: CodeVisionAnchorKind
) {
  companion object {
    @JvmField
    val KEY = Key.create<CodeVisionListData>("CodeVisionListData")

  }

  var isPainted: Boolean = false
    get() = field
    set(value) {
      if (field != value) {
        field = value
        if ((inlay.editor as? EditorImpl)?.isPurePaintingMode != true)
          inlay.update()
      }
    }

  val visibleLens = ArrayList<CodeVisionEntry>()
  private var throttle = false

  init {
    projectModel.hoveredInlay.map {
      it == inlay
    }.throttleLast(Duration.ofMillis(300), SwingScheduler).advise(lifetime) {
      throttle = it
      inlay.repaint()
    }

    updateVisible()
  }

  private fun updateVisible() {
    val count = projectModel.maxVisibleLensCount[anchor]

    visibleLens.clear()

    if (count == null) {
      visibleLens.addAll(anchoredLens)
      return
    }

    val visibleCount = minOf(count, anchoredLens.size)
    visibleLens.addAll(anchoredLens.subList(0, visibleCount))
  }

  fun state() = rangeCodeVisionModel.state()
  fun isMoreLensActive() = throttle && Registry.`is`("editor.codeVision.more.inlay")
  fun isHoveredEntry(entry: CodeVisionEntry) = projectModel.hoveredEntry.value == entry && projectModel.hoveredInlay.value == inlay
}