New Features #1

Open
marvinelsen wants to merge 76 commits from develop into main
3 changed files with 106 additions and 99 deletions
Showing only changes of commit 40222f67ed - Show all commits

View File

@ -28,7 +28,7 @@ class DictionaryEntryCellFactory(private val resources: ResourceBundle, private
} }
} }
internal class EntryCell(private val resources: ResourceBundle, private val config: Config) : private class EntryCell(private val resources: ResourceBundle, private val config: Config) :
ListCell<DictionaryEntryFx?>() { ListCell<DictionaryEntryFx?>() {
private val labelHeadword = Label().apply { private val labelHeadword = Label().apply {
styleClass.add("headword") styleClass.add("headword")

View File

@ -50,7 +50,6 @@ private class SentenceCell(private val config: Config) : ListCell<SentenceFx?>()
) )
) )
graphic = root graphic = root
} }
} }

View File

@ -19,6 +19,7 @@ import javafx.scene.control.TabPane
import javafx.scene.input.ContextMenuEvent import javafx.scene.input.ContextMenuEvent
import javafx.scene.layout.FlowPane import javafx.scene.layout.FlowPane
import javafx.scene.web.WebView import javafx.scene.web.WebView
import kotlinx.html.DIV
import kotlinx.html.body import kotlinx.html.body
import kotlinx.html.div import kotlinx.html.div
import kotlinx.html.h1 import kotlinx.html.h1
@ -29,7 +30,7 @@ import kotlinx.html.span
import kotlinx.html.stream.createHTML import kotlinx.html.stream.createHTML
import java.util.ResourceBundle import java.util.ResourceBundle
@Suppress("UnusedPrivateMember") @Suppress("UnusedPrivateMember", "TooManyFunctions")
class DetailsController(private val model: Model, private val config: Config) { class DetailsController(private val model: Model, private val config: Config) {
@FXML @FXML
private lateinit var resources: ResourceBundle private lateinit var resources: ResourceBundle
@ -79,7 +80,6 @@ class DetailsController(private val model: Model, private val config: Config) {
@FXML @FXML
private lateinit var labelNoSentencesFound: Label private lateinit var labelNoSentencesFound: Label
@FXML @FXML
private fun initialize() { private fun initialize() {
initializeLabelHeadword() initializeLabelHeadword()
@ -227,30 +227,88 @@ class DetailsController(private val model: Model, private val config: Config) {
model.selectedEntry.addListener { _, _, newEntry -> model.selectedEntry.addListener { _, _, newEntry ->
if (newEntry == null) return@addListener if (newEntry == null) return@addListener
webViewDefinition.engine.loadContent( webViewDefinition.engine.loadContent(createDefinitionHtml(newEntry))
createHTML().html { }
}
@FXML
private fun headerOnContextMenuRequested(contextMenuEvent: ContextMenuEvent) {
if (model.selectedEntry.value == null) return
createContextMenuForEntry(model.selectedEntry.value, resources).show(
flowPaneHeader.scene.window,
contextMenuEvent.screenX,
contextMenuEvent.screenY
)
}
@Suppress("ReturnCount")
private fun lazyUpdateTabContent(selectedTabId: String?) {
when (selectedTabId) {
"tabWords" -> {
if (model.wordsContaining.isNotEmpty()) return
model.findWords()
}
"tabCharacters" -> {
if (model.characters.isNotEmpty()) return
model.findCharacters()
}
"tabSentences" -> {
if (model.sentences.isNotEmpty()) return
model.findSentences()
}
else -> {}
}
}
private fun createDefinitionHtml(entry: DictionaryEntryFx) = createHTML().html {
body { body {
if (newEntry.cedictDefinitions.isNotEmpty()) { if (entry.cedictDefinitions.isNotEmpty()) {
div(classes = "cedict-definition") { div(classes = "cedict-definition") {
h1 { h1 {
+"CC-CEDICT" +"CC-CEDICT"
} }
ol { cedictDefinition(entry)
for (definition in newEntry.cedictDefinitions) { }
}
if (entry.crossStraitsDefinitions.isNotEmpty()) {
div(classes = "cross-straits-definition") {
h1 {
+"Cross-Straits"
}
crossStraitsDefinition(entry)
}
}
if (entry.moedictDefinitions.isNotEmpty()) {
div(classes = "moe-definition") {
h1 {
+"MOE"
}
moeDefinition(entry)
}
}
}
}
}
private fun DIV.cedictDefinition(entry: DictionaryEntryFx) = ol {
for (definition in entry.cedictDefinitions) {
li { li {
+definition.joinToString(separator = "; ") +definition.joinToString(separator = "; ")
} }
} }
} }
}
} private fun DIV.crossStraitsDefinition(entry: DictionaryEntryFx) = ol {
if (newEntry.crossStraitsDefinitions.isNotEmpty()) { entry.crossStraitsDefinitions.forEach { definition ->
div(classes = "cross-straits-definition") {
h1 {
+"Cross-Straits"
}
ol {
newEntry.crossStraitsDefinitions.forEach { definition ->
li { li {
span(classes = "definition") { span(classes = "definition") {
+definition.definition +definition.definition
@ -267,16 +325,9 @@ class DetailsController(private val model: Model, private val config: Config) {
} }
} }
} }
}
} private fun DIV.moeDefinition(entry: DictionaryEntryFx) =
if (newEntry.moedictDefinitions.isNotEmpty()) { entry.moedictDefinitions.groupBy { it.type ?: "" }.entries.forEach { (type, definitions) ->
div(classes = "moe-definition") {
h1 {
+"MOE"
}
newEntry.moedictDefinitions.groupBy {
it.type ?: ""
}.entries.forEach { (type, definitions) ->
if (type != "") { if (type != "") {
span(classes = "type") { span(classes = "type") {
+type +type
@ -317,46 +368,3 @@ class DetailsController(private val model: Model, private val config: Config) {
} }
} }
} }
}
}
}
}
)
}
}
@FXML
private fun headerOnContextMenuRequested(contextMenuEvent: ContextMenuEvent) {
if (model.selectedEntry.value == null) return
createContextMenuForEntry(model.selectedEntry.value, resources).show(
flowPaneHeader.scene.window,
contextMenuEvent.screenX,
contextMenuEvent.screenY
)
}
private fun lazyUpdateTabContent(selectedTabId: String?) {
when (selectedTabId) {
"tabWords" -> {
if (model.wordsContaining.isNotEmpty()) return
model.findWords()
}
"tabCharacters" -> {
if (model.characters.isNotEmpty()) return
model.findCharacters()
}
"tabSentences" -> {
if (model.sentences.isNotEmpty()) return
model.findSentences()
}
else -> {}
}
}
}