root/lib/widget/gauge.c

/* [previous][next][first][last][top][bottom][index][help]  */

DEFINITIONS

This source file includes following definitions.
  1. gauge_callback
  2. gauge_new
  3. gauge_set_value
  4. gauge_show

   1 /*
   2    Widgets for the Midnight Commander
   3 
   4    Copyright (C) 1994-2019
   5    Free Software Foundation, Inc.
   6 
   7    Authors:
   8    Radek Doulik, 1994, 1995
   9    Miguel de Icaza, 1994, 1995
  10    Jakub Jelinek, 1995
  11    Andrej Borsenkow, 1996
  12    Norbert Warmuth, 1997
  13    Andrew Borodin <aborodin@vmail.ru>, 2009, 2010, 2013
  14 
  15    This file is part of the Midnight Commander.
  16 
  17    The Midnight Commander is free software: you can redistribute it
  18    and/or modify it under the terms of the GNU General Public License as
  19    published by the Free Software Foundation, either version 3 of the License,
  20    or (at your option) any later version.
  21 
  22    The Midnight Commander is distributed in the hope that it will be useful,
  23    but WITHOUT ANY WARRANTY; without even the implied warranty of
  24    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  25    GNU General Public License for more details.
  26 
  27    You should have received a copy of the GNU General Public License
  28    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  29  */
  30 
  31 /** \file gauge.c
  32  *  \brief Source: WGauge widget (progress indicator)
  33  */
  34 
  35 #include <config.h>
  36 
  37 #include <stdlib.h>
  38 #include <string.h>
  39 
  40 #include "lib/global.h"
  41 
  42 #include "lib/tty/tty.h"
  43 #include "lib/tty/color.h"
  44 #include "lib/skin.h"
  45 #include "lib/widget.h"
  46 
  47 /*** global variables ****************************************************************************/
  48 
  49 /*** file scope macro definitions ****************************************************************/
  50 
  51 /*** file scope type declarations ****************************************************************/
  52 
  53 /*** file scope variables ************************************************************************/
  54 
  55 /*** file scope functions ************************************************************************/
  56 
  57 static cb_ret_t
  58 gauge_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
     /* [previous][next][first][last][top][bottom][index][help]  */
  59 {
  60     WGauge *g = GAUGE (w);
  61     WDialog *h = w->owner;
  62 
  63     switch (msg)
  64     {
  65     case MSG_DRAW:
  66         widget_move (w, 0, 0);
  67         if (!g->shown)
  68         {
  69             tty_setcolor (h->color[DLG_COLOR_NORMAL]);
  70             tty_printf ("%*s", w->cols, "");
  71         }
  72         else
  73         {
  74             int gauge_len;
  75             int percentage, columns;
  76             int total = g->max;
  77             int done = g->current;
  78 
  79             if (total <= 0 || done < 0)
  80             {
  81                 done = 0;
  82                 total = 100;
  83             }
  84             if (done > total)
  85                 done = total;
  86             while (total > 65535)
  87             {
  88                 total /= 256;
  89                 done /= 256;
  90             }
  91 
  92             gauge_len = w->cols - 7;    /* 7 positions for percentage */
  93 
  94             percentage = (200 * done / total + 1) / 2;
  95             columns = (2 * gauge_len * done / total + 1) / 2;
  96             tty_print_char ('[');
  97             if (g->from_left_to_right)
  98             {
  99                 tty_setcolor (GAUGE_COLOR);
 100                 tty_printf ("%*s", columns, "");
 101                 tty_setcolor (h->color[DLG_COLOR_NORMAL]);
 102                 tty_printf ("%*s] %3d%%", gauge_len - columns, "", percentage);
 103             }
 104             else
 105             {
 106                 tty_setcolor (h->color[DLG_COLOR_NORMAL]);
 107                 tty_printf ("%*s", gauge_len - columns, "");
 108                 tty_setcolor (GAUGE_COLOR);
 109                 tty_printf ("%*s", columns, "");
 110                 tty_setcolor (h->color[DLG_COLOR_NORMAL]);
 111                 tty_printf ("] %3d%%", percentage);
 112             }
 113         }
 114         return MSG_HANDLED;
 115 
 116     default:
 117         return widget_default_callback (w, sender, msg, parm, data);
 118     }
 119 }
 120 
 121 /* --------------------------------------------------------------------------------------------- */
 122 /*** public functions ****************************************************************************/
 123 /* --------------------------------------------------------------------------------------------- */
 124 
 125 WGauge *
 126 gauge_new (int y, int x, int cols, gboolean shown, int max, int current)
     /* [previous][next][first][last][top][bottom][index][help]  */
 127 {
 128     WGauge *g;
 129     Widget *w;
 130 
 131     g = g_new (WGauge, 1);
 132     w = WIDGET (g);
 133     widget_init (w, y, x, 1, cols, gauge_callback, NULL);
 134 
 135     g->shown = shown;
 136     if (max == 0)
 137         max = 1;                /* I do not like division by zero :) */
 138     g->max = max;
 139     g->current = current;
 140     g->from_left_to_right = TRUE;
 141 
 142     return g;
 143 }
 144 
 145 /* --------------------------------------------------------------------------------------------- */
 146 
 147 void
 148 gauge_set_value (WGauge * g, int max, int current)
     /* [previous][next][first][last][top][bottom][index][help]  */
 149 {
 150     if (g->current == current && g->max == max)
 151         return;                 /* Do not flicker */
 152 
 153     if (max == 0)
 154         max = 1;                /* I do not like division by zero :) */
 155     g->current = current;
 156     g->max = max;
 157     widget_redraw (WIDGET (g));
 158 }
 159 
 160 /* --------------------------------------------------------------------------------------------- */
 161 
 162 void
 163 gauge_show (WGauge * g, gboolean shown)
     /* [previous][next][first][last][top][bottom][index][help]  */
 164 {
 165     if (g->shown != shown)
 166     {
 167         g->shown = shown;
 168         widget_redraw (WIDGET (g));
 169     }
 170 }
 171 
 172 /* --------------------------------------------------------------------------------------------- */

/* [previous][next][first][last][top][bottom][index][help]  */