Skip to content

Commit 20baab0

Browse files
committed
Added 2016 April fool example
1 parent b11076a commit 20baab0

File tree

6 files changed

+113
-0
lines changed

6 files changed

+113
-0
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<module type="JAVA_MODULE" version="4">
3+
<component name="NewModuleRootManager" inherit-compiler-output="true">
4+
<exclude-output />
5+
<content url="file://$MODULE_DIR$">
6+
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
7+
</content>
8+
<orderEntry type="inheritedJdk" />
9+
<orderEntry type="sourceFolder" forTests="false" />
10+
<orderEntry type="library" name="KotlinJavaRuntime" level="project" />
11+
</component>
12+
</module>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
Notified AnotherProperty [MainViewModel@246b179d]
2+
This is additional for AnotherProperty
3+
Hoge Taro
4+
Notified fullName [MainViewModel@246b179d]
5+
This is additional for fullName
6+
Piyo Jiro
7+
9876
8+
Notified step [MainKt$main$subVm$1@25f38edc]
9+
12345
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
open class EventArgs
2+
3+
class PropertyChangedEventArgs(val propertyName: String = "") : EventArgs()
4+
5+
class EventHandler<TObj, TArg : EventArgs> {
6+
private val handlers = arrayListOf<(EventHandler<TObj, TArg>.(TObj, TArg) -> Unit)>()
7+
8+
operator fun plusAssign(handler: EventHandler<TObj, TArg>.(TObj, TArg) -> Unit) {
9+
handlers.add(handler);
10+
}
11+
12+
operator fun invoke(sender: TObj, e: TArg) {
13+
for (handler in handlers) {
14+
handler(sender, e)
15+
}
16+
}
17+
}
18+
19+
// public typeAlias PropertyChangedEventHandler = EventHandler<Any, PropertyChangedEventArgs>
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// -----------
2+
// ここからVM
3+
// -----------
4+
class MainViewModel : NotifyPropertyChanged {
5+
fun Test() {
6+
// do your complex job
7+
8+
raisePropertyChanged("AnotherProperty")
9+
}
10+
11+
var fullName: String by PropertyChangedDelegate("Hoge Taro")
12+
}
13+
// -----------
14+
// ここまでVM
15+
// -----------
16+
17+
fun main(args: Array<String>) {
18+
val mainVm = MainViewModel()
19+
val subVm = object : NotifyPropertyChanged {
20+
var step: Int by PropertyChangedDelegate(9876)
21+
}
22+
23+
mainVm.propertyChanged += { sender, e ->
24+
println("Notified ${e.propertyName} [$sender]")
25+
}
26+
mainVm.propertyChanged += { sender, e ->
27+
println("This is additional for ${e.propertyName}")
28+
}
29+
30+
subVm.propertyChanged += { sender, e ->
31+
println("Notified ${e.propertyName} [$sender]")
32+
}
33+
34+
mainVm.Test()
35+
36+
println(mainVm.fullName)
37+
mainVm.fullName = "Piyo Jiro"
38+
println(mainVm.fullName)
39+
40+
println(subVm.step)
41+
subVm.step = 12345
42+
println(subVm.step)
43+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@Target(AnnotationTarget.VALUE_PARAMETER)
2+
annotation class CallerMemberName
3+
4+
interface NotifyPropertyChanged {
5+
val propertyChanged: EventHandler<Any, PropertyChangedEventArgs>
6+
get() = eventHandlers.getOrPut(hashCode(), { EventHandler() })
7+
8+
fun raisePropertyChanged(@CallerMemberName propertyName: String = "") {
9+
propertyChanged(this, PropertyChangedEventArgs(propertyName));
10+
}
11+
12+
companion object {
13+
private val eventHandlers: MutableMap<Int, EventHandler<Any, PropertyChangedEventArgs>> = mutableMapOf()
14+
}
15+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import kotlin.reflect.KProperty
2+
3+
class PropertyChangedDelegate<T>(initalValue: T) {
4+
private var value: T = initalValue
5+
6+
operator fun getValue(thisRef: NotifyPropertyChanged, property: KProperty<*>): T {
7+
return value
8+
}
9+
10+
operator fun setValue(thisRef: NotifyPropertyChanged, property: KProperty<*>, value: T) {
11+
this.value = value
12+
13+
thisRef.raisePropertyChanged(property.name)
14+
}
15+
}

0 commit comments

Comments
 (0)