mirror of https://github.com/stella-emu/stella.git
Refactored TimeLineWidget to use uInt32 throughout:
- this fixes issues with signed vs. unsigned in some areas - it also self-documents, in that the slider should never use negative values
This commit is contained in:
parent
9e53641add
commit
f29dcfece1
|
@ -76,6 +76,7 @@ using std::memcpy;
|
||||||
|
|
||||||
// Common array types
|
// Common array types
|
||||||
using IntArray = std::vector<Int32>;
|
using IntArray = std::vector<Int32>;
|
||||||
|
using uIntArray = std::vector<uInt32>;
|
||||||
using BoolArray = std::vector<bool>;
|
using BoolArray = std::vector<bool>;
|
||||||
using ByteArray = std::vector<uInt8>;
|
using ByteArray = std::vector<uInt8>;
|
||||||
using ShortArray = std::vector<uInt16>;
|
using ShortArray = std::vector<uInt16>;
|
||||||
|
|
|
@ -28,11 +28,11 @@
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
TimeLineWidget::TimeLineWidget(GuiObject* boss, const GUI::Font& font,
|
TimeLineWidget::TimeLineWidget(GuiObject* boss, const GUI::Font& font,
|
||||||
int x, int y, int w, int h,
|
int x, int y, int w, int h,
|
||||||
const string& label, int labelWidth, int cmd)
|
const string& label, uInt32 labelWidth, int cmd)
|
||||||
: ButtonWidget(boss, font, x, y, w, h, label, cmd),
|
: ButtonWidget(boss, font, x, y, w, h, label, cmd),
|
||||||
_value(0),
|
_value(0),
|
||||||
_valueMin(0),
|
_valueMin(0),
|
||||||
_valueMax(100),
|
_valueMax(0),
|
||||||
_isDragging(false),
|
_isDragging(false),
|
||||||
_labelWidth(labelWidth)
|
_labelWidth(labelWidth)
|
||||||
{
|
{
|
||||||
|
@ -45,14 +45,13 @@ TimeLineWidget::TimeLineWidget(GuiObject* boss, const GUI::Font& font,
|
||||||
|
|
||||||
_w = w + _labelWidth;
|
_w = w + _labelWidth;
|
||||||
|
|
||||||
_stepValue.reserve(_valueMax);
|
_stepValue.reserve(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void TimeLineWidget::setValue(int value)
|
void TimeLineWidget::setValue(uInt32 value)
|
||||||
{
|
{
|
||||||
if(value < _valueMin) value = _valueMin;
|
value = BSPF::clamp(value, _valueMin, _valueMax);
|
||||||
else if(value > _valueMax) value = _valueMax;
|
|
||||||
|
|
||||||
if(value != _value)
|
if(value != _value)
|
||||||
{
|
{
|
||||||
|
@ -63,13 +62,13 @@ void TimeLineWidget::setValue(int value)
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void TimeLineWidget::setMinValue(int value)
|
void TimeLineWidget::setMinValue(uInt32 value)
|
||||||
{
|
{
|
||||||
_valueMin = value;
|
_valueMin = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void TimeLineWidget::setMaxValue(int value)
|
void TimeLineWidget::setMaxValue(uInt32 value)
|
||||||
{
|
{
|
||||||
_valueMax = value;
|
_valueMax = value;
|
||||||
}
|
}
|
||||||
|
@ -129,9 +128,9 @@ void TimeLineWidget::handleMouseWheel(int x, int y, int direction)
|
||||||
{
|
{
|
||||||
if(isEnabled())
|
if(isEnabled())
|
||||||
{
|
{
|
||||||
if(direction < 0)
|
if(direction < 0 && _value < _valueMax)
|
||||||
setValue(_value + 1);
|
setValue(_value + 1);
|
||||||
else if(direction > 0)
|
else if(direction > 0 && _value > _valueMin)
|
||||||
setValue(_value - 1);
|
setValue(_value - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -186,16 +185,13 @@ void TimeLineWidget::drawWidget(bool hilite)
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
int TimeLineWidget::valueToPos(int value)
|
uInt32 TimeLineWidget::valueToPos(uInt32 value)
|
||||||
{
|
{
|
||||||
if(_valueMax >= 0)
|
return _stepValue[BSPF::clamp(value, _valueMin, _valueMax)];
|
||||||
return _stepValue[BSPF::clamp(value, _valueMin, _valueMax)];
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
int TimeLineWidget::posToValue(int pos)
|
uInt32 TimeLineWidget::posToValue(uInt32 pos)
|
||||||
{
|
{
|
||||||
// Find the interval in which 'pos' falls, and then the endpoint which
|
// Find the interval in which 'pos' falls, and then the endpoint which
|
||||||
// it is closest to
|
// it is closest to
|
||||||
|
|
|
@ -25,15 +25,15 @@ class TimeLineWidget : public ButtonWidget
|
||||||
public:
|
public:
|
||||||
TimeLineWidget(GuiObject* boss, const GUI::Font& font,
|
TimeLineWidget(GuiObject* boss, const GUI::Font& font,
|
||||||
int x, int y, int w, int h, const string& label = "",
|
int x, int y, int w, int h, const string& label = "",
|
||||||
int labelWidth = 0, int cmd = 0);
|
uInt32 labelWidth = 0, int cmd = 0);
|
||||||
|
|
||||||
void setValue(int value);
|
void setValue(uInt32 value);
|
||||||
int getValue() const { return _value; }
|
uInt32 getValue() const { return _value; }
|
||||||
|
|
||||||
void setMinValue(int value);
|
void setMinValue(uInt32 value);
|
||||||
int getMinValue() const { return _valueMin; }
|
uInt32 getMinValue() const { return _valueMin; }
|
||||||
void setMaxValue(int value);
|
void setMaxValue(uInt32 value);
|
||||||
int getMaxValue() const { return _valueMax; }
|
uInt32 getMaxValue() const { return _valueMax; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Steps are not necessarily linear in a timeline, so we need info
|
Steps are not necessarily linear in a timeline, so we need info
|
||||||
|
@ -49,16 +49,16 @@ class TimeLineWidget : public ButtonWidget
|
||||||
|
|
||||||
void drawWidget(bool hilite) override;
|
void drawWidget(bool hilite) override;
|
||||||
|
|
||||||
int valueToPos(int value);
|
uInt32 valueToPos(uInt32 value);
|
||||||
int posToValue(int pos);
|
uInt32 posToValue(uInt32 pos);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
int _value;
|
uInt32 _value;
|
||||||
int _valueMin, _valueMax;
|
uInt32 _valueMin, _valueMax;
|
||||||
bool _isDragging;
|
bool _isDragging;
|
||||||
int _labelWidth;
|
uInt32 _labelWidth;
|
||||||
|
|
||||||
IntArray _stepValue;
|
uIntArray _stepValue;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Following constructors and assignment operators not supported
|
// Following constructors and assignment operators not supported
|
||||||
|
|
|
@ -212,7 +212,7 @@ void TimeMachineDialog::loadConfig()
|
||||||
IntArray cycles = r.cyclesList();
|
IntArray cycles = r.cyclesList();
|
||||||
|
|
||||||
// Set range and intervals for timeline
|
// Set range and intervals for timeline
|
||||||
myTimeline->setMaxValue(int(cycles.size()) - 1);
|
myTimeline->setMaxValue(cycles.size() > 1 ? cycles.size() - 1 : 0);
|
||||||
myTimeline->setStepValues(cycles);
|
myTimeline->setStepValues(cycles);
|
||||||
|
|
||||||
// Enable blending (only once is necessary)
|
// Enable blending (only once is necessary)
|
||||||
|
|
Loading…
Reference in New Issue