cs193p-emojiart/EmojiArt/PaletteChooser.swift
Ching 566f3539d1 feat(view, viewmodels): 增加调色板按钮,增加报错提示
1. 增加从调色板中增加、删除、跳转和编辑 emoji 的功能
2. 增加通过 url 获取背景图时失败带报错

Signed-off-by: Ching <loooching@gmail.com>
2023-02-26 19:34:35 +08:00

112 lines
3.0 KiB
Swift

//
// PaletteChooser.swift
// EmojiArt
//
// Created by ching on 2023/2/25.
//
import SwiftUI
struct PaletteChooser: View {
var emojiFontSize: CGFloat = const.defaultEmojiFontSize
var emojiFont: Font { .system(size: emojiFontSize) }
@EnvironmentObject var store: PaletteStore
@State private var chosenPaletteIndex = 0
var body: some View {
HStack {
paletteButton
body(for: store.palette(at: chosenPaletteIndex)
)
}.clipped()
}
var paletteButton: some View {
Button {
withAnimation {
chosenPaletteIndex = (chosenPaletteIndex + 1) % store.palettes.count
}
} label: {
Image(systemName: "paintpalette")
}
.font(emojiFont)
.contextMenu { contextMenu }
}
@ViewBuilder
var contextMenu: some View {
AnimatedActionButton(title: "Edit", systemImage: "pencil") {
editing = true
}
AnimatedActionButton(title: "New", systemImage: "plus") {
store.insertPalette(named: "New", emojis: "", at: chosenPaletteIndex)
editing = true
}
AnimatedActionButton(title: "Delete", systemImage: "minus.circle") {
chosenPaletteIndex = store.removePalette(at: chosenPaletteIndex)
}
AnimatedActionButton(title: "Manager", systemImage: "slider.vertical.3") {
managing = true
}
gotoMenu
}
var gotoMenu: some View {
Menu {
ForEach(store.palettes) {
palette in AnimatedActionButton(title: palette.name) {
if let index = store.palettes.index(matching: palette) {
chosenPaletteIndex = index
}
}
}
} label: {
Label("Go To", systemImage: "text.insert")
}
}
func body(for palette: Palette) -> some View {
HStack {
Text(palette.name)
SrcollingEmojiView(emojis: palette.emojis)
.font(emojiFont)
}
.id(palette.id)
.transition(rollTransaction)
.popover(isPresented: $editing) {
PaletteEditor(palette: $store.palettes[chosenPaletteIndex])
}
.sheet(isPresented: $managing) {
PaletteManager()
}
}
@State private var editing = false
@State private var managing = false
var rollTransaction: AnyTransition {
AnyTransition.asymmetric(insertion: .offset(x: 0, y: emojiFontSize), removal: .offset(x: 0, y: -emojiFontSize))
}
}
struct SrcollingEmojiView: View {
let emojis: String
var body: some View {
ScrollView(.horizontal) {
HStack {
ForEach(emojis.map { String($0) }, id: \.self) { emoji in
Text(emoji)
.onDrag { NSItemProvider(object: emoji as NSString) }
}
}
}
}
}
struct PaletteChooser_Previews: PreviewProvider {
static var previews: some View {
PaletteChooser()
}
}