From e0f21a9901dcd7d3740bf3f1d26f8ba35a048208 Mon Sep 17 00:00:00 2001 From: ddamke Date: Wed, 9 Nov 2022 15:55:17 +0100 Subject: [PATCH 01/23] check if same color as project --- .../keeptime/common/RandomColorPicker.java | 46 +++++++++++++++++++ .../common/RandomColorPickerTest.java | 35 ++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 src/main/java/de/doubleslash/keeptime/common/RandomColorPicker.java create mode 100644 src/test/java/de/doubleslash/keeptime/common/RandomColorPickerTest.java diff --git a/src/main/java/de/doubleslash/keeptime/common/RandomColorPicker.java b/src/main/java/de/doubleslash/keeptime/common/RandomColorPicker.java new file mode 100644 index 00000000..f99acd3d --- /dev/null +++ b/src/main/java/de/doubleslash/keeptime/common/RandomColorPicker.java @@ -0,0 +1,46 @@ +package de.doubleslash.keeptime.common; + + + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +public class RandomColorPicker { + private static final Logger LOG = LoggerFactory.getLogger(RandomColorPicker.class); + public static String getRandomColorName() throws ClassNotFoundException, IllegalAccessException { + List colorNames = new RandomColorPicker().getRandomColorNameList(); + double v = Math.random() * (colorNames.size() - 0); + return colorNames.get((int) v); + } + + + private List getRandomColorNameList() throws ClassNotFoundException, IllegalAccessException { + List colorNames = new ArrayList<>(); + Class clazz = Class.forName("javafx.scene.paint.Color"); + if (clazz != null) { + Field[] field = clazz.getFields(); + for (int i = 0; i < field.length; i++) { + Field f = field[i]; + Object colorObj = f.get(null); + colorNames.add(String.valueOf(f).split("Color.")[2]); + } + } + return colorNames; + } + + public static String getUniqueColorName(String color) throws ClassNotFoundException, IllegalAccessException { + + List colorNames = new RandomColorPicker().getRandomColorNameList(); + + double v = Math.random() * (colorNames.size() - 0); + if(color.equals(colorNames.get((int) v))){ + LOG.info("SAME COLOR "); + return colorNames.get((int)v+5); + } + return colorNames.get((int) v); + } +} diff --git a/src/test/java/de/doubleslash/keeptime/common/RandomColorPickerTest.java b/src/test/java/de/doubleslash/keeptime/common/RandomColorPickerTest.java new file mode 100644 index 00000000..5e399e22 --- /dev/null +++ b/src/test/java/de/doubleslash/keeptime/common/RandomColorPickerTest.java @@ -0,0 +1,35 @@ +package de.doubleslash.keeptime.common; + + +import de.doubleslash.keeptime.model.Model; +import de.doubleslash.keeptime.model.Project; +import de.doubleslash.keeptime.view.ProjectsListViewController; +import javafx.scene.paint.Color; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +class RandomColorPickerTest { + private static final Logger LOG = LoggerFactory.getLogger(RandomColorPickerTest.class); + @Test + public void shouldGetRandomColor() throws ClassNotFoundException, IllegalAccessException { + + String randomColor= RandomColorPicker.getRandomColorName(); + LOG.info(randomColor); + Assertions.assertTrue(!randomColor.isEmpty()); + } + + @Test + public void colorIsNotAlreadyUsedByProject() throws ClassNotFoundException, IllegalAccessException { + + for (int i=0; i<1000; i++){ + + String color = RandomColorPicker.getUniqueColorName("BLUE"); + Assertions.assertNotEquals("BLUE", color); + } + + } + +} \ No newline at end of file From a149516169fd86634a64ab3faddce3261edcfead Mon Sep 17 00:00:00 2001 From: ddamke Date: Wed, 9 Nov 2022 16:46:12 +0100 Subject: [PATCH 02/23] update test to not be executed 2000 times --- .../de/doubleslash/keeptime/common/RandomColorPicker.java | 1 - .../de/doubleslash/keeptime/common/RandomColorPickerTest.java | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/de/doubleslash/keeptime/common/RandomColorPicker.java b/src/main/java/de/doubleslash/keeptime/common/RandomColorPicker.java index f99acd3d..a6e20593 100644 --- a/src/main/java/de/doubleslash/keeptime/common/RandomColorPicker.java +++ b/src/main/java/de/doubleslash/keeptime/common/RandomColorPicker.java @@ -38,7 +38,6 @@ public static String getUniqueColorName(String color) throws ClassNotFoundExcept double v = Math.random() * (colorNames.size() - 0); if(color.equals(colorNames.get((int) v))){ - LOG.info("SAME COLOR "); return colorNames.get((int)v+5); } return colorNames.get((int) v); diff --git a/src/test/java/de/doubleslash/keeptime/common/RandomColorPickerTest.java b/src/test/java/de/doubleslash/keeptime/common/RandomColorPickerTest.java index 5e399e22..511171c3 100644 --- a/src/test/java/de/doubleslash/keeptime/common/RandomColorPickerTest.java +++ b/src/test/java/de/doubleslash/keeptime/common/RandomColorPickerTest.java @@ -24,11 +24,9 @@ public void shouldGetRandomColor() throws ClassNotFoundException, IllegalAccessE @Test public void colorIsNotAlreadyUsedByProject() throws ClassNotFoundException, IllegalAccessException { - for (int i=0; i<1000; i++){ - String color = RandomColorPicker.getUniqueColorName("BLUE"); Assertions.assertNotEquals("BLUE", color); - } + } From dd7df1e795a6500b6c7a95f130ebd78e6a913293 Mon Sep 17 00:00:00 2001 From: ddamke Date: Thu, 10 Nov 2022 14:13:04 +0100 Subject: [PATCH 03/23] add unique and contrast color --- .../keeptime/common/RandomColorPicker.java | 62 ++++++++++++++----- .../view/ManageProjectController.java | 31 ++++++++-- .../resources/layouts/manage-project.fxml | 12 ++-- .../common/RandomColorPickerTest.java | 25 +++----- 4 files changed, 88 insertions(+), 42 deletions(-) diff --git a/src/main/java/de/doubleslash/keeptime/common/RandomColorPicker.java b/src/main/java/de/doubleslash/keeptime/common/RandomColorPicker.java index a6e20593..2557f558 100644 --- a/src/main/java/de/doubleslash/keeptime/common/RandomColorPicker.java +++ b/src/main/java/de/doubleslash/keeptime/common/RandomColorPicker.java @@ -2,44 +2,74 @@ +import de.doubleslash.keeptime.Main; +import de.doubleslash.keeptime.model.Project; +import de.doubleslash.keeptime.model.Settings; +import javafx.beans.property.ObjectProperty; +import javafx.collections.ObservableList; +import javafx.scene.paint.Color; +import org.apache.commons.lang.ObjectUtils; +import org.apache.commons.logging.Log; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import java.lang.reflect.Field; +import java.sql.Struct; import java.util.ArrayList; import java.util.List; public class RandomColorPicker { private static final Logger LOG = LoggerFactory.getLogger(RandomColorPicker.class); - public static String getRandomColorName() throws ClassNotFoundException, IllegalAccessException { - List colorNames = new RandomColorPicker().getRandomColorNameList(); - double v = Math.random() * (colorNames.size() - 0); - return colorNames.get((int) v); - } + public static Color getRandomColor() throws ClassNotFoundException, IllegalAccessException { - private List getRandomColorNameList() throws ClassNotFoundException, IllegalAccessException { - List colorNames = new ArrayList<>(); + List colors = new ArrayList<>(); Class clazz = Class.forName("javafx.scene.paint.Color"); if (clazz != null) { Field[] field = clazz.getFields(); for (int i = 0; i < field.length; i++) { Field f = field[i]; - Object colorObj = f.get(null); - colorNames.add(String.valueOf(f).split("Color.")[2]); + Object obj = f.get(null); + if(obj instanceof Color){ + colors.add((Color) obj); + } + } } - return colorNames; + double v = Math.random() * (colors.size() - 0); + return colors.get((int) v); } - public static String getUniqueColorName(String color) throws ClassNotFoundException, IllegalAccessException { + public static Color chooseContrastColor(Color backgroundColor, ObservableList availableProjects) throws ClassNotFoundException, IllegalAccessException { + Color divColor = getUniqueColor(availableProjects); + double divred = Math.abs(divColor.getRed()-backgroundColor.getRed()); + double divgreen = Math.abs(divColor.getGreen()-backgroundColor.getGreen()); + double divblue = Math.abs(divColor.getBlue()-backgroundColor.getBlue()); + + double divAdd = divblue+divgreen+divred; + + while (divAdd <0.6) { - List colorNames = new RandomColorPicker().getRandomColorNameList(); + divColor = getUniqueColor(availableProjects); + divred = Math.abs(divColor.getRed()-backgroundColor.getRed()); + divgreen = Math.abs(divColor.getGreen()-backgroundColor.getGreen()); + divblue = Math.abs(divColor.getBlue()- backgroundColor.getBlue()); + divAdd = divblue+divgreen+divred; - double v = Math.random() * (colorNames.size() - 0); - if(color.equals(colorNames.get((int) v))){ - return colorNames.get((int)v+5); } - return colorNames.get((int) v); + return divColor; + } + + public static Color getUniqueColor(ObservableList availableProjects) throws ClassNotFoundException, IllegalAccessException { + + Color color = getRandomColor(); + for(Project project : availableProjects){ + + while (project.getColor().toString().equals(color.toString())) { + color = getRandomColor(); + } + } + return color; } } diff --git a/src/main/java/de/doubleslash/keeptime/view/ManageProjectController.java b/src/main/java/de/doubleslash/keeptime/view/ManageProjectController.java index b0cd51c6..ba25caac 100644 --- a/src/main/java/de/doubleslash/keeptime/view/ManageProjectController.java +++ b/src/main/java/de/doubleslash/keeptime/view/ManageProjectController.java @@ -16,6 +16,11 @@ package de.doubleslash.keeptime.view; +import de.doubleslash.keeptime.common.RandomColorPicker; +import javafx.beans.property.ObjectProperty; +import javafx.collections.ObservableList; +import javafx.scene.control.*; +import javafx.scene.paint.Color; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -24,12 +29,7 @@ import de.doubleslash.keeptime.model.Model; import de.doubleslash.keeptime.model.Project; import javafx.fxml.FXML; -import javafx.scene.control.CheckBox; -import javafx.scene.control.ColorPicker; -import javafx.scene.control.Spinner; import javafx.scene.control.SpinnerValueFactory.IntegerSpinnerValueFactory; -import javafx.scene.control.TextArea; -import javafx.scene.control.TextField; import javafx.scene.layout.GridPane; @Component @@ -57,6 +57,9 @@ public class ManageProjectController { @FXML private Spinner sortIndexSpinner; + @FXML + private Button randomColorButton; + @Autowired public ManageProjectController(final Model model) { this.model = model; @@ -68,6 +71,23 @@ private void initialize() { sortIndexSpinner .setValueFactory(new IntegerSpinnerValueFactory(0, availableProjectAmount, availableProjectAmount)); sortIndexSpinner.getValueFactory().setValue(model.getAvailableProjects().size()); + randomColorButton.setOnAction(event -> randomColorEvent()); + } + + private void randomColorEvent() { + + try { + textFillColorPicker.setValue(RandomColorPicker.chooseContrastColor(model.defaultBackgroundColor.get(), model.getAvailableProjects())); + ObservableList projects = model.getAvailableProjects(); + for(Project project : projects){ + LOG.info(project.getColor().toString()); + } + + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } } public void initializeWith(final Project project) { @@ -84,4 +104,5 @@ public Project getProjectFromUserInput() { isWorkCheckBox.isSelected(), sortIndexSpinner.getValue()); } + } diff --git a/src/main/resources/layouts/manage-project.fxml b/src/main/resources/layouts/manage-project.fxml index b011b827..cb874698 100644 --- a/src/main/resources/layouts/manage-project.fxml +++ b/src/main/resources/layouts/manage-project.fxml @@ -1,6 +1,7 @@ + @@ -22,6 +23,7 @@ + @@ -29,12 +31,12 @@