X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2FProgress.java;h=d722fc91c3289e9f0b0425cba4bfba87fdc1b88f;hb=11f9e5f37c2570f0376a4c1898c6aea3a7f28fc7;hp=b6137f18bf6144d72f186b8e93b6bd70768846b5;hpb=2a35af0bc418c83eaf2be88f706fbfb06d4e9674;p=nikiroo-utils.git diff --git a/src/be/nikiroo/utils/Progress.java b/src/be/nikiroo/utils/Progress.java index b6137f1..d722fc9 100644 --- a/src/be/nikiroo/utils/Progress.java +++ b/src/be/nikiroo/utils/Progress.java @@ -37,8 +37,8 @@ public class Progress { private List listeners; private int min; private int max; - private int localProgress; - private int progress; // children included + private double relativeLocalProgress; + private double relativeProgress; // children included /** * Create a new default unnamed {@link Progress}, from 0 to 100. @@ -106,7 +106,7 @@ public class Progress { */ public void setName(String name) { this.name = name; - changed(this); + changed(this, name); } /** @@ -208,7 +208,7 @@ public class Progress { * @return the progress the value */ public int getProgress() { - return progress; + return (int) Math.round(relativeProgress * (max - min)); } /** @@ -221,20 +221,13 @@ public class Progress { */ public void setProgress(int progress) { synchronized (getLock()) { - int diff = this.progress - this.localProgress; - this.localProgress = progress; - setTotalProgress(this, name, progress + diff); - } - } + double childrenProgress = relativeProgress - relativeLocalProgress; - /** - * Check if the action corresponding to this {@link Progress} is done (i.e., - * if its progress value == its max value). - * - * @return TRUE if it is - */ - public boolean isDone() { - return progress >= max; + relativeLocalProgress = ((double) progress) / (max - min); + + setRelativeProgress(this, name, relativeLocalProgress + + childrenProgress); + } } /** @@ -244,22 +237,12 @@ public class Progress { * @return the progress */ public double getRelativeProgress() { - return (((double) progress) / (max - min)); - } - - /** - * Return the list of direct children of this {@link Progress}. - * - * @return the children (Who will think of the children??) - */ - public Set getChildren() { - return children.keySet(); + return relativeProgress; } /** * Set the total progress value (including the optional children - * {@link Progress}), on a {@link Progress#getMin()} to - * {@link Progress#getMax()} scale. + * {@link Progress}), on a 0 to 1 scale. * * @param pg * the {@link Progress} to report as the progression emitter @@ -267,32 +250,87 @@ public class Progress { * the current name (if it is NULL, the first non-null name in * the hierarchy will overwrite it) of the {@link Progress} who * emitted this change - * @param progress + * @param relativeProgress * the progress to set */ - private void setTotalProgress(Progress pg, String name, int progress) { + private void setRelativeProgress(Progress pg, String name, + double relativeProgress) { synchronized (getLock()) { - progress = Math.max(min, progress); - progress = Math.min(max, progress); + relativeProgress = Math.max(0, relativeProgress); + relativeProgress = Math.min(1, relativeProgress); + this.relativeProgress = relativeProgress; - if (progress != this.progress) { - this.progress = progress; - changed(pg); - } + changed(pg, name); + } + } + + /** + * Get the total progress value (including the optional children + * {@link Progress}) on a 0 to 1 scale. + * + * @return the progress the value + */ + private int getLocalProgress() { + return (int) Math.round(relativeLocalProgress * (max - min)); + } + + /** + * Add some value to the current progression of this {@link Progress}. + * + * @param step + * the amount to add + */ + public void add(int step) { + synchronized (getLock()) { + setProgress(getLocalProgress() + step); } } + /** + * Check if the action corresponding to this {@link Progress} is done (i.e., + * if its progress value == its max value). + * + * @return TRUE if it is + */ + public boolean isDone() { + return relativeProgress >= 1d; + } + + /** + * Mark the {@link Progress} as done by setting its value to max. + */ + public void done() { + setProgress(getMax()); + } + + /** + * Return the list of direct children of this {@link Progress}. + * + * @return the children (Who will think of the children??) + */ + public Set getChildren() { + return children.keySet(); + } + /** * Notify the listeners that this {@link Progress} changed value. * * @param pg * the emmiter + * @param name + * the current name (if it is NULL, the first non-null name in + * the hierarchy will overwrite it) of the {@link Progress} who + * emitted this change */ - private void changed(Progress pg) { + private void changed(Progress pg, String name) { if (pg == null) { pg = this; } + if (name == null) { + name = this.name; + } + synchronized (getLock()) { for (ProgressListener l : listeners) { l.progress(pg, name); @@ -356,20 +394,16 @@ public class Progress { } progress.addProgressListener(new ProgressListener() { + @Override public void progress(Progress pg, String name) { synchronized (getLock()) { - double total = ((double) localProgress) / (max - min); + double total = relativeLocalProgress; for (Entry entry : children.entrySet()) { total += (entry.getValue() / (max - min)) * entry.getKey().getRelativeProgress(); } - if (name == null) { - name = Progress.this.name; - } - - setTotalProgress(pg, name, - (int) Math.round(total * (max - min))); + setRelativeProgress(pg, name, total); } } });