mirror of
https://github.com/iSoron/uhabits.git
synced 2025-12-06 01:08:50 -06:00
Reorganize packages; implement checkmarks
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
91
ios/Application/Frontend/ShowHabitController.swift
Normal file
91
ios/Application/Frontend/ShowHabitController.swift
Normal 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
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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.
@@ -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 )
|
||||
@@ -1,3 +0,0 @@
|
||||
delete from Score
|
||||
delete from Streak
|
||||
delete from Checkmarks
|
||||
@@ -1 +0,0 @@
|
||||
alter table Habits add column reminder_days integer not null default 127
|
||||
@@ -1,3 +0,0 @@
|
||||
delete from Score
|
||||
delete from Streak
|
||||
delete from Checkmarks
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -1,3 +0,0 @@
|
||||
delete from Score
|
||||
delete from Streak
|
||||
delete from Checkmarks
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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 ""
|
||||
@@ -1 +0,0 @@
|
||||
create table Events ( id integer primary key autoincrement, timestamp integer, message text, server_id integer )
|
||||
@@ -1,3 +0,0 @@
|
||||
drop table checkmarks
|
||||
drop table streak
|
||||
drop table score
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user