From 6676e62889340b5207653c1b3c31ef469b7a26c0 Mon Sep 17 00:00:00 2001 From: Tomas Kracmar Date: Fri, 10 Oct 2025 08:59:59 +0200 Subject: [PATCH] BusyMirror 1.2.5: Mirror Now enables for routes or manual; add computed canRunMirrorNow; version bump --- BusyMirror.xcodeproj/project.pbxproj | 8 ++++---- BusyMirror/ContentView.swift | 9 ++++++++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/BusyMirror.xcodeproj/project.pbxproj b/BusyMirror.xcodeproj/project.pbxproj index e3fe770..e877c9f 100644 --- a/BusyMirror.xcodeproj/project.pbxproj +++ b/BusyMirror.xcodeproj/project.pbxproj @@ -410,7 +410,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 6; + CURRENT_PROJECT_VERSION = 7; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = BusyMirror/Info.plist; @@ -421,7 +421,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.2.4; + MARKETING_VERSION = 1.2.5; PRODUCT_BUNDLE_IDENTIFIER = com.cqrenet.BusyMirror; PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; @@ -440,7 +440,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 6; + CURRENT_PROJECT_VERSION = 7; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = BusyMirror/Info.plist; @@ -451,7 +451,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.2.4; + MARKETING_VERSION = 1.2.5; PRODUCT_BUNDLE_IDENTIFIER = com.cqrenet.BusyMirror; PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; diff --git a/BusyMirror/ContentView.swift b/BusyMirror/ContentView.swift index 26132b3..bd2b177 100644 --- a/BusyMirror/ContentView.swift +++ b/BusyMirror/ContentView.swift @@ -150,6 +150,13 @@ struct ContentView: View { @AppStorage("placeholderTitle") private var placeholderTitle: String = "Busy" // global customizable placeholder title @AppStorage("autoDeleteMissing") private var autoDeleteMissing: Bool = true // delete mirrors whose source instance no longer exists + // Mirrors can run either by manual selection (source + at least one target) + // or using predefined routes. This derived flag controls the Mirror Now button. + private var canRunMirrorNow: Bool { + let manualOK = !targetIDs.isEmpty && sourceIndex < calendars.count + return hasAccess && !isRunning && !calendars.isEmpty && (manualOK || !routes.isEmpty) + } + private static let intFormatter: NumberFormatter = { let f = NumberFormatter() f.numberStyle = .none @@ -550,7 +557,7 @@ struct ContentView: View { } } } - .disabled(isRunning || calendars.isEmpty || (routes.isEmpty && targetSelections.isEmpty)) + .disabled(!canRunMirrorNow) Button("Cleanup Placeholders") { if writeEnabled {