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 javafx.stage.FileChooser;
import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.FilenameUtils;
import xyz.ineanto.qodos.alert.AlertDisplay; 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.QRURLGenerator;
import xyz.ineanto.qodos.generator.QRVCardGenerator; import xyz.ineanto.qodos.generator.QRVCardGenerator;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.List;
public class MainController { public class MainController {
// NODES // NODES
@ -75,9 +79,9 @@ public class MainController {
@FXML @FXML
public void initialize() { public void initialize() {
exitButton.setOnAction(_ -> System.exit(0)); exitButton.setOnAction(_ -> System.exit(0));
aboutButton.setOnAction(_ -> AlertDisplay.info("Qodos",
aboutButton.setOnAction(_ -> AlertDisplay.info("Qodos", "Générateur de QR Code (URL, VCard)\n" + "Générateur de QR Code (URL, VCard, Carte Bleue)\n" +
"Version 0.0.2")); "Version 0.1.0"));
genderWomenButton.setToggleGroup(toggleGroup); genderWomenButton.setToggleGroup(toggleGroup);
genderMenButton.setToggleGroup(toggleGroup); genderMenButton.setToggleGroup(toggleGroup);
@ -93,11 +97,12 @@ public class MainController {
@FXML @FXML
protected void onGenerateButtonClicked() { protected void onGenerateButtonClicked() {
try { try {
QRGenerator generator;
if (tabPane.getSelectionModel().getSelectedIndex() == 0) { if (tabPane.getSelectionModel().getSelectedIndex() == 0) {
new QRURLGenerator(urlTextField.getText(), logoFile == null ? null : ImageIO.read(logoFile)) generator = new QRURLGenerator(urlTextField.getText(), logoFile == null ? null : ImageIO.read(logoFile));
.generate(rootPane);
} else { } else {
new QRVCardGenerator( generator = new QRVCardGenerator(
toggleGroup.getToggles().indexOf(toggleGroup.getSelectedToggle()), toggleGroup.getToggles().indexOf(toggleGroup.getSelectedToggle()),
familyField.getText(), familyField.getText(),
nameField.getText(), nameField.getText(),
@ -106,8 +111,32 @@ public class MainController {
addressField.getText().isBlank() ? null : addressField.getText(), addressField.getText().isBlank() ? null : addressField.getText(),
mailField.getText().isBlank() ? null : mailField.getText(), mailField.getText().isBlank() ? null : mailField.getText(),
logoFile == null ? null : ImageIO.read(logoFile) 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) { } catch (IOException e) {
AlertDisplay.error("Impossible de générer le QR Code avec ce logo !"); 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)); toggleGroup.getToggles().forEach(toggle -> toggle.setSelected(false));
logoFile = null; logoFile = null;
AlertDisplay.info("Information", "Champs et logo réinitialisés.");
} }
@FXML @FXML
@ -142,11 +169,10 @@ public class MainController {
extension.equals("jpg") || extension.equals("jpg") ||
extension.equals("jpeg")) { extension.equals("jpeg")) {
logoFile = file; logoFile = file;
AlertDisplay.success("Logo défini !");
return; 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; logoFile = null;
} else { } else {
AlertDisplay.error("Veuillez sélectionner un fichier !"); 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 io.github.simonscholz.qrcode.*;
import javafx.scene.Node; import javafx.scene.Node;
import javafx.stage.FileChooser;
import xyz.ineanto.qodos.alert.AlertDisplay; import xyz.ineanto.qodos.alert.AlertDisplay;
import xyz.ineanto.qodos.url.URLValidator; import xyz.ineanto.qodos.url.URLValidator;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.File; import java.nio.Buffer;
import java.io.IOException;
import java.util.List;
public record QRURLGenerator( public record QRURLGenerator(
String url, String url,
BufferedImage logo BufferedImage logo
) { ) implements QRGenerator {
public void generate(Node node) { public BufferedImage generate(Node node) {
System.out.println("Generating QR Code for URL..."); System.out.println("Generating QR Code for URL...");
if (url.isBlank()) { if (url.isBlank()) {
AlertDisplay.error("Veuillez spécifier une URL."); AlertDisplay.error("Veuillez spécifier une URL.");
return; return null;
} }
if (!URLValidator.isValid(url)) { if (!URLValidator.isValid(url)) {
AlertDisplay.error("URL invalide."); AlertDisplay.error("URL invalide.");
return; return null;
} }
final QrCodeApi api = QrCodeFactory.createQrCodeApi(); final QrCodeApi api = QrCodeFactory.createQrCodeApi();
final BufferedImage image = api.createQrCodeImage( return api.createQrCodeImage(
logo == null ? logo == null ?
new QrCodeConfig( new QrCodeConfig(
url, url,
@ -40,26 +37,5 @@ public record QRURLGenerator(
new QrLogoConfig(logo) 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.*;
import io.github.simonscholz.qrcode.types.VCard; import io.github.simonscholz.qrcode.types.VCard;
import javafx.scene.Node; import javafx.scene.Node;
import javafx.stage.FileChooser;
import xyz.ineanto.qodos.alert.AlertDisplay; import xyz.ineanto.qodos.alert.AlertDisplay;
import xyz.ineanto.qodos.url.URLValidator; import xyz.ineanto.qodos.url.URLValidator;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.List;
public record QRVCardGenerator( public record QRVCardGenerator(
int gender, int gender,
@ -21,18 +17,18 @@ public record QRVCardGenerator(
String address, String address,
String email, String email,
BufferedImage logo BufferedImage logo
) { ) implements QRGenerator {
public void generate(Node node) { public BufferedImage generate(Node node) {
System.out.println("Generating QR Code for VCard..."); System.out.println("Generating QR Code for VCard...");
if (family.isBlank() || name.isBlank()) { if (family.isBlank() || name.isBlank()) {
AlertDisplay.error("Veuillez spécifier un prénom et un nom."); AlertDisplay.error("Veuillez spécifier un prénom et un nom.");
return; return null;
} }
if (gender == -1) { if (gender == -1) {
AlertDisplay.error("Veuillez sélectionner un genre."); AlertDisplay.error("Veuillez sélectionner un genre.");
return; return null;
} }
final String[] genders = new String[]{"Mme.", "Mr.", ""}; final String[] genders = new String[]{"Mme.", "Mr.", ""};
@ -42,7 +38,7 @@ public record QRVCardGenerator(
if (url != null && !url.isBlank()) { if (url != null && !url.isBlank()) {
if (!URLValidator.isValid(url)) { if (!URLValidator.isValid(url)) {
AlertDisplay.error("URL invalide !"); AlertDisplay.error("URL invalide !");
return; return null;
} }
vCard.website(url); vCard.website(url);
@ -53,7 +49,7 @@ public record QRVCardGenerator(
if (email != null) { vCard.email(email); } if (email != null) { vCard.email(email); }
final QrCodeApi api = QrCodeFactory.createQrCodeApi(); final QrCodeApi api = QrCodeFactory.createQrCodeApi();
final BufferedImage image = api.createQrCodeImage( return api.createQrCodeImage(
logo == null ? logo == null ?
new QrCodeConfig( new QrCodeConfig(
vCard.toVCardQrCodeText(), vCard.toVCardQrCodeText(),
@ -64,26 +60,5 @@ public record QRVCardGenerator(
new QrLogoConfig(logo) 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());
}
} }
} }