github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/hud/tabview.go (about) 1 package hud 2 3 import ( 4 "fmt" 5 6 "github.com/gdamore/tcell" 7 8 "github.com/tilt-dev/tilt/internal/hud/view" 9 "github.com/tilt-dev/tilt/internal/rty" 10 "github.com/tilt-dev/tilt/pkg/model/logstore" 11 ) 12 13 type TabView struct { 14 view view.View 15 viewState view.ViewState 16 tabState view.TabState 17 } 18 19 func NewTabView(v view.View, vState view.ViewState) *TabView { 20 return &TabView{ 21 view: v, 22 viewState: vState, 23 tabState: vState.TabState, 24 } 25 } 26 27 func (v *TabView) Build() rty.Component { 28 l := rty.NewConcatLayout(rty.DirVert) 29 l.Add(v.buildTabs(false)) 30 31 log := rty.NewTextScrollLayout("log") 32 log.Add(rty.TextString(v.log())) 33 l.Add(log) 34 35 return l 36 } 37 38 func (v *TabView) log() string { 39 var numLinesNeeded = logLineCount 40 if v.viewState.TiltLogState == view.TiltLogShort { 41 numLinesNeeded = defaultLogPaneHeight 42 } 43 44 var spanID logstore.SpanID 45 switch v.tabState { 46 case view.TabBuildLog: 47 _, resource := selectedResource(v.view, v.viewState) 48 if !resource.CurrentBuild.Empty() { 49 spanID = resource.CurrentBuild.SpanID 50 } else { 51 spanID = resource.LastBuild().SpanID 52 } 53 case view.TabRuntimeLog: 54 _, resource := selectedResource(v.view, v.viewState) 55 if resource.ResourceInfo != nil { 56 spanID = resource.ResourceInfo.RuntimeSpanID() 57 } 58 } 59 60 reader := v.view.LogReader 61 result := "" 62 if v.tabState == view.TabAllLog { 63 result = reader.Tail(numLinesNeeded) 64 } else if spanID != "" { 65 result = reader.TailSpan(numLinesNeeded, spanID) 66 } 67 68 if result == "" { 69 return "(no logs received)" 70 } 71 return result 72 } 73 74 func (v *TabView) buildTab(text string) rty.Component { 75 return rty.TextString(fmt.Sprintf(" %s ", text)) 76 } 77 78 func (v *TabView) buildTabs(isMax bool) rty.Component { 79 l := rty.NewLine() 80 if v.tabState == view.TabAllLog { 81 l.Add(v.buildTab("1: ALL LOGS")) 82 } else { 83 l.Add(v.buildTab("1: all logs")) 84 } 85 l.Add(rty.TextString("│")) 86 if v.tabState == view.TabBuildLog { 87 l.Add(v.buildTab("2: BUILD LOG")) 88 } else { 89 l.Add(v.buildTab("2: build log")) 90 } 91 l.Add(rty.TextString("│")) 92 if v.tabState == view.TabRuntimeLog { 93 l.Add(v.buildTab("3: RUNTIME LOG")) 94 } else { 95 l.Add(v.buildTab("3: runtime log")) 96 } 97 l.Add(rty.TextString("│ ")) 98 l.Add(renderPaneHeader(isMax)) 99 result := rty.Bg(l, tcell.ColorWhiteSmoke) 100 result = rty.Fg(result, cText) 101 return result 102 }