diff --git a/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/Main.kt b/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/Main.kt index a3ed3c2..afd668e 100644 --- a/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/Main.kt +++ b/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/Main.kt @@ -110,10 +110,6 @@ fun main() = application { Scaffold( containerColor = MaterialTheme.colorScheme.background ) { - Thread { - launchJdtServer(viewModel.getDir()) - }.start() - IDEScreen(viewModel.getDir()) } } diff --git a/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/common/NoStyleDropdown.kt b/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/common/NoStyleDropdown.kt new file mode 100644 index 0000000..40c7937 --- /dev/null +++ b/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/common/NoStyleDropdown.kt @@ -0,0 +1,80 @@ +package com.wannaverse.wannacode.common + +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +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.sp +import org.jetbrains.compose.resources.painterResource +import wannacode.composeapp.generated.resources.Res +import wannacode.composeapp.generated.resources.down_cheveron + +@Composable +fun NoStyleDropDown( + selectedOption: String, + options: List, + onOptionSelected: (String) -> Unit, + modifier: Modifier = Modifier +) { + var expanded by remember { mutableStateOf(false) } + + Box( + modifier = modifier + .clickable { expanded = !expanded }, + contentAlignment = Alignment.CenterStart + ) { + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = selectedOption, + color = Color(0xFF9F9F9F), + fontSize = 14.sp, + modifier = Modifier.weight(1f) + ) + } + + DropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false }, + modifier = Modifier + .background(Color(0xFF17171D)) + .border(1.dp, Color(0xFF373737), RoundedCornerShape(2.dp)) + ) { + options.forEach { option -> + DropdownMenuItem( + onClick = { + onOptionSelected(option) + expanded = false + }, + text = { + Text( + text = option, + color = Color(0xFFB6B6B6), + fontSize = 14.sp + ) + } + ) + } + } + } +} diff --git a/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/Hamburger.kt b/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/Hamburger.kt index 9d4c7fa..f83646e 100644 --- a/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/Hamburger.kt +++ b/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/Hamburger.kt @@ -3,7 +3,12 @@ package com.wannaverse.wannacode.ide import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.DropdownMenu import androidx.compose.material.Icon @@ -14,67 +19,113 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue +import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.input.pointer.pointerMoveFilter +import androidx.compose.ui.unit.DpOffset import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import org.jetbrains.compose.resources.painterResource import wannacode.composeapp.generated.resources.Res import wannacode.composeapp.generated.resources.hamburg +import wannacode.composeapp.generated.resources.right_cheveron +@OptIn(ExperimentalComposeUiApi::class) @Composable fun Hamburger() { var expanded by remember { mutableStateOf(false) } + var subMenuExpanded by remember { mutableStateOf(false) } - Icon( - painter = painterResource(Res.drawable.hamburg), - contentDescription = null, - tint = Color.White, - modifier = Modifier.size(15.dp).clickable { expanded = !expanded } - ) + Box { + Icon( + painter = painterResource(Res.drawable.hamburg), + contentDescription = null, + tint = Color.White, + modifier = Modifier + .size(15.dp) + .clickable { expanded = !expanded } + ) + DropdownMenu( + expanded = expanded, + onDismissRequest = { + expanded = false + subMenuExpanded = false + }, + modifier = Modifier + .background(Color(0xFF17171D)) + .border(1.dp, Color(0xFF373737), RoundedCornerShape(5.dp)) + ) { + DropdownMenuItem( + text = { + Row { + Text("View", color = Color(0xFFB6B6B6), fontSize = 14.sp) + Spacer(Modifier.width(50.dp)) + Icon( + painter = painterResource(Res.drawable.right_cheveron), + contentDescription = null, + tint = Color.Gray, + modifier = Modifier.padding(top = 5.dp).size(10.dp) + ) + } + }, + onClick = {}, + modifier = Modifier.pointerMoveFilter( + onEnter = { + subMenuExpanded = true + false + }, + onExit = { + false + } + ) + ) - DropdownMenu( - expanded = expanded, - onDismissRequest = { expanded = false }, - modifier = Modifier - .background(Color(0xFF17171D)) - .border(1.dp, Color(0xFF373737), RoundedCornerShape(5.dp)) - ) { - DropdownMenuItem( - text = { - Text( - text = "New Project", - color = Color(0xFFB6B6B6), - fontSize = 14.sp + DropdownMenuItem( + text = { Text("New Project", color = Color(0xFFB6B6B6), fontSize = 14.sp) }, + onClick = { expanded = false } + ) + DropdownMenuItem( + text = { Text("Open", color = Color(0xFFB6B6B6), fontSize = 14.sp) }, + onClick = { expanded = false } + ) + DropdownMenuItem( + text = { Text("Close", color = Color(0xFFB6B6B6), fontSize = 14.sp) }, + onClick = { expanded = false } + ) + } + + if (subMenuExpanded) { + DropdownMenu( + expanded = true, + onDismissRequest = { subMenuExpanded = false }, + offset = DpOffset(x = 110.dp, y = 0.dp), + modifier = Modifier + .background(Color(0xFF17171D)) + .border(1.dp, Color(0xFF373737), RoundedCornerShape(5.dp)) + ) { + DropdownMenuItem( + text = { Text("Line Encodings", color = Color(0xFFB6B6B6), fontSize = 14.sp) }, + onClick = { + subMenuExpanded = false + expanded = false + } ) - }, - onClick = { - expanded = false - } - ) - DropdownMenuItem( - text = { - Text( - text = "Open", - color = Color(0xFFB6B6B6), - fontSize = 14.sp + DropdownMenuItem( + text = { Text("Whitespace", color = Color(0xFFB6B6B6), fontSize = 14.sp) }, + onClick = { + subMenuExpanded = false + expanded = false + } ) - }, - onClick = { - expanded = false - } - ) - DropdownMenuItem( - text = { - Text( - text = "Close", - color = Color(0xFFB6B6B6), - fontSize = 14.sp + DropdownMenuItem( + text = { Text("Special Characters", color = Color(0xFFB6B6B6), fontSize = 14.sp) }, + onClick = { + subMenuExpanded = false + expanded = false + } ) - }, - onClick = { - expanded = false } - ) + } } } diff --git a/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/IDEScreen.kt b/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/IDEScreen.kt index 8b52f5f..6e64185 100644 --- a/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/IDEScreen.kt +++ b/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/IDEScreen.kt @@ -10,7 +10,6 @@ import com.wannaverse.wannacode.ide.editor.CodeEditor import com.wannaverse.wannacode.ide.editor.CodeEditorTabs import com.wannaverse.wannacode.ide.editor.viewmodel.CodeEditorViewModel import com.wannaverse.wannacode.ide.explorer.FileExplorer -import com.wannaverse.wannacode.ide.terminal.Terminal import java.io.File @Composable @@ -31,9 +30,5 @@ fun IDEScreen(directory: File, viewModel: CodeEditorViewModel = viewModel { Code CodeEditor(viewModel) } } - - Column { - Terminal() - } } } diff --git a/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/Toolbar.kt b/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/Toolbar.kt index 3774614..bd18ee3 100644 --- a/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/Toolbar.kt +++ b/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/Toolbar.kt @@ -11,9 +11,11 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.material.Icon +import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import com.wannaverse.wannacode.STROKE_COLOR @@ -38,49 +40,11 @@ fun Toolbar(viewModel: CodeEditorViewModel) { top = 20.dp ) ) { - Row { + Row(modifier = Modifier.padding(bottom = 20.dp)) { Hamburger() - Spacer(Modifier.width(30.dp)) - - Dropdown( - selectedOption = viewModel.projectName.value, - options = listOf(), - onOptionSelected = { }, - modifier = Modifier.width(200.dp).height(43.dp).padding(bottom = 10.dp).offset(y = (-5).dp), - backgroundColor = Color(0xFF16161A), - alignTextAlign = TextAlign.Center - ) - - Spacer(Modifier.width(20.dp)) - - PlainDropdown( - selectedOption = "Version Control", - options = listOf("Pull", "Commit", "Push", "New Branch", "Change Branch"), - onOptionSelected = {}, - modifier = Modifier.width(130.dp).offset(y = (-3).dp) - ) - Spacer(Modifier.weight(1f)) - Dropdown( - selectedOption = "./gradlew run", - options = listOf(""), - onOptionSelected = { }, - modifier = Modifier.width(200.dp).offset(y = (-10).dp).height(40.dp) - ) - - Spacer(Modifier.width(10.dp)) - - Icon( - painter = painterResource(Res.drawable.play), - contentDescription = null, - tint = Color(0xFF27FF27), - modifier = Modifier.size(20.dp) - ) - - Spacer(Modifier.width(100.dp)) - Icon( painter = painterResource(Res.drawable.minimize), contentDescription = null, diff --git a/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/editor/CodeEditor.kt b/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/editor/CodeEditor.kt index 00ee206..6724e97 100644 --- a/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/editor/CodeEditor.kt +++ b/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/editor/CodeEditor.kt @@ -44,6 +44,12 @@ fun CodeEditor(viewModel: CodeEditorViewModel) { var fontSize by remember { mutableStateOf(14.sp) } + EditorMenu( + tab = tab, + viewModel = viewModel, + fontSize = fontSize + ) + Column(modifier = Modifier.fillMaxSize()) { BoxWithConstraints( modifier = Modifier @@ -58,20 +64,22 @@ fun CodeEditor(viewModel: CodeEditorViewModel) { .heightIn(max = maxHeight) .verticalScroll(scrollState) ) { - CodeEditorGutter(tab, viewModel = viewModel, fontSize = fontSize) - CodeEditorInput(tab, viewModel = viewModel, onFontSizeChange = { - fontSize = it - }) + CodeEditorGutter( + tab = tab, + viewModel = viewModel, + fontSize = fontSize + ) + + CodeEditorInput( + tab = tab, + viewModel = viewModel, + onFontSizeChange = { + fontSize = it + } + ) } Scrollbar(scrollState, Modifier.align(Alignment.CenterEnd)) } - - InfoPanel( - viewModel = viewModel, - modifier = Modifier - .fillMaxWidth() - .height(150.dp) - ) } } diff --git a/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/editor/CodeEditorGutter.kt b/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/editor/CodeEditorGutter.kt index af4ae88..db70b94 100644 --- a/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/editor/CodeEditorGutter.kt +++ b/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/editor/CodeEditorGutter.kt @@ -48,7 +48,7 @@ fun CodeEditorGutter( Column( modifier = Modifier .padding(end = 8.dp) - .background(Color(0xFF17171D)) + // .background(Color(0xFF17171D)) .padding(start = 5.dp, end = 10.dp) .fillMaxHeight() ) { @@ -56,7 +56,6 @@ fun CodeEditorGutter( val diagsForLine = diagnosticsByLine[index] ?: emptyList() Row(verticalAlignment = Alignment.CenterVertically) { - // Line number with dynamic fontSize Text( text = "${index + 1}", color = Color(0xFF383838), diff --git a/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/editor/CodeEditorInput.kt b/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/editor/CodeEditorInput.kt index 584fc56..404a0e3 100644 --- a/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/editor/CodeEditorInput.kt +++ b/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/editor/CodeEditorInput.kt @@ -2,7 +2,6 @@ package com.wannaverse.wannacode.ide.editor import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding import androidx.compose.foundation.text.BasicTextField import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -46,7 +45,6 @@ fun CodeEditorInput(tab: TabContent, viewModel: CodeEditorViewModel, onFontSizeC Box( modifier = Modifier .fillMaxWidth() - .padding(top = 5.dp) .pointerInput(Unit) { awaitPointerEventScope { while (true) { diff --git a/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/editor/EditorMenu.kt b/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/editor/EditorMenu.kt new file mode 100644 index 0000000..9cc4ba6 --- /dev/null +++ b/composeApp/src/jvmMain/kotlin/com/wannaverse/wannacode/ide/editor/EditorMenu.kt @@ -0,0 +1,102 @@ +package com.wannaverse.wannacode.ide.editor + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material.Text +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.TextUnit +import androidx.compose.ui.unit.dp +import com.wannaverse.wannacode.ide.editor.viewmodel.CodeEditorViewModel +import com.wannaverse.wannacode.ide.editor.viewmodel.TabContent + +@Composable +fun EditorMenu( + tab: TabContent, + fontSize: TextUnit, + viewModel: CodeEditorViewModel +) { + val color = Color.Gray + var expandedMenu by remember { mutableStateOf(null) } + + Column( + modifier = Modifier + .fillMaxWidth() + .background(Color(0xFF18181C)) + .padding(10.dp) + ) { + Row( + horizontalArrangement = Arrangement.spacedBy(10.dp), + modifier = Modifier.padding(start = 10.dp) + ) { + MenuDropdown( + title = "File", + color = color, + expandedMenu = expandedMenu, + onMenuClick = { expandedMenu = if (expandedMenu == "File") null else "File" }, + items = listOf("New", "Open", "Save", "Save As") + ) + + MenuDropdown( + title = "Edit", + color = color, + expandedMenu = expandedMenu, + onMenuClick = { expandedMenu = if (expandedMenu == "Edit") null else "Edit" }, + items = listOf("Undo", "Redo", "Cut", "Copy", "Paste") + ) + + MenuDropdown( + title = "View", + color = color, + expandedMenu = expandedMenu, + onMenuClick = { expandedMenu = if (expandedMenu == "View") null else "View" }, + items = listOf("Zoom In", "Zoom Out", "Toggle Sidebar") + ) + } + } +} + +@Composable +fun MenuDropdown( + title: String, + color: Color, + expandedMenu: String?, + onMenuClick: () -> Unit, + items: List +) { + Box { + Text( + text = title, + color = color, + modifier = Modifier + .clickable { onMenuClick() } + .padding(4.dp) + ) + DropdownMenu( + expanded = expandedMenu == title, + onDismissRequest = { onMenuClick() } + ) { + items.forEach { item -> + DropdownMenuItem( + text = { Text(item, color = color) }, + onClick = { + onMenuClick() + } + ) + } + } + } +}