Prevent saving when some file properties change
This commit is contained in:
@ -47,6 +47,9 @@ final class Content: ObservableObject {
|
|||||||
|
|
||||||
var errorCallback: ((StorageError) -> Void)?
|
var errorCallback: ((StorageError) -> Void)?
|
||||||
|
|
||||||
|
/// A cache of file sizes
|
||||||
|
private var fileSizes: [String: Int] = [:]
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
let settings = Settings.default
|
let settings = Settings.default
|
||||||
self.settings = settings
|
self.settings = settings
|
||||||
@ -196,4 +199,26 @@ final class Content: ObservableObject {
|
|||||||
func setLastSaveTimestamp() {
|
func setLastSaveTimestamp() {
|
||||||
self.lastSave = .now
|
self.lastSave = .now
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: File sizes
|
||||||
|
|
||||||
|
func size(of file: String) -> Int? {
|
||||||
|
fileSizes[file]
|
||||||
|
}
|
||||||
|
|
||||||
|
func cache(size: Int?, of file: String) {
|
||||||
|
fileSizes[file] = size
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: Image dimensions
|
||||||
|
|
||||||
|
private var imageDimensions: [String: CGSize] = [:]
|
||||||
|
|
||||||
|
func dimensions(of image: String) -> CGSize? {
|
||||||
|
imageDimensions[image]
|
||||||
|
}
|
||||||
|
|
||||||
|
func cache(dimensions: CGSize?, of image: String) {
|
||||||
|
imageDimensions[image] = dimensions
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -48,12 +48,22 @@ final class FileResource: Item, LocalizedItem {
|
|||||||
var isAsset: Bool
|
var isAsset: Bool
|
||||||
|
|
||||||
/// The dimensions of the image
|
/// The dimensions of the image
|
||||||
@Published
|
var imageDimensions: CGSize? {
|
||||||
var imageDimensions: CGSize? = nil
|
get { content.dimensions(of: id) }
|
||||||
|
set {
|
||||||
|
content.cache(dimensions: newValue, of: id)
|
||||||
|
didChange(save: false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// The size of the file in bytes
|
/// The size of the file in bytes
|
||||||
@Published
|
var fileSize: Int? {
|
||||||
var fileSize: Int? = nil
|
get { content.size(of: id) }
|
||||||
|
set {
|
||||||
|
content.cache(size: newValue, of: id)
|
||||||
|
didChange(save: false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var savedData: Data?
|
var savedData: Data?
|
||||||
|
|
||||||
|
@ -8,7 +8,9 @@ class ChangeObservingItem: ObservableContentItem {
|
|||||||
/// A dummy property to force views to update when properties change
|
/// A dummy property to force views to update when properties change
|
||||||
@Published
|
@Published
|
||||||
private var changeToggle = false
|
private var changeToggle = false
|
||||||
|
|
||||||
|
private var shouldSave = true
|
||||||
|
|
||||||
var cancellables = Set<AnyCancellable>()
|
var cancellables = Set<AnyCancellable>()
|
||||||
|
|
||||||
init(content: Content) {
|
init(content: Content) {
|
||||||
@ -19,9 +21,18 @@ class ChangeObservingItem: ObservableContentItem {
|
|||||||
|
|
||||||
// MARK: Change observation
|
// MARK: Change observation
|
||||||
|
|
||||||
func didChange() {
|
func didChange(save: Bool = true) {
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
|
self.shouldSave = save
|
||||||
self.changeToggle.toggle()
|
self.changeToggle.toggle()
|
||||||
|
self.shouldSave = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func needsSaving() {
|
||||||
|
guard shouldSave else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
content.needsSave()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,17 @@ protocol ChangeObservableItem: ObservableObject {
|
|||||||
func needsSaving()
|
func needsSaving()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension ChangeObservableItem {
|
||||||
|
|
||||||
|
func observeChanges() {
|
||||||
|
objectWillChange
|
||||||
|
.sink { [weak self] _ in
|
||||||
|
self?.needsSaving()
|
||||||
|
}
|
||||||
|
.store(in: &cancellables)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protocol ObservableContentItem: ChangeObservableItem {
|
protocol ObservableContentItem: ChangeObservableItem {
|
||||||
|
|
||||||
var content: Content { get }
|
var content: Content { get }
|
||||||
@ -18,14 +29,3 @@ extension ObservableContentItem {
|
|||||||
content.needsSave()
|
content.needsSave()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension ChangeObservableItem {
|
|
||||||
|
|
||||||
func observeChanges() {
|
|
||||||
objectWillChange
|
|
||||||
.sink { [weak self] _ in
|
|
||||||
self?.needsSaving()
|
|
||||||
}
|
|
||||||
.store(in: &cancellables)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Reference in New Issue
Block a user