1 /* vi: set sw=4 ts=4:
2  *
3  * Copyright (C) 2018 - 2020 Christian Hohnstaedt.
4  *
5  * All rights reserved.
6  */
7 
8 #ifndef __XCAPROGRESS_H
9 #define __XCAPROGRESS_H
10 
11 #include "lib/base.h"
12 #include "lib/main.h"
13 #include "widgets/MainWindow.h"
14 
15 #include <QProgressBar>
16 #include <QStatusBar>
17 
18 class XcaProgressBase
19 {
20     public:
21 	virtual void increment() = 0;
22 	virtual ~XcaProgressBase() = default;
23 };
24 
25 class XcaProgressGui : public XcaProgressBase
26 {
27     private:
28 	QProgressBar *bar;
29 	QStatusBar *status;
30 
31     public:
XcaProgressGui()32 	XcaProgressGui() : XcaProgressBase()
33 	{
34 		status = mainwin->statusBar();
35 		bar = new QProgressBar();
36 		bar->setMinimum(0);
37 		bar->setMaximum(100);
38 		bar->setValue(50);
39 
40 		mainwin->repaint();
41 		status->addPermanentWidget(bar, 1);
42 	}
~XcaProgressGui()43 	~XcaProgressGui()
44 	{
45 		status->removeWidget(bar);
46 		delete bar;
47 	}
increment()48 	void increment()
49 	{
50 		int value = bar->value();
51 		if (value == bar->maximum()) {
52 			bar->reset();
53 		} else {
54 			bar->setValue(value +1);
55 		}
56 	}
57 };
58 
59 class XcaProgressCmd : public XcaProgressBase
60 {
61     private:
62 	int i;
63 
64     public:
XcaProgressCmd()65 	XcaProgressCmd() : XcaProgressBase(), i(0)
66 	{
67 	}
~XcaProgressCmd()68 	~XcaProgressCmd()
69 	{
70 		puts(" finished.");
71 	}
increment()72 	void increment()
73 	{
74 		static const char *spinner = "|/-\\";
75 		printf("\rGenerating %c ...", spinner[i++%4]);
76 		fflush(stdout);
77 	}
78 };
79 
80 class XcaProgress
81 {
82     private:
83 	XcaProgressBase *progress;
84 
85     public:
XcaProgress()86 	XcaProgress()
87 	{
88 		if (IS_GUI_APP)
89 			progress = new XcaProgressGui();
90 		else
91 			progress = new XcaProgressCmd();
92 	}
~XcaProgress()93 	~XcaProgress()
94 	{
95 		delete progress;
96 	}
increment()97 	void increment()
98 	{
99 		progress->increment();
100 	}
inc(int,int,void * p)101 	static void inc(int, int, void *p)
102 	{
103 		XcaProgress *prog = static_cast<XcaProgress*>(p);
104 		if (prog)
105 			prog->increment();
106 	}
107 };
108 #endif
109