Lay out the Options dialog like TeamSpeak 3's

A sidebar of pages with large icons replaces the tabs, and each page
opens under a banner with its title, subtitle and icon. OK, Cancel and
Apply sit below, and the dialog reopens on the last page used.

The pages follow TS3's: Application (muted-microphone warning, reported
client version), myTeamSpeak, Playback, Capture, Design, Hotkeys,
Contacts, Chat and Notifications. Capture now holds everything from the
microphone to the server: the device and gain, activation with the
microphone test, signal processing and the encoder, laid out in one
grid so its columns line up. Forms are grouped under section headings.

Cancel now goes back to what was last applied, and closing the window
cancels too, so a theme or icon pack being tried out is put back.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-01 17:07:13 +00:00
parent 0ad56671af
commit e06bb82299
19 changed files with 903 additions and 505 deletions

View File

@@ -12,7 +12,6 @@ import javax.swing.JPanel;
import javax.swing.JTextField;
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.io.File;
/**
@@ -34,10 +33,6 @@ final class ChatLogsPanel extends FormPanel {
enabled.setSelected(settings.chatLogs);
enabled.setToolTipText("Write every chat to disk and show its history when it opens again");
enabled.addActionListener(e -> updateEnabled());
c.gridx = 0;
c.gridy = 0;
c.gridwidth = 2;
add(enabled, c);
folder.setText(settings.chatLogDir);
folder.putClientProperty("JTextField.placeholderText", "The TeamSpeak 3 client's folder");
@@ -45,24 +40,26 @@ final class ChatLogsPanel extends FormPanel {
+ AppDirs.chatLogs() + "</html>");
limitWidth(folder, FIELD_WIDTH);
browse.addActionListener(e -> browseForFolder());
JPanel row = new JPanel(new BorderLayout(UIScale.scale(6), 0));
row.add(folder, BorderLayout.CENTER);
row.add(browse, BorderLayout.EAST);
addRow(this, c, 1, new JLabel("Folder:"), row);
JPanel folderRow = new JPanel(new BorderLayout(UIScale.scale(6), 0));
folderRow.add(folder, BorderLayout.CENTER);
folderRow.add(browse, BorderLayout.EAST);
c.gridy = 2;
c.gridx = 1;
c.anchor = GridBagConstraints.NORTHWEST;
add(new JLabel("Takes effect on the next connect."), c);
JLabel nextConnect = new JLabel("Takes effect on the next connect.");
nextConnect.setEnabled(false);
pictures.setSelected(settings.descriptionPictures);
pictures.setToolTipText("Off: only links to them, nothing fetched");
c.gridy = 3;
c.gridx = 0;
c.gridwidth = 2;
c.weighty = 1;
c.insets = new Insets(UIScale.scale(12), c.insets.left, c.insets.bottom, c.insets.right);
add(pictures, c);
int row = 0;
addSection(this, c, row++, "Logging");
addWide(this, c, row++, enabled);
addRow(this, c, row++, new JLabel("Folder:"), folderRow);
c.gridx = 1;
c.gridy = row++;
add(nextConnect, c);
addSection(this, c, row++, "Descriptions");
addWide(this, c, row++, pictures);
addFiller(this, c, row);
updateEnabled();
}