mirror of
https://github.com/jesseduffield/lazygit.git
synced 2024-12-04 10:34:55 +02:00
81 lines
1.6 KiB
Go
81 lines
1.6 KiB
Go
package gui
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/jesseduffield/gocui"
|
|
"github.com/jesseduffield/lazygit/pkg/utils"
|
|
)
|
|
|
|
type appStatus struct {
|
|
name string
|
|
statusType string
|
|
duration int
|
|
}
|
|
|
|
type statusManager struct {
|
|
statuses []appStatus
|
|
}
|
|
|
|
func (m *statusManager) removeStatus(name string) {
|
|
newStatuses := []appStatus{}
|
|
for _, status := range m.statuses {
|
|
if status.name != name {
|
|
newStatuses = append(newStatuses, status)
|
|
}
|
|
}
|
|
m.statuses = newStatuses
|
|
}
|
|
|
|
func (m *statusManager) addWaitingStatus(name string) {
|
|
m.removeStatus(name)
|
|
newStatus := appStatus{
|
|
name: name,
|
|
statusType: "waiting",
|
|
duration: 0,
|
|
}
|
|
m.statuses = append([]appStatus{newStatus}, m.statuses...)
|
|
}
|
|
|
|
func (m *statusManager) getStatusString() string {
|
|
if len(m.statuses) == 0 {
|
|
return ""
|
|
}
|
|
topStatus := m.statuses[0]
|
|
if topStatus.statusType == "waiting" {
|
|
return topStatus.name + " " + utils.Loader()
|
|
}
|
|
return topStatus.name
|
|
}
|
|
|
|
// WithWaitingStatus wraps a function and shows a waiting status while the function is still executing
|
|
func (gui *Gui) WithWaitingStatus(name string, f func() error) error {
|
|
go func() {
|
|
gui.statusManager.addWaitingStatus(name)
|
|
|
|
defer func() {
|
|
gui.statusManager.removeStatus(name)
|
|
}()
|
|
|
|
go func() {
|
|
ticker := time.NewTicker(time.Millisecond * 50)
|
|
defer ticker.Stop()
|
|
for range ticker.C {
|
|
appStatus := gui.statusManager.getStatusString()
|
|
if appStatus == "" {
|
|
return
|
|
}
|
|
gui.renderString("appStatus", appStatus)
|
|
}
|
|
}()
|
|
|
|
if err := f(); err != nil {
|
|
gui.g.Update(func(g *gocui.Gui) error {
|
|
return gui.surfaceError(err)
|
|
})
|
|
}
|
|
}()
|
|
|
|
return nil
|
|
}
|