mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-10-01 09:03:31 +07:00
IJPL-850 make NavBarVm independent of NavBarItem
GitOrigin-RevId: 01617567b94538e1bb043c3b360dc9cf79c12bbc
This commit is contained in:
committed by
intellij-monorepo-bot
parent
89981ba257
commit
d1293441d8
@@ -1,4 +1,4 @@
|
||||
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
package com.intellij.execution.services
|
||||
|
||||
import com.intellij.execution.services.ServiceModel.ServiceViewItem
|
||||
@@ -91,9 +91,9 @@ internal class ServiceViewNavBarPanel(
|
||||
updateRequests.tryEmit(Unit)
|
||||
}
|
||||
|
||||
private fun requestNavigation(pointer: Pointer<out NavBarItem>) {
|
||||
private fun requestNavigation(item: NavBarVmItem) {
|
||||
cs.launch(Dispatchers.EDT) {
|
||||
(pointer as? ServiceViewNavBarItem)?.item?.let {
|
||||
(item as? ServiceViewNavBarItem)?.item?.let {
|
||||
selector.select(it)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
package com.intellij.ide.navbar.actions
|
||||
|
||||
import com.intellij.ide.impl.dataRules.GetDataRule
|
||||
import com.intellij.ide.navbar.NavBarItem
|
||||
import com.intellij.ide.navbar.ide.IdeNavBarVmItem
|
||||
import com.intellij.ide.navbar.ide.NavBarVmItem
|
||||
import com.intellij.ide.navbar.impl.DefaultNavBarItem
|
||||
import com.intellij.ide.navbar.impl.ModuleNavBarItem
|
||||
import com.intellij.ide.navbar.impl.PsiNavBarItem
|
||||
@@ -40,6 +43,22 @@ private fun extensionData(dataId: String, provider: DataProvider): Any? {
|
||||
return provider.getData(dataId)
|
||||
}
|
||||
|
||||
internal class BgtDataRule : GetDataRule {
|
||||
|
||||
override fun getData(dataProvider: DataProvider): Any? {
|
||||
val project = CommonDataKeys.PROJECT.getData(dataProvider)
|
||||
?: return null
|
||||
val selection = NavBarVmItem.SELECTED_ITEMS.getData(dataProvider)
|
||||
?: return null
|
||||
val pointers = selection.map {
|
||||
(it as IdeNavBarVmItem).pointer
|
||||
}
|
||||
return DataProvider {
|
||||
getBgData(project, pointers, it)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal fun getBgData(project: Project, selection: List<Pointer<out NavBarItem>>, dataId: String): Any? {
|
||||
val selectedItems = lazy(LazyThreadSafetyMode.NONE) {
|
||||
ApplicationManager.getApplication().assertReadAccessAllowed()
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
package com.intellij.ide.navbar.ide
|
||||
|
||||
import com.intellij.codeInsight.navigation.actions.navigateRequest
|
||||
@@ -11,7 +11,6 @@ import com.intellij.ide.navbar.ui.showHint
|
||||
import com.intellij.ide.navbar.ui.staticNavBarPanel
|
||||
import com.intellij.ide.ui.UISettings
|
||||
import com.intellij.lang.documentation.ide.ui.DEFAULT_UI_RESPONSE_TIMEOUT
|
||||
import com.intellij.model.Pointer
|
||||
import com.intellij.openapi.actionSystem.CommonDataKeys
|
||||
import com.intellij.openapi.actionSystem.DataContext
|
||||
import com.intellij.openapi.application.EDT
|
||||
@@ -107,22 +106,17 @@ internal class NavBarService(private val project: Project, cs: CoroutineScope) {
|
||||
}
|
||||
}
|
||||
|
||||
private fun requestNavigation(pointer: Pointer<out NavBarItem>) {
|
||||
private fun requestNavigation(item: NavBarVmItem) {
|
||||
cs.launch {
|
||||
navigateTo(pointer)
|
||||
val navigationRequest = readAction {
|
||||
(item as IdeNavBarVmItem).pointer.dereference()?.navigationRequest()
|
||||
} ?: return@launch
|
||||
withContext(Dispatchers.EDT) {
|
||||
navigateRequest(project, navigationRequest)
|
||||
}
|
||||
updateRequests.emit(Unit)
|
||||
}
|
||||
}
|
||||
|
||||
private suspend fun navigateTo(pointer: Pointer<out NavBarItem>) {
|
||||
val navigationRequest = readAction {
|
||||
pointer.dereference()?.navigationRequest()
|
||||
} ?: return
|
||||
withContext(Dispatchers.EDT) {
|
||||
navigateRequest(project, navigationRequest)
|
||||
}
|
||||
updateRequests.emit(Unit)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,15 +1,12 @@
|
||||
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
package com.intellij.ide.navbar.ide
|
||||
|
||||
import com.intellij.ide.navbar.NavBarItem
|
||||
import com.intellij.ide.navbar.NavBarItemPresentation
|
||||
import com.intellij.ide.navbar.vm.NavBarItemVm
|
||||
import com.intellij.ide.navbar.vm.NavBarPopupVm
|
||||
import com.intellij.ide.navbar.vm.NavBarVm
|
||||
import com.intellij.ide.navbar.vm.NavBarVm.SelectionShift
|
||||
import com.intellij.model.Pointer
|
||||
import com.intellij.platform.util.coroutines.flow.zipWithNext
|
||||
import com.intellij.util.ui.EDT
|
||||
import kotlinx.coroutines.CancellationException
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.channels.BufferOverflow.DROP_OLDEST
|
||||
@@ -36,7 +33,7 @@ class NavBarVmImpl(
|
||||
|
||||
private val _popup: MutableStateFlow<NavBarPopupVmImpl<DefaultNavBarPopupItem>?> = MutableStateFlow(null)
|
||||
|
||||
private val _activationRequests: MutableSharedFlow<Pointer<out NavBarItem>> =
|
||||
private val _activationRequests: MutableSharedFlow<NavBarVmItem> =
|
||||
MutableSharedFlow(extraBufferCapacity = 1, onBufferOverflow = DROP_OLDEST)
|
||||
|
||||
init {
|
||||
@@ -64,21 +61,20 @@ class NavBarVmImpl(
|
||||
|
||||
override val popup: StateFlow<NavBarPopupVm<*>?> = _popup.asStateFlow()
|
||||
|
||||
override val activationRequests: Flow<Pointer<out NavBarItem>> = _activationRequests.asSharedFlow()
|
||||
override val activationRequests: Flow<NavBarVmItem> = _activationRequests.asSharedFlow()
|
||||
|
||||
override fun selection(): List<Pointer<out NavBarItem>> {
|
||||
EDT.assertIsEdt()
|
||||
override fun selection(): List<NavBarVmItem> {
|
||||
val popup = _popup.value
|
||||
if (popup != null) {
|
||||
return popup.selectedItems.map {
|
||||
it.item.pointer
|
||||
it.item
|
||||
}
|
||||
}
|
||||
else {
|
||||
val selectedIndex = _selectedIndex.value
|
||||
val items = _items.value
|
||||
if (selectedIndex in items.indices) {
|
||||
return listOf(items[selectedIndex].item.pointer)
|
||||
return listOf(items[selectedIndex].item)
|
||||
}
|
||||
}
|
||||
return emptyList()
|
||||
@@ -155,7 +151,7 @@ class NavBarVmImpl(
|
||||
?: return
|
||||
when (expandResult) {
|
||||
is ExpandResult.NavigateTo -> {
|
||||
_activationRequests.tryEmit(expandResult.target.pointer)
|
||||
_activationRequests.tryEmit(expandResult.target)
|
||||
return
|
||||
}
|
||||
is ExpandResult.NextPopup -> {
|
||||
@@ -206,7 +202,7 @@ class NavBarVmImpl(
|
||||
}
|
||||
|
||||
override fun activate() {
|
||||
_activationRequests.tryEmit(item.pointer)
|
||||
_activationRequests.tryEmit(item)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,18 @@
|
||||
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
package com.intellij.ide.navbar.ide
|
||||
|
||||
import com.intellij.ide.navbar.NavBarItem
|
||||
import com.intellij.ide.navbar.NavBarItemPresentation
|
||||
import com.intellij.model.Pointer
|
||||
import com.intellij.openapi.actionSystem.DataKey
|
||||
|
||||
interface NavBarVmItem {
|
||||
|
||||
companion object {
|
||||
@JvmField
|
||||
val SELECTED_ITEMS: DataKey<List<NavBarVmItem>> = DataKey.create("nav.bar.selection")
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean
|
||||
|
||||
override fun hashCode(): Int
|
||||
|
||||
@@ -1,26 +1,23 @@
|
||||
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
package com.intellij.ide.navbar.ui
|
||||
|
||||
import com.intellij.accessibility.AccessibilityUtils
|
||||
import com.intellij.ide.CopyPasteDelegator
|
||||
import com.intellij.ide.CopyPasteSupport
|
||||
import com.intellij.ide.IdeBundle
|
||||
import com.intellij.ide.navbar.NavBarItem
|
||||
import com.intellij.ide.navbar.actions.NavBarActionHandler.NAV_BAR_ACTION_HANDLER
|
||||
import com.intellij.ide.navbar.actions.NavBarActionHandlerImpl
|
||||
import com.intellij.ide.navbar.actions.extensionData
|
||||
import com.intellij.ide.navbar.actions.getBgData
|
||||
import com.intellij.ide.navbar.ide.LOG
|
||||
import com.intellij.ide.navbar.ide.NavBarVmItem.Companion.SELECTED_ITEMS
|
||||
import com.intellij.ide.navbar.ui.NavBarItemComponent.Companion.isItemComponentFocusable
|
||||
import com.intellij.ide.navbar.vm.NavBarItemVm
|
||||
import com.intellij.ide.navbar.vm.NavBarPopupVm
|
||||
import com.intellij.ide.navbar.vm.NavBarVm
|
||||
import com.intellij.ide.ui.UISettings
|
||||
import com.intellij.internal.statistic.service.fus.collectors.UIEventLogger.NavBarShowPopup
|
||||
import com.intellij.model.Pointer
|
||||
import com.intellij.openapi.actionSystem.CommonDataKeys.PROJECT
|
||||
import com.intellij.openapi.actionSystem.DataProvider
|
||||
import com.intellij.openapi.actionSystem.PlatformCoreDataKeys.BGT_DATA_PROVIDER
|
||||
import com.intellij.openapi.actionSystem.PlatformCoreDataKeys.CONTEXT_COMPONENT
|
||||
import com.intellij.openapi.actionSystem.PlatformDataKeys.*
|
||||
import com.intellij.openapi.actionSystem.ex.ActionUtil
|
||||
@@ -241,12 +238,7 @@ class NewNavBarPanel(
|
||||
CUT_PROVIDER.name -> extensionData(dataId) ?: getCopyPasteDelegator(this).cutProvider
|
||||
COPY_PROVIDER.name -> extensionData(dataId) ?: getCopyPasteDelegator(this).copyProvider
|
||||
PASTE_PROVIDER.name -> extensionData(dataId) ?: getCopyPasteDelegator(this).pasteProvider
|
||||
BGT_DATA_PROVIDER.name -> {
|
||||
val selection: List<Pointer<out NavBarItem>> = vm.selection()
|
||||
DataProvider {
|
||||
getBgData(project, selection, it)
|
||||
}
|
||||
}
|
||||
SELECTED_ITEMS.name -> vm.selection()
|
||||
else -> null
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
package com.intellij.ide.navbar.ui
|
||||
|
||||
import com.intellij.ide.navbar.NavBarItem
|
||||
import com.intellij.ide.navbar.ide.*
|
||||
import com.intellij.ide.navbar.vm.NavBarVm
|
||||
import com.intellij.model.Pointer
|
||||
import com.intellij.openapi.application.EDT
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.platform.util.coroutines.attachAsChildTo
|
||||
@@ -29,7 +27,7 @@ fun staticNavBarPanel(
|
||||
project: Project,
|
||||
cs: CoroutineScope,
|
||||
updateRequests: Flow<Any>,
|
||||
requestNavigation: (Pointer<out NavBarItem>) -> Unit,
|
||||
requestNavigation: (NavBarVmItem) -> Unit,
|
||||
): JComponent {
|
||||
|
||||
val staticNavBarVm: MutableStateFlow<NavBarVm?> = MutableStateFlow(null)
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
package com.intellij.ide.navbar.vm
|
||||
|
||||
import com.intellij.ide.navbar.NavBarItem
|
||||
import com.intellij.model.Pointer
|
||||
import com.intellij.ide.navbar.ide.NavBarVmItem
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import org.jetbrains.annotations.ApiStatus
|
||||
@@ -16,9 +15,9 @@ interface NavBarVm {
|
||||
|
||||
val popup: StateFlow<NavBarPopupVm<*>?>
|
||||
|
||||
val activationRequests: Flow<Pointer<out NavBarItem>>
|
||||
val activationRequests: Flow<NavBarVmItem>
|
||||
|
||||
fun selection(): List<Pointer<out NavBarItem>>
|
||||
fun selection(): List<NavBarVmItem>
|
||||
|
||||
enum class SelectionShift {
|
||||
FIRST,
|
||||
|
||||
@@ -705,6 +705,9 @@
|
||||
implementationClass="com.intellij.ide.navbar.actions.DefaultNavBarItemDataRule"
|
||||
type="context"
|
||||
order="last"/>
|
||||
<getDataRule key="bgtDataProvider"
|
||||
implementationClass="com.intellij.ide.navbar.actions.BgtDataRule"
|
||||
type="provider"/>
|
||||
|
||||
<statistician key="completion" implementationClass="com.intellij.codeInsight.completion.DefaultCompletionStatistician" order="last"/>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user