@@ -158,6 +158,7 @@ namespace lsp
158
158
btn->nWidth = 0 ;
159
159
btn->nHeight = 0 ;
160
160
}
161
+ pCurrButton = NULL ;
161
162
162
163
sHole .nLeft = -1 ;
163
164
sHole .nTop = -1 ;
@@ -266,6 +267,8 @@ namespace lsp
266
267
lsp::swap (bmin, bmax);
267
268
}
268
269
270
+ lsp_trace (" min = %f, max = %f" , min, max);
271
+
269
272
switch (angle & 3 )
270
273
{
271
274
case 0 : // horizontal left -> right
@@ -282,7 +285,7 @@ namespace lsp
282
285
bmin->nLeft = sSize .nLeft ;
283
286
bmax->nLeft = sSize .nLeft ;
284
287
bmax->nTop = sSize .nTop + (1 .0f - max) * fButtonRange ;
285
- bmin->nTop = sSize .nTop + bmax->nHeight + (1 .0f - max ) * fButtonRange ;
288
+ bmin->nTop = sSize .nTop + bmax->nHeight + (1 .0f - min ) * fButtonRange ;
286
289
break ;
287
290
}
288
291
@@ -468,14 +471,14 @@ namespace lsp
468
471
max = sLimits .limit (max);
469
472
}
470
473
471
- lsp_trace (" out: min=%f, max=%f" , min, max);
472
-
473
474
flags = 0 ;
474
475
if (old_min != min)
475
476
flags |= CHANGE_MIN;
476
477
if (old_max != max)
477
478
flags |= CHANGE_MAX;
478
479
480
+ lsp_trace (" out: min=%f, max=%f, flags=0x%x" , min, max, flags);
481
+
479
482
sValues .set (min, max);
480
483
if (flags != 0 )
481
484
sSlots .execute (SLOT_CHANGE, this , &flags);
@@ -545,16 +548,13 @@ namespace lsp
545
548
{
546
549
if (nButtons == 0 )
547
550
{
548
- const ws:: rectangle_t *btn = find_button (e);
551
+ pCurrButton = find_button (e);
549
552
550
- if (btn != NULL )
553
+ if (pCurrButton != NULL )
551
554
{
552
- const size_t flags = (btn == &vButtons[1 ]) ? F_BUTTON_MAX | F_MOVER : F_MOVER;
553
555
if (e->nCode == ws::MCB_RIGHT)
554
- nXFlags |= flags | F_PRECISION;
555
- else if (e->nCode == ws::MCB_LEFT)
556
- nXFlags |= flags;
557
- else
556
+ nXFlags |= F_PRECISION;
557
+ else if (e->nCode != ws::MCB_LEFT)
558
558
nXFlags |= F_IGNORE;
559
559
}
560
560
else
@@ -563,9 +563,12 @@ namespace lsp
563
563
if (!(nXFlags & F_IGNORE))
564
564
{
565
565
nLastV = (sAngle .get () & 1 ) ? e->nTop : e->nLeft ;
566
- fLastValue = (nXFlags & F_BUTTON_MAX ) ? sValues .max () : sValues .min ();
566
+ fLastValue = (pCurrButton == &vButtons[ 0 ] ) ? sValues .min () : sValues .max ();
567
567
fCurrValue = fLastValue ;
568
568
569
+ lsp_trace (" curr button is %s, last_value=%f" ,
570
+ (pCurrButton == &vButtons[0 ]) ? " MIN" : " MAX" , fLastValue );
571
+
569
572
sSlots .execute (SLOT_BEGIN_EDIT, this );
570
573
}
571
574
}
@@ -578,7 +581,7 @@ namespace lsp
578
581
579
582
// Update value
580
583
const float value = (nButtons == size_t (size_t (1 ) << key)) ? fCurrValue : fLastValue ;
581
- update_value (value, value, (nXFlags & F_BUTTON_MAX ) ? CHANGE_MAX : CHANGE_MIN );
584
+ update_value (value, value, (pCurrButton == &vButtons[ 0 ] ) ? CHANGE_MIN : CHANGE_MAX );
582
585
583
586
return STATUS_OK;
584
587
}
@@ -590,21 +593,19 @@ namespace lsp
590
593
{
591
594
if (nButtons == 0 )
592
595
{
593
- const ws::rectangle_t *btn = find_button (e);
594
- if (btn != NULL )
595
- nXFlags = (btn == &vButtons[1 ]) ? F_BUTTON_MAX | F_MOVER : F_MOVER;
596
- else
597
- nXFlags = 0 ;
596
+ pCurrButton = find_button (e);
597
+ nXFlags = 0 ;
598
598
}
599
599
return STATUS_OK;
600
600
}
601
601
602
602
size_t key = (nXFlags & F_PRECISION) ? ws::MCB_RIGHT : ws::MCB_LEFT;
603
603
float value;
604
604
605
- const bool btn_max = (nXFlags & F_BUTTON_MAX) ;
605
+ const size_t flags = (pCurrButton == &vButtons[ 0 ]) ? CHANGE_MIN : CHANGE_MAX ;
606
606
if (nButtons == 0 ) // All mouse buttons are released now
607
607
{
608
+ pCurrButton = find_button (e);
608
609
nXFlags = 0 ;
609
610
value = (e->nCode == key) ? fCurrValue : fLastValue ;
610
611
}
@@ -614,7 +615,7 @@ namespace lsp
614
615
value = fLastValue ;
615
616
616
617
// Update value
617
- update_value (value, value, (btn_max) ? CHANGE_MAX : CHANGE_MIN );
618
+ update_value (value, value, flags );
618
619
619
620
if (nButtons == 0 )
620
621
sSlots .execute (SLOT_END_EDIT, this );
@@ -630,26 +631,21 @@ namespace lsp
630
631
size_t key = (nXFlags & F_PRECISION) ? ws::MCB_RIGHT : ws::MCB_LEFT;
631
632
if (nButtons != (size_t (1 ) << key))
632
633
{
633
- const ws::rectangle_t *btn = find_button (e);
634
- nXFlags &= ~(F_MOVER | F_BUTTON_MAX);
635
- if ((nButtons == 0 ) && (btn != NULL ))
636
- nXFlags |= (btn == &vButtons[1 ]) ? F_BUTTON_MAX | F_MOVER : F_MOVER;
634
+ pCurrButton = find_button (e);
637
635
return STATUS_OK;
638
636
}
637
+ else if (pCurrButton == NULL )
638
+ return STATUS_OK;
639
639
640
640
// Different behaviour for slider
641
- const bool btn_max = (nXFlags & F_BUTTON_MAX);
642
-
643
- nXFlags |= F_MOVER;
644
- ssize_t angle = sAngle .get () & 3 ;
641
+ const size_t flags = (pCurrButton == &vButtons[0 ]) ? CHANGE_MIN : CHANGE_MAX;
642
+ const ssize_t angle = sAngle .get () & 3 ;
645
643
646
644
ssize_t value = (angle & 1 ) ? e->nTop : e->nLeft ;
647
645
float result = fLastValue ;
648
646
if (value != nLastV)
649
647
{
650
648
float delta = sLimits .range () * float (value - nLastV) / fButtonRange ; // normalized
651
- if (angle >= 2 )
652
- delta = -delta;
653
649
float accel = 1 .0f ;
654
650
655
651
if (nXFlags & F_PRECISION)
@@ -665,23 +661,22 @@ namespace lsp
665
661
1 .0f ;
666
662
}
667
663
664
+ lsp_trace (" last_value = %f, delta = %f, accel = %f" , fLastValue , delta, accel);
665
+
668
666
result = ((angle == 1 ) || (angle == 2 )) ? result - delta*accel : result + delta*accel;
669
667
}
670
668
671
669
// Update value
672
670
fCurrValue = result;
673
671
lsp_trace (" fCurrValue=%f, fLastValue=%f" , fCurrValue , fLastValue );
674
- update_value (result, result, (btn_max) ? CHANGE_MAX : CHANGE_MIN );
672
+ update_value (result, result, flags );
675
673
676
674
return STATUS_OK;
677
675
}
678
676
679
677
status_t RangeSlider::on_mouse_scroll (const ws::event_t *e)
680
678
{
681
- // ssize_t angle = sAngle.get();
682
679
float step = sStep .get (e->nState & ws::MCF_CONTROL, e->nState & ws::MCF_SHIFT);
683
- // if (((angle & 3) == 2) || ((angle & 3) == 3))
684
- // step = -step;
685
680
if (sInvertMouseVScroll .get ())
686
681
step = -step;
687
682
@@ -880,7 +875,7 @@ namespace lsp
880
875
881
876
status_t RangeSlider::on_mouse_pointer (pointer_event_t *e)
882
877
{
883
- if ((nXFlags & (F_MOVER | F_IGNORE)) == F_MOVER )
878
+ if ((!( nXFlags & F_IGNORE)) && (pCurrButton != NULL ) )
884
879
{
885
880
ws::mouse_pointer_t dfl_pointer = (sAngle .get () & 1 ) ? ws::MP_VSIZE : ws::MP_HSIZE;
886
881
e->enPointer = sBtnPointer .get (dfl_pointer);
0 commit comments