From d7ca84863cc83b1c9de174203af8e97d567a7588 Mon Sep 17 00:00:00 2001 From: grendervill Date: Tue, 1 Sep 2026 23:36:04 +0300 Subject: [PATCH] =?UTF-8?q?Enter:=20=D0=BD=D0=B0=D0=B4=D1=91=D0=B6=D0=BD?= =?UTF-8?q?=D0=B0=D1=8F=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=BE=D0=B2=D0=BE=D0=B9=20=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=BA=D0=B8=20+=20hit-=D0=B7=D0=BE=D0=BD=D0=B0=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D0=B2=D1=81=D0=B5=D0=B9=20=D0=B2=D1=8B=D1=81=D0=BE?= =?UTF-8?q?=D1=82=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - TextArea focus:true, handleEnter() с effectiveLine для пустой строки, _enterHandled флаг, onTextChanged авто-отступ для \n, Keys.onReturnPressed/onEnterPressed + onPressed Tab/Backspace, trim() вместо trimEnd() - SplitView handle: implicit 12 + fill parent + MouseArea 16 по всей высоте/ширине (файловое дерево, живой просмотр, граф/календарь) - MonthCalendar: 28x28 круглые opaque, month/year раздельно (70/110 + 42/38, font 11, elide) — год не пропадает для 'сентябрь 2026', RightPanel удалён дубль ☷ --- qml/panels/EditorPanel.qml | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/qml/panels/EditorPanel.qml b/qml/panels/EditorPanel.qml index a980fb4..251da87 100644 --- a/qml/panels/EditorPanel.qml +++ b/qml/panels/EditorPanel.qml @@ -288,6 +288,8 @@ Item { selectByMouse: true background: Rectangle { color: Theme.editorBg } tabStopDistance: 32 + Component.onCompleted: forceActiveFocus() + onActiveFocusChanged: console.log("TextArea activeFocus", activeFocus, "focus", focus) // Для подсветки скобок property int bracketMatchPos: -1 property int bracketOrigPos: -1 @@ -368,7 +370,7 @@ Item { let indent = "" const m = line.match(/^(\s+)/) if (m) indent = m[1] - const trimmed = line.trimEnd() + const trimmed = line.trim() if (trimmed.endsWith("{") || trimmed.endsWith("[") || trimmed.endsWith("(") || trimmed.endsWith(":") || trimmed.endsWith(">")) { indent += " " } @@ -411,14 +413,37 @@ Item { let indent = "" const m = line.match(/^(\s+)/) if (m) indent = m[1] - const trimmed = line.trimEnd() + // Если текущая строка пуста (курсор в начале), берём отступ предыдущей строки + let effectiveLine = line + if (line.length === 0 && pos > 0) { + let prevEnd = pos - 1 + if (prevEnd >=0 && text[prevEnd] === "\n") prevEnd-- + let prevStart = text.lastIndexOf("\n", prevEnd-1) + 1 + if (prevStart < 0) prevStart = 0 + effectiveLine = text.substring(prevStart, prevEnd+1) + const m2 = effectiveLine.match(/^(\s+)/) + if (m2) indent = m2[1] + else indent = "" + } + const trimmed = effectiveLine.trim() if (trimmed.endsWith("{") || trimmed.endsWith("[") || trimmed.endsWith("(") || trimmed.endsWith(":") || trimmed.endsWith(">")) { indent += " " } + // Если курсор в начале строки с } (line пуста и next === }), то вставляем indent + "\n" перед }, а не "\n" + indent + if (line.length === 0 && pos < text.length) { + const next = text[pos] + if (next === "}" || next === "]" || next === ")") { + const ins2 = indent + "\n" + insert(pos, ins2) + cursorPosition = pos + indent.length + if (documentManager.activeIndex >=0) documentManager.updateContent(documentManager.activeIndex, text) + return + } + } let extra = "" if (pos < text.length) { const next = text[pos] - if (next === "}" || next === "]" || next === ")") { + if ((next === "}" || next === "]" || next === ")") && line.length > 0) { extra = "\n" + indent.substring(0, Math.max(0, indent.length-4)) } }