From b7aabb09667a63a18f7d6148a6012b7ec0144c7f Mon Sep 17 00:00:00 2001 From: david-swift Date: Sun, 21 Apr 2024 11:52:34 +0200 Subject: [PATCH] Add support for GtkPicture --- .gitignore | 3 +- .vscode/launch.json | 52 ++++++ .../Adwaita/View/Generated/ActionRow.swift | 2 +- Sources/Adwaita/View/Generated/Avatar.swift | 2 +- Sources/Adwaita/View/Generated/Banner.swift | 2 +- Sources/Adwaita/View/Generated/Bin.swift | 2 +- Sources/Adwaita/View/Generated/Box.swift | 2 +- Sources/Adwaita/View/Generated/Button.swift | 2 +- .../View/Generated/ButtonContent.swift | 2 +- Sources/Adwaita/View/Generated/Carousel.swift | 2 +- .../Adwaita/View/Generated/CenterBox.swift | 2 +- .../Adwaita/View/Generated/CheckButton.swift | 2 +- Sources/Adwaita/View/Generated/Clamp.swift | 2 +- Sources/Adwaita/View/Generated/ComboRow.swift | 2 +- Sources/Adwaita/View/Generated/EntryRow.swift | 2 +- .../Adwaita/View/Generated/ExpanderRow.swift | 2 +- Sources/Adwaita/View/Generated/FlowBox.swift | 2 +- .../Adwaita/View/Generated/HeaderBar.swift | 2 +- Sources/Adwaita/View/Generated/Label.swift | 2 +- Sources/Adwaita/View/Generated/LevelBar.swift | 2 +- .../Adwaita/View/Generated/LinkButton.swift | 2 +- Sources/Adwaita/View/Generated/ListBox.swift | 2 +- Sources/Adwaita/View/Generated/Menu.swift | 2 +- .../View/Generated/NavigationView.swift | 2 +- Sources/Adwaita/View/Generated/Overlay.swift | 2 +- .../View/Generated/OverlaySplitView.swift | 2 +- .../View/Generated/PasswordEntryRow.swift | 2 +- Sources/Adwaita/View/Generated/Picture.swift | 157 ++++++++++++++++++ Sources/Adwaita/View/Generated/Popover.swift | 2 +- .../View/Generated/PreferencesGroup.swift | 2 +- .../View/Generated/PreferencesPage.swift | 2 +- .../View/Generated/PreferencesRow.swift | 2 +- .../Adwaita/View/Generated/ProgressBar.swift | 2 +- .../View/Generated/ScrolledWindow.swift | 2 +- .../Adwaita/View/Generated/SearchBar.swift | 2 +- .../Adwaita/View/Generated/SearchEntry.swift | 2 +- Sources/Adwaita/View/Generated/SpinRow.swift | 2 +- Sources/Adwaita/View/Generated/Spinner.swift | 2 +- .../Adwaita/View/Generated/SplitButton.swift | 2 +- .../Adwaita/View/Generated/StatusPage.swift | 2 +- .../Adwaita/View/Generated/SwitchRow.swift | 2 +- .../Adwaita/View/Generated/ToastOverlay.swift | 2 +- .../Adwaita/View/Generated/ToggleButton.swift | 2 +- .../Adwaita/View/Generated/ToolbarView.swift | 6 +- .../Adwaita/View/Generated/WindowTitle.swift | 2 +- Sources/Adwaita/View/Picture+.swift | 31 ++++ .../Generation/GenerationConfiguration.swift | 3 +- Tests/Demo.swift | 9 +- Tests/Page.swift | 8 +- Tests/PictureDemo.swift | 41 +++++ 50 files changed, 343 insertions(+), 49 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 Sources/Adwaita/View/Generated/Picture.swift create mode 100644 Sources/Adwaita/View/Picture+.swift create mode 100644 Tests/PictureDemo.swift diff --git a/.gitignore b/.gitignore index 64ba397..9cdd5e8 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ DerivedData/ .netrc /Package.resolved .Ulysses-Group.plist -/.docc-build \ No newline at end of file +/.docc-build +/io.github.AparokshaUI.Generation.json \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..cf34b8a --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,52 @@ +{ + "configurations": [ + { + "type": "lldb", + "request": "launch", + "sourceLanguages": [ + "swift" + ], + "args": [], + "cwd": "${workspaceFolder:adwaita-swift}", + "name": "Debug Generation", + "program": "${workspaceFolder:adwaita-swift}/.build/debug/Generation", + "preLaunchTask": "swift: Build Debug Generation" + }, + { + "type": "lldb", + "request": "launch", + "sourceLanguages": [ + "swift" + ], + "args": [], + "cwd": "${workspaceFolder:adwaita-swift}", + "name": "Release Generation", + "program": "${workspaceFolder:adwaita-swift}/.build/release/Generation", + "preLaunchTask": "swift: Build Release Generation" + }, + { + "type": "lldb", + "request": "launch", + "sourceLanguages": [ + "swift" + ], + "args": [], + "cwd": "${workspaceFolder:adwaita-swift}", + "name": "Debug Demo", + "program": "${workspaceFolder:adwaita-swift}/.build/debug/Demo", + "preLaunchTask": "swift: Build Debug Demo" + }, + { + "type": "lldb", + "request": "launch", + "sourceLanguages": [ + "swift" + ], + "args": [], + "cwd": "${workspaceFolder:adwaita-swift}", + "name": "Release Demo", + "program": "${workspaceFolder:adwaita-swift}/.build/release/Demo", + "preLaunchTask": "swift: Build Release Demo" + } + ] +} \ No newline at end of file diff --git a/Sources/Adwaita/View/Generated/ActionRow.swift b/Sources/Adwaita/View/Generated/ActionRow.swift index ea0c1a0..e1eb605 100644 --- a/Sources/Adwaita/View/Generated/ActionRow.swift +++ b/Sources/Adwaita/View/Generated/ActionRow.swift @@ -2,7 +2,7 @@ // ActionRow.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Avatar.swift b/Sources/Adwaita/View/Generated/Avatar.swift index 22e234c..6193453 100644 --- a/Sources/Adwaita/View/Generated/Avatar.swift +++ b/Sources/Adwaita/View/Generated/Avatar.swift @@ -2,7 +2,7 @@ // Avatar.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Banner.swift b/Sources/Adwaita/View/Generated/Banner.swift index dd05cd1..ba5d7bd 100644 --- a/Sources/Adwaita/View/Generated/Banner.swift +++ b/Sources/Adwaita/View/Generated/Banner.swift @@ -2,7 +2,7 @@ // Banner.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Bin.swift b/Sources/Adwaita/View/Generated/Bin.swift index c6743ad..be41bc8 100644 --- a/Sources/Adwaita/View/Generated/Bin.swift +++ b/Sources/Adwaita/View/Generated/Bin.swift @@ -2,7 +2,7 @@ // Bin.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Box.swift b/Sources/Adwaita/View/Generated/Box.swift index 59e73c4..eda19a1 100644 --- a/Sources/Adwaita/View/Generated/Box.swift +++ b/Sources/Adwaita/View/Generated/Box.swift @@ -2,7 +2,7 @@ // Box.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Button.swift b/Sources/Adwaita/View/Generated/Button.swift index 16ad40d..a17f412 100644 --- a/Sources/Adwaita/View/Generated/Button.swift +++ b/Sources/Adwaita/View/Generated/Button.swift @@ -2,7 +2,7 @@ // Button.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/ButtonContent.swift b/Sources/Adwaita/View/Generated/ButtonContent.swift index 6c8c0fc..7242da5 100644 --- a/Sources/Adwaita/View/Generated/ButtonContent.swift +++ b/Sources/Adwaita/View/Generated/ButtonContent.swift @@ -2,7 +2,7 @@ // ButtonContent.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Carousel.swift b/Sources/Adwaita/View/Generated/Carousel.swift index 8c3dbed..9a850cc 100644 --- a/Sources/Adwaita/View/Generated/Carousel.swift +++ b/Sources/Adwaita/View/Generated/Carousel.swift @@ -2,7 +2,7 @@ // Carousel.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/CenterBox.swift b/Sources/Adwaita/View/Generated/CenterBox.swift index 6327756..c1a1483 100644 --- a/Sources/Adwaita/View/Generated/CenterBox.swift +++ b/Sources/Adwaita/View/Generated/CenterBox.swift @@ -2,7 +2,7 @@ // CenterBox.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/CheckButton.swift b/Sources/Adwaita/View/Generated/CheckButton.swift index 69a22ce..766a271 100644 --- a/Sources/Adwaita/View/Generated/CheckButton.swift +++ b/Sources/Adwaita/View/Generated/CheckButton.swift @@ -2,7 +2,7 @@ // CheckButton.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Clamp.swift b/Sources/Adwaita/View/Generated/Clamp.swift index 952a246..799491a 100644 --- a/Sources/Adwaita/View/Generated/Clamp.swift +++ b/Sources/Adwaita/View/Generated/Clamp.swift @@ -2,7 +2,7 @@ // Clamp.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/ComboRow.swift b/Sources/Adwaita/View/Generated/ComboRow.swift index 9c4c480..02a7aee 100644 --- a/Sources/Adwaita/View/Generated/ComboRow.swift +++ b/Sources/Adwaita/View/Generated/ComboRow.swift @@ -2,7 +2,7 @@ // ComboRow.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/EntryRow.swift b/Sources/Adwaita/View/Generated/EntryRow.swift index 9a369a7..99db22a 100644 --- a/Sources/Adwaita/View/Generated/EntryRow.swift +++ b/Sources/Adwaita/View/Generated/EntryRow.swift @@ -2,7 +2,7 @@ // EntryRow.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/ExpanderRow.swift b/Sources/Adwaita/View/Generated/ExpanderRow.swift index 152b0e7..6a8eb30 100644 --- a/Sources/Adwaita/View/Generated/ExpanderRow.swift +++ b/Sources/Adwaita/View/Generated/ExpanderRow.swift @@ -2,7 +2,7 @@ // ExpanderRow.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/FlowBox.swift b/Sources/Adwaita/View/Generated/FlowBox.swift index 020eb84..dd41a21 100644 --- a/Sources/Adwaita/View/Generated/FlowBox.swift +++ b/Sources/Adwaita/View/Generated/FlowBox.swift @@ -2,7 +2,7 @@ // FlowBox.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/HeaderBar.swift b/Sources/Adwaita/View/Generated/HeaderBar.swift index 779aeaa..8d68345 100644 --- a/Sources/Adwaita/View/Generated/HeaderBar.swift +++ b/Sources/Adwaita/View/Generated/HeaderBar.swift @@ -2,7 +2,7 @@ // HeaderBar.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Label.swift b/Sources/Adwaita/View/Generated/Label.swift index d84208a..acf5c5a 100644 --- a/Sources/Adwaita/View/Generated/Label.swift +++ b/Sources/Adwaita/View/Generated/Label.swift @@ -2,7 +2,7 @@ // Label.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/LevelBar.swift b/Sources/Adwaita/View/Generated/LevelBar.swift index e5f8473..9e2d3c2 100644 --- a/Sources/Adwaita/View/Generated/LevelBar.swift +++ b/Sources/Adwaita/View/Generated/LevelBar.swift @@ -2,7 +2,7 @@ // LevelBar.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/LinkButton.swift b/Sources/Adwaita/View/Generated/LinkButton.swift index 1b7d95c..e9d5b61 100644 --- a/Sources/Adwaita/View/Generated/LinkButton.swift +++ b/Sources/Adwaita/View/Generated/LinkButton.swift @@ -2,7 +2,7 @@ // LinkButton.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/ListBox.swift b/Sources/Adwaita/View/Generated/ListBox.swift index 1c233ec..00549ec 100644 --- a/Sources/Adwaita/View/Generated/ListBox.swift +++ b/Sources/Adwaita/View/Generated/ListBox.swift @@ -2,7 +2,7 @@ // ListBox.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Menu.swift b/Sources/Adwaita/View/Generated/Menu.swift index 345b0c4..7f1a25a 100644 --- a/Sources/Adwaita/View/Generated/Menu.swift +++ b/Sources/Adwaita/View/Generated/Menu.swift @@ -2,7 +2,7 @@ // Menu.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/NavigationView.swift b/Sources/Adwaita/View/Generated/NavigationView.swift index fc91bc1..3cb93c0 100644 --- a/Sources/Adwaita/View/Generated/NavigationView.swift +++ b/Sources/Adwaita/View/Generated/NavigationView.swift @@ -2,7 +2,7 @@ // NavigationView.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Overlay.swift b/Sources/Adwaita/View/Generated/Overlay.swift index 818fc42..e58f943 100644 --- a/Sources/Adwaita/View/Generated/Overlay.swift +++ b/Sources/Adwaita/View/Generated/Overlay.swift @@ -2,7 +2,7 @@ // Overlay.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/OverlaySplitView.swift b/Sources/Adwaita/View/Generated/OverlaySplitView.swift index fb0c926..47e4f27 100644 --- a/Sources/Adwaita/View/Generated/OverlaySplitView.swift +++ b/Sources/Adwaita/View/Generated/OverlaySplitView.swift @@ -2,7 +2,7 @@ // OverlaySplitView.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/PasswordEntryRow.swift b/Sources/Adwaita/View/Generated/PasswordEntryRow.swift index a2c7006..3f169fc 100644 --- a/Sources/Adwaita/View/Generated/PasswordEntryRow.swift +++ b/Sources/Adwaita/View/Generated/PasswordEntryRow.swift @@ -2,7 +2,7 @@ // PasswordEntryRow.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Picture.swift b/Sources/Adwaita/View/Generated/Picture.swift new file mode 100644 index 0000000..59f138f --- /dev/null +++ b/Sources/Adwaita/View/Generated/Picture.swift @@ -0,0 +1,157 @@ +// +// Picture.swift +// Adwaita +// +// Created by auto-generation on 21.04.24. +// + +import CAdw +import LevenshteinTransformations + +/// The `GtkPicture` widget displays a `GdkPaintable`. +/// +/// ![An example GtkPicture](picture.png) +/// +/// Many convenience functions are provided to make pictures simple to use. +/// For example, if you want to load an image from a file, and then display +/// it, there’s a convenience function to do this: +/// +/// ```c +/// GtkWidget *widget = gtk_picture_new_for_filename ("myfile.png"); +/// ``` +/// +/// If the file isn’t loaded successfully, the picture will contain a +/// “broken image” icon similar to that used in many web browsers. +/// If you want to handle errors in loading the file yourself, +/// for example by displaying an error message, then load the image with +/// [ctor@Gdk.Texture.new_from_file], then create the `GtkPicture` with +/// [ctor@Gtk.Picture.new_for_paintable]. +/// +/// Sometimes an application will want to avoid depending on external data +/// files, such as image files. See the documentation of `GResource` for details. +/// In this case, [ctor@Gtk.Picture.new_for_resource] and +/// [method@Gtk.Picture.set_resource] should be used. +/// +/// `GtkPicture` displays an image at its natural size. See [class@Gtk.Image] +/// if you want to display a fixed-size image, such as an icon. +/// +/// ## Sizing the paintable +/// +/// You can influence how the paintable is displayed inside the `GtkPicture` +/// by changing [property@Gtk.Picture:content-fit]. See [enum@Gtk.ContentFit] +/// for details. [property@Gtk.Picture:can-shrink] can be unset to make sure +/// that paintables are never made smaller than their ideal size - but +/// be careful if you do not know the size of the paintable in use (like +/// when displaying user-loaded images). This can easily cause the picture to +/// grow larger than the screen. And [property@Gtk.Widget:halign] and +/// [property@Gtk.Widget:valign] can be used to make sure the paintable doesn't +/// fill all available space but is instead displayed at its original size. +/// +/// ## CSS nodes +/// +/// `GtkPicture` has a single CSS node with the name `picture`. +/// +/// ## Accessibility +/// +/// `GtkPicture` uses the `GTK_ACCESSIBLE_ROLE_IMG` role. +public struct Picture: Widget { + + /// Additional update functions for type extensions. + var updateFunctions: [(ViewStorage, [(View) -> View], Bool) -> Void] = [] + /// Additional appear functions for type extensions. + var appearFunctions: [(ViewStorage, [(View) -> View]) -> Void] = [] + + /// The accessible role of the given `GtkAccessible` implementation. + /// + /// The accessible role cannot be changed once set. + var accessibleRole: String? + /// The alternative textual description for the picture. + var alternativeText: String? + /// If the `GtkPicture` can be made smaller than the natural size of its contents. + var canShrink: Bool? + /// Whether the GtkPicture will render its contents trying to preserve the aspect + /// ratio. + var keepAspectRatio: Bool? + /// The application. + var app: GTUIApp? + /// The window. + var window: GTUIApplicationWindow? + + /// Initialize `Picture`. + public init() { + } + + /// Get the widget's view storage. + /// - Parameter modifiers: The view modifiers. + /// - Returns: The view storage. + public func container(modifiers: [(View) -> View]) -> ViewStorage { + let storage = ViewStorage(gtk_picture_new()?.opaque()) + update(storage, modifiers: modifiers, updateProperties: true) + + for function in appearFunctions { + function(storage, modifiers) + } + return storage + } + + /// Update the widget's view storage. + /// - Parameters: + /// - storage: The view storage. + /// - modifiers: The view modifiers. + /// - updateProperties: Whether to update the view's properties. + public func update(_ storage: ViewStorage, modifiers: [(View) -> View], updateProperties: Bool) { + storage.modify { widget in + + if let alternativeText, updateProperties { + gtk_picture_set_alternative_text(widget, alternativeText) + } + if let canShrink, updateProperties { + gtk_picture_set_can_shrink(widget, canShrink.cBool) + } + if let keepAspectRatio, updateProperties { + gtk_picture_set_keep_aspect_ratio(widget, keepAspectRatio.cBool) + } + + + } + for function in updateFunctions { + function(storage, modifiers, updateProperties) + } + } + + /// The accessible role of the given `GtkAccessible` implementation. + /// + /// The accessible role cannot be changed once set. + public func accessibleRole(_ accessibleRole: String?) -> Self { + var newSelf = self + newSelf.accessibleRole = accessibleRole + + return newSelf + } + + /// The alternative textual description for the picture. + public func alternativeText(_ alternativeText: String?) -> Self { + var newSelf = self + newSelf.alternativeText = alternativeText + + return newSelf + } + + /// If the `GtkPicture` can be made smaller than the natural size of its contents. + public func canShrink(_ canShrink: Bool? = true) -> Self { + var newSelf = self + newSelf.canShrink = canShrink + + return newSelf + } + + /// Whether the GtkPicture will render its contents trying to preserve the aspect + /// ratio. + public func keepAspectRatio(_ keepAspectRatio: Bool? = true) -> Self { + var newSelf = self + newSelf.keepAspectRatio = keepAspectRatio + + return newSelf + } + +} diff --git a/Sources/Adwaita/View/Generated/Popover.swift b/Sources/Adwaita/View/Generated/Popover.swift index f0a2936..0699148 100644 --- a/Sources/Adwaita/View/Generated/Popover.swift +++ b/Sources/Adwaita/View/Generated/Popover.swift @@ -2,7 +2,7 @@ // Popover.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/PreferencesGroup.swift b/Sources/Adwaita/View/Generated/PreferencesGroup.swift index 28c390c..4e32ddf 100644 --- a/Sources/Adwaita/View/Generated/PreferencesGroup.swift +++ b/Sources/Adwaita/View/Generated/PreferencesGroup.swift @@ -2,7 +2,7 @@ // PreferencesGroup.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/PreferencesPage.swift b/Sources/Adwaita/View/Generated/PreferencesPage.swift index 08adb27..d305882 100644 --- a/Sources/Adwaita/View/Generated/PreferencesPage.swift +++ b/Sources/Adwaita/View/Generated/PreferencesPage.swift @@ -2,7 +2,7 @@ // PreferencesPage.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/PreferencesRow.swift b/Sources/Adwaita/View/Generated/PreferencesRow.swift index 7467c09..3c59c67 100644 --- a/Sources/Adwaita/View/Generated/PreferencesRow.swift +++ b/Sources/Adwaita/View/Generated/PreferencesRow.swift @@ -2,7 +2,7 @@ // PreferencesRow.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/ProgressBar.swift b/Sources/Adwaita/View/Generated/ProgressBar.swift index 25195f3..492cbf9 100644 --- a/Sources/Adwaita/View/Generated/ProgressBar.swift +++ b/Sources/Adwaita/View/Generated/ProgressBar.swift @@ -2,7 +2,7 @@ // ProgressBar.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/ScrolledWindow.swift b/Sources/Adwaita/View/Generated/ScrolledWindow.swift index 9d36fb0..65b72cf 100644 --- a/Sources/Adwaita/View/Generated/ScrolledWindow.swift +++ b/Sources/Adwaita/View/Generated/ScrolledWindow.swift @@ -2,7 +2,7 @@ // ScrolledWindow.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/SearchBar.swift b/Sources/Adwaita/View/Generated/SearchBar.swift index dbbd7de..f13344e 100644 --- a/Sources/Adwaita/View/Generated/SearchBar.swift +++ b/Sources/Adwaita/View/Generated/SearchBar.swift @@ -2,7 +2,7 @@ // SearchBar.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/SearchEntry.swift b/Sources/Adwaita/View/Generated/SearchEntry.swift index 82fbace..e81aaaa 100644 --- a/Sources/Adwaita/View/Generated/SearchEntry.swift +++ b/Sources/Adwaita/View/Generated/SearchEntry.swift @@ -2,7 +2,7 @@ // SearchEntry.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/SpinRow.swift b/Sources/Adwaita/View/Generated/SpinRow.swift index c2bbd65..46479f9 100644 --- a/Sources/Adwaita/View/Generated/SpinRow.swift +++ b/Sources/Adwaita/View/Generated/SpinRow.swift @@ -2,7 +2,7 @@ // SpinRow.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Spinner.swift b/Sources/Adwaita/View/Generated/Spinner.swift index d58e1fa..ffcdda1 100644 --- a/Sources/Adwaita/View/Generated/Spinner.swift +++ b/Sources/Adwaita/View/Generated/Spinner.swift @@ -2,7 +2,7 @@ // Spinner.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/SplitButton.swift b/Sources/Adwaita/View/Generated/SplitButton.swift index 9c22f3c..bd7d0fb 100644 --- a/Sources/Adwaita/View/Generated/SplitButton.swift +++ b/Sources/Adwaita/View/Generated/SplitButton.swift @@ -2,7 +2,7 @@ // SplitButton.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/StatusPage.swift b/Sources/Adwaita/View/Generated/StatusPage.swift index acf0e90..9963d2e 100644 --- a/Sources/Adwaita/View/Generated/StatusPage.swift +++ b/Sources/Adwaita/View/Generated/StatusPage.swift @@ -2,7 +2,7 @@ // StatusPage.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/SwitchRow.swift b/Sources/Adwaita/View/Generated/SwitchRow.swift index 5c35bce..b6adbfa 100644 --- a/Sources/Adwaita/View/Generated/SwitchRow.swift +++ b/Sources/Adwaita/View/Generated/SwitchRow.swift @@ -2,7 +2,7 @@ // SwitchRow.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/ToastOverlay.swift b/Sources/Adwaita/View/Generated/ToastOverlay.swift index 7f6395f..6b9997f 100644 --- a/Sources/Adwaita/View/Generated/ToastOverlay.swift +++ b/Sources/Adwaita/View/Generated/ToastOverlay.swift @@ -2,7 +2,7 @@ // ToastOverlay.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/ToggleButton.swift b/Sources/Adwaita/View/Generated/ToggleButton.swift index 411fd14..7729572 100644 --- a/Sources/Adwaita/View/Generated/ToggleButton.swift +++ b/Sources/Adwaita/View/Generated/ToggleButton.swift @@ -2,7 +2,7 @@ // ToggleButton.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Generated/ToolbarView.swift b/Sources/Adwaita/View/Generated/ToolbarView.swift index af895ef..25fd3fe 100644 --- a/Sources/Adwaita/View/Generated/ToolbarView.swift +++ b/Sources/Adwaita/View/Generated/ToolbarView.swift @@ -2,7 +2,7 @@ // ToolbarView.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw @@ -34,8 +34,8 @@ import LevenshteinTransformations /// /// By default, top and bottom bars are flat and scrolling content has a subtle /// undershoot shadow, same as when using the -/// [`.undershoot-top`](style-classes.html#undershot-indicators) and -/// [`.undershoot-bottom`](style-classes.html#undershot-indicators) style +/// [`.undershoot-top`](style-classes.html#undershoot-indicators) and +/// [`.undershoot-bottom`](style-classes.html#undershoot-indicators) style /// classes. This works well in most cases, e.g. with [class@StatusPage] or /// [class@PreferencesPage], where the background at the top and bottom parts of /// the page is uniform. Additionally, windows with sidebars should always use diff --git a/Sources/Adwaita/View/Generated/WindowTitle.swift b/Sources/Adwaita/View/Generated/WindowTitle.swift index 1cbbb92..aa73ee0 100644 --- a/Sources/Adwaita/View/Generated/WindowTitle.swift +++ b/Sources/Adwaita/View/Generated/WindowTitle.swift @@ -2,7 +2,7 @@ // WindowTitle.swift // Adwaita // -// Created by auto-generation on 20.03.24. +// Created by auto-generation on 21.04.24. // import CAdw diff --git a/Sources/Adwaita/View/Picture+.swift b/Sources/Adwaita/View/Picture+.swift new file mode 100644 index 0000000..17fa075 --- /dev/null +++ b/Sources/Adwaita/View/Picture+.swift @@ -0,0 +1,31 @@ +// +// Picture+.swift +// Adwaita +// +// Created by david-swift on 21.04.24. +// + +import CAdw +import Foundation + +extension Picture { + + /// Load the picture from Foundation's `Data`. + /// - Parameter data: The data. + /// - Returns: The view. + public func data(_ data: Data?) -> View { + inspect { storage in + let pointer = storage.pointer + guard let data else { + gtk_picture_set_paintable(pointer, gdk_paintable_new_empty(0, 0)) + return + } + let bytes = data.withUnsafeBytes { ptr in + g_bytes_new(ptr.baseAddress, .init(data.count)) + } + let texture = gdk_texture_new_from_bytes(bytes, nil) + gtk_picture_set_paintable(pointer, texture) + } + } + +} diff --git a/Sources/Generation/GenerationConfiguration.swift b/Sources/Generation/GenerationConfiguration.swift index 6fbd6a0..3c0e653 100644 --- a/Sources/Generation/GenerationConfiguration.swift +++ b/Sources/Generation/GenerationConfiguration.swift @@ -259,7 +259,8 @@ struct GenerationConfiguration { bindings: [.init(property: "text")], excludeProperties: ["input-hints", "input-purpose"] ), - .init(class: "SearchBar") + .init(class: "SearchBar"), + .init(class: "Picture", excludeProperties: ["content-fit", "file", "paintable"]) ] /// The unshortening map. diff --git a/Tests/Demo.swift b/Tests/Demo.swift index 7812ba8..d8e5bb0 100644 --- a/Tests/Demo.swift +++ b/Tests/Demo.swift @@ -8,6 +8,7 @@ // swiftlint:disable missing_docs implicitly_unwrapped_optional no_magic_numbers import Adwaita +import Foundation @main struct Demo: App { @@ -15,11 +16,14 @@ struct Demo: App { let id = "io.github.AparokshaUI.Demo" var app: GTUIApp! + @State private var pictureURL: URL? + var scene: Scene { Window(id: "main") { window in - DemoContent(window: window, app: app) + DemoContent(window: window, app: app, pictureURL: pictureURL) } HelperWindows() + FileDialog(importer: "picture", extensions: ["jpg", "jpeg", "png", "svg"]) { pictureURL = $0 } onClose: { } } struct HelperWindows: WindowSceneGroup { @@ -75,6 +79,7 @@ struct Demo: App { @State private var about = false var window: GTUIApplicationWindow var app: GTUIApp! + var pictureURL: URL? var view: Body { OverlaySplitView(visible: $sidebarVisible) { @@ -99,7 +104,7 @@ struct Demo: App { selection.label, icon: selection.icon, description: selection.description - ) { selection.view(app: app, window: window, toast: toast) } + ) { selection.view(app: app, window: window, toast: toast, pictureURL: pictureURL) } .topToolbar { HeaderBar { Toggle(icon: .default(icon: .sidebarShow), isOn: $sidebarVisible) diff --git a/Tests/Page.swift b/Tests/Page.swift index 7b42b5a..bf91ffc 100644 --- a/Tests/Page.swift +++ b/Tests/Page.swift @@ -8,6 +8,7 @@ // swiftlint:disable missing_docs implicitly_unwrapped_optional import Adwaita +import Foundation enum Page: String, Identifiable, CaseIterable, Codable { @@ -27,6 +28,7 @@ enum Page: String, Identifiable, CaseIterable, Codable { case popover case flowBox case navigationView + case picture var id: Self { self @@ -90,12 +92,14 @@ enum Page: String, Identifiable, CaseIterable, Codable { return "Display views in a reflowing grid" case .navigationView: return "A page-based navigation container" + case .picture: + return "Display an image" } } // swiftlint:disable cyclomatic_complexity @ViewBuilder - func view(app: GTUIApp!, window: GTUIApplicationWindow, toast: Signal) -> Body { + func view(app: GTUIApp!, window: GTUIApplicationWindow, toast: Signal, pictureURL: URL?) -> Body { switch self { case .welcome: [] @@ -129,6 +133,8 @@ enum Page: String, Identifiable, CaseIterable, Codable { FlowBoxDemo() case .navigationView: NavigationViewDemo(app: app) + case .picture: + PictureDemo(url: pictureURL, app: app, window: window) } } // swiftlint:enable cyclomatic_complexity diff --git a/Tests/PictureDemo.swift b/Tests/PictureDemo.swift new file mode 100644 index 0000000..fb9dd7c --- /dev/null +++ b/Tests/PictureDemo.swift @@ -0,0 +1,41 @@ +// +// PictureDemo.swift +// Adwaita +// +// Created by david-swift on 21.04.24. +// + +// swiftlint:disable missing_docs + +import Adwaita +import CAdw +import Foundation + +struct PictureDemo: View { + + var url: URL? + var app: GTUIApp + var window: GTUIWindow + + var data: Data { + guard let url, let data = try? Data(contentsOf: url) else { + return .init() + } + return data + } + + var view: Body { + Picture() + .data(data) + Button("Import") { + app.addWindow("picture", parent: window) + } + .halign(.center) + .style("pill") + .style("suggested-action") + .padding() + } + +} + +// swiftlint:enable missing_docs