From ad9002530d9e97eb2cb0788eee22da772f068cc4 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 17 Sep 2018 19:48:23 +0300 Subject: [PATCH] Made StyledConfig inherit config --- src/main/kotlin/hep/dataforge/meta/Config.kt | 2 +- .../hep/dataforge/meta/MutableMetaNode.kt | 2 +- .../kotlin/hep/dataforge/meta/Styleable.kt | 50 ++++++++++++------- 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/src/main/kotlin/hep/dataforge/meta/Config.kt b/src/main/kotlin/hep/dataforge/meta/Config.kt index 6c92e59a..1f53ba89 100644 --- a/src/main/kotlin/hep/dataforge/meta/Config.kt +++ b/src/main/kotlin/hep/dataforge/meta/Config.kt @@ -7,7 +7,7 @@ import hep.dataforge.names.Name /** * Mutable meta representing object state */ -class Config : MutableMetaNode() { +open class Config : MutableMetaNode() { /** * Attach configuration node instead of creating one diff --git a/src/main/kotlin/hep/dataforge/meta/MutableMetaNode.kt b/src/main/kotlin/hep/dataforge/meta/MutableMetaNode.kt index d8a79723..4c7b40a4 100644 --- a/src/main/kotlin/hep/dataforge/meta/MutableMetaNode.kt +++ b/src/main/kotlin/hep/dataforge/meta/MutableMetaNode.kt @@ -41,7 +41,7 @@ abstract class MutableMetaNode> : MetaNode(), MutableM override val items: Map> get() = _items - private fun itemChanged(name: Name, oldItem: MetaItem<*>?, newItem: MetaItem<*>?) { + protected fun itemChanged(name: Name, oldItem: MetaItem<*>?, newItem: MetaItem<*>?) { listeners.forEach { it(name, oldItem, newItem) } } diff --git a/src/main/kotlin/hep/dataforge/meta/Styleable.kt b/src/main/kotlin/hep/dataforge/meta/Styleable.kt index 3665b037..be8465e2 100644 --- a/src/main/kotlin/hep/dataforge/meta/Styleable.kt +++ b/src/main/kotlin/hep/dataforge/meta/Styleable.kt @@ -1,21 +1,29 @@ package hep.dataforge.meta import hep.dataforge.names.Name +import hep.dataforge.names.toName /** * A configuration decorator with applied style */ -class StyledConfig(val config: Config, val style: Meta = EmptyMeta) : MutableMeta { +class StyledConfig(val config: Config, style: Meta = EmptyMeta) : Config() { - override fun onChange(owner: Any?, action: (Name, MetaItem<*>?, MetaItem<*>?) -> Unit) { - config.onChange(owner, action) + var style: Meta = style + set(value) { + field.items.forEach { + itemChanged(it.key.toName(), it.value, null) + } + field = value + value.items.forEach { + itemChanged(it.key.toName(), null, it.value) + } + } + + init { + config.onChange { name, oldItem, newItem -> this.itemChanged(name, oldItem, newItem) } } - override fun removeListener(owner: Any) { - config.removeListener(owner) - } - - override fun set(name: Name, item: MetaItem?) { + override fun set(name: Name, item: MetaItem?) { when (item) { null -> config.remove(name) is MetaItem.ValueItem -> config[name] = item.value @@ -24,16 +32,16 @@ class StyledConfig(val config: Config, val style: Meta = EmptyMeta) : MutableMet } } - override val items: Map> + override val items: Map> get() = (config.items.keys + style.items.keys).associate { key -> val value = config.items[key] val styleValue = style[key] - val item: MetaItem = when (value) { + val item: MetaItem = when (value) { null -> when (styleValue) { null -> error("Should be unreachable") is MetaItem.ValueItem -> MetaItem.ValueItem(styleValue.value) - is MetaItem.SingleNodeItem -> MetaItem.SingleNodeItem(StyledConfig(config.empty(), styleValue.node)) - is MetaItem.MultiNodeItem -> MetaItem.MultiNodeItem(styleValue.nodes.map { StyledConfig(config.empty(), it) }) + is MetaItem.SingleNodeItem -> MetaItem.SingleNodeItem(StyledConfig(config.empty(), styleValue.node)) + is MetaItem.MultiNodeItem -> MetaItem.MultiNodeItem(styleValue.nodes.map { StyledConfig(config.empty(), it) }) } is MetaItem.ValueItem -> MetaItem.ValueItem(value.value) is MetaItem.SingleNodeItem -> MetaItem.SingleNodeItem( @@ -47,14 +55,18 @@ class StyledConfig(val config: Config, val style: Meta = EmptyMeta) : MutableMet } } -fun Config.withStyle(style: Meta = EmptyMeta) = StyledConfig(this, style) +fun Config.withStyle(style: Meta = EmptyMeta) = if (this is StyledConfig) { + StyledConfig(this.config, style) +} else { + StyledConfig(this, style) +} interface Styleable : Configurable { - val styledConfig: StyledConfig + override val config: StyledConfig - override val config - get() = styledConfig.config - - val style - get() = styledConfig.style + var style + get() = config.style + set(value) { + config.style = value + } } \ No newline at end of file