Redesign default tree controls

This commit is contained in:
Storm Dragon
2026-09-05 00:34:40 -04:00
parent db2d441dfc
commit ef19a558d2
7 changed files with 160 additions and 31 deletions
+30 -10
View File
@@ -95,12 +95,12 @@ func (c *Config) LoadConfig() {
jc = exportableConfig{}
jc.Hotkeys = &Hotkeys{
Talk: key(uiterm.KeyF1),
VolumeDown: key(uiterm.KeyF5),
VolumeUp: key(uiterm.KeyF6),
VolumeReset: key(uiterm.KeyF8),
VolumeDown: key(uiterm.KeyArrowLeft),
VolumeUp: key(uiterm.KeyArrowRight),
VolumeReset: key(uiterm.KeyBackspace),
MuteToggle: key(uiterm.KeyF7), // Added mute toggle hotkey
RecordToggle: key(uiterm.KeyCtrlR),
Exit: key(uiterm.KeyF10),
Exit: key(uiterm.KeyCtrlQ),
ToggleTimestamps: key(uiterm.KeyF3),
SwitchViews: key(uiterm.KeyTab),
ClearOutput: key(uiterm.KeyCtrlL),
@@ -108,7 +108,7 @@ func (c *Config) LoadConfig() {
ScrollDown: key(uiterm.KeyPgdn),
ScrollToTop: key(uiterm.KeyHome),
ScrollToBottom: key(uiterm.KeyEnd),
AdminMenu: key(uiterm.KeyF11),
AdminMenu: key(uiterm.KeyF10),
NoiseSuppressionToggle: key(uiterm.KeyF9),
AGCToggle: key(uiterm.KeyF12),
}
@@ -182,12 +182,12 @@ func (c *Config) ensureHotkeys() {
}
defaults := Hotkeys{
Talk: key(uiterm.KeyF1),
VolumeDown: key(uiterm.KeyF5),
VolumeUp: key(uiterm.KeyF6),
VolumeReset: key(uiterm.KeyF8),
VolumeDown: key(uiterm.KeyArrowLeft),
VolumeUp: key(uiterm.KeyArrowRight),
VolumeReset: key(uiterm.KeyBackspace),
MuteToggle: key(uiterm.KeyF7),
RecordToggle: key(uiterm.KeyCtrlR),
Exit: key(uiterm.KeyF10),
Exit: key(uiterm.KeyCtrlQ),
ToggleTimestamps: key(uiterm.KeyF3),
SwitchViews: key(uiterm.KeyTab),
ClearOutput: key(uiterm.KeyCtrlL),
@@ -195,7 +195,7 @@ func (c *Config) ensureHotkeys() {
ScrollDown: key(uiterm.KeyPgdn),
ScrollToTop: key(uiterm.KeyHome),
ScrollToBottom: key(uiterm.KeyEnd),
AdminMenu: key(uiterm.KeyF11),
AdminMenu: key(uiterm.KeyF10),
NoiseSuppressionToggle: key(uiterm.KeyF9),
AGCToggle: key(uiterm.KeyF12),
}
@@ -309,6 +309,26 @@ func (c *Config) ToggleMute(u *gumble.User) error {
return c.saveConfigLocked()
}
// ResetUserAudio restores and saves the default incoming audio settings for
// each user on the given server.
func (c *Config) ResetUserAudio(address string, users []*gumble.User) error {
c.mu.Lock()
defer c.mu.Unlock()
for _, u := range users {
if u == nil {
continue
}
storedUser := c.findUser(address, u.Name)
storedUser.Boost = 1
storedUser.Volume = 1.0
storedUser.LocallyMuted = false
u.SetBoost(1)
u.SetVolume(1.0)
u.SetLocallyMuted(false)
}
return c.saveConfigLocked()
}
func (c *Config) SetMicVolume(v float32) {
c.mu.Lock()
defer c.mu.Unlock()
+63 -2
View File
@@ -5,6 +5,7 @@ import (
"path/filepath"
"testing"
"git.stormux.org/storm/barnard/gumble/gumble"
"git.stormux.org/storm/barnard/uiterm"
)
@@ -51,8 +52,8 @@ func TestConfigBackfillsRecordingDefaults(t *testing.T) {
if cfg.GetHotkeys().AdminMenu == nil {
t.Fatal("expected admin menu hotkey to be backfilled")
}
if got := *cfg.GetHotkeys().AdminMenu; got != uiterm.KeyF11 {
t.Fatalf("expected admin menu f11, got %s", got)
if got := *cfg.GetHotkeys().AdminMenu; got != uiterm.KeyF10 {
t.Fatalf("expected admin menu f10, got %s", got)
}
for name, got := range map[string]*uiterm.Key{
"clear output": cfg.GetHotkeys().ClearOutput,
@@ -74,6 +75,66 @@ func TestConfigBackfillsRecordingDefaults(t *testing.T) {
}
}
func TestNewHotkeyDefaults(t *testing.T) {
configPath := filepath.Join(t.TempDir(), "barnard.toml")
cfg := NewConfig(&configPath)
if err := cfg.SaveConfig(); err != nil {
t.Fatal(err)
}
hotkeys := NewConfig(&configPath).GetHotkeys()
tests := []struct {
name string
got *uiterm.Key
want uiterm.Key
}{
{name: "volume down", got: hotkeys.VolumeDown, want: uiterm.KeyArrowLeft},
{name: "volume up", got: hotkeys.VolumeUp, want: uiterm.KeyArrowRight},
{name: "volume reset", got: hotkeys.VolumeReset, want: uiterm.KeyBackspace},
{name: "actions menu", got: hotkeys.AdminMenu, want: uiterm.KeyF10},
{name: "exit", got: hotkeys.Exit, want: uiterm.KeyCtrlQ},
}
for _, tt := range tests {
if tt.got == nil || *tt.got != tt.want {
t.Errorf("%s default = %v, want %s", tt.name, tt.got, tt.want)
}
}
}
func TestExplicitLegacyHotkeysRemainConfigured(t *testing.T) {
configPath := filepath.Join(t.TempDir(), "barnard.toml")
data := []byte("[hotkeys]\nvolumedown = \"f5\"\nvolumeup = \"f6\"\nvolumereset = \"f8\"\nadminmenu = \"f11\"\nexit = \"f10\"\n")
if err := os.WriteFile(configPath, data, 0600); err != nil {
t.Fatal(err)
}
hotkeys := NewConfig(&configPath).GetHotkeys()
if *hotkeys.VolumeDown != uiterm.KeyF5 || *hotkeys.VolumeUp != uiterm.KeyF6 ||
*hotkeys.VolumeReset != uiterm.KeyF8 || *hotkeys.AdminMenu != uiterm.KeyF11 ||
*hotkeys.Exit != uiterm.KeyF10 {
t.Fatalf("explicit legacy hotkeys were replaced: %+v", hotkeys)
}
}
func TestResetUserAudioRestoresAndPersistsDefaults(t *testing.T) {
configPath := filepath.Join(t.TempDir(), "barnard.toml")
cfg := NewConfig(&configPath)
user := &gumble.User{Name: "Username"}
user.SetBoost(4)
user.SetVolume(0.4)
user.SetLocallyMuted(true)
if err := cfg.ResetUserAudio("example.test:64738", []*gumble.User{user}); err != nil {
t.Fatal(err)
}
if user.Boost() != 1 || user.Volume() != 1.0 || user.LocallyMuted() {
t.Fatalf("runtime audio was not reset: boost=%d volume=%v muted=%v", user.Boost(), user.Volume(), user.LocallyMuted())
}
storedUser := cfg.findUser("example.test:64738", user.Name)
if storedUser.Boost != 1 || storedUser.Volume != 1.0 || storedUser.LocallyMuted {
t.Fatalf("saved audio was not reset: %+v", storedUser)
}
}
func TestAGCDefaultsOnAndPersists(t *testing.T) {
configPath := filepath.Join(t.TempDir(), "barnard.toml")
if err := os.WriteFile(configPath, []byte("[hotkeys]\ntalk = \"f1\"\n"), 0600); err != nil {