gomu/start.go

220 lines
4.5 KiB
Go
Raw Normal View History

2020-06-22 00:05:56 +08:00
// Copyright (C) 2020 Raziman
2020-06-19 16:29:51 +08:00
package main
import (
2020-06-25 10:46:45 +08:00
"os"
2020-06-19 16:29:51 +08:00
"github.com/gdamore/tcell"
"github.com/rivo/tview"
2020-06-24 20:09:47 +08:00
"github.com/spf13/viper"
2020-06-19 16:29:51 +08:00
)
2020-06-26 12:54:48 +08:00
var (
2020-06-26 17:09:15 +08:00
app *tview.Application
playingBar *PlayingBar
queue *Queue
playlist *Playlist
player *Player
pages *tview.Pages
prevPanel Children
popupBg = tcell.GetColor("#0A0F14")
textColor = tcell.ColorWhite
accentColor = tcell.ColorDarkCyan
2020-06-26 12:54:48 +08:00
)
func start(application *tview.Application) {
2020-06-19 16:29:51 +08:00
// override default border
// change double line border to one line border when focused
tview.Borders.HorizontalFocus = tview.Borders.Horizontal
tview.Borders.VerticalFocus = tview.Borders.Vertical
tview.Borders.TopLeftFocus = tview.Borders.TopLeft
tview.Borders.TopRightFocus = tview.Borders.TopRight
tview.Borders.BottomLeftFocus = tview.Borders.BottomLeft
tview.Borders.BottomRightFocus = tview.Borders.BottomRight
tview.Styles.PrimitiveBackgroundColor = tcell.ColorDefault
2020-06-24 20:09:47 +08:00
tview.Styles.BorderColor = tcell.ColorWhite
2020-06-19 16:29:51 +08:00
2020-06-26 12:54:48 +08:00
player = &Player{}
app = application
playingBar = InitPlayingBar()
queue = InitQueue()
playlist = InitPlaylist()
2020-06-25 14:12:19 +08:00
2020-06-26 12:54:48 +08:00
flex := Layout()
pages = tview.NewPages().AddPage("main", flex, true, true)
2020-06-25 14:12:19 +08:00
2020-06-26 17:09:15 +08:00
playlist.SetBorderColor(accentColor)
playlist.SetTitleColor(accentColor)
prevPanel = playlist
2020-06-25 14:12:19 +08:00
2020-06-26 17:09:15 +08:00
childrens := []Children{playlist, queue, playingBar}
2020-06-19 16:29:51 +08:00
2020-06-26 12:54:48 +08:00
application.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
2020-06-19 16:29:51 +08:00
switch event.Key() {
// cycle through each section
case tcell.KeyTAB:
2020-06-26 17:09:15 +08:00
prevPanel = cycleChildren(application, childrens)
2020-06-19 16:29:51 +08:00
}
switch event.Rune() {
case 'q':
2020-06-19 16:42:30 +08:00
2020-06-25 10:46:45 +08:00
if !viper.GetBool("confirm_on_exit") {
2020-06-26 12:54:48 +08:00
application.Stop()
2020-06-24 20:09:47 +08:00
}
2020-06-26 12:54:48 +08:00
confirmationPopup("Are you sure to exit?", func(_ int, label string) {
2020-06-19 16:42:30 +08:00
2020-06-19 16:29:51 +08:00
if label == "yes" {
2020-06-26 12:54:48 +08:00
application.Stop()
2020-06-19 16:29:51 +08:00
} else {
pages.RemovePage("confirmation-popup")
}
})
2020-06-21 00:00:17 +08:00
case ' ':
2020-06-23 20:15:29 +08:00
player.TogglePause()
2020-06-21 23:47:12 +08:00
case '+':
2020-06-27 17:18:10 +08:00
v := int(player.volume*10) + 50
2020-06-26 17:09:15 +08:00
if v < 50 {
vol := player.Volume(0.5)
volumePopup(vol)
}
2020-06-21 23:47:12 +08:00
case '-':
2020-06-27 17:18:10 +08:00
v := int(player.volume*10) + 50
2020-06-26 17:09:15 +08:00
if v > 0 {
vol := player.Volume(-0.5)
volumePopup(vol)
}
2020-06-21 00:00:17 +08:00
2020-06-23 18:42:18 +08:00
case 'n':
player.Skip()
2020-06-27 00:09:59 +08:00
case '?':
name, _ := pages.GetFrontPage()
if name == "help-page" {
pages.RemovePage(name)
app.SetFocus(prevPanel.(tview.Primitive))
} else {
helpPopup()
}
2020-06-19 16:29:51 +08:00
}
return event
})
// fix transparent background issue
2020-06-26 12:54:48 +08:00
application.SetBeforeDrawFunc(func(screen tcell.Screen) bool {
2020-06-19 16:29:51 +08:00
screen.Clear()
return false
})
// main loop
2020-06-26 17:09:15 +08:00
if err := application.SetRoot(pages, true).SetFocus(playlist).Run(); err != nil {
2020-06-21 23:47:12 +08:00
log(err.Error())
2020-06-19 16:29:51 +08:00
}
}
// created so we can keep track of childrens in slices
type Children interface {
HasFocus() bool
SetBorderColor(color tcell.Color) *tview.Box
SetTitleColor(color tcell.Color) *tview.Box
SetTitle(s string) *tview.Box
GetTitle() string
}
func cycleChildren(app *tview.Application, childrens []Children) Children {
2020-06-19 16:29:51 +08:00
2020-06-26 12:54:48 +08:00
focusedColor := accentColor
unfocusedColor := textColor
2020-06-19 16:29:51 +08:00
anyChildHasFocus := false
for i, child := range childrens {
if child.HasFocus() {
anyChildHasFocus = true
var nextChild Children
// if its the last element set the child back to one
2020-06-19 16:42:30 +08:00
if i == len(childrens)-1 {
2020-06-19 16:29:51 +08:00
nextChild = childrens[0]
} else {
2020-06-19 16:42:30 +08:00
nextChild = childrens[i+1]
2020-06-19 16:29:51 +08:00
}
2020-06-19 16:42:30 +08:00
child.SetBorderColor(unfocusedColor)
2020-06-19 16:29:51 +08:00
child.SetTitleColor(unfocusedColor)
app.SetFocus(nextChild.(tview.Primitive))
nextChild.SetBorderColor(focusedColor)
nextChild.SetTitleColor(focusedColor)
return nextChild
2020-06-19 16:29:51 +08:00
}
}
2020-06-26 17:09:15 +08:00
first := childrens[0]
2020-06-19 16:29:51 +08:00
if anyChildHasFocus == false {
2020-06-19 16:42:30 +08:00
app.SetFocus(first.(tview.Primitive))
first.SetBorderColor(focusedColor)
first.SetTitleColor(focusedColor)
2020-06-19 16:29:51 +08:00
}
return first
2020-06-19 16:29:51 +08:00
}
2020-06-24 20:09:47 +08:00
func readConfig() {
2020-06-26 12:54:48 +08:00
home, err := os.UserHomeDir()
2020-06-25 10:46:45 +08:00
configPath := home + "/.config/gomu/config"
if err != nil {
panic(err)
}
viper.SetConfigName("config")
viper.SetConfigType("yaml")
2020-06-24 20:09:47 +08:00
viper.AddConfigPath("/etc/gomu")
2020-06-25 10:46:45 +08:00
viper.AddConfigPath(home + "/.gomu")
2020-06-24 20:09:47 +08:00
viper.AddConfigPath("$HOME/.config/gomu")
if err := viper.ReadInConfig(); err != nil {
2020-06-25 10:46:45 +08:00
viper.SetDefault("music_dir", "~/music")
viper.SetDefault("confirm_on_exit", true)
2020-06-26 17:09:15 +08:00
viper.SetDefault("confirm_bulk_add", true)
viper.SetDefault("popup_timeout", 10)
2020-06-25 10:46:45 +08:00
// creates gomu config dir if does not exist
if _, err := os.Stat(configPath); err != nil {
2020-06-26 12:54:48 +08:00
if err := os.MkdirAll(home+"/.config/gomu", 0755); err != nil {
2020-06-25 10:46:45 +08:00
panic(err)
}
}
// if config file was not found
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
if err := viper.SafeWriteConfigAs(configPath); err != nil {
panic(err)
}
}
2020-06-24 20:09:47 +08:00
}
}