commit
						5012b2832b
					
				
							
								
								
									
										19
									
								
								App.go
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								App.go
									
									
									
									
									
								
							@ -9,10 +9,11 @@ var IMG_X, IMG_Y, IMG_W, IMG_H int
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
type Application struct {
 | 
					type Application struct {
 | 
				
			||||||
	App          *tview.Application
 | 
						App          *tview.Application
 | 
				
			||||||
	expandedView *tview.Table
 | 
						ExpandedView *tview.Table
 | 
				
			||||||
	Navbar       *tview.Table
 | 
						Navbar       *tview.Table
 | 
				
			||||||
	searchBar    *tview.Table
 | 
						SearchBar    *tview.Table
 | 
				
			||||||
	pBar         *progressBar
 | 
						ProgressBar  *progressBar
 | 
				
			||||||
 | 
						Pages        *tview.Pages
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func newApplication(r *Renderer) *Application {
 | 
					func newApplication(r *Renderer) *Application {
 | 
				
			||||||
@ -51,15 +52,19 @@ func newApplication(r *Renderer) *Application {
 | 
				
			|||||||
	expandedView.SetBorderPadding(1, 1, 1, 1).SetBorder(true)
 | 
						expandedView.SetBorderPadding(1, 1, 1, 1).SetBorder(true)
 | 
				
			||||||
	expandedView.SetSelectable(true, false)
 | 
						expandedView.SetSelectable(true, false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rootPages := tview.NewPages()
 | 
				
			||||||
 | 
						rootPages.AddPage("Main", mainFlex, true, true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	App := tview.NewApplication()
 | 
						App := tview.NewApplication()
 | 
				
			||||||
	App.SetRoot(mainFlex, true).SetFocus(expandedView)
 | 
						App.SetRoot(rootPages, true).SetFocus(expandedView)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &Application{
 | 
						return &Application{
 | 
				
			||||||
		App:          App,
 | 
							App:          App,
 | 
				
			||||||
		expandedView: expandedView,
 | 
							ExpandedView: expandedView,
 | 
				
			||||||
		Navbar:       Navbar,
 | 
							Navbar:       Navbar,
 | 
				
			||||||
		searchBar:    searchBar,
 | 
							SearchBar:    searchBar,
 | 
				
			||||||
		pBar:         pBar,
 | 
							ProgressBar:  pBar,
 | 
				
			||||||
 | 
							Pages:        rootPages,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										37
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								main.go
									
									
									
									
									
								
							@ -11,6 +11,7 @@ import (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var CONN *mpd.Client
 | 
					var CONN *mpd.Client
 | 
				
			||||||
 | 
					var UI *Application
 | 
				
			||||||
var Volume int64
 | 
					var Volume int64
 | 
				
			||||||
var Random bool
 | 
					var Random bool
 | 
				
			||||||
var Repeat bool
 | 
					var Repeat bool
 | 
				
			||||||
@ -34,36 +35,39 @@ func main() {
 | 
				
			|||||||
		r.Start("stop")
 | 
							r.Start("stop")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	UI := newApplication(r)
 | 
						UI = newApplication(r)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fileMap, err := CONN.GetFiles()
 | 
						fileMap, err := CONN.GetFiles()
 | 
				
			||||||
	dirTree := generateDirectoryTree(fileMap)
 | 
						dirTree := generateDirectoryTree(fileMap)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	UpdatePlaylist(UI.expandedView)
 | 
						UpdatePlaylist(UI.ExpandedView)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	_v, _ := CONN.Status()
 | 
						_v, _ := CONN.Status()
 | 
				
			||||||
	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"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	UI.expandedView.SetDrawFunc(func(s tcell.Screen, x, y, width, height int) (int, int, int, int) {
 | 
						UI.ExpandedView.SetDrawFunc(func(s tcell.Screen, x, y, width, height int) (int, int, int, int) {
 | 
				
			||||||
		if InsidePlaylist {
 | 
							if InsidePlaylist {
 | 
				
			||||||
			UpdatePlaylist(UI.expandedView)
 | 
								UpdatePlaylist(UI.ExpandedView)
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			Update(dirTree.children, UI.expandedView)
 | 
								Update(dirTree.children, UI.ExpandedView)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return UI.expandedView.GetInnerRect()
 | 
							return UI.ExpandedView.GetInnerRect()
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						notificationServer := NewNotificationServer()
 | 
				
			||||||
 | 
						notificationServer.Start()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var FUNC_MAP = map[string]func(){
 | 
						var FUNC_MAP = map[string]func(){
 | 
				
			||||||
		"showChildrenContent": func() {
 | 
							"showChildrenContent": func() {
 | 
				
			||||||
			r, _ := UI.expandedView.GetSelection()
 | 
								r, _ := UI.ExpandedView.GetSelection()
 | 
				
			||||||
			if !InsidePlaylist {
 | 
								if !InsidePlaylist {
 | 
				
			||||||
				if len(dirTree.children[r].children) == 0 {
 | 
									if len(dirTree.children[r].children) == 0 {
 | 
				
			||||||
					id, _ := CONN.AddId(dirTree.children[r].absolutePath, -1)
 | 
										id, _ := CONN.AddId(dirTree.children[r].absolutePath, -1)
 | 
				
			||||||
					CONN.PlayId(id)
 | 
										CONN.PlayId(id)
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					Update(dirTree.children[r].children, UI.expandedView)
 | 
										Update(dirTree.children[r].children, UI.ExpandedView)
 | 
				
			||||||
					dirTree = &dirTree.children[r]
 | 
										dirTree = &dirTree.children[r]
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
@ -76,7 +80,7 @@ func main() {
 | 
				
			|||||||
		"showParentContent": func() {
 | 
							"showParentContent": func() {
 | 
				
			||||||
			if !InsidePlaylist {
 | 
								if !InsidePlaylist {
 | 
				
			||||||
				if dirTree.parent != nil {
 | 
									if dirTree.parent != nil {
 | 
				
			||||||
					Update(dirTree.parent.children, UI.expandedView)
 | 
										Update(dirTree.parent.children, UI.ExpandedView)
 | 
				
			||||||
					dirTree = dirTree.parent
 | 
										dirTree = dirTree.parent
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@ -87,15 +91,16 @@ func main() {
 | 
				
			|||||||
		"clearPlaylist": func() {
 | 
							"clearPlaylist": func() {
 | 
				
			||||||
			CONN.Clear()
 | 
								CONN.Clear()
 | 
				
			||||||
			if InsidePlaylist {
 | 
								if InsidePlaylist {
 | 
				
			||||||
				UpdatePlaylist(UI.expandedView)
 | 
									UpdatePlaylist(UI.ExpandedView)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								notificationServer.Send("PlayList Cleared")
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		"previousSong": func() {
 | 
							"previousSong": func() {
 | 
				
			||||||
			CONN.Previous()
 | 
								CONN.Previous()
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		"addToPlaylist": func() {
 | 
							"addToPlaylist": func() {
 | 
				
			||||||
			if !InsidePlaylist {
 | 
								if !InsidePlaylist {
 | 
				
			||||||
				r, _ := UI.expandedView.GetSelection()
 | 
									r, _ := UI.ExpandedView.GetSelection()
 | 
				
			||||||
				CONN.Add(dirTree.children[r].absolutePath)
 | 
									CONN.Add(dirTree.children[r].absolutePath)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@ -130,12 +135,12 @@ func main() {
 | 
				
			|||||||
		"navigateToFiles": func() {
 | 
							"navigateToFiles": func() {
 | 
				
			||||||
			InsidePlaylist = false
 | 
								InsidePlaylist = false
 | 
				
			||||||
			UI.Navbar.Select(1, 0)
 | 
								UI.Navbar.Select(1, 0)
 | 
				
			||||||
			Update(dirTree.children, UI.expandedView)
 | 
								Update(dirTree.children, UI.ExpandedView)
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		"navigateToPlaylist": func() {
 | 
							"navigateToPlaylist": func() {
 | 
				
			||||||
			InsidePlaylist = true
 | 
								InsidePlaylist = true
 | 
				
			||||||
			UI.Navbar.Select(0, 0)
 | 
								UI.Navbar.Select(0, 0)
 | 
				
			||||||
			UpdatePlaylist(UI.expandedView)
 | 
								UpdatePlaylist(UI.ExpandedView)
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		"navigateToMostPlayed": func() {
 | 
							"navigateToMostPlayed": func() {
 | 
				
			||||||
			InsidePlaylist = false
 | 
								InsidePlaylist = false
 | 
				
			||||||
@ -146,16 +151,18 @@ func main() {
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		"stop": func() {
 | 
							"stop": func() {
 | 
				
			||||||
			CONN.Stop()
 | 
								CONN.Stop()
 | 
				
			||||||
 | 
								notificationServer.Send("Playback Stopped")
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		"updateDB": func() {
 | 
							"updateDB": func() {
 | 
				
			||||||
			_, err = CONN.Update("")
 | 
								_, err = CONN.Update("")
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				panic(err)
 | 
									panic(err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								notificationServer.Send("Database Updated")
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		"deleteSongFromPlaylist": func() {
 | 
							"deleteSongFromPlaylist": func() {
 | 
				
			||||||
			if InsidePlaylist {
 | 
								if InsidePlaylist {
 | 
				
			||||||
				r, _ := UI.expandedView.GetSelection()
 | 
									r, _ := UI.ExpandedView.GetSelection()
 | 
				
			||||||
				CONN.Delete(r, -1)
 | 
									CONN.Delete(r, -1)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@ -163,7 +170,7 @@ func main() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	config.GenerateKeyMap(FUNC_MAP)
 | 
						config.GenerateKeyMap(FUNC_MAP)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	UI.expandedView.SetInputCapture(func(e *tcell.EventKey) *tcell.EventKey {
 | 
						UI.ExpandedView.SetInputCapture(func(e *tcell.EventKey) *tcell.EventKey {
 | 
				
			||||||
		if val, ok := config.KEY_MAP[int(e.Rune())]; ok {
 | 
							if val, ok := config.KEY_MAP[int(e.Rune())]; ok {
 | 
				
			||||||
			FUNC_MAP[val]()
 | 
								FUNC_MAP[val]()
 | 
				
			||||||
			return nil
 | 
								return nil
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										88
									
								
								notification.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								notification.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,88 @@
 | 
				
			|||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/gdamore/tcell/v2"
 | 
				
			||||||
 | 
						"github.com/rivo/tview"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Notification Primitive */
 | 
				
			||||||
 | 
					type Notification struct {
 | 
				
			||||||
 | 
						*tview.Box
 | 
				
			||||||
 | 
						Text string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Get A Pointer to A Notification Struct */
 | 
				
			||||||
 | 
					func NewNotification(s string) *Notification {
 | 
				
			||||||
 | 
						return &Notification{
 | 
				
			||||||
 | 
							Box:  tview.NewBox(),
 | 
				
			||||||
 | 
							Text: s,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Draw Function for the Notification Primitive */
 | 
				
			||||||
 | 
					func (self *Notification) Draw(screen tcell.Screen) {
 | 
				
			||||||
 | 
						termDetails := getWidth()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var (
 | 
				
			||||||
 | 
							COL          int = int(termDetails.Col)
 | 
				
			||||||
 | 
							TEXTLENGTH   int = len(self.Text)
 | 
				
			||||||
 | 
							HEIGHT       int = 3
 | 
				
			||||||
 | 
							TEXTPOSITION int = 2
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						self.Box.SetBackgroundColor(tcell.GetColor("#15191a"))
 | 
				
			||||||
 | 
						self.SetRect(COL-(TEXTLENGTH+7), 1, TEXTLENGTH+4, HEIGHT)
 | 
				
			||||||
 | 
						self.DrawForSubclass(screen, self.Box)
 | 
				
			||||||
 | 
						tview.Print(screen, self.Text,
 | 
				
			||||||
 | 
							COL-(TEXTLENGTH+5), TEXTPOSITION, TEXTLENGTH,
 | 
				
			||||||
 | 
							tview.AlignCenter, tcell.GetColor("#ffffff"))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Notification Server : Not an actual Server*/
 | 
				
			||||||
 | 
					type NotificationServer struct {
 | 
				
			||||||
 | 
						c chan string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Get A Pointer to a NotificationServer Struct */
 | 
				
			||||||
 | 
					func NewNotificationServer() *NotificationServer {
 | 
				
			||||||
 | 
						return &NotificationServer{
 | 
				
			||||||
 | 
							c: make(chan string),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* This Method Starts the go routine for the NotificationServer */
 | 
				
			||||||
 | 
					func (self *NotificationServer) Start() {
 | 
				
			||||||
 | 
						go NotificationRoutine(self.c, "EMPTY NOTIFICATION")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* The Notification Server is just a string channel and the NotificationRoutine
 | 
				
			||||||
 | 
					the channel is used to receive the Notification Data through the Send Function
 | 
				
			||||||
 | 
					The Channel keeps listening for the Notification when it receives a Notification it checks if it
 | 
				
			||||||
 | 
					is Empty or not if it is an empty Notification it calls the NotificationRoutine with the empty routine else
 | 
				
			||||||
 | 
					it will call the go routine that renders the Notification for the Notification Interval and agains start listening
 | 
				
			||||||
 | 
					for the notfications sort of works like a que */
 | 
				
			||||||
 | 
					func NotificationRoutine(c chan string, s string) {
 | 
				
			||||||
 | 
						if s != "EMPTY NOTIFICATION" {
 | 
				
			||||||
 | 
							go func() {
 | 
				
			||||||
 | 
								currentTime := time.Now().String()
 | 
				
			||||||
 | 
								UI.Pages.AddPage(currentTime, NewNotification(s), false, true)
 | 
				
			||||||
 | 
								UI.App.SetFocus(UI.ExpandedView)
 | 
				
			||||||
 | 
								time.Sleep(time.Second * 1)
 | 
				
			||||||
 | 
								UI.Pages.RemovePage(currentTime)
 | 
				
			||||||
 | 
								UI.App.SetFocus(UI.ExpandedView)
 | 
				
			||||||
 | 
							}()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						NewNotification := <-c
 | 
				
			||||||
 | 
						if NewNotification == "EMPTY NOTIFICATION" {
 | 
				
			||||||
 | 
							NotificationRoutine(c, "EMPTY NOTIFICATION")
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							NotificationRoutine(c, NewNotification)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Sends the Notification to the Notification Server */
 | 
				
			||||||
 | 
					func (self NotificationServer) Send(text string) {
 | 
				
			||||||
 | 
						self.c <- text
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user