Amélioration du code et des menus

This commit is contained in:
2024-12-06 21:18:17 +01:00
parent 0720699f10
commit 0d4106f562
6 changed files with 210 additions and 125 deletions

View File

@@ -33,10 +33,11 @@ public class GameModeSelectionPanel extends JPanel {
private JSpinner startDateSpinner;
private JSpinner endDateSpinner;
private ActionListener buttonListener;
private JCheckBox developerSeriesCheckBox;
public GameModeSelectionPanel(ActionListener buttonListener, JFrame gameModeFrame, MainMenu mainMenu) {
this.buttonListener = buttonListener;
// Initialize database
try {
database = new Database();
@@ -45,7 +46,7 @@ public class GameModeSelectionPanel extends JPanel {
JOptionPane.showMessageDialog(null, "Erreur de connexion à la base de données", "Erreur", JOptionPane.ERROR_MESSAGE);
return;
}
setLayout(new BorderLayout());
// Background setup
@@ -62,7 +63,7 @@ public class GameModeSelectionPanel extends JPanel {
background.add(mainPanel, BorderLayout.CENTER);
// Title
titleLabel = new Title("Choisissez un série", 60f, Color.WHITE);
titleLabel = new Title("Choisissez une série", 60f, Color.WHITE);
mainPanel.add(titleLabel, createGridBagConstraints(0, 0, 2));
mainPanel.add(Box.createVerticalStrut(30), createGridBagConstraints(0, 1, 1));
@@ -75,6 +76,7 @@ public class GameModeSelectionPanel extends JPanel {
modePanel = new JPanel();
modePanel.setOpaque(false);
seriesButtons = new ArrayList<>();
// Pagination panel
JPanel paginationPanel = createPaginationPanel();
@@ -87,112 +89,170 @@ public class GameModeSelectionPanel extends JPanel {
mainPanel.add(Box.createVerticalStrut(30), createGridBagConstraints(0, 5, 1));
// Seed input and start button
// Seed input and start button anchored at the bottom
JPanel seedPanel = createSeedPanel(buttonListener);
mainPanel.add(seedPanel, createGridBagConstraints(0, 6, 2));
background.add(seedPanel, BorderLayout.SOUTH);
}
public void loadSeriesForCurrentPage() {
// Clear existing buttons
modePanel.removeAll();
seriesButtons.clear();
// Récupérer les dates des spinners
Date startDate = (Date) startDateSpinner.getValue();
Date endDate = (Date) endDateSpinner.getValue();
// Calculer le lendemain de la date de fin
Calendar cal = Calendar.getInstance();
cal.setTime(endDate);
cal.add(Calendar.DAY_OF_MONTH, 1); // Ajouter un jour pour obtenir le lendemain
Date nextDay = cal.getTime(); // Le lendemain de endDate
cal.add(Calendar.DAY_OF_MONTH, 1);
Date nextDay = cal.getTime();
// Vérifier si la case à cocher est sélectionnée
boolean onlyDeveloperCreated = developerSeriesCheckBox.isSelected();
// Get paginated series
List<String> series = database.getSeriesByDateRangePaginated(startDate, nextDay,
currentPage,
itemsPerPage);
List<String> series = database.getSeriesByDateRangePaginated(startDate, nextDay, currentPage, itemsPerPage, onlyDeveloperCreated);
// Si aucune série n'est trouvée pour la période donnée, afficher un message
if (series.isEmpty()) {
JOptionPane.showMessageDialog(this, "Aucune série pour la période donnée",
"Avertissement", JOptionPane.WARNING_MESSAGE);
JOptionPane.showMessageDialog(this, "Aucune série pour la période donnée", "Avertissement", JOptionPane.WARNING_MESSAGE);
currentPage = 1; // Reset current page to 1 if no series is available
updatePageLabelAndButtons(1, 1); // Mettre à jour le label et désactiver les boutons
return;
}
// Calculate grid layout dimensions
int buttonCount = series.size();
int columns = Math.min(buttonCount, 5); // Maximum 5 buttons per row
int columns = Math.min(buttonCount, 5);
int rows = (int) Math.ceil((double) buttonCount / columns);
modePanel.setLayout(new GridLayout(rows, columns, 20, 10)); // Add spacing between buttons
modePanel.setLayout(new GridLayout(rows, columns, 20, 10));
for (String seriesName : series) {
JButton seriesButton = createGameModeButton(seriesName, buttonListener);
modePanel.add(seriesButton);
seriesButtons.add(seriesButton);
}
// Update page label
int totalSeries = database.countSeriesByDateRange(startDate, nextDay);
int totalSeries = database.countSeriesByDateRange(startDate, nextDay, onlyDeveloperCreated);
int totalPages = (int) Math.ceil((double) totalSeries / itemsPerPage);
pageLabel.setText("Page " + currentPage + " / " + totalPages);
// Enable/disable pagination buttons
prevButton.setEnabled(currentPage > 1);
nextButton.setEnabled(currentPage < totalPages);
// Assurez-vous que totalPages est au moins 1
totalPages = Math.max(totalPages, 1);
currentPage = Math.min(currentPage, totalPages); // Assurez-vous que la page actuelle ne dépasse pas le nombre total de pages
updatePageLabelAndButtons(currentPage, totalPages);
// Refresh the panel
modePanel.revalidate();
modePanel.repaint();
}
private void updatePageLabelAndButtons(int currentPage, int totalPages) {
pageLabel.setText("Page " + currentPage + " / " + totalPages);
// Enable/disable pagination buttons
prevButton.setEnabled(currentPage > 1);
nextButton.setEnabled(currentPage < totalPages);
// Show/Hide pagination buttons if there is only one page
boolean multiplePages = totalPages > 1;
prevButton.setVisible(multiplePages);
nextButton.setVisible(multiplePages);
pageLabel.setVisible(multiplePages);
}
private JPanel createDateFilterPanel() {
JPanel datePanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
// Création du panneau de date avec un BoxLayout vertical pour un meilleur agencement
JPanel datePanel = new JPanel();
datePanel.setOpaque(false);
datePanel.setLayout(new BoxLayout(datePanel, BoxLayout.Y_AXIS));
// Panneau contenant les spinners de date
JPanel dateSpinnersPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 15, 10));
dateSpinnersPanel.setOpaque(false);
JLabel startLabel = new JLabel("Date de début:");
startLabel.setForeground(Color.WHITE);
startLabel.setFont(new Font("Arial", Font.BOLD, 16));
JLabel endLabel = new JLabel("Date de fin:");
endLabel.setForeground(Color.WHITE);
// Créer des spinners pour les dates de début et de fin
endLabel.setFont(new Font("Arial", Font.BOLD, 16));
// Créer les spinners pour les dates de début et de fin
Calendar cal = Calendar.getInstance();
Date endDate = cal.getTime();
cal.add(Calendar.DAY_OF_YEAR, -30);
Date startDate = cal.getTime();
SpinnerDateModel startDateModel = new SpinnerDateModel(
startDate, // Date par défaut (30 jours avant aujourd'hui)
null, // Pas de date minimale
endDate, // Date maximale = aujourd'hui
Calendar.DAY_OF_MONTH // Unité de changement
);
SpinnerDateModel startDateModel = new SpinnerDateModel(startDate, null, endDate, Calendar.DAY_OF_MONTH);
startDateSpinner = new JSpinner(startDateModel);
startDateSpinner.setEditor(new JSpinner.DateEditor(startDateSpinner, "yyyy-MM-dd"));
SpinnerDateModel endDateModel = new SpinnerDateModel(
endDate, // Date par défaut = aujourd'hui
null, // Pas de date minimale
endDate, // Date maximale = aujourd'hui
Calendar.DAY_OF_MONTH // Unité de changement
);
startDateSpinner.setEditor(new JSpinner.DateEditor(startDateSpinner, "dd-MM-yyyy"));
stylizeDateSpinner(startDateSpinner);
SpinnerDateModel endDateModel = new SpinnerDateModel(endDate, null, endDate, Calendar.DAY_OF_MONTH);
endDateSpinner = new JSpinner(endDateModel);
endDateSpinner.setEditor(new JSpinner.DateEditor(endDateSpinner, "yyyy-MM-dd"));
endDateSpinner.setEditor(new JSpinner.DateEditor(endDateSpinner, "dd-MM-yyyy"));
stylizeDateSpinner(endDateSpinner);
dateSpinnersPanel.add(startLabel);
dateSpinnersPanel.add(startDateSpinner);
dateSpinnersPanel.add(endLabel);
dateSpinnersPanel.add(endDateSpinner);
// Ajouter la case à cocher pour les séries créées par les développeurs
developerSeriesCheckBox = new JCheckBox("Inclure seulement les séries créées par les développeurs");
developerSeriesCheckBox.setOpaque(false);
developerSeriesCheckBox.setForeground(Color.WHITE);
developerSeriesCheckBox.setFont(new Font("Arial", Font.BOLD, 16));
developerSeriesCheckBox.setAlignmentX(Component.CENTER_ALIGNMENT);
// Créer un bouton de filtre
JButton filterButton = new JButton("Filtrer");
filterButton.setFont(new Font("Arial", Font.BOLD, 16));
filterButton.setBackground(new Color(70, 130, 180));
filterButton.setForeground(Color.WHITE);
filterButton.setFocusPainted(false);
filterButton.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createLineBorder(new Color(255, 255, 255, 120), 2),
BorderFactory.createEmptyBorder(5, 15, 5, 15)
));
filterButton.setAlignmentX(Component.CENTER_ALIGNMENT);
filterButton.addActionListener(new GameModeFilterButtonActionListener(this));
datePanel.add(startLabel);
datePanel.add(startDateSpinner);
datePanel.add(endLabel);
datePanel.add(endDateSpinner);
// Ajouter les composants au panneau principal de filtre
datePanel.add(dateSpinnersPanel);
datePanel.add(Box.createVerticalStrut(10));
datePanel.add(developerSeriesCheckBox);
datePanel.add(Box.createVerticalStrut(15));
datePanel.add(filterButton);
return datePanel;
}
private void stylizeDateSpinner(JSpinner spinner) {
JComponent editor = spinner.getEditor();
if (editor instanceof JSpinner.DefaultEditor) {
JSpinner.DefaultEditor defaultEditor = (JSpinner.DefaultEditor) editor;
JTextField textField = defaultEditor.getTextField();
textField.setFont(new Font("Arial", Font.PLAIN, 16));
textField.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createLineBorder(new Color(255, 255, 255, 120), 2),
BorderFactory.createEmptyBorder(5, 10, 5, 10)
));
textField.setBackground(new Color(40, 40, 40)); // Fond doux pour les spinners
textField.setForeground(Color.WHITE); // Texte blanc pour une meilleure lisibilité
textField.setCaretColor(Color.WHITE); // Curseur blanc
}
}
private JPanel createPaginationPanel() {
JPanel paginationPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
paginationPanel.setOpaque(false);