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
227 lines
5.0 KiB
Go
227 lines
5.0 KiB
Go
// Package widget defines the UI widgets within the Fyne toolkit.
|
|
package widget // import "fyne.io/fyne/v2/widget"
|
|
|
|
import (
|
|
"fyne.io/fyne/v2"
|
|
"fyne.io/fyne/v2/canvas"
|
|
"fyne.io/fyne/v2/internal/cache"
|
|
internalWidget "fyne.io/fyne/v2/internal/widget"
|
|
"fyne.io/fyne/v2/theme"
|
|
)
|
|
|
|
// BaseWidget provides a helper that handles basic widget behaviours.
|
|
type BaseWidget struct {
|
|
noCopy noCopy // so `go vet` can complain if a widget is passed by value (copied)
|
|
|
|
size fyne.Size
|
|
position fyne.Position
|
|
Hidden bool
|
|
|
|
impl fyne.Widget
|
|
themeCache fyne.Theme
|
|
}
|
|
|
|
// ExtendBaseWidget is used by an extending widget to make use of BaseWidget functionality.
|
|
func (w *BaseWidget) ExtendBaseWidget(wid fyne.Widget) {
|
|
if w.super() != nil {
|
|
return
|
|
}
|
|
|
|
w.impl = wid
|
|
}
|
|
|
|
// Size gets the current size of this widget.
|
|
func (w *BaseWidget) 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 *BaseWidget) 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 *BaseWidget) 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 *BaseWidget) Move(pos fyne.Position) {
|
|
if w.Position() == pos {
|
|
return
|
|
}
|
|
|
|
w.position = pos
|
|
internalWidget.Repaint(w.super())
|
|
}
|
|
|
|
// MinSize for the widget - it should never be resized below this value.
|
|
func (w *BaseWidget) MinSize() fyne.Size {
|
|
impl := w.super()
|
|
|
|
r := cache.Renderer(impl)
|
|
if r == nil {
|
|
return fyne.Size{}
|
|
}
|
|
|
|
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 *BaseWidget) Visible() bool {
|
|
return !w.Hidden
|
|
}
|
|
|
|
// Show this widget so it becomes visible
|
|
func (w *BaseWidget) Show() {
|
|
if w.Visible() {
|
|
return
|
|
}
|
|
|
|
w.Hidden = false
|
|
|
|
impl := w.super()
|
|
if impl == nil {
|
|
return
|
|
}
|
|
impl.Refresh()
|
|
}
|
|
|
|
// Hide this widget so it is no longer visible
|
|
func (w *BaseWidget) Hide() {
|
|
if !w.Visible() {
|
|
return
|
|
}
|
|
|
|
w.Hidden = true
|
|
|
|
impl := w.super()
|
|
if impl == nil {
|
|
return
|
|
}
|
|
canvas.Refresh(impl)
|
|
}
|
|
|
|
// Refresh causes this widget to be redrawn in its current state
|
|
func (w *BaseWidget) Refresh() {
|
|
impl := w.super()
|
|
if impl == nil {
|
|
return
|
|
}
|
|
|
|
w.themeCache = nil
|
|
|
|
cache.Renderer(impl).Refresh()
|
|
}
|
|
|
|
// Theme returns a cached Theme instance for this widget (or its extending widget).
|
|
// This will be the app theme in most cases, or a widget specific theme if it is inside a ThemeOverride container.
|
|
//
|
|
// Since: 2.5
|
|
func (w *BaseWidget) Theme() fyne.Theme {
|
|
cached := w.themeCache
|
|
if cached != nil {
|
|
return cached
|
|
}
|
|
|
|
cached = cache.WidgetTheme(w.super())
|
|
// don't cache the default as it may change
|
|
if cached == nil {
|
|
return theme.Current()
|
|
}
|
|
|
|
w.themeCache = cached
|
|
return cached
|
|
}
|
|
|
|
// super will return the actual object that this represents.
|
|
// If extended then this is the extending widget, otherwise it is nil.
|
|
func (w *BaseWidget) super() fyne.Widget {
|
|
return w.impl
|
|
}
|
|
|
|
// DisableableWidget describes an extension to BaseWidget which can be disabled.
|
|
// Disabled widgets should have a visually distinct style when disabled, normally using theme.DisabledButtonColor.
|
|
type DisableableWidget struct {
|
|
BaseWidget
|
|
|
|
disabled bool
|
|
}
|
|
|
|
// Enable this widget, updating any style or features appropriately.
|
|
func (w *DisableableWidget) Enable() {
|
|
if !w.Disabled() {
|
|
return // Enabled already
|
|
}
|
|
|
|
w.disabled = false
|
|
|
|
impl := w.super()
|
|
if impl == nil {
|
|
return
|
|
}
|
|
impl.Refresh()
|
|
}
|
|
|
|
// Disable this widget so that it cannot be interacted with, updating any style appropriately.
|
|
func (w *DisableableWidget) Disable() {
|
|
if w.Disabled() {
|
|
return // Disabled already
|
|
}
|
|
|
|
w.disabled = true
|
|
|
|
impl := w.super()
|
|
if impl == nil {
|
|
return
|
|
}
|
|
impl.Refresh()
|
|
}
|
|
|
|
// Disabled returns true if this widget is currently disabled or false if it can currently be interacted with.
|
|
func (w *DisableableWidget) Disabled() bool {
|
|
return w.disabled
|
|
}
|
|
|
|
// NewSimpleRenderer creates a new SimpleRenderer to render a widget using a
|
|
// single fyne.CanvasObject.
|
|
//
|
|
// Since: 2.1
|
|
func NewSimpleRenderer(object fyne.CanvasObject) fyne.WidgetRenderer {
|
|
return internalWidget.NewSimpleRenderer(object)
|
|
}
|
|
|
|
// Orientation controls the horizontal/vertical layout of a widget
|
|
type Orientation int
|
|
|
|
// Orientation constants to control widget layout
|
|
const (
|
|
Horizontal Orientation = 0
|
|
Vertical Orientation = 1
|
|
|
|
// Adaptive will switch between horizontal and vertical layouts according to device orientation.
|
|
// This orientation is not always supported and interpretation can vary per-widget.
|
|
//
|
|
// Since: 2.5
|
|
Adaptive Orientation = 2
|
|
)
|
|
|
|
type noCopy struct{}
|
|
|
|
func (*noCopy) Lock() {}
|
|
|
|
func (*noCopy) Unlock() {}
|