Преглед изворни кода

【OCToSwift】WelcomeWindowController

tangchao пре 1 година
родитељ
комит
a21d5a6f44

+ 8 - 0
PDF Office/PDF Master.xcodeproj/project.pbxproj

@@ -2794,6 +2794,9 @@
 		BB981E552AD4F638001988CA /* KMPageIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB981E512AD4F638001988CA /* KMPageIndicator.swift */; };
 		BB981E562AD4F638001988CA /* KMPageIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB981E512AD4F638001988CA /* KMPageIndicator.swift */; };
 		BB981E572AD4F638001988CA /* KMPageIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB981E512AD4F638001988CA /* KMPageIndicator.swift */; };
+		BB981E592AD4F70D001988CA /* KMWelcomeWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB981E582AD4F70D001988CA /* KMWelcomeWindowController.swift */; };
+		BB981E5A2AD4F70D001988CA /* KMWelcomeWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB981E582AD4F70D001988CA /* KMWelcomeWindowController.swift */; };
+		BB981E5B2AD4F70D001988CA /* KMWelcomeWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB981E582AD4F70D001988CA /* KMWelcomeWindowController.swift */; };
 		BB99ACC2292DE22E0048AFD9 /* KMMergeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB99ACC0292DE22E0048AFD9 /* KMMergeViewController.swift */; };
 		BB99ACC3292DE22E0048AFD9 /* KMMergeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB99ACC0292DE22E0048AFD9 /* KMMergeViewController.swift */; };
 		BB99ACC4292DE22E0048AFD9 /* KMMergeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB99ACC0292DE22E0048AFD9 /* KMMergeViewController.swift */; };
@@ -4587,6 +4590,7 @@
 		BB9807FC29CA93D400BEEB81 /* WelcomeWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = WelcomeWindowController.xib; sourceTree = "<group>"; };
 		BB981E502AD4F637001988CA /* KMCoverButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMCoverButton.swift; sourceTree = "<group>"; };
 		BB981E512AD4F638001988CA /* KMPageIndicator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMPageIndicator.swift; sourceTree = "<group>"; };
+		BB981E582AD4F70D001988CA /* KMWelcomeWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMWelcomeWindowController.swift; sourceTree = "<group>"; };
 		BB99ACC0292DE22E0048AFD9 /* KMMergeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMMergeViewController.swift; sourceTree = "<group>"; };
 		BB99ACC1292DE22E0048AFD9 /* KMMergeViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMMergeViewController.xib; sourceTree = "<group>"; };
 		BB99ACC9292DEE6E0048AFD9 /* KMMergeTitleBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMMergeTitleBar.swift; sourceTree = "<group>"; };
@@ -8481,6 +8485,7 @@
 			isa = PBXGroup;
 			children = (
 				BB9807F929CA93A900BEEB81 /* OC */,
+				BB981E582AD4F70D001988CA /* KMWelcomeWindowController.swift */,
 			);
 			path = Welcome;
 			sourceTree = "<group>";
@@ -10986,6 +10991,7 @@
 				BB897269294DB41D0045787C /* KMWatermarkAdjectivePositionView.swift in Sources */,
 				BB6719F52AD2C949003D44D5 /* CPDFRedactAnnotation+PDFListView.swift in Sources */,
 				BBB9B31C299A5D6D004F3235 /* KMCloudOperation.m in Sources */,
+				BB981E592AD4F70D001988CA /* KMWelcomeWindowController.swift in Sources */,
 				BB8B173C2907CDD9001C5EA5 /* NibLoadable.swift in Sources */,
 				ADE3C1AB29A4779E00793B13 /* KMPrintAccessoryController.swift in Sources */,
 				ADB1FE6E29752BB700ED072D /* KMBatchConvertPDFView.swift in Sources */,
@@ -11308,6 +11314,7 @@
 				ADBC372A29CA950500D93208 /* KMComparativeOutlineView.swift in Sources */,
 				9FDD0FA729533494000C4DAD /* KMJSONParser.swift in Sources */,
 				9FDD0F70294AD13C000C4DAD /* KMMainViewController+Action.swift in Sources */,
+				BB981E5A2AD4F70D001988CA /* KMWelcomeWindowController.swift in Sources */,
 				AD0E8AB12A31B76300DBFD3C /* KMInAppPurchaseManager.swift in Sources */,
 				BBB9B314299A5D6D004F3235 /* DropboxModel.m in Sources */,
 				BBB9B323299A5D6D004F3235 /* KMServicesCloudFile.m in Sources */,
@@ -12284,6 +12291,7 @@
 				89E93EFC299CB4C200F10F66 /* KMOCRBox.m in Sources */,
 				9F0CB5132986565700007028 /* KMDesignToken+BorderRadius.swift in Sources */,
 				BB86C1F428F54535005AD968 /* CPDFListView+KeyEvent.m in Sources */,
+				BB981E5B2AD4F70D001988CA /* KMWelcomeWindowController.swift in Sources */,
 				BBB9B321299A5D6D004F3235 /* KMGoogleDriveManager.m in Sources */,
 				9F1FE4DA29406E4700E952CA /* NSString+Utils.m in Sources */,
 				BB4EEF4E2976544F003A3537 /* KMRedactAligementView.swift in Sources */,

+ 7 - 8
PDF Office/PDF Master/Class/ChromiumTabs/KMBrowserWindowController.swift

@@ -43,21 +43,20 @@ import Cocoa
 //            KMTools.openQuickStartStudy()
             
             DispatchQueue.main.async {
-                let welcome = WelcomeWindowController()
-                self.window?.beginSheet(welcome.window!)
-                
+                let welcome = KMWelcomeWindowController()
+                self.km_beginSheet(windowC: welcome)
                 welcome.itemClick = { [weak self] idx, param in
                     if (idx == 1) { // 关闭
-                        self?.window?.endSheet((param as! NSWindowController).window!)
+                        self?.km_endSheet()
                     } else if (idx == 2) { // 以后提醒
-                        self?.window?.endSheet((param as! NSWindowController).window!)
+                        self?.km_endSheet()
                     } else if (idx == 3) { // 注册
-                        self?.window?.endSheet((param as! NSWindowController).window!)
-                        
+                        self?.km_endSheet()
+
                         guard let window_ = self?.window else {
                             return
                         }
-                        let _ = KMLoginWindowController.show(window: window_, .Batch, .register)
+                        _ = KMLoginWindowController.show(window: window_, .Batch, .register)
                     }
                 }
             }

+ 12 - 0
PDF Office/PDF Master/Class/Common/Category/NSObject+KMExtension.swift

@@ -322,3 +322,15 @@ extension UInt {
         }
     }
 }
+
+extension Int {
+    var cgFloat: CGFloat {
+        get {
+            return CGFloat(self)
+        }
+    }
+}
+
+func KMLocalizedString(_ key: String, _ comment: String?) -> String {
+    NSLocalizedString(key, comment: comment ?? "")
+}

+ 5 - 2
PDF Office/PDF Master/Class/Common/Control/KMPageIndicator.swift

@@ -66,9 +66,12 @@ protocol KMPageIndicatorDelegate: AnyObject {
     
     override func draw(_ dirtyRect: NSRect) {
         super.draw(dirtyRect)
-
         
-        let indicatorAreaWidth = self.pageIndicatorSize.width * self.numberOfPages.cgFloat + self.indicatorMargin * (self.numberOfPages-1).cgFloat
+        var indicatorAreaWidth = 0.0
+        if (self.numberOfPages > 0) {
+            indicatorAreaWidth = self.pageIndicatorSize.width * self.numberOfPages.cgFloat + self.indicatorMargin * (self.numberOfPages-1).cgFloat
+        }
+        
         var leftPosition = (self.bounds.size.width - indicatorAreaWidth) * 0.5
         let topPadding = (self.bounds.size.height - self.pageIndicatorSize.height) * 0.5
         

+ 413 - 0
PDF Office/PDF Master/Class/Welcome/KMWelcomeWindowController.swift

@@ -0,0 +1,413 @@
+//
+//  KMWelcomeWindowController.swift
+//  PDF Master
+//
+//  Created by tangchao on 2023/10/10.
+//
+
+import Cocoa
+ 
+private let kKMWelcomeHasShowKey = "WelcomeHasShowKey"
+private let kKMWelcomeRemindMeLaterKey = "WelcomeRemindMeLaterKey"
+
+typealias KMWelcomeWindowC = KMWelcomeWindowController
+
+extension KMWelcomeWindowController.Key {
+    public static let hasShow = kKMWelcomeHasShowKey
+    public static let remindMeLater = kKMWelcomeRemindMeLaterKey
+}
+
+class KMWelcomeWindowController: NSWindowController {
+    @IBOutlet weak var scrollView: NSScrollView!
+    
+    @IBOutlet weak var content1View: NSView!
+    @IBOutlet weak var content2View: NSView!
+    @IBOutlet weak var content3View: NSView!
+    @IBOutlet weak var content4View: NSView!
+    
+    @IBOutlet weak var content5View: NSView!
+    @IBOutlet weak var content6View: NSView!
+    
+    @IBOutlet weak var imageView1: NSImageView!
+    @IBOutlet weak var imageView2: NSImageView!
+    @IBOutlet weak var imageView3: NSImageView!
+    @IBOutlet weak var imageView4: NSImageView!
+    @IBOutlet weak var imageView6: NSImageView!
+    @IBOutlet weak var imageView5: NSImageView!
+    
+    @IBOutlet weak var title1Label: NSTextField!
+    @IBOutlet weak var subtitle1Label: NSTextField!
+    @IBOutlet weak var title2Label: NSTextField!
+    @IBOutlet weak var subtitle2Label: NSTextField!
+    @IBOutlet weak var title3Label: NSTextField!
+    @IBOutlet weak var subtitle3Label: NSTextField!
+    @IBOutlet weak var title4Label: NSTextField!
+    @IBOutlet weak var subtitle4Label: NSTextField!
+    
+    @IBOutlet weak var title5Label: NSTextField!
+    @IBOutlet weak var subtitle5Label: NSTextField!
+    @IBOutlet weak var title6Label: NSTextField!
+    @IBOutlet weak var subtitle6Label: NSTextField!
+    
+    @IBOutlet weak var preBox: NSBox!
+    @IBOutlet weak var nextBox: NSBox!
+    
+    private var _preButtonVC: KMDesignButton?
+    var preButtonVC: KMDesignButton? {
+        get {
+            return self._preButtonVC
+        }
+    }
+    private var _nextButtonVC: KMDesignButton?
+    var nextButtonVC: KMDesignButton? {
+        get {
+            return self._nextButtonVC
+        }
+    }
+
+    @IBOutlet weak var next1Box: NSBox!
+    @IBOutlet weak var remindMeLaterBox: NSBox!
+    @IBOutlet weak var next2Box: NSBox!
+    @IBOutlet weak var next3Box: NSBox!
+    @IBOutlet weak var next4Box: NSBox!
+    @IBOutlet weak var next5Box: NSBox!
+    
+    @IBOutlet weak var signUpBox: NSBox!
+    
+    private var _next1ButtonVC: KMDesignButton?
+    private var _remindMeLaterButtonVC: KMDesignButton?
+    private var _next2ButtonVC: KMDesignButton?
+    private var _next3ButtonVC: KMDesignButton?
+    private var _next4ButtonVC: KMDesignButton?
+    
+    private var _signUpButtonVC: KMDesignButton?
+    
+    @IBOutlet weak var pageIndicator1: KMPageIndicator!
+    @IBOutlet weak var pageIndicator2: KMPageIndicator!
+    @IBOutlet weak var pageIndicator3: KMPageIndicator!
+    @IBOutlet weak var pageIndicator4: KMPageIndicator!
+    @IBOutlet weak var pageIndicator5: KMPageIndicator!
+    @IBOutlet weak var pageIndicator6: KMPageIndicator!
+    
+    @IBOutlet weak var closeButton: NSButton!
+    @IBOutlet weak var closeBox: KMBox!
+    
+    private var _contentViews: [NSView] = []
+    var contentViews: [NSView] {
+        get {
+            return self._contentViews
+        }
+    }
+    private var _currentIndex: Int = 0
+    
+    var itemClick: KMCommonClickBlock?
+    public struct Key {}
+    
+    deinit {
+        Swift.debugPrint("WelcomeWindowController 已释放")
+    }
+    
+    convenience init() {
+        self.init(windowNibName: "WelcomeWindowController")
+        
+        // 处理再次提醒
+        if (UserDefaults.standard.bool(forKey: KMWelcomeWindowC.Key.remindMeLater)) {
+            UserDefaults.standard.set(false, forKey: KMWelcomeWindowC.Key.remindMeLater)
+            UserDefaults.standard.set(false, forKey: KMWelcomeWindowC.Key.hasShow)
+            UserDefaults.standard.synchronize()
+        }
+    }
+    
+    override func awakeFromNib() {
+        super.awakeFromNib()
+        
+        let clipView = self.scrollView.contentView
+        // ,self.content4View
+        self._contentViews = [self.content1View, self.content2View, self.content3View, self.content4View, self.content6View, self.content5View]
+        for i in 0 ..< self.contentViews.count {
+            let view = self.contentViews[i]
+            view.frame = CGRectMake(i.cgFloat*clipView.bounds.size.width, 0, clipView.bounds.size.width, clipView.bounds.size.height)
+            self.scrollView.documentView?.addSubview(view)
+        }
+        self.scrollView.documentView?.frame = CGRectMake(0, 0, clipView.bounds.size.width*self.contentViews.count.cgFloat, clipView.bounds.size.height)
+    }
+    
+    override func windowDidLoad() {
+        super.windowDidLoad()
+    
+        self._localizedString()
+        self.initSubViews()
+        self.setupUI()
+        self._reloadData()
+
+        // 设置【显示】标识
+        UserDefaults.standard.set(true, forKey: KMWelcomeWindowC.Key.hasShow)
+        UserDefaults.standard.synchronize()
+    }
+    
+    func initSubViews() {
+        self.preBox.borderType = .noBorder
+        self._preButtonVC = KMDesignButton(withType: .Image)
+        self.preBox.contentView?.addSubview(self.preButtonVC!.view)
+        self.preButtonVC?.view.frame = self.preBox.contentView!.bounds
+        self.preButtonVC?.view.autoresizingMask = [.width, .height]
+        self.preButtonVC?.image = NSImage(named: "KMImageNamePreviousPageImage")!
+        self.preButtonVC?.pagination()
+        self.preButtonVC?.target = self
+        self.preButtonVC?.action = #selector(_previousButtonAction)
+        
+        self.nextBox.borderType = .noBorder;
+        self._nextButtonVC = KMDesignButton(withType: .Image)
+        self.nextBox.contentView?.addSubview(self.nextButtonVC!.view)
+        self.nextButtonVC?.view.frame = self.nextBox.contentView!.bounds
+        self.nextButtonVC?.view.autoresizingMask = [.width, .height]
+        self.nextButtonVC?.image = NSImage(named: "KMImageNameNextPageImage")!
+        self.nextButtonVC?.pagination()
+        self.nextButtonVC?.target = self
+        self.nextButtonVC?.action = #selector(_nextButtonAction)
+        
+        for box in [self.next1Box, self.next2Box, self.next3Box, self.next4Box, self.next5Box] {
+            box!.borderType = .noBorder
+            let nextButtonVC = KMDesignButton(withType: .Text)
+            box?.contentView?.addSubview(nextButtonVC.view)
+            nextButtonVC.view.frame = box?.contentView?.bounds ?? NSZeroRect
+            nextButtonVC.view.autoresizingMask = [.width, .height]
+    //        nextButtonVC.stringValue = NSLocalizedString(@"Next", nil);
+            if (KMLightMemberManager.manager.isLogin()) { // let’s start
+                nextButtonVC.stringValue = KMLocalizedString("Let's Start", nil)
+            } else {
+                nextButtonVC.stringValue = KMLocalizedString("Sign up", nil)
+            }
+            nextButtonVC.target = self
+    //        nextButtonVC.action = @selector(nextButtonAction:);
+            nextButtonVC.action = #selector(_signUpButtonAction)
+            
+            nextButtonVC.button(type: .Cta, size: .l)
+            
+            if (box!.isEqual(to: self.next1Box)) {
+                self._next1ButtonVC = nextButtonVC
+            } else if (box!.isEqual(to: self.next2Box)) {
+                self._next2ButtonVC = nextButtonVC
+            } else if (box!.isEqual(to: self.next3Box)) {
+                self._next3ButtonVC = nextButtonVC
+            } else if (box!.isEqual(to: self.next4Box)) {
+                self._next4ButtonVC = nextButtonVC
+            } else if (box!.isEqual(to: self.next5Box)) {
+    //            self.next5
+            }
+        }
+        
+        self.remindMeLaterBox.borderType = .noBorder
+        self._remindMeLaterButtonVC = KMDesignButton(withType: .Text)
+        self.remindMeLaterBox.contentView?.addSubview(self._remindMeLaterButtonVC!.view)
+        self._remindMeLaterButtonVC?.view.frame = self.remindMeLaterBox.contentView!.bounds
+        self._remindMeLaterButtonVC?.view.autoresizingMask = [.width, .height]
+        self._remindMeLaterButtonVC?.stringValue = KMLocalizedString("Remind Me Later", nil)
+        self._remindMeLaterButtonVC?.target = self
+        self._remindMeLaterButtonVC?.action = #selector(_remindMeLaterButtonAction)
+        self._remindMeLaterButtonVC?.button(type: .Text, size: .m)
+        
+        self.signUpBox.borderType = .noBorder
+        self._signUpButtonVC = KMDesignButton(withType: .Text)
+        self.signUpBox.contentView?.addSubview(self._signUpButtonVC!.view)
+        self._signUpButtonVC?.view.frame = self.signUpBox.contentView!.bounds
+        self._signUpButtonVC?.view.autoresizingMask = [.width, .height]
+        if (KMLightMemberManager.manager.isLogin()) { // let’s start
+            self._signUpButtonVC?.stringValue = KMLocalizedString("Let's Start", nil)
+        } else {
+            self._signUpButtonVC?.stringValue = KMLocalizedString("Sign up", nil)
+        }
+        
+        self._signUpButtonVC?.target = self;
+        self._signUpButtonVC?.action = #selector(_signUpButtonAction)
+        self._signUpButtonVC?.button(type: .Cta, size: .l)
+        
+        // , self.pageIndicator5
+        for pageindicator in [self.pageIndicator1, self.pageIndicator2, self.pageIndicator3, self.pageIndicator4, self.pageIndicator5, self.pageIndicator6] {
+            pageindicator?.numberOfPages = 6
+            pageindicator?.selectedColor = NSColor(red: 39.0/255.0, green: 60.0/255.0, blue: 98.0/255.0, alpha: 1)
+            pageindicator?.normalColor = NSColor(red: 0, green: 0, blue: 0, alpha: 0.2)
+            pageindicator?.pageIndicatorSize = NSMakeSize(6, 6)
+            pageindicator?.enabled = false
+            
+            if (pageindicator!.isEqual(to: self.pageIndicator1)) {
+                pageindicator?.currentPage = 0
+            } else if (pageindicator!.isEqual(to: self.pageIndicator2)) {
+                pageindicator?.currentPage = 1
+            } else if (pageindicator!.isEqual(to: self.pageIndicator3)) {
+                pageindicator?.currentPage = 2
+            } else if (pageindicator!.isEqual(to: self.pageIndicator4)) {
+                pageindicator?.currentPage = 3
+            } else if (pageindicator!.isEqual(to: self.pageIndicator5)) {
+                pageindicator?.currentPage = 5
+            } else if (pageindicator!.isEqual(to: self.pageIndicator6)) {
+                pageindicator?.currentPage = 4
+            }
+        }
+        
+        self.closeBox.moveCallback = { [unowned self] mouseEntered, mouseBox in
+            if (mouseEntered) {
+                self.closeButton.image = NSImage(named: "control_btn_icon_close_hov")
+            } else {
+                self.closeButton.image = NSImage(named: "control_btn_icon_close")
+            }
+        }
+        
+        for view in self.contentViews {
+            let label = NSTextField(labelWithString: KMLocalizedString("Sign up to Unlock Premium Features", nil))
+            view.addSubview(label)
+            label.frame = NSMakeRect(0, 14, NSWidth(view.frame), 18)
+            label.alignment = .center
+            label.font = NSFont(name: "SFProText-Regular", size: 14)
+            label.textColor = NSColor(red: 23.0/255.0, green: 112.0/255.0, blue: 244.0/255.0, alpha: 1)
+
+            if (KMLightMemberManager.manager.isLogin()) {
+                label.isHidden = true
+            } else {
+                label.isHidden = false
+            }
+        }
+        self.remindMeLaterBox.isHidden = true
+    }
+    
+    func setupUI() {
+        for titleLabel in [self.title1Label, self.title2Label, self.title3Label,
+                           self.title4Label, self.title6Label, self.title5Label] {
+            titleLabel?.font = .SFProTextSemiboldFont(20)
+            titleLabel?.textColor = NSColor(red: 37.0/255.0, green: 38.0/255.0, blue: 41.0/255.0, alpha:1)
+        }
+        
+        let ps = NSMutableParagraphStyle()
+        ps.lineSpacing = 6
+        ps.alignment = .center
+        for subtitleLabel in [self.subtitle1Label, self.subtitle2Label, self.subtitle3Label,
+                              self.subtitle4Label, self.subtitle6Label, self.subtitle5Label] {
+    //        if ([subtitleLabel isEqual:self.subtitle1Label]) {
+    //            NSMutableParagraphStyle *ps_ = [[NSMutableParagraphStyle alloc] init];
+    //            ps_.lineSpacing = 6;
+    //            ps_.alignment = NSTextAlignmentCenter;
+    //            subtitleLabel.attributedStringValue = [[NSAttributedString alloc] initWithString:subtitleLabel.stringValue attributes:@{
+    //                NSFontAttributeName : [NSFont fontWithName:@"SFProText-Regular" size:14],
+    //                NSForegroundColorAttributeName : [NSColor colorWithRed:97/255.f green:100/255.f blue:105/255.f alpha:1.f],
+    //                NSParagraphStyleAttributeName : ps_
+    //            }];
+    //        } else {
+            subtitleLabel?.attributedStringValue = NSAttributedString(string: subtitleLabel!.stringValue, attributes: [.font : NSFont.SFProTextRegularFont(14),
+                                                                               .foregroundColor : NSColor(red: 97.0/255.0, green: 100.0/255.0, blue: 105.0/255.0, alpha: 1),
+                                                                               .paragraphStyle : ps])
+    //        }
+        }
+    }
+    @IBAction func closeAction(_ sender: Any) {
+        self._closeAction()
+    }
+    
+    // MARK: - Private Methods
+    
+    private func _localizedString() {
+        self.imageView1.image = NSImage(named: "KMImageNameWelcome1")
+        self.imageView2.image = NSImage(named: "KMImageNameWelcome2")
+        self.imageView3.image = NSImage(named: "KMImageNameWelcomeAnnotation")
+        self.imageView4.image = NSImage(named: "KMImageNameWelcomeEdit")
+        self.imageView5.image = NSImage(named: "KMImageNameWelcomePageEdit")
+        self.imageView6.image = NSImage(named: "KMImageNameWelcomeConvert")
+        
+        
+        self.title1Label.stringValue = KMLocalizedString("The Brand New PDF Master", nil)
+        self.subtitle1Label.stringValue = KMLocalizedString("PDF Master Invites You to Enjoy All Advanced Features! Use the new powerful software integrated with AI technology to edit your PDFs", nil)
+        
+        self.title2Label.stringValue = KMLocalizedString("Process PDF Document wit AI Robot", nil)
+        self.subtitle2Label.stringValue = KMLocalizedString("Smart PDF AI robot, powered by Chatgpt helps you translate, rewrite, and correct PDFs with ease, bringing you an enhanced PDF experience.", nil)
+        
+        self.title3Label.stringValue = KMLocalizedString("Comment PDFs with Rich Annotation Tools", nil)
+        self.subtitle3Label.stringValue = KMLocalizedString("Add highlights, freehand, text, stamps, links, shapes, and notes to your documents. Easily mark up your PDFs anytime!", nil)
+        
+        self.title4Label.stringValue = KMLocalizedString("Edit Original Text and Images Like Word", nil)
+        self.subtitle4Label.stringValue = KMLocalizedString("Fix a typo or add a new text box in a PDF effortlessly. Crop, replace, rotate, flip, and export images as desired.", nil)
+        
+        self.title6Label.stringValue = KMLocalizedString("Organize PDF Pages with Ease", nil)
+        self.subtitle6Label.stringValue = KMLocalizedString("Drag and drop page thumbnails to rearrange pages. Or easily delete, insert, rotate, split pages.", nil)
+        
+        self.title5Label.stringValue = KMLocalizedString("Convert PDF to Office Fast and Easily", nil)
+        self.subtitle5Label.stringValue = KMLocalizedString("Convert PDF to editable Word, Excel, PPT, Text and image with all your fonts and formatting preserved.", nil)
+    }
+    
+    @objc private func _previousButtonAction() {
+        if (self._currentIndex <= 0) {
+            return
+        }
+        self._currentIndex -= 1
+        NSAnimationContext.beginGrouping()
+        let clipView = self.scrollView.contentView
+        var newOrigin = clipView.bounds.origin
+        newOrigin.x = clipView.bounds.size.width*self._currentIndex.cgFloat
+        clipView.animator().setBoundsOrigin(newOrigin)
+        NSAnimationContext.endGrouping()
+        
+        self._reloadData()
+    }
+    
+    @objc private func _nextButtonAction() {
+        if (self._currentIndex >= self.contentViews.count-1) {
+            return
+        }
+        self._currentIndex += 1
+        NSAnimationContext.beginGrouping()
+        let clipView = self.scrollView.contentView
+        var newOrigin = clipView.bounds.origin
+        newOrigin.x = clipView.bounds.size.width*self._currentIndex.cgFloat
+        clipView.animator().setBoundsOrigin(newOrigin)
+        NSAnimationContext.endGrouping()
+        
+        self._reloadData()
+    }
+    
+    @objc private func _signUpButtonAction() {
+        if (KMLightMemberManager.manager.isLogin()) {
+            self._closeAction()
+        } else {
+            if let callback = self.itemClick {
+                callback(3, self)
+            }
+            self.close()
+        }
+    }
+    
+    private func _closeAction() {
+        if let callback = self.itemClick {
+            callback(1, self)
+        }
+        self.close()
+    }
+    
+    @objc private func _remindMeLaterButtonAction() {
+        UserDefaults.standard.set(true, forKey: KMWelcomeWindowC.Key.remindMeLater)
+        UserDefaults.standard.synchronize()
+        
+        if let callback = self.itemClick {
+            callback(2, self)
+        }
+        self.close()
+    }
+    
+    private func _reloadData() {
+        self.preBox.isHidden = false
+        self.nextBox.isHidden = false
+        
+        if (self._currentIndex == 0) {
+            self.preBox.isHidden = true
+        } else if (self._currentIndex == 1) {
+        } else if (self._currentIndex == 2) {
+    //        self.nextBox.hidden = YES;
+        } else if (self._currentIndex == 3) {
+        } else if (self._currentIndex == 4){
+            
+        } else if (self._currentIndex == 5) {
+            self.nextBox.isHidden = true
+        }
+    }
+    
+    class func welcomeHasShow() -> Bool {
+        return UserDefaults.standard.bool(forKey: KMWelcomeWindowC.Key.hasShow)
+    }
+}

+ 4 - 4
PDF Office/PDF Master/Class/Welcome/OC/WelcomeWindowController.xib

@@ -6,7 +6,7 @@
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>
-        <customObject id="-2" userLabel="File's Owner" customClass="WelcomeWindowController">
+        <customObject id="-2" userLabel="File's Owner" customClass="KMWelcomeWindowController" customModule="PDF_Master" customModuleProvider="target">
             <connections>
                 <outlet property="closeBox" destination="t8U-ht-DCL" id="HRw-hz-pS0"/>
                 <outlet property="closeButton" destination="U10-qJ-w21" id="Yfd-T9-m1l"/>
@@ -36,7 +36,7 @@
                 <outlet property="pageIndicator6" destination="uU2-Wp-stU" id="bZh-yX-B2O"/>
                 <outlet property="preBox" destination="unK-gf-jBV" id="rmV-ne-Fch"/>
                 <outlet property="remindMeLaterBox" destination="u1V-bv-2uL" id="gVC-fR-hny"/>
-                <outlet property="scrollView" destination="hlh-7g-Id4" id="p7G-QW-213"/>
+                <outlet property="scrollView" destination="hlh-7g-Id4" id="g31-dm-yc9"/>
                 <outlet property="signUpBox" destination="HKs-gQ-A5L" id="cb9-ZU-j6W"/>
                 <outlet property="subtitle1Label" destination="rdz-C9-3re" id="duA-Td-1Bb"/>
                 <outlet property="subtitle2Label" destination="1ss-uW-LkC" id="1i7-Ux-ToB"/>
@@ -59,7 +59,7 @@
             <windowStyleMask key="styleMask" titled="YES" closable="YES"/>
             <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
             <rect key="contentRect" x="324" y="235" width="586" height="568"/>
-            <rect key="screenRect" x="0.0" y="0.0" width="1440" height="875"/>
+            <rect key="screenRect" x="0.0" y="0.0" width="1440" height="900"/>
             <value key="minSize" type="size" width="586" height="568"/>
             <value key="maxSize" type="size" width="586" height="568"/>
             <value key="minFullScreenContentSize" type="size" width="586" height="568"/>
@@ -111,7 +111,7 @@
                             <font key="font" metaFont="system"/>
                         </buttonCell>
                         <connections>
-                            <action selector="closeAction:" target="-2" id="bGN-d5-dAH"/>
+                            <action selector="closeAction:" target="-2" id="NG3-tO-oJM"/>
                         </connections>
                     </button>
                     <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="unK-gf-jBV">