Vuo  2.0.3
VuoSliderWithLabels.cc
Go to the documentation of this file.
1 
10 #include "VuoSliderWithLabels.hh"
11 
12 const int VuoSliderWithLabels::minimumHeight = 37; // @todo: Figure this out programatically
13 const int VuoSliderWithLabels::extraVSpaceForTicks = 11;
14 
19  QSlider(parent)
20 {
21  setTickInterval(1);
22  setDisplayTicks(false);
23 
24  minLabel = NULL;
25  maxLabel = NULL;
26 }
27 
38 {
39  if (!minLabel)
40  minLabel = new QLabel(this);
41 
42  if (!maxLabel)
43  maxLabel = new QLabel(this);
44 
45  QStyleOptionSlider slider;
46  slider.initFrom(this);
47 
48  QFont labelFont = minLabel->font();
49  labelFont.setPointSize(9);
50 
51  minLabel->setFont(labelFont);
52  minLabel->setText(getLabelTextForValue(minimum()));
53 
54  maxLabel->setFont(labelFont);
55  // Append some extra space to account for a max label that might grow and shrink,
56  // since once it shrinks it can't reliably be expanded.
57  maxLabel->setText(getLabelTextForValue(maximum()).append(" "));
58 
59  if (displayTicks)
60  {
61  for (map<int, QLabel *>::iterator i = intermediateLabels.begin(); i != intermediateLabels.end(); ++i)
62  {
63  // Clear the text of previously initialized labels that are no longer relevant for the updated range.
64  int labelIndex = i->first;
65  QLabel *label = i->second;
66  if (labelIndex <= minimum() || labelIndex >= maximum())
67  {
68  // Don't actually make the label empty, though, since once it shrinks it can't reliably be expanded.
69  QString placeholderText = " ";
70  label->setText(placeholderText);
71  }
72  }
73 
74  for (int i = minimum()+1; i < maximum(); ++i)
75  {
76  if (intermediateLabels.find(i) == intermediateLabels.end())
77  intermediateLabels[i] = new QLabel(this);
78 
79  intermediateLabels[i]->setFont(minLabel->font());
80  intermediateLabels[i]->setText(getLabelTextForValue(i));
81  }
82  }
83 
84  setTickPosition(displayTicks? QSlider::TicksBelow : QSlider::NoTicks);
85  setMinimumSize(QSize(0, VuoSliderWithLabels::minimumHeight + (displayTicks? extraVSpaceForTicks : 0)));
86 }
87 
91 void VuoSliderWithLabels::paintEvent(QPaintEvent *e)
92 {
93  QStyleOptionSlider slider;
94  slider.initFrom(this);
95 
96  int sliderAvailableHorizontalSpace = style()->pixelMetric(QStyle::PM_SliderSpaceAvailable, &slider, this);
97  int sliderLeft = QStyle::sliderPositionFromValue(minimum(), maximum(), minimum(), sliderAvailableHorizontalSpace);
98  int sliderRight = width();
99 
100  int labelVerticalOffset = style()->pixelMetric(QStyle::PM_SliderThickness, &slider, this) + (displayTicks? extraVSpaceForTicks : 0) + 10;
101 
102  minLabel->move(QPoint(sliderLeft, labelVerticalOffset));
103  maxLabel->move(QPoint(min(sliderRight - maxLabel->sizeHint().width() + 6,
104  QStyle::sliderPositionFromValue(minimum(), maximum(), maximum(), sliderAvailableHorizontalSpace)),
105  labelVerticalOffset));
106 
107  if (displayTicks)
108  {
109  for (int i = minimum()+tickInterval(); i < maximum(); ++i)
110  {
111  int labelHorizontalOffset = QStyle::sliderPositionFromValue(minimum(), maximum(), i, sliderAvailableHorizontalSpace);
112  intermediateLabels[i]->move(labelHorizontalOffset, labelVerticalOffset);
113  }
114  }
115 
116  QSlider::paintEvent(e);
117 }
118 
123 {
124  return labelTextForValue[value];
125 }
126 
130 void VuoSliderWithLabels::setLabelTextForValue(int value, QString text)
131 {
132  this->labelTextForValue[value] = text;
133 }
134 
139 {
140  this->displayTicks = display;
141 }