how to judge which child send the eventScrollChangePosition

ogre2013

03-06-2013 09:05:31

I know there are five children in the scrollbar.

Button* mWidgetStart;
Button* mWidgetEnd;
Button* mWidgetTrack;
// куски между кнопками
Widget* mWidgetFirstPart;
Widget* mWidgetSecondPart;



I have make the scrollbar's event(eventScrollChangePosition) true.But I don't know which child send the event.
the following is my event hand function:

void BBBPopMenu::scrollChangePosition( MyGUI::ScrollBar* _sender, size_t _position )
{

MYGUI_LOG(Info, " _position = " << _position<<"name : "<< _sender->getName());

}


Now, how to judget that which children sent the event really when I go to "scrollChangePosition" function.

Altren

03-06-2013 18:06:11

Child do not send event, it is scrollBar itself, who send event and it is stored in _sender, while _position is new scroll bar position, that can be changes using those buttons or by mouse drag.

ogre2013

04-06-2013 05:44:20

But in the source code of ScrollBar, the event is sent by the children.
in fact, the event is sent by the chlidren.

the part of the source in MyGUI_ScrollBar.cpp
========================================================================================================

void ScrollBar::initialiseOverride()
{
Base::initialiseOverride();

// при нуле, будет игнорировать кнопки
mScrollPage = 1;
mScrollViewPage = 1;
mMinTrackSize = 0;
mSkinRangeStart = 0;
mSkinRangeEnd = 0;

assignWidget(mWidgetStart, "Start");
if (mWidgetStart != nullptr)
{
mWidgetStart->eventMouseButtonPressed += newDelegate(this, &ScrollBar::notifyMousePressed);
mWidgetStart->eventMouseWheel += newDelegate(this, &ScrollBar::notifyMouseWheel);
}

assignWidget(mWidgetEnd, "End");
if (mWidgetEnd != nullptr)
{
mWidgetEnd->eventMouseButtonPressed += newDelegate(this, &ScrollBar::notifyMousePressed);
mWidgetEnd->eventMouseWheel += newDelegate(this, &ScrollBar::notifyMouseWheel);
}

assignWidget(mWidgetTrack, "Track");
if (mWidgetTrack)
{
mWidgetTrack->eventMouseDrag += newDelegate(this, &ScrollBar::notifyMouseDrag);
mWidgetTrack->eventMouseButtonPressed += newDelegate(this, &ScrollBar::notifyMousePressed);
mWidgetTrack->eventMouseButtonReleased += newDelegate(this, &ScrollBar::notifyMouseReleased);
mWidgetTrack->eventMouseWheel += newDelegate(this, &ScrollBar::notifyMouseWheel);
mWidgetTrack->setVisible(false);
}

assignWidget(mWidgetFirstPart, "FirstPart");
if (mWidgetFirstPart != nullptr)
{
mWidgetFirstPart->eventMouseButtonPressed += newDelegate(this, &ScrollBar::notifyMousePressed);
mWidgetFirstPart->eventMouseWheel += newDelegate(this, &ScrollBar::notifyMouseWheel);
}

assignWidget(mWidgetSecondPart, "SecondPart");
if (mWidgetSecondPart != nullptr)
{
mWidgetSecondPart->eventMouseButtonPressed += newDelegate(this, &ScrollBar::notifyMousePressed);
mWidgetSecondPart->eventMouseWheel += newDelegate(this, &ScrollBar::notifyMouseWheel);
}

if (isUserString("MinTrackSize"))
mMinTrackSize = utility::parseValue<int>(getUserString("MinTrackSize"));
if (isUserString("TrackRangeMargins"))
utility::parseComplex<size_t>(getUserString("TrackRangeMargins"), mSkinRangeStart, mSkinRangeEnd);

if (mWidgetTrack != nullptr)
{
if (mWidgetTrack->isUserString("MinTrackSize"))
mMinTrackSize = utility::parseValue<int>(mWidgetTrack->getUserString("MinTrackSize"));
}
}

//////////////////////////////////////////////////
////////////////////////////////////////////////////

void ScrollBar::notifyMousePressed(Widget* _sender, int _left, int _top, MouseButton _id)
{
// диспечерезируем нажатие своих детей как свое
eventMouseButtonPressed(this, _left, _top, _id);

if (MouseButton::Left != _id)
return;

if (mMoveToClick &&
_sender != mWidgetTrack &&
_sender != mWidgetStart &&
_sender != mWidgetEnd)
{
if (mWidgetTrack != nullptr)
{
mPreActionOffset = InputManager::getInstance().getLastPressedPosition(MouseButton::Left);
const IntPoint& point = InputManager::getInstance().getMousePositionByLayer() - mWidgetTrack->getParent()->getAbsolutePosition();

mPreActionOffset.left -= getTrackSize() / 2;
mPreActionOffset.top -= getTrackSize() / 2;

TrackMove(point.left, point.top);
}
}
else if (_sender == mWidgetStart)
{
// минимальное значение
if (mScrollPosition == 0)
return;

// расчитываем следующее положение
if (mScrollPosition > mScrollPage)
mScrollPosition -= mScrollPage;
else
mScrollPosition = 0;

// оповещаем
eventScrollChangePosition(this, (int)mScrollPosition);
updateTrack();
}
else if (_sender == mWidgetEnd)
{
// максимальное значение
if ((mScrollRange < 2) || (mScrollPosition >= (mScrollRange - 1)))
return;

// расчитываем следующее положение
if ((mScrollPosition + mScrollPage) < (mScrollRange - 1))
mScrollPosition += mScrollPage;
else
mScrollPosition = mScrollRange - 1;

// оповещаем
eventScrollChangePosition(this, (int)mScrollPosition);
updateTrack();
}
else if (_sender == mWidgetFirstPart)
{
// минимальное значение
if (mScrollPosition == 0)
return;

// расчитываем следующее положение
if (mScrollPosition > mScrollViewPage)
mScrollPosition -= mScrollViewPage;
else
mScrollPosition = 0;

// оповещаем
eventScrollChangePosition(this, (int)mScrollPosition);
updateTrack();
}
else if (_sender == mWidgetSecondPart)
{
// максимальное значение
if ((mScrollRange < 2) || (mScrollPosition >= (mScrollRange - 1)))
return;

// расчитываем следующее положение
if ((mScrollPosition + mScrollViewPage) < (mScrollRange - 1))
mScrollPosition += mScrollViewPage;
else
mScrollPosition = mScrollRange - 1;

// оповещаем
eventScrollChangePosition(this, (int)mScrollPosition);
updateTrack();
}
else if (_sender == mWidgetTrack)
{
mPreActionOffset.left = _sender->getLeft();
mPreActionOffset.top = _sender->getTop();
}
}