Browse Source

【搜索替换】补充UI

tangchao 7 months ago
parent
commit
f66471b18c
12 changed files with 447 additions and 21 deletions
  1. 6 0
      PDF Office/PDF Master/Class/Appearance/Image.xcassets/Tools/SearchReplace/Contents.json
  2. 21 0
      PDF Office/PDF Master/Class/Appearance/Image.xcassets/Tools/SearchReplace/KMImageNameReplaceIcon.imageset/Contents.json
  3. BIN
      PDF Office/PDF Master/Class/Appearance/Image.xcassets/Tools/SearchReplace/KMImageNameReplaceIcon.imageset/replace.pdf
  4. 21 0
      PDF Office/PDF Master/Class/Appearance/Image.xcassets/Tools/SearchReplace/KMImageNameReplaceUnselectedIcon.imageset/Contents.json
  5. BIN
      PDF Office/PDF Master/Class/Appearance/Image.xcassets/Tools/SearchReplace/KMImageNameReplaceUnselectedIcon.imageset/replace.pdf
  6. 21 0
      PDF Office/PDF Master/Class/Appearance/Image.xcassets/Tools/SearchReplace/KMImageNameSearchIcon.imageset/Contents.json
  7. 81 0
      PDF Office/PDF Master/Class/Appearance/Image.xcassets/Tools/SearchReplace/KMImageNameSearchIcon.imageset/leftIcon.pdf
  8. 21 0
      PDF Office/PDF Master/Class/Appearance/Image.xcassets/Tools/SearchReplace/KMImageNameSearchUnselectedIcon.imageset/Contents.json
  9. 81 0
      PDF Office/PDF Master/Class/Appearance/Image.xcassets/Tools/SearchReplace/KMImageNameSearchUnselectedIcon.imageset/leftIcon.pdf
  10. 8 9
      PDF Office/PDF Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift
  11. 104 10
      PDF Office/PDF Master/Class/Tools/Search/Window/KMSearchReplaceWindowController.swift
  12. 83 2
      PDF Office/PDF Master/Class/Tools/Search/Window/KMSearchReplaceWindowController.xib

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

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

+ 21 - 0
PDF Office/PDF Master/Class/Appearance/Image.xcassets/Tools/SearchReplace/KMImageNameReplaceIcon.imageset/Contents.json

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

BIN
PDF Office/PDF Master/Class/Appearance/Image.xcassets/Tools/SearchReplace/KMImageNameReplaceIcon.imageset/replace.pdf


+ 21 - 0
PDF Office/PDF Master/Class/Appearance/Image.xcassets/Tools/SearchReplace/KMImageNameReplaceUnselectedIcon.imageset/Contents.json

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

BIN
PDF Office/PDF Master/Class/Appearance/Image.xcassets/Tools/SearchReplace/KMImageNameReplaceUnselectedIcon.imageset/replace.pdf


+ 21 - 0
PDF Office/PDF Master/Class/Appearance/Image.xcassets/Tools/SearchReplace/KMImageNameSearchIcon.imageset/Contents.json

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

+ 81 - 0
PDF Office/PDF Master/Class/Appearance/Image.xcassets/Tools/SearchReplace/KMImageNameSearchIcon.imageset/leftIcon.pdf

@@ -0,0 +1,81 @@
+%PDF-1.7
+
+1 0 obj
+  << >>
+endobj
+
+2 0 obj
+  << /Length 3 0 R >>
+stream
+/DeviceRGB CS
+/DeviceRGB cs
+q
+1.000000 0.000000 -0.000000 1.000000 0.000000 0.146446 cm
+0.056471 0.065882 0.080000 scn
+12.000000 9.353554 m
+12.000000 6.315988 9.537566 3.853554 6.500000 3.853554 c
+3.462434 3.853554 1.000000 6.315988 1.000000 9.353554 c
+1.000000 12.391120 3.462434 14.853554 6.500000 14.853554 c
+9.537566 14.853554 12.000000 12.391120 12.000000 9.353554 c
+h
+10.729105 4.417341 m
+9.592338 3.442505 8.114947 2.853554 6.500000 2.853554 c
+2.910149 2.853554 0.000000 5.763703 0.000000 9.353554 c
+0.000000 12.943405 2.910149 15.853554 6.500000 15.853554 c
+10.089850 15.853554 13.000000 12.943405 13.000000 9.353554 c
+13.000000 7.738606 12.411049 6.261216 11.436213 5.124449 c
+15.853554 0.707108 l
+15.146446 0.000000 l
+10.729105 4.417341 l
+h
+f*
+n
+Q
+
+endstream
+endobj
+
+3 0 obj
+  758
+endobj
+
+4 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 16.000000 16.000000 ]
+     /Resources 1 0 R
+     /Contents 2 0 R
+     /Parent 5 0 R
+  >>
+endobj
+
+5 0 obj
+  << /Kids [ 4 0 R ]
+     /Count 1
+     /Type /Pages
+  >>
+endobj
+
+6 0 obj
+  << /Pages 5 0 R
+     /Type /Catalog
+  >>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000010 00000 n
+0000000034 00000 n
+0000000848 00000 n
+0000000870 00000 n
+0000001043 00000 n
+0000001117 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 6 0 R
+   /Size 7
+>>
+startxref
+1176
+%%EOF

+ 21 - 0
PDF Office/PDF Master/Class/Appearance/Image.xcassets/Tools/SearchReplace/KMImageNameSearchUnselectedIcon.imageset/Contents.json

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

+ 81 - 0
PDF Office/PDF Master/Class/Appearance/Image.xcassets/Tools/SearchReplace/KMImageNameSearchUnselectedIcon.imageset/leftIcon.pdf

@@ -0,0 +1,81 @@
+%PDF-1.7
+
+1 0 obj
+  << >>
+endobj
+
+2 0 obj
+  << /Length 3 0 R >>
+stream
+/DeviceRGB CS
+/DeviceRGB cs
+q
+1.000000 0.000000 -0.000000 1.000000 0.000000 0.146446 cm
+0.460000 0.465714 0.500000 scn
+12.000000 9.353554 m
+12.000000 6.315988 9.537566 3.853554 6.500000 3.853554 c
+3.462434 3.853554 1.000000 6.315988 1.000000 9.353554 c
+1.000000 12.391120 3.462434 14.853554 6.500000 14.853554 c
+9.537566 14.853554 12.000000 12.391120 12.000000 9.353554 c
+h
+10.729105 4.417341 m
+9.592338 3.442505 8.114947 2.853554 6.500000 2.853554 c
+2.910149 2.853554 0.000000 5.763703 0.000000 9.353554 c
+0.000000 12.943405 2.910149 15.853554 6.500000 15.853554 c
+10.089850 15.853554 13.000000 12.943405 13.000000 9.353554 c
+13.000000 7.738606 12.411049 6.261216 11.436213 5.124449 c
+15.853554 0.707108 l
+15.146446 0.000000 l
+10.729105 4.417341 l
+h
+f*
+n
+Q
+
+endstream
+endobj
+
+3 0 obj
+  758
+endobj
+
+4 0 obj
+  << /Annots []
+     /Type /Page
+     /MediaBox [ 0.000000 0.000000 16.000000 16.000000 ]
+     /Resources 1 0 R
+     /Contents 2 0 R
+     /Parent 5 0 R
+  >>
+endobj
+
+5 0 obj
+  << /Kids [ 4 0 R ]
+     /Count 1
+     /Type /Pages
+  >>
+endobj
+
+6 0 obj
+  << /Pages 5 0 R
+     /Type /Catalog
+  >>
+endobj
+
+xref
+0 7
+0000000000 65535 f
+0000000010 00000 n
+0000000034 00000 n
+0000000848 00000 n
+0000000870 00000 n
+0000001043 00000 n
+0000001117 00000 n
+trailer
+<< /ID [ (some) (id) ]
+   /Root 6 0 R
+   /Size 7
+>>
+startxref
+1176
+%%EOF

+ 8 - 9
PDF Office/PDF Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift

@@ -4594,19 +4594,18 @@ extension KMMainViewController : KMMainToolbarControllerDelegate {
             FMTrackEventManager.defaultManager.trackEvent(event: "SubTbr_Editor", withProperties: ["SubTbr_Btn": "Btn_SubTbr_Editor_Security"])
         } else if toolbarItem.itemIdentifier == KMDocumentSearchToolbarItemIdentifier {
             if index == 11 {
-                let winC = KMSearchReplaceWindowController(with: self.listView)
-//                if let win = winC.window {
-//                    self.view .window?.addChildWindow(win, ordered: .above)
-//                }
-//                winC.showWindow(nil)
-//                self.view.window?.beginSheet(winC.window!)
-//                self.view.window?.beginCriticalSheet(winC.window!)
-//                NSApp.runModal(for: winC.window!)
-//                NSApp.beginModalSession(for: winC.window!)
                 self.view.window?.makeFirstResponder(nil)
+                let winC = KMSearchReplaceWindowController(with: self.listView, type: .search)
                 winC.startModal(nil)
             } else if index == 12 {
+                if IAPProductsManager.default().isAvailableAllFunction() == false {
+                    KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+                    return
+                }
                 
+                self.view.window?.makeFirstResponder(nil)
+                let winC = KMSearchReplaceWindowController(with: self.listView, type: .replace)
+                winC.startModal(nil)
             } else {
                 self.toolbarController.showFindBar()
             }

+ 104 - 10
PDF Office/PDF Master/Class/Tools/Search/Window/KMSearchReplaceWindowController.swift

@@ -8,14 +8,6 @@
 import Cocoa
 
 class KMSearchReplaceWindowController_Window: NSWindow {
-//    override var isMainWindow: Bool {
-//        return true
-//    }
-//
-//    override var isKeyWindow: Bool {
-//        return true
-//    }
-    
     override var canBecomeMain: Bool {
         return true
     }
@@ -25,11 +17,22 @@ class KMSearchReplaceWindowController_Window: NSWindow {
     }
 }
 
+@objc enum KMSearchReplaceType: Int {
+    case none = 0
+    case search = 1
+    case replace = 2
+}
+
 class KMSearchReplaceWindowController: NSWindowController {
     @IBOutlet weak var titleBarBox: NSBox!
     @IBOutlet weak var closeButton: NSButton!
     
     @IBOutlet weak var tabBox: NSBox!
+    @IBOutlet weak var searchTabButton: NSButton!
+    @IBOutlet weak var replaceTabButton: NSButton!
+    @IBOutlet weak var tabBottomLine: NSBox!
+    @IBOutlet weak var tabSelectedLine: NSBox!
+    @IBOutlet weak var tabSelectedLineLeftConst: NSLayoutConstraint!
     
     @IBOutlet weak var searchBox: NSBox!
     @IBOutlet weak var searchTitleLabel: NSTextField!
@@ -48,32 +51,56 @@ class KMSearchReplaceWindowController: NSWindowController {
     private var _modalSession: NSApplication.ModalSession?
     
     private var handdler: KMSearchReplaceHanddler = KMSearchReplaceHanddler()
+    private var type_: KMSearchReplaceType = .search
     
     deinit {
         KMPrint("KMSearchReplaceWindowController deinit.")
     }
     
-    convenience init(with pdfView: CPDFView?) {
+    convenience init(with pdfView: CPDFView?, type: KMSearchReplaceType) {
         self.init(windowNibName: "KMSearchReplaceWindowController")
         
         self.handdler.pdfView = pdfView
+        self.type_ = type
     }
 
     override func windowDidLoad() {
         super.windowDidLoad()
 
         self.initDefaultValue()
+        self.switchType(self.type_)
     }
     
     func initDefaultValue() {
         self.window?.isMovableByWindowBackground = true
         
+        self.titleBarBox.boxType = .custom
+        self.titleBarBox.borderWidth = 0
         self.closeButton.imagePosition = .imageOnly
         self.closeButton.image = NSImage(named: "KMImageNameUXIconBtnCloseNor")
         self.closeButton.target = self
         self.closeButton.action = #selector(_closeAction)
         
+        self.searchTabButton.target = self
+        self.searchTabButton.action = #selector(_searchTabAction)
+        self.searchTabButton.title = "  \(NSLocalizedString("Search", comment: ""))"
+        self.searchTabButton.image = NSImage(named: "KMImageNameSearchIcon")
+        self.searchTabButton.imagePosition = .imageLeft
+//        self.searchTabButton.imageHugsTitle = true
+        
+        self.replaceTabButton.target = self
+        self.replaceTabButton.action = #selector(_replaceTabAction)
+        self.replaceTabButton.title = "  \(NSLocalizedString("Replace", comment: ""))"
+        self.replaceTabButton.image = NSImage(named: "KMImageNameReplaceIcon")
+        self.replaceTabButton.imagePosition = .imageLeft
+        self.tabSelectedLine.borderWidth = 0
+        self.tabSelectedLine.fillColor = NSColor(hex: "#4982E6")
+        
+        self.searchBox.borderWidth = 0
         self.searchTitleLabel.stringValue = NSLocalizedString("Search", comment: "")
+        self.searchInputBox.cornerRadius = 0
+        self.searchInputView.drawsBackground = false
+        self.searchInputView.isBordered = false
         self.searchInputView.delegate = self
         
         self.matchWholeCheck.title = NSLocalizedString("Whole Words Only", comment: "")
@@ -111,6 +138,71 @@ class KMSearchReplaceWindowController: NSWindowController {
         self.handdler.showSelection(model.selection)
     }
     
+    @objc private func _searchTabAction(_ sender: NSButton) {
+        self.switchType(.search, animate: true)
+    }
+    
+    @objc private func _replaceTabAction(_ sender: NSButton) {
+        self.switchType(.replace, animate: true)
+    }
+    
+    func switchType(_ type: KMSearchReplaceType, animate: Bool = false) {
+        if type == .replace {
+            if IAPProductsManager.default().isAvailableAllFunction() == false {
+                KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+                return
+            }
+        }
+        
+        self.type_ = type
+        
+        let selectedColor = NSColor(hex: "0E1114")
+        let unSelectedColor = NSColor(hex: "757780")
+        if type == .search { // 248
+            self.tabSelectedLineLeftConst.constant = 24
+            
+            self.searchTabButton.setTitleColor(selectedColor)
+            self.searchTabButton.image = NSImage(named: "KMImageNameSearchIcon")
+            self.replaceTabButton.setTitleColor(unSelectedColor)
+            self.replaceTabButton.image = NSImage(named: "KMImageNameReplaceUnselectedIcon")
+            
+//            DispatchQueue.main.async {
+                self.replaceBox.isHidden = true
+                self.bottomBarBox.isHidden = true
+//            }
+            
+            var frame = self.window?.frame ?? .zero
+            let height: CGFloat = 248+20
+            let heightOffset = frame.size.height - height
+            frame.origin.y += heightOffset
+            frame.size.height = height
+            self.window?.setFrame(frame, display: true, animate: animate)
+            self.window?.minSize = frame.size
+            self.window?.maxSize = frame.size
+        } else if type == .replace { // 388
+            self.tabSelectedLineLeftConst.constant = 140
+            
+            self.searchTabButton.setTitleColor(unSelectedColor)
+            self.searchTabButton.image = NSImage(named: "KMImageNameSearchUnselectedIcon")
+            self.replaceTabButton.setTitleColor(selectedColor)
+            self.replaceTabButton.image = NSImage(named: "KMImageNameReplaceIcon")
+            
+            DispatchQueue.main.async {
+                self.replaceBox.isHidden = false
+                self.bottomBarBox.isHidden = false
+            }
+            
+            var frame = self.window?.frame ?? .zero
+            let height:CGFloat = 388
+            let heightOffset = frame.size.height-height
+            frame.origin.y += heightOffset
+            frame.size.height = height
+            self.window?.setFrame(frame, display: true, animate: animate)
+            self.window?.minSize = frame.size
+            self.window?.maxSize = frame.size
+        }
+    }
+    
     func startModal(_ sender: AnyObject?) {
         NSApp.stopModal()
         
@@ -147,7 +239,9 @@ extension KMSearchReplaceWindowController: NSTextFieldDelegate {
             if let inputView = control as? NSTextField {
 //                //当当前TextField按下enter
                 if inputView == self.searchInputView {
-                    self.handdler.search(keyword: self.searchInputView.stringValue, isCase: false, isWholeWord: false, callback: { [weak self] datas in
+                    let isCase = self.caseSensitiveCheck.state == .on
+                    let isWholeWord = self.matchWholeCheck.state == .on
+                    self.handdler.search(keyword: self.searchInputView.stringValue, isCase: isCase, isWholeWord: isWholeWord, callback: { [weak self] datas in
                         if let sel = datas?.first?.selection {
                             self?.handdler.showIdx = 0
                             self?.handdler.showSelection(sel)

+ 83 - 2
PDF Office/PDF Master/Class/Tools/Search/Window/KMSearchReplaceWindowController.xib

@@ -17,11 +17,16 @@
                 <outlet property="replaceAllButton" destination="fxe-UM-ZCK" id="UgL-wl-Ytq"/>
                 <outlet property="replaceBox" destination="4kx-6q-nJ8" id="fTS-By-eXX"/>
                 <outlet property="replaceButton" destination="3l4-91-BR7" id="7ao-WQ-KzS"/>
+                <outlet property="replaceTabButton" destination="glm-Go-gH2" id="Wg5-Jc-yco"/>
                 <outlet property="searchBox" destination="cdc-3d-gh5" id="9Se-Lu-XEN"/>
                 <outlet property="searchInputBox" destination="Ej6-th-OuJ" id="2SX-y1-k6p"/>
                 <outlet property="searchInputView" destination="xLT-x3-sTt" id="XDG-eW-Z14"/>
+                <outlet property="searchTabButton" destination="1cp-Kv-Xgy" id="ErO-ct-H2f"/>
                 <outlet property="searchTitleLabel" destination="kXL-bh-JQK" id="FDZ-6m-m7N"/>
+                <outlet property="tabBottomLine" destination="Wap-a3-1zt" id="Od9-va-tNP"/>
                 <outlet property="tabBox" destination="TYX-fO-lan" id="k0D-nW-DRi"/>
+                <outlet property="tabSelectedLine" destination="lKS-tK-sLu" id="gJs-LM-97f"/>
+                <outlet property="tabSelectedLineLeftConst" destination="Kux-3H-btA" id="il6-6v-P26"/>
                 <outlet property="titleBarBox" destination="h69-NL-IH7" id="CIc-G8-vOa"/>
                 <outlet property="window" destination="F0z-JX-Cv5" id="gIp-Ho-8D9"/>
             </connections>
@@ -64,11 +69,87 @@
                             <constraint firstAttribute="height" constant="40" id="QCO-3b-P69"/>
                         </constraints>
                     </box>
-                    <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="TYX-fO-lan">
+                    <box boxType="custom" borderWidth="0.0" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="TYX-fO-lan">
                         <rect key="frame" x="0.0" y="308" width="280" height="40"/>
                         <view key="contentView" id="kB0-PA-LMT">
-                            <rect key="frame" x="1" y="1" width="278" height="38"/>
+                            <rect key="frame" x="0.0" y="0.0" width="280" height="40"/>
                             <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                            <subviews>
+                                <box boxType="custom" borderWidth="0.0" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="s0x-OF-qoP">
+                                    <rect key="frame" x="16" y="0.0" width="124" height="40"/>
+                                    <view key="contentView" id="Yce-JC-LZV">
+                                        <rect key="frame" x="0.0" y="0.0" width="124" height="40"/>
+                                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                        <subviews>
+                                            <button verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1cp-Kv-Xgy">
+                                                <rect key="frame" x="31" y="11" width="61" height="20"/>
+                                                <buttonCell key="cell" type="bevel" title="Button" bezelStyle="rounded" alignment="center" imageScaling="proportionallyDown" inset="2" id="OvP-aq-dIx">
+                                                    <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                                    <font key="font" metaFont="system"/>
+                                                </buttonCell>
+                                            </button>
+                                        </subviews>
+                                        <constraints>
+                                            <constraint firstItem="1cp-Kv-Xgy" firstAttribute="centerX" secondItem="Yce-JC-LZV" secondAttribute="centerX" id="Bi3-Uq-HFt"/>
+                                            <constraint firstItem="1cp-Kv-Xgy" firstAttribute="centerY" secondItem="Yce-JC-LZV" secondAttribute="centerY" id="gLr-TR-LUR"/>
+                                        </constraints>
+                                    </view>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="124" id="jqg-aJ-xBg"/>
+                                    </constraints>
+                                </box>
+                                <box boxType="custom" borderWidth="0.0" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="1Fg-ni-eIe">
+                                    <rect key="frame" x="140" y="0.0" width="124" height="40"/>
+                                    <view key="contentView" id="96H-Ea-IeV">
+                                        <rect key="frame" x="0.0" y="0.0" width="124" height="40"/>
+                                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                        <subviews>
+                                            <button verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="glm-Go-gH2">
+                                                <rect key="frame" x="31" y="11" width="61" height="20"/>
+                                                <buttonCell key="cell" type="bevel" title="Button" bezelStyle="rounded" alignment="center" imageScaling="proportionallyDown" inset="2" id="vZr-jX-B2q">
+                                                    <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                                    <font key="font" metaFont="system"/>
+                                                </buttonCell>
+                                            </button>
+                                        </subviews>
+                                        <constraints>
+                                            <constraint firstItem="glm-Go-gH2" firstAttribute="centerY" secondItem="96H-Ea-IeV" secondAttribute="centerY" id="7lN-qV-XtE"/>
+                                            <constraint firstItem="glm-Go-gH2" firstAttribute="centerX" secondItem="96H-Ea-IeV" secondAttribute="centerX" id="gB4-g4-tkg"/>
+                                        </constraints>
+                                    </view>
+                                    <constraints>
+                                        <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="124" id="JIi-PH-kJY"/>
+                                        <constraint firstAttribute="width" constant="124" id="PBE-Dw-5nl"/>
+                                    </constraints>
+                                </box>
+                                <box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="Wap-a3-1zt">
+                                    <rect key="frame" x="16" y="-2" width="248" height="5"/>
+                                </box>
+                                <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="lKS-tK-sLu">
+                                    <rect key="frame" x="24" y="1" width="116" height="2"/>
+                                    <view key="contentView" id="BuK-6J-cGL">
+                                        <rect key="frame" x="1" y="1" width="114" height="0.0"/>
+                                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                    </view>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="116" id="ktu-xh-18e"/>
+                                        <constraint firstAttribute="height" constant="2" id="oyg-Z3-Hdd"/>
+                                    </constraints>
+                                </box>
+                            </subviews>
+                            <constraints>
+                                <constraint firstItem="s0x-OF-qoP" firstAttribute="leading" secondItem="kB0-PA-LMT" secondAttribute="leading" constant="16" id="6gG-BF-RMr"/>
+                                <constraint firstAttribute="trailing" secondItem="Wap-a3-1zt" secondAttribute="trailing" constant="16" id="CNc-d5-Pj5"/>
+                                <constraint firstAttribute="bottom" secondItem="1Fg-ni-eIe" secondAttribute="bottom" id="GIS-iT-Wgm"/>
+                                <constraint firstItem="s0x-OF-qoP" firstAttribute="top" secondItem="kB0-PA-LMT" secondAttribute="top" id="JnH-Np-WHH"/>
+                                <constraint firstItem="lKS-tK-sLu" firstAttribute="leading" secondItem="kB0-PA-LMT" secondAttribute="leading" constant="24" id="Kux-3H-btA"/>
+                                <constraint firstAttribute="trailing" secondItem="1Fg-ni-eIe" secondAttribute="trailing" constant="16" id="MFW-cJ-Mrb"/>
+                                <constraint firstAttribute="bottom" secondItem="Wap-a3-1zt" secondAttribute="bottom" id="SjT-EL-rpj"/>
+                                <constraint firstItem="1Fg-ni-eIe" firstAttribute="top" secondItem="kB0-PA-LMT" secondAttribute="top" id="adE-jm-BOz"/>
+                                <constraint firstItem="Wap-a3-1zt" firstAttribute="leading" secondItem="kB0-PA-LMT" secondAttribute="leading" constant="16" id="mrg-sJ-e9N"/>
+                                <constraint firstAttribute="bottom" secondItem="lKS-tK-sLu" secondAttribute="bottom" constant="0.5" id="of3-un-7lz"/>
+                                <constraint firstAttribute="bottom" secondItem="s0x-OF-qoP" secondAttribute="bottom" id="z6d-FL-xhz"/>
+                            </constraints>
                         </view>
                         <constraints>
                             <constraint firstAttribute="height" constant="40" id="D6x-KS-trS"/>