Rework image editor buttons, modes, etc.

pull/2/head
Matthew Chen 6 years ago
parent d08445969d
commit be26c135e1

@ -953,7 +953,8 @@ public class AttachmentPrepViewController: OWSViewController, PlayerProgressBarD
autoPinView(toBottomOfViewControllerOrKeyboard: imageEditorView, avoidNotch: true) autoPinView(toBottomOfViewControllerOrKeyboard: imageEditorView, avoidNotch: true)
imageEditorView.autoPinWidthToSuperview() imageEditorView.autoPinWidthToSuperview()
imageEditorView.addControls(to: imageEditorView) imageEditorView.addControls(to: imageEditorView,
viewController: self)
} }
} }
#endif #endif

@ -140,6 +140,7 @@ public class ImageEditorPaletteView: UIView {
let gradientLayer = CAGradientLayer() let gradientLayer = CAGradientLayer()
gradientView.layer.addSublayer(gradientLayer) gradientView.layer.addSublayer(gradientLayer)
gradientLayer.frame = gradientBounds gradientLayer.frame = gradientBounds
// See: https://github.com/signalapp/Signal-Android/blob/master/res/values/arrays.xml#L267
gradientLayer.colors = [ gradientLayer.colors = [
UIColor(rgbHex: 0xffffff).cgColor, UIColor(rgbHex: 0xffffff).cgColor,
UIColor(rgbHex: 0xff0000).cgColor, UIColor(rgbHex: 0xff0000).cgColor,

@ -29,12 +29,14 @@ public class ImageEditorView: UIView {
// This is the default mode. It is used for interacting with text items. // This is the default mode. It is used for interacting with text items.
case none case none
case brush case brush
case text
} }
private var editorMode = EditorMode.none { private var editorMode = EditorMode.none {
didSet { didSet {
AssertIsOnMainThread() AssertIsOnMainThread()
updateButtons()
updateGestureState() updateGestureState()
} }
} }
@ -130,15 +132,18 @@ public class ImageEditorView: UIView {
} }
// The model supports redo if we ever want to add it. // The model supports redo if we ever want to add it.
private let undoButton = UIButton(type: .custom) private let undoButton = OWSButton()
private let brushButton = UIButton(type: .custom) private let brushButton = OWSButton()
private let cropButton = UIButton(type: .custom) private let cropButton = OWSButton()
private let newTextButton = UIButton(type: .custom) private let newTextButton = OWSButton()
private var allButtons = [UIButton]() private let captionButton = OWSButton()
private let doneButton = OWSButton()
private let buttonStackView = UIStackView()
// TODO: Should this method be private? // TODO: Should this method be private?
@objc @objc
public func addControls(to containerView: UIView) { public func addControls(to containerView: UIView,
viewController: UIViewController) {
configure(button: undoButton, configure(button: undoButton,
imageName: "image_editor_undo", imageName: "image_editor_undo",
selector: #selector(didTapUndo(sender:))) selector: #selector(didTapUndo(sender:)))
@ -155,16 +160,21 @@ public class ImageEditorView: UIView {
imageName: "image_editor_text", imageName: "image_editor_text",
selector: #selector(didTapNewText(sender:))) selector: #selector(didTapNewText(sender:)))
allButtons = [brushButton, cropButton, undoButton, newTextButton] configure(button: captionButton,
imageName: "image_editor_caption",
selector: #selector(didTapCaption(sender:)))
configure(button: doneButton,
imageName: "image_editor_checkmark_full",
selector: #selector(didTapDone(sender:)))
let stackView = UIStackView(arrangedSubviews: allButtons) buttonStackView.axis = .horizontal
stackView.axis = .vertical buttonStackView.alignment = .center
stackView.alignment = .center buttonStackView.spacing = 20
stackView.spacing = 10
containerView.addSubview(stackView) containerView.addSubview(buttonStackView)
stackView.autoAlignAxis(toSuperviewAxis: .horizontal) buttonStackView.autoPin(toTopLayoutGuideOf: viewController, withInset: 0)
stackView.autoPinTrailingToSuperviewMargin(withInset: 10) buttonStackView.autoPinTrailingToSuperviewMargin(withInset: 18)
containerView.addSubview(paletteView) containerView.addSubview(paletteView)
paletteView.autoVCenterInSuperview() paletteView.autoVCenterInSuperview()
@ -182,10 +192,6 @@ public class ImageEditorView: UIView {
owsFailDebug("Missing asset: \(imageName)") owsFailDebug("Missing asset: \(imageName)")
} }
button.tintColor = .white button.tintColor = .white
button.setTitleColor(.white, for: .normal)
button.setTitleColor(.gray, for: .disabled)
button.setTitleColor(UIColor.ows_materialBlue, for: .selected)
button.titleLabel?.font = UIFont.ows_dynamicTypeBody.ows_mediumWeight()
button.addTarget(self, action: selector, for: .touchUpInside) button.addTarget(self, action: selector, for: .touchUpInside)
button.layer.shadowColor = UIColor.black.cgColor button.layer.shadowColor = UIColor.black.cgColor
button.layer.shadowRadius = 4 button.layer.shadowRadius = 4
@ -193,14 +199,39 @@ public class ImageEditorView: UIView {
} }
private func updateButtons() { private func updateButtons() {
undoButton.isEnabled = model.canUndo() var buttons = [OWSButton]()
brushButton.isSelected = editorMode == .brush
cropButton.isSelected = false var hasPalette = false
newTextButton.isSelected = false switch editorMode {
case .text:
// TODO:
hasPalette = true
break
case .brush:
hasPalette = true
if model.canUndo() {
buttons = [undoButton, doneButton]
} else {
buttons = [doneButton]
}
case .none:
if model.canUndo() {
buttons = [undoButton, newTextButton, brushButton, cropButton, captionButton]
} else {
buttons = [newTextButton, brushButton, cropButton, captionButton]
}
}
for button in allButtons { for subview in buttonStackView.subviews {
button.isHidden = isEditingTextItem subview.removeFromSuperview()
} }
buttonStackView.addArrangedSubview(UIView.hStretchingSpacer())
for button in buttons {
buttonStackView.addArrangedSubview(button)
}
paletteView.isHidden = !hasPalette
} }
// MARK: - Actions // MARK: - Actions
@ -217,7 +248,7 @@ public class ImageEditorView: UIView {
@objc func didTapBrush(sender: UIButton) { @objc func didTapBrush(sender: UIButton) {
Logger.verbose("") Logger.verbose("")
toggle(editorMode: .brush) self.editorMode = .brush
} }
@objc func didTapCrop(sender: UIButton) { @objc func didTapCrop(sender: UIButton) {
@ -244,13 +275,16 @@ public class ImageEditorView: UIView {
edit(textItem: textItem) edit(textItem: textItem)
} }
func toggle(editorMode: EditorMode) { @objc func didTapCaption(sender: UIButton) {
if self.editorMode == editorMode { Logger.verbose("")
self.editorMode = .none
} else { // TODO:
self.editorMode = editorMode }
}
updateButtons() @objc func didTapDone(sender: UIButton) {
Logger.verbose("")
self.editorMode = .none
} }
// MARK: - Gestures // MARK: - Gestures
@ -270,6 +304,11 @@ public class ImageEditorView: UIView {
brushGestureRecognizer?.isEnabled = true brushGestureRecognizer?.isEnabled = true
tapGestureRecognizer?.isEnabled = false tapGestureRecognizer?.isEnabled = false
pinchGestureRecognizer?.isEnabled = false pinchGestureRecognizer?.isEnabled = false
case .text:
moveTextGestureRecognizer?.isEnabled = false
brushGestureRecognizer?.isEnabled = false
tapGestureRecognizer?.isEnabled = false
pinchGestureRecognizer?.isEnabled = false
} }
} }
@ -537,20 +576,10 @@ public class ImageEditorView: UIView {
// MARK: - Edit Text Tool // MARK: - Edit Text Tool
private var isEditingTextItem = false {
didSet {
AssertIsOnMainThread()
updateButtons()
}
}
private func edit(textItem: ImageEditorTextItem) { private func edit(textItem: ImageEditorTextItem) {
Logger.verbose("") Logger.verbose("")
toggle(editorMode: .none) self.editorMode = .text
isEditingTextItem = true
// TODO: // TODO:
let maxTextWidthPoints = model.srcImageSizePixels.width * ImageEditorTextItem.kDefaultUnitWidth let maxTextWidthPoints = model.srcImageSizePixels.width * ImageEditorTextItem.kDefaultUnitWidth
@ -566,7 +595,7 @@ public class ImageEditorView: UIView {
private func presentCropTool() { private func presentCropTool() {
Logger.verbose("") Logger.verbose("")
toggle(editorMode: .none) self.editorMode = .none
guard let srcImage = canvasView.loadSrcImage() else { guard let srcImage = canvasView.loadSrcImage() else {
owsFailDebug("Couldn't load src image.") owsFailDebug("Couldn't load src image.")
@ -628,7 +657,7 @@ extension ImageEditorView: ImageEditorTextViewControllerDelegate {
public func textEditDidComplete(textItem: ImageEditorTextItem, text: String?) { public func textEditDidComplete(textItem: ImageEditorTextItem, text: String?) {
AssertIsOnMainThread() AssertIsOnMainThread()
isEditingTextItem = false self.editorMode = .none
guard let text = text?.ows_stripped(), guard let text = text?.ows_stripped(),
text.count > 0 else { text.count > 0 else {
@ -648,7 +677,7 @@ extension ImageEditorView: ImageEditorTextViewControllerDelegate {
} }
public func textEditDidCancel() { public func textEditDidCancel() {
isEditingTextItem = false self.editorMode = .none
} }
} }

Loading…
Cancel
Save