You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

124 lines
3.9 KiB

package ui
import (
"github.com/RasmusLindroth/tut/config"
"github.com/rivo/tview"
)
type MainView struct {
View *tview.Flex
update chan bool
}
func NewMainView(tv *TutView, update chan bool) *MainView {
mv := &MainView{
View: mainViewUI(tv),
update: update,
}
go func() {
for range mv.update {
tv.tut.App.QueueUpdateDraw(func() {
*tv.MainView.View = *mainViewUI(tv)
tv.ShouldSync()
})
}
}()
return mv
}
func (mv *MainView) ForceUpdate() {
mv.update <- true
}
func feedList(mv *TutView, fh *FeedHolder) *tview.Flex {
iw := 3
if !mv.tut.Config.General.ShowIcons {
iw = 0
}
return tview.NewFlex().SetDirection(tview.FlexColumn).
AddItem(fh.GetFeedList().Text, 0, 1, false).
AddItem(fh.GetFeedList().Symbol, iw, 0, false)
}
func mainViewUI(mv *TutView) *tview.Flex {
vl := NewVerticalLine(mv.tut.Config)
hl := NewHorizontalLine(mv.tut.Config)
lp := mv.tut.Config.General.ListProportion
cp := mv.tut.Config.General.ContentProportion
var list *tview.Flex
if mv.tut.Config.General.ListSplit == config.ListColumn {
list = tview.NewFlex().SetDirection(tview.FlexColumn)
} else {
list = tview.NewFlex().SetDirection(tview.FlexRow)
}
if mv.tut.Config.General.ListSplit == config.ListColumn {
feeds := tview.NewFlex()
for _, fh := range mv.Timeline.Feeds {
if mv.tut.Config.General.TimelineName && len(fh.Name) > 0 {
txt := NewTextView(mv.tut.Config)
txt.SetText(tview.Escape(fh.Name))
txt.SetBackgroundColor(mv.tut.Config.Style.TimelineNameBackground)
txt.SetTextColor(mv.tut.Config.Style.TimelineNameText)
feeds.AddItem(tview.NewFlex().SetDirection(tview.FlexRow).
AddItem(txt, 1, 0, false).
AddItem(feedList(mv, fh), 0, 1, false), 0, 1, false)
} else {
feeds.AddItem(feedList(mv, fh), 0, 1, false)
}
}
list.AddItem(tview.NewFlex().SetDirection(tview.FlexRow).
AddItem(feeds, 0, 1, false), 0, 1, false)
} else {
feeds := tview.NewFlex().SetDirection(tview.FlexRow)
for _, fh := range mv.Timeline.Feeds {
if mv.tut.Config.General.TimelineName && len(fh.Name) > 0 {
txt := NewTextView(mv.tut.Config)
txt.SetText(tview.Escape(fh.Name))
txt.SetBackgroundColor(mv.tut.Config.Style.TimelineNameBackground)
txt.SetTextColor(mv.tut.Config.Style.TimelineNameText)
feeds.AddItem(txt, 1, 0, false)
}
feeds.AddItem(feedList(mv, fh), 0, 1, false)
}
list.AddItem(feeds, 0, 1, false)
}
fc := mv.Timeline.GetFeedContent()
content := fc.Main
controls := fc.Controls
r := tview.NewFlex().SetDirection(tview.FlexRow)
if mv.tut.Config.General.TerminalTitle < 2 {
r.AddItem(mv.Shared.Top.View, 1, 0, false)
}
if mv.tut.Config.General.ListPlacement == config.ListPlacementTop {
r.AddItem(list, 0, lp, false).
AddItem(hl, 1, 0, false).
AddItem(content, 0, cp, false).
AddItem(controls, 1, 0, false).
AddItem(mv.Shared.Bottom.View, 2, 0, false)
} else if mv.tut.Config.General.ListPlacement == config.ListPlacementBottom {
r.AddItem(content, 0, cp, false).
AddItem(controls, 1, 0, false).
AddItem(hl, 1, 0, false).
AddItem(list, 0, lp, false).
AddItem(mv.Shared.Bottom.View, 2, 0, false)
} else if mv.tut.Config.General.ListPlacement == config.ListPlacementLeft {
r.AddItem(tview.NewFlex().SetDirection(tview.FlexColumn).
AddItem(list, 0, lp, false).
AddItem(vl, 1, 0, false).
AddItem(tview.NewFlex().SetDirection(tview.FlexRow).
AddItem(content, 0, 1, false).
AddItem(controls, 1, 0, false), 0, cp, false), 0, 1, false).
AddItem(mv.Shared.Bottom.View, 2, 0, false)
} else if mv.tut.Config.General.ListPlacement == config.ListPlacementRight {
r.AddItem(tview.NewFlex().SetDirection(tview.FlexColumn).
AddItem(tview.NewFlex().SetDirection(tview.FlexRow).
AddItem(content, 0, 1, false).
AddItem(controls, 1, 0, false), 0, cp, false).
AddItem(vl, 1, 0, false).
AddItem(list, 0, lp, false), 0, 1, false).
AddItem(mv.Shared.Bottom.View, 2, 0, false)
}
return r
}