From 0ab326da928687fb8fa833a7e9250527adc4befb Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Tue, 8 Jan 2019 13:07:23 -0700 Subject: [PATCH] Only show delete button on selected rail item --- .../Contents.json | 6 +- .../x-circle-shadow-24@1x.png | Bin 0 -> 760 bytes .../x-circle-shadow-24@2x.png | Bin 0 -> 1326 bytes .../x-circle-shadow-24@3x.png | Bin 0 -> 2036 bytes .../ic_small_x.imageset/x-shadow-12@1x.png | Bin 345 -> 0 bytes .../ic_small_x.imageset/x-shadow-12@2x.png | Bin 563 -> 0 bytes .../ic_small_x.imageset/x-shadow-12@3x.png | Bin 979 -> 0 bytes .../MediaPageViewController.swift | 6 +- .../AttachmentApprovalViewController.swift | 83 ++++++++++++------ SignalMessaging/Views/GalleryRailView.swift | 16 ++-- 10 files changed, 73 insertions(+), 38 deletions(-) rename Signal/Images.xcassets/{ic_small_x.imageset => ic_circled_x.imageset}/Contents.json (64%) create mode 100644 Signal/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@1x.png create mode 100644 Signal/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@2x.png create mode 100644 Signal/Images.xcassets/ic_circled_x.imageset/x-circle-shadow-24@3x.png delete mode 100644 Signal/Images.xcassets/ic_small_x.imageset/x-shadow-12@1x.png delete mode 100644 Signal/Images.xcassets/ic_small_x.imageset/x-shadow-12@2x.png delete mode 100644 Signal/Images.xcassets/ic_small_x.imageset/x-shadow-12@3x.png 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 0000000000000000000000000000000000000000..ab6319410a2b0b98da7c77413e1ac06a8f507a1a GIT binary patch literal 760 zcmVX1^@s6D=Y3@00009a7bBm000XT z000XT0n*)m`~Uy~s!2paR7i=nR!@i$Q5gTd$X%yPdvOPBuUSFoHV{JbuxzLPcv&hT z=%R#OI@BS;YY9ssA#{)+N$3!sq>HtI>~72;O)hS_Cl07=Q&uQP$mV_Z6{ERn={u&$k7j4M5ZF zLP715M%>wKR&F+%&j*9SAKeC;ru|h_^;I+)Jquuw#+kTG4ZxzJDA%SDPlALpnao`P z%QW6rU`YPR#4sn)>2v~sM-&msSuU3g&}@z>(ChWOkx1kr0GWqtZ1$Z_XHOikU#l5r z2dn-@qp=U*BL53xo6>HnR4N;iB%R}n-|cqs;$_0H+QETob5I-aCtnVi%e9h7Btig| zh?nQVf-K7+kwB6p+`Mre-EPk$!pW(Re8^WsAP`t1E#fue#28!FH0_7O;W#xp)1BR~ zc$|8&G)9! zGcY87EY9BYJQ&vVpx^I*QZAP((`j|RSS(h(UhgviksRHmgOb#sn_d=)oS%uDwQf13Wc8l8USc((zC7WdVj=cbyoAkUKFD8YmrNb qBC*xsKlNTTAwAW|;-|ze8{pq}UH7v^_7a5OSX!eAVM}-m}Fbu<>S6!mV7RR|4 zDzv^xkM_A$LwC6FE#PYmDDHTK9y`Xy#-14%7M zHk(^nS@~gRX68>q$PTSOrbqo2!8Kk64b(1E1M$ej#Kfz6dwcVhO66}$6YzmAVz78z ze1qLwPj0fpYNdlPA*2g7I5>D~dwcskUD9qqEW~8-oq}ZCY8J4*zWz}ycianziP(V% z;E3O(mh9~899dgi`_Y3(-9QfHLQXEfs}P|;CIA5og~A_=CeMIeRD_-YZm>Q@&A#*b zeEv|#(qJGb*Ak46Ft|MhWV6|O%_h%)+`0l-*Rf}V#l^+1g{VyiIB>I*(3M;TV1E9u z$urR33U>jru5);J_=^z9fiLF2w5?Y7^#>QXt|WaHnw*^Mj7Fo+3KbmY7rr7t-TT=# zeAk7JKe&LCP{BRSU7{9-_4oJp30HDBDHOU z-qX|bvLY6F^6FJ``|Y<#DD;@N2q$^OKrF;m0i3|ic?lEHLak$Xc=&ZioGPwgyQVF| zjXYxc0p-@g@fBO3ySrQ3*JRKUQ7?HnZq6~#5)Oyk1y2S1hzNo_K)JQ>W5Aw@48yoi zuX)X~tj`5cA2_&wpL~3GnwVy}dhtsyzEBlZFL?&TFy0`9d_(?S%N#hnkRf>Zgj-7l zNnXZL7z6b{CL&<+0s>#ugW!!sLMTUB(Bw%Y1Yp2!rniK0l*wkNdJ(7q*=(blof;zG z^z`&ZxXK4)PY<|}N1vAs>{>-oZs*<=2`#X(vGJ?msep<+ zLr@}Q+?aq0wc^6U!uNuw3v_;AgAhTv6*<0Q3oI`$|8;b9loz}msO9mX9ueRKZq9Nh zphykxDtDHamcA7ta4=2Ness_wuM&Y+h^YeQv_q{}eUBf8yu9Gyk0HBlF8)Va=C0a>&_z=a;mzHuNGiPrBeB!p`p*3(GtjkT*xU@N+8`M zGYsQ0{Tipo=kU?q-X33FU465)we^PJ6ae=3_kZv0?fo>9$?VZ+oAhX(Tb6a^%%b%; zoyla(csxEeH8qtAvNaG3F%cU%gbP%VZ5l{srE_~^Y~KKHj_aAF;ENdCK7jTfnY0Tr za9v5*R^`u=$z;dq=;-rZU0rR_X!L0z5Qls|f3&r=m7SfPT}!1>&TUrdwyUh`R5_{y za6&xyiRtkPe2k2Y#3GT%6+XuC@o{NxZjP-r9;yiI>=QRcfDbfRfZ*gV=>Pvp=pvB+ k3vn%?g<9_TIS@kr0qe|^-6PA+9{>OV07*qoM6N<$f<3Z#%m4rY literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2d6e24642a6dd622448d339628f67ee1cfe7698f GIT binary patch literal 2036 zcmVt%v!(D`HD}pbW>Yb*AT5X9R zNNH&eq9je))KbzW2Ade05R#IZCQ6`ytu?VxCm+2+Ar^02eBFL%2Om)q(D?41zwcT z){ezuv7kyZC>~Eq*GdqT_oMh+I;Z1>H9CS6(0v4H#qD;xgeo?hZ9V+Wvg~akEh{Ul zZ6WOod6`!^l~$tot3^dc_C0&{tamsZo9uS`D={%KaYVxs1cSkV&*$sw?(Xh$yWJhN zwY5IJR4*$10LAs2dQc~n02-kXi^572(heU!{5H$7=bk)y@_^F`Xv^dA{0ePDAAG?5 zVteN749QQaL{$|P1nTJMc-Qaud-M{82J~_M{P~X-g+Nk5@Im-jOv}m1`D|ol46t!Q z1d0T41dvGj2qappeX^pRZfDE{meEB*XXbGnG}ygI>?Wp($dnMYL7)R2lnq{wrzclNDoIOIdPyb=u<1;TS-aDM!9OT z0y!Lxw}?cQ=qZvB;s|7BW^N)95qK5DE7u#$^Q(9hQ9~o=>V9Uf-|!HX;^LO5T78TZ zN5EpSe1LxbE<`wvdq5pQWo2cvk6^+joRMUPI7+@!1xA5eo8bi$ zW0W`o7K`O$KKh%G#&O&*?b*DANYN3&QL#u;!Z0R?!z1Z4b&44cZMumuNgOJY0`1r`;1RURxo)mnm}A{Z|@M18X}?GKA0&I?<>cLdC&x68XFt?h{O;G=ibUJk>q@( z3e?il^7qu#R9O2VJ#IXW7HM*FauR$cGI+2+K@{LMT7O?(-*uvfO7y%dH&P^z$I~PD z%Ll9jeFOn#&YZbMB&xuOBMYNMI(6z)Cy|Jd6$oC~9vd4QB{F0P1OkSg=O~E;eQN=H zYi@3q^$!b#hgq)>E?&IYLe!EWE-sFF|GiwIfL?dyG?AcB=vxcCZhvwf$iJ3S3rkE<{|}bbvm6tf$dr?q)jo|6%DZ4?dff8ZJ#72 zCR&LG77?&pcDYOFfibQKB4b$r<52?9~KaeCh7+Sgh)X_LB^p&hu$=5 zV+k9-6DLkwtFNyg7L63e4-UwU8jPU=;i*?#Tjo=H^F@NaiSKaZn8R3HU({|a983snCzq5{dmFwB3#46X`t Ss{!l)0000clCes}Komt!R!}S!OqFgIBJ5XK3Vwp%H>9zO*xOiU zAZ(K&2&-kL5R!kGE`>#^*jO!WA&3@^yf7$`ujaAKG;No85~wUQwdWqxsuxXlI r+qTAo9&YoZEr9+90N=_hV$N;i00000NkvXXu0mjfCl8cz 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 7f4edb311705cfb6963b100832cfc3f394256653..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 563 zcmV-30?hr1P)8IT@c^&@VnyoMB@!D0V=FT;bZ2GB zTnX_6eG;au40!+sI?#oU322i_7=6iIbam`B62j8et$g3lxjrY6wU(kN>QgoLcwXYe zTANdc(T4AJA^6MavHB6mz!-ByM8^oMDR+&b*2{dx4unsz_&7z(=kuradi^<@&8~^) zjMw_uMqkJ}a)ALB9Ky$IbU;Lx#+aKt&%dp;wkV3P$z*cRB4>&y;;4xc$OQ&iaDWS( z%v}kv$W)8CmG}gZhslw+XnFbagJV<8)`i z^E=NAsyg<<)5SlsuJQ{v&#getxtx|E_B^yjSmQrl@=JW@EpkuGcszbUcurSvi-H1y zbAE?t=@Y-eHs|WJ3^_u5(x{{%5O8i>0bif^Dxr?fy?0T^N-BXQN#YjgK>=SS;L-y1 zb)99|Gp<~Z^Wb%@D*+Z9`nrx-V8Cs09>?)vnx?P(JLCDyX{24A@ufOKd{9D2J@&uhU6j~H6~?^^{C{Q^qCr-}G>ScL!p002ovPDHLkV1h$F B{}BKH 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 018ac849d8ccc9258b8b610bedbf82925364527d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 979 zcmV;^11$WBP)pvPoN-UK0unikBXG(8Y7k zg+dW2loAT~qCe6Nc2ydV*EiXwSeA8zeRB+*r!H6Tvd+)XTlIRq;y8|T zbaeF9vaB=_-E&p0?c!o+rnsK>v#)BknrGh}Bb&`Wm2q8dWVFxKN35k%>9Ye;E|+(c z$>b9v$^fu?o?rs>0tl(>gMFdzot>Rc8Q0Z5AD~n!HB~GY_cfp*0piSf!ElU3BJr{* zAXZ+e0;Qub2oTbw05h!uU3p7K=q& zj`jEV53jDSzDXvN*L@p2!qvoUd5@f7U#4l!vTxr8SG0g6D0ZL%#Q}XAT;aK;rKJTG znCEQsx6%UcK5doxz~}&}S_lSU7{+TNdd}Je)ZYW7Y9Rp33kiso$5fzn zt&1h4pC7EoI)L>sLOwLw$Ujxh>-z6?dBNhe|H z!dBJH#RnYz%Rht{TJA0V0VDs z2limOT&^!KFXtvECLYYp%zRv2T-+z3GWr*=DGd|%!A3yJPS10DUjjtFr$smkSUP{RVzKO?Bn0#1sGk002ovPDHLkV1nej B#r*&P 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 } }