47 mStartPoint(
Align::Left),
54 Base::_initialise(_style, _coord, _align, _info, _parent, _croppedParent, _creator, _name);
56 initialiseWidgetSkin(_info);
68 initialiseWidgetSkin(_info);
75 if (*(*iter)->_getInternalData<std::string>() ==
"Client")
81 if (
nullptr == mClient) mClient =
this;
84 MapString::const_iterator iterS = properties.find(
"TrackSkin");
85 if (iterS != properties.end()) mTrackSkin = iterS->second;
86 iterS = properties.find(
"TrackWidth");
88 iterS = properties.find(
"TrackMin");
90 if (1 > mTrackWidth) mTrackWidth = 1;
91 iterS = properties.find(
"TrackStep");
93 else mTrackStep = mTrackWidth;
94 iterS = properties.find(
"TrackFill");
96 iterS = properties.find(
"StartPoint");
101 void Progress::shutdownWidgetSkin()
108 if (mAutoTrack)
return;
110 if (mEndPosition > mRange) mEndPosition = mRange;
111 if (mStartPosition > mRange) mStartPosition = mRange;
117 if (mAutoTrack)
return;
119 if (mEndPosition > mRange) mEndPosition = mRange;
125 if (mAutoTrack == _auto)
return;
132 mEndPosition = mStartPosition = 0;
133 mAutoPosition = 0.0f;
138 mRange = mEndPosition = mStartPosition = 0;
143 void Progress::frameEntered(
float _time)
145 if (!mAutoTrack)
return;
147 size_t pos = (size_t)mAutoPosition;
151 if (pos > mRange) mEndPosition = mRange;
152 else mEndPosition = size_t(mAutoPosition);
179 void Progress::updateTrack()
182 if ((0 == mRange) || (0 == mEndPosition))
184 for (VectorWidgetPtr::iterator iter=mVectorTrack.begin(); iter!=mVectorTrack.end(); ++iter)
186 (*iter)->setVisible(
false);
194 if (mVectorTrack.empty())
197 mVectorTrack.push_back(widget);
202 VectorWidgetPtr::iterator iter=mVectorTrack.begin();
203 (*iter)->setVisible(
true);
208 for (; iter!=mVectorTrack.end(); ++iter)
210 (*iter)->setVisible(
false);
214 Widget* wid = mVectorTrack.front();
217 if ((0 == mStartPosition) && (mRange == mEndPosition))
219 setTrackPosition(wid, 0, 0, getClientWidth(), getClientHeight());
224 int pos = (int)mStartPosition * (getClientWidth() - mTrackMin) / (
int)mRange;
225 setTrackPosition(wid, pos, 0, ((
int)mEndPosition * (getClientWidth() - mTrackMin) / (
int)mRange) - pos + mTrackMin, getClientHeight());
232 int width = getClientWidth() - mTrackWidth + mTrackStep;
233 int count = width / mTrackStep;
234 int ost = (width % mTrackStep);
237 width += mTrackStep - ost;
241 while ((
int)mVectorTrack.size() < count)
244 widget->setVisible(
false);
245 mVectorTrack.push_back(widget);
249 if ((0 == mStartPosition) && (mRange == mEndPosition))
252 for (VectorWidgetPtr::iterator iter=mVectorTrack.begin(); iter!=mVectorTrack.end(); ++iter)
255 (*iter)->setVisible(
true);
256 setTrackPosition(*iter, pos * mTrackStep, 0, mTrackWidth, getClientHeight());
264 int hide_pix = (width * (int)mStartPosition / (
int)mRange);
265 int hide_count = hide_pix / mTrackStep;
267 int show_pix = (width * (
int)mEndPosition / (
int)mRange);
268 int show_count = show_pix / mTrackStep;
271 for (
VectorWidgetPtr::iterator iter=mVectorTrack.begin(); iter!=mVectorTrack.end(); ++iter)
275 (*iter)->setVisible(
false);
277 else if (0 == show_count)
279 (*iter)->setAlpha((
float)(show_pix % mTrackStep) / (
float)mTrackStep);
280 (*iter)->setVisible(
true);
281 setTrackPosition(*iter, pos * mTrackStep, 0, mTrackWidth, getClientHeight());
287 (*iter)->setVisible(
false);
289 else if (0 == hide_count)
291 (*iter)->setAlpha(1.0f - ((
float)(hide_pix % mTrackStep) / (
float)mTrackStep));
292 (*iter)->setVisible(
true);
293 setTrackPosition(*iter, pos * mTrackStep, 0, mTrackWidth, getClientHeight());
298 (*iter)->setVisible(
true);
299 setTrackPosition(*iter, pos * mTrackStep, 0, mTrackWidth, getClientHeight());
309 void Progress::setTrackPosition(Widget* _widget,
int _left,
int _top,
int _width,
int _height)
311 if (mStartPoint.
isLeft()) _widget->setCoord(_left, _top, _width, _height);
312 else if (mStartPoint.
isRight()) _widget->setCoord(mClient->
getWidth() - _left - _width, _top, _width, _height);
313 else if (mStartPoint.
isTop()) _widget->setCoord(_top, _left, _height, _width);
314 else if (mStartPoint.
isBottom()) _widget->setCoord(_top, mClient->
getHeight() - _left - _width, _height, _width);
321 mStartPoint = _align;
326 MYGUI_LOG(Warning,
"Progress bar support only Left, Right, Top or Bottom align values");
333 if (_key ==
"Progress_Range")
setProgressRange(utility::parseValue<size_t>(_value));
334 else if (_key ==
"Progress_Position")
setProgressPosition(utility::parseValue<size_t>(_value));