From a219fd8a931663daf7182ea48f74570a8d7cdd40 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Fri, 19 Aug 2022 13:20:10 -0700 Subject: [PATCH] Fix scene order padding Standardized the scene path filter --- .../common/data/ProjectEditorRepository.kt | 21 +++-- .../apps/hammer/common/fileio/HPath.kt | 1 + .../okio/ProjectEditorRepositoryOkio.kt | 92 +++++++++---------- .../apps/hammer/common/fileio/okio/okio.kt | 7 +- 4 files changed, 65 insertions(+), 56 deletions(-) diff --git a/common/src/commonMain/kotlin/com/darkrockstudios/apps/hammer/common/data/ProjectEditorRepository.kt b/common/src/commonMain/kotlin/com/darkrockstudios/apps/hammer/common/data/ProjectEditorRepository.kt index 562e3ee19..086789369 100644 --- a/common/src/commonMain/kotlin/com/darkrockstudios/apps/hammer/common/data/ProjectEditorRepository.kt +++ b/common/src/commonMain/kotlin/com/darkrockstudios/apps/hammer/common/data/ProjectEditorRepository.kt @@ -175,8 +175,8 @@ abstract class ProjectEditorRepository( abstract fun getSceneFilePath(sceneId: Int): HPath abstract fun getSceneDirectory(): HPath abstract fun getSceneBufferDirectory(): HPath - abstract fun getSceneFilePath(scene: SceneItem, isNewScene: Boolean = false): HPath - abstract fun getSceneBufferTempPath(sceneDef: SceneItem): HPath + abstract fun getSceneFilePath(sceneItem: SceneItem, isNewScene: Boolean = false): HPath + abstract fun getSceneBufferTempPath(sceneItem: SceneItem): HPath abstract fun createScene(parent: SceneItem?, sceneName: String): SceneItem? abstract fun createGroup(parent: SceneItem?, groupName: String): SceneItem? abstract fun deleteScene(scene: SceneItem): Boolean @@ -187,15 +187,15 @@ abstract class ProjectEditorRepository( abstract fun getSceneTempBufferContents(): List abstract fun getSceneAtIndex(index: Int): SceneItem abstract fun getSceneFromPath(path: HPath): SceneItem - abstract fun loadSceneBuffer(sceneDef: SceneItem): SceneBuffer - abstract fun storeSceneBuffer(sceneDef: SceneItem): Boolean - abstract fun storeTempSceneBuffer(sceneDef: SceneItem): Boolean - abstract fun clearTempScene(sceneDef: SceneItem) + abstract fun loadSceneBuffer(sceneItem: SceneItem): SceneBuffer + abstract fun storeSceneBuffer(sceneItem: SceneItem): Boolean + abstract fun storeTempSceneBuffer(sceneItem: SceneItem): Boolean + abstract fun clearTempScene(sceneItem: SceneItem) abstract fun getLastOrderNumber(parentId: Int?): Int abstract fun getLastOrderNumber(parentPath: HPath): Int abstract fun updateSceneOrder(parentId: Int) abstract fun moveScene(moveRequest: MoveRequest) - abstract fun renameScene(sceneDef: SceneItem, newName: String) + abstract fun renameScene(sceneItem: SceneItem, newName: String) fun getSceneSummaries(): SceneSummary { return SceneSummary( @@ -381,12 +381,17 @@ abstract class ProjectEditorRepository( const val SCENE_FILENAME_EXTENSION = ".md" const val SCENE_DIRECTORY = "scenes" const val BUFFER_DIRECTORY = ".buffers" - const val tempSuffix = ".temp" } abstract fun getHpath(sceneItem: SceneItem): HPath } +fun Collection.filterScenePaths() = filter { + it.name != ProjectEditorRepository.BUFFER_DIRECTORY + && it.name != ".." +} + .sortedBy { it.name } + open class InvalidSceneFilename(message: String, fileName: String) : IllegalStateException("$fileName failed to parse because: $message") diff --git a/common/src/commonMain/kotlin/com/darkrockstudios/apps/hammer/common/fileio/HPath.kt b/common/src/commonMain/kotlin/com/darkrockstudios/apps/hammer/common/fileio/HPath.kt index cd6716e74..5875d8549 100644 --- a/common/src/commonMain/kotlin/com/darkrockstudios/apps/hammer/common/fileio/HPath.kt +++ b/common/src/commonMain/kotlin/com/darkrockstudios/apps/hammer/common/fileio/HPath.kt @@ -10,5 +10,6 @@ import com.arkivanov.essenty.parcelable.Parcelize @Parcelize data class HPath( val path: String, + val name: String, val isAbsolute: Boolean ) : Parcelable \ No newline at end of file diff --git a/common/src/commonMain/kotlin/com/darkrockstudios/apps/hammer/common/fileio/okio/ProjectEditorRepositoryOkio.kt b/common/src/commonMain/kotlin/com/darkrockstudios/apps/hammer/common/fileio/okio/ProjectEditorRepositoryOkio.kt index 3d43161de..9dff8165b 100644 --- a/common/src/commonMain/kotlin/com/darkrockstudios/apps/hammer/common/fileio/okio/ProjectEditorRepositoryOkio.kt +++ b/common/src/commonMain/kotlin/com/darkrockstudios/apps/hammer/common/fileio/okio/ProjectEditorRepositoryOkio.kt @@ -79,16 +79,16 @@ class ProjectEditorRepositoryOkio( return bufferPathSegment.toHPath() } - override fun getSceneFilePath(scene: SceneItem, isNewScene: Boolean): HPath { + override fun getSceneFilePath(sceneItem: SceneItem, isNewScene: Boolean): HPath { val scenePathSegment = getSceneDirectory().toOkioPath() - val pathSegments = sceneTree.getBranch(true) { it.id == scene.id } + val pathSegments = sceneTree.getBranch(true) { it.id == sceneItem.id } .map { node -> node.value } .filter { scene -> !scene.isRootScene } .map { scene -> getSceneFileName(scene) } .toMutableList() - pathSegments.add(getSceneFileName(scene, isNewScene)) + pathSegments.add(getSceneFileName(sceneItem, isNewScene)) var fullPath: Path = scenePathSegment pathSegments.forEach { segment -> @@ -115,9 +115,9 @@ class ProjectEditorRepositoryOkio( return fullPath.toHPath() } - override fun getSceneBufferTempPath(sceneDef: SceneItem): HPath { + override fun getSceneBufferTempPath(sceneItem: SceneItem): HPath { val bufferPathSegment = getSceneBufferDirectory().toOkioPath() - val fileName = getSceneTempFileName(sceneDef) + val fileName = getSceneTempFileName(sceneItem) return bufferPathSegment.div(fileName).toHPath() } @@ -131,10 +131,10 @@ class ProjectEditorRepositoryOkio( val rootNode = TreeNode(rootScene) val childNodes = fileSystem.list(sceneDirPath) - .filter { it.name != BUFFER_DIRECTORY } - .filter { !it.name.endsWith(tempSuffix) } - .sortedBy { it.name } - .map { path -> loadSceneTreeNode(path) } + .filterScenePathsOkio() + .map { path -> + loadSceneTreeNode(path) + } for (child in childNodes) { rootNode.addChild(child) @@ -149,9 +149,7 @@ class ProjectEditorRepositoryOkio( if (fileSystem.metadata(root).isDirectory) { val childNodes = fileSystem.list(root) - .filter { it.name != BUFFER_DIRECTORY } - .filter { !it.name.endsWith(tempSuffix) } - .sortedBy { it.name } + .filterScenePathsOkio() .map { path -> loadSceneTreeNode(path) } for (child in childNodes) { @@ -165,18 +163,15 @@ class ProjectEditorRepositoryOkio( private fun getAllScenePathsOkio(): List { val sceneDirPath = getSceneDirectory().toOkioPath() val scenePaths = fileSystem.listRecursively(sceneDirPath) - .filter { it.name != BUFFER_DIRECTORY } - .filter { !it.name.endsWith(tempSuffix) } .toList() + .filterScenePathsOkio() .sortedBy { it.name } return scenePaths } private fun getScenePathsOkio(root: Path): List { val scenePaths = fileSystem.list(root) - .filter { it.name != BUFFER_DIRECTORY } - .filter { !it.name.endsWith(tempSuffix) } - .sortedBy { it.name } + .filterScenePathsOkio() return scenePaths } @@ -453,8 +448,7 @@ class ProjectEditorRepositoryOkio( override fun getScenes(): List { return getAllScenePathsOkio() - .filter { it.name != BUFFER_DIRECTORY } - .filter { !it.name.endsWith(tempSuffix) && it.name != ".." } + .filterScenePathsOkio() .map { path -> getSceneFromFilename(path.toHPath()) } @@ -467,8 +461,7 @@ class ProjectEditorRepositoryOkio( override fun getScenes(root: HPath): List { val rootOkia = root.toOkioPath() return getScenePathsOkio(rootOkia) - .filter { it.name != BUFFER_DIRECTORY } - .filter { !it.name.endsWith(tempSuffix) && it.name != ".." } + .filterScenePathsOkio() .map { path -> getSceneFromFilename(path.toHPath()) } @@ -503,24 +496,24 @@ class ProjectEditorRepositoryOkio( return getSceneFromPath(scenePath.toHPath()) } - override fun loadSceneBuffer(sceneDef: SceneItem): SceneBuffer { - val scenePath = getSceneFilePath(sceneDef).toOkioPath() + override fun loadSceneBuffer(sceneItem: SceneItem): SceneBuffer { + val scenePath = getSceneFilePath(sceneItem).toOkioPath() - return if (hasSceneBuffer(sceneDef)) { - getSceneBuffer(sceneDef) - ?: throw IllegalStateException("sceneBuffers did not contain buffer for scene: ${sceneDef.id} - ${sceneDef.name}") + return if (hasSceneBuffer(sceneItem)) { + getSceneBuffer(sceneItem) + ?: throw IllegalStateException("sceneBuffers did not contain buffer for scene: ${sceneItem.id} - ${sceneItem.name}") } else { val content = try { fileSystem.read(scenePath) { readUtf8() } } catch (e: IOException) { - Napier.e("Failed to load Scene (${sceneDef.name})") + Napier.e("Failed to load Scene (${sceneItem.name})") "" } val newBuffer = SceneBuffer( - SceneContent(sceneDef, content) + SceneContent(sceneItem, content) ) updateSceneBuffer(newBuffer) @@ -529,14 +522,14 @@ class ProjectEditorRepositoryOkio( } } - override fun storeSceneBuffer(sceneDef: SceneItem): Boolean { - val buffer = getSceneBuffer(sceneDef) + override fun storeSceneBuffer(sceneItem: SceneItem): Boolean { + val buffer = getSceneBuffer(sceneItem) if (buffer == null) { - Napier.e { "Failed to store scene: ${sceneDef.id} - ${sceneDef.name}, no buffer present" } + Napier.e { "Failed to store scene: ${sceneItem.id} - ${sceneItem.name}, no buffer present" } return false } - val scenePath = getSceneFilePath(sceneDef).toOkioPath() + val scenePath = getSceneFilePath(sceneItem).toOkioPath() return try { val markdown = buffer.content.coerceMarkdown() @@ -548,24 +541,24 @@ class ProjectEditorRepositoryOkio( val cleanBuffer = buffer.copy(dirty = false) updateSceneBuffer(cleanBuffer) - cancelTempStoreJob(sceneDef) - clearTempScene(sceneDef) + cancelTempStoreJob(sceneItem) + clearTempScene(sceneItem) true } catch (e: IOException) { - Napier.e("Failed to store scene: (${sceneDef.name}) with error: ${e.message}") + Napier.e("Failed to store scene: (${sceneItem.name}) with error: ${e.message}") false } } - override fun storeTempSceneBuffer(sceneDef: SceneItem): Boolean { - val buffer = getSceneBuffer(sceneDef) + override fun storeTempSceneBuffer(sceneItem: SceneItem): Boolean { + val buffer = getSceneBuffer(sceneItem) if (buffer == null) { - Napier.e { "Failed to store scene: ${sceneDef.id} - ${sceneDef.name}, no buffer present" } + Napier.e { "Failed to store scene: ${sceneItem.id} - ${sceneItem.name}, no buffer present" } return false } - val scenePath = getSceneBufferTempPath(sceneDef).toOkioPath() + val scenePath = getSceneBufferTempPath(sceneItem).toOkioPath() return try { val markdown = buffer.content.coerceMarkdown() @@ -574,24 +567,24 @@ class ProjectEditorRepositoryOkio( writeUtf8(markdown) } - Napier.e("Stored temp scene: (${sceneDef.name})") + Napier.e("Stored temp scene: (${sceneItem.name})") true } catch (e: IOException) { - Napier.e("Failed to store temp scene: (${sceneDef.name}) with error: ${e.message}") + Napier.e("Failed to store temp scene: (${sceneItem.name}) with error: ${e.message}") false } } - override fun clearTempScene(sceneDef: SceneItem) { - val path = getSceneBufferTempPath(sceneDef).toOkioPath() + override fun clearTempScene(sceneItem: SceneItem) { + val path = getSceneBufferTempPath(sceneItem).toOkioPath() fileSystem.delete(path) } override fun getLastOrderNumber(parentPath: HPath): Int { - val numScenes = fileSystem.list(parentPath.toOkioPath()).count { - fileSystem.metadataOrNull(it)?.isRegularFile == true - } + val numScenes = fileSystem.list(parentPath.toOkioPath()) + .filterScenePathsOkio() + .count() return numScenes } @@ -626,4 +619,9 @@ class ProjectEditorRepositoryOkio( reloadScenes() } -} \ No newline at end of file +} + +fun Collection.filterScenePathsOkio() = + map { it.toHPath() } + .filterScenePaths() + .map { it.toOkioPath() } \ No newline at end of file diff --git a/common/src/commonMain/kotlin/com/darkrockstudios/apps/hammer/common/fileio/okio/okio.kt b/common/src/commonMain/kotlin/com/darkrockstudios/apps/hammer/common/fileio/okio/okio.kt index 2d3737466..57da9a6ae 100644 --- a/common/src/commonMain/kotlin/com/darkrockstudios/apps/hammer/common/fileio/okio/okio.kt +++ b/common/src/commonMain/kotlin/com/darkrockstudios/apps/hammer/common/fileio/okio/okio.kt @@ -4,5 +4,10 @@ import com.darkrockstudios.apps.hammer.common.fileio.HPath import okio.Path import okio.Path.Companion.toPath -fun Path.toHPath() = HPath(path = toString(), isAbsolute = isAbsolute) +fun Path.toHPath() = HPath( + path = toString(), + name = name, + isAbsolute = isAbsolute +) + fun HPath.toOkioPath() = path.toPath() \ No newline at end of file