Geometrize  1.0
An application for geometrizing images into geometric primitives
Public Types | Public Slots | Signals | Public Member Functions | Protected Member Functions | Private Member Functions | Private Attributes | List of all members
geometrize::dialog::RangeSlider Class Reference

#include <rangeslider.h>

Inheritance diagram for geometrize::dialog::RangeSlider:
Inheritance graph
[legend]
Collaboration diagram for geometrize::dialog::RangeSlider:
Collaboration graph
[legend]

Public Types

enum  Option { NoHandle = 0x0, LeftHandle = 0x1, RightHandle = 0x2, DoubleHandles = LeftHandle | RightHandle }
 

Public Slots

void setLowerValue (int aLowerValue)
 
void setUpperValue (int aUpperValue)
 
void setMinimum (int aMinimum)
 
void setMaximum (int aMaximum)
 

Signals

void lowerValueChanged (int aLowerValue)
 
void upperValueChanged (int aUpperValue)
 
void rangeChanged (int aMin, int aMax)
 

Public Member Functions

 RangeSlider (QWidget *aParent=Q_NULLPTR)
 
 RangeSlider (Qt::Orientation ori, Options t=DoubleHandles, QWidget *aParent=Q_NULLPTR)
 
QSize minimumSizeHint () const override
 
int GetMinimum () const
 
void SetMinimum (int aMinimum)
 
int GetMaximum () const
 
void SetMaximum (int aMaximum)
 
int GetLowerValue () const
 
void SetLowerValue (int aLowerValue)
 
int GetUpperValue () const
 
void SetUpperValue (int aUpperValue)
 
void SetRange (int aMinimum, int aMaximum)
 

Protected Member Functions

void paintEvent (QPaintEvent *aEvent) override
 
void mousePressEvent (QMouseEvent *aEvent) override
 
void mouseMoveEvent (QMouseEvent *aEvent) override
 
void mouseReleaseEvent (QMouseEvent *aEvent) override
 
void changeEvent (QEvent *aEvent) override
 
QRectF firstHandleRect () const
 
QRectF secondHandleRect () const
 
QRectF handleRect (int aValue) const
 

Private Member Functions

float currentPercentage ()
 
int validLength () const
 

Private Attributes

int mMinimum
 
int mMaximum
 
int mLowerValue
 
int mUpperValue
 
bool mFirstHandlePressed
 
bool mSecondHandlePressed
 
int mInterval
 
int mDelta
 
QColor mBackgroudColorEnabled
 
QColor mBackgroudColorDisabled
 
QColor mBackgroudColor
 
Qt::Orientation orientation
 
Options type
 

Member Enumeration Documentation

◆ Option

Enumerator
NoHandle 
LeftHandle 
RightHandle 
DoubleHandles 
42  {
43  NoHandle = 0x0,
44  LeftHandle = 0x1,
45  RightHandle = 0x2,
47  };

Constructor & Destructor Documentation

◆ RangeSlider() [1/2]

geometrize::dialog::RangeSlider::RangeSlider ( QWidget *  aParent = Q_NULLPTR)
44  : QWidget(aParent),
45  mMinimum(0),
46  mMaximum(100),
47  mLowerValue(0),
48  mUpperValue(100),
49  mFirstHandlePressed(false),
50  mSecondHandlePressed(false),
52  mBackgroudColorEnabled(QColor(0x1E, 0x90, 0xFF)),
53  mBackgroudColorDisabled(Qt::darkGray),
55  orientation(Qt::Horizontal)
56 {
57  setMouseTracking(true);
58 }

◆ RangeSlider() [2/2]

geometrize::dialog::RangeSlider::RangeSlider ( Qt::Orientation  ori,
Options  t = DoubleHandles,
QWidget *  aParent = Q_NULLPTR 
)
61  : QWidget(aParent),
62  mMinimum(0),
63  mMaximum(100),
64  mLowerValue(0),
65  mUpperValue(100),
66  mFirstHandlePressed(false),
67  mSecondHandlePressed(false),
69  mBackgroudColorEnabled(QColor(0x1E, 0x90, 0xFF)),
70  mBackgroudColorDisabled(Qt::darkGray),
72  orientation(ori),
73  type(t)
74 {
75  setMouseTracking(true);
76 }

Member Function Documentation

◆ changeEvent()

void geometrize::dialog::RangeSlider::changeEvent ( QEvent *  aEvent)
overrideprotected
250 {
251  if(aEvent->type() == QEvent::EnabledChange)
252  {
253  if(isEnabled())
254  {
256  }
257  else
258  {
260  }
261  update();
262  }
263 }

◆ currentPercentage()

float geometrize::dialog::RangeSlider::currentPercentage ( )
private

◆ firstHandleRect()

QRectF geometrize::dialog::RangeSlider::firstHandleRect ( ) const
protected
128 {
129  float percentage = (mLowerValue - mMinimum) * 1.0 / mInterval;
130  return handleRect(percentage * validLength() + scLeftRightMargin);
131 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetLowerValue()

int geometrize::dialog::RangeSlider::GetLowerValue ( ) const
291 {
292  return mLowerValue;
293 }
Here is the caller graph for this function:

◆ GetMaximum()

int geometrize::dialog::RangeSlider::GetMaximum ( ) const
281 {
282  return mMaximum;
283 }
Here is the caller graph for this function:

◆ GetMinimum()

int geometrize::dialog::RangeSlider::GetMinimum ( ) const
271 {
272  return mMinimum;
273 }
Here is the caller graph for this function:

◆ GetUpperValue()

int geometrize::dialog::RangeSlider::GetUpperValue ( ) const
301 {
302  return mUpperValue;
303 }
Here is the caller graph for this function:

◆ handleRect()

QRectF geometrize::dialog::RangeSlider::handleRect ( int  aValue) const
protected
140 {
141  if(orientation == Qt::Horizontal)
142  return QRect(aValue, (height()-scHandleSideLength) / 2, scHandleSideLength, scHandleSideLength);
143  else
144  return QRect((width()-scHandleSideLength) / 2, aValue, scHandleSideLength, scHandleSideLength);
145 }
Here is the caller graph for this function:

◆ lowerValueChanged

void geometrize::dialog::RangeSlider::lowerValueChanged ( int  aLowerValue)
signal
Here is the caller graph for this function:

◆ minimumSizeHint()

QSize geometrize::dialog::RangeSlider::minimumSizeHint ( ) const
override
266 {
267  return QSize(scHandleSideLength * 2 + scLeftRightMargin * 2, scHandleSideLength);
268 }

◆ mouseMoveEvent()

void geometrize::dialog::RangeSlider::mouseMoveEvent ( QMouseEvent *  aEvent)
overrideprotected
208 {
209  if(aEvent->buttons() & Qt::LeftButton)
210  {
211  int posValue, firstHandleRectPosValue, secondHandleRectPosValue;
212  posValue = (orientation == Qt::Horizontal) ? aEvent->pos().x() : aEvent->pos().y();
213  firstHandleRectPosValue = (orientation == Qt::Horizontal) ? firstHandleRect().x() : firstHandleRect().y();
214  secondHandleRectPosValue = (orientation == Qt::Horizontal) ? secondHandleRect().x() : secondHandleRect().y();
215 
216  if(mFirstHandlePressed && type.testFlag(LeftHandle))
217  {
218  if(posValue - mDelta + scHandleSideLength / 2 <= secondHandleRectPosValue)
219  {
220  setLowerValue((posValue - mDelta - scLeftRightMargin - scHandleSideLength / 2) * 1.0 / validLength() * mInterval + mMinimum);
221  }
222  else
223  {
225  }
226  }
227  else if(mSecondHandlePressed && type.testFlag(RightHandle))
228  {
229  if(firstHandleRectPosValue + scHandleSideLength * (type.testFlag(DoubleHandles) ? 1.5 : 0.5) <= posValue - mDelta)
230  {
231  setUpperValue((posValue - mDelta - scLeftRightMargin - scHandleSideLength / 2 - (type.testFlag(DoubleHandles) ? scHandleSideLength : 0)) * 1.0 / validLength() * mInterval + mMinimum);
232  }
233  else
234  {
236  }
237  }
238  }
239 }
Here is the call graph for this function:

◆ mousePressEvent()

void geometrize::dialog::RangeSlider::mousePressEvent ( QMouseEvent *  aEvent)
overrideprotected
148 {
149  if(aEvent->button() & Qt::RightButton)
150  {
151  const int min = GetMinimum();
152  const int max = GetMaximum();
153  const int lower = GetLowerValue();
154  const int upper = GetUpperValue();
155 
156  // Flips the space in the slider
157  setLowerValue(min + (max - upper));
158  setUpperValue(max - (lower - min));
159  }
160 
161  if(aEvent->buttons() & Qt::LeftButton)
162  {
163  int posCheck, posMax, posValue, firstHandleRectPosValue, secondHandleRectPosValue;
164  posCheck = (orientation == Qt::Horizontal) ? aEvent->pos().y() : aEvent->pos().x();
165  posMax = (orientation == Qt::Horizontal) ? height() : width();
166  posValue = (orientation == Qt::Horizontal) ? aEvent->pos().x() : aEvent->pos().y();
167  firstHandleRectPosValue = (orientation == Qt::Horizontal) ? firstHandleRect().x() : firstHandleRect().y();
168  secondHandleRectPosValue = (orientation == Qt::Horizontal) ? secondHandleRect().x() : secondHandleRect().y();
169 
170  mSecondHandlePressed = secondHandleRect().contains(aEvent->pos());
171  mFirstHandlePressed = !mSecondHandlePressed && firstHandleRect().contains(aEvent->pos());
173  {
174  mDelta = posValue - (firstHandleRectPosValue + scHandleSideLength / 2);
175  }
176  else if(mSecondHandlePressed)
177  {
178  mDelta = posValue - (secondHandleRectPosValue + scHandleSideLength / 2);
179  }
180 
181  else if(posCheck >= 2
182  && posCheck <= posMax - 2)
183  {
184  int step = mInterval / 10 < 1 ? 1 : mInterval / 10;
185  if(posValue < firstHandleRectPosValue)
186  setLowerValue(mLowerValue - step);
187  else if(posValue > secondHandleRectPosValue + scHandleSideLength)
188  setUpperValue(mUpperValue + step);
189  else if(((posValue > firstHandleRectPosValue + scHandleSideLength) || !type.testFlag(LeftHandle))
190  && ((posValue < secondHandleRectPosValue) || !type.testFlag(RightHandle)))
191  {
192  if(type.testFlag(DoubleHandles))
193  if(posValue - (firstHandleRectPosValue + scHandleSideLength) <
194  (secondHandleRectPosValue - (firstHandleRectPosValue + scHandleSideLength)) / 2)
196  else
198  else if(type.testFlag(LeftHandle))
200  else if(type.testFlag(RightHandle))
202  }
203  }
204  }
205 }
Here is the call graph for this function:

◆ mouseReleaseEvent()

void geometrize::dialog::RangeSlider::mouseReleaseEvent ( QMouseEvent *  aEvent)
overrideprotected
242 {
243  Q_UNUSED(aEvent);
244 
245  mFirstHandlePressed = false;
246  mSecondHandlePressed = false;
247 }

◆ paintEvent()

void geometrize::dialog::RangeSlider::paintEvent ( QPaintEvent *  aEvent)
overrideprotected
79 {
80  Q_UNUSED(aEvent);
81  QPainter painter(this);
82 
83  // Background
84  QRectF backgroundRect;
85  if(orientation == Qt::Horizontal)
86  backgroundRect = QRectF(scLeftRightMargin, (height() - scSliderBarHeight) / 2, width() - scLeftRightMargin * 2, scSliderBarHeight);
87  else
88  backgroundRect = QRectF((width() - scSliderBarHeight) / 2, scLeftRightMargin, scSliderBarHeight, height() - scLeftRightMargin*2);
89 
90  QPen pen(Qt::gray, 0.8);
91  painter.setPen(pen);
92  QBrush backgroundBrush(QColor(0xD0, 0xD0, 0xD0));
93  painter.setBrush(backgroundBrush);
94  painter.drawRoundedRect(backgroundRect, 1, 1);
95 
96  // First value handle rect
97  pen.setColor(Qt::darkGray);
98  pen.setWidth(0.5);
99  painter.setPen(pen);
100  painter.setRenderHint(QPainter::Antialiasing);
101  QBrush handleBrush(QColor(0xFA, 0xFA, 0xFA));
102  painter.setBrush(handleBrush);
103  QRectF leftHandleRect = firstHandleRect();
104  if(type.testFlag(LeftHandle))
105  painter.drawRoundedRect(leftHandleRect, 2, 2);
106 
107  // Second value handle rect
108  QRectF rightHandleRect = secondHandleRect();
109  if(type.testFlag(RightHandle))
110  painter.drawRoundedRect(rightHandleRect, 2, 2);
111 
112  // Handles
113  painter.setRenderHint(QPainter::Antialiasing, false);
114  QRectF selectedRect(backgroundRect);
115  if(orientation == Qt::Horizontal) {
116  selectedRect.setLeft((type.testFlag(LeftHandle) ? leftHandleRect.right() : leftHandleRect.left()) + 0.5);
117  selectedRect.setRight((type.testFlag(RightHandle) ? rightHandleRect.left() : rightHandleRect.right()) - 0.5);
118  } else {
119  selectedRect.setTop((type.testFlag(LeftHandle) ? leftHandleRect.bottom() : leftHandleRect.top()) + 0.5);
120  selectedRect.setBottom((type.testFlag(RightHandle) ? rightHandleRect.top() : rightHandleRect.bottom()) - 0.5);
121  }
122  QBrush selectedBrush(mBackgroudColor);
123  painter.setBrush(selectedBrush);
124  painter.drawRect(selectedRect);
125 }
Here is the call graph for this function:

◆ rangeChanged

void geometrize::dialog::RangeSlider::rangeChanged ( int  aMin,
int  aMax 
)
signal
Here is the caller graph for this function:

◆ secondHandleRect()

QRectF geometrize::dialog::RangeSlider::secondHandleRect ( ) const
protected
134 {
135  float percentage = (mUpperValue - mMinimum) * 1.0 / mInterval;
136  return handleRect(percentage * validLength() + scLeftRightMargin + (type.testFlag(LeftHandle) ? scHandleSideLength : 0));
137 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ SetLowerValue()

void geometrize::dialog::RangeSlider::SetLowerValue ( int  aLowerValue)
296 {
297  setLowerValue(aLowerValue);
298 }
Here is the call graph for this function:

◆ setLowerValue

void geometrize::dialog::RangeSlider::setLowerValue ( int  aLowerValue)
slot
311 {
312  if(aLowerValue > mMaximum)
313  {
314  aLowerValue = mMaximum;
315  }
316 
317  if(aLowerValue < mMinimum)
318  {
319  aLowerValue = mMinimum;
320  }
321 
322  mLowerValue = aLowerValue;
324 
325  update();
326 }
Here is the caller graph for this function:

◆ SetMaximum()

void geometrize::dialog::RangeSlider::SetMaximum ( int  aMaximum)
286 {
287  setMaximum(aMaximum);
288 }
Here is the call graph for this function:

◆ setMaximum

void geometrize::dialog::RangeSlider::setMaximum ( int  aMaximum)
slot
368 {
369  if(aMaximum >= mMinimum)
370  {
371  mMaximum = aMaximum;
372  }
373  else
374  {
375  int oldMin = mMinimum;
376  mMaximum = oldMin;
377  mMinimum = aMaximum;
378  }
380  update();
381 
384 
386 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ SetMinimum()

void geometrize::dialog::RangeSlider::SetMinimum ( int  aMinimum)
276 {
277  setMinimum(aMinimum);
278 }
Here is the call graph for this function:

◆ setMinimum

void geometrize::dialog::RangeSlider::setMinimum ( int  aMinimum)
slot
347 {
348  if(aMinimum <= mMaximum)
349  {
350  mMinimum = aMinimum;
351  }
352  else
353  {
354  int oldMax = mMaximum;
355  mMinimum = oldMax;
356  mMaximum = aMinimum;
357  }
359  update();
360 
363 
365 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ SetRange()

void geometrize::dialog::RangeSlider::SetRange ( int  aMinimum,
int  aMaximum 
)
395 {
396  setMinimum(aMinimum);
398 }
Here is the call graph for this function:

◆ SetUpperValue()

void geometrize::dialog::RangeSlider::SetUpperValue ( int  aUpperValue)
306 {
307  setUpperValue(aUpperValue);
308 }
Here is the call graph for this function:

◆ setUpperValue

void geometrize::dialog::RangeSlider::setUpperValue ( int  aUpperValue)
slot
329 {
330  if(aUpperValue > mMaximum)
331  {
332  aUpperValue = mMaximum;
333  }
334 
335  if(aUpperValue < mMinimum)
336  {
337  aUpperValue = mMinimum;
338  }
339 
340  mUpperValue = aUpperValue;
342 
343  update();
344 }
Here is the caller graph for this function:

◆ upperValueChanged

void geometrize::dialog::RangeSlider::upperValueChanged ( int  aUpperValue)
signal
Here is the caller graph for this function:

◆ validLength()

int geometrize::dialog::RangeSlider::validLength ( ) const
private
389 {
390  int len = (orientation == Qt::Horizontal) ? width() : height();
391  return len - scLeftRightMargin * 2 - scHandleSideLength * (type.testFlag(DoubleHandles) ? 2 : 1);
392 }
Here is the caller graph for this function:

Member Data Documentation

◆ mBackgroudColor

QColor geometrize::dialog::RangeSlider::mBackgroudColor
private

◆ mBackgroudColorDisabled

QColor geometrize::dialog::RangeSlider::mBackgroudColorDisabled
private

◆ mBackgroudColorEnabled

QColor geometrize::dialog::RangeSlider::mBackgroudColorEnabled
private

◆ mDelta

int geometrize::dialog::RangeSlider::mDelta
private

◆ mFirstHandlePressed

bool geometrize::dialog::RangeSlider::mFirstHandlePressed
private

◆ mInterval

int geometrize::dialog::RangeSlider::mInterval
private

◆ mLowerValue

int geometrize::dialog::RangeSlider::mLowerValue
private

◆ mMaximum

int geometrize::dialog::RangeSlider::mMaximum
private

◆ mMinimum

int geometrize::dialog::RangeSlider::mMinimum
private

◆ mSecondHandlePressed

bool geometrize::dialog::RangeSlider::mSecondHandlePressed
private

◆ mUpperValue

int geometrize::dialog::RangeSlider::mUpperValue
private

◆ orientation

Qt::Orientation geometrize::dialog::RangeSlider::orientation
private

◆ type

Options geometrize::dialog::RangeSlider::type
private

The documentation for this class was generated from the following files:
geometrize::dialog::RangeSlider::setMaximum
void setMaximum(int aMaximum)
Definition: rangeslider.cpp:367
geometrize::dialog::RangeSlider::GetMinimum
int GetMinimum() const
Definition: rangeslider.cpp:270
geometrize::dialog::RangeSlider::NoHandle
@ NoHandle
Definition: rangeslider.h:43
geometrize::dialog::RangeSlider::DoubleHandles
@ DoubleHandles
Definition: rangeslider.h:46
geometrize::dialog::RangeSlider::validLength
int validLength() const
Definition: rangeslider.cpp:388
geometrize::dialog::RangeSlider::setMinimum
void setMinimum(int aMinimum)
Definition: rangeslider.cpp:346
geometrize::dialog::RangeSlider::mBackgroudColorDisabled
QColor mBackgroudColorDisabled
Definition: rangeslider.h:105
geometrize::dialog::RangeSlider::mBackgroudColorEnabled
QColor mBackgroudColorEnabled
Definition: rangeslider.h:104
geometrize::dialog::RangeSlider::setUpperValue
void setUpperValue(int aUpperValue)
Definition: rangeslider.cpp:328
geometrize::dialog::RangeSlider::mLowerValue
int mLowerValue
Definition: rangeslider.h:98
geometrize::dialog::RangeSlider::orientation
Qt::Orientation orientation
Definition: rangeslider.h:107
geometrize::dialog::RangeSlider::setLowerValue
void setLowerValue(int aLowerValue)
Definition: rangeslider.cpp:310
geometrize::dialog::RangeSlider::mInterval
int mInterval
Definition: rangeslider.h:102
geometrize::dialog::RangeSlider::mDelta
int mDelta
Definition: rangeslider.h:103
geometrize::dialog::RangeSlider::LeftHandle
@ LeftHandle
Definition: rangeslider.h:44
geometrize::dialog::RangeSlider::lowerValueChanged
void lowerValueChanged(int aLowerValue)
geometrize::dialog::RangeSlider::secondHandleRect
QRectF secondHandleRect() const
Definition: rangeslider.cpp:133
geometrize::dialog::RangeSlider::firstHandleRect
QRectF firstHandleRect() const
Definition: rangeslider.cpp:127
geometrize::dialog::RangeSlider::rangeChanged
void rangeChanged(int aMin, int aMax)
geometrize::dialog::RangeSlider::type
Options type
Definition: rangeslider.h:108
geometrize::dialog::RangeSlider::GetMaximum
int GetMaximum() const
Definition: rangeslider.cpp:280
geometrize::dialog::RangeSlider::upperValueChanged
void upperValueChanged(int aUpperValue)
geometrize::dialog::RangeSlider::mMaximum
int mMaximum
Definition: rangeslider.h:97
geometrize::dialog::RangeSlider::mMinimum
int mMinimum
Definition: rangeslider.h:96
geometrize::dialog::RangeSlider::mFirstHandlePressed
bool mFirstHandlePressed
Definition: rangeslider.h:100
geometrize::dialog::RangeSlider::RightHandle
@ RightHandle
Definition: rangeslider.h:45
geometrize::dialog::RangeSlider::mUpperValue
int mUpperValue
Definition: rangeslider.h:99
geometrize::dialog::RangeSlider::handleRect
QRectF handleRect(int aValue) const
Definition: rangeslider.cpp:139
geometrize::dialog::RangeSlider::mBackgroudColor
QColor mBackgroudColor
Definition: rangeslider.h:106
geometrize::dialog::RangeSlider::GetUpperValue
int GetUpperValue() const
Definition: rangeslider.cpp:300
geometrize::dialog::RangeSlider::mSecondHandlePressed
bool mSecondHandlePressed
Definition: rangeslider.h:101
geometrize::dialog::RangeSlider::GetLowerValue
int GetLowerValue() const
Definition: rangeslider.cpp:290