From ced74677f8c7f7012de0045d507656de1b4d459d Mon Sep 17 00:00:00 2001 From: soywiz Date: Mon, 21 Nov 2022 19:59:23 +0100 Subject: [PATCH] More work on UI --- korge-sandbox/src/commonMain/kotlin/Main.kt | 4 ++-- .../kotlin/com/soywiz/korge/ui/UIButton.kt | 3 ++- .../kotlin/com/soywiz/korge/ui/UIComboBox.kt | 2 +- .../com/soywiz/korge/ui/UIFocusManager.kt | 6 +----- .../kotlin/com/soywiz/korge/view/Text.kt | 2 +- .../kotlin/com/soywiz/korim/font/Font.kt | 17 ++++++----------- .../kotlin/com/soywiz/korim/font/Metrics.kt | 14 ++++++-------- 7 files changed, 19 insertions(+), 29 deletions(-) diff --git a/korge-sandbox/src/commonMain/kotlin/Main.kt b/korge-sandbox/src/commonMain/kotlin/Main.kt index c253b9a389..b2588d6d1e 100644 --- a/korge-sandbox/src/commonMain/kotlin/Main.kt +++ b/korge-sandbox/src/commonMain/kotlin/Main.kt @@ -40,8 +40,8 @@ suspend fun main() = Korge( //Demo(::MainAnimations), //Demo(::MainCache), //Demo(::MainEditor), - //Demo(::MainUI), - Demo(::MainTextMetrics), + Demo(::MainUI), + //Demo(::MainTextMetrics), //Demo(::MainBunnymark), //Demo(::MainBlur), //Demo(::MainSDF), diff --git a/korge/src/commonMain/kotlin/com/soywiz/korge/ui/UIButton.kt b/korge/src/commonMain/kotlin/com/soywiz/korge/ui/UIButton.kt index eee75fadb8..88cb74e10d 100644 --- a/korge/src/commonMain/kotlin/com/soywiz/korge/ui/UIButton.kt +++ b/korge/src/commonMain/kotlin/com/soywiz/korge/ui/UIButton.kt @@ -91,7 +91,7 @@ open class UIButton( var skin: UISkin? get() = uiSkin ; set(value) { uiSkin = value } var forcePressed = false - var radius = 6.pt + var radius: Length = 6.pt set(value) { field = value setInitialState() @@ -161,6 +161,7 @@ open class UIButton( val textView = textBlock(richText ?: RichTextData(text, font = DefaultTtfFontAsBitmap), align = TextAlignment.MIDDLE_CENTER) @ViewProperty + @ViewPropertyProvider(TextAlignment.Provider::class) var textAlignment: TextAlignment by textView::align protected val iconView = image(Bitmaps.transparent) diff --git a/korge/src/commonMain/kotlin/com/soywiz/korge/ui/UIComboBox.kt b/korge/src/commonMain/kotlin/com/soywiz/korge/ui/UIComboBox.kt index bc7d5b2921..3e6c0afa63 100644 --- a/korge/src/commonMain/kotlin/com/soywiz/korge/ui/UIComboBox.kt +++ b/korge/src/commonMain/kotlin/com/soywiz/korge/ui/UIComboBox.kt @@ -118,7 +118,7 @@ open class UIComboBox( matchesFilter(index) -> { val highlightColor = MaterialColors.BLUE_800 RichTextData.fromHTML(itemText.htmlspecialchars().replace(Regex(Regex.escapeReplacement(filter), RegexOption.IGNORE_CASE)) { - "${it.value}" + "${it.value}" }, RichTextData.Style(color = Colors.BLACK, font = DefaultTtfFontAsBitmap)) } else -> { diff --git a/korge/src/commonMain/kotlin/com/soywiz/korge/ui/UIFocusManager.kt b/korge/src/commonMain/kotlin/com/soywiz/korge/ui/UIFocusManager.kt index c1fac85e53..afbf08b056 100644 --- a/korge/src/commonMain/kotlin/com/soywiz/korge/ui/UIFocusManager.kt +++ b/korge/src/commonMain/kotlin/com/soywiz/korge/ui/UIFocusManager.kt @@ -19,11 +19,7 @@ interface UIFocusable { var UIFocusable.focused: Boolean get() = UIFocusManager.Scope.focusView.stage?.uiFocusedView == this set(value) { - if (value) { - UIFocusManager.Scope.focusView.stage?.uiFocusManager?.uiFocusedView = this - } else { - UIFocusManager.Scope.focusView.stage?.uiFocusManager?.uiFocusedView = null - } + UIFocusManager.Scope.focusView.stage?.uiFocusManager?.uiFocusedView = if (value) this else null } @ThreadLocal diff --git a/korge/src/commonMain/kotlin/com/soywiz/korge/view/Text.kt b/korge/src/commonMain/kotlin/com/soywiz/korge/view/Text.kt index 90850d7681..b10aa5978f 100644 --- a/korge/src/commonMain/kotlin/com/soywiz/korge/view/Text.kt +++ b/korge/src/commonMain/kotlin/com/soywiz/korge/view/Text.kt @@ -249,7 +249,7 @@ open class Text( _renderInternal(null) if (cachedVersionGlyphMetrics != version) { cachedVersionGlyphMetrics = version - _textMetricsResult = font.getOrNull()?.getTextBoundsWithGlyphs(fontSize, text, renderer) + _textMetricsResult = font.getOrNull()?.getTextBoundsWithGlyphs(fontSize, text, renderer, alignment) } return _textMetricsResult ?: error("Must ensure font is resolved before calling getGlyphMetrics") } diff --git a/korim/src/commonMain/kotlin/com/soywiz/korim/font/Font.kt b/korim/src/commonMain/kotlin/com/soywiz/korim/font/Font.kt index aecf9a6ee8..3d1c47b5a3 100644 --- a/korim/src/commonMain/kotlin/com/soywiz/korim/font/Font.kt +++ b/korim/src/commonMain/kotlin/com/soywiz/korim/font/Font.kt @@ -83,17 +83,12 @@ data class PlacedGlyphMetrics constructor( val boundsPath: VectorPath by lazy { buildVectorPath { this.optimize = false - val rect = Rectangle().copyFrom(metrics.bounds) - rect.y = -fontMetrics.ascent - rect.height = fontMetrics.ascent - fontMetrics.descent - - //println("rect=$rect, ascent=${fontMetrics.ascent}, descent=${fontMetrics.descent}") - - //rect.y = -rect.y - //rect.height = -rect.height - //rect.y = -rect.y - //rect.height = -rect.height - rect(rect) + rect( + metrics.left, + -fontMetrics.ascent, + metrics.xadvance, + fontMetrics.lineHeight + ) }.applyTransform(Matrix().translate(x, y).premultiply(transform)) } val boundsPathCurves: Curves by lazy { diff --git a/korim/src/commonMain/kotlin/com/soywiz/korim/font/Metrics.kt b/korim/src/commonMain/kotlin/com/soywiz/korim/font/Metrics.kt index 7a835b29b8..f03f64970d 100644 --- a/korim/src/commonMain/kotlin/com/soywiz/korim/font/Metrics.kt +++ b/korim/src/commonMain/kotlin/com/soywiz/korim/font/Metrics.kt @@ -1,12 +1,8 @@ package com.soywiz.korim.font -import com.soywiz.kmem.toIntRound -import com.soywiz.korio.util.niceStr -import com.soywiz.korma.geom.Rectangle -import com.soywiz.korma.math.* -import kotlin.math.max -import kotlin.math.min -import kotlin.math.roundToInt +import com.soywiz.korio.util.* +import com.soywiz.korma.geom.* +import kotlin.math.* /** * ... [top] (Positive) @@ -50,8 +46,10 @@ data class FontMetrics( /** Bottom-most part of the glyphs (without the [lineGap] between lines) */ val rbottom: Double get() = min(descent, bottom) + val lineHeightWithoutGap: Double get() = rtop - rbottom + /** Total size of a line including from [top] to [bottom] + [lineGap] */ - val lineHeight: Double get() = rtop - rbottom + lineGap // Including gap! + val lineHeight: Double get() = lineHeightWithoutGap + lineGap // Including gap! fun copyFrom(other: FontMetrics): FontMetrics = this.copyFromScaled(other, 1.0) fun copyFromNewSize(other: FontMetrics, size: Double): FontMetrics = this.copyFromScaled(other, size / other.size)