Ticket #3710: don't parse "window-state-char" and "window-close-char" as colors.
[midnight-commander.git] / lib / widget / gauge.c
blob61399c0e131df80d3a1f9b240137b48ac0937d8c
1 /*
2 Widgets for the Midnight Commander
4 Copyright (C) 1994-2016
5 Free Software Foundation, Inc.
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
15 This file is part of the Midnight Commander.
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.
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.
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/>.
31 /** \file gauge.c
32 * \brief Source: WGauge widget (progress indicator)
35 #include <config.h>
37 #include <stdlib.h>
38 #include <string.h>
40 #include "lib/global.h"
42 #include "lib/tty/tty.h"
43 #include "lib/tty/color.h"
44 #include "lib/skin.h"
45 #include "lib/widget.h"
47 /*** global variables ****************************************************************************/
49 /*** file scope macro definitions ****************************************************************/
51 /*** file scope type declarations ****************************************************************/
53 /*** file scope variables ************************************************************************/
55 /*** file scope functions ************************************************************************/
57 static cb_ret_t
58 gauge_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
60 WGauge *g = GAUGE (w);
61 WDialog *h = w->owner;
63 switch (msg)
65 case MSG_DRAW:
66 widget_move (w, 0, 0);
67 if (!g->shown)
69 tty_setcolor (h->color[DLG_COLOR_NORMAL]);
70 tty_printf ("%*s", w->cols, "");
72 else
74 int gauge_len;
75 int percentage, columns;
76 int total = g->max;
77 int done = g->current;
79 if (total <= 0 || done < 0)
81 done = 0;
82 total = 100;
84 if (done > total)
85 done = total;
86 while (total > 65535)
88 total /= 256;
89 done /= 256;
92 gauge_len = w->cols - 7; /* 7 positions for percentage */
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)
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);
104 else
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);
114 return MSG_HANDLED;
116 default:
117 return widget_default_callback (w, sender, msg, parm, data);
121 /* --------------------------------------------------------------------------------------------- */
122 /*** public functions ****************************************************************************/
123 /* --------------------------------------------------------------------------------------------- */
125 WGauge *
126 gauge_new (int y, int x, int cols, gboolean shown, int max, int current)
128 WGauge *g;
129 Widget *w;
131 g = g_new (WGauge, 1);
132 w = WIDGET (g);
133 widget_init (w, y, x, 1, cols, gauge_callback, NULL);
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;
142 return g;
145 /* --------------------------------------------------------------------------------------------- */
147 void
148 gauge_set_value (WGauge * g, int max, int current)
150 if (g->current == current && g->max == max)
151 return; /* Do not flicker */
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));
160 /* --------------------------------------------------------------------------------------------- */
162 void
163 gauge_show (WGauge * g, gboolean shown)
165 if (g->shown != shown)
167 g->shown = shown;
168 widget_redraw (WIDGET (g));
172 /* --------------------------------------------------------------------------------------------- */