113 lines
3.3 KiB
Go
113 lines
3.3 KiB
Go
package gopher
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
)
|
|
|
|
//------------------------------------------------\\
|
|
// + + + T Y P E S + + + \\
|
|
//--------------------------------------------------\\
|
|
|
|
// The history struct represents the history of the browsing
|
|
// session. It contains the current history position, the
|
|
// length of the active history space (this can be different
|
|
// from the available capacity in the Collection), and a
|
|
// collection array containing View structs representing
|
|
// each page in the current history. In general usage this
|
|
// struct should be initialized via the MakeHistory function.
|
|
type History struct {
|
|
Position int
|
|
Length int
|
|
Collection [20]View
|
|
}
|
|
|
|
//------------------------------------------------\\
|
|
// + + + R E C E I V E R S + + + \\
|
|
//--------------------------------------------------\\
|
|
|
|
// The "Add" receiver takes a view and adds it to
|
|
// the history struct that called it. "Add" returns
|
|
// nothing. "Add" will shift history down if the max
|
|
// history length would be exceeded, and will reset
|
|
// history length if something is added in the middle.
|
|
func (h *History) Add(v View) {
|
|
v.ParseMap()
|
|
if h.Position == h.Length-1 && h.Length < len(h.Collection) {
|
|
h.Collection[h.Length] = v
|
|
h.Length++
|
|
h.Position++
|
|
} else if h.Position == h.Length-1 && h.Length == 20 {
|
|
for x := 1; x < len(h.Collection); x++ {
|
|
h.Collection[x-1] = h.Collection[x]
|
|
}
|
|
h.Collection[len(h.Collection)-1] = v
|
|
} else {
|
|
h.Position += 1
|
|
h.Length = h.Position + 1
|
|
h.Collection[h.Position] = v
|
|
}
|
|
}
|
|
|
|
// The "Get" receiver is called by a history struct
|
|
// and returns a View from the current position, will
|
|
// return an error if history is empty and there is
|
|
// nothing to get.
|
|
func (h History) Get() (*View, error) {
|
|
if h.Position < 0 {
|
|
return nil, errors.New("History is empty, cannot get item from empty history.")
|
|
}
|
|
|
|
return &h.Collection[h.Position], nil
|
|
}
|
|
|
|
// The "GoBack" receiver is called by a history struct.
|
|
// When called it decrements the current position and
|
|
// displays the content for the View in that position.
|
|
// If history is at position 0, no action is taken.
|
|
func (h *History) GoBack() bool {
|
|
if h.Position > 0 {
|
|
h.Position--
|
|
return true
|
|
}
|
|
|
|
fmt.Print("\a")
|
|
return false
|
|
}
|
|
|
|
// The "GoForward" receiver is called by a history struct.
|
|
// When called it increments the current position and
|
|
// displays the content for the View in that position.
|
|
// If history is at position len - 1, no action is taken.
|
|
func (h *History) GoForward() bool {
|
|
if h.Position+1 < h.Length {
|
|
h.Position++
|
|
return true
|
|
}
|
|
|
|
fmt.Print("\a")
|
|
return false
|
|
}
|
|
|
|
// The "DisplayCurrentView" receiver is called by a history
|
|
// struct. It calls the Display receiver for th view struct
|
|
// at the current history position. "DisplayCurrentView" does
|
|
// not return anything, and does nothing if position is less
|
|
// that 0.
|
|
func (h *History) DisplayCurrentView() {
|
|
h.Collection[h.Position].Display()
|
|
}
|
|
|
|
//------------------------------------------------\\
|
|
// + + + F U N C T I O N S + + + \\
|
|
//--------------------------------------------------\\
|
|
|
|
// Constructor function for History struct.
|
|
// This is used to initialize history position
|
|
// as -1, which is needed. Returns a copy of
|
|
// initialized History struct (does NOT return
|
|
// a pointer to the struct).
|
|
func MakeHistory() History {
|
|
return History{-1, 0, [20]View{}}
|
|
}
|