00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <iostream>
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "percentdonelistener.h"
00033
00034 namespace FIFE
00035 {
00036 const uint32_t minPercent = 0;
00037 const uint32_t maxPercent = 100;
00038
00039 PercentDoneListener::~PercentDoneListener() {
00040
00041 }
00042
00043 PercentDoneCallback::PercentDoneCallback()
00044 : m_totalElements(0), m_percent(1), m_numberOfEvents(0), m_count(0) {
00045
00046 }
00047
00048 PercentDoneCallback::~PercentDoneCallback() {
00049
00050 }
00051
00052 void PercentDoneCallback::setTotalNumberOfElements(unsigned int totalElements)
00053 {
00054 m_totalElements = totalElements;
00055 }
00056
00057 void PercentDoneCallback::setPercentDoneInterval(unsigned int percent)
00058 {
00059 m_percent = percent;
00060 }
00061
00062 void PercentDoneCallback::incrementCount() {
00063
00064 if (m_count == minPercent) {
00065
00066 fireEvent(minPercent);
00067 }
00068
00069
00070 ++m_count;
00071
00072
00073
00074 if (!m_listeners.empty() && m_totalElements > 0) {
00075 if (m_count >= m_totalElements) {
00076 fireEvent(maxPercent);
00077 }
00078 else {
00079
00080 uint32_t percentDone = static_cast<uint32_t>((static_cast<float>(m_count)/m_totalElements) * maxPercent);
00081
00082 if ((percentDone % m_percent) == 0 && (percentDone != m_percent * m_numberOfEvents)) {
00083
00084 ++m_numberOfEvents;
00085
00086
00087 fireEvent(m_percent * m_numberOfEvents);
00088 }
00089 }
00090 }
00091 }
00092
00093 void PercentDoneCallback::reset() {
00094 m_totalElements = 0;
00095 m_count = 0;
00096 m_numberOfEvents = 0;
00097
00098
00099 fireEvent(minPercent);
00100 }
00101
00102 void PercentDoneCallback::addListener(PercentDoneListener* listener) {
00103 if (listener) {
00104 m_listeners.push_back(listener);
00105 }
00106 }
00107
00108 void PercentDoneCallback::removeListener(PercentDoneListener* listener) {
00109 ListenerContainer::iterator iter = m_listeners.begin();
00110 for ( ; iter != m_listeners.end(); ++iter) {
00111 if (*iter == listener) {
00112 m_listeners.erase(iter);
00113 break;
00114 }
00115 }
00116 }
00117
00118 void PercentDoneCallback::fireEvent(uint32_t percent) {
00119 ListenerContainer::iterator iter = m_listeners.begin();
00120 for ( ; iter != m_listeners.end(); ++iter) {
00121 (*iter)->OnEvent(percent);
00122 }
00123 }
00124 }