1. 增加从调色板中增加、删除、跳转和编辑 emoji 的功能 2. 增加通过 url 获取背景图时失败带报错 Signed-off-by: Ching <loooching@gmail.com>
112 lines
3.0 KiB
Swift
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()
|
|
}
|
|
}
|