From 8d64c7e0dc62b8bdb104fa8ce55988e8a36de831 Mon Sep 17 00:00:00 2001 From: Syer10 Date: Wed, 26 May 2021 18:37:24 -0400 Subject: [PATCH] Context menu now works properly --- .../ca/gosyer/util/compose/ContextMenu.kt | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/ca/gosyer/util/compose/ContextMenu.kt b/src/main/kotlin/ca/gosyer/util/compose/ContextMenu.kt index 2243795f..a9f4b914 100644 --- a/src/main/kotlin/ca/gosyer/util/compose/ContextMenu.kt +++ b/src/main/kotlin/ca/gosyer/util/compose/ContextMenu.kt @@ -6,20 +6,46 @@ package ca.gosyer.util.compose +import androidx.compose.desktop.AppManager import androidx.compose.ui.unit.IntOffset +import com.github.weisj.darklaf.listener.MouseClickListener import javax.swing.Icon import javax.swing.JMenuItem import javax.swing.JPopupMenu import javax.swing.JSeparator +import javax.swing.SwingUtilities class ContextMenu internal constructor() { internal val items = mutableListOf Unit)?>>() internal fun popupMenu() = JPopupMenu().apply { - fun (() -> Unit)?.andClose() { + val window = AppManager.focusedWindow + var mouseListener: MouseClickListener? = null + fun close() { isVisible = false - this?.invoke() + mouseListener?.let { window?.removeMouseListener(it) } } + fun (() -> Unit)?.andClose() { + SwingUtilities.invokeLater { + close() + this?.invoke() + } + } + + mouseListener = MouseClickListener { + SwingUtilities.invokeLater { + close() + } + } + window?.addMouseListener(mouseListener) + window?.events?.let { + val oldFocusLost = it.onFocusLost + it.onFocusLost = { + it.onFocusLost.andClose() + it.onFocusLost = oldFocusLost + } + } + items.forEach { (item, block) -> when (item) { is JMenuItem -> add(item).apply {