Set a scroll view's scroll bar policies
This commit is contained in:
parent
356eec00a9
commit
2d12c57236
27
Sources/Core/Model/Enumerations/ScrollbarVisibility.swift
Normal file
27
Sources/Core/Model/Enumerations/ScrollbarVisibility.swift
Normal file
@ -0,0 +1,27 @@
|
||||
//
|
||||
// ContentFit.swift
|
||||
// Adwaita
|
||||
//
|
||||
// Created by david-swift on 19.07.24.
|
||||
//
|
||||
|
||||
import CAdw
|
||||
|
||||
/// The visibility of a scroll bar.
|
||||
public enum ScrollbarVisibility: UInt32 {
|
||||
|
||||
/// The scrollbar is always visible. The view size is independent of the content.
|
||||
case alwaysVisible
|
||||
/// The scrollbar will appear and disappear as necessary.
|
||||
case automatic
|
||||
/// The scrollbar should never appear. In this mode the content determines the size.
|
||||
case never
|
||||
/// Don’t show a scrollbar, but don’t force the size to follow the content.
|
||||
case external
|
||||
|
||||
/// The ScrollbarVisibility value as a GtkPolicyType value.
|
||||
var gtkValue: GtkPolicyType {
|
||||
.init(rawValue)
|
||||
}
|
||||
|
||||
}
|
||||
@ -211,6 +211,7 @@ public struct ActionRow: AdwaitaWidget {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -97,6 +97,7 @@ public struct AspectFrame: AdwaitaWidget {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -95,6 +95,7 @@ public struct Avatar: AdwaitaWidget {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -104,6 +104,7 @@ public struct Banner: AdwaitaWidget {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -64,6 +64,7 @@ public struct Bin: AdwaitaWidget {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -140,6 +140,7 @@ public struct Box: AdwaitaWidget {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -152,6 +152,7 @@ public struct Button: AdwaitaWidget {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -112,6 +112,7 @@ public struct ButtonContent: AdwaitaWidget {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -144,6 +144,7 @@ public struct Carousel<Element>: AdwaitaWidget where Element: Identifiable {
|
||||
for (index, element) in elements.enumerated() {
|
||||
content(element).updateStorage(contentStorage[index], data: data, updateProperties: updateProperties, type: type)
|
||||
}
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -131,6 +131,7 @@ public struct CenterBox: AdwaitaWidget {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -184,6 +184,7 @@ if let active, newValue != active.wrappedValue {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -100,6 +100,7 @@ public struct Clamp: AdwaitaWidget {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -215,6 +215,7 @@ if let selected, newValue != selected.wrappedValue {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -194,6 +194,7 @@ public struct EntryRow: AdwaitaWidget {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -219,6 +219,7 @@ if let expanded, newValue != expanded.wrappedValue {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -87,6 +87,7 @@ public struct Fixed: AdwaitaWidget {
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -256,6 +256,7 @@ public struct FlowBox<Element>: AdwaitaWidget where Element: Identifiable {
|
||||
for (index, element) in elements.enumerated() {
|
||||
content(element).updateStorage(contentStorage[index], data: data, updateProperties: updateProperties, type: type)
|
||||
}
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -248,6 +248,7 @@ public struct HeaderBar: AdwaitaWidget {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -379,6 +379,7 @@ public struct Label: AdwaitaWidget {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -184,6 +184,7 @@ public struct LevelBar: AdwaitaWidget {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -168,6 +168,7 @@ public struct LinkButton: AdwaitaWidget {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -238,6 +238,7 @@ public struct ListBox<Element>: AdwaitaWidget where Element: Identifiable {
|
||||
for (index, element) in elements.enumerated() {
|
||||
content(element).updateStorage(contentStorage[index], data: data, updateProperties: updateProperties, type: type)
|
||||
}
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -193,6 +193,7 @@ if let active, newValue != active.wrappedValue {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -219,6 +219,7 @@ public struct NavigationView: AdwaitaWidget {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -131,6 +131,7 @@ public struct Overlay: AdwaitaWidget {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -245,6 +245,7 @@ if let showSidebar, newValue != showSidebar.wrappedValue {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -155,6 +155,7 @@ public struct PasswordEntryRow: AdwaitaWidget {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -111,6 +111,7 @@ public struct Picture: AdwaitaWidget {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -179,6 +179,7 @@ public struct Popover: AdwaitaWidget {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -132,6 +132,7 @@ public struct PreferencesGroup: AdwaitaWidget {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -110,6 +110,7 @@ public struct PreferencesPage: AdwaitaWidget {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -84,6 +84,7 @@ public struct PreferencesRow: AdwaitaWidget {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -130,6 +130,7 @@ public struct ProgressBar: AdwaitaWidget {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -101,6 +101,11 @@ public struct ScrolledWindow: AdwaitaWidget {
|
||||
var child: (() -> Body)?
|
||||
/// Whether to draw a frame around the contents.
|
||||
var hasFrame: Bool?
|
||||
/// When the horizontal scrollbar is displayed.
|
||||
///
|
||||
/// Use [method@Gtk.ScrolledWindow.set_policy] to set
|
||||
/// this property.
|
||||
var hscrollbarPolicy: ScrollbarVisibility?
|
||||
/// Whether kinetic scrolling is enabled or not.
|
||||
///
|
||||
/// Kinetic scrolling only applies to devices with source %GDK_SOURCE_TOUCHSCREEN.
|
||||
@ -134,6 +139,11 @@ public struct ScrolledWindow: AdwaitaWidget {
|
||||
/// This is useful in cases where an attempt should be made to allocate exactly
|
||||
/// enough space for the natural size of the child.
|
||||
var propagateNaturalWidth: Bool?
|
||||
/// When the vertical scrollbar is displayed.
|
||||
///
|
||||
/// Use [method@Gtk.ScrolledWindow.set_policy] to set
|
||||
/// this property.
|
||||
var vscrollbarPolicy: ScrollbarVisibility?
|
||||
/// Emitted whenever user initiated scrolling makes the scrolled
|
||||
/// window firmly surpass the limits defined by the adjustment
|
||||
/// in that orientation.
|
||||
@ -255,6 +265,16 @@ public struct ScrolledWindow: AdwaitaWidget {
|
||||
}
|
||||
|
||||
|
||||
|
||||
if hscrollbarPolicy != (storage.previousState as? Self)?.hscrollbarPolicy
|
||||
|| vscrollbarPolicy != (storage.previousState as? Self)?.vscrollbarPolicy {
|
||||
gtk_scrolled_window_set_policy(
|
||||
widget,
|
||||
(hscrollbarPolicy ?? .automatic).gtkValue,
|
||||
(vscrollbarPolicy ?? .automatic).gtkValue
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
@ -291,6 +311,16 @@ public struct ScrolledWindow: AdwaitaWidget {
|
||||
return newSelf
|
||||
}
|
||||
|
||||
/// When the horizontal scrollbar is displayed.
|
||||
///
|
||||
/// Use [method@Gtk.ScrolledWindow.set_policy] to set
|
||||
/// this property.
|
||||
public func hscrollbarPolicy(_ hscrollbarPolicy: ScrollbarVisibility?) -> Self {
|
||||
var newSelf = self
|
||||
newSelf.hscrollbarPolicy = hscrollbarPolicy
|
||||
return newSelf
|
||||
}
|
||||
|
||||
/// Whether kinetic scrolling is enabled or not.
|
||||
///
|
||||
/// Kinetic scrolling only applies to devices with source %GDK_SOURCE_TOUCHSCREEN.
|
||||
@ -364,6 +394,16 @@ public struct ScrolledWindow: AdwaitaWidget {
|
||||
return newSelf
|
||||
}
|
||||
|
||||
/// When the vertical scrollbar is displayed.
|
||||
///
|
||||
/// Use [method@Gtk.ScrolledWindow.set_policy] to set
|
||||
/// this property.
|
||||
public func vscrollbarPolicy(_ vscrollbarPolicy: ScrollbarVisibility?) -> Self {
|
||||
var newSelf = self
|
||||
newSelf.vscrollbarPolicy = vscrollbarPolicy
|
||||
return newSelf
|
||||
}
|
||||
|
||||
/// Emitted whenever user initiated scrolling makes the scrolled
|
||||
/// window firmly surpass the limits defined by the adjustment
|
||||
/// in that orientation.
|
||||
|
||||
@ -128,6 +128,7 @@ public struct SearchBar: AdwaitaWidget {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -273,6 +273,7 @@ if let text, newValue != text.wrappedValue {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -66,6 +66,7 @@ public struct Separator: AdwaitaWidget {
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -236,6 +236,7 @@ if let value, newValue != value.wrappedValue {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -70,6 +70,7 @@ public struct Spinner: AdwaitaWidget {
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -178,6 +178,7 @@ public struct SplitButton: AdwaitaWidget {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -97,6 +97,7 @@ public struct StatusPage: AdwaitaWidget {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -180,6 +180,7 @@ if let active, newValue != active.wrappedValue {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -91,6 +91,7 @@ public struct ToastOverlay: AdwaitaWidget {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -209,6 +209,7 @@ if let active, newValue != active.wrappedValue {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -224,6 +224,7 @@ public struct ToolbarView: AdwaitaWidget {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -73,6 +73,7 @@ public struct WindowTitle: AdwaitaWidget {
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -85,11 +85,13 @@ struct Demo: App {
|
||||
ScrollView {
|
||||
List(Page.allCases, selection: $selection) { element in
|
||||
Text(element.label)
|
||||
.ellipsize()
|
||||
.halign(.start)
|
||||
.padding()
|
||||
}
|
||||
.sidebarStyle()
|
||||
}
|
||||
.hscrollbarPolicy(.never)
|
||||
.topToolbar {
|
||||
HeaderBar.end {
|
||||
menu
|
||||
|
||||
@ -48,7 +48,7 @@ enum Page: String, Identifiable, CaseIterable, Codable, CustomStringConvertible
|
||||
case .alertDialog:
|
||||
return "Alert Dialog"
|
||||
case .passwordChecker:
|
||||
return "Password Checker"
|
||||
return "Password Checker is such a long name..."
|
||||
default:
|
||||
return rawValue.capitalized
|
||||
}
|
||||
|
||||
@ -77,6 +77,15 @@ extension Class {
|
||||
// swiftlint:enable fatal_error
|
||||
}
|
||||
|
||||
/// Generate the custom setters.
|
||||
/// - Parameter config: The widget configuration.
|
||||
/// - Returns: The code.
|
||||
func generateManualSetters(
|
||||
config: WidgetConfiguration
|
||||
) -> String {
|
||||
config.setters.map { "\n\($0)\n" }.joined()
|
||||
}
|
||||
|
||||
/// Generate the assignments for the widgets and menus.
|
||||
/// - Parameters:
|
||||
/// - config: The widget configuration.
|
||||
|
||||
@ -118,6 +118,7 @@ struct Class: ClassLike, Decodable {
|
||||
\(generateBindingAssignments(config: config, genConfig: genConfig, namespace: namespace, configs: configs))
|
||||
\(generateModifications(config: config, genConfig: genConfig, namespace: namespace, configs: configs))
|
||||
\(generateDynamicWidgetUpdate(config: config, genConfig: genConfig))
|
||||
\(generateManualSetters(config: config))
|
||||
}
|
||||
for function in updateFunctions {
|
||||
function(storage, data, updateProperties)
|
||||
|
||||
@ -240,10 +240,20 @@ struct GenerationConfiguration {
|
||||
class: "ScrolledWindow",
|
||||
excludeProperties: [
|
||||
"hadjustment",
|
||||
"hscrollbar-policy",
|
||||
"vadjustment",
|
||||
"vscrollbar-policy",
|
||||
"window-placement"
|
||||
],
|
||||
setters: [
|
||||
"""
|
||||
if hscrollbarPolicy != (storage.previousState as? Self)?.hscrollbarPolicy
|
||||
|| vscrollbarPolicy != (storage.previousState as? Self)?.vscrollbarPolicy {
|
||||
gtk_scrolled_window_set_policy(
|
||||
widget,
|
||||
(hscrollbarPolicy ?? .automatic).gtkValue,
|
||||
(vscrollbarPolicy ?? .automatic).gtkValue
|
||||
)
|
||||
}
|
||||
"""
|
||||
]
|
||||
),
|
||||
.init(class: "Overlay", staticWidgets: [.init(name: "overlay", add: "gtk_overlay_add_overlay")]),
|
||||
@ -298,7 +308,8 @@ struct GenerationConfiguration {
|
||||
"GdkPixbuf*": "OpaquePointer",
|
||||
"GdkPaintable*": "OpaquePointer",
|
||||
"NavigationPage": "NavigationPage",
|
||||
"ContentFit": "ContentFit"
|
||||
"ContentFit": "ContentFit",
|
||||
"PolicyType": "ScrollbarVisibility"
|
||||
]
|
||||
|
||||
/// Modifications for converting a Swift into a C type.
|
||||
@ -306,7 +317,8 @@ struct GenerationConfiguration {
|
||||
"Bool": "cBool",
|
||||
"Int": "cInt",
|
||||
"UInt": "cInt",
|
||||
"ContentFit": "gtkValue"
|
||||
"ContentFit": "gtkValue",
|
||||
"ScrollbarVisibility": "gtkValue"
|
||||
]
|
||||
|
||||
/// Default values for modifiers with a certain type.
|
||||
|
||||
@ -34,6 +34,8 @@ struct WidgetConfiguration {
|
||||
var setConditions: [String: String] = [:]
|
||||
/// Properties that are set in the end of an update.
|
||||
var lastProperties: [String] = []
|
||||
/// Manually add setters which do not follow common practices.
|
||||
var setters: [String] = []
|
||||
|
||||
/// The configuration for a binding.
|
||||
struct BindingConfiguration {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user