102 lines
3.0 KiB
Swift
102 lines
3.0 KiB
Swift
//
|
||
// PatternSelectWindow.swift
|
||
// LifeGameApp (macOS)
|
||
//
|
||
// Created by Yusuke Hosonuma on 2020/08/24.
|
||
//
|
||
|
||
import SwiftUI
|
||
import LifeGame
|
||
import Core
|
||
|
||
struct PatternSelectWindow: View {
|
||
|
||
// MARK: Environments
|
||
|
||
@EnvironmentObject var setting: SettingEnvironment
|
||
@EnvironmentObject var authentication: Authentication
|
||
@EnvironmentObject var gameManager: GameManager
|
||
|
||
// MARK: Local
|
||
|
||
@StateObject var patternSelectManager: PatternSelectManager
|
||
@State var selectionItem: String? = "All"
|
||
|
||
init(dismiss: @escaping () -> Void) {
|
||
_patternSelectManager = .init(wrappedValue: .init(dismiss: dismiss))
|
||
}
|
||
|
||
// TODO: iOS版にもフィルタ機能を導入したら、PatternSelectManager に移すのが良いかもしれない。
|
||
var patternURLs: [URL] {
|
||
guard let item = selectionItem else { return [] }
|
||
|
||
let urls: [PatternURL]
|
||
|
||
if let category = PatternCategory(rawValue: item) {
|
||
urls = patternSelectManager.urlsByCategory[category] ?? []
|
||
} else {
|
||
urls = patternSelectManager.allURLs
|
||
}
|
||
|
||
return urls
|
||
.filter(when: setting.isFilterByStared, isIncluded: \.stared)
|
||
.map(\.url)
|
||
}
|
||
|
||
// MARK: Views
|
||
|
||
var body: some View {
|
||
NavigationView {
|
||
List(selection: $selectionItem) {
|
||
Section(header: Text("Search options")) {
|
||
Toggle("Stared", isOn: $setting.isFilterByStared.animation())
|
||
.enabled(authentication.isSignIn)
|
||
}
|
||
|
||
Section(header: Text("General")) {
|
||
Text("All").tag("All")
|
||
}
|
||
|
||
// Note:
|
||
// - 初期表示時に選択されている"All"がきれいにハイライトされない。(macOS beta 9)
|
||
// - Cmd + Click などで未選択状態にできてしまう。
|
||
Section(header: Text("Category")) {
|
||
ForEach(PatternCategory.allCases.map(\.rawValue), id: \.self) { name in
|
||
Text(name).tag(name)
|
||
}
|
||
}
|
||
}
|
||
.listStyle(SidebarListStyle())
|
||
|
||
PatternGridListView(
|
||
style: .grid,
|
||
patternURLs: patternURLs,
|
||
didTapItem: didTapItem,
|
||
didToggleStar: didToggleStar
|
||
)
|
||
.padding()
|
||
}
|
||
.toolbar {
|
||
ToolbarItem(placement: .cancellationAction) {
|
||
Button("Cancel", action: patternSelectManager.cancel)
|
||
}
|
||
}
|
||
}
|
||
|
||
// MARK: Action
|
||
|
||
private func didTapItem(item: PatternItem) {
|
||
patternSelectManager.select(item: item)
|
||
}
|
||
|
||
private func didToggleStar(item: PatternItem) {
|
||
patternSelectManager.toggleStar(item: item)
|
||
}
|
||
}
|
||
|
||
struct BoardListView_Previews: PreviewProvider {
|
||
static var previews: some View {
|
||
PatternSelectWindow(dismiss: {})
|
||
}
|
||
}
|