diff --git a/PHP Monitor.xcodeproj/project.pbxproj b/PHP Monitor.xcodeproj/project.pbxproj index 18644f8..8e58fe3 100644 --- a/PHP Monitor.xcodeproj/project.pbxproj +++ b/PHP Monitor.xcodeproj/project.pbxproj @@ -264,6 +264,7 @@ C4F780CD25D80B75000DBC97 /* Alert.swift in Sources */ = {isa = PBXBuildFile; fileRef = C476FF9722B0DD830098105B /* Alert.swift */; }; C4F780CE25D80B75000DBC97 /* LocalNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = C474B00524C0E98C00066A22 /* LocalNotification.swift */; }; C4F8C0A422D4F12C002EFE61 /* DateExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4F8C0A322D4F12C002EFE61 /* DateExtension.swift */; }; + C4FACE83288F1F9700FC478F /* OnboardingWC.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4FACE82288F1F9700FC478F /* OnboardingWC.swift */; }; C4FBFC532616485F00CDB8E1 /* PhpVersionDetectionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4FBFC512616485F00CDB8E1 /* PhpVersionDetectionTest.swift */; }; C4FC21B128391F8E00D368BB /* MainMenu+Actions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4F361602836BFD9003598CC /* MainMenu+Actions.swift */; }; C4FE011128084FC200D1DE6D /* SelectionVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4FE011028084FC200D1DE6D /* SelectionVC.swift */; }; @@ -440,6 +441,7 @@ C4F780AD25D80B37000DBC97 /* PhpExtensionTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhpExtensionTest.swift; sourceTree = ""; }; C4F8C0A322D4F12C002EFE61 /* DateExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateExtension.swift; sourceTree = ""; }; C4F8C0A522D4FA41002EFE61 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + C4FACE82288F1F9700FC478F /* OnboardingWC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingWC.swift; sourceTree = ""; }; C4FBFC512616485F00CDB8E1 /* PhpVersionDetectionTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhpVersionDetectionTest.swift; sourceTree = ""; }; C4FE011028084FC200D1DE6D /* SelectionVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectionVC.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -1011,6 +1013,7 @@ isa = PBXGroup; children = ( C4E9D2BF2878B336008FFDAD /* OnboardingView.swift */, + C4FACE82288F1F9700FC478F /* OnboardingWC.swift */, ); path = Onboarding; sourceTree = ""; @@ -1308,6 +1311,7 @@ C4D5CFCA27E0F9CD00035329 /* NginxConfigurationFile.swift in Sources */, C4CE3BBA27B31F670086CA49 /* ComposerWindow.swift in Sources */, C4D9ADC8277611A0007277F4 /* InternalSwitcher.swift in Sources */, + C4FACE83288F1F9700FC478F /* OnboardingWC.swift in Sources */, C4080FFA27BD956700BF2C6B /* BetterAlertVC.swift in Sources */, C4B5635E276AB09000F12CCB /* VersionExtractor.swift in Sources */, 54D9E0B627E4F51E003B9AD9 /* HotKey.swift in Sources */, diff --git a/phpmon/Domain/App/App.swift b/phpmon/Domain/App/App.swift index fcbee6f..7615701 100644 --- a/phpmon/Domain/App/App.swift +++ b/phpmon/Domain/App/App.swift @@ -56,6 +56,9 @@ class App { /** The window controller of the currently active site list window. */ var domainListWindowController: DomainListWC? + /** The window controller of the onboarding window. */ + var onboardingWindowController: OnboardingWC? + /** List of detected (installed) applications that PHP Monitor can work with. */ var detectedApplications: [Application] = [] diff --git a/phpmon/Domain/App/Base.lproj/Main.storyboard b/phpmon/Domain/App/Base.lproj/Main.storyboard index 679485d..3990b72 100644 --- a/phpmon/Domain/App/Base.lproj/Main.storyboard +++ b/phpmon/Domain/App/Base.lproj/Main.storyboard @@ -397,6 +397,28 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/phpmon/Domain/Menu/MainMenu+Startup.swift b/phpmon/Domain/Menu/MainMenu+Startup.swift index 9258b3a..d38e4b1 100644 --- a/phpmon/Domain/Menu/MainMenu+Startup.swift +++ b/phpmon/Domain/Menu/MainMenu+Startup.swift @@ -88,6 +88,14 @@ extension MainMenu { Stats.incrementSuccessfulLaunchCount() Stats.evaluateSponsorMessageShouldBeDisplayed() + // Present first launch screen if needed + if Stats.successfulLaunchCount >= 1 { // TODO: Make this == 1 for release + Log.info("Should present the first launch screen!") + DispatchQueue.main.async { + OnboardingWC.show() + } + } + // Check for updates DispatchQueue.global(qos: .utility).async { AppUpdateChecker.checkIfNewerVersionIsAvailable() diff --git a/phpmon/Domain/SwiftUI/Onboarding/OnboardingView.swift b/phpmon/Domain/SwiftUI/Onboarding/OnboardingView.swift index 2756965..9711ac2 100644 --- a/phpmon/Domain/SwiftUI/Onboarding/OnboardingView.swift +++ b/phpmon/Domain/SwiftUI/Onboarding/OnboardingView.swift @@ -51,7 +51,7 @@ struct OnboardingView: View { .foregroundColor(.gray) .padding(.top, 5) Button("Close Tour") { - + App.shared.onboardingWindowController?.close() } } .frame(maxWidth: .infinity) diff --git a/phpmon/Domain/SwiftUI/Onboarding/OnboardingWC.swift b/phpmon/Domain/SwiftUI/Onboarding/OnboardingWC.swift new file mode 100644 index 0000000..22529cb --- /dev/null +++ b/phpmon/Domain/SwiftUI/Onboarding/OnboardingWC.swift @@ -0,0 +1,47 @@ +// +// OnboardingWC.swift +// PHP Monitor +// +// Created by Nico Verbruggen on 25/06/2022. +// Copyright © 2022 Nico Verbruggen. All rights reserved. +// + +import Cocoa +import SwiftUI + +class OnboardingWC: PMWindowController { + + // MARK: - Window Identifier + + override var windowName: String { + return "Onboarding" + } + + public static func create(delegate: NSWindowDelegate?) { + let storyboard = NSStoryboard(name: "Main", bundle: nil) + + let windowController = storyboard.instantiateController( + withIdentifier: "onboardingWindow" + ) as! OnboardingWC + + windowController.window!.title = "onboarding.title".localized + windowController.window!.delegate = delegate + windowController.window!.styleMask = [.titled, .closable, .miniaturizable] + windowController.window!.delegate = windowController + windowController.window!.contentView = NSHostingView(rootView: OnboardingView()) + windowController.window!.setContentSize(NSSize(width: 600, height: 600)) + + App.shared.onboardingWindowController = windowController + } + + public static func show(delegate: NSWindowDelegate? = nil) { + if App.shared.onboardingWindowController == nil { + Self.create(delegate: delegate) + } + + App.shared.onboardingWindowController?.showWindow(self) + App.shared.onboardingWindowController?.window?.setCenterPosition(offsetY: 70) + + NSApp.activate(ignoringOtherApps: true) + } +} diff --git a/phpmon/Localizable.strings b/phpmon/Localizable.strings index 1bcc5c5..834939e 100644 --- a/phpmon/Localizable.strings +++ b/phpmon/Localizable.strings @@ -500,6 +500,7 @@ You can do this by running `composer global update` in your terminal. After that // ONBOARDING +"onboarding.title" = ""; "onboarding.welcome" = "Welcome to PHP Monitor!"; "onboarding.explore" = "Explore some of the features below, or close the tour and get started."; "onboarding.tour.menu_bar.title" = "Get Started";