package com.example.schedulerapp; import javafx.geometry.HPos; import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.layout.GridPane; import java.util.ArrayList; import java.util.Arrays; public class WeeklyView extends GridPane implements ModelSubscriber{ Model model; ArrayList<Label> times; ArrayList<Label> days; public WeeklyView(){ //list of time labels times = new ArrayList<>(); for (int i = 8; i < 24; i++){ String j = i + "00"; String k = i + "30"; if (i < 10) { j = "0" + j; k = "0" + k; } Label jLabel = new Label(j); Label kLabel = new Label(k); times.add(jLabel); times.add(kLabel); } for (Label label : times){ label.setPrefHeight(20); //label.setStyle(" -fx-border-color: black"); } //list of day labels days = new ArrayList<>(); days.addAll(Arrays.asList(new Label("Sunday"), new Label("Monday"), new Label("Tuesday"), new Label("Wednesday"), new Label("Thursday"), new Label("Friday"), new Label("Saturday"))); for (Label label : days){ GridPane.setHalignment(label, HPos.CENTER); label.setAlignment(Pos.CENTER); label.setPrefWidth(80); //label.setStyle(" -fx-border-color: black"); } } public void setModel(Model newModel) { this.model = newModel; //now can draw for first time draw(); } @Override public void modelChanged() { draw(); } public void draw(){ //clear this.getChildren().clear(); //add to gridpane - time axis never changes int i = 1; for (Label time : times){ this.add(time, 0, i); i++; } //add to gridpane - day axis never changes i = 1; for (Label time : days){ this.add(time, i, 0); i++; } int col; //depends on day of week int row; //depends on start time int length; //depends on end time - start time //get updated schedule ArrayList<Shift> schedule = model.getWeeklySchedule(); for (Shift shift : schedule){ col = (shift.getStart().getDayOfWeek().getValue() % 7) + 1; //need Sunday=7 to be 1 //convert from start time to offset, granularity in 30 min increments row = (shift.getStart().getHour() - 8 ) * 2 + 1; if (shift.getStart().getMinute() == 30) row++; //calculate length length = (shift.getEnd().getHour() - shift.getStart().getHour()) * 2; if (shift.getStart().getMinute() == 30) length--; if (shift.getEnd().getMinute() == 30) length++; //text formatting String text; if (shift.getStart().getHour() < 10) text = "0" + shift.getStart().getHour(); else text = String.valueOf(shift.getStart().getHour()); if (shift.getStart().getMinute() == 0) text += "00"; else text += "30"; //only two options for minutes text += "\n - \n"; if (shift.getEnd().getHour() < 10) text += "0" + shift.getEnd().getHour(); else text += String.valueOf(shift.getEnd().getHour()); if (shift.getEnd().getMinute() == 0) text += "00"; else text += "30"; //only two options for minutes Button shiftRep = new Button(text); shiftRep.setMaxHeight(700); //so it always fills its region shiftRep.setMaxWidth(100); GridPane.setFillHeight(shiftRep, true); GridPane.setFillWidth(shiftRep, true); //css styling //todo: different colour for current day shiftRep.setStyle("-fx-background-color: skyblue"); this.add(shiftRep, col, row, 1, length); } } }