// // ProfileDirectoryFilterView.swift // Tusker // // Created by Shadowfacts on 2/7/21. // Copyright © 2021 Shadowfacts. All rights reserved. // import UIKit import Pachyderm class ProfileDirectoryFilterView: UICollectionReusableView { var onFilterChanged: ((Scope, DirectoryOrder) -> Void)? private var scope: UISegmentedControl! private var sort: UISegmentedControl! override init(frame: CGRect) { super.init(frame: frame) commonInit() } required init?(coder: NSCoder) { super.init(coder: coder) commonInit() } private func commonInit() { scope = UISegmentedControl(items: ["Instance", NSLocalizedString("Everywhere", comment: "everywhere profile directory scope")]) scope.selectedSegmentIndex = 0 scope.addTarget(self, action: #selector(filterChanged), for: .valueChanged) sort = UISegmentedControl(items: [ NSLocalizedString("Active", comment: "active profile directory sort"), NSLocalizedString("New", comment: "new profile directory sort"), ]) sort.selectedSegmentIndex = 0 sort.addTarget(self, action: #selector(filterChanged), for: .valueChanged) let fromLabel = UILabel() fromLabel.translatesAutoresizingMaskIntoConstraints = false fromLabel.text = NSLocalizedString("From", comment: "profile directory scope label") fromLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal) let sortLabel = UILabel() sortLabel.translatesAutoresizingMaskIntoConstraints = false sortLabel.text = NSLocalizedString("Sort By", comment: "profile directory sort label") sortLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal) let labelContainer = UIView() labelContainer.addSubview(sortLabel) labelContainer.addSubview(fromLabel) let controlStack = UIStackView(arrangedSubviews: [sort, scope]) controlStack.axis = .vertical controlStack.spacing = 8 let blurEffect = UIBlurEffect(style: .systemChromeMaterial) let blurView = UIVisualEffectView(effect: blurEffect) blurView.translatesAutoresizingMaskIntoConstraints = false addSubview(blurView) let vibrancyEffect = UIVibrancyEffect(blurEffect: blurEffect, style: .label) let vibrancyView = UIVisualEffectView(effect: vibrancyEffect) vibrancyView.translatesAutoresizingMaskIntoConstraints = false blurView.contentView.addSubview(vibrancyView) let filterStack = UIStackView(arrangedSubviews: [ labelContainer, controlStack, ]) filterStack.axis = .horizontal filterStack.spacing = 8 filterStack.translatesAutoresizingMaskIntoConstraints = false vibrancyView.contentView.addSubview(filterStack) let separator = UIView() separator.backgroundColor = .separator separator.translatesAutoresizingMaskIntoConstraints = false addSubview(separator) NSLayoutConstraint.activate([ fromLabel.leadingAnchor.constraint(equalTo: labelContainer.leadingAnchor), fromLabel.trailingAnchor.constraint(equalTo: labelContainer.trailingAnchor), fromLabel.centerYAnchor.constraint(equalTo: scope.centerYAnchor), sortLabel.leadingAnchor.constraint(equalTo: labelContainer.leadingAnchor), sortLabel.trailingAnchor.constraint(equalTo: labelContainer.trailingAnchor), sortLabel.centerYAnchor.constraint(equalTo: sort.centerYAnchor), blurView.leadingAnchor.constraint(equalTo: leadingAnchor), blurView.trailingAnchor.constraint(equalTo: trailingAnchor), blurView.topAnchor.constraint(equalTo: topAnchor), blurView.bottomAnchor.constraint(equalTo: bottomAnchor), vibrancyView.leadingAnchor.constraint(equalTo: blurView.contentView.leadingAnchor), vibrancyView.trailingAnchor.constraint(equalTo: blurView.contentView.trailingAnchor), vibrancyView.topAnchor.constraint(equalTo: blurView.contentView.topAnchor), vibrancyView.bottomAnchor.constraint(equalTo: blurView.contentView.bottomAnchor), filterStack.leadingAnchor.constraint(equalToSystemSpacingAfter: vibrancyView.contentView.leadingAnchor, multiplier: 1), vibrancyView.contentView.trailingAnchor.constraint(equalToSystemSpacingAfter: filterStack.trailingAnchor, multiplier: 1), filterStack.topAnchor.constraint(equalToSystemSpacingBelow: vibrancyView.contentView.topAnchor, multiplier: 1), vibrancyView.contentView.bottomAnchor.constraint(equalToSystemSpacingBelow: filterStack.bottomAnchor, multiplier: 1), separator.leadingAnchor.constraint(equalTo: leadingAnchor), separator.trailingAnchor.constraint(equalTo: trailingAnchor), separator.bottomAnchor.constraint(equalTo: bottomAnchor), separator.heightAnchor.constraint(equalToConstant: 0.5), ]) } func updateUI(mastodonController: MastodonController) { scope.setTitle(mastodonController.accountInfo!.instanceURL.host!, forSegmentAt: 0) } @objc private func filterChanged() { let scope = Scope(rawValue: self.scope.selectedSegmentIndex)! let order = sort.selectedSegmentIndex == 0 ? DirectoryOrder.active : .new onFilterChanged?(scope, order) } } extension ProfileDirectoryFilterView { enum Scope: Int, Equatable { case instance, everywhere } }