Should have commited before
Not sure what all changed
This commit is contained in:
		
							
								
								
									
										17
									
								
								sort.go
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								sort.go
									
									
									
									
									
								
							@@ -8,7 +8,8 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Flags for defining sort element and order.
 | 
					// Flags for defining sort element and order.
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
	SORT_START_DATE_ASC = iota
 | 
						SORT_UNFINISHED_START = iota
 | 
				
			||||||
 | 
						SORT_START_DATE_ASC
 | 
				
			||||||
	SORT_START_DATE_DESC
 | 
						SORT_START_DATE_DESC
 | 
				
			||||||
	SORT_FINISH_DATE_ASC
 | 
						SORT_FINISH_DATE_ASC
 | 
				
			||||||
	SORT_FINISH_DATE_DESC
 | 
						SORT_FINISH_DATE_DESC
 | 
				
			||||||
@@ -18,6 +19,8 @@ const (
 | 
				
			|||||||
// See constants SORT_* for fields and sort order.
 | 
					// See constants SORT_* for fields and sort order.
 | 
				
			||||||
func (timerlist *TimerList) Sort(sortFlag int) error {
 | 
					func (timerlist *TimerList) Sort(sortFlag int) error {
 | 
				
			||||||
	switch sortFlag {
 | 
						switch sortFlag {
 | 
				
			||||||
 | 
						case SORT_UNFINISHED_START:
 | 
				
			||||||
 | 
							timerlist.sortByUnfinishedThenStart()
 | 
				
			||||||
	case SORT_START_DATE_ASC, SORT_START_DATE_DESC:
 | 
						case SORT_START_DATE_ASC, SORT_START_DATE_DESC:
 | 
				
			||||||
		timerlist.sortByStartDate(sortFlag)
 | 
							timerlist.sortByStartDate(sortFlag)
 | 
				
			||||||
	case SORT_FINISH_DATE_ASC, SORT_FINISH_DATE_DESC:
 | 
						case SORT_FINISH_DATE_ASC, SORT_FINISH_DATE_DESC:
 | 
				
			||||||
@@ -81,3 +84,15 @@ func (timerlist *TimerList) sortByFinishDate(order int) *TimerList {
 | 
				
			|||||||
	})
 | 
						})
 | 
				
			||||||
	return timerlist
 | 
						return timerlist
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (timerlist *TimerList) sortByUnfinishedThenStart() *TimerList {
 | 
				
			||||||
 | 
						timerlist.sortBy(func(t1, t2 *Timer) bool {
 | 
				
			||||||
 | 
							if t1.FinishDate.IsZero() && !t2.FinishDate.IsZero() {
 | 
				
			||||||
 | 
								return true
 | 
				
			||||||
 | 
							} else if t2.FinishDate.IsZero() && !t1.FinishDate.IsZero() {
 | 
				
			||||||
 | 
								return false
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return sortByDate(false, t1.StartDate, t2.StartDate)
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						return timerlist
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										41
									
								
								timer.go
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								timer.go
									
									
									
									
									
								
							@@ -43,7 +43,7 @@ func (timer Timer) String() string {
 | 
				
			|||||||
	var text string
 | 
						var text string
 | 
				
			||||||
	if timer.Finished {
 | 
						if timer.Finished {
 | 
				
			||||||
		text += "x "
 | 
							text += "x "
 | 
				
			||||||
		if timer.HasFinishDate() {
 | 
							if !timer.FinishDate.IsZero() {
 | 
				
			||||||
			text += fmt.Sprintf("%s ", timer.FinishDate.Format(DateLayout))
 | 
								text += fmt.Sprintf("%s ", timer.FinishDate.Format(DateLayout))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -76,10 +76,10 @@ func (timer Timer) String() string {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewTimer creates a new empty Timer with default values. (StartDate is set to Now())
 | 
					// NewTimer creates a new empty Timer with default values. (StartDate is set to Now())
 | 
				
			||||||
func NewTimer() Timer {
 | 
					func NewTimer() *Timer {
 | 
				
			||||||
	timer := Timer{}
 | 
						timer := Timer{}
 | 
				
			||||||
	timer.StartDate = time.Now()
 | 
						timer.StartDate = time.Now()
 | 
				
			||||||
	return timer
 | 
						return &timer
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ParseTimer parses the input text string into a Timer struct
 | 
					// ParseTimer parses the input text string into a Timer struct
 | 
				
			||||||
@@ -104,13 +104,15 @@ func ParseTimer(text string) (*Timer, error) {
 | 
				
			|||||||
	originalParts = originalParts[1:]
 | 
						originalParts = originalParts[1:]
 | 
				
			||||||
	var notes []string
 | 
						var notes []string
 | 
				
			||||||
	for _, v := range originalParts {
 | 
						for _, v := range originalParts {
 | 
				
			||||||
		if strings.HasPrefix("@", v) {
 | 
							if strings.HasPrefix(v, "@") {
 | 
				
			||||||
 | 
								v = strings.TrimPrefix(v, "@")
 | 
				
			||||||
			// Contexts
 | 
								// Contexts
 | 
				
			||||||
			timer.Contexts = append(timer.Contexts, v)
 | 
								timer.Contexts = append(timer.Contexts, v)
 | 
				
			||||||
		} else if strings.HasPrefix("+", v) {
 | 
							} else if strings.HasPrefix(v, "+") {
 | 
				
			||||||
			// Projects
 | 
								// Projects
 | 
				
			||||||
 | 
								v = strings.TrimPrefix(v, "+")
 | 
				
			||||||
			timer.Projects = append(timer.Projects, v)
 | 
								timer.Projects = append(timer.Projects, v)
 | 
				
			||||||
		} else if strings.Contains(":", v) {
 | 
							} else if strings.Contains(v, ":") {
 | 
				
			||||||
			// Additional tags
 | 
								// Additional tags
 | 
				
			||||||
			tagPts := strings.Split(v, ":")
 | 
								tagPts := strings.Split(v, ":")
 | 
				
			||||||
			if tagPts[0] != "" && tagPts[1] != "" {
 | 
								if tagPts[0] != "" && tagPts[1] != "" {
 | 
				
			||||||
@@ -122,7 +124,7 @@ func ParseTimer(text string) (*Timer, error) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	timer.Notes = strings.Join(notes, " ")
 | 
						timer.Notes = strings.Join(notes, " ")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return timer, nil
 | 
						return &timer, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Timer returns a complete timer string in timer.txt format.
 | 
					// Timer returns a complete timer string in timer.txt format.
 | 
				
			||||||
@@ -133,7 +135,7 @@ func (timer *Timer) Timer() string {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Finish sets Timer.Finished to true if the timer hasn't already been finished.
 | 
					// Finish sets Timer.Finished to true if the timer hasn't already been finished.
 | 
				
			||||||
// Also sets Timer.FinishDate to time.Now()
 | 
					// Also sets Timer.FinishDate to time.Now()
 | 
				
			||||||
func (timer *Timer) Finish() bool {
 | 
					func (timer *Timer) Finish() {
 | 
				
			||||||
	if !timer.Finished {
 | 
						if !timer.Finished {
 | 
				
			||||||
		timer.Finished = true
 | 
							timer.Finished = true
 | 
				
			||||||
		timer.FinishDate = time.Now()
 | 
							timer.FinishDate = time.Now()
 | 
				
			||||||
@@ -148,3 +150,26 @@ func (timer *Timer) Reopen() {
 | 
				
			|||||||
		timer.FinishDate = time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC) // time.IsZero() value
 | 
							timer.FinishDate = time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC) // time.IsZero() value
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (timer *Timer) Duration() time.Duration {
 | 
				
			||||||
 | 
						end := time.Now()
 | 
				
			||||||
 | 
						if !timer.FinishDate.IsZero() {
 | 
				
			||||||
 | 
							end = timer.FinishDate
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return end.Sub(timer.StartDate)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (timer *Timer) ActiveToday() bool {
 | 
				
			||||||
 | 
						return timer.ActiveOnDay(time.Now())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (timer *Timer) ActiveOnDay(t time.Time) bool {
 | 
				
			||||||
 | 
						f := "2006/01/02"
 | 
				
			||||||
 | 
						tStr := t.Format(f)
 | 
				
			||||||
 | 
						// If StartDate or FinishDate is _on_ t, true
 | 
				
			||||||
 | 
						if timer.StartDate.Format(f) == tStr || timer.FinishDate.Format(f) == tStr {
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// Otherwise, if StartDate is before t and FinishDate is after t
 | 
				
			||||||
 | 
						return timer.StartDate.Before(t) && timer.FinishDate.After(t)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										40
									
								
								timerlist.go
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								timerlist.go
									
									
									
									
									
								
							@@ -2,6 +2,7 @@ package timertxt
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"bufio"
 | 
						"bufio"
 | 
				
			||||||
 | 
						"errors"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"io/ioutil"
 | 
						"io/ioutil"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
@@ -13,15 +14,32 @@ import (
 | 
				
			|||||||
type TimerList []Timer
 | 
					type TimerList []Timer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewTimerList creates a new empty TimerList.
 | 
					// NewTimerList creates a new empty TimerList.
 | 
				
			||||||
func NewTimerList() TimerList {
 | 
					func NewTimerList() *TimerList {
 | 
				
			||||||
	timerlist := TimerList{}
 | 
						return &TimerList{}
 | 
				
			||||||
	return timerlist
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (timerlist *TimerList) GetTimersInRange(start, end time.Time) *TimerList {
 | 
				
			||||||
 | 
						t := *NewTimerList()
 | 
				
			||||||
 | 
						for _, v := range *timerlist {
 | 
				
			||||||
 | 
							if v.FinishDate.Before(end) && 
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return &t
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (timerlist *TimerList) GetActiveTimers() *TimerList {
 | 
				
			||||||
 | 
						t := *NewTimerList()
 | 
				
			||||||
 | 
						for _, v := range *timerlist {
 | 
				
			||||||
 | 
							if v.FinishDate.IsZero() {
 | 
				
			||||||
 | 
								t = append(t, v)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return &t
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// String returns a complete list of timers in timer.txt format.
 | 
					// String returns a complete list of timers in timer.txt format.
 | 
				
			||||||
func (timerlist TimerList) String() string {
 | 
					func (timerlist *TimerList) String() string {
 | 
				
			||||||
	var ret string
 | 
						var ret string
 | 
				
			||||||
	for _, timer := range timerlist {
 | 
						for _, timer := range *timerlist {
 | 
				
			||||||
		ret += fmt.Sprintf("%s\n", timer.String())
 | 
							ret += fmt.Sprintf("%s\n", timer.String())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return ret
 | 
						return ret
 | 
				
			||||||
@@ -47,7 +65,7 @@ func (timerlist *TimerList) GetTimer(id int) (*Timer, error) {
 | 
				
			|||||||
			return &([]Timer(*timerlist))[i], nil
 | 
								return &([]Timer(*timerlist))[i], nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return nil, errors.new("timer not found")
 | 
						return nil, errors.New("timer not found")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// RemoveTimerById removes any Timer with given Timer 'id' from the TimerList.
 | 
					// RemoveTimerById removes any Timer with given Timer 'id' from the TimerList.
 | 
				
			||||||
@@ -63,7 +81,7 @@ func (timerlist *TimerList) RemoveTimerById(id int) error {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if !found {
 | 
						if !found {
 | 
				
			||||||
		return errors.new("timer not found")
 | 
							return errors.New("timer not found")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	*timerlist = newList
 | 
						*timerlist = newList
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
@@ -126,6 +144,14 @@ func (timerlist *TimerList) LoadFromFile(file *os.File) error {
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// WriteToFile writes a TimerList to *os.File
 | 
				
			||||||
 | 
					func (timerlist *TimerList) WriteToFile(file *os.File) error {
 | 
				
			||||||
 | 
						writer := bufio.NewWriter(file)
 | 
				
			||||||
 | 
						_, err := writer.WriteString(timerlist.String())
 | 
				
			||||||
 | 
						writer.Flush()
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// WriteToFile writes a TimerList to *os.File.
 | 
					// WriteToFile writes a TimerList to *os.File.
 | 
				
			||||||
func (timerlist *TimerList) LoadFromFilename(filename string) error {
 | 
					func (timerlist *TimerList) LoadFromFilename(filename string) error {
 | 
				
			||||||
	file, err := os.Open(filename)
 | 
						file, err := os.Open(filename)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user