From 4be9118350f08ae23bd2a4510959e06d964447e2 Mon Sep 17 00:00:00 2001 From: Robert Vokac Date: Sun, 11 Feb 2024 13:16:36 +0000 Subject: [PATCH] Added color smileys --- Readme.md | 57 ++++++++++ .../timecalc/app/TimeCalcConfiguration.java | 3 + .../utils/timecalc/app/TimeCalcManager.java | 24 ++-- .../timecalc/app/TimeCalcProperties.java | 6 + .../utils/timecalc/swing/common/Widget.java | 5 +- .../timecalc/swing/progress/Battery.java | 104 ++++++++++++------ .../swing/progress/ProgressCircle.java | 58 +++++++--- .../swing/progress/ProgressSmileyIcon.java | 35 ++++++ .../swing/progress/ProgressSquare.java | 87 ++++++++++----- .../utils/{ => common}/ProgressSmiley.java | 4 +- .../utils/timecalc/utils/common/Utils.java | 2 + .../src/main/resources/smileys/SMILEY_1.png | Bin 0 -> 1775 bytes .../src/main/resources/smileys/SMILEY_10.png | Bin 0 -> 1370 bytes .../src/main/resources/smileys/SMILEY_11.png | Bin 0 -> 1636 bytes .../src/main/resources/smileys/SMILEY_12.png | Bin 0 -> 1483 bytes .../src/main/resources/smileys/SMILEY_13.png | Bin 0 -> 1728 bytes .../src/main/resources/smileys/SMILEY_14.png | Bin 0 -> 1591 bytes .../src/main/resources/smileys/SMILEY_15.png | Bin 0 -> 1700 bytes .../src/main/resources/smileys/SMILEY_16.png | Bin 0 -> 1614 bytes .../src/main/resources/smileys/SMILEY_2.png | Bin 0 -> 1555 bytes .../src/main/resources/smileys/SMILEY_3.png | Bin 0 -> 1506 bytes .../src/main/resources/smileys/SMILEY_4.png | Bin 0 -> 1672 bytes .../src/main/resources/smileys/SMILEY_5.png | Bin 0 -> 1707 bytes .../src/main/resources/smileys/SMILEY_6.png | Bin 0 -> 1571 bytes .../src/main/resources/smileys/SMILEY_7.png | Bin 0 -> 1851 bytes .../src/main/resources/smileys/SMILEY_8.png | Bin 0 -> 1879 bytes .../src/main/resources/smileys/SMILEY_9.png | Bin 0 -> 1859 bytes timecalc.conf | 3 +- 28 files changed, 296 insertions(+), 92 deletions(-) create mode 100644 modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/progress/ProgressSmileyIcon.java rename modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/{ => common}/ProgressSmiley.java (96%) create mode 100644 modules/time-calc-app/src/main/resources/smileys/SMILEY_1.png create mode 100644 modules/time-calc-app/src/main/resources/smileys/SMILEY_10.png create mode 100644 modules/time-calc-app/src/main/resources/smileys/SMILEY_11.png create mode 100644 modules/time-calc-app/src/main/resources/smileys/SMILEY_12.png create mode 100644 modules/time-calc-app/src/main/resources/smileys/SMILEY_13.png create mode 100644 modules/time-calc-app/src/main/resources/smileys/SMILEY_14.png create mode 100644 modules/time-calc-app/src/main/resources/smileys/SMILEY_15.png create mode 100644 modules/time-calc-app/src/main/resources/smileys/SMILEY_16.png create mode 100644 modules/time-calc-app/src/main/resources/smileys/SMILEY_2.png create mode 100644 modules/time-calc-app/src/main/resources/smileys/SMILEY_3.png create mode 100644 modules/time-calc-app/src/main/resources/smileys/SMILEY_4.png create mode 100644 modules/time-calc-app/src/main/resources/smileys/SMILEY_5.png create mode 100644 modules/time-calc-app/src/main/resources/smileys/SMILEY_6.png create mode 100644 modules/time-calc-app/src/main/resources/smileys/SMILEY_7.png create mode 100644 modules/time-calc-app/src/main/resources/smileys/SMILEY_8.png create mode 100644 modules/time-calc-app/src/main/resources/smileys/SMILEY_9.png diff --git a/Readme.md b/Readme.md index f4451cd..be41e7d 100644 --- a/Readme.md +++ b/Readme.md @@ -43,6 +43,63 @@ If file overtime.txt does not exist, then the default overtime is 0:00. ### test.txt If file test.txt exists, then user is not asked for start time and overtime. Instead, the values in files starttime.txt and overtime.txt are used. +## Features + +### 3 Visibility modes + + * STRONGLY_COLORED - many colors + * WEAKLY_COLORED - darkened colors + * GRAY - gray colors + * NONE - widgets are hidden + +### Widgets + +#### Analog Clock + + * hour hand + * minute hand (can be disabled in configuration) + * second hand (can be disabled in configuration) + * millisecond hand (can be disabled in configuration) + * shows current year, month, day of month and day of week, if analog clock is hovered by mouse cursor and Visibility is STRONGLY_COLORED + * shows yellow highlighted remaining time until end of today working hours, if analog clock is hovered by mouse cursor and Visibility is STRONGLY_COLORED + * hands can be long or shorter (can be set in configuration) + +#### Progress Square + * Show graphically day progress + +#### Progress Circle + + * Show graphically day progress + +#### Hour Battery + +#### Day Battery + +#### Week Battery + +#### Month Battery + +### Smileys + +Progress in square, circle or batteries is represented also by smileys (only, if the widget is hovered by mouse cursor): + +* ? ... face screaming in fear ... less than 6.25% +* ? ... pouting face ... less than 12.5% +* ? ... angry face ... less than 18.75% +* ? ... loudly crying face ... less than 25% +* ? ... crying face ... less than 31.25% +* ? ... disappointed face ... less than 37.5% +* ? ... tired face ... less than 43.75% +* ? ... fearful face ... less than 50% +* ? ... astonished face ... less than 56.25% +* ? ... frowning face with open mouth ... less than 62.5% +* ? ... smiling face with smiling eyes ... less than 68.75% +* ? ... smiling face with open mouth ... less than 75% +* ? ... grinning face with smiling eyes ... less than 81.25% +* ? ... smiling face with sunglasses ... less than 87.5% +* ? ... smiling face with heart-shaped eyes ... less than 93.75% +* ? ... smiling face with horns ... more or equal to 93.75% + ## Key shortcuts ## Command button diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/app/TimeCalcConfiguration.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/app/TimeCalcConfiguration.java index ce9cb24..da149a5 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/app/TimeCalcConfiguration.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/app/TimeCalcConfiguration.java @@ -32,6 +32,8 @@ public class TimeCalcConfiguration { new BooleanProperty("commandsEnabledProperty", true); public final BooleanProperty toastsEnabledProperty = new BooleanProperty("toastsEnabledProperty", true); + public final BooleanProperty smileysColoredProperty = + new BooleanProperty("smileysColoredProperty", true); public TimeCalcConfiguration() { @@ -56,6 +58,7 @@ public class TimeCalcConfiguration { commandsEnabledProperty .setValue(timeCalcProperties.areCommandsEnabled()); toastsEnabledProperty.setValue(timeCalcProperties.areToastsEnabled()); + smileysColoredProperty.setValue(timeCalcProperties.areSmileysColored()); } } diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/app/TimeCalcManager.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/app/TimeCalcManager.java index cade6cf..5892c21 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/app/TimeCalcManager.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/app/TimeCalcManager.java @@ -8,6 +8,7 @@ import org.nanoboot.utils.timecalc.swing.common.TimeCalcButton; import org.nanoboot.utils.timecalc.swing.common.TimeCalcWindow; import org.nanoboot.utils.timecalc.swing.common.Toaster; import org.nanoboot.utils.timecalc.swing.common.WeatherWindow; +import org.nanoboot.utils.timecalc.swing.common.Widget; import org.nanoboot.utils.timecalc.swing.progress.AnalogClock; import org.nanoboot.utils.timecalc.swing.progress.Battery; import org.nanoboot.utils.timecalc.swing.progress.DayBattery; @@ -114,6 +115,7 @@ public class TimeCalcManager { .setBounds(SwingUtils.MARGIN, walkingHumanProgressAsciiArt.getY() + walkingHumanProgressAsciiArt.getHeight() + SwingUtils.MARGIN); + configButton.setBoundsFromTop(walkingHumanProgressAsciiArt); commandButton.setBoundsFromLeft(configButton); @@ -160,17 +162,17 @@ public class TimeCalcManager { Time time = new Time(); - bindToIfPropertyMissing(testProperties, "current.day", calNow, Calendar.DAY_OF_MONTH, analogClock.dayProperty, time.dayProperty); - bindToIfPropertyMissing(testProperties, "current.month", calNow, Calendar.MONTH, analogClock.monthProperty, time.monthProperty); - bindToIfPropertyMissing(testProperties, "current.year", calNow, Calendar.YEAR, analogClock.yearProperty, time.yearProperty); - bindToIfPropertyMissing(testProperties, "current.hour", calNow, Calendar.HOUR, analogClock.hourProperty, time.hourProperty); - bindToIfPropertyMissing(testProperties, "current.minute", calNow, Calendar.MINUTE, analogClock.minuteProperty, time.minuteProperty); - bindToIfPropertyMissing(testProperties, "current.second", calNow, Calendar.SECOND, analogClock.secondProperty, time.secondProperty); - bindToIfPropertyMissing(testProperties, "current.millisecond", calNow, Calendar.MILLISECOND, analogClock.millisecondProperty, time.millisecondProperty); + bindToIfPropertyMissing(testProperties, "test.current.day", calNow, Calendar.DAY_OF_MONTH, analogClock.dayProperty, time.dayProperty); + bindToIfPropertyMissing(testProperties, "test.current.month", calNow, Calendar.MONTH, analogClock.monthProperty, time.monthProperty); + bindToIfPropertyMissing(testProperties, "test.current.year", calNow, Calendar.YEAR, analogClock.yearProperty, time.yearProperty); + bindToIfPropertyMissing(testProperties, "test.current.hour", calNow, Calendar.HOUR, analogClock.hourProperty, time.hourProperty); + bindToIfPropertyMissing(testProperties, "test.current.minute", calNow, Calendar.MINUTE, analogClock.minuteProperty, time.minuteProperty); + bindToIfPropertyMissing(testProperties, "test.current.second", calNow, Calendar.SECOND, analogClock.secondProperty, time.secondProperty); + bindToIfPropertyMissing(testProperties, "test.current.millisecond", calNow, Calendar.MILLISECOND, analogClock.millisecondProperty, time.millisecondProperty); - if (testProperties.containsKey("current.year") || testProperties - .containsKey("current.month") || testProperties - .containsKey("current.day")) { + if (testProperties.containsKey("test.current.year") || testProperties + .containsKey("test.current.month") || testProperties + .containsKey("test.current.day")) { analogClock.dayOfWeekProperty .setValue(calNow.get(Calendar.DAY_OF_WEEK)); } else { @@ -259,6 +261,8 @@ public class TimeCalcManager { componentRegistry.getSet().stream().filter(c-> c instanceof Battery).forEach(c -> ((Battery)c).wavesProperty.bindTo(timeCalcConfiguration.batteryWavesEnabledProperty)); + componentRegistry.getSet().stream().filter(c-> c instanceof Widget).forEach(c -> + ((Widget)c).smileysColoredProperty.bindTo(timeCalcConfiguration.smileysColoredProperty)); window.setSize(dayBattery.getX() + dayBattery.getWidth() + 3 * SwingUtils.MARGIN, exitButton.getY() + 3 * exitButton.getHeight() + SwingUtils.MARGIN); while (true) { diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/app/TimeCalcProperties.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/app/TimeCalcProperties.java index 6b747e8..7387dc7 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/app/TimeCalcProperties.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/app/TimeCalcProperties.java @@ -26,6 +26,8 @@ public class TimeCalcProperties { private static final String JOKES_ENABLED = "jokes.enabled"; private static final String COMMANDS_ENABLED = "commands-enabled"; private static final String TOASTS_ENABLED = "toasts.enabled"; + private static final String SMILEYS_COLORED = "smileys.colored"; + private static TimeCalcProperties INSTANCE; private final Properties properties = new Properties(); @@ -98,6 +100,10 @@ public class TimeCalcProperties { return getBooleanProperty(TOASTS_ENABLED, true); } + public boolean areSmileysColored() { + return getBooleanProperty(SMILEYS_COLORED, true); + } + public Visibility getDefaultVisibility() { if (!properties.containsKey(DEFAULT_VISIBILITY)) { return Visibility.STRONGLY_COLORED; diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/Widget.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/Widget.java index cf73cc9..592a9c6 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/Widget.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/Widget.java @@ -2,6 +2,7 @@ package org.nanoboot.utils.timecalc.swing.common; import org.nanoboot.utils.timecalc.app.GetProperty; import org.nanoboot.utils.timecalc.entity.Visibility; +import org.nanoboot.utils.timecalc.utils.property.BooleanProperty; import org.nanoboot.utils.timecalc.utils.property.Property; import org.nanoboot.utils.timecalc.utils.property.StringProperty; @@ -23,10 +24,12 @@ public class Widget extends JPanel implements protected static final Color FOREGROUND_COLOR2 = new Color(210, 210, 210); protected static final Color BACKGROUND_COLOR = new Color(238, 238, 238); protected static final Font BIG_FONT = new Font("sans", Font.BOLD, 24); - protected static final Font MEDIUM_FONT = new Font("sans", Font.PLAIN, 16); + protected static final Font MEDIUM_FONT = new Font("sans", Font.BOLD, 16); public StringProperty visibilityProperty = new StringProperty("widget.visibilityProperty", Visibility.STRONGLY_COLORED.name()); + public final BooleanProperty smileysColoredProperty = + new BooleanProperty("smileysColoredProperty", true); protected int side = 0; protected double donePercent = 0; protected boolean mouseOver = false; diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/progress/Battery.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/progress/Battery.java index e9f59d0..af63388 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/progress/Battery.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/progress/Battery.java @@ -4,11 +4,13 @@ import lombok.Getter; import org.nanoboot.utils.timecalc.app.TimeCalcProperties; import org.nanoboot.utils.timecalc.entity.Visibility; import org.nanoboot.utils.timecalc.swing.common.Widget; -import org.nanoboot.utils.timecalc.utils.ProgressSmiley; +import org.nanoboot.utils.timecalc.utils.common.ProgressSmiley; import org.nanoboot.utils.timecalc.utils.common.NumberFormats; import org.nanoboot.utils.timecalc.utils.common.Utils; import org.nanoboot.utils.timecalc.utils.property.BooleanProperty; +import javax.swing.ImageIcon; +import javax.swing.JLabel; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; @@ -44,6 +46,7 @@ public class Battery extends Widget { private int totalHeight = 0; private int totalWidth; private String label = null; + private JLabel smileyIcon; protected Battery(String name) { this.name = name; @@ -73,22 +76,22 @@ public class Battery extends Widget { blinking.setValue(false); } - Graphics2D g2d = (Graphics2D) g; + Graphics2D brush = (Graphics2D) g; Visibility visibility = Visibility.valueOf(visibilityProperty.getValue()); - g2d.setColor( + brush.setColor( visibility.isStronglyColored() || mouseOver ? Color.YELLOW : FOREGROUND_COLOR); - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + brush.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); if (!visibility.isGray()) { - g2d.fillRect(1, 1, totalWidth, totalHeight); + brush.fillRect(1, 1, totalWidth, totalHeight); } if (visibility.isStronglyColored() || mouseOver) { - g2d.setColor( + brush.setColor( donePercent < LOW_ENERGY ? LOW_HIGHLIGHTED : (donePercent < HIGH_ENERGY ? MEDIUM_HIGHLIGHTED : @@ -96,16 +99,16 @@ public class Battery extends Widget { HIGH_HIGHLIGHTED : HIGHEST_HIGHLIGHTED))); } else { - g2d.setColor(donePercent < LOW_ENERGY ? LOW : + brush.setColor(donePercent < LOW_ENERGY ? LOW : (donePercent < HIGH_ENERGY ? MEDIUM : (donePercent < VERY_HIGH_ENERGY ? HIGH : HIGHEST))); } if (visibility.isGray()) { - g2d.setColor(Utils.ULTRA_LIGHT_GRAY); + brush.setColor(Utils.ULTRA_LIGHT_GRAY); } if (blinking.getValue()) { - g2d.setColor(BACKGROUND_COLOR); + brush.setColor(BACKGROUND_COLOR); } int doneHeight = (int) (totalHeight * donePercent); int intX = 1; @@ -119,7 +122,7 @@ public class Battery extends Widget { waterSurfaceHeight = 0; } - g2d.fillRect(intX + 1, + brush.fillRect(intX + 1, doneHeight < waterSurfaceHeight || donePercent >= 1 ? todoHeight : todoHeight + waterSurfaceHeight, totalWidth - 3, @@ -130,7 +133,7 @@ public class Battery extends Widget { && donePercent < 1) {// && todoHeight > waterSurfaceHeight) { //g2d.fillArc(intX, intY, width_, intHeight - waterSurfaceHeight, 30, 60); - g2d.fillPolygon( + brush.fillPolygon( new int[] {intX, (int) (intX + totalWidth / pointCount * 0.5), intX + totalWidth / pointCount * 3, @@ -155,13 +158,13 @@ public class Battery extends Widget { todoHeight + (waterSurfaceHeight * 1)}, pointCount); - g2d.setColor( + brush.setColor( (visibility.isGray() || !visibility.isStronglyColored()) && !mouseOver ? Utils.ULTRA_LIGHT_GRAY : Color.DARK_GRAY); - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + brush.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); - g2d.drawPolyline( + brush.drawPolyline( new int[] {intX, (int) (intX + totalWidth / pointCount * 0.5), intX + totalWidth / pointCount * 3, @@ -185,81 +188,110 @@ public class Battery extends Widget { 5, true)), todoHeight + (waterSurfaceHeight * 1)}, pointCount); - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + brush.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); } - g2d.setColor(visibility.isStronglyColored() || mouseOver ? Color.BLACK : + brush.setColor(visibility.isStronglyColored() || mouseOver ? Color.BLACK : Color.LIGHT_GRAY); if (donePercent < 1 && donePercent > 0) { { - Font currentFont = g2d.getFont(); - g2d.setFont(BIG_FONT); - g2d.drawString( + Font currentFont = brush.getFont(); + brush.setFont(BIG_FONT); + brush.drawString( CHARCHING, ((int) (totalWidth * 0.45)), (donePercent < 0.5 ? totalHeight / 4 * 3 : totalHeight / 4 * 1) + 10 ); - if(mouseOver){ + if(mouseOver && smileysColoredProperty.isDisabled()){//no colored + //paint smiley if(!visibility.isStronglyColored()) { - g2d.setColor(Color.GRAY); + brush.setColor(Color.GRAY); } if(visibility.isGray()) { - g2d.setColor(Color.LIGHT_GRAY); + brush.setColor(Color.LIGHT_GRAY); } - g2d.setFont(MEDIUM_FONT); - g2d.drawString( + if(visibility.isStronglyColored()) { + brush.setColor(Color.BLACK); + } + + Color currentColor= brush.getColor(); + brush.setColor(visibility.isStronglyColored() ? Color.WHITE : BACKGROUND_COLOR); + brush.fillRect( + ((int) (totalWidth * 0.45)) + 15, + (donePercent < 0.5 ? totalHeight / 4 * 3 : totalHeight / 4 * 1) + 8 - 16, + 20, + 20 + ); + brush.setColor(currentColor); + brush.setColor(Color.BLACK); + brush.setFont(MEDIUM_FONT); + brush.drawString( ProgressSmiley.forProgress(donePercent).getCharacter(), ((int) (totalWidth * 0.45)) + 15, (donePercent < 0.5 ? totalHeight / 4 * 3 : totalHeight / 4 * 1) + 8 ); } - g2d.setFont(currentFont); + brush.setFont(currentFont); + } + if(mouseOver && smileysColoredProperty.isEnabled()) {//colored + ImageIcon imageIcon = ProgressSmileyIcon.forSmiley(ProgressSmiley.forProgress(donePercent)).getIcon(); + if(this.smileyIcon != null) { + this.remove(smileyIcon); + } + this.smileyIcon = new JLabel(imageIcon); + smileyIcon.setBounds(((int) (totalWidth * 0.45)) + 15, + (donePercent < 0.5 ? totalHeight / 4 * 3 : totalHeight / 4 * 1) - 7,15, 15); + this.add(smileyIcon); + } else { + if(this.smileyIcon != null) { + this.remove(smileyIcon); + } } { - Color currentColor = g2d.getColor(); - g2d.setColor( + Color currentColor = brush.getColor(); + brush.setColor( visibility.isStronglyColored() || mouseOver ? HIGH_HIGHLIGHTED : (visibility.isWeaklyColored() ? HIGH : Color.lightGray)); double angleDouble = donePercent * 360; - g2d.fillArc(((int) (totalWidth * 0.45)) + 15, + brush.fillArc(((int) (totalWidth * 0.45)) + 15, totalHeight / 4 * 3 + 28, 15, 15, 90, -(int) angleDouble); - g2d.setColor( + brush.setColor( visibility.isStronglyColored() || mouseOver ? LIGHT_RED : visibility.isWeaklyColored() ? ULTRA_LIGHT_RED : BACKGROUND_COLOR); - g2d.fillArc(((int) (totalWidth * 0.45)) + 15, + brush.fillArc(((int) (totalWidth * 0.45)) + 15, totalHeight / 4 * 3 + 28, 15, 15, 90, +(int) (360 - angleDouble)); - g2d.setColor(currentColor); + brush.setColor(currentColor); } } - g2d.drawString( + brush.drawString( NumberFormats.FORMATTER_THREE_DECIMAL_PLACES .format(donePercent * 100) + "%", ((int) (totalWidth * 0.15)), donePercent > 0.5 ? totalHeight / 4 * 3 : totalHeight / 4 * 1); if (label != null && !label.isEmpty()) { - g2d.drawString( + brush.drawString( label, ((int) (totalWidth * 0.15)), (donePercent > 0.5 ? totalHeight / 4 * 3 : totalHeight / 4 * 1) + 20); } if (name != null && !name.isEmpty()) { - g2d.drawString( + brush.drawString( name, ((int) (totalWidth * 0.10)), (totalHeight / 4 * 3) + 20 + 20); } - g2d.setColor(visibility.isStronglyColored() || mouseOver ? Color.BLACK : + brush.setColor(visibility.isStronglyColored() || mouseOver ? Color.BLACK : Color.LIGHT_GRAY); - g2d.drawRect(1, 1, totalWidth - 2, totalHeight); + brush.drawRect(1, 1, totalWidth - 2, totalHeight); } diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/progress/ProgressCircle.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/progress/ProgressCircle.java index 56c3796..9ebbac5 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/progress/ProgressCircle.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/progress/ProgressCircle.java @@ -2,9 +2,11 @@ package org.nanoboot.utils.timecalc.swing.progress; import org.nanoboot.utils.timecalc.entity.Visibility; import org.nanoboot.utils.timecalc.swing.common.Widget; -import org.nanoboot.utils.timecalc.utils.ProgressSmiley; +import org.nanoboot.utils.timecalc.utils.common.ProgressSmiley; import org.nanoboot.utils.timecalc.utils.common.NumberFormats; +import javax.swing.ImageIcon; +import javax.swing.JLabel; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; @@ -13,6 +15,8 @@ import java.awt.RenderingHints; public class ProgressCircle extends Widget { + private JLabel smileyIcon; + public ProgressCircle() { setPreferredSize(new Dimension(200, 200)); } @@ -24,44 +28,70 @@ public class ProgressCircle extends Widget { } Visibility visibility = Visibility.valueOf(visibilityProperty.getValue()); - Graphics2D g2d = (Graphics2D) g; - g2d.setColor( + Graphics2D brush = (Graphics2D) g; + brush.setColor( visibility.isStronglyColored() || mouseOver ? Color.darkGray : FOREGROUND_COLOR); - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + brush.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); double angleDouble = donePercent * 360; double angleDouble2 = (angleDouble - (int) (angleDouble)) * 360; // System.out.println("remainingAngle=" + angleDouble2); - g2d.fillArc(0, 0, side, side, 90, -(int) angleDouble); + brush.fillArc(0, 0, side, side, 90, -(int) angleDouble); int side2 = side / 2; - g2d.setColor(visibility.isStronglyColored() || mouseOver ? + brush.setColor(visibility.isStronglyColored() || mouseOver ? new Color(105, 175, 236) : FOREGROUND_COLOR2); - g2d.fillArc(0 + (side2 / 2), 0 + (side2 / 2), side2, side2, 90, + brush.fillArc(0 + (side2 / 2), 0 + (side2 / 2), side2, side2, 90, -(int) angleDouble2); - g2d.setColor(visibility.isStronglyColored() || mouseOver ? Color.blue : + brush.setColor(visibility.isStronglyColored() || mouseOver ? Color.blue : FOREGROUND_COLOR); - g2d.drawString( + brush.drawString( NumberFormats.FORMATTER_ZERO_DECIMAL_PLACES .format(donePercent * 100) + "%", (int) (side / 8d * 0d), (int) (side / 8d * 7.5d)); - if(mouseOver){ + if(mouseOver && smileysColoredProperty.isDisabled()){//no colored if(!visibility.isStronglyColored()) { - g2d.setColor(Color.GRAY); + brush.setColor(Color.GRAY); } if(visibility.isGray()) { - g2d.setColor(Color.LIGHT_GRAY); + brush.setColor(Color.LIGHT_GRAY); } - g2d.setFont(MEDIUM_FONT); - g2d.drawString( + if(visibility.isStronglyColored()) { + brush.setColor(Color.BLACK); + } + Color currentColor= brush.getColor(); + brush.setColor(visibility.isStronglyColored() ? Color.WHITE : BACKGROUND_COLOR); + brush.fillRect( + (int) (side / 8d * 0d) + 30, + (int) (side / 8d * 7.5d - 16d), + 20, + 20 + ); + brush.setColor(currentColor); + brush.setFont(MEDIUM_FONT); + brush.drawString( ProgressSmiley.forProgress(donePercent).getCharacter(), (int) (side / 8d * 0d) + 30, (int) (side / 8d * 7.5d) ); } + if(mouseOver && smileysColoredProperty.isEnabled()) {//colored + ImageIcon imageIcon = ProgressSmileyIcon.forSmiley(ProgressSmiley.forProgress(donePercent)).getIcon(); + if(this.smileyIcon != null) { + this.remove(smileyIcon); + } + this.smileyIcon = new JLabel(imageIcon); + smileyIcon.setBounds((int) (side / 8d * 0d) + 30, + (int) (side / 8d * 7.5d) - 15,15, 15); + this.add(smileyIcon); + } else { + if(this.smileyIcon != null) { + this.remove(smileyIcon); + } + } } } \ No newline at end of file diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/progress/ProgressSmileyIcon.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/progress/ProgressSmileyIcon.java new file mode 100644 index 0000000..2b2284b --- /dev/null +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/progress/ProgressSmileyIcon.java @@ -0,0 +1,35 @@ +package org.nanoboot.utils.timecalc.swing.progress; + +import lombok.Getter; +import org.nanoboot.utils.timecalc.utils.common.ProgressSmiley; + +import javax.swing.ImageIcon; +import java.awt.Image; +import java.util.HashMap; +import java.util.Map; + +/** + * @author Robert + * @since 27.02.2024 + */ +public class ProgressSmileyIcon extends javax.swing.ImageIcon{ + + private static final Map cache = new HashMap<>(); + @Getter + private final ProgressSmiley progressSmiley; + @Getter + private final ImageIcon icon; + public static ProgressSmileyIcon forSmiley(ProgressSmiley progressSmiley) { + if(!cache.containsKey(progressSmiley)) { + cache.put(progressSmiley, new ProgressSmileyIcon(progressSmiley)); + } + return cache.get(progressSmiley); + } + private ProgressSmileyIcon(ProgressSmiley progressSmiley) { + this.progressSmiley = progressSmiley; + java.net.URL smileyUrl = getClass().getResource("/smileys/" + progressSmiley.name() + ".png"); + ImageIcon tmpIcon = new javax.swing.ImageIcon(smileyUrl); + this.icon = new ImageIcon(tmpIcon.getImage().getScaledInstance(15,15, Image.SCALE_SMOOTH)); + } + +} diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/progress/ProgressSquare.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/progress/ProgressSquare.java index 9d819b6..c53fc9d 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/progress/ProgressSquare.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/progress/ProgressSquare.java @@ -2,9 +2,11 @@ package org.nanoboot.utils.timecalc.swing.progress; import org.nanoboot.utils.timecalc.entity.Visibility; import org.nanoboot.utils.timecalc.swing.common.Widget; -import org.nanoboot.utils.timecalc.utils.ProgressSmiley; +import org.nanoboot.utils.timecalc.utils.common.ProgressSmiley; import org.nanoboot.utils.timecalc.utils.common.NumberFormats; +import javax.swing.ImageIcon; +import javax.swing.JLabel; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; @@ -14,6 +16,7 @@ import java.awt.RenderingHints; public class ProgressSquare extends Widget { private int square; + private JLabel smileyIcon; public ProgressSquare() { setPreferredSize(new Dimension(400, 400)); @@ -26,9 +29,9 @@ public class ProgressSquare extends Widget { this.square = side * side; } - Graphics2D g2d = (Graphics2D) g; - g2d.setColor(FOREGROUND_COLOR); - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + Graphics2D brush = (Graphics2D) g; + brush.setColor(FOREGROUND_COLOR); + brush.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); int dotNumber = (int) (donePercent * square); @@ -42,60 +45,86 @@ public class ProgressSquare extends Widget { Visibility visibility = Visibility.ofProperty(visibilityProperty); if (y > 1) { if (visibility.isStronglyColored() || mouseOver) { - g2d.setColor(Color.GRAY); + brush.setColor(Color.GRAY); } - g2d.fillRect(side - 4, side - 4, 4, 4); - g2d.fillRect(1, side - 4, 4, 4); + brush.fillRect(side - 4, side - 4, 4, 4); + brush.fillRect(1, side - 4, 4, 4); - g2d.setColor(FOREGROUND_COLOR); - g2d.fillRect(1, 1, side, y - 1); + brush.setColor(FOREGROUND_COLOR); + brush.fillRect(1, 1, side, y - 1); if (x > 1) { if (visibility.isStronglyColored() || mouseOver) { - g2d.setColor(Color.GRAY); + brush.setColor(Color.GRAY); } - g2d.drawRect(1, y, x - 1, 1); + brush.drawRect(1, y, x - 1, 1); } if (visibility.isStronglyColored() || mouseOver) { - g2d.setColor(Color.GRAY); + brush.setColor(Color.GRAY); } - g2d.fillRect(side - 4, 1, 4, 4); - g2d.fillRect(1, 1, 4, 4); + brush.fillRect(side - 4, 1, 4, 4); + brush.fillRect(1, 1, 4, 4); if (visibility.isStronglyColored() || mouseOver) { - g2d.setColor(Color.GRAY); + brush.setColor(Color.GRAY); } - g2d.drawLine(1, 1, x, y); + brush.drawLine(1, 1, x, y); // g2d.drawLine(1+1, 1+1, x+1, y+1); - g2d.drawLine(1, 1 + 1, x, y + 1); - g2d.drawLine(1, 1 + 1, x, y + 1); + brush.drawLine(1, 1 + 1, x, y + 1); + brush.drawLine(1, 1 + 1, x, y + 1); if (visibility.isStronglyColored() || mouseOver) { - g2d.setColor(Color.BLUE); - g2d.drawLine(x - 10, y - 10, x + 10, y + 10); - g2d.drawLine(x + 10, y - 10, x - 10, y + 10); + brush.setColor(Color.BLUE); + brush.drawLine(x - 10, y - 10, x + 10, y + 10); + brush.drawLine(x + 10, y - 10, x - 10, y + 10); } - g2d.setColor(FOREGROUND_COLOR); + brush.setColor(FOREGROUND_COLOR); } - g2d.setColor(visibility.isStronglyColored() || mouseOver ? Color.BLACK : + brush.setColor(visibility.isStronglyColored() || mouseOver ? Color.BLACK : BACKGROUND_COLOR); - g2d.drawString(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES + brush.drawString(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES .format(donePercent * 100) + "%", (int) (side / 8d * 3d), (int) (side / 8d * (donePercent > 0.5 ? 3d : 5d))); - if(mouseOver){ + if(mouseOver && smileysColoredProperty.isDisabled()){//no colored if(!visibility.isStronglyColored()) { - g2d.setColor(Color.GRAY); + brush.setColor(Color.GRAY); } if(visibility.isGray()) { - g2d.setColor(Color.LIGHT_GRAY); + brush.setColor(Color.LIGHT_GRAY); } - g2d.setFont(MEDIUM_FONT); - g2d.drawString( + if(visibility.isStronglyColored()) { + brush.setColor(Color.BLACK); + } + Color currentColor= brush.getColor(); + brush.setColor(visibility.isStronglyColored() ? Color.WHITE : BACKGROUND_COLOR); + brush.fillRect( + (int) (side / 8d * 3d) + 65, + (int) ((side / 8d * (donePercent > 0.5 ? 3d : 5d)) - 16d), + 20, + 20 + ); + brush.setColor(currentColor); + brush.setFont(MEDIUM_FONT); + brush.drawString( ProgressSmiley.forProgress(donePercent).getCharacter(), (int) (side / 8d * 3d) + 65, (int) (side / 8d * (donePercent > 0.5 ? 3d : 5d)) ); } + if(mouseOver && smileysColoredProperty.isEnabled()) {//colored + ImageIcon imageIcon = ProgressSmileyIcon.forSmiley(ProgressSmiley.forProgress(donePercent)).getIcon(); + if(this.smileyIcon != null) { + this.remove(smileyIcon); + } + this.smileyIcon = new JLabel(imageIcon); + smileyIcon.setBounds((int) (side / 8d * 3d) + 65, + (int) (side / 8d * (donePercent > 0.5 ? 3d : 5d)) - 15,15, 15); + this.add(smileyIcon); + } else { + if(this.smileyIcon != null) { + this.remove(smileyIcon); + } + } } diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/ProgressSmiley.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/common/ProgressSmiley.java similarity index 96% rename from modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/ProgressSmiley.java rename to modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/common/ProgressSmiley.java index a6f3ae8..d30eb19 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/ProgressSmiley.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/common/ProgressSmiley.java @@ -1,8 +1,10 @@ -package org.nanoboot.utils.timecalc.utils; +package org.nanoboot.utils.timecalc.utils.common; import lombok.Getter; import org.nanoboot.utils.timecalc.app.TimeCalcException; +import java.util.Arrays; + /** * @author Robert * @since 26.02.2024 diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/common/Utils.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/common/Utils.java index d6b97db..d6e5ced 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/common/Utils.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/common/Utils.java @@ -4,6 +4,8 @@ import org.nanoboot.utils.timecalc.app.Main; import org.nanoboot.utils.timecalc.utils.property.BooleanProperty; import java.awt.Color; +import java.awt.Font; +import java.awt.FontFormatException; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; diff --git a/modules/time-calc-app/src/main/resources/smileys/SMILEY_1.png b/modules/time-calc-app/src/main/resources/smileys/SMILEY_1.png new file mode 100644 index 0000000000000000000000000000000000000000..64c8b8e6d6338c2d258a7639e69bb79986ba70e4 GIT binary patch literal 1775 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!Tyed}h0e}S_^N|2FY`4dEq@uB2%Ti{ zIL5wiH2!i7S5AJ3p`I=T2M6QGkt4{+$dD}DJm&QL`SVz_W(|gihmn$*hm6fT;iC$W zwEv95Hj2ux51{JXPsz%iC@U*NZf>rm6&dHWt*s47NlCCd9wMi>3~{N;B+b9)PHR2N zi?Ycl7{ck(r?GVDQc3fOQyQ6iy&fGM9mw5#6uNnfnZf^|_ht(|+qw*XK1wt;HX<@I zlF7%MZrr#LrKP1<^hzO?Z+@RC8*cWYw)HN&cmV+Uk*)Mq$`Nk6fjIdUB=J8Zoj;0X zz5+Al)rb;W;p4^LpP^Fna7sB#35}VBXnh*m+uK<>%9ToGab;yC-rAOdWWO4iykg*eqr! z6f$Wv9-f!MJ~|?efa$|+*x~gFG+Yr)_`}KAcq5*>2f?b_dZVST#Jzr0g2CgA@zBZZ|!CrJbDKwF7#u0>NLEb z6^2E6HH<@7@m0ZMka$6AsyAY^N;aRjV1$kJ+{luXlZD#aT3p*N3ap$8$qSRj!32K) z(}cy_nqV1q2MKj@?4x+Be?cQj#?#i+3Y)Q)^;hlz21ixkTq~6tu~1FI*1hfH98zeI zZr;3G_ZytmkDUCYlQW|uq2@`Gxh${TyLe=(CFdYT*uC0=+qF_}JO>J6pp?#Dr`-;v zFh1buDrv1)w{D&IO{p*^Cxv4+|ne@WPBjr$jn#FBb$tm3gw3Wivl#SbwBxy9GgzYVQj7TmaP#l1ms zIRPZVH>9)f7^fRSZXJNZU|@Mlk2eO#)BdBO~r&K9Pcg0%$ZE{0#$+_(%^l R{OSMz002ovPDHLkV1mC`Ji!0} literal 0 HcmV?d00001 diff --git a/modules/time-calc-app/src/main/resources/smileys/SMILEY_10.png b/modules/time-calc-app/src/main/resources/smileys/SMILEY_10.png new file mode 100644 index 0000000000000000000000000000000000000000..015eff9f719213aed4a983b674297e6abba760ad GIT binary patch literal 1370 zcmV-g1*Q6lP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!T;?1U4ezgluz)8{>yd6wNg52N-^ofQuq3iispcGU7;P&@sp$x)>uY z691S40s*#!L^2JT15#iN#yT|}0~t^PRG=$Rp!9j~?JLmI$B&Fp)1JP2Pv3d>+;h)4 zmGA^?0fWJS;o)Hn4GqD^#|Hrc0kE~T6=pZbhDOzDHEL>V(A3m~-rime3=Cj#aZ#8B zY;0`c@9&S$&``w2#v&mh0e*gd!mJ3?s5PdhrueL^EZ))4kv!PJ8YJ9$V2dHX=yz1hH$5~SY2szb2AbX6EQwM4m(>3(ogO}+Hr3j z-7keiA`!IA=}~HN?YD9KP&0yAodGT`E+{WAM{;tqps~Ulqtul$nGAZpo*B7zVIKl_ zI|{QKGcmP@j|!EjYgV)Cl9Cc+XJ@nTCd`bsx3?oYIvSirkMr*b;M^I1aGdp(ZA5v4 z3TMCXhh}C8wY9Z~kB=8-RvDd~oJ3ey7{*42Z z&z{PX`2_=hzA=hP%}PSBhHl<~s|}-=*6M|k6~bSTBI>|Sbar+^p-_NpY;0s1M)sz+ z)id~M@k6A4qr{;zcZCt_oH(mM#ziGgefdBbF^41)Cg}pXmX;QF5p!@Sla`E3EHF7V zHqWFOD)st$ufFKYWLsMsIHgj_E)E1aGiizGm`ccNJxop#)7rP!iDkFGzCLgy$Ff0R zFMB2}G41nvZyVhshD^{ixzQ53bzW|Ep!Ot@k&%3BYb$iOqTpb^{gJyG|C4ge^RD3B z+>D9fKh4^x+iuj;dU$wvfC~x=VgvUd%`mwcR3y0M3JnHFb+j}JqwDkV@f_yJu?h|j z21ne>2AkxQOs>a(N{6E#c4PNDazv1vy61EUo_n_woqs(MG{pJijxly3A|fEsXf(X1 zrzd>eB^YctELtz8p6C%OyTev#$qq*jiprO<*H^p*#(dm^+dUd%a*#@;h>MFO=W78~ zHzx#@wS4=_W2*)!v}osC=@+ina`zuCGZ-Eo&e|Flt~oh5Z1St02FMMT*mp~A+%^_v zF|Plq7Tw>^FZVHNva?)Ilai89U0qFD6CYg7GuFM;wBFNTL2oQgV#FMDC5@W-_FN<$ z%KLGEtx_(Rlcs<(FXD9Rqobp^UL1-OF`n#4PXl%9;SaiDXYXjeh`YPHqpq$Fc6N41 zKL0lwZmsXmji8=6{>6Rhmv~fER4f~$n57^Z&Xtvw#El$IlWHL&#{VV9WGm3d?2}7M z9Lv0ivB^c0mX@-uTa8&`X2P-s%{a9Sd8A2u*4shQSPQMUmwz3`chw`%&Ms}O1vN1} zJ&pYQe3X@yL8sHfmITP_ueh;lvTE3v5fG0Pg4=4I2F~R5N=JJDsgTgPx5nZVzw3DL^9CbZyaZETkI3Ox23N)Q= c?vE7kKTQ6QeBz9EP5=M^07*qoM6N<$f*&SxQ~&?~ literal 0 HcmV?d00001 diff --git a/modules/time-calc-app/src/main/resources/smileys/SMILEY_11.png b/modules/time-calc-app/src/main/resources/smileys/SMILEY_11.png new file mode 100644 index 0000000000000000000000000000000000000000..8269c9fafedfcb5980b7c7d4a8bb643d415cca01 GIT binary patch literal 1636 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 literal 0 HcmV?d00001 diff --git a/modules/time-calc-app/src/main/resources/smileys/SMILEY_15.png b/modules/time-calc-app/src/main/resources/smileys/SMILEY_15.png new file mode 100644 index 0000000000000000000000000000000000000000..0b893f551a8675733d909af75b69e23b6ca2e01b GIT binary patch literal 1700 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 IM6N<$f*{GsVE_OC literal 0 HcmV?d00001 diff --git a/modules/time-calc-app/src/main/resources/smileys/SMILEY_4.png b/modules/time-calc-app/src/main/resources/smileys/SMILEY_4.png new file mode 100644 index 0000000000000000000000000000000000000000..f1d8858c5792ef1c2e589b543cf441b7d7c9126a GIT binary patch literal 1672 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 BIo<#O literal 0 HcmV?d00001 diff --git a/modules/time-calc-app/src/main/resources/smileys/SMILEY_6.png b/modules/time-calc-app/src/main/resources/smileys/SMILEY_6.png new file mode 100644 index 0000000000000000000000000000000000000000..e9b5f1d1a3621c1e55c78e6e8e02fc610241f591 GIT binary patch literal 1571 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 literal 0 HcmV?d00001 diff --git a/modules/time-calc-app/src/main/resources/smileys/SMILEY_8.png b/modules/time-calc-app/src/main/resources/smileys/SMILEY_8.png new file mode 100644 index 0000000000000000000000000000000000000000..b54edf5c618cacaa13cbae1a55c9fa52b47c693d GIT binary patch literal 1879 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 literal 0 HcmV?d00001 diff --git a/timecalc.conf b/timecalc.conf index 614b5aa..cfe4305 100644 --- a/timecalc.conf +++ b/timecalc.conf @@ -8,6 +8,7 @@ visibility.only-grey-or-none.enabled=false jokes.enabled=true commands.enabled=true toasts.enabled=true +smileys.colored=false #todo smileys.enabled=true @@ -24,4 +25,4 @@ widgets.walking-human.enabled=true widgets.battery.hour.enabled=true widgets.battery.day.enabled=true widgets.battery.week.enabled=true -widgets.battery.month.enabled=true \ No newline at end of file +widgets.battery.month.enabled=true