]> git.ipfire.org Git - thirdparty/newt.git/blobdiff - scale.c
install python modules to purelib and platlib
[thirdparty/newt.git] / scale.c
diff --git a/scale.c b/scale.c
index 97acd1b64f4cd3b395316917232a2c64f14a66d3..35dcdde87802c27d152d44cedf2a5667447bf887 100644 (file)
--- a/scale.c
+++ b/scale.c
@@ -1,4 +1,4 @@
-#include <slang/slang.h>
+#include <slang.h>
 #include <stdlib.h>
 #include <string.h>
 
@@ -8,6 +8,9 @@
 struct scale {
     long long fullValue;
     int charsSet;
+    unsigned int percentage;
+    int csEmpty;
+    int csFull;
 };
 
 static void scaleDraw(newtComponent co);
@@ -16,6 +19,8 @@ static struct componentOps scaleOps = {
     scaleDraw,
     newtDefaultEventHandler,
     NULL,
+    newtDefaultPlaceHandler,
+    newtDefaultMappedHandler,
 } ;
 
 newtComponent newtScale(int left, int top, int width, long long fullValue) {
@@ -25,6 +30,7 @@ newtComponent newtScale(int left, int top, int width, long long fullValue) {
     co = malloc(sizeof(*co));
     sc = malloc(sizeof(struct scale));
     co->data = sc;
+    co->destroyCallback = NULL;
 
     co->ops = &scaleOps;
 
@@ -33,38 +39,69 @@ newtComponent newtScale(int left, int top, int width, long long fullValue) {
     co->top = top;
     co->left = left;
     co->takesFocus = 0;
+    co->isMapped = 0;
 
     sc->fullValue = fullValue;
     sc->charsSet = 0;
+    sc->percentage = 0;
+    sc->csEmpty = NEWT_COLORSET_EMPTYSCALE;
+    sc->csFull = NEWT_COLORSET_FULLSCALE;
 
     return co;
 }
 
-void newtScaleSet(newtComponent co, long long amount) {
+void newtScaleSet(newtComponent co, unsigned long long amount) {
     struct scale * sc = co->data;
-    int newCharsSet;
-
-    newCharsSet = (amount * co->width) / sc->fullValue;
+    int newPercentage;
+
+    if (amount >= sc->fullValue) {
+       newPercentage = 100;
+       sc->charsSet = co->width;
+    } else if (sc->fullValue >= -1ULL / (100 > co->width ? 100 : co->width)) {
+       /* avoid overflow on large numbers */
+       sc->charsSet = amount / (sc->fullValue / co->width);
+       newPercentage = amount / (sc->fullValue / 100);
+    } else {
+       sc->charsSet = (amount * co->width) / sc->fullValue;
+       newPercentage = (amount * 100) / sc->fullValue;
+    }
     
-    if (newCharsSet != sc->charsSet) {
-       sc->charsSet = newCharsSet;
+    if (newPercentage != sc->percentage) {
+       sc->percentage = newPercentage;
        scaleDraw(co);
     }
 }
 
+void newtScaleSetColors(newtComponent co, int empty, int full) {
+    struct scale * sc = co->data;
+
+    sc->csEmpty = empty;
+    sc->csFull = full;
+    scaleDraw(co);
+}
+
 static void scaleDraw(newtComponent co) {
     struct scale * sc = co->data;
     int i;
-
-    if (co->top == -1) return;
+    int xlabel = (co->width-4) /2;
+    char percent[10];
+    
+    if (!co->isMapped) return;
 
     newtGotorc(co->top, co->left);
 
-    SLsmg_set_color(NEWT_COLORSET_FULLSCALE);
-    for (i = 0; i < sc->charsSet; i++)
-       SLsmg_write_string(" ");
+    sprintf(percent, "%3d%%", sc->percentage);
 
-    SLsmg_set_color(NEWT_COLORSET_EMPTYSCALE);
-    for (i = 0; i < (co->width - sc->charsSet); i++)
-       SLsmg_write_string(" ");
+    SLsmg_set_color(sc->csFull);
+    
+    for (i = 0; i < co->width; i++) {
+        if (i == sc->charsSet)
+            SLsmg_set_color(sc->csEmpty);
+        if (i >= xlabel && i < xlabel+4)
+            SLsmg_write_char(percent[i-xlabel]);
+        else
+            SLsmg_write_char(' ');
+    }
+    /* put cursor at beginning of text for better accessibility */
+    newtGotorc(co->top, co->left + xlabel);
 }