From 8e02a66d2bfd96c8b5e4df9af4179cd7bff3e249 Mon Sep 17 00:00:00 2001 From: fanwgwg Date: Mon, 10 Oct 2016 23:40:17 +0800 Subject: [PATCH 1/8] Update UI for v0.2 demo --- src/main/java/seedu/agendum/logic/Logic.java | 3 + .../seedu/agendum/logic/LogicManager.java | 8 ++ .../java/seedu/agendum/ui/CommandBox.java | 14 +-- .../seedu/agendum/ui/CompletedTaskCard.java | 56 +++++++++ .../seedu/agendum/ui/CompletedTasksPanel.java | 106 ++++++++++++++++++ .../java/seedu/agendum/ui/MainWindow.java | 41 ++++--- .../java/seedu/agendum/ui/ResultPopUp.java | 91 +++++++++++++++ src/main/java/seedu/agendum/ui/TaskCard.java | 5 + src/main/java/seedu/agendum/ui/UiManager.java | 3 +- .../seedu/agendum/ui/UpcomingTaskCard.java | 83 ++++++++++++++ .../seedu/agendum/ui/UpcomingTasksPanel.java | 106 ++++++++++++++++++ .../resources/view/CompletedTaskCard.fxml | 6 + .../resources/view/CompletedTasksPanel.fxml | 22 ++++ src/main/resources/view/DarkTheme.css | 47 +------- src/main/resources/view/MainWindow.fxml | 42 ++++--- src/main/resources/view/ResultPopUp.css | 31 +++++ src/main/resources/view/ResultPopUp.fxml | 20 ++++ src/main/resources/view/TaskListCard.fxml | 39 ------- src/main/resources/view/TasksPanel.css | 59 ++++++++++ src/main/resources/view/UpcomingTaskCard.fxml | 70 ++++++++++++ .../resources/view/UpcomingTasksPanel.css | 44 ++++++++ .../resources/view/UpcomingTasksPanel.fxml | 22 ++++ .../guihandles/ResultDisplayHandle.java | 2 +- .../guihandles/TaskListPanelHandle.java | 2 +- 24 files changed, 793 insertions(+), 129 deletions(-) create mode 100644 src/main/java/seedu/agendum/ui/CompletedTaskCard.java create mode 100644 src/main/java/seedu/agendum/ui/CompletedTasksPanel.java create mode 100644 src/main/java/seedu/agendum/ui/ResultPopUp.java create mode 100644 src/main/java/seedu/agendum/ui/UpcomingTaskCard.java create mode 100644 src/main/java/seedu/agendum/ui/UpcomingTasksPanel.java create mode 100644 src/main/resources/view/CompletedTaskCard.fxml create mode 100644 src/main/resources/view/CompletedTasksPanel.fxml create mode 100644 src/main/resources/view/ResultPopUp.css create mode 100644 src/main/resources/view/ResultPopUp.fxml delete mode 100644 src/main/resources/view/TaskListCard.fxml create mode 100644 src/main/resources/view/TasksPanel.css create mode 100644 src/main/resources/view/UpcomingTaskCard.fxml create mode 100644 src/main/resources/view/UpcomingTasksPanel.css create mode 100644 src/main/resources/view/UpcomingTasksPanel.fxml diff --git a/src/main/java/seedu/agendum/logic/Logic.java b/src/main/java/seedu/agendum/logic/Logic.java index 970cc35537c3..9823eabdcd10 100644 --- a/src/main/java/seedu/agendum/logic/Logic.java +++ b/src/main/java/seedu/agendum/logic/Logic.java @@ -17,5 +17,8 @@ public interface Logic { /** Returns the filtered list of tasks */ ObservableList getFilteredTaskList(); + + /** Returns list of completed tasks */ + ObservableList getCompletedTaskList(); } diff --git a/src/main/java/seedu/agendum/logic/LogicManager.java b/src/main/java/seedu/agendum/logic/LogicManager.java index 394810c19201..fd60e5787031 100644 --- a/src/main/java/seedu/agendum/logic/LogicManager.java +++ b/src/main/java/seedu/agendum/logic/LogicManager.java @@ -38,4 +38,12 @@ public CommandResult execute(String commandText) { public ObservableList getFilteredTaskList() { return model.getFilteredTaskList(); } + + /** + * Requires implementation here + */ + @Override + public ObservableList getCompletedTaskList() { + return null; + } } diff --git a/src/main/java/seedu/agendum/ui/CommandBox.java b/src/main/java/seedu/agendum/ui/CommandBox.java index 6aaba5ce2940..b07364f4eef9 100644 --- a/src/main/java/seedu/agendum/ui/CommandBox.java +++ b/src/main/java/seedu/agendum/ui/CommandBox.java @@ -21,7 +21,7 @@ public class CommandBox extends UiPart { private AnchorPane placeHolderPane; private AnchorPane commandPane; - private ResultDisplay resultDisplay; + private ResultPopUp resultPopUp; String previousCommandTest; private Logic logic; @@ -31,15 +31,15 @@ public class CommandBox extends UiPart { private CommandResult mostRecentResult; public static CommandBox load(Stage primaryStage, AnchorPane commandBoxPlaceholder, - ResultDisplay resultDisplay, Logic logic) { + ResultPopUp resultPopUp, Logic logic) { CommandBox commandBox = UiPartLoader.loadUiPart(primaryStage, commandBoxPlaceholder, new CommandBox()); - commandBox.configure(resultDisplay, logic); + commandBox.configure(resultPopUp, logic); commandBox.addToPlaceholder(); return commandBox; } - public void configure(ResultDisplay resultDisplay, Logic logic) { - this.resultDisplay = resultDisplay; + public void configure(ResultPopUp resultPopUp, Logic logic) { + this.resultPopUp = resultPopUp; this.logic = logic; registerAsAnEventHandler(this); } @@ -66,7 +66,6 @@ public void setPlaceholder(AnchorPane pane) { this.placeHolderPane = pane; } - @FXML private void handleCommandInputChanged() { //Take a copy of the command text @@ -77,11 +76,10 @@ private void handleCommandInputChanged() { */ setStyleToIndicateCorrectCommand(); mostRecentResult = logic.execute(previousCommandTest); - resultDisplay.postMessage(mostRecentResult.feedbackToUser); + resultPopUp.postMessage(mostRecentResult.feedbackToUser); logger.info("Result: " + mostRecentResult.feedbackToUser); } - /** * Sets the command box style to indicate a correct command. */ diff --git a/src/main/java/seedu/agendum/ui/CompletedTaskCard.java b/src/main/java/seedu/agendum/ui/CompletedTaskCard.java new file mode 100644 index 000000000000..c2e147d9b42d --- /dev/null +++ b/src/main/java/seedu/agendum/ui/CompletedTaskCard.java @@ -0,0 +1,56 @@ +package seedu.agendum.ui; + +import javafx.fxml.FXML; +import javafx.scene.Node; +import javafx.scene.control.Label; +import javafx.scene.layout.HBox; +import seedu.agendum.model.task.ReadOnlyTask; + +public class CompletedTaskCard extends UiPart { + + private static final String FXML = "CompletedTaskCard.fxml"; + + @FXML + private HBox cardPane; + @FXML + private Label name; + @FXML + private Label id; + @FXML + private Label tags; + + private ReadOnlyTask task; + private int displayedIndex; + + public CompletedTaskCard(){ + + } + + public static CompletedTaskCard load(ReadOnlyTask task, int displayedIndex){ + CompletedTaskCard card = new CompletedTaskCard(); + card.task = task; + card.displayedIndex = displayedIndex; + return UiPartLoader.loadUiPart(card); + } + + @FXML + public void initialize() { + name.setText(task.getName().fullName); + id.setText(displayedIndex + ". "); + tags.setText(task.tagsString()); + } + + public HBox getLayout() { + return cardPane; + } + + @Override + public void setNode(Node node) { + cardPane = (HBox)node; + } + + @Override + public String getFxmlPath() { + return FXML; + } +} diff --git a/src/main/java/seedu/agendum/ui/CompletedTasksPanel.java b/src/main/java/seedu/agendum/ui/CompletedTasksPanel.java new file mode 100644 index 000000000000..478f5ba68676 --- /dev/null +++ b/src/main/java/seedu/agendum/ui/CompletedTasksPanel.java @@ -0,0 +1,106 @@ +package seedu.agendum.ui; + +import java.util.logging.Logger; + +import javafx.application.Platform; +import javafx.collections.ObservableList; +import javafx.fxml.FXML; +import javafx.scene.Node; +import javafx.scene.control.ListCell; +import javafx.scene.control.ListView; +import javafx.scene.control.SplitPane; +import javafx.scene.layout.AnchorPane; +import javafx.stage.Stage; +import seedu.agendum.commons.events.ui.TaskPanelSelectionChangedEvent; +import seedu.agendum.model.task.ReadOnlyTask; +import seedu.agendum.commons.core.LogsCenter; + +/** + * Panel contains the list of completed tasks + */ +public class CompletedTasksPanel extends UiPart { + private final Logger logger = LogsCenter.getLogger(CompletedTasksPanel.class); + private static final String FXML = "CompletedTasksPanel.fxml"; + private AnchorPane panel; + private AnchorPane placeHolderPane; + + @FXML + private ListView completedTasksListView; + + public CompletedTasksPanel() { + super(); + } + + @Override + public void setNode(Node node) { + panel = (AnchorPane) node; + } + + @Override + public String getFxmlPath() { + return FXML; + } + + @Override + public void setPlaceholder(AnchorPane pane) { + this.placeHolderPane = pane; + } + + public static CompletedTasksPanel load(Stage primaryStage, AnchorPane CompletedTasksPlaceholder, + ObservableList taskList) { + CompletedTasksPanel completedTasksPanel = UiPartLoader.loadUiPart(primaryStage, CompletedTasksPlaceholder, new CompletedTasksPanel()); + completedTasksPanel.configure(taskList); + return completedTasksPanel; + } + + private void configure(ObservableList completedTasks) { + setConnections(completedTasks); + addToPlaceholder(); + } + + private void setConnections(ObservableList completedTasks) { + completedTasksListView.setItems(completedTasks); + completedTasksListView.setCellFactory(listView -> new completedTasksListViewCell()); + setEventHandlerForSelectionChangeEvent(); + } + + private void addToPlaceholder() { + SplitPane.setResizableWithParent(placeHolderPane, false); + placeHolderPane.getChildren().add(panel); + } + + private void setEventHandlerForSelectionChangeEvent() { + completedTasksListView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> { + if (newValue != null) { + logger.fine("Selection in task list panel changed to : '" + newValue + "'"); + raise(new TaskPanelSelectionChangedEvent(newValue)); + } + }); + } + + public void scrollTo(int index) { + Platform.runLater(() -> { + completedTasksListView.scrollTo(index); + completedTasksListView.getSelectionModel().clearAndSelect(index); + }); + } + + class completedTasksListViewCell extends ListCell { + + public completedTasksListViewCell() { + } + + @Override + protected void updateItem(ReadOnlyTask task, boolean empty) { + super.updateItem(task, empty); + + if (empty || task == null) { + setGraphic(null); + setText(null); + } else { + setGraphic(CompletedTaskCard.load(task, getIndex() + 1).getLayout()); + } + } + } + +} diff --git a/src/main/java/seedu/agendum/ui/MainWindow.java b/src/main/java/seedu/agendum/ui/MainWindow.java index c6b83a2a5c86..a10f18207cb1 100644 --- a/src/main/java/seedu/agendum/ui/MainWindow.java +++ b/src/main/java/seedu/agendum/ui/MainWindow.java @@ -30,8 +30,9 @@ public class MainWindow extends UiPart { // Independent Ui parts residing in this Ui container private BrowserPanel browserPanel; - private TaskListPanel taskListPanel; - private ResultDisplay resultDisplay; + private UpcomingTasksPanel upcomingTasksPanel; + private CompletedTasksPanel completedTasksPanel; + private ResultPopUp resultPopUp; private StatusBarFooter statusBarFooter; private CommandBox commandBox; private Config config; @@ -53,15 +54,14 @@ public class MainWindow extends UiPart { private MenuItem helpMenuItem; @FXML - private AnchorPane taskListPanelPlaceholder; - + private AnchorPane upcomingTasksPlaceHolder; + @FXML - private AnchorPane resultDisplayPlaceholder; - + private AnchorPane completedTasksPlaceHolder; + @FXML private AnchorPane statusbarPlaceholder; - public MainWindow() { super(); } @@ -109,10 +109,11 @@ private void setAccelerators() { void fillInnerParts() { browserPanel = BrowserPanel.load(browserPlaceholder); - taskListPanel = TaskListPanel.load(primaryStage, getTaskListPlaceholder(), logic.getFilteredTaskList()); - resultDisplay = ResultDisplay.load(primaryStage, getResultDisplayPlaceholder()); + upcomingTasksPanel = UpcomingTasksPanel.load(primaryStage, getUpcomingTasksPlaceHolder(), logic.getFilteredTaskList()); + completedTasksPanel = CompletedTasksPanel.load(primaryStage, getCompletedTasksPlaceHolder(), logic.getCompletedTaskList()); + resultPopUp = ResultPopUp.load(primaryStage); statusBarFooter = StatusBarFooter.load(primaryStage, getStatusbarPlaceholder(), config.getToDoListFilePath()); - commandBox = CommandBox.load(primaryStage, getCommandBoxPlaceholder(), resultDisplay, logic); + commandBox = CommandBox.load(primaryStage, getCommandBoxPlaceholder(), resultPopUp, logic); } private AnchorPane getCommandBoxPlaceholder() { @@ -122,13 +123,13 @@ private AnchorPane getCommandBoxPlaceholder() { private AnchorPane getStatusbarPlaceholder() { return statusbarPlaceholder; } - - private AnchorPane getResultDisplayPlaceholder() { - return resultDisplayPlaceholder; + + public AnchorPane getUpcomingTasksPlaceHolder() { + return upcomingTasksPlaceHolder; } - - public AnchorPane getTaskListPlaceholder() { - return taskListPanelPlaceholder; + + public AnchorPane getCompletedTasksPlaceHolder() { + return completedTasksPlaceHolder; } public void hide() { @@ -182,8 +183,12 @@ private void handleExit() { raise(new ExitAppRequestEvent()); } - public TaskListPanel getTaskListPanel() { - return this.taskListPanel; + public UpcomingTasksPanel getUpcomingTasksPanel() { + return this.upcomingTasksPanel; + } + + public CompletedTasksPanel getCompletedTasksPanel() { + return this.completedTasksPanel; } public void loadTaskPage(ReadOnlyTask task) { diff --git a/src/main/java/seedu/agendum/ui/ResultPopUp.java b/src/main/java/seedu/agendum/ui/ResultPopUp.java new file mode 100644 index 000000000000..217e4115bdd2 --- /dev/null +++ b/src/main/java/seedu/agendum/ui/ResultPopUp.java @@ -0,0 +1,91 @@ +package seedu.agendum.ui; + +import javafx.animation.PauseTransition; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; +import javafx.fxml.FXML; +import javafx.scene.Node; +import javafx.scene.Scene; +import javafx.scene.control.TextArea; +import javafx.scene.layout.AnchorPane; +import javafx.scene.paint.Color; +import javafx.stage.Stage; +import javafx.stage.StageStyle; +import javafx.util.Duration; +import seedu.agendum.commons.core.LogsCenter; + +import java.util.logging.Logger; + +/** + * Pop up window to show command execution result + */ +public class ResultPopUp extends UiPart { + private static final Logger logger = LogsCenter.getLogger(ResultPopUp.class); + private static final String FXML = "ResultPopUp.fxml"; + public static final int HEIGHT = 150; + public static final int WIDTH = 200; + private final StringProperty displayed = new SimpleStringProperty(""); + + private AnchorPane mainPane; + + private Stage dialogStage; + private static Stage root; + + @FXML + private TextArea resultTextArea; + + public static ResultPopUp load(Stage primaryStage) { + logger.fine("Showing command execution result."); + root = primaryStage; + ResultPopUp resultPopUp = UiPartLoader.loadUiPart(primaryStage, new ResultPopUp()); + resultPopUp.configure(); + return resultPopUp; + } + + private void setWindowMinSize() { + dialogStage.setHeight(HEIGHT); + dialogStage.setWidth(WIDTH); + } + + @Override + public void setNode(Node node) { + mainPane = (AnchorPane) node; + } + + @Override + public String getFxmlPath() { + return FXML; + } + + private void configure(){ + + Scene scene = new Scene(mainPane); + dialogStage = createDialogStage(null, null, scene); + dialogStage.setMaximized(false); + setWindowMinSize(); + + scene.setFill(Color.TRANSPARENT); + dialogStage.initStyle(StageStyle.TRANSPARENT); + } + + public void postMessage(String message) { + displayed.setValue(message); + resultTextArea.setText(message); + show(); + + PauseTransition delay = new PauseTransition(Duration.seconds(2)); + delay.setOnFinished( event -> reFocusRoot()); + delay.play(); + } + + public void reFocusRoot() { + dialogStage.setOpacity(0); + root.requestFocus(); + } + + public void show() { + dialogStage.requestFocus(); + dialogStage.setOpacity(1.0); + dialogStage.show(); + } +} diff --git a/src/main/java/seedu/agendum/ui/TaskCard.java b/src/main/java/seedu/agendum/ui/TaskCard.java index 75257ee2f795..9b320a2c7c02 100644 --- a/src/main/java/seedu/agendum/ui/TaskCard.java +++ b/src/main/java/seedu/agendum/ui/TaskCard.java @@ -38,6 +38,11 @@ public void initialize() { name.setText(task.getName().fullName); id.setText(displayedIndex + ". "); tags.setText(task.tagsString()); + if (task.isCompleted()) { + cardPane.setStyle("-fx-background-color: aquamarine"); + } else { + cardPane.setStyle("-fx-background-color: salmon"); + } } public HBox getLayout() { diff --git a/src/main/java/seedu/agendum/ui/UiManager.java b/src/main/java/seedu/agendum/ui/UiManager.java index 76c9de3034e4..34c420a61c72 100644 --- a/src/main/java/seedu/agendum/ui/UiManager.java +++ b/src/main/java/seedu/agendum/ui/UiManager.java @@ -114,7 +114,8 @@ private void handleShowHelpEvent(ShowHelpRequestEvent event) { @Subscribe private void handleJumpToListRequestEvent(JumpToListRequestEvent event) { logger.info(LogsCenter.getEventHandlingLogMessage(event)); - mainWindow.getTaskListPanel().scrollTo(event.targetIndex); +// mainWindow.getTaskListPanel().scrollTo(event.targetIndex); + mainWindow.getUpcomingTasksPanel().scrollTo(event.targetIndex); } @Subscribe diff --git a/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java b/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java new file mode 100644 index 000000000000..972ca1d31127 --- /dev/null +++ b/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java @@ -0,0 +1,83 @@ +package seedu.agendum.ui; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Optional; + +import javafx.fxml.FXML; +import javafx.scene.Node; +import javafx.scene.control.Label; +import javafx.scene.layout.HBox; +import seedu.agendum.model.task.ReadOnlyTask; + +public class UpcomingTaskCard extends UiPart { + + private static final String FXML = "UpcomingTaskCard.fxml"; + + @FXML + private HBox cardPane; + @FXML + private Label name; + @FXML + private Label id; + @FXML + private Label tags; + @FXML + private Label time; + + private ReadOnlyTask task; + private int displayedIndex; + + public UpcomingTaskCard(){ + + } + + public static UpcomingTaskCard load(ReadOnlyTask task, int displayedIndex){ + UpcomingTaskCard card = new UpcomingTaskCard(); + card.task = task; + card.displayedIndex = displayedIndex; + return UiPartLoader.loadUiPart(card); + } + + @FXML + public void initialize() { + name.setText(task.getName().fullName); + id.setText(displayedIndex + ". "); + time.setText(formatTime()); + tags.setText(task.tagsString()); + } + + public String formatTime() { + StringBuilder sb = new StringBuilder(); + Optional start = task.getStartDateTime(); + Optional end = task.getStartDateTime(); + + DateTimeFormatter startFormat = DateTimeFormatter.ofPattern("EEE, dd MMM"); + + if(start.isPresent() && end.isPresent()) { // Have both start time and end time + sb.append("from ").append(start.get().format(startFormat)).append(" to ").append(end.get().format(startFormat)); + } else if (end.isPresent()) { // No start time + sb.append("by ").append(end.get().format(startFormat)); + } else if (start.isPresent()) { // No end time + sb.append("from ").append(start.get().format(startFormat)); + } else { // Both are null + sb.append(""); + } + + return sb.toString(); + } + + public HBox getLayout() { + return cardPane; + } + + @Override + public void setNode(Node node) { + cardPane = (HBox)node; + } + + @Override + public String getFxmlPath() { + return FXML; + } +} diff --git a/src/main/java/seedu/agendum/ui/UpcomingTasksPanel.java b/src/main/java/seedu/agendum/ui/UpcomingTasksPanel.java new file mode 100644 index 000000000000..b4004f4aa73d --- /dev/null +++ b/src/main/java/seedu/agendum/ui/UpcomingTasksPanel.java @@ -0,0 +1,106 @@ +package seedu.agendum.ui; + +import java.util.logging.Logger; + +import javafx.application.Platform; +import javafx.collections.ObservableList; +import javafx.fxml.FXML; +import javafx.scene.Node; +import javafx.scene.control.ListCell; +import javafx.scene.control.ListView; +import javafx.scene.control.SplitPane; +import javafx.scene.layout.AnchorPane; +import javafx.stage.Stage; +import seedu.agendum.commons.events.ui.TaskPanelSelectionChangedEvent; +import seedu.agendum.model.task.ReadOnlyTask; +import seedu.agendum.commons.core.LogsCenter; + +/** + * Panel contains the list of upcoming tasks + */ +public class UpcomingTasksPanel extends UiPart { + private final Logger logger = LogsCenter.getLogger(UpcomingTasksPanel.class); + private static final String FXML = "UpcomingTasksPanel.fxml"; + private AnchorPane panel; + private AnchorPane placeHolderPane; + + @FXML + private ListView upcomingTasksListView; + + public UpcomingTasksPanel() { + super(); + } + + @Override + public void setNode(Node node) { + panel = (AnchorPane) node; + } + + @Override + public String getFxmlPath() { + return FXML; + } + + @Override + public void setPlaceholder(AnchorPane pane) { + this.placeHolderPane = pane; + } + + public static UpcomingTasksPanel load(Stage primaryStage, AnchorPane UpcomingTasksPlaceholder, + ObservableList taskList) { + UpcomingTasksPanel upcomingTasksPanel = UiPartLoader.loadUiPart(primaryStage, UpcomingTasksPlaceholder, new UpcomingTasksPanel()); + upcomingTasksPanel.configure(taskList); + return upcomingTasksPanel; + } + + private void configure(ObservableList upcomingTasks) { + setConnections(upcomingTasks); + addToPlaceholder(); + } + + private void setConnections(ObservableList upcomingTasks) { + upcomingTasksListView.setItems(upcomingTasks); + upcomingTasksListView.setCellFactory(listView -> new upcomingTasksListViewCell()); + setEventHandlerForSelectionChangeEvent(); + } + + private void addToPlaceholder() { + SplitPane.setResizableWithParent(placeHolderPane, false); + placeHolderPane.getChildren().add(panel); + } + + private void setEventHandlerForSelectionChangeEvent() { + upcomingTasksListView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> { + if (newValue != null) { + logger.fine("Selection in task list panel changed to : '" + newValue + "'"); + raise(new TaskPanelSelectionChangedEvent(newValue)); + } + }); + } + + public void scrollTo(int index) { + Platform.runLater(() -> { + upcomingTasksListView.scrollTo(index); + upcomingTasksListView.getSelectionModel().clearAndSelect(index); + }); + } + + class upcomingTasksListViewCell extends ListCell { + + public upcomingTasksListViewCell() { + } + + @Override + protected void updateItem(ReadOnlyTask task, boolean empty) { + super.updateItem(task, empty); + + if (empty || task == null) { + setGraphic(null); + setText(null); + } else { + setGraphic(UpcomingTaskCard.load(task, getIndex() + 1).getLayout()); + } + } + } + +} diff --git a/src/main/resources/view/CompletedTaskCard.fxml b/src/main/resources/view/CompletedTaskCard.fxml new file mode 100644 index 000000000000..92f7584f7e00 --- /dev/null +++ b/src/main/resources/view/CompletedTaskCard.fxml @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/main/resources/view/CompletedTasksPanel.fxml b/src/main/resources/view/CompletedTasksPanel.fxml new file mode 100644 index 000000000000..0f076ef72fa2 --- /dev/null +++ b/src/main/resources/view/CompletedTasksPanel.fxml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/view/DarkTheme.css b/src/main/resources/view/DarkTheme.css index 0d3593de87f1..b5e3d8cfa63a 100644 --- a/src/main/resources/view/DarkTheme.css +++ b/src/main/resources/view/DarkTheme.css @@ -2,27 +2,6 @@ -fx-background-color: derive(#1d1d1d, 20%); } -.label { - -fx-font-size: 11pt; - -fx-font-family: "Segoe UI Semibold"; - -fx-text-fill: #555555; - -fx-opacity: 0.9; -} - -.label-bright { - -fx-font-size: 11pt; - -fx-font-family: "Segoe UI Semibold"; - -fx-text-fill: white; - -fx-opacity: 1; -} - -.label-header { - -fx-font-size: 32pt; - -fx-font-family: "Segoe UI Light"; - -fx-text-fill: white; - -fx-opacity: 1; -} - .text-field { -fx-font-size: 12pt; -fx-font-family: "Segoe UI Semibold"; @@ -63,7 +42,7 @@ -fx-border-insets: 0 10 1 0; } -.table-view .column-header .label { +.table-view .column-header { -fx-font-size: 20pt; -fx-font-family: "Segoe UI Light"; -fx-text-fill: white; @@ -86,26 +65,6 @@ -fx-background-color: derive(#1d1d1d, 20%); } -.list-cell { - -fx-label-padding: 0 0 0 0; - -fx-graphic-text-gap : 0; - -fx-padding: 0 0 0 0; -} - -.list-cell .label { - -fx-text-fill: #010504; -} - -.cell_big_label { - -fx-font-size: 16px; - -fx-text-fill: #010504; -} - -.cell_small_label { - -fx-font-size: 11px; - -fx-text-fill: #010504; -} - .anchor-pane { -fx-background-color: derive(#1d1d1d, 20%); } @@ -125,7 +84,7 @@ -fx-background-color: #ffffff; } -.result-display .label { +.result-display { -fx-text-fill: black !important; } @@ -275,7 +234,7 @@ #cardPane { -fx-background-color: transparent; -fx-border-color: #d6d6d6; - -fx-border-width: 1 1 1 1; + -fx-border-width: 0 0 0 0; } #commandTypeLabel { diff --git a/src/main/resources/view/MainWindow.fxml b/src/main/resources/view/MainWindow.fxml index 79d4181c0333..5c1bcd81e7cf 100644 --- a/src/main/resources/view/MainWindow.fxml +++ b/src/main/resources/view/MainWindow.fxml @@ -1,10 +1,15 @@ - - - - + + + + + + + + + @@ -24,29 +29,32 @@ - + - + - - - - - - + - + - + - + + + + + + + + + - + - + diff --git a/src/main/resources/view/ResultPopUp.css b/src/main/resources/view/ResultPopUp.css new file mode 100644 index 000000000000..094f2ba4f062 --- /dev/null +++ b/src/main/resources/view/ResultPopUp.css @@ -0,0 +1,31 @@ +.pane { + -fx-background-color: transparent; + -fx-padding: 10px; +} + +.hbox { + -fx-background-color: rgb(229,74,63); + -fx-background-radius: 20; +} + +.text-area { + -fx-font-size: 18px; + -fx-background-color: transparent; + -fx-text-fill: white; +} + +.text-area .scroll-pane { + -fx-background-color: transparent; +} + +.text-area .scroll-pane .viewport{ + -fx-background-color: transparent; +} + +.text-area .scroll-pane .content{ + -fx-background-color: transparent; +} + +.text-area *.text { + -fx-text-alignment: center; +} \ No newline at end of file diff --git a/src/main/resources/view/ResultPopUp.fxml b/src/main/resources/view/ResultPopUp.fxml new file mode 100644 index 000000000000..e569df5759e0 --- /dev/null +++ b/src/main/resources/view/ResultPopUp.fxml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + diff --git a/src/main/resources/view/TaskListCard.fxml b/src/main/resources/view/TaskListCard.fxml deleted file mode 100644 index d126739601ae..000000000000 --- a/src/main/resources/view/TaskListCard.fxml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/resources/view/TasksPanel.css b/src/main/resources/view/TasksPanel.css new file mode 100644 index 000000000000..cd4947db54dc --- /dev/null +++ b/src/main/resources/view/TasksPanel.css @@ -0,0 +1,59 @@ +.upcoming-pane { + -fx-background-color: #F39C12; + -fx-background-radius: 10; +} + +.completed-pane { + -fx-background-color: #03C9A9; + -fx-background-radius: 10; +} + +.list-view { + -fx-background-color: transparent; + -fx-background-radius: 10; + -fx-background-insets: 0; +} + +.list-cell { + -fx-background-radius: 10; + -fx-background-color: rgba(255,255,255,0.6); +} + +.list-cell:filled { + -fx-background-insets: 3; +} + +.list-cell:empty { + -fx-background-color: transparent; +} + +.list-cell:filled:hover { + -fx-background-color: #00BCD4; + -fx-text-fill: white; +} + +.cell_big_label { + -fx-font-size: 16pt; + -fx-text-fill: #555555; + -fx-opacity: 0.9; +} + +.cell_small_label { + -fx-font-size: 11pt; + -fx-text-fill: #555555; + -fx-opacity: 0.9; +} + +.cell_time_label { + -fx-text-fill: #5284f2; + -fx-font-family: "Segoe UI Light"; + -fx-opacity: 0.9; +} + +.hbox { + -fx-background-radius: 10; +} + +.vbox { + -fx-background-color: transparent; +} \ No newline at end of file diff --git a/src/main/resources/view/UpcomingTaskCard.fxml b/src/main/resources/view/UpcomingTaskCard.fxml new file mode 100644 index 000000000000..a7f1b82c5d9e --- /dev/null +++ b/src/main/resources/view/UpcomingTaskCard.fxml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/view/UpcomingTasksPanel.css b/src/main/resources/view/UpcomingTasksPanel.css new file mode 100644 index 000000000000..138c27c1dc54 --- /dev/null +++ b/src/main/resources/view/UpcomingTasksPanel.css @@ -0,0 +1,44 @@ +.pane { + -fx-background-color: #F39C12; + -fx-background-radius: 10; +} + +.list-view { + -fx-background-color: transparent; + -fx-background-radius: 10; + -fx-background-insets: 0; +} + +.list-cell { + -fx-background-radius: 10; + -fx-background-color: rgba(255,255,255,0.6); +} + +.list-cell:filled { + -fx-background-insets: 3; +} + +.list-cell:empty { + -fx-background-color: transparent; +} + +.list-cell:filled:hover { + -fx-background-color: #00BCD4; + -fx-text-fill: white; +} + +.list-cell .label { + -fx-font-size: 16px; +} + +.cell_big_label { + -fx-font-size: 16px; +} + +.cell_small_label { + -fx-font-size: 11px; +} + +.hbox { + -fx-background-radius: 10; +} \ No newline at end of file diff --git a/src/main/resources/view/UpcomingTasksPanel.fxml b/src/main/resources/view/UpcomingTasksPanel.fxml new file mode 100644 index 000000000000..2524c8edd0d4 --- /dev/null +++ b/src/main/resources/view/UpcomingTasksPanel.fxml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/java/guitests/guihandles/ResultDisplayHandle.java b/src/test/java/guitests/guihandles/ResultDisplayHandle.java index 4da0bb3b097b..2e298cc7f3ac 100644 --- a/src/test/java/guitests/guihandles/ResultDisplayHandle.java +++ b/src/test/java/guitests/guihandles/ResultDisplayHandle.java @@ -10,7 +10,7 @@ */ public class ResultDisplayHandle extends GuiHandle { - public static final String RESULT_DISPLAY_ID = "#resultDisplay"; + public static final String RESULT_DISPLAY_ID = "#resultTextArea"; public ResultDisplayHandle(GuiRobot guiRobot, Stage primaryStage) { super(guiRobot, primaryStage, TestApp.APP_TITLE); diff --git a/src/test/java/guitests/guihandles/TaskListPanelHandle.java b/src/test/java/guitests/guihandles/TaskListPanelHandle.java index fd0c4de92457..246672ace23e 100644 --- a/src/test/java/guitests/guihandles/TaskListPanelHandle.java +++ b/src/test/java/guitests/guihandles/TaskListPanelHandle.java @@ -25,7 +25,7 @@ public class TaskListPanelHandle extends GuiHandle { public static final int NOT_FOUND = -1; public static final String CARD_PANE_ID = "#cardPane"; - private static final String TASK_LIST_VIEW_ID = "#taskListView"; + private static final String TASK_LIST_VIEW_ID = "#upcomingTasksListView"; public TaskListPanelHandle(GuiRobot guiRobot, Stage primaryStage) { super(guiRobot, primaryStage, TestApp.APP_TITLE); From 6587f5c0484a7cab3a5efea2ade80bf0f5a323c7 Mon Sep 17 00:00:00 2001 From: Vishnu Prem Date: Tue, 11 Oct 2016 13:26:04 +0800 Subject: [PATCH 2/8] Update gradle file --- build.gradle | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index 46b06c1e42ec..c2ec6ace4e60 100644 --- a/build.gradle +++ b/build.gradle @@ -74,10 +74,10 @@ allprojects { } shadowJar { - archiveName = "addressbook.jar" + archiveName = "agendum.jar" manifest { - attributes "Main-Class": "seedu.address.MainApp" + attributes "Main-Class": "seedu.agendum.MainApp" } destinationDir = file("${buildDir}/jar/") @@ -113,8 +113,8 @@ tasks.coveralls { onlyIf { System.env.'CI' } } -class AddressBookTest extends Test { - public AddressBookTest() { +class AgendumTest extends Test { + public AgendumTest() { forkEvery = 1 systemProperty 'testfx.setup.timeout', '60000' } @@ -128,7 +128,7 @@ class AddressBookTest extends Test { } } -task guiTests(type: AddressBookTest) { +task guiTests(type: AgendumTest) { include 'guitests/**' jacoco { @@ -137,8 +137,8 @@ task guiTests(type: AddressBookTest) { } -task nonGuiTests(type: AddressBookTest) { - include 'seedu/address/**' +task nonGuiTests(type: AgendumTest) { + include 'seedu/agendum/**' jacoco { destinationFile = new File("${buildDir}/jacoco/test.exec") @@ -146,7 +146,7 @@ task nonGuiTests(type: AddressBookTest) { } // Test mode depends on whether headless task has been run -task allTests(type: AddressBookTest) { +task allTests(type: AgendumTest) { jacoco { destinationFile = new File("${buildDir}/jacoco/test.exec") } From 7082dd50a963d689e4558687d72e4467352ff96f Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Wed, 12 Oct 2016 00:15:41 +0800 Subject: [PATCH 3/8] Change icon to agendum --- src/main/java/seedu/agendum/ui/MainWindow.java | 2 +- src/main/java/seedu/agendum/ui/UiManager.java | 2 +- src/main/resources/images/address_book_32.png | Bin 4214 -> 0 bytes src/main/resources/images/agendum_icon.png | Bin 0 -> 41343 bytes 4 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 src/main/resources/images/address_book_32.png create mode 100644 src/main/resources/images/agendum_icon.png diff --git a/src/main/java/seedu/agendum/ui/MainWindow.java b/src/main/java/seedu/agendum/ui/MainWindow.java index a10f18207cb1..c883d1023ffd 100644 --- a/src/main/java/seedu/agendum/ui/MainWindow.java +++ b/src/main/java/seedu/agendum/ui/MainWindow.java @@ -21,7 +21,7 @@ */ public class MainWindow extends UiPart { - private static final String ICON = "/images/address_book_32.png"; + private static final String ICON = "/images/agendum_icon.png"; private static final String FXML = "MainWindow.fxml"; public static final int MIN_HEIGHT = 600; public static final int MIN_WIDTH = 450; diff --git a/src/main/java/seedu/agendum/ui/UiManager.java b/src/main/java/seedu/agendum/ui/UiManager.java index 34c420a61c72..6f965d2af91d 100644 --- a/src/main/java/seedu/agendum/ui/UiManager.java +++ b/src/main/java/seedu/agendum/ui/UiManager.java @@ -25,7 +25,7 @@ */ public class UiManager extends ComponentManager implements Ui { private static final Logger logger = LogsCenter.getLogger(UiManager.class); - private static final String ICON_APPLICATION = "/images/address_book_32.png"; + private static final String ICON_APPLICATION = "/images/agendum_icon.png"; private Logic logic; private Config config; diff --git a/src/main/resources/images/address_book_32.png b/src/main/resources/images/address_book_32.png deleted file mode 100644 index 29810cf1fd938e8568946ad28ee0c678564804b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4214 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 diff --git a/src/main/resources/images/agendum_icon.png b/src/main/resources/images/agendum_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..41941a11f5e123e7ee77186faafdcf48959ee68b GIT binary patch literal 41343 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 z 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 literal 0 HcmV?d00001 From 551dcf698a2a1ba7f07877d05aa5d0c44264261d Mon Sep 17 00:00:00 2001 From: Vishnu Prem Date: Wed, 12 Oct 2016 10:06:09 +0800 Subject: [PATCH 4/8] =?UTF-8?q?Refactor=20UpcomingTaskCard=E2=80=99s=20tim?= =?UTF-8?q?e=20formatting=20method?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../seedu/agendum/ui/UpcomingTaskCard.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java b/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java index 972ca1d31127..dc4126b44574 100644 --- a/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java +++ b/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java @@ -50,19 +50,17 @@ public void initialize() { public String formatTime() { StringBuilder sb = new StringBuilder(); Optional start = task.getStartDateTime(); - Optional end = task.getStartDateTime(); + Optional end = task.getEndDateTime(); DateTimeFormatter startFormat = DateTimeFormatter.ofPattern("EEE, dd MMM"); - if(start.isPresent() && end.isPresent()) { // Have both start time and end time - sb.append("from ").append(start.get().format(startFormat)).append(" to ").append(end.get().format(startFormat)); - } else if (end.isPresent()) { // No start time - sb.append("by ").append(end.get().format(startFormat)); - } else if (start.isPresent()) { // No end time - sb.append("from ").append(start.get().format(startFormat)); - } else { // Both are null - sb.append(""); - } + if(start.isPresent()) { + sb.append("from ").append(start.get().format(startFormat)); + } + if(end.isPresent()) { + sb.append(sb.length()>0 ? " to " : "by "); + sb.append(end.get().format(startFormat)); + } return sb.toString(); } From bf33fd8a5302537721857ebc301e689f979151ce Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Wed, 12 Oct 2016 16:40:45 +0800 Subject: [PATCH 5/8] Change keyboard shortcut of helpwindow --- src/main/java/seedu/agendum/ui/MainWindow.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/agendum/ui/MainWindow.java b/src/main/java/seedu/agendum/ui/MainWindow.java index c883d1023ffd..915f08e598ff 100644 --- a/src/main/java/seedu/agendum/ui/MainWindow.java +++ b/src/main/java/seedu/agendum/ui/MainWindow.java @@ -3,7 +3,10 @@ import javafx.fxml.FXML; import javafx.scene.Node; import javafx.scene.Scene; +import javafx.scene.control.Menu; import javafx.scene.control.MenuItem; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; import javafx.scene.input.KeyCombination; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.VBox; @@ -104,7 +107,7 @@ private void configure(String appTitle, String toDoListName, Config config, User } private void setAccelerators() { - helpMenuItem.setAccelerator(KeyCombination.valueOf("F1")); + helpMenuItem.setAccelerator(new KeyCodeCombination(KeyCode.H, KeyCombination.ALT_DOWN)); } void fillInnerParts() { From bee960565e8cf5dfbe0e694ff4ce61058a999f86 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Wed, 12 Oct 2016 16:41:06 +0800 Subject: [PATCH 6/8] Update helpWindow gui tests --- src/test/java/guitests/guihandles/MainMenuHandle.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/test/java/guitests/guihandles/MainMenuHandle.java b/src/test/java/guitests/guihandles/MainMenuHandle.java index eac004292dea..c8c43b30b072 100644 --- a/src/test/java/guitests/guihandles/MainMenuHandle.java +++ b/src/test/java/guitests/guihandles/MainMenuHandle.java @@ -2,6 +2,8 @@ import guitests.GuiRobot; import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; +import javafx.scene.input.KeyCombination; import javafx.stage.Stage; import seedu.agendum.TestApp; @@ -21,17 +23,17 @@ public GuiHandle clickOn(String... menuText) { } public HelpWindowHandle openHelpWindowUsingMenu() { - clickOn("Help", "F1"); + clickOn("Help", "⌥H"); return new HelpWindowHandle(guiRobot, primaryStage); } public HelpWindowHandle openHelpWindowUsingAccelerator() { - useF1Accelerator(); + useAccelerator(); return new HelpWindowHandle(guiRobot, primaryStage); } - private void useF1Accelerator() { - guiRobot.push(KeyCode.F1); + private void useAccelerator() { + guiRobot.push(new KeyCodeCombination(KeyCode.H, KeyCombination.ALT_DOWN)); guiRobot.sleep(500); } } From 0ade408730851a8196d9ae20cfd57a1a7a475a74 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Wed, 12 Oct 2016 17:16:44 +0800 Subject: [PATCH 7/8] Update image path in tests --- src/test/java/seedu/agendum/commons/util/AppUtilTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/seedu/agendum/commons/util/AppUtilTest.java b/src/test/java/seedu/agendum/commons/util/AppUtilTest.java index 10acdabed286..a91617736f92 100644 --- a/src/test/java/seedu/agendum/commons/util/AppUtilTest.java +++ b/src/test/java/seedu/agendum/commons/util/AppUtilTest.java @@ -15,7 +15,7 @@ public class AppUtilTest { @Test public void getImage_exitingImage(){ - assertNotNull(AppUtil.getImage("/images/address_book_32.png")); + assertNotNull(AppUtil.getImage("/images/agendum_icon.png")); } From 0c56cb6d403658f8f2bc684cdfa3b629c01287b2 Mon Sep 17 00:00:00 2001 From: Fan Weiguang Date: Wed, 12 Oct 2016 18:19:41 +0800 Subject: [PATCH 8/8] Add underline to completed tasks --- src/main/java/seedu/agendum/ui/UpcomingTaskCard.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java b/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java index dc4126b44574..e1ca803e80ce 100644 --- a/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java +++ b/src/main/java/seedu/agendum/ui/UpcomingTaskCard.java @@ -41,6 +41,9 @@ public static UpcomingTaskCard load(ReadOnlyTask task, int displayedIndex){ @FXML public void initialize() { + if(task.isCompleted()) { + name.setUnderline(true); + } name.setText(task.getName().fullName); id.setText(displayedIndex + ". "); time.setText(formatTime());