make location column responsive, add compact rendering mode

pull/137/head
Simon Let 6 years ago
parent b1651cea07
commit 8b2e45c748
  1. 64
      cmd/cli/item.go
  2. 23
      cmd/cli/main.go
  3. 181
      cmd/cli/time.go

@ -65,68 +65,20 @@ func (i item) less(i2 item) bool {
// reversed order // reversed order
return i.score > i2.score return i.score > i2.score
} }
func (i item) drawItemColumns(compactRendering bool) itemColumns {
func formatDatetime(tm time.Time) string {
tmSince := time.Since(tm)
hrs := tmSince.Hours()
yrs := int(hrs / (365 * 24))
if yrs > 0 {
if yrs == 1 {
return "1 year ago"
}
return strconv.Itoa(yrs) + " years ago"
}
months := int(hrs / (30 * 24))
if months > 0 {
if months == 1 {
return "1 month ago"
}
return strconv.Itoa(months) + " months ago"
}
days := int(hrs / 24)
if days > 0 {
if days == 1 {
return "1 day ago"
}
return strconv.Itoa(days) + " days ago"
}
hrsInt := int(hrs)
if hrsInt > 0 {
if hrsInt == 1 {
return "1 hour ago"
}
return strconv.Itoa(hrsInt) + " hours ago"
}
mins := int(hrs * 60)
if mins > 0 {
if mins == 1 {
return "1 min ago"
}
return strconv.Itoa(mins) + " mins ago"
}
secs := int(hrs * 60 * 60)
if secs > 0 {
if secs == 1 {
return "1 sec ago"
}
return strconv.Itoa(secs) + " secs ago"
}
return "now"
}
func (i item) drawItemColumns() itemColumns {
// DISPLAY // DISPLAY
// DISPLAY > date // DISPLAY > date
secs := int64(i.realtimeBefore) secs := int64(i.realtimeBefore)
nsecs := int64((i.realtimeBefore - float64(secs)) * 1e9) nsecs := int64((i.realtimeBefore - float64(secs)) * 1e9)
tm := time.Unix(secs, nsecs) tm := time.Unix(secs, nsecs)
//date := tm.Format("2006-01-02 15:04 ")
// dateLength := len("12 months ago ") // longest date var date string
date := formatDatetime(tm) + " " if compactRendering {
// for len(date) < dateLength { date = formatTimeRelativeShort(tm) + " "
// date = " " + date } else {
// } date = formatTimeRelativeLong(tm) + " "
}
dateWithColor := highlightDate(date) dateWithColor := highlightDate(date)
// DISPLAY > location // DISPLAY > location

@ -412,10 +412,13 @@ func quit(g *gocui.Gui, v *gocui.View) error {
return gocui.ErrQuit return gocui.ErrQuit
} }
func getHeader() itemColumns { func getHeader(compactRendering bool) itemColumns {
date := "TIME " date := "TIME "
host := "HOST:" host := "HOST:"
dir := "DIRECTORY" dir := "DIRECTORY"
if compactRendering {
dir = "DIR"
}
flags := " FLAGS" flags := " FLAGS"
cmdLine := "COMMAND-LINE" cmdLine := "COMMAND-LINE"
return itemColumns{ return itemColumns{
@ -434,12 +437,19 @@ func getHeader() itemColumns {
} }
} }
const smallTerminalTresholdWidth = 110
func (m manager) normalMode(g *gocui.Gui, v *gocui.View) error { func (m manager) normalMode(g *gocui.Gui, v *gocui.View) error {
maxX, maxY := g.Size() maxX, maxY := g.Size()
compactRenderingMode := false
if maxX < smallTerminalTresholdWidth {
compactRenderingMode = true
}
data := []itemColumns{} data := []itemColumns{}
header := getHeader() header := getHeader(compactRenderingMode)
longestDateLen := len(header.date) longestDateLen := len(header.date)
longestLocationLen := len(header.host) + len(header.pwdTilde) longestLocationLen := len(header.host) + len(header.pwdTilde)
longestFlagsLen := 2 longestFlagsLen := 2
@ -447,7 +457,7 @@ func (m manager) normalMode(g *gocui.Gui, v *gocui.View) error {
if i == maxY { if i == maxY {
break break
} }
ic := itm.drawItemColumns() ic := itm.drawItemColumns(compactRenderingMode)
data = append(data, ic) data = append(data, ic)
if len(ic.date) > longestDateLen { if len(ic.date) > longestDateLen {
longestDateLen = len(ic.date) longestDateLen = len(ic.date)
@ -459,8 +469,9 @@ func (m manager) normalMode(g *gocui.Gui, v *gocui.View) error {
longestFlagsLen = len(ic.flags) longestFlagsLen = len(ic.flags)
} }
} }
if longestLocationLen > maxX/5 { maxLocationLen := maxX/7 + 8
longestLocationLen = maxX / 5 if longestLocationLen > maxLocationLen {
longestLocationLen = maxLocationLen
} }
if m.s.highlightedItem >= len(m.s.data) { if m.s.highlightedItem >= len(m.s.data) {
@ -498,7 +509,7 @@ func (m manager) normalMode(g *gocui.Gui, v *gocui.View) error {
displayStr, _ := itm.produceLine(longestDateLen, longestLocationLen, longestFlagsLen, true) displayStr, _ := itm.produceLine(longestDateLen, longestLocationLen, longestFlagsLen, true)
if m.s.highlightedItem == index { if m.s.highlightedItem == index {
// maxX * 2 because there are escape sequences that make it hard to tell the real string lenght // maxX * 2 because there are escape sequences that make it hard to tell the real string lenght
displayStr = doHighlightString(displayStr, maxX*2) displayStr = doHighlightString(displayStr, maxX*3)
if debug { if debug {
log.Println("### HightlightedItem string :", displayStr) log.Println("### HightlightedItem string :", displayStr)
} }

@ -0,0 +1,181 @@
package main
import (
"strconv"
"time"
)
func formatTimeRelativeLongest(tm time.Time) string {
tmSince := time.Since(tm)
hrs := tmSince.Hours()
yrs := int(hrs / (365 * 24))
if yrs > 0 {
if yrs == 1 {
return "1 year ago"
}
return strconv.Itoa(yrs) + " years ago"
}
months := int(hrs / (30 * 24))
if months > 0 {
if months == 1 {
return "1 month ago"
}
return strconv.Itoa(months) + " months ago"
}
days := int(hrs / 24)
if days > 0 {
if days == 1 {
return "1 day ago"
}
return strconv.Itoa(days) + " days ago"
}
hrsInt := int(hrs)
if hrsInt > 0 {
if hrsInt == 1 {
return "1 hour ago"
}
return strconv.Itoa(hrsInt) + " hours ago"
}
mins := int(hrs*60) % 60
if mins > 0 {
if mins == 1 {
return "1 min ago"
}
return strconv.Itoa(mins) + " mins ago"
}
secs := int(hrs*60*60) % 60
if secs > 0 {
if secs == 1 {
return "1 sec ago"
}
return strconv.Itoa(secs) + " secs ago"
}
return "now"
}
func formatTimeRelativeLong(tm time.Time) string {
tmSince := time.Since(tm)
hrs := tmSince.Hours()
yrs := int(hrs / (365 * 24))
if yrs > 0 {
if yrs == 1 {
return "1 year"
}
return strconv.Itoa(yrs) + " years"
}
months := int(hrs / (30 * 24))
if months > 0 {
if months == 1 {
return "1 month"
}
return strconv.Itoa(months) + " months"
}
days := int(hrs / 24)
if days > 0 {
if days == 1 {
return "1 day"
}
return strconv.Itoa(days) + " days"
}
hrsInt := int(hrs)
if hrsInt > 0 {
if hrsInt == 1 {
return "1 hour"
}
return strconv.Itoa(hrsInt) + " hours"
}
mins := int(hrs*60) % 60
if mins > 0 {
if mins == 1 {
return "1 min"
}
return strconv.Itoa(mins) + " mins"
}
secs := int(hrs*60*60) % 60
if secs > 0 {
if secs == 1 {
return "1 sec"
}
return strconv.Itoa(secs) + " secs"
}
return "now"
}
func formatTimeMixedLongest(tm time.Time) string {
tmSince := time.Since(tm)
hrs := tmSince.Hours()
yrs := int(hrs / (365 * 24))
if yrs > 0 {
if yrs == 1 {
return "1 year ago"
}
return strconv.Itoa(yrs) + " years ago"
}
months := int(hrs / (30 * 24))
if months > 0 {
if months == 1 {
return "1 month ago"
}
return strconv.Itoa(months) + " months ago"
}
days := int(hrs / 24)
if days > 0 {
if days == 1 {
return "1 day ago"
}
return strconv.Itoa(days) + " days ago"
}
hrsInt := int(hrs)
mins := int(hrs*60) % 60
return strconv.Itoa(hrsInt) + ":" + strconv.Itoa(mins)
}
func formatTimeRelativeShort(tm time.Time) string {
tmSince := time.Since(tm)
hrs := tmSince.Hours()
yrs := int(hrs / (365 * 24))
if yrs > 0 {
return strconv.Itoa(yrs) + " Y"
}
months := int(hrs / (30 * 24))
if months > 0 {
return strconv.Itoa(months) + " M"
}
days := int(hrs / 24)
if days > 0 {
return strconv.Itoa(days) + " D"
}
hrsInt := int(hrs)
if hrsInt > 0 {
return strconv.Itoa(hrsInt) + " h"
}
mins := int(hrs*60) % 60
if mins > 0 {
return strconv.Itoa(mins) + " m"
}
secs := int(hrs*60*60) % 60
if secs > 0 {
return strconv.Itoa(secs) + " s"
}
return "now"
}
func formatTimeMixedShort(tm time.Time) string {
tmSince := time.Since(tm)
hrs := tmSince.Hours()
yrs := int(hrs / (365 * 24))
if yrs > 0 {
return strconv.Itoa(yrs) + " Y"
}
months := int(hrs / (30 * 24))
if months > 0 {
return strconv.Itoa(months) + " M"
}
days := int(hrs / 24)
if days > 0 {
return strconv.Itoa(days) + " D"
}
hrsInt := int(hrs)
mins := int(hrs*60) % 60
return strconv.Itoa(hrsInt) + ":" + strconv.Itoa(mins)
}
Loading…
Cancel
Save