From 40a524434fcc732489c430ca3afb985e0dcf0dbb Mon Sep 17 00:00:00 2001 From: CMK Date: Tue, 23 Feb 2021 15:16:55 +0800 Subject: [PATCH] feat: update status cell UI --- .../StringsConvertor/input/en_US/app.json | 5 +- .../output/en.lproj/Localizable.strings | 1 + Localization/app.json | 5 +- Mastodon.xcodeproj/project.pbxproj | 28 +- .../Diffiable/Section/TimelineSection.swift | 37 +-- Mastodon/Extension/ActiveLabel.swift | 16 +- Mastodon/Generated/Assets.swift | 4 +- Mastodon/Generated/Strings.swift | 6 + .../Protocol/AvatarConfigurableView.swift | 55 ++-- ...er+TimelinePostTableViewCellDelegate.swift | 4 +- .../Contents.json | 38 +++ .../Contents.json | 38 +++ .../Contents.json | 6 +- .../Label/primary.colorset/Contents.json | 24 +- .../Label/secondary.colorset/Contents.json | 26 +- .../lightBrandBlue.colorset/Contents.json | 6 +- .../Preview Assets.xcassets/Contents.json | 6 + .../Contents.json | 12 + .../tiraya-adam-QfHEWqPelsc-unsplash.jpg | Bin 0 -> 91058 bytes .../Resources/en.lproj/Localizable.strings | 1 + .../MastodonRegisterViewController.swift | 4 +- .../MastodonServerRulesViewController.swift | 2 +- .../HomeTimelineViewController.swift | 12 +- .../HomeTimelineViewModel+Diffable.swift | 2 +- .../PublicTimelineViewController.swift | 6 +- .../PublicTimelineViewModel+Diffable.swift | 2 +- .../View/Button/AvatarBarButtonItem.swift | 3 +- .../View/Button/HighlightDimmableButton.swift | 35 +++ .../Scene/Share/View/Content/StatusView.swift | 257 ++++++++++++++++++ .../Share/View/Content/TimelinePostView.swift | 163 ----------- .../TableviewCell/StatusTableViewCell.swift | 93 +++++++ .../TimelinePostTableViewCell.swift | 86 ------ .../View/ToolBar/ActionToolBarContainer.swift | 59 ++-- 33 files changed, 654 insertions(+), 388 deletions(-) create mode 100644 Mastodon/Resources/Assets.xcassets/Colors/Background/secondary.grouped.system.background.colorset/Contents.json create mode 100644 Mastodon/Resources/Assets.xcassets/Colors/Background/system.grouped.background.colorset/Contents.json rename Mastodon/Resources/Assets.xcassets/Colors/Label/{black.colorset => highlight.colorset}/Contents.json (74%) create mode 100644 Mastodon/Resources/Preview Assets.xcassets/Contents.json create mode 100644 Mastodon/Resources/Preview Assets.xcassets/tiraya-adam-QfHEWqPelsc-unsplash.imageset/Contents.json create mode 100644 Mastodon/Resources/Preview Assets.xcassets/tiraya-adam-QfHEWqPelsc-unsplash.imageset/tiraya-adam-QfHEWqPelsc-unsplash.jpg create mode 100644 Mastodon/Scene/Share/View/Button/HighlightDimmableButton.swift create mode 100644 Mastodon/Scene/Share/View/Content/StatusView.swift delete mode 100644 Mastodon/Scene/Share/View/Content/TimelinePostView.swift create mode 100644 Mastodon/Scene/Share/View/TableviewCell/StatusTableViewCell.swift delete mode 100644 Mastodon/Scene/Share/View/TableviewCell/TimelinePostTableViewCell.swift diff --git a/Localization/StringsConvertor/input/en_US/app.json b/Localization/StringsConvertor/input/en_US/app.json index 0c3f16c7..680d2cb3 100644 --- a/Localization/StringsConvertor/input/en_US/app.json +++ b/Localization/StringsConvertor/input/en_US/app.json @@ -19,6 +19,9 @@ "preview": "Preview", "open_in_safari": "Open in Safari" }, + "status": { + "userBoosted": "%s boosted" + }, "timeline": { "load_more": "Load More" } @@ -75,4 +78,4 @@ "title": "Public" } } -} \ No newline at end of file +} diff --git a/Localization/StringsConvertor/output/en.lproj/Localizable.strings b/Localization/StringsConvertor/output/en.lproj/Localizable.strings index 707ef3cc..92264acc 100644 --- a/Localization/StringsConvertor/output/en.lproj/Localizable.strings +++ b/Localization/StringsConvertor/output/en.lproj/Localizable.strings @@ -13,6 +13,7 @@ "Common.Controls.Actions.SignIn" = "Sign in"; "Common.Controls.Actions.SignUp" = "Sign up"; "Common.Controls.Actions.TakePhoto" = "Take photo"; +"Common.Controls.Status.Userboosted" = "%@ boosted"; "Common.Controls.Timeline.LoadMore" = "Load More"; "Common.Countable.Photo.Multiple" = "photos"; "Common.Countable.Photo.Single" = "photo"; diff --git a/Localization/app.json b/Localization/app.json index 0c3f16c7..680d2cb3 100644 --- a/Localization/app.json +++ b/Localization/app.json @@ -19,6 +19,9 @@ "preview": "Preview", "open_in_safari": "Open in Safari" }, + "status": { + "userBoosted": "%s boosted" + }, "timeline": { "load_more": "Load More" } @@ -75,4 +78,4 @@ "title": "Public" } } -} \ No newline at end of file +} diff --git a/Mastodon.xcodeproj/project.pbxproj b/Mastodon.xcodeproj/project.pbxproj index c7180d3b..d38924ff 100644 --- a/Mastodon.xcodeproj/project.pbxproj +++ b/Mastodon.xcodeproj/project.pbxproj @@ -9,7 +9,7 @@ /* Begin PBXBuildFile section */ 18BC7629F65E6DB12CB8416D /* Pods_Mastodon_MastodonUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3C030226D3C73DCC23D67452 /* Pods_Mastodon_MastodonUITests.framework */; }; 2D04F42525C255B9003F936F /* APIService+PublicTimeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D04F42425C255B9003F936F /* APIService+PublicTimeline.swift */; }; - 2D152A8C25C295CC009AA50C /* TimelinePostView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D152A8B25C295CC009AA50C /* TimelinePostView.swift */; }; + 2D152A8C25C295CC009AA50C /* StatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D152A8B25C295CC009AA50C /* StatusView.swift */; }; 2D152A9225C2980C009AA50C /* UIFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D152A9125C2980C009AA50C /* UIFont.swift */; }; 2D32EAAC25CB96DC00C9ED86 /* TimelineMiddleLoaderTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D32EAAB25CB96DC00C9ED86 /* TimelineMiddleLoaderTableViewCell.swift */; }; 2D32EABA25CB9B0500C9ED86 /* UIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D32EAB925CB9B0500C9ED86 /* UIView.swift */; }; @@ -33,7 +33,6 @@ 2D46975E25C2A54100CF4AA9 /* NSLayoutConstraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D46975D25C2A54100CF4AA9 /* NSLayoutConstraint.swift */; }; 2D46976425C2A71500CF4AA9 /* UIIamge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D46976325C2A71500CF4AA9 /* UIIamge.swift */; }; 2D5A3D0325CF8742002347D6 /* ControlContainableScrollViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D5A3D0225CF8742002347D6 /* ControlContainableScrollViews.swift */; }; - 2D5A3D1125CF87AA002347D6 /* AvatarBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D5A3D1025CF87AA002347D6 /* AvatarBarButtonItem.swift */; }; 2D5A3D2825CF8BC9002347D6 /* HomeTimelineViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D5A3D2725CF8BC9002347D6 /* HomeTimelineViewModel+Diffable.swift */; }; 2D5A3D3825CF8D9F002347D6 /* ScrollViewContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D5A3D3725CF8D9F002347D6 /* ScrollViewContainer.swift */; }; 2D5A3D6225CFD9CB002347D6 /* HomeTimelineViewController+DebugAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D5A3D6125CFD9CB002347D6 /* HomeTimelineViewController+DebugAction.swift */; }; @@ -47,7 +46,7 @@ 2D76317D25C14DF500929FB9 /* PublicTimelineViewController+StatusProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D76317C25C14DF400929FB9 /* PublicTimelineViewController+StatusProvider.swift */; }; 2D76318325C14E8F00929FB9 /* PublicTimelineViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D76318225C14E8F00929FB9 /* PublicTimelineViewModel+Diffable.swift */; }; 2D76319F25C1521200929FB9 /* TimelineSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D76319E25C1521200929FB9 /* TimelineSection.swift */; }; - 2D7631A825C1535600929FB9 /* TimelinePostTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D7631A725C1535600929FB9 /* TimelinePostTableViewCell.swift */; }; + 2D7631A825C1535600929FB9 /* StatusTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D7631A725C1535600929FB9 /* StatusTableViewCell.swift */; }; 2D7631B325C159F700929FB9 /* Item.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D7631B225C159F700929FB9 /* Item.swift */; }; 2D927F0225C7E4F2004F19B8 /* Mention.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D927F0125C7E4F2004F19B8 /* Mention.swift */; }; 2D927F0825C7E9A8004F19B8 /* Tag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D927F0725C7E9A8004F19B8 /* Tag.swift */; }; @@ -74,6 +73,8 @@ DB0140CF25C42AEE00F9F3CF /* OSLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0140CE25C42AEE00F9F3CF /* OSLog.swift */; }; DB084B5725CBC56C00F898ED /* Toot.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB084B5625CBC56C00F898ED /* Toot.swift */; }; DB0AC6FC25CD02E600D75117 /* APIService+Instance.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0AC6FB25CD02E600D75117 /* APIService+Instance.swift */; }; + DB118A8225E4B6E600FAB162 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DB118A8125E4B6E600FAB162 /* Preview Assets.xcassets */; }; + DB118A8C25E4BFB500FAB162 /* HighlightDimmableButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB118A8B25E4BFB500FAB162 /* HighlightDimmableButton.swift */; }; DB2B3ABC25E37E15007045F9 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = DB2B3ABE25E37E15007045F9 /* InfoPlist.strings */; }; DB2B3AE925E38850007045F9 /* UIViewPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB2B3AE825E38850007045F9 /* UIViewPreview.swift */; }; DB3D0FF325BAA61700EAA174 /* AlamofireImage in Frameworks */ = {isa = PBXBuildFile; productRef = DB3D0FF225BAA61700EAA174 /* AlamofireImage */; }; @@ -188,7 +189,7 @@ /* Begin PBXFileReference section */ 2D04F42425C255B9003F936F /* APIService+PublicTimeline.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+PublicTimeline.swift"; sourceTree = ""; }; - 2D152A8B25C295CC009AA50C /* TimelinePostView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelinePostView.swift; sourceTree = ""; }; + 2D152A8B25C295CC009AA50C /* StatusView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusView.swift; sourceTree = ""; }; 2D152A9125C2980C009AA50C /* UIFont.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIFont.swift; sourceTree = ""; }; 2D32EAAB25CB96DC00C9ED86 /* TimelineMiddleLoaderTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineMiddleLoaderTableViewCell.swift; sourceTree = ""; }; 2D32EAB925CB9B0500C9ED86 /* UIView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIView.swift; sourceTree = ""; }; @@ -211,7 +212,6 @@ 2D46975D25C2A54100CF4AA9 /* NSLayoutConstraint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSLayoutConstraint.swift; sourceTree = ""; }; 2D46976325C2A71500CF4AA9 /* UIIamge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIIamge.swift; sourceTree = ""; }; 2D5A3D0225CF8742002347D6 /* ControlContainableScrollViews.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ControlContainableScrollViews.swift; sourceTree = ""; }; - 2D5A3D1025CF87AA002347D6 /* AvatarBarButtonItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvatarBarButtonItem.swift; sourceTree = ""; }; 2D5A3D2725CF8BC9002347D6 /* HomeTimelineViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "HomeTimelineViewModel+Diffable.swift"; sourceTree = ""; }; 2D5A3D3725CF8D9F002347D6 /* ScrollViewContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScrollViewContainer.swift; sourceTree = ""; }; 2D5A3D6125CFD9CB002347D6 /* HomeTimelineViewController+DebugAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "HomeTimelineViewController+DebugAction.swift"; sourceTree = ""; }; @@ -224,7 +224,7 @@ 2D76317C25C14DF400929FB9 /* PublicTimelineViewController+StatusProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PublicTimelineViewController+StatusProvider.swift"; sourceTree = ""; }; 2D76318225C14E8F00929FB9 /* PublicTimelineViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PublicTimelineViewModel+Diffable.swift"; sourceTree = ""; }; 2D76319E25C1521200929FB9 /* TimelineSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineSection.swift; sourceTree = ""; }; - 2D7631A725C1535600929FB9 /* TimelinePostTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelinePostTableViewCell.swift; sourceTree = ""; }; + 2D7631A725C1535600929FB9 /* StatusTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusTableViewCell.swift; sourceTree = ""; }; 2D7631B225C159F700929FB9 /* Item.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Item.swift; sourceTree = ""; }; 2D927F0125C7E4F2004F19B8 /* Mention.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Mention.swift; sourceTree = ""; }; 2D927F0725C7E9A8004F19B8 /* Tag.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tag.swift; sourceTree = ""; }; @@ -256,6 +256,8 @@ DB0140CE25C42AEE00F9F3CF /* OSLog.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OSLog.swift; sourceTree = ""; }; DB084B5625CBC56C00F898ED /* Toot.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Toot.swift; sourceTree = ""; }; DB0AC6FB25CD02E600D75117 /* APIService+Instance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Instance.swift"; sourceTree = ""; }; + DB118A8125E4B6E600FAB162 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + DB118A8B25E4BFB500FAB162 /* HighlightDimmableButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HighlightDimmableButton.swift; sourceTree = ""; }; DB2B3ABD25E37E15007045F9 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; DB2B3AE825E38850007045F9 /* UIViewPreview.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIViewPreview.swift; sourceTree = ""; }; DB3D0FED25BAA42200EAA174 /* MastodonSDK */ = {isa = PBXFileReference; lastKnownFileType = folder; path = MastodonSDK; sourceTree = ""; }; @@ -393,7 +395,7 @@ 2D152A8A25C295B8009AA50C /* Content */ = { isa = PBXGroup; children = ( - 2D152A8B25C295CC009AA50C /* TimelinePostView.swift */, + 2D152A8B25C295CC009AA50C /* StatusView.swift */, ); path = Content; sourceTree = ""; @@ -436,7 +438,7 @@ children = ( DB5086A425CC0B7000C2C187 /* AvatarBarButtonItem.swift */, 2D42FF8425C8224F004A627A /* HitTestExpandedButton.swift */, - 2D5A3D1025CF87AA002347D6 /* AvatarBarButtonItem.swift */, + DB118A8B25E4BFB500FAB162 /* HighlightDimmableButton.swift */, ); path = Button; sourceTree = ""; @@ -533,7 +535,7 @@ 2D7631A625C1533800929FB9 /* TableviewCell */ = { isa = PBXGroup; children = ( - 2D7631A725C1535600929FB9 /* TimelinePostTableViewCell.swift */, + 2D7631A725C1535600929FB9 /* StatusTableViewCell.swift */, 2DA7D04325CA52B200804E11 /* TimelineLoaderTableViewCell.swift */, 2DA7D04925CA52CB00804E11 /* TimelineBottomLoaderTableViewCell.swift */, 2D32EAAB25CB96DC00C9ED86 /* TimelineMiddleLoaderTableViewCell.swift */, @@ -614,6 +616,7 @@ isa = PBXGroup; children = ( DB427DDE25BAA00100D1B89D /* Assets.xcassets */, + DB118A8125E4B6E600FAB162 /* Preview Assets.xcassets */, DB3D100F25BAA75E00EAA174 /* Localizable.strings */, DB2B3ABE25E37E15007045F9 /* InfoPlist.strings */, ); @@ -1069,6 +1072,7 @@ DB3D100D25BAA75E00EAA174 /* Localizable.strings in Resources */, DB427DDF25BAA00100D1B89D /* Assets.xcassets in Resources */, DB427DDD25BAA00100D1B89D /* Main.storyboard in Resources */, + DB118A8225E4B6E600FAB162 /* Preview Assets.xcassets in Resources */, DB2B3ABC25E37E15007045F9 /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1238,7 +1242,7 @@ DB72602725E36A6F00235243 /* MastodonServerRulesViewModel.swift in Sources */, 2D38F1F125CD477D00561493 /* HomeTimelineViewModel+LoadMiddleState.swift in Sources */, DB45FAD725CA6C76005A8AC7 /* UIBarButtonItem.swift in Sources */, - 2D152A8C25C295CC009AA50C /* TimelinePostView.swift in Sources */, + 2D152A8C25C295CC009AA50C /* StatusView.swift in Sources */, 2D42FF8525C8224F004A627A /* HitTestExpandedButton.swift in Sources */, DB72601C25E36A2100235243 /* MastodonServerRulesViewController.swift in Sources */, 2D42FF8F25C8228A004A627A /* UIButton.swift in Sources */, @@ -1279,6 +1283,7 @@ 2D38F20825CD491300561493 /* DisposeBagCollectable.swift in Sources */, DB0140CF25C42AEE00F9F3CF /* OSLog.swift in Sources */, 2D76319F25C1521200929FB9 /* TimelineSection.swift in Sources */, + DB118A8C25E4BFB500FAB162 /* HighlightDimmableButton.swift in Sources */, DB084B5725CBC56C00F898ED /* Toot.swift in Sources */, DB0140A825C40C1500F9F3CF /* MastodonPinBasedAuthenticationViewModelNavigationDelegateShim.swift in Sources */, DB2B3AE925E38850007045F9 /* UIViewPreview.swift in Sources */, @@ -1300,7 +1305,7 @@ DB8AF52E25C13561002E6C99 /* ViewStateStore.swift in Sources */, 2DA7D04A25CA52CB00804E11 /* TimelineBottomLoaderTableViewCell.swift in Sources */, 2D76318325C14E8F00929FB9 /* PublicTimelineViewModel+Diffable.swift in Sources */, - 2D7631A825C1535600929FB9 /* TimelinePostTableViewCell.swift in Sources */, + 2D7631A825C1535600929FB9 /* StatusTableViewCell.swift in Sources */, 2D76316525C14BD100929FB9 /* PublicTimelineViewController.swift in Sources */, 2D69CFF425CA9E2200C3A1B2 /* LoadMoreConfigurableTableViewContainer.swift in Sources */, DB01409625C40B6700F9F3CF /* AuthenticationViewController.swift in Sources */, @@ -1310,7 +1315,6 @@ 2D32EAAC25CB96DC00C9ED86 /* TimelineMiddleLoaderTableViewCell.swift in Sources */, 2D5A3D6225CFD9CB002347D6 /* HomeTimelineViewController+DebugAction.swift in Sources */, 2D38F1FE25CD481700561493 /* StatusProvider.swift in Sources */, - 2D5A3D1125CF87AA002347D6 /* AvatarBarButtonItem.swift in Sources */, DB45FB0F25CA87D0005A8AC7 /* AuthenticationService.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/Mastodon/Diffiable/Section/TimelineSection.swift b/Mastodon/Diffiable/Section/TimelineSection.swift index c9adbd83..97ca559f 100644 --- a/Mastodon/Diffiable/Section/TimelineSection.swift +++ b/Mastodon/Diffiable/Section/TimelineSection.swift @@ -21,7 +21,7 @@ extension TimelineSection { dependency: NeedsDependency, managedObjectContext: NSManagedObjectContext, timestampUpdatePublisher: AnyPublisher, - timelinePostTableViewCellDelegate: TimelinePostTableViewCellDelegate, + timelinePostTableViewCellDelegate: StatusTableViewCellDelegate, timelineMiddleLoaderTableViewCellDelegate: TimelineMiddleLoaderTableViewCellDelegate? ) -> UITableViewDiffableDataSource { UITableViewDiffableDataSource(tableView: tableView) { [weak timelinePostTableViewCellDelegate, weak timelineMiddleLoaderTableViewCellDelegate] tableView, indexPath, item -> UITableViewCell? in @@ -29,7 +29,7 @@ extension TimelineSection { switch item { case .homeTimelineIndex(objectID: let objectID, attribute: _): - let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: TimelinePostTableViewCell.self), for: indexPath) as! TimelinePostTableViewCell + let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: StatusTableViewCell.self), for: indexPath) as! StatusTableViewCell // configure cell managedObjectContext.performAndWait { @@ -39,7 +39,7 @@ extension TimelineSection { cell.delegate = timelinePostTableViewCellDelegate return cell case .toot(let objectID): - let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: TimelinePostTableViewCell.self), for: indexPath) as! TimelinePostTableViewCell + let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: StatusTableViewCell.self), for: indexPath) as! StatusTableViewCell let activeMastodonAuthenticationBox = dependency.context.authenticationService.activeMastodonAuthenticationBox.value let requestUserID = activeMastodonAuthenticationBox?.userID ?? "" // configure cell @@ -68,21 +68,22 @@ extension TimelineSection { } static func configure( - cell: TimelinePostTableViewCell, + cell: StatusTableViewCell, timestampUpdatePublisher: AnyPublisher, toot: Toot, requestUserID: String ) { + // set header + cell.statusView.headerContainerStackView.isHidden = toot.reblog == nil + cell.statusView.headerInfoLabel.text = L10n.Common.Controls.Status.userboosted(toot.author.displayName) + // set name username avatar - cell.timelinePostView.nameLabel.text = toot.author.displayName - cell.timelinePostView.usernameLabel.text = "@" + toot.author.username - cell.timelinePostView.avatarImageView.af.setImage( - withURL: URL(string: toot.author.avatar)!, - placeholderImage: UIImage.placeholder(color: .systemFill), - imageTransition: .crossDissolve(0.2) - ) + cell.statusView.nameLabel.text = toot.author.displayName + cell.statusView.usernameLabel.text = "@" + toot.author.username + cell.statusView.configure(with: AvatarConfigurableViewConfiguration(avatarImageURL: toot.author.avatarImageURL())) + // set text - cell.timelinePostView.activeTextLabel.config(content: toot.content) + cell.statusView.activeTextLabel.config(content: (toot.reblog ?? toot).content) // toolbar let isLike = (toot.reblog ?? toot).favouritedBy.flatMap { $0.contains(where: { $0.id == requestUserID }) } ?? false @@ -90,15 +91,15 @@ extension TimelineSection { let count = (toot.reblog ?? toot).favouritesCount.intValue return TimelineSection.formattedNumberTitleForActionButton(count) }() - cell.timelinePostView.actionToolbarContainer.starButton.setTitle(favoriteCountTitle, for: .normal) - cell.timelinePostView.actionToolbarContainer.isStarButtonHighlight = isLike + cell.statusView.actionToolbarContainer.starButton.setTitle(favoriteCountTitle, for: .normal) + cell.statusView.actionToolbarContainer.isStarButtonHighlight = isLike // set date let createdAt = (toot.reblog ?? toot).createdAt - cell.timelinePostView.dateLabel.text = createdAt.shortTimeAgoSinceNow + cell.statusView.dateLabel.text = createdAt.shortTimeAgoSinceNow timestampUpdatePublisher .sink { _ in - cell.timelinePostView.dateLabel.text = createdAt.shortTimeAgoSinceNow + cell.statusView.dateLabel.text = createdAt.shortTimeAgoSinceNow } .store(in: &cell.disposeBag) @@ -115,8 +116,8 @@ extension TimelineSection { let isLike = targetToot.favouritedBy.flatMap { $0.contains(where: { $0.id == requestUserID }) } ?? false let favoriteCount = targetToot.favouritesCount.intValue let favoriteCountTitle = TimelineSection.formattedNumberTitleForActionButton(favoriteCount) - cell.timelinePostView.actionToolbarContainer.starButton.setTitle(favoriteCountTitle, for: .normal) - cell.timelinePostView.actionToolbarContainer.isStarButtonHighlight = isLike + cell.statusView.actionToolbarContainer.starButton.setTitle(favoriteCountTitle, for: .normal) + cell.statusView.actionToolbarContainer.isStarButtonHighlight = isLike os_log("%{public}s[%{public}ld], %{public}s: like count label for toot %s did update: %ld", (#file as NSString).lastPathComponent, #line, #function, targetToot.id, favoriteCount) } .store(in: &cell.disposeBag) diff --git a/Mastodon/Extension/ActiveLabel.swift b/Mastodon/Extension/ActiveLabel.swift index 6e08d726..539be018 100644 --- a/Mastodon/Extension/ActiveLabel.swift +++ b/Mastodon/Extension/ActiveLabel.swift @@ -22,18 +22,18 @@ extension ActiveLabel { switch style { case .default: -// urlMaximumLength = 30 font = .preferredFont(forTextStyle: .body) - textColor = .white + textColor = Asset.Colors.Label.primary.color case .timelineHeaderView: font = .preferredFont(forTextStyle: .footnote) textColor = .secondaryLabel } numberOfLines = 0 - mentionColor = UIColor.yellow - hashtagColor = UIColor.blue - URLColor = UIColor.red + lineSpacing = 5 + mentionColor = Asset.Colors.Label.highlight.color + hashtagColor = Asset.Colors.Label.highlight.color + URLColor = Asset.Colors.Label.highlight.color text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." } @@ -43,12 +43,6 @@ extension ActiveLabel { func config(content: String) { if let parseResult = try? TootContent.parse(toot: content) { activeEntities.removeAll() - numberOfLines = 0 - font = UIFont(name: "SFProText-Regular", size: 16) - textColor = .white - URLColor = .systemRed - mentionColor = .systemGreen - hashtagColor = .systemBlue text = parseResult.trimmed activeEntities = parseResult.activeEntities } diff --git a/Mastodon/Generated/Assets.swift b/Mastodon/Generated/Assets.swift index 18f25f92..dc3e8cf9 100644 --- a/Mastodon/Generated/Assets.swift +++ b/Mastodon/Generated/Assets.swift @@ -28,8 +28,10 @@ internal enum Asset { internal enum Colors { internal enum Background { internal static let onboardingBackground = ColorAsset(name: "Colors/Background/onboarding.background") + internal static let secondaryGroupedSystemBackground = ColorAsset(name: "Colors/Background/secondary.grouped.system.background") internal static let secondarySystemBackground = ColorAsset(name: "Colors/Background/secondary.system.background") internal static let systemBackground = ColorAsset(name: "Colors/Background/system.background") + internal static let systemGroupedBackground = ColorAsset(name: "Colors/Background/system.grouped.background") internal static let tertiarySystemBackground = ColorAsset(name: "Colors/Background/tertiary.system.background") } internal enum Button { @@ -40,7 +42,7 @@ internal enum Asset { internal static let plus = ColorAsset(name: "Colors/Icon/plus") } internal enum Label { - internal static let black = ColorAsset(name: "Colors/Label/black") + internal static let highlight = ColorAsset(name: "Colors/Label/highlight") internal static let primary = ColorAsset(name: "Colors/Label/primary") internal static let secondary = ColorAsset(name: "Colors/Label/secondary") } diff --git a/Mastodon/Generated/Strings.swift b/Mastodon/Generated/Strings.swift index f8383a82..716baa2e 100644 --- a/Mastodon/Generated/Strings.swift +++ b/Mastodon/Generated/Strings.swift @@ -45,6 +45,12 @@ internal enum L10n { /// Take photo internal static let takePhoto = L10n.tr("Localizable", "Common.Controls.Actions.TakePhoto") } + internal enum Status { + /// %@ boosted + internal static func userboosted(_ p1: Any) -> String { + return L10n.tr("Localizable", "Common.Controls.Status.Userboosted", String(describing: p1)) + } + } internal enum Timeline { /// Load More internal static let loadMore = L10n.tr("Localizable", "Common.Controls.Timeline.LoadMore") diff --git a/Mastodon/Protocol/AvatarConfigurableView.swift b/Mastodon/Protocol/AvatarConfigurableView.swift index dfeb3e5b..6c51d576 100644 --- a/Mastodon/Protocol/AvatarConfigurableView.swift +++ b/Mastodon/Protocol/AvatarConfigurableView.swift @@ -10,28 +10,19 @@ import AlamofireImage import Kingfisher protocol AvatarConfigurableView { - static var configurableAvatarImageViewSize: CGSize { get } - static var configurableAvatarImageViewBadgeAppearanceStyle: AvatarConfigurableViewConfiguration.BadgeAppearanceStyle { get } + static var configurableAvatarImageSize: CGSize { get } + static var configurableAvatarImageCornerRadius: CGFloat { get } var configurableAvatarImageView: UIImageView? { get } var configurableAvatarButton: UIButton? { get } - var configurableVerifiedBadgeImageView: UIImageView? { get } - func configure(withConfigurationInput input: AvatarConfigurableViewConfiguration.Input) + func configure(with configuration: AvatarConfigurableViewConfiguration) func avatarConfigurableView(_ avatarConfigurableView: AvatarConfigurableView, didFinishConfiguration configuration: AvatarConfigurableViewConfiguration) } extension AvatarConfigurableView { - static var configurableAvatarImageViewBadgeAppearanceStyle: AvatarConfigurableViewConfiguration.BadgeAppearanceStyle { return .mini } - - public func configure(withConfigurationInput input: AvatarConfigurableViewConfiguration.Input) { - // TODO: set badge - configurableVerifiedBadgeImageView?.isHidden = true - - let cornerRadius = Self.configurableAvatarImageViewSize.width * 0.5 - // let scale = (configurableAvatarImageView ?? configurableAvatarButton)?.window?.screen.scale ?? UIScreen.main.scale - + public func configure(with configuration: AvatarConfigurableViewConfiguration) { let placeholderImage: UIImage = { - let placeholderImage = input.placeholderImage ?? UIImage.placeholder(size: Self.configurableAvatarImageViewSize, color: .systemFill) + let placeholderImage = configuration.placeholderImage ?? UIImage.placeholder(size: Self.configurableAvatarImageSize, color: .systemFill) return placeholderImage.af.imageRoundedIntoCircle() }() @@ -51,12 +42,11 @@ extension AvatarConfigurableView { configurableAvatarButton?.layer.cornerCurve = .circular defer { - let configuration = AvatarConfigurableViewConfiguration(input: input) avatarConfigurableView(self, didFinishConfiguration: configuration) } // set placeholder if no asset - guard let avatarImageURL = input.avatarImageURL else { + guard let avatarImageURL = configuration.avatarImageURL else { configurableAvatarImageView?.image = placeholderImage configurableAvatarButton?.setImage(placeholderImage, for: .normal) return @@ -74,10 +64,10 @@ extension AvatarConfigurableView { ] ) avatarImageView.layer.masksToBounds = true - avatarImageView.layer.cornerRadius = cornerRadius + avatarImageView.layer.cornerRadius = Self.configurableAvatarImageCornerRadius avatarImageView.layer.cornerCurve = .circular default: - let filter = ScaledToSizeCircleFilter(size: Self.configurableAvatarImageViewSize) + let filter = ScaledToSizeWithRoundedCornersFilter(size: Self.configurableAvatarImageSize, radius: Self.configurableAvatarImageCornerRadius) avatarImageView.af.setImage( withURL: avatarImageURL, placeholderImage: placeholderImage, @@ -101,10 +91,10 @@ extension AvatarConfigurableView { ] ) avatarButton.layer.masksToBounds = true - avatarButton.layer.cornerRadius = cornerRadius - avatarButton.layer.cornerCurve = .circular + avatarButton.layer.cornerRadius = Self.configurableAvatarImageCornerRadius + avatarButton.layer.cornerCurve = .continuous default: - let filter = ScaledToSizeCircleFilter(size: Self.configurableAvatarImageViewSize) + let filter = ScaledToSizeWithRoundedCornersFilter(size: Self.configurableAvatarImageSize, radius: Self.configurableAvatarImageCornerRadius) avatarButton.af.setImage( for: .normal, url: avatarImageURL, @@ -122,25 +112,12 @@ extension AvatarConfigurableView { struct AvatarConfigurableViewConfiguration { - enum BadgeAppearanceStyle { - case mini - case normal - } + let avatarImageURL: URL? + let placeholderImage: UIImage? - struct Input { - let avatarImageURL: URL? - let placeholderImage: UIImage? - let blocked: Bool - let verified: Bool - - init(avatarImageURL: URL?, placeholderImage: UIImage? = nil, blocked: Bool = false, verified: Bool = false) { - self.avatarImageURL = avatarImageURL - self.placeholderImage = placeholderImage - self.blocked = blocked - self.verified = verified - } + init(avatarImageURL: URL?, placeholderImage: UIImage? = nil) { + self.avatarImageURL = avatarImageURL + self.placeholderImage = placeholderImage } - let input: Input - } diff --git a/Mastodon/Protocol/StatusProvider/StatusProvider+TimelinePostTableViewCellDelegate.swift b/Mastodon/Protocol/StatusProvider/StatusProvider+TimelinePostTableViewCellDelegate.swift index 9b50071f..1850f7f5 100644 --- a/Mastodon/Protocol/StatusProvider/StatusProvider+TimelinePostTableViewCellDelegate.swift +++ b/Mastodon/Protocol/StatusProvider/StatusProvider+TimelinePostTableViewCellDelegate.swift @@ -14,9 +14,9 @@ import MastodonSDK import ActiveLabel // MARK: - ActionToolbarContainerDelegate -extension TimelinePostTableViewCellDelegate where Self: StatusProvider { +extension StatusTableViewCellDelegate where Self: StatusProvider { - func timelinePostTableViewCell(_ cell: TimelinePostTableViewCell, actionToolbarContainer: ActionToolbarContainer, likeButtonDidPressed sender: UIButton) { + func statusTableViewCell(_ cell: StatusTableViewCell, actionToolbarContainer: ActionToolbarContainer, likeButtonDidPressed sender: UIButton) { StatusProviderFacade.responseToStatusLikeAction(provider: self, cell: cell) } diff --git a/Mastodon/Resources/Assets.xcassets/Colors/Background/secondary.grouped.system.background.colorset/Contents.json b/Mastodon/Resources/Assets.xcassets/Colors/Background/secondary.grouped.system.background.colorset/Contents.json new file mode 100644 index 00000000..abe46b9a --- /dev/null +++ b/Mastodon/Resources/Assets.xcassets/Colors/Background/secondary.grouped.system.background.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "255", + "green" : "255", + "red" : "255" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x37", + "green" : "0x2D", + "red" : "0x29" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Mastodon/Resources/Assets.xcassets/Colors/Background/system.grouped.background.colorset/Contents.json b/Mastodon/Resources/Assets.xcassets/Colors/Background/system.grouped.background.colorset/Contents.json new file mode 100644 index 00000000..edc0dce9 --- /dev/null +++ b/Mastodon/Resources/Assets.xcassets/Colors/Background/system.grouped.background.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "232", + "green" : "225", + "red" : "217" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.169", + "green" : "0.141", + "red" : "0.125" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Mastodon/Resources/Assets.xcassets/Colors/Label/black.colorset/Contents.json b/Mastodon/Resources/Assets.xcassets/Colors/Label/highlight.colorset/Contents.json similarity index 74% rename from Mastodon/Resources/Assets.xcassets/Colors/Label/black.colorset/Contents.json rename to Mastodon/Resources/Assets.xcassets/Colors/Label/highlight.colorset/Contents.json index 95a50e5d..2e1ce5f3 100644 --- a/Mastodon/Resources/Assets.xcassets/Colors/Label/black.colorset/Contents.json +++ b/Mastodon/Resources/Assets.xcassets/Colors/Label/highlight.colorset/Contents.json @@ -5,9 +5,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "0", - "green" : "0", - "red" : "0" + "blue" : "0.851", + "green" : "0.565", + "red" : "0.169" } }, "idiom" : "universal" diff --git a/Mastodon/Resources/Assets.xcassets/Colors/Label/primary.colorset/Contents.json b/Mastodon/Resources/Assets.xcassets/Colors/Label/primary.colorset/Contents.json index fafa4767..202a1c04 100644 --- a/Mastodon/Resources/Assets.xcassets/Colors/Label/primary.colorset/Contents.json +++ b/Mastodon/Resources/Assets.xcassets/Colors/Label/primary.colorset/Contents.json @@ -5,9 +5,27 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "0xFF", - "green" : "0xFF", - "red" : "0xFF" + "blue" : "0x00", + "green" : "0x00", + "red" : "0x00" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" } }, "idiom" : "universal" diff --git a/Mastodon/Resources/Assets.xcassets/Colors/Label/secondary.colorset/Contents.json b/Mastodon/Resources/Assets.xcassets/Colors/Label/secondary.colorset/Contents.json index a47dfc69..2c20abe7 100644 --- a/Mastodon/Resources/Assets.xcassets/Colors/Label/secondary.colorset/Contents.json +++ b/Mastodon/Resources/Assets.xcassets/Colors/Label/secondary.colorset/Contents.json @@ -4,10 +4,28 @@ "color" : { "color-space" : "srgb", "components" : { - "alpha" : "1.000", - "blue" : "132", - "green" : "105", - "red" : "96" + "alpha" : "0.600", + "blue" : "0x43", + "green" : "0x3C", + "red" : "0x3C" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "0.600", + "blue" : "0x43", + "green" : "0x3C", + "red" : "0x3C" } }, "idiom" : "universal" diff --git a/Mastodon/Resources/Assets.xcassets/Colors/lightBrandBlue.colorset/Contents.json b/Mastodon/Resources/Assets.xcassets/Colors/lightBrandBlue.colorset/Contents.json index 2e1ce5f3..d853a71a 100644 --- a/Mastodon/Resources/Assets.xcassets/Colors/lightBrandBlue.colorset/Contents.json +++ b/Mastodon/Resources/Assets.xcassets/Colors/lightBrandBlue.colorset/Contents.json @@ -5,9 +5,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "0.851", - "green" : "0.565", - "red" : "0.169" + "blue" : "217", + "green" : "144", + "red" : "43" } }, "idiom" : "universal" diff --git a/Mastodon/Resources/Preview Assets.xcassets/Contents.json b/Mastodon/Resources/Preview Assets.xcassets/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/Mastodon/Resources/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Mastodon/Resources/Preview Assets.xcassets/tiraya-adam-QfHEWqPelsc-unsplash.imageset/Contents.json b/Mastodon/Resources/Preview Assets.xcassets/tiraya-adam-QfHEWqPelsc-unsplash.imageset/Contents.json new file mode 100644 index 00000000..54d7079e --- /dev/null +++ b/Mastodon/Resources/Preview Assets.xcassets/tiraya-adam-QfHEWqPelsc-unsplash.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "tiraya-adam-QfHEWqPelsc-unsplash.jpg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Mastodon/Resources/Preview Assets.xcassets/tiraya-adam-QfHEWqPelsc-unsplash.imageset/tiraya-adam-QfHEWqPelsc-unsplash.jpg b/Mastodon/Resources/Preview Assets.xcassets/tiraya-adam-QfHEWqPelsc-unsplash.imageset/tiraya-adam-QfHEWqPelsc-unsplash.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3670c92aec8fc8fd86786d7af26227a49ad8e757 GIT binary patch literal 91058 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


PJ`IWAIAG{gNqAZUeQ7-RqOfc5JT?}%-lGnf+ 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
J9g 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 + var observations = Set() + + let statusView = StatusView() + + override func prepareForReuse() { + super.prepareForReuse() + disposeBag.removeAll() + observations.removeAll() + } + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + _init() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + _init() + } + +} + +extension StatusTableViewCell { + + private func _init() { + selectionStyle = .none + backgroundColor = Asset.Colors.Background.secondaryGroupedSystemBackground.color + + statusView.translatesAutoresizingMaskIntoConstraints = false + contentView.addSubview(statusView) + NSLayoutConstraint.activate([ + statusView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 20), + statusView.leadingAnchor.constraint(equalTo: contentView.readableContentGuide.leadingAnchor), + contentView.readableContentGuide.trailingAnchor.constraint(equalTo: statusView.trailingAnchor), + ]) + + let bottomPaddingView = UIView() + bottomPaddingView.translatesAutoresizingMaskIntoConstraints = false + contentView.addSubview(bottomPaddingView) + NSLayoutConstraint.activate([ + bottomPaddingView.topAnchor.constraint(equalTo: statusView.bottomAnchor, constant: 10), + bottomPaddingView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), + bottomPaddingView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), + bottomPaddingView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor), + bottomPaddingView.heightAnchor.constraint(equalToConstant: 10).priority(.defaultHigh), + ]) + + statusView.actionToolbarContainer.delegate = self + bottomPaddingView.backgroundColor = Asset.Colors.Background.systemGroupedBackground.color + } + +} +// MARK: - ActionToolbarContainerDelegate +extension StatusTableViewCell: ActionToolbarContainerDelegate { + func actionToolbarContainer(_ actionToolbarContainer: ActionToolbarContainer, replayButtonDidPressed sender: UIButton) { + + } + func actionToolbarContainer(_ actionToolbarContainer: ActionToolbarContainer, retootButtonDidPressed sender: UIButton) { + + } + func actionToolbarContainer(_ actionToolbarContainer: ActionToolbarContainer, starButtonDidPressed sender: UIButton) { + delegate?.statusTableViewCell(self, actionToolbarContainer: actionToolbarContainer, likeButtonDidPressed: sender) + } + func actionToolbarContainer(_ actionToolbarContainer: ActionToolbarContainer, bookmarkButtonDidPressed sender: UIButton) { + + } + func actionToolbarContainer(_ actionToolbarContainer: ActionToolbarContainer, moreButtonDidPressed sender: UIButton) { + + } +} diff --git a/Mastodon/Scene/Share/View/TableviewCell/TimelinePostTableViewCell.swift b/Mastodon/Scene/Share/View/TableviewCell/TimelinePostTableViewCell.swift deleted file mode 100644 index 9a513dd7..00000000 --- a/Mastodon/Scene/Share/View/TableviewCell/TimelinePostTableViewCell.swift +++ /dev/null @@ -1,86 +0,0 @@ -// -// TimelinePostTableViewCell.swift -// Mastodon -// -// Created by sxiaojian on 2021/1/27. -// - -import os.log -import UIKit -import AVKit -import Combine - - -protocol TimelinePostTableViewCellDelegate: class { - func timelinePostTableViewCell(_ cell: TimelinePostTableViewCell, actionToolbarContainer: ActionToolbarContainer, likeButtonDidPressed sender: UIButton) -} - -final class TimelinePostTableViewCell: UITableViewCell { - - static let verticalMargin: CGFloat = 16 // without retoot indicator - static let verticalMarginAlt: CGFloat = 8 // with retoot indicator - - weak var delegate: TimelinePostTableViewCellDelegate? - - var disposeBag = Set() - var observations = Set() - - let timelinePostView = TimelinePostView() - - var timelinePostViewTopLayoutConstraint: NSLayoutConstraint! - - override func prepareForReuse() { - super.prepareForReuse() - disposeBag.removeAll() - observations.removeAll() - } - - override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { - super.init(style: style, reuseIdentifier: reuseIdentifier) - _init() - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - _init() - } - -} - -extension TimelinePostTableViewCell { - - private func _init() { - self.backgroundColor = Asset.Colors.Background.secondarySystemBackground.color - self.selectionStyle = .none - timelinePostView.translatesAutoresizingMaskIntoConstraints = false - timelinePostViewTopLayoutConstraint = timelinePostView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: TimelinePostTableViewCell.verticalMargin) - contentView.addSubview(timelinePostView) - NSLayoutConstraint.activate([ - timelinePostViewTopLayoutConstraint, - timelinePostView.leadingAnchor.constraint(equalTo: contentView.readableContentGuide.leadingAnchor), - contentView.readableContentGuide.trailingAnchor.constraint(equalTo: timelinePostView.trailingAnchor), - contentView.bottomAnchor.constraint(equalTo: timelinePostView.bottomAnchor), // use action toolbar margin - ]) - - timelinePostView.actionToolbarContainer.delegate = self - } - -} -// MARK: - ActionToolbarContainerDelegate -extension TimelinePostTableViewCell: ActionToolbarContainerDelegate { - func actionToolbarContainer(_ actionToolbarContainer: ActionToolbarContainer, replayButtonDidPressed sender: UIButton) { - - } - func actionToolbarContainer(_ actionToolbarContainer: ActionToolbarContainer, retootButtonDidPressed sender: UIButton) { - - } - func actionToolbarContainer(_ actionToolbarContainer: ActionToolbarContainer, starButtonDidPressed sender: UIButton) { - delegate?.timelinePostTableViewCell(self, actionToolbarContainer: actionToolbarContainer, likeButtonDidPressed: sender) - } - func actionToolbarContainer(_ actionToolbarContainer: ActionToolbarContainer, bookmarkButtonDidPressed sender: UIButton) { - - } - func actionToolbarContainer(_ actionToolbarContainer: ActionToolbarContainer, moreButtonDidPressed sender: UIButton) { - - } -} diff --git a/Mastodon/Scene/Share/View/ToolBar/ActionToolBarContainer.swift b/Mastodon/Scene/Share/View/ToolBar/ActionToolBarContainer.swift index 4be522b4..31405061 100644 --- a/Mastodon/Scene/Share/View/ToolBar/ActionToolBarContainer.swift +++ b/Mastodon/Scene/Share/View/ToolBar/ActionToolBarContainer.swift @@ -12,7 +12,6 @@ protocol ActionToolbarContainerDelegate: class { func actionToolbarContainer(_ actionToolbarContainer: ActionToolbarContainer, replayButtonDidPressed sender: UIButton) func actionToolbarContainer(_ actionToolbarContainer: ActionToolbarContainer, retootButtonDidPressed sender: UIButton) func actionToolbarContainer(_ actionToolbarContainer: ActionToolbarContainer, starButtonDidPressed sender: UIButton) - func actionToolbarContainer(_ actionToolbarContainer: ActionToolbarContainer, bookmarkButtonDidPressed sender: UIButton) func actionToolbarContainer(_ actionToolbarContainer: ActionToolbarContainer, moreButtonDidPressed sender: UIButton) } @@ -23,7 +22,6 @@ final class ActionToolbarContainer: UIView { let replyButton = HitTestExpandedButton() let retootButton = HitTestExpandedButton() let starButton = HitTestExpandedButton() - let bookmartButton = HitTestExpandedButton() let moreButton = HitTestExpandedButton() var isStarButtonHighlight: Bool = false { @@ -62,7 +60,6 @@ extension ActionToolbarContainer { replyButton.addTarget(self, action: #selector(ActionToolbarContainer.replyButtonDidPressed(_:)), for: .touchUpInside) retootButton.addTarget(self, action: #selector(ActionToolbarContainer.retootButtonDidPressed(_:)), for: .touchUpInside) starButton.addTarget(self, action: #selector(ActionToolbarContainer.starButtonDidPressed(_:)), for: .touchUpInside) - bookmartButton.addTarget(self, action: #selector(ActionToolbarContainer.bookmarkButtonDidPressed(_:)), for: .touchUpInside) moreButton.addTarget(self, action: #selector(ActionToolbarContainer.moreButtonDidPressed(_:)), for: .touchUpInside) } @@ -93,25 +90,29 @@ extension ActionToolbarContainer { subview.removeFromSuperview() } - let buttons = [replyButton, retootButton, starButton,bookmartButton, moreButton] + let buttons = [replyButton, retootButton, starButton, moreButton] buttons.forEach { button in - button.tintColor = Asset.Colors.Label.secondary.color + button.tintColor = UIColor.black.withAlphaComponent(0.6) button.titleLabel?.font = .monospacedDigitSystemFont(ofSize: 12, weight: .regular) button.setTitle("", for: .normal) button.setTitleColor(.secondaryLabel, for: .normal) button.setInsets(forContentPadding: .zero, imageTitlePadding: style.buttonTitleImagePadding) } + let replyImage = UIImage(systemName: "arrowshape.turn.up.left.fill", withConfiguration: UIImage.SymbolConfiguration(pointSize: 17, weight: .ultraLight))!.withRenderingMode(.alwaysTemplate) + let reblogImage = UIImage(systemName: "arrow.2.squarepath", withConfiguration: UIImage.SymbolConfiguration(pointSize: 17, weight: .bold))!.withRenderingMode(.alwaysTemplate) + let starImage = UIImage(systemName: "star.fill", withConfiguration: UIImage.SymbolConfiguration(pointSize: 17, weight: .bold))!.withRenderingMode(.alwaysTemplate) + let moreImage = UIImage(systemName: "ellipsis", withConfiguration: UIImage.SymbolConfiguration(pointSize: 17, weight: .bold))!.withRenderingMode(.alwaysTemplate) + switch style { case .inline: buttons.forEach { button in button.contentHorizontalAlignment = .leading } - replyButton.setImage(Asset.ToolBar.reply.image.withRenderingMode(.alwaysTemplate), for: .normal) - retootButton.setImage(Asset.ToolBar.retoot.image.withRenderingMode(.alwaysTemplate), for: .normal) - starButton.setImage(Asset.ToolBar.star.image.withRenderingMode(.alwaysTemplate), for: .normal) - bookmartButton.setImage(Asset.ToolBar.bookmark.image.withRenderingMode(.alwaysTemplate), for: .normal) - moreButton.setImage(Asset.ToolBar.more.image.withRenderingMode(.alwaysTemplate), for: .normal) + replyButton.setImage(replyImage, for: .normal) + retootButton.setImage(reblogImage, for: .normal) + starButton.setImage(starImage, for: .normal) + moreButton.setImage(moreImage, for: .normal) container.axis = .horizontal container.distribution = .fill @@ -119,22 +120,18 @@ extension ActionToolbarContainer { replyButton.translatesAutoresizingMaskIntoConstraints = false retootButton.translatesAutoresizingMaskIntoConstraints = false starButton.translatesAutoresizingMaskIntoConstraints = false - bookmartButton.translatesAutoresizingMaskIntoConstraints = false moreButton.translatesAutoresizingMaskIntoConstraints = false container.addArrangedSubview(replyButton) container.addArrangedSubview(retootButton) container.addArrangedSubview(starButton) - container.addArrangedSubview(bookmartButton) container.addArrangedSubview(moreButton) NSLayoutConstraint.activate([ - replyButton.heightAnchor.constraint(equalToConstant: 40).priority(.defaultHigh), + replyButton.heightAnchor.constraint(equalToConstant: 44).priority(.defaultHigh), replyButton.heightAnchor.constraint(equalTo: retootButton.heightAnchor).priority(.defaultHigh), replyButton.heightAnchor.constraint(equalTo: starButton.heightAnchor).priority(.defaultHigh), replyButton.heightAnchor.constraint(equalTo: moreButton.heightAnchor).priority(.defaultHigh), - replyButton.heightAnchor.constraint(equalTo: bookmartButton.heightAnchor).priority(.defaultHigh), replyButton.widthAnchor.constraint(equalTo: retootButton.widthAnchor).priority(.defaultHigh), replyButton.widthAnchor.constraint(equalTo: starButton.widthAnchor).priority(.defaultHigh), - replyButton.widthAnchor.constraint(equalTo: bookmartButton.widthAnchor).priority(.defaultHigh), ]) moreButton.setContentHuggingPriority(.defaultHigh, for: .horizontal) moreButton.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal) @@ -143,10 +140,9 @@ extension ActionToolbarContainer { buttons.forEach { button in button.contentHorizontalAlignment = .center } - replyButton.setImage(Asset.ToolBar.reply.image.withRenderingMode(.alwaysTemplate), for: .normal) - retootButton.setImage(Asset.ToolBar.retoot.image.withRenderingMode(.alwaysTemplate), for: .normal) - starButton.setImage(Asset.ToolBar.bookmark.image.withRenderingMode(.alwaysTemplate), for: .normal) - bookmartButton.setImage(Asset.ToolBar.bookmark.image.withRenderingMode(.alwaysTemplate), for: .normal) + replyButton.setImage(replyImage, for: .normal) + retootButton.setImage(reblogImage, for: .normal) + starButton.setImage(starImage, for: .normal) container.axis = .horizontal container.spacing = 8 @@ -155,7 +151,6 @@ extension ActionToolbarContainer { container.addArrangedSubview(replyButton) container.addArrangedSubview(retootButton) container.addArrangedSubview(starButton) - container.addArrangedSubview(bookmartButton) } } @@ -165,7 +160,7 @@ extension ActionToolbarContainer { } private func isStarButtonHighlightStateDidChange(to isHighlight: Bool) { - let tintColor = isHighlight ? Asset.Colors.systemOrange.color : Asset.Colors.Label.secondary.color + let tintColor = isHighlight ? Asset.Colors.systemOrange.color : UIColor.black.withAlphaComponent(0.6) starButton.tintColor = tintColor starButton.setTitleColor(tintColor, for: .normal) starButton.setTitleColor(tintColor, for: .highlighted) @@ -193,9 +188,23 @@ extension ActionToolbarContainer { os_log("%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function) delegate?.actionToolbarContainer(self, moreButtonDidPressed: sender) } - @objc private func bookmarkButtonDidPressed(_ sender: UIButton) { - os_log("%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function) - delegate?.actionToolbarContainer(self, bookmarkButtonDidPressed: sender) - } } + +#if DEBUG +import SwiftUI + +struct ActionToolbarContainer_Previews: PreviewProvider { + static var previews: some View { + Group { + UIViewPreview(width: 300) { + let toolbar = ActionToolbarContainer() + toolbar.configure(for: .inline) + return toolbar + } + .previewLayout(.fixed(width: 300, height: 44)) + .previewDisplayName("Inline") + } + } +} +#endif