1package sheet23import (4 "errors"5 "slices"6)78// Hidden sheets, as Sheets' Hide sheet: a hidden sheet keeps its cells9// and stays in formulas, named ranges and pivot sources; it is left out10// of the tabs and of moving between sheets, and View > Hidden sheets11// shows it again. At least one sheet is always visible. Hiding and12// showing are undo steps that snapshot the sheet list (historysheets.go),13// and files keep the flag in an optional field older builds ignore.1415// Hidden reports whether the sheet is hidden.16func (s *Sheet) Hidden() bool { return s.tabHidden }1718// Visible returns the sheets that aren't hidden, in tab order.19func (w *Workbook) Visible() []*Sheet {20 return slices.DeleteFunc(slices.Clone(w.sheets), (*Sheet).Hidden)21}2223// HiddenSheets returns the hidden sheets, in tab order.24func (w *Workbook) HiddenSheets() []*Sheet {25 return slices.DeleteFunc(slices.Clone(w.sheets), func(s *Sheet) bool { return !s.tabHidden })26}2728// visibleCount is how many sheets aren't hidden.29func (w *Workbook) visibleCount() int {30 n := 031 for _, s := range w.sheets {32 if !s.tabHidden {33 n++34 }35 }36 return n37}3839// errLastVisible is why the last visible sheet can't be hidden or deleted.40var errLastVisible = errors.New("A spreadsheet needs at least one visible sheet")4142// HideSheet hides s, as one undo step. The last visible sheet can't be43// hidden.44func (w *Workbook) HideSheet(s *Sheet) error {45 switch {46 case !s.live:47 return errors.New("That sheet was deleted")48 case s.tabHidden:49 return nil50 case w.visibleCount() == 1:51 return errLastVisible52 }53 w.change(s, "hide sheet "+s.name, Rect{}, func() {54 w.recordSheets()55 s.tabHidden = true56 })57 return nil58}5960// UnhideSheet shows s again, as one undo step.61func (w *Workbook) UnhideSheet(s *Sheet) error {62 switch {63 case !s.live:64 return errors.New("That sheet was deleted")65 case !s.tabHidden:66 return nil67 }68 w.change(s, "show sheet "+s.name, Rect{}, func() {69 w.recordSheets()70 s.tabHidden = false71 })72 return nil73}7475// settleHidden keeps a loaded workbook showable: if every sheet is76// hidden the first is shown, and a hidden sheet isn't the active one.77func (w *Workbook) settleHidden() {78 if w.visibleCount() == 0 {79 w.sheets[0].tabHidden = false80 }81 if w.sheets[w.Active()].tabHidden {82 w.active = w.Index(w.Visible()[0])83 }84}