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