Fork channel

Create a new channel as a copy of main.

Rename channel

Rename main to:

Delete channel

Delete main? This cannot be undone.

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
}