From 4f661b2bb0f64ed54c3e849c0c2c5b6bcfe844df Mon Sep 17 00:00:00 2001 From: Niki Roo Date: Thu, 9 Mar 2017 23:20:50 +0100 Subject: [PATCH] UI update: smoother progress updates (still wip) - progress updates in UI are smoother now, though there still is a problem with one of the depth level --- src/be/nikiroo/fanfix/Library.java | 142 ++++++++++++------ .../fanfix/reader/LocalReaderFrame.java | 23 ++- 2 files changed, 113 insertions(+), 52 deletions(-) diff --git a/src/be/nikiroo/fanfix/Library.java b/src/be/nikiroo/fanfix/Library.java index ccbd7d4..69b497f 100644 --- a/src/be/nikiroo/fanfix/Library.java +++ b/src/be/nikiroo/fanfix/Library.java @@ -1,6 +1,7 @@ package be.nikiroo.fanfix; import java.io.File; +import java.io.FileFilter; import java.io.IOException; import java.net.URL; import java.util.ArrayList; @@ -56,6 +57,16 @@ public class Library { dir.mkdirs(); } + /** + * Refresh the {@link Library}, that is, make sure all stories are loaded. + * + * @param pg + * the optional progress reporter + */ + public void refresh(Progress pg) { + getStories(pg); + } + /** * List all the known types of stories. * @@ -63,7 +74,7 @@ public class Library { */ public synchronized List getTypes() { List list = new ArrayList(); - for (Entry entry : getStories().entrySet()) { + for (Entry entry : getStories(null).entrySet()) { String storyType = entry.getKey().getSource(); if (!list.contains(storyType)) { list.add(storyType); @@ -81,7 +92,7 @@ public class Library { */ public synchronized List getAuthors() { List list = new ArrayList(); - for (Entry entry : getStories().entrySet()) { + for (Entry entry : getStories(null).entrySet()) { String storyAuthor = entry.getKey().getAuthor(); if (!list.contains(storyAuthor)) { list.add(storyAuthor); @@ -103,7 +114,7 @@ public class Library { */ public synchronized List getListByAuthor(String author) { List list = new ArrayList(); - for (Entry entry : getStories().entrySet()) { + for (Entry entry : getStories(null).entrySet()) { String storyAuthor = entry.getKey().getAuthor(); if (author == null || author.equalsIgnoreCase(storyAuthor)) { list.add(entry.getKey()); @@ -125,7 +136,7 @@ public class Library { */ public synchronized List getListByType(String type) { List list = new ArrayList(); - for (Entry entry : getStories().entrySet()) { + for (Entry entry : getStories(null).entrySet()) { String storyType = entry.getValue().getParentFile().getName(); if (type == null || type.equalsIgnoreCase(storyType)) { list.add(entry.getKey()); @@ -146,7 +157,7 @@ public class Library { */ public synchronized MetaData getInfo(String luid) { if (luid != null) { - for (Entry entry : getStories().entrySet()) { + for (Entry entry : getStories(null).entrySet()) { if (luid.equals(entry.getKey().getLuid())) { return entry.getKey(); } @@ -166,7 +177,7 @@ public class Library { */ public synchronized File getFile(String luid) { if (luid != null) { - for (Entry entry : getStories().entrySet()) { + for (Entry entry : getStories(null).entrySet()) { if (luid.equals(entry.getKey().getLuid())) { return entry.getValue(); } @@ -188,7 +199,7 @@ public class Library { */ public synchronized Story getStory(String luid, Progress pg) { if (luid != null) { - for (Entry entry : getStories().entrySet()) { + for (Entry entry : getStories(null).entrySet()) { if (luid.equals(entry.getKey().getLuid())) { try { SupportType type = SupportType.valueOfAllOkUC(entry @@ -323,7 +334,7 @@ public class Library { story.setMeta(key); if (luid == null || luid.isEmpty()) { - getStories(); // refresh lastId if needed + getStories(null); // refresh lastId if needed key.setLuid(String.format("%03d", (++lastId))); } else { key.setLuid(luid); @@ -362,7 +373,7 @@ public class Library { boolean ok = false; MetaData meta = getInfo(luid); - File file = getStories().get(meta); + File file = getStories(null).get(meta); if (file != null) { if (file.delete()) { @@ -442,56 +453,93 @@ public class Library { /** * Return all the known stories in this {@link Library} object. * + * @param pg + * the optional progress reporter + * * @return the stories */ - private synchronized Map getStories() { + private synchronized Map getStories(Progress pg) { + if (pg == null) { + pg = new Progress(); + } else { + pg.setMinMax(0, 100); + } + if (stories.isEmpty()) { lastId = 0; - String ext = ".info"; - for (File dir : baseDir.listFiles()) { - if (dir.isDirectory()) { - for (File file : dir.listFiles()) { + File[] dirs = baseDir.listFiles(new FileFilter() { + public boolean accept(File file) { + return file != null && file.isDirectory(); + } + }); + + Progress pgDirs = new Progress(0, 100 * dirs.length); + pg.addProgress(pgDirs, 100); + + final String ext = ".info"; + for (File dir : dirs) { + File[] files = dir.listFiles(new FileFilter() { + public boolean accept(File file) { + return file != null + && file.getPath().toLowerCase().endsWith(ext); + } + }); + + Progress pgFiles = new Progress(0, files.length); + pgDirs.addProgress(pgFiles, 100); + pgDirs.setName("Loading from: " + dir.getName()); + + for (File file : files) { + try { + pgFiles.setName(file.getName()); + MetaData meta = InfoReader.readMeta(file); try { - if (file.getPath().toLowerCase().endsWith(ext)) { - MetaData meta = InfoReader.readMeta(file); - try { - int id = Integer.parseInt(meta.getLuid()); - if (id > lastId) { - lastId = id; - } - - // Replace .info with whatever is needed: - String path = file.getPath(); - path = path.substring(0, path.length() - - ext.length()); - - String newExt = getOutputType(meta) - .getDefaultExtension(true); - - file = new File(path + newExt); - // - - stories.put(meta, file); - - } catch (Exception e) { - // not normal!! - Instance.syserr(new IOException( - "Cannot understand the LUID of " - + file.getPath() + ": " - + meta.getLuid(), e)); - } + int id = Integer.parseInt(meta.getLuid()); + if (id > lastId) { + lastId = id; } - } catch (IOException e) { - // We should not have not-supported files in the - // library + + // Replace .info with whatever is needed: + String path = file.getPath(); + path = path.substring(0, + path.length() - ext.length()); + + String newExt = getOutputType(meta) + .getDefaultExtension(true); + + file = new File(path + newExt); + // + + stories.put(meta, file); + + } catch (Exception e) { + // not normal!! Instance.syserr(new IOException( - "Cannot load file from library: " - + file.getPath(), e)); + "Cannot understand the LUID of " + + file.getPath() + ": " + + meta.getLuid(), e)); } + } catch (IOException e) { + // We should not have not-supported files in the + // library + Instance.syserr(new IOException( + "Cannot load file from library: " + + file.getPath(), e)); + } finally { + pgFiles.setProgress(pgFiles.getProgress() + 1); + + System.out.println("files: " + pgFiles.getProgress() + + "/" + pgFiles.getMax()); + System.out.println("dirs : " + pgDirs.getProgress() + + "/" + pgDirs.getMax()); } } + + pgFiles.setName(null); } + + pgDirs.setName("Loading directories"); } return stories; diff --git a/src/be/nikiroo/fanfix/reader/LocalReaderFrame.java b/src/be/nikiroo/fanfix/reader/LocalReaderFrame.java index 58c7596..ca49470 100644 --- a/src/be/nikiroo/fanfix/reader/LocalReaderFrame.java +++ b/src/be/nikiroo/fanfix/reader/LocalReaderFrame.java @@ -116,13 +116,23 @@ class LocalReaderFrame extends JFrame { } }); - setJMenuBar(createMenu()); - booksByType = new HashMap(); booksByAuthor = new HashMap(); - addBookPane(type, true); - refreshBooks(); + pane.setVisible(false); + final Progress pg = new Progress(); + final String typeF = type; + outOfUi(pg, new Runnable() { + public void run() { + Instance.getLibrary().refresh(pg); + invalidate(); + setJMenuBar(createMenu()); + addBookPane(typeF, true); + refreshBooks(); + validate(); + pane.setVisible(true); + } + }); setVisible(true); } @@ -753,7 +763,10 @@ class LocalReaderFrame extends JFrame { */ @Override public void setEnabled(boolean b) { - bar.setEnabled(b); + if (bar != null) { + bar.setEnabled(b); + } + for (LocalReaderGroup group : booksByType.keySet()) { group.setEnabled(b); } -- 2.27.0