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, каждый шаг с проверкой содержимого и истории
This commit is contained in:
+41
-1
@@ -80,7 +80,29 @@ ApplicationWindow {
|
||||
Action { text: qsTr("Повторить"); shortcut: "Ctrl+Shift+Z"; enabled: false }
|
||||
MenuSeparator { }
|
||||
Action {
|
||||
text: qsTr("Вернуться к предыдущей версии…"); enabled: false
|
||||
text: qsTr("История файла…")
|
||||
shortcut: "Ctrl+H"
|
||||
enabled: documentManager.activeIndex >= 0 && fileStore.ready
|
||||
onTriggered: {
|
||||
const p = documentManager.pathAt(documentManager.activeIndex)
|
||||
if (p.length>0) {
|
||||
historyDialog.vaultPath = fileStore.vault
|
||||
historyDialog.filePath = p
|
||||
historyDialog.open()
|
||||
}
|
||||
}
|
||||
}
|
||||
Action {
|
||||
text: qsTr("Вернуться к предыдущей версии…")
|
||||
enabled: documentManager.activeIndex >= 0 && fileStore.ready
|
||||
onTriggered: {
|
||||
const p = documentManager.pathAt(documentManager.activeIndex)
|
||||
if (p.length>0) {
|
||||
historyDialog.vaultPath = fileStore.vault
|
||||
historyDialog.filePath = p
|
||||
historyDialog.open()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Menu {
|
||||
@@ -134,6 +156,14 @@ ApplicationWindow {
|
||||
}
|
||||
}
|
||||
|
||||
HistoryDialog {
|
||||
id: historyDialog
|
||||
onRestored: {
|
||||
// после восстановления обновляем граф и статус
|
||||
if (fileStore.ready) vaultIndex.rebuild(fileStore.vault)
|
||||
}
|
||||
}
|
||||
|
||||
Popup {
|
||||
id: vaultSwitcher
|
||||
x: 12
|
||||
@@ -238,6 +268,11 @@ ApplicationWindow {
|
||||
leftPanel.showStatus(qsTr("Предпросмотр HTML/PDF/изображений появится в Фазе 6-10"), false)
|
||||
}
|
||||
}
|
||||
onHistoryRequested: (path) => {
|
||||
historyDialog.vaultPath = fileStore.vault
|
||||
historyDialog.filePath = path
|
||||
historyDialog.open()
|
||||
}
|
||||
}
|
||||
|
||||
EditorPanel {
|
||||
@@ -245,6 +280,11 @@ ApplicationWindow {
|
||||
SplitView.fillWidth: true
|
||||
SplitView.minimumWidth: 300
|
||||
height: window.height - (menuBar ? menuBar.height : 0)
|
||||
onHistoryRequested: (path) => {
|
||||
historyDialog.vaultPath = fileStore.vault
|
||||
historyDialog.filePath = path
|
||||
historyDialog.open()
|
||||
}
|
||||
}
|
||||
|
||||
RightPanel {
|
||||
|
||||
Reference in New Issue
Block a user