Compare commits

..
Author SHA1 Message Date
David Guler 1f049f86ab fix: fixed fxml version warning 2022-11-25 12:31:27 +01:00
David Guler bcb36b89c7 feature: added tutorial window 2022-11-23 21:55:35 +01:00
gulerdavandGitHub Enterprise f7105f041c Merge pull request #66 from schrom01/feature_guiOverhaul_M3
Feature gui overhaul m3
2022-11-21 12:56:57 +01:00
11 changed files with 227 additions and 217 deletions
@@ -104,16 +104,16 @@ public class CropDetailController {
* open dialog to set area * open dialog to set area
*/ */
@FXML @FXML
void setArea() throws IOException { void setArea() {
openTextFieldDialog("set Text Area", "Text Area", area_label.getText(), false);
} }
/** /**
* open dialog to set location * open dialog to set location
*/ */
@FXML @FXML
void setLocation() throws IOException { void setLocation() {
openTextFieldDialog("set Location", "Location", location_label.getText(), true);
} }
/** /**
@@ -218,7 +218,6 @@ public class CropDetailController {
setIconToButton(edit, "editIcon.png"); setIconToButton(edit, "editIcon.png");
setIconToButton(delete, "deleteIcon.png"); setIconToButton(delete, "deleteIcon.png");
edit.setOnAction(getEditTaskEvent(task)); edit.setOnAction(getEditTaskEvent(task));
delete.setOnAction(deleteTask(task));
hBox.getChildren().addAll(taskName, taskDescription, edit, delete); hBox.getChildren().addAll(taskName, taskDescription, edit, delete);
return hBox; return hBox;
@@ -261,12 +260,6 @@ public class CropDetailController {
}; };
} }
private EventHandler<ActionEvent> deleteTask(Task task) {
return (event) -> {
showDeleteTask(task);
};
}
private void createTaskDialog(boolean newTask, Task givenTask) throws IOException { private void createTaskDialog(boolean newTask, Task givenTask) throws IOException {
Dialog<Task> dialog = new Dialog<>(); Dialog<Task> dialog = new Dialog<>();
dialog.setTitle("Set Task"); dialog.setTitle("Set Task");
@@ -285,7 +278,6 @@ public class CropDetailController {
if (appLoader.loadPaneToDialog("TaskFormular.fxml", dialogPane) instanceof TaskFormularController controller) { if (appLoader.loadPaneToDialog("TaskFormular.fxml", dialogPane) instanceof TaskFormularController controller) {
controller.setCorp(this.crop); controller.setCorp(this.crop);
controller.initSaveButton((Button) dialogPane.lookupButton(saveTask));
if (!newTask) { if (!newTask) {
controller.setTaskValue(givenTask); controller.setTaskValue(givenTask);
} }
@@ -308,56 +300,4 @@ public class CropDetailController {
} }
} }
private void openTextFieldDialog(String title, String labelDescription, String value, boolean isLocation) throws IOException {
Dialog<String> dialog = new Dialog<>();
dialog.setTitle(title);
dialog.setHeaderText(title);
dialog.setResizable(false);
DialogPane dialogPane = dialog.getDialogPane();
ButtonType save = new ButtonType("Save", ButtonBar.ButtonData.OK_DONE);
dialogPane.getButtonTypes().addAll(save, ButtonType.CANCEL);
if (appLoader.loadPaneToDialog("TextFieldFormular.fxml", dialogPane) instanceof TextFieldFormularController controller) {
controller.setDescription_label(labelDescription);
controller.setValueTextArea(value);
controller.initSaveButton((Button) dialogPane.lookupButton(save));
dialog.setResultConverter(button -> button.equals(save) ? controller.getValue() : null);
dialog.showAndWait()
.ifPresent(string -> {
if (isLocation) {
System.out.println(string);
//ToDo method to set location
location_label.setText(string);
} else {
System.out.println(string);
//ToDo method to set area of crop in garden
area_label.setText(string);
}
});
}
}
private void showDeleteTask(Task task) {
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
alert.setTitle("Delete " + task.getName());
alert.setHeaderText("Are you sure want to delete this Task?");
alert.showAndWait()
.ifPresent(buttonType -> {
if (buttonType == ButtonType.OK) {
try {
gardenSchedule.removeTask(task);
setTaskListProperty(this.crop);
} catch (IOException e) {
// TODO: Show error alert
LOG.log(Level.SEVERE, "Could not remove crop.", e);
}
}
});
}
} }
@@ -11,6 +11,9 @@ import javafx.scene.image.Image;
import javafx.scene.image.ImageView; import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane; import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane; import javafx.scene.layout.Pane;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import java.io.IOException; import java.io.IOException;
import java.util.logging.Level; import java.util.logging.Level;
@@ -40,6 +43,9 @@ public class MainFXMLController {
@FXML @FXML
private Button tutorial_button; private Button tutorial_button;
private final Stage tutorialModal = new Stage();
/** /**
* go to home pane * go to home pane
*/ */
@@ -95,11 +101,23 @@ public class MainFXMLController {
} }
/** /**
* go to Tutorial pane * Show the tutorial window
*/ */
public void goToTutorial() { public void showTutorial() {
showPaneAsMainView("Tutorial.fxml"); if (!tutorialModal.isShowing()) {
styleChangeButton(tutorial_button); if (tutorialModal.getScene() == null) {
try {
appLoader.loadSceneToStage("Tutorial.fxml", tutorialModal);
tutorialModal.initModality(Modality.NONE);
tutorialModal.setResizable(false);
tutorialModal.sizeToScene();
} catch (IOException e) {
LOG.log(Level.SEVERE, "Could not load Tutorial");
}
}
tutorialModal.show();
}
tutorialModal.requestFocus();
} }
/** /**
@@ -132,7 +150,6 @@ public class MainFXMLController {
appLoader.loadAndCacheFxml("MyGarden.fxml"); appLoader.loadAndCacheFxml("MyGarden.fxml");
appLoader.loadAndCacheFxml("MySchedule.fxml"); appLoader.loadAndCacheFxml("MySchedule.fxml");
appLoader.loadAndCacheFxml("Plants.fxml"); appLoader.loadAndCacheFxml("Plants.fxml");
appLoader.loadAndCacheFxml("Tutorial.fxml");
} }
private void styleChangeButton(Button button) { private void styleChangeButton(Button button) {
@@ -153,12 +170,14 @@ public class MainFXMLController {
} catch (IOException e) { } catch (IOException e) {
LOG.log(Level.SEVERE, "Failed to load FXML-Pane!", e); LOG.log(Level.SEVERE, "Failed to load FXML-Pane!", e);
} }
mainPane.getScene().getWindow().setOnCloseRequest(this::closeWindowHandler);
setIconToButton(home_button, "homeIcon.png"); setIconToButton(home_button, "homeIcon.png");
setIconToButton(settings_button, "settingsIcon.png"); setIconToButton(settings_button, "settingsIcon.png");
Settings.getInstance().getShowTutorialProperty().addListener((observable, oldValue, newValue) -> { tutorial_button.visibleProperty().bind(Settings.getInstance().getShowTutorialProperty());
tutorial_button.setVisible(newValue); }
});
tutorial_button.setVisible(Settings.getInstance().getShowTutorial()); private void closeWindowHandler(WindowEvent windowEvent) {
tutorialModal.close();
} }
/** /**
@@ -173,7 +192,4 @@ public class MainFXMLController {
imageView.setPreserveRatio(true); imageView.setPreserveRatio(true);
button.setGraphic(imageView); button.setGraphic(imageView);
} }
} }
@@ -2,14 +2,12 @@ package ch.zhaw.gartenverwaltung;
import ch.zhaw.gartenverwaltung.types.Crop; import ch.zhaw.gartenverwaltung.types.Crop;
import ch.zhaw.gartenverwaltung.types.Task; import ch.zhaw.gartenverwaltung.types.Task;
import javafx.beans.binding.Binding;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.BooleanBinding;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.Initializable; import javafx.fxml.Initializable;
import javafx.scene.control.*; import javafx.scene.control.DateCell;
import javafx.scene.control.DatePicker;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.util.Callback; import javafx.util.Callback;
import java.net.URL; import java.net.URL;
@@ -58,7 +56,7 @@ public class TaskFormularController implements Initializable {
} }
} }
private Callback<DatePicker, DateCell> getDayCellFactoryStartDate() { private Callback<DatePicker, DateCell> getDayCellFactory() {
return (datePicker) -> new DateCell() { return (datePicker) -> new DateCell() {
private final LocalDate today = LocalDate.now(); private final LocalDate today = LocalDate.now();
@@ -73,61 +71,16 @@ public class TaskFormularController implements Initializable {
setDisable(false); setDisable(false);
setStyle("-fx-background-color: #32CD32;"); setStyle("-fx-background-color: #32CD32;");
} }
if (end_datePicker.getValue() != null && item.compareTo(end_datePicker.getValue()) > 0) {
setDisable(true);
setStyle("-fx-background-color: #ffc0cb;");
}
} }
}; };
} }
private Callback<DatePicker, DateCell> getDayCellFactoryEndDate() {
return (datePicker) -> new DateCell() {
private final LocalDate today = LocalDate.now();
@Override
public void updateItem(LocalDate item, boolean empty) {
super.updateItem(item, empty);
setDisable(true);
setStyle("-fx-background-color: #ffc0cb;");
if (item.compareTo(today) > 0 && item.compareTo(crop.getStartDate()) > 0) {
setDisable(false);
setStyle("-fx-background-color: #32CD32;");
}
if (start_datePicker.getValue() != null && item.compareTo(start_datePicker.getValue()) < 0) {
setDisable(true);
setStyle("-fx-background-color: #ffc0cb;");
}
}
};
}
public void initSaveButton(Button button) {
interval_field.textProperty().addListener((observable, oldValue, newValue) -> {
if (!newValue.matches("\\d*")) {
interval_field.setText(newValue.replaceAll("[^\\d]", ""));
}
});
button.disableProperty().bind(start_datePicker.valueProperty().isNull()
.or(end_datePicker.valueProperty().isNull())
.or(taskName_field.textProperty().isEmpty())
.or(description_area.textProperty().isEmpty())
.or(interval_field.textProperty().isEmpty()));
}
@Override @Override
public void initialize(URL location, ResourceBundle resources) { public void initialize(URL location, ResourceBundle resources) {
start_datePicker.setDayCellFactory(getDayCellFactoryStartDate()); start_datePicker.setDayCellFactory(getDayCellFactory());
start_datePicker.setEditable(false); start_datePicker.setEditable(false);
end_datePicker.setDayCellFactory(getDayCellFactoryEndDate()); end_datePicker.setDayCellFactory(getDayCellFactory());
end_datePicker.setEditable(false); end_datePicker.setEditable(false);
} }
} }
@@ -1,32 +0,0 @@
package ch.zhaw.gartenverwaltung;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
public class TextFieldFormularController {
@FXML
private Label description_label;
@FXML
private TextField text_area;
public void setDescription_label(String string) {
description_label.setText(string);
}
public void setValueTextArea(String string) {
text_area.setText(string);
}
public String getValue() {
return text_area.getText();
}
public void initSaveButton(Button button) {
button.disableProperty().bind(text_area.textProperty().isEmpty());
}
}
@@ -1,6 +1,61 @@
package ch.zhaw.gartenverwaltung; package ch.zhaw.gartenverwaltung;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class TutorialController { public class TutorialController {
@FXML
public Button previousPageButton;
@FXML
public Button nextPageButton;
@FXML
public StackPane tourPages;
public ImageView imgAddNewPlant;
public ImageView imgTaskList;
public ImageView imgSelectDate;
private int page = 0;
@FXML
public void initialize() {
switchViews();
setButtonAbilities();
Image placeholder = new Image(String.valueOf(PlantsController.class.getResource("placeholder.png")));
imgAddNewPlant.setImage(placeholder);
imgSelectDate.setImage(placeholder);
imgTaskList.setImage(placeholder);
}
public void viewNextPage() {
page++;
switchViews();
setButtonAbilities();
}
public void viewPreviousPage() {
page--;
switchViews();
setButtonAbilities();
}
private void setButtonAbilities() {
previousPageButton.setDisable(page <= 0);
nextPageButton.setDisable(page >= tourPages.getChildren().size() - 1);
}
private void switchViews() {
tourPages.getChildren().forEach(node -> node.setOpacity(0));
tourPages.getChildren().get(page).setOpacity(1);
}
public void closeTutorial() {
Stage root = (Stage) tourPages.getScene().getWindow();
root.close();
}
} }
@@ -73,10 +73,7 @@ public class AppLoader {
public Object loadSceneToStage(String fxmlFile, Stage appendee) throws IOException { public Object loadSceneToStage(String fxmlFile, Stage appendee) throws IOException {
FXMLLoader loader = new FXMLLoader(Objects.requireNonNull(HelloApplication.class.getResource(fxmlFile))); FXMLLoader loader = new FXMLLoader(Objects.requireNonNull(HelloApplication.class.getResource(fxmlFile)));
Pane root = loader.load(); Pane root = loader.load();
Scene scene = new Scene(root); appendee.setScene(new Scene(root));
String css = Objects.requireNonNull(this.getClass().getResource("styles.css")).toExternalForm();
appendee.setScene(scene);
scene.getStylesheets().add(css);
Object controller = loader.getController(); Object controller = loader.getController();
annotationInject(controller); annotationInject(controller);
return controller; return controller;
@@ -48,10 +48,6 @@ public class TaskTemplate {
public Task generateTask(LocalDate realStartDate, long cropId) { public Task generateTask(LocalDate realStartDate, long cropId) {
LocalDate endDate = relativeEndDate != null ? realStartDate.plusDays(relativeEndDate) : null; LocalDate endDate = relativeEndDate != null ? realStartDate.plusDays(relativeEndDate) : null;
if (interval == null) {
this.interval = 0;
}
return new Task(name, description, realStartDate.plusDays(relativeStartDate), cropId) return new Task(name, description, realStartDate.plusDays(relativeStartDate), cropId)
.withInterval(interval) .withInterval(interval)
.withEndDate(endDate); .withEndDate(endDate);
@@ -12,7 +12,7 @@
<Button fx:id="home_button" mnemonicParsing="false" onAction="#goToHome" prefHeight="38.0" prefWidth="40.0" HBox.hgrow="NEVER" /> <Button fx:id="home_button" mnemonicParsing="false" onAction="#goToHome" prefHeight="38.0" prefWidth="40.0" HBox.hgrow="NEVER" />
<Button fx:id="myGarden_button" layoutX="10.0" layoutY="10.0" mnemonicParsing="false" onAction="#goToMyPlants" prefHeight="38.0" prefWidth="121.0" text="My Garden" /> <Button fx:id="myGarden_button" layoutX="10.0" layoutY="10.0" mnemonicParsing="false" onAction="#goToMyPlants" prefHeight="38.0" prefWidth="121.0" text="My Garden" />
<Button fx:id="mySchedule_button" layoutX="10.0" layoutY="10.0" mnemonicParsing="false" onAction="#goToMySchedule" prefHeight="38.0" prefWidth="121.0" text="My Schedule" /> <Button fx:id="mySchedule_button" layoutX="10.0" layoutY="10.0" mnemonicParsing="false" onAction="#goToMySchedule" prefHeight="38.0" prefWidth="121.0" text="My Schedule" />
<Button fx:id="tutorial_button" layoutX="10.0" layoutY="10.0" mnemonicParsing="false" onAction="#goToTutorial" prefHeight="38.0" prefWidth="121.0" text="Tutorial" /> <Button fx:id="tutorial_button" layoutX="10.0" layoutY="10.0" mnemonicParsing="false" onAction="#showTutorial" prefHeight="38.0" prefWidth="121.0" text="Tutorial" />
<Pane maxWidth="1.7976931348623157E308" prefHeight="200.0" prefWidth="200.0" HBox.hgrow="ALWAYS" /> <Pane maxWidth="1.7976931348623157E308" prefHeight="200.0" prefWidth="200.0" HBox.hgrow="ALWAYS" />
<Button fx:id="settings_button" maxHeight="1.7976931348623157E308" mnemonicParsing="false" onAction="#openSettings" prefHeight="38.0" prefWidth="40.0" HBox.hgrow="NEVER" /> <Button fx:id="settings_button" maxHeight="1.7976931348623157E308" mnemonicParsing="false" onAction="#openSettings" prefHeight="38.0" prefWidth="40.0" HBox.hgrow="NEVER" />
</children> </children>
@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="64.0" prefWidth="298.0" xmlns="http://javafx.com/javafx/17"
xmlns:fx="http://javafx.com/fxml/1" fx:controller="ch.zhaw.gartenverwaltung.TextFieldFormularController">
<children>
<HBox alignment="CENTER" layoutX="153.0" layoutY="33.0" prefHeight="100.0" prefWidth="200.0" spacing="10.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<children>
<Label fx:id="description_label" maxWidth="1.7976931348623157E308" text="Label" HBox.hgrow="ALWAYS" />
<TextField fx:id="text_area" HBox.hgrow="NEVER" />
</children>
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
</HBox>
</children>
</AnchorPane>
@@ -1,27 +1,141 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?> <?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?> <?import javafx.scene.control.Button?>
<?import javafx.scene.layout.AnchorPane?> <?import javafx.scene.control.ButtonBar?>
<?import javafx.scene.control.CheckBox?>
<?import javafx.scene.control.Separator?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?> <?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?> <?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>
<?import javafx.scene.text.TextFlow?>
<BorderPane maxHeight="470.0" maxWidth="724.0" minHeight="470.0" minWidth="724.0" prefHeight="470.0" prefWidth="724.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ch.zhaw.gartenverwaltung.TutorialController">
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/17" <bottom>
xmlns:fx="http://javafx.com/fxml/1" fx:controller="ch.zhaw.gartenverwaltung.TutorialController"> <HBox alignment="CENTER" prefHeight="0.0" prefWidth="724.0" BorderPane.alignment="CENTER">
<children>
<VBox layoutX="7.0" layoutY="8.0" prefHeight="200.0" prefWidth="100.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<children> <children>
<Label text="Tutorial"> <CheckBox mnemonicParsing="false" text="Don't show again" />
<font> <Separator prefWidth="50.0" visible="false" HBox.hgrow="ALWAYS" />
<Font size="18.0" /> <ButtonBar prefHeight="40.0" prefWidth="200.0">
</font> <buttons>
</Label> <Button cancelButton="true" contentDisplay="CENTER" graphicTextGap="5.0" mnemonicParsing="false" text="Close" onAction="#closeTutorial"/>
<Label text="To be added" /> <Button fx:id="previousPageButton" mnemonicParsing="false" text="Previous" onAction="#viewPreviousPage"/>
<Button fx:id="nextPageButton" defaultButton="true" mnemonicParsing="false" text="Next" onAction="#viewNextPage" />
</buttons>
</ButtonBar>
</children> </children>
<padding> <padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> <Insets bottom="15.0" left="15.0" right="15.0" top="15.0" />
</padding> </padding>
</VBox> </HBox>
</children> </bottom>
</AnchorPane> <center>
<StackPane fx:id="tourPages" prefHeight="150.0" prefWidth="200.0" BorderPane.alignment="CENTER">
<children>
<VBox layoutX="30.0" layoutY="26.0" opacity="0.0" prefHeight="200.0" prefWidth="100.0">
<children>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Managing Your Crops">
<font>
<Font size="24.0" />
</font>
</Text>
<Separator prefWidth="200.0">
<VBox.margin>
<Insets bottom="15.0" top="10.0" />
</VBox.margin>
</Separator>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="In the &quot;My Garden&quot; tab, you can see all of the plants you're planning on growing.">
<VBox.margin>
<Insets bottom="20.0" />
</VBox.margin>
</Text>
<HBox prefHeight="100.0" prefWidth="200.0">
<children>
<TextFlow lineSpacing="4.0" prefHeight="90.0" prefWidth="500.0">
<children>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="To get started, click on the &quot;Add new Plant&quot; button in the bottom left. This will open a list of all the plants you can grow.&#10;Use the search bar at the top, the filters on the left, or simply browse the list until you've found a plant you want to grow in your garden." wrappingWidth="345.80316162109375" />
</children>
<HBox.margin>
<Insets bottom="20.0" />
</HBox.margin>
</TextFlow>
<Separator prefWidth="200.0" visible="false" HBox.hgrow="ALWAYS" />
<ImageView fx:id="imgAddNewPlant" fitHeight="98.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true" />
</children>
</HBox>
<HBox prefHeight="100.0" prefWidth="200.0">
<children>
<TextFlow lineSpacing="4.0" prefHeight="200.0" prefWidth="500.0">
<children>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Once you've found what you're looking for, click the &quot;Select Sow/Harvest Date&quot; button at the bottom of the window.&#10;In the subsequently shown dialog, you can select the date you'd like to sow or harvest the crop. The date selector shows possible dates in green. Confirm your selection with the &quot;Save&quot; button." />
</children>
</TextFlow>
<Separator prefWidth="200.0" visible="false" HBox.hgrow="ALWAYS" />
<ImageView fx:id="imgSelectDate" fitHeight="150.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true" />
</children>
</HBox>
</children>
<opaqueInsets>
<Insets />
</opaqueInsets>
</VBox>
<VBox prefHeight="200.0" prefWidth="100.0">
<children>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Managing Your Tasks">
<font>
<Font size="24.0" />
</font>
</Text>
<Separator prefWidth="200.0">
<VBox.margin>
<Insets bottom="15.0" top="10.0" />
</VBox.margin>
</Separator>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="In the &quot;My Schedule&quot; tab, you can see all of the tasks you need to complete for a successful harvest.">
<VBox.margin>
<Insets bottom="20.0" />
</VBox.margin>
</Text>
<HBox prefHeight="100.0" prefWidth="200.0">
<children>
<TextFlow lineSpacing="4.0" prefHeight="90.0" prefWidth="500.0">
<children>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="You can view the tasks for a specific crop by selecting it from the left sidebar.&#10;To see all tasks again, click the &quot;Clear Filter&quot; button at the bottom." wrappingWidth="345.80316162109375" />
</children>
<HBox.margin>
<Insets bottom="20.0" />
</HBox.margin>
</TextFlow>
<Separator prefWidth="200.0" visible="false" HBox.hgrow="ALWAYS" />
<ImageView fx:id="imgTaskList" fitHeight="98.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true" />
</children>
</HBox>
<HBox prefHeight="100.0" prefWidth="200.0">
<children>
<TextFlow lineSpacing="4.0" prefHeight="200.0" prefWidth="500.0">
<children>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="You can also add your own custom tasks, by clicking the &quot;Add Task&quot; button.&#10;In the subsequently shown dialog, you can enter the corresponding details.&#10;&#10;Note: If you want to make a task recurring, you need to set both an interval (in days) AND an end date, so the task won't repeat for all eternity." />
</children>
</TextFlow>
<Separator prefWidth="200.0" visible="false" HBox.hgrow="ALWAYS" />
<ImageView fitHeight="150.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true" />
</children></HBox>
</children>
<opaqueInsets>
<Insets />
</opaqueInsets>
</VBox>
</children>
<BorderPane.margin>
<Insets />
</BorderPane.margin>
<padding>
<Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
</padding>
</StackPane>
</center>
</BorderPane>
@@ -1,6 +0,0 @@
.button{
-fx-text-fill: rgb(49, 89, 23);
-fx-border-color: rgb(49, 89, 23);
-fx-border-radius: 5;
-fx-padding: 3 6 6 6;
}