classify_labels.go
package calls
import (
"skraak/datafile"
)
// SetComment sets the comment on the current segment's filter label.
// Returns the previous comment (for undo) or empty string if none.
func (s *ClassifyState) SetComment(comment string) string {
seg := s.CurrentSegment()
if seg == nil {
return ""
}
df := s.CurrentFile()
if df == nil {
return ""
}
// Set reviewer
df.Meta.Reviewer = s.Config.Reviewer
// Get labels matching filter
filterLabels := seg.GetFilterLabels(s.Config.Filter)
var oldComment string
if len(filterLabels) == 0 {
// No matching labels, add new one with comment
label := &datafile.Label{
Species: "Don't Know",
Certainty: 0,
Filter: s.Config.Filter,
Comment: comment,
}
seg.Labels = append(seg.Labels, label)
} else {
// Set comment on first matching label
oldComment = filterLabels[0].Comment
filterLabels[0].Comment = comment
}
s.Dirty = true
return oldComment
}
// GetCurrentComment returns the comment on the current segment's filter label.
func (s *ClassifyState) GetCurrentComment() string {
seg := s.CurrentSegment()
if seg == nil {
return ""
}
filterLabels := seg.GetFilterLabels(s.Config.Filter)
if len(filterLabels) == 0 {
return ""
}
return filterLabels[0].Comment
}
// GetCurrentSpeciesCallType returns the species+calltype string for the current
// segment's first filter label, using the Species+CallType format.
// Returns "" if no matching label exists.
func (s *ClassifyState) GetCurrentSpeciesCallType() string {
seg := s.CurrentSegment()
if seg == nil {
return ""
}
filterLabels := seg.GetFilterLabels(s.Config.Filter)
if len(filterLabels) == 0 {
return ""
}
l := filterLabels[0]
if l.CallType != "" {
return l.Species + "+" + l.CallType
}
return l.Species
}
// ConfirmLabel upgrades the current segment's existing filter label certainty
// to 100. Returns true if a write is needed (label existed and was below 100).
// Returns false for Don't Know (certainty=0) — confirming a Don't Know is a no-op;
// the caller should just advance to the next segment.
func (s *ClassifyState) ConfirmLabel() bool {
seg := s.CurrentSegment()
if seg == nil {
return false
}
filterLabels := seg.GetFilterLabels(s.Config.Filter)
if len(filterLabels) == 0 {
return false
}
if filterLabels[0].Certainty == 0 {
return false
}
if filterLabels[0].Certainty == 100 {
return false
}
df := s.CurrentFile()
if df == nil {
return false
}
df.Meta.Reviewer = s.Config.Reviewer
filterLabels[0].Certainty = 100
s.Dirty = true
return true
}