From d40b8a4c9c0448825edbd7e58f91ab9c52ef5812 Mon Sep 17 00:00:00 2001 From: hstyi Date: Sun, 6 Jul 2025 16:48:06 +0800 Subject: [PATCH] fix: windows drive list failure --- .../plugin/internal/plugin/PluginPanel.kt | 3 +- .../transfer/TransportNavigationPanel.kt | 16 +++++++--- .../app/termora/transfer/TransportPanel.kt | 31 +++++++++++-------- .../app/termora/transfer/TransportTabbed.kt | 3 +- .../app/termora/transfer/s3/S3FileSystem.kt | 2 +- 5 files changed, 34 insertions(+), 21 deletions(-) diff --git a/src/main/kotlin/app/termora/plugin/internal/plugin/PluginPanel.kt b/src/main/kotlin/app/termora/plugin/internal/plugin/PluginPanel.kt index c2aed9c..30a2d5b 100644 --- a/src/main/kotlin/app/termora/plugin/internal/plugin/PluginPanel.kt +++ b/src/main/kotlin/app/termora/plugin/internal/plugin/PluginPanel.kt @@ -232,7 +232,8 @@ class PluginPanel(val descriptor: PluginPluginDescriptor) : JPanel(), Disposable // 当有多个插件正在安装时,那么最后一个安装成功的询问是否重启 if (installing.get() <= 1) { - restarter.scheduleRestart(owner) + // 不阻塞按钮状态变更 + SwingUtilities.invokeLater { restarter.scheduleRestart(owner) } } // 如果是更新,那么也需要刷新 InstalledPanel 下的按钮状态 diff --git a/src/main/kotlin/app/termora/transfer/TransportNavigationPanel.kt b/src/main/kotlin/app/termora/transfer/TransportNavigationPanel.kt index d6a64be..8ce34ee 100644 --- a/src/main/kotlin/app/termora/transfer/TransportNavigationPanel.kt +++ b/src/main/kotlin/app/termora/transfer/TransportNavigationPanel.kt @@ -237,11 +237,17 @@ internal class TransportNavigationPanel(private val navigator: TransportNavigato button.putClientProperty(FlatClientProperties.BUTTON_TYPE, FlatClientProperties.BUTTON_TYPE_TOOLBAR_BUTTON) button.addMouseListener(object : MouseAdapter() { override fun mouseClicked(e: MouseEvent) { - if (navigator.loading) return - if (path == navigator.workdir) { - setTextFieldText(path) - } else { - navigator.navigateTo(path.absolutePathString()) + if (SwingUtilities.isLeftMouseButton(e)) { + if (navigator.loading) return + if (path == navigator.workdir) { + setTextFieldText(path) + } else { + if (path.fileSystem.isWindowsFileSystem() && path.pathString == path.fileSystem.separator) { + navigator.navigateTo(path.pathString) + } else { + navigator.navigateTo(path.absolutePathString()) + } + } } } }) diff --git a/src/main/kotlin/app/termora/transfer/TransportPanel.kt b/src/main/kotlin/app/termora/transfer/TransportPanel.kt index 48ce5cd..5d818a6 100644 --- a/src/main/kotlin/app/termora/transfer/TransportPanel.kt +++ b/src/main/kotlin/app/termora/transfer/TransportPanel.kt @@ -249,9 +249,9 @@ internal class TransportPanel( val workdir = workdir ?: return if (e.actionCommand.isNullOrBlank()) { if (bookmarkBtn.isBookmark) { - bookmarkBtn.deleteBookmark(workdir.absolutePathString()) + bookmarkBtn.deleteBookmark(workdir.pathString) } else { - bookmarkBtn.addBookmark(workdir.absolutePathString()) + bookmarkBtn.addBookmark(workdir.pathString) } bookmarkBtn.isBookmark = bookmarkBtn.isBookmark.not() } else { @@ -263,7 +263,8 @@ internal class TransportPanel( homeBtn.addActionListener(createSmartAction(object : AbstractAction() { override fun actionPerformed(e: ActionEvent) { if (loader.isLoaded()) { - navigator.navigateTo(loader.getSyncTransportSupport().getDefaultPath().absolutePathString()) + val home = loader.getSyncTransportSupport().getDefaultPath().absolutePathString() + reload(newPath = home, requestFocus = true) } } })) @@ -344,7 +345,7 @@ internal class TransportPanel( addPropertyChangeListener("workdir") { evt -> val newValue = evt.newValue if (newValue is Path) { - bookmarkBtn.isBookmark = bookmarkBtn.getBookmarks().contains(newValue.absolutePathString()) + bookmarkBtn.isBookmark = bookmarkBtn.getBookmarks().contains(newValue.pathString) } } @@ -404,14 +405,6 @@ internal class TransportPanel( } }) - table.addKeyListener(object : KeyAdapter() { - override fun keyPressed(e: KeyEvent) { - if (e.keyCode == KeyEvent.VK_ENTER) { - enterSelectionFolder() - } - } - }) - // https://github.com/TermoraDev/termora/issues/401 table.addMouseListener(object : MouseAdapter() { override fun mouseClicked(e: MouseEvent) { @@ -467,6 +460,12 @@ internal class TransportPanel( } }) + table.actionMap.put("EnterSelectionFolder", object : AbstractAction() { + override fun actionPerformed(e: ActionEvent) { + enterSelectionFolder() + } + }) + // 快速导航 table.addKeyListener(object : KeyAdapter() { override fun keyPressed(e: KeyEvent) { @@ -494,6 +493,7 @@ internal class TransportPanel( if (SystemInfo.isMacOS.not()) { inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0), "Reload") } + inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "EnterSelectionFolder") inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_R, toolkit.menuShortcutKeyMaskEx), "Reload") } @@ -601,7 +601,12 @@ internal class TransportPanel( if (workdir != null) registerSelectRow(workdir.name) } - navigator.navigateTo(path.absolutePathString()) + // Windows 比较特殊,显示盘符页 + if (path.fileSystem.isWindowsFileSystem() && path.pathString == path.fileSystem.separator) { + navigator.navigateTo(path.pathString) + } else { + navigator.navigateTo(path.absolutePathString()) + } } private fun registerSelectRow(name: String) { diff --git a/src/main/kotlin/app/termora/transfer/TransportTabbed.kt b/src/main/kotlin/app/termora/transfer/TransportTabbed.kt index 5b91a0f..f5135a9 100644 --- a/src/main/kotlin/app/termora/transfer/TransportTabbed.kt +++ b/src/main/kotlin/app/termora/transfer/TransportTabbed.kt @@ -139,7 +139,8 @@ internal class TransportTabbed( } fun addLocalTab() { - val host = Host(name = "Local", protocol = LocalProtocolProvider.PROTOCOL) + // local id 必须固定,不然书签无法使用 + val host = Host(id = "local", name = "Local", protocol = LocalProtocolProvider.PROTOCOL) val fs = FileSystems.getDefault() val support = DefaultTransportSupport(fs, fs.getPath(getDefaultLocalPath())) val panel = TransportPanel(internalTransferManager, host, object : TransportSupportLoader { diff --git a/src/main/kotlin/app/termora/transfer/s3/S3FileSystem.kt b/src/main/kotlin/app/termora/transfer/s3/S3FileSystem.kt index 514770d..2e5daed 100644 --- a/src/main/kotlin/app/termora/transfer/s3/S3FileSystem.kt +++ b/src/main/kotlin/app/termora/transfer/s3/S3FileSystem.kt @@ -22,7 +22,7 @@ open class S3FileSystem(provider: S3FileSystemProvider) : BaseFileSystem } override fun close() { - isOpen.compareAndSet(false, true) + isOpen.compareAndSet(true, false) } override fun getRootDirectories(): Iterable {