forked from aparoksha/adwaita-swift
223 lines
7.4 KiB
Swift
223 lines
7.4 KiB
Swift
//
|
||
// Demo.swift
|
||
// Adwaita
|
||
//
|
||
// Created by david-swift on 25.09.23.
|
||
//
|
||
|
||
// swiftlint:disable missing_docs implicitly_unwrapped_optional no_magic_numbers
|
||
|
||
import Adwaita
|
||
import CAdw
|
||
import Foundation
|
||
|
||
@main
|
||
struct Demo: App {
|
||
|
||
var app = AdwaitaApp(id: "io.github.AparokshaUI.Demo")
|
||
|
||
@State private var pictureURL: URL?
|
||
|
||
var scene: Scene {
|
||
Window(id: "main") { window in
|
||
DemoContent(window: window, app: app, pictureURL: pictureURL)
|
||
}
|
||
.devel()
|
||
helperWindows
|
||
}
|
||
|
||
@SceneBuilder var helperWindows: Scene {
|
||
Window(id: "content", open: 0) { _ in
|
||
WindowsDemo.WindowContent()
|
||
}
|
||
.resizable(false)
|
||
.closeShortcut()
|
||
.defaultSize(width: 400, height: 250)
|
||
Window(id: "toolbar-demo", open: 0) { _ in
|
||
ToolbarDemo.WindowContent().stopModifiers()
|
||
}
|
||
.closeShortcut()
|
||
.defaultSize(width: 400, height: 250)
|
||
.title("Toolbar Demo")
|
||
Window(id: "switcher-demo", open: 0) { _ in
|
||
ViewSwitcherDemo.WindowContent()
|
||
}
|
||
.closeShortcut()
|
||
.defaultSize(width: 600, height: 400)
|
||
.title("View Switcher Demo")
|
||
Window(id: "form-demo", open: 0) { _ in
|
||
FormDemo.WindowContent()
|
||
}
|
||
.closeShortcut()
|
||
.defaultSize(width: 400, height: 250)
|
||
.title("Form Demo")
|
||
Window(id: "password-checker-demo", open: 0) { _ in
|
||
PasswordCheckerDemo.WindowContent()
|
||
}
|
||
.closeShortcut()
|
||
.defaultSize(width: 400, height: 250)
|
||
.title("Password Checker Demo")
|
||
|
||
Window(id: "navigation", open: 0) { _ in
|
||
NavigationViewDemo.WindowContent()
|
||
}
|
||
.closeShortcut()
|
||
.title("Navigation View Demo")
|
||
}
|
||
|
||
enum WindowName: String, CaseIterable, CustomStringConvertible, Identifiable {
|
||
|
||
case demo = "Demo"
|
||
case alternative = "Alternative"
|
||
|
||
var id: Self { self }
|
||
|
||
var description: String {
|
||
rawValue
|
||
}
|
||
|
||
}
|
||
|
||
struct DemoContent: WindowView {
|
||
|
||
@State("selection")
|
||
private var selection: Page = .welcome
|
||
@State private var toast: Signal = .init()
|
||
@State private var sidebarVisible = true
|
||
@State private var width = 650
|
||
@State private var height = 550
|
||
@State private var wide = true
|
||
@State private var maximized = false
|
||
@State private var about = false
|
||
@State private var preferences = false
|
||
@State private var title: WindowName = .demo
|
||
@State private var closeAlert = false
|
||
@State private var destroy = false
|
||
var window: AdwaitaWindow
|
||
var app: AdwaitaApp!
|
||
var pictureURL: URL?
|
||
|
||
var view: Body {
|
||
OverlaySplitView(visible: $sidebarVisible) {
|
||
ScrollView {
|
||
List(Page.allCases, selection: $selection) { element in
|
||
Text(element.label)
|
||
.ellipsize()
|
||
.halign(.start)
|
||
.padding()
|
||
}
|
||
.sidebarStyle()
|
||
}
|
||
.hscrollbarPolicy(.never)
|
||
.topToolbar {
|
||
HeaderBar.end {
|
||
menu
|
||
}
|
||
.headerBarTitle {
|
||
WindowTitle(subtitle: "", title: title.description)
|
||
}
|
||
}
|
||
} content: {
|
||
StatusPage(
|
||
selection.label,
|
||
icon: selection.icon,
|
||
description: selection.description
|
||
) { selection.view(app: app, window: window, toast: toast) }
|
||
.topToolbar {
|
||
HeaderBar {
|
||
Toggle(icon: .default(icon: .sidebarShow), isOn: $sidebarVisible)
|
||
.tooltip("Toggle Sidebar")
|
||
DropDown(selection: $title, values: WindowName.allCases)
|
||
} end: {
|
||
if sidebarVisible {
|
||
Text("").transition(.crossfade)
|
||
} else {
|
||
menu.transition(.crossfade)
|
||
}
|
||
}
|
||
.headerBarTitle {
|
||
if sidebarVisible {
|
||
Text("")
|
||
.transition(.crossfade)
|
||
} else {
|
||
WindowTitle(subtitle: title.description, title: selection.label)
|
||
.transition(.crossfade)
|
||
}
|
||
}
|
||
}
|
||
.toast("This is a toast!", signal: toast)
|
||
}
|
||
.collapsed(!wide)
|
||
.breakpoint(minWidth: 550, matches: $wide)
|
||
.aboutDialog(
|
||
visible: $about,
|
||
app: "Demo",
|
||
developer: "david-swift",
|
||
version: "Test",
|
||
icon: .default(icon: .applicationXExecutable),
|
||
website: .init(string: "https://adwaita-swift.aparoksha.dev/"),
|
||
issues: .init(string: "https://git.aparoksha.dev/aparoksha/adwaita-swift/issues")
|
||
)
|
||
.preferencesDialog(visible: $preferences)
|
||
.preferencesPage("Page 1", icon: .default(icon: .audioHeadset)) { page in
|
||
page
|
||
.group("General") {
|
||
SwitchRow()
|
||
.title("Hello")
|
||
.subtitle("World")
|
||
SwitchRow()
|
||
.title("Switch")
|
||
.subtitle("Row")
|
||
}
|
||
.group("Extra", description: "This is the group's description") {
|
||
ActionRow()
|
||
.title("Extra Action")
|
||
}
|
||
}
|
||
.alertDialog(
|
||
visible: $closeAlert,
|
||
heading: "Close this Window?",
|
||
body: "Nothing will be lost. This is a demo."
|
||
)
|
||
.response("Cancel", role: .close) { }
|
||
.response("Close", appearance: .suggested, role: .default) {
|
||
destroy = true
|
||
window.close()
|
||
}
|
||
}
|
||
|
||
var menu: AnyView {
|
||
Menu(icon: .default(icon: .openMenu)) {
|
||
MenuButton("New Window", window: false) {
|
||
app.addWindow("main")
|
||
}
|
||
.keyboardShortcut("n".ctrl())
|
||
MenuButton("Close Window") {
|
||
window.close()
|
||
}
|
||
.keyboardShortcut("w".ctrl())
|
||
MenuSection {
|
||
MenuButton("Preferences") { preferences = true }
|
||
.keyboardShortcut("comma".ctrl())
|
||
MenuButton("About") { about = true }
|
||
MenuButton("Quit", window: false) { app.quit() }
|
||
.keyboardShortcut("q".ctrl())
|
||
}
|
||
}
|
||
.primary()
|
||
.tooltip("Main Menu")
|
||
}
|
||
|
||
func window(_ window: Window) -> Window {
|
||
window
|
||
.size(width: $width, height: $height)
|
||
.maximized($maximized)
|
||
.onClose { closeAlert = !destroy; return !destroy }
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
|
||
// swiftlint:enable missing_docs implicitly_unwrapped_optional no_magic_numbers
|