enhanced SliderWidget (optionally includes value label now too)

This commit is contained in:
thrust26 2018-01-27 11:06:34 +01:00
parent 2eaa62c87c
commit 868df2cb22
2 changed files with 67 additions and 38 deletions

View File

@ -316,7 +316,8 @@ StaticTextWidget::StaticTextWidget(GuiObject* boss, const GUI::Font& font,
int x, int y,
const string& text, TextAlign align,
uInt32 shadowColor)
: StaticTextWidget(boss, font, x, y, font.getStringWidth(text), font.getLineHeight(), text, align, shadowColor)
: StaticTextWidget(boss, font, x, y, font.getStringWidth(text), font.getLineHeight(),
text, align, shadowColor)
{
}
@ -625,14 +626,18 @@ void CheckboxWidget::drawWidget(bool hilite)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SliderWidget::SliderWidget(GuiObject* boss, const GUI::Font& font,
int x, int y, int w, int h,
const string& label, int labelWidth, int cmd)
const string& label, int labelWidth, int cmd,
int valueLabelWidth, int valueLabelGap)
: ButtonWidget(boss, font, x, y, w, h, label, cmd),
_value(0),
_stepValue(1),
_valueMin(0),
_valueMax(100),
_isDragging(false),
_labelWidth(labelWidth)
_labelWidth(labelWidth),
_valueLabelGap(valueLabelGap),
_valueLabelWidth(valueLabelWidth),
_valueLabel("")
{
_flags = WIDGET_ENABLED | WIDGET_TRACK_MOUSE;
_bgcolor = kDlgColor;
@ -641,29 +646,20 @@ SliderWidget::SliderWidget(GuiObject* boss, const GUI::Font& font,
if(!_label.empty() && _labelWidth == 0)
_labelWidth = _font.getStringWidth(_label);
_w = w + _labelWidth;
if(_valueLabelWidth == 0)
_valueLabelGap = 0;
_w = w + _labelWidth + _valueLabelGap + _valueLabelWidth;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SliderWidget::SliderWidget(GuiObject* boss, const GUI::Font& font,
int x, int y,
const string& label, int labelWidth, int cmd)
: ButtonWidget(boss, font, x, y, font.getMaxCharWidth() * 10, font.getLineHeight(), label, cmd),
_value(0),
_stepValue(1),
_valueMin(0),
_valueMax(100),
_isDragging(false),
_labelWidth(labelWidth)
const string& label, int labelWidth, int cmd,
int valueLabelWidth, int valueLabelGap)
: SliderWidget(boss, font, x, y, font.getMaxCharWidth() * 10, font.getLineHeight(),
label, labelWidth, cmd, valueLabelWidth, valueLabelGap)
{
_flags = WIDGET_ENABLED | WIDGET_TRACK_MOUSE;
_bgcolor = kDlgColor;
_bgcolorhi = kDlgColor;
if(!_label.empty() && _labelWidth == 0)
_labelWidth = _font.getStringWidth(_label);
_w = _font.getMaxCharWidth() * 10 + _labelWidth;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -676,6 +672,8 @@ void SliderWidget::setValue(int value)
{
_value = value;
setDirty();
if (_valueLabelWidth)
setValueLabel(_value); // update label
sendCommand(_cmd, _value, _id);
}
}
@ -698,12 +696,31 @@ void SliderWidget::setStepValue(int value)
_stepValue = value;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void SliderWidget::setValueLabel(const string& valueLabel)
{
_valueLabel = valueLabel;
setDirty();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void SliderWidget::setValueLabel(int value)
{
char buf[256];
std::snprintf(buf, 255, "%d", value);
_valueLabel = buf;
setDirty();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void SliderWidget::handleMouseMoved(int x, int y)
{
// TODO: when the mouse is dragged outside the widget, the slider should
// snap back to the old value.
if(isEnabled() && _isDragging && x >= int(_labelWidth))
if(isEnabled() && _isDragging &&
x >= int(_labelWidth) && x <= int(_w - _valueLabelGap - _valueLabelWidth))
setValue(posToValue(x - _labelWidth));
}
@ -787,7 +804,7 @@ void SliderWidget::drawWidget(bool hilite)
y = _y + (_h - h) / 2 + 1;
// Fill the box
s.fillRect(x, y, _w - _labelWidth, h,
s.fillRect(x, y, _w - _labelWidth - _valueLabelGap - _valueLabelWidth, h,
!isEnabled() ? kBGColorHi : kBGColorLo);
// Draw the 'bar'
s.fillRect(x, y, p, h,
@ -795,6 +812,10 @@ void SliderWidget::drawWidget(bool hilite)
// Draw the 'handle'
s.fillRect(x + p, y - 2, 2, h + 4,
!isEnabled() ? kColor : hilite ? kSliderColorHi : kSliderColor);
if(_valueLabelWidth > 0)
s.drawString(_font, _valueLabel, _x + _w - _valueLabelWidth, _y + 2,
_valueLabelWidth, isEnabled() ? kTextColor : kColor);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -804,13 +825,13 @@ int SliderWidget::valueToPos(int value)
else if(value > _valueMax) value = _valueMax;
int range = std::max(_valueMax - _valueMin, 1); // don't divide by zero
return ((_w - _labelWidth - 2) * (value - _valueMin) / range);
return ((_w - _labelWidth - _valueLabelGap - _valueLabelWidth - 2) * (value - _valueMin) / range);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int SliderWidget::posToValue(int pos)
{
int value = (pos) * (_valueMax - _valueMin) / (_w - _labelWidth - 4) + _valueMin;
int value = (pos) * (_valueMax - _valueMin) / (_w - _labelWidth - _valueLabelGap - _valueLabelWidth - 4) + _valueMin;
// Scale the position to the correct interval (according to step value)
return value - (value % _stepValue);

View File

@ -179,11 +179,11 @@ class StaticTextWidget : public Widget
public:
StaticTextWidget(GuiObject* boss, const GUI::Font& font,
int x, int y, int w, int h,
const string& text, TextAlign align = TextAlign::Left,
const string& text = "", TextAlign align = TextAlign::Left,
uInt32 shadowColor = 0);
StaticTextWidget(GuiObject* boss, const GUI::Font& font,
int x, int y,
const string& text, TextAlign align = TextAlign::Left,
const string& text = "", TextAlign align = TextAlign::Left,
uInt32 shadowColor = 0);
void setValue(int value);
void setLabel(const string& label);
@ -306,21 +306,26 @@ class SliderWidget : public ButtonWidget
{
public:
SliderWidget(GuiObject* boss, const GUI::Font& font,
int x, int y, int w, int h, const string& label = "",
int labelWidth = 0, int cmd = 0);
int x, int y, int w, int h,
const string& label = "", int labelWidth = 0, int cmd = 0,
int valueLabelWidth = 0, int valueLabelGap = 4);
SliderWidget(GuiObject* boss, const GUI::Font& font,
int x, int y, const string& label = "",
int labelWidth = 0, int cmd = 0);
int x, int y,
const string& label = "", int labelWidth = 0, int cmd = 0,
int valueLabelWidth = 0, int valueLabelGap = 4);
void setValue(int value);
int getValue() const { return _value; }
int getValue() const { return _value; }
void setMinValue(int value);
int getMinValue() const { return _valueMin; }
int getMinValue() const { return _valueMin; }
void setMaxValue(int value);
int getMaxValue() const { return _valueMax; }
int getMaxValue() const { return _valueMax; }
void setStepValue(int value);
int getStepValue() const { return _stepValue; }
int getStepValue() const { return _stepValue; }
void setValueLabel(const string& valueLabel);
void setValueLabel(int value);
const string& getValueLabel() const { return _valueLabel; }
protected:
void handleMouseMoved(int x, int y) override;
@ -335,10 +340,13 @@ class SliderWidget : public ButtonWidget
int posToValue(int pos);
protected:
int _value, _stepValue;
int _valueMin, _valueMax;
bool _isDragging;
int _labelWidth;
int _value, _stepValue;
int _valueMin, _valueMax;
bool _isDragging;
int _labelWidth;
string _valueLabel;
int _valueLabelWidth;
int _valueLabelGap;
private:
// Following constructors and assignment operators not supported