From a7ac9999fbf47a104746e911dbb6ea1dfa126b3c Mon Sep 17 00:00:00 2001 From: Quentin Date: Mon, 1 Jan 2024 13:30:48 +0100 Subject: [PATCH 1/4] chore(style): Change icons colors --- src/main/kotlin/fr/quentixx/kfilebuilder/components/Icons.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/fr/quentixx/kfilebuilder/components/Icons.kt b/src/main/kotlin/fr/quentixx/kfilebuilder/components/Icons.kt index 26daa07..8ea30d6 100644 --- a/src/main/kotlin/fr/quentixx/kfilebuilder/components/Icons.kt +++ b/src/main/kotlin/fr/quentixx/kfilebuilder/components/Icons.kt @@ -55,7 +55,7 @@ fun IconArrowDown( size: Dp = 10.dp ) = Icon( painterResource("icons/TreeArrow_Down.png"), - null, Modifier.size(size), Color.LightGray + null, Modifier.size(size), Color.Black ) @Composable @@ -63,7 +63,7 @@ fun IconArrowRight( size: Dp = 10.dp ) = Icon( painterResource("icons/TreeArrow_Right.png"), - null, Modifier.size(size), Color.LightGray + null, Modifier.size(size), Color.Black ) @Composable From 65b7070ebdd56619e3b885405affb4d8f7549aa9 Mon Sep 17 00:00:00 2001 From: Quentin Date: Mon, 1 Jan 2024 13:36:44 +0100 Subject: [PATCH 2/4] chore(style): Change TreeView background to improve reading --- .../kotlin/fr/quentixx/kfilebuilder/treeview/TreeViewBuilder.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/fr/quentixx/kfilebuilder/treeview/TreeViewBuilder.kt b/src/main/kotlin/fr/quentixx/kfilebuilder/treeview/TreeViewBuilder.kt index f6c9853..48c8625 100644 --- a/src/main/kotlin/fr/quentixx/kfilebuilder/treeview/TreeViewBuilder.kt +++ b/src/main/kotlin/fr/quentixx/kfilebuilder/treeview/TreeViewBuilder.kt @@ -33,7 +33,7 @@ fun TreeViewBuilder(mutableNode: MutableState) { Box( Modifier .fillMaxSize() - .background(Color.DarkGray) + .background(Color.LightGray) ) { LazyColumn( state = listState, From 31201bb439960b0147e3e3a149c3e423f04642e4 Mon Sep 17 00:00:00 2001 From: Quentin Date: Fri, 5 Jan 2024 19:40:05 +0100 Subject: [PATCH 3/4] chore(style): Add icons --- .../quentixx/kfilebuilder/components/Icons.kt | 29 +++++++++++++----- .../resources/icons/Icon_NewDirectory.png | Bin 0 -> 15855 bytes src/main/resources/icons/Icon_NewFile.png | Bin 0 -> 12390 bytes .../resources/icons/Icon_SearchDirectory.png | Bin 0 -> 20474 bytes 4 files changed, 21 insertions(+), 8 deletions(-) create mode 100644 src/main/resources/icons/Icon_NewDirectory.png create mode 100644 src/main/resources/icons/Icon_NewFile.png create mode 100644 src/main/resources/icons/Icon_SearchDirectory.png diff --git a/src/main/kotlin/fr/quentixx/kfilebuilder/components/Icons.kt b/src/main/kotlin/fr/quentixx/kfilebuilder/components/Icons.kt index 8ea30d6..044b48e 100644 --- a/src/main/kotlin/fr/quentixx/kfilebuilder/components/Icons.kt +++ b/src/main/kotlin/fr/quentixx/kfilebuilder/components/Icons.kt @@ -1,5 +1,8 @@ package fr.quentixx.kfilebuilder.components +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.Image +import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.size import androidx.compose.material.Icon @@ -27,27 +30,37 @@ fun IconDir() = Icon( @Composable fun TemplateAddDirIcon( onClick: () -> Unit, - size: Dp = 20.dp -) = Icon( - painterResource("icons/Template_AddDirectory.png"), + size: Dp = 30.dp +) = Image( + painterResource("icons/Icon_NewDirectory.png"), null, Modifier .size(size) .clickable { onClick.invoke() } .setOnHoverHandCursorEnabled(), - Color.Black ) @Composable fun TemplateAddFileIcon( onClick: () -> Unit, - size: Dp = 20.dp -) = Icon( - painterResource("icons/Template_AddFile.png"), + size: Dp = 32.dp +) = Image( + painterResource("icons/Icon_NewFile.png"), + null, Modifier + .size(size) + .clickable { onClick.invoke() } + .setOnHoverHandCursorEnabled(), +) + +@Composable +fun SearchDirectoryIcon( + onClick: () -> Unit, + size: Dp = 30.dp +) = Image( + painterResource("icons/Icon_SearchDirectory.png"), null, Modifier .size(size) .clickable { onClick.invoke() } .setOnHoverHandCursorEnabled(), - Color.Black ) @Composable diff --git a/src/main/resources/icons/Icon_NewDirectory.png b/src/main/resources/icons/Icon_NewDirectory.png new file mode 100644 index 0000000000000000000000000000000000000000..26b6fcf5c4fc222bc22f26a9e8e710b2f1b5d73f GIT binary patch literal 15855 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/icons/Icon_NewFile.png b/src/main/resources/icons/Icon_NewFile.png new file mode 100644 index 0000000000000000000000000000000000000000..eefdc66d8725e254ebafd012a6d904f3de8f7470 GIT binary patch literal 12390 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/icons/Icon_SearchDirectory.png b/src/main/resources/icons/Icon_SearchDirectory.png new file mode 100644 index 0000000000000000000000000000000000000000..d3dca7bfacd1833bf0d5464b32b75acc4eed0b28 GIT binary patch literal 20474 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 z Date: Fri, 5 Jan 2024 19:46:18 +0100 Subject: [PATCH 4/4] chore: Correction of inconsistencies, rearrangement of rows, code cleaning. --- .../kfilebuilder/treeview/TreeViewBuilder.kt | 168 ++++++++++++++++-- .../kfilebuilder/treeview/TreeViewFileList.kt | 134 +------------- 2 files changed, 150 insertions(+), 152 deletions(-) diff --git a/src/main/kotlin/fr/quentixx/kfilebuilder/treeview/TreeViewBuilder.kt b/src/main/kotlin/fr/quentixx/kfilebuilder/treeview/TreeViewBuilder.kt index 48c8625..18277bd 100644 --- a/src/main/kotlin/fr/quentixx/kfilebuilder/treeview/TreeViewBuilder.kt +++ b/src/main/kotlin/fr/quentixx/kfilebuilder/treeview/TreeViewBuilder.kt @@ -1,28 +1,41 @@ package fr.quentixx.kfilebuilder.treeview import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.hoverable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.collectIsHoveredAsState import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.foundation.text.BasicTextField import androidx.compose.material.Button import androidx.compose.material.Icon import androidx.compose.material.IconButton import androidx.compose.material.Text import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Delete -import androidx.compose.runtime.Composable -import androidx.compose.runtime.MutableState -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp -import fr.quentixx.kfilebuilder.components.TemplateAddDirIcon -import fr.quentixx.kfilebuilder.components.TemplateAddFileIcon +import fr.quentixx.kfilebuilder.components.* import fr.quentixx.kfilebuilder.ext.setOnHoverHandCursorEnabled import fr.quentixx.kfilebuilder.data.Node import java.io.File +private data class NodeRowData( + val node: MutableState, + val hovered: Boolean = false, +) + +private fun interface NodeRowScope { + @Composable + fun consume(data: MutableState) +} + /** * Shows a tree view builder. */ @@ -62,7 +75,11 @@ fun TreeViewBuilder(mutableNode: MutableState) { */ @Composable private fun SourceNodeLine(mutableNode: MutableState) { - Row { + Spacer(Modifier.height(4.dp)) + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Spacer(Modifier.width(16.dp)) RenderNodeElement(mutableNode, true) { Spacer(Modifier.width(32.dp)) it.value.apply { @@ -74,16 +91,23 @@ private fun SourceNodeLine(mutableNode: MutableState) { } @Composable -fun DirectoryNodeControls(node: MutableState) { - Spacer(Modifier.width(32.dp)) +private fun DirectoryNodeControls(node: MutableState) { + val NEW_DIR_PATH = "Nouveau dossier" + val NEW_FILE_PATH = "Nouveau fichier" + Spacer(Modifier.width(32.dp)) TemplateAddDirIcon( onClick = { + val idOfDirectory = node.value.children.count { it.path.contains(NEW_DIR_PATH) } + val nodeName = NEW_DIR_PATH + if (idOfDirectory > 0) { + " $idOfDirectory" + } else "" + node.value = node.value.copy( lastUpdated = System.currentTimeMillis() ).apply { children.add( - Node("New dir", true) + Node(nodeName, true) ) } } @@ -93,11 +117,16 @@ fun DirectoryNodeControls(node: MutableState) { TemplateAddFileIcon( onClick = { + val idOFile = node.value.children.count { it.path.contains(NEW_FILE_PATH) } + val nodeName = NEW_FILE_PATH + if (idOFile > 0) { + " $idOFile" + } else "" + node.value = node.value.copy( lastUpdated = System.currentTimeMillis() ).apply { children.add( - Node("New file", false) + Node( nodeName, false) ) } } @@ -111,7 +140,7 @@ private fun DeleteNodeButton(nodeRow: MutableState) { // TODO: Delete the node from parent children }, modifier = Modifier - .size(18.dp) + .size(30.dp) .setOnHoverHandCursorEnabled() ) { Icon( @@ -125,16 +154,11 @@ private fun DeleteNodeButton(nodeRow: MutableState) { @Composable private fun SelectNodeSourceButton(node: MutableState) { val isOverlayVisible = remember { mutableStateOf(false) } - Button( + SearchDirectoryIcon( onClick = { isOverlayVisible.value = true }, - modifier = Modifier - .size(80.dp, 32.dp) - .setOnHoverHandCursorEnabled() - ) { - Text(text = "Select") - } + ) if (isOverlayVisible.value) { OpenTreeViewSelectorWindow(node, onClose = { isOverlayVisible.value = false }) @@ -170,3 +194,109 @@ private fun OpenTreeViewSelectorWindow( } } + +@Composable +private fun NodeList( + mutableNode: MutableState, + paddingSave: Dp = 16.dp, + nodeRowScope: @Composable NodeRowScope +) { + val node = mutableNode.value + + Column { + node.children.forEach { + val mutableChild = remember { mutableStateOf(it) } + + NodeRow(mutableChild, paddingSave, nodeRowScope) + + // Update the current children in the loop with the new children information + mutableChild.value.apply { + it.path = path + it.lastUpdated = lastUpdated + } + } + } +} + +@Composable +private fun NodeRow( + mutableNode: MutableState, + paddingSave: Dp = 0.dp, + nodeRowConsumer: @Composable NodeRowScope +) { + var expanded by remember { mutableStateOf(true) } + val padding = paddingSave + 16.dp + val node = mutableNode.value + val isDir = node.isDirectory + val isEmptyDir = isDir && node.children.isEmpty() + + val interactionSource = remember { MutableInteractionSource() } + val isHovered = interactionSource.collectIsHoveredAsState().value + + val data = remember { mutableStateOf(NodeRowData(mutableNode, isHovered)) } + Row( + modifier = Modifier + .fillMaxWidth() + .height(36.dp) + .padding(start = padding) + .clickable { + if (!isEmptyDir) expanded = !expanded + } + .hoverable(interactionSource), + verticalAlignment = Alignment.CenterVertically + ) { + data.value = data.value.copy(hovered = isHovered) + + RenderNodeElement(mutableNode, expanded, data, nodeRowConsumer) + } + + if (expanded && node.isDirectory) { + NodeList(mutableNode, padding, nodeRowConsumer) + } +} + +@Composable +private fun RenderNodeElement( + mutableNode: MutableState, + expanded: Boolean, + data: MutableState = mutableStateOf(NodeRowData(mutableNode, false)), + nodeRowConsumer: @Composable NodeRowScope +) { + val node = mutableNode.value + var spacingSize = 8.dp + + if (node.children.isEmpty()) { + spacingSize *= 2 + } + + if (node.isDirectory) { + if (node.children.isNotEmpty()) { + if (expanded) IconArrowDown(8.dp) + else IconArrowRight(8.dp) + } + Spacer(Modifier.width(spacingSize)) + IconDir() + } else { + Spacer(Modifier.width(spacingSize)) + IconFile() + } + + Spacer(Modifier.width(8.dp)) + EditableHighlightedText(mutableNode) + + nodeRowConsumer.consume(data) +} + +@Composable +private fun EditableHighlightedText(mutableNode: MutableState) { + BasicTextField( + value = mutableNode.value.path, + onValueChange = { newText -> + mutableNode.value = mutableNode.value.copy( + path = newText, + lastUpdated = System.currentTimeMillis() + ) + }, + singleLine = true, + ) +} diff --git a/src/main/kotlin/fr/quentixx/kfilebuilder/treeview/TreeViewFileList.kt b/src/main/kotlin/fr/quentixx/kfilebuilder/treeview/TreeViewFileList.kt index d5293a6..efc0234 100644 --- a/src/main/kotlin/fr/quentixx/kfilebuilder/treeview/TreeViewFileList.kt +++ b/src/main/kotlin/fr/quentixx/kfilebuilder/treeview/TreeViewFileList.kt @@ -26,6 +26,7 @@ import fr.quentixx.kfilebuilder.components.IconDir import fr.quentixx.kfilebuilder.components.IconFile import fr.quentixx.kfilebuilder.ext.hasNoSubDirectories import fr.quentixx.kfilebuilder.data.Node +import fr.quentixx.kfilebuilder.ext.setOnHoverHandCursorEnabled import java.io.File @Composable @@ -44,29 +45,6 @@ fun FileList( } } -@Composable -fun NodeList( - mutableNode: MutableState, - paddingSave: Dp = 0.dp, - nodeRowScope: @Composable NodeRowScope -) { - val node = mutableNode.value - - Column { - node.children.forEach { - val mutableChild = remember { mutableStateOf(it) } - - NodeRow(mutableChild, paddingSave, nodeRowScope) - - // Update the current children in the loop with the new children information - mutableChild.value.apply { - it.path = path - it.lastUpdated = lastUpdated - } - } - } -} - @Composable fun FileRow( currentSelectedFile: MutableState, @@ -127,113 +105,3 @@ fun FileRow( FileList(currentSelectedFile, file, onlyDirectories, padding) } } - -data class NodeRowData( - val node: MutableState, - val hovered: Boolean = false, -) - -fun interface NodeRowScope { - @Composable - fun consume(data: MutableState) -} - -@Composable -fun NodeRow( - mutableNode: MutableState, - paddingSave: Dp = 0.dp, - nodeRowConsumer: @Composable NodeRowScope -) { - var expanded by remember { mutableStateOf(false) } - val padding = paddingSave + 16.dp - val node = mutableNode.value - val isDir = node.isDirectory - val isEmptyDir = isDir && node.children.isEmpty() - - val interactionSource = remember { MutableInteractionSource() } - val isHovered = interactionSource.collectIsHoveredAsState().value - - val data = remember { mutableStateOf(NodeRowData(mutableNode, isHovered)) } - - Row( - modifier = Modifier - .fillMaxWidth() - .padding(start = padding) - .clickable { - if (!isEmptyDir) expanded = !expanded - } - .hoverable(interactionSource), - verticalAlignment = Alignment.CenterVertically - ) { - - data.value = data.value.copy(hovered = isHovered) - - RenderNodeElement(mutableNode, expanded, data, nodeRowConsumer) - } - - if (expanded && node.isDirectory) { - NodeList(mutableNode, padding, nodeRowConsumer) - } -} - -@Composable -fun RenderNodeElement( - mutableNode: MutableState, - expanded: Boolean, - data: MutableState = mutableStateOf(NodeRowData(mutableNode, false)), - nodeRowConsumer: @Composable NodeRowScope -) { - val node = mutableNode.value - var spacingSize = 8.dp - - if (node.children.isEmpty()) { - spacingSize *= 2 - } - - if (node.isDirectory) { - if (node.children.isNotEmpty()) { - if (expanded) IconArrowDown(8.dp) - else IconArrowRight(8.dp) - } - Spacer(Modifier.width(spacingSize)) - IconDir() - } else { - Spacer(Modifier.width(spacingSize)) - IconFile() - } - - Spacer(Modifier.width(8.dp)) - EditableHighlightedText(mutableNode) - - nodeRowConsumer.consume(data) -} - -@OptIn(ExperimentalComposeUiApi::class) -@Composable -fun EditableHighlightedText(mutableNode: MutableState) { - val keyboardController = LocalSoftwareKeyboardController.current - - BasicTextField( - value = mutableNode.value.path, - onValueChange = { newText -> - mutableNode.value = mutableNode.value.copy( - path = newText, - lastUpdated = System.currentTimeMillis() - ) - }, - keyboardActions = KeyboardActions(onDone = { - // Cacher le clavier lors de l'appui sur "Entrée" - keyboardController?.hide() - }), - singleLine = true, - modifier = Modifier - .onPreviewKeyEvent { - if (it.key == Key.Enter) { - keyboardController?.hide() // Cacher le clavier lorsque "Entrée" est pressée - true // Empêcher la propagation de l'événement de clavier - } else { - false // Laisser passer les autres touches - } - } - ) -}