mirror of
https://github.com/TermoraDev/termora.git
synced 2026-01-16 02:12: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.AnActionEvent
|
||||||
import app.termora.actions.DataProviders
|
import app.termora.actions.DataProviders
|
||||||
import app.termora.actions.SwitchTabAction
|
import app.termora.actions.SwitchTabAction
|
||||||
|
import app.termora.database.DatabaseManager
|
||||||
import app.termora.keymap.KeyShortcut
|
import app.termora.keymap.KeyShortcut
|
||||||
import app.termora.keymap.KeymapManager
|
import app.termora.keymap.KeymapManager
|
||||||
import com.formdev.flatlaf.extras.components.FlatTabbedPane
|
import com.formdev.flatlaf.extras.components.FlatTabbedPane
|
||||||
@@ -15,7 +16,7 @@ import java.util.*
|
|||||||
import javax.swing.*
|
import javax.swing.*
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
|
|
||||||
class MyTabbedPane : FlatTabbedPane(), Disposable {
|
internal class MyTabbedPane : FlatTabbedPane(), Disposable {
|
||||||
|
|
||||||
private val dragMouseAdaptor = DragMouseAdaptor()
|
private val dragMouseAdaptor = DragMouseAdaptor()
|
||||||
private val terminalTabbedManager
|
private val terminalTabbedManager
|
||||||
@@ -25,13 +26,29 @@ class MyTabbedPane : FlatTabbedPane(), Disposable {
|
|||||||
get() = AnActionEvent(this, StringUtils.EMPTY, EventObject(this))
|
get() = AnActionEvent(this, StringUtils.EMPTY, EventObject(this))
|
||||||
.getData(DataProviders.TermoraFrame) as TermoraFrame
|
.getData(DataProviders.TermoraFrame) as TermoraFrame
|
||||||
private val keymap get() = KeymapManager.getInstance().getActiveKeymap()
|
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
|
private var isSwitchTabMode = false
|
||||||
set(value) {
|
set(value) {
|
||||||
|
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
|
field = value
|
||||||
repaint()
|
repaint()
|
||||||
}
|
}
|
||||||
|
}
|
||||||
private val isScreen get() = TermoraLayout.Layout == TermoraLayout.Screen
|
}
|
||||||
|
|
||||||
init {
|
init {
|
||||||
isFocusable = false
|
isFocusable = false
|
||||||
@@ -108,6 +125,9 @@ class MyTabbedPane : FlatTabbedPane(), Disposable {
|
|||||||
} else if (event is WindowEvent) {
|
} else if (event is WindowEvent) {
|
||||||
if (event.id == WindowEvent.WINDOW_LOST_FOCUS || event.id == WindowEvent.WINDOW_DEACTIVATED) {
|
if (event.id == WindowEvent.WINDOW_LOST_FOCUS || event.id == WindowEvent.WINDOW_DEACTIVATED) {
|
||||||
if (isSwitchTabMode) isSwitchTabMode = false
|
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 languageComboBox = FlatComboBox<String>()
|
||||||
val backgroundComBoBox = YesOrNoComboBox()
|
val backgroundComBoBox = YesOrNoComboBox()
|
||||||
val confirmTabCloseComBoBox = YesOrNoComboBox()
|
val confirmTabCloseComBoBox = YesOrNoComboBox()
|
||||||
|
val tabOrderComboBox = FlatComboBox<TabOrder>()
|
||||||
val followSystemCheckBox = JCheckBox(I18n.getString("termora.settings.appearance.follow-system"))
|
val followSystemCheckBox = JCheckBox(I18n.getString("termora.settings.appearance.follow-system"))
|
||||||
val preferredThemeBtn = JButton(Icons.settings)
|
val preferredThemeBtn = JButton(Icons.settings)
|
||||||
val opacitySpinner = NumberSpinner(100, 0, 100)
|
val opacitySpinner = NumberSpinner(100, 0, 100)
|
||||||
@@ -128,6 +129,12 @@ class SettingsOptionsPane : OptionsPane() {
|
|||||||
|
|
||||||
private fun initView() {
|
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.Screen)
|
||||||
layoutComboBox.addItem(TermoraLayout.Fence)
|
layoutComboBox.addItem(TermoraLayout.Fence)
|
||||||
layoutComboBox.renderer = object : DefaultListCellRenderer() {
|
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 {
|
opacitySpinner.addChangeListener {
|
||||||
val opacity = opacitySpinner.value
|
val opacity = opacitySpinner.value
|
||||||
if (opacity is Double) {
|
if (opacity is Double) {
|
||||||
@@ -349,7 +364,7 @@ class SettingsOptionsPane : OptionsPane() {
|
|||||||
private fun getFormPanel(): JPanel {
|
private fun getFormPanel(): JPanel {
|
||||||
val layout = FormLayout(
|
val layout = FormLayout(
|
||||||
"left:pref, $FORM_MARGIN, default:grow, $FORM_MARGIN, default, default:grow",
|
"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()
|
val box = FlatToolBar()
|
||||||
box.add(followSystemCheckBox)
|
box.add(followSystemCheckBox)
|
||||||
@@ -380,6 +395,9 @@ class SettingsOptionsPane : OptionsPane() {
|
|||||||
builder.add("${I18n.getString("termora.settings.appearance.background-running")}:").xy(1, rows)
|
builder.add("${I18n.getString("termora.settings.appearance.background-running")}:").xy(1, rows)
|
||||||
.add(backgroundComBoBox).xy(3, rows).apply { rows += step }
|
.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()
|
val confirmTabCloseBox = Box.createHorizontalBox()
|
||||||
confirmTabCloseBox.add(JLabel("${I18n.getString("termora.settings.appearance.confirm-tab-close")}:"))
|
confirmTabCloseBox.add(JLabel("${I18n.getString("termora.settings.appearance.confirm-tab-close")}:"))
|
||||||
confirmTabCloseBox.add(Box.createHorizontalStrut(8))
|
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 Terminal = DataKey(app.termora.terminal.Terminal::class)
|
||||||
val TerminalWriter get() = DataKey.TerminalWriter
|
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 TerminalTabbed = DataKey(app.termora.TerminalTabbed::class)
|
||||||
val TerminalTab = DataKey(app.termora.TerminalTab::class)
|
val TerminalTab = DataKey(app.termora.TerminalTab::class)
|
||||||
val TerminalTabbedManager = DataKey(app.termora.TerminalTabbedManager::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 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.follow-system=Sync with OS
|
||||||
termora.settings.appearance.opacity=Opacity
|
termora.settings.appearance.opacity=Opacity
|
||||||
termora.settings.appearance.background-running=Backgrounding
|
termora.settings.appearance.background-running=Backgrounding
|
||||||
|
termora.settings.appearance.tab-order=Tab Order
|
||||||
termora.settings.appearance.confirm-tab-close=Confirm tab close
|
termora.settings.appearance.confirm-tab-close=Confirm tab close
|
||||||
|
|
||||||
termora.settings.terminal=Terminal
|
termora.settings.terminal=Terminal
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ termora.settings.appearance.follow-system=Как в системе
|
|||||||
termora.settings.appearance.opacity=Прозрачность
|
termora.settings.appearance.opacity=Прозрачность
|
||||||
termora.settings.appearance.background-image=Фоновое изображение
|
termora.settings.appearance.background-image=Фоновое изображение
|
||||||
termora.settings.appearance.background-running=Фон
|
termora.settings.appearance.background-running=Фон
|
||||||
|
termora.settings.appearance.tab-order=Порядок вкладок
|
||||||
termora.settings.appearance.confirm-tab-close=Подтверждение закрытия вкладки
|
termora.settings.appearance.confirm-tab-close=Подтверждение закрытия вкладки
|
||||||
|
|
||||||
termora.setting.security=Безопасность
|
termora.setting.security=Безопасность
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ termora.settings.appearance.i-want-to-translate=我想要翻译
|
|||||||
termora.settings.appearance.follow-system=跟随系统
|
termora.settings.appearance.follow-system=跟随系统
|
||||||
termora.settings.appearance.opacity=透明度
|
termora.settings.appearance.opacity=透明度
|
||||||
termora.settings.appearance.background-running=后台运行
|
termora.settings.appearance.background-running=后台运行
|
||||||
|
termora.settings.appearance.tab-order=标签序号
|
||||||
termora.settings.appearance.confirm-tab-close=标签关闭前确认
|
termora.settings.appearance.confirm-tab-close=标签关闭前确认
|
||||||
|
|
||||||
# Find everywhere
|
# Find everywhere
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ termora.settings.appearance.i-want-to-translate=我想要翻譯
|
|||||||
termora.settings.appearance.follow-system=跟隨系統
|
termora.settings.appearance.follow-system=跟隨系統
|
||||||
termora.settings.appearance.opacity=透明度
|
termora.settings.appearance.opacity=透明度
|
||||||
termora.settings.appearance.background-running=後台運行
|
termora.settings.appearance.background-running=後台運行
|
||||||
|
termora.settings.appearance.tab-order=標籤序號
|
||||||
termora.settings.appearance.confirm-tab-close=關閉分頁確認
|
termora.settings.appearance.confirm-tab-close=關閉分頁確認
|
||||||
|
|
||||||
termora.settings.keymap=鍵盤
|
termora.settings.keymap=鍵盤
|
||||||
|
|||||||
Reference in New Issue
Block a user