performance improvements

This commit is contained in:
Radek Davidek 2026-02-10 19:01:42 +01:00
parent 07a315ee1b
commit d00d5222c5
2 changed files with 43 additions and 24 deletions

View File

@ -16,7 +16,6 @@ public class FileItem {
private final long size; private final long size;
private final Date modified; private final Date modified;
private final boolean isDirectory; private final boolean isDirectory;
private final Icon icon;
private boolean marked; private boolean marked;
private boolean recentlyChanged; private boolean recentlyChanged;
private String displayPath; private String displayPath;
@ -33,9 +32,6 @@ public class FileItem {
this.isDirectory = file.isDirectory(); this.isDirectory = file.isDirectory();
this.marked = false; this.marked = false;
this.displayPath = displayPath; this.displayPath = displayPath;
// Load icon from system
this.icon = FileSystemView.getFileSystemView().getSystemIcon(file);
} }
public File getFile() { public File getFile() {
@ -83,10 +79,6 @@ public class FileItem {
(modified != null ? modified.getTime() == other.modified.getTime() : other.modified == null); (modified != null ? modified.getTime() == other.modified.getTime() : other.modified == null);
} }
public Icon getIcon() {
return icon;
}
public String getPath() { public String getPath() {
return displayPath != null ? displayPath : file.getAbsolutePath(); return displayPath != null ? displayPath : file.getAbsolutePath();
} }

View File

@ -1045,10 +1045,14 @@ public class FilePanelTab extends JPanel {
} }
public void loadDirectory(File directory, boolean autoSelectFirst, boolean requestFocus) { public void loadDirectory(File directory, boolean autoSelectFirst, boolean requestFocus) {
loadDirectory(directory, autoSelectFirst, requestFocus, null); loadDirectory(directory, null, autoSelectFirst, requestFocus, null);
} }
public void loadDirectory(File directory, boolean autoSelectFirst, boolean requestFocus, final Runnable postLoadAction) { public void loadDirectory(File directory, boolean autoSelectFirst, boolean requestFocus, final Runnable postLoadAction) {
loadDirectory(directory, null, autoSelectFirst, requestFocus, postLoadAction);
}
public void loadDirectory(File directory, List<FileItem> preloadedItems, boolean autoSelectFirst, boolean requestFocus, final Runnable postLoadAction) {
// Ensure we load an existing directory - try parents if necessary // Ensure we load an existing directory - try parents if necessary
File dirToLoad = directory; File dirToLoad = directory;
while (dirToLoad != null && !dirToLoad.isDirectory()) { while (dirToLoad != null && !dirToLoad.isDirectory()) {
@ -1079,7 +1083,7 @@ public class FilePanelTab extends JPanel {
lastValidBriefColumn = 0; lastValidBriefColumn = 0;
} }
List<FileItem> items = createFileItemList(directory); List<FileItem> items = (preloadedItems != null) ? preloadedItems : createFileItemList(directory);
tableModel.setItems(items); tableModel.setItems(items);
if (viewMode == ViewMode.BRIEF) { if (viewMode == ViewMode.BRIEF) {
@ -1191,7 +1195,8 @@ public class FilePanelTab extends JPanel {
} }
} }
loadDirectory(currentDirectory, false, requestFocus, () -> { final List<FileItem> itemsToLoad = newItems;
loadDirectory(currentDirectory, itemsToLoad, false, requestFocus, () -> {
// Restore marks and set recentlyChanged flag based on active timestamps // Restore marks and set recentlyChanged flag based on active timestamps
for (FileItem item : tableModel.items) { for (FileItem item : tableModel.items) {
if (markedNames.contains(item.getName())) { if (markedNames.contains(item.getName())) {
@ -2642,17 +2647,7 @@ public class FilePanelTab extends JPanel {
} }
// Show icon for file names // Show icon for file names
Icon icon = item.getIcon(); Icon icon = getItemIcon(item);
if (item.getName().equals("..")) {
icon = new UpArrowIcon(getForeground());
} else if (item.isDirectory()) {
if (persistedConfig != null) {
icon = new ColoredFolderIcon(persistedConfig.getFolderColor());
}
} else {
// Use type-specific icon for files
icon = new FileSpecificIcon(FileSpecificIcon.getFileType(item.getName()));
}
if (viewMode == ViewMode.BRIEF) { if (viewMode == ViewMode.BRIEF) {
// In BRIEF mode all columns are names // In BRIEF mode all columns are names
@ -2676,7 +2671,38 @@ public class FilePanelTab extends JPanel {
fileTable.getColumnModel().getColumn(i).setCellRenderer(renderer); fileTable.getColumnModel().getColumn(i).setCellRenderer(renderer);
} }
} }
private final java.util.Map<String, Icon> iconCache = new java.util.HashMap<>();
private Icon getItemIcon(FileItem item) {
if (item == null) return null;
String name = item.getName();
if (name.equals("..")) {
return new UpArrowIcon(getForeground());
}
String key;
if (item.isDirectory()) {
Color folderColor = (persistedConfig != null) ? persistedConfig.getFolderColor() : new Color(255, 203, 111);
key = "DIR_" + folderColor.getRGB();
} else {
key = "FILE_" + FileSpecificIcon.getFileType(name);
}
Icon cached = iconCache.get(key);
if (cached != null) return cached;
Icon icon;
if (item.isDirectory()) {
Color folderColor = (persistedConfig != null) ? persistedConfig.getFolderColor() : new Color(255, 203, 111);
icon = new ColoredFolderIcon(folderColor);
} else {
icon = new FileSpecificIcon(FileSpecificIcon.getFileType(name));
}
iconCache.put(key, icon);
return icon;
}
private void updateColumnWidths() { private void updateColumnWidths() {
if (viewMode == ViewMode.FULL) { if (viewMode == ViewMode.FULL) {
if (fileTable.getColumnModel().getColumnCount() == 3) { if (fileTable.getColumnModel().getColumnCount() == 3) {
@ -2728,7 +2754,7 @@ public class FilePanelTab extends JPanel {
int w = fm.stringWidth(display); int w = fm.stringWidth(display);
if (w > maxTextWidth) maxTextWidth = w; if (w > maxTextWidth) maxTextWidth = w;
Icon icon = item.getIcon(); Icon icon = getItemIcon(item);
if (icon != null) { if (icon != null) {
int iw = icon.getIconWidth(); int iw = icon.getIconWidth();
if (iw > maxIconWidth) maxIconWidth = iw; if (iw > maxIconWidth) maxIconWidth = iw;
@ -3058,6 +3084,7 @@ public class FilePanelTab extends JPanel {
*/ */
public void setAppConfig(cz.kamma.kfmanager.config.AppConfig cfg) { public void setAppConfig(cz.kamma.kfmanager.config.AppConfig cfg) {
this.persistedConfig = cfg; this.persistedConfig = cfg;
iconCache.clear();
// Apply persisted sort if present // Apply persisted sort if present
if (cfg != null) { if (cfg != null) {
java.util.List<String> multi = cfg.getMultipleSortCriteria(); java.util.List<String> multi = cfg.getMultipleSortCriteria();