import Foundation /// Only read formatting from a selection whose projection has caught up with /// native text input. While it catches up, the toolbar keeps its last valid state. struct DocumentToolbarSelection: Equatable { var marks: Set = [] var blocks: Set = [] var style = "paragraph" var font = "sans" var size = 12 var alignment = "left" var canUndo = false var canRedo = false var hasSelection = false var styleLabel: String { if style.hasPrefix("heading"), let level = Int(style.dropFirst(7)) { return String(format: docsMacString("Heading %d"), level) } return String(localized: "docs.editor.toolbar.block.paragraph", bundle: DocsResources.bundle) } init() {} @MainActor init?(commands: DocumentCommands) { guard commands.isEnabled else { return nil } marks = Set(["strong", "em", "code"].filter { commands.hasMark($0) }) blocks = Set(["bullet_list", "ordered_list", "blockquote"].filter { commands.hasBlock($0) }) if let block = commands.selectedBlock { style = block.type == "heading" ? "heading" + (block.attrs?["level"] ?? "1") : "paragraph" alignment = block.attrs?["align"] ?? "left" } font = ["serif", "mono"].first { commands.hasMark("font_" + $0) } ?? "sans" size = [8,9,10,11,12,14,18,24,36,48,72].first { commands.hasMark("size_\($0)") } ?? (commands.hasMark("size_sm") ? 10 : commands.hasMark("size_lg") ? 14 : commands.hasMark("size_xl") ? 18 : 12) canUndo = commands.model.projection?.canUndo == true canRedo = commands.model.projection?.canRedo == true hasSelection = commands.model.selection.length > 0 } }