Acord/ios/src/MenuBar.swift

81 lines
2.4 KiB
Swift

import SwiftUI
/// top toolbar with File / Edit / Render / View menus dispatching through ViewportController.
struct MenuBar: View {
@ObservedObject var controller: ViewportController
var body: some View {
HStack(spacing: 0) {
fileMenu
editMenu
renderMenu
viewMenu
Spacer()
}
.padding(.horizontal, 8)
.padding(.vertical, 4)
.background(Color(white: 0.12))
.foregroundColor(.white)
.font(.system(size: 13))
}
private var fileMenu: some View {
Menu("File") {
Button("New Note") { controller.newNote() }
Button("Open…") { controller.openDocument() }
Divider()
Button("Save") { controller.saveDocument() }
Button("Save As…") { controller.saveDocumentAs() }
Divider()
Button("Print…") { controller.printDocument() }
Divider()
Button("Settings…") { controller.toggleSettings() }
}
.menuLabel
}
private var editMenu: some View {
Menu("Edit") {
Button("Undo") { controller.undo() }
Button("Redo") { controller.redo() }
Divider()
Button("Bold") { controller.toggleBold() }
Button("Italic") { controller.toggleItalic() }
Button("Insert Table") { controller.insertTable() }
Divider()
Button("Find…") { controller.toggleFind() }
}
.menuLabel
}
private var renderMenu: some View {
Menu("Render") {
Button("Live") { controller.setLiveMode() }
Button("Editor") { controller.setEditorMode() }
Button("View") { controller.setViewMode() }
Divider()
Button("Evaluate") { controller.evaluate() }
}
.menuLabel
}
private var viewMenu: some View {
Menu("View") {
Button("Zoom In") { controller.zoomIn() }
Button("Zoom Out") { controller.zoomOut() }
Button("Reset Zoom") { controller.resetZoom() }
}
.menuLabel
}
}
private extension View {
/// applies consistent menu label padding and hit target.
var menuLabel: some View {
self
.padding(.horizontal, 10)
.padding(.vertical, 4)
.contentShape(Rectangle())
}
}