mirror of
https://github.com/iSoron/uhabits.git
synced 2025-12-07 01:28:52 -06:00
Reorganize packages; implement checkmarks
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user