Files
2026-08-27 23:14:56 +02:00

89 lines
1.9 KiB
Go

package app
import (
"fmt"
tea "charm.land/bubbletea/v2"
zone "github.com/lrstanley/bubblezone/v2"
)
const (
zoneBadgeFastest = "badge-fastest"
zoneBadgeRandom = "badge-random"
zoneBadgeSecureCore = "badge-securecore"
zoneBadgeTor = "badge-tor"
zoneBadgeP2P = "badge-p2p"
zoneBadgeFree = "badge-free"
)
func rowZoneID(index int) string {
return fmt.Sprintf("row-%d", index)
}
func (m Model) updateMouseClick(msg tea.MouseClickMsg) (Model, tea.Cmd) {
if msg.Button != tea.MouseLeft {
return m, nil
}
switch {
case zone.Get(zoneBadgeFastest).InBounds(msg):
m.prefer = "fastest"
return m, nil
case zone.Get(zoneBadgeRandom).InBounds(msg):
m.prefer = "random"
return m, nil
case zone.Get(zoneBadgeSecureCore).InBounds(msg):
m.filters.SecureCore = !m.filters.SecureCore
m.tree = buildTree(m.servers, m.filters)
return m, m.refreshList()
case zone.Get(zoneBadgeTor).InBounds(msg):
m.filters.Tor = !m.filters.Tor
m.tree = buildTree(m.servers, m.filters)
return m, m.refreshList()
case zone.Get(zoneBadgeP2P).InBounds(msg):
m.filters.P2P = !m.filters.P2P
m.tree = buildTree(m.servers, m.filters)
return m, m.refreshList()
case zone.Get(zoneBadgeFree).InBounds(msg):
m.filters.Free = !m.filters.Free
m.tree = buildTree(m.servers, m.filters)
return m, m.refreshList()
}
return m.clickRow(msg)
}
func (m Model) clickRow(msg tea.MouseClickMsg) (Model, tea.Cmd) {
items := m.list.Items()
for i := range items {
if !zone.Get(rowZoneID(i)).InBounds(msg) {
continue
}
if i != m.list.Index() {
m.list.Select(i)
return m, nil
}
return m.activateSelected()
}
return m, nil
}
func (m Model) activateSelected() (Model, tea.Cmd) {
r, ok := m.selectedRow()
if !ok {
return m, nil
}
if r.kind == rowServer {
return m.connectSelected()
}
if r.expanded {
return m.collapseSelected()
}
return m.expandSelected()
}