diff --git a/modules/todoist/display.go b/modules/todoist/display.go index e88fcaab..1c24df64 100644 --- a/modules/todoist/display.go +++ b/modules/todoist/display.go @@ -17,15 +17,15 @@ func (widget *Widget) display() { title := fmt.Sprintf("[green]%s[white]", proj.Project.Name) str := "" - for index, item := range proj.tasks { + for idx, item := range proj.tasks { row := fmt.Sprintf( `[%s]| | %s[%s]`, - widget.RowColor(index), + widget.RowColor(idx), tview.Escape(item.Content), - widget.RowColor(index), + widget.RowColor(idx), ) - str += wtf.HighlightableHelper(widget.View, row, index, len(item.Content)) + str += wtf.HighlightableHelper(widget.View, row, idx, len(item.Content)) } widget.ScrollableWidget.Redraw(title, str, false) diff --git a/modules/transmission/keyboard.go b/modules/transmission/keyboard.go index d6009aab..27a69804 100644 --- a/modules/transmission/keyboard.go +++ b/modules/transmission/keyboard.go @@ -1,10 +1,17 @@ package transmission -// import "github.com/gdamore/tcell" +import "github.com/gdamore/tcell" func (widget *Widget) initializeKeyboardControls() { widget.SetKeyboardChar("/", widget.ShowHelp, "Show/hide this help prompt") - widget.SetKeyboardChar("m", nil, "Add new magnet torrent") + widget.SetKeyboardChar("j", widget.Prev, "Select previous item") + widget.SetKeyboardChar("k", widget.Next, "Select next item") + widget.SetKeyboardChar("n", nil, "Add new magnet URL") widget.SetKeyboardChar("p", nil, "Pause torrent") widget.SetKeyboardChar("r", nil, "Remove torrent from list") + widget.SetKeyboardChar("u", widget.Unselect, "Clear selection") + + widget.SetKeyboardKey(tcell.KeyDown, widget.Next, "Select next item") + widget.SetKeyboardKey(tcell.KeyEsc, widget.Unselect, "Clear selection") + widget.SetKeyboardKey(tcell.KeyUp, widget.Prev, "Select previous item") } diff --git a/modules/transmission/widget.go b/modules/transmission/widget.go index 16e2732b..53891683 100644 --- a/modules/transmission/widget.go +++ b/modules/transmission/widget.go @@ -12,25 +12,28 @@ import ( // Widget is the container for transmission data type Widget struct { wtf.KeyboardWidget - wtf.TextWidget + wtf.ScrollableWidget settings *Settings + torrents []*transmissionrpc.Torrent } // NewWidget creates a new instance of a widget func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget { - widget := &Widget{ - KeyboardWidget: wtf.NewKeyboardWidget(app, pages, settings.common), - TextWidget: wtf.NewTextWidget(app, settings.common, true), + widget := Widget{ + KeyboardWidget: wtf.NewKeyboardWidget(app, pages, settings.common), + ScrollableWidget: wtf.NewScrollableWidget(app, settings.common, true), settings: settings, } + widget.SetRenderFunction(widget.display) widget.initializeKeyboardControls() widget.View.SetInputCapture(widget.InputCapture) + widget.KeyboardWidget.SetView(widget.View) - return widget + return &widget } /* -------------------- Exported Functions -------------------- */ @@ -53,15 +56,16 @@ func (widget *Widget) Fetch() ([]*transmissionrpc.Torrent, error) { // Refresh updates the data for this widget and displays it onscreen func (widget *Widget) Refresh() { torrents, err := widget.Fetch() - - var content string if err != nil { - content = err.Error() - } else { - content = widget.contentFrom(torrents) + widget.SetItemCount(0) + widget.ScrollableWidget.Redraw(widget.CommonSettings.Title, err.Error(), false) + return } - widget.Redraw(widget.CommonSettings.Title, content, false) + widget.torrents = torrents + widget.SetItemCount(len(torrents)) + + widget.display() } // HelpText returns the help text for this widget @@ -69,18 +73,49 @@ func (widget *Widget) HelpText() string { return widget.KeyboardWidget.HelpText() } +// Next selects the next item in the list +func (widget *Widget) Next() { + widget.ScrollableWidget.Next() +} + +// Prev selects the previous item in the list +func (widget *Widget) Prev() { + widget.ScrollableWidget.Prev() +} + +// Unselect clears the selection of list items +func (widget *Widget) Unselect() { + widget.ScrollableWidget.Unselect() + widget.RenderFunction() +} + /* -------------------- Unexported Functions -------------------- */ +func (widget *Widget) display() { + if len(widget.torrents) == 0 { + widget.ScrollableWidget.Redraw(widget.CommonSettings.Title, "no torrents", false) + return + } + + content := widget.contentFrom(widget.torrents) + widget.ScrollableWidget.Redraw(widget.CommonSettings.Title, content, false) +} + func (widget *Widget) contentFrom(data []*transmissionrpc.Torrent) string { str := "" - for _, torrent := range data { - str += fmt.Sprintf( - " %s %s%s[white]\n", + for idx, torrent := range data { + torrName := *torrent.Name + + row := fmt.Sprintf( + "[%s] %s %s%s[white]", + widget.RowColor(idx), widget.torrentPercentDone(torrent), widget.torrentState(torrent), - widget.prettyTorrentName(*torrent.Name), + tview.Escape(widget.prettyTorrentName(torrName)), ) + + str += wtf.HighlightableHelper(widget.View, row, idx, len(torrName)) } return str diff --git a/wtf/scrollable.go b/wtf/scrollable.go index 496151ed..78385e2a 100644 --- a/wtf/scrollable.go +++ b/wtf/scrollable.go @@ -24,6 +24,7 @@ func NewScrollableWidget(app *tview.Application, commonSettings *cfg.Common, foc widget.Unselect() widget.View.SetScrollable(true) widget.View.SetRegions(true) + return widget } @@ -71,7 +72,6 @@ func (widget *ScrollableWidget) Unselect() { } func (widget *ScrollableWidget) Redraw(title, content string, wrap bool) { - widget.TextWidget.Redraw(title, content, wrap) widget.app.QueueUpdateDraw(func() { widget.View.Highlight(strconv.Itoa(widget.Selected)).ScrollToHighlight()