2021-02-08 00:39:22 +00:00
|
|
|
//
|
|
|
|
// 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() {
|
2021-04-04 18:04:44 +00:00
|
|
|
let scope = Scope(rawValue: self.scope.selectedSegmentIndex)!
|
2021-02-08 00:39:22 +00:00
|
|
|
let order = sort.selectedSegmentIndex == 0 ? DirectoryOrder.active : .new
|
|
|
|
onFilterChanged?(scope, order)
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
extension ProfileDirectoryFilterView {
|
|
|
|
enum Scope: Int, Equatable {
|
|
|
|
case instance, everywhere
|
|
|
|
}
|
|
|
|
}
|