Skip to content

Commit 6f5453c

Browse files
author
Martin Plieske
committed
functioning timeline in report and main view
1 parent 22d3d6f commit 6f5453c

File tree

4 files changed

+59
-24
lines changed

4 files changed

+59
-24
lines changed
Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,32 @@
11
package de.doubleslash.keeptime.view;
22

3-
import java.time.Duration;
3+
import java.util.List;
44

5-
import de.doubleslash.keeptime.controller.Controller;
6-
import de.doubleslash.keeptime.model.Model;
7-
import de.doubleslash.keeptime.model.Work;
85
import javafx.scene.canvas.Canvas;
96
import javafx.scene.canvas.GraphicsContext;
107
import javafx.scene.paint.Color;
8+
import javafx.scene.shape.Rectangle;
119

1210
public class ColorTimeLine {
1311

1412
private final Canvas canvas;
15-
private final Model model;
16-
private final Controller controller;
1713

18-
public ColorTimeLine(final Canvas canvas, final Model model, final Controller controller) {
14+
public ColorTimeLine(final Canvas canvas) {
1915
this.canvas = canvas;
20-
this.model = model;
21-
this.controller = controller;
2216
}
2317

24-
public void update() {
18+
public void update(final List<Rectangle> rects) {
2519
final GraphicsContext gc = canvas.getGraphicsContext2D();
2620

2721
gc.setFill(new Color(.3, .3, .3, .3));
2822
gc.clearRect(0, 0, canvas.getWidth(), canvas.getHeight());
2923
gc.fillRect(0, 0, canvas.getWidth(), canvas.getHeight());
3024

31-
double currentX = 0;
32-
final long maxSeconds = controller.calcTodaysSeconds();
33-
for (final Work w : model.getPastWorkItems()) {
34-
final long workedSeconds = Duration.between(w.getStartTime(), w.getEndTime()).getSeconds();
35-
final double fillX = (float) workedSeconds / maxSeconds * canvas.getWidth();
36-
gc.setFill(w.getProject().getColor());
37-
gc.fillRect(currentX, 0, fillX, canvas.getHeight());
38-
currentX += fillX;
25+
for (final Rectangle rect : rects) {
26+
gc.setFill(rect.getFill());
27+
gc.fillRect(rect.getX(), 0, rect.getWidth(), canvas.getHeight());
3928
}
29+
4030
}
4131

4232
}

src/main/java/de/doubleslash/keeptime/view/ReportController.java

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package de.doubleslash.keeptime.view;
22

3+
import java.time.Duration;
34
import java.time.LocalDate;
5+
import java.util.ArrayList;
46
import java.util.Comparator;
57
import java.util.List;
68
import java.util.SortedSet;
@@ -32,6 +34,8 @@
3234
import javafx.scene.input.ClipboardContent;
3335
import javafx.scene.layout.BorderPane;
3436
import javafx.scene.layout.GridPane;
37+
import javafx.scene.paint.Color;
38+
import javafx.scene.shape.Rectangle;
3539
import javafx.scene.text.Font;
3640
import javafx.scene.text.FontWeight;
3741
import javafx.util.Callback;
@@ -60,7 +64,7 @@ public class ReportController {
6064
private ScrollPane scrollPane;
6165

6266
@FXML
63-
private Canvas reportColorTimeLine;
67+
private Canvas canvas;
6468

6569
private static final Logger LOG = LoggerFactory.getLogger(ReportController.class);
6670

@@ -83,12 +87,36 @@ private void initialize() {
8387
LOG.info("Datepicker selected value changed to {}", newvalue);
8488
updateReport(newvalue);
8589
});
90+
91+
colorTimeLine = new ColorTimeLine(canvas);
8692
}
8793

8894
private void updateReport(final LocalDate newvalue) {
8995
this.currentDayLabel.setText(DateFormatter.toDayDateString(newvalue));
9096
final List<Work> currentWorkItems = model.getWorkRepository().findByCreationDate(newvalue);
9197

98+
final List<Rectangle> rects = new ArrayList<>();
99+
long maxSeconds = 0;
100+
for (final Work w : currentWorkItems) {
101+
maxSeconds += Duration.between(w.getStartTime(), w.getEndTime()).getSeconds();
102+
}
103+
double currentX = 0;
104+
105+
for (final Work w : currentWorkItems) {
106+
final long workedSeconds = Duration.between(w.getStartTime(), w.getEndTime()).getSeconds();
107+
final double width = (double) workedSeconds / maxSeconds * canvas.getWidth();
108+
final Color fill = w.getProject().getColor();
109+
110+
final Rectangle rect = new Rectangle(currentX, 0, width, 0);
111+
rect.setFill(fill);
112+
113+
rects.add(rect);
114+
115+
currentX += width;
116+
}
117+
118+
colorTimeLine.update(rects);
119+
92120
final SortedSet<Project> workedProjectsSet = currentWorkItems.stream().map(Work::getProject)
93121
.collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Project::getName))));
94122

@@ -160,8 +188,6 @@ private void updateReport(final LocalDate newvalue) {
160188
this.currentDayTimeLabel.setText(DateFormatter.secondsToHHMMSS(currentSeconds));
161189
this.currentDayWorkTimeLabel.setText(DateFormatter.secondsToHHMMSS(currentWorkSeconds));
162190

163-
colorTimeLine = new ColorTimeLine(reportColorTimeLine, model, controller);
164-
colorTimeLine.update();
165191
}
166192

167193
private Button createProjectReport() {

src/main/java/de/doubleslash/keeptime/view/ViewController.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.io.IOException;
55
import java.time.Duration;
66
import java.time.LocalDateTime;
7+
import java.util.ArrayList;
78
import java.util.Comparator;
89
import java.util.HashMap;
910
import java.util.List;
@@ -23,6 +24,7 @@
2324
import de.doubleslash.keeptime.exceptions.FXMLLoaderException;
2425
import de.doubleslash.keeptime.model.Model;
2526
import de.doubleslash.keeptime.model.Project;
27+
import de.doubleslash.keeptime.model.Work;
2628
import de.doubleslash.keeptime.view.time.Interval;
2729
import javafx.application.Platform;
2830
import javafx.beans.binding.Bindings;
@@ -74,6 +76,7 @@
7476
import javafx.scene.layout.VBox;
7577
import javafx.scene.paint.Color;
7678
import javafx.scene.shape.Circle;
79+
import javafx.scene.shape.Rectangle;
7780
import javafx.scene.text.TextAlignment;
7881
import javafx.stage.Modality;
7982
import javafx.stage.Stage;
@@ -317,11 +320,27 @@ private void initialize() {
317320
label.setText(DateFormatter.secondsToHHMMSS(seconds));
318321
}
319322

320-
mainColorTimeLine.update();
323+
final long maxSeconds = controller.calcTodaysSeconds();
324+
double currentX = 0;
325+
final List<Rectangle> rects = new ArrayList<>();
326+
for (final Work w : model.getPastWorkItems()) {
327+
final long workedSeconds = Duration.between(w.getStartTime(), w.getEndTime()).getSeconds();
328+
final double width = (double) workedSeconds / maxSeconds * canvas.getWidth();
329+
final Color fill = w.getProject().getColor();
330+
331+
final Rectangle rect = new Rectangle(currentX, 0, width, 0);
332+
rect.setFill(fill);
333+
334+
rects.add(rect);
335+
336+
currentX += width;
337+
}
338+
339+
mainColorTimeLine.update(rects);
321340
updateTaskbarIcon(currentWorkSeconds);
322341
});
323342

324-
mainColorTimeLine = new ColorTimeLine(canvas, model, controller);
343+
mainColorTimeLine = new ColorTimeLine(canvas);
325344
}
326345

327346
private Dialog<Project> dialogResultConverter(final Dialog<Project> dialog, final GridPane grid) {

src/main/resources/report.fxml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
7272
</VBox.margin>
7373
</BorderPane>
74-
<Canvas fx:id="reportColorTimeLine" height="3.0" width="480.0">
74+
<Canvas fx:id="canvas" height="3.0" width="480.0">
7575
<VBox.margin>
7676
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
7777
</VBox.margin>

0 commit comments

Comments
 (0)