diff --git a/src/main/kotlin/app/termora/MyTabbedPane.kt b/src/main/kotlin/app/termora/MyTabbedPane.kt index 1bc9e70..c46785c 100644 --- a/src/main/kotlin/app/termora/MyTabbedPane.kt +++ b/src/main/kotlin/app/termora/MyTabbedPane.kt @@ -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 } } } diff --git a/src/main/kotlin/app/termora/SettingsOptionsPane.kt b/src/main/kotlin/app/termora/SettingsOptionsPane.kt index e46f1f2..0f43f77 100644 --- a/src/main/kotlin/app/termora/SettingsOptionsPane.kt +++ b/src/main/kotlin/app/termora/SettingsOptionsPane.kt @@ -114,6 +114,7 @@ class SettingsOptionsPane : OptionsPane() { val languageComboBox = FlatComboBox() val backgroundComBoBox = YesOrNoComboBox() val confirmTabCloseComBoBox = YesOrNoComboBox() + val tabOrderComboBox = FlatComboBox() 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)) diff --git a/src/main/kotlin/app/termora/TabOrder.kt b/src/main/kotlin/app/termora/TabOrder.kt new file mode 100644 index 0000000..c8f3a86 --- /dev/null +++ b/src/main/kotlin/app/termora/TabOrder.kt @@ -0,0 +1,7 @@ +package app.termora + +internal enum class TabOrder { + Hide, + AsNeed, + Always, +} \ No newline at end of file diff --git a/src/main/kotlin/app/termora/actions/DataProviders.kt b/src/main/kotlin/app/termora/actions/DataProviders.kt index 83fba34..3ca504e 100644 --- a/src/main/kotlin/app/termora/actions/DataProviders.kt +++ b/src/main/kotlin/app/termora/actions/DataProviders.kt @@ -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) diff --git a/src/main/kotlin/app/termora/database/DatabaseManager.kt b/src/main/kotlin/app/termora/database/DatabaseManager.kt index 201d869..0182140 100644 --- a/src/main/kotlin/app/termora/database/DatabaseManager.kt +++ b/src/main/kotlin/app/termora/database/DatabaseManager.kt @@ -721,6 +721,11 @@ class DatabaseManager private constructor() : Disposable { */ var layout by StringPropertyDelegate(TermoraLayout.Screen.name) + /** + * 标签序号 + */ + var tabOrder by StringPropertyDelegate(TabOrder.Hide.name) + /** * 跟随系统 */ diff --git a/src/main/resources/i18n/messages.properties b/src/main/resources/i18n/messages.properties index 42950a8..afb4cae 100644 --- a/src/main/resources/i18n/messages.properties +++ b/src/main/resources/i18n/messages.properties @@ -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 diff --git a/src/main/resources/i18n/messages_ru_RU.properties b/src/main/resources/i18n/messages_ru_RU.properties index f37a120..20a5f5b 100644 --- a/src/main/resources/i18n/messages_ru_RU.properties +++ b/src/main/resources/i18n/messages_ru_RU.properties @@ -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=Безопасность diff --git a/src/main/resources/i18n/messages_zh_CN.properties b/src/main/resources/i18n/messages_zh_CN.properties index 8aa29aa..3004c40 100644 --- a/src/main/resources/i18n/messages_zh_CN.properties +++ b/src/main/resources/i18n/messages_zh_CN.properties @@ -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 diff --git a/src/main/resources/i18n/messages_zh_TW.properties b/src/main/resources/i18n/messages_zh_TW.properties index c1489b2..036cc97 100644 --- a/src/main/resources/i18n/messages_zh_TW.properties +++ b/src/main/resources/i18n/messages_zh_TW.properties @@ -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=鍵盤