Source code for GLXCurses.ProgressBar
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# It script it publish under GNU GENERAL PUBLIC LICENSE
# http://www.gnu.org/licenses/gpl-3.0.en.html
# Author: the Galaxie Curses Team, all rights reserved
import GLXCurses
import curses
[docs]class ProgressBar(GLXCurses.Widget, GLXCurses.Movable):
def __init__(self):
# Load heritage
GLXCurses.Widget.__init__(self)
GLXCurses.Movable.__init__(self)
self.name = "{0}{1}".format(self.__class__.__name__, self.id)
self.__text = None
self.__show_text = None
self.__value = None
self.text = ""
self.show_text = True
self.value = 0
# Interface
self.interface = "[]"
[docs] def color(self, pos=0):
if (
int(len(self.interface) / 2)
<= pos
<= self.preferred_width - int(len(self.interface) / 2)
and pos - int(len(self.interface) / 2)
< (self.preferred_width - len(self.interface)) * self.value / 100
):
return self.color_normal | curses.A_REVERSE
return self.color_normal
@property
def text(self):
return self.__text
@text.setter
def text(self, value=None):
if value is not None and type(value) != str:
raise TypeError('"text" value must be a str type or None')
if self.__text != value:
self.__text = value
@property
def value(self):
return self.__value
@value.setter
def value(self, value=None):
if value is None:
value = 0
if type(value) != int:
raise TypeError('"value" must be a int type or None')
if self.value != GLXCurses.clamp(value, 0, 100):
self.__value = GLXCurses.clamp(value, 0, 100)
self.text = "{0}%".format(GLXCurses.clamp(value, 0, 100))
@property
def show_text(self):
return self.__show_text
@show_text.setter
def show_text(self, value=None):
if value is None:
value = False
if type(value) != bool:
raise TypeError('"show_text" value must be a bool type or None')
if self.show_text != value:
self.__show_text = value
[docs] def draw_widget_in_area(self):
if self.subwin:
self.check_position()
# Background
for x_inc in range(self.x_offset, self.preferred_width):
try:
self.subwin.delch(self.y_offset, x_inc)
self.subwin.insch(self.y_offset, x_inc, " ", self.color_normal)
except curses.error: # pragma: no cover
pass
# Start interface
for x_inc in range(0, len(self.interface[: int(len(self.interface) / 2)])):
try:
self.subwin.delch(self.y_offset, self.x_offset + x_inc)
self.subwin.insch(
self.y_offset,
self.x_offset + x_inc,
self.interface[: int(len(self.interface) / 2)][x_inc],
self.color(pos=self.x_offset + x_inc),
)
except curses.error: # pragma: no cover
pass
# The bar
x_inc = 0
progress_text = str(" " * int(self.preferred_width - len(self.interface)))
for char in progress_text[
: int(
(self.preferred_width - int(len(self.interface) / 2))
* self.value
/ 100
)
]:
try:
self.subwin.delch(
self.y_offset,
self.x_offset + int(len(self.interface) / 2) + x_inc,
)
self.subwin.insch(
self.y_offset,
self.x_offset + int(len(self.interface) / 2) + x_inc,
char,
self.color(
pos=self.x_offset + int(len(self.interface) / 2) + x_inc
),
)
except curses.error: # pragma: no cover
pass
x_inc += 1
# Text to display
if self.show_text:
message_to_display = GLXCurses.resize_text(
self.text, self.width - len(self.interface), "~"
)
for x_inc in range(0, len(message_to_display)):
try:
self.subwin.delch(
self.y_offset,
int(self.preferred_width / 2)
- int(len(self.text) / 2)
+ x_inc,
)
self.subwin.insch(
self.y_offset,
int(self.preferred_width / 2)
- int(len(self.text) / 2)
+ x_inc,
message_to_display[x_inc],
self.color(
pos=int(self.preferred_width / 2)
- int(len(self.text) / 2)
+ x_inc
),
)
except curses.error: # pragma: no cover
pass
# End Interface
for x_inc in range(0, len(self.interface[-int(len(self.interface) / 2) :])):
try:
self.subwin.delch(
self.y_offset,
self.preferred_width - int(len(self.interface) / 2) + x_inc,
)
self.subwin.insch(
self.y_offset,
self.preferred_width - int(len(self.interface) / 2) + x_inc,
self.interface[-int(len(self.interface) / 2) :][x_inc],
self.color(
pos=self.preferred_width
- int(len(self.interface) / 2)
+ x_inc
),
)
except curses.error: # pragma: no cover
pass
[docs] def update_preferred_sizes(self):
self.preferred_height = 1
self.preferred_width = self.width