From 90e8c781633eabd0a291647cfdd1c91a57cb93b3 Mon Sep 17 00:00:00 2001 From: david-swift Date: Mon, 3 Nov 2025 22:28:28 +0100 Subject: [PATCH] Add support for toggle groups --- .../Adwaita/View/Generated/ActionRow.swift | 2 +- .../Adwaita/View/Generated/AspectFrame.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/DropDown.swift | 2 +- Sources/Adwaita/View/Generated/Entry.swift | 2 +- Sources/Adwaita/View/Generated/EntryRow.swift | 2 +- .../Adwaita/View/Generated/ExpanderRow.swift | 2 +- Sources/Adwaita/View/Generated/Fixed.swift | 2 +- Sources/Adwaita/View/Generated/FlowBox.swift | 2 +- .../Adwaita/View/Generated/HeaderBar.swift | 2 +- Sources/Adwaita/View/Generated/Image.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 | 2 +- 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 +- .../Adwaita/View/Generated/Separator.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/ToggleGroup.swift | 190 ++++++++++++++++++ .../Adwaita/View/Generated/ToolbarView.swift | 2 +- .../Adwaita/View/Generated/WindowTitle.swift | 2 +- Sources/Adwaita/View/ToggleGroup+.swift | 105 ++++++++++ Sources/Demo/Page.swift | 7 + Sources/Demo/ToggleGroupDemo.swift | 46 +++++ .../Generation/GenerationConfiguration.swift | 7 +- 54 files changed, 403 insertions(+), 50 deletions(-) create mode 100644 Sources/Adwaita/View/Generated/ToggleGroup.swift create mode 100644 Sources/Adwaita/View/ToggleGroup+.swift create mode 100644 Sources/Demo/ToggleGroupDemo.swift diff --git a/Sources/Adwaita/View/Generated/ActionRow.swift b/Sources/Adwaita/View/Generated/ActionRow.swift index 7932ee4..0e06cc6 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/AspectFrame.swift b/Sources/Adwaita/View/Generated/AspectFrame.swift index 5e0062a..22d56ca 100644 --- a/Sources/Adwaita/View/Generated/AspectFrame.swift +++ b/Sources/Adwaita/View/Generated/AspectFrame.swift @@ -2,7 +2,7 @@ // AspectFrame.swift // Adwaita // -// Created by auto-generation on 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Avatar.swift b/Sources/Adwaita/View/Generated/Avatar.swift index 1cc78aa..8e0188f 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Banner.swift b/Sources/Adwaita/View/Generated/Banner.swift index e4592b1..2112039 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Bin.swift b/Sources/Adwaita/View/Generated/Bin.swift index eb217e8..944dc71 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Box.swift b/Sources/Adwaita/View/Generated/Box.swift index 093a3aa..4027283 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Button.swift b/Sources/Adwaita/View/Generated/Button.swift index 2492182..e63e6b4 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/ButtonContent.swift b/Sources/Adwaita/View/Generated/ButtonContent.swift index efb219c..3d442a6 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Carousel.swift b/Sources/Adwaita/View/Generated/Carousel.swift index 78a9137..0e31234 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/CenterBox.swift b/Sources/Adwaita/View/Generated/CenterBox.swift index 7c9e229..47901ed 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/CheckButton.swift b/Sources/Adwaita/View/Generated/CheckButton.swift index f62af33..ab1c44e 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Clamp.swift b/Sources/Adwaita/View/Generated/Clamp.swift index 0d02391..61aa15f 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/ComboRow.swift b/Sources/Adwaita/View/Generated/ComboRow.swift index ec56bd9..4cb4ebd 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/DropDown.swift b/Sources/Adwaita/View/Generated/DropDown.swift index c1936cc..a42e28d 100644 --- a/Sources/Adwaita/View/Generated/DropDown.swift +++ b/Sources/Adwaita/View/Generated/DropDown.swift @@ -2,7 +2,7 @@ // DropDown.swift // Adwaita // -// Created by auto-generation on 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Entry.swift b/Sources/Adwaita/View/Generated/Entry.swift index a0f6f95..f4f9476 100644 --- a/Sources/Adwaita/View/Generated/Entry.swift +++ b/Sources/Adwaita/View/Generated/Entry.swift @@ -2,7 +2,7 @@ // Entry.swift // Adwaita // -// Created by auto-generation on 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/EntryRow.swift b/Sources/Adwaita/View/Generated/EntryRow.swift index b4abf7f..97310dc 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/ExpanderRow.swift b/Sources/Adwaita/View/Generated/ExpanderRow.swift index 0b100e9..44a4846 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Fixed.swift b/Sources/Adwaita/View/Generated/Fixed.swift index 9719fb0..d28dde3 100644 --- a/Sources/Adwaita/View/Generated/Fixed.swift +++ b/Sources/Adwaita/View/Generated/Fixed.swift @@ -2,7 +2,7 @@ // Fixed.swift // Adwaita // -// Created by auto-generation on 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/FlowBox.swift b/Sources/Adwaita/View/Generated/FlowBox.swift index 1a78e81..b224ba4 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/HeaderBar.swift b/Sources/Adwaita/View/Generated/HeaderBar.swift index 73dd20d..79c04a6 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Image.swift b/Sources/Adwaita/View/Generated/Image.swift index c59d15d..fea4e52 100644 --- a/Sources/Adwaita/View/Generated/Image.swift +++ b/Sources/Adwaita/View/Generated/Image.swift @@ -2,7 +2,7 @@ // Image.swift // Adwaita // -// Created by auto-generation on 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Label.swift b/Sources/Adwaita/View/Generated/Label.swift index 7ed34e7..d073189 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/LevelBar.swift b/Sources/Adwaita/View/Generated/LevelBar.swift index f1cbe6e..f95e429 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/LinkButton.swift b/Sources/Adwaita/View/Generated/LinkButton.swift index a177b83..9011edf 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/ListBox.swift b/Sources/Adwaita/View/Generated/ListBox.swift index 3e1988a..b44a07c 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Menu.swift b/Sources/Adwaita/View/Generated/Menu.swift index 05ffa70..d2556c5 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/NavigationView.swift b/Sources/Adwaita/View/Generated/NavigationView.swift index c6ff408..636eea8 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Overlay.swift b/Sources/Adwaita/View/Generated/Overlay.swift index e4ad198..f4f58c4 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/OverlaySplitView.swift b/Sources/Adwaita/View/Generated/OverlaySplitView.swift index 8228f68..0b2be31 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/PasswordEntryRow.swift b/Sources/Adwaita/View/Generated/PasswordEntryRow.swift index 264db63..9d78b25 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Picture.swift b/Sources/Adwaita/View/Generated/Picture.swift index addd104..ff39c2d 100644 --- a/Sources/Adwaita/View/Generated/Picture.swift +++ b/Sources/Adwaita/View/Generated/Picture.swift @@ -2,7 +2,7 @@ // Picture.swift // Adwaita // -// Created by auto-generation on 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Popover.swift b/Sources/Adwaita/View/Generated/Popover.swift index 3a9966a..e0764e8 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/PreferencesGroup.swift b/Sources/Adwaita/View/Generated/PreferencesGroup.swift index 2b5718c..52c7375 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/PreferencesPage.swift b/Sources/Adwaita/View/Generated/PreferencesPage.swift index e5ab570..96489da 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/PreferencesRow.swift b/Sources/Adwaita/View/Generated/PreferencesRow.swift index 02be8af..a91d8ec 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/ProgressBar.swift b/Sources/Adwaita/View/Generated/ProgressBar.swift index e46332c..045d3b0 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/ScrolledWindow.swift b/Sources/Adwaita/View/Generated/ScrolledWindow.swift index 923a1e2..f509421 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/SearchBar.swift b/Sources/Adwaita/View/Generated/SearchBar.swift index 585010e..5def1c6 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/SearchEntry.swift b/Sources/Adwaita/View/Generated/SearchEntry.swift index 3d702b1..60c4fa3 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Separator.swift b/Sources/Adwaita/View/Generated/Separator.swift index bb4a309..a5f3aa0 100644 --- a/Sources/Adwaita/View/Generated/Separator.swift +++ b/Sources/Adwaita/View/Generated/Separator.swift @@ -2,7 +2,7 @@ // Separator.swift // Adwaita // -// Created by auto-generation on 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/SpinRow.swift b/Sources/Adwaita/View/Generated/SpinRow.swift index 088137f..42b31df 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/Spinner.swift b/Sources/Adwaita/View/Generated/Spinner.swift index 5831839..ae61470 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/SplitButton.swift b/Sources/Adwaita/View/Generated/SplitButton.swift index d1295a4..3dfece7 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/StatusPage.swift b/Sources/Adwaita/View/Generated/StatusPage.swift index 3caa606..39cb751 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/SwitchRow.swift b/Sources/Adwaita/View/Generated/SwitchRow.swift index 8083442..ad999af 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/ToastOverlay.swift b/Sources/Adwaita/View/Generated/ToastOverlay.swift index b661712..809c267 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/ToggleButton.swift b/Sources/Adwaita/View/Generated/ToggleButton.swift index 45f802a..c09eaea 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/ToggleGroup.swift b/Sources/Adwaita/View/Generated/ToggleGroup.swift new file mode 100644 index 0000000..3d6c795 --- /dev/null +++ b/Sources/Adwaita/View/Generated/ToggleGroup.swift @@ -0,0 +1,190 @@ +// +// ToggleGroup.swift +// Adwaita +// +// Created by auto-generation on 03.11.25. +// + +import CAdw +import LevenshteinTransformations + +/// A group of exclusive toggles. +/// +/// +/// +/// `AdwToggleGroup` presents a set of exclusive toggles, represented as +/// `Toggle` objects. Each toggle can display an icon, a label, an icon +/// and a label, or a custom child. +/// +/// Toggles are indexed by their position, with the first toggle being equivalent +/// to 0, and so on. Use the ``active(_:)`` to get that position. +/// +/// Toggles can also have optional names, set via the ``name(_:)`` +/// property. The name of the active toggle can be accessed via the +/// ``activeName(_:)`` property. +/// +/// `AdwToggle` objects can be retrieved via their index or name, using +/// `ToggleGroup.get_toggle` or `ToggleGroup.get_toggle_by_name` +/// respectively. `AdwToggleGroup` also provides a `Gtk.SelectionModel` of +/// its toggles via the ``toggles(_:)`` property. +/// +/// `AdwToggleGroup` is orientable, and the toggles can be displayed horizontally +/// or vertically. This is mostly useful for icon-only toggles. +/// +/// Use the ``homogeneous(_:)`` property to make the toggles take +/// the same size, and the ``canShrink(_:)`` to control whether +/// the toggles can ellipsize. +/// +/// Example of an `AdwToggleGroup` UI definition: +/// +/// ```xml +/// picturecamera-photo-symbolicPicture Modepicturecamera-video-symbolicRecording Moderecording +/// ``` +/// +/// See also: `InlineViewSwitcher`. +/// +/// +public struct ToggleGroup: AdwaitaWidget { + + /// Additional update functions for type extensions. + var updateFunctions: [(ViewStorage, WidgetData, Bool) -> Void] = [] + /// Additional appear functions for type extensions. + var appearFunctions: [(ViewStorage, WidgetData) -> Void] = [] + + /// The index of the active toggle. + /// + /// Setting the index to a larger value than the number of toggles in the group + /// unsets the current active toggle. + /// + /// If no toggle is active, the property will be set to + /// `Gtk.INVALID_LIST_POSITION`. + var active: Binding? + /// The name of the active toggle. + /// + /// The name can be set via ``name(_:)``. If the currently active + /// toggle doesn't have a name, the property will be set to `NULL`. + /// + /// Set it to `NULL` to unset the current active toggle. + var activeName: Binding? + /// Whether the toggles can be smaller than the natural size of their contents. + /// + /// If set to `true`, the toggle labels will ellipsize. + /// + /// See ``canShrink(_:)``. + var canShrink: Bool? + /// Whether all toggles take the same size. + var homogeneous: Bool? + /// The number of toggles within the group. + var nToggles: Binding? + + /// Initialize `ToggleGroup`. + public init() { + } + + /// The view storage. + /// - Parameters: + /// - modifiers: Modify views before being updated. + /// - type: The view render data type. + /// - Returns: The view storage. + public func container(data: WidgetData, type: Data.Type) -> ViewStorage where Data: ViewRenderData { + let storage = ViewStorage(adw_toggle_group_new()?.opaque()) + for function in appearFunctions { + function(storage, data) + } + update(storage, data: data, updateProperties: true, type: type) + + return storage + } + + /// Update the stored content. + /// - Parameters: + /// - storage: The storage to update. + /// - modifiers: Modify views before being updated + /// - updateProperties: Whether to update the view's properties. + /// - type: The view render data type. + public func update(_ storage: ViewStorage, data: WidgetData, updateProperties: Bool, type: Data.Type) where Data: ViewRenderData { + storage.modify { widget in + + storage.notify(name: "active") { + let newValue = UInt(adw_toggle_group_get_active(storage.opaquePointer)) +if let active, newValue != active.wrappedValue { + active.wrappedValue = newValue +} + } + storage.notify(name: "active-name") { + let newValue = String(cString: adw_toggle_group_get_active_name(storage.opaquePointer)) +if let activeName, newValue != activeName.wrappedValue { + activeName.wrappedValue = newValue +} + } + storage.notify(name: "n-toggles") { + let newValue = UInt(adw_toggle_group_get_n_toggles(storage.opaquePointer)) +if let nToggles, newValue != nToggles.wrappedValue { + nToggles.wrappedValue = newValue +} + } + if let active, updateProperties, (UInt(adw_toggle_group_get_active(storage.opaquePointer))) != active.wrappedValue { + adw_toggle_group_set_active(storage.opaquePointer, active.wrappedValue.cInt) + } + if let activeName, updateProperties, (String(cString: adw_toggle_group_get_active_name(storage.opaquePointer))) != activeName.wrappedValue { + adw_toggle_group_set_active_name(storage.opaquePointer, activeName.wrappedValue) + } + if let canShrink, updateProperties, (storage.previousState as? Self)?.canShrink != canShrink { + adw_toggle_group_set_can_shrink(widget, canShrink.cBool) + } + if let homogeneous, updateProperties, (storage.previousState as? Self)?.homogeneous != homogeneous { + adw_toggle_group_set_homogeneous(widget, homogeneous.cBool) + } + + + + } + for function in updateFunctions { + function(storage, data, updateProperties) + } + if updateProperties { + storage.previousState = self + } + } + + /// The index of the active toggle. + /// + /// Setting the index to a larger value than the number of toggles in the group + /// unsets the current active toggle. + /// + /// If no toggle is active, the property will be set to + /// `Gtk.INVALID_LIST_POSITION`. + public func active(_ active: Binding?) -> Self { + modify { $0.active = active } + } + + /// The name of the active toggle. + /// + /// The name can be set via ``name(_:)``. If the currently active + /// toggle doesn't have a name, the property will be set to `NULL`. + /// + /// Set it to `NULL` to unset the current active toggle. + public func activeName(_ activeName: Binding?) -> Self { + modify { $0.activeName = activeName } + } + + /// Whether the toggles can be smaller than the natural size of their contents. + /// + /// If set to `true`, the toggle labels will ellipsize. + /// + /// See ``canShrink(_:)``. + public func canShrink(_ canShrink: Bool? = true) -> Self { + modify { $0.canShrink = canShrink } + } + + /// Whether all toggles take the same size. + public func homogeneous(_ homogeneous: Bool? = true) -> Self { + modify { $0.homogeneous = homogeneous } + } + + /// The number of toggles within the group. + public func nToggles(_ nToggles: Binding?) -> Self { + modify { $0.nToggles = nToggles } + } + +} diff --git a/Sources/Adwaita/View/Generated/ToolbarView.swift b/Sources/Adwaita/View/Generated/ToolbarView.swift index 885f9fc..616a212 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/Generated/WindowTitle.swift b/Sources/Adwaita/View/Generated/WindowTitle.swift index 9481bb1..ee7e7e5 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 31.10.25. +// Created by auto-generation on 03.11.25. // import CAdw diff --git a/Sources/Adwaita/View/ToggleGroup+.swift b/Sources/Adwaita/View/ToggleGroup+.swift new file mode 100644 index 0000000..c53cc55 --- /dev/null +++ b/Sources/Adwaita/View/ToggleGroup+.swift @@ -0,0 +1,105 @@ +// +// ToggleGroup+.swift +// Adwaita +// +// Created by david-swift on 03.11.25. +// + +import CAdw +import LevenshteinTransformations + +extension ToggleGroup { + + /// The identifier for the values. + static var values: String { "values" } + /// The identifier for the toggles. + static var toggle: String { "Toggle::" } + + /// Initialize a toggle group. + /// - Parameters: + /// - selection: The selected value. + /// - values: The available values. + public init( + selection: Binding, + values: [Element] + ) where Element: ToggleGroupItem { + self.init() + appearFunctions.append { storage, _ in + storage.notify(name: "active-name", id: "init") { + if let name = adw_toggle_group_get_active_name(storage.opaquePointer), + let values = storage.fields[Self.values] as? [Element], + let value = values.first(where: { $0.id.description == String(cString: name) }) { + selection.wrappedValue = value.id + } + } + Self.updateContent( + storage: storage, + selection: selection.wrappedValue, + values: values, + updateProperties: true + ) + } + updateFunctions.append { storage, _, updateProperties in + Self.updateContent( + storage: storage, + selection: selection.wrappedValue, + values: values, + updateProperties: updateProperties + ) + } + } + + /// Update the combo row's content. + /// - Parameters: + /// - storage: The view storage. + /// - values: The elements. + /// - updateProperties: Whether to update the properties. + static func updateContent( + storage: ViewStorage, + selection: Element.ID, + values: [Element], + updateProperties: Bool + ) where Element: ToggleGroupItem { + guard updateProperties else { + return + } + let old = storage.fields[Self.values] as? [Element] ?? [] + old.identifiableTransform( + to: values, + functions: .init { index in + if let id = old[safe: index]?.id.description, + let toggle = storage.fields[Self.toggle + id] as? OpaquePointer { + adw_toggle_group_remove(storage.opaquePointer, toggle) + } + } insert: { _, element in + let toggle = adw_toggle_new() + adw_toggle_set_name(toggle, element.id.description) + if element.showLabel { + adw_toggle_set_label(toggle, element.id.description) + } else { + adw_toggle_set_tooltip(toggle, element.id.description) + } + if let icon = element.icon { + adw_toggle_set_icon_name(toggle, icon.string) + } + storage.fields[Self.toggle + element.id.description] = toggle + adw_toggle_group_add(storage.opaquePointer, toggle) + } + ) + storage.fields[Self.values] = values + adw_toggle_group_set_active_name(storage.opaquePointer, selection.description) + } + +} + +/// An item of a toggle group. +public protocol ToggleGroupItem: Identifiable where Self.ID: CustomStringConvertible { + + /// The item's icon. + var icon: Icon? { get } + /// Whether to show the label in the UI (the identifier's string conversion). + /// + /// Otherwise, it will be used as the tooltip. + var showLabel: Bool { get } + +} diff --git a/Sources/Demo/Page.swift b/Sources/Demo/Page.swift index df94fa7..8ae7b0a 100644 --- a/Sources/Demo/Page.swift +++ b/Sources/Demo/Page.swift @@ -35,6 +35,7 @@ enum Page: String, Identifiable, CaseIterable, Codable, CustomStringConvertible case textEditor case splitView case symbol + case toggleGroup var id: Self { self @@ -56,6 +57,8 @@ enum Page: String, Identifiable, CaseIterable, Codable, CustomStringConvertible return "Text Editor" case .splitView: return "Split View" + case .toggleGroup: + return "Toggle Group" default: return rawValue.capitalized } @@ -118,6 +121,8 @@ enum Page: String, Identifiable, CaseIterable, Codable, CustomStringConvertible return "A split view whose panes are ajustable in size" case .symbol: return "Display a symbolic image" + case .toggleGroup: + return "Select an item" } } @@ -171,6 +176,8 @@ enum Page: String, Identifiable, CaseIterable, Codable, CustomStringConvertible SplitViewDemo() case .symbol: SymbolDemo() + case .toggleGroup: + ToggleGroupDemo() } } // swiftlint:enable cyclomatic_complexity diff --git a/Sources/Demo/ToggleGroupDemo.swift b/Sources/Demo/ToggleGroupDemo.swift new file mode 100644 index 0000000..1272130 --- /dev/null +++ b/Sources/Demo/ToggleGroupDemo.swift @@ -0,0 +1,46 @@ +// +// ToggleGroupDemo.swift +// Adwaita +// +// Created by david-swift on 03.11.25. +// + +// swiftlint:disable missing_docs no_magic_numbers + +import Adwaita +import Foundation + +struct ToggleGroupDemo: View { + + @State private var selection: Subview = .view1 + + var view: Body { + ToggleGroup(selection: $selection, values: Subview.allCases) + .padding() + VStack { + Text(selection.rawValue) + .padding() + .padding(50, .vertical) + } + .card() + .padding() + } + + enum Subview: String, ToggleGroupItem, CaseIterable, CustomStringConvertible { + + case view1 = "View 1" + case view2 = "View 2" + + var id: Self { self } + + var description: String { rawValue } + + var icon: Icon? { nil } + + var showLabel: Bool { true } + + } + +} + +// swiftlint:enable missing_docs no_magic_numbers diff --git a/Sources/Generation/GenerationConfiguration.swift b/Sources/Generation/GenerationConfiguration.swift index 2170757..88de1af 100644 --- a/Sources/Generation/GenerationConfiguration.swift +++ b/Sources/Generation/GenerationConfiguration.swift @@ -162,7 +162,12 @@ struct GenerationConfiguration { class: "NavigationView", excludeProperties: ["navigation-stack", "visible-page"] ), - .init(class: "Spinner") + .init(class: "Spinner"), + .init( + class: "ToggleGroup", + bindings: [.init(property: "active"), .init(property: "active-name"), .init(property: "n-toggles")], + excludeProperties: ["toggles"] + ) ] /// The Gtk widgets.