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  }