@@ -158,6 +158,7 @@ namespace lsp
158158 btn->nWidth = 0 ;
159159 btn->nHeight = 0 ;
160160 }
161+ pCurrButton = NULL ;
161162
162163 sHole .nLeft = -1 ;
163164 sHole .nTop = -1 ;
@@ -266,6 +267,8 @@ namespace lsp
266267 lsp::swap (bmin, bmax);
267268 }
268269
270+ lsp_trace (" min = %f, max = %f" , min, max);
271+
269272 switch (angle & 3 )
270273 {
271274 case 0 : // horizontal left -> right
@@ -282,7 +285,7 @@ namespace lsp
282285 bmin->nLeft = sSize .nLeft ;
283286 bmax->nLeft = sSize .nLeft ;
284287 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 ;
286289 break ;
287290 }
288291
@@ -468,14 +471,14 @@ namespace lsp
468471 max = sLimits .limit (max);
469472 }
470473
471- lsp_trace (" out: min=%f, max=%f" , min, max);
472-
473474 flags = 0 ;
474475 if (old_min != min)
475476 flags |= CHANGE_MIN;
476477 if (old_max != max)
477478 flags |= CHANGE_MAX;
478479
480+ lsp_trace (" out: min=%f, max=%f, flags=0x%x" , min, max, flags);
481+
479482 sValues .set (min, max);
480483 if (flags != 0 )
481484 sSlots .execute (SLOT_CHANGE, this , &flags);
@@ -545,16 +548,13 @@ namespace lsp
545548 {
546549 if (nButtons == 0 )
547550 {
548- const ws:: rectangle_t *btn = find_button (e);
551+ pCurrButton = find_button (e);
549552
550- if (btn != NULL )
553+ if (pCurrButton != NULL )
551554 {
552- const size_t flags = (btn == &vButtons[1 ]) ? F_BUTTON_MAX | F_MOVER : F_MOVER;
553555 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)
558558 nXFlags |= F_IGNORE;
559559 }
560560 else
@@ -563,9 +563,12 @@ namespace lsp
563563 if (!(nXFlags & F_IGNORE))
564564 {
565565 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 ();
567567 fCurrValue = fLastValue ;
568568
569+ lsp_trace (" curr button is %s, last_value=%f" ,
570+ (pCurrButton == &vButtons[0 ]) ? " MIN" : " MAX" , fLastValue );
571+
569572 sSlots .execute (SLOT_BEGIN_EDIT, this );
570573 }
571574 }
@@ -578,7 +581,7 @@ namespace lsp
578581
579582 // Update value
580583 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 );
582585
583586 return STATUS_OK;
584587 }
@@ -590,21 +593,19 @@ namespace lsp
590593 {
591594 if (nButtons == 0 )
592595 {
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 ;
598598 }
599599 return STATUS_OK;
600600 }
601601
602602 size_t key = (nXFlags & F_PRECISION) ? ws::MCB_RIGHT : ws::MCB_LEFT;
603603 float value;
604604
605- const bool btn_max = (nXFlags & F_BUTTON_MAX) ;
605+ const size_t flags = (pCurrButton == &vButtons[ 0 ]) ? CHANGE_MIN : CHANGE_MAX ;
606606 if (nButtons == 0 ) // All mouse buttons are released now
607607 {
608+ pCurrButton = find_button (e);
608609 nXFlags = 0 ;
609610 value = (e->nCode == key) ? fCurrValue : fLastValue ;
610611 }
@@ -614,7 +615,7 @@ namespace lsp
614615 value = fLastValue ;
615616
616617 // Update value
617- update_value (value, value, (btn_max) ? CHANGE_MAX : CHANGE_MIN );
618+ update_value (value, value, flags );
618619
619620 if (nButtons == 0 )
620621 sSlots .execute (SLOT_END_EDIT, this );
@@ -630,26 +631,21 @@ namespace lsp
630631 size_t key = (nXFlags & F_PRECISION) ? ws::MCB_RIGHT : ws::MCB_LEFT;
631632 if (nButtons != (size_t (1 ) << key))
632633 {
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);
637635 return STATUS_OK;
638636 }
637+ else if (pCurrButton == NULL )
638+ return STATUS_OK;
639639
640640 // 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 ;
645643
646644 ssize_t value = (angle & 1 ) ? e->nTop : e->nLeft ;
647645 float result = fLastValue ;
648646 if (value != nLastV)
649647 {
650648 float delta = sLimits .range () * float (value - nLastV) / fButtonRange ; // normalized
651- if (angle >= 2 )
652- delta = -delta;
653649 float accel = 1 .0f ;
654650
655651 if (nXFlags & F_PRECISION)
@@ -665,23 +661,22 @@ namespace lsp
665661 1 .0f ;
666662 }
667663
664+ lsp_trace (" last_value = %f, delta = %f, accel = %f" , fLastValue , delta, accel);
665+
668666 result = ((angle == 1 ) || (angle == 2 )) ? result - delta*accel : result + delta*accel;
669667 }
670668
671669 // Update value
672670 fCurrValue = result;
673671 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 );
675673
676674 return STATUS_OK;
677675 }
678676
679677 status_t RangeSlider::on_mouse_scroll (const ws::event_t *e)
680678 {
681- // ssize_t angle = sAngle.get();
682679 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;
685680 if (sInvertMouseVScroll .get ())
686681 step = -step;
687682
@@ -880,7 +875,7 @@ namespace lsp
880875
881876 status_t RangeSlider::on_mouse_pointer (pointer_event_t *e)
882877 {
883- if ((nXFlags & (F_MOVER | F_IGNORE)) == F_MOVER )
878+ if ((!( nXFlags & F_IGNORE)) && (pCurrButton != NULL ) )
884879 {
885880 ws::mouse_pointer_t dfl_pointer = (sAngle .get () & 1 ) ? ws::MP_VSIZE : ws::MP_HSIZE;
886881 e->enPointer = sBtnPointer .get (dfl_pointer);
0 commit comments