|
@@ -17,7 +17,7 @@ import KMComponentLibrary
|
|
|
@objc optional func watermarkPropertyControllerDidChangetoTemplate(_ controller: KMNWatermarkPropertyController)
|
|
|
|
|
|
//成功保存到模板
|
|
|
- @objc optional func watermarkPropertyControllerSaveTemplateSuccess(_ controller: KMNWatermarkPropertyController)
|
|
|
+ @objc optional func watermarkPropertyControllerSaveTemplateSuccess(_ controller: KMNWatermarkPropertyController, _ data: KMPDFWatermarkData)
|
|
|
|
|
|
//取消修改模板信息
|
|
|
@objc optional func watermarkPropertyControllerCancelTemplateEdit(_ controller: KMNWatermarkPropertyController)
|
|
@@ -142,13 +142,24 @@ class KMNWatermarkPropertyController: NSViewController {
|
|
|
creatable: true,
|
|
|
text: "12 pt",
|
|
|
regexString: "0123456789 pt")
|
|
|
+ var sizeItemArr: [ComponentMenuitemProperty] = []
|
|
|
+ for string in ["6","8","10","12","14",
|
|
|
+ "16","18","20","22","24",
|
|
|
+ "26","28","30","32","34",
|
|
|
+ "36","40","48","64","80",
|
|
|
+ "96","112"] {
|
|
|
+ let item = ComponentMenuitemProperty(type: .normal, text: string, identifier: string)
|
|
|
+ sizeItemArr.append(item)
|
|
|
+ }
|
|
|
+ fontSizeSelect.updateMenuItemsArr(sizeItemArr)
|
|
|
+ fontSizeSelect.selectItemAtIndex(0)
|
|
|
fontSizeSelect.delegate = self
|
|
|
|
|
|
- let colorAProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: false, color: NSColor(red: 205/255, green: 205/255, blue: 205/255, alpha: 1))
|
|
|
- let colorBProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: false, color: NSColor(red: 255/255, green: 173/255, blue: 173/255, alpha: 1))
|
|
|
- let colorCProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: false, color: NSColor(red: 146/255, green: 222/255, blue: 255/255, alpha: 1))
|
|
|
- let colorDProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: false, color: NSColor(red: 171/255, green: 247/255, blue: 220/255, alpha: 1))
|
|
|
- let colorEProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: true, color: NSColor(red: 255/255, green: 221/255, blue: 99/255, alpha: 1))
|
|
|
+ let colorAProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: false, color: KMPDFWatermarkData.watermarkDefaultColors()[0])
|
|
|
+ let colorBProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: false, color: KMPDFWatermarkData.watermarkDefaultColors()[1])
|
|
|
+ let colorCProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: false, color: KMPDFWatermarkData.watermarkDefaultColors()[2])
|
|
|
+ let colorDProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: false, color: KMPDFWatermarkData.watermarkDefaultColors()[3])
|
|
|
+ let colorEProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: true, color: KMPDFWatermarkData.watermarkDefaultColors()[4])
|
|
|
|
|
|
fontColorGroup.setUpWithColorPropertys([colorAProperty, colorBProperty, colorCProperty, colorDProperty], customItemProperty: colorEProperty)
|
|
|
fontColorGroup.delegate = self
|
|
@@ -189,6 +200,7 @@ class KMNWatermarkPropertyController: NSViewController {
|
|
|
rotateItems.append(item)
|
|
|
}
|
|
|
appearance_RotateSelect.updateMenuItemsArr(rotateItems)
|
|
|
+ appearance_RotateSelect.delegate = self
|
|
|
|
|
|
appearance_OpacitySelect.properties = ComponentSelectProperties(size: .s,
|
|
|
state: .normal,
|
|
@@ -201,6 +213,7 @@ class KMNWatermarkPropertyController: NSViewController {
|
|
|
opacityItems.append(item)
|
|
|
}
|
|
|
appearance_OpacitySelect.updateMenuItemsArr(opacityItems)
|
|
|
+ appearance_OpacitySelect.delegate = self
|
|
|
|
|
|
appearanceScaleCheckbox.properties = ComponentCheckBoxProperty(size: .s, text: KMLocalizedString("Scale relative to target page"), checkboxType: .normal)
|
|
|
appearanceScaleCheckbox.setTarget(self, action: #selector(checkBoxClicked(_:)))
|
|
@@ -216,15 +229,14 @@ class KMNWatermarkPropertyController: NSViewController {
|
|
|
appearanceScaleItems.append(item)
|
|
|
}
|
|
|
appearanceScaleSelect.updateMenuItemsArr(appearanceScaleItems)
|
|
|
+ appearanceScaleSelect.delegate = self
|
|
|
|
|
|
appearanceTopPageRadio.properties = ComponentCheckBoxProperty(size: .s, text: KMLocalizedString("At the top of the page"), checkboxType: .normal)
|
|
|
appearanceTopPageRadio.setTarget(self, action: #selector(radioClicked(_:)))
|
|
|
|
|
|
appearanceBottomPageRadio.properties = ComponentCheckBoxProperty(size: .s, text: KMLocalizedString("At the bottom of the page"), checkboxType: .normal)
|
|
|
appearanceBottomPageRadio.setTarget(self, action: #selector(radioClicked(_:)))
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
|
|
|
//Position
|
|
|
positionLabel.stringValue = KMLocalizedString("Position (mm)")
|
|
@@ -239,12 +251,14 @@ class KMNWatermarkPropertyController: NSViewController {
|
|
|
minSize: -1000,
|
|
|
maxSize: 1000,
|
|
|
text: "0")
|
|
|
+ positionXInput.delegate = self
|
|
|
|
|
|
positionYInput.properties = ComponentInputNumberProperty(alignment: .left,
|
|
|
size: .s,
|
|
|
minSize: -1000,
|
|
|
maxSize: 1000,
|
|
|
text: "0")
|
|
|
+ positionYInput.delegate = self
|
|
|
|
|
|
positionTileCheckbox.properties = ComponentCheckBoxProperty(size: .s, text: KMLocalizedString("Tile"), checkboxType: .normal)
|
|
|
positionTileCheckbox.setTarget(self, action: #selector(checkBoxClicked(_:)))
|
|
@@ -254,11 +268,14 @@ class KMNWatermarkPropertyController: NSViewController {
|
|
|
minSize: 0,
|
|
|
maxSize: 1000,
|
|
|
text: "0")
|
|
|
+ positionTileHoriInput.delegate = self
|
|
|
+
|
|
|
positionTileVertInput.properties = ComponentInputNumberProperty(alignment: .left,
|
|
|
size: .s,
|
|
|
minSize: 0,
|
|
|
maxSize: 1000,
|
|
|
text: "0")
|
|
|
+ positionTileVertInput.delegate = self
|
|
|
|
|
|
|
|
|
//Save
|
|
@@ -336,13 +353,17 @@ class KMNWatermarkPropertyController: NSViewController {
|
|
|
appearance_RotateSelect.properties.text = String(format: "%.0f", watermarkData.rotation) + "°"
|
|
|
appearance_RotateSelect.reloadData()
|
|
|
|
|
|
- appearance_OpacitySelect.properties.text = String(format: "%.0f", watermarkData.opacity) + "%"
|
|
|
+ if watermarkData.opacity > 1 {
|
|
|
+ watermarkData.opacity = 1
|
|
|
+ }
|
|
|
+ appearance_OpacitySelect.properties.text = String(format: "%.0f", watermarkData.opacity*100) + "%"
|
|
|
appearance_OpacitySelect.reloadData()
|
|
|
|
|
|
appearanceScaleCheckbox.properties.checkboxType = watermarkData.isScale ? .selected : .normal
|
|
|
appearanceScaleCheckbox.reloadData()
|
|
|
|
|
|
appearanceScaleSelect.properties.isDisabled = watermarkData.isScale ? false : true
|
|
|
+ appearanceScaleSelect.properties.text = String(format: "%.0f", watermarkData.scale*100) + "%"
|
|
|
appearanceScaleSelect.reloadData()
|
|
|
|
|
|
appearanceTopPageRadio.properties.checkboxType = watermarkData.isFront ? .selected : .normal
|
|
@@ -353,6 +374,18 @@ class KMNWatermarkPropertyController: NSViewController {
|
|
|
|
|
|
|
|
|
//Position
|
|
|
+ positionXInput.properties.text = String(format: "%.0f", watermarkData.tx)
|
|
|
+ positionXInput.reloadData()
|
|
|
+
|
|
|
+ positionYInput.properties.text = String(format: "%.0f", watermarkData.ty)
|
|
|
+ positionYInput.reloadData()
|
|
|
+
|
|
|
+ positionTileHoriInput.properties.text = String(format: "%.0f", watermarkData.horizontalSpacing)
|
|
|
+ positionTileHoriInput.reloadData()
|
|
|
+
|
|
|
+ positionTileVertInput.properties.text = String(format: "%.0f", watermarkData.verticalSpacing)
|
|
|
+ positionTileVertInput.reloadData()
|
|
|
+
|
|
|
if watermarkData.isTilePage {
|
|
|
positionTileHorImage.image = NSImage(named: "tile_spacing_horiz")
|
|
|
positionTileVertImage.image = NSImage(named: "tile_spacing_vert")
|
|
@@ -372,6 +405,11 @@ class KMNWatermarkPropertyController: NSViewController {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ func clearData() {
|
|
|
+ watermarkData = KMPDFWatermarkData.defaultData()
|
|
|
+
|
|
|
+ reloadData()
|
|
|
+ }
|
|
|
|
|
|
//MARK: - Action
|
|
|
@objc func leftTopButtonClicked(_ sender: ComponentButton) {
|
|
@@ -407,20 +445,27 @@ class KMNWatermarkPropertyController: NSViewController {
|
|
|
|
|
|
@objc func saveButtonClicked(_ sender: ComponentButton) {
|
|
|
let saveWindow: KMWatermarkSaveWindow = KMWatermarkSaveWindow(windowNibName: "KMWatermarkSaveWindow")
|
|
|
+ if watermarkData.watermarkType == .image {
|
|
|
+ saveWindow.nameValue = watermarkData.imagePath?.lastPathComponent ?? ""
|
|
|
+ } else if watermarkData.watermarkType == .text {
|
|
|
+ saveWindow.nameValue = watermarkData.text ?? ""
|
|
|
+ }
|
|
|
saveWindow.saveHandler = {[weak self] string in
|
|
|
guard let weakSelf = self else { return }
|
|
|
|
|
|
- weakSelf.watermarkData.watermarkName = string ?? ""
|
|
|
-
|
|
|
- if KMWatermarkManager.defaultManager.addWatermark(watermark: weakSelf.watermarkData) == true {
|
|
|
- weakSelf.delegate?.watermarkPropertyControllerSaveTemplateSuccess?(weakSelf)
|
|
|
+ DispatchQueue.main.async {
|
|
|
+ weakSelf.watermarkData.watermarkName = string ?? ""
|
|
|
+ let image = KMWatermarkManager.defaultManager.drawImageAtpageRect(rect: CGRectMake(0, 0, 136, 181), data: weakSelf.watermarkData)
|
|
|
+ weakSelf.watermarkData.resultImage = image
|
|
|
+
|
|
|
+ if KMWatermarkManager.defaultManager.addWatermark(watermark: weakSelf.watermarkData) == true {
|
|
|
+ weakSelf.delegate?.watermarkPropertyControllerSaveTemplateSuccess?(weakSelf, weakSelf.watermarkData)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
saveWindow.own_beginSheetModal(for: view.window) { string in
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
}
|
|
|
|
|
|
@objc func chooseURLAction(_ sender: NSView) {
|
|
@@ -440,18 +485,20 @@ class KMNWatermarkPropertyController: NSViewController {
|
|
|
guard !pdf!.isEncrypted else { return }
|
|
|
|
|
|
if let image = self.generateThumbnail(for: url) {
|
|
|
- let outFolder = KMWatermarkManager.defaultManager.watermarkFolderPath
|
|
|
- if let outFolderPath = outFolder?.stringByAppendingPathComponent(self.watermarkData.tag + ".png") {
|
|
|
- do {
|
|
|
- try?image.pngData()?.write(to: URL(fileURLWithPath: outFolderPath))
|
|
|
- } catch {
|
|
|
- }
|
|
|
+ let outFolder = KMWatermarkManager.defaultManager.watermarkFolderPath?.stringByAppendingPathComponent(("temp/" + self.watermarkData.tag))
|
|
|
+ if (FileManager.default.fileExists(atPath: outFolder!) == false) {
|
|
|
+ try?FileManager.default.createDirectory(atPath: outFolder!, withIntermediateDirectories: true)
|
|
|
+ }
|
|
|
+ let fileName = filePath.getLastComponentDeleteExtension
|
|
|
+ if let outFolderPath = outFolder?.stringByAppendingPathComponent(fileName + ".png") {
|
|
|
+ try?image.pngData()?.write(to: URL(fileURLWithPath: outFolderPath))
|
|
|
|
|
|
if FileManager.default.fileExists(atPath: outFolderPath) {
|
|
|
self.watermarkData.imagePath = outFolderPath
|
|
|
self.delegate?.watermarkPropertyControllerDidUpdate?(self)
|
|
|
+
|
|
|
+ self.reloadData()
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
@@ -472,6 +519,8 @@ class KMNWatermarkPropertyController: NSViewController {
|
|
|
self.watermarkData.imagePath = url.path
|
|
|
|
|
|
self.delegate?.watermarkPropertyControllerDidUpdate?(self)
|
|
|
+
|
|
|
+ self.reloadData()
|
|
|
|
|
|
}
|
|
|
}
|
|
@@ -527,7 +576,7 @@ extension KMNWatermarkPropertyController: ComponentTabsDelegate {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-//MARK: - ComponentCColorDelegate
|
|
|
+//MARK: - ComponentTextareaDelegate
|
|
|
extension KMNWatermarkPropertyController: ComponentTextareaDelegate {
|
|
|
func componentTextareaTextDidChange(_ view: ComponentTextarea) {
|
|
|
watermarkData.text = view.properties.text
|
|
@@ -566,7 +615,23 @@ extension KMNWatermarkPropertyController: ComponentSelectDelegate {
|
|
|
watermarkData.fontStyle = menuItemProperty?.text
|
|
|
} else if view == fontSizeSelect {
|
|
|
if let text = menuItemProperty?.text {
|
|
|
- watermarkData.fontSize = text.stringToCGFloat()
|
|
|
+ let result = text.stringByDeleteCharString(" pt")
|
|
|
+ watermarkData.fontSize = result.stringToCGFloat()
|
|
|
+ }
|
|
|
+ } else if view == appearance_OpacitySelect {
|
|
|
+ if let text = menuItemProperty?.text {
|
|
|
+ let result = text.stringByDeleteCharString("%")
|
|
|
+ watermarkData.opacity = result.stringToCGFloat()/100
|
|
|
+ }
|
|
|
+ } else if view == appearance_RotateSelect {
|
|
|
+ if let text = menuItemProperty?.text {
|
|
|
+ let result = text.stringByDeleteCharString("°")
|
|
|
+ watermarkData.rotation = result.stringToCGFloat()
|
|
|
+ }
|
|
|
+ } else if view == appearanceScaleSelect {
|
|
|
+ if let text = menuItemProperty?.text {
|
|
|
+ let result = text.stringByDeleteCharString("%")
|
|
|
+ watermarkData.scale = result.stringToCGFloat()/100
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -589,17 +654,32 @@ extension KMNWatermarkPropertyController: ComponentSelectDelegate {
|
|
|
func componentSelectTextDidEndEditing(_ view: ComponentSelect) {
|
|
|
if view == fontSizeSelect {
|
|
|
if let string = view.properties.text {
|
|
|
- var result = string.replacingOccurrences(of: " ", with: "")
|
|
|
- result = result.replacingOccurrences(of: "p", with: "")
|
|
|
- result = result.replacingOccurrences(of: "t", with: "")
|
|
|
+ let result = string.stringByDeleteCharString(" pt")
|
|
|
|
|
|
let size = result.stringToCGFloat()
|
|
|
watermarkData.fontSize = size
|
|
|
- reloadData()
|
|
|
|
|
|
- delegate?.watermarkPropertyControllerDidUpdate?(self)
|
|
|
+ }
|
|
|
+ } else if view == appearance_OpacitySelect {
|
|
|
+ if let text = appearance_OpacitySelect.properties.text {
|
|
|
+ let result = text.stringByDeleteCharString("%")
|
|
|
+ watermarkData.opacity = result.stringToCGFloat()/100
|
|
|
+ }
|
|
|
+ } else if view == appearance_RotateSelect {
|
|
|
+ if let text = appearance_RotateSelect.properties.text {
|
|
|
+ let result = text.stringByDeleteCharString("°")
|
|
|
+ watermarkData.rotation = result.stringToCGFloat()
|
|
|
+ }
|
|
|
+ } else if view == appearanceScaleSelect {
|
|
|
+ if let text = appearanceScaleSelect.properties.text {
|
|
|
+ let result = text.stringByDeleteCharString("%")
|
|
|
+ watermarkData.scale = result.stringToCGFloat()/100
|
|
|
}
|
|
|
}
|
|
|
+ reloadData()
|
|
|
+
|
|
|
+ delegate?.watermarkPropertyControllerDidUpdate?(self)
|
|
|
+
|
|
|
}
|
|
|
|
|
|
|
|
@@ -631,3 +711,29 @@ extension KMNWatermarkPropertyController: ComponentCPositionDelegate {
|
|
|
delegate?.watermarkPropertyControllerDidUpdate?(self)
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+//MARK: - ComponentInputNumberDelegate
|
|
|
+extension KMNWatermarkPropertyController: ComponentInputNumberDelegate {
|
|
|
+ func componentInputNumberDidValueChanged(inputNumber: ComponentInputNumber?) {
|
|
|
+ if inputNumber == positionXInput {
|
|
|
+ if let text = inputNumber?.properties.text {
|
|
|
+ watermarkData.tx = text.stringToCGFloat()
|
|
|
+ }
|
|
|
+ } else if inputNumber == positionYInput {
|
|
|
+ if let text = inputNumber?.properties.text {
|
|
|
+ watermarkData.ty = text.stringToCGFloat()
|
|
|
+ }
|
|
|
+ } else if inputNumber == positionTileHoriInput {
|
|
|
+ if let text = inputNumber?.properties.text {
|
|
|
+ watermarkData.horizontalSpacing = text.stringToCGFloat()
|
|
|
+ }
|
|
|
+ } else if inputNumber == positionTileVertInput {
|
|
|
+ if let text = inputNumber?.properties.text {
|
|
|
+ watermarkData.verticalSpacing = text.stringToCGFloat()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ reloadData()
|
|
|
+
|
|
|
+ delegate?.watermarkPropertyControllerDidUpdate?(self)
|
|
|
+ }
|
|
|
+}
|