| 12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- package scale
- import (
- "math"
- "fyne.io/fyne/v2"
- )
- // ToScreenCoordinate converts a fyne coordinate in the given canvas to a screen coordinate
- func ToScreenCoordinate(c fyne.Canvas, v float32) int {
- return int(math.Ceil(float64(v * c.Scale())))
- }
- // ToFyneCoordinate converts a screen coordinate for a given canvas to a fyne coordinate
- func ToFyneCoordinate(c fyne.Canvas, v int) float32 {
- switch c.Scale() {
- case 0.0:
- panic("Incorrect scale most likely not set.")
- case 1.0:
- return float32(v)
- default:
- return float32(v) / c.Scale()
- }
- }
- // ToFyneSize returns the scaled size of an object based on pixel coordinates, typically for images.
- // This method will attempt to find the canvas for an object to get its scale.
- // In the event that this fails it will assume a 1:1 mapping (scale=1 or low DPI display).
- func ToFyneSize(obj fyne.CanvasObject, width, height int) fyne.Size {
- app := fyne.CurrentApp()
- if app == nil {
- return fyne.NewSize(float32(width), float32(height)) // can occur if called before app.New
- }
- driver := app.Driver()
- if driver == nil {
- return fyne.NewSize(float32(width), float32(height))
- }
- c := driver.CanvasForObject(obj)
- if c == nil {
- return fyne.NewSize(float32(width), float32(height)) // this will happen a lot during init
- }
- return fyne.NewSize(ToFyneCoordinate(c, width), ToFyneCoordinate(c, height))
- }
|