diff --git a/src/main/kotlin/com/marvinelsen/willow/ui/controllers/DetailsController.kt b/src/main/kotlin/com/marvinelsen/willow/ui/controllers/DetailsController.kt index d793559..a97c420 100644 --- a/src/main/kotlin/com/marvinelsen/willow/ui/controllers/DetailsController.kt +++ b/src/main/kotlin/com/marvinelsen/willow/ui/controllers/DetailsController.kt @@ -25,36 +25,31 @@ import java.util.ResourceBundle class DetailsController(private val model: Model, private val config: Config) { @FXML - private lateinit var flowPaneSelectedEntry: FlowPane + private lateinit var resources: ResourceBundle + + @FXML + private lateinit var flowPaneHeader: FlowPane + + @FXML + private lateinit var labelHeadword: Label @FXML private lateinit var labelPronunciation: Label - @FXML - private lateinit var resources: ResourceBundle - @FXML private lateinit var tabPaneDetails: TabPane @FXML private lateinit var webViewDefinition: WebView - @FXML - @Suppress("UnusedPrivateProperty") - private lateinit var listviewSentences: ListView - @FXML private lateinit var listViewWords: ListView @FXML - @Suppress("UnusedPrivateProperty") private lateinit var listViewCharacters: ListView - @FXML - private lateinit var labelHeadword: Label @FXML - @Suppress("UnusedPrivateMember") private fun initialize() { initializeLabelHeadword() initializeLabelPronunciation() @@ -62,28 +57,74 @@ class DetailsController(private val model: Model, private val config: Config) { initializeListViewWords() initializeListViewCharacters() initializeWebViewDefinition() + } + + private fun initializeLabelHeadword() { + labelHeadword.apply { + textProperty().bind( + Bindings.createStringBinding( + { + val selectedEntry = model.selectedEntry.value + when (config.script.value!!) { + Script.SIMPLIFIED -> selectedEntry?.simplifiedProperty?.value + Script.TRADITIONAL -> selectedEntry?.traditionalProperty?.value + } + }, + config.script, + model.selectedEntry + ) + ) + styleProperty().bind( + Bindings.concat( + "-fx-font-size: ", + config.details.headwordFontSize.asString(), + "px;" + ) + ) + } + } + + private fun initializeLabelPronunciation() { + labelPronunciation.apply { + textProperty().bind( + Bindings.createStringBinding( + { + val selectedEntry = model.selectedEntry.value + when (config.details.pronunciation.value!!) { + Pronunciation.PINYIN_WITH_TONE_MARKS -> selectedEntry?.pinyinWithToneMarksProperty?.value + Pronunciation.PINYIN_WITH_TONE_NUMBERS -> selectedEntry?.pinyinWithToneNumbersProperty?.value + Pronunciation.ZHUYIN -> selectedEntry?.zhuyinProperty?.value + } + }, + config.details.pronunciation, + model.selectedEntry + ) + ) + styleProperty().bind( + Bindings.concat( + "-fx-font-size: ", + config.details.pronunciationFontSize.asString(), + "px;" + ) + ) + } + } + + private fun initializeTabPaneDetails() { + tabPaneDetails.apply { + disableProperty().bind(Bindings.isNull(model.selectedEntry)) + + selectionModel.selectedItemProperty().addListener { _, _, selectedTab -> + if (model.selectedEntry.value == null) return@addListener + + lazyUpdateTabContent(selectedTab.id) + } + } model.selectedEntry.addListener { _, _, newEntry -> if (newEntry == null) return@addListener - when (tabPaneDetails.selectionModel.selectedItem.id) { - "tabWords" -> { - model.findWords() - } - - "tabCharacters" -> { - model.findCharacters() - } - - else -> {} - } - webViewDefinition.engine.loadContent(newEntry.createCedictDefinitionHtml()) - } - } - - private fun initializeWebViewDefinition() { - webViewDefinition.apply { - engine.userStyleSheetLocation = this::class.java.getResource("/css/definitions.css")!!.toExternalForm() + lazyUpdateTabContent(tabPaneDetails.selectionModel.selectedItem.id) } } @@ -101,68 +142,15 @@ class DetailsController(private val model: Model, private val config: Config) { } } - private fun initializeTabPaneDetails() { - tabPaneDetails.apply { - disableProperty().bind(Bindings.isNull(model.selectedEntry)) - - selectionModel.selectedItemProperty().addListener { _, _, selectedTab -> - if (model.selectedEntry.value == null) return@addListener - - when (selectedTab.id) { - "tabWords" -> { - model.findWords() - } - - "tabCharacters" -> { - model.findCharacters() - } - - else -> {} - } - } + private fun initializeWebViewDefinition() { + webViewDefinition.apply { + engine.userStyleSheetLocation = this::class.java.getResource("/css/definitions.css")!!.toExternalForm() } - } - private fun initializeLabelHeadword() { - labelHeadword.apply { - textProperty().bind( - Bindings.createStringBinding( - { - when (config.script.value!!) { - Script.SIMPLIFIED -> model.selectedEntry.value?.simplifiedProperty?.value - Script.TRADITIONAL -> model.selectedEntry.value?.traditionalProperty?.value - } - }, - config.script, - model.selectedEntry - ) - ) - styleProperty().bind(Bindings.concat("-fx-font-size: ", config.details.headwordFontSize.asString(), "px;")) - } - } + model.selectedEntry.addListener { _, _, newEntry -> + if (newEntry == null) return@addListener - private fun initializeLabelPronunciation() { - labelPronunciation.apply { - textProperty().bind( - Bindings.createStringBinding( - { - when (config.details.pronunciation.value!!) { - Pronunciation.PINYIN_WITH_TONE_MARKS -> model.selectedEntry.value?.pinyinWithToneMarksProperty?.value - Pronunciation.PINYIN_WITH_TONE_NUMBERS -> model.selectedEntry.value?.pinyinWithToneNumbersProperty?.value - Pronunciation.ZHUYIN -> model.selectedEntry.value?.zhuyinProperty?.value - } - }, - config.details.pronunciation, - model.selectedEntry - ) - ) - styleProperty().bind( - Bindings.concat( - "-fx-font-size: ", - config.details.pronunciationFontSize.asString(), - "px;" - ) - ) + webViewDefinition.engine.loadContent(newEntry.createCedictDefinitionHtml()) } } @@ -181,13 +169,26 @@ class DetailsController(private val model: Model, private val config: Config) { } } - fun showSelectedEntryContextMenu(contextMenuEvent: ContextMenuEvent) { + @FXML + private fun headerOnContextMenuRequested(contextMenuEvent: ContextMenuEvent) { if (model.selectedEntry.value == null) return createContextMenuForEntry(model.selectedEntry.value, resources).show( - flowPaneSelectedEntry.scene.window, + flowPaneHeader.scene.window, contextMenuEvent.screenX, contextMenuEvent.screenY ) } + + private fun lazyUpdateTabContent(selectedTabId: String?) = when (selectedTabId) { + "tabWords" -> { + model.findWords() + } + + "tabCharacters" -> { + model.findCharacters() + } + + else -> {} + } } diff --git a/src/main/resources/fxml/details.fxml b/src/main/resources/fxml/details.fxml index 5e961a0..1e02969 100644 --- a/src/main/resources/fxml/details.fxml +++ b/src/main/resources/fxml/details.fxml @@ -8,7 +8,7 @@ - @@ -26,7 +26,7 @@ - +