Reorganize packages; implement checkmarks

This commit is contained in:
2019-03-30 15:31:17 -05:00
parent 6a30bb98c6
commit 70a79856f2
100 changed files with 1760 additions and 516 deletions

View File

@@ -22,9 +22,12 @@ import UIKit
@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var backend = Backend(databaseOpener: IosDatabaseOpener(withLog: StandardLog()),
var backend = Backend(databaseName: "dev.db",
databaseOpener: IosDatabaseOpener(withLog: StandardLog()),
fileOpener: IosFileOpener(),
log: StandardLog())
log: StandardLog(),
dateCalculator: IosLocalDateCalculator(),
taskRunner: SequentialTaskRunner())
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

View File

@@ -88,9 +88,10 @@ class ListHabitsCell : UITableViewCell {
}
}
class ListHabitsController: UITableViewController {
class ListHabitsController: UITableViewController, MainScreenDataSourceListener {
var backend: Backend
var habits: [[String: Any]]
var dataSource: MainScreenDataSource
var data: MainScreenDataSource.Data?
var theme: Theme
required init?(coder aDecoder: NSCoder) {
@@ -99,33 +100,49 @@ class ListHabitsController: UITableViewController {
init(withBackend backend:Backend) {
self.backend = backend
self.habits = backend.getHabitList()
self.dataSource = backend.mainScreenDataSource
self.theme = backend.theme
super.init(nibName: nil, bundle: nil)
self.dataSource.addListener(listener: self)
self.dataSource.requestData()
}
func onDataChanged(newData: MainScreenDataSource.Data) {
self.data = newData
}
override func viewDidLoad() {
self.title = "Habits"
self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add,
target: self,
action: #selector(self.onCreateHabitClicked))
self.navigationItem.rightBarButtonItems = [
UIBarButtonItem(barButtonSystemItem: .add,
target: self,
action: #selector(self.onCreateHabitClicked))
]
tableView.register(ListHabitsCell.self, forCellReuseIdentifier: "cell")
tableView.backgroundColor = theme.headerBackgroundColor.uicolor
}
override func viewDidAppear(_ animated: Bool) {
self.navigationController?.navigationBar.barStyle = .default
self.navigationController?.navigationBar.tintColor = theme.highContrastTextColor.uicolor
self.navigationController?.navigationBar.barTintColor = .white
self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.black]
}
@objc func onCreateHabitClicked() {
self.navigationController?.pushViewController(EditHabitController(), animated: true)
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return habits.count
return data?.names.count ?? 0
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let row = indexPath.row
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! ListHabitsCell
let color = theme.color(paletteIndex: habits[row]["color"] as! Int32)
cell.label.text = habits[row]["name"] as? String
let color = theme.color(paletteIndex: data!.colors[row].index)
cell.label.text = data!.names[row]
cell.setColor(color)
return cell
}
@@ -148,4 +165,8 @@ class ListHabitsController: UITableViewController {
return CGFloat(theme.checkmarkButtonSize) + 1
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let color = theme.color(paletteIndex: data!.colors[indexPath.row].index)
self.navigationController?.pushViewController(ShowHabitController(theme: theme, color: color), animated: true)
}
}

View File

@@ -0,0 +1,91 @@
/*
* Copyright (C) 2016-2019 Álinson Santos Xavier <isoron@gmail.com>
*
* This file is part of Loop Habit Tracker.
*
* Loop Habit Tracker is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* Loop Habit Tracker is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import UIKit
class ShowHabitController : UITableViewController {
let theme: Theme
let color: Color
var cells = [UITableViewCell]()
required init?(coder aDecoder: NSCoder) {
fatalError()
}
init(theme: Theme, color: Color) {
self.theme = theme
self.color = color
super.init(style: .grouped)
}
override func viewDidLoad() {
self.title = "Exercise"
self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .edit,
target: self,
action: #selector(self.onEditHabitClicked))
cells.append(buildHistoryChartCell())
}
func buildHistoryChartCell() -> UITableViewCell {
let component = CalendarChart(today: LocalDate(year: 2019, month: 3, day: 15),
color: color,
theme: theme,
dateCalculator: IosLocalDateCalculator(),
dateFormatter: IosLocalDateFormatter())
let cell = UITableViewCell()
let view = ComponentView(frame: cell.frame, component: component)
var series = [KotlinDouble]()
for _ in 1...365 {
series.append(KotlinDouble(value: Double.random(in: 0...1)))
}
component.series = series
view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
cell.contentView.addSubview(view)
return cell
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.barStyle = .blackOpaque
self.navigationController?.navigationBar.barTintColor = color.uicolor
self.navigationController?.navigationBar.tintColor = .white
self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
override func numberOfSections(in tableView: UITableView) -> Int {
return cells.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return cells[indexPath.section]
}
@objc func onEditHabitClicked() {
self.navigationController?.pushViewController(EditHabitController(), animated: true)
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 200
}
}

View File

@@ -35,6 +35,10 @@ class ComponentView : UIView {
let canvas = IosCanvas(withBounds: bounds)
component?.draw(canvas: canvas)
}
override func layoutSubviews() {
setNeedsDisplay()
}
}
class IosCanvas : NSObject, Canvas {
@@ -66,6 +70,7 @@ class IosCanvas : NSObject, Canvas {
var font = Font.regular
var textSize = CGFloat(12)
var textColor = UIColor.black
var textAlign = TextAlign.center
init(withBounds bounds: CGRect) {
self.bounds = bounds
@@ -100,9 +105,19 @@ class IosCanvas : NSObject, Canvas {
NSAttributedString.Key.foregroundColor: textColor]
let size = nsText.size(withAttributes: attrs)
nsText.draw(at: CGPoint(x: CGFloat(x) - size.width / 2,
y : CGFloat(y) - size.height / 2),
withAttributes: attrs)
if textAlign == TextAlign.center {
nsText.draw(at: CGPoint(x: CGFloat(x) - size.width / 2,
y : CGFloat(y) - size.height / 2),
withAttributes: attrs)
} else if textAlign == TextAlign.left {
nsText.draw(at: CGPoint(x: CGFloat(x),
y : CGFloat(y) - size.height / 2),
withAttributes: attrs)
} else {
nsText.draw(at: CGPoint(x: CGFloat(x) - size.width,
y : CGFloat(y) - size.height / 2),
withAttributes: attrs)
}
}
func drawRect(x: Double, y: Double, width: Double, height: Double) {
@@ -127,7 +142,7 @@ class IosCanvas : NSObject, Canvas {
return Double(bounds.width)
}
func setTextSize(size: Double) {
func setFontSize(size: Double) {
self.textSize = CGFloat(size)
}
@@ -138,4 +153,8 @@ class IosCanvas : NSObject, Canvas {
func setStrokeWidth(size: Double) {
self.ctx.setLineWidth(CGFloat(size))
}
func setTextAlign(align: TextAlign) {
self.textAlign = align
}
}

View File

@@ -24,6 +24,8 @@ internal let SQLITE_STATIC = unsafeBitCast(0, to: sqlite3_destructor_type.self)
internal let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self)
class IosPreparedStatement : NSObject, PreparedStatement {
var db: OpaquePointer
var statement: OpaquePointer
@@ -47,6 +49,10 @@ class IosPreparedStatement : NSObject, PreparedStatement {
func getInt(index: Int32) -> Int32 {
return sqlite3_column_int(statement, index)
}
func getLong(index: Int32) -> Int64 {
return sqlite3_column_int64(statement, index)
}
func getText(index: Int32) -> String {
return String(cString: sqlite3_column_text(statement, index))
@@ -75,6 +81,10 @@ class IosPreparedStatement : NSObject, PreparedStatement {
override func finalize() {
sqlite3_finalize(statement)
}
func bindLong(index: Int32, value: Int64) {
sqlite3_bind_int64(statement, index + 1, value)
}
}
class IosDatabase : NSObject, Database {

View File

@@ -19,39 +19,70 @@
import Foundation
class IosLocalDateFormatter : NSObject, LocalDateFormatter {
func shortWeekdayName(date: LocalDate) -> String {
extension LocalDate {
var iosDate : Date {
let calendar = Calendar(identifier: .gregorian)
var dc = DateComponents()
dc.year = Int(date.year)
dc.month = Int(date.month)
dc.day = Int(date.day)
dc.year = Int(self.year)
dc.month = Int(self.month)
dc.day = Int(self.day)
dc.hour = 13
dc.minute = 0
let d = calendar.date(from: dc)!
let fmt = DateFormatter()
return calendar.date(from: dc)!
}
}
extension Date {
var localDate : LocalDate {
let calendar = Calendar(identifier: .gregorian)
return LocalDate(year: Int32(calendar.component(.year, from: self)),
month: Int32(calendar.component(.month, from: self)),
day: Int32(calendar.component(.day, from: self)))
}
}
class IosLocalDateFormatter : NSObject, LocalDateFormatter {
let fmt = DateFormatter()
func shortMonthName(date: LocalDate) -> String {
fmt.dateFormat = "MMM"
return fmt.string(from: date.iosDate)
}
func shortWeekdayName(date: LocalDate) -> String {
fmt.dateFormat = "EEE"
return fmt.string(from: d)
return fmt.string(from: date.iosDate)
}
}
class IosLocalDateCalculator : NSObject, LocalDateCalculator {
func toTimestamp(date: LocalDate) -> Timestamp {
return Timestamp(unixTimeInMillis: Int64(date.iosDate.timeIntervalSince1970 * 1000))
}
func fromTimestamp(timestamp: Timestamp) -> LocalDate {
return Date.init(timeIntervalSince1970: Double(timestamp.unixTimeInMillis / 1000)).localDate
}
let calendar = Calendar(identifier: .gregorian)
func dayOfWeek(date: LocalDate) -> DayOfWeek {
let weekday = calendar.component(.weekday, from: date.iosDate)
switch(weekday) {
case 1: return DayOfWeek.sunday
case 2: return DayOfWeek.monday
case 3: return DayOfWeek.tuesday
case 4: return DayOfWeek.wednesday
case 5: return DayOfWeek.thursday
case 6: return DayOfWeek.friday
default: return DayOfWeek.saturday
}
}
func plusDays(date: LocalDate, days: Int32) -> LocalDate {
let calendar = Calendar(identifier: .gregorian)
var dc = DateComponents()
dc.year = Int(date.year)
dc.month = Int(date.month)
dc.day = Int(date.day)
dc.hour = 13
dc.minute = 0
let d1 = calendar.date(from: dc)!
let d2 = d1.addingTimeInterval(24.0 * 60 * 60 * Double(days))
let d2 = date.iosDate.addingTimeInterval(24.0 * 60 * 60 * Double(days))
return LocalDate(year: Int32(calendar.component(.year, from: d2)),
month: Int32(calendar.component(.month, from: d2)),
day: Int32(calendar.component(.day, from: d2)))
}
func minusDays(date: LocalDate, days: Int32) -> LocalDate {
return plusDays(date: date, days: -days)
}
}

View File

@@ -24,7 +24,7 @@ extension Color {
return UIColor(red: CGFloat(self.red),
green: CGFloat(self.green),
blue: CGFloat(self.blue),
alpha: 1.0)
alpha: CGFloat(self.alpha))
}
var cgcolor : CGColor {

View File

@@ -20,7 +20,7 @@
import Foundation
class IosResourceFile : NSObject, ResourceFile {
var path: String
var fileManager = FileManager.default
@@ -36,6 +36,10 @@ class IosResourceFile : NSObject, ResourceFile {
return ["ERROR"]
}
}
func doCopyTo(dest: UserFile) {
try! fileManager.copyItem(atPath: self.path, toPath: (dest as! IosUserFile).path)
}
}
class IosUserFile : NSObject, UserFile {

Binary file not shown.

Binary file not shown.

View File

@@ -1,5 +0,0 @@
create table Habits ( id integer primary key autoincrement, archived integer, color integer, description text, freq_den integer, freq_num integer, highlight integer, name text, position integer, reminder_hour integer, reminder_min integer )
create table Checkmarks ( id integer primary key autoincrement, habit integer references habits(id), timestamp integer, value integer )
create table Repetitions ( id integer primary key autoincrement, habit integer references habits(id), timestamp integer )
create table Streak ( id integer primary key autoincrement, end integer, habit integer references habits(id), length integer, start integer )
create table Score ( id integer primary key autoincrement, habit integer references habits(id), score integer, timestamp integer )

View File

@@ -1,3 +0,0 @@
delete from Score
delete from Streak
delete from Checkmarks

View File

@@ -1 +0,0 @@
alter table Habits add column reminder_days integer not null default 127

View File

@@ -1,3 +0,0 @@
delete from Score
delete from Streak
delete from Checkmarks

View File

@@ -1,4 +0,0 @@
create index idx_score_habit_timestamp on Score(habit, timestamp)
create index idx_checkmark_habit_timestamp on Checkmarks(habit, timestamp)
create index idx_repetitions_habit_timestamp on Repetitions(habit, timestamp)
create index idx_streak_habit_end on Streak(habit, end)

View File

@@ -1,14 +0,0 @@
update habits set color=0 where color=-2937041
update habits set color=1 where color=-1684967
update habits set color=2 where color=-415707
update habits set color=3 where color=-5262293
update habits set color=4 where color=-13070788
update habits set color=5 where color=-16742021
update habits set color=6 where color=-16732991
update habits set color=7 where color=-16540699
update habits set color=8 where color=-10603087
update habits set color=9 where color=-7461718
update habits set color=10 where color=-2614432
update habits set color=11 where color=-13619152
update habits set color=12 where color=-5592406
update habits set color=0 where color<0 or color>12

View File

@@ -1,3 +0,0 @@
delete from Score
delete from Streak
delete from Checkmarks

View File

@@ -1,2 +0,0 @@
alter table Habits add column type integer not null default 0
alter table Repetitions add column value integer not null default 2

View File

@@ -1,5 +0,0 @@
drop table Score
create table Score ( id integer primary key autoincrement, habit integer references habits(id), score real, timestamp integer)
create index idx_score_habit_timestamp on Score(habit, timestamp)
delete from streak
delete from checkmarks

View File

@@ -1,3 +0,0 @@
alter table Habits add column target_type integer not null default 0
alter table Habits add column target_value real not null default 0
alter table Habits add column unit text not null default ""

View File

@@ -1 +0,0 @@
create table Events ( id integer primary key autoincrement, timestamp integer, message text, server_id integer )

View File

@@ -1,3 +0,0 @@
drop table checkmarks
drop table streak
drop table score

View File

@@ -1,12 +0,0 @@
update habits set color=19 where color=12
update habits set color=17 where color=11
update habits set color=15 where color=10
update habits set color=14 where color=9
update habits set color=13 where color=8
update habits set color=10 where color=7
update habits set color=9 where color=6
update habits set color=8 where color=5
update habits set color=7 where color=4
update habits set color=5 where color=3
update habits set color=4 where color=2
update habits set color=0 where color<0 or color>19

View File

@@ -1,11 +0,0 @@
delete from repetitions where habit not in (select id from habits)
delete from repetitions where timestamp is null
delete from repetitions where habit is null
delete from repetitions where rowid not in ( select min(rowid) from repetitions group by habit, timestamp )
alter table Repetitions rename to RepetitionsBak
create table Repetitions ( id integer primary key autoincrement, habit integer not null references habits(id), timestamp integer not null, value integer not null)
drop index if exists idx_repetitions_habit_timestamp
create unique index idx_repetitions_habit_timestamp on Repetitions( habit, timestamp)
insert into Repetitions select * from RepetitionsBak
drop table RepetitionsBak
pragma foreign_keys=ON

View File

@@ -7,11 +7,12 @@
objects = {
/* Begin PBXBuildFile section */
0057EC2B224C4CDB00C49288 /* icons in Resources */ = {isa = PBXBuildFile; fileRef = 0057EC2A224C4CDB00C49288 /* icons */; };
00A5B42822009F590024E00C /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00A5B42722009F590024E00C /* AppDelegate.swift */; };
00A5B42A22009F590024E00C /* ListHabitsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00A5B42922009F590024E00C /* ListHabitsController.swift */; };
00A5B42F22009F5A0024E00C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 00A5B42E22009F5A0024E00C /* Assets.xcassets */; };
00C0C6A52246537A003D8AF0 /* IosFilesTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C0C6A122465365003D8AF0 /* IosFilesTest.swift */; };
00C0C6A62246537E003D8AF0 /* IosSqlDatabaseTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C0C6A222465365003D8AF0 /* IosSqlDatabaseTest.swift */; };
00C0C6A62246537E003D8AF0 /* IosDatabaseTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C0C6A222465365003D8AF0 /* IosDatabaseTest.swift */; };
00C0C6A8224654A2003D8AF0 /* IosDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C0C6A7224654A2003D8AF0 /* IosDatabase.swift */; };
00C0C6AA224654F4003D8AF0 /* IosFiles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C0C6A9224654F4003D8AF0 /* IosFiles.swift */; };
00C0C6BD22465F65003D8AF0 /* fonts in Resources */ = {isa = PBXBuildFile; fileRef = 00C0C6BA22465F65003D8AF0 /* fonts */; };
@@ -25,6 +26,7 @@
00C0C6D92247DC13003D8AF0 /* IosCanvasTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C0C6D82247DC13003D8AF0 /* IosCanvasTest.swift */; };
00C0C6DB2247E6B0003D8AF0 /* IosDates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C0C6DA2247E6B0003D8AF0 /* IosDates.swift */; };
00C0C6DD2247E6C4003D8AF0 /* IosDatesTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C0C6DC2247E6C4003D8AF0 /* IosDatesTest.swift */; };
00C0C6E0224A3602003D8AF0 /* ShowHabitController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C0C6DE224A35FC003D8AF0 /* ShowHabitController.swift */; };
00D48BD12200A31300CC4527 /* Launch.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 00D48BD02200A31300CC4527 /* Launch.storyboard */; };
00D48BD32200AC1600CC4527 /* EditHabitController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00D48BD22200AC1600CC4527 /* EditHabitController.swift */; };
/* End PBXBuildFile section */
@@ -54,6 +56,7 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
0057EC2A224C4CDB00C49288 /* icons */ = {isa = PBXFileReference; lastKnownFileType = folder; path = icons; sourceTree = "<group>"; };
00A5B42422009F590024E00C /* uhabits.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = uhabits.app; sourceTree = BUILT_PRODUCTS_DIR; };
00A5B42722009F590024E00C /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
00A5B42922009F590024E00C /* ListHabitsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListHabitsController.swift; sourceTree = "<group>"; };
@@ -62,7 +65,7 @@
00A5B43822009F5A0024E00C /* uhabitsTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = uhabitsTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
00A5B43E22009F5A0024E00C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
00C0C6A122465365003D8AF0 /* IosFilesTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IosFilesTest.swift; sourceTree = "<group>"; };
00C0C6A222465365003D8AF0 /* IosSqlDatabaseTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IosSqlDatabaseTest.swift; sourceTree = "<group>"; };
00C0C6A222465365003D8AF0 /* IosDatabaseTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IosDatabaseTest.swift; sourceTree = "<group>"; };
00C0C6A7224654A2003D8AF0 /* IosDatabase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IosDatabase.swift; sourceTree = "<group>"; };
00C0C6A9224654F4003D8AF0 /* IosFiles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IosFiles.swift; sourceTree = "<group>"; };
00C0C6AE224655D8003D8AF0 /* BridgingHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BridgingHeader.h; sourceTree = "<group>"; };
@@ -75,6 +78,7 @@
00C0C6D82247DC13003D8AF0 /* IosCanvasTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IosCanvasTest.swift; sourceTree = "<group>"; };
00C0C6DA2247E6B0003D8AF0 /* IosDates.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IosDates.swift; sourceTree = "<group>"; };
00C0C6DC2247E6C4003D8AF0 /* IosDatesTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IosDatesTest.swift; sourceTree = "<group>"; };
00C0C6DE224A35FC003D8AF0 /* ShowHabitController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShowHabitController.swift; sourceTree = "<group>"; };
00D48BD02200A31300CC4527 /* Launch.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Launch.storyboard; sourceTree = "<group>"; };
00D48BD22200AC1600CC4527 /* EditHabitController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditHabitController.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
@@ -99,6 +103,16 @@
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
006EFE49224FF41B008464E0 /* Frontend */ = {
isa = PBXGroup;
children = (
00D48BD22200AC1600CC4527 /* EditHabitController.swift */,
00A5B42922009F590024E00C /* ListHabitsController.swift */,
00C0C6DE224A35FC003D8AF0 /* ShowHabitController.swift */,
);
path = Frontend;
sourceTree = "<group>";
};
00A5B41B22009F590024E00C = {
isa = PBXGroup;
children = (
@@ -126,9 +140,8 @@
00A5B43322009F5A0024E00C /* Info.plist */,
00D48BD02200A31300CC4527 /* Launch.storyboard */,
00A5B42722009F590024E00C /* AppDelegate.swift */,
00D48BD22200AC1600CC4527 /* EditHabitController.swift */,
00A5B42922009F590024E00C /* ListHabitsController.swift */,
00A5B42E22009F5A0024E00C /* Assets.xcassets */,
006EFE49224FF41B008464E0 /* Frontend */,
00C0C6D622471BA3003D8AF0 /* Platform */,
);
path = Application;
@@ -154,11 +167,13 @@
00C0C6C022465F80003D8AF0 /* Assets */ = {
isa = PBXGroup;
children = (
00C0C6BC22465F65003D8AF0 /* migrations */,
00C0C6BA22465F65003D8AF0 /* fonts */,
0057EC2A224C4CDB00C49288 /* icons */,
00C0C6BB22465F65003D8AF0 /* databases */,
00C0C6BA22465F65003D8AF0 /* fonts */,
00C0C6BC22465F65003D8AF0 /* migrations */,
);
path = Assets;
name = Assets;
path = ../core/assets/main;
sourceTree = "<group>";
};
00C0C6D622471BA3003D8AF0 /* Platform */ = {
@@ -166,9 +181,9 @@
children = (
00C0C6D022470705003D8AF0 /* IosCanvas.swift */,
00C0C6A7224654A2003D8AF0 /* IosDatabase.swift */,
00C0C6DA2247E6B0003D8AF0 /* IosDates.swift */,
00C0C6CD2246EFB3003D8AF0 /* IosExtensions.swift */,
00C0C6A9224654F4003D8AF0 /* IosFiles.swift */,
00C0C6DA2247E6B0003D8AF0 /* IosDates.swift */,
);
path = Platform;
sourceTree = "<group>";
@@ -176,10 +191,10 @@
00C0C6D722472BC9003D8AF0 /* Platform */ = {
isa = PBXGroup;
children = (
00C0C6A122465365003D8AF0 /* IosFilesTest.swift */,
00C0C6A222465365003D8AF0 /* IosSqlDatabaseTest.swift */,
00C0C6D82247DC13003D8AF0 /* IosCanvasTest.swift */,
00C0C6A222465365003D8AF0 /* IosDatabaseTest.swift */,
00C0C6DC2247E6C4003D8AF0 /* IosDatesTest.swift */,
00C0C6A122465365003D8AF0 /* IosFilesTest.swift */,
);
path = Platform;
sourceTree = "<group>";
@@ -270,6 +285,7 @@
00C0C6BD22465F65003D8AF0 /* fonts in Resources */,
00C0C6BE22465F65003D8AF0 /* databases in Resources */,
00C0C6BF22465F65003D8AF0 /* migrations in Resources */,
0057EC2B224C4CDB00C49288 /* icons in Resources */,
00A5B42F22009F5A0024E00C /* Assets.xcassets in Resources */,
00D48BD12200A31300CC4527 /* Launch.storyboard in Resources */,
);
@@ -313,6 +329,7 @@
00C0C6AA224654F4003D8AF0 /* IosFiles.swift in Sources */,
00C0C6D122470705003D8AF0 /* IosCanvas.swift in Sources */,
00C0C6CE2246EFB3003D8AF0 /* IosExtensions.swift in Sources */,
00C0C6E0224A3602003D8AF0 /* ShowHabitController.swift in Sources */,
00C0C6A8224654A2003D8AF0 /* IosDatabase.swift in Sources */,
00C0C6DB2247E6B0003D8AF0 /* IosDates.swift in Sources */,
00A5B42A22009F590024E00C /* ListHabitsController.swift in Sources */,
@@ -328,7 +345,7 @@
00C0C6DD2247E6C4003D8AF0 /* IosDatesTest.swift in Sources */,
00C0C6A52246537A003D8AF0 /* IosFilesTest.swift in Sources */,
00C0C6D92247DC13003D8AF0 /* IosCanvasTest.swift in Sources */,
00C0C6A62246537E003D8AF0 /* IosSqlDatabaseTest.swift in Sources */,
00C0C6A62246537E003D8AF0 /* IosDatabaseTest.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};