mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-06 01:45:36 +00:00
all: [API] replace unit.Value with separate unit.Dp, unit.Sp types
The unit.Value is a struct and thus more inconvenient to use than its
underlying float32 type. In addition, most uses don't need a general
value, but rather a specific unit given by the context. This change
replaces unit.Value with two float32 units, Dp and Sp. It also changes
variables and parameters of unit.Value to a specific unit type matching
the context. That is, unit.Dp everywhere except for text sizes which are
in Sp.
Switching to typed float32s has multiple advantages
- They can be constants:
const touchSlop = unit.Dp(16)
- Casting untyped constants is no longer necessary:
insets := layout.UniformInset(16)
- Calculation with values is natural:
func (s ScrollbarStyle) Width() unit.Dp {
return s.Indicator.MinorWidth + s.Track.MinorPadding + s.Track.MinorPadding
}
The main API change is that calls to gtx.Px must be replaced with either
gtx.Dp or gtx.Sp depending on the unit.
Idea by Christophe Meessen.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
+16
-16
@@ -50,7 +50,7 @@ type ScrollTrackStyle struct {
|
||||
// MajorPadding and MinorPadding along the major and minor axis of the
|
||||
// scrollbar's track. This is used to keep the scrollbar from touching
|
||||
// the edges of the content area.
|
||||
MajorPadding, MinorPadding unit.Value
|
||||
MajorPadding, MinorPadding unit.Dp
|
||||
// Color of the track background.
|
||||
Color color.NRGBA
|
||||
}
|
||||
@@ -59,16 +59,16 @@ type ScrollTrackStyle struct {
|
||||
type ScrollIndicatorStyle struct {
|
||||
// MajorMinLen is the smallest that the scroll indicator is allowed to
|
||||
// be along the major axis.
|
||||
MajorMinLen unit.Value
|
||||
MajorMinLen unit.Dp
|
||||
// MinorWidth is the width of the scroll indicator across the minor axis.
|
||||
MinorWidth unit.Value
|
||||
MinorWidth unit.Dp
|
||||
// Color and HoverColor are the normal and hovered colors of the scroll
|
||||
// indicator.
|
||||
Color, HoverColor color.NRGBA
|
||||
// CornerRadius is the corner radius of the rectangular indicator. 0
|
||||
// will produce square corners. 0.5*MinorWidth will produce perfectly
|
||||
// round corners.
|
||||
CornerRadius unit.Value
|
||||
CornerRadius unit.Dp
|
||||
}
|
||||
|
||||
// ScrollbarStyle configures the presentation of a scrollbar.
|
||||
@@ -89,13 +89,13 @@ func Scrollbar(th *Theme, state *widget.Scrollbar) ScrollbarStyle {
|
||||
return ScrollbarStyle{
|
||||
Scrollbar: state,
|
||||
Track: ScrollTrackStyle{
|
||||
MajorPadding: unit.Dp(2),
|
||||
MinorPadding: unit.Dp(2),
|
||||
MajorPadding: 2,
|
||||
MinorPadding: 2,
|
||||
},
|
||||
Indicator: ScrollIndicatorStyle{
|
||||
MajorMinLen: unit.Dp(8),
|
||||
MinorWidth: unit.Dp(6),
|
||||
CornerRadius: unit.Dp(3),
|
||||
MajorMinLen: 8,
|
||||
MinorWidth: 6,
|
||||
CornerRadius: 3,
|
||||
Color: lightFg,
|
||||
HoverColor: darkFg,
|
||||
},
|
||||
@@ -104,8 +104,8 @@ func Scrollbar(th *Theme, state *widget.Scrollbar) ScrollbarStyle {
|
||||
|
||||
// Width returns the minor axis width of the scrollbar in its current
|
||||
// configuration (taking padding for the scroll track into account).
|
||||
func (s ScrollbarStyle) Width(metric unit.Metric) unit.Value {
|
||||
return unit.Add(metric, s.Indicator.MinorWidth, s.Track.MinorPadding, s.Track.MinorPadding)
|
||||
func (s ScrollbarStyle) Width() unit.Dp {
|
||||
return s.Indicator.MinorWidth + s.Track.MinorPadding + s.Track.MinorPadding
|
||||
}
|
||||
|
||||
// Layout the scrollbar.
|
||||
@@ -119,7 +119,7 @@ func (s ScrollbarStyle) Layout(gtx layout.Context, axis layout.Axis, viewportSta
|
||||
convert := axis.Convert
|
||||
maxMajorAxis := convert(gtx.Constraints.Max).X
|
||||
gtx.Constraints.Min.X = maxMajorAxis
|
||||
gtx.Constraints.Min.Y = gtx.Px(s.Width(gtx.Metric))
|
||||
gtx.Constraints.Min.Y = gtx.Dp(s.Width())
|
||||
gtx.Constraints.Min = convert(gtx.Constraints.Min)
|
||||
gtx.Constraints.Max = gtx.Constraints.Min
|
||||
|
||||
@@ -179,15 +179,15 @@ func (s ScrollbarStyle) layout(gtx layout.Context, axis layout.Axis, viewportSta
|
||||
trackLen := gtx.Constraints.Min.X
|
||||
viewStart := int(math.Round(float64(viewportStart) * float64(trackLen)))
|
||||
viewEnd := int(math.Round(float64(viewportEnd) * float64(trackLen)))
|
||||
indicatorLen := max(viewEnd-viewStart, gtx.Px(s.Indicator.MajorMinLen))
|
||||
indicatorLen := max(viewEnd-viewStart, gtx.Dp(s.Indicator.MajorMinLen))
|
||||
if viewStart+indicatorLen > trackLen {
|
||||
viewStart = trackLen - indicatorLen
|
||||
}
|
||||
indicatorDims := axis.Convert(image.Point{
|
||||
X: indicatorLen,
|
||||
Y: gtx.Px(s.Indicator.MinorWidth),
|
||||
Y: gtx.Dp(s.Indicator.MinorWidth),
|
||||
})
|
||||
radius := gtx.Px(s.Indicator.CornerRadius)
|
||||
radius := gtx.Dp(s.Indicator.CornerRadius)
|
||||
|
||||
// Lay out the indicator.
|
||||
offset := axis.Convert(image.Pt(viewStart, 0))
|
||||
@@ -247,7 +247,7 @@ func (l ListStyle) Layout(gtx layout.Context, length int, w layout.ListElement)
|
||||
originalConstraints := gtx.Constraints
|
||||
|
||||
// Determine how much space the scrollbar occupies.
|
||||
barWidth := gtx.Px(l.Width(gtx.Metric))
|
||||
barWidth := gtx.Dp(l.Width())
|
||||
|
||||
if l.AnchorStrategy == Occupy {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user