chore: improve sidebar

This commit is contained in:
hstyi
2025-07-04 16:27:11 +08:00
committed by hstyi
parent 919c06779d
commit d1dba56bcd
5 changed files with 67 additions and 4 deletions

View File

@@ -94,6 +94,7 @@ class JSplitPaneWithZeroSizeDivider(
synchronized(treeLock) { synchronized(treeLock) {
for (c in components) { for (c in components) {
if (c == divider) { if (c == divider) {
c.isVisible = splitPane.leftComponent.isVisible
c.setBounds( c.setBounds(
splitPane.dividerLocation - w, splitPane.dividerLocation - w,
topOffset.get(), topOffset.get(),
@@ -109,8 +110,10 @@ class JSplitPaneWithZeroSizeDivider(
override fun paint(g: Graphics) { override fun paint(g: Graphics) {
super.paint(g) super.paint(g)
g.color = UIManager.getColor("controlShadow") if (divider.isVisible) {
g.fillRect(splitPane.dividerLocation, 0, 1, topOffset.get()) g.color = UIManager.getColor("controlShadow")
g.fillRect(splitPane.dividerLocation, 0, 1, topOffset.get())
}
} }
} }

View File

@@ -1,13 +1,20 @@
package app.termora package app.termora
import app.termora.actions.AnAction
import app.termora.actions.AnActionEvent
import app.termora.tree.NewHostTree import app.termora.tree.NewHostTree
import com.formdev.flatlaf.extras.components.FlatTabbedPane import com.formdev.flatlaf.extras.components.FlatTabbedPane
import com.formdev.flatlaf.extras.components.FlatToolBar
import com.formdev.flatlaf.util.SystemInfo import com.formdev.flatlaf.util.SystemInfo
import java.awt.BorderLayout import java.awt.BorderLayout
import java.awt.Dimension import java.awt.Dimension
import java.awt.Font import java.awt.Font
import java.awt.event.ComponentAdapter
import java.awt.event.ComponentEvent
import java.awt.event.KeyEvent
import java.awt.event.MouseAdapter import java.awt.event.MouseAdapter
import javax.swing.* import javax.swing.*
import kotlin.math.max
class TermoraFencePanel( class TermoraFencePanel(
@@ -24,6 +31,8 @@ class TermoraFencePanel(
private val leftTreePanel = LeftTreePanel() private val leftTreePanel = LeftTreePanel()
private val mySplitPane = JSplitPaneWithZeroSizeDivider(splitPane) { tabbed.tabHeight } private val mySplitPane = JSplitPaneWithZeroSizeDivider(splitPane) { tabbed.tabHeight }
private val enableManager get() = EnableManager.getInstance() private val enableManager get() = EnableManager.getInstance()
private val toolbar = FlatToolBar().apply { isFloatable = false }
private var dividerLocation = 0
init { init {
initView() initView()
@@ -44,12 +53,39 @@ class TermoraFencePanel(
tabbed.tabType = FlatTabbedPane.TabType.underlined tabbed.tabType = FlatTabbedPane.TabType.underlined
tabbed.tabAreaInsets = null tabbed.tabAreaInsets = null
// macOS 避开控制栏
if (SystemInfo.isMacOS) {
toolbar.add(Box.createHorizontalStrut(76))
}
toolbar.add(createColspanAction())
tabbed.leadingComponent = toolbar
toolbar.isVisible = false
add(mySplitPane, BorderLayout.CENTER) add(mySplitPane, BorderLayout.CENTER)
} }
private fun initEvents() { private fun initEvents() {
Disposer.register(this, leftTreePanel) Disposer.register(this, leftTreePanel)
splitPane.addPropertyChangeListener("dividerLocation") { mySplitPane.doLayout() } splitPane.addPropertyChangeListener("dividerLocation") { mySplitPane.doLayout() }
leftTreePanel.addComponentListener(object : ComponentAdapter() {
override fun componentHidden(e: ComponentEvent) {
toolbar.isVisible = true
}
override fun componentShown(e: ComponentEvent) {
toolbar.isVisible = false
}
})
actionMap.put("toggle", createColspanAction())
getInputMap(WHEN_IN_FOCUSED_WINDOW).put(
KeyStroke.getKeyStroke(
KeyEvent.VK_B,
toolkit.menuShortcutKeyMaskEx or KeyEvent.SHIFT_DOWN_MASK
), "toggle"
)
} }
private inner class LeftTreePanel : JPanel(BorderLayout()), Disposable { private inner class LeftTreePanel : JPanel(BorderLayout()), Disposable {
@@ -70,9 +106,14 @@ class TermoraFencePanel(
val label = JLabel(Application.getName()) val label = JLabel(Application.getName())
label.foreground = UIManager.getColor("textInactiveText") label.foreground = UIManager.getColor("textInactiveText")
label.font = label.font.deriveFont(Font.BOLD) label.font = label.font.deriveFont(Font.BOLD)
// 与最后一个按钮对冲,使其宽度和谐
box.add(JButton(Icons.empty))
box.add(Box.createHorizontalGlue()) box.add(Box.createHorizontalGlue())
if (SystemInfo.isMacOS.not()) box.add(label) if (SystemInfo.isMacOS.not()) {
box.add(label)
}
box.add(Box.createHorizontalGlue()) box.add(Box.createHorizontalGlue())
box.add(createColspanAction())
if (SystemInfo.isMacOS || SystemInfo.isLinux) { if (SystemInfo.isMacOS || SystemInfo.isLinux) {
box.addMouseListener(moveMouseAdapter) box.addMouseListener(moveMouseAdapter)
@@ -95,8 +136,24 @@ class TermoraFencePanel(
} }
} }
private fun createColspanAction(): Action {
return object : AnAction(Icons.dataColumn) {
init {
val text = I18n.getString("termora.welcome.toggle-sidebar")
putValue(SHORT_DESCRIPTION, "$text (${if (SystemInfo.isMacOS) '⌘' else "Ctrl"} + Shift + B)")
}
override fun actionPerformed(evt: AnActionEvent) {
if (leftTreePanel.isVisible) dividerLocation = splitPane.dividerLocation
leftTreePanel.isVisible = leftTreePanel.isVisible.not()
if (leftTreePanel.isVisible) splitPane.dividerLocation = dividerLocation
}
}
}
override fun dispose() { override fun dispose() {
enableManager.setFlag("Termora.Fence.dividerLocation", splitPane.dividerLocation) enableManager.setFlag("Termora.Fence.dividerLocation", max(splitPane.dividerLocation, 10))
} }
fun getHostTree(): NewHostTree { fun getHostTree(): NewHostTree {

View File

@@ -154,6 +154,7 @@ termora.find-everywhere.quick-command.local-terminal=Local Terminal
# Welcome # Welcome
termora.welcome.my-hosts=My hosts termora.welcome.my-hosts=My hosts
termora.welcome.toggle-sidebar=Toggle Sidebar
termora.welcome.contextmenu.connect=Connect termora.welcome.contextmenu.connect=Connect
termora.welcome.contextmenu.connect-with=Connect with termora.welcome.contextmenu.connect-with=Connect with
termora.welcome.contextmenu.open-in-new-window=${termora.tabbed.contextmenu.open-in-new-window} termora.welcome.contextmenu.open-in-new-window=${termora.tabbed.contextmenu.open-in-new-window}

View File

@@ -149,6 +149,7 @@ termora.settings.sftp.preserve-time=保留原始文件修改时间
# Welcome # Welcome
termora.welcome.my-hosts=我的主机 termora.welcome.my-hosts=我的主机
termora.welcome.toggle-sidebar=显示/隐藏侧边栏
termora.welcome.contextmenu.connect=连接 termora.welcome.contextmenu.connect=连接
termora.welcome.contextmenu.connect-with=连接到 termora.welcome.contextmenu.connect-with=连接到
termora.welcome.contextmenu.copy=${termora.copy} termora.welcome.contextmenu.copy=${termora.copy}

View File

@@ -148,6 +148,7 @@ termora.settings.account.login-failed=登入失敗,請稍後再試
# Welcome # Welcome
termora.welcome.my-hosts=我的主機 termora.welcome.my-hosts=我的主機
termora.welcome.toggle-sidebar=顯示/隱藏側邊欄
termora.welcome.contextmenu.connect=連接 termora.welcome.contextmenu.connect=連接
termora.welcome.contextmenu.connect-with=連接到 termora.welcome.contextmenu.connect-with=連接到
termora.welcome.contextmenu.copy=複製 termora.welcome.contextmenu.copy=複製