mirror of
https://github.com/TermoraDev/termora.git
synced 2026-01-16 02:12:58 +08:00
chore: improve sidebar
This commit is contained in:
@@ -94,6 +94,7 @@ class JSplitPaneWithZeroSizeDivider(
|
||||
synchronized(treeLock) {
|
||||
for (c in components) {
|
||||
if (c == divider) {
|
||||
c.isVisible = splitPane.leftComponent.isVisible
|
||||
c.setBounds(
|
||||
splitPane.dividerLocation - w,
|
||||
topOffset.get(),
|
||||
@@ -109,8 +110,10 @@ class JSplitPaneWithZeroSizeDivider(
|
||||
|
||||
override fun paint(g: Graphics) {
|
||||
super.paint(g)
|
||||
g.color = UIManager.getColor("controlShadow")
|
||||
g.fillRect(splitPane.dividerLocation, 0, 1, topOffset.get())
|
||||
if (divider.isVisible) {
|
||||
g.color = UIManager.getColor("controlShadow")
|
||||
g.fillRect(splitPane.dividerLocation, 0, 1, topOffset.get())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,13 +1,20 @@
|
||||
package app.termora
|
||||
|
||||
import app.termora.actions.AnAction
|
||||
import app.termora.actions.AnActionEvent
|
||||
import app.termora.tree.NewHostTree
|
||||
import com.formdev.flatlaf.extras.components.FlatTabbedPane
|
||||
import com.formdev.flatlaf.extras.components.FlatToolBar
|
||||
import com.formdev.flatlaf.util.SystemInfo
|
||||
import java.awt.BorderLayout
|
||||
import java.awt.Dimension
|
||||
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 javax.swing.*
|
||||
import kotlin.math.max
|
||||
|
||||
|
||||
class TermoraFencePanel(
|
||||
@@ -24,6 +31,8 @@ class TermoraFencePanel(
|
||||
private val leftTreePanel = LeftTreePanel()
|
||||
private val mySplitPane = JSplitPaneWithZeroSizeDivider(splitPane) { tabbed.tabHeight }
|
||||
private val enableManager get() = EnableManager.getInstance()
|
||||
private val toolbar = FlatToolBar().apply { isFloatable = false }
|
||||
private var dividerLocation = 0
|
||||
|
||||
init {
|
||||
initView()
|
||||
@@ -44,12 +53,39 @@ class TermoraFencePanel(
|
||||
tabbed.tabType = FlatTabbedPane.TabType.underlined
|
||||
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)
|
||||
}
|
||||
|
||||
private fun initEvents() {
|
||||
Disposer.register(this, leftTreePanel)
|
||||
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 {
|
||||
@@ -70,9 +106,14 @@ class TermoraFencePanel(
|
||||
val label = JLabel(Application.getName())
|
||||
label.foreground = UIManager.getColor("textInactiveText")
|
||||
label.font = label.font.deriveFont(Font.BOLD)
|
||||
// 与最后一个按钮对冲,使其宽度和谐
|
||||
box.add(JButton(Icons.empty))
|
||||
box.add(Box.createHorizontalGlue())
|
||||
if (SystemInfo.isMacOS.not()) box.add(label)
|
||||
if (SystemInfo.isMacOS.not()) {
|
||||
box.add(label)
|
||||
}
|
||||
box.add(Box.createHorizontalGlue())
|
||||
box.add(createColspanAction())
|
||||
|
||||
if (SystemInfo.isMacOS || SystemInfo.isLinux) {
|
||||
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() {
|
||||
enableManager.setFlag("Termora.Fence.dividerLocation", splitPane.dividerLocation)
|
||||
enableManager.setFlag("Termora.Fence.dividerLocation", max(splitPane.dividerLocation, 10))
|
||||
}
|
||||
|
||||
fun getHostTree(): NewHostTree {
|
||||
|
||||
@@ -154,6 +154,7 @@ termora.find-everywhere.quick-command.local-terminal=Local Terminal
|
||||
|
||||
# Welcome
|
||||
termora.welcome.my-hosts=My hosts
|
||||
termora.welcome.toggle-sidebar=Toggle Sidebar
|
||||
termora.welcome.contextmenu.connect=Connect
|
||||
termora.welcome.contextmenu.connect-with=Connect with
|
||||
termora.welcome.contextmenu.open-in-new-window=${termora.tabbed.contextmenu.open-in-new-window}
|
||||
|
||||
@@ -149,6 +149,7 @@ termora.settings.sftp.preserve-time=保留原始文件修改时间
|
||||
|
||||
# Welcome
|
||||
termora.welcome.my-hosts=我的主机
|
||||
termora.welcome.toggle-sidebar=显示/隐藏侧边栏
|
||||
termora.welcome.contextmenu.connect=连接
|
||||
termora.welcome.contextmenu.connect-with=连接到
|
||||
termora.welcome.contextmenu.copy=${termora.copy}
|
||||
|
||||
@@ -148,6 +148,7 @@ termora.settings.account.login-failed=登入失敗,請稍後再試
|
||||
|
||||
# Welcome
|
||||
termora.welcome.my-hosts=我的主機
|
||||
termora.welcome.toggle-sidebar=顯示/隱藏側邊欄
|
||||
termora.welcome.contextmenu.connect=連接
|
||||
termora.welcome.contextmenu.connect-with=連接到
|
||||
termora.welcome.contextmenu.copy=複製
|
||||
|
||||
Reference in New Issue
Block a user