Skip to content

Commit

Permalink
[Refactor] Simplify Menu Related Code (#22)
Browse files Browse the repository at this point in the history
  • Loading branch information
alonalbert authored May 3, 2024
1 parent 661fc13 commit 3df4437
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 83 deletions.
113 changes: 30 additions & 83 deletions src/jvmMain/kotlin/dev/romainguy/kotlin/explorer/KotlinExplorer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,16 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.awt.SwingPanel
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.key.Key
import androidx.compose.ui.input.key.KeyShortcut
import androidx.compose.ui.input.key.Key.Companion.D
import androidx.compose.ui.input.key.Key.Companion.F
import androidx.compose.ui.input.key.Key.Companion.G
import androidx.compose.ui.input.key.Key.Companion.L
import androidx.compose.ui.input.key.Key.Companion.O
import androidx.compose.ui.input.key.Key.Companion.P
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.*
import dev.romainguy.kotlin.explorer.Shortcut.Ctrl
import dev.romainguy.kotlin.explorer.Shortcut.CtrlShift
import kotlinx.coroutines.launch
import org.fife.rsta.ui.search.FindDialog
import org.fife.rsta.ui.search.SearchEvent
Expand Down Expand Up @@ -208,7 +214,7 @@ private fun oatTextArea(focusTracker: FocusListener): RSyntaxTextArea {
@Composable
private fun FrameWindowScope.MainMenu(
explorerState: ExplorerState,
sourceTextArea: RSyntaxTextArea?,
sourceTextArea: RSyntaxTextArea,
onDexUpdate: (String?) -> Unit,
onOatUpdate: (String) -> Unit,
onStatusUpdate: (String) -> Unit,
Expand All @@ -218,94 +224,35 @@ private fun FrameWindowScope.MainMenu(
) {
val scope = rememberCoroutineScope()

val compileAndDisassemble: () -> Unit = {
scope.launch {
disassemble(
explorerState.toolPaths,
sourceTextArea.text,
onDexUpdate,
onOatUpdate,
onStatusUpdate,
explorerState.optimize
)
}
}
MenuBar {
Menu("File") {
Item(
"Settings…",
onClick = onOpenSettings
)
Item("Settings…", onClick = onOpenSettings)
}
Menu("Edit") {
Item(
"Find…",
shortcut = KeyShortcut(
key = Key.F,
ctrl = !isMac,
meta = isMac,
),
onClick = onFindClicked
)
Item(
"Find Next Occurrence",
shortcut = KeyShortcut(
key = Key.G,
ctrl = !isMac,
meta = isMac,
),
onClick = onFindNextClicked
)

MenuItem("Find…", Ctrl(F), onClick = onFindClicked)
MenuItem("Find Next Occurrence", Ctrl(G), onClick = onFindNextClicked)
}
Menu("View") {
CheckboxItem(
"Presentation Mode",
explorerState.presentationMode,
shortcut = KeyShortcut(
key = Key.P,
ctrl = !isMac,
shift = true,
meta = isMac
),
onCheckedChange = { explorerState.presentationMode = it }
)
CheckboxItem(
"Show Line Numbers",
explorerState.showLineNumbers,
shortcut = KeyShortcut(
key = Key.L,
ctrl = !isMac,
shift = true,
meta = isMac
),
onCheckedChange = {
explorerState.showLineNumbers = it
onDexUpdate(null)
}
)
MenuCheckboxItem("Presentation Mode", CtrlShift(P), explorerState::presentationMode)
MenuCheckboxItem("Show Line Numbers", CtrlShift(L), explorerState::showLineNumbers) {
onDexUpdate(null)
}
}
Menu("Compilation") {
CheckboxItem(
"Optimize with R8",
explorerState.optimize,
shortcut = KeyShortcut(
key = Key.O,
ctrl = !isMac,
shift = true,
meta = isMac
),
onCheckedChange = { explorerState.optimize = it }
)
Item(
"Compile & Disassemble",
shortcut = KeyShortcut(
key = Key.D,
ctrl = !isMac,
shift = true,
meta = isMac,
),
onClick = {
scope.launch {
disassemble(
explorerState.toolPaths,
sourceTextArea!!.text,
onDexUpdate,
onOatUpdate,
onStatusUpdate,
explorerState.optimize
)
}
}
)
MenuCheckboxItem("Optimize with R8", CtrlShift(O), explorerState::optimize)
MenuItem("Compile & Disassemble", CtrlShift(D), onClick = compileAndDisassemble)
}
}
}
Expand Down
51 changes: 51 additions & 0 deletions src/jvmMain/kotlin/dev/romainguy/kotlin/explorer/Menu.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
* Copyright (C) 2024 Romain Guy
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

@file:Suppress("FunctionName")

package dev.romainguy.kotlin.explorer

import androidx.compose.runtime.Composable
import androidx.compose.ui.input.key.Key
import androidx.compose.ui.input.key.KeyShortcut
import androidx.compose.ui.window.MenuScope
import kotlin.reflect.KMutableProperty0

/** Convenience class handles `Ctrl <-> Meta` modifies */
sealed class Shortcut(private val key: Key, private val isShift: Boolean, private val isCtrl: Boolean) {
class Ctrl(key: Key) : Shortcut(key, isCtrl = true, isShift = false)
class CtrlShift(key: Key) : Shortcut(key, isCtrl = true, isShift = true)

fun asKeyShortcut() = KeyShortcut(key = key, ctrl = isCtrl && !isMac, shift = isShift, meta = isCtrl && isMac)
}

@Composable
fun MenuScope.MenuCheckboxItem(
text: String,
shortcut: Shortcut,
property: KMutableProperty0<Boolean>,
onCheckedChanged: (Boolean) -> Unit = {}
) {
CheckboxItem(text, property.get(), shortcut = shortcut.asKeyShortcut(), onCheckedChange = {
property.set(it)
onCheckedChanged(it)
})
}

@Composable
fun MenuScope.MenuItem(text: String, shortcut: Shortcut, onClick: () -> Unit) {
Item(text, shortcut = shortcut.asKeyShortcut(), onClick = onClick)
}

0 comments on commit 3df4437

Please sign in to comment.