Implemented saving generated QR code

This commit is contained in:
dankito 2020-11-16 01:41:40 +01:00
parent 0f8f09e669
commit 6c21222051
3 changed files with 128 additions and 11 deletions

View File

@ -1,16 +1,21 @@
package net.codinux.banking.epcqrcode.windows.main
import javafx.beans.property.SimpleBooleanProperty
import javafx.beans.property.SimpleObjectProperty
import javafx.beans.property.SimpleStringProperty
import javafx.geometry.Pos
import javafx.scene.control.Alert
import javafx.scene.control.TextFormatter
import javafx.scene.image.Image
import net.codinux.banking.epcqrcode.*
import javafx.scene.layout.Priority
import javafx.stage.FileChooser
import org.slf4j.LoggerFactory
import tornadofx.*
import java.io.ByteArrayInputStream
import java.io.File
import java.text.DecimalFormat
import java.text.ParsePosition
import net.codinux.banking.epcqrcode.*
class MainWindow : View(FX.messages["application.title"]) {
@ -35,9 +40,23 @@ class MainWindow : View(FX.messages["application.title"]) {
private val reference = SimpleStringProperty("")
private val selectedDestinationFile = SimpleStringProperty("")
private val isDestinationFileSelected = SimpleBooleanProperty(false)
private val qrCodeGenerator = QrCodeGenerator()
private val generatedQrCode = SimpleObjectProperty<Image>()
private val generatedQrCodeImage = SimpleObjectProperty<Image>()
private var generatedQrCodeBytes: ByteArray? = null // couldn't find no working way to get image bytes from image -> also saving pure bytes in memory (what a waste)
init {
selectedDestinationFile.addListener { _, _, newValue ->
isDestinationFileSelected.value = newValue.isNotBlank()
}
}
override val root = vbox {
@ -80,18 +99,69 @@ class MainWindow : View(FX.messages["application.title"]) {
}
}
hbox(alignment = Pos.CENTER_RIGHT) {
button(messages["Generate"]) {
prefWidth = 200.0
hbox {
textfield(selectedDestinationFile) {
prefHeight = FieldHeight
hboxConstraints {
hGrow = Priority.ALWAYS
marginRight = 8.0
}
}
button("...") {
prefWidth = 50.0
prefHeight = FieldHeight
action { selectDestinationFileAndSaveTo() }
}
vboxConstraints {
marginBottom = 6.0
}
}
hbox {
useMaxWidth = true
isFillWidth = true
button(messages["generate"]) {
useMaxWidth = true
minHeight = 36.0
action { generateQrCode() }
hboxConstraints {
hGrow = Priority.ALWAYS
marginRight = 8.0
}
}
button(messages["generate.and.save"]) {
useMaxWidth = true
minHeight = 36.0
enableWhen(isDestinationFileSelected)
action { generateAndSaveQrCode() }
hboxConstraints {
hGrow = Priority.ALWAYS
}
}
}
}
hbox(alignment = Pos.CENTER) {
imageview(generatedQrCode) {
imageview(generatedQrCodeImage) {
contextmenu {
item(messages["save.to"]) {
action { selectDestinationFileAndSaveTo() }
}
}
hboxConstraints {
marginTop = 4.0
}
@ -119,11 +189,50 @@ class MainWindow : View(FX.messages["application.title"]) {
}
private fun selectDestinationFileAndSaveTo() {
val fileChooser = FileChooser()
if (isDestinationFileSelected.value) {
val file = File(selectedDestinationFile.value)
fileChooser.initialDirectory = file.parentFile
fileChooser.initialFileName = file.name
}
fileChooser.showSaveDialog(currentStage)?.let { selectedFile ->
selectedDestinationFile.value = selectedFile.absolutePath
saveGeneratedQrCodeTo(selectedFile)
}
}
private fun saveGeneratedQrCodeTo(selectedFile: File) {
generatedQrCodeBytes?.let { generatedQrCodeBytes ->
try {
selectedFile.writeBytes(generatedQrCodeBytes)
} catch (e: Exception) {
val alert = Alert(Alert.AlertType.ERROR)
alert.title = messages["Could not save QR code"]
alert.headerText = ""
alert.contentText = e.toString()
alert.show()
}
}
}
private fun generateAndSaveQrCode() {
generateQrCode()
if (isDestinationFileSelected.value) {
saveGeneratedQrCodeTo(File(selectedDestinationFile.value))
}
}
private fun generateQrCode() {
val param = CreatorParam(receiver.value, iban.value, bic.value, map(amount.value), reference.value)
val qrCodeContent = EpcQrCodeCreator().generateAsString(param)
generatedQrCode.value = generateQrCode(qrCodeContent)
generatedQrCodeImage.value = generateQrCode(qrCodeContent)
currentStage?.sizeToScene()
}
@ -134,9 +243,9 @@ class MainWindow : View(FX.messages["application.title"]) {
private fun generateQrCode(informationToEncode: String): Image? {
try {
val qrCodeBytes = qrCodeGenerator.generateQrCode(informationToEncode)
generatedQrCodeBytes = qrCodeGenerator.generateQrCode(informationToEncode)
return Image(ByteArrayInputStream(qrCodeBytes))
return Image(ByteArrayInputStream(generatedQrCodeBytes))
} catch (e: Exception) {
logger.error("Could not generate QR code for $informationToEncode", e)
}

View File

@ -14,4 +14,8 @@ BIC=BIC
Amount=Amount
Reference=Reference
Generate=Generate
generate=Generate
generate.and.save=Generate and save
save.to=Save to ...
alert.header.could.not.save.qr.code=Could not save QR code

View File

@ -14,4 +14,8 @@ BIC=BIC
Amount=Betrag
Reference=Verwendungszweck
Generate=Erstellen
generate=Erstellen
generate.and.save=Erstellen und speichern
save.to=Speichern unter...
alert.header.could.not.save.qr.code=QR Code konnte nicht gespeichert werden