Skip to content

Commit ccc1f81

Browse files
committed
Implemented new tk::RangeSlider widget
1 parent 29c8024 commit ccc1f81

File tree

4 files changed

+34
-38
lines changed

4 files changed

+34
-38
lines changed

CHANGELOG

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
*******************************************************************************
44

55
=== 1.0.30 ===
6+
* Implemented new tk::RangeSlider widget.
67
* Fixed use after free for several scenarios when destroying the display.
78

89
=== 1.0.29 ===

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ The full list of provided widgets:
7575
* MenuItem - menu item widget used by Menu widget.
7676
* ProgressBar - widget for displaying progress of some long lasting process.
7777
* RadioButton - rounded single on/off toggle.
78+
* RangeSlider - the slider with two tips that allows to set the range of values.
7879
* ScrollBar - single scroll bar.
7980
* Separator - separator widget to visually separate space allocated in widget containers.
8081
* Void - void widget which can be used for filling empty area.

include/lsp-plug.in/tk/widgets/simple/RangeSlider.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,8 @@ namespace lsp
9797
protected:
9898
enum flags_t
9999
{
100-
F_BUTTON_MAX = 1 << 0,
101-
F_IGNORE = 1 << 1,
102-
F_PRECISION = 1 << 2,
103-
F_MOVER = 1 << 3
100+
F_IGNORE = 1 << 0,
101+
F_PRECISION = 1 << 1
104102
};
105103

106104
enum rslider_flags_t
@@ -118,6 +116,7 @@ namespace lsp
118116
float fLastValue;
119117
float fCurrValue;
120118
ws::rectangle_t vButtons[2];
119+
ws::rectangle_t *pCurrButton;
121120
ws::rectangle_t sHole;
122121

123122
style::RangeSliderColors vColors[RSLIDER_TOTAL];

src/main/widgets/simple/RangeSlider.cpp

Lines changed: 29 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)