HAL
minimap_scrollbar.cpp
Go to the documentation of this file.
2 
3 #include <QFrame>
4 #include <QMouseEvent>
5 #include <QPainter>
6 #include <QScrollBar>
7 
8 #include <cmath>
9 #include <math.h>
10 
11 namespace hal
12 {
14  mSlider(new QFrame(this)),
15  mMinimum(0),
16  mMaximum(100),
17  mValue(0),
18  mHandleLength(0),
19  mHandlePosition(0),
20  mMousePressed(false),
21  mDragOffset(0),
22  mScrollbar(nullptr)
23  {
24  mSlider->setObjectName("slider");
25  mSlider->show();
26  }
27 
29  {
30  return mMinimum;
31  }
32 
34  {
35  return mMaximum;
36  }
37 
39  {
40  return mValue;
41  }
42 
44  {
45  return mSlider->height();
46  }
47 
49  {
50  return mSlider->pos().y();
51  }
52 
53  //void MinimapScrollbar::set_minimum(const int minimum)
54  //{
55  // mMinimum = minimum;
56 
57  // if (mValue < minimum)
58  // mValue = minimum;
59 
60  // adjustSliderToValue();
61  //}
62 
63  //void MinimapScrollbar::set_maximum(const int maximum)
64  //{
65  // mMaximum = maximum;
66 
67  // if (mValue > maximum)
68  // mValue = maximum;
69 
70  // adjustSliderToValue();
71  //}
72 
73  void MinimapScrollbar::setRange(const int minimum, const int maximum)
74  {
75  mMinimum = minimum;
76  mMaximum = maximum;
77 
78  // MAYBE REDUNDANT, LEFT FOR COMPLETENESS
79  if (mValue < minimum)
80  mValue = minimum;
81 
82  else if (mValue > maximum)
83  mValue = maximum;
84 
85  adjustSliderToValue();
86  }
87 
88  void MinimapScrollbar::setValue(const int value)
89  {
90  if (mValue != value)
91  {
92  if (value < mMinimum)
93  mValue = mMinimum;
94 
95  else if (value > mMaximum)
96  mValue = mMaximum;
97 
98  else
99  mValue = value;
100 
101  adjustSliderToValue();
102  }
103  }
104 
106  {
107  mSlider->resize(mSlider->width(), height);
108  adjustSliderToValue();
109  }
110 
112  {
113  mScrollbar = scrollbar;
114  }
115 
117  {
118  Q_UNUSED(event);
119  // LEFT EMPTY INTENTIONALLY FOR TRANSPARENT BACKGROUND
120  }
121 
123  {
124  //QWidget::resizeEvent(event); // UNNECESSARY ?
125  Q_UNUSED(event)
126 
127  mSlider->resize(width(), mSlider->height());
128  adjustSliderToValue();
129  }
130 
132  {
133  if (mSlider->geometry().contains(event->pos()))
134  {
135  mMousePressed = true;
136  mDragOffset = event->pos().y() - mSlider->geometry().top();
137  event->accept();
138  return;
139  }
140  else
141  event->ignore();
142  }
143 
145  {
146  if (!mScrollbar)
147  return;
148 
149  if (mMousePressed)
150  {
151  event->accept(); // UNSURE
152 
153  int y = event->pos().y() - mDragOffset;
154 
155  if (y < 0)
156  mScrollbar->setValue(mMinimum);
157 
158  else if (y > height() - mSlider->height())
159  mScrollbar->setValue(mMaximum);
160 
161  else
162  {
163  int available_pixel = height() - mSlider->height();
164  if (available_pixel <= 0)
165  return;
166 
167  int value_range = mMaximum - mMinimum;
168  if (value_range <= 0)
169  return;
170 
171  double pixel_per_value = double(available_pixel) / double(value_range);
172  mScrollbar->setValue(std::round(y / pixel_per_value));
173  }
174  }
175  }
176 
178  {
179  mMousePressed = false;
180  event->accept();
181  }
182 
184  {
185  mMousePressed = false;
187  }
188 
189  void MinimapScrollbar::adjustSliderToValue()
190  {
191  int available_pixel = height() - mSlider->height();
192  if (available_pixel <= 0)
193  return;
194 
195  int value_range = mMaximum - mMinimum;
196  if (value_range <= 0)
197  return;
198 
199  double pixel_per_value = double(available_pixel) / double(value_range);
200  int y = std::round(pixel_per_value * mValue);
201 
202  int max = height() - mSlider->height();
203  if (y > max)
204  y = max;
205 
206  mSlider->move(0, y);
207  }
208 }
void setValue(const int value)
void mouseReleaseEvent(QMouseEvent *event) override
void setSliderHeight(const int height)
void resizeEvent(QResizeEvent *event) override
void setScrollbar(QScrollBar *scrollbar)
void paintEvent(QPaintEvent *event) override
void leaveEvent(QEvent *event) override
void setRange(const int minimum, const int maximum)
void mouseMoveEvent(QMouseEvent *event) override
void mousePressEvent(QMouseEvent *event) override
MinimapScrollbar(QWidget *parent=nullptr)
void setValue(int)
void setObjectName(const QString &name)
virtual bool event(QEvent *event) override
virtual void leaveEvent(QEvent *event)
void move(int x, int y)
void resize(int w, int h)
void show()