Files
CHESS/src/vue/CaseSwingUI.java
T
2025-09-07 14:44:32 +02:00

266 lines
8.9 KiB
Java

package vue;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;
import modele.Case;
import modele.piece.Piece;
import modele.Couleur;
public class CaseSwingUI extends JPanel implements MouseListener{
private Color couleurCaseClaire;
private Color couleurCaseFoncee;
private Color couleurCaseSelection;
private Color couleurCasePrecedente;
private final int ligne;
private final int colonne;
private boolean estDernierCoupOrigine = false;
private boolean estDernierCoupDestination = false;
private boolean selectionnee = false;
private final JLabel label = new JLabel("", SwingConstants.CENTER);
private final Case caseModele; // reference vers la case de le modele
public CaseSwingUI(String style, int ligne, int colonne, Case caseModele) {
switch (style) {
case "RETRO_BOIS" -> {
// Style Bois rétro :
couleurCaseClaire = new Color(222, 184, 135); // Burlywood (bois clair rétro)
couleurCaseFoncee = new Color(139, 69, 19); // SaddleBrown (bois foncé rétro)
couleurCaseSelection = new Color(205, 133, 63); // Peru (orange/brun vieilli)
}
case "METAL_FUTURISTE" -> {
// Style métallique Futuriste
couleurCaseClaire = new Color(192, 192, 192); // Silver
couleurCaseFoncee = new Color(105, 105, 105); // DimGray
couleurCaseSelection = new Color(0, 255, 255); // Cyan flashy (effet néon)
}
case "BOIS_CLAIR" -> {
// Style Bois clair
couleurCaseClaire = new Color(240, 218, 181); // Beige clair
couleurCaseFoncee = new Color(181, 136, 99); // Marron clair
couleurCaseSelection = new Color(209, 83, 71); // Rouge-orangé
couleurCasePrecedente = new Color(255, 112, 99); // Rouge clair
}
case "JAUNE_CHALEUREUX" -> {
// Style Jaune Chaleureux
couleurCaseClaire = new Color(253, 231, 76); // Jaune vif
couleurCaseFoncee = new Color(227, 101, 91); // Rouge doux
couleurCaseSelection = new Color(248, 161, 87); // Orange doux
}
case "VINTAGE_PASTEL" -> {
// Style vintage pastel
couleurCaseClaire = new Color(246, 229, 189); // Beige pastel
couleurCaseFoncee = new Color(249, 125, 125); // Rose brique clair
couleurCaseSelection = new Color(200, 90, 90); // Rouge passé
}
default -> {
couleurCaseClaire = new Color(255, 255, 255); // Blanc
couleurCaseFoncee = new Color(200, 200, 200); // Gris
couleurCaseSelection = new Color(100, 100, 100); // Gris foncé
}
}
this.ligne = ligne;
this.colonne = colonne;
this.caseModele = caseModele;
// Gestion de la couleur
if ((ligne + colonne) % 2 == 0) {
setBackground(this.couleurCaseClaire); // couleur claire
} else {
setBackground(this.couleurCaseFoncee); // couleur foncée
}
setOpaque(true);
setPreferredSize(new Dimension(64, 64));
setLayout(new BorderLayout());
// Ajout du label à la case
label.setFont(new Font("SansSerif", Font.BOLD, 60));
add(label, BorderLayout.CENTER);
this.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));
this.updateFromModel(); // Mise à jour de l'affichage à partir du modèle
//Ajoutons l'ecouteur
addMouseListener(this);
}
@Override
public void mouseClicked(MouseEvent e) {
Container parent = this.getParent();
while(parent != null && !(parent instanceof PlateauSwingUI)) {
parent = parent.getParent();
}
if (parent instanceof PlateauSwingUI plateau) {
plateau.selectionnerCase(this);
}
//System.out.println("Case cliquée : " + ligne + ", " + colonne);
}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
@Override
protected void paintComponent(Graphics pinceaux) {
super.paintComponent(pinceaux); // Pour effacer l'ancien objet
Graphics2D g2d = (Graphics2D) pinceaux.create();
// Appliquer l'anti-aliasing pour des bords plus doux
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
int w = getWidth();
int h = getHeight();
// Couleur de fond (jaune)
//System.out.println("Selectionner debug: "+selectionnee );
if(selectionnee){
this.setBackground(couleurCaseSelection);
// Pour le truc de dégradé
// //Dégradé radial: claire au centre, foncé aux bords
// Color centre = new Color(255, 150, 130); // plus claire au centre
// Color bord = new Color(200, 50, 40); // plus foncé aux bords
// float[] dist = {0.0f, 1.0f};
// Color[] colors = {centre, bord};
// RadialGradientPaint gradient = new RadialGradientPaint(
// w / 2f, h / 2f, Math.max(w, h) / 2f, // centre X, centre Y, rayon
// dist, // fractions
// colors // couleurs
// );
// g2d.setPaint(gradient);
// g2d.fillRect(0, 0, w, h);
// //petit contour plus sombre
// g2d.setColor(new Color(150, 30, 30));
// g2d.drawRect(0, 0, w-1, h-1);
}else{
// Couleur normale
//this.setBackground(this.couleurdeFond);
if ((ligne + colonne) % 2 == 0) {
g2d.setColor(couleurCaseClaire);
} else {
g2d.setColor(couleurCaseFoncee);
}
g2d.fillRect(0, 0, w, h);
}
// Surbrillance du dernier coup
if(estDernierCoupOrigine) {
g2d.setColor(couleurCasePrecedente);
g2d.fillRect(0, 0, w, h);
}
if(estDernierCoupDestination) {
g2d.setColor(couleurCaseSelection);
g2d.fillRect(0, 0, w, h);
}
g2d.dispose(); // Libération des ressources graphiques
}
// Rafrachit le contenu visuel depuis le model
public void updateFromModel(){
Piece p = (caseModele != null) ? caseModele.getPiece(): null;
label.setText(toUnicode(p));
if(p != null) {
label.setForeground(new Color(0,0,0));
if (caseModele.getPiece().getCouleur() == Couleur.BLANC) {
label.setForeground(new Color(250,250,250));
}else{
label.setForeground(new Color(30,30,30));
}
}
repaint(); // double appel car setForeground le fais deja
}
private String toUnicode(Piece piece) {
// Conversion du symbole en caractère Unicode
if (piece == null) return "";
String symbole = piece.getSymbole();
return switch (symbole) {
case "BP" -> "";
case "BC" -> "";
case "BF" -> "";
case "BT" -> "";
case "BR" -> "";
case "BO" -> "";
case "NP" -> "";
case "NC" -> "";
case "NF" -> "";
case "NT" -> "";
case "NR" -> "";
case "NO" -> "";
default -> symbole;
};
}
// Getters/setters utiles pour l'IHM
public Piece getPiece() {
return (caseModele != null) ? caseModele.getPiece() : null;
}
public void setPiece(Piece piece) {
if(caseModele !=null ){
caseModele.setPiece(piece);
}
updateFromModel();
}
// Getters pour l'état de sélection
public boolean isSelectionnee() { return selectionnee; }
public void setSelectionnee(boolean selectionnee) {
this.selectionnee = selectionnee;
//this.setBorder(BorderFactory.createLineBorder(selectionnee ? new Color(248, 161, 87) : Color.DARK_GRAY,selectionnee ? 3 : 1));
// Repaint pour mettre à jour la couleur de fond
repaint();
}
// Gestion du dernier coup
public void setLastOrigin(boolean estDernierCoupOrigine) {
this.estDernierCoupOrigine = estDernierCoupOrigine;
repaint();
}
public void setLastDestination(boolean estDernierCoupDestination) {
this.estDernierCoupDestination = estDernierCoupDestination;
repaint();
}
// Getters pour la position de la case
public int getLigne() { return ligne; }
public int getColonne() { return colonne; }
}