|
@@ -18,7 +18,7 @@ class KMEditImageController: NSViewController {
|
|
|
@IBOutlet var sizeSyncButton: ComponentButton!
|
|
|
@IBOutlet var sizeWidthInput: ComponentInputNumber!
|
|
|
@IBOutlet var sizeHeightInput: ComponentInputNumber!
|
|
|
-
|
|
|
+
|
|
|
@IBOutlet var rotateBGView: NSView!
|
|
|
@IBOutlet var rotateLabel: NSTextField!
|
|
|
@IBOutlet var rotateSelect: ComponentSelect!
|
|
@@ -38,19 +38,20 @@ class KMEditImageController: NSViewController {
|
|
|
@IBOutlet var extractBtnTopConst: NSLayoutConstraint!
|
|
|
|
|
|
@IBOutlet var alignmentBGView: NSView!
|
|
|
-
|
|
|
+
|
|
|
private var syncChangeBounds: Bool = true //同步修改宽高
|
|
|
|
|
|
private var groupView: ComponentGroup!
|
|
|
private var alignmentController: KMNAlignmentController?
|
|
|
|
|
|
+ private var areas: [CPDFEditImageArea] = []
|
|
|
+
|
|
|
var pdfView: CPDFListView? {
|
|
|
didSet {
|
|
|
reloadData()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- var areas: [CPDFEditImageArea] = []
|
|
|
|
|
|
//MARK: - func
|
|
|
override func viewDidAppear() {
|
|
@@ -86,7 +87,8 @@ class KMEditImageController: NSViewController {
|
|
|
showSuffix: false,
|
|
|
minSize: 1,
|
|
|
maxSize: 1000,
|
|
|
- text:"100")
|
|
|
+ text:"100",
|
|
|
+ valueType: .floatType)
|
|
|
sizeWidthInput.delegate = self
|
|
|
|
|
|
sizeHeightInput.properties = ComponentInputNumberProperty(alignment: .center,
|
|
@@ -97,7 +99,8 @@ class KMEditImageController: NSViewController {
|
|
|
showSuffix: false,
|
|
|
minSize: 1,
|
|
|
maxSize: 1000,
|
|
|
- text:"100")
|
|
|
+ text:"100",
|
|
|
+ valueType: .floatType)
|
|
|
sizeHeightInput.delegate = self
|
|
|
|
|
|
//Rotate
|
|
@@ -163,7 +166,7 @@ class KMEditImageController: NSViewController {
|
|
|
replaceButton.properties = ComponentButtonProperty(type: .default_tertiary, size: .s, buttonText: KMLocalizedString("Replace"), keepPressState: false)
|
|
|
replaceButton.setTarget(self, action: #selector(buttonClicked(_:)))
|
|
|
|
|
|
- extractButton.properties = ComponentButtonProperty(type: .default_tertiary, size: .s, buttonText: KMLocalizedString("Extract"), keepPressState: false)
|
|
|
+ extractButton.properties = ComponentButtonProperty(type: .default_tertiary, size: .s, buttonText: KMLocalizedString("Extract"), keepPressState: true)
|
|
|
extractButton.setTarget(self, action: #selector(buttonClicked(_:)))
|
|
|
|
|
|
if alignmentController == nil {
|
|
@@ -202,10 +205,93 @@ class KMEditImageController: NSViewController {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ var first_area: CPDFEditImageArea?
|
|
|
+ if areas.count > 0 {
|
|
|
+ first_area = areas.first
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //refreshData
|
|
|
+ var boundsWidth: CGFloat?
|
|
|
+ var boundsHeight: CGFloat?
|
|
|
+
|
|
|
+ var rotateAngle: CGFloat?
|
|
|
+ var opacity_value: CGFloat?
|
|
|
+
|
|
|
+ if areas.count == 0 {
|
|
|
+
|
|
|
+ } else if areas.count == 1, let area = first_area {
|
|
|
+ boundsWidth = area.bounds.size.width
|
|
|
+ boundsHeight = area.bounds.size.height
|
|
|
+
|
|
|
+ if let rotates = pdfView?.km_editAreasRotates([area]) {
|
|
|
+ rotateAngle = rotates.first ?? 1
|
|
|
+ }
|
|
|
+
|
|
|
+ if let opacitys = pdfView?.km_editAreasOpacitys([area]) {
|
|
|
+ var opacity = opacitys.first ?? 1
|
|
|
+ opacity = min(1, opacity)
|
|
|
+ opacity = max(0, opacity)
|
|
|
+
|
|
|
+ opacity_value = opacity
|
|
|
+ }
|
|
|
+ } else if areas.count > 1, let area = first_area {
|
|
|
+ if CPDFEditArea.isMultiBoundsWidth(areas) == true {
|
|
|
+ boundsWidth = nil
|
|
|
+ } else {
|
|
|
+ boundsWidth = area.bounds.size.width
|
|
|
+ }
|
|
|
+
|
|
|
+ if CPDFEditArea.isMultiBoundsHeight(areas) == true {
|
|
|
+ boundsHeight = nil
|
|
|
+ } else {
|
|
|
+ boundsHeight = area.bounds.size.height
|
|
|
+ }
|
|
|
+
|
|
|
+ if CPDFEditArea.isMultiAngle(areas, inPDFView: pdfView) == true {
|
|
|
+ rotateAngle = nil
|
|
|
+ } else {
|
|
|
+ rotateAngle = pdfView?.getRotateWith(area)
|
|
|
+ }
|
|
|
+
|
|
|
+ if CPDFEditArea.isMultiOpacity(areas, inPDFView: pdfView) == true {
|
|
|
+ opacity_value = nil
|
|
|
+ } else {
|
|
|
+ var firstValue = pdfView?.opacityByRange(for: area) ?? 0
|
|
|
+ if firstValue < 0 {
|
|
|
+ firstValue = pdfView?.opacity(for: area) ?? 0
|
|
|
+ }
|
|
|
+ opacity_value = firstValue
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if let value = boundsWidth {
|
|
|
+ sizeWidthInput.properties.text = String(format: "%.1f", value)
|
|
|
+ } else {
|
|
|
+ sizeWidthInput.properties.text = "-"
|
|
|
+ }
|
|
|
+
|
|
|
+ if let value = boundsHeight {
|
|
|
+ sizeHeightInput.properties.text = String(format: "%.1f", value)
|
|
|
+ } else {
|
|
|
+ sizeHeightInput.properties.text = "-"
|
|
|
+ }
|
|
|
+
|
|
|
sizeWidthInput.properties.isDisabled = pdfView?.isEditImage == true
|
|
|
sizeHeightInput.properties.isDisabled = pdfView?.isEditImage == true
|
|
|
+ sizeWidthInput.reloadData()
|
|
|
+ sizeHeightInput.reloadData()
|
|
|
+
|
|
|
sizeSyncButton.properties.isDisabled = pdfView?.isEditImage == true
|
|
|
- rotateSelect.properties.isDisabled = pdfView?.isEditImage == true
|
|
|
+ if syncChangeBounds {
|
|
|
+ sizeSyncButton.properties.state = .pressed
|
|
|
+ } else {
|
|
|
+ sizeSyncButton.properties.state = .normal
|
|
|
+ }
|
|
|
+ sizeSyncButton.reloadData()
|
|
|
+
|
|
|
+ rotateSelect.properties.isDisabled = pdfView?.isEditImage == true
|
|
|
|
|
|
rotateLeftButton.properties.isDisabled = pdfView?.isEditImage == true
|
|
|
rotateLeftButton.reloadData()
|
|
@@ -226,73 +312,33 @@ class KMEditImageController: NSViewController {
|
|
|
|
|
|
replaceButton.properties.isDisabled = pdfView?.isEditImage == true
|
|
|
replaceButton.reloadData()
|
|
|
-
|
|
|
+
|
|
|
extractButton.properties.isDisabled = pdfView?.isEditImage == true
|
|
|
extractButton.reloadData()
|
|
|
+
|
|
|
+ if let value = rotateAngle {
|
|
|
+ rotateSelect.properties.text = String(format: "%.0f", value)
|
|
|
+ } else {
|
|
|
+ rotateSelect.properties.text = "-"
|
|
|
+ }
|
|
|
+ rotateSelect.reloadData()
|
|
|
|
|
|
- if let area = areas.first {
|
|
|
- //Size
|
|
|
- if syncChangeBounds {
|
|
|
- sizeSyncButton.properties.state = .pressed
|
|
|
- } else {
|
|
|
- sizeSyncButton.properties.state = .normal
|
|
|
- }
|
|
|
- sizeSyncButton.reloadData()
|
|
|
-
|
|
|
- if areas.count > 1 {
|
|
|
- sizeWidthInput.properties.text = "-"
|
|
|
- sizeWidthInput.properties.multiState = true
|
|
|
-
|
|
|
- sizeHeightInput.properties.text = "-"
|
|
|
- sizeHeightInput.properties.multiState = true
|
|
|
- } else {
|
|
|
- let areaFrame = area.bounds
|
|
|
- sizeWidthInput.properties.text = String(format: "%.1f", areaFrame.size.width)
|
|
|
- sizeWidthInput.properties.multiState = false
|
|
|
-
|
|
|
- sizeHeightInput.properties.text = String(format: "%.1f", areaFrame.size.height)
|
|
|
- sizeHeightInput.properties.multiState = false
|
|
|
- }
|
|
|
- sizeWidthInput.properties.maxSize = Int(area.page.bounds.size.width)
|
|
|
- sizeHeightInput.properties.maxSize = Int(area.page.bounds.size.height)
|
|
|
-
|
|
|
- sizeWidthInput.reloadData()
|
|
|
- sizeHeightInput.reloadData()
|
|
|
-
|
|
|
- //Rotate
|
|
|
- if let rotates = pdfView?.km_editAreasRotates([area]) {
|
|
|
- if rotates.count > 0 {
|
|
|
- let rotate = rotates.first ?? 1
|
|
|
-
|
|
|
- rotateSelect.properties.text = String(format: "%.0f%@", rotate, "°")
|
|
|
- rotateSelect.reloadData()
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //Opacity
|
|
|
- if let opacitys = pdfView?.km_editAreasOpacitys([area]) {
|
|
|
- if opacitys.count > 0 {
|
|
|
- var opacity = opacitys.first ?? 1
|
|
|
- opacity = min(1, opacity)
|
|
|
- opacity = max(0, opacity)
|
|
|
-
|
|
|
- opacitySelect.properties.text = String(format: "%.0f%@", opacity*100, "%")
|
|
|
- opacitySelect.reloadData()
|
|
|
-
|
|
|
- opacitySlider.properties.percent = opacity
|
|
|
- opacitySlider.reloadData()
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if pdfView?.isEditImage == true {
|
|
|
- cropButton.properties.buttonText = KMLocalizedString("Cancel Crop")
|
|
|
- } else {
|
|
|
- cropButton.properties.buttonText = KMLocalizedString("Crop")
|
|
|
- }
|
|
|
- cropButton.reloadData()
|
|
|
-
|
|
|
+ if let value = opacity_value {
|
|
|
+ opacitySelect.properties.text = String(format: "%.0f", value*100)
|
|
|
+ opacitySlider.properties.percent = value
|
|
|
+ } else {
|
|
|
+ opacitySelect.properties.text = "-"
|
|
|
+ opacitySlider.properties.percent = 0
|
|
|
+ }
|
|
|
+ opacitySelect.reloadData()
|
|
|
+ opacitySlider.reloadData()
|
|
|
+
|
|
|
+ if pdfView?.isEditImage == true {
|
|
|
+ cropButton.properties.buttonText = KMLocalizedString("Cancel Crop")
|
|
|
+ } else {
|
|
|
+ cropButton.properties.buttonText = KMLocalizedString("Crop")
|
|
|
}
|
|
|
+ cropButton.reloadData()
|
|
|
|
|
|
|
|
|
}
|
|
@@ -383,8 +429,8 @@ class KMEditImageController: NSViewController {
|
|
|
|
|
|
//MARK: - ComponentInputNumberDelegate
|
|
|
extension KMEditImageController: ComponentInputNumberDelegate {
|
|
|
- func componentInputNumberDidValueChanged(inputNumber: ComponentInputNumber?) {
|
|
|
- if areas.count > 1 || areas.count == 0 {
|
|
|
+ func componentInputNumberDidFinishEditing(inputNumber: ComponentInputNumber?) {
|
|
|
+ if areas.count == 0 {
|
|
|
return
|
|
|
}
|
|
|
|
|
@@ -399,12 +445,12 @@ extension KMEditImageController: ComponentInputNumberDelegate {
|
|
|
for area in areas {
|
|
|
pdfView?.updateArea(area, newHeight: textValue, syncChangeBounds)
|
|
|
}
|
|
|
- }
|
|
|
+ }
|
|
|
reloadData()
|
|
|
}
|
|
|
|
|
|
func componentInputNumberDidIncrease(inputNumber: ComponentInputNumber?) {
|
|
|
- if areas.count == 1 || areas.count == 0 {
|
|
|
+ if areas.count == 0 {
|
|
|
return
|
|
|
}
|
|
|
//只处理多选状态
|
|
@@ -426,7 +472,7 @@ extension KMEditImageController: ComponentInputNumberDelegate {
|
|
|
}
|
|
|
|
|
|
func componentInputNumberDidDecrease(inputNumber: ComponentInputNumber?) {
|
|
|
- if areas.count == 1 || areas.count == 0 {
|
|
|
+ if areas.count == 0 {
|
|
|
return
|
|
|
}
|
|
|
//只处理多选状态
|
|
@@ -478,18 +524,20 @@ extension KMEditImageController: ComponentSelectDelegate {
|
|
|
if view == opacitySelect {
|
|
|
if let text = opacitySelect.properties.text {
|
|
|
let result = text.stringByDeleteCharString("%")
|
|
|
- let opacity = result.stringToCGFloat()/100
|
|
|
-
|
|
|
- pdfView?.setEditingAreasOpacity(opacity)
|
|
|
+ if result != "-" {
|
|
|
+ let opacity = result.stringToCGFloat()/100
|
|
|
+ pdfView?.setEditingAreasOpacity(opacity)
|
|
|
+ }
|
|
|
|
|
|
reloadData()
|
|
|
}
|
|
|
} else if view == rotateSelect {
|
|
|
if let text = rotateSelect.properties.text {
|
|
|
let result = text.stringByDeleteCharString("°")
|
|
|
- let value = result.stringToCGFloat()
|
|
|
-
|
|
|
- pdfView?.rotateEditingAreas(value)
|
|
|
+ if result != "-" {
|
|
|
+ let value = result.stringToCGFloat()
|
|
|
+ pdfView?.rotateEditingAreas(value)
|
|
|
+ }
|
|
|
|
|
|
reloadData()
|
|
|
}
|
|
@@ -528,6 +576,12 @@ extension KMEditImageController: ComponentGroupDelegate {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ func componentGroupDidDismiss(group: ComponentGroup?) {
|
|
|
+ extractButton.properties.state = .normal
|
|
|
+ extractButton.reloadData()
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
|