folder shortcuts

This commit is contained in:
Radek Davidek 2026-01-20 16:18:02 +01:00
parent 21d8454c61
commit 0cfea69a50
3 changed files with 54 additions and 6 deletions

View File

@ -8,15 +8,22 @@ import java.awt.*;
*/ */
public class ColoredFolderIcon implements Icon { public class ColoredFolderIcon implements Icon {
private final Color color; private final Color color;
private final String label;
public ColoredFolderIcon(Color color) { public ColoredFolderIcon(Color color) {
this(color, null);
}
public ColoredFolderIcon(Color color, String label) {
this.color = color; this.color = color;
this.label = label;
} }
@Override @Override
public void paintIcon(Component c, Graphics g, int x, int y) { public void paintIcon(Component c, Graphics g, int x, int y) {
Graphics2D g2 = (Graphics2D) g.create(); Graphics2D g2 = (Graphics2D) g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2.setColor(color); g2.setColor(color);
// Draw a simple folder shape // Draw a simple folder shape
@ -29,6 +36,21 @@ public class ColoredFolderIcon implements Icon {
g2.setColor(color.darker()); g2.setColor(color.darker());
g2.drawRect(x + 2, y + 4, 12, 8); g2.drawRect(x + 2, y + 4, 12, 8);
// Draw label if provided
if (label != null && !label.isEmpty()) {
// Calculate contrast color based on folder color
double luma = (0.299 * color.getRed() + 0.587 * color.getGreen() + 0.114 * color.getBlue()) / 255.0;
g2.setColor(luma > 0.6 ? Color.BLACK : Color.WHITE);
// Use a small font that fits inside the folder
g2.setFont(new Font("SansSerif", Font.BOLD, 9));
FontMetrics fm = g2.getFontMetrics();
String firstLetter = label.substring(0, 1).toUpperCase();
int lx = x + 2 + (12 - fm.stringWidth(firstLetter)) / 2;
int ly = y + 4 + (8 + fm.getAscent()) / 2 - 2;
g2.drawString(firstLetter, lx, ly);
}
g2.dispose(); g2.dispose();
} }

View File

@ -2114,7 +2114,7 @@ public class FilePanelTab extends JPanel {
icon = new UpArrowIcon(getForeground()); icon = new UpArrowIcon(getForeground());
} else if (item.isDirectory()) { } else if (item.isDirectory()) {
if (persistedConfig != null) { if (persistedConfig != null) {
icon = new ColoredFolderIcon(persistedConfig.getFolderColor()); icon = new ColoredFolderIcon(persistedConfig.getFolderColor(), item.getName());
} }
} else { } else {
// Use type-specific icon for files // Use type-specific icon for files

View File

@ -453,6 +453,10 @@ public class MainWindow extends JFrame {
int btnSize = config.getToolbarButtonSize(); int btnSize = config.getToolbarButtonSize();
int iconSize = config.getToolbarIconSize(); int iconSize = config.getToolbarIconSize();
// Group shortcuts: directories will go to the right, others stay on the left
List<JButton> leftShortcuts = new ArrayList<>();
List<JButton> rightShortcuts = new ArrayList<>();
for (AppConfig.ToolbarShortcut s : shortcuts) { for (AppConfig.ToolbarShortcut s : shortcuts) {
JButton btn = new JButton(); JButton btn = new JButton();
btn.setPreferredSize(new Dimension(btnSize, btnSize)); btn.setPreferredSize(new Dimension(btnSize, btnSize));
@ -460,6 +464,12 @@ public class MainWindow extends JFrame {
btn.setMaximumSize(new Dimension(btnSize, btnSize)); btn.setMaximumSize(new Dimension(btnSize, btnSize));
boolean hasIcon = false; boolean hasIcon = false;
boolean isDirectory = false;
File target = new File(s.command);
if (target.exists() && target.isDirectory()) {
isDirectory = true;
}
if (s.iconPath != null && !s.iconPath.isEmpty()) { if (s.iconPath != null && !s.iconPath.isEmpty()) {
try { try {
File iconFile = new File(s.iconPath); File iconFile = new File(s.iconPath);
@ -473,11 +483,10 @@ public class MainWindow extends JFrame {
// If no custom icon, try to use the same icons as in file panels // If no custom icon, try to use the same icons as in file panels
if (!hasIcon) { if (!hasIcon) {
try { try {
File target = new File(s.command);
if (target.exists()) { if (target.exists()) {
Icon customIcon; Icon customIcon;
if (target.isDirectory()) { if (target.isDirectory()) {
customIcon = new ColoredFolderIcon(config.getFolderColor()); customIcon = new ColoredFolderIcon(config.getFolderColor(), s.label);
} else { } else {
customIcon = new FileSpecificIcon(FileSpecificIcon.getFileType(target.getName())); customIcon = new FileSpecificIcon(FileSpecificIcon.getFileType(target.getName()));
} }
@ -542,7 +551,24 @@ public class MainWindow extends JFrame {
} }
}); });
toolBar.add(btn); if (isDirectory) {
rightShortcuts.add(btn);
} else {
leftShortcuts.add(btn);
}
}
// Add non-directory shortcuts to the left
for (JButton b : leftShortcuts) {
toolBar.add(b);
}
// Push directory shortcuts to the right
toolBar.add(javax.swing.Box.createHorizontalGlue());
// Add directory shortcuts to the right
for (JButton b : rightShortcuts) {
toolBar.add(b);
} }
toolBar.revalidate(); toolBar.revalidate();