81 lines
2.4 KiB
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())
|
|
}
|
|
}
|