utility-screen/screen_main.go

242 lines
6.9 KiB
Go

package main
import (
"fmt"
"os"
"os/exec"
"strconv"
"strings"
"time"
"gogs.bullercodeworks.com/brian/termbox-util"
"github.com/nsf/termbox-go"
)
// TabStops
const (
tabMain = iota
tabNotepad
tabError
)
type mainScreen struct {
initialized bool
tabIdx int
updateTime time.Time
battStat *termboxUtil.ProgressBar
notepad *termboxUtil.InputField
}
func (screen *mainScreen) handleKeyPress(event termbox.Event) int {
if event.Type == termbox.EventKey {
if event.Key == termbox.KeyTab {
screen.tabIdx = (screen.tabIdx + 1) % tabError
return mainScreenIndex
}
switch screen.tabIdx {
case tabMain:
// Main Screen key handling
if event.Key == termbox.KeyEsc {
//return exitScreenIndex
} else if event.Ch == 'r' {
// Refresh data
screen.loadState()
screen.refreshData()
} else if event.Ch == 'q' {
return exitScreenIndex
} else if event.Key == termbox.KeyArrowUp {
screen.scrollFrame.ScrollUp()
} else if event.Key == termbox.KeyArrowRight {
screen.scrollFrame.ScrollRight()
} else if event.Key == termbox.KeyArrowDown {
screen.scrollFrame.ScrollDown()
} else if event.Key == termbox.KeyArrowLeft {
screen.scrollFrame.ScrollLeft()
} else if event.Ch == 's' {
screen.saveState()
}
case tabNotepad:
// Notepad key handling
screen.notepad.HandleKeyPress(event)
}
}
return mainScreenIndex
}
func (screen *mainScreen) decreaseUpdateFreq() {
if state.updateFreq > 60 {
state.updateFreq += 60
} else {
state.updateFreq += 5
}
}
func (screen *mainScreen) increaseUpdateFreq() {
if state.updateFreq > 60 {
state.updateFreq -= 60
} else {
state.updateFreq -= 5
}
}
func (screen *mainScreen) refreshData() {
screen.updateTime = time.Now()
screen.battStat.SetProgress(getBatteryPct())
// TODO: Load saved notepad data
//screen.loadState()
}
func (screen *mainScreen) performLayout(style style) {
if !screen.initialized {
w, h := termbox.Size()
// Battery Bar
screen.battStat = termboxUtil.CreateProgressBar(100, w-14, 1, style.defaultFg, style.defaultBg)
screen.battStat.SetColorized(true)
// Notepad
screen.notepad = termboxUtil.CreateInputField(1, 4, (w / 4), (h / 4), style.defaultFg, style.defaultBg)
screen.notepad.SetBordered(true)
screen.notepad.SetWrap(true)
screen.notepad.SetMultiline(true)
// TODO: Load saved notepad data
screen.scrollFrame = termboxUtil.CreateScrollFrame((w / 2), 4, 5, 5, style.defaultFg, style.defaultBg)
//screen.scrollFrame = termboxUtil.CreateScrollFrame((w / 2), 4, (w / 2), (h / 2), style.defaultFg, style.defaultBg)
var aa []string
aa = append(aa, "1234567890123456789012345678901234567890")
aa = append(aa, "2345678901234567890123456789012345678901")
aa = append(aa, "3456789012345678901234567890123456789012")
aa = append(aa, "4567890123456789012345678901234567890123")
aa = append(aa, "5678901234567890123456789012345678901234")
aa = append(aa, "6789012345678901234567890123456789012345")
aa = append(aa, "7890123456789012345678901234567890123456")
aa = append(aa, "8901234567890123456789012345678901234567")
aa = append(aa, "9012345678901234567890123456789012345678")
aa = append(aa, "0123456789012345678901234567890123456789")
aa = append(aa, "1234567890123456789012345678901234567890")
aa = append(aa, "2345678901234567890123456789012345678901")
aa = append(aa, "3456789012345678901234567890123456789012")
aa = append(aa, "4567890123456789012345678901234567890123")
aa = append(aa, "5678901234567890123456789012345678901234")
aa = append(aa, "6789012345678901234567890123456789012345")
aa = append(aa, "7890123456789012345678901234567890123456")
aa = append(aa, "8901234567890123456789012345678901234567")
aa = append(aa, "9012345678901234567890123456789012345678")
aa = append(aa, "0123456789012345678901234567890123456789")
screen.scrollFrame.AddControl(termboxUtil.CreateASCIIArt(aa, 1, 1, style.defaultFg, style.defaultBg))
// Multiline is currently disabled
//screen.notepad.SetMultiline(true)
screen.refreshData()
}
if time.Since(time.Now()) <= time.Minute {
screen.refreshData()
}
screen.initialized = true
}
func (screen *mainScreen) drawScreen(style style) {
fg, bg := style.defaultFg, style.defaultBg
selFg, selBg := style.cursorFg, style.cursorBg
w, h := termbox.Size()
// Top Bar
if screen.tabIdx == tabMain {
fg, bg = selFg, selBg
}
termboxUtil.DrawStringAtPoint(screen.updateTime.Format("15:04:05 MST"), 0, 0, fg, bg)
termboxUtil.DrawStringAtPoint(screen.updateTime.Format("02 Jan 2006"), 0, 1, fg, bg)
fg, bg = style.defaultFg, style.defaultBg
screen.battStat.Draw()
termboxUtil.DrawStringAtPoint(fmt.Sprintf("% 3d%s", screen.battStat.GetPercent(), "%"),
screen.battStat.GetX()+screen.battStat.GetWidth(),
screen.battStat.GetY(), fg, bg)
// Bottom Bar
termboxUtil.DrawStringAtPoint(getNetworkProfile(), 0, h-1, fg, bg)
refreshText := "(r)efresh"
if state.autoUpdate {
refreshText = "Auto-Refresh On ("
if state.updateFreq >= 60 {
refreshText += strconv.Itoa(int(state.updateFreq/time.Minute)) + "m"
} else {
refreshText += strconv.Itoa(int(state.updateFreq/time.Second)) + "s"
}
refreshText += ")"
}
helpTxt := "(q)uit " + refreshText
termboxUtil.DrawStringAtPoint(helpTxt, (w - len(helpTxt)), h-1, fg, bg)
// Notepad
if screen.tabIdx == tabNotepad {
fg, bg = selFg, selBg
}
termboxUtil.DrawStringAtPoint("Notes", screen.notepad.GetX(), screen.notepad.GetY()-1, fg, bg)
fg, bg = style.defaultFg, style.defaultBg
screen.notepad.Draw()
screen.scrollFrame.Draw()
}
func getBatteryPct() int {
powerApp := "upower"
powerArg1 := "-i"
powerArg2 := "/org/freedesktop/UPower/devices/battery_BAT0"
cmd := exec.Command(powerApp, powerArg1, powerArg2)
stdout, err := cmd.Output()
if err != nil {
return -1
}
tst := string(stdout)
for _, k := range strings.Split(tst, "\n") {
pair := strings.Split(k, ":")
if len(pair) > 1 {
pair[0] = strings.Trim(pair[0], " ")
pair[1] = strings.Trim(pair[1], " %")
if pair[0] == "percentage" {
if pct, err := strconv.Atoi(pair[1]); err == nil {
return pct
}
}
}
}
return -1
}
func getNetworkProfile() string {
// TODO: Make it work with wicd too
netApp := "netctl"
netArg1 := "list"
cmd := exec.Command(netApp, netArg1)
stdout, err := cmd.Output()
if err == nil {
tst := string(stdout)
for _, k := range strings.Split(tst, "\n") {
pair := strings.Split(k, " ")
if len(pair) > 1 {
if pair[0] == "*" {
return pair[1]
}
}
}
}
return "Network Info Unavailable"
}
func (screen *mainScreen) loadState() error {
var err error
var noteVal string
if noteVal, err = state.db.GetValue([]string{"mainScreen", "notepad"}, "value"); err == nil {
screen.notepad.SetValue(noteVal)
}
return err
}
func (screen *mainScreen) saveState() error {
var err error
noteVal := screen.notepad.GetValue()
WriteToLog(noteVal)
if err = state.db.SetValue([]string{"mainScreen", "notepad"}, "value", noteVal); err != nil {
fmt.Println(err)
os.Exit(1)
}
return err
}