Browse Source

Codeviewer. Refactor

pull/987/head
Igor Demin 3 years ago
parent
commit
aa531e7b32
  1. 2
      examples/codeviewer/build.gradle.kts
  2. 5
      examples/codeviewer/common/src/commonMain/kotlin/org/jetbrains/codeviewer/ui/editor/Editor.kt
  3. 19
      examples/codeviewer/common/src/desktopMain/kotlin/org/jetbrains/codeviewer/platform/Mouse.kt
  4. 4
      examples/codeviewer/common/src/desktopMain/kotlin/org/jetbrains/codeviewer/platform/Theme.kt
  5. 28
      examples/codeviewer/desktop/src/jvmMain/kotlin/org/jetbrains/codeviewer/main.kt

2
examples/codeviewer/build.gradle.kts

@ -8,7 +8,7 @@ buildscript {
dependencies { dependencies {
// __LATEST_COMPOSE_RELEASE_VERSION__ // __LATEST_COMPOSE_RELEASE_VERSION__
classpath("org.jetbrains.compose:compose-gradle-plugin:1.0.0-alpha1-rc1") classpath("org.jetbrains.compose:compose-gradle-plugin:1.0.0-alpha1-rc3")
classpath("com.android.tools.build:gradle:4.0.1") classpath("com.android.tools.build:gradle:4.0.1")
// __KOTLIN_COMPOSE_VERSION__ // __KOTLIN_COMPOSE_VERSION__
classpath(kotlin("gradle-plugin", version = "1.5.21")) classpath(kotlin("gradle-plugin", version = "1.5.21"))

5
examples/codeviewer/common/src/commonMain/kotlin/org/jetbrains/codeviewer/ui/editor/Editor.kt

@ -45,10 +45,7 @@ fun Editor(file: File) = Editor(
fun content(index: Int): Editor.Content { fun content(index: Int): Editor.Content {
val text = textLines.get(index) val text = textLines.get(index)
.trim('\n') // fix for native crash in Skia. val state = mutableStateOf(text)
// Workaround for another Skia problem with empty line layout.
// TODO: maybe use another symbols, i.e. \u2800 or \u00a0.
val state = mutableStateOf(if (text.isEmpty()) " " else text)
return Editor.Content(state, isCode) return Editor.Content(state, isCode)
} }

19
examples/codeviewer/common/src/desktopMain/kotlin/org/jetbrains/codeviewer/platform/Mouse.kt

@ -1,13 +1,15 @@
package org.jetbrains.codeviewer.platform package org.jetbrains.codeviewer.platform
import androidx.compose.desktop.LocalAppWindow
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.composed import androidx.compose.ui.composed
import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.input.pointer.awtCursor
import androidx.compose.ui.input.pointer.pointerIcon
import androidx.compose.ui.input.pointer.pointerMoveFilter import androidx.compose.ui.input.pointer.pointerMoveFilter
import java.awt.Cursor import java.awt.Cursor
@ -17,17 +19,20 @@ actual fun Modifier.pointerMoveFilter(
onMove: (Offset) -> Boolean onMove: (Offset) -> Boolean
): Modifier = this.pointerMoveFilter(onEnter = onEnter, onExit = onExit, onMove = onMove) ): Modifier = this.pointerMoveFilter(onEnter = onEnter, onExit = onExit, onMove = onMove)
@OptIn(ExperimentalComposeUiApi::class)
actual fun Modifier.cursorForHorizontalResize(): Modifier = composed { actual fun Modifier.cursorForHorizontalResize(): Modifier = composed {
var isHover by remember { mutableStateOf(false) } var isHover by remember { mutableStateOf(false) }
if (isHover) {
LocalAppWindow.current.window.cursor = Cursor(Cursor.E_RESIZE_CURSOR)
} else {
LocalAppWindow.current.window.cursor = Cursor.getDefaultCursor()
}
pointerMoveFilter( pointerMoveFilter(
onEnter = { isHover = true; true }, onEnter = { isHover = true; true },
onExit = { isHover = false; true } onExit = { isHover = false; true }
).pointerIcon(
awtCursor(
if (isHover) {
Cursor(Cursor.E_RESIZE_CURSOR)
} else {
Cursor.getDefaultCursor()
}
)
) )
} }

4
examples/codeviewer/common/src/desktopMain/kotlin/org/jetbrains/codeviewer/platform/Theme.kt

@ -1,7 +1,7 @@
package org.jetbrains.codeviewer.platform package org.jetbrains.codeviewer.platform
import androidx.compose.desktop.DesktopTheme import androidx.compose.desktop.DesktopMaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@Composable @Composable
actual fun PlatformTheme(content: @Composable () -> Unit) = DesktopTheme(content = content) actual fun PlatformTheme(content: @Composable () -> Unit) = DesktopMaterialTheme(content = content)

28
examples/codeviewer/desktop/src/jvmMain/kotlin/org/jetbrains/codeviewer/main.kt

@ -1,23 +1,19 @@
package org.jetbrains.codeviewer package org.jetbrains.codeviewer
import androidx.compose.desktop.Window import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.unit.IntSize import androidx.compose.ui.graphics.painter.BitmapPainter
import androidx.compose.ui.res.loadImageBitmap
import androidx.compose.ui.res.useResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.WindowState
import androidx.compose.ui.window.singleWindowApplication
import org.jetbrains.codeviewer.ui.MainView import org.jetbrains.codeviewer.ui.MainView
import java.awt.image.BufferedImage
import javax.imageio.ImageIO
fun main() = Window( @OptIn(ExperimentalComposeUiApi::class)
fun main() = singleWindowApplication(
title = "Code Viewer", title = "Code Viewer",
size = IntSize(1280, 768), state = WindowState(width = 1280.dp, height = 768.dp),
icon = loadImageResource("ic_launcher.png"), icon = BitmapPainter(useResource("ic_launcher.png", ::loadImageBitmap)),
) { ) {
MainView() MainView()
} }
@Suppress("SameParameterValue")
private fun loadImageResource(path: String): BufferedImage {
val resource = Thread.currentThread().contextClassLoader.getResource(path)
requireNotNull(resource) { "Resource $path not found" }
return resource.openStream().use(ImageIO::read)
}
Loading…
Cancel
Save