Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor code of theme/flavors, theme_none() uses blue colors #891

Merged
merged 8 commits into from
Sep 29, 2023
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,11 @@ import org.jetbrains.letsPlot.core.plot.base.scale.Mappers
import org.jetbrains.letsPlot.core.plot.base.scale.Scales
import org.jetbrains.letsPlot.core.plot.base.scale.breaks.ScaleBreaksUtil
import org.jetbrains.letsPlot.core.plot.builder.AxisUtil
import org.jetbrains.letsPlot.core.plot.builder.defaultTheme.DefaultTheme
import org.jetbrains.letsPlot.core.plot.builder.defaultTheme.values.ThemeOption
import org.jetbrains.letsPlot.core.plot.builder.defaultTheme.values.ThemeValuesRClassic
import org.jetbrains.letsPlot.core.plot.builder.guide.AxisComponent
import org.jetbrains.letsPlot.core.plot.builder.guide.Orientation
import demo.plot.common.model.SimpleDemoBase
import org.jetbrains.letsPlot.core.plot.builder.defaultTheme.ThemeUtil
import org.jetbrains.letsPlot.datamodel.svg.dom.SvgRectElement
import org.jetbrains.letsPlot.datamodel.svg.dom.SvgSvgElement

Expand Down Expand Up @@ -135,11 +134,12 @@ open class AxisComponentDemo : SimpleDemoBase(DEMO_BOX_SIZE) {
// axis.gridLineWidth.set(Plot.Axis.GRID_LINE_WIDTH)
// axis.gridLineLength.set(100.0)

val baselineValues = ThemeValuesRClassic()
val themeOptions = baselineValues + mapOf(
ThemeOption.PANEL_GRID to mapOf(ThemeOption.Elem.COLOR to Color.RED)
val theme = ThemeUtil.buildTheme(
themeName = ThemeOption.Name.R_CLASSIC,
userOptions = mapOf(
ThemeOption.PANEL_GRID to mapOf(ThemeOption.Elem.COLOR to Color.RED)
)
)
val theme = DefaultTheme.withBaseFlavor(themeOptions)

val axis = AxisComponent(
length = axisLength,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,14 @@ import org.jetbrains.letsPlot.core.plot.base.scale.Scales
import org.jetbrains.letsPlot.core.plot.base.scale.breaks.QuantizeScale
import org.jetbrains.letsPlot.core.plot.base.scale.transform.Transforms
import org.jetbrains.letsPlot.core.plot.builder.AxisUtil
import org.jetbrains.letsPlot.core.plot.builder.defaultTheme.DefaultTheme
import org.jetbrains.letsPlot.core.plot.builder.defaultTheme.values.ThemeValuesRClassic
import org.jetbrains.letsPlot.core.plot.builder.guide.AxisComponent
import org.jetbrains.letsPlot.core.plot.builder.guide.Orientation
import org.jetbrains.letsPlot.core.commons.color.ColorPalette
import org.jetbrains.letsPlot.core.commons.color.ColorScheme
import org.jetbrains.letsPlot.core.commons.color.PaletteUtil.schemeColors
import demo.plot.common.model.SimpleDemoBase
import org.jetbrains.letsPlot.core.plot.builder.defaultTheme.ThemeUtil
import org.jetbrains.letsPlot.core.plot.builder.defaultTheme.values.ThemeOption

open class ScatterDemo : SimpleDemoBase() {

Expand All @@ -46,6 +46,8 @@ open class ScatterDemo : SimpleDemoBase() {
)
}

private fun classicTheme() = ThemeUtil.buildTheme(ThemeOption.Name.R_CLASSIC)

private fun gauss(): GroupComponent {
val count = 200
val a = normal(count, 0.0, 100.0, 32) // X
Expand Down Expand Up @@ -97,7 +99,7 @@ open class ScatterDemo : SimpleDemoBase() {
// Render
val groupComponent = GroupComponent()

val theme = DefaultTheme.withBaseFlavor(ThemeValuesRClassic().values)
val theme = classicTheme()

run {
// X axis
Expand Down Expand Up @@ -281,7 +283,7 @@ open class ScatterDemo : SimpleDemoBase() {
// coord system
val coord = Coords.DemoAndTest.create(domainX, domainY, demoInnerSize)

val theme = DefaultTheme.withBaseFlavor(ThemeValuesRClassic().values)
val theme = classicTheme()

run {
// X axis
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ internal class DefaultGeomTheme private constructor(
private const val TEXT_SIZE = 7.0

// defaults for geomKind
fun forGeomKind(geomKind: GeomKind, colorTheme: ColorTheme): GeomTheme {
internal fun forGeomKind(geomKind: GeomKind, colorTheme: ColorTheme): GeomTheme {

// Size: point size or line width - depending on the geom kind.
val size = when (geomKind) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,11 @@ package org.jetbrains.letsPlot.core.plot.builder.defaultTheme
import org.jetbrains.letsPlot.core.plot.base.GeomKind
import org.jetbrains.letsPlot.core.plot.base.aes.GeomTheme
import org.jetbrains.letsPlot.core.plot.base.theme.*
import org.jetbrains.letsPlot.core.plot.builder.defaultTheme.values.ThemeOption.Flavor
import org.jetbrains.letsPlot.core.plot.builder.defaultTheme.values.ThemeValuesLPMinimal2
import org.jetbrains.letsPlot.core.plot.builder.defaultTheme.values.ThemeOption
import org.jetbrains.letsPlot.core.plot.builder.presentation.DefaultFontFamilyRegistry
import org.jetbrains.letsPlot.core.plot.builder.presentation.FontFamilyRegistry

class DefaultTheme(
class DefaultTheme internal constructor(
options: Map<String, Any>,
fontFamilyRegistry: FontFamilyRegistry = DefaultFontFamilyRegistry(),
) : Theme {
Expand Down Expand Up @@ -49,10 +48,6 @@ class DefaultTheme(

companion object {
// For demo and tests
fun minimal2() = withBaseFlavor(ThemeValuesLPMinimal2().values)

fun withBaseFlavor(themeValues: Map<String, Any>) = DefaultTheme(
ThemeFlavorUtil.applyFlavor(themeValues, Flavor.BASE)
)
fun minimal2() = ThemeUtil.buildTheme(ThemeOption.Name.LP_MINIMAL)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,227 @@
/*
* Copyright (c) 2022. JetBrains s.r.o.
* Use of this source code is governed by the MIT license that can be found in the LICENSE file.
*/

package org.jetbrains.letsPlot.core.plot.builder.defaultTheme

import org.jetbrains.letsPlot.commons.values.Color
import org.jetbrains.letsPlot.commons.values.Color.Companion.parseHex
import org.jetbrains.letsPlot.core.plot.builder.defaultTheme.values.ThemeOption
import org.jetbrains.letsPlot.core.plot.builder.defaultTheme.values.ThemeOption.Elem

internal class ThemeFlavor private constructor(
val symbolicColors: Map<SymbolicColor, Color>,
val specialColors: Map<String, Map<String, Color>>,
val pen: Color,
val brush: Color,
val paper: Color,
) {
companion object {

// symbolic colors
enum class SymbolicColor {
WHITE,
BLACK,

GREY_1, // 'panel_grid' in themes
GREY_2, // facet 'strip_background'
GREY_3, // 'panel_background'
GREY_4, // borders in 'light' and 'bw' theme
;
}

private val DARK_GREY = parseHex("#474747")
private val LIGHT_GREY = parseHex("#E9E9E9")
private val GREY85 = parseHex("#D9D9D9")

internal fun forName(name: String): ThemeFlavor {
return when (name) {
ThemeOption.Flavor.BASE -> ThemeFlavor(
symbolicColors = mapOf(
SymbolicColor.WHITE to Color.WHITE,
SymbolicColor.BLACK to DARK_GREY,
SymbolicColor.GREY_1 to LIGHT_GREY,
SymbolicColor.GREY_2 to LIGHT_GREY,
SymbolicColor.GREY_3 to LIGHT_GREY,
SymbolicColor.GREY_4 to LIGHT_GREY,
),
specialColors = mapOf(
ThemeOption.TOOLTIP_RECT to mapOf(
Elem.COLOR to DARK_GREY,
Elem.FILL to Color.WHITE
)
),
pen = DARK_GREY,
brush = Color.PACIFIC_BLUE,
paper = Color.WHITE
)

ThemeOption.Flavor.GREY -> ThemeFlavor(
symbolicColors = mapOf(
SymbolicColor.WHITE to Color.WHITE,
SymbolicColor.BLACK to DARK_GREY,

SymbolicColor.GREY_1 to LIGHT_GREY,
SymbolicColor.GREY_2 to GREY85,
SymbolicColor.GREY_3 to parseHex("#EBEBEB"),
SymbolicColor.GREY_4 to DARK_GREY,
),
specialColors = mapOf(
ThemeOption.TOOLTIP_RECT to mapOf(
Elem.COLOR to DARK_GREY,
Elem.FILL to Color.WHITE
)
),
pen = DARK_GREY,
brush = Color.PACIFIC_BLUE,
paper = Color.WHITE
)

ThemeOption.Flavor.LIGHT -> ThemeFlavor(
symbolicColors = mapOf(
SymbolicColor.WHITE to Color.WHITE,
SymbolicColor.BLACK to DARK_GREY,

SymbolicColor.GREY_1 to LIGHT_GREY,
SymbolicColor.GREY_2 to GREY85,
SymbolicColor.GREY_3 to Color.WHITE,
SymbolicColor.GREY_4 to parseHex("#C9C9C9"),
),
specialColors = mapOf(
ThemeOption.TOOLTIP_RECT to mapOf(
Elem.COLOR to DARK_GREY,
Elem.FILL to Color.WHITE
)
),
pen = DARK_GREY,
brush = Color.PACIFIC_BLUE,
paper = Color.WHITE
)

ThemeOption.Flavor.BW -> ThemeFlavor(
symbolicColors = mapOf(
SymbolicColor.WHITE to Color.WHITE,
SymbolicColor.BLACK to DARK_GREY,

SymbolicColor.GREY_1 to LIGHT_GREY,
SymbolicColor.GREY_2 to GREY85,
SymbolicColor.GREY_3 to Color.WHITE,
SymbolicColor.GREY_4 to parseHex("#333333"),
),
specialColors = mapOf(
ThemeOption.TOOLTIP_RECT to mapOf(
Elem.COLOR to DARK_GREY,
Elem.FILL to Color.WHITE
)
),
pen = DARK_GREY,
brush = Color.PACIFIC_BLUE,
paper = Color.WHITE
)

ThemeOption.Flavor.DARCULA -> ThemeFlavor(
symbolicColors = mapOf(
SymbolicColor.WHITE to parseHex("#303030"),
SymbolicColor.BLACK to parseHex("#BBBBBB"),
SymbolicColor.GREY_1 to parseHex("#474747"),
SymbolicColor.GREY_2 to parseHex("#363636"),
SymbolicColor.GREY_3 to parseHex("#3B3B3B"),
SymbolicColor.GREY_4 to parseHex("#BBBBBB"),
),
specialColors = mapOf(
ThemeOption.TOOLTIP_RECT to mapOf(
Elem.COLOR to parseHex("#BBBBBB"),
Elem.FILL to parseHex("#141414")
)
),
pen = parseHex("#BBBBBB"),
brush = Color.PACIFIC_BLUE,
paper = parseHex("#303030")
)

ThemeOption.Flavor.SOLARIZED_LIGHT -> ThemeFlavor(
symbolicColors = mapOf(
SymbolicColor.WHITE to parseHex("#FDF6E3"),
SymbolicColor.BLACK to parseHex("#2E4E58"),
SymbolicColor.GREY_1 to parseHex("#D7D4CB"),
SymbolicColor.GREY_2 to parseHex("#E6DFCA"),
SymbolicColor.GREY_3 to parseHex("#EEE8D5"),
SymbolicColor.GREY_4 to parseHex("#2E4E58"),
),
specialColors = mapOf(
ThemeOption.TOOLTIP_RECT to mapOf(
Elem.COLOR to parseHex("#2E4E58"),
Elem.FILL to parseHex("#FEFBF3")
)
),
pen = parseHex("#2E4E58"),
brush = Color.PACIFIC_BLUE,
paper = parseHex("#FDF6E3")
)

ThemeOption.Flavor.SOLARIZED_DARK -> ThemeFlavor(
symbolicColors = mapOf(
SymbolicColor.WHITE to parseHex("#0E3C4A"),
SymbolicColor.BLACK to parseHex("#A7B6BA"),
SymbolicColor.GREY_1 to parseHex("#455458"),
SymbolicColor.GREY_2 to parseHex("#1F4650"),
SymbolicColor.GREY_3 to parseHex("#1B4854"),
SymbolicColor.GREY_4 to parseHex("#A7B6BA"),
),
specialColors = mapOf(
ThemeOption.TOOLTIP_RECT to mapOf(
Elem.COLOR to parseHex("#A7B6BA"),
Elem.FILL to parseHex("#0B2F3A")
)
),
pen = parseHex("#A7B6BA"),
brush = Color.PACIFIC_BLUE,
paper = parseHex("#0E3C4A")
)

ThemeOption.Flavor.HIGH_CONTRAST_LIGHT -> ThemeFlavor(
symbolicColors = mapOf(
SymbolicColor.WHITE to Color.WHITE,
SymbolicColor.BLACK to Color.BLACK,
SymbolicColor.GREY_1 to parseHex("#E9E9E9"),
SymbolicColor.GREY_2 to parseHex("#D9D9D9"),
SymbolicColor.GREY_3 to parseHex("#EBEBEB"),
SymbolicColor.GREY_4 to Color.BLACK,
),
specialColors = mapOf(
ThemeOption.TOOLTIP_RECT to mapOf(
Elem.COLOR to Color.BLACK,
Elem.FILL to Color.WHITE
)
),
pen = Color.BLACK,
brush = Color.PACIFIC_BLUE,
paper = Color.WHITE
)

ThemeOption.Flavor.HIGH_CONTRAST_DARK -> ThemeFlavor(
symbolicColors = mapOf(
SymbolicColor.WHITE to Color.BLACK,
SymbolicColor.BLACK to Color.WHITE,
SymbolicColor.GREY_1 to parseHex("#474747"),
SymbolicColor.GREY_2 to parseHex("#363636"),
SymbolicColor.GREY_3 to parseHex("#3B3B3B"),
SymbolicColor.GREY_4 to Color.WHITE,
),
specialColors = mapOf(
ThemeOption.TOOLTIP_RECT to mapOf(
Elem.COLOR to Color.WHITE,
Elem.FILL to parseHex("#460073")
)
),
pen = Color.WHITE,
brush = Color.PACIFIC_BLUE,
paper = Color.BLACK
)

else -> throw IllegalArgumentException("Unsupported theme flavor: '$name'")
}
}
}
}
Loading