From 3df44375e8ff4c824a1cde318d32d356fd67dbac Mon Sep 17 00:00:00 2001 From: alonalbert Date: Thu, 2 May 2024 18:26:59 -0700 Subject: [PATCH] [Refactor] Simplify Menu Related Code (#22) --- .../kotlin/explorer/KotlinExplorer.kt | 113 +++++------------- .../dev/romainguy/kotlin/explorer/Menu.kt | 51 ++++++++ 2 files changed, 81 insertions(+), 83 deletions(-) create mode 100644 src/jvmMain/kotlin/dev/romainguy/kotlin/explorer/Menu.kt diff --git a/src/jvmMain/kotlin/dev/romainguy/kotlin/explorer/KotlinExplorer.kt b/src/jvmMain/kotlin/dev/romainguy/kotlin/explorer/KotlinExplorer.kt index 813967ee..072675e9 100644 --- a/src/jvmMain/kotlin/dev/romainguy/kotlin/explorer/KotlinExplorer.kt +++ b/src/jvmMain/kotlin/dev/romainguy/kotlin/explorer/KotlinExplorer.kt @@ -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 @@ -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, @@ -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) } } } diff --git a/src/jvmMain/kotlin/dev/romainguy/kotlin/explorer/Menu.kt b/src/jvmMain/kotlin/dev/romainguy/kotlin/explorer/Menu.kt new file mode 100644 index 00000000..d7892385 --- /dev/null +++ b/src/jvmMain/kotlin/dev/romainguy/kotlin/explorer/Menu.kt @@ -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, + 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) +}