finalcut/src/fprogressbar.cpp

246 lines
5.3 KiB
C++
Raw Normal View History

2015-05-23 13:35:12 +02:00
// fprogressbar.cpp
// class FProgressbar
#include "fprogressbar.h"
//----------------------------------------------------------------------
// class FProgressbar
//----------------------------------------------------------------------
// constructors and destructor
//----------------------------------------------------------------------
FProgressbar::FProgressbar(FWidget* parent) : FWidget(parent)
{
this->init();
}
//----------------------------------------------------------------------
FProgressbar::~FProgressbar()
{
}
// private methods of FProgressbar
//----------------------------------------------------------------------
void FProgressbar::init()
{
percentage = -1;
flags = 0;
BarLength = width;
unsetFocusable();
}
//----------------------------------------------------------------------
void FProgressbar::drawPercentage()
{
setColor ( parentWidget()->getForegroundColor(),
parentWidget()->getBackgroundColor() );
gotoxy (xpos+xmin+width-5, ypos+ymin-2);
if ( percentage < 0 || percentage > 100 )
print ("--- %");
else
printf ("%3d %%", percentage);
}
//----------------------------------------------------------------------
void FProgressbar::drawBar()
{
int i = 1;
float length = float(BarLength*percentage)/100;
gotoxy (xpos+xmin-1, ypos+ymin-1);
if ( isMonochron() )
{
if ( round(length) >= 1)
{
setReverse(true);
print (' ');
setReverse(false);
}
else
print (fc::MediumShade); // ▒
}
else if ( getMaxColor() < 16 )
{
setColor ( wc.progressbar_bg,
wc.progressbar_fg );
if ( round(length) >= 1)
print (' ');
else
print (fc::MediumShade);
}
if ( round(length) >= 1)
setColor( wc.progressbar_fg,
parentWidget()->getBackgroundColor() );
else
setColor( wc.progressbar_bg,
parentWidget()->getBackgroundColor() );
if ( ! isMonochron() && getMaxColor() >= 16 )
{
// Cygwin terminal use IBM Codepage 850
if ( this->isCygwinTerminal() )
print (fc::FullBlock); // █
else
print (fc::RightHalfBlock); // ▐
}
setColor ( wc.progressbar_bg,
wc.progressbar_fg );
if ( isMonochron() )
setReverse(true);
for (; i < trunc(length); i++)
print (' ');
if ( isMonochron() )
setReverse(false);
if ( trunc(length) >= 1 && trunc(length) < BarLength )
{
if ( round(length) > trunc(length)
|| this->isCygwinTerminal()
|| getMaxColor() < 16 )
{
if ( isMonochron() )
{
setReverse(true);
print (' ');
setReverse(false);
}
else
print (' ');
}
else
{
setColor(wc.progressbar_fg, wc.progressbar_bg);
print (fc::LeftHalfBlock); // ▌
}
i++;
}
setColor(wc.progressbar_fg, wc.progressbar_bg);
if ( getMaxColor() < 16 )
{
for (; i < BarLength; i++)
print (fc::MediumShade); // ▒
}
else
{
for (; i < BarLength; i++)
print (' ');
}
updateTerminal();
flush_out();
}
// protected methods of FProgressbar
//----------------------------------------------------------------------
void FProgressbar::draw()
{
setUpdateVTerm(false);
drawPercentage();
drawBar();
if ( (flags & SHADOW) != 0 )
drawShadow ();
setUpdateVTerm(true);
flush_out();
}
// public methods of FProgressbar
//----------------------------------------------------------------------
void FProgressbar::hide()
{
int fg, bg, s, size;
char* blank;
FWidget::hide();
fg = parentWidget()->getForegroundColor();
bg = parentWidget()->getBackgroundColor();
setColor (fg, bg);
s = hasShadow() ? 1 : 0;
size = width + s;
blank = new char[size+1];
memset(blank, ' ', uLong(size));
blank[size] = '\0';
for (int y=0; y < height+s; y++)
{
gotoxy (xpos+xmin-1, ypos+ymin-1+y);
print (blank);
}
delete[] blank;
gotoxy (xpos+xmin+width-5, ypos+ymin-2);
print (" "); // hide percentage
}
//----------------------------------------------------------------------
void FProgressbar::setPercentage (int percentage_value)
{
if ( percentage_value <= percentage )
return;
if ( percentage_value > 100 )
percentage = 100;
else if ( percentage_value < 0 )
percentage = 0;
else
percentage = percentage_value;
setUpdateVTerm(false);
if ( isVisible() )
{
drawPercentage();
drawBar();
}
setUpdateVTerm(true);
updateTerminal();
}
//----------------------------------------------------------------------
void FProgressbar::reset()
{
setUpdateVTerm(false);
percentage = -1;
if ( isVisible() )
{
drawPercentage();
drawBar();
}
setUpdateVTerm(true);
updateTerminal();
}
//----------------------------------------------------------------------
void FProgressbar::setGeometry (int x, int y, int w, int h, bool adjust)
{
FWidget::setGeometry (x, y, w, h, adjust);
BarLength = w;
}
//----------------------------------------------------------------------
bool FProgressbar::setEnable (bool on)
{
FWidget::setEnable(on);
if ( on )
this->flags |= ACTIVE;
else
this->flags &= ~ACTIVE;
return on;
}
//----------------------------------------------------------------------
bool FProgressbar::setShadow (bool on)
{
if ( on )
this->flags |= SHADOW;
else
this->flags &= ~SHADOW;
return on;
}