Finally fix crash when spamming add to queue on all titles

This commit is contained in:
Xpl0itU 2023-07-24 12:52:36 +02:00
parent a908559687
commit c70878b2c5

View file

@ -512,45 +512,32 @@ func (mw *MainWindow) isSelectionInQueue() bool {
if err != nil { if err != nil {
mw.logger.Fatal("Unable to get selection:", err) mw.logger.Fatal("Unable to get selection:", err)
} }
model, err := mw.treeView.GetModel()
store, err := mw.treeView.GetModel()
if err != nil { if err != nil {
mw.logger.Fatal("Unable to get model:", err) mw.logger.Fatal("Unable to get model:", err)
} }
treeModel := model.ToTreeModel()
storeRef := store.(*gtk.ListStore)
treeModel := storeRef.ToTreeModel()
if treeModel == nil { if treeModel == nil {
return false return false
} }
pathlist := selection.GetSelectedRows(treeModel) selectionSelected := selection.GetSelectedRows(treeModel)
if pathlist == nil { if selectionSelected == nil {
return false return false
} }
allTitlesInQueue := true allTitlesInQueue := true
for l := pathlist; l != nil; l = l.Next() { iter, _ := treeModel.GetIterFirst()
if l == nil { for iter != nil {
continue inQueueVal, err := treeModel.GetValue(iter, IN_QUEUE_COLUMN)
}
lData := l.Data()
if lData == nil {
continue
}
path, ok := lData.(*gtk.TreePath)
if !ok || path == nil || path.GetDepth() <= 0 {
continue
}
row, err := treeModel.GetIter(path)
if err != nil { if err != nil {
continue continue
} }
isInQueue, err := inQueueVal.GoValue()
inQueue, err := treeModel.GetValue(row, IN_QUEUE_COLUMN)
if err != nil {
continue
}
isInQueue, err := inQueue.GoValue()
if err != nil { if err != nil {
continue continue
} }
@ -560,7 +547,9 @@ func (mw *MainWindow) isSelectionInQueue() bool {
break break
} }
inQueue.Unset() if !storeRef.IterNext(iter) {
break
}
} }
return allTitlesInQueue return allTitlesInQueue
@ -624,102 +613,81 @@ func (mw *MainWindow) onAddToQueueClicked() {
if err != nil { if err != nil {
mw.logger.Fatal("Unable to get selection:", err) mw.logger.Fatal("Unable to get selection:", err)
} }
model, err := mw.treeView.GetModel()
store, err := mw.treeView.GetModel()
if err != nil { if err != nil {
mw.logger.Fatal("Unable to get model:", err) mw.logger.Fatal("Unable to get model:", err)
} }
treeModel := model.ToTreeModel()
storeRef := store.(*gtk.ListStore)
treeModel := storeRef.ToTreeModel()
if treeModel == nil { if treeModel == nil {
return return
} }
addToQueue := !mw.isSelectionInQueue() addToQueue := !mw.isSelectionInQueue()
pathlist := selection.GetSelectedRows(treeModel)
if pathlist == nil { selectionSelected := selection.GetSelectedRows(treeModel)
if selectionSelected == nil {
return return
} }
var toUpdateRows []*gtk.TreeIter
var toUpdateInQueueVals []bool
for l := pathlist; l != nil; l = l.Next() {
if l == nil {
continue
}
treePath := l.Data()
if treePath == nil {
continue
}
path, ok := treePath.(*gtk.TreePath)
if !ok || path == nil || path.GetDepth() <= 0 {
continue
}
row, err := treeModel.GetIter(path)
if err != nil {
continue
}
inQueue, err := treeModel.GetValue(row, IN_QUEUE_COLUMN)
if err != nil {
continue
}
isInQueue, err := inQueue.GoValue()
if err != nil {
continue
}
if addToQueue != isInQueue.(bool) {
toUpdateRows = append(toUpdateRows, row)
toUpdateInQueueVals = append(toUpdateInQueueVals, addToQueue)
}
}
defer func() { defer func() {
if r := recover(); r != nil { if r := recover(); r != nil {
mw.logger.Fatal("Error updating model:", r) mw.logger.Fatal("Error updating model:", r)
} }
}() }()
for i, row := range toUpdateRows { iter, _ := treeModel.GetIterFirst()
inQueueVal := toUpdateInQueueVals[i] for iter != nil {
inQueue, err := treeModel.GetValue(row, IN_QUEUE_COLUMN) inQueueVal, err := treeModel.GetValue(iter, IN_QUEUE_COLUMN)
if err != nil { if err != nil {
continue continue
} }
inQueue.SetBool(inQueueVal) isInQueue, err := inQueueVal.GoValue()
tid, err := treeModel.GetValue(row, TITLE_ID_COLUMN)
if err != nil {
continue
}
tidStr, err := tid.GetString()
if err != nil { if err != nil {
continue continue
} }
if inQueueVal { if addToQueue != isInQueue.(bool) {
name, err := treeModel.GetValue(row, NAME_COLUMN) inQueue, err := treeModel.GetValue(iter, IN_QUEUE_COLUMN)
if err != nil { if err != nil {
continue continue
} }
nameStr, err := name.GetString() inQueue.SetBool(addToQueue)
tid, err := treeModel.GetValue(iter, TITLE_ID_COLUMN)
if err != nil { if err != nil {
continue continue
} }
mw.addToQueue(tidStr, nameStr) tidStr, err := tid.GetString()
mw.addToQueueButton.SetLabel("Remove from queue") if err != nil {
name.Unset() continue
} else { }
mw.removeFromQueue(tidStr)
mw.addToQueueButton.SetLabel("Add to queue") if addToQueue {
name, err := treeModel.GetValue(iter, NAME_COLUMN)
if err != nil {
continue
}
nameStr, err := name.GetString()
if err != nil {
continue
}
mw.addToQueue(tidStr, nameStr)
mw.addToQueueButton.SetLabel("Remove from queue")
name.Unset()
} else {
mw.removeFromQueue(tidStr)
mw.addToQueueButton.SetLabel("Add to queue")
}
storeRef.SetValue(iter, IN_QUEUE_COLUMN, addToQueue)
tid.Unset()
} }
queueModel, err := mw.treeView.GetModel() if !storeRef.IterNext(iter) {
if err != nil { break
continue
} }
queueModel.(*gtk.ListStore).SetValue(row, IN_QUEUE_COLUMN, inQueueVal)
inQueue.Unset()
tid.Unset()
} }
} }