CProgressWindow: add adaptiv progress handling, new classes added

See src/gui/widget/progresswindow.h for more details and examples.
Docs could be generated with Doxygen.
This commit is contained in:
2020-01-05 21:17:59 +01:00
parent eecedc6099
commit 0c62e5e264
4 changed files with 328 additions and 179 deletions

View File

@@ -2965,7 +2965,6 @@ void CMovieBrowser::updateDir(void)
void CMovieBrowser::loadAllTsFileNamesFromStorage(void)
{
//TRACE("[mb]->loadAllTsFileNamesFromStorage \n");
size_t i,size;
m_movieSelectionHandler = NULL;
m_dirNames.clear();
@@ -2973,16 +2972,26 @@ void CMovieBrowser::loadAllTsFileNamesFromStorage(void)
updateDir();
size_t i, size;
size = m_dir.size();
for (i=0; i < size;i++)
size_t used_dirs = 0;
for (i = 0; i < size;i++)
{
if (*m_dir[i].used == true){
OnGlobalProgress(i, size, m_dir[i].name);
if (*m_dir[i].used)
used_dirs ++;
}
OnSetGlobalMax(used_dirs);
for (i = 0; i < size; i++)
{
if (*m_dir[i].used)
{
loadTsFileNamesFromDir(m_dir[i].name);
}
}
TRACE("[mb] Dir%d, Files:%d\n", (int)m_dirNames.size(), (int)m_vMovieInfo.size());
TRACE("[mb] Dir %d, Files: %d, size %u, used_dirs %u\n", (int)m_dirNames.size(), (int)m_vMovieInfo.size(), size, used_dirs);
}
bool CMovieBrowser::gotMovie(const char *rec_title)
@@ -3100,7 +3109,7 @@ bool CMovieBrowser::loadTsFileNamesFromDir(const std::string & dirname)
result |= addFile(flist[i], dirItNr);
}
if (result)
OnLocalProgress(i, count, dirname );
OnProgress(i, count, dirname );
}
//result = true;
}
@@ -3342,7 +3351,11 @@ void CMovieBrowser::loadMovies(bool doRefresh)
struct timeval t1, t2;
gettimeofday(&t1, NULL);
CProgressWindow loadBox((show_mode == MB_SHOW_YT) ? LOCALE_MOVIEPLAYER_YTPLAYBACK : LOCALE_MOVIEBROWSER_SCAN_FOR_MOVIES, CCW_PERCENT 50, CCW_PERCENT 10, NULL, show_mode == MB_SHOW_YT ? &ytparser.OnProgress : &OnLocalProgress, &OnGlobalProgress);
CProgressWindowA loadBox((show_mode == MB_SHOW_YT) ? LOCALE_MOVIEPLAYER_YTPLAYBACK : LOCALE_MOVIEBROWSER_SCAN_FOR_MOVIES,
CCW_PERCENT 50,
CCW_PERCENT 10,
show_mode == MB_SHOW_YT ? &ytparser.OnProgress : &OnProgress,
show_mode == MB_SHOW_YT ? NULL : &OnSetGlobalMax);
loadBox.enableShadow();
loadBox.paint();

View File

@@ -848,51 +848,70 @@ int CTestMenu::exec(CMenuTarget* parent, const std::string &actionKey)
}
else if (actionKey == "progress_window"){
//classical
CProgressWindow pw0("Progress Single Test");
CProgressWindow pw0("Test 1: Local Bar Classic");
pw0.paint();
size_t max = 3;
for(size_t i = 0; i< max; i++){
size_t max = 4;
for(size_t i = 0; i<= max; i++){
pw0.showStatus(i, max, to_string(i));
sleep(1);
}
pw0.hide();
CProgressWindow pw1("Progress Local/Global Test");
CProgressWindow pw1("Test 2: Local/Global Bars Classic");
pw1.paint();
for(size_t i = 0; i< max; i++){
for(size_t i = 1; i<= max; i++){
pw1.showGlobalStatus(i, max, to_string(i));
for(size_t j = 0; j< max; j++){
for(size_t j = 1; j<= max; j++){
pw1.showLocalStatus(j, max, to_string(j));
sleep(1);
}
}
sleep(1);
pw1.hide();
//with signals
sigc::signal<void, size_t, size_t, std::string> OnProgress0, OnProgress1;
CProgressWindow pw2("Progress Single Test -> single Signal", CCW_PERCENT 50, CCW_PERCENT 30, &OnProgress0);
sigc::signal<void, size_t, size_t, std::string> OnProgress, OnProgress1;
CProgressWindow pw2("Test 3: Local Bar via Signal/Slot", CCW_PERCENT 50, CCW_PERCENT 30, &OnProgress);
pw2.paint();
for(size_t i = 0; i< max; i++){
OnProgress0(i, max, to_string(i));
for(size_t i = 0; i<= max; i++){
OnProgress(i, max, to_string(i));
sleep(1);
}
sleep(1);
pw2.hide();
OnProgress0.clear();
OnProgress.clear();
OnProgress1.clear();
CProgressWindow pw3("Progress Single Test -> dub Signal", CCW_PERCENT 50, CCW_PERCENT 20, NULL, &OnProgress0, &OnProgress1);
CProgressWindow pw3("Test 4: Local/Global via Signal/Slot", CCW_PERCENT 50, CCW_PERCENT 20, &OnProgress, &OnProgress1);
pw3.paint();
for(size_t i = 0; i< max; i++){
for(size_t i = 1; i <= max; i++){
OnProgress1(i, max, to_string(i));
for(size_t j = 0; j< max; j++){
OnProgress0(j, max, to_string(j));
for(size_t j = 1; j<= 7; j++){
OnProgress(j, 7, to_string(j));
sleep(1);
}
}
sleep(1);
pw3.hide();
OnProgress.clear();
//sigc::signal<void, size_t> OnSetGlobalMax;
CProgressWindowA pw4("Test 5, Local/Adaptive Global", CCW_PERCENT 50, CCW_PERCENT 20, &OnProgress, NULL/*&OnSetGlobalMax*/);
pw4.paint();
//OnSetGlobalMax(max);
pw4.setGlobalMax(max);
for(size_t i = 1; i <= max; i++){
for(size_t j = 1; j<= 8; j++){
pw4.showStatus(j, 8, to_string(j));
sleep(1);
}
}
sleep(1);
pw4.hide();
return menu_return::RETURN_REPAINT;
}
else if (actionKey == "hintbox_test")

View File

@@ -40,39 +40,37 @@ using namespace std;
CProgressWindow::CProgressWindow(CComponentsForm *parent,
const int &dx,
const int &dy,
signal<void, size_t, size_t, string> *statusSignal,
signal<void, size_t, size_t, string> *localSignal,
signal<void, size_t, size_t, string> *globalSignal)
: CComponentsWindow(0, 0, dx, dy, string(), NEUTRINO_ICON_INFO, parent, CC_SHADOW_ON)
{
Init(statusSignal, localSignal, globalSignal);
Init(NULL, localSignal, globalSignal, NULL);
}
CProgressWindow::CProgressWindow(const neutrino_locale_t title,
const int &dx,
const int &dy,
signal<void, size_t, size_t, string> *statusSignal,
signal<void, size_t, size_t, string> *localSignal,
signal<void, size_t, size_t, string> *globalSignal)
: CComponentsWindow(0, 0, dx, dy, g_Locale->getText(title), NEUTRINO_ICON_INFO, NULL, CC_SHADOW_ON)
{
Init(statusSignal, localSignal, globalSignal);
Init(NULL, localSignal, globalSignal, NULL);
}
CProgressWindow::CProgressWindow(const std::string &title,
const int &dx,
const int &dy,
signal<void, size_t, size_t, string> *statusSignal,
signal<void, size_t, size_t, string> *localSignal,
signal<void, size_t, size_t, string> *globalSignal)
: CComponentsWindow(0, 0, dx, dy, title, NEUTRINO_ICON_INFO, NULL, CC_SHADOW_ON)
{
Init(statusSignal, localSignal, globalSignal);
Init(NULL, localSignal, globalSignal, NULL);
}
void CProgressWindow::Init( signal<void, size_t, size_t, string> *statusSignal,
signal<void, size_t, size_t, string> *localSignal,
signal<void, size_t, size_t, string> *globalSignal)
signal<void, size_t, size_t, string> *globalSignal,
signal<void, size_t> *globalSet)
{
if (statusSignal)
*statusSignal->connect(mem_fun(*this, &CProgressWindow::showStatus));
@@ -83,6 +81,13 @@ void CProgressWindow::Init( signal<void, size_t, size_t, string> *statusSignal,
global_progress = local_progress = 0;
if (globalSet)
*globalSet->connect(mem_fun(*this, &CProgressWindow::setGlobalMax));
else
global_max = 0;
internal_max = 0;
showFooter(false);
//create status text object
@@ -133,7 +138,7 @@ CProgressBar* CProgressWindow::getProgressItem()
void CProgressWindow::initStatus(const unsigned int prog, const unsigned int max, const string &statusText, CProgressBar *pBar)
{
pBar->allowPaint(true);
pBar->setValues(prog, (int)max);
pBar->setValues(prog/* + (prog % 2)*/, (int)/*max + (*/max/* % 2)*/);
if (!statusText.empty() && (cur_statusText != statusText)){
showStatusMessageUTF(statusText);
cur_statusText = statusText;
@@ -145,6 +150,13 @@ void CProgressWindow::initStatus(const unsigned int prog, const unsigned int max
void CProgressWindow::showStatus(const unsigned int prog, const unsigned int max, const string &statusText)
{
showLocalStatus(prog, max, statusText);
if(global_max > 1){
global_progress ++;
internal_max = std::max((int)max, (int)internal_max);
internal_max -= (max != internal_max) ? internal_max/max : 0;
initStatus(global_progress, global_max*internal_max, statusText, global_bar);
}
}
void CProgressWindow::showGlobalStatus(const unsigned int prog, const unsigned int max, const string &statusText)

View File

@@ -41,177 +41,56 @@ class CProgressWindow : public CComponentsWindow, public CMenuTarget
unsigned int local_progress;
std::string cur_statusText;
int h_height;
void Init( sigc::signal<void, size_t, size_t, std::string> *statusSignal,
sigc::signal<void,size_t, size_t, std::string> *localSignal,
sigc::signal<void, size_t, size_t, std::string> *globalSignal);
CProgressBar* getProgressItem();
void initStatus(const unsigned int prog, const unsigned int max, const std::string &statusText, CProgressBar *pBar);
void fitItems();
protected:
size_t global_max, internal_max;
void Init( sigc::signal<void, size_t, size_t, std::string> *statusSignal,
sigc::signal<void, size_t, size_t, std::string> *localSignal,
sigc::signal<void, size_t, size_t, std::string> *globalSignal,
sigc::signal<void, size_t> *globalSet);
public:
/**CProgressWindow Constructor
* @param[in] parent
* @li optional: expects type CComponentsForm * as possible parent object, default = NULL
* @li optional: expects type CComponentsForm * as parent object, default = NULL
* @param[in] dx
* @li optional: expects type const &int, width of window, default = 0, auto size with declared default values
* @param[in] dy
* @li optional: expects type const &int, height of window, default = 0, auto size with declared default values
* @param[in] status_Signal
* @li optional: expects type sigc::signal<void, size_t, size_t, std::string>, defines an optional signal container for
* current changing values.
* @param[in] localSignal
* @li optional: expects type sigc::signal<void, size_t, size_t, std::string>, defines an optional signal container for
* @li optional: expects pointer of to sigc::signal<void, size_t, size_t, std::string>, defines an optional signal container for
* current changing local values.
* @param[in] globalSignal
* @li optional: expects type sigc::signal<void, size_t, size_t, std::string>, defines an optional signal container for
* @li optional: expects pointer of to sigc::signal<void, size_t, size_t, std::string>, defines an optional signal container for
* current changing global values.
*
* @example
* void CFooClass::DoCount{
* //Usage with classic init inside method:
*
* //Create a CProgressWindow object
* CProgressWindow progress;
*
* //set possible properties, eg. like here we dont't need a header
* status.showHeader(false);
*
* //paint window
* status.paint();
*
* //set possible properties, like current status text
* status.showStatusMessageUTF("test progress");
*
* //set current progress, call functions, methods or use a while, next loop or what ever
* status.showStatus(25)
*
* //finally remove window from screen
* status.hide();
* }
*
* //That's it. Until now these steps are a classical way inside neutrino, but you can use proress window with signals too.
* //Working with signals have the advantage that the implementation could be more compactly, because
* //complex constructions within the classes are usually unnecessary,
* //beacuse of the signals can be installed where they directly catching the required values. See next example:
*
* class CFooClass
* {
* //Usage with signals:
* //declare a signal eg. in header file
* private:
* //other members...
* sigc::signal<void, size_t, size_t, std::string> OnProgress;
* void DoCount();
* //other members...
* public:
* //other members...
* void DoAnything();
* //other members...
* };
*
* //add the OnProgress signal into a counter methode
* void CFooClass::DoCount{
* size_t max = 10
* for (size_t i = 0; i < max; i++){
* OnProgress(i, max, "Test");
* }
* }
*
* void CFooClass::DoAnything{
* //inside of methode which calls the progress define a CProgressWindow object and the counter method:
* //...any code
* CProgressWindow progress(NULL, 500, 150, &OnProgress);
* //paint window
* progress.paint(); // paint()
*
* //...
*
* DoCount();
*
* //...
*
* //finally remove window from screen
* progress.hide();
* }
*
* //Another and a recommended way to implement signals is to inherit prepared signals with
* //class CProgressSignals. This class contains prepared signals for implemantation and disconnetion of slots
* //is performed automatically.
* //See next example:
* class CFooClass : public CProgressSignals
* {
* private:
* //other members...
* void DoCount();
* //other members...
* public:
* //other members...
* void DoAnything();
* //other members...
* };
*
* //add the OnGlobalProgress and OnLocalProgress signals into a counter methode
* void CFooClass::DoCount();{
* size_t max = 10;
* for (size_t i = 0; i < max; i++){
* OnGlobalProgress(i, max, "Test"); //visualize global progress
* for (size_t j = 0; j < max; j++){
* OnLocalProgress(ij, max, "Test"); // visualize local progress
* }
* }
* }
*
* void CFooClass::DoAnything{
* //inside of methode which calls the progress define a CProgressWindow object and the counter method:
* //...any code
* CProgressWindow progress(NULL, 500, 150, NULL, &OnLocalProgress, &OnGlobalProgress);
* progress.paint(); // paint window
*
* //...
*
* void DoCount();
*
* //...
*
* //finally remove window from screen
* progress.hide();
* }
*
* @note
* Don't use status_Signal at same time with localSignal and globalSignal. \n
* In This case please set prameter 'status_Signal' = NULL
*/
CProgressWindow(CComponentsForm *parent = NULL,
const int &dx = PW_MIN_WIDTH,
const int &dy = PW_MIN_HEIGHT,
sigc::signal<void, size_t, size_t, std::string> *status_Signal = NULL,
sigc::signal<void,size_t, size_t, std::string> *localSignal = NULL,
sigc::signal<void, size_t, size_t, std::string> *globalSignal = NULL);
/**CProgressWindow Constructor
* @param[in] title
* @li expects type neutrino_locale_t as window title
*
* @see For other arguments and examples, see related constructor(s)
/**CProgressWindowA Constructor
* @see For common arguments and examples, see related constructor(s)\n
* For general parameters see basic class CProgressWindow!
*/
CProgressWindow(const neutrino_locale_t title,
const int &dx = PW_MIN_WIDTH,
const int &dy = PW_MIN_HEIGHT,
sigc::signal<void, size_t, size_t, std::string> *status_Signal = NULL,
sigc::signal<void,size_t, size_t, std::string> *localSignal = NULL,
sigc::signal<void, size_t, size_t, std::string> *globalSignal = NULL);
/**CProgressWindow Constructor
* @param[in] title
* @li expects type std::string as window title
*
* @see For other arguments and examples, see related constructor(s)
* @see For common arguments and examples, see related constructor(s)\n
* For general parameters see basic class CProgressWindow!
*/
CProgressWindow(const std::string &title,
const int &dx = PW_MIN_WIDTH,
const int &dy = PW_MIN_HEIGHT,
sigc::signal<void, size_t, size_t, std::string> *status_Signal = NULL,
sigc::signal<void,size_t, size_t, std::string> *localSignal = NULL,
sigc::signal<void, size_t, size_t, std::string> *globalSignal = NULL);
@@ -242,17 +121,6 @@ class CProgressWindow : public CComponentsWindow, public CMenuTarget
*/
virtual int exec( CMenuTarget* parent, const std::string & actionKey );
/**
* Sets current progress value and show progress in window.
* @param[in] prog
* @li expects type unsigned int, describes current progress value
* @param[in] max
* @li optional: expects type unsigned int, describes maximal progress value, default = 100
* @param[in] statusText
* @li optional: expects type std::string, describes current status text, default = empty
*/
void showStatus(const unsigned int prog, const unsigned int max = 100, const std::string &statusText = std::string());
/**
* Sets current local progressbar value and show progress in window.
* @note For other arguments take a look to related method showStatus()
@@ -273,6 +141,28 @@ class CProgressWindow : public CComponentsWindow, public CMenuTarget
*/
unsigned int getGlobalStatus(void);
/**
* Sets current progress value and shows a single progress bar inside window as default, but allows
* to show a global bar too. If you want to show a global bar, the global max value must be predefined with setGlobalMax() method.
* A defined global max value causes a gentle display of global progress. This assumes, the numbering fits to the scaned progress.
* @param[in] prog
* @li expects type unsigned int, describes current progress value
* @param[in] max
* @li optional: expects type unsigned int, describes maximal progress value, default = 100
* @param[in] statusText
* @li optional: expects type std::string, describes current status text, default = empty
*
* @see setGlobalMax(), CProgressSignals::OnSetGlobalMax()
*/
void showStatus(const unsigned int prog, const unsigned int max = 100, const std::string &statusText = std::string());
/**
* Sets current maximal value for global progress in window.
* @param[in] global_Max
* @li expects type size_t
*/
void setGlobalMax(const size_t& global_Max){global_max = global_Max;}
/**
* Sets current progress value and show progress in window.
* @param[in] text
@@ -288,6 +178,44 @@ class CProgressWindow : public CComponentsWindow, public CMenuTarget
void paint(const bool &do_save_bg = true);
};
class CProgressWindowA : public CProgressWindow
{
public:
/**CProgressWindowA Constructor
* @see For common arguments and examples, see related constructor(s)\n
* For general parameters see basic class CProgressWindow!
*
* @param[in] status_Signal
* @li optional: expects pointer of type sigc::signal<void, size_t, size_t, std::string>, defines an optional signal container for
* current changing values.
* @param[in] globalSet
* @li optional: expects pointer of type sigc::signal<void, size_t>, defines an optional signal container for global values.
*/
CProgressWindowA(const neutrino_locale_t title,
const int &dx = PW_MIN_WIDTH,
const int &dy = PW_MIN_HEIGHT,
sigc::signal<void, size_t, size_t, std::string> *status_Signal = NULL,
sigc::signal<void, size_t> *globalSet = NULL)
: CProgressWindow(title, dx, dy, NULL, NULL)
{
Init(status_Signal, NULL, NULL, globalSet);
};
/**CProgressWindowA Constructor
* @see For common arguments and examples, see related constructor(s)!
* For general parameters see basic class CProgressWindow!
*/
CProgressWindowA(const std::string &title,
const int &dx = PW_MIN_WIDTH,
const int &dy = PW_MIN_HEIGHT,
sigc::signal<void, size_t, size_t, std::string> *status_Signal = NULL,
sigc::signal<void, size_t> *globalSet = NULL)
: CProgressWindow(title, dx, dy, NULL, NULL)
{
Init(status_Signal, NULL, NULL, globalSet);
};
};
class CProgressSignals : public sigc::trackable
{
public:
@@ -307,6 +235,183 @@ class CProgressSignals : public sigc::trackable
* @see Take a look into examples to find in progressbar.h
*/
sigc::signal<void, size_t, size_t, std::string> OnProgress, OnLocalProgress, OnGlobalProgress;
sigc::signal<void, size_t> OnSetGlobalMax;
};
#endif
/**CProgressWindow usage with classic method:\n
* This is the general used method to implement progress bar windows.
* @example Progresswindow
*
* void CFooClass::DoCount
* {
* // Create a CProgressWindow object
* CProgressWindow progress;
*
* // set possible properties, eg. like here we dont't need a header
* status.showHeader(false);
*
* // paint window
* status.paint();
*
* // set possible properties, like current status text
* status.showStatusMessageUTF("test progress");
*
* // set current progress, call functions, methods or use a while, next loop or what ever
* status.showStatus(25)
*
* // finally remove window from screen
* status.hide();
* }
*
* // ...That's it. Until now these steps are a classical way inside neutrino, but you can use progress window with signals too.
* // Working with signals have the advantage that the implementation could be more compactly, because
* // complex constructions within the classes are usually unnecessary,
* // beacuse of the signals can be installed where they directly catching the required values. See next examples:
*
* @see
* * Progresswindow:Signals:1\n
* * Progresswindow:Signals:2\n
* * Progresswindow:Adaptive
*/
/**CProgressWindow usage with signals
* @example Progresswindow:Signals:1
*
* class CFooClass
* {
* //declare a signal eg. in header file
* private:
* // other members...
* sigc::signal<void, size_t, size_t, std::string> OnProgress;
* void DoCount();
* // other members...
* public:
* // other members...
* void DoAnything();
* // other members...
* };
*
* // add the 'OnProgress' signal into a counter methode
* void CFooClass::DoCount{
* size_t max = 10
* for (size_t i = 0; i < max; i++){
* OnProgress(i, max, "Test");
* }
* }
*
* void CFooClass::DoAnything{
* // inside of methode which calls the progress define a CProgressWindow object and the counter method:
* // ...any code
* CProgressWindow progress(NULL, 500, 150, &OnProgress);
* // paint window
* progress.paint(); // paint()
*
* // ...
*
* DoCount();
*
* // ...
*
* // finally remove window from screen
* progress.hide();
* }
*/
/**CProgressWindow usage with inherited signals
* @example Progresswindow:Signals:2
*
* // Another and a recommended way to implement signals is to inherit prepared signals with
* // 'class CProgressSignals'. This class contains prepared signals for implemantation and disconnetion of slots
* // is performed automatically.
* // See next example:
* class CFooClass : public CProgressSignals
* {
* private:
* // other members...
* void DoCount();
* // other members...
* public:
* // other members...
* void DoAnything();
* // other members...
* };
*
* // add the 'OnGlobalProgress' and 'OnLocalProgress' signals into a counter methode
* void CFooClass::DoCount();{
* size_t max = 10;
* for (size_t i = 0; i < max; i++){
* OnGlobalProgress(i, max, "Test"); //visualize global progress
* for (size_t j = 0; j < max; j++){
* OnLocalProgress(ij, max, "Test"); // visualize local progress
* }
* }
* }
*
* void CFooClass::DoAnything{
* // inside of methode which calls the progress define a CProgressWindow object and the counter method:
* // ...any code
* CProgressWindow progress(NULL, 500, 150, NULL, &OnLocalProgress, &OnGlobalProgress);
* // paint window
* progress.paint();
*
* // ...
*
* void DoCount();
*
* // ...
*
* // finally remove window from screen
* progress.hide();
* }
*/
/**CProgressWindow usage with adaptive global progress
* @example Progresswindow:Adaptive
*
* // Use this for local progress views with adaptive global status.
* // This allows an adjusted global progress with more 'smoother' progress view. Here the global progress
* // is calculated inside the progressbar object itself. This requires a call for the local progress and
* // an assignment of global maximum value.
* // Note: Global progressbar is only visible if global value > 1!
*
* class CFooClass
* {
* private:
* // other members...
* // If You want to use signals, declare signals or inherit 'class CProgressSignals' (e.g: 'class CFooClass : public CProgressSignals')
* sigc::signal<void, size_t, size_t, std::string> OnProgress;
* sigc::signal<void, size_t> OnSetGlobalMax;
* // other members...
* public:
* // other members...
* void DoCount();
* // other members...
* };
*
* void CFooClass::DoCount()
* {
* size_t max = 10
* CProgressWindowA pw("Test", CCW_PERCENT 50, CCW_PERCENT 20, NULL, NULL);
* pw.paint();
*
* // Set the maximal global value:
* // Here global value is set directly with 'setGlobalMax()' inside 'DoCount()', but for scanning for global
* // values it's also possible to use the 'OnSetGlobalMax()' signal
* // outside of counter methode in any other method.
* // An example for usage of OnSetGlobalMax() is to find in 'gui/moviebrowser/mp.cpp'
* // To see the visual difference to general progress take a look into test menu and try out Test 4 and 5.
* // Note: Without assigned global max value, no global bar is visible, means: Only local progress is showed!
* pw.setGlobalMax(max);
*
* for(size_t i = 1; i <= max; i++){
* for(size_t j = 1; j<= 8; j++){
* pw.showStatus(j, 8, to_string(j));
* sleep(1);
* }
* }
* sleep(1);
* pw.hide();
* }
*/