MainFrame() : Dialog(L"ProgressBars") , m_progressBar1(this) , m_progressBar2(this, ProgressBar::Styles::Default + ProgressBar::Styles::Smooth) , m_progressBar3(this, ProgressBar::Styles::Default + ProgressBar::Styles::Marquee) , m_start(L"Start", this) , m_close(L"Close", this) { // a box layout manager with vertical orientation and no-homogeneous setLayout(new BoxLayout(Orientation::Vertical, false)); // set the ranges of the progress bars m_progressBar1.setRange(0, 100); m_progressBar2.setRange(0, 100); m_progressBar3.setMarquee(0); // the "Start" button is the default one m_start.setDefault(true); // call "onStart" when the "Start" button is pressed m_start.Click.connect(Bind(&MainFrame::onStart, this)); // the Dialog::onCancel generates an onClose event m_close.Click.connect(Bind(&MainFrame::onCancel, this)); // the application is waiting to work (the user should press the // "Start" button) m_state = WaitingToWork; // set the size of the Frame setSize(Size(256, getPreferredSize().h)); center(); }
// when the "Start/Pause/Continue/Restart" button is pressed... void onStart() { switch (m_state) { // The user pressed Start/Continue... case WaitingToWork: case Paused: { m_state = Working; m_start.setText(L"Pause"); // convert the button to "Pause"... m_progressBar3.setMarquee(100); // this is "The Loop", where the real work is done do { // when we pump the message queue, we can get events like onClose() CurrentThread::pumpMessageQueue(); // work done if (m_progressBar1.getValue() == m_progressBar1.getMaximum()) { m_state = WorkDone; m_start.setText(L"Restart"); // convert the button to "Restart" } else { m_progressBar1.addValue(1); m_progressBar2.addValue(1); // in our case, the "real work" is sleep :) ...but for // your application this could be "loading a file"... Sleep(100); } // still working? } while (m_state == Working); // aborting work? hide the frame... if (m_state == Aborting) setVisible(false); m_progressBar3.setMarquee(0); break; } // The user pressed Pause... case Working: m_state = Paused; m_start.setText(L"Continue"); // convert the button to "Continue" break; // The user pressed Restart... case WorkDone: // restart progress bars m_progressBar1.setValue(m_progressBar1.getMinimum()); m_progressBar2.setValue(m_progressBar2.getMinimum()); m_progressBar3.setMarquee(0); m_start.setText(L"Start"); // convert the button to "Start" m_state = WaitingToWork; break; case Aborting: assert(false); // impossible break; } }