fix: transfer causing repositioning after refresh

This commit is contained in:
hstyi
2025-08-09 11:45:08 +08:00
committed by hstyi
parent 5f8b9d36e2
commit a77a03d8b3

View File

@@ -106,6 +106,7 @@ internal class TransportPanel(
private val loadingPanel = LoadingPanel() private val loadingPanel = LoadingPanel()
private val model = TransportTableModel() private val model = TransportTableModel()
private val table = JTable(model) private val table = JTable(model)
private val tableScrollPane = JScrollPane(table)
private val sorter = TableRowSorter(table.model) private val sorter = TableRowSorter(table.model)
private var hasParent = false private var hasParent = false
private val panel get() = this private val panel get() = this
@@ -211,7 +212,7 @@ internal class TransportPanel(
table.setDefaultRenderer(Any::class.java, MyDefaultTableCellRenderer()) table.setDefaultRenderer(Any::class.java, MyDefaultTableCellRenderer())
val scrollPane = JScrollPane(table) val scrollPane = tableScrollPane
scrollPane.apply { border = BorderFactory.createMatteBorder(1, 0, 0, 0, DynamicColor.BorderColor) } scrollPane.apply { border = BorderFactory.createMatteBorder(1, 0, 0, 0, DynamicColor.BorderColor) }
layeredPane.add(scrollPane, JLayeredPane.DEFAULT_LAYER as Any) layeredPane.add(scrollPane, JLayeredPane.DEFAULT_LAYER as Any)
@@ -241,7 +242,11 @@ internal class TransportPanel(
Disposer.register(this, editTransferListener) Disposer.register(this, editTransferListener)
refreshBtn.addActionListener { reload(requestFocus = true) } refreshBtn.addActionListener {
val filename = getSelectFilename()
if (filename != null) registerSelectRow(filename)
reload(requestFocus = true)
}
prevBtn.addActionListener { navigator.back() } prevBtn.addActionListener { navigator.back() }
nextBtn.addActionListener { navigator.forward() } nextBtn.addActionListener { navigator.forward() }
@@ -303,11 +308,16 @@ internal class TransportPanel(
if (target.fileSystem != loader.getSyncTransportSupport().getFileSystem()) return if (target.fileSystem != loader.getSyncTransportSupport().getFileSystem()) return
} }
if (target.pathString == workdir?.pathString || target.parent.pathString == workdir?.pathString) { if (target.pathString == workdir?.pathString || target.parent.pathString == workdir?.pathString) {
if (loading) { val c = {
registerNextReloadCallback { reload(requestFocus = false) } val filename = getSelectFilename()
} else { if (filename != null) registerSelectRow(filename)
reload(requestFocus = false) reload(requestFocus = false)
} }
if (loading) {
registerNextReloadCallback { c.invoke() }
} else {
c.invoke()
}
} }
} }
}).let { Disposer.register(this, it) } }).let { Disposer.register(this, it) }
@@ -658,6 +668,9 @@ internal class TransportPanel(
} }
fun registerSelectRow(name: String) { fun registerSelectRow(name: String) {
val verticalValue = tableScrollPane.verticalScrollBar.value
val horizontalValue = tableScrollPane.horizontalScrollBar.value
registerNextReloadCallback { registerNextReloadCallback {
for (i in 0 until model.rowCount) { for (i in 0 until model.rowCount) {
if (model.getAttributes(i).name == name) { if (model.getAttributes(i).name == name) {
@@ -665,12 +678,22 @@ internal class TransportPanel(
table.clearSelection() table.clearSelection()
table.setRowSelectionInterval(c, c) table.setRowSelectionInterval(c, c)
table.scrollRectToVisible(table.getCellRect(c, TransportTableModel.COLUMN_NAME, true)) table.scrollRectToVisible(table.getCellRect(c, TransportTableModel.COLUMN_NAME, true))
tableScrollPane.verticalScrollBar.value = verticalValue
tableScrollPane.horizontalScrollBar.value = horizontalValue
break break
} }
} }
} }
} }
fun getSelectFilename(): String? {
val row = table.selectedRow
if (row < 0) return null
val c = sorter.convertRowIndexToModel(row)
if (c < 0) return null
return model.getAttributes(c).name
}
private fun registerNextReloadCallback(block: () -> Unit) { private fun registerNextReloadCallback(block: () -> Unit) {
nextReloadCallbacks.computeIfAbsent(mod.get()) { mutableListOf() } nextReloadCallbacks.computeIfAbsent(mod.get()) { mutableListOf() }
.add(block) .add(block)
@@ -1083,6 +1106,8 @@ internal class TransportPanel(
} else if (actionCommand == TransportPopupMenu.ActionCommand.Delete) { } else if (actionCommand == TransportPopupMenu.ActionCommand.Delete) {
transfer(InternalTransferManager.TransferMode.Delete) transfer(InternalTransferManager.TransferMode.Delete)
} else if (actionCommand == TransportPopupMenu.ActionCommand.Refresh) { } else if (actionCommand == TransportPopupMenu.ActionCommand.Refresh) {
val filename = getSelectFilename()
if (filename != null) registerSelectRow(filename)
reload(requestFocus = true) reload(requestFocus = true)
} else if (actionCommand == TransportPopupMenu.ActionCommand.Edit) { } else if (actionCommand == TransportPopupMenu.ActionCommand.Edit) {
edit() edit()