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 }