finalcut/src/fprogressbar.cpp

256 lines
6.2 KiB
C++
Raw Normal View History

2017-11-04 07:03:53 +01:00
/***********************************************************************
* fprogressbar.cpp - Widget FProgressbar *
* *
* This file is part of the Final Cut widget toolkit *
* *
* Copyright 2014-2018 Markus Gans *
2017-11-04 07:03:53 +01:00
* *
* The Final Cut is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public License *
* as published by the Free Software Foundation; either version 3 of *
* the License, or (at your option) any later version. *
* *
* The Final Cut is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with this program. If not, see *
* <http://www.gnu.org/licenses/>. *
***********************************************************************/
2015-05-23 13:35:12 +02:00
#include "final/fprogressbar.h"
2015-05-23 13:35:12 +02:00
namespace finalcut
{
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
// class FProgressbar
//----------------------------------------------------------------------
// constructors and destructor
//----------------------------------------------------------------------
2015-09-22 04:18:20 +02:00
FProgressbar::FProgressbar(FWidget* parent)
: FWidget(parent)
2015-05-23 13:35:12 +02:00
{
2015-09-22 04:18:20 +02:00
unsetFocusable();
setShadow();
2015-05-23 13:35:12 +02:00
}
//----------------------------------------------------------------------
2017-09-11 03:06:02 +02:00
FProgressbar::~FProgressbar() // destructor
2015-09-22 04:18:20 +02:00
{ }
2015-05-23 13:35:12 +02:00
// public methods of FProgressbar
//----------------------------------------------------------------------
void FProgressbar::setPercentage (std::size_t percentage_value)
{
if ( percentage_value == NOT_SET )
percentage = NOT_SET;
else if ( percentage_value > 100 )
percentage = 100;
else if ( percentage_value <= percentage && percentage != NOT_SET )
return;
else
percentage = percentage_value;
if ( isVisible() )
{
drawPercentage();
drawBar();
}
updateTerminal();
}
//----------------------------------------------------------------------
2018-11-20 21:11:04 +01:00
void FProgressbar::setGeometry ( int x, int y
, std::size_t w, std::size_t h
, bool adjust )
{
// Set the progress bar geometry
FWidget::setGeometry (x, y, w, h, adjust);
bar_length = w;
}
//----------------------------------------------------------------------
bool FProgressbar::setShadow (bool on)
{
if ( on
&& getEncoding() != fc::VT100
&& getEncoding() != fc::ASCII )
{
flags.shadow = true;
2018-11-20 21:11:04 +01:00
setShadowSize(1, 1);
}
else
{
flags.shadow = false;
2018-11-20 21:11:04 +01:00
setShadowSize(0, 0);
}
return on;
}
//----------------------------------------------------------------------
void FProgressbar::hide()
{
2018-11-13 02:51:41 +01:00
FColor fg, bg;
auto parent_widget = getParentWidget();
FWidget::hide();
if ( parent_widget )
{
fg = parent_widget->getForegroundColor();
bg = parent_widget->getBackgroundColor();
}
else
{
fg = wc.dialog_fg;
bg = wc.dialog_bg;
}
setColor (fg, bg);
2018-12-17 00:50:24 +01:00
std::size_t s = hasShadow() ? 1 : 0;
auto size = getWidth() + s;
if ( size == 0 )
return;
auto blank = createBlankArray(size + 1);
for (std::size_t y = 0; y < getHeight() + s; y++)
{
setPrintPos (1, 1 + int(y));
print (blank);
}
2018-10-20 22:50:35 +02:00
destroyBlankArray (blank);
setPrintPos (int(getWidth()) - 4, 0);
print (" "); // hide percentage
}
//----------------------------------------------------------------------
void FProgressbar::reset()
{
percentage = NOT_SET;
if ( isVisible() )
{
drawPercentage();
drawBar();
}
updateTerminal();
}
2015-05-23 13:35:12 +02:00
// private methods of FProgressbar
//----------------------------------------------------------------------
void FProgressbar::draw()
{
drawPercentage();
drawBar();
if ( flags.shadow )
drawShadow ();
flush_out();
}
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
void FProgressbar::drawPercentage()
{
auto parent_widget = getParentWidget();
if ( parent_widget )
setColor ( parent_widget->getForegroundColor()
, parent_widget->getBackgroundColor() );
else
setColor ( wc.dialog_fg, wc.dialog_bg );
2015-10-11 21:56:16 +02:00
if ( isMonochron() )
setReverse(true);
setPrintPos (int(getWidth()) - 3, 0);
if ( percentage > 100 )
2015-05-23 13:35:12 +02:00
print ("--- %");
else
printf ("%3d %%", percentage);
2015-10-11 21:56:16 +02:00
if ( isMonochron() )
setReverse(false);
2015-05-23 13:35:12 +02:00
}
//----------------------------------------------------------------------
void FProgressbar::drawBar()
{
std::size_t i = 0;
double length;
2018-11-20 21:11:04 +01:00
setPrintPos (1, 1);
2015-10-10 04:01:22 +02:00
setColor ( wc.progressbar_bg
, wc.progressbar_fg );
if ( percentage == NOT_SET )
length = double(-0/100);
else
length = double(bar_length * percentage) / 100;
2015-05-23 13:35:12 +02:00
if ( isMonochron() )
2015-10-11 21:56:16 +02:00
setReverse(false);
2015-05-23 13:35:12 +02:00
for (; i < trunc(length); i++)
print (' ');
2015-05-23 13:35:12 +02:00
if ( isMonochron() )
2015-10-11 21:56:16 +02:00
setReverse(true);
2015-05-23 13:35:12 +02:00
if ( percentage > 0 && percentage <= 100 && trunc(length) < bar_length )
2015-05-23 13:35:12 +02:00
{
2017-11-26 22:37:18 +01:00
if ( round(length) > trunc(length) || getMaxColor() < 16 )
2015-05-23 13:35:12 +02:00
{
if ( isMonochron() )
{
setReverse(false);
2015-10-11 21:56:16 +02:00
print (' ');
setReverse(true);
2015-05-23 13:35:12 +02:00
}
else
print (' ');
}
else
{
setColor (wc.progressbar_fg, wc.progressbar_bg);
2017-09-11 03:06:02 +02:00
print (fc::LeftHalfBlock); // ▌
2015-05-23 13:35:12 +02:00
}
2015-05-23 13:35:12 +02:00
i++;
}
setColor (wc.progressbar_fg, wc.progressbar_bg);
2015-05-23 13:35:12 +02:00
if ( getMaxColor() < 16 )
{
for (; i < bar_length; i++)
2015-05-23 13:35:12 +02:00
print (fc::MediumShade); // ▒
}
else
{
for (; i < bar_length; i++)
2015-05-23 13:35:12 +02:00
print (' ');
}
2015-10-11 21:56:16 +02:00
if ( isMonochron() )
setReverse(false);
2015-10-23 23:57:00 +02:00
2015-05-23 13:35:12 +02:00
updateTerminal();
flush_out();
}
} // namespace finalcut