-
Notifications
You must be signed in to change notification settings - Fork 5
/
shape_slider.py
68 lines (50 loc) · 2.29 KB
/
shape_slider.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
from PyQt5 import QtGui, QtCore
from PyQt5.QtWidgets import QWidget
from PyQt5.QtWidgets import QWidget, QLabel, QSlider, QVBoxLayout, QHBoxLayout
import numpy as np
class ShapeSlider(QWidget):
value_changed = QtCore.pyqtSignal(float)
def __init__(self, idx, std_dev, std_offset = 2):
super(ShapeSlider, self).__init__()
self.idx = idx
self.std_offset = std_offset
self.slider = QSlider(QtCore.Qt.Horizontal)
self.slider.setRange(0, 100)
self.slider.setValue(50)
self.value = 0
self.value_label = QLabel("--")
self.min_label = QLabel("--")
self.max_label = QLabel("--")
self.__set_range_by_std_dev(std_dev)
self.slider.valueChanged[int].connect(self.__slider_value_changed)
horiz_layout = QHBoxLayout()
horiz_layout.addWidget(self.min_label)
horiz_layout.addWidget(self.slider)
horiz_layout.addWidget(self.max_label)
horiz_layout.addWidget(self.value_label)
self.setLayout(horiz_layout)
def reset(self):
self.slider.setValue(50)
def setValue(self, value):
self.slider.setValue(self.__float_to_slider(value))
def __set_range_by_std_dev(self, std_dev):
self.std_dev = std_dev
min = -1.0 * std_dev * self.std_offset
max = std_dev * self.std_offset
min_rnd = np.around(min, decimals=2)
max_rnd = np.around(max, decimals=2)
self.min_label.setText(str(min_rnd))
self.max_label.setText(str(max_rnd))
self.__slider_value_changed(50)
def __slider_value_changed(self, value):
self.value = self.__slider_int_to_float(value)
self.value_label.setText(str(np.around(self.value, decimals=2)))
self.value_changed.emit(self.value)
def __float_to_slider(self, float_val):
total_range = self.std_dev * 2 * self.std_offset
offset_val = float_val + (self.std_dev * self.std_offset)
return (offset_val / total_range) * 100
def __slider_int_to_float(self, slider_val):
total_range = self.std_dev * 2 * self.std_offset
float_percentage = (total_range / 100.0) * slider_val # slider ranges between [0, 100] so slider_val is just a percentage
return (-1.0 * self.std_dev * self.std_offset) + float_percentage