75 lines
2.6 KiB
Java
75 lines
2.6 KiB
Java
package com.ts3client.ui;
|
|
|
|
import com.formdev.flatlaf.util.UIScale;
|
|
import com.ts3client.net.HostButton;
|
|
import com.ts3client.net.PictureDownloads;
|
|
|
|
import javax.swing.ImageIcon;
|
|
import javax.swing.JButton;
|
|
import javax.swing.SwingUtilities;
|
|
import java.awt.Image;
|
|
import java.io.File;
|
|
import java.util.Objects;
|
|
|
|
/**
|
|
* The server's host button in the toolbar's corner: its own picture, fitted to the
|
|
* toolbar's height, or TeamSpeak's host button icon while there is none (yet).
|
|
*/
|
|
final class HostButtonView extends JButton {
|
|
|
|
/** Keeps a banner-shaped picture from crowding out the rest of the toolbar. */
|
|
private static final int MAX_ASPECT = 6;
|
|
|
|
private final PictureDownloads pictures;
|
|
private final Runnable onPictureLoaded = () -> SwingUtilities.invokeLater(this::refreshIcon);
|
|
private HostButton shown;
|
|
|
|
HostButtonView(PictureDownloads pictures) {
|
|
this.pictures = pictures;
|
|
setVisible(false);
|
|
addActionListener(e -> {
|
|
if (shown != null && !shown.url().isEmpty()) Links.open(shown.url(), this);
|
|
});
|
|
}
|
|
|
|
/** @param button the selected server's, or {@code null} to hide it */
|
|
void show(HostButton button) {
|
|
if (Objects.equals(button, shown)) return;
|
|
shown = button;
|
|
setVisible(button != null);
|
|
if (button == null) return;
|
|
setToolTipText(!button.tooltip().isEmpty() ? button.tooltip() : button.url().isEmpty() ? null : button.url());
|
|
refreshIcon();
|
|
}
|
|
|
|
@Override
|
|
public void addNotify() {
|
|
super.addNotify();
|
|
pictures.addListener(onPictureLoaded);
|
|
}
|
|
|
|
@Override
|
|
public void removeNotify() {
|
|
pictures.removeListener(onPictureLoaded);
|
|
super.removeNotify();
|
|
}
|
|
|
|
private void refreshIcon() {
|
|
if (shown == null) return;
|
|
ImageIcon picture = shown.gfxUrl().isEmpty() ? null : picture(pictures.get(shown.gfxUrl()));
|
|
setIcon(picture != null ? picture : Icons.of("HOSTER_BUTTON", UIScale.scale(IconTheme.TOOLBAR_SIZE)));
|
|
}
|
|
|
|
private static ImageIcon picture(File file) {
|
|
if (file == null) return null;
|
|
ImageIcon icon = new ImageIcon(file.getPath());
|
|
int w = icon.getIconWidth();
|
|
int h = icon.getIconHeight();
|
|
if (w <= 0 || h <= 0) return null;
|
|
int height = UIScale.scale(IconTheme.TOOLBAR_SIZE);
|
|
int width = Math.min(Math.max(1, Math.round((float) w * height / h)), height * MAX_ASPECT);
|
|
if (w == width && h == height) return icon;
|
|
return new ImageIcon(icon.getImage().getScaledInstance(width, height, Image.SCALE_SMOOTH));
|
|
}
|
|
}
|