mirror of
https://github.com/TermoraDev/termora.git
synced 2026-01-15 18:02:58 +08:00
feat: tab order settings
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
|
||||
7
src/main/kotlin/app/termora/TabOrder.kt
Normal file
7
src/main/kotlin/app/termora/TabOrder.kt
Normal file
@@ -0,0 +1,7 @@
|
||||
package app.termora
|
||||
|
||||
internal enum class TabOrder {
|
||||
Hide,
|
||||
AsNeed,
|
||||
Always,
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -721,6 +721,11 @@ class DatabaseManager private constructor() : Disposable {
|
||||
*/
|
||||
var layout by StringPropertyDelegate(TermoraLayout.Screen.name)
|
||||
|
||||
/**
|
||||
* 标签序号
|
||||
*/
|
||||
var tabOrder by StringPropertyDelegate(TabOrder.Hide.name)
|
||||
|
||||
/**
|
||||
* 跟随系统
|
||||
*/
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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=Безопасность
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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=鍵盤
|
||||
|
||||
Reference in New Issue
Block a user