242 lines
5.3 KiB
Go
242 lines
5.3 KiB
Go
package common
|
|
|
|
import (
|
|
"fmt"
|
|
"go_dreamfactory/utils"
|
|
"io/ioutil"
|
|
"sort"
|
|
"strings"
|
|
|
|
"fyne.io/fyne/v2"
|
|
"fyne.io/fyne/v2/container"
|
|
"fyne.io/fyne/v2/layout"
|
|
"fyne.io/fyne/v2/widget"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
type ItemList struct {
|
|
SelItemIds []string //选择的ID 多选
|
|
SelItemId string //选择的ID 单选
|
|
ItemTotal int //总数
|
|
TitleLabel *widget.Label
|
|
CachedList List
|
|
ItemList *widget.List
|
|
SearchItem []Item //用于暂存搜索结果
|
|
}
|
|
|
|
func NewItemList() *ItemList {
|
|
return &ItemList{
|
|
TitleLabel: &widget.Label{},
|
|
CachedList: NewList(""),
|
|
}
|
|
}
|
|
|
|
// 重置
|
|
func (f *ItemList) Reset() {
|
|
f.ItemTotal = 0
|
|
f.SelItemIds = []string{}
|
|
f.SelItemId = ""
|
|
f.CachedList = NewList("")
|
|
f.ItemList.Refresh()
|
|
}
|
|
|
|
func (f *ItemList) CreateList() *widget.List {
|
|
f.ItemList = widget.NewList(
|
|
func() int {
|
|
return len(f.CachedList.Items)
|
|
},
|
|
func() fyne.CanvasObject {
|
|
return widget.NewLabel("Template")
|
|
},
|
|
func(id widget.ListItemID, item fyne.CanvasObject) {
|
|
c, _ := item.(*widget.Label)
|
|
c.Text = f.CachedList.Items[id].Text
|
|
c.Refresh()
|
|
},
|
|
)
|
|
f.ItemList.OnSelected = func(id widget.ListItemID) {
|
|
selId := f.CachedList.Items[id].Id
|
|
f.SelItemId = selId
|
|
return
|
|
}
|
|
|
|
// f.ItemList.OnUnselected = func(id widget.ListItemID) {
|
|
// selId := f.CachedList.Items[id].Id
|
|
// utils.DeleteString(f.SelItemIds, selId)
|
|
// }
|
|
return f.ItemList
|
|
}
|
|
|
|
// 创建默认的列表
|
|
func (f *ItemList) CreateDefaultCheckList() *widget.List {
|
|
f.ItemList = widget.NewList(
|
|
func() int {
|
|
return len(f.CachedList.Items)
|
|
},
|
|
func() fyne.CanvasObject {
|
|
return widget.NewCheck("Template", func(bool) {})
|
|
},
|
|
func(id widget.ListItemID, item fyne.CanvasObject) {
|
|
c, _ := item.(*widget.Check)
|
|
_id := f.CachedList.Items[id].Id
|
|
c.Text = f.CachedList.Items[id].Text
|
|
c.Checked = f.CachedList.Items[id].Checked
|
|
|
|
c.OnChanged = func(b bool) {
|
|
if b {
|
|
f.SelItemIds = append(f.SelItemIds, _id)
|
|
} else {
|
|
f.SelItemIds = utils.DeleteString(f.SelItemIds, _id)
|
|
}
|
|
f.TitleLabel.SetText(fmt.Sprintf("(%d/%d)", len(f.SelItemIds), f.ItemTotal))
|
|
f.CachedList.Items[id].Checked = b
|
|
// sort.Sort(f.cachedList)
|
|
f.ItemList.Refresh()
|
|
}
|
|
c.Refresh()
|
|
},
|
|
)
|
|
return f.ItemList
|
|
}
|
|
|
|
// 创建下载列表
|
|
func (f *ItemList) CreateDownloadList() *widget.List {
|
|
f.ItemList = widget.NewList(
|
|
func() int {
|
|
return len(f.CachedList.Items)
|
|
},
|
|
func() fyne.CanvasObject {
|
|
chk := widget.NewCheck("Template", func(bool) {})
|
|
lb := widget.NewLabel("Template")
|
|
items := container.NewHBox(chk, &layout.Spacer{}, lb)
|
|
return items
|
|
},
|
|
func(id widget.ListItemID, item fyne.CanvasObject) {
|
|
c, _ := item.(*fyne.Container)
|
|
chk := c.Objects[0].(*widget.Check)
|
|
data := f.CachedList.Items[id]
|
|
chk.Text = data.Text
|
|
chk.Checked = data.Checked
|
|
chk.OnChanged = func(b bool) {
|
|
if b {
|
|
f.SelItemIds = append(f.SelItemIds, chk.Text)
|
|
} else {
|
|
f.SelItemIds = utils.DeleteString(f.SelItemIds, chk.Text)
|
|
}
|
|
f.CachedList.Items[id].Checked = b
|
|
// sort.Sort(f.cachedList)
|
|
f.ItemList.Refresh()
|
|
}
|
|
|
|
lb := c.Objects[2].(*widget.Label)
|
|
lb.Text = ConvertFileSize(data.Size)
|
|
c.Refresh()
|
|
},
|
|
)
|
|
return f.ItemList
|
|
}
|
|
|
|
func (f *ItemList) AddItem(item Item) {
|
|
f.CachedList.Items = append(f.CachedList.Items, item)
|
|
// sort.Sort(f.cachedList)
|
|
f.ItemList.Refresh()
|
|
}
|
|
|
|
func (f *ItemList) AddItemWithText(val string) {
|
|
val = strings.TrimSpace(val)
|
|
if len(val) == 0 {
|
|
return
|
|
}
|
|
newItem := Item{
|
|
Id: val,
|
|
Text: val,
|
|
Quantity: 1,
|
|
Checked: false, //默认不选中
|
|
}
|
|
f.CachedList.Items = append(f.CachedList.Items, newItem)
|
|
sort.Sort(f.CachedList)
|
|
f.ItemList.Refresh()
|
|
}
|
|
|
|
func (f *ItemList) LoadItem(dirPath string) {
|
|
f.Reset()
|
|
files, err := ioutil.ReadDir(dirPath)
|
|
if err != nil {
|
|
logrus.Error(err)
|
|
return
|
|
}
|
|
|
|
for _, file := range files {
|
|
if !file.IsDir() {
|
|
f.AddItemWithText(file.Name())
|
|
// f.selItemIds = append(f.selItemIds, file.Name())
|
|
f.ItemTotal++
|
|
// logrus.Debugf("%v", file.Name())
|
|
}
|
|
}
|
|
|
|
f.SearchItem = f.CachedList.Items
|
|
}
|
|
|
|
// 改变列表项目
|
|
func (f *ItemList) ChangeItem(tmpDir, projectDir string) {
|
|
f.ItemTotal = 0
|
|
f.SelItemIds = []string{}
|
|
f.CachedList = NewList("")
|
|
tmpFiles, err := ioutil.ReadDir(tmpDir)
|
|
if err != nil {
|
|
logrus.Error(err)
|
|
return
|
|
}
|
|
|
|
defer func() {
|
|
if len(tmpFiles) == 0 || len(f.CachedList.Items) == 0 {
|
|
ShowTip("没有任何变更的项目")
|
|
}
|
|
}()
|
|
|
|
projectFiles, err := ioutil.ReadDir(projectDir)
|
|
if err != nil {
|
|
logrus.Error(err)
|
|
return
|
|
}
|
|
|
|
pfMap := make(map[string]int64)
|
|
for _, v := range projectFiles {
|
|
if !v.IsDir() {
|
|
pfMap[v.Name()] = v.ModTime().Unix()
|
|
}
|
|
}
|
|
|
|
for _, file := range tmpFiles {
|
|
if !file.IsDir() {
|
|
if pfTime, ok := pfMap[file.Name()]; ok {
|
|
if file.ModTime().Unix() <= pfTime {
|
|
continue
|
|
}
|
|
}
|
|
f.AddItemWithText(file.Name())
|
|
// f.SelItemIds = append(f.SelItemIds, file.Name())
|
|
f.ItemTotal++
|
|
// logrus.Debugf("%v", file.Name())
|
|
}
|
|
}
|
|
}
|
|
|
|
// 刷新文件数
|
|
func (f *ItemList) ChangeFileCount() {
|
|
f.TitleLabel.SetText(fmt.Sprintf("(%d/%d)", len(f.SelItemIds), f.ItemTotal))
|
|
}
|
|
|
|
func (f *ItemList) DeleteItem(name string) {
|
|
for i, v := range f.CachedList.Items {
|
|
if v.Text == name {
|
|
f.SelItemIds = utils.DeleteString(f.SelItemIds, v.Text)
|
|
f.CachedList.Items = append(f.CachedList.Items[:i], f.CachedList.Items[i+1:]...)
|
|
if f.ItemTotal > 0 {
|
|
f.ItemTotal--
|
|
}
|
|
}
|
|
}
|
|
}
|