diff --git a/Signal/Images.xcassets/ic_small_x.imageset/Contents.json b/Signal/Images.xcassets/ic_circled_x.imageset/Contents.json similarity index 64% rename from Signal/Images.xcassets/ic_small_x.imageset/Contents.json rename to Signal/Images.xcassets/ic_circled_x.imageset/Contents.json index dd24d1625..a952a1a73 100644 --- a/Signal/Images.xcassets/ic_small_x.imageset/Contents.json +++ b/Signal/Images.xcassets/ic_circled_x.imageset/Contents.json @@ -2,17 +2,17 @@ "images" : [ { "idiom" : "universal", - "filename" : "x-shadow-12@1x.png", + "filename" : "x-circle-shadow-24@1x.png", "scale" : "1x" }, { "idiom" : "universal", - "filename" : "x-shadow-12@2x.png", + "filename" : "x-circle-shadow-24@2x.png", "scale" : "2x" }, { "idiom" : "universal", - "filename" : "x-shadow-12@3x.png", + "filename" : "x-circle-shadow-24@3x.png", "scale" : "3x" } ], diff --git a/Signal/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@1x.png b/Signal/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@1x.png new file mode 100644 index 000000000..ab6319410 Binary files /dev/null and b/Signal/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@1x.png differ diff --git a/Signal/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@2x.png b/Signal/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@2x.png new file mode 100644 index 000000000..0177686fc Binary files /dev/null and b/Signal/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@2x.png differ diff --git a/Signal/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@3x.png b/Signal/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@3x.png new file mode 100644 index 000000000..2d6e24642 Binary files /dev/null and b/Signal/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@3x.png differ diff --git a/Signal/Images.xcassets/ic_small_x.imageset/x-shadow-12@1x.png b/Signal/Images.xcassets/ic_small_x.imageset/x-shadow-12@1x.png deleted file mode 100644 index 99e23b113..000000000 Binary files a/Signal/Images.xcassets/ic_small_x.imageset/x-shadow-12@1x.png and /dev/null differ diff --git a/Signal/Images.xcassets/ic_small_x.imageset/x-shadow-12@2x.png b/Signal/Images.xcassets/ic_small_x.imageset/x-shadow-12@2x.png deleted file mode 100644 index 7f4edb311..000000000 Binary files a/Signal/Images.xcassets/ic_small_x.imageset/x-shadow-12@2x.png and /dev/null differ diff --git a/Signal/Images.xcassets/ic_small_x.imageset/x-shadow-12@3x.png b/Signal/Images.xcassets/ic_small_x.imageset/x-shadow-12@3x.png deleted file mode 100644 index 018ac849d..000000000 Binary files a/Signal/Images.xcassets/ic_small_x.imageset/x-shadow-12@3x.png and /dev/null differ diff --git a/Signal/src/ViewControllers/MediaPageViewController.swift b/Signal/src/ViewControllers/MediaPageViewController.swift index e7c0d7244..0d7076a12 100644 --- a/Signal/src/ViewControllers/MediaPageViewController.swift +++ b/Signal/src/ViewControllers/MediaPageViewController.swift @@ -1,5 +1,5 @@ // -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. +// Copyright (c) 2019 Open Whisper Systems. All rights reserved. // import UIKit @@ -331,7 +331,9 @@ class MediaPageViewController: UIPageViewController, UIPageViewControllerDataSou return } - galleryRailView.configureCellViews(itemProvider: currentItem.album, focusedItem: currentItem, cellViewDecoratorBlock: { _ in }) + galleryRailView.configureCellViews(itemProvider: currentItem.album, + focusedItem: currentItem, + cellViewBuilder: { return GalleryRailCellView() }) } // MARK: Actions diff --git a/SignalMessaging/ViewControllers/AttachmentApprovalViewController.swift b/SignalMessaging/ViewControllers/AttachmentApprovalViewController.swift index 046cc89f1..e270f756d 100644 --- a/SignalMessaging/ViewControllers/AttachmentApprovalViewController.swift +++ b/SignalMessaging/ViewControllers/AttachmentApprovalViewController.swift @@ -400,29 +400,6 @@ public class AttachmentApprovalViewController: UIPageViewController, UIPageViewC }) } - func addDeleteIcon(cellView: GalleryRailCellView) { - guard let attachmentItem = cellView.item as? SignalAttachmentItem else { - owsFailDebug("attachmentItem was unexpectedly nil") - return - } - - let button = OWSButton { [weak self] in - guard let strongSelf = self else { return } - strongSelf.remove(attachmentItem: attachmentItem) - } - button.setImage(#imageLiteral(resourceName: "ic_small_x"), for: .normal) - - let kInsetDistance: CGFloat = 5 - button.imageEdgeInsets = UIEdgeInsets(top: kInsetDistance, left: kInsetDistance, bottom: kInsetDistance, right: kInsetDistance) - - cellView.addSubview(button) - - let kButtonWidth: CGFloat = 9 + kInsetDistance * 2 - button.autoSetDimensions(to: CGSize(width: kButtonWidth, height: kButtonWidth)) - button.autoPinEdge(toSuperviewMargin: .top) - button.autoPinEdge(toSuperviewMargin: .trailing) - } - lazy var pagerScrollView: UIScrollView? = { // This is kind of a hack. Since we don't have first class access to the superview's `scrollView` // we traverse the view hierarchy until we find it. @@ -566,12 +543,15 @@ public class AttachmentApprovalViewController: UIPageViewController, UIPageViewC return } - let cellViewDecoratorBlock = { (cellView: GalleryRailCellView) in - self.addDeleteIcon(cellView: cellView) + let cellViewBuilder: () -> ApprovalRailCellView = { [weak self] in + let cell = ApprovalRailCellView() + cell.approvalRailCellDelegate = self + return cell } + galleryRailView.configureCellViews(itemProvider: attachmentItemCollection, focusedItem: currentItem, - cellViewDecoratorBlock: cellViewDecoratorBlock) + cellViewBuilder: cellViewBuilder) galleryRailView.isHidden = attachmentItemCollection.attachmentItems.count < 2 } @@ -1934,3 +1914,54 @@ class MediaMessageTextToolbar: UIView, UITextViewDelegate { return CGFloatClamp(contentSize.height, kMinTextViewHeight, maxTextViewHeight) } } + +extension AttachmentApprovalViewController: ApprovalRailCellViewDelegate { + func approvalRailCellView(_ approvalRailCellView: ApprovalRailCellView, didRemoveItem attachmentItem: SignalAttachmentItem) { + remove(attachmentItem: attachmentItem) + } +} + +protocol ApprovalRailCellViewDelegate: class { + func approvalRailCellView(_ approvalRailCellView: ApprovalRailCellView, didRemoveItem attachmentItem: SignalAttachmentItem) +} + +public class ApprovalRailCellView: GalleryRailCellView { + + weak var approvalRailCellDelegate: ApprovalRailCellViewDelegate? + + lazy var deleteButton: UIButton = { + let button = OWSButton { [weak self] in + guard let strongSelf = self else { return } + + guard let attachmentItem = strongSelf.item as? SignalAttachmentItem else { + owsFailDebug("attachmentItem was unexpectedly nil") + return + } + + strongSelf.approvalRailCellDelegate?.approvalRailCellView(strongSelf, didRemoveItem: attachmentItem) + } + + button.setImage(#imageLiteral(resourceName: "ic_circled_x"), for: .normal) + + let kInsetDistance: CGFloat = 5 + button.imageEdgeInsets = UIEdgeInsets(top: kInsetDistance, left: kInsetDistance, bottom: kInsetDistance, right: kInsetDistance) + + let kButtonWidth: CGFloat = 24 + kInsetDistance * 2 + button.autoSetDimensions(to: CGSize(width: kButtonWidth, height: kButtonWidth)) + + return button + }() + + override func setIsSelected(_ isSelected: Bool) { + super.setIsSelected(isSelected) + + if isSelected { + addSubview(deleteButton) + + deleteButton.autoPinEdge(toSuperviewEdge: .top, withInset: -12) + deleteButton.autoPinEdge(toSuperviewEdge: .trailing, withInset: -8) + } else { + deleteButton.removeFromSuperview() + } + } +} diff --git a/SignalMessaging/Views/GalleryRailView.swift b/SignalMessaging/Views/GalleryRailView.swift index 96bc1f0a6..2e52f9e06 100644 --- a/SignalMessaging/Views/GalleryRailView.swift +++ b/SignalMessaging/Views/GalleryRailView.swift @@ -1,5 +1,5 @@ // -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. +// Copyright (c) 2019 Open Whisper Systems. All rights reserved. // import PromiseKit @@ -25,7 +25,7 @@ public class GalleryRailCellView: UIView { super.init(frame: frame) layoutMargins = .zero - self.clipsToBounds = true + clipsToBounds = false addSubview(imageView) imageView.autoPinEdgesToSuperviewMargins() @@ -107,7 +107,9 @@ public class GalleryRailView: UIView, GalleryRailCellViewDelegate { override init(frame: CGRect) { super.init(frame: frame) + clipsToBounds = false addSubview(scrollView) + scrollView.clipsToBounds = false scrollView.layoutMargins = .zero scrollView.autoPinEdgesToSuperviewMargins() } @@ -118,7 +120,7 @@ public class GalleryRailView: UIView, GalleryRailCellViewDelegate { // MARK: Public - public func configureCellViews(itemProvider: GalleryRailItemProvider?, focusedItem: GalleryRailItem?, cellViewDecoratorBlock: (GalleryRailCellView) -> Void) { + public func configureCellViews(itemProvider: GalleryRailItemProvider?, focusedItem: GalleryRailItem?, cellViewBuilder: () -> GalleryRailCellView) { let animationDuration: TimeInterval = 0.2 guard let itemProvider = itemProvider else { @@ -169,11 +171,12 @@ public class GalleryRailView: UIView, GalleryRailCellViewDelegate { self.isHidden = false } - let cellViews = buildCellViews(items: itemProvider.railItems, cellViewDecoratorBlock: cellViewDecoratorBlock) + let cellViews = buildCellViews(items: itemProvider.railItems, cellViewBuilder: cellViewBuilder) self.cellViews = cellViews let stackView = UIStackView(arrangedSubviews: cellViews) stackView.axis = .horizontal stackView.spacing = 2 + stackView.clipsToBounds = false scrollView.addSubview(stackView) stackView.autoPinEdgesToSuperviewEdges() @@ -203,11 +206,10 @@ public class GalleryRailView: UIView, GalleryRailCellViewDelegate { return scrollView }() - private func buildCellViews(items: [GalleryRailItem], cellViewDecoratorBlock: (GalleryRailCellView) -> Void) -> [GalleryRailCellView] { + private func buildCellViews(items: [GalleryRailItem], cellViewBuilder: () -> GalleryRailCellView) -> [GalleryRailCellView] { return items.map { item in - let cellView = GalleryRailCellView() + let cellView = cellViewBuilder() cellView.configure(item: item, delegate: self) - cellViewDecoratorBlock(cellView) return cellView } }