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:
@@ -2,6 +2,7 @@ package application
|
||||
|
||||
import (
|
||||
"fyne.io/fyne/v2"
|
||||
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/internal/application/convertor"
|
||||
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/internal/application/setting"
|
||||
"git.kor-elf.net/kor-elf/gui-for-ffmpeg/internal/ffmpeg"
|
||||
)
|
||||
@@ -11,6 +12,8 @@ type AppContract interface {
|
||||
GetSetting() setting.SettingContract
|
||||
GetProgressBarService() ProgressBarContract
|
||||
GetFFmpegService() ffmpeg.UtilitiesContract
|
||||
GetItemsToConvert() convertor.ItemsToConvertContract
|
||||
GetQueueService() convertor.QueueListContract
|
||||
Run()
|
||||
}
|
||||
|
||||
@@ -19,14 +22,25 @@ type application struct {
|
||||
setting setting.SettingContract
|
||||
progressBarService ProgressBarContract
|
||||
ffmpegService ffmpeg.UtilitiesContract
|
||||
itemsToConvert convertor.ItemsToConvertContract
|
||||
queueService convertor.QueueListContract
|
||||
}
|
||||
|
||||
func NewApp(fyneApp fyne.App, setting setting.SettingContract, progressBarService ProgressBarContract, ffmpegService ffmpeg.UtilitiesContract) AppContract {
|
||||
func NewApp(
|
||||
fyneApp fyne.App,
|
||||
setting setting.SettingContract,
|
||||
progressBarService ProgressBarContract,
|
||||
ffmpegService ffmpeg.UtilitiesContract,
|
||||
itemsToConvert convertor.ItemsToConvertContract,
|
||||
queueService convertor.QueueListContract,
|
||||
) AppContract {
|
||||
return &application{
|
||||
fyneApp: fyneApp,
|
||||
setting: setting,
|
||||
progressBarService: progressBarService,
|
||||
ffmpegService: ffmpegService,
|
||||
itemsToConvert: itemsToConvert,
|
||||
queueService: queueService,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,6 +60,14 @@ func (a *application) GetFFmpegService() ffmpeg.UtilitiesContract {
|
||||
return a.ffmpegService
|
||||
}
|
||||
|
||||
func (a *application) GetItemsToConvert() convertor.ItemsToConvertContract {
|
||||
return a.itemsToConvert
|
||||
}
|
||||
|
||||
func (a *application) GetQueueService() convertor.QueueListContract {
|
||||
return a.queueService
|
||||
}
|
||||
|
||||
func (a *application) Run() {
|
||||
a.fyneApp.Run()
|
||||
}
|
||||
|
133
internal/application/convertor/items_to_convert.go
Normal file
133
internal/application/convertor/items_to_convert.go
Normal 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
|
||||
}
|
148
internal/application/convertor/queue.go
Normal file
148
internal/application/convertor/queue.go
Normal 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)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user