fdf59f5b39
- 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 зелёных)
91 lines
4.0 KiB
C++
91 lines
4.0 KiB
C++
#include <QGuiApplication>
|
||
#include <QQmlApplicationEngine>
|
||
#include <QQmlError>
|
||
#include <QQmlContext>
|
||
#include <QCommandLineParser>
|
||
#include <QQuickStyle>
|
||
#include <QSettings>
|
||
|
||
#include "app/VaultManager.h"
|
||
#include "app/WindowController.h"
|
||
#include "core/DocumentManager.h"
|
||
#include "core/SettingsStore.h"
|
||
#include "core/VaultIndex.h"
|
||
#include "git/GitManager.h"
|
||
#include "markdown/MdParser.h"
|
||
#include "sync/SyncManager.h"
|
||
|
||
#include <cmark-gfm.h>
|
||
#include <git2.h>
|
||
|
||
int main(int argc, char *argv[])
|
||
{
|
||
// Отключаем runtime QML-кэш — гарантирует что QML-изменения подхватываются сразу
|
||
qputenv("QML_DISABLE_DISK_CACHE", "1");
|
||
|
||
// Единообразный светлый стиль — без нативной тёмной темы macOS
|
||
QQuickStyle::setStyle("Basic");
|
||
QGuiApplication app(argc, argv);
|
||
app.setApplicationName("Flora");
|
||
app.setOrganizationName("Flora");
|
||
app.setApplicationVersion("0.0.1");
|
||
|
||
QCommandLineParser parser;
|
||
parser.setApplicationDescription("Минималистичный markdown-заметочник с git-историей");
|
||
parser.addHelpOption();
|
||
parser.addVersionOption();
|
||
parser.process(app);
|
||
|
||
// Версии библиотек — быстрая проверка, что зависимости подключены и слинкованы.
|
||
int gitMajor = 0, gitMinor = 0, gitRev = 0;
|
||
git_libgit2_version(&gitMajor, &gitMinor, &gitRev);
|
||
qInfo("Flora %s | cmark-gfm %s | libgit2 %d.%d.%d",
|
||
qPrintable(app.applicationVersion()),
|
||
cmark_version_string(),
|
||
gitMajor, gitMinor, gitRev);
|
||
|
||
SettingsStore settingsStore;
|
||
GitManager gitManager;
|
||
SyncManager syncManager;
|
||
VaultManager vaultManager(&settingsStore, &gitManager);
|
||
DocumentManager documentManager;
|
||
MdParser mdParser;
|
||
VaultIndex vaultIndex;
|
||
|
||
QQmlApplicationEngine engine;
|
||
QObject::connect(&engine, &QQmlApplicationEngine::warnings,
|
||
[](const QList<QQmlError> &list) {
|
||
for (const QQmlError &e : list)
|
||
qWarning("QML: %s", qPrintable(e.toString()));
|
||
});
|
||
engine.rootContext()->setContextProperty("settingsStore", &settingsStore);
|
||
engine.rootContext()->setContextProperty("gitManager", &gitManager);
|
||
engine.rootContext()->setContextProperty("syncManager", &syncManager);
|
||
engine.rootContext()->setContextProperty("vaultManager", &vaultManager);
|
||
engine.rootContext()->setContextProperty("documentManager", &documentManager);
|
||
engine.rootContext()->setContextProperty("mdParser", &mdParser);
|
||
engine.rootContext()->setContextProperty("vaultIndex", &vaultIndex);
|
||
|
||
WindowController windowController(
|
||
&engine, QStringLiteral("qrc:/qt/qml/Flora/qml/MainWindow.qml"), &mdParser);
|
||
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), поэтому проверяем
|
||
// количество окон, а не engine.rootObjects() (для таких объектов он пуст).
|
||
if (windowController.windowCount() == 0) {
|
||
qWarning("=== Не удалось создать окно приложения ===");
|
||
return -1;
|
||
}
|
||
|
||
return app.exec();
|
||
} |