Revive the right block of the program

Moved the right part of the program from the old version. Slightly reworked the structure.
This commit is contained in:
2025-06-07 21:27:55 +05:00
parent c60b9f7b0c
commit 57637606c0
7 changed files with 740 additions and 37 deletions

View File

@@ -0,0 +1,133 @@
package convertor
import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/canvas"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/internal/ffmpeg"
)
type ItemsToConvertContract interface {
Add(file *File)
Clear()
GetItems() map[int]ItemToConvertContract
GetItemsContainer() *fyne.Container
AfterAddingQueue()
GetIsAutoRemove() bool
SetIsAutoRemove(isAutoRemove bool)
}
type itemsToConvert struct {
ffmpeg ffmpeg.UtilitiesContract
nextId int
items map[int]ItemToConvertContract
itemsContainer *fyne.Container
isAutoRemove bool
}
func NewItemsToConvert(ffmpeg ffmpeg.UtilitiesContract) ItemsToConvertContract {
return &itemsToConvert{
ffmpeg: ffmpeg,
nextId: 0,
items: map[int]ItemToConvertContract{},
itemsContainer: container.NewVBox(),
isAutoRemove: true,
}
}
func (items *itemsToConvert) GetItemsContainer() *fyne.Container {
return items.itemsContainer
}
func (items *itemsToConvert) Add(file *File) {
nextId := items.nextId
var content *fyne.Container
var buttonPlay *widget.Button
buttonPlay = widget.NewButtonWithIcon("", theme.Icon(theme.IconNameMediaPlay), func() {
buttonPlay.Disable()
go func() {
//_ = items.ffplayService.Run(FFplaySetting{
// PathToFile: file.Path,
//})
fyne.Do(func() {
buttonPlay.Enable()
})
}()
})
buttonRemove := widget.NewButtonWithIcon("", theme.Icon(theme.IconNameDelete), func() {
items.itemsContainer.Remove(content)
items.itemsContainer.Refresh()
delete(items.items, nextId)
})
buttonRemove.Importance = widget.DangerImportance
content = container.NewVBox(
container.NewBorder(
nil,
nil,
buttonPlay,
buttonRemove,
container.NewHScroll(widget.NewLabel(file.Name)),
),
container.NewHScroll(widget.NewLabel(file.Path)),
container.NewPadded(),
canvas.NewLine(theme.Color(theme.ColorNameFocus)),
container.NewPadded(),
)
items.itemsContainer.Add(content)
items.items[nextId] = newItemToConvert(file, content)
items.nextId++
}
func (items *itemsToConvert) GetIsAutoRemove() bool {
return items.isAutoRemove
}
func (items *itemsToConvert) SetIsAutoRemove(isAutoRemove bool) {
items.isAutoRemove = isAutoRemove
}
func (items *itemsToConvert) GetItems() map[int]ItemToConvertContract {
return items.items
}
func (items *itemsToConvert) AfterAddingQueue() {
if items.isAutoRemove {
items.Clear()
}
}
func (items *itemsToConvert) Clear() {
items.itemsContainer.RemoveAll()
items.items = map[int]ItemToConvertContract{}
}
type ItemToConvertContract interface {
GetFile() *File
GetContent() *fyne.Container
}
type itemToConvert struct {
file *File
content *fyne.Container
}
func newItemToConvert(file *File, content *fyne.Container) ItemToConvertContract {
return &itemToConvert{
file: file,
content: content,
}
}
func (item *itemToConvert) GetFile() *File {
return item.file
}
func (item *itemToConvert) GetContent() *fyne.Container {
return item.content
}

View File

@@ -0,0 +1,148 @@
package convertor
import "errors"
type Queue struct {
Setting *ConvertSetting
Status StatusContract
Error error
}
type StatusContract interface {
Name() string
Ordinal() int
}
const (
Waiting = iota
InProgress
Completed
Error
)
type StatusType uint
var statusTypeStrings = []string{
"waiting",
"inProgress",
"completed",
"error",
}
func (status StatusType) Name() string {
return statusTypeStrings[status]
}
func (status StatusType) Ordinal() int {
return int(status)
}
type QueueListenerContract interface {
AddQueue(key int, queue *Queue)
ChangeQueue(key int, queue *Queue)
RemoveQueue(key int, status StatusContract)
}
type QueueListContract interface {
AddListener(queueListener QueueListenerContract)
GetItems() map[int]*Queue
Add(setting *ConvertSetting)
EventChangeQueue(key int, queue *Queue)
Remove(key int)
GetItem(key int) (*Queue, error)
Next() (key int, queue *Queue)
}
type queueList struct {
currentKey int
items map[int]*Queue
queue map[int]int
queueListener map[int]QueueListenerContract
}
func NewQueueList() QueueListContract {
return &queueList{
currentKey: 0,
items: map[int]*Queue{},
queueListener: map[int]QueueListenerContract{},
}
}
func (l *queueList) GetItems() map[int]*Queue {
return l.items
}
func (l *queueList) Add(setting *ConvertSetting) {
queue := Queue{
Setting: setting,
Status: StatusType(Waiting),
}
l.currentKey += 1
l.items[l.currentKey] = &queue
l.queue[l.currentKey] = l.currentKey
l.eventAdd(l.currentKey, &queue)
}
func (l *queueList) EventChangeQueue(key int, queue *Queue) {
l.eventChange(key, queue)
}
func (l *queueList) Remove(key int) {
if _, ok := l.queue[key]; ok {
delete(l.queue, key)
}
if _, ok := l.items[key]; ok {
status := l.items[key].Status
l.eventRemove(key, status)
delete(l.items, key)
}
}
func (l *queueList) GetItem(key int) (*Queue, error) {
if item, ok := l.items[key]; ok {
return item, nil
}
return nil, errors.New("key not found")
}
func (l *queueList) AddListener(queueListener QueueListenerContract) {
l.queueListener[len(l.queueListener)] = queueListener
}
func (l *queueList) Next() (key int, queue *Queue) {
statusWaiting := StatusType(Waiting)
for key, queueId := range l.queue {
if queue, ok := l.items[queueId]; ok {
if queue.Status == statusWaiting {
return queueId, queue
}
}
if _, ok := l.queue[key]; ok {
delete(l.queue, key)
}
}
return -1, nil
}
func (l *queueList) eventAdd(key int, queue *Queue) {
for _, listener := range l.queueListener {
listener.AddQueue(key, queue)
}
}
func (l *queueList) eventChange(key int, queue *Queue) {
for _, listener := range l.queueListener {
listener.ChangeQueue(key, queue)
}
}
func (l *queueList) eventRemove(key int, status StatusContract) {
for _, listener := range l.queueListener {
listener.RemoveQueue(key, status)
}
}