feat: tab order settings

This commit is contained in:
hstyi
2025-08-08 09:02:35 +08:00
committed by hstyi
parent 969ddc3662
commit 49779fe8f2
9 changed files with 61 additions and 7 deletions

View File

@@ -3,6 +3,7 @@ package app.termora
import app.termora.actions.AnActionEvent
import app.termora.actions.DataProviders
import app.termora.actions.SwitchTabAction
import app.termora.database.DatabaseManager
import app.termora.keymap.KeyShortcut
import app.termora.keymap.KeymapManager
import com.formdev.flatlaf.extras.components.FlatTabbedPane
@@ -15,7 +16,7 @@ import java.util.*
import javax.swing.*
import kotlin.math.abs
class MyTabbedPane : FlatTabbedPane(), Disposable {
internal class MyTabbedPane : FlatTabbedPane(), Disposable {
private val dragMouseAdaptor = DragMouseAdaptor()
private val terminalTabbedManager
@@ -25,14 +26,30 @@ class MyTabbedPane : FlatTabbedPane(), Disposable {
get() = AnActionEvent(this, StringUtils.EMPTY, EventObject(this))
.getData(DataProviders.TermoraFrame) as TermoraFrame
private val keymap get() = KeymapManager.getInstance().getActiveKeymap()
private val tabOrder get() = DatabaseManager.getInstance().appearance.tabOrder
private val isScreen get() = TermoraLayout.Layout == TermoraLayout.Screen
private var isSwitchTabMode = false
set(value) {
field = value
repaint()
if (tabOrder == TabOrder.Always.name) {
if (field.not()) {
field = true
repaint()
}
return
} else if (tabOrder == TabOrder.Hide.name) {
if (field) {
field = false
repaint()
}
return
} else if (tabOrder == TabOrder.AsNeed.name) {
if (field != value) {
field = value
repaint()
}
}
}
private val isScreen get() = TermoraLayout.Layout == TermoraLayout.Screen
init {
isFocusable = false
@@ -108,6 +125,9 @@ class MyTabbedPane : FlatTabbedPane(), Disposable {
} else if (event is WindowEvent) {
if (event.id == WindowEvent.WINDOW_LOST_FOCUS || event.id == WindowEvent.WINDOW_DEACTIVATED) {
if (isSwitchTabMode) isSwitchTabMode = false
} else if (event.id == WindowEvent.WINDOW_GAINED_FOCUS || event.id == WindowEvent.WINDOW_ACTIVATED) {
// 触发一次刷新
isSwitchTabMode = isSwitchTabMode
}
}
}

View File

@@ -114,6 +114,7 @@ class SettingsOptionsPane : OptionsPane() {
val languageComboBox = FlatComboBox<String>()
val backgroundComBoBox = YesOrNoComboBox()
val confirmTabCloseComBoBox = YesOrNoComboBox()
val tabOrderComboBox = FlatComboBox<TabOrder>()
val followSystemCheckBox = JCheckBox(I18n.getString("termora.settings.appearance.follow-system"))
val preferredThemeBtn = JButton(Icons.settings)
val opacitySpinner = NumberSpinner(100, 0, 100)
@@ -128,6 +129,12 @@ class SettingsOptionsPane : OptionsPane() {
private fun initView() {
tabOrderComboBox.addItem(TabOrder.Hide)
tabOrderComboBox.addItem(TabOrder.AsNeed)
tabOrderComboBox.addItem(TabOrder.Always)
tabOrderComboBox.selectedItem = runCatching { TabOrder.valueOf(appearance.tabOrder) }
.getOrNull() ?: TabOrder.Hide
layoutComboBox.addItem(TermoraLayout.Screen)
layoutComboBox.addItem(TermoraLayout.Fence)
layoutComboBox.renderer = object : DefaultListCellRenderer() {
@@ -226,6 +233,14 @@ class SettingsOptionsPane : OptionsPane() {
}
})
tabOrderComboBox.addItemListener(object : ItemListener {
override fun itemStateChanged(e: ItemEvent) {
if (e.stateChange == ItemEvent.SELECTED) {
appearance.tabOrder = tabOrderComboBox.selectedItem?.toString() ?: return
}
}
})
opacitySpinner.addChangeListener {
val opacity = opacitySpinner.value
if (opacity is Double) {
@@ -349,7 +364,7 @@ class SettingsOptionsPane : OptionsPane() {
private fun getFormPanel(): JPanel {
val layout = FormLayout(
"left:pref, $FORM_MARGIN, default:grow, $FORM_MARGIN, default, default:grow",
"pref, $FORM_MARGIN, pref, $FORM_MARGIN, pref, $FORM_MARGIN, pref, $FORM_MARGIN, pref, $FORM_MARGIN, pref"
"pref, $FORM_MARGIN, pref, $FORM_MARGIN, pref, $FORM_MARGIN, pref, $FORM_MARGIN, pref, $FORM_MARGIN, pref, $FORM_MARGIN, pref"
)
val box = FlatToolBar()
box.add(followSystemCheckBox)
@@ -380,6 +395,9 @@ class SettingsOptionsPane : OptionsPane() {
builder.add("${I18n.getString("termora.settings.appearance.background-running")}:").xy(1, rows)
.add(backgroundComBoBox).xy(3, rows).apply { rows += step }
builder.add("${I18n.getString("termora.settings.appearance.tab-order")}:").xy(1, rows)
.add(tabOrderComboBox).xy(3, rows).apply { rows += step }
val confirmTabCloseBox = Box.createHorizontalBox()
confirmTabCloseBox.add(JLabel("${I18n.getString("termora.settings.appearance.confirm-tab-close")}:"))
confirmTabCloseBox.add(Box.createHorizontalStrut(8))

View File

@@ -0,0 +1,7 @@
package app.termora
internal enum class TabOrder {
Hide,
AsNeed,
Always,
}

View File

@@ -8,7 +8,7 @@ object DataProviders {
val Terminal = DataKey(app.termora.terminal.Terminal::class)
val TerminalWriter get() = DataKey.TerminalWriter
val TabbedPane = DataKey(app.termora.MyTabbedPane::class)
internal val TabbedPane = DataKey(app.termora.MyTabbedPane::class)
val TerminalTabbed = DataKey(app.termora.TerminalTabbed::class)
val TerminalTab = DataKey(app.termora.TerminalTab::class)
val TerminalTabbedManager = DataKey(app.termora.TerminalTabbedManager::class)

View File

@@ -721,6 +721,11 @@ class DatabaseManager private constructor() : Disposable {
*/
var layout by StringPropertyDelegate(TermoraLayout.Screen.name)
/**
* 标签序号
*/
var tabOrder by StringPropertyDelegate(TabOrder.Hide.name)
/**
* 跟随系统
*/

View File

@@ -45,6 +45,7 @@ termora.settings.appearance.i-want-to-translate=I want to translate
termora.settings.appearance.follow-system=Sync with OS
termora.settings.appearance.opacity=Opacity
termora.settings.appearance.background-running=Backgrounding
termora.settings.appearance.tab-order=Tab Order
termora.settings.appearance.confirm-tab-close=Confirm tab close
termora.settings.terminal=Terminal

View File

@@ -40,6 +40,7 @@ termora.settings.appearance.follow-system=Как в системе
termora.settings.appearance.opacity=Прозрачность
termora.settings.appearance.background-image=Фоновое изображение
termora.settings.appearance.background-running=Фон
termora.settings.appearance.tab-order=Порядок вкладок
termora.settings.appearance.confirm-tab-close=Подтверждение закрытия вкладки
termora.setting.security=Безопасность

View File

@@ -49,6 +49,7 @@ termora.settings.appearance.i-want-to-translate=我想要翻译
termora.settings.appearance.follow-system=跟随系统
termora.settings.appearance.opacity=透明度
termora.settings.appearance.background-running=后台运行
termora.settings.appearance.tab-order=标签序号
termora.settings.appearance.confirm-tab-close=标签关闭前确认
# Find everywhere

View File

@@ -48,6 +48,7 @@ termora.settings.appearance.i-want-to-translate=我想要翻譯
termora.settings.appearance.follow-system=跟隨系統
termora.settings.appearance.opacity=透明度
termora.settings.appearance.background-running=後台運行
termora.settings.appearance.tab-order=標籤序號
termora.settings.appearance.confirm-tab-close=關閉分頁確認
termora.settings.keymap=鍵盤