feat(usecase): round persisted split ratios to avoid noisy floats
- commit
- 2a1e87915fb1c8fcadfb65dcd15361c70ac26556
- author
- brice · · 2025-12-26 08:01 UTC
- parent
- c4aef32
- signature
- unsigned
1 file · +10 -1
M internal/application/usecase/manage_panes.go +10 -1
| @@ -4,6 +4,7 @@ import ( | |||
| 4 | 4 | "context" | |
| 5 | 5 | "errors" | |
| 6 | 6 | "fmt" | |
| 7 | + | "math" | |
| 7 | 8 | "sort" | |
| 8 | 9 | ||
| 9 | 10 | "github.com/bnema/dumber/internal/domain/entity" | |
| @@ -298,7 +299,8 @@ func (uc *ManagePanesUseCase) SetSplitRatio(ctx context.Context, input SetSplitR | |||
| 298 | 299 | minRatio := input.MinPanePercent / 100.0 | |
| 299 | 300 | maxRatio := 1.0 - minRatio | |
| 300 | 301 | oldRatio := splitNode.SplitRatio | |
| 301 | - | splitNode.SplitRatio = clampFloat64(input.Ratio, minRatio, maxRatio) | |
| 302 | + | clamped := clampFloat64(input.Ratio, minRatio, maxRatio) | |
| 303 | + | splitNode.SplitRatio = roundSplitRatio(clamped) | |
| 302 | 304 | ||
| 303 | 305 | log.Debug(). | |
| 304 | 306 | Str("split_node_id", input.SplitNodeID). | |
| @@ -417,6 +419,13 @@ func findNearestSplitForAxis(node *entity.PaneNode, axis resizeAxis) *entity.Pan | |||
| 417 | 419 | return nil | |
| 418 | 420 | } | |
| 419 | 421 | ||
| 422 | + | const splitRatioRoundFactor = 100.0 | |
| 423 | + | ||
| 424 | + | func roundSplitRatio(ratio float64) float64 { | |
| 425 | + | // Keep snapshots stable and readable; avoids persisting noisy float values. | |
| 426 | + | return math.Round(ratio*splitRatioRoundFactor) / splitRatioRoundFactor | |
| 427 | + | } | |
| 428 | + | ||
| 420 | 429 | func clampFloat64(v, minVal, maxVal float64) float64 { | |
| 421 | 430 | if v < minVal { | |
| 422 | 431 | return minVal | |
| @@ -4,6 +4,7 @@ import ( | |||||
| 4 | "context" | 4 | "context" | ||
| 5 | "errors" | 5 | "errors" | ||
| 6 | "fmt" | 6 | "fmt" | ||
| 7 | + | "math" | |||
| 7 | "sort" | 8 | "sort" | ||
| 8 | 9 | ||||
| 9 | "github.com/bnema/dumber/internal/domain/entity" | 10 | "github.com/bnema/dumber/internal/domain/entity" | ||
| @@ -298,7 +299,8 @@ func (uc *ManagePanesUseCase) SetSplitRatio(ctx context.Context, input SetSplitR | |||||
| 298 | minRatio := input.MinPanePercent / 100.0 | 299 | minRatio := input.MinPanePercent / 100.0 | ||
| 299 | maxRatio := 1.0 - minRatio | 300 | maxRatio := 1.0 - minRatio | ||
| 300 | oldRatio := splitNode.SplitRatio | 301 | oldRatio := splitNode.SplitRatio | ||
| 301 | - | splitNode.SplitRatio = clampFloat64(input.Ratio, minRatio, maxRatio) | 302 | + | clamped := clampFloat64(input.Ratio, minRatio, maxRatio) |
| 303 | + | splitNode.SplitRatio = roundSplitRatio(clamped) | |||
| 302 | 304 | ||||
| 303 | log.Debug(). | 305 | log.Debug(). | ||
| 304 | Str("split_node_id", input.SplitNodeID). | 306 | Str("split_node_id", input.SplitNodeID). | ||
| @@ -417,6 +419,13 @@ func findNearestSplitForAxis(node *entity.PaneNode, axis resizeAxis) *entity.Pan | |||||
| 417 | return nil | 419 | return nil | ||
| 418 | } | 420 | } | ||
| 419 | 421 | ||||
| 422 | + | const splitRatioRoundFactor = 100.0 | |||
| 423 | + | ||||
| 424 | + | func roundSplitRatio(ratio float64) float64 { | |||
| 425 | + | // Keep snapshots stable and readable; avoids persisting noisy float values. | |||
| 426 | + | return math.Round(ratio*splitRatioRoundFactor) / splitRatioRoundFactor | |||
| 427 | + | } | |||
| 428 | + | ||||
| 420 | func clampFloat64(v, minVal, maxVal float64) float64 { | 429 | func clampFloat64(v, minVal, maxVal float64) float64 { | ||
| 421 | if v < minVal { | 430 | if v < minVal { | ||
| 422 | return minVal | 431 | return minVal | ||