From 364bf53d2c806f464e477c13a0fd667b23666cf9 Mon Sep 17 00:00:00 2001 From: Miguel Ribeiro Date: Sun, 26 Apr 2020 14:07:29 +0100 Subject: [PATCH 1/5] Task list UI changed for, probably, final --- Timetracker/Base.lproj/Main.storyboard | 123 +++++++++++-------------- 1 file changed, 55 insertions(+), 68 deletions(-) diff --git a/Timetracker/Base.lproj/Main.storyboard b/Timetracker/Base.lproj/Main.storyboard index 2afc16da0..203179083 100644 --- a/Timetracker/Base.lproj/Main.storyboard +++ b/Timetracker/Base.lproj/Main.storyboard @@ -391,18 +391,18 @@ - - + + - + - + - + @@ -426,7 +426,7 @@ - + @@ -463,7 +463,7 @@ - + @@ -495,7 +495,7 @@ - + @@ -527,7 +527,7 @@ - + @@ -559,7 +559,7 @@ - + @@ -589,9 +589,9 @@ - + - + @@ -604,7 +604,7 @@ - + @@ -617,13 +617,13 @@ - + - + - + @@ -642,7 +642,7 @@ - + - - - - - - - - - - - - - - + @@ -681,32 +668,32 @@ - - - + + + - - - - - - - - - - - + - + @@ -725,27 +712,27 @@ - + + - - - + + + - - + + + - + - - + - @@ -755,7 +742,7 @@ - + @@ -932,7 +919,7 @@ Gw - + @@ -982,7 +969,7 @@ Gw - + @@ -1038,7 +1025,7 @@ Gw - + From 456bb031c6add472de8cfb175d585f0417fb1b37 Mon Sep 17 00:00:00 2001 From: Miguel Ribeiro Date: Wed, 29 Apr 2020 09:14:23 +0100 Subject: [PATCH 2/5] Task list screen revamp Added SwiftDate dependency to help managing dates. TaskListWindowController manages the toolbar. --- Timetracker.xcodeproj/project.pbxproj | 21 +++ Timetracker/Base.lproj/Main.storyboard | 184 ++++++++++++--------- Timetracker/TaskListViewController.swift | 91 ++++++++-- Timetracker/TaskListWindowController.swift | 25 +++ 4 files changed, 228 insertions(+), 93 deletions(-) create mode 100644 Timetracker/TaskListWindowController.swift diff --git a/Timetracker.xcodeproj/project.pbxproj b/Timetracker.xcodeproj/project.pbxproj index b181649f9..82c71e1a9 100644 --- a/Timetracker.xcodeproj/project.pbxproj +++ b/Timetracker.xcodeproj/project.pbxproj @@ -19,6 +19,7 @@ E65EF088224E85F50023A7B5 /* LogManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = E65EF087224E85F50023A7B5 /* LogManager.swift */; }; E662723B1CD8E84300B50E38 /* TabSeparatedValuesExporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = E662723A1CD8E84300B50E38 /* TabSeparatedValuesExporter.swift */; }; E67203D92446174300AFCF31 /* Collection+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = E67203D82446174300AFCF31 /* Collection+Utils.swift */; }; + E677696D2458816B00E1F3EB /* SwiftDate in Frameworks */ = {isa = PBXBuildFile; productRef = E677696C2458816B00E1F3EB /* SwiftDate */; }; E677EC1C2449E0730038CD52 /* exportOptions.plist in Resources */ = {isa = PBXBuildFile; fileRef = E677EC1B2449E0730038CD52 /* exportOptions.plist */; }; E6910F3E1CCE5CFF003CBA90 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6910F3D1CCE5CFF003CBA90 /* AppDelegate.swift */; }; E6910F401CCE5CFF003CBA90 /* TaskRunnerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6910F3F1CCE5CFF003CBA90 /* TaskRunnerViewController.swift */; }; @@ -50,6 +51,7 @@ E6E9E5C524485F3B000D7D65 /* TextDisplayerView.xib in Resources */ = {isa = PBXBuildFile; fileRef = E6E9E5C424485F3B000D7D65 /* TextDisplayerView.xib */; }; E6E9E5C724486009000D7D65 /* TextDisplayerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6E9E5C624486009000D7D65 /* TextDisplayerViewController.swift */; }; E6ECC1D4223D9B3000BBCD91 /* Timer+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6ECC1D3223D9B3000BBCD91 /* Timer+Utils.swift */; }; + E6F5736E2458CA43005A00F1 /* TaskListWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6F5736D2458CA43005A00F1 /* TaskListWindowController.swift */; }; E6F62FA524439EA900A9C8C9 /* PreferenceAboutView.xib in Resources */ = {isa = PBXBuildFile; fileRef = E6F62FA424439EA900A9C8C9 /* PreferenceAboutView.xib */; }; E6F62FA724439EE700A9C8C9 /* PreferenceAboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6F62FA624439EE700A9C8C9 /* PreferenceAboutViewController.swift */; }; E6F788D522579BA000AE3DF3 /* PreferenceLogView.xib in Resources */ = {isa = PBXBuildFile; fileRef = E6F788D422579BA000AE3DF3 /* PreferenceLogView.xib */; }; @@ -118,6 +120,7 @@ E6E9E5C424485F3B000D7D65 /* TextDisplayerView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TextDisplayerView.xib; sourceTree = ""; }; E6E9E5C624486009000D7D65 /* TextDisplayerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextDisplayerViewController.swift; sourceTree = ""; }; E6ECC1D3223D9B3000BBCD91 /* Timer+Utils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = "Timer+Utils.swift"; path = "Utils/Timer+Utils.swift"; sourceTree = ""; }; + E6F5736D2458CA43005A00F1 /* TaskListWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskListWindowController.swift; sourceTree = ""; }; E6F62FA424439EA900A9C8C9 /* PreferenceAboutView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PreferenceAboutView.xib; sourceTree = ""; }; E6F62FA624439EE700A9C8C9 /* PreferenceAboutViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferenceAboutViewController.swift; sourceTree = ""; }; E6F788D422579BA000AE3DF3 /* PreferenceLogView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PreferenceLogView.xib; sourceTree = ""; }; @@ -137,6 +140,7 @@ files = ( E6E9E5B424472D6C000D7D65 /* Preferences in Frameworks */, E6E9E5B724473C42000D7D65 /* SwiftyBeaver in Frameworks */, + E677696D2458816B00E1F3EB /* SwiftDate in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -270,6 +274,7 @@ E6F62FA624439EE700A9C8C9 /* PreferenceAboutViewController.swift */, E6E9E5B82447BCA0000D7D65 /* CurrentTaskEditorViewController.swift */, E6E9E5C624486009000D7D65 /* TextDisplayerViewController.swift */, + E6F5736D2458CA43005A00F1 /* TaskListWindowController.swift */, ); name = ViewControllers; sourceTree = ""; @@ -336,6 +341,7 @@ packageProductDependencies = ( E6E9E5B324472D6C000D7D65 /* Preferences */, E6E9E5B624473C42000D7D65 /* SwiftyBeaver */, + E677696C2458816B00E1F3EB /* SwiftDate */, ); productName = Timetracker; productReference = E6910F3A1CCE5CFF003CBA90 /* Timetracker.app */; @@ -392,6 +398,7 @@ packageReferences = ( E6E9E5B224472D6C000D7D65 /* XCRemoteSwiftPackageReference "Preferences" */, E6E9E5B524473C42000D7D65 /* XCRemoteSwiftPackageReference "SwiftyBeaver" */, + E677696B2458816B00E1F3EB /* XCRemoteSwiftPackageReference "SwiftDate" */, ); productRefGroup = E6910F3B1CCE5CFF003CBA90 /* Products */; projectDirPath = ""; @@ -468,6 +475,7 @@ E6D964D0223E795200B1C534 /* BuilderManager.swift in Sources */, E6281D2824421A4900CD467C /* PreferenceMiscViewController.swift in Sources */, E6FE83941CDB5D5F00794723 /* NSDate+Utils.swift in Sources */, + E6F5736E2458CA43005A00F1 /* TaskListWindowController.swift in Sources */, E6281D2D24422BD200CD467C /* DockIconManager.swift in Sources */, E6F788D722579BBB00AE3DF3 /* PreferenceLogViewController.swift in Sources */, E6FE83901CDB34C900794723 /* TaskRunnerWindowController.swift in Sources */, @@ -865,6 +873,14 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ + E677696B2458816B00E1F3EB /* XCRemoteSwiftPackageReference "SwiftDate" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/malcommac/SwiftDate.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 6.1.0; + }; + }; E6E9E5B224472D6C000D7D65 /* XCRemoteSwiftPackageReference "Preferences" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/sindresorhus/Preferences"; @@ -884,6 +900,11 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ + E677696C2458816B00E1F3EB /* SwiftDate */ = { + isa = XCSwiftPackageProductDependency; + package = E677696B2458816B00E1F3EB /* XCRemoteSwiftPackageReference "SwiftDate" */; + productName = SwiftDate; + }; E6E9E5B324472D6C000D7D65 /* Preferences */ = { isa = XCSwiftPackageProductDependency; package = E6E9E5B224472D6C000D7D65 /* XCRemoteSwiftPackageReference "Preferences" */; diff --git a/Timetracker/Base.lproj/Main.storyboard b/Timetracker/Base.lproj/Main.storyboard index 203179083..94f5798e2 100644 --- a/Timetracker/Base.lproj/Main.storyboard +++ b/Timetracker/Base.lproj/Main.storyboard @@ -369,40 +369,122 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - + - + - + @@ -654,86 +736,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - + + + + + + - - - - + + - + @@ -742,7 +776,7 @@ - + diff --git a/Timetracker/TaskListViewController.swift b/Timetracker/TaskListViewController.swift index 31b5034f6..3329796fc 100644 --- a/Timetracker/TaskListViewController.swift +++ b/Timetracker/TaskListViewController.swift @@ -8,6 +8,7 @@ import Foundation import Cocoa +import SwiftDate class TaskListViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate, TaskPingReceiver { @@ -21,30 +22,39 @@ class TaskListViewController: NSViewController, NSTableViewDataSource, NSTableVi case accumulated = 6 } + enum TimeSpan: Int { + case day = 0 + case week = 1 + case month = 2 + } + // MARK: - Outlets @IBOutlet var tableView: NSTableView! - @IBOutlet var startDate: NSDatePicker! - @IBOutlet var endDate: NSDatePicker! @IBOutlet var accumulatedTime: NSTextField! + @IBOutlet weak var recordsLabel: NSTextField! // MARK: - Vars and Lets fileprivate var tasks: [Task]? + var contentCorrupted = false + var exported: String? + + var windowController: TaskListWindowController? { + return self.view.window?.windowController as? TaskListWindowController + } // MARK: - ViewController callbacks override func viewWillAppear() { super.viewWillAppear() //tasks = TaskProviderManager.instance.allTasks - startDate.dateValue = Date() - endDate.dateValue = startDate.dateValue + windowController?.startDatePicker.dateValue = Date() tableView.dataSource = self tableView.delegate = self tableView.doubleAction = #selector(tableViewDoubleClick) - filterClicked(nil) + filterTasks() TaskProviderManager.instance.addPingReceiver(self) - } func calculateTime() { @@ -65,12 +75,20 @@ class TaskListViewController: NSViewController, NSTableViewDataSource, NSTableVi } + @IBAction func timeSpanSelectorClicked(_ sender: Any) { + filterTasks() + } + + @IBAction func startDateChanged(_ sender: Any) { + filterTasks() + } + override func viewWillDisappear() { TaskProviderManager.instance.removePingReceiver(self) } func taskStarted() { - filterClicked(self) + filterTasks() } func ping(_ interval: TimeInterval) { @@ -81,7 +99,7 @@ class TaskListViewController: NSViewController, NSTableViewDataSource, NSTableVi } func taskStopped() { - filterClicked(self) + filterTasks() } // MARK: - TableViewDataSource callbacks @@ -254,10 +272,7 @@ class TaskListViewController: NSViewController, NSTableViewDataSource, NSTableVi } - var exported: String? - @IBAction func exportClicked(_ sender: AnyObject) { - guard !self.contentCorrupted else { showError("There are tasks that do not seem to be properly configured. Please check and fix them.") return @@ -270,18 +285,34 @@ class TaskListViewController: NSViewController, NSTableViewDataSource, NSTableVi performSegue(withIdentifier: "show_export", sender: self) } - } - var contentCorrupted = false - @IBAction func filterClicked(_ sender: AnyObject?) { + func filterTasks() { - guard let end = endDate.dateValue.endOfDay else { - L.e("Couldn't get end date") + guard let timespan = self.windowController?.timeSpan, let startDate = self.windowController?.startDate else { return } + + let startAndEndTime = calculateDateRangeWithStartDate(startDate, forTimeSpan: timespan) + + var text: String + + switch timespan { + case .day: + text = "Showing records in \(startAndEndTime.startDate)" + + case .week: + text = "Showing records between \(startAndEndTime.startDate) and \(startAndEndTime.endDate)" + + case .month: + text = "Showing records in \(startAndEndTime.startDate.monthName(.default))" + } + + self.recordsLabel.stringValue = text + self.contentCorrupted = false - self.tasks = TaskProviderManager.instance.getTasksBetween(startDate.dateValue.startOfDay, and: end) + self.tasks = TaskProviderManager.instance.getTasksBetween(startAndEndTime.startDate, + and: startAndEndTime.endDate) self.tableView.reloadData() self.calculateTime() } @@ -295,7 +326,7 @@ class TaskListViewController: NSViewController, NSTableViewDataSource, NSTableVi if let destination = segue.destinationController as? ManualTaskViewController { destination.onDismiss = { - self.filterClicked(nil) + self.filterTasks() } destination.editingTask = self.editingTask return @@ -309,6 +340,30 @@ class TaskListViewController: NSViewController, NSTableViewDataSource, NSTableVi } } } + + private func calculateDateRangeWithStartDate(_ startDate: Date, forTimeSpan timeSpan: TimeSpan) + -> (startDate: Date, endDate: Date) { + + var startOfFilter: Date + var endOfFilter: Date + + switch timeSpan { + case .day: + startOfFilter = startDate.dateAt(.startOfDay) + endOfFilter = startDate.dateAt(.endOfDay) + + case .week: + startOfFilter = startDate.dateAt(.startOfWeek) + endOfFilter = startDate.dateAt(.endOfWeek) + + case .month: + startOfFilter = startDate.dateAt(.startOfMonth) + endOfFilter = startDate.dateAt(.endOfMonth) + } + + return (startOfFilter, endOfFilter) + + } } // Helper function inserted by Swift 4.2 migrator. diff --git a/Timetracker/TaskListWindowController.swift b/Timetracker/TaskListWindowController.swift new file mode 100644 index 000000000..c357e2c16 --- /dev/null +++ b/Timetracker/TaskListWindowController.swift @@ -0,0 +1,25 @@ +// +// TaskListWindowController.swift +// Timetracker +// +// Created by Antonio Ribeiro on 28/04/2020. +// Copyright © 2020 Antonio Ribeiro. All rights reserved. +// + +import Foundation +import AppKit + +class TaskListWindowController: NSWindowController { + + @IBOutlet weak var startDatePicker: NSDatePicker! + @IBOutlet weak var timespanSelector: NSSegmentedControl! + + var startDate: Date { + return startDatePicker.dateValue + } + + var timeSpan: TaskListViewController.TimeSpan? { + return TaskListViewController.TimeSpan(rawValue: self.timespanSelector.selectedSegment) + } + +} From f5279ae3570cc37cf9c6cf9bb9b918331c65d5bd Mon Sep 17 00:00:00 2001 From: Miguel Ribeiro Date: Wed, 29 Apr 2020 12:57:16 +0100 Subject: [PATCH 3/5] Task list polished a bit Big refactor to organize the code --- Timetracker.xcodeproj/project.pbxproj | 126 ++++++++++-------- .../AppDelegate+NSMenuDelegate.swift | 0 .../AppDelegate+TaskPingReceiver.swift | 0 Timetracker/{ => Delegates}/AppDelegate.swift | 0 .../{ => Managers}/DockIconManager.swift | 0 .../CoreDataTaskProvider.swift | 0 .../{ => Providers}/TaskPingReceiver.swift | 0 .../TaskProvider.swift | 0 Timetracker/TaskRunnerWindowController.swift | 14 -- .../{ => Views}/Base.lproj/Main.storyboard | 84 ++++++------ .../CostCentreListController.swift | 0 .../CurrentTaskEditorViewController.swift | 0 Timetracker/{ => Views}/ErrorView.xib | 0 .../{ => Views}/ErrorViewController.swift | 0 .../{ => Views}/ExportViewController.swift | 0 .../ManualTaskViewController.swift | 0 .../Preferences}/PreferenceAboutView.xib | 0 .../PreferenceAboutViewController.swift | 0 .../Preferences}/PreferenceBuilderView.xib | 0 .../PreferenceBuilderViewController.swift | 0 .../Preferences}/PreferenceLogView.xib | 0 .../PreferenceLogViewController.swift | 0 .../Preferences}/PreferenceMiscView.xib | 0 .../PreferenceMiscViewController.swift | 0 ...kListViewController+TaskPingReceiver.swift | 28 ++++ .../TaskList}/TaskListViewController.swift | 27 +--- .../TaskList}/TaskListWindowController.swift | 0 .../TaskRunnerViewController.swift | 0 Timetracker/{ => Views}/TextDisplayerView.xib | 0 .../TextDisplayerViewController.swift | 0 .../.xccurrentversion | 0 .../Timetracker.xcdatamodel/contents | 0 Timetracker/copyright.txt | 1 + 33 files changed, 145 insertions(+), 135 deletions(-) rename Timetracker/{ => Delegates}/AppDelegate+NSMenuDelegate.swift (100%) rename Timetracker/{ => Delegates}/AppDelegate+TaskPingReceiver.swift (100%) rename Timetracker/{ => Delegates}/AppDelegate.swift (100%) rename Timetracker/{ => Managers}/DockIconManager.swift (100%) rename Timetracker/{ => Providers}/CoreDataTaskProvider.swift (100%) rename Timetracker/{ => Providers}/TaskPingReceiver.swift (100%) rename Timetracker/{Provider => Providers}/TaskProvider.swift (100%) delete mode 100644 Timetracker/TaskRunnerWindowController.swift rename Timetracker/{ => Views}/Base.lproj/Main.storyboard (98%) rename Timetracker/{ => Views}/CostCentreListController.swift (100%) rename Timetracker/{ => Views}/CurrentTaskEditorViewController.swift (100%) rename Timetracker/{ => Views}/ErrorView.xib (100%) rename Timetracker/{ => Views}/ErrorViewController.swift (100%) rename Timetracker/{ => Views}/ExportViewController.swift (100%) rename Timetracker/{ => Views}/ManualTaskViewController.swift (100%) rename Timetracker/{ => Views/Preferences}/PreferenceAboutView.xib (100%) rename Timetracker/{ => Views/Preferences}/PreferenceAboutViewController.swift (100%) rename Timetracker/{ => Views/Preferences}/PreferenceBuilderView.xib (100%) rename Timetracker/{ => Views/Preferences}/PreferenceBuilderViewController.swift (100%) rename Timetracker/{ => Views/Preferences}/PreferenceLogView.xib (100%) rename Timetracker/{ => Views/Preferences}/PreferenceLogViewController.swift (100%) rename Timetracker/{ => Views/Preferences}/PreferenceMiscView.xib (100%) rename Timetracker/{ => Views/Preferences}/PreferenceMiscViewController.swift (100%) create mode 100644 Timetracker/Views/TaskList/TaskListViewController+TaskPingReceiver.swift rename Timetracker/{ => Views/TaskList}/TaskListViewController.swift (94%) rename Timetracker/{ => Views/TaskList}/TaskListWindowController.swift (100%) rename Timetracker/{ => Views}/TaskRunnerViewController.swift (100%) rename Timetracker/{ => Views}/TextDisplayerView.xib (100%) rename Timetracker/{ => Views}/TextDisplayerViewController.swift (100%) rename Timetracker/{ => Views}/Timetracker.xcdatamodeld/.xccurrentversion (100%) rename Timetracker/{ => Views}/Timetracker.xcdatamodeld/Timetracker.xcdatamodel/contents (100%) diff --git a/Timetracker.xcodeproj/project.pbxproj b/Timetracker.xcodeproj/project.pbxproj index 82c71e1a9..21d9a51ca 100644 --- a/Timetracker.xcodeproj/project.pbxproj +++ b/Timetracker.xcodeproj/project.pbxproj @@ -52,12 +52,12 @@ E6E9E5C724486009000D7D65 /* TextDisplayerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6E9E5C624486009000D7D65 /* TextDisplayerViewController.swift */; }; E6ECC1D4223D9B3000BBCD91 /* Timer+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6ECC1D3223D9B3000BBCD91 /* Timer+Utils.swift */; }; E6F5736E2458CA43005A00F1 /* TaskListWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6F5736D2458CA43005A00F1 /* TaskListWindowController.swift */; }; + E6F5737024599EC2005A00F1 /* TaskListViewController+TaskPingReceiver.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6F5736F24599EC2005A00F1 /* TaskListViewController+TaskPingReceiver.swift */; }; E6F62FA524439EA900A9C8C9 /* PreferenceAboutView.xib in Resources */ = {isa = PBXBuildFile; fileRef = E6F62FA424439EA900A9C8C9 /* PreferenceAboutView.xib */; }; E6F62FA724439EE700A9C8C9 /* PreferenceAboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6F62FA624439EE700A9C8C9 /* PreferenceAboutViewController.swift */; }; E6F788D522579BA000AE3DF3 /* PreferenceLogView.xib in Resources */ = {isa = PBXBuildFile; fileRef = E6F788D422579BA000AE3DF3 /* PreferenceLogView.xib */; }; E6F788D722579BBB00AE3DF3 /* PreferenceLogViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6F788D622579BBB00AE3DF3 /* PreferenceLogViewController.swift */; }; E6FE838C1CDA5F9300794723 /* ExportViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6FE838B1CDA5F9300794723 /* ExportViewController.swift */; }; - E6FE83901CDB34C900794723 /* TaskRunnerWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6FE838F1CDB34C900794723 /* TaskRunnerWindowController.swift */; }; E6FE83921CDB5D4100794723 /* NSTextView+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6FE83911CDB5D4100794723 /* NSTextView+Utils.swift */; }; E6FE83941CDB5D5F00794723 /* NSDate+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6FE83931CDB5D5F00794723 /* NSDate+Utils.swift */; }; E6FE83961CDB6AF300794723 /* ErrorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6FE83951CDB6AF300794723 /* ErrorViewController.swift */; }; @@ -105,7 +105,7 @@ E6910F661CCE6F1E003CBA90 /* Task.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Task.swift; path = Timetracker/Model/Task.swift; sourceTree = ""; }; E6910F8D1CCF78C0003CBA90 /* CostCentreListController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CostCentreListController.swift; sourceTree = ""; }; E6D680571CD4F5F000C45179 /* NSTimeInterval+Utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "NSTimeInterval+Utils.swift"; path = "Utils/NSTimeInterval+Utils.swift"; sourceTree = ""; }; - E6D6805B1CD4F76B00C45179 /* TaskProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TaskProvider.swift; path = Provider/TaskProvider.swift; sourceTree = ""; }; + E6D6805B1CD4F76B00C45179 /* TaskProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TaskProvider.swift; sourceTree = ""; }; E6D680641CD5018F00C45179 /* TaskListViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TaskListViewController.swift; sourceTree = ""; }; E6D680661CD88CE300C45179 /* ManualTaskViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManualTaskViewController.swift; sourceTree = ""; }; E6D964CD223DB4AC00B1C534 /* PreferenceBuilderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PreferenceBuilderView.xib; sourceTree = ""; }; @@ -121,12 +121,12 @@ E6E9E5C624486009000D7D65 /* TextDisplayerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextDisplayerViewController.swift; sourceTree = ""; }; E6ECC1D3223D9B3000BBCD91 /* Timer+Utils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = "Timer+Utils.swift"; path = "Utils/Timer+Utils.swift"; sourceTree = ""; }; E6F5736D2458CA43005A00F1 /* TaskListWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskListWindowController.swift; sourceTree = ""; }; + E6F5736F24599EC2005A00F1 /* TaskListViewController+TaskPingReceiver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TaskListViewController+TaskPingReceiver.swift"; sourceTree = ""; }; E6F62FA424439EA900A9C8C9 /* PreferenceAboutView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PreferenceAboutView.xib; sourceTree = ""; }; E6F62FA624439EE700A9C8C9 /* PreferenceAboutViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferenceAboutViewController.swift; sourceTree = ""; }; E6F788D422579BA000AE3DF3 /* PreferenceLogView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PreferenceLogView.xib; sourceTree = ""; }; E6F788D622579BBB00AE3DF3 /* PreferenceLogViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferenceLogViewController.swift; sourceTree = ""; }; E6FE838B1CDA5F9300794723 /* ExportViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExportViewController.swift; sourceTree = ""; }; - E6FE838F1CDB34C900794723 /* TaskRunnerWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TaskRunnerWindowController.swift; sourceTree = ""; }; E6FE83911CDB5D4100794723 /* NSTextView+Utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "NSTextView+Utils.swift"; path = "Utils/NSTextView+Utils.swift"; sourceTree = ""; }; E6FE83931CDB5D5F00794723 /* NSDate+Utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "NSDate+Utils.swift"; path = "Utils/NSDate+Utils.swift"; sourceTree = ""; }; E6FE83951CDB6AF300794723 /* ErrorViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ErrorViewController.swift; sourceTree = ""; }; @@ -154,13 +154,6 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - E63FC793244B3B7800B3202D /* Structs */ = { - isa = PBXGroup; - children = ( - ); - path = Structs; - sourceTree = ""; - }; E65EF086224E85CE0023A7B5 /* Logging */ = { isa = PBXGroup; children = ( @@ -200,27 +193,17 @@ E6910F3C1CCE5CFF003CBA90 /* Timetracker */ = { isa = PBXGroup; children = ( - E63FC793244B3B7800B3202D /* Structs */, + E6F573762459A2D4005A00F1 /* Managers */, + E6F573732459A18E005A00F1 /* Views */, + E6F573722459A17C005A00F1 /* Providers */, + E6F573712459A13A005A00F1 /* Delegates */, E6E9E5BB24483B65000D7D65 /* Builders */, E65EF086224E85CE0023A7B5 /* Logging */, - E6FE838E1CDB34B600794723 /* WindowControllers */, E66272391CD8E82600B50E38 /* Exporters */, - E6D6805F1CD4F85D00C45179 /* Delegates */, - E6D6805A1CD4F75B00C45179 /* Provider */, - E6D680591CD4F73D00C45179 /* ViewControllers */, E6D680561CD4F5D500C45179 /* Utils */, E6910F6F1CCE6F25003CBA90 /* Model */, E6910F441CCE5CFF003CBA90 /* Assets.xcassets */, - E6910F461CCE5CFF003CBA90 /* Main.storyboard */, - E6D964CD223DB4AC00B1C534 /* PreferenceBuilderView.xib */, - E6F788D422579BA000AE3DF3 /* PreferenceLogView.xib */, - E6281D2A24421C1D00CD467C /* PreferenceMiscView.xib */, E6910F491CCE5CFF003CBA90 /* Info.plist */, - E6910F411CCE5CFF003CBA90 /* Timetracker.xcdatamodeld */, - E6FE83971CDB6D8300794723 /* ErrorView.xib */, - E6281D2C24422BD200CD467C /* DockIconManager.swift */, - E6F62FA424439EA900A9C8C9 /* PreferenceAboutView.xib */, - E6E9E5C424485F3B000D7D65 /* TextDisplayerView.xib */, E603199424487E57000FB79C /* copyright.txt */, ); path = Timetracker; @@ -259,66 +242,91 @@ name = Utils; sourceTree = ""; }; - E6D680591CD4F73D00C45179 /* ViewControllers */ = { + E6E9E5BB24483B65000D7D65 /* Builders */ = { isa = PBXGroup; children = ( - E6910F3F1CCE5CFF003CBA90 /* TaskRunnerViewController.swift */, - E6910F8D1CCF78C0003CBA90 /* CostCentreListController.swift */, - E6D680641CD5018F00C45179 /* TaskListViewController.swift */, - E6D680661CD88CE300C45179 /* ManualTaskViewController.swift */, - E6FE838B1CDA5F9300794723 /* ExportViewController.swift */, - E6FE83951CDB6AF300794723 /* ErrorViewController.swift */, - E65ED057223DAF23004C22C9 /* PreferenceBuilderViewController.swift */, - E6F788D622579BBB00AE3DF3 /* PreferenceLogViewController.swift */, - E6281D2724421A4900CD467C /* PreferenceMiscViewController.swift */, - E6F62FA624439EE700A9C8C9 /* PreferenceAboutViewController.swift */, - E6E9E5B82447BCA0000D7D65 /* CurrentTaskEditorViewController.swift */, - E6E9E5C624486009000D7D65 /* TextDisplayerViewController.swift */, - E6F5736D2458CA43005A00F1 /* TaskListWindowController.swift */, + E6E1B4501CD899C300FE24CD /* Builder.swift */, + E6D964CF223E795200B1C534 /* BuilderManager.swift */, + E6E1B4521CD899EA00FE24CD /* JackTheMonkey.swift */, + E6E1B4541CD89CE900FE24CD /* MoonPhases.swift */, + E6E9E5BC24483B8D000D7D65 /* Clock.swift */, + E6E9E5BE24483F29000D7D65 /* TrafficLights.swift */, + E6E9E5C0244840B8000D7D65 /* TimeCounter.swift */, ); - name = ViewControllers; + path = Builders; sourceTree = ""; }; - E6D6805A1CD4F75B00C45179 /* Provider */ = { + E6F573712459A13A005A00F1 /* Delegates */ = { + isa = PBXGroup; + children = ( + E6910F3D1CCE5CFF003CBA90 /* AppDelegate.swift */, + E6281D2424420F4900CD467C /* AppDelegate+NSMenuDelegate.swift */, + E63FC794244C64FC00B3202D /* AppDelegate+TaskPingReceiver.swift */, + ); + path = Delegates; + sourceTree = ""; + }; + E6F573722459A17C005A00F1 /* Providers */ = { isa = PBXGroup; children = ( E612F3401CD2293800FC1D85 /* TaskPingReceiver.swift */, E6D6805B1CD4F76B00C45179 /* TaskProvider.swift */, E6910F5D1CCE65B5003CBA90 /* CoreDataTaskProvider.swift */, ); - name = Provider; + path = Providers; sourceTree = ""; }; - E6D6805F1CD4F85D00C45179 /* Delegates */ = { + E6F573732459A18E005A00F1 /* Views */ = { isa = PBXGroup; children = ( - E6910F3D1CCE5CFF003CBA90 /* AppDelegate.swift */, - E6281D2424420F4900CD467C /* AppDelegate+NSMenuDelegate.swift */, - E63FC794244C64FC00B3202D /* AppDelegate+TaskPingReceiver.swift */, + E6910F461CCE5CFF003CBA90 /* Main.storyboard */, + E6910F411CCE5CFF003CBA90 /* Timetracker.xcdatamodeld */, + E6FE83971CDB6D8300794723 /* ErrorView.xib */, + E6E9E5C424485F3B000D7D65 /* TextDisplayerView.xib */, + E6910F3F1CCE5CFF003CBA90 /* TaskRunnerViewController.swift */, + E6910F8D1CCF78C0003CBA90 /* CostCentreListController.swift */, + E6D680661CD88CE300C45179 /* ManualTaskViewController.swift */, + E6FE838B1CDA5F9300794723 /* ExportViewController.swift */, + E6FE83951CDB6AF300794723 /* ErrorViewController.swift */, + E6E9E5B82447BCA0000D7D65 /* CurrentTaskEditorViewController.swift */, + E6E9E5C624486009000D7D65 /* TextDisplayerViewController.swift */, + E6F573752459A1DF005A00F1 /* TaskList */, + E6F573742459A1AD005A00F1 /* Preferences */, ); - name = Delegates; + path = Views; sourceTree = ""; }; - E6E9E5BB24483B65000D7D65 /* Builders */ = { + E6F573742459A1AD005A00F1 /* Preferences */ = { isa = PBXGroup; children = ( - E6E1B4501CD899C300FE24CD /* Builder.swift */, - E6D964CF223E795200B1C534 /* BuilderManager.swift */, - E6E1B4521CD899EA00FE24CD /* JackTheMonkey.swift */, - E6E1B4541CD89CE900FE24CD /* MoonPhases.swift */, - E6E9E5BC24483B8D000D7D65 /* Clock.swift */, - E6E9E5BE24483F29000D7D65 /* TrafficLights.swift */, - E6E9E5C0244840B8000D7D65 /* TimeCounter.swift */, + E65ED057223DAF23004C22C9 /* PreferenceBuilderViewController.swift */, + E6F788D622579BBB00AE3DF3 /* PreferenceLogViewController.swift */, + E6281D2724421A4900CD467C /* PreferenceMiscViewController.swift */, + E6F62FA624439EE700A9C8C9 /* PreferenceAboutViewController.swift */, + E6D964CD223DB4AC00B1C534 /* PreferenceBuilderView.xib */, + E6F788D422579BA000AE3DF3 /* PreferenceLogView.xib */, + E6281D2A24421C1D00CD467C /* PreferenceMiscView.xib */, + E6F62FA424439EA900A9C8C9 /* PreferenceAboutView.xib */, ); - path = Builders; + path = Preferences; + sourceTree = ""; + }; + E6F573752459A1DF005A00F1 /* TaskList */ = { + isa = PBXGroup; + children = ( + E6D680641CD5018F00C45179 /* TaskListViewController.swift */, + E6F5736F24599EC2005A00F1 /* TaskListViewController+TaskPingReceiver.swift */, + E6F5736D2458CA43005A00F1 /* TaskListWindowController.swift */, + ); + path = TaskList; sourceTree = ""; }; - E6FE838E1CDB34B600794723 /* WindowControllers */ = { + E6F573762459A2D4005A00F1 /* Managers */ = { isa = PBXGroup; children = ( - E6FE838F1CDB34C900794723 /* TaskRunnerWindowController.swift */, + E6281D2C24422BD200CD467C /* DockIconManager.swift */, ); - name = WindowControllers; + path = Managers; sourceTree = ""; }; /* End PBXGroup section */ @@ -478,8 +486,8 @@ E6F5736E2458CA43005A00F1 /* TaskListWindowController.swift in Sources */, E6281D2D24422BD200CD467C /* DockIconManager.swift in Sources */, E6F788D722579BBB00AE3DF3 /* PreferenceLogViewController.swift in Sources */, - E6FE83901CDB34C900794723 /* TaskRunnerWindowController.swift in Sources */, E6910F681CCE6F1E003CBA90 /* Client.swift in Sources */, + E6F5737024599EC2005A00F1 /* TaskListViewController+TaskPingReceiver.swift in Sources */, E63FC795244C64FC00B3202D /* AppDelegate+TaskPingReceiver.swift in Sources */, E6E9E5C1244840B8000D7D65 /* TimeCounter.swift in Sources */, E612F3411CD2293800FC1D85 /* TaskPingReceiver.swift in Sources */, diff --git a/Timetracker/AppDelegate+NSMenuDelegate.swift b/Timetracker/Delegates/AppDelegate+NSMenuDelegate.swift similarity index 100% rename from Timetracker/AppDelegate+NSMenuDelegate.swift rename to Timetracker/Delegates/AppDelegate+NSMenuDelegate.swift diff --git a/Timetracker/AppDelegate+TaskPingReceiver.swift b/Timetracker/Delegates/AppDelegate+TaskPingReceiver.swift similarity index 100% rename from Timetracker/AppDelegate+TaskPingReceiver.swift rename to Timetracker/Delegates/AppDelegate+TaskPingReceiver.swift diff --git a/Timetracker/AppDelegate.swift b/Timetracker/Delegates/AppDelegate.swift similarity index 100% rename from Timetracker/AppDelegate.swift rename to Timetracker/Delegates/AppDelegate.swift diff --git a/Timetracker/DockIconManager.swift b/Timetracker/Managers/DockIconManager.swift similarity index 100% rename from Timetracker/DockIconManager.swift rename to Timetracker/Managers/DockIconManager.swift diff --git a/Timetracker/CoreDataTaskProvider.swift b/Timetracker/Providers/CoreDataTaskProvider.swift similarity index 100% rename from Timetracker/CoreDataTaskProvider.swift rename to Timetracker/Providers/CoreDataTaskProvider.swift diff --git a/Timetracker/TaskPingReceiver.swift b/Timetracker/Providers/TaskPingReceiver.swift similarity index 100% rename from Timetracker/TaskPingReceiver.swift rename to Timetracker/Providers/TaskPingReceiver.swift diff --git a/Timetracker/Provider/TaskProvider.swift b/Timetracker/Providers/TaskProvider.swift similarity index 100% rename from Timetracker/Provider/TaskProvider.swift rename to Timetracker/Providers/TaskProvider.swift diff --git a/Timetracker/TaskRunnerWindowController.swift b/Timetracker/TaskRunnerWindowController.swift deleted file mode 100644 index b59976a3a..000000000 --- a/Timetracker/TaskRunnerWindowController.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// TaskRunnerWindowController.swift -// Timetracker -// -// Created by Antonio Ribeiro on 05/05/16. -// Copyright © 2016 Antonio Ribeiro. All rights reserved. -// - -import Foundation -import Cocoa - -class TaskRunnerWindowController: NSWindowController { - -} diff --git a/Timetracker/Base.lproj/Main.storyboard b/Timetracker/Views/Base.lproj/Main.storyboard similarity index 98% rename from Timetracker/Base.lproj/Main.storyboard rename to Timetracker/Views/Base.lproj/Main.storyboard index 94f5798e2..eab409025 100644 --- a/Timetracker/Base.lproj/Main.storyboard +++ b/Timetracker/Views/Base.lproj/Main.storyboard @@ -344,7 +344,7 @@ - + @@ -375,7 +375,7 @@ - + @@ -414,7 +414,7 @@ - + @@ -452,6 +452,7 @@ + @@ -467,24 +468,24 @@ - + - + - + - + - + @@ -526,7 +527,7 @@ - + @@ -539,11 +540,11 @@ - + - + @@ -558,7 +559,7 @@ - + @@ -571,11 +572,11 @@ - + - + @@ -590,7 +591,7 @@ - + @@ -603,11 +604,11 @@ - + - + @@ -622,7 +623,7 @@ - + @@ -635,11 +636,11 @@ - + - + @@ -654,7 +655,7 @@ - + @@ -667,11 +668,11 @@ - + - + @@ -699,7 +700,7 @@ - + @@ -724,7 +725,7 @@ - + - + @@ -745,7 +746,7 @@ - + @@ -756,10 +757,9 @@ - - - - + + + @@ -776,7 +776,7 @@ - + @@ -953,7 +953,7 @@ Gw - + @@ -1003,7 +1003,7 @@ Gw - + @@ -1021,8 +1021,8 @@ Gw - + + + + + + + + + + + + + + @@ -1448,6 +1479,11 @@ Gw + + + + + diff --git a/Timetracker/Views/ManualTaskViewController.swift b/Timetracker/Views/ManualTaskViewController.swift index c9d3c3e12..3942f9e01 100644 --- a/Timetracker/Views/ManualTaskViewController.swift +++ b/Timetracker/Views/ManualTaskViewController.swift @@ -68,8 +68,6 @@ class ManualTaskViewController: NSViewController, NSComboBoxDataSource { } taskEnd.minDate = taskStart.dateValue - taskStart.maxDate = Date() - taskEnd.maxDate = Date() self.taskComboBox.usesDataSource = true self.taskComboBox.completes = true diff --git a/Timetracker/Views/TaskList/TaskListViewController.swift b/Timetracker/Views/TaskList/TaskListViewController.swift index 151406028..b0d0b40e5 100644 --- a/Timetracker/Views/TaskList/TaskListViewController.swift +++ b/Timetracker/Views/TaskList/TaskListViewController.swift @@ -349,8 +349,53 @@ class TaskListViewController: NSViewController, NSTableViewDataSource, NSTableVi } return (startOfFilter, endOfFilter) + } + //swiftlint:disable shorthand_operator + @IBAction private func jumpToNext(_ sender: Any?) { + + guard var date = self.windowController?.startDate, let span = self.windowController?.timeSpan else { + return + } + + switch span { + case .day: + date = date + 1.days + + case .week: + date = date + 1.weeks + + case .month: + date = date + 1.months + } + + self.windowController?.startDatePicker.dateValue = date + filterTasks() } + + @IBAction private func jumpToPrevious(_ sender: Any?) { + + guard var date = self.windowController?.startDate, let span = self.windowController?.timeSpan else { + return + } + + switch span { + case .day: + date = date - 1.days + + case .week: + date = date - 1.weeks + + case .month: + date = date - 1.months + } + + self.windowController?.startDatePicker.dateValue = date + filterTasks() + + } + //swiftlint:enable shorthand_operator + } // Helper function inserted by Swift 4.2 migrator.