From a5638329e7aaeb184d2be31e6b3f375f01caff12 Mon Sep 17 00:00:00 2001 From: hstyi Date: Tue, 29 Jul 2025 09:14:50 +0800 Subject: [PATCH] feat: support transfer double-click behavior --- .../kotlin/app/termora/SettingsOptionsPane.kt | 30 +++++++++++++++++++ .../app/termora/database/DatabaseManager.kt | 6 ++++ .../app/termora/transfer/TransportPanel.kt | 11 ++++++- src/main/resources/i18n/messages.properties | 1 + .../resources/i18n/messages_ru_RU.properties | 1 + .../resources/i18n/messages_zh_CN.properties | 1 + .../resources/i18n/messages_zh_TW.properties | 1 + 7 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/app/termora/SettingsOptionsPane.kt b/src/main/kotlin/app/termora/SettingsOptionsPane.kt index 0729daf..df00efa 100644 --- a/src/main/kotlin/app/termora/SettingsOptionsPane.kt +++ b/src/main/kotlin/app/termora/SettingsOptionsPane.kt @@ -650,6 +650,7 @@ class SettingsOptionsPane : OptionsPane() { private val browseEditCommandBtn = JButton(Icons.folder) private val pinTabComboBox = YesOrNoComboBox() private val preserveModificationTimeComboBox = YesOrNoComboBox() + private val doubleClickComboBox = OutlineComboBox() private val sftp get() = database.sftp init { @@ -699,6 +700,13 @@ class SettingsOptionsPane : OptionsPane() { }) + doubleClickComboBox.addItemListener(object : ItemListener { + override fun itemStateChanged(e: ItemEvent) { + if (e.stateChange != ItemEvent.SELECTED) return + sftp.dbClickBehavior = doubleClickComboBox.selectedItem as String + } + }) + preserveModificationTimeComboBox.addItemListener { if (it.stateChange == ItemEvent.SELECTED) { sftp.preserveModificationTime = preserveModificationTimeComboBox.selectedItem as Boolean @@ -780,6 +788,26 @@ class SettingsOptionsPane : OptionsPane() { sftpCommandField.text = sftp.sftpCommand pinTabComboBox.selectedItem = sftp.pinTab preserveModificationTimeComboBox.selectedItem = sftp.preserveModificationTime + + doubleClickComboBox.renderer = object : DefaultListCellRenderer() { + override fun getListCellRendererComponent( + list: JList<*>?, + value: Any?, + index: Int, + isSelected: Boolean, + cellHasFocus: Boolean + ): Component? { + var text = value?.toString() + if (value == "Edit") text = I18n.getString("termora.keymgr.edit") + if (value == "Transfer") text = getTitle() + return super.getListCellRendererComponent(list, text, index, isSelected, cellHasFocus) + } + } + + doubleClickComboBox.addItem("Transfer") + doubleClickComboBox.addItem("Edit") + + doubleClickComboBox.selectedItem = sftp.dbClickBehavior } override fun getIcon(isSelected: Boolean): Icon { @@ -813,6 +841,8 @@ class SettingsOptionsPane : OptionsPane() { builder.add(editCommandField).xy(3, rows).apply { rows += 2 } builder.add("${I18n.getString("termora.tabbed.contextmenu.sftp-command")}:").xy(1, rows) builder.add(sftpCommandField).xy(3, rows).apply { rows += 2 } + builder.add("${I18n.getString("termora.settings.sftp.db-click-behavior")}:").xy(1, rows) + builder.add(doubleClickComboBox).xy(3, rows).apply { rows += 2 } builder.add("${I18n.getString("termora.settings.sftp.default-directory")}:").xy(1, rows) builder.add(defaultDirectoryField).xy(3, rows).apply { rows += 2 } builder.add(box).xyw(1, rows, 3).apply { rows += 2 } diff --git a/src/main/kotlin/app/termora/database/DatabaseManager.kt b/src/main/kotlin/app/termora/database/DatabaseManager.kt index e91ffbd..e4091a4 100644 --- a/src/main/kotlin/app/termora/database/DatabaseManager.kt +++ b/src/main/kotlin/app/termora/database/DatabaseManager.kt @@ -763,6 +763,12 @@ class DatabaseManager private constructor() : Disposable { */ var editCommand by StringPropertyDelegate(StringUtils.EMPTY) + /** + * 双击行为 + * + * Transfer、Edit + */ + var dbClickBehavior by StringPropertyDelegate("Transfer") /** * sftp command diff --git a/src/main/kotlin/app/termora/transfer/TransportPanel.kt b/src/main/kotlin/app/termora/transfer/TransportPanel.kt index 827546e..fefb4d6 100644 --- a/src/main/kotlin/app/termora/transfer/TransportPanel.kt +++ b/src/main/kotlin/app/termora/transfer/TransportPanel.kt @@ -430,6 +430,7 @@ internal class TransportPanel( }) table.addMouseListener(object : MouseAdapter() { + private val sftp get() = DatabaseManager.getInstance().sftp override fun mouseClicked(e: MouseEvent) { if (SwingUtilities.isLeftMouseButton(e) && e.clickCount % 2 == 0) { var row = table.selectedRow @@ -438,10 +439,18 @@ internal class TransportPanel( val attributes = model.getAttributes(row) if (attributes.isDirectory) { enterSelectionFolder() + } else if (sftp.dbClickBehavior == "Edit") { + val path = model.getPath(row) + val target = Application.createSubTemporaryDir().resolve(path.name) + val transferId = internalTransferManager.addHighTransfer(path, target) + editTransferListener.addListenTransfer(transferId) } else { val paths = listOf(model.getPath(row) to attributes) if (loader.isOpened() && internalTransferManager.canTransfer(paths.map { it.first })) { - internalTransferManager.addTransfer(paths, InternalTransferManager.TransferMode.Transfer) + internalTransferManager.addTransfer( + paths, + InternalTransferManager.TransferMode.Transfer + ) } } } else if (SwingUtilities.isRightMouseButton(e)) { diff --git a/src/main/resources/i18n/messages.properties b/src/main/resources/i18n/messages.properties index 6a3872a..a5bff40 100644 --- a/src/main/resources/i18n/messages.properties +++ b/src/main/resources/i18n/messages.properties @@ -115,6 +115,7 @@ termora.settings.keymap.already-exists=The shortcut [{0}] is already in use by [ termora.settings.sftp.edit-command=Edit Command +termora.settings.sftp.db-click-behavior=Double-click termora.settings.sftp.fixed-tab=Fixed tab termora.settings.sftp.default-directory=Default Directory termora.settings.sftp.preserve-time=Preserve original file modification time diff --git a/src/main/resources/i18n/messages_ru_RU.properties b/src/main/resources/i18n/messages_ru_RU.properties index 723bdee..1de9451 100644 --- a/src/main/resources/i18n/messages_ru_RU.properties +++ b/src/main/resources/i18n/messages_ru_RU.properties @@ -101,6 +101,7 @@ termora.settings.keymap.already-exists=Комбинация [{0}] уже исп termora.settings.sftp.edit-command=Редактировать команду +termora.settings.sftp.db-click-behavior=двойной щелчок termora.settings.sftp.fixed-tab=Отображать вкладку termora.settings.sftp.default-directory=Директория по умолчанию termora.settings.sftp.preserve-time=Сохранять исходное время модификации файла diff --git a/src/main/resources/i18n/messages_zh_CN.properties b/src/main/resources/i18n/messages_zh_CN.properties index 27d961d..edcf845 100644 --- a/src/main/resources/i18n/messages_zh_CN.properties +++ b/src/main/resources/i18n/messages_zh_CN.properties @@ -127,6 +127,7 @@ termora.settings.keymap.already-exists=快捷键 [{0}] 已经被 [{1}] 占用 termora.settings.sftp.edit-command=编辑命令 +termora.settings.sftp.db-click-behavior=双击行为 termora.settings.sftp.fixed-tab=固定标签 termora.settings.sftp.default-directory=默认目录 termora.settings.sftp.preserve-time=保留原始文件修改时间 diff --git a/src/main/resources/i18n/messages_zh_TW.properties b/src/main/resources/i18n/messages_zh_TW.properties index a13eac9..4f3113d 100644 --- a/src/main/resources/i18n/messages_zh_TW.properties +++ b/src/main/resources/i18n/messages_zh_TW.properties @@ -56,6 +56,7 @@ termora.settings.keymap.action=操作 termora.settings.keymap.already-exists=快捷鍵 [{0}] 已經被 [{1}] 占用 termora.settings.sftp.edit-command=編輯命令 +termora.settings.sftp.db-click-behavior=按兩下行為 termora.settings.sftp.fixed-tab=固定標籤 termora.settings.sftp.default-directory=預設目錄 termora.settings.sftp.preserve-time=保留原始文件修改時間