Commit Graph

65 Commits

Author SHA1 Message Date
grendervill 8e8cf3ce70 Графический браузер базы данных (DatabaseBrowser)
- Диалог: готовые выборки (файлы/теги/свойства/связи), свой SQL,
  результат таблицей, пути кликабельны, ошибки красным
- Ctrl+Enter для выполнения, автопересчёт при изменении базы
- Меню Файл -> База данных (Ctrl+D)
2026-09-07 16:39:32 +03:00
grendervill f6e1814945 Тесты связности базы + фикс syncFile (не рвать входящие рёбра)
- db_test: граф index->a, index->b, a->b + изолят c; прямые/обратные
  ссылки, достижимость через WITH RECURSIVE, ~sql из одного файла
  в другие, межфайловые свойства, подключение изолята, удаление
- Database::clearFileData: syncFile больше не удаляет строку files
  и входящие links (id сохраняется, граф целый)
2026-09-07 16:36:24 +03:00
grendervill fdf59f5b39 SQLite-база хранилища: свойства, ~sql-блоки, настройки хранилища
- Frontmatter: шапка --- ключ: значение (источник правды свойств)
- VaultSettings: .flora/settings.json (журнал, sqlEnabled, sqlMaxRows)
- Database: files/tags/file_tags/links/properties, только SELECT/WITH
  на read-only соединении (mode=ro + query_only + зонд), лимит строк
- MdParser: ~sql-блоки таблицей (parseBlocks + Renderer), шапка скрыта в просмотре
- Окно: per-window Database/VaultSettings, sync при сохранении, дебаунс reindex
- QML: VaultSettingsDialog, FilePropertiesDialog, меню, автообновление ~sql
- FileStore.journalDir, DocumentManager.reloadDocument
- Тест flora_db_test (23/23 зелёных)
2026-09-07 16:30:06 +03:00
grendervill 0a46471cc6 Инкрементальный индекс, пресеты автосейва, упрощение git-слоя
- VaultIndex: updateFile/removeFile/syncIncremental по mtime+size, полный рескан только на старте/смене/внешних правках; relink висячих ссылок; FileStore.externalChanged
- QML: точечные обновления индекса вместо rebuild на каждый сейв
- Настройки: пресеты safe/balanced/eco/manual + диалог с +/- и шкалами; коммит после паузы, в manual — по Ctrl+S
- GitManager: кэш истории, пагинация, diff в потоке, точечный commitFile, fileExistedAt, топологический порядок истории
- Удалены highlightedCode, словный merge, fileDiffText/Html, 2-arg fileHistory
2026-09-07 01:06:21 +03:00
grendervill 417d0273b7 Инкрементальный индекс, пресеты автосейва, диалог Настройки
- VaultIndex: updateFile/removeFile/syncIncremental (mtime+size), полный рескан только на старте/смене/внешних изменениях; relink висячих [[ссылок]] при создании файла; FileStore.externalChanged для внешних правок
- QML: сейвы и правки идут точечно, дерево — через syncIncremental
- Настройки: пресеты safe/balanced/eco/manual (диск 2/5/10с/выкл, коммит после паузы 5/15/60с/вручную), диалог с +/-, шкалами и подсказкой; коммит только в простое, в manual — по Ctrl+S
- Удалены highlightedCode, словный merge, fileDiffText/Html, 2-arg fileHistory; renderInner без побочек
- Тесты: инкремент индекса, пресеты, autosaveEnabled, ~~~-блоки
2026-09-06 23:02:05 +03:00
grendervill 1f140d3433 Упрощение git/превью: copyCodeBlock, parseBlocks на splitMdBlocks, кэш diff, пагинация
- MdParser.copyCodeBlock(id): один вызов вместо get+copy в 3 QML-местах
- parseBlocks переписан на splitMdBlocks (убит regex только для ```, заодно чинит ~~~); renderInner без побочек, save/restore удалены
- Кэш diff-блоков (хеши+пути, 8 шт, >1МБ не кэшируем); регистрация кодов всегда в главном потоке
- История: пагинация limit+Показать ещё с сохранением выбора; willDelete; busy только на время async
- GitManager: commitFile точечно (общий commitFromIndex), fileExistedAt, workdirContent через DocumentManager.readTextFile, fileGitStatus через relativePath; удалены fileDiffText/Html и 2-arg fileHistory
- MarkdownView: дебаунс async-ветки 80мс + гашение протухших ответов
2026-09-06 22:17:13 +03:00
grendervill 0846605c2b Git: кэш+пагинация истории, diff в потоке, точечный коммит, честное удаление
- История: кэш по vault|rel|headOid, fileHistory(vault,file,limit), в диалоге Показать ещё по 60 с сохранением выбора
- Diff считается в QtConcurrent-пуле (parseBlocksWithDiffAsync+blocksReady, stale-guard), спиннер busy; MarkdownView.diffApplied
- commitFile точечно вместо всего хранилища (общий commitFromIndex), autoCommit честный; fileExistedAt + willDelete в подтверждении
- DocumentManager.readTextFile общий (GitManager.workdirContent через него); fileGitStatus через relativePath
- Тесты: пагинация/кэш, existed, commitFile не трогает B, async==sync
2026-09-06 21:17:25 +03:00
grendervill f6074df0fc Упрощение git: только просмотр с diff, без словного уровня, render без побочек
- История: убран таб текстового diff — только Просмотр версии с подсветкой; пустые состояния через emptyMessage
- GitManager: удалены fileDiffText/fileDiffHtml (+escHtml), остался fileContentAt/workdirContent/history/restore
- MdParser: удалён словный merge (плейсхолдеры/tokenize/risiko), текст — отдельными del/add как diff; renderInner без сброса codeBlocks, render() — clear+renderInner; убраны save/restore хаки
- Тесты обновлены
2026-09-06 20:49:14 +03:00
grendervill 781e1dfc12 История: словный diff в том же текстовом блоке + единая палитра
- Текст del/add парой сливается в ОДИН блок (change=mod): словный LCS по токенам, плейсхолдеры U+E000/U+E001, рендер, подстановка цветных span только в текстовых узлах; ссылки/URL/код — fallback на два блока чтобы не рвать разметку
- Единые насыщенные цвета везде: rgba(244,63,94,.45)/rgba(34,197,94,.45) — html тинты, строки кода, слова, текстовый diff, легенда (hex с альфой в QML)
- Тесты: text merge, link fallback, цвета
2026-09-06 20:30:01 +03:00
grendervill e292f6586e История: diff внутри того же блока кода + насыщенные цвета
- parseBlocksWithDiff: пара del/add кодовых блоков сливается в ОДИН блок (change=mod) с построчным LCS-diff внутри: удалённые строки — розовая подложка rgba(244,63,94,.45) с −, добавленные — зелёная rgba(34,197,94,.45) с +, неизменные — как были; копируется новое содержимое; fallback — два блока
- Цвета насыщеннее: html тинты #ffd6dd/#b7f5c6 (были бледные), текстовый diff тоже, легенда в тон; на тёмном пузыре светлый текст читается
- Тесты: merge в один блок, маркеры, цвета, copy-нового
2026-09-06 20:18:05 +03:00
grendervill beb1eb2956 История: diff прямо в Просмотре версии + код не в одну строку
- Подсветка: highlight() отдаёт <br/> вместо сырых \n (RichText их схлопывал — код был одной строкой); plainToRich для fallback-путей
- MdParser.parseBlocksWithDiff(old,new): поблочный LCS-diff с fence-aware разбивкой, change same/del/add, изменённые блоки в цветном div (красный/зелёный как в diff), codeId для копирования сохранены
- MarkdownView.compareMarkdown: при задании рендерит версию с подсветкой отличий
- История: Просмотр версии сравнивается со свежим содержимым с диска (workdirContent), легенда на обеих вкладках
- Тесты: <br/>, порядок del/add, тинты, identical без подсветки
2026-09-06 19:26:53 +03:00
grendervill 3d04ac0095 История: содержимое версии как кнопка Просмотр
- Вкладка Содержимое версии -> Просмотр версии: MarkdownView с markdown версии (vaultRoot/fileDir файла), как режим Просмотр в редакторе
- Ссылки в исторической версии только чтение: задачи/вики не трогаем, flora://open открывает в редакторе, внешние — в браузере, копирование кода с тостом Скопировано
- Легенда diff только на вкладке Изменения, emptyText для пустого состояния
2026-09-06 18:57:45 +03:00
grendervill 9c8215b707 Граф: не перестраивать при ресайзе окна
- onWidth/HeightChanged теперь только clampPositions()+requestPaint, без force-симуляции и без сброса зума/панорамы/позиций
- nodes/edges меняются парой -> дебаунс 120мс (requestRelayout), добавлен onEdgesChanged
- relayout больше не трогает zoom/pan (resetView только по двойному клику), убран Math.random в пользу детерминированного сдвига, guard на нулевой размер
2026-09-06 17:38:02 +03:00
grendervill 6e49c4b5f8 Фикс: код как ввёл + превью скролл + хранилище последнее выбранное
- CodeBlock: RowLayout для header (copy строго справа), MarkdownView в Column внутри ScrollView (availableWidth) — превью теперь скроллится, показывает все строки, код как ввёл (pre-wrap, tab 4)
- Vault: selectVault при выборе в переключателе + windowOpened -> setCurrentVault — запуск с последним выбранным, проверено на /Users/alex/Nextcloud/test и test-vault
2026-09-02 00:38:01 +03:00
grendervill ed6cc1859b Фикс: код как ввёл пользователь + последнее выбранное хранилище
- CodeBlock: <pre> white-space:pre-wrap + TextEdit RichText, без ScrollView, implicitHeight contentHeight+20 — весь код виден целиком, как ввёл, не в одну строку; только иконка 📋
- MainWindow: vaultSwitcher теперь vaultManager.selectVault(modelData) перед openWindow, main.cpp connect windowOpened -> setCurrentVault — запуск с последним выбранным, а не добавленным; проверено на /Users/alex/Nextcloud/test и test-vault
- Tests: vault_select_test + mdparser parseBlocks
2026-09-02 00:18:02 +03:00
grendervill b58f15d2b1 CodeBlock: TextEdit с полным текстом без скролла, только иконка 📋
- CodeBlock TextEdit: anchors.fill + contentHeight→implicitHeight, wrapMode Wrap, RichText, selectByMouse, JetBrains Mono 13, implicitHeight contentHeight+20 — весь код виден без колеса
- Кнопка: только 📋/✓ (убрано 'Копировать'), Qt.rgba hover/active, размер под иконку
- Tests: parseBlocks с codeText/highlightedText, ctest 21/21
2026-09-02 00:01:03 +03:00
grendervill 38e726b7de Enter: починен перенос строк (был сломан)
- TextArea focus:true + Component.onCompleted forceActiveFocus, handleEnter() с indent +4 для { [ ( : > и extra для }])], line.length===0 берёт отступ предыдущей строки, _enterHandled флаг
- onTextChanged авто-отступ при \n (если не через Keys), trim() вместо trimEnd() (нет в QML JS), Keys.onPressed для Return/Enter Tab/Backspace/скобок, убран дубль onReturnPressed
- Проверено: ctest 21/21, offscreen/cocoa RUNNING OK, ручной тест '    hello' -> Enter -> '    hello\n    '
2026-09-01 23:50:05 +03:00
grendervill d7ca84863c Enter: надёжная обработка новой строки + hit-зона по всей высоте
- 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 удалён дубль ☷
2026-09-01 23:36:04 +03:00
grendervill 22035ba0f2 Enter починен: новая строка с сохранением отступа
- TextArea focus:true, handleEnter() с indent +4 для { [ ( : >, extra для }])], _enterHandled флаг, onTextChanged авто-отступ если \n вставлен, Keys.onReturnPressed/onEnterPressed + onPressed Tab/Backspace
- Backspace удаляет 4 пробела как один, Tab 4 пробела / Shift+Tab снятие
2026-09-01 22:53:18 +03:00
grendervill 277a87a53b UX: handles 12px хит-зона по всей высоте, календарь шире, Enter починен
- SplitView handle: implicit 12 (было 1/6), Rectangle fill parent + hit 16, cursor SplitH/VCursor, для файлового дерева/живого просмотра/графа-календаря — теперь легко попасть по всей высоте
- MonthCalendar: header 28x28 radius 14, month Label fill 70-110 + year 42/38, font 11, elide, spacing 4 — 'сентябрь 2026' не налезает, кнопки 28 круглые opaque (surface/hover/selected)
- RightPanel: удалён дубль 'Сегодня' ☷ из calBox header (оставлен только ⌂ в MonthCalendar)
- EditorPanel: Enter через Keys.onReturnPressed/onEnterPressed handleEnter() (сохранение indent), убран дубль в onPressed — теперь новая строка работает
2026-09-01 22:37:40 +03:00
grendervill d6cc460b52 UX: увеличена зона перетаскивания, календарь без налезаний
- SplitView handle: implicit 6, видимая линия 1 + хит-зона 16 (cocoa 16, vertical 16), cursor SplitH/VCursor, hover ToolTip, для файлового дерева/живого просмотра/графа-календаря
- MonthCalendar: RowLayout spacing 4, кнопки 28x28 radius 14, background Theme.surface/hover/selected + border, Label месяца/года разделены (70+42, font 11, elide, минимум 90+44 → всегда влезает 'сентябрь 2026'), убрана прозрачность
- RightPanel: удалён дублирующий ToolButton 'Сегодня' (☷) из calBox header, оставлен только в MonthCalendar (⌂)
2026-09-01 22:23:09 +03:00
grendervill b5a3639e46 Календарь: кнопки не налезают, без прозрачности, круглые, с учётом длинных месяцев
- RowLayout spacing 4, ToolButton 32x32 Layout.preferred 32, background Rectangle color Theme.surface (не прозрачный) + hover Theme.surfaceHover + pressed Theme.surfaceSelected, border Theme.border/Strong/accent, radius 16, contentItem Label
- Label месяца: Layout.minimumWidth 80 preferred 120 fillWidth, elide Right, maximumLineCount 1, NoWrap, pixelSize 12, bold, для 'сентябрь 2026' (8 букв) и узких окон
- Hover/pressed визуально меняются, круглые
2026-09-01 22:09:28 +03:00
grendervill 7e494afbe4 CodeBlock: полный текст без скролла, только иконка 📋
- Убран ScrollView, теперь Rectangle + TextEdit с anchors.fill и implicitHeight: contentHeight+20 — весь код виден целиком, без колёсика
- Кнопка копирования: только 📋 (было '📋 Копировать'), при копировании ✓, hover/active Qt.rgba, размер под иконку
- TextEdit RichText Wrap, JetBrains Mono 13, selectByMouse, contentHeight
2026-09-01 21:56:29 +03:00
grendervill bfd955a3f9 Исправлен белый экран предпросмотра: CodeBlock отдельный компонент
- CodeBlock.qml: Qt.rgba вместо "rgba(...)", убран lineHeight, contentHeight для ScrollView, width via availableWidth
- MarkdownView.qml: ListModel с полными ролями (codeText/highlightedText), delegate без required model, Column anchors.top/left/right, parseBlocks сохраняет codeBlocks
- MdParser: parseBlocks с QRegularExpression и сохранением codeBlocks, forceDark highlight
- mdparser_test: проверка parseBlocks 3 блока
- ctest 21/21, offscreen/cocoa RUNNING OK, Flora.app 180М
2026-09-01 21:47:40 +03:00
grendervill b3fa778d88 MarkdownView: исправлен делегат и парсинг блоков
- Repeater delegate: убраны required property, заменены на property string blockType: model.type || "" и т.д. для html/code блоков (иначе QML Cannot create delegate когда у html нет codeId)
- parseBlocks тест в mdparser_test.cpp: проверка 3 блоков (html/code/html) и highlighted
- Убран console.log из MarkdownView::update
2026-09-01 21:24:37 +03:00
grendervill 9a49829611 Исправлен белый экран в предпросмотре: отдельный компонент CodeBlock
- CodeBlock.qml: отдельный Rectangle #2e4d6a radius 12, header с языком и кнопкой 📋 Копировать (hover/active Qt.rgba, Timer 1.5с), код в rgba(0,0,0,0.22) radius 8, JetBrains Mono, tab 4, syntax highlight тёмной темой
- MarkdownView.qml: Item с Column (width parent, spacing 8, margins 12), Repeater по parseBlocks(), delegate Item с Text (html) и CodeBlock (code), исправлен anchors.fill → width/anchors.top для корректного implicitHeight, убраны дубли visible
- MdParser: parseBlocks() сохраняет codeBlocks/counter перед render(htmlPart) чтобы не терять codeId, QRegularExpression для ```lang, highlightedCode() с forceDark
- EditorPanel: viewArea/livePreview теперь MarkdownView (markdown property), liveDebounce/markdown, убран лишний \}
- qmllint чист, ctest 21/21, offscreen/cocoa RUNNING OK
2026-09-01 21:13:50 +03:00
grendervill ed7dc4e033 Блоки кода: отдельный компонент CodeBlock + MarkdownView (Telegram-пузырь)
- CodeBlock.qml: отдельный Rectangle #2e4d6a radius 12, header с языком и кнопкой 📋 Копировать (hover rgba 0.22/active 0.30, border, radius 11), код в rgba(0,0,0,0.22) radius 8, JetBrains Mono 13/tab 4, syntax highlight тёмной темой, selectByMouse
- MarkdownView.qml: ScrollView+Column+Repeater, parseBlocks() разбивает markdown на html/code блоки, html через Text RichText, code через CodeBlock, copyRequested → mdParser.copyToClipboard
- MdParser: parseBlocks() regex ```lang\n.*?\n``` + render для html частей, codeId/highlighted, highlightedCode(), highlight(...,true) forceDark, QTime удалён, QRegularExpression добавлен
- EditorPanel: viewArea/livePreview теперь MarkdownView (markdown property), liveDebounce/markdown, onLinkActivated → handleLink, viewMode переключает markdown
- CMake: добавлены CodeBlock.qml/MarkdownView.qml в qml модуль
- Исправлены qmllint: rgba → Qt.rgba, lineHeight убран, model.type → required property
2026-09-01 21:07:55 +03:00
grendervill 79b76c8c42 Блоки кода: убрано время, чистый Telegram-пузырь без времени
- Убран timeStr и нижний блок с 20:31 ✓✓, теперь пузырь только с кодом и кнопкой 📋 Копировать справа вверху
- Фон #2e4d6a radius 14, внутренний rgba(0,0,0,0.22) radius 9, JetBrains Mono 13/1.5/tab 4, copybtn hover/active через <style> .copybtn:hover/active
- Сохранены редактор-фичи: авто-закрытие ()[]{}""''<>, тег </tag>, Tab 4 пробела, Enter сохраняет indent, Backspace удаляет 4, подсветка пары o ↔ m
2026-09-01 20:56:21 +03:00
grendervill c861fcc763 Блоки кода как в Telegram (скрин): тёмно-синий пузырь #3b5a7a, время и галочки
- Bubble: background #3b5a7a (как на скрине #2e4d6a), radius 12, padding 10/14/6, max-width 88%, shadow, язык uppercase #8a9ba8 10px слева, кнопка 📋 справа (rgba 0.15, radius 12, border 0.2)
- Код: контейнер rgba(0,0,0,0.18) radius 8, padding 10/12, JetBrains Mono 13px/1.45/tab-size 4, color #fff, подсветка форсирована тёмной темой (highlight(...,true) -> Breeze Dark)
- Время: QTime::currentTime hh:mm + ✓✓ #5eb1f6 внизу справа, как в сообщении ТГ (20:31 ✓✓)
- Сохранено автовыравнивание/скобки/отступы из предыдущего коммита (Tab 4 пробела, Enter сохраняет indent, Backspace удаляет 4, авто-закрытие ()[]{}''""<> и </tag>)
2026-09-01 20:39:34 +03:00
grendervill a24f782205 Блоки кода как в Telegram: мессенджер-пузыри + редактор
- MdParser::code_block: Telegram-пузырь (bg #f5f5f7/#212121, header #e8e8ea/#2a2a2a, border-radius 12, shadow), lang badge uppercase, copy-кнопка '📋 Копировать' с hover/active (bg #ffffff/#333, border, radius 6, цвет #0088cc), JetBrains Mono 13px, line-height 1.5, tab-size 4
- EditorPanel TextArea: JetBrains Mono, tabStopDistance 32, авто-закрытие ()[]{}'"'<> (обёртка выделения, перепрыгивание), Tab→4 пробела / Shift+Tab снятие, Backspace удаление 4 пробелов как одного, Enter сохранение отступа (+4 для { [ ( : > и внутри скобок), тег-автозакрытие <div>→</div>, подсветка парной скобки (o ↔ m) с таймером 800мс
- Кнопка копирования: hover/active через inline style + toast 'Скопировано!', lastCopiedId
2026-09-01 20:12:02 +03:00
grendervill afc15680e1 Git история: откат файлов в любой момент (фаза 9) — UI для простого пользователя
- GitManager: fileHistory (список версий с hash/time/message/author), fileContentAt, fileDiffHtml/Text (git_patch_from_buffers, цветной HTML), restoreFile (запись + автокоммит), lastModifiedTime/String, autoCommit, ensureGitignore (.flora/.stfolder)
- HistoryDialog.qml: список версий (время «только что/5 мин назад» + дата dd.MM.yyyy, сообщение, автор, shortHash), diff с легендой (зелёный +/красный -/синий заголовок), превью содержимого, кнопка «Восстановить эту версию» с подтверждением (объясняет что создастся новый коммит и можно вернуться вперёд), «Обновить/Закрыть»
- MainWindow: меню Правка → История файла (Ctrl+H) и Вернуться к предыдущей версии, FileTree ПКМ → История, передача vaultPath/filePath
- EditorPanel: индикатор «🕘» + lastModifiedStr (gitManager.lastModifiedTimeString), debounce autoCommit (2с) при documentSaved, shortcut Ctrl+H
- FileTreePanel: сигнал historyRequested
- CMake: добавлен HistoryDialog.qml в qml модуль
- Тесты: git_history_test — создание v1/v2, история 1→2, diff, восстановление назад к v1 (история 3), вперёд к v2 (4), v3, diff v1→v3, bad hash, other.md не влияет на историю note.md, autoCommit, lastModified, .gitignore; 21/21 зелёных
- Проверено вперёд/назад: v1→v2→восстановление v1→восстановление v2→v3→autoCommit, каждый шаг с проверкой содержимого и истории
2026-09-01 19:40:55 +03:00
grendervill 95c03040c7 Prod: полный аудит и стабилизация — исправлены критические баги, расширено покрытие тестами, подготовлен бандл
- FileStore: защита от выхода за пределы хранилища (isInsideVault), валидация имён (запрет скрытых, зарезервированных, управляющих символов), проверка destDir, лимит watcher, dailyNote валидация, openVault проверка isDir
- DocumentManager: лимит 10МБ, кламп автосейва 0.5-120с, защита от OOM, бинарный детект, проверка путей
- VaultIndex: исправлен парсинг тегов (заголовки, инлайн-код), case-insensitive поиск, дедупликация рёбер, защита от traversal, лимит глубины, проверка vaultExists
- MdParser: блокировка всех on* событий, javascript:/data:, esc кавычек, MIME fallback, normalizeLang расширен (c/cpp/py/js и кириллица), wiki глобальный поиск, image лимит 3МБ, защита clipboard
- GitManager: commitAll с GIT_INDEX_ADD_DEFAULT и поддержкой пустых коммитов/удалений, fileGitStatus с cleanPath и проверкой префикса, repoExists/hasCommits с cleanPath, initRepo валидация
- SettingsStore: encodeKey/encodeRel для QSettings Ini, flat хранение viewMode, sync после записи, кламп ширин панелей, миграция старых ключей
- SyncManager: счётчик busy, обработка httpStatus при network error, валидация токена/провайдера/URL, GitHub Enterprise URL, таймаут
- VaultManager: валидация путей (корень, файл vs папка, права), проверка вложенности
- WindowController: per-window FileStore/DocumentManager/VaultIndex, cleanPath, закрытие окна через QQuickWindow::closing, обработка ошибок компонента
- QML: TableEditor пустая строка, WelcomeWizard QUrl парсинг, FileTree фильтр, GraphView лимит 600 узлов, RightPanel debounce rebuild, Theme singleton, MonthCalendar и др.
- Тесты: добавлены flora_settings_test, flora_sync_test, flora_extended_test, flora_integration_test — покрытие всех модулей, 20/20 зелёных
- Сборка: обновлён Flora.app (4.6М бинарь -> 173М бандл, ad-hoc подпись, проверен offscreen запуск, версия 0.0.1 + cmark 0.29 + libgit2 1.9)
- .gitignore: добавлены Testing/, coverage, gcda/gcov, __pycache__, .tmp, test-vault и др.
2026-09-01 19:25:07 +03:00
Flora (opencode) 0858b48cb3 Fix: правая панель (.calendar/ссылки/теги/граф без ColumnLayout);.editorArea без Flickable —Text+clip+anchors.bottomMargin:32; виджеты исправлены 2026-08-18 00:27:27 +03:00
Flora (opencode) c8a9bc4690 Fix: серая панель ВНИЗУ (anchors.bottom), без названия файла; clip:true на TextEdit (текст не вылезает за пределы); anchors.bottomMargin:32 для отступа от панели 2026-08-18 00:17:12 +03:00
Flora (opencode) 15813d358e Fix: textDisplay — editMode=readWrite (редактирование), viewDisplay=readOnly+RichText+wrap (просмотр); прокрутка встроена в TextEdit; переключение по ✎👁 2026-08-17 19:45:24 +03:00
Flora (opencode) d709724fed Fix: TextEdit anchors.top: headerBar/bottom + anchors.bottom: parent.bottom (без Flickable — Flickable получал нулевую высоту); убран debug yellow rectangle 2026-08-17 19:41:26 +03:00
Flora (opencode) 84cbe55d32 Debug: Text+z:1000+yellow прямо в EditorPanel — видимый поверх всего; проверка QML-рендеринга 2026-08-17 19:39:02 +03:00
Flora (opencode) 9546c85ea3 Fix: принудительная высота EditorPanel (height: window.height - menuBar.height) — SplitView не задавал высоту дочерним Item, Flickable получал нулевую высоту 2026-08-17 19:36:07 +03:00
Flora (opencode) 2a5debfca3 Debug: красный фон за TextEdit для визуальной проверки размеров Flickable 2026-08-17 19:33:17 +03:00
Flora (opencode) b43033dd51 Fix: QML_DISABLE_DISK_CACHE=1 — отключает runtime QML кэш Qt (КОРНЕВАЯ ПРИЧИНА: ~/Library/Caches/Flora/Flora хранил устаревший bytecode и игнорировал изменения в исходниках); TextArea заменён на TextEdit+Flickable 2026-08-17 19:30:19 +03:00
Flora (opencode) 4c933c5b42 Fix: TextArea заменён на TextEdit+Flickable (базовый QML без Controls styling, гарантированный рендеринг); anchors.top/bottom/left/right для позиционирования 2026-08-17 19:26:03 +03:00
Flora (opencode) 6bf8e3ea15 Fix: полностью переписан EditorPane — простая TextArea anchors.fill: parent без ColumnLayout, без промежуточных контейнеров; шапка как overlay z:10; viewer с handleViewLink; refresh при смене файла/режима 2026-08-17 19:22:41 +03:00
Flora (opencode) a1c78cf5e3 Fix: TextArea заполняет ВЕСЬ EditorPane (anchors.fill: parent), шапка файла — плавающий оверлей (z:10) сверху; убран debug-label; убраны orphan-элементы 2026-08-17 19:13:10 +03:00
Flora (opencode) 4bbbf64999 Fix: EditorPane переписан на anchors (headerBar сверху, contentArea снизу); убрана лишняя } после contentArea; ColumnLayout больше не используется в EditorPane/EditorPanel 2026-08-17 18:53:08 +03:00
Flora (opencode) 69a1a6159c Fix: loadContent — принудительное обновление TextArea (очистка + установка + cursorPosition); убран debug-консоль из loadContent 2026-08-17 18:34:12 +03:00
Flora (opencode) aa2e157f5f Fix: EditorPanel переписан на anchors (tabBar → formatToolbar → editorArea) вместо ColumnLayout — SplitView теперь корректно задаёт высоту; вкладки сверху, тулбар под ними, редактор заполняет остаток 2026-08-17 18:22:56 +03:00
Flora (opencode) 8048b2be2f Fix: корень EditorPanel — ColumnLayout вместо Item (исправляет layout в SplitView: вкладки сверху, редактор снизу); убрана обёртка Item; color:text на TextArea; автооткрытие первого .md 2026-08-17 18:15:22 +03:00
Flora (opencode) 18962473ae Fix: color:text на TextArea, автооткрытие первого .md файла, отладка цепочки openDocument→setActiveIndex→loadContent→editor.text (проверено: контент загружается, editor.text.length=21) 2026-08-17 17:29:23 +03:00
Flora (opencode) 795d9e52df Debug: visible label docIndex/editMode/contentLen + qDebug in openDocument/setActiveIndex + loadContent console.log 2026-08-17 16:38:22 +03:00
Flora (opencode) 768f08eda5 Fix: убрана binding text: pane.editorContent из TextArea — только явное присвоение через loadContent() (onDocIndexChanged + Timer 50ms + Connections.activeIndexChanged). Календарь: cal.currentMonth как явная зависимость в hasNote. 2026-08-17 16:24:28 +03:00