diff --git a/src/main/kotlin/app/termora/TerminalFactory.kt b/src/main/kotlin/app/termora/TerminalFactory.kt index 4d597ff..9828f7a 100644 --- a/src/main/kotlin/app/termora/TerminalFactory.kt +++ b/src/main/kotlin/app/termora/TerminalFactory.kt @@ -1,11 +1,13 @@ package app.termora +import app.termora.actions.TerminalFocusModeAction import app.termora.database.DatabaseManager import app.termora.terminal.* import app.termora.terminal.panel.TerminalPanel import app.termora.tlog.TerminalLoggerDataListener import java.awt.Color import javax.swing.UIManager +import kotlin.reflect.cast class TerminalFactory private constructor() : Disposable { private val terminals = mutableListOf() @@ -75,6 +77,8 @@ class TerminalFactory private constructor() : Disposable { override fun getData(key: DataKey, defaultValue: T): T { if (key == TerminalPanel.SelectCopy) { return config.selectCopy as T + } else if (key == TerminalPanel.FocusMode) { + return key.clazz.cast(TerminalFocusModeAction.getInstance().isSelected) } return super.getData(key, defaultValue) } diff --git a/src/main/kotlin/app/termora/actions/ActionManager.kt b/src/main/kotlin/app/termora/actions/ActionManager.kt index 3eda97a..9c72e4a 100644 --- a/src/main/kotlin/app/termora/actions/ActionManager.kt +++ b/src/main/kotlin/app/termora/actions/ActionManager.kt @@ -53,6 +53,7 @@ class ActionManager : org.jdesktop.swingx.action.ActionManager() { addAction(TerminalClearScreenAction.CLEAR_SCREEN, TerminalClearScreenAction()) addAction(OpenLocalTerminalAction.LOCAL_TERMINAL, OpenLocalTerminalAction()) addAction(TerminalSelectAllAction.SELECT_ALL, TerminalSelectAllAction()) + addAction(TerminalFocusModeAction.FocusMode, TerminalFocusModeAction.getInstance()) addAction(TerminalZoomInAction.ZOOM_IN, TerminalZoomInAction()) addAction(TerminalZoomOutAction.ZOOM_OUT, TerminalZoomOutAction()) diff --git a/src/main/kotlin/app/termora/actions/TerminalFocusModeAction.kt b/src/main/kotlin/app/termora/actions/TerminalFocusModeAction.kt new file mode 100644 index 0000000..506f7ef --- /dev/null +++ b/src/main/kotlin/app/termora/actions/TerminalFocusModeAction.kt @@ -0,0 +1,37 @@ +package app.termora.actions + +import app.termora.ApplicationScope +import app.termora.EnableManager +import app.termora.I18n +import app.termora.Icons +import org.slf4j.LoggerFactory + +class TerminalFocusModeAction private constructor() : AnAction( + I18n.getString("termora.actions.focus-mode"), + Icons.eye +) { + + companion object { + const val FocusMode = "TerminalFocusMode" + private val log = LoggerFactory.getLogger(TerminalFocusModeAction::class.java) + fun getInstance(): TerminalFocusModeAction { + return ApplicationScope.forApplicationScope() + .getOrCreate(TerminalFocusModeAction::class) { TerminalFocusModeAction() } + } + } + + init { + putValue(SHORT_DESCRIPTION, I18n.getString("termora.actions.focus-mode")) + putValue(ACTION_COMMAND_KEY, FocusMode) + setStateAction() + isSelected = enableManager.getFlag("Terminal.FocusMode", false) + } + + private val enableManager get() = EnableManager.getInstance() + + + override fun actionPerformed(evt: AnActionEvent) { + enableManager.setFlag("Terminal.FocusMode", isSelected) + } + +} \ No newline at end of file diff --git a/src/main/kotlin/app/termora/findeverywhere/QuickActionsFindEverywhereProvider.kt b/src/main/kotlin/app/termora/findeverywhere/QuickActionsFindEverywhereProvider.kt index 7007d22..84a0eb2 100644 --- a/src/main/kotlin/app/termora/findeverywhere/QuickActionsFindEverywhereProvider.kt +++ b/src/main/kotlin/app/termora/findeverywhere/QuickActionsFindEverywhereProvider.kt @@ -5,6 +5,7 @@ import app.termora.I18n import app.termora.Scope import app.termora.WindowScope import app.termora.actions.MultipleAction +import app.termora.actions.TerminalFocusModeAction import org.jdesktop.swingx.action.ActionManager @@ -13,6 +14,7 @@ class QuickActionsFindEverywhereProvider(private val windowScope: WindowScope) : Actions.KEY_MANAGER, Actions.KEYWORD_HIGHLIGHT, MultipleAction.MULTIPLE, + TerminalFocusModeAction.FocusMode, ) override fun find(pattern: String, scope: Scope): List { diff --git a/src/main/kotlin/app/termora/terminal/panel/TerminalDisplay.kt b/src/main/kotlin/app/termora/terminal/panel/TerminalDisplay.kt index f01b0c7..0a6c186 100644 --- a/src/main/kotlin/app/termora/terminal/panel/TerminalDisplay.kt +++ b/src/main/kotlin/app/termora/terminal/panel/TerminalDisplay.kt @@ -12,6 +12,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.swing.Swing import java.awt.* import javax.swing.JComponent +import javax.swing.UIManager import kotlin.math.ceil import kotlin.math.max import kotlin.math.min @@ -263,9 +264,8 @@ class TerminalDisplay( var j = 1 while (j <= cols) { val position = Position(row + 1, j) - val caret = showCursor && j == cursorPosition.x + inputMethodData.offset - && i == cursorPosition.y + (maxVerticalScrollOffset - verticalScrollOffset) - + val isCursorLine = i == cursorPosition.y + (maxVerticalScrollOffset - verticalScrollOffset) + val caret = showCursor && j == cursorPosition.x + inputMethodData.offset && isCursorLine val (text, style, length) = if (characters.hasNext()) characters.next() else triple var textStyle = style val hasSelection = selectionModel.hasSelection(y = i + verticalScrollOffset, x = j) @@ -307,6 +307,16 @@ class TerminalDisplay( length * averageCharWidth ) + // Focus Mode + if (terminalModel.getData(TerminalPanel.FocusMode, false)) { + if (terminalModel.isAlternateScreenBuffer().not()) { + if (isCursorLine.not()) { + background = colorPalette.getColor(TerminalColor.Basic.BACKGROUND) + foreground = UIManager.getColor("textInactiveText").rgb + } + } + } + // 如果没有颜色反转并且与渲染的背景色一致,那么无需渲染背景 if (textStyle.inverse || background != colorPalette.getColor(TerminalColor.Basic.BACKGROUND)) { g.color = Color(background) diff --git a/src/main/kotlin/app/termora/terminal/panel/TerminalPanel.kt b/src/main/kotlin/app/termora/terminal/panel/TerminalPanel.kt index 1e2d37d..337ce44 100644 --- a/src/main/kotlin/app/termora/terminal/panel/TerminalPanel.kt +++ b/src/main/kotlin/app/termora/terminal/panel/TerminalPanel.kt @@ -44,6 +44,7 @@ class TerminalPanel(val tab: TerminalTab?, val terminal: Terminal, private val w val Finding = DataKey(Boolean::class) val Focused = DataKey(Boolean::class) val SelectCopy = DataKey(Boolean::class) + val FocusMode = DataKey(Boolean::class) } private val properties get() = DatabaseManager.getInstance().properties diff --git a/src/main/resources/i18n/messages.properties b/src/main/resources/i18n/messages.properties index dd31351..6255361 100644 --- a/src/main/resources/i18n/messages.properties +++ b/src/main/resources/i18n/messages.properties @@ -392,6 +392,7 @@ termora.toolbar.customize-toolbar=Customize Toolbar... # Actions termora.actions.copy-from-terminal=Copy from Terminal +termora.actions.focus-mode=Focus Mode termora.actions.paste-to-terminal=Paste to Terminal termora.actions.select-all-in-terminal=Select All in Terminal termora.actions.open-terminal-find=Open Terminal Find diff --git a/src/main/resources/i18n/messages_ru_RU.properties b/src/main/resources/i18n/messages_ru_RU.properties index f44de88..616bfa0 100644 --- a/src/main/resources/i18n/messages_ru_RU.properties +++ b/src/main/resources/i18n/messages_ru_RU.properties @@ -342,6 +342,7 @@ termora.toolbar.customize-toolbar=Настроить Панель Инструм # Actions termora.actions.copy-from-terminal=Копировать из Терминала +termora.actions.focus-mode=Режим фокусировки termora.actions.paste-to-terminal=Вставить в Терминала termora.actions.select-all-in-terminal=Выделить Все в Терминале termora.actions.open-terminal-find=Открыть Поиск Терминала diff --git a/src/main/resources/i18n/messages_zh_CN.properties b/src/main/resources/i18n/messages_zh_CN.properties index ed58d7d..e78f10f 100644 --- a/src/main/resources/i18n/messages_zh_CN.properties +++ b/src/main/resources/i18n/messages_zh_CN.properties @@ -396,6 +396,7 @@ termora.protocol.not-supported=不支持 {0} 协议,你可能需要安装插 # Actions termora.actions.copy-from-terminal=从终端复制 +termora.actions.focus-mode=专注模式 termora.actions.paste-to-terminal=粘贴到终端 termora.actions.select-all-in-terminal=在终端中全选 termora.actions.open-terminal-find=打开终端查找 diff --git a/src/main/resources/i18n/messages_zh_TW.properties b/src/main/resources/i18n/messages_zh_TW.properties index 9819421..80c6201 100644 --- a/src/main/resources/i18n/messages_zh_TW.properties +++ b/src/main/resources/i18n/messages_zh_TW.properties @@ -383,6 +383,7 @@ termora.protocol.not-supported=不支援 {0} 協議,你可能需要安裝插 # Actions termora.actions.copy-from-terminal=從終端複製 +termora.actions.focus-mode=專注模式 termora.actions.paste-to-terminal=貼上到終端 termora.actions.select-all-in-terminal=在終端中全選 termora.actions.open-terminal-find=開啟終端搜尋