edvin / tornadofx

Lightweight JavaFX Framework for Kotlin
Apache License 2.0
3.67k stars 269 forks source link

The repeated `onDock` is not called in some cases for `replaceWith` #678

Open ValeriusGC opened 6 years ago

ValeriusGC commented 6 years ago

When the first replaced view are main view all is OK:

class ReplaceViewApp : App() {
    override val primaryView = ReplaceView1::class
}

fun main(args: Array<String>) {
    Application.launch(ReplaceViewApp::class.java, *args)
}

class ReplaceView1: View() {
    override val root = vbox {
        button("Go to MyView2") {
            action {
                replaceWith(ReplaceView2::class, ViewTransition.Slide(0.3.seconds, LEFT))
            }
        }
    }

    override fun onDock() {
        println("Docking MyView1!")
    }

    override fun onUndock() {
        println("Undocking MyView1!")
    }
}

class ReplaceView2: View() {
    override val root = vbox {
        button("Go to MyView1") {
            action {
                replaceWith(ReplaceView1::class, ViewTransition.Slide(0.3.seconds, LEFT))
            }
        }
    }

    override fun onDock() {
        println("Docking MyView2!")
    }

    override fun onUndock() {
        println("Undocking MyView2!")
    }
}

here is the output: Docking MyView1! Undocking MyView1! Docking MyView2! Undocking MyView2! Docking MyView1! Undocking MyView1! Docking MyView2! Undocking MyView2! Docking MyView1!

But if all replaced views are secondary ones then repeated onDock for first view is not called after replacing:


// Here is the Main View now
class MainReplaceView : View() {

    override val root = vbox {
        button("Open modal View1") {
            action {
                find<ReplaceView1>().openModal()
            }
        }
    }
}

// Look!
class ReplaceViewApp : App() {
    override val primaryView = MainReplaceView::class
}

fun main(args: Array<String>) {
    Application.launch(ReplaceViewApp::class.java, *args)
}

class ReplaceView1: View() {
    override val root = vbox {
        button("Go to MyView2") {
            action {
                replaceWith(ReplaceView2::class, ViewTransition.Slide(0.3.seconds, LEFT))
            }
        }
    }

    override fun onDock() {
        println("Docking MyView1!")
    }

    override fun onUndock() {
        println("Undocking MyView1!")
    }
}

class ReplaceView2: View() {
    override val root = vbox {
        button("Go to MyView1") {
            action {
                replaceWith(ReplaceView1::class, ViewTransition.Slide(0.3.seconds, LEFT))
            }
        }
    }

    override fun onDock() {
        println("Docking MyView2!")
    }

    override fun onUndock() {
        println("Undocking MyView2!")
    }
}

Here is output now: Docking MyView1! Undocking MyView1! Docking MyView2! Undocking MyView2! Undocking MyView1! Docking MyView2! Undocking MyView2! Undocking MyView1! Docking MyView2!

toplinuxsir commented 5 years ago

Yes, I have the same problem !