Merge pull request #19 from aditya-K2/err
Better Error Handling and Notifications
This commit is contained in:
commit
c68a598046
124
main.go
124
main.go
@ -24,6 +24,8 @@ func main() {
|
|||||||
var mpdConnectionError error
|
var mpdConnectionError error
|
||||||
CONN, mpdConnectionError := mpd.Dial("tcp", "localhost:"+viper.GetString("MPD_PORT"))
|
CONN, mpdConnectionError := mpd.Dial("tcp", "localhost:"+viper.GetString("MPD_PORT"))
|
||||||
if mpdConnectionError != nil {
|
if mpdConnectionError != nil {
|
||||||
|
utils.Print("RED", "Could Not Connect to MPD Server\n")
|
||||||
|
utils.Print("GREEN", "Make Sure You Mention the Correct MPD Port in the config file.\n")
|
||||||
panic(mpdConnectionError)
|
panic(mpdConnectionError)
|
||||||
}
|
}
|
||||||
defer CONN.Close()
|
defer CONN.Close()
|
||||||
@ -40,12 +42,16 @@ func main() {
|
|||||||
// Connecting the Renderer to the Main UI
|
// Connecting the Renderer to the Main UI
|
||||||
ui.ConnectRenderer(Renderer)
|
ui.ConnectRenderer(Renderer)
|
||||||
|
|
||||||
c, _ := CONN.CurrentSong()
|
if c, err := CONN.CurrentSong(); err != nil {
|
||||||
|
utils.Print("RED", "Could Not Retrieve the Current Song\n")
|
||||||
|
panic(err)
|
||||||
|
} else {
|
||||||
if len(c) != 0 {
|
if len(c) != 0 {
|
||||||
Renderer.Start(c["file"])
|
Renderer.Start(c["file"])
|
||||||
} else {
|
} else {
|
||||||
Renderer.Start("stop")
|
Renderer.Start("stop")
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
UI := ui.NewApplication()
|
UI := ui.NewApplication()
|
||||||
|
|
||||||
@ -53,6 +59,11 @@ func main() {
|
|||||||
notify.ConnectUI(UI)
|
notify.ConnectUI(UI)
|
||||||
|
|
||||||
fileMap, err := CONN.ListAllInfo("/")
|
fileMap, err := CONN.ListAllInfo("/")
|
||||||
|
if err != nil {
|
||||||
|
utils.Print("RED", "Could Not Generate the File Map\n")
|
||||||
|
utils.Print("GREEN", "Make Sure You Mention the Correct MPD Port in the config file.\n")
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
// Generating the Directory Tree for File Navigation.
|
// Generating the Directory Tree for File Navigation.
|
||||||
dirTree := client.GenerateDirectoryTree(fileMap)
|
dirTree := client.GenerateDirectoryTree(fileMap)
|
||||||
@ -60,13 +71,25 @@ func main() {
|
|||||||
// Default View upon Opening is of Playlist.
|
// Default View upon Opening is of Playlist.
|
||||||
client.UpdatePlaylist(UI.ExpandedView)
|
client.UpdatePlaylist(UI.ExpandedView)
|
||||||
|
|
||||||
_v, _ := CONN.Status()
|
var Volume int64
|
||||||
|
var Random, Repeat bool
|
||||||
|
|
||||||
|
if _v, err := CONN.Status(); err != nil {
|
||||||
|
utils.Print("RED", "Could Not Get the MPD Status\n")
|
||||||
|
panic(err)
|
||||||
|
} else {
|
||||||
// Setting Volume, Random and Repeat Values
|
// Setting Volume, Random and Repeat Values
|
||||||
Volume, _ := strconv.ParseInt(_v["volume"], 10, 64)
|
Volume, _ = strconv.ParseInt(_v["volume"], 10, 64)
|
||||||
Random, _ := strconv.ParseBool(_v["random"])
|
Random, _ = strconv.ParseBool(_v["random"])
|
||||||
Repeat, _ := strconv.ParseBool(_v["repeat"])
|
Repeat, _ = strconv.ParseBool(_v["repeat"])
|
||||||
|
}
|
||||||
|
|
||||||
ArtistTree, err := client.GenerateArtistTree()
|
ArtistTree, err := client.GenerateArtistTree()
|
||||||
|
if err != nil {
|
||||||
|
utils.Print("RED", "Could Not Generate the ArtistTree\n")
|
||||||
|
utils.Print("GREEN", "Make Sure You Mention the Correct MPD Port in the config file.\n")
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
// Used for Fuzzy Searching
|
// Used for Fuzzy Searching
|
||||||
ArtistTreeContent := utils.ConvertToArray(ArtistTree)
|
ArtistTreeContent := utils.ConvertToArray(ArtistTree)
|
||||||
@ -106,8 +129,15 @@ func main() {
|
|||||||
r, _ := UI.ExpandedView.GetSelection()
|
r, _ := UI.ExpandedView.GetSelection()
|
||||||
ui.SetFocus("FileBrowser")
|
ui.SetFocus("FileBrowser")
|
||||||
if len(dirTree.Children[r].Children) == 0 {
|
if len(dirTree.Children[r].Children) == 0 {
|
||||||
id, _ := CONN.AddId(dirTree.Children[r].AbsolutePath, -1)
|
if id, err := CONN.AddId(dirTree.Children[r].AbsolutePath, -1); err != nil {
|
||||||
CONN.PlayId(id)
|
Notify.Send(fmt.Sprintf("Could not Add Song %s",
|
||||||
|
dirTree.Children[r].Path))
|
||||||
|
} else {
|
||||||
|
if err := CONN.PlayId(id); err != nil {
|
||||||
|
Notify.Send(fmt.Sprintf("Could Not Play Song %s",
|
||||||
|
dirTree.Children[r].Path))
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
client.Update(dirTree.Children[r].Children, UI.ExpandedView)
|
client.Update(dirTree.Children[r].Children, UI.ExpandedView)
|
||||||
dirTree = &dirTree.Children[r]
|
dirTree = &dirTree.Children[r]
|
||||||
@ -115,7 +145,9 @@ func main() {
|
|||||||
}
|
}
|
||||||
} else if ui.HasFocus("Playlist") {
|
} else if ui.HasFocus("Playlist") {
|
||||||
r, _ := UI.ExpandedView.GetSelection()
|
r, _ := UI.ExpandedView.GetSelection()
|
||||||
CONN.Play(r)
|
if err := CONN.Play(r); err != nil {
|
||||||
|
Notify.Send("Could Not Play the Song")
|
||||||
|
}
|
||||||
} else if ui.HasFocus("SearchView") {
|
} else if ui.HasFocus("SearchView") {
|
||||||
r, _ := UI.ExpandedView.GetSelection()
|
r, _ := UI.ExpandedView.GetSelection()
|
||||||
client.AddToPlaylist(SearchContentSlice[r], true)
|
client.AddToPlaylist(SearchContentSlice[r], true)
|
||||||
@ -123,8 +155,14 @@ func main() {
|
|||||||
r, _ := UI.ExpandedView.GetSelection()
|
r, _ := UI.ExpandedView.GetSelection()
|
||||||
ui.SetFocus("FileBrowser")
|
ui.SetFocus("FileBrowser")
|
||||||
if len(dirTree.Children[r].Children) == 0 {
|
if len(dirTree.Children[r].Children) == 0 {
|
||||||
id, _ := CONN.AddId(dirTree.Children[Matches[r].Index].AbsolutePath, -1)
|
if id, err := CONN.AddId(dirTree.Children[Matches[r].Index].AbsolutePath, -1); err != nil {
|
||||||
CONN.PlayId(id)
|
Notify.Send(fmt.Sprintf("Could Not add the Song %s to the Playlist",
|
||||||
|
dirTree.Children[Matches[r].Index].AbsolutePath))
|
||||||
|
} else {
|
||||||
|
if err := CONN.PlayId(id); err != nil {
|
||||||
|
Notify.Send("Could not Play the Song")
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
client.Update(dirTree.Children[Matches[r].Index].Children, UI.ExpandedView)
|
client.Update(dirTree.Children[Matches[r].Index].Children, UI.ExpandedView)
|
||||||
dirTree = &dirTree.Children[Matches[r].Index]
|
dirTree = &dirTree.Children[Matches[r].Index]
|
||||||
@ -135,7 +173,9 @@ func main() {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"togglePlayBack": func() {
|
"togglePlayBack": func() {
|
||||||
client.TogglePlayBack()
|
if err := client.TogglePlayBack(); err != nil {
|
||||||
|
Notify.Send("Could not Toggle Play Back")
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"showParentContent": func() {
|
"showParentContent": func() {
|
||||||
if ui.HasFocus("FileBrowser") {
|
if ui.HasFocus("FileBrowser") {
|
||||||
@ -143,46 +183,58 @@ func main() {
|
|||||||
client.Update(dirTree.Parent.Children, UI.ExpandedView)
|
client.Update(dirTree.Parent.Children, UI.ExpandedView)
|
||||||
dirTree = dirTree.Parent
|
dirTree = dirTree.Parent
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
Notify.Send("Not Allowed in this View")
|
||||||
|
return
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nextSong": func() {
|
"nextSong": func() {
|
||||||
CONN.Next()
|
if err := CONN.Next(); err != nil {
|
||||||
|
Notify.Send("Could not Select the Next Song")
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"clearPlaylist": func() {
|
"clearPlaylist": func() {
|
||||||
CONN.Clear()
|
if err := CONN.Clear(); err != nil {
|
||||||
|
Notify.Send("Could not Clear the Playlist")
|
||||||
|
} else {
|
||||||
Notify.Send("Playlist Cleared")
|
Notify.Send("Playlist Cleared")
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"previousSong": func() {
|
"previousSong": func() {
|
||||||
CONN.Previous()
|
if err := CONN.Previous(); err != nil {
|
||||||
|
Notify.Send("Could Not Select the Previous Song")
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"addToPlaylist": func() {
|
"addToPlaylist": func() {
|
||||||
if ui.HasFocus("FileBrowser") {
|
if ui.HasFocus("FileBrowser") {
|
||||||
r, _ := UI.ExpandedView.GetSelection()
|
r, _ := UI.ExpandedView.GetSelection()
|
||||||
CONN.Add(dirTree.Children[r].AbsolutePath)
|
if err := CONN.Add(dirTree.Children[r].AbsolutePath); err != nil {
|
||||||
|
Notify.Send(fmt.Sprintf("Could not add %s to the Playlist",
|
||||||
|
dirTree.Children[r].Path))
|
||||||
|
}
|
||||||
} else if ui.HasFocus("SearchView") {
|
} else if ui.HasFocus("SearchView") {
|
||||||
r, _ := UI.ExpandedView.GetSelection()
|
r, _ := UI.ExpandedView.GetSelection()
|
||||||
client.AddToPlaylist(SearchContentSlice[r], false)
|
client.AddToPlaylist(SearchContentSlice[r], false)
|
||||||
} else if ui.HasFocus("BuffSearchView") {
|
} else if ui.HasFocus("BuffSearchView") {
|
||||||
r, _ := UI.ExpandedView.GetSelection()
|
r, _ := UI.ExpandedView.GetSelection()
|
||||||
ui.SetFocus("FileBrowser")
|
if err := CONN.Add(dirTree.Children[Matches[r].Index].AbsolutePath); err != nil {
|
||||||
err := CONN.Add(dirTree.Children[Matches[r].Index].AbsolutePath)
|
Notify.Send(fmt.Sprintf("Could Not Add URI %s to the Playlist",
|
||||||
if err != nil {
|
dirTree.Children[Matches[r].Index].Path))
|
||||||
Notify.Send(fmt.Sprintf("Could Not Add URI %s to the Playlist", dirTree.Children[Matches[r].Index].Path))
|
|
||||||
} else {
|
} else {
|
||||||
Notify.Send(fmt.Sprintf("URI Added %s to the Playlist", dirTree.Children[Matches[r].Index].Path))
|
ui.SetFocus("FileBrowser")
|
||||||
}
|
Notify.Send(fmt.Sprintf("URI Added %s to the Playlist",
|
||||||
|
dirTree.Children[Matches[r].Index].Path))
|
||||||
ui.SetFocus("BuffSearchView")
|
ui.SetFocus("BuffSearchView")
|
||||||
}
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"toggleRandom": func() {
|
"toggleRandom": func() {
|
||||||
err := CONN.Random(!Random)
|
if err := CONN.Random(!Random); err == nil {
|
||||||
if err == nil {
|
|
||||||
Random = !Random
|
Random = !Random
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"toggleRepeat": func() {
|
"toggleRepeat": func() {
|
||||||
err := CONN.Repeat(!Repeat)
|
if err := CONN.Repeat(!Repeat); err == nil {
|
||||||
if err == nil {
|
|
||||||
Repeat = !Repeat
|
Repeat = !Repeat
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -192,7 +244,9 @@ func main() {
|
|||||||
} else {
|
} else {
|
||||||
Volume -= 10
|
Volume -= 10
|
||||||
}
|
}
|
||||||
CONN.SetVolume(int(Volume))
|
if err := CONN.SetVolume(int(Volume)); err != nil {
|
||||||
|
Notify.Send("Could Not Decrease the Volume")
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"increaseVolume": func() {
|
"increaseVolume": func() {
|
||||||
if Volume >= 100 {
|
if Volume >= 100 {
|
||||||
@ -200,7 +254,9 @@ func main() {
|
|||||||
} else {
|
} else {
|
||||||
Volume += 10
|
Volume += 10
|
||||||
}
|
}
|
||||||
CONN.SetVolume(int(Volume))
|
if err := CONN.SetVolume(int(Volume)); err != nil {
|
||||||
|
Notify.Send("Could Not Increase the Volume")
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"navigateToFiles": func() {
|
"navigateToFiles": func() {
|
||||||
ui.SetFocus("FileBrowser")
|
ui.SetFocus("FileBrowser")
|
||||||
@ -229,20 +285,26 @@ func main() {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"stop": func() {
|
"stop": func() {
|
||||||
CONN.Stop()
|
if err := CONN.Stop(); err != nil {
|
||||||
|
Notify.Send("Could not Stop the Playback")
|
||||||
|
} else {
|
||||||
Notify.Send("Playback Stopped")
|
Notify.Send("Playback Stopped")
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"updateDB": func() {
|
"updateDB": func() {
|
||||||
_, err = CONN.Update("")
|
_, err = CONN.Update("")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
Notify.Send("Could Not Update the Database")
|
||||||
}
|
} else {
|
||||||
Notify.Send("Database Updated")
|
Notify.Send("Database Updated")
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"deleteSongFromPlaylist": func() {
|
"deleteSongFromPlaylist": func() {
|
||||||
if ui.HasFocus("Playlist") {
|
if ui.HasFocus("Playlist") {
|
||||||
r, _ := UI.ExpandedView.GetSelection()
|
r, _ := UI.ExpandedView.GetSelection()
|
||||||
CONN.Delete(r, -1)
|
if err := CONN.Delete(r, -1); err != nil {
|
||||||
|
Notify.Send("Could not Remove the Song from Playlist")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"FocusSearch": func() {
|
"FocusSearch": func() {
|
||||||
|
@ -39,8 +39,11 @@ func downloadImage(url string, imagePath string) (string, error) {
|
|||||||
if err == nil {
|
if err == nil {
|
||||||
b, err := os.Create(imagePath)
|
b, err := os.Create(imagePath)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
b.Write(v)
|
if _, err := b.Write(v); err == nil {
|
||||||
return imagePath, nil
|
return imagePath, nil
|
||||||
|
} else {
|
||||||
|
return "", errors.New("could Not Write Image")
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
b.Close()
|
b.Close()
|
||||||
return "", err
|
return "", err
|
||||||
@ -49,5 +52,5 @@ func downloadImage(url string, imagePath string) (string, error) {
|
|||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return "", errors.New("Image Not Received")
|
return "", errors.New("image Not Received")
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@ type Renderer struct {
|
|||||||
c chan string
|
c chan string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns a new Renderer with a string channel
|
// NewRenderer Returns a new Renderer with a string channel
|
||||||
func NewRenderer() *Renderer {
|
func NewRenderer() *Renderer {
|
||||||
c := make(chan string)
|
c := make(chan string)
|
||||||
return &Renderer{
|
return &Renderer{
|
||||||
@ -43,13 +43,13 @@ func NewRenderer() *Renderer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Send Image Path to Renderer
|
// Send Image Path to Renderer
|
||||||
func (self *Renderer) Send(path string) {
|
func (r *Renderer) Send(path string) {
|
||||||
self.c <- path
|
r.c <- path
|
||||||
}
|
}
|
||||||
|
|
||||||
// Go Routine that will Be Called and will listen on the channel c
|
// OpenImage Go Routine that will Be Called and will listen on the channel c
|
||||||
// for changes and on getting a string over the channel will open the Image and
|
// for changes and on getting a string over the channel will open the Image and
|
||||||
// keep listening again. This will keep the image blocked ( i.e no need to use time.Sleep() etc. )
|
// keep listening again. This will keep the image blocked ( i.e. no need to use time.Sleep() etc. )
|
||||||
// and saves resources too.
|
// and saves resources too.
|
||||||
func OpenImage(path string, c chan string) {
|
func OpenImage(path string, c chan string) {
|
||||||
fw, fh := utils.GetFontWidth()
|
fw, fh := utils.GetFontWidth()
|
||||||
@ -57,7 +57,9 @@ func OpenImage(path string, c chan string) {
|
|||||||
if path != "stop" {
|
if path != "stop" {
|
||||||
extractedImage := GetImagePath(path)
|
extractedImage := GetImagePath(path)
|
||||||
img2, _ := GetImg(extractedImage)
|
img2, _ := GetImg(extractedImage)
|
||||||
im, _ = ueberzug.NewImage(img2, int(float32(ui.IMG_X)*fw)+viper.GetInt("ADDITIONAL_PADDING_X"), int(float32(ui.IMG_Y)*fh)+viper.GetInt("ADDITIONAL_PADDING_Y"))
|
im, _ = ueberzug.NewImage(img2,
|
||||||
|
int(float32(ui.ImgX)*fw)+viper.GetInt("ADDITIONAL_PADDING_X"),
|
||||||
|
int(float32(ui.ImgY)*fh)+viper.GetInt("ADDITIONAL_PADDING_Y"))
|
||||||
}
|
}
|
||||||
d := <-c
|
d := <-c
|
||||||
if im != nil {
|
if im != nil {
|
||||||
@ -70,13 +72,14 @@ func OpenImage(path string, c chan string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialises the Renderer and calls the go routine OpenImage and passes the channel
|
// Start Initialises the Renderer and calls the go routine OpenImage and passes the channel
|
||||||
// as argument.
|
// as argument.
|
||||||
func (self *Renderer) Start(path string) {
|
func (r *Renderer) Start(path string) {
|
||||||
go OpenImage(path, self.c)
|
go OpenImage(path, r.c)
|
||||||
}
|
}
|
||||||
|
|
||||||
// This Function returns the path to the image that is to be rendered it checks first for the image in the cache
|
// GetImagePath This Function returns the path to the image that is to be
|
||||||
|
// rendered it checks first for the image in the cache
|
||||||
// else it adds the image to the cache and then extracts it and renders it.
|
// else it adds the image to the cache and then extracts it and renders it.
|
||||||
func GetImagePath(path string) string {
|
func GetImagePath(path string) string {
|
||||||
a, err := CONN.ListInfo(path)
|
a, err := CONN.ListInfo(path)
|
||||||
@ -88,7 +91,8 @@ func GetImagePath(path string) string {
|
|||||||
imagePath := cache.GenerateName(a[0]["artist"], a[0]["album"])
|
imagePath := cache.GenerateName(a[0]["artist"], a[0]["album"])
|
||||||
absPath := utils.CheckDirectoryFmt(viper.GetString("MUSIC_DIRECTORY")) + path
|
absPath := utils.CheckDirectoryFmt(viper.GetString("MUSIC_DIRECTORY")) + path
|
||||||
extractedImage = ExtractImageFromFile(absPath, imagePath)
|
extractedImage = ExtractImageFromFile(absPath, imagePath)
|
||||||
if extractedImage == viper.GetString("DEFAULT_IMAGE_PATH") && viper.GetString("GET_COVER_ART_FROM_LAST_FM") == "TRUE" {
|
if extractedImage == viper.GetString("DEFAULT_IMAGE_PATH") &&
|
||||||
|
viper.GetString("GET_COVER_ART_FROM_LAST_FM") == "TRUE" {
|
||||||
downloadedImage, err := getImageFromLastFM(a[0]["artist"], a[0]["album"], imagePath)
|
downloadedImage, err := getImageFromLastFM(a[0]["artist"], a[0]["album"], imagePath)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
Notify.Send("Image From LastFM")
|
Notify.Send("Image From LastFM")
|
||||||
@ -116,7 +120,8 @@ func GetImg(uri string) (image.Image, error) {
|
|||||||
}
|
}
|
||||||
fw, fh := utils.GetFontWidth()
|
fw, fh := utils.GetFontWidth()
|
||||||
img = resize.Resize(
|
img = resize.Resize(
|
||||||
uint(float32(ui.IMG_W)*(fw+float32(viper.GetFloat64("IMAGE_WIDTH_EXTRA_X")))), uint(float32(ui.IMG_H)*(fh+float32(viper.GetFloat64("IMAGE_WIDTH_EXTRA_Y")))),
|
uint(float32(ui.ImgW)*(fw+float32(viper.GetFloat64("IMAGE_WIDTH_EXTRA_X")))),
|
||||||
|
uint(float32(ui.ImgH)*(fh+float32(viper.GetFloat64("IMAGE_WIDTH_EXTRA_Y")))),
|
||||||
img,
|
img,
|
||||||
resize.Bilinear,
|
resize.Bilinear,
|
||||||
)
|
)
|
||||||
|
@ -5,7 +5,12 @@ import (
|
|||||||
"github.com/gdamore/tcell/v2"
|
"github.com/gdamore/tcell/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
var IMG_X, IMG_Y, IMG_W, IMG_H int
|
var (
|
||||||
|
ImgY int
|
||||||
|
ImgW int
|
||||||
|
ImgH int
|
||||||
|
ImgX int
|
||||||
|
)
|
||||||
|
|
||||||
type Application struct {
|
type Application struct {
|
||||||
App *tview.Application
|
App *tview.Application
|
||||||
@ -26,7 +31,7 @@ func NewApplication() *Application {
|
|||||||
imagePreviewer := tview.NewBox()
|
imagePreviewer := tview.NewBox()
|
||||||
imagePreviewer.SetBorder(true)
|
imagePreviewer.SetBorder(true)
|
||||||
imagePreviewer.SetDrawFunc(func(s tcell.Screen, x, y, width, height int) (int, int, int, int) {
|
imagePreviewer.SetDrawFunc(func(s tcell.Screen, x, y, width, height int) (int, int, int, int) {
|
||||||
IMG_X, IMG_Y, IMG_W, IMG_H = imagePreviewer.GetRect()
|
ImgX, ImgY, ImgW, ImgH = imagePreviewer.GetRect()
|
||||||
return imagePreviewer.GetInnerRect()
|
return imagePreviewer.GetInnerRect()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
21
utils/colors.go
Normal file
21
utils/colors.go
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package utils
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
var (
|
||||||
|
COLORS map[string]string = map[string]string{
|
||||||
|
"RESET": "\033[0m",
|
||||||
|
"RED": "\033[31m",
|
||||||
|
"GREEN": "\033[32m",
|
||||||
|
"YELLOW": "\033[33m",
|
||||||
|
"BLUE": "\033[34m",
|
||||||
|
"PURPLE": "\033[35m",
|
||||||
|
"CYAN": "\033[36m",
|
||||||
|
"GRAY": "\033[37m",
|
||||||
|
"WHITE": "\033[97m",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func Print(color, text string) {
|
||||||
|
fmt.Print(COLORS[color] + text + COLORS["RESET"])
|
||||||
|
}
|
@ -30,8 +30,8 @@ func GetWidth() *winsize {
|
|||||||
|
|
||||||
func GetFontWidth() (float32, float32) {
|
func GetFontWidth() (float32, float32) {
|
||||||
g := GetWidth()
|
g := GetWidth()
|
||||||
fw := (float32(g.Xpixel) / float32(g.Col))
|
fw := float32(g.Xpixel) / float32(g.Col)
|
||||||
fh := (float32(g.Ypixel) / float32(g.Row))
|
fh := float32(g.Ypixel) / float32(g.Row)
|
||||||
return fw, fh
|
return fw, fh
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,19 +109,9 @@ func Copy(sourceImage, destinationImage string) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func Join(stringSlice []string) string {
|
|
||||||
var _s string = stringSlice[0]
|
|
||||||
for i := 1; i < len(stringSlice); i++ {
|
|
||||||
if _s != "" {
|
|
||||||
_s += ("/" + stringSlice[i])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return _s
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetFormattedString(s string, width int) string {
|
func GetFormattedString(s string, width int) string {
|
||||||
if len(s) < width {
|
if len(s) < width {
|
||||||
s += strings.Repeat(" ", (width - len(s)))
|
s += strings.Repeat(" ", width-len(s))
|
||||||
} else {
|
} else {
|
||||||
s = s[:(width - 2)]
|
s = s[:(width - 2)]
|
||||||
s += " "
|
s += " "
|
||||||
@ -172,7 +162,7 @@ func GetMatchedString(a []int, s, color string) string {
|
|||||||
|
|
||||||
func Unique(intSlice []int) []int {
|
func Unique(intSlice []int) []int {
|
||||||
keys := make(map[int]bool)
|
keys := make(map[int]bool)
|
||||||
list := []int{}
|
var list []int
|
||||||
for _, entry := range intSlice {
|
for _, entry := range intSlice {
|
||||||
if _, exists := keys[entry]; !exists {
|
if _, exists := keys[entry]; !exists {
|
||||||
keys[entry] = true
|
keys[entry] = true
|
||||||
|
Loading…
Reference in New Issue
Block a user