Browse Source

【综合】用户反馈新增pop菜单

tangchao 7 months ago
parent
commit
955f42f1d5

+ 6 - 0
PDF Office/PDF Master/Class/Appearance/Image.xcassets/Tools/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 6 - 0
PDF Office/PDF Master/Class/Appearance/Image.xcassets/Tools/UserFeekback/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 22 - 0
PDF Office/PDF Master/Class/Appearance/Image.xcassets/Tools/UserFeekback/KMImgNameUserFbHelpIcon.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "filename" : "Icon.pdf",
+      "idiom" : "universal"
+    },
+    {
+      "appearances" : [
+        {
+          "appearance" : "luminosity",
+          "value" : "dark"
+        }
+      ],
+      "filename" : "Icon 1.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 131 - 0
PDF Office/PDF Master/Class/Appearance/Image.xcassets/Tools/UserFeekback/KMImgNameUserFbHelpIcon.imageset/Icon 1.pdf

@@ -0,0 +1,131 @@
+%PDF-1.7
+
+1 0 obj
+  << /Length 2 0 R >>
+stream
+0.813965 0 0.124512 -0.117676 0.689453 1.055664 d1
+
+endstream
+endobj
+
+2 0 obj
+  51
+endobj
+
+3 0 obj
+  [ 0.813965 ]
+endobj
+
+4 0 obj
+  << /Length 5 0 R >>
+stream
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (FigmaPDF)
+   /Ordering (FigmaPDF)
+   /Supplement 0
+>> def
+/CMapName /A-B-C def
+/CMapType 2 def
+1 begincodespacerange
+<00> <FF>
+endcodespacerange
+1 beginbfchar
+<00> <DBC0DD4D>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+endstream
+endobj
+
+5 0 obj
+  336
+endobj
+
+6 0 obj
+  << /Subtype /Type3
+     /CharProcs << /C0 1 0 R >>
+     /Encoding << /Type /Encoding
+                  /Differences [ 0 /C0 ]
+               >>
+     /Widths 3 0 R
+     /FontBBox [ 0.000000 0.000000 0.000000 0.000000 ]
+     /FontMatrix [ 1.000000 0.000000 0.000000 1.000000 0.000000 0.000000 ]
+     /Type /Font
+     /ToUnicode 4 0 R
+     /FirstChar 0
+     /LastChar 0
+     /Resources << >>
+  >>
+endobj
+
+7 0 obj
+  << /Font << /F1 6 0 R >> >>
+endobj
+
+8 0 obj
+  << /Filter /FlateDecode
+     /Length 9 0 R
+  >>
+stream
+x¥•M¯d%†÷çWœ¥š( `;~%îÔ›¸PW�™ŒI÷$f¿Oh Îfû..ý@}½Õ/ß½ûç¯Û»_~|{~ûëñ²¾Ý>1»ÐZ«zu,Zöçc§Éù(ÙÇ3×´$�y§ìæø´©mc·cØHÝèXUXßÅãƺbc=éˆh'»
Gf9<mˆ½Øí6d¹èXQÍØÅãbÃÏûÃñÛ7ÇGd	Î_ŸÓ?oæjî­LÇ*êy{ÞE­I¶©¥*‹ª>sîÓíãÄ%¬±Wù3‚/(N5×|)Zb
+¥Œ€œëšävLF‚¤Ð4Ÿ÷#§±ªä�†ü]Ñn¡îår¸R™ðŽ0ýtÆ~=W¢LÖœê[VÆ“tœ¹o>‡÷
Îüú¢ìUt-´iÐ]\î>¬;ìÛPt~²¡.Az¦VD/<¦a`§&ÚƒtÕ€÷cf¸àªcÜB!ÙɺrAèϘeÝ¿@WlÒîÙZ/L:Vv²ïRËbÝ
>‰ÓSÛ!2áÊr¬LŠ¾K”nbÇ&Ú¥èñ€–ú{žÎÏü}éó—ùo+u¡Ö¤_ò| QUÐí»ÑƒØÉE)«I|IÉn[\õ¥¤°Ab&­$ª±ÄØQ
+âk¡ÄŽÜî"82J;™KÙke¹™±ì˜TÁ•@B6”�NC©ÖÙ^c䳫W�ä[`kÁ¥hèv“©†T§bP#ÔËC†„|*‹A,y+n1q1æLeâZŠBž‘ç"a„úL%좣¥�l¡¥eEZIÌ]GÚ¡NâUÂ$t˜3WÞì£xZ	¥£WàIÄI¾®Âì&Ë<#[^JÙÕeË*¸*Ò(©%‡l—]ÌÕòL®Q·N}™Én¦T̺¨W/‹ÜŽòì‚ÉôYMr¹DÚqî¡0Ìn²è‚dMñ,4OüŽš”Ú.[¶V 7Zlt&vüÆäër­±.�HXZÊ1¡Š‘j†4®wÒ$gf‡Ib	v½µyR¼P
VÅŽ²µ£õ0SXk¨bµ•ÈeÊöhŒÿ>ûõ§â�ýK¶Î±W¤—ý¹Cæ5‚’¶Ôì
+ò¼ÖK¸#ò.Ìôé
1s`ß’Q'²:8.Œ÷‘³¿1Ðð¶Ðu‡#»åmÖ°¢Ndô!öÿFØÛW›Ø`>Ë~.ö½ë}“­›¿>Ž—lž°Ïç|}ü~~õ˯Ï?ÏןŽï_Éï_c±é¶
+endstream
+endobj
+
+9 0 obj
+  933
+endobj
+
+10 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 36.000000 36.000000 ]
+     /Resources 7 0 R
+     /Contents 8 0 R
+     /Parent 11 0 R
+  >>
+endobj
+
+11 0 obj
+  << /Kids [ 10 0 R ]
+     /Count 1
+     /Type /Pages
+  >>
+endobj
+
+12 0 obj
+  << /Pages 11 0 R
+     /Type /Catalog
+  >>
+endobj
+
+xref
+0 13
+0000000000 65535 f
+0000000010 00000 n
+0000000117 00000 n
+0000000138 00000 n
+0000000169 00000 n
+0000000561 00000 n
+0000000583 00000 n
+0000000995 00000 n
+0000001041 00000 n
+0000002058 00000 n
+0000002080 00000 n
+0000002255 00000 n
+0000002331 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 12 0 R
+   /Size 13
+>>
+startxref
+2392
+%%EOF

+ 131 - 0
PDF Office/PDF Master/Class/Appearance/Image.xcassets/Tools/UserFeekback/KMImgNameUserFbHelpIcon.imageset/Icon.pdf

@@ -0,0 +1,131 @@
+%PDF-1.7
+
+1 0 obj
+  << /Length 2 0 R >>
+stream
+0.813965 0 0.124512 -0.117676 0.689453 1.055664 d1
+
+endstream
+endobj
+
+2 0 obj
+  51
+endobj
+
+3 0 obj
+  [ 0.813965 ]
+endobj
+
+4 0 obj
+  << /Length 5 0 R >>
+stream
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (FigmaPDF)
+   /Ordering (FigmaPDF)
+   /Supplement 0
+>> def
+/CMapName /A-B-C def
+/CMapType 2 def
+1 begincodespacerange
+<00> <FF>
+endcodespacerange
+1 beginbfchar
+<00> <DBC0DD4D>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+endstream
+endobj
+
+5 0 obj
+  336
+endobj
+
+6 0 obj
+  << /Subtype /Type3
+     /CharProcs << /C0 1 0 R >>
+     /Encoding << /Type /Encoding
+                  /Differences [ 0 /C0 ]
+               >>
+     /Widths 3 0 R
+     /FontBBox [ 0.000000 0.000000 0.000000 0.000000 ]
+     /FontMatrix [ 1.000000 0.000000 0.000000 1.000000 0.000000 0.000000 ]
+     /Type /Font
+     /ToUnicode 4 0 R
+     /FirstChar 0
+     /LastChar 0
+     /Resources << >>
+  >>
+endobj
+
+7 0 obj
+  << /Font << /F1 6 0 R >> >>
+endobj
+
+8 0 obj
+  << /Filter /FlateDecode
+     /Length 9 0 R
+  >>
+stream
+x¥•M¯d%†÷çWœ¥š( `;~%îÔ›¸PW�™ŒI÷$f¿Oh Îfû..ý@}½Õ/ß½ûç¯Û»_~|{~ûëñ²¾Ý>1»ÐZ«zu,Zöçc§Éù(ÙÇ3×´$�y§ìæø´©mc·cØHÝèXUXßÅãƺbc=éˆh'»
Gf9<mˆ½Øí6d¹èXQÍØÅãbÃÏûÃñÛ7ÇGd	Î_ŸÓ?oæjî­LÇ*êy{ÞE­I¶©¥*‹ª>sîÓíãÄ%¬±Wù3‚/(N5×|)Zb
+¥Œ€œëšävLF‚¤Ð4Ÿ÷#§±ªä�†ü]Ñn¡îår¸R™ðŽ0ýtÆ~=W¢LÖœê[VÆ“tœ¹o>‡÷
Îüú¢ìUt-´iÐ]\î>¬;ìÛPt~²¡.Az¦VD/<¦a`§&ÚƒtÕ€÷cf¸àªcÜB!ÙɺrAèϘeÝ¿@WlÒîÙZ/L:Vv²ïRËbÝ
>‰ÓSÛ!2áÊr¬LŠ¾K”nbÇ&Ú¥èñ€–ú{žÎÏü}éó—ùo+u¡Ö¤_ò| QUÐí»ÑƒØÉE)«I|IÉn[\õ¥¤°Ab&­$ª±ÄØQ
+âk¡ÄŽÜî"82J;™KÙke¹™±ì˜TÁ•@B6”�NC©ÖÙ^c䳫W�ä[`kÁ¥hèv“©†T§bP#ÔËC†„|*‹A,y+n1q1æLeâZŠBž‘ç"a„úL%좣¥�l¡¥eEZIÌ]GÚ¡NâUÂ$t˜3WÞì£xZ	¥£WàIÄI¾®Âì&Ë<#[^JÙÕeË*¸*Ò(©%‡l—]ÌÕòL®Q·N}™Én¦T̺¨W/‹ÜŽòì‚ÉôYMr¹DÚqî¡0Ìn²è‚dMñ,4OüŽš”Ú.[¶V 7Zlt&vüÆäër­±.�HXZÊ1¡Š‘j†4®wÒ$gf‡Ib	v½µyR¼P
VÅŽ²µ£õ0SXk¨bµ•ÈeÊöhŒÿ>ûõ§â�ýK¶Î±W¤—ý¹Cæ5‚’¶Ôì
+ò¼ÖK¸#ò.Ìôé
1s`ß’Q'²:8.Œ÷‘³¿1Ðð¶Ðu‡#»åmÖ°¢Ndô!öÿFØÛW›Ø`>Ë~.ö½ë}“­›¿>Ž—lž°Ïç|}ü~~õ˯Ï?ÏןŽï_Éï_c±é¶
+endstream
+endobj
+
+9 0 obj
+  933
+endobj
+
+10 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 36.000000 36.000000 ]
+     /Resources 7 0 R
+     /Contents 8 0 R
+     /Parent 11 0 R
+  >>
+endobj
+
+11 0 obj
+  << /Kids [ 10 0 R ]
+     /Count 1
+     /Type /Pages
+  >>
+endobj
+
+12 0 obj
+  << /Pages 11 0 R
+     /Type /Catalog
+  >>
+endobj
+
+xref
+0 13
+0000000000 65535 f
+0000000010 00000 n
+0000000117 00000 n
+0000000138 00000 n
+0000000169 00000 n
+0000000561 00000 n
+0000000583 00000 n
+0000000995 00000 n
+0000001041 00000 n
+0000002058 00000 n
+0000002080 00000 n
+0000002255 00000 n
+0000002331 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 12 0 R
+   /Size 13
+>>
+startxref
+2392
+%%EOF

+ 7 - 0
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/KMLeftSideViewController.swift

@@ -222,6 +222,8 @@ class KMLeftSideViewController: KMSideViewController {
     
     private var deletePages_ = Set<CPDFPage>()
     
+    let userFbHanddler = KMUserFeekbackHanddler()
+    
     deinit {
         KMPrint("KMLeftSideViewController deinit.")
         
@@ -297,6 +299,11 @@ class KMLeftSideViewController: KMSideViewController {
                 self.displayGroupedFindViewAnimating(false)
             }
         }
+        self.leftView.helpButton.coverAction = { [weak self] button, action in
+            if action == .enter {
+                self?.userFbHanddler.showUserFbPopView(sender: button)
+            }
+        }
         self.leftView.segmentedControl.block = { [unowned self] segIndex in
             self.toolButtonBox.isHidden = false
             self.toolButtonBoxLayoutConstraint.constant = 40.0

+ 10 - 0
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/View/KMBotaLeftView.swift

@@ -13,6 +13,14 @@ class KMBotaLeftView: NSView {
         return view
     }()
     
+    var helpButton: KMCoverButton = {
+       let view = KMCoverButton()
+        view.title = ""
+        view.image = NSImage(named: "KMImgNameUserFbHelpIcon")
+        view.isBordered = false
+        return view
+    }()
+    
     override init(frame frameRect: NSRect) {
         super.init(frame: frameRect)
         
@@ -29,6 +37,7 @@ class KMBotaLeftView: NSView {
     
     func initSubview() {
         self.addSubview(self.segmentedControl)
+        self.addSubview(self.helpButton)
     }
     
     func initDefaultValue() {
@@ -53,6 +62,7 @@ class KMBotaLeftView: NSView {
         super.layout()
         
         self.segmentedControl.frame = self.bounds
+        self.helpButton.frame = NSMakeRect(0, 0, 36, 36)
     }
 
     override func draw(_ dirtyRect: NSRect) {

+ 0 - 21
PDF Office/PDF Master/Class/Tools/UserFeekback/Tools/KMUserFeekbackHanddler.h

@@ -1,21 +0,0 @@
-//
-//  KMUserFeekbackHanddler.h
-//  PDF Reader Pro Edition
-//
-//  Created by tangchao on 2024/7/11.
-//
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-//@class SKMainWindowController;
-@interface KMUserFeekbackHanddler : NSObject
-
-//@property (nonatomic, weak) SKMainWindowController *mainWindowC;
-
-- (void)addButton;
-
-@end
-
-NS_ASSUME_NONNULL_END

+ 0 - 90
PDF Office/PDF Master/Class/Tools/UserFeekback/Tools/KMUserFeekbackHanddler.m

@@ -1,90 +0,0 @@
-//
-//  KMUserFeekbackHanddler.m
-//  PDF Reader Pro Edition
-//
-//  Created by tangchao on 2024/7/11.
-//
-
-#import "KMUserFeekbackHanddler.h"
-//#import "KMHoverButton.h"
-//#import "SKMainWindowController.h"
-//#import "SKApplicationController.h"
-//#import "NSWindow+PopOver.h"
-#import <PDF_Reader_Pro-Swift.h>
-
-@interface KMUserFeekbackHanddler ()
-
-@property (nonatomic, strong) NSPopover *popover_;
-
-@end
-
-@implementation KMUserFeekbackHanddler
-
-- (void)addButton {
-//    KMHoverButton *btn = [[KMHoverButton alloc] init];
-//    CGFloat btnWH = 16;
-//    CGFloat btnMargin = 8;
-//    CGFloat btnX = self.mainWindowC.window.contentView.frame.size.width-btnWH-btnMargin;
-//    CGFloat btnY = self.mainWindowC.window.contentView.frame.size.height-btnWH-btnMargin;
-//    btn.frame = NSMakeRect(btnX, btnY, btnWH, btnWH);
-//    [self.mainWindowC.window.contentView addSubview:btn];
-//    btn.autoresizingMask = NSViewMinXMargin | NSViewMinYMargin;
-//    btn.bordered = false;
-//    btn.title = @"";
-//    btn.image = [NSImage imageNamed:@"KMImageNameUserFeekbackIcon"];
-//
-//    __weak typeof (self) weakSelf = self;
-//    btn.hoverAction = ^(KMHoverButton * _Nonnull button, KMHoverAction action) {
-//        if (action == KMHoverActionEnter) {
-//            [weakSelf showUserFackBackPopView:button];
-//        } else if (action == KMHoverActionExit) {
-////            [weakSelf.popover_ close];
-//        }
-//    };
-}
-
-- (void)showUserFackBackPopView:(NSButton *)sender {
-//    NSArray *datas = @[NSLocalizedString(@"Report a Bug", @""), NSLocalizedString(@"Propose a New Feature", @""), @"KMHorizontalLine", NSLocalizedString(@"Quick Start Guide", @"")];
-//    KMNewHomePopViewController *vc = [[KMNewHomePopViewController alloc] initWithNibName:@"KMNewHomePopViewController" bundle:nil];
-//    [vc initWithPopViewDataArr:datas];
-//
-//    __weak typeof (self) weakSelf = self;
-//    vc.downCallback = ^(BOOL result, NSString * _Nonnull data) {
-//        [weakSelf.popover_ close];
-//
-//        NSInteger idx = [datas indexOfObject:data];
-//        if (idx == 3) {
-//            SKApplicationController *delegate = NSApplication.sharedApplication.delegate;
-//            [delegate quickStartGuide:nil];
-//            return;
-//        } else if (idx == 1) {
-//            [weakSelf showFeekbackWindowWithType:NSLocalizedString(@"Propose a New Feature", @"")];
-//        } else if (idx == 0) {
-//            [weakSelf showFeekbackWindowWithType:NSLocalizedString(@"Report a Bug", @"")];
-//        }
-//    };
-//
-//    NSPopover *popover = [[NSPopover alloc] init];
-//    popover.contentViewController = vc;
-//    popover.animates = YES;
-//    popover.behavior = NSPopoverBehaviorSemitransient;
-//    [popover setValue:@(true) forKey:@"shouldHideAnchor"];
-//
-//    CGRect sourcesRect = sender.bounds;
-//    sourcesRect = [sender convertRect:sourcesRect toView:nil];
-//    sourcesRect.origin.y-= 20;
-//    sourcesRect.size.height+=20;
-//    self.mainWindowC.window.popover = popover;
-//    self.mainWindowC.window.sourcesRect = sourcesRect;
-//
-//    [popover showRelativeToRect:sender.bounds ofView:sender preferredEdge:CGRectMaxYEdge];
-//    self.popover_ = popover;
-}
-
-- (void)showFeekbackWindowWithType:(NSString *)type {
-    KMUserFeekbackWindowController *winC = [KMUserFeekbackWindowController shared];
-    winC.typeString = type;
-    [winC showWindow:nil];
-}
-
-@end

+ 65 - 0
PDF Office/PDF Master/Class/Tools/UserFeekback/Tools/KMUserFeekbackHanddler.swift

@@ -0,0 +1,65 @@
+//
+//  KMUserFeekbackHanddler.swift
+//  PDF Reader Pro
+//
+//  Created by tangchao on 2024/7/17.
+//
+
+import Cocoa
+
+class KMUserFeekbackHanddler: NSObject {
+    private weak var popover_: NSPopover?
+    
+    func showUserFbPopView(sender: NSView) {
+        guard let _ = self.popover_ else {
+            return
+        }
+        
+        let datas = [NSLocalizedString("Report a Bug", comment: ""), NSLocalizedString("Propose a New Feature", comment: ""), "KMHorizontalLine", NSLocalizedString("Quick Start Guide", comment: "")]
+        let vc = KMHomePopViewController(nibName: "KMHomePopViewController", bundle: nil)
+        _ = vc.initWithPopViewDataArr(datas)
+        
+        vc.downCallback = { [weak self] result, data in
+            self?.popover_?.close()
+            
+            if data == NSLocalizedString("Report a Bug", comment: "") {
+                self?.showFeekbackWindow(with: data)
+            } else if data == NSLocalizedString("Propose a New Feature", comment: "") {
+                self?.showFeekbackWindow(with: data)
+            } else if data == NSLocalizedString("Quick Start Guide", comment: "") {
+                KMTools.openQuickStartStudy()
+            }
+        }
+
+        let popover = NSPopover()
+        popover.contentViewController = vc
+        popover.animates = true
+        popover.behavior = .semitransient
+        popover.setValue(true, forKey: "shouldHideAnchor")
+        popover.delegate = self
+        //
+        //    CGRect sourcesRect = sender.bounds;
+        //    sourcesRect = [sender convertRect:sourcesRect toView:nil];
+        //    sourcesRect.origin.y-= 20;
+        //    sourcesRect.size.height+=20;
+        //    self.mainWindowC.window.popover = popover;
+        //    self.mainWindowC.window.sourcesRect = sourcesRect;
+        
+        popover.show(relativeTo: sender.bounds, of: sender, preferredEdge: .maxX)
+        self.popover_ = popover
+    }
+    
+    func showFeekbackWindow(with type: String) {
+        let winC = KMUserFeekbackWindowController.shared
+        winC.typeString = type
+        winC.showWindow(nil)
+    }
+}
+
+extension KMUserFeekbackHanddler: NSPopoverDelegate {
+    func popoverWillClose(_ notification: Notification) {
+        if let data = self.popover_?.isEqual(to: notification.object), data {
+            self.popover_ = nil
+        }
+    }
+}

+ 1 - 1
PDF Office/PDF Master/Class/Tools/UserFeekback/View/KMUserFbListHeaderItemView.xib

@@ -31,7 +31,7 @@
                         <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                     </textFieldCell>
                 </textField>
-                <button horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="cfe-1a-esp" customClass="KMHoverButton">
+                <button horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="cfe-1a-esp" customClass="KMCoverButton" customModule="PDF_Reader_Pro" customModuleProvider="target">
                     <rect key="frame" x="36" y="-2" width="25" height="25"/>
                     <buttonCell key="cell" type="help" bezelStyle="helpButton" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="D1C-Za-1Nd">
                         <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>

+ 8 - 10
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -2656,9 +2656,6 @@
 		BB003035298D356E002DD1A0 /* KMPreferenceMarkupColorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB003034298D356E002DD1A0 /* KMPreferenceMarkupColorView.swift */; };
 		BB003036298D356E002DD1A0 /* KMPreferenceMarkupColorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB003034298D356E002DD1A0 /* KMPreferenceMarkupColorView.swift */; };
 		BB003037298D356E002DD1A0 /* KMPreferenceMarkupColorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB003034298D356E002DD1A0 /* KMPreferenceMarkupColorView.swift */; };
-		BB031B572C47BB080099F7AD /* KMUserFeekbackHanddler.m in Sources */ = {isa = PBXBuildFile; fileRef = BB031B402C47BB070099F7AD /* KMUserFeekbackHanddler.m */; };
-		BB031B582C47BB080099F7AD /* KMUserFeekbackHanddler.m in Sources */ = {isa = PBXBuildFile; fileRef = BB031B402C47BB070099F7AD /* KMUserFeekbackHanddler.m */; };
-		BB031B592C47BB080099F7AD /* KMUserFeekbackHanddler.m in Sources */ = {isa = PBXBuildFile; fileRef = BB031B402C47BB070099F7AD /* KMUserFeekbackHanddler.m */; };
 		BB031B5A2C47BB080099F7AD /* KMUserFbHelpPopController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B432C47BB070099F7AD /* KMUserFbHelpPopController.xib */; };
 		BB031B5B2C47BB080099F7AD /* KMUserFbHelpPopController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B432C47BB070099F7AD /* KMUserFbHelpPopController.xib */; };
 		BB031B5C2C47BB080099F7AD /* KMUserFbHelpPopController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B432C47BB070099F7AD /* KMUserFbHelpPopController.xib */; };
@@ -2710,6 +2707,9 @@
 		BB031B8A2C47BB090099F7AD /* KMUserFbDespItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B562C47BB070099F7AD /* KMUserFbDespItemView.xib */; };
 		BB031B8B2C47BB090099F7AD /* KMUserFbDespItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B562C47BB070099F7AD /* KMUserFbDespItemView.xib */; };
 		BB031B8C2C47BB090099F7AD /* KMUserFbDespItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B562C47BB070099F7AD /* KMUserFbDespItemView.xib */; };
+		BB031B8E2C47CEFA0099F7AD /* KMUserFeekbackHanddler.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B8D2C47CEFA0099F7AD /* KMUserFeekbackHanddler.swift */; };
+		BB031B8F2C47CEFA0099F7AD /* KMUserFeekbackHanddler.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B8D2C47CEFA0099F7AD /* KMUserFeekbackHanddler.swift */; };
+		BB031B902C47CEFA0099F7AD /* KMUserFeekbackHanddler.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B8D2C47CEFA0099F7AD /* KMUserFeekbackHanddler.swift */; };
 		BB0353C82B2987C40048A16C /* KMSnapshotWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0353C72B2987C40048A16C /* KMSnapshotWindow.swift */; };
 		BB0353C92B2987C40048A16C /* KMSnapshotWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0353C72B2987C40048A16C /* KMSnapshotWindow.swift */; };
 		BB0353CA2B2987C40048A16C /* KMSnapshotWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0353C72B2987C40048A16C /* KMSnapshotWindow.swift */; };
@@ -6429,8 +6429,6 @@
 		BB00301C298CB799002DD1A0 /* KMPreferenceManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPreferenceManager.swift; sourceTree = "<group>"; };
 		BB003020298CEBED002DD1A0 /* KMPreferenceStepper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPreferenceStepper.swift; sourceTree = "<group>"; };
 		BB003034298D356E002DD1A0 /* KMPreferenceMarkupColorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPreferenceMarkupColorView.swift; sourceTree = "<group>"; };
-		BB031B402C47BB070099F7AD /* KMUserFeekbackHanddler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KMUserFeekbackHanddler.m; sourceTree = "<group>"; };
-		BB031B412C47BB070099F7AD /* KMUserFeekbackHanddler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMUserFeekbackHanddler.h; sourceTree = "<group>"; };
 		BB031B432C47BB070099F7AD /* KMUserFbHelpPopController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMUserFbHelpPopController.xib; sourceTree = "<group>"; };
 		BB031B442C47BB070099F7AD /* KMUserFbHelpPopController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMUserFbHelpPopController.swift; sourceTree = "<group>"; };
 		BB031B462C47BB070099F7AD /* KMUserFeekbackWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMUserFeekbackWindowController.swift; sourceTree = "<group>"; };
@@ -6448,6 +6446,7 @@
 		BB031B542C47BB070099F7AD /* KMUserListItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMUserListItemView.swift; sourceTree = "<group>"; };
 		BB031B552C47BB070099F7AD /* KMUserFbTypeItemView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMUserFbTypeItemView.xib; sourceTree = "<group>"; };
 		BB031B562C47BB070099F7AD /* KMUserFbDespItemView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMUserFbDespItemView.xib; sourceTree = "<group>"; };
+		BB031B8D2C47CEFA0099F7AD /* KMUserFeekbackHanddler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMUserFeekbackHanddler.swift; sourceTree = "<group>"; };
 		BB0353C72B2987C40048A16C /* KMSnapshotWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMSnapshotWindow.swift; sourceTree = "<group>"; };
 		BB03D68B2B01C782008C9976 /* KMPDFEditInsertBlankPageWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPDFEditInsertBlankPageWindow.swift; sourceTree = "<group>"; };
 		BB03D68F2B01C7AA008C9976 /* KMPDFEditInsertBlankPageWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMPDFEditInsertBlankPageWindow.xib; sourceTree = "<group>"; };
@@ -10973,8 +10972,7 @@
 		BB031B3F2C47BB070099F7AD /* Tools */ = {
 			isa = PBXGroup;
 			children = (
-				BB031B402C47BB070099F7AD /* KMUserFeekbackHanddler.m */,
-				BB031B412C47BB070099F7AD /* KMUserFeekbackHanddler.h */,
+				BB031B8D2C47CEFA0099F7AD /* KMUserFeekbackHanddler.swift */,
 			);
 			path = Tools;
 			sourceTree = "<group>";
@@ -16506,6 +16504,7 @@
 				ADE86A9D2B031FDB00414DFA /* KMCompareWindowController.swift in Sources */,
 				BB14700E299DC0D100784A6A /* OIDScopes.m in Sources */,
 				9F0CB52D298656D900007028 /* KMDesignToken+BorderWidthRight.swift in Sources */,
+				BB031B8E2C47CEFA0099F7AD /* KMUserFeekbackHanddler.swift in Sources */,
 				BBCE57142A72713A00508EFC /* NSViewController+KMExtension.swift in Sources */,
 				8997011F28F41AB8009AF911 /* KMLeftSideViewController.swift in Sources */,
 				ADFA8EFD2B5649AE002595A4 /* KMAutoFlowOptionsSheetController.swift in Sources */,
@@ -16520,7 +16519,6 @@
 				9FAAA325290A69920046FFCE /* KMToolSetScroller.swift in Sources */,
 				BBBE208B2B21649100509C4E /* KMPDFEditWindowController.swift in Sources */,
 				AD0FA51229A9FA8600EDEB50 /* KMResetPasswordView.swift in Sources */,
-				BB031B572C47BB080099F7AD /* KMUserFeekbackHanddler.m in Sources */,
 				AD3AAD632B0DA3F600DE5FE7 /* KMCompareTextHeaderView.swift in Sources */,
 				BB3A668C2B06FD0100575343 /* KMBotaEnum.swift in Sources */,
 				BBFEF7172B3A77E700C28AC0 /* KMSystemFileMenu.swift in Sources */,
@@ -17923,7 +17921,6 @@
 				BB8F457F295B00130037EA22 /* KMWatermarkAdjectiveTools.swift in Sources */,
 				9FF816F42AFB18290087EFC5 /* NSGeometry_KMExtensions.swift in Sources */,
 				BB332D542995D8B500CABB58 /* KMCloudDocumentTools.swift in Sources */,
-				BB031B582C47BB080099F7AD /* KMUserFeekbackHanddler.m in Sources */,
 				BBA93D3429BF0ECE0044E0DD /* SKKeychain.m in Sources */,
 				9FCFEC752AC56ECE00EAD2CB /* CPDFListStampAnnotation.swift in Sources */,
 				BBB789AC2BE8BF2400F7E09C /* AIChatDefaultTIpItem.swift in Sources */,
@@ -17952,6 +17949,7 @@
 				ADDF83932B391A5D00A81A4E /* DSignatureFilelistRow.swift in Sources */,
 				ADD1B7032946C8AD00C3FFF7 /* KMBaseTextField.swift in Sources */,
 				8942F818292B678100389627 /* KMAnnotationTableCellView.swift in Sources */,
+				BB031B8F2C47CEFA0099F7AD /* KMUserFeekbackHanddler.swift in Sources */,
 				BB8F456A295ABDC10037EA22 /* KMWatermarkAdjectiveBaseModel.swift in Sources */,
 				BBFDFA952AF328B900E08AA2 /* KMBatchOperateManager.swift in Sources */,
 				9F0CB53A2986570600007028 /* KMDesignToken+BoxShadow.swift in Sources */,
@@ -18960,6 +18958,7 @@
 				BB276A502B0376A400AB5578 /* KMBatchOperateBaseViewController.swift in Sources */,
 				BBB9B321299A5D6D004F3235 /* KMGoogleDriveManager.m in Sources */,
 				BBA9221A2B4E783F0061057A /* KMPurchaseCompareDMGWindowController.m in Sources */,
+				BB031B902C47CEFA0099F7AD /* KMUserFeekbackHanddler.swift in Sources */,
 				9F1FE4DA29406E4700E952CA /* NSString+Utils.m in Sources */,
 				BBA00AC62B157C880043D903 /* KMToolbarZoomItemView.swift in Sources */,
 				BB4EEF4E2976544F003A3537 /* KMRedactAligementView.swift in Sources */,
@@ -18974,7 +18973,6 @@
 				AD055E802B88294F0035F824 /* SKBookmarkSheetController.m in Sources */,
 				ADDF835B2B391A5C00A81A4E /* CDSignatureCertificateStateViewController.swift in Sources */,
 				ADE86AB82B0343E600414DFA /* KMWatermarkView.swift in Sources */,
-				BB031B592C47BB080099F7AD /* KMUserFeekbackHanddler.m in Sources */,
 				BB897277294DC04F0045787C /* KMWatermartAdjectivePageRangeView.swift in Sources */,
 				BB3A66A02B0752A800575343 /* KMTocOutlineView.swift in Sources */,
 				AD7D5CD12B9573FF006562CD /* KMBookmarkOutlinePageCellView.swift in Sources */,