Added this quick-and-dirty sublclass of Slider to see what’s going on:
[code]class MySlider : public Slider
{
public:
void mouseEnter (const MouseEvent& e)
{
printf(“mouseEnter[%d]: { %d, %d } time(%u)\n”,
e.source.getIndex(),
e.x, e.y,
(uint32)e.eventTime.toMilliseconds());
Slider::mouseEnter(e);
}
void mouseExit (const MouseEvent& e)
{
printf("mouseExit[%d]: { %d, %d } time(%u)\n",
e.source.getIndex(),
e.x, e.y,
(uint32)e.eventTime.toMilliseconds());
Slider::mouseExit(e);
}
void mouseDown (const MouseEvent& e)
{
printf("mouseDown[%d]: { %d, %d } down{ %d, %d } time(%u)\n",
e.source.getIndex(),
e.x, e.y,
e.getMouseDownPosition().getX(), e.getMouseDownPosition().getY(),
(uint32)e.eventTime.toMilliseconds());
Slider::mouseDown(e);
}
void mouseDrag (const MouseEvent& e)
{
printf("mouseDrag[%d]: { %d, %d } down{ %d, %d } time(%u)\n",
e.source.getIndex(),
e.x, e.y,
e.getMouseDownPosition().getX(), e.getMouseDownPosition().getY(),
(uint32)e.eventTime.toMilliseconds());
Slider::mouseDrag(e);
}
void mouseUp (const MouseEvent& e)
{
printf("mouseUp[%d]: { %d, %d } down{ %d, %d } time(%u)\n",
e.source.getIndex(),
e.x, e.y,
e.getMouseDownPosition().getX(), e.getMouseDownPosition().getY(),
(uint32)e.eventTime.toMilliseconds());
Slider::mouseUp(e);
}
};[/code]
Then replaced Slider with MySlider in the code in the previous post.
Some tests…
finger 1 down on slider 1, finger 2 down on slider 2 (ensuring finger 1 is still over the thumb for slider 1), release both “simultaneously”:
mouseEnter[0]: { 25, 9 } time(2615904011)
mouseDown[0]: { 25, 9 } down{ 25, 9 } time(2615904011)
mouseDrag[0]: { 25, 9 } down{ 25, 9 } time(2615904011)
mouseDrag[0]: { 25, 6 } down{ 25, 9 } time(2615904459)
mouseDrag[0]: { 25, 5 } down{ 25, 9 } time(2615904555)
mouseDrag[0]: { 25, 4 } down{ 25, 9 } time(2615904699)
mouseDrag[0]: { 25, 3 } down{ 25, 9 } time(2615905259)
mouseDrag[0]: { 25, 2 } down{ 25, 9 } time(2615905548)
mouseDrag[0]: { 25, 1 } down{ 25, 9 } time(2615906572)
mouseDrag[0]: { 25, 5 } down{ 25, 9 } time(2615907580)
mouseDrag[0]: { 25, 3 } down{ 25, 9 } time(2615907596)
mouseDrag[0]: { 25, 2 } down{ 25, 9 } time(2615907612)
mouseUp[0]: { 25, 2 } down{ 25, 9 } time(2615907612)
mouseDown[0]: { 25, 2 } down{ 25, 2 } time(2615907612)
mouseDrag[0]: { 25, 2 } down{ 25, 2 } time(2615907612)
mouseDown[1]: { 16, 24 } down{ 16, 24 } time(2615907612)
mouseDrag[1]: { 16, 24 } down{ 16, 24 } time(2615907612)
mouseDrag[0]: { 25, 1 } down{ 25, 2 } time(2615907644)
mouseDrag[1]: { 15, 25 } down{ 16, 24 } time(2615907644)
mouseDrag[0]: { 25, 0 } down{ 25, 2 } time(2615907660)
mouseDrag[1]: { 14, 25 } down{ 16, 24 } time(2615907676)
mouseDrag[1]: { 15, 26 } down{ 16, 24 } time(2615909179)
mouseDrag[0]: { 26, 0 } down{ 25, 2 } time(2615909403)
mouseDrag[1]: { 16, 26 } down{ 16, 24 } time(2615909435)
mouseDrag[1]: { 17, 26 } down{ 16, 24 } time(2615910059)
mouseDrag[0]: { 27, 0 } down{ 25, 2 } time(2615911082)
mouseDrag[1]: { 18, 26 } down{ 16, 24 } time(2615911098)
mouseDrag[0]: { 27, 10 } down{ 25, 2 } time(2615911146)
mouseDrag[0]: { 18, 86 } down{ 25, 2 } time(2615911146)
mouseUp[0]: { 18, 86 } down{ 25, 2 } time(2615911146)
mouseExit[0]: { 18, 86 } time(2615911146)
mouseEnter[0]: { 18, 26 } time(2615911146)
mouseExit[0]: { 25, -48 } time(2615911161)
mouseEnter[0]: { 25, 12 } time(2615911161)
Notice there’s a false lifting and replacing of the first finger as the second on goes down. And there are are some extraneous mouseExits and mouseEnters at the end for source index 0 but none for index 1 (i.e., the second finger). The -48 coordinate seems fishy as it’s offscreen (I think).
finger 1 down on slider 1, finger 2 down on slider 2 (ensuring finger 1 is still over the thumb for slider 1), release finger 2 (still holding finger 1) :
mouseEnter[0]: { 119, 21 } time(2616579970)
mouseDown[0]: { 119, 21 } down{ 119, 21 } time(2616579970)
mouseDrag[0]: { 119, 21 } down{ 119, 21 } time(2616579970)
mouseDrag[0]: { 117, 24 } down{ 119, 21 } time(2616580738)
mouseDown[1]: { 338, 19 } down{ 338, 19 } time(2616581170)
mouseDrag[1]: { 338, 19 } down{ 338, 19 } time(2616581170)
mouseUp[0]: { 117, 24 } down{ 119, 21 } time(2616581170)
mouseDown[0]: { 117, 24 } down{ 117, 24 } time(2616581170)
mouseDrag[0]: { 117, 24 } down{ 117, 24 } time(2616581170)
mouseDrag[1]: { 335, 20 } down{ 338, 19 } time(2616581282)
mouseDrag[0]: { 116, 24 } down{ 117, 24 } time(2616581282)
mouseDrag[1]: { 334, 20 } down{ 338, 19 } time(2616581570)
mouseDrag[0]: { 115, 25 } down{ 117, 24 } time(2616581570)
mouseUp[0]: { 115, 25 } down{ 117, 24 } time(2616581826)
finger 1 down on slider 1, drag finger 1 away from slider 1’s thumb, finger 2 down on slider 2:
mouseEnter[0]: { 104, 26 } time(2616654379)
mouseDown[0]: { 104, 26 } down{ 104, 26 } time(2616654379)
mouseDrag[0]: { 104, 26 } down{ 104, 26 } time(2616654379)
mouseDrag[0]: { 103, 26 } down{ 104, 26 } time(2616654987)
mouseDrag[0]: { 103, 27 } down{ 104, 26 } time(2616655003)
mouseDrag[0]: { 103, 28 } down{ 104, 26 } time(2616655019)
mouseDrag[0]: { 103, 30 } down{ 104, 26 } time(2616655035)
mouseDrag[0]: { 103, 31 } down{ 104, 26 } time(2616655051)
mouseDrag[0]: { 103, 33 } down{ 104, 26 } time(2616655067)
mouseDrag[0]: { 103, 36 } down{ 104, 26 } time(2616655083)
mouseDrag[0]: { 103, 39 } down{ 104, 26 } time(2616655099)
mouseDrag[0]: { 103, 42 } down{ 104, 26 } time(2616655115)
mouseDrag[0]: { 103, 45 } down{ 104, 26 } time(2616655131)
mouseDrag[0]: { 103, 48 } down{ 104, 26 } time(2616655147)
mouseDrag[0]: { 103, 50 } down{ 104, 26 } time(2616655163)
mouseDrag[0]: { 103, 51 } down{ 104, 26 } time(2616655179)
mouseDrag[0]: { 103, 52 } down{ 104, 26 } time(2616655195)
mouseDrag[0]: { 103, 53 } down{ 104, 26 } time(2616655211)
mouseDrag[0]: { 103, 54 } down{ 104, 26 } time(2616655227)
mouseDrag[0]: { 103, 55 } down{ 104, 26 } time(2616655243)
mouseDrag[0]: { 103, 57 } down{ 104, 26 } time(2616655260)
mouseDrag[0]: { 103, 58 } down{ 104, 26 } time(2616655275)
mouseDrag[0]: { 103, 59 } down{ 104, 26 } time(2616655291)
mouseDrag[0]: { 103, 61 } down{ 104, 26 } time(2616655307)
mouseDrag[0]: { 103, 62 } down{ 104, 26 } time(2616655323)
mouseDrag[0]: { 103, 63 } down{ 104, 26 } time(2616655355)
mouseDrag[0]: { 103, 64 } down{ 104, 26 } time(2616655515)
mouseUp[0]: { 103, 64 } down{ 104, 26 } time(2616655740)
mouseExit[0]: { 103, 64 } time(2616655740)
mouseDrag[1]: { 369, 18 } down{ 354, 20 } time(2616655740)
mouseUp[1]: { 369, 18 } down{ 354, 20 } time(2616655740)
mouseDown[1]: { 369, 18 } down{ 369, 18 } time(2616655740)
mouseDrag[1]: { 369, 18 } down{ 369, 18 } time(2616655740)
mouseDrag[1]: { 366, 18 } down{ 369, 18 } time(2616657853)
The false mouseUp/mouseDown in the first test explains why the fingers need to stay over the thumbs on subsequent touches.