Фазы 2-3: мульти-окна (WindowController, per-window FileStore), файловое дерево (FileStore+FileTreePanel, иконки/раскрытие/ПКМ/+drag&drop/подтверждения), NameDialog/ConfirmDialog; тест filestore (13/13)

This commit is contained in:
Flora (opencode)
2026-08-17 01:02:05 +03:00
parent ed633ae036
commit c740c9a756
12 changed files with 1305 additions and 76 deletions
+50 -16
View File
@@ -3,7 +3,7 @@ import QtQuick.Controls
import QtQuick.Layouts
// Главное окно: меню вверху, три панели (дерево / редактор / правая).
// Фазы 0-1: каркас + мастер первого запуска. Контент панелей — в следующих фазах.
// Мульти-хранилища: каждое окно привязано к своему хранилищу (windowVault).
ApplicationWindow {
id: window
width: 1280
@@ -12,16 +12,29 @@ ApplicationWindow {
title: "Flora"
color: "white"
// Мастер первого запуска: показываем, если ещё нет ни одного хранилища.
// Хранилище этого окна (задаётся WindowController); у основного окна
// может быть пустым — тогда берём основное хранилище из настроек.
property string windowVault: ""
readonly property string activeVault: {
if (fileStore.ready) return fileStore.vault
if (windowVault.length > 0) return windowVault
return vaultManager.currentVault
}
WelcomeWizard {
id: welcomeWizard
firstRun: vaultManager.vaults.length === 0
onFinished: vaultSwitcher.close()
}
Component.onCompleted: {
if (vaultManager.vaults.length === 0)
welcomeWizard.open()
onFinished: {
if (fileStore.ready) {
// Добавлено новое хранилище при уже открытом — новое окно.
windowController.openWindow(welcomeWizard.vaultPath)
} else {
// Первый запуск: применяем хранилище к этому окну.
fileStore.openVault(welcomeWizard.vaultPath)
root_status("Хранилище открыто")
}
}
}
function openWizard() {
@@ -29,6 +42,21 @@ ApplicationWindow {
welcomeWizard.open()
}
function root_status(msg, ok) {
console.log(msg)
}
Component.onCompleted: {
if (windowVault.length > 0) {
fileStore.openVault(windowVault)
} else if (vaultManager.currentVault.length > 0) {
fileStore.openVault(vaultManager.currentVault)
}
// Если хранилищ нет — мастер откроется автоматически.
if (vaultManager.vaults.length === 0)
welcomeWizard.open()
}
menuBar: MenuBar {
Menu {
title: qsTr("&Файл")
@@ -77,7 +105,7 @@ ApplicationWindow {
}
}
// Переключатель хранилищ (кнопка внизу слева, в FileTreePanel)
// Переключатель хранилищ (кнопка внизу слева)
Popup {
id: vaultSwitcher
x: 12
@@ -104,10 +132,13 @@ ApplicationWindow {
delegate: ItemDelegate {
width: ListView.view.width
text: modelData
highlighted: modelData === vaultManager.currentVault
highlighted: modelData === window.activeVault
onClicked: {
if (modelData !== vaultManager.currentVault) {
vaultManager.selectVault(modelData)
if (modelData === window.activeVault) {
vaultSwitcher.close()
} else {
windowController.openWindow(modelData)
vaultSwitcher.close()
}
}
}
@@ -120,8 +151,8 @@ ApplicationWindow {
}
Label {
text: qsTr("Текущее: %1").arg(vaultManager.currentVault.length > 0
? vaultManager.currentVault : "—")
text: qsTr("Текущее: %1").arg(window.activeVault.length > 0
? window.activeVault : "—")
color: "#666"
elide: Text.ElideMiddle
Layout.fillWidth: true
@@ -144,9 +175,12 @@ ApplicationWindow {
SplitView.preferredWidth: window.width * 0.15
SplitView.minimumWidth: 120
SplitView.maximumWidth: 500
onOpenVaultRequested: vaultSwitcher.open()
onNewFileRequested: console.log("Новый файл (Фаза 3)")
onNewFolderRequested: console.log("Новая папка (Фаза 3)")
onOpenFileRequested: (path) => {
// Фаза 4: открытие вкладки в редакторе. Пока — лог.
console.log("Открыть файл: " + path)
}
}
EditorPanel {