Skip to content

Commit

Permalink
Update roles sync logic
Browse files Browse the repository at this point in the history
  • Loading branch information
milanvarady committed Apr 27, 2024
1 parent 789ae40 commit d147915
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 55 deletions.
37 changes: 11 additions & 26 deletions Source/Marker Data/Marker Data/Models/Roles/RolesManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

import Foundation
import OSLog
import EonilFSEvents

/// The roles manager manages the selected FCP roles
///
Expand All @@ -29,30 +28,13 @@ class RolesManager: ObservableObject {
}
}

// Monitor preferences file for changes
// Monitor roles for changes
// We need this because the roles might be changed from the FCP Workflow Extension
do {
try EonilFSEvents.startWatching(
paths: [Self.staticPreferencesJSONURL.path(percentEncoded: false)],
for: ObjectIdentifier(self),
with: { event in
Task {
do {
let storeOnDisk = try Self.loadStore()

await MainActor.run {
self.roles = storeOnDisk.roles
}

Self.logger.notice("Roles have been modified from outside. Loading new roles.")
} catch {
Self.logger.error("File monitor error: \(error.localizedDescription)")
}
}
})
} catch {
Self.logger.warning("Failed to start roles monitoring. \(error.localizedDescription)")
}
DistributedNotificationCenter.default.addObserver(
self,
selector: #selector(refresh),
name: Notification.Name("RolesChanged"),
object: nil)
}

@MainActor
Expand All @@ -70,8 +52,8 @@ class RolesManager: ObservableObject {
Self.logger.error("Failed to save roles to disk: \(error.localizedDescription, privacy: .public)")
}
}
@MainActor

@objc @MainActor
func refresh() {
self.roles = Self.loadRolesFromDisk()
}
Expand Down Expand Up @@ -100,6 +82,9 @@ class RolesManager: ObservableObject {
let data = try encoder.encode(store)

try data.write(to: Self.staticPreferencesJSONURL)

// Notify of changes
DistributedNotificationCenter.default.post(name: Notification.Name("RolesChanged"), object: nil)
}

static func loadRolesFromDisk() -> [RoleModel] {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import Foundation
import AppKit
import Combine
import OSLog
import EonilFSEvents

/// Holds app settings and provides methods to save, delete and modify them
@MainActor
Expand Down Expand Up @@ -73,18 +72,13 @@ class SettingsContainer: ObservableObject {
}
.store(in: &cancellables)

// Monitor preferences file for changes
// Monitor roles for changes
// We need this because the roles might be changed from the FCP Workflow Extension
do {
try EonilFSEvents.startWatching(
paths: [URL.preferencesJSON.path(percentEncoded: false)],
for: ObjectIdentifier(self),
with: { [weak self] event in
self?.monitorFileChanges(fileSystemEvent: event)
})
} catch {
Self.logger.warning("Failed to start preferences file monitoring. \(error.localizedDescription)")
}
DistributedNotificationCenter.default.addObserver(
self,
selector: #selector(updateRoles),
name: Notification.Name("RolesChanged"),
object: nil)
}

public func load(_ store: SettingsStore) throws {
Expand Down Expand Up @@ -239,22 +233,15 @@ class SettingsContainer: ObservableObject {
self.unsavedChanges = onDisk != self.store
}

private func monitorFileChanges(fileSystemEvent: EonilFSEventsEvent) {
guard let flags = fileSystemEvent.flag else {
return
}

if flags.contains(.itemModified) {
do {
let storeOnDisk = try self.loadStoreFromDisk(at: URL.preferencesJSON)

if storeOnDisk.roles != self.store.roles {
self.store = storeOnDisk
Self.logger.notice("Roles have been modified from outside. Loading new store.")
}
} catch {
Self.logger.error("File monitor error: \(error.localizedDescription)")
}
@objc
private func updateRoles() {
do {
Self.logger.notice("Roles have been modified from outside. Loading new store.")

let storeOnDisk = try self.loadStoreFromDisk(at: URL.preferencesJSON)
self.store = storeOnDisk
} catch {
Self.logger.error("Failed to load new roles: \(error.localizedDescription)")
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,9 @@ struct SettingsStore: Codable, Hashable, Equatable, Identifiable {
let outputDirURL: URL = self.exportFolderURL ?? URL.FCPExportCacheFolder

// Exclude roles
let excludeRoles = self.roles.filter { !$0.enabled }
// Update roles in case of outside change
let roles = RolesManager.loadRolesFromDisk()
let excludeRoles = roles.filter { !$0.enabled }
let excludeRoleNames: Set<String> = Set(excludeRoles.map { $0.role.rawValue })

// Image size override
Expand Down

0 comments on commit d147915

Please sign in to comment.