diff --git a/Documentation/Reference/structs/Window.md b/Documentation/Reference/structs/Window.md index adcd947..0418e95 100644 --- a/Documentation/Reference/structs/Window.md +++ b/Documentation/Reference/structs/Window.md @@ -75,6 +75,22 @@ The closure to run when the import is not successful. The closure to run when the export is not successful. +### `defaultSize` + +The default window size. + +### `title` + +The window's title. + +### `resizable` + +Whether the window is resizable. + +### `deletable` + +Whether the window is deletable. + ## Methods ### `init(id:open:content:)` @@ -107,6 +123,11 @@ Get the storage of the content view. Update a window storage's content. - Parameter storage: The storage to update. +### `setProperties(window:)` + +Set some general propreties of the window. +- Parameter window: The window. + ### `overlay(windows:)` Add windows that overlay the last instance of this window if presented. @@ -156,3 +177,29 @@ Open a file importer or exporter if a signal has been activated and update chang Add the shortcut "w" which closes the window. - Returns: The window. + +### `defaultSize(width:height:)` + +Set the window's default size. +- Parameters: + - width: The window's width. + - height: The window's height. +- Returns: The window. + +### `title(_:)` + +Set the window's title. +- Parameter title: The title. +- Returns: The window. + +### `resizable(_:)` + +Set whether the window is resizable. +- Parameter resizable: The resizability. +- Returns: The window. + +### `deletable(_:)` + +Set whether the window is deletable. +- Parameter resizable: The deletability. +- Returns: The window. diff --git a/Sources/Adwaita/Window/Window.swift b/Sources/Adwaita/Window/Window.swift index 5e0b45c..956a5d7 100644 --- a/Sources/Adwaita/Window/Window.swift +++ b/Sources/Adwaita/Window/Window.swift @@ -49,6 +49,14 @@ public struct Window: WindowScene { var importerCancel: (() -> Void)? /// The closure to run when the export is not successful. var exporterCancel: (() -> Void)? + /// The default window size. + var defaultSize: (Int, Int)? + /// The window's title. + var title: String? + /// Whether the window is resizable. + var resizable = true + /// Whether the window is deletable. + var deletable = true /// Create a window type with a certain identifier and user interface. /// - Parameters: @@ -94,6 +102,7 @@ public struct Window: WindowScene { let content = content(window) let storage = content.widget(modifiers: []).container(modifiers: []) window.setChild(storage.view) + setProperties(window: window) updateShortcuts(window: window) return storage } @@ -106,12 +115,24 @@ public struct Window: WindowScene { if let view = storage.view { content.widget(modifiers: []).updateStorage(view, modifiers: []) } + setProperties(window: window) updateShortcuts(window: window) updateAppShortcuts(app: app) } updateFileDialog(storage: storage) } + /// Set some general propreties of the window. + /// - Parameter window: The window. + func setProperties(window: GTUIApplicationWindow) { + window.setDefaultSize(width: defaultSize?.0, height: defaultSize?.1) + if let title { + window.setTitle(title) + } + window.setResizability(resizable) + window.setDeletability(deletable) + } + /// Add windows that overlay the last instance of this window if presented. /// - Parameter windows: The windows. /// - Returns: The new windows and this window. @@ -211,6 +232,44 @@ public struct Window: WindowScene { keyboardShortcut("w".ctrl()) { $0.close() } } + /// Set the window's default size. + /// - Parameters: + /// - width: The window's width. + /// - height: The window's height. + /// - Returns: The window. + public func defaultSize(width: Int, height: Int) -> Self { + var newSelf = self + newSelf.defaultSize = (width, height) + return newSelf + } + + /// Set the window's title. + /// - Parameter title: The title. + /// - Returns: The window. + public func title(_ title: String) -> Self { + var newSelf = self + newSelf.title = title + return newSelf + } + + /// Set whether the window is resizable. + /// - Parameter resizable: The resizability. + /// - Returns: The window. + public func resizable(_ resizable: Bool) -> Self { + var newSelf = self + newSelf.resizable = resizable + return newSelf + } + + /// Set whether the window is deletable. + /// - Parameter resizable: The deletability. + /// - Returns: The window. + public func deletable(_ deletable: Bool) -> Self { + var newSelf = self + newSelf.deletable = deletable + return newSelf + } + } // swiftlint:enable discouraged_optional_collection diff --git a/Tests/Demo.swift b/Tests/Demo.swift index ca3fd5f..57958c0 100644 --- a/Tests/Demo.swift +++ b/Tests/Demo.swift @@ -20,6 +20,7 @@ struct Demo: App { Window(id: "main") { window in DemoContent(window: window, app: app) } + .defaultSize(width: 650, height: 450) .overlay { AboutWindow(id: "about", appName: "Demo", developer: "david-swift", version: "Test") .icon(.default(icon: .emojiNature)) @@ -28,6 +29,7 @@ struct Demo: App { OverlayWindowDemo.WindowContent(window: window) } .keyboardShortcut("Escape") { $0.close() } + .defaultSize(width: 300, height: 200) } HelperWindows() } @@ -35,14 +37,18 @@ struct Demo: App { struct HelperWindows: WindowSceneGroup { var scene: Scene { - Window(id: "content", open: 0) { window in - WindowsDemo.WindowContent(window: window) + Window(id: "content", open: 0) { _ in + WindowsDemo.WindowContent() } + .resizable(false) .closeShortcut() - Window(id: "toolbar-demo", open: 0) { window in - ToolbarDemo.WindowContent(window: window) + .defaultSize(width: 400, height: 250) + Window(id: "toolbar-demo", open: 0) { _ in + ToolbarDemo.WindowContent() } .closeShortcut() + .defaultSize(width: 400, height: 250) + .title("Toolbar Demo") } } @@ -76,7 +82,7 @@ struct Demo: App { } .keyboardShortcut("w".ctrl()) MenuSection { - MenuButton("About") { app.addWindow("about", parent: window); print(window.nativePtr) } + MenuButton("About") { app.addWindow("about", parent: window) } MenuButton("Quit", window: false) { app.quit() } .keyboardShortcut("q".ctrl()) } @@ -97,9 +103,6 @@ struct Demo: App { } .toast("This is a toast!", signal: toast) } - .onAppear { - window.setDefaultSize(width: 650, height: 450) - } } } diff --git a/Tests/OverlayWindowDemo.swift b/Tests/OverlayWindowDemo.swift index 0a9c7dc..ceffec9 100644 --- a/Tests/OverlayWindowDemo.swift +++ b/Tests/OverlayWindowDemo.swift @@ -5,7 +5,7 @@ // Created by david-swift on 09.11.23. // -// swiftlint:disable missing_docs implicitly_unwrapped_optional no_magic_numbers +// swiftlint:disable missing_docs implicitly_unwrapped_optional import Adwaita @@ -42,13 +42,10 @@ struct OverlayWindowDemo: View { .topToolbar { HeaderBar.empty() } - .onAppear { - window.setDefaultSize(width: 300, height: 200) - } } } } -// swiftlint:enable missing_docs implicitly_unwrapped_optional no_magic_numbers +// swiftlint:enable missing_docs implicitly_unwrapped_optional diff --git a/Tests/ToolbarDemo.swift b/Tests/ToolbarDemo.swift index 712ab0f..f1d3250 100644 --- a/Tests/ToolbarDemo.swift +++ b/Tests/ToolbarDemo.swift @@ -27,7 +27,6 @@ struct ToolbarDemo: View { @State private var visible = false @State private var moreContent = false - var window: GTUIWindow var view: Body { VStack { @@ -50,9 +49,6 @@ struct ToolbarDemo: View { .topToolbar { HeaderBar.empty() } - .onAppear { - window.setDefaultSize(width: 400, height: 250) - } } } diff --git a/Tests/WindowsDemo.swift b/Tests/WindowsDemo.swift index 262eb3f..c03115b 100644 --- a/Tests/WindowsDemo.swift +++ b/Tests/WindowsDemo.swift @@ -5,7 +5,7 @@ // Created by david-swift on 25.09.23. // -// swiftlint:disable missing_docs implicitly_unwrapped_optional no_magic_numbers +// swiftlint:disable missing_docs implicitly_unwrapped_optional import Adwaita @@ -34,21 +34,16 @@ struct WindowsDemo: View { struct WindowContent: View { - var window: GTUIWindow - var view: Body { Text("This window exists at most once.") .padding() .topToolbar { HeaderBar.empty() } - .onAppear { - window.setDefaultSize(width: 400, height: 250) - } } } } -// swiftlint:enable missing_docs implicitly_unwrapped_optional no_magic_numbers +// swiftlint:enable missing_docs implicitly_unwrapped_optional diff --git a/user-manual/Information/Widgets.md b/user-manual/Information/Widgets.md index 762ecde..ace0bb3 100644 --- a/user-manual/Information/Widgets.md +++ b/user-manual/Information/Widgets.md @@ -77,6 +77,10 @@ This is an overview of the available widgets and other components in _Adwaita_. | `overlay(windows:)` | Add windows that attach to a window of this type when being presented. | | `fileImporter(_:initialFolder:extensions:folders:onOpen:onClose:)` | Add an import file dialog. | | `fileExporter(_:initialFolder:initialName:onSave:onClose:)` | Add an export file dialog. | +| `defaultSize(width:height:)` | Set the window's initial size. | +| `title(_:)` | Set the window's title. | +| `resizable(_:)` | Set the window's resizability. | +| `deletable(_:)` | Set the window's deletability. | ### `AboutWindow` Modifiers | Syntax | Description |