stats sorta working

builds
undo
saint 2024-05-31 13:04:43 -04:00
parent 19ca7be678
commit bd1923cfb4
7 changed files with 327 additions and 82 deletions

View File

@ -121,8 +121,8 @@ struct Pane: View {
destRibbon: selectedRibbon[0], destRibbon: selectedRibbon[0],
appDatabase: appDatabase, appDatabase: appDatabase,
paneConnector: paneConnector, paneConnector: paneConnector,
refresh: $refresh, loading: true,
loading: true) bump: false)
} }
.onChange(of: paneConnector.refresh) { _ in .onChange(of: paneConnector.refresh) { _ in
print("inside change") print("inside change")

View File

@ -5,28 +5,62 @@ import Foundation
import SwiftUI import SwiftUI
struct NaviBar: View { struct NaviBar: View {
@ObservedObject var paneConnector: PaneConnector
@Query(RibbonRequest(dir: .prev, groupId: 1)) private var backRibbon: [Ribbon] @Query(RibbonRequest(dir: .prev, groupId: 1)) private var backRibbon: [Ribbon]
@Query(RibbonRequest(dir: .next, groupId: 1)) private var nextRibbon: [Ribbon] @Query(RibbonRequest(dir: .next, groupId: 1)) private var nextRibbon: [Ribbon]
@Query(SelectedRibbonRequest()) private var selectedRibbon: [Ribbon] @Query(SelectedRibbonRequest()) private var selectedRibbon: [Ribbon]
@Environment(\.appDatabase) private var appDatabase @Environment(\.appDatabase) private var appDatabase
var body: some View { var body: some View {
VStack { VStack {
HStack { HStack {
Print("meow navi reloaded back ribbon: \(backRibbon[0])")
BackArrow() BackArrow()
.frame(width: CGFloat(30), height: CGFloat(30)) .frame(width: CGFloat(30), height: CGFloat(30))
.background(Color(red: 0.1, green: 0.1, blue: 0.1)) .background(Color(red: 0.1, green: 0.1, blue: 0.1))
.foregroundColor(Color(UIColor(red: 0.30, green: 0.30, blue: 0.30, alpha: 0.4))) .foregroundColor(Color(UIColor(red: 0.30, green: 0.30, blue: 0.30, alpha: 0.4)))
.onTapGesture { .onTapGesture {
// goToRibbon(selectedRibbon: sr[0], print("back backRibbon: \(backRibbon)")
// destRibbon: ribbon, Task {
// appDatabase: appDatabase, print("back backRibbon: \(backRibbon)")
// paneConnector: paneConnector, if backRibbon.count == 0 {
// refresh: $refresh, return
// loading: false) }
var br = backRibbon[0]
//var sr = selectedRibbon[0]
do {
var sr = try await appDatabase.getSelectedRibbon()
print("meow first sr:\(sr)")
print("meow first selectedRibbon:\(selectedRibbon[0])")
try await updateRibbon(selectedRibbon: selectedRibbon[0],
appDatabase: appDatabase,
paneConnector: paneConnector)
print("meow back from update in main")
sr = try await appDatabase.getSelectedRibbon()
print("meow second sr:\(sr)")
print("meow backribbon br:\(br)")
_ = try await appDatabase.undoRibbon(&sr[0])
goToRibbon(selectedRibbon: sr[0],
destRibbon: br,
appDatabase: appDatabase,
paneConnector: paneConnector,
loading: false,
bump:false)
} catch {
print("back 2 error")
print("Error info: \(error)")
}
}
} }
ForwardArrow() ForwardArrow()

View File

@ -44,6 +44,7 @@ struct RibbonRequest: Queryable {
// this has to be a global variable // this has to be a global variable
let totalLevels = 3 let totalLevels = 3
do { do {
print("back reload")
if dir != nil && groupId != nil { if dir != nil && groupId != nil {
sql = """ sql = """
SELECT * FROM Ribbon \ SELECT * FROM Ribbon \
@ -55,7 +56,7 @@ struct RibbonRequest: Queryable {
return [] return []
} }
print("back all ribbon test: \(ret)") print("back all ribbon all: \(ret)")
let currentLevel = ret[0].currentLevel let currentLevel = ret[0].currentLevel
let minLevel = ret[0].minLevel let minLevel = ret[0].minLevel
@ -71,14 +72,15 @@ struct RibbonRequest: Queryable {
if dir == .prev { if dir == .prev {
// no back undo steps left // no back undo steps left
if currentLevel == minLevel { if currentLevel == minLevel {
return [] newCurrentLevel = currentLevel
} }
} else if dir == .prev { } else if dir == .prev {
// no forward redo steps left // no forward redo steps left
if currentLevel == maxLevel { if currentLevel == maxLevel {
return [] newCurrentLevel = maxLevel
} else {
newCurrentLevel = (currentLevel + 1) %% totalLevels
} }
newCurrentLevel = (currentLevel + 1) %% totalLevels
} }
@ -91,19 +93,32 @@ struct RibbonRequest: Queryable {
""" """
ret = try Ribbon.fetchAll(db, sql: sql, arguments: [groupId, newCurrentLevel]) ret = try Ribbon.fetchAll(db, sql: sql, arguments: [groupId, newCurrentLevel])
print("back ribbon test: \(ret)") print("back ribbon return: \(ret)")
return ret return ret
} else { } else {
let sql = """ if groupId != nil {
select distinct r1.* from Ribbon r1 join Ribbon r2 ON \ let sql = """
r1.undoLevel = r2.currentLevel AND r1.id = r2.id ORDER BY pos ASC SELECT * from Ribbon r1 \
""" WHERE r1.groupId = ?
ORDER BY undoLevel ASC
"""
var ret = try Ribbon.fetchAll(db, sql: sql) var ret = try Ribbon.fetchAll(db, sql: sql, arguments: [groupId])
print("xxxxx fetching ribbons") print("xxxxx fetching ribbons")
print(ret) print(ret)
return ret return ret
} else {
let sql = """
select distinct r1.* from Ribbon r1 join Ribbon r2 ON \
r1.undoLevel = r2.currentLevel AND r1.id = r2.id ORDER BY pos ASC
"""
var ret = try Ribbon.fetchAll(db, sql: sql)
print("xxxxx fetching ribbons")
print(ret)
return ret
}
} }
} catch { } catch {
print(error.localizedDescription) print(error.localizedDescription)

113
Stats.swift Normal file
View File

@ -0,0 +1,113 @@
import GRDB
import GRDBQuery
import Foundation
import SwiftUI
var fontSize = CGFloat(12)
struct StatsPanel: View {
@ObservedObject var paneConnector: PaneConnector
@Query(RibbonRequest(dir: .prev, groupId: 1)) private var backRibbon: [Ribbon]
@Query(RibbonRequest(dir: .next, groupId: 1)) private var nextRibbon: [Ribbon]
@Query(RibbonRequest(groupId: 1)) private var allRibbons: [Ribbon]
@Query(SelectedRibbonRequest()) private var selectedRibbon: [Ribbon]
@Environment(\.appDatabase) private var appDatabase
var body: some View {
VStack (spacing: 10) {
VStack {
Text("back Ribbon")
.foregroundColor(Color(UIColor(red: 0.76, green: 0.76, blue: 0.76, alpha: 1.00)))
.font(Font.custom("AveriaSerifLibre-Regular", size: fontSize))
RibbonDebug(ribbonDebug: RibbonDebugPrint(ribbon: backRibbon[0]))
}
VStack {
Text("next Ribbon")
.foregroundColor(Color(UIColor(red: 0.76, green: 0.76, blue: 0.76, alpha: 1.00)))
.font(Font.custom("AveriaSerifLibre-Regular", size: fontSize))
if (nextRibbon.count > 0) {
RibbonDebug(ribbonDebug: RibbonDebugPrint(ribbon: nextRibbon[0]))
}
}
VStack {
Text("selected Ribbon")
.foregroundColor(Color(UIColor(red: 0.76, green: 0.76, blue: 0.76, alpha: 1.00)))
.font(Font.custom("AveriaSerifLibre-Regular", size: fontSize))
RibbonDebug(ribbonDebug: RibbonDebugPrint(ribbon: selectedRibbon[0]))
}
ForEach(RibbonMap(ribbons: allRibbons), id: \.self) { ribbon in
Print("quack3: \(ribbon)")
RibbonDebug(ribbonDebug: ribbon)
}
//VStack(spacing: 10) {
// Text("All Ribbons")
// .foregroundColor(Color(UIColor(red: 0.76, green: 0.76, blue: 0.76, alpha: 1.00)))
// .font(Font.custom("AveriaSerifLibre-Regular", size: fontSize))
// ForEach(RibbonMap(ribbons: allRibbons), id: \.self) { ribbon in
// //Print("quack2: \(ribbon)")
// RibbonDebug(ribbonDebug: RibbonDebugPrint(ribbon: ribbon))
// }
//}
VStack {
Text("pc offset: \(paneConnector.currentOffset)")
.foregroundColor(Color(UIColor(red: 0.76, green: 0.76, blue: 0.76, alpha: 1.00)))
.font(Font.custom("AveriaSerifLibre-Regular", size: fontSize))
}
VStack {
Text("pc id: \(paneConnector.currentId)")
.foregroundColor(Color(UIColor(red: 0.76, green: 0.76, blue: 0.76, alpha: 1.00)))
.font(Font.custom("AveriaSerifLibre-Regular", size: fontSize))
}
}
}
}
func RibbonMap(ribbons: [Ribbon]) -> [[String]] {
var retStrings = [[String]]()
for r in ribbons {
var debugString = RibbonDebugPrint(ribbon:r)
retStrings.append(debugString)
}
return retStrings
}
func RibbonDebugPrint(ribbon: Ribbon) -> [String] {
var ribbonStats = [String]()
ribbonStats.append("id: \(ribbon.id) ")
ribbonStats.append("scrollOffset: \(ribbon.scrollOffset)")
ribbonStats.append("scrollId: \(ribbon.scrollId)")
ribbonStats.append("undoLevel: \(ribbon.undoLevel)")
ribbonStats.append("currentLevel: \(ribbon.currentLevel)")
ribbonStats.append("minLevel: \(ribbon.minLevel)")
ribbonStats.append("maxLevel: \(ribbon.maxLevel)")
return ribbonStats
}
struct RibbonDebug: View {
@State var ribbonDebug: [String]
var body: some View {
VStack {
VStack {
// let ribbonStats = RibbonDebugPrint(ribbon: ribbon)
Print("quack2: \(ribbonDebug)")
ForEach(ribbonDebug, id: \.self) {
Print("quack2 : \($0)")
Text($0)
.foregroundColor(Color(UIColor(red: 0.76, green: 0.76, blue: 0.76, alpha: 1.00)))
.font(Font.custom("AveriaSerifLibre-Regular", size: fontSize))
}
}
}
}
}

View File

@ -10,6 +10,7 @@
851259B02C05281300BE70F8 /* BackButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 851259AF2C05281300BE70F8 /* BackButton.swift */; }; 851259B02C05281300BE70F8 /* BackButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 851259AF2C05281300BE70F8 /* BackButton.swift */; };
851259B22C05299200BE70F8 /* ForwardArrow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 851259B12C05299200BE70F8 /* ForwardArrow.swift */; }; 851259B22C05299200BE70F8 /* ForwardArrow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 851259B12C05299200BE70F8 /* ForwardArrow.swift */; };
851259B62C07560800BE70F8 /* NaviBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 851259B52C07560800BE70F8 /* NaviBar.swift */; }; 851259B62C07560800BE70F8 /* NaviBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 851259B52C07560800BE70F8 /* NaviBar.swift */; };
851259B82C0A145500BE70F8 /* Stats.swift in Sources */ = {isa = PBXBuildFile; fileRef = 851259B72C0A145500BE70F8 /* Stats.swift */; };
8514D5BC299EFB780054F185 /* store.db in Resources */ = {isa = PBXBuildFile; fileRef = 8514D5BB299EFB780054F185 /* store.db */; }; 8514D5BC299EFB780054F185 /* store.db in Resources */ = {isa = PBXBuildFile; fileRef = 8514D5BB299EFB780054F185 /* store.db */; };
8514D5BF299F04710054F185 /* GRDB in Frameworks */ = {isa = PBXBuildFile; productRef = 8514D5BE299F04710054F185 /* GRDB */; }; 8514D5BF299F04710054F185 /* GRDB in Frameworks */ = {isa = PBXBuildFile; productRef = 8514D5BE299F04710054F185 /* GRDB */; };
852774C129A150B100458CA7 /* Line.swift in Sources */ = {isa = PBXBuildFile; fileRef = 852774C029A150B100458CA7 /* Line.swift */; }; 852774C129A150B100458CA7 /* Line.swift in Sources */ = {isa = PBXBuildFile; fileRef = 852774C029A150B100458CA7 /* Line.swift */; };
@ -51,6 +52,7 @@
851259AF2C05281300BE70F8 /* BackButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackButton.swift; sourceTree = "<group>"; }; 851259AF2C05281300BE70F8 /* BackButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackButton.swift; sourceTree = "<group>"; };
851259B12C05299200BE70F8 /* ForwardArrow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardArrow.swift; sourceTree = "<group>"; }; 851259B12C05299200BE70F8 /* ForwardArrow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardArrow.swift; sourceTree = "<group>"; };
851259B52C07560800BE70F8 /* NaviBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NaviBar.swift; sourceTree = "<group>"; }; 851259B52C07560800BE70F8 /* NaviBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NaviBar.swift; sourceTree = "<group>"; };
851259B72C0A145500BE70F8 /* Stats.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Stats.swift; sourceTree = "<group>"; };
8514D5BB299EFB780054F185 /* store.db */ = {isa = PBXFileReference; lastKnownFileType = file; path = store.db; sourceTree = "<group>"; }; 8514D5BB299EFB780054F185 /* store.db */ = {isa = PBXFileReference; lastKnownFileType = file; path = store.db; sourceTree = "<group>"; };
852774C029A150B100458CA7 /* Line.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line.swift; sourceTree = "<group>"; }; 852774C029A150B100458CA7 /* Line.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line.swift; sourceTree = "<group>"; };
8528897429B2B86B003F2E16 /* CrownOfThorns.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrownOfThorns.swift; sourceTree = "<group>"; }; 8528897429B2B86B003F2E16 /* CrownOfThorns.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrownOfThorns.swift; sourceTree = "<group>"; };
@ -126,6 +128,7 @@
85942EF429B108C600307621 /* Seg.swift */, 85942EF429B108C600307621 /* Seg.swift */,
85942EF629B108EA00307621 /* SegDenormRequest.swift */, 85942EF629B108EA00307621 /* SegDenormRequest.swift */,
851259B52C07560800BE70F8 /* NaviBar.swift */, 851259B52C07560800BE70F8 /* NaviBar.swift */,
851259B72C0A145500BE70F8 /* Stats.swift */,
85942EF829B1150B00307621 /* SegDenorm.swift */, 85942EF829B1150B00307621 /* SegDenorm.swift */,
85942EEA29AD55A400307621 /* RibbonRequest.swift */, 85942EEA29AD55A400307621 /* RibbonRequest.swift */,
85942EE329ACF54A00307621 /* ScrollableView.swift */, 85942EE329ACF54A00307621 /* ScrollableView.swift */,
@ -307,6 +310,7 @@
85942EEF29AEA18300307621 /* SelectedRibbonRequest.swift in Sources */, 85942EEF29AEA18300307621 /* SelectedRibbonRequest.swift in Sources */,
8590D96C29A92146001EF84F /* JsonImport.swift in Sources */, 8590D96C29A92146001EF84F /* JsonImport.swift in Sources */,
85942EED29AEA04200307621 /* SelectedRibbon.swift in Sources */, 85942EED29AEA04200307621 /* SelectedRibbon.swift in Sources */,
851259B82C0A145500BE70F8 /* Stats.swift in Sources */,
85431A892905F4F500EE0760 /* glossApp.swift in Sources */, 85431A892905F4F500EE0760 /* glossApp.swift in Sources */,
8528897C29BD69B2003F2E16 /* VisibilityTrackingScrollView.swift in Sources */, 8528897C29BD69B2003F2E16 /* VisibilityTrackingScrollView.swift in Sources */,
85942EF929B1150B00307621 /* SegDenorm.swift in Sources */, 85942EF929B1150B00307621 /* SegDenorm.swift in Sources */,

View File

@ -1,6 +1,10 @@
import Foundation import Foundation
import GRDB import GRDB
let totalLevels = 3
/// AppDatabase lets the application access the database. /// AppDatabase lets the application access the database.
/// ///
/// It applies the pratices recommended at /// It applies the pratices recommended at
@ -122,6 +126,22 @@ func load<T: Decodable>(_ filename: String) -> T {
extension AppDatabase { extension AppDatabase {
func getSelectedRibbon() async throws -> [Ribbon] {
try await dbWriter.write { db in
var sr = try Ribbon.fetchAll(db, sql: """
SELECT Ribbon.* FROM SelectedRibbon \
JOIN (select distinct r1.* from Ribbon r1 join Ribbon r2 ON \
r1.undoLevel = r2.currentLevel AND r1.id = r2.id ORDER BY pos ASC) as Ribbon \
ON SelectedRibbon.ribbonGroupId = Ribbon.groupId \
WHERE SelectedRibbon.rowId = 1
""")
print("meow get selected ribbon \(sr)")
return sr
}
}
func updateRibbonPosition(_ ribbon: inout Ribbon, _ oldPos: Int, _ newPos: Int) async throws { func updateRibbonPosition(_ ribbon: inout Ribbon, _ oldPos: Int, _ newPos: Int) async throws {
try await dbWriter.write { [ribbon] db in try await dbWriter.write { [ribbon] db in
@ -202,8 +222,41 @@ extension AppDatabase {
} }
} }
func bumpRibbon(_ ribbon: inout Ribbon) async throws { func undoRibbon(_ ribbon: inout Ribbon) async throws {
let totalLevels = 3 let currentLevel = ribbon.currentLevel
let minLevel = ribbon.minLevel
if currentLevel == minLevel {
print("no where to undo")
return
}
let newCurrent = (ribbon.currentLevel - 1) %% totalLevels
print("meow new current: \(newCurrent)")
do {
try await dbWriter.write { [ribbon] db in
print("back executing")
try db.execute(sql: """
UPDATE Ribbon \
SET currentLevel = ? WHERE groupId = ?
""", arguments: [newCurrent, ribbon.groupId])
var ret3 = try Ribbon.fetchAll(db, sql: """
SELECT * from Ribbon \
WHERE groupId = ?
""", arguments: [ribbon.groupId])
print("back ret3: \(ret3)")
}
} catch {
print("back error")
print("Error info: \(error)")
}
}
func bumpRibbon(_ ribbon: inout Ribbon) async throws -> [Ribbon] {
var level = ribbon.currentLevel var level = ribbon.currentLevel
let maxLevel = ribbon.maxLevel let maxLevel = ribbon.maxLevel
var delLevels2 = [Int]() var delLevels2 = [Int]()
@ -211,18 +264,13 @@ extension AppDatabase {
level = (level + 1) % totalLevels level = (level + 1) % totalLevels
delLevels2.append(level) delLevels2.append(level)
} }
print("del levels")
let delLevels = delLevels2 let delLevels = delLevels2
print(delLevels)
let newMax = (ribbon.currentLevel + 1) % totalLevels let newMax = (ribbon.currentLevel + 1) %% totalLevels
let newCurrent = newMax let newCurrent = newMax
let newMin = newMax == ribbon.minLevel ? (ribbon.minLevel + 1) % totalLevels let newMin = newMax == ribbon.minLevel ? (ribbon.minLevel + 1) %% totalLevels
: ribbon.minLevel : ribbon.minLevel
print(newMin)
print(newMax)
print(newCurrent)
ribbon.minLevel = newMin ribbon.minLevel = newMin
ribbon.maxLevel = newMax ribbon.maxLevel = newMax
ribbon.undoLevel = newCurrent ribbon.undoLevel = newCurrent
@ -231,6 +279,7 @@ extension AppDatabase {
do { do {
try await dbWriter.write { [ribbon] db in try await dbWriter.write { [ribbon] db in
print("meow enter bump 1")
for l in delLevels { for l in delLevels {
try db.execute(sql: """ try db.execute(sql: """
DELETE FROM Ribbon \ DELETE FROM Ribbon \
@ -246,11 +295,11 @@ extension AppDatabase {
// upsert // upsert
var ret = try Ribbon.fetchAll(db, sql: """
let ret = try Ribbon.fetchAll(db, sql: """
SELECT * from Ribbon WHERE groupId = ? AND undoLevel = ? SELECT * from Ribbon WHERE groupId = ? AND undoLevel = ?
""", arguments: [ribbon.groupId, ribbon.undoLevel]) """, arguments: [ribbon.groupId, ribbon.undoLevel])
print("meow enter bump 3")
if ret.count == 0 { if ret.count == 0 {
// insert // insert
_ = try ribbon.inserted(db) _ = try ribbon.inserted(db)
@ -265,20 +314,27 @@ extension AppDatabase {
try updatedRibbon.update(db) try updatedRibbon.update(db)
} }
print("ribbon inserted: \(ret)") ret = try Ribbon.fetchAll(db, sql: """
SELECT * from Ribbon WHERE groupId = ? AND undoLevel = ?
""", arguments: [ribbon.groupId, ribbon.undoLevel])
let ret2 = try Ribbon.fetchAll(db, sql: """ let ret2 = try Ribbon.fetchAll(db, sql: """
SELECT * from Ribbon ORDER BY groupId SELECT * from Ribbon WHERE groupId = 1 ORDER BY undoLevel ASC
""") """)
for r in ret2 {
print("ribbon dump: \(r)")
}
}
for r2 in ret2 {
print("meow ribbon dump: \(r2)")
}
print("meow bumped ribbon: \(ret)")
return ret
}
} catch { } catch {
print("Error info: \(error)") print("Error info: \(error)")
} }
return []
} }
func saveSelectedRibbon(_ selectedRibbon: inout SelectedRibbon) async throws { func saveSelectedRibbon(_ selectedRibbon: inout SelectedRibbon) async throws {

View File

@ -39,20 +39,45 @@ public extension UserDefaults {
} }
} }
func updateRibbon(selectedRibbon: Ribbon,
appDatabase : AppDatabase,
paneConnector: PaneConnector) async throws -> [Ribbon]
{
print("meow updating ribbon")
var updatedRibbon = selectedRibbon
var scrollOffsetToSave = Int(floor(paneConnector.currentOffset))
var scrollIdToSave = paneConnector.currentId
print("meow scrolloffsets \(scrollIdToSave) \(scrollOffsetToSave)")
var offsetDiff = abs(scrollOffsetToSave - updatedRibbon.scrollOffset) > 30
var idDiff = Int(updatedRibbon.scrollId) != Int(scrollIdToSave)
if idDiff || offsetDiff {
updatedRibbon.scrollId = scrollIdToSave
updatedRibbon.scrollOffset = scrollOffsetToSave
print("meow bumping")
let ret = try await appDatabase.bumpRibbon(&updatedRibbon)
print("meow finished bumping")
return ret
}
print("meow no bump")
return []
}
func goToRibbon(selectedRibbon: Ribbon, func goToRibbon(selectedRibbon: Ribbon,
destRibbon: Ribbon, destRibbon: Ribbon,
appDatabase: AppDatabase, appDatabase: AppDatabase,
paneConnector: PaneConnector, paneConnector: PaneConnector,
refresh: Binding<Bool>, loading: Bool,
loading: Bool) bump: Bool)
{ {
print("meow goto ribbon - selected ribbon: \(selectedRibbon), dest ribbon: \(destRibbon) ")
DispatchQueue.main.asyncAfter(deadline: .now()) { DispatchQueue.main.asyncAfter(deadline: .now()) {
Task { Task {
var scrollOffsetToSave = paneConnector.currentOffset var scrollOffsetToSave = paneConnector.currentOffset
var scrollIdToSave = paneConnector.currentId var scrollIdToSave = paneConnector.currentId
var updatedRibbon = selectedRibbon
print("go to ribbon") print("go to ribbon")
print("\(selectedRibbon.id) \(destRibbon.id!)") print("\(selectedRibbon.id) \(destRibbon.id!)")
@ -72,8 +97,6 @@ func goToRibbon(selectedRibbon: Ribbon,
print("toggling") print("toggling")
print("paneconnector: \(paneConnector.refresh)") print("paneconnector: \(paneConnector.refresh)")
refresh.wrappedValue.toggle()
var updateSelectRibbon = SelectedRibbon(id: Int64(1), ribbonGroupId: Int64(destRibbon.groupId)) var updateSelectRibbon = SelectedRibbon(id: Int64(1), ribbonGroupId: Int64(destRibbon.groupId))
// print("Saving selected ribbon") // print("Saving selected ribbon")
// print(updateSelectRibbon) // print(updateSelectRibbon)
@ -84,23 +107,26 @@ func goToRibbon(selectedRibbon: Ribbon,
} }
} }
// this gets run regardless of if we switch ribbons or not // // this gets run regardless of if we switch ribbons or not
// so if you click the same ribbon or a different ribbon // // so if you click the same ribbon or a different ribbon
if !loading { // if !loading || bump {
print("not loading") // print("not loading")
print("saving ribbon") // print("saving ribbon")
// updating the ribbon location // // updating the ribbon location
updatedRibbon.scrollOffset = Int(floor(scrollOffsetToSave)) // updatedRibbon.scrollOffset = Int(floor(scrollOffsetToSave))
updatedRibbon.scrollId = scrollIdToSave // updatedRibbon.scrollId = scrollIdToSave
// updatedRibbon.undoLevel = updatedRibbon.undoLevel + 1 // // updatedRibbon.undoLevel = updatedRibbon.undoLevel + 1
// updatedRibbon.currentLevel = updatedRibbon.currentLevel + 1 // // updatedRibbon.currentLevel = updatedRibbon.currentLevel + 1
_ = try await appDatabase.bumpRibbon(&updatedRibbon)
} else { // if bump {
print("loading") // _ = try await appDatabase.bumpRibbon(&updatedRibbon)
} // }
// } else {
// print("loading")
// }
} }
} }
@ -125,7 +151,7 @@ struct RibbonCrown: View {
@Environment(\.appDatabase) private var appDatabase @Environment(\.appDatabase) private var appDatabase
@Query(SelectedRibbonRequest()) private var sr: [Ribbon] @Query(SelectedRibbonRequest()) private var selectedRibbon: [Ribbon]
@State var saveOffset = CGFloat() @State var saveOffset = CGFloat()
@Binding var refresh: Bool @Binding var refresh: Bool
@ -157,12 +183,18 @@ struct RibbonCrown: View {
} }
.onTapGesture { .onTapGesture {
Task { Task {
goToRibbon(selectedRibbon: sr[0],
let sr = selectedRibbon[0]
let updatedRibbon = try await updateRibbon(selectedRibbon: sr,
appDatabase: appDatabase,
paneConnector: paneConnector)
goToRibbon(selectedRibbon: sr,
destRibbon: ribbon, destRibbon: ribbon,
appDatabase: appDatabase, appDatabase: appDatabase,
paneConnector: paneConnector, paneConnector: paneConnector,
refresh: $refresh, loading: false,
loading: false) bump: true)
} }
} }
.frame(width: CGFloat(100 * 1.66 * scale + 10), height: CGFloat(100 * scale + 5)) .frame(width: CGFloat(100 * 1.66 * scale + 10), height: CGFloat(100 * scale + 5))
@ -276,7 +308,18 @@ struct ContentView: View {
.background(Color(red: 0.1, green: 0.1, blue: 0.1)) .background(Color(red: 0.1, green: 0.1, blue: 0.1))
.frame(alignment: .topLeading) .frame(alignment: .topLeading)
NaviBar().offset(x: geometry.size.width - 300) VStack {
Text("pc offset: \(paneConnector.currentOffset)")
.foregroundColor(Color(UIColor(red: 0.76, green: 0.76, blue: 0.76, alpha: 1.00)))
.font(Font.custom("AveriaSerifLibre-Regular", size: fontSize))
}
VStack {
NaviBar(paneConnector: paneConnector)
StatsPanel(paneConnector: paneConnector)
}
.frame(maxWidth: 250)
.offset(x: geometry.size.width - 250)
VStack { VStack {
// Top pane // Top pane
@ -392,27 +435,7 @@ struct ContentView: View {
} }
} }
} }
func handleVisibilityChanged2(_: String, change _: VisibilityChange, tracker _: VisibilityTracker<String>) {} func handleVisibilityChanged2(_: String, change _: VisibilityChange, tracker _: VisibilityTracker<String>) {}
func handleVisibilityChanged(_: String, change _: VisibilityChange, tracker: VisibilityTracker<String>) {
// var printRate: Int64 = 10
// gTracker = tracker
self.paneConnector.visibilityTracker = tracker
let visibleViews2 = Array(tracker.visibleViews.keys)
if visibleViews2.count == 0 {
return
}
// currentId = tracker.sortedViewIDs[tracker.sortedViewIDs.count - 1]
currentId = tracker.sortedViewIDs[0]
currentOffset = tracker.visibleViews[currentId!]!
self.paneConnector.currentId = tracker.sortedViewIDs[0]
self.paneConnector.currentOffset = tracker.visibleViews[currentId!]!
}
} }
private let itemFormatter: DateFormatter = { private let itemFormatter: DateFormatter = {