X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2FTProgressBar.java;h=38f03373b7c8d5d08f323f0e56fa34bac1516048;hb=505be508ae7d3fb48122be548b310a238cfb91eb;hp=49fd76ae8cc899c79b53f4abffe90fb5d5026f51;hpb=a2018e9964f6c58742cd1e6dd0a0c63e244a89d6;p=nikiroo-utils.git diff --git a/src/jexer/TProgressBar.java b/src/jexer/TProgressBar.java index 49fd76a..38f0337 100644 --- a/src/jexer/TProgressBar.java +++ b/src/jexer/TProgressBar.java @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * Copyright (C) 2017 Kevin Lamonte + * Copyright (C) 2019 Kevin Lamonte * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -30,17 +30,141 @@ package jexer; import jexer.bits.CellAttributes; import jexer.bits.GraphicsChars; +import jexer.bits.StringUtils; /** * TProgressBar implements a simple progress bar. */ -public final class TProgressBar extends TWidget { +public class TProgressBar extends TWidget { + + // ------------------------------------------------------------------------ + // Variables -------------------------------------------------------------- + // ------------------------------------------------------------------------ /** * Value that corresponds to 0% progress. */ private int minValue = 0; + /** + * Value that corresponds to 100% progress. + */ + private int maxValue = 100; + + /** + * Current value of the progress. + */ + private int value = 0; + + /** + * The left border character. + */ + private int leftBorderChar = GraphicsChars.CP437[0xC3]; + + /** + * The filled-in part of the bar. + */ + private int completedChar = GraphicsChars.BOX; + + /** + * The remaining to be filled in part of the bar. + */ + private int remainingChar = GraphicsChars.SINGLE_BAR; + + /** + * The right border character. + */ + private int rightBorderChar = GraphicsChars.CP437[0xB4]; + + // ------------------------------------------------------------------------ + // Constructors ----------------------------------------------------------- + // ------------------------------------------------------------------------ + + /** + * Public constructor. + * + * @param parent parent widget + * @param x column relative to parent + * @param y row relative to parent + * @param width width of progress bar + * @param value initial value of percent complete + */ + public TProgressBar(final TWidget parent, final int x, final int y, + final int width, final int value) { + + // Set parent and window + super(parent, false, x, y, width, 1); + + this.value = value; + } + + // ------------------------------------------------------------------------ + // Event handlers --------------------------------------------------------- + // ------------------------------------------------------------------------ + + + // ------------------------------------------------------------------------ + // TWidget ---------------------------------------------------------------- + // ------------------------------------------------------------------------ + + /** + * Override TWidget's height: we can only set height at construction + * time. + * + * @param height new widget height (ignored) + */ + @Override + public void setHeight(final int height) { + // Do nothing + } + + /** + * Draw a static progress bar. + */ + @Override + public void draw() { + + if (getWidth() <= 2) { + // Bail out, we are too narrow to draw anything. + return; + } + + CellAttributes completeColor = getTheme().getColor("tprogressbar.complete"); + CellAttributes incompleteColor = getTheme().getColor("tprogressbar.incomplete"); + + float progress = ((float)value - minValue) / ((float)maxValue - minValue); + int progressInt = (int)(progress * 100); + int progressUnit = 100 / (getWidth() - 2); + + putCharXY(0, 0, leftBorderChar, incompleteColor); + for (int i = StringUtils.width(leftBorderChar); i < getWidth() - 2;) { + float iProgress = (float)i / (getWidth() - 2); + int iProgressInt = (int)(iProgress * 100); + if (iProgressInt <= progressInt - progressUnit) { + putCharXY(i, 0, completedChar, completeColor); + i += StringUtils.width(completedChar); + } else { + putCharXY(i, 0, remainingChar, incompleteColor); + i += StringUtils.width(remainingChar); + } + } + if (value >= maxValue) { + putCharXY(getWidth() - StringUtils.width(leftBorderChar) - + StringUtils.width(rightBorderChar), 0, completedChar, + completeColor); + } else { + putCharXY(getWidth() - StringUtils.width(leftBorderChar) - + StringUtils.width(rightBorderChar), 0, remainingChar, + incompleteColor); + } + putCharXY(getWidth() - StringUtils.width(rightBorderChar), 0, + rightBorderChar, incompleteColor); + } + + // ------------------------------------------------------------------------ + // TProgressBar ----------------------------------------------------------- + // ------------------------------------------------------------------------ + /** * Get the value that corresponds to 0% progress. * @@ -59,11 +183,6 @@ public final class TProgressBar extends TWidget { this.minValue = minValue; } - /** - * Value that corresponds to 100% progress. - */ - private int maxValue = 100; - /** * Get the value that corresponds to 100% progress. * @@ -82,11 +201,6 @@ public final class TProgressBar extends TWidget { this.maxValue = maxValue; } - /** - * Current value of the progress. - */ - private int value = 0; - /** * Get the current value of the progress. * @@ -106,56 +220,75 @@ public final class TProgressBar extends TWidget { } /** - * Public constructor. + * Set the left border character. * - * @param parent parent widget - * @param x column relative to parent - * @param y row relative to parent - * @param width width of progress bar - * @param value initial value of percent complete + * @param ch the char to use */ - public TProgressBar(final TWidget parent, final int x, final int y, - final int width, final int value) { + public void setLeftBorderChar(final int ch) { + leftBorderChar = ch; + } - // Set parent and window - super(parent, false, x, y, width, 1); + /** + * Get the left border character. + * + * @return the char + */ + public int getLeftBorderChar() { + return leftBorderChar; + } - this.value = value; + /** + * Set the filled-in part of the bar. + * + * @param ch the char to use + */ + public void setCompletedChar(final int ch) { + completedChar = ch; } /** - * Draw a static progress bar. + * Get the filled-in part of the bar. + * + * @return the char */ - @Override - public void draw() { - CellAttributes completeColor = getTheme().getColor("tprogressbar.complete"); - CellAttributes incompleteColor = getTheme().getColor("tprogressbar.incomplete"); + public int getCompletedChar() { + return completedChar; + } - float progress = ((float)value - minValue) / ((float)maxValue - minValue); - int progressInt = (int)(progress * 100); - int progressUnit = 100 / (getWidth() - 2); + /** + * Set the remaining to be filled in part of the bar. + * + * @param ch the char to use + */ + public void setRemainingChar(final int ch) { + remainingChar = ch; + } - getScreen().putCharXY(0, 0, GraphicsChars.CP437[0xC3], incompleteColor); - for (int i = 0; i < getWidth() - 2; i++) { - float iProgress = (float)i / (getWidth() - 2); - int iProgressInt = (int)(iProgress * 100); - if (iProgressInt <= progressInt - progressUnit) { - getScreen().putCharXY(i + 1, 0, GraphicsChars.BOX, - completeColor); - } else { - getScreen().putCharXY(i + 1, 0, GraphicsChars.SINGLE_BAR, - incompleteColor); - } - } - if (value >= maxValue) { - getScreen().putCharXY(getWidth() - 2, 0, GraphicsChars.BOX, - completeColor); - } else { - getScreen().putCharXY(getWidth() - 2, 0, GraphicsChars.SINGLE_BAR, - incompleteColor); - } - getScreen().putCharXY(getWidth() - 1, 0, GraphicsChars.CP437[0xB4], - incompleteColor); + /** + * Get the remaining to be filled in part of the bar. + * + * @return the char + */ + public int getRemainingChar() { + return remainingChar; + } + + /** + * Set the right border character. + * + * @param ch the char to use + */ + public void setRightBorderChar(final int ch) { + rightBorderChar = ch; + } + + /** + * Get the right border character. + * + * @return the char + */ + public int getRightBorderChar() { + return rightBorderChar; } }