Browse Source

【综合】内容编辑悬浮窗多选场景补充

tangchao 8 months ago
parent
commit
6e5daca772

+ 16 - 2
PDF Office/PDF Master/Class/PDFTools/EditPDF/Controller/KMEditPDFPopToolBarController.swift

@@ -8,6 +8,7 @@
 import Cocoa
 
 @objc enum KMEditPDFToolbarItemKey: Int {
+    case none
     case color
     case fontStyle
     case fontAdd
@@ -36,6 +37,11 @@ import Cocoa
     case separator // 分割线
 }
 
+class KMEditPDFToolbarModel: NSObject {
+    var itemKey: KMEditPDFToolbarItemKey = .none
+    var isEnabled = true
+}
+
 class KMSeparatorLineView: NSView {
     var strokeColor: NSColor = .black {
         didSet {
@@ -79,6 +85,12 @@ class KMEditPDFPopToolBarController: NSViewController {
     var toolbarView: KMEditPDFToolbarView?
     var itemKeys: [KMEditPDFToolbarItemKey] = [] {
         didSet {
+//            self.toolbarView?.reloadData()
+        }
+    }
+    
+    var datas: [KMEditPDFToolbarModel] = [] {
+        didSet {
             self.toolbarView?.reloadData()
         }
     }
@@ -160,11 +172,12 @@ class KMEditPDFPopToolBarController: NSViewController {
 
 extension KMEditPDFPopToolBarController: KMEditPDFToolbarViewDelegate {
     func numberOfItems(in toolbarView: KMEditPDFToolbarView) -> Int {
-        return self.itemKeys.count
+        return self.datas.count
     }
     
     func toolbarView(_ toolbarView: KMEditPDFToolbarView, viewFor index: Int) -> NSView? {
-        let itemKey = self.itemKeys[index]
+        let model = self.datas[index]
+        let itemKey = model.itemKey
         if itemKey == .color {
             let colorView = KMEditPDFToolbarItemView()
             let view = KMEditPDFColorView()
@@ -240,6 +253,7 @@ extension KMEditPDFPopToolBarController: KMEditPDFToolbarViewDelegate {
         }
         
         viewC.tag = index
+        viewC.state = model.isEnabled ? .Norm : .Disabled
         viewC.target = self
         viewC.action = #selector(_buttonClick)
         

+ 211 - 8
PDF Office/PDF Master/Class/PDFTools/EditPDF/Model/KMEditPDFModel.swift

@@ -45,13 +45,216 @@ class KMEditPDFModel: NSObject {
     }
     
     var fontColors: [NSColor] = []
-//        get {
-//            guard let textAreas = self.textAreas else {
-//                return nil
-//            }
-//            for area in textAreas {
-//
-//            }
+    var fontNames: [String] = []
+    var fontSizes: [CGFloat] = []
+    var fontBolds: [Bool] = []
+    var fontItalics: [Bool] = []
+    var textAlignments: [NSTextAlignment] = []
+    var boundsArray: [NSRect] = []
+    var rotates: [CGFloat] = []
+    var opacitys: [CGFloat] = []
+    
+    func editAreasFontColorIsEqual() -> Bool {
+        let datas = self.fontColors
+        if datas.isEmpty {
+            return false
+        }
+        if datas.count == 1 {
+            return true
+        }
+        let color = datas.first
+        for (i, d) in datas.enumerated() {
+            if i == 0 {
+                continue
+            }
+            if d != color {
+                return false
+            }
+        }
+        return true
+    }
+    
+    func editAreasFontNameIsEqual() -> Bool {
+        let datas = self.fontNames
+        if datas.isEmpty {
+            return false
+        }
+        if datas.count == 1 {
+            return true
+        }
+        let data = datas.first
+        for (i, d) in datas.enumerated() {
+            if i == 0 {
+                continue
+            }
+            if d != data {
+                return false
+            }
+        }
+        return true
+    }
+    
+    func editAreasFontSizeIsEqual() -> Bool {
+        let datas = self.fontSizes
+        if datas.isEmpty {
+            return false
+        }
+        if datas.count == 1 {
+            return true
+        }
+        let data = datas.first
+        for (i, d) in datas.enumerated() {
+            if i == 0 {
+                continue
+            }
+            if d != data {
+                return false
+            }
+        }
+        return true
+    }
+    
+    func editAreasFontBoldIsEqual() -> Bool {
+        let datas = self.fontBolds
+        if datas.isEmpty {
+            return false
+        }
+        if datas.count == 1 {
+            return true
+        }
+        let data = datas.first
+        for (i, d) in datas.enumerated() {
+            if i == 0 {
+                continue
+            }
+            if d != data {
+                return false
+            }
+        }
+        return true
+    }
+    
+    func editAreasFontItalicIsEqual() -> Bool {
+        let datas = self.fontItalics
+        if datas.isEmpty {
+            return false
+        }
+        if datas.count == 1 {
+            return true
+        }
+        let data = datas.first
+        for (i, d) in datas.enumerated() {
+            if i == 0 {
+                continue
+            }
+            if d != data {
+                return false
+            }
+        }
+        return true
+    }
+    
+    func editAreasTextAlignmentIsEqual() -> Bool {
+        let datas = self.textAlignments
+        if datas.isEmpty {
+            return false
+        }
+        if datas.count == 1 {
+            return true
+        }
+        let data = datas.first?.rawValue ?? 0
+        for (i, d) in datas.enumerated() {
+            if i == 0 {
+                continue
+            }
+            if d.rawValue != data {
+                return false
+            }
+        }
+        return true
+    }
+    
+    func editAreasBoundsIsEqualForWidth() -> Bool {
+        let datas = self.boundsArray
+        if datas.isEmpty {
+            return false
+        }
+        if datas.count == 1 {
+            return true
+        }
+        let width = datas.first?.width ?? 0
+        for (i, rect) in datas.enumerated() {
+            if i == 0 {
+                continue
+            }
+            if width != rect.size.width {
+                return false
+            }
+        }
+        return true
+    }
+    
+    func editAreasBoundsIsEqualForHeight() -> Bool {
+        let datas = self.boundsArray
+        if datas.isEmpty {
+            return false
+        }
+        if datas.count == 1 {
+            return true
+        }
+        let height = datas.first?.height ?? 0
+        for (i, rect) in datas.enumerated() {
+            if i == 0 {
+                continue
+            }
+            if height != rect.size.height {
+                return false
+            }
+        }
+        return true
+    }
+    
+    func editAreasRotateIsEqual() -> Bool {
+        let datas = self.rotates
+        if datas.isEmpty {
+            return false
+        }
+//        if self.editAreasHavTextArea() {
+//            return false
 //        }
-//    }
+//        let datas = self._editAreasRotates()
+        if datas.count == 1 {
+            return true
+        }
+        let data = datas.first ?? 0
+        for (i, d) in datas.enumerated() {
+            if i == 0 {
+                continue
+            }
+            if data != d {
+                return false
+            }
+        }
+        return true
+    }
+    
+    func editAreasOpacityIsEqual() -> Bool {
+        let datas = self.opacitys
+        if datas.isEmpty {
+            return false
+        }
+        if datas.count == 1 {
+            return true
+        }
+        let data = datas.first ?? 0
+        for (i, d) in datas.enumerated() {
+            if i == 0 {
+                continue
+            }
+            if data != d {
+                return false
+            }
+        }
+        return true
+    }
 }

+ 187 - 0
PDF Office/PDF Master/Class/PDFTools/EditPDF/Tools/KMEditPDfHanddler.swift

@@ -223,6 +223,13 @@ class KMEditPDfHanddler: NSObject {
         win.style = style
         win.model.editingAreas = areas
         win.model.fontColors = fontColors
+        win.model.fontNames = self._editAreasFontNames()
+        win.model.fontSizes = self._editAreasFontSizes()
+        win.model.fontBolds = self._editAreasFontBolds()
+        win.model.fontItalics = self._editAreasFontItalics()
+        win.model.textAlignments = self._editAreasTextAlignments()
+        win.model.rotates = self._editAreasRotates()
+        win.model.opacitys = self._editAreasOpacitys()
         
         let area = (self.listView?.editingAreas().first as? CPDFEditArea)
         let areaBounds = (self.listView?.convert(area!.bounds, from: area!.page) as? NSRect) ?? .zero
@@ -458,6 +465,126 @@ extension KMEditPDfHanddler {
         return self.editingImageAreas.isEmpty == false
     }
     
+    func editAreasFontColorIsEqual() -> Bool {
+        if self.editAreasIsEmpty() {
+            return false
+        }
+        let datas = self._editAreasFontColors()
+        if datas.count == 1 {
+            return true
+        }
+        let color = datas.first
+        for (i, d) in datas.enumerated() {
+            if i == 0 {
+                continue
+            }
+            if d != color {
+                return false
+            }
+        }
+        return true
+    }
+    
+    func editAreasFontNameIsEqual() -> Bool {
+        if self.editAreasIsEmpty() {
+            return false
+        }
+        let datas = self._editAreasFontNames()
+        if datas.count == 1 {
+            return true
+        }
+        let data = datas.first
+        for (i, d) in datas.enumerated() {
+            if i == 0 {
+                continue
+            }
+            if d != data {
+                return false
+            }
+        }
+        return true
+    }
+    
+    func editAreasFontSizeIsEqual() -> Bool {
+        if self.editAreasIsEmpty() {
+            return false
+        }
+        let datas = self._editAreasFontSizes()
+        if datas.count == 1 {
+            return true
+        }
+        let data = datas.first
+        for (i, d) in datas.enumerated() {
+            if i == 0 {
+                continue
+            }
+            if d != data {
+                return false
+            }
+        }
+        return true
+    }
+    
+    func editAreasFontBoldIsEqual() -> Bool {
+        if self.editAreasIsEmpty() {
+            return false
+        }
+        let datas = self._editAreasFontBolds()
+        if datas.count == 1 {
+            return true
+        }
+        let data = datas.first
+        for (i, d) in datas.enumerated() {
+            if i == 0 {
+                continue
+            }
+            if d != data {
+                return false
+            }
+        }
+        return true
+    }
+    
+    func editAreasFontItalicIsEqual() -> Bool {
+        if self.editAreasIsEmpty() {
+            return false
+        }
+        let datas = self._editAreasFontItalics()
+        if datas.count == 1 {
+            return true
+        }
+        let data = datas.first
+        for (i, d) in datas.enumerated() {
+            if i == 0 {
+                continue
+            }
+            if d != data {
+                return false
+            }
+        }
+        return true
+    }
+    
+    func editAreasTextAlignmentIsEqual() -> Bool {
+        if self.editAreasIsEmpty() {
+            return false
+        }
+        let datas = self._editAreasTextAlignments()
+        if datas.count == 1 {
+            return true
+        }
+        let data = datas.first?.rawValue ?? 0
+        for (i, d) in datas.enumerated() {
+            if i == 0 {
+                continue
+            }
+            if d.rawValue != data {
+                return false
+            }
+        }
+        return true
+    }
+    
     func editAreasBoundsIsEqualForWidth() -> Bool {
         if self.editAreasIsEmpty() {
             return false
@@ -541,6 +668,66 @@ extension KMEditPDfHanddler {
         return true
     }
     
+    private func _editAreasFontColors() -> [NSColor] {
+        var datas: [NSColor] = []
+        for area in self.editingTextAreas {
+            if let data = self.listView?.editingSelectionFontColor(with: area) {
+                datas.append(data)
+            }
+        }
+        return datas
+    }
+    
+    private func _editAreasFontNames() -> [String] {
+        var datas: [String] = []
+        for area in self.editingTextAreas {
+            if let data = self.listView?.editingSelectionCFont(with: area).familyName {
+                datas.append(data)
+            }
+        }
+        return datas
+    }
+    
+    private func _editAreasFontSizes() -> [CGFloat] {
+        var datas: [CGFloat] = []
+        for area in self.editingTextAreas {
+            if let data = self.listView?.editingSelectionFontSize(with: area) {
+                datas.append(data)
+            }
+        }
+        return datas
+    }
+    
+    private func _editAreasFontBolds() -> [Bool] {
+        var datas: [Bool] = []
+        for area in self.editingTextAreas {
+            if let data = self.listView?.isBoldCurrentSelection(with: area) {
+                datas.append(data)
+            }
+        }
+        return datas
+    }
+    
+    private func _editAreasFontItalics() -> [Bool] {
+        var datas: [Bool] = []
+        for area in self.editingTextAreas {
+            if let data = self.listView?.isItalicCurrentSelection(with: area) {
+                datas.append(data)
+            }
+        }
+        return datas
+    }
+    
+    private func _editAreasTextAlignments() -> [NSTextAlignment] {
+        var datas: [NSTextAlignment] = []
+        for area in self.editingTextAreas {
+            if let data = self.listView?.editingSelectionAlignment(with: area) {
+                datas.append(data)
+            }
+        }
+        return datas
+    }
+    
     private func _editAreasBounds() -> [NSRect] {
         var rects: [NSRect] = []
         for area in self.editingAreas {

+ 71 - 0
PDF Office/PDF Master/Class/PDFTools/EditPDF/Window/KMEditPDFPopToolBarWindow.swift

@@ -53,14 +53,65 @@ import Cocoa
         if self.style.contains(.text) {
             if self.style.contains(.image) { // text + image
                 contentViewC?.itemKeys = [.alignmentLeft, .alignmentCenterX, .alignmentRight, .alignmentjustifiedX, .alignmentTop, .alignmentCenterY, .alignmentBottom, .alignmentjustifiedY]
+                var datas: [KMEditPDFToolbarModel] = []
+                for key in contentViewC?.itemKeys ?? [] {
+                    let model = KMEditPDFToolbarModel()
+                    model.itemKey = key
+                    datas.append(model)
+                }
+                contentViewC?.datas = datas
                 width = 320
             } else { // text
                 if self.isMultiple {
                     width = 478
                     contentViewC?.itemKeys = [.color, .fontStyle, .fontAdd, .fontReduce, .fontBold, .fontItalic, .textAlignment, .separator, .alignmentLeft, .alignmentTop]
+                    var datas: [KMEditPDFToolbarModel] = []
+                    for key in contentViewC?.itemKeys ?? [] {
+                        let model = KMEditPDFToolbarModel()
+                        model.itemKey = key
+                        if key == .color {
+                            model.isEnabled = self.model.editAreasFontColorIsEqual()
+                        } else if key == .fontStyle {
+                            model.isEnabled = self.model.editAreasFontNameIsEqual()
+                        } else if key == .fontAdd {
+                            model.isEnabled = self.model.editAreasFontSizeIsEqual()
+                        } else if key == .fontReduce {
+                            model.isEnabled = self.model.editAreasFontSizeIsEqual()
+                        } else if key == .fontBold {
+                            model.isEnabled = self.model.editAreasFontBoldIsEqual()
+                        } else if key == .fontItalic {
+                            model.isEnabled = self.model.editAreasFontItalicIsEqual()
+                        } else if key == .textAlignment {
+                            model.isEnabled = self.model.editAreasTextAlignmentIsEqual()
+                        }
+                        datas.append(model)
+                    }
+                    contentViewC?.datas = datas
                 } else {
                     width = 392
                     contentViewC?.itemKeys = [.color, .fontStyle, .fontAdd, .fontReduce, .fontBold, .fontItalic, .textAlignment]
+                    var datas: [KMEditPDFToolbarModel] = []
+                    for key in contentViewC?.itemKeys ?? [] {
+                        let model = KMEditPDFToolbarModel()
+                        model.itemKey = key
+                        if key == .color {
+                            model.isEnabled = self.model.editAreasFontColorIsEqual()
+                        } else if key == .fontStyle {
+                            model.isEnabled = self.model.editAreasFontNameIsEqual()
+                        } else if key == .fontAdd {
+                            model.isEnabled = self.model.editAreasFontSizeIsEqual()
+                        } else if key == .fontReduce {
+                            model.isEnabled = self.model.editAreasFontSizeIsEqual()
+                        } else if key == .fontBold {
+                            model.isEnabled = self.model.editAreasFontBoldIsEqual()
+                        } else if key == .fontItalic {
+                            model.isEnabled = self.model.editAreasFontItalicIsEqual()
+                        } else if key == .textAlignment {
+                            model.isEnabled = self.model.editAreasTextAlignmentIsEqual()
+                        }
+                        datas.append(model)
+                    }
+                    contentViewC?.datas = datas
                 }
             }
         } else {
@@ -68,9 +119,29 @@ import Cocoa
                 if self.isMultiple {
                     width = 396
                     contentViewC?.itemKeys = [.leftRotate, .rightRotate, .separator, .reverseX, .reverseY, .separator, .crop, .replace, .export, .separator, .alignmentLeft, .alignmentTop]
+                    var datas: [KMEditPDFToolbarModel] = []
+                    for key in contentViewC?.itemKeys ?? [] {
+                        let model = KMEditPDFToolbarModel()
+                        model.itemKey = key
+                        if key == .crop {
+                            model.isEnabled = !self.isMultiple
+                        }
+                        datas.append(model)
+                    }
+                    contentViewC?.datas = datas
                 } else {
                     width = 304
                     contentViewC?.itemKeys = [.leftRotate, .rightRotate, .separator, .reverseX, .reverseY, .separator, .crop, .replace, .export]
+                    var datas: [KMEditPDFToolbarModel] = []
+                    for key in contentViewC?.itemKeys ?? [] {
+                        let model = KMEditPDFToolbarModel()
+                        model.itemKey = key
+                        if key == .crop {
+                            model.isEnabled = !self.isMultiple
+                        }
+                        datas.append(model)
+                    }
+                    contentViewC?.datas = datas
                 }
             } else { // none