feat(qr): merge into interface

This commit is contained in:
ineanto 2024-11-17 14:50:35 +01:00
parent 753970cfc1
commit afe0320d6b
Signed by: ineanto
GPG key ID: E511F9CAA2F9CE84
4 changed files with 58 additions and 72 deletions

View file

@ -6,12 +6,16 @@ import javafx.scene.layout.AnchorPane;
import javafx.stage.FileChooser;
import org.apache.commons.io.FilenameUtils;
import xyz.ineanto.qodos.alert.AlertDisplay;
import xyz.ineanto.qodos.generator.QRCodeUtils;
import xyz.ineanto.qodos.generator.QRGenerator;
import xyz.ineanto.qodos.generator.QRURLGenerator;
import xyz.ineanto.qodos.generator.QRVCardGenerator;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.List;
public class MainController {
// NODES
@ -75,9 +79,9 @@ public class MainController {
@FXML
public void initialize() {
exitButton.setOnAction(_ -> System.exit(0));
aboutButton.setOnAction(_ -> AlertDisplay.info("Qodos", "Générateur de QR Code (URL, VCard)\n" +
"Version 0.0.2"));
aboutButton.setOnAction(_ -> AlertDisplay.info("Qodos",
"Générateur de QR Code (URL, VCard, Carte Bleue)\n" +
"Version 0.1.0"));
genderWomenButton.setToggleGroup(toggleGroup);
genderMenButton.setToggleGroup(toggleGroup);
@ -93,11 +97,12 @@ public class MainController {
@FXML
protected void onGenerateButtonClicked() {
try {
QRGenerator generator;
if (tabPane.getSelectionModel().getSelectedIndex() == 0) {
new QRURLGenerator(urlTextField.getText(), logoFile == null ? null : ImageIO.read(logoFile))
.generate(rootPane);
generator = new QRURLGenerator(urlTextField.getText(), logoFile == null ? null : ImageIO.read(logoFile));
} else {
new QRVCardGenerator(
generator = new QRVCardGenerator(
toggleGroup.getToggles().indexOf(toggleGroup.getSelectedToggle()),
familyField.getText(),
nameField.getText(),
@ -106,8 +111,32 @@ public class MainController {
addressField.getText().isBlank() ? null : addressField.getText(),
mailField.getText().isBlank() ? null : mailField.getText(),
logoFile == null ? null : ImageIO.read(logoFile)
).generate(rootPane);
);
}
final BufferedImage image = generator.generate(rootPane);
if (image == null) { return; }
try {
final FileChooser chooser = new FileChooser();
chooser.setTitle("Sélectionner la destination...");
chooser.setInitialFileName("qr");
chooser.setSelectedExtensionFilter(
new FileChooser.ExtensionFilter("Image Files",
List.of("*.png", "*.jpeg", "*.jpg")
)
);
final File file = chooser.showSaveDialog(rootPane.getScene().getWindow());
if (file != null) {
QRCodeUtils.writePNG(image, file.getPath());
} else {
AlertDisplay.error("Veuillez sélectionner un emplacement valide !");
}
} catch (IOException e) {
AlertDisplay.error("Oops! Une erreur est survenue : " + e.getMessage());
}
} catch (IOException e) {
AlertDisplay.error("Impossible de générer le QR Code avec ce logo !");
}
@ -126,8 +155,6 @@ public class MainController {
toggleGroup.getToggles().forEach(toggle -> toggle.setSelected(false));
logoFile = null;
AlertDisplay.info("Information", "Champs et logo réinitialisés.");
}
@FXML
@ -142,11 +169,10 @@ public class MainController {
extension.equals("jpg") ||
extension.equals("jpeg")) {
logoFile = file;
AlertDisplay.success("Logo défini !");
return;
}
AlertDisplay.error("Hmm... ce fichier n'est pas valide (.png/.jpg/.jpeg uniquement acceptés).");
AlertDisplay.error("Ce type de fichier n'est pas valide (.png/.jpg/.jpeg uniquement acceptés).");
logoFile = null;
} else {
AlertDisplay.error("Veuillez sélectionner un fichier !");

View file

@ -0,0 +1,9 @@
package xyz.ineanto.qodos.generator;
import javafx.scene.Node;
import java.awt.image.BufferedImage;
public interface QRGenerator {
BufferedImage generate(Node node);
}

View file

@ -2,34 +2,31 @@ package xyz.ineanto.qodos.generator;
import io.github.simonscholz.qrcode.*;
import javafx.scene.Node;
import javafx.stage.FileChooser;
import xyz.ineanto.qodos.alert.AlertDisplay;
import xyz.ineanto.qodos.url.URLValidator;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.nio.Buffer;
public record QRURLGenerator(
String url,
BufferedImage logo
) {
public void generate(Node node) {
) implements QRGenerator {
public BufferedImage generate(Node node) {
System.out.println("Generating QR Code for URL...");
if (url.isBlank()) {
AlertDisplay.error("Veuillez spécifier une URL.");
return;
return null;
}
if (!URLValidator.isValid(url)) {
AlertDisplay.error("URL invalide.");
return;
return null;
}
final QrCodeApi api = QrCodeFactory.createQrCodeApi();
final BufferedImage image = api.createQrCodeImage(
return api.createQrCodeImage(
logo == null ?
new QrCodeConfig(
url,
@ -40,26 +37,5 @@ public record QRURLGenerator(
new QrLogoConfig(logo)
)
);
try {
final FileChooser chooser = new FileChooser();
chooser.setInitialFileName("qr");
chooser.setSelectedExtensionFilter(
new FileChooser.ExtensionFilter("Image Files",
List.of("*.png", "*.jpeg", "*.jpg")
)
);
chooser.setTitle("Sélectionner la destination...");
final File file = chooser.showSaveDialog(node.getScene().getWindow());
if (file != null) {
QRCodeUtils.writePNG(image, file.getPath());
AlertDisplay.success("QR Code généré sous " + file.getAbsolutePath() + ".");
} else {
AlertDisplay.error("Veuillez sélectionner un emplacement valide !");
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

View file

@ -3,14 +3,10 @@ package xyz.ineanto.qodos.generator;
import io.github.simonscholz.qrcode.*;
import io.github.simonscholz.qrcode.types.VCard;
import javafx.scene.Node;
import javafx.stage.FileChooser;
import xyz.ineanto.qodos.alert.AlertDisplay;
import xyz.ineanto.qodos.url.URLValidator;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.List;
public record QRVCardGenerator(
int gender,
@ -21,18 +17,18 @@ public record QRVCardGenerator(
String address,
String email,
BufferedImage logo
) {
public void generate(Node node) {
) implements QRGenerator {
public BufferedImage generate(Node node) {
System.out.println("Generating QR Code for VCard...");
if (family.isBlank() || name.isBlank()) {
AlertDisplay.error("Veuillez spécifier un prénom et un nom.");
return;
return null;
}
if (gender == -1) {
AlertDisplay.error("Veuillez sélectionner un genre.");
return;
return null;
}
final String[] genders = new String[]{"Mme.", "Mr.", ""};
@ -42,7 +38,7 @@ public record QRVCardGenerator(
if (url != null && !url.isBlank()) {
if (!URLValidator.isValid(url)) {
AlertDisplay.error("URL invalide !");
return;
return null;
}
vCard.website(url);
@ -53,7 +49,7 @@ public record QRVCardGenerator(
if (email != null) { vCard.email(email); }
final QrCodeApi api = QrCodeFactory.createQrCodeApi();
final BufferedImage image = api.createQrCodeImage(
return api.createQrCodeImage(
logo == null ?
new QrCodeConfig(
vCard.toVCardQrCodeText(),
@ -64,26 +60,5 @@ public record QRVCardGenerator(
new QrLogoConfig(logo)
)
);
try {
final FileChooser chooser = new FileChooser();
chooser.setTitle("Sélectionner la destination...");
chooser.setInitialFileName("qr");
chooser.setSelectedExtensionFilter(
new FileChooser.ExtensionFilter("Image Files",
List.of("*.png", "*.jpeg", "*.jpg")
)
);
final File file = chooser.showSaveDialog(node.getScene().getWindow());
if (file != null) {
QRCodeUtils.writePNG(image, file.getPath());
AlertDisplay.success("VCard générée sous " + file.getAbsolutePath() + ".");
} else {
AlertDisplay.error("Veuillez sélectionner un emplacement valide !");
}
} catch (IOException e) {
AlertDisplay.error("Oops! Une erreur est survenue : " + e.getMessage());
}
}
}