feat: add content warning toggle button

This commit is contained in:
CMK 2022-02-11 20:21:28 +08:00
parent d3e8f85cb3
commit 0bc128ba79
14 changed files with 374 additions and 184 deletions

View File

@ -283,23 +283,23 @@ extension DataSourceFacade {
guard let _status = status.object(in: dependency.context.managedObjectContext) else { return } guard let _status = status.object(in: dependency.context.managedObjectContext) else { return }
let status = _status.reblog ?? _status let status = _status.reblog ?? _status
let isToggled = status.isContentSensitiveToggled || status.isMediaSensitiveToggled let allToggled = status.isContentSensitiveToggled && status.isMediaSensitiveToggled
status.update(isContentSensitiveToggled: !isToggled) status.update(isContentSensitiveToggled: !allToggled)
status.update(isMediaSensitiveToggled: !isToggled) status.update(isMediaSensitiveToggled: !allToggled)
} }
} }
static func responseToToggleMediaSensitiveAction( // static func responseToToggleMediaSensitiveAction(
dependency: NeedsDependency, // dependency: NeedsDependency,
status: ManagedObjectRecord<Status> // status: ManagedObjectRecord<Status>
) async throws { // ) async throws {
try await dependency.context.managedObjectContext.perform { // try await dependency.context.managedObjectContext.perform {
guard let _status = status.object(in: dependency.context.managedObjectContext) else { return } // guard let _status = status.object(in: dependency.context.managedObjectContext) else { return }
let status = _status.reblog ?? _status // let status = _status.reblog ?? _status
//
status.update(isMediaSensitiveToggled: !status.isMediaSensitiveToggled) // status.update(isMediaSensitiveToggled: !status.isMediaSensitiveToggled)
} // }
} // }
} }

View File

@ -222,12 +222,11 @@ extension NotificationTableViewCellDelegate where Self: DataSourceProvider {
) )
} }
func tableViewCell( func tableViewCell(
_ cell: UITableViewCell, notificationView: NotificationView, _ cell: UITableViewCell,
notificationView: NotificationView,
statusView: StatusView, statusView: StatusView,
spoilerBannerViewDidPressed bannerView: SpoilerBannerView spoilerOverlayViewDidPressed overlayView: SpoilerOverlayView
) { ) {
Task { Task {
let source = DataSourceItem.Source(tableViewCell: cell, indexPath: nil) let source = DataSourceItem.Source(tableViewCell: cell, indexPath: nil)
@ -256,6 +255,38 @@ extension NotificationTableViewCellDelegate where Self: DataSourceProvider {
} }
// func tableViewCell(
// _ cell: UITableViewCell, notificationView: NotificationView,
// statusView: StatusView,
// spoilerBannerViewDidPressed bannerView: SpoilerBannerView
// ) {
// Task {
// let source = DataSourceItem.Source(tableViewCell: cell, indexPath: nil)
// guard let item = await item(from: source) else {
// assertionFailure()
// return
// }
// guard case let .notification(notification) = item else {
// assertionFailure("only works for notification item")
// return
// }
// let _status: ManagedObjectRecord<Status>? = try await self.context.managedObjectContext.perform {
// guard let notification = notification.object(in: self.context.managedObjectContext) else { return nil }
// guard let status = notification.status else { return nil }
// return .init(objectID: status.objectID)
// }
// guard let status = _status else {
// assertionFailure()
// return
// }
// try await DataSourceFacade.responseToToggleSensitiveAction(
// dependency: self,
// status: status
// )
// } // end Task
// }
func tableViewCell( func tableViewCell(
_ cell: UITableViewCell, _ cell: UITableViewCell,
notificationView: NotificationView, notificationView: NotificationView,

View File

@ -126,7 +126,7 @@ extension StatusTableViewCellDelegate where Self: DataSourceProvider & MediaPrev
} }
guard !needsToggleMediaSensitive else { guard !needsToggleMediaSensitive else {
try await DataSourceFacade.responseToToggleMediaSensitiveAction( try await DataSourceFacade.responseToToggleSensitiveAction(
dependency: self, dependency: self,
status: status status: status
) )
@ -362,6 +362,29 @@ extension StatusTableViewCellDelegate where Self: DataSourceProvider {
// MARK: - content warning // MARK: - content warning
extension StatusTableViewCellDelegate where Self: DataSourceProvider { extension StatusTableViewCellDelegate where Self: DataSourceProvider {
func tableViewCell(
_ cell: UITableViewCell,
statusView: StatusView,
contentSensitiveeToggleButtonDidPressed button: UIButton
) {
Task {
let source = DataSourceItem.Source(tableViewCell: cell, indexPath: nil)
guard let item = await item(from: source) else {
assertionFailure()
return
}
guard case let .status(status) = item else {
assertionFailure("only works for status data provider")
return
}
try await DataSourceFacade.responseToToggleSensitiveAction(
dependency: self,
status: status
)
} // end Task
}
func tableViewCell( func tableViewCell(
_ cell: UITableViewCell, _ cell: UITableViewCell,
statusView: StatusView, statusView: StatusView,
@ -384,27 +407,27 @@ extension StatusTableViewCellDelegate where Self: DataSourceProvider {
} // end Task } // end Task
} }
func tableViewCell( // func tableViewCell(
_ cell: UITableViewCell, // _ cell: UITableViewCell,
statusView: StatusView, // statusView: StatusView,
spoilerBannerViewDidPressed bannerView: SpoilerBannerView // spoilerBannerViewDidPressed bannerView: SpoilerBannerView
) { // ) {
Task { // Task {
let source = DataSourceItem.Source(tableViewCell: cell, indexPath: nil) // let source = DataSourceItem.Source(tableViewCell: cell, indexPath: nil)
guard let item = await item(from: source) else { // guard let item = await item(from: source) else {
assertionFailure() // assertionFailure()
return // return
} // }
guard case let .status(status) = item else { // guard case let .status(status) = item else {
assertionFailure("only works for status data provider") // assertionFailure("only works for status data provider")
return // return
} // }
try await DataSourceFacade.responseToToggleSensitiveAction( // try await DataSourceFacade.responseToToggleSensitiveAction(
dependency: self, // dependency: self,
status: status // status: status
) // )
} // end Task // } // end Task
} // }
func tableViewCell( func tableViewCell(
_ cell: UITableViewCell, _ cell: UITableViewCell,
@ -422,7 +445,7 @@ extension StatusTableViewCellDelegate where Self: DataSourceProvider {
assertionFailure("only works for status data provider") assertionFailure("only works for status data provider")
return return
} }
try await DataSourceFacade.responseToToggleMediaSensitiveAction( try await DataSourceFacade.responseToToggleSensitiveAction(
dependency: self, dependency: self,
status: status status: status
) )

View File

@ -27,12 +27,10 @@ protocol NotificationTableViewCellDelegate: AnyObject, AutoGenerateProtocolDeleg
func tableViewCell(_ cell: UITableViewCell, notificationView: NotificationView, menuButton button: UIButton, didSelectAction action: MastodonMenu.Action) func tableViewCell(_ cell: UITableViewCell, notificationView: NotificationView, menuButton button: UIButton, didSelectAction action: MastodonMenu.Action)
func tableViewCell(_ cell: UITableViewCell, notificationView: NotificationView, statusView: StatusView, metaText: MetaText, didSelectMeta meta: Meta) func tableViewCell(_ cell: UITableViewCell, notificationView: NotificationView, statusView: StatusView, metaText: MetaText, didSelectMeta meta: Meta)
func tableViewCell(_ cell: UITableViewCell, notificationView: NotificationView, statusView: StatusView, spoilerOverlayViewDidPressed overlayView: SpoilerOverlayView) func tableViewCell(_ cell: UITableViewCell, notificationView: NotificationView, statusView: StatusView, spoilerOverlayViewDidPressed overlayView: SpoilerOverlayView)
func tableViewCell(_ cell: UITableViewCell, notificationView: NotificationView, statusView: StatusView, spoilerBannerViewDidPressed bannerView: SpoilerBannerView)
func tableViewCell(_ cell: UITableViewCell, notificationView: NotificationView, statusView: StatusView, actionToolbarContainer: ActionToolbarContainer, buttonDidPressed button: UIButton, action: ActionToolbarContainer.Action) func tableViewCell(_ cell: UITableViewCell, notificationView: NotificationView, statusView: StatusView, actionToolbarContainer: ActionToolbarContainer, buttonDidPressed button: UIButton, action: ActionToolbarContainer.Action)
func tableViewCell(_ cell: UITableViewCell, notificationView: NotificationView, quoteStatusView: StatusView, authorAvatarButtonDidPressed button: AvatarButton) func tableViewCell(_ cell: UITableViewCell, notificationView: NotificationView, quoteStatusView: StatusView, authorAvatarButtonDidPressed button: AvatarButton)
func tableViewCell(_ cell: UITableViewCell, notificationView: NotificationView, quoteStatusView: StatusView, metaText: MetaText, didSelectMeta meta: Meta) func tableViewCell(_ cell: UITableViewCell, notificationView: NotificationView, quoteStatusView: StatusView, metaText: MetaText, didSelectMeta meta: Meta)
func tableViewCell(_ cell: UITableViewCell, notificationView: NotificationView, quoteStatusView: StatusView, spoilerOverlayViewDidPressed overlayView: SpoilerOverlayView) func tableViewCell(_ cell: UITableViewCell, notificationView: NotificationView, quoteStatusView: StatusView, spoilerOverlayViewDidPressed overlayView: SpoilerOverlayView)
func tableViewCell(_ cell: UITableViewCell, notificationView: NotificationView, quoteStatusView: StatusView, spoilerBannerViewDidPressed bannerView: SpoilerBannerView)
func tableViewCell(_ cell: UITableViewCell, notificationView: NotificationView, accessibilityActivate: Void) func tableViewCell(_ cell: UITableViewCell, notificationView: NotificationView, accessibilityActivate: Void)
// sourcery:end // sourcery:end
} }
@ -57,10 +55,6 @@ extension NotificationViewDelegate where Self: NotificationViewContainerTableVie
delegate?.tableViewCell(self, notificationView: notificationView, statusView: statusView, spoilerOverlayViewDidPressed: overlayView) delegate?.tableViewCell(self, notificationView: notificationView, statusView: statusView, spoilerOverlayViewDidPressed: overlayView)
} }
func notificationView(_ notificationView: NotificationView, statusView: StatusView, spoilerBannerViewDidPressed bannerView: SpoilerBannerView) {
delegate?.tableViewCell(self, notificationView: notificationView, statusView: statusView, spoilerBannerViewDidPressed: bannerView)
}
func notificationView(_ notificationView: NotificationView, statusView: StatusView, actionToolbarContainer: ActionToolbarContainer, buttonDidPressed button: UIButton, action: ActionToolbarContainer.Action) { func notificationView(_ notificationView: NotificationView, statusView: StatusView, actionToolbarContainer: ActionToolbarContainer, buttonDidPressed button: UIButton, action: ActionToolbarContainer.Action) {
delegate?.tableViewCell(self, notificationView: notificationView, statusView: statusView, actionToolbarContainer: actionToolbarContainer, buttonDidPressed: button, action: action) delegate?.tableViewCell(self, notificationView: notificationView, statusView: statusView, actionToolbarContainer: actionToolbarContainer, buttonDidPressed: button, action: action)
} }
@ -77,10 +71,6 @@ extension NotificationViewDelegate where Self: NotificationViewContainerTableVie
delegate?.tableViewCell(self, notificationView: notificationView, quoteStatusView: quoteStatusView, spoilerOverlayViewDidPressed: overlayView) delegate?.tableViewCell(self, notificationView: notificationView, quoteStatusView: quoteStatusView, spoilerOverlayViewDidPressed: overlayView)
} }
func notificationView(_ notificationView: NotificationView, quoteStatusView: StatusView, spoilerBannerViewDidPressed bannerView: SpoilerBannerView) {
delegate?.tableViewCell(self, notificationView: notificationView, quoteStatusView: quoteStatusView, spoilerBannerViewDidPressed: bannerView)
}
func notificationView(_ notificationView: NotificationView, accessibilityActivate: Void) { func notificationView(_ notificationView: NotificationView, accessibilityActivate: Void) {
delegate?.tableViewCell(self, notificationView: notificationView, accessibilityActivate: accessibilityActivate) delegate?.tableViewCell(self, notificationView: notificationView, accessibilityActivate: accessibilityActivate)
} }

View File

@ -175,46 +175,4 @@ extension NotificationTimelineViewController: UITableViewDelegate, AutoGenerateT
} }
// MARK: - NotificationTableViewCellDelegate // MARK: - NotificationTableViewCellDelegate
extension NotificationTimelineViewController: NotificationTableViewCellDelegate { extension NotificationTimelineViewController: NotificationTableViewCellDelegate { }
func tableViewCell(
_ cell: UITableViewCell,
notificationView: NotificationView,
statusView: StatusView,
spoilerOverlayViewDidPressed overlayView: SpoilerOverlayView
) {
guard let diffableDataSource = viewModel.diffableDataSource else { return }
guard let indexPath = tableView.indexPath(for: cell) else { return }
guard let reloadItem = diffableDataSource.itemIdentifier(for: indexPath) else { return }
Task {
let source = DataSourceItem.Source(tableViewCell: cell, indexPath: nil)
guard let item = await item(from: source) else {
assertionFailure()
return
}
guard case let .notification(notification) = item else {
assertionFailure("only works for notification item")
return
}
let _status: ManagedObjectRecord<Status>? = try await self.context.managedObjectContext.perform {
guard let notification = notification.object(in: self.context.managedObjectContext) else { return nil }
guard let status = notification.status else { return nil }
return .init(objectID: status.objectID)
}
guard let status = _status else {
assertionFailure()
return
}
try await DataSourceFacade.responseToToggleSensitiveAction(
dependency: self,
status: status
)
// var snapshot = diffableDataSource.snapshot()
// snapshot.reloadItems([reloadItem])
// diffableDataSource.apply(snapshot, animatingDifferences: false)
} // end Task
}
}

View File

@ -25,6 +25,7 @@ protocol StatusTableViewCellDelegate: AnyObject, AutoGenerateProtocolDelegate {
// sourcery:inline:StatusTableViewCellDelegate.AutoGenerateProtocolDelegate // sourcery:inline:StatusTableViewCellDelegate.AutoGenerateProtocolDelegate
func tableViewCell(_ cell: UITableViewCell, statusView: StatusView, headerDidPressed header: UIView) func tableViewCell(_ cell: UITableViewCell, statusView: StatusView, headerDidPressed header: UIView)
func tableViewCell(_ cell: UITableViewCell, statusView: StatusView, authorAvatarButtonDidPressed button: AvatarButton) func tableViewCell(_ cell: UITableViewCell, statusView: StatusView, authorAvatarButtonDidPressed button: AvatarButton)
func tableViewCell(_ cell: UITableViewCell, statusView: StatusView, contentSensitiveeToggleButtonDidPressed button: UIButton)
func tableViewCell(_ cell: UITableViewCell, statusView: StatusView, metaText: MetaText, didSelectMeta meta: Meta) func tableViewCell(_ cell: UITableViewCell, statusView: StatusView, metaText: MetaText, didSelectMeta meta: Meta)
func tableViewCell(_ cell: UITableViewCell, statusView: StatusView, mediaGridContainerView: MediaGridContainerView, mediaView: MediaView, didSelectMediaViewAt index: Int) func tableViewCell(_ cell: UITableViewCell, statusView: StatusView, mediaGridContainerView: MediaGridContainerView, mediaView: MediaView, didSelectMediaViewAt index: Int)
func tableViewCell(_ cell: UITableViewCell, statusView: StatusView, pollTableView tableView: UITableView, didSelectRowAt indexPath: IndexPath) func tableViewCell(_ cell: UITableViewCell, statusView: StatusView, pollTableView tableView: UITableView, didSelectRowAt indexPath: IndexPath)
@ -32,7 +33,6 @@ protocol StatusTableViewCellDelegate: AnyObject, AutoGenerateProtocolDelegate {
func tableViewCell(_ cell: UITableViewCell, statusView: StatusView, actionToolbarContainer: ActionToolbarContainer, buttonDidPressed button: UIButton, action: ActionToolbarContainer.Action) func tableViewCell(_ cell: UITableViewCell, statusView: StatusView, actionToolbarContainer: ActionToolbarContainer, buttonDidPressed button: UIButton, action: ActionToolbarContainer.Action)
func tableViewCell(_ cell: UITableViewCell, statusView: StatusView, menuButton button: UIButton, didSelectAction action: MastodonMenu.Action) func tableViewCell(_ cell: UITableViewCell, statusView: StatusView, menuButton button: UIButton, didSelectAction action: MastodonMenu.Action)
func tableViewCell(_ cell: UITableViewCell, statusView: StatusView, spoilerOverlayViewDidPressed overlayView: SpoilerOverlayView) func tableViewCell(_ cell: UITableViewCell, statusView: StatusView, spoilerOverlayViewDidPressed overlayView: SpoilerOverlayView)
func tableViewCell(_ cell: UITableViewCell, statusView: StatusView, spoilerBannerViewDidPressed bannerView: SpoilerBannerView)
func tableViewCell(_ cell: UITableViewCell, statusView: StatusView, mediaGridContainerView: MediaGridContainerView, mediaSensitiveButtonDidPressed button: UIButton) func tableViewCell(_ cell: UITableViewCell, statusView: StatusView, mediaGridContainerView: MediaGridContainerView, mediaSensitiveButtonDidPressed button: UIButton)
func tableViewCell(_ cell: UITableViewCell, statusView: StatusView, accessibilityActivate: Void) func tableViewCell(_ cell: UITableViewCell, statusView: StatusView, accessibilityActivate: Void)
// sourcery:end // sourcery:end
@ -51,6 +51,10 @@ extension StatusViewDelegate where Self: StatusViewContainerTableViewCell {
delegate?.tableViewCell(self, statusView: statusView, authorAvatarButtonDidPressed: button) delegate?.tableViewCell(self, statusView: statusView, authorAvatarButtonDidPressed: button)
} }
func statusView(_ statusView: StatusView, contentSensitiveeToggleButtonDidPressed button: UIButton) {
delegate?.tableViewCell(self, statusView: statusView, contentSensitiveeToggleButtonDidPressed: button)
}
func statusView(_ statusView: StatusView, metaText: MetaText, didSelectMeta meta: Meta) { func statusView(_ statusView: StatusView, metaText: MetaText, didSelectMeta meta: Meta) {
delegate?.tableViewCell(self, statusView: statusView, metaText: metaText, didSelectMeta: meta) delegate?.tableViewCell(self, statusView: statusView, metaText: metaText, didSelectMeta: meta)
} }
@ -79,10 +83,6 @@ extension StatusViewDelegate where Self: StatusViewContainerTableViewCell {
delegate?.tableViewCell(self, statusView: statusView, spoilerOverlayViewDidPressed: overlayView) delegate?.tableViewCell(self, statusView: statusView, spoilerOverlayViewDidPressed: overlayView)
} }
func statusView(_ statusView: StatusView, spoilerBannerViewDidPressed bannerView: SpoilerBannerView) {
delegate?.tableViewCell(self, statusView: statusView, spoilerBannerViewDidPressed: bannerView)
}
func statusView(_ statusView: StatusView, mediaGridContainerView: MediaGridContainerView, mediaSensitiveButtonDidPressed button: UIButton) { func statusView(_ statusView: StatusView, mediaGridContainerView: MediaGridContainerView, mediaSensitiveButtonDidPressed button: UIButton) {
delegate?.tableViewCell(self, statusView: statusView, mediaGridContainerView: mediaGridContainerView, mediaSensitiveButtonDidPressed: button) delegate?.tableViewCell(self, statusView: statusView, mediaGridContainerView: mediaGridContainerView, mediaSensitiveButtonDidPressed: button)
} }

View File

@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "repeat.small.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View File

@ -0,0 +1,121 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 1.997589 2.358398 cm
0.000000 0.000000 0.000000 scn
13.752419 11.631601 m
13.931720 11.631601 14.096325 11.568684 14.225361 11.463720 c
15.313271 10.549767 16.004837 9.176446 16.004837 7.641602 c
16.004837 4.952847 13.882531 2.759784 11.221727 2.646221 c
11.004837 2.641602 l
6.563000 2.641602 l
7.782749 1.421932 l
8.049015 1.155665 8.073221 0.739002 7.855367 0.445391 c
7.782749 0.361271 l
7.516482 0.095004 7.099819 0.070798 6.806207 0.288652 c
6.722089 0.361271 l
4.222089 2.861272 l
3.955822 3.127539 3.931616 3.544202 4.149471 3.837813 c
4.222089 3.921931 l
6.722089 6.421931 l
7.014983 6.714825 7.489855 6.714825 7.782749 6.421931 c
8.049015 6.155664 8.073221 5.739001 7.855367 5.445390 c
7.782749 5.361272 l
6.563000 4.141602 l
11.004837 4.141602 l
12.873401 4.141602 14.399964 5.605879 14.499659 7.449566 c
14.504837 7.641602 l
14.504837 8.722754 14.014629 9.689410 13.244354 10.331430 c
13.095952 10.466222 13.002419 10.662989 13.002419 10.881601 c
13.002419 11.295815 13.338205 11.631601 13.752419 11.631601 c
h
8.222090 14.921932 m
8.488357 15.188198 8.905020 15.212404 9.198631 14.994550 c
9.282749 14.921932 l
11.782749 12.421932 l
11.855368 12.337813 l
12.049016 12.076825 12.051406 11.718611 11.862539 11.455222 c
11.782749 11.361271 l
9.282749 8.861272 l
9.198631 8.788653 l
8.937643 8.595005 8.579429 8.592613 8.316040 8.781481 c
8.222090 8.861272 l
8.149471 8.945390 l
7.955823 9.206378 7.953431 9.564592 8.142298 9.827981 c
8.222090 9.921932 l
9.441000 11.141602 l
5.000000 11.141602 l
3.131437 11.141602 1.604874 9.677324 1.505179 7.833637 c
1.500000 7.641602 l
1.500000 6.558465 1.992010 5.590244 2.764729 4.948239 c
2.910926 4.812664 3.002419 4.617817 3.002419 4.401602 c
3.002419 3.987389 2.666633 3.651602 2.252419 3.651602 c
2.061133 3.651602 1.886572 3.723213 1.754084 3.841089 c
0.681080 4.754352 0.000000 6.118439 0.000000 7.641602 c
0.000000 10.330357 2.122307 12.523419 4.783111 12.636982 c
5.000000 12.641602 l
9.441000 12.641602 l
8.222090 13.861271 l
8.149471 13.945390 l
7.931617 14.239001 7.955823 14.655665 8.222090 14.921932 c
h
f
n
Q
endstream
endobj
3 0 obj
2140
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 20.000000 20.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Pages 5 0 R
/Type /Catalog
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000002230 00000 n
0000002253 00000 n
0000002426 00000 n
0000002500 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
2559
%%EOF

View File

@ -23,6 +23,7 @@ public typealias AssetImageTypeAlias = ImageAsset.Image
public enum Asset { public enum Asset {
public enum Arrow { public enum Arrow {
public static let `repeat` = ImageAsset(name: "Arrow/repeat") public static let `repeat` = ImageAsset(name: "Arrow/repeat")
public static let repeatSmall = ImageAsset(name: "Arrow/repeat.small")
} }
public enum Asset { public enum Asset {
public static let email = ImageAsset(name: "Asset/email") public static let email = ImageAsset(name: "Asset/email")

View File

@ -21,7 +21,7 @@ extension MediaGridContainerView.ViewModel {
func bind(view: MediaGridContainerView) { func bind(view: MediaGridContainerView) {
$isSensitiveToggleButtonDisplay $isSensitiveToggleButtonDisplay
.sink { isDisplay in .sink { isDisplay in
view.sensitiveToggleButtonBlurVisualEffectView.isHidden = !isDisplay // view.sensitiveToggleButtonBlurVisualEffectView.isHidden = !isDisplay
} }
.store(in: &disposeBag) .store(in: &disposeBag)
} }

View File

@ -49,21 +49,21 @@ public final class MediaGridContainerView: UIView {
}() }()
let sensitiveToggleButtonBlurVisualEffectView: UIVisualEffectView = { // let sensitiveToggleButtonBlurVisualEffectView: UIVisualEffectView = {
let visualEffectView = UIVisualEffectView(effect: ContentWarningOverlayView.blurVisualEffect) // let visualEffectView = UIVisualEffectView(effect: ContentWarningOverlayView.blurVisualEffect)
visualEffectView.layer.masksToBounds = true // visualEffectView.layer.masksToBounds = true
visualEffectView.layer.cornerRadius = MediaGridContainerView.sensitiveToggleButtonSize.width / 2 // visualEffectView.layer.cornerRadius = MediaGridContainerView.sensitiveToggleButtonSize.width / 2
visualEffectView.layer.cornerCurve = .continuous // visualEffectView.layer.cornerCurve = .continuous
return visualEffectView // return visualEffectView
}() // }()
let sensitiveToggleButtonVibrancyVisualEffectView = UIVisualEffectView(effect: UIVibrancyEffect(blurEffect: ContentWarningOverlayView.blurVisualEffect)) // let sensitiveToggleButtonVibrancyVisualEffectView = UIVisualEffectView(effect: UIVibrancyEffect(blurEffect: ContentWarningOverlayView.blurVisualEffect))
let sensitiveToggleButton: HitTestExpandedButton = { // let sensitiveToggleButton: HitTestExpandedButton = {
let button = HitTestExpandedButton(type: .system) // let button = HitTestExpandedButton(type: .system)
button.contentEdgeInsets = UIEdgeInsets(top: 4, left: 4, bottom: 4, right: 4) // button.contentEdgeInsets = UIEdgeInsets(top: 4, left: 4, bottom: 4, right: 4)
button.imageView?.contentMode = .scaleAspectFit // button.imageView?.contentMode = .scaleAspectFit
button.setImage(UIImage(systemName: "eye.slash.fill"), for: .normal) // button.setImage(UIImage(systemName: "eye.slash.fill"), for: .normal)
return button // return button
}() // }()
public override init(frame: CGRect) { public override init(frame: CGRect) {
super.init(frame: frame) super.init(frame: frame)
@ -79,7 +79,7 @@ public final class MediaGridContainerView: UIView {
extension MediaGridContainerView { extension MediaGridContainerView {
private func _init() { private func _init() {
sensitiveToggleButton.addTarget(self, action: #selector(MediaGridContainerView.sensitiveToggleButtonDidPressed(_:)), for: .touchUpInside) // sensitiveToggleButton.addTarget(self, action: #selector(MediaGridContainerView.sensitiveToggleButtonDidPressed(_:)), for: .touchUpInside)
} }
} }
@ -105,8 +105,8 @@ extension MediaGridContainerView {
let mediaView = _mediaViews[0] let mediaView = _mediaViews[0]
layout.layout(in: self, mediaView: mediaView) layout.layout(in: self, mediaView: mediaView)
layoutSensitiveToggleButton() // layoutSensitiveToggleButton()
bringSubviewToFront(sensitiveToggleButtonBlurVisualEffectView) // bringSubviewToFront(sensitiveToggleButtonBlurVisualEffectView)
return mediaView return mediaView
} }
@ -117,8 +117,8 @@ extension MediaGridContainerView {
let mediaViews = Array(_mediaViews[0..<layout.count]) let mediaViews = Array(_mediaViews[0..<layout.count])
layout.layout(in: self, mediaViews: mediaViews) layout.layout(in: self, mediaViews: mediaViews)
layoutSensitiveToggleButton() // layoutSensitiveToggleButton()
bringSubviewToFront(sensitiveToggleButtonBlurVisualEffectView) // bringSubviewToFront(sensitiveToggleButtonBlurVisualEffectView)
return mediaViews return mediaViews
} }
@ -140,35 +140,34 @@ extension MediaGridContainerView {
} }
extension MediaGridContainerView { extension MediaGridContainerView {
private func layoutSensitiveToggleButton() { // private func layoutSensitiveToggleButton() {
sensitiveToggleButtonBlurVisualEffectView.translatesAutoresizingMaskIntoConstraints = false // sensitiveToggleButtonBlurVisualEffectView.translatesAutoresizingMaskIntoConstraints = false
addSubview(sensitiveToggleButtonBlurVisualEffectView) // addSubview(sensitiveToggleButtonBlurVisualEffectView)
NSLayoutConstraint.activate([ // NSLayoutConstraint.activate([
sensitiveToggleButtonBlurVisualEffectView.topAnchor.constraint(equalTo: topAnchor, constant: 16), // sensitiveToggleButtonBlurVisualEffectView.topAnchor.constraint(equalTo: topAnchor, constant: 16),
trailingAnchor.constraint(equalTo: sensitiveToggleButtonBlurVisualEffectView.trailingAnchor, constant: 16), // trailingAnchor.constraint(equalTo: sensitiveToggleButtonBlurVisualEffectView.trailingAnchor, constant: 16),
]) // ])
//
sensitiveToggleButtonVibrancyVisualEffectView.translatesAutoresizingMaskIntoConstraints = false // sensitiveToggleButtonVibrancyVisualEffectView.translatesAutoresizingMaskIntoConstraints = false
sensitiveToggleButtonBlurVisualEffectView.contentView.addSubview(sensitiveToggleButtonVibrancyVisualEffectView) // sensitiveToggleButtonBlurVisualEffectView.contentView.addSubview(sensitiveToggleButtonVibrancyVisualEffectView)
NSLayoutConstraint.activate([ // NSLayoutConstraint.activate([
sensitiveToggleButtonVibrancyVisualEffectView.topAnchor.constraint(equalTo: sensitiveToggleButtonBlurVisualEffectView.contentView.topAnchor), // sensitiveToggleButtonVibrancyVisualEffectView.topAnchor.constraint(equalTo: sensitiveToggleButtonBlurVisualEffectView.contentView.topAnchor),
sensitiveToggleButtonVibrancyVisualEffectView.leadingAnchor.constraint(equalTo: sensitiveToggleButtonBlurVisualEffectView.contentView.leadingAnchor), // sensitiveToggleButtonVibrancyVisualEffectView.leadingAnchor.constraint(equalTo: sensitiveToggleButtonBlurVisualEffectView.contentView.leadingAnchor),
sensitiveToggleButtonVibrancyVisualEffectView.trailingAnchor.constraint(equalTo: sensitiveToggleButtonBlurVisualEffectView.contentView.trailingAnchor), // sensitiveToggleButtonVibrancyVisualEffectView.trailingAnchor.constraint(equalTo: sensitiveToggleButtonBlurVisualEffectView.contentView.trailingAnchor),
sensitiveToggleButtonVibrancyVisualEffectView.bottomAnchor.constraint(equalTo: sensitiveToggleButtonBlurVisualEffectView.contentView.bottomAnchor), // sensitiveToggleButtonVibrancyVisualEffectView.bottomAnchor.constraint(equalTo: sensitiveToggleButtonBlurVisualEffectView.contentView.bottomAnchor),
]) // ])
//
sensitiveToggleButton.translatesAutoresizingMaskIntoConstraints = false // sensitiveToggleButton.translatesAutoresizingMaskIntoConstraints = false
sensitiveToggleButtonVibrancyVisualEffectView.contentView.addSubview(sensitiveToggleButton) // sensitiveToggleButtonVibrancyVisualEffectView.contentView.addSubview(sensitiveToggleButton)
NSLayoutConstraint.activate([ // NSLayoutConstraint.activate([
sensitiveToggleButton.topAnchor.constraint(equalTo: sensitiveToggleButtonVibrancyVisualEffectView.contentView.topAnchor), // sensitiveToggleButton.topAnchor.constraint(equalTo: sensitiveToggleButtonVibrancyVisualEffectView.contentView.topAnchor),
sensitiveToggleButton.leadingAnchor.constraint(equalTo: sensitiveToggleButtonVibrancyVisualEffectView.contentView.leadingAnchor), // sensitiveToggleButton.leadingAnchor.constraint(equalTo: sensitiveToggleButtonVibrancyVisualEffectView.contentView.leadingAnchor),
sensitiveToggleButtonVibrancyVisualEffectView.contentView.trailingAnchor.constraint(equalTo: sensitiveToggleButton.trailingAnchor), // sensitiveToggleButtonVibrancyVisualEffectView.contentView.trailingAnchor.constraint(equalTo: sensitiveToggleButton.trailingAnchor),
sensitiveToggleButtonVibrancyVisualEffectView.contentView.bottomAnchor.constraint(equalTo: sensitiveToggleButton.bottomAnchor), // sensitiveToggleButtonVibrancyVisualEffectView.contentView.bottomAnchor.constraint(equalTo: sensitiveToggleButton.bottomAnchor),
sensitiveToggleButton.widthAnchor.constraint(equalToConstant: MediaGridContainerView.sensitiveToggleButtonSize.width).priority(.required - 1), // sensitiveToggleButton.widthAnchor.constraint(equalToConstant: MediaGridContainerView.sensitiveToggleButtonSize.width).priority(.required - 1),
sensitiveToggleButton.heightAnchor.constraint(equalToConstant: MediaGridContainerView.sensitiveToggleButtonSize.height).priority(.required - 1), // sensitiveToggleButton.heightAnchor.constraint(equalToConstant: MediaGridContainerView.sensitiveToggleButtonSize.height).priority(.required - 1),
]) // ])
} // }
} }
extension MediaGridContainerView { extension MediaGridContainerView {

View File

@ -19,14 +19,14 @@ public protocol NotificationViewDelegate: AnyObject {
func notificationView(_ notificationView: NotificationView, statusView: StatusView, metaText: MetaText, didSelectMeta meta: Meta) func notificationView(_ notificationView: NotificationView, statusView: StatusView, metaText: MetaText, didSelectMeta meta: Meta)
func notificationView(_ notificationView: NotificationView, statusView: StatusView, spoilerOverlayViewDidPressed overlayView: SpoilerOverlayView) func notificationView(_ notificationView: NotificationView, statusView: StatusView, spoilerOverlayViewDidPressed overlayView: SpoilerOverlayView)
func notificationView(_ notificationView: NotificationView, statusView: StatusView, spoilerBannerViewDidPressed bannerView: SpoilerBannerView) // func notificationView(_ notificationView: NotificationView, statusView: StatusView, spoilerBannerViewDidPressed bannerView: SpoilerBannerView)
func notificationView(_ notificationView: NotificationView, statusView: StatusView, actionToolbarContainer: ActionToolbarContainer, buttonDidPressed button: UIButton, action: ActionToolbarContainer.Action) func notificationView(_ notificationView: NotificationView, statusView: StatusView, actionToolbarContainer: ActionToolbarContainer, buttonDidPressed button: UIButton, action: ActionToolbarContainer.Action)
func notificationView(_ notificationView: NotificationView, quoteStatusView: StatusView, authorAvatarButtonDidPressed button: AvatarButton) func notificationView(_ notificationView: NotificationView, quoteStatusView: StatusView, authorAvatarButtonDidPressed button: AvatarButton)
func notificationView(_ notificationView: NotificationView, quoteStatusView: StatusView, metaText: MetaText, didSelectMeta meta: Meta) func notificationView(_ notificationView: NotificationView, quoteStatusView: StatusView, metaText: MetaText, didSelectMeta meta: Meta)
func notificationView(_ notificationView: NotificationView, quoteStatusView: StatusView, spoilerOverlayViewDidPressed overlayView: SpoilerOverlayView) func notificationView(_ notificationView: NotificationView, quoteStatusView: StatusView, spoilerOverlayViewDidPressed overlayView: SpoilerOverlayView)
func notificationView(_ notificationView: NotificationView, quoteStatusView: StatusView, spoilerBannerViewDidPressed bannerView: SpoilerBannerView) // func notificationView(_ notificationView: NotificationView, quoteStatusView: StatusView, spoilerBannerViewDidPressed bannerView: SpoilerBannerView)
// a11y // a11y
func notificationView(_ notificationView: NotificationView, accessibilityActivate: Void) func notificationView(_ notificationView: NotificationView, accessibilityActivate: Void)
@ -350,6 +350,10 @@ extension NotificationView: StatusViewDelegate {
} }
} }
public func statusView(_ statusView: StatusView, contentSensitiveeToggleButtonDidPressed button: UIButton) {
assertionFailure()
}
public func statusView(_ statusView: StatusView, metaText: MetaText, didSelectMeta meta: Meta) { public func statusView(_ statusView: StatusView, metaText: MetaText, didSelectMeta meta: Meta) {
switch statusView { switch statusView {
case self.statusView: case self.statusView:
@ -399,16 +403,16 @@ extension NotificationView: StatusViewDelegate {
} }
} }
public func statusView(_ statusView: StatusView, spoilerBannerViewDidPressed bannerView: SpoilerBannerView) { // public func statusView(_ statusView: StatusView, spoilerBannerViewDidPressed bannerView: SpoilerBannerView) {
switch statusView { // switch statusView {
case self.statusView: // case self.statusView:
delegate?.notificationView(self, statusView: statusView, spoilerBannerViewDidPressed: bannerView) // delegate?.notificationView(self, statusView: statusView, spoilerBannerViewDidPressed: bannerView)
case quoteStatusView: // case quoteStatusView:
delegate?.notificationView(self, quoteStatusView: statusView, spoilerBannerViewDidPressed: bannerView) // delegate?.notificationView(self, quoteStatusView: statusView, spoilerBannerViewDidPressed: bannerView)
default: // default:
assertionFailure() // assertionFailure()
} // }
} // }
public func statusView(_ statusView: StatusView, mediaGridContainerView: MediaGridContainerView, mediaSensitiveButtonDidPressed button: UIButton) { public func statusView(_ statusView: StatusView, mediaGridContainerView: MediaGridContainerView, mediaSensitiveButtonDidPressed button: UIButton) {
assertionFailure() assertionFailure()

View File

@ -201,7 +201,7 @@ extension StatusView.ViewModel {
case .none: case .none:
return return
case .repost(let info): case .repost(let info):
statusView.headerIconImageView.image = UIImage(systemName: "arrow.2.squarepath") statusView.headerIconImageView.image = Asset.Arrow.repeatSmall.image.withRenderingMode(.alwaysTemplate)
statusView.headerInfoLabel.configure(content: info.header) statusView.headerInfoLabel.configure(content: info.header)
statusView.setHeaderDisplay() statusView.setHeaderDisplay()
case .reply(let info): case .reply(let info):
@ -281,12 +281,12 @@ extension StatusView.ViewModel {
.sink { spoilerContent, content, isContentReveal in .sink { spoilerContent, content, isContentReveal in
if let spoilerContent = spoilerContent { if let spoilerContent = spoilerContent {
statusView.spoilerOverlayView.spoilerMetaLabel.configure(content: spoilerContent) statusView.spoilerOverlayView.spoilerMetaLabel.configure(content: spoilerContent)
statusView.spoilerBannerView.label.configure(content: spoilerContent) // statusView.spoilerBannerView.label.configure(content: spoilerContent)
statusView.setSpoilerBannerViewHidden(isHidden: !isContentReveal) // statusView.setSpoilerBannerViewHidden(isHidden: !isContentReveal)
} else { } else {
statusView.spoilerOverlayView.spoilerMetaLabel.reset() statusView.spoilerOverlayView.spoilerMetaLabel.reset()
statusView.spoilerBannerView.label.reset() // statusView.spoilerBannerView.label.reset()
} }
if let content = content { if let content = content {
@ -304,9 +304,18 @@ extension StatusView.ViewModel {
statusView.setSpoilerOverlayViewHidden(isHidden: isContentReveal) statusView.setSpoilerOverlayViewHidden(isHidden: isContentReveal)
let image = isContentReveal ? UIImage(systemName: "eye.slash.fill") : UIImage(systemName: "eye.fill")
statusView.contentSensitiveeToggleButton.setImage(image, for: .normal)
self.logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): isContentReveal: \(isContentReveal)") self.logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): isContentReveal: \(isContentReveal)")
} }
.store(in: &disposeBag) .store(in: &disposeBag)
$isSensitive
.sink { isSensitive in
guard isSensitive else { return }
statusView.setContentSensitiveeToggleButtonDisplay()
}
.store(in: &disposeBag)
// visibility // visibility
Publishers.CombineLatest( Publishers.CombineLatest(
$visibility, $visibility,

View File

@ -16,6 +16,7 @@ import MastodonLocalization
public protocol StatusViewDelegate: AnyObject { public protocol StatusViewDelegate: AnyObject {
func statusView(_ statusView: StatusView, headerDidPressed header: UIView) func statusView(_ statusView: StatusView, headerDidPressed header: UIView)
func statusView(_ statusView: StatusView, authorAvatarButtonDidPressed button: AvatarButton) func statusView(_ statusView: StatusView, authorAvatarButtonDidPressed button: AvatarButton)
func statusView(_ statusView: StatusView, contentSensitiveeToggleButtonDidPressed button: UIButton)
func statusView(_ statusView: StatusView, metaText: MetaText, didSelectMeta meta: Meta) func statusView(_ statusView: StatusView, metaText: MetaText, didSelectMeta meta: Meta)
func statusView(_ statusView: StatusView, mediaGridContainerView: MediaGridContainerView, mediaView: MediaView, didSelectMediaViewAt index: Int) func statusView(_ statusView: StatusView, mediaGridContainerView: MediaGridContainerView, mediaView: MediaView, didSelectMediaViewAt index: Int)
func statusView(_ statusView: StatusView, pollTableView tableView: UITableView, didSelectRowAt indexPath: IndexPath) func statusView(_ statusView: StatusView, pollTableView tableView: UITableView, didSelectRowAt indexPath: IndexPath)
@ -23,7 +24,7 @@ public protocol StatusViewDelegate: AnyObject {
func statusView(_ statusView: StatusView, actionToolbarContainer: ActionToolbarContainer, buttonDidPressed button: UIButton, action: ActionToolbarContainer.Action) func statusView(_ statusView: StatusView, actionToolbarContainer: ActionToolbarContainer, buttonDidPressed button: UIButton, action: ActionToolbarContainer.Action)
func statusView(_ statusView: StatusView, menuButton button: UIButton, didSelectAction action: MastodonMenu.Action) func statusView(_ statusView: StatusView, menuButton button: UIButton, didSelectAction action: MastodonMenu.Action)
func statusView(_ statusView: StatusView, spoilerOverlayViewDidPressed overlayView: SpoilerOverlayView) func statusView(_ statusView: StatusView, spoilerOverlayViewDidPressed overlayView: SpoilerOverlayView)
func statusView(_ statusView: StatusView, spoilerBannerViewDidPressed bannerView: SpoilerBannerView) // func statusView(_ statusView: StatusView, spoilerBannerViewDidPressed bannerView: SpoilerBannerView)
func statusView(_ statusView: StatusView, mediaGridContainerView: MediaGridContainerView, mediaSensitiveButtonDidPressed button: UIButton) func statusView(_ statusView: StatusView, mediaGridContainerView: MediaGridContainerView, mediaSensitiveButtonDidPressed button: UIButton)
// a11y // a11y
@ -101,11 +102,24 @@ public final class StatusView: UIView {
public let menuButton: UIButton = { public let menuButton: UIButton = {
let button = HitTestExpandedButton(type: .system) let button = HitTestExpandedButton(type: .system)
button.expandEdgeInsets = UIEdgeInsets(top: -20, left: -10, bottom: -5, right: -10)
button.tintColor = Asset.Colors.Label.secondary.color
let image = UIImage(systemName: "ellipsis", withConfiguration: UIImage.SymbolConfiguration(font: .systemFont(ofSize: 15))) let image = UIImage(systemName: "ellipsis", withConfiguration: UIImage.SymbolConfiguration(font: .systemFont(ofSize: 15)))
button.setImage(image, for: .normal) button.setImage(image, for: .normal)
return button return button
}() }()
public let contentSensitiveeToggleButton: UIButton = {
let button = HitTestExpandedButton(type: .system)
button.expandEdgeInsets = UIEdgeInsets(top: -5, left: -10, bottom: -20, right: -10)
button.tintColor = Asset.Colors.Label.secondary.color
button.imageView?.contentMode = .scaleAspectFill
button.imageView?.clipsToBounds = false
let image = UIImage(systemName: "eye.slash.fill", withConfiguration: UIImage.SymbolConfiguration(font: .systemFont(ofSize: 15)))
button.setImage(image, for: .normal)
return button
}()
// content // content
let contentContainer = UIStackView() let contentContainer = UIStackView()
public let contentMetaText: MetaText = { public let contentMetaText: MetaText = {
@ -202,7 +216,7 @@ public final class StatusView: UIView {
public let statusVisibilityView = StatusVisibilityView() public let statusVisibilityView = StatusVisibilityView()
// spoiler banner // spoiler banner
public let spoilerBannerView = SpoilerBannerView() // public let spoilerBannerView = SpoilerBannerView()
// toolbar // toolbar
public let actionToolbarContainer = ActionToolbarContainer() public let actionToolbarContainer = ActionToolbarContainer()
@ -228,11 +242,12 @@ public final class StatusView: UIView {
} }
headerContainerView.isHidden = true headerContainerView.isHidden = true
contentSensitiveeToggleButton.isHidden = true
setSpoilerOverlayViewHidden(isHidden: true) setSpoilerOverlayViewHidden(isHidden: true)
mediaContainerView.isHidden = true mediaContainerView.isHidden = true
pollContainerView.isHidden = true pollContainerView.isHidden = true
statusVisibilityView.isHidden = true statusVisibilityView.isHidden = true
setSpoilerBannerViewHidden(isHidden: true) // setSpoilerBannerViewHidden(isHidden: true)
} }
public override init(frame: CGRect) { public override init(frame: CGRect) {
@ -271,6 +286,8 @@ extension StatusView {
authorNameLabel.isUserInteractionEnabled = false authorNameLabel.isUserInteractionEnabled = false
authorUsernameLabel.isUserInteractionEnabled = false authorUsernameLabel.isUserInteractionEnabled = false
// contentSensitiveeToggleButton
contentSensitiveeToggleButton.addTarget(self, action: #selector(StatusView.contentSensitiveeToggleButtonDidPressed(_:)), for: .touchUpInside)
// dateLabel // dateLabel
dateLabel.isUserInteractionEnabled = false dateLabel.isUserInteractionEnabled = false
@ -297,9 +314,9 @@ extension StatusView {
pollVoteButton.addTarget(self, action: #selector(StatusView.pollVoteButtonDidPressed(_:)), for: .touchUpInside) pollVoteButton.addTarget(self, action: #selector(StatusView.pollVoteButtonDidPressed(_:)), for: .touchUpInside)
// statusSpoilerBannerView // statusSpoilerBannerView
let spoilerBannerViewTapGestureRecognizer = UITapGestureRecognizer.singleTapGestureRecognizer // let spoilerBannerViewTapGestureRecognizer = UITapGestureRecognizer.singleTapGestureRecognizer
spoilerBannerView.addGestureRecognizer(spoilerBannerViewTapGestureRecognizer) // spoilerBannerView.addGestureRecognizer(spoilerBannerViewTapGestureRecognizer)
spoilerBannerViewTapGestureRecognizer.addTarget(self, action: #selector(StatusView.spoilerBannerViewTapGestureRecognizerHandler(_:))) // spoilerBannerViewTapGestureRecognizer.addTarget(self, action: #selector(StatusView.spoilerBannerViewTapGestureRecognizerHandler(_:)))
// toolbar // toolbar
actionToolbarContainer.delegate = self actionToolbarContainer.delegate = self
@ -319,6 +336,10 @@ extension StatusView {
delegate?.statusView(self, authorAvatarButtonDidPressed: avatarButton) delegate?.statusView(self, authorAvatarButtonDidPressed: avatarButton)
} }
@objc private func contentSensitiveeToggleButtonDidPressed(_ sender: UIButton) {
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public)")
delegate?.statusView(self, contentSensitiveeToggleButtonDidPressed: sender)
}
@objc private func pollVoteButtonDidPressed(_ sender: UIButton) { @objc private func pollVoteButtonDidPressed(_ sender: UIButton) {
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public)") logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public)")
@ -330,10 +351,10 @@ extension StatusView {
delegate?.statusView(self, spoilerOverlayViewDidPressed: spoilerOverlayView) delegate?.statusView(self, spoilerOverlayViewDidPressed: spoilerOverlayView)
} }
@objc private func spoilerBannerViewTapGestureRecognizerHandler(_ sender: UITapGestureRecognizer) { // @objc private func spoilerBannerViewTapGestureRecognizerHandler(_ sender: UITapGestureRecognizer) {
logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public)") // logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public)")
delegate?.statusView(self, spoilerBannerViewDidPressed: spoilerBannerView) // delegate?.statusView(self, spoilerBannerViewDidPressed: spoilerBannerView)
} // }
} }
@ -447,7 +468,7 @@ extension StatusView.Style {
statusView.menuButton.setContentHuggingPriority(.required - 2, for: .horizontal) statusView.menuButton.setContentHuggingPriority(.required - 2, for: .horizontal)
statusView.menuButton.setContentCompressionResistancePriority(.required - 2, for: .horizontal) statusView.menuButton.setContentCompressionResistancePriority(.required - 2, for: .horizontal)
// authorSecondaryMetaContainer: H - [ authorUsername | usernameTrialingDotLabel | dateLabel | (padding) ] // authorSecondaryMetaContainer: H - [ authorUsername | usernameTrialingDotLabel | dateLabel | (padding) | contentSensitiveeToggleButton ]
let authorSecondaryMetaContainer = UIStackView() let authorSecondaryMetaContainer = UIStackView()
authorSecondaryMetaContainer.axis = .horizontal authorSecondaryMetaContainer.axis = .horizontal
authorSecondaryMetaContainer.spacing = 4 authorSecondaryMetaContainer.spacing = 4
@ -463,6 +484,18 @@ extension StatusView.Style {
statusView.dateLabel.setContentHuggingPriority(.required - 1, for: .horizontal) statusView.dateLabel.setContentHuggingPriority(.required - 1, for: .horizontal)
statusView.dateLabel.setContentCompressionResistancePriority(.required - 1, for: .horizontal) statusView.dateLabel.setContentCompressionResistancePriority(.required - 1, for: .horizontal)
authorSecondaryMetaContainer.addArrangedSubview(UIView()) authorSecondaryMetaContainer.addArrangedSubview(UIView())
statusView.contentSensitiveeToggleButton.translatesAutoresizingMaskIntoConstraints = false
authorSecondaryMetaContainer.addArrangedSubview(statusView.contentSensitiveeToggleButton)
NSLayoutConstraint.activate([
statusView.contentSensitiveeToggleButton.heightAnchor.constraint(equalTo: statusView.authorUsernameLabel.heightAnchor, multiplier: 1.0).priority(.required - 1),
statusView.contentSensitiveeToggleButton.widthAnchor.constraint(equalTo: statusView.contentSensitiveeToggleButton.heightAnchor, multiplier: 1.0).priority(.required - 1),
])
statusView.authorUsernameLabel.setContentHuggingPriority(.required - 1, for: .vertical)
statusView.authorUsernameLabel.setContentCompressionResistancePriority(.required - 1, for: .vertical)
statusView.contentSensitiveeToggleButton.setContentHuggingPriority(.defaultLow, for: .vertical)
statusView.contentSensitiveeToggleButton.setContentHuggingPriority(.defaultLow, for: .horizontal)
statusView.contentSensitiveeToggleButton.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
statusView.contentSensitiveeToggleButton.setContentCompressionResistancePriority(.defaultLow, for: .vertical)
// content container: V - [ contentMetaText ] // content container: V - [ contentMetaText ]
statusView.contentContainer.axis = .vertical statusView.contentContainer.axis = .vertical
@ -527,8 +560,9 @@ extension StatusView.Style {
statusView.statusVisibilityView.preservesSuperviewLayoutMargins = true statusView.statusVisibilityView.preservesSuperviewLayoutMargins = true
statusView.containerStackView.addArrangedSubview(statusView.statusVisibilityView) statusView.containerStackView.addArrangedSubview(statusView.statusVisibilityView)
statusView.spoilerBannerView.preservesSuperviewLayoutMargins = true // spoilerBannerView
statusView.containerStackView.addArrangedSubview(statusView.spoilerBannerView) // statusView.spoilerBannerView.preservesSuperviewLayoutMargins = true
// statusView.containerStackView.addArrangedSubview(statusView.spoilerBannerView)
// action toolbar // action toolbar
statusView.actionToolbarContainer.configure(for: .inline) statusView.actionToolbarContainer.configure(for: .inline)
@ -577,6 +611,7 @@ extension StatusView.Style {
base(statusView: statusView) // override the base style base(statusView: statusView) // override the base style
statusView.contentContainer.layoutMargins.bottom = 16 // fix contentText align to edge issue statusView.contentContainer.layoutMargins.bottom = 16 // fix contentText align to edge issue
statusView.contentSensitiveeToggleButton.removeFromSuperview()
statusView.menuButton.removeFromSuperview() statusView.menuButton.removeFromSuperview()
statusView.statusVisibilityView.removeFromSuperview() statusView.statusVisibilityView.removeFromSuperview()
statusView.actionToolbarContainer.removeFromSuperview() statusView.actionToolbarContainer.removeFromSuperview()
@ -588,7 +623,7 @@ extension StatusView.Style {
statusView.avatarButton.isUserInteractionEnabled = false statusView.avatarButton.isUserInteractionEnabled = false
statusView.menuButton.removeFromSuperview() statusView.menuButton.removeFromSuperview()
statusView.statusVisibilityView.removeFromSuperview() statusView.statusVisibilityView.removeFromSuperview()
statusView.spoilerBannerView.removeFromSuperview() // statusView.spoilerBannerView.removeFromSuperview()
statusView.actionToolbarContainer.removeFromSuperview() statusView.actionToolbarContainer.removeFromSuperview()
} }
@ -604,7 +639,7 @@ extension StatusView.Style {
statusView.mediaContainerView.removeFromSuperview() statusView.mediaContainerView.removeFromSuperview()
statusView.pollContainerView.removeFromSuperview() statusView.pollContainerView.removeFromSuperview()
statusView.statusVisibilityView.removeFromSuperview() statusView.statusVisibilityView.removeFromSuperview()
statusView.spoilerBannerView.removeFromSuperview() // statusView.spoilerBannerView.removeFromSuperview()
statusView.actionToolbarContainer.removeFromSuperview() statusView.actionToolbarContainer.removeFromSuperview()
} }
@ -615,6 +650,10 @@ extension StatusView {
headerContainerView.isHidden = false headerContainerView.isHidden = false
} }
func setContentSensitiveeToggleButtonDisplay() {
contentSensitiveeToggleButton.isHidden = false
}
func setSpoilerOverlayViewHidden(isHidden: Bool) { func setSpoilerOverlayViewHidden(isHidden: Bool) {
spoilerOverlayView.isHidden = isHidden spoilerOverlayView.isHidden = isHidden
spoilerOverlayView.setComponentHidden(isHidden) spoilerOverlayView.setComponentHidden(isHidden)
@ -632,9 +671,9 @@ extension StatusView {
statusVisibilityView.isHidden = false statusVisibilityView.isHidden = false
} }
func setSpoilerBannerViewHidden(isHidden: Bool) { // func setSpoilerBannerViewHidden(isHidden: Bool) {
spoilerBannerView.isHidden = isHidden // spoilerBannerView.isHidden = isHidden
} // }
// content text Width // content text Width
public var contentMaxLayoutWidth: CGFloat { public var contentMaxLayoutWidth: CGFloat {