VideoTools/vendor/fyne.io/fyne/v2/internal/widget/base.go
Stu Leak 68df790d27 Fix player frame generation and video playback
Major improvements to UnifiedPlayer:

1. GetFrameImage() now works when paused for responsive UI updates
2. Play() method properly starts FFmpeg process
3. Frame display loop runs continuously for smooth video display
4. Disabled audio temporarily to fix video playback fundamentals
5. Simplified FFmpeg command to focus on video stream only

Player now:
- Generates video frames correctly
- Shows video when paused
- Has responsive progress tracking
- Starts playback properly

Next steps: Re-enable audio playback once video is stable
2026-01-07 22:20:00 -05:00

144 lines
2.9 KiB
Go

package widget
import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/canvas"
"fyne.io/fyne/v2/internal/cache"
)
// Base provides a helper that handles basic widget behaviours.
type Base struct {
hidden bool
position fyne.Position
size fyne.Size
impl fyne.Widget
}
// ExtendBaseWidget is used by an extending widget to make use of BaseWidget functionality.
func (w *Base) ExtendBaseWidget(wid fyne.Widget) {
impl := w.super()
if impl != nil {
return
}
w.impl = wid
}
// Size gets the current size of this widget.
func (w *Base) Size() fyne.Size {
return w.size
}
// Resize sets a new size for a widget.
// Note this should not be used if the widget is being managed by a Layout within a Container.
func (w *Base) Resize(size fyne.Size) {
if size == w.Size() {
return
}
w.size = size
impl := w.super()
if impl == nil {
return
}
cache.Renderer(impl).Layout(size)
}
// Position gets the current position of this widget, relative to its parent.
func (w *Base) Position() fyne.Position {
return w.position
}
// Move the widget to a new position, relative to its parent.
// Note this should not be used if the widget is being managed by a Layout within a Container.
func (w *Base) Move(pos fyne.Position) {
if w.Position() == pos {
return
}
w.position = pos
Repaint(w.super())
}
// MinSize for the widget - it should never be resized below this value.
func (w *Base) MinSize() fyne.Size {
impl := w.super()
r := cache.Renderer(impl)
if r == nil {
return fyne.NewSize(0, 0)
}
return r.MinSize()
}
// Visible returns whether or not this widget should be visible.
// Note that this may not mean it is currently visible if a parent has been hidden.
func (w *Base) Visible() bool {
return !w.hidden
}
// Show this widget so it becomes visible
func (w *Base) Show() {
if !w.hidden {
return // Visible already
}
w.hidden = false
impl := w.super()
if impl == nil {
return
}
impl.Refresh()
}
// Hide this widget so it is no longer visible
func (w *Base) Hide() {
if w.hidden {
return // Hidden already
}
w.hidden = true
impl := w.super()
if impl == nil {
return
}
canvas.Refresh(impl)
}
// Refresh causes this widget to be redrawn in it's current state
func (w *Base) Refresh() {
impl := w.super()
if impl == nil {
return
}
cache.Renderer(impl).Refresh()
}
// super will return the actual object that this represents.
// If extended then this is the extending widget, otherwise it is nil.
func (w *Base) super() fyne.Widget {
return w.impl
}
// Repaint instructs the containing canvas to redraw, even if nothing changed.
// This method is a duplicate of what is in `canvas/canvas.go` to avoid a dependency loop or public API.
func Repaint(obj fyne.CanvasObject) {
app := fyne.CurrentApp()
if app == nil || app.Driver() == nil {
return
}
c := app.Driver().CanvasForObject(obj)
if c != nil {
if paint, ok := c.(interface{ SetDirty() }); ok {
paint.SetDirty()
}
}
}