From 2e5a4189862d7378c6e3fa267e4c130f0b964f1c Mon Sep 17 00:00:00 2001 From: Anton Micke Date: Sun, 11 May 2025 00:39:00 +0200 Subject: [PATCH] Use progressbars for winrates --- .../repository/Ergebnis2vs2Repository.java | 4 ++ .../kickerelo/service/Stat2vs2Service.java | 13 ++--- .../kickerelo/views/Stat2vs2View.java | 52 ++++++++++++++----- 3 files changed, 47 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/kickerelo/kickerelo/repository/Ergebnis2vs2Repository.java b/src/main/java/org/kickerelo/kickerelo/repository/Ergebnis2vs2Repository.java index ab3a421..e3163dc 100644 --- a/src/main/java/org/kickerelo/kickerelo/repository/Ergebnis2vs2Repository.java +++ b/src/main/java/org/kickerelo/kickerelo/repository/Ergebnis2vs2Repository.java @@ -11,4 +11,8 @@ public interface Ergebnis2vs2Repository extends JpaRepository spieler = spielerRepository.findByName(playerName); - if (spieler.isEmpty()) throw new NoSuchPlayerException(playerName); - return getWinrate(spieler.get(), p); + public Float getFrontRate(Spieler s) { + int numFront = ergebnis2vs2Repository.countByGewinnerVornOrGewinnerHinten(s, s); + int numAll = ergebnis2vs2Repository.countByGewinnerVornOrGewinnerHintenOrVerliererVornOrVerliererHinten(s, s, s, s); + return (float) numFront / numAll; } } diff --git a/src/main/java/org/kickerelo/kickerelo/views/Stat2vs2View.java b/src/main/java/org/kickerelo/kickerelo/views/Stat2vs2View.java index c78a8f8..deb7af9 100644 --- a/src/main/java/org/kickerelo/kickerelo/views/Stat2vs2View.java +++ b/src/main/java/org/kickerelo/kickerelo/views/Stat2vs2View.java @@ -2,8 +2,10 @@ package org.kickerelo.kickerelo.views; import com.vaadin.flow.component.combobox.ComboBox; import com.vaadin.flow.component.html.H2; -import com.vaadin.flow.component.html.Paragraph; +import com.vaadin.flow.component.html.NativeLabel; import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.component.progressbar.ProgressBar; +import com.vaadin.flow.component.progressbar.ProgressBarVariant; import com.vaadin.flow.router.Route; import org.kickerelo.kickerelo.data.Spieler; import org.kickerelo.kickerelo.service.KickerEloService; @@ -16,27 +18,49 @@ public class Stat2vs2View extends VerticalLayout { KickerEloService kickerEloService; H2 subheading; ComboBox selector; - Paragraph winrateBack; - Paragraph winrateFront; + ProgressBar frontRate = new ProgressBar(); + NativeLabel frontRateText = new NativeLabel(); + ProgressBar winRateFront = new ProgressBar(); + NativeLabel winRateFrontText = new NativeLabel(); + ProgressBar winRateBack = new ProgressBar(); + NativeLabel winRateBackText = new NativeLabel(); + public Stat2vs2View(Stat2vs2Service service, KickerEloService kickerService) { this.stat2vs2Service = service; this.kickerEloService = kickerService; subheading = new H2("2 vs 2 Ergebnis"); selector = new ComboBox<>("Spieler"); selector.setItems(kickerService.getSpielerEntities()); - selector.addValueChangeListener(event -> { - updateData(selector.getValue()); - }); - winrateBack = new Paragraph(""); - winrateFront = new Paragraph(""); - - add(subheading, selector, winrateBack, winrateFront); + selector.addValueChangeListener(event -> updateData(selector.getValue())); + add(subheading, selector, frontRateText, frontRate, winRateFrontText, winRateFront, winRateBackText, winRateBack); } private void updateData(Spieler s) { - Float rateBack = stat2vs2Service.getWinrate(s, Position.BACK); - Float rateFront = stat2vs2Service.getWinrate(s, Position.FRONT); - winrateBack.setText("Winrate hinten: " + (rateBack.isNaN() ? "-" : rateBack)); - winrateFront.setText("Winrate vorne: " + (rateFront.isNaN() ? "-" : rateFront)); + updateFrontRate(s); + updateFrontWinrate(s); + updateBackWinrate(s); + } + + private void updateFrontRate(Spieler s) { + String text = "Anteil Spiele vorne: "; + Float rateFrontGames = stat2vs2Service.getFrontRate(s); + frontRate.setValue(rateFrontGames); + frontRateText.setText(rateFrontGames.isNaN() ? text + "-" : text + String.format("%.2f", rateFrontGames * 100) + "%"); + } + + private void updateFrontWinrate(Spieler s) { + String text = "Winrate vorne: "; + Float winRate = stat2vs2Service.getWinrate(s, Position.FRONT); + winRateFront.setValue(winRate); + winRateFront.addThemeVariants((winRate > 0.5f ? ProgressBarVariant.LUMO_SUCCESS : ProgressBarVariant.LUMO_ERROR)); + winRateFrontText.setText(winRate.isNaN() ? text + "-" : text + String.format("%.2f", winRate * 100) + "%"); + } + + private void updateBackWinrate(Spieler s) { + String text = "Winrate hinten: "; + Float winRate = stat2vs2Service.getWinrate(s, Position.BACK); + winRateBack.setValue(winRate); + winRateBack.addThemeVariants((winRate > 0.5f ? ProgressBarVariant.LUMO_SUCCESS : ProgressBarVariant.LUMO_ERROR)); + winRateBackText.setText(winRate.isNaN() ? text + "-" : text + String.format("%.2f", winRate * 100) + "%"); } }