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
144 lines
2.9 KiB
Go
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()
|
|
}
|
|
}
|
|
}
|