Amélioration du code et des menus
This commit is contained in:
@@ -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);
|
||||
|
Reference in New Issue
Block a user