From ed6cc1859b26ef78b60cb1178a6cdd647de1e47d Mon Sep 17 00:00:00 2001 From: grendervill Date: Wed, 2 Sep 2026 00:18:02 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81:=20=D0=BA=D0=BE=D0=B4?= =?UTF-8?q?=20=D0=BA=D0=B0=D0=BA=20=D0=B2=D0=B2=D1=91=D0=BB=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=20?= =?UTF-8?q?+=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=D0=B4=D0=BD=D0=B5=D0=B5=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=B1=D1=80=D0=B0=D0=BD=D0=BD=D0=BE=D0=B5=20=D1=85?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B8=D0=BB=D0=B8=D1=89=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CodeBlock:
 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
---
 qml/MainWindow.qml          |  1 +
 qml/panels/CodeBlock.qml    |  9 ++++++++-
 src/main.cpp                | 10 ++++++++--
 tests/CMakeLists.txt        | 12 +++++++++++-
 tests/vault_select_test.cpp | 36 ++++++++++++++++++++++++++++++++++++
 5 files changed, 64 insertions(+), 4 deletions(-)
 create mode 100644 tests/vault_select_test.cpp

diff --git a/qml/MainWindow.qml b/qml/MainWindow.qml
index d342f6c..6ff7dd5 100644
--- a/qml/MainWindow.qml
+++ b/qml/MainWindow.qml
@@ -199,6 +199,7 @@ ApplicationWindow {
                         if (modelData === window.activeVault) {
                             vaultSwitcher.close()
                         } else {
+                            vaultManager.selectVault(modelData)
                             windowController.openWindow(modelData)
                             vaultSwitcher.close()
                         }
diff --git a/qml/panels/CodeBlock.qml b/qml/panels/CodeBlock.qml
index 4a0d985..0cc08b0 100644
--- a/qml/panels/CodeBlock.qml
+++ b/qml/panels/CodeBlock.qml
@@ -106,7 +106,14 @@ Rectangle {
                 id: codeText
                 anchors.fill: parent
                 anchors.margins: 10
-                text: root.highlightedText.length > 0 ? root.highlightedText : root.code
+                // Сохраняем форматирование как ввёл пользователь: оборачиваем в 
 с pre-wrap
+                text: {
+                    let src = root.highlightedText
+                    if (!src || src.length === 0) {
+                        src = root.code.replace(/&/g, "&").replace(//g, ">").replace(/\"/g, """)
+                    }
+                    return "
" + src + "
" + } textFormat: TextEdit.RichText wrapMode: TextEdit.Wrap readOnly: true diff --git a/src/main.cpp b/src/main.cpp index 38a248c..fbf25bb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -70,8 +70,14 @@ int main(int argc, char *argv[]) &engine, QStringLiteral("qrc:/qt/qml/Flora/qml/MainWindow.qml")); engine.rootContext()->setContextProperty("windowController", &windowController); - // Основное окно = последнее (основное) хранилище. Если хранилищ нет — - // откроется мастер первого запуска. + // При открытии любого окна — запоминаем его как последнее выбранное (для следующего запуска) + QObject::connect(&windowController, &WindowController::windowOpened, + &settingsStore, [&](const QString &vault){ + if (!vault.isEmpty()) settingsStore.setCurrentVault(vault); + }); + + // Основное окно = последнее выбранное хранилище (а не последнее добавленное). + // currentVault теперь обновляется при каждом выборе в переключателе. windowController.openWindow(settingsStore.currentVault()); // Окна создаются через QQmlComponent (WindowController), поэтому проверяем diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 3338f80..e1f1aa4 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -160,4 +160,14 @@ add_executable(flora_git_history_test git_history_test.cpp ) target_include_directories(flora_git_history_test PRIVATE ../src) target_link_libraries(flora_git_history_test PRIVATE Qt6::Core Flora_libgit2_static) -add_test(NAME flora_git_history_test COMMAND flora_git_history_test) \ No newline at end of file +add_test(NAME flora_git_history_test COMMAND flora_git_history_test) + +# Тест выбора хранилища (последнее выбранное, а не добавленное) +add_executable(flora_vault_select_test vault_select_test.cpp + ../src/app/VaultManager.cpp + ../src/core/SettingsStore.cpp + ../src/git/GitManager.cpp +) +target_include_directories(flora_vault_select_test PRIVATE ../src) +target_link_libraries(flora_vault_select_test PRIVATE Qt6::Core Flora_libgit2_static) +add_test(NAME flora_vault_select_test COMMAND flora_vault_select_test) \ No newline at end of file diff --git a/tests/vault_select_test.cpp b/tests/vault_select_test.cpp new file mode 100644 index 0000000..f25104e --- /dev/null +++ b/tests/vault_select_test.cpp @@ -0,0 +1,36 @@ +#include +#include +#include +#include +#include +#include "core/SettingsStore.h" +#include "app/VaultManager.h" +#include "git/GitManager.h" +int main(int argc, char *argv[]){ + QCoreApplication app(argc, argv); + app.setOrganizationName("TestVault"); + app.setApplicationName("test"); + QTemporaryDir dir; + if(!dir.isValid()) return 1; + QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, dir.path()); + QSettings::setDefaultFormat(QSettings::IniFormat); + SettingsStore s; + GitManager g; + VaultManager vm(&s, &g); + QString v1 = dir.path() + "/vault1"; + QString v2 = dir.path() + "/vault2"; + if(!vm.createVault(v1).isEmpty()) return 1; + if(s.currentVault() != QDir::cleanPath(v1)) { std::fprintf(stderr,"FAIL v1 current %s\n", qPrintable(s.currentVault())); return 1; } + if(!vm.createVault(v2).isEmpty()) return 1; + if(s.currentVault() != QDir::cleanPath(v2)) return 1; + s.setCurrentVault(v1); + if(s.currentVault() != QDir::cleanPath(v1)) return 1; + { + SettingsStore s2; + if(s2.currentVault() != QDir::cleanPath(v1)) { std::fprintf(stderr,"FAIL restart current %s\n", qPrintable(s2.currentVault())); return 1; } + if(s2.vaults().size()!=2) return 1; + if(s2.vaults()[0] != QDir::cleanPath(v2)) return 1; + } + std::printf("VAULT SELECT TEST OK\n"); + return 0; +}