Skip to content
Snippets Groups Projects
Commit f63ce154 authored by Sepehr Madani's avatar Sepehr Madani
Browse files

Abstract QSlider, QLineEdit, and QLabel widgets

parent 5dbba6ed
No related branches found
No related tags found
No related merge requests found
import sys
from cmath import exp from cmath import exp
from math import log10, pi from math import log10, pi
...@@ -11,12 +10,6 @@ from matplotlib.figure import Figure ...@@ -11,12 +10,6 @@ from matplotlib.figure import Figure
from utils.pattern import compute_pattern, range_in_deg from utils.pattern import compute_pattern, range_in_deg
# Define Size Policies
prefSizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
fixedSizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Preferred)
expandingSizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
class Parameter: class Parameter:
def __init__(self, name, value, min=0.0, max=1.0): def __init__(self, name, value, min=0.0, max=1.0):
self.name = name self.name = name
...@@ -31,6 +24,55 @@ class Parameter: ...@@ -31,6 +24,55 @@ class Parameter:
return self.min + (ratio_value / 100) * (self.max - self.min) return self.min + (ratio_value / 100) * (self.max - self.min)
class NullingSlider(QSlider):
def __init__(self, orientation, parent, default_value):
super().__init__(orientation=orientation, parent=parent)
self.parent = parent
self.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred))
self.setMinimumSize(QSize(100, 0))
self.setRange(0, 100)
self.setTickPosition(QSlider.TicksBelow)
self.setTickInterval(5)
self.connect_signal()
self.update_value(default_value)
def connect_signal(self):
self.valueChanged.connect(lambda: self.parent.update_parameters(source=QSlider))
def update_value(self, new_value):
self.valueChanged.disconnect()
self.setValue(new_value)
self.connect_signal()
class NullingLineEdit(QLineEdit):
def __init__(self, parent, default_value):
super().__init__(parent=parent)
self.parent = parent
self.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Preferred))
self.setFixedWidth(64)
self.connect_signal()
self.update_value(default_value)
def connect_signal(self):
self.textChanged.connect(
lambda: self.parent.update_parameters(source=QLineEdit)
)
def update_value(self, new_value):
self.textChanged.disconnect()
self.setText(str(new_value))
self.connect_signal()
class NullingLabel(QLabel):
def __init__(self, parent, label):
super().__init__(parent=parent)
self.setText(str(label))
self.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Preferred))
self.setFixedWidth(32)
class MainWindow(QMainWindow): class MainWindow(QMainWindow):
def __init__(self, param_builder): def __init__(self, param_builder):
super().__init__() super().__init__()
...@@ -40,7 +82,6 @@ class MainWindow(QMainWindow): ...@@ -40,7 +82,6 @@ class MainWindow(QMainWindow):
self.setWindowTitle("Chart Display") self.setWindowTitle("Chart Display")
self.resize(1280, 720) self.resize(1280, 720)
self.paramBuilder = param_builder self.paramBuilder = param_builder
self.parameterSet = self.paramBuilder.build_params() self.parameterSet = self.paramBuilder.build_params()
self.create_actions() self.create_actions()
...@@ -98,20 +139,6 @@ class MainWindow(QMainWindow): ...@@ -98,20 +139,6 @@ class MainWindow(QMainWindow):
def create_status_bar(self): def create_status_bar(self):
self.statusBar().showMessage("Ready") self.statusBar().showMessage("Ready")
def about(self):
QMessageBox.about(
self,
"About Nulling-Python",
"<b>Nulling-Python</b> is a small tool for analyzing and testing"
" algorithms for nulling systems of mmWave WLANs. <br/>"
" It is developed by Sepehr and Sohrab Madani and available on"
"<a href='https://gitlab.engr.illinois.edu/smadani2/nulling-python'>"
" UIUC Engineering Department Gitlab</a>.",
)
def aboutQt(self):
QMessageBox.aboutQt(self, "About Qt")
def create_control_box(self): def create_control_box(self):
self.parameterControlList = [] self.parameterControlList = []
self.labelList = [] self.labelList = []
...@@ -120,46 +147,18 @@ class MainWindow(QMainWindow): ...@@ -120,46 +147,18 @@ class MainWindow(QMainWindow):
self.toolboxLayout = QVBoxLayout() self.toolboxLayout = QVBoxLayout()
for parameter in self.parameterSet: for parameter in self.parameterSet:
# Label # Create widgets for each parameter
newLabel = QLabel(self.centralWidget) self.labelList.append(NullingLabel(parent=self, label=parameter.name))
newLabel.setText("Var {}".format(parameter.name)) self.lineEditList.append(NullingLineEdit(self, parameter.value))
newLabel.setSizePolicy(fixedSizePolicy) self.sliderList.append(NullingSlider(Qt.Horizontal, self, parameter.scaleTo100Ratio()))
newLabel.setFixedWidth(48)
# Line Edit
newLineEdit = QLineEdit(self.centralWidget)
newLineEdit.setSizePolicy(fixedSizePolicy)
newLineEdit.setFixedWidth(64)
newLineEdit.setText(str(parameter.value))
newLineEdit.textChanged.connect(
lambda: self.update_parameters(source=QLineEdit)
)
newLabel.setBuddy(newLineEdit)
# Horizontal Slider
newSlider = QSlider(Qt.Horizontal, self.centralWidget)
newSlider.setSizePolicy(expandingSizePolicy)
newSlider.setMinimumSize(QSize(100, 0))
newSlider.setRange(0, 100)
newSlider.setValue(parameter.scaleTo100Ratio())
newSlider.setTickPosition(QSlider.TicksBelow)
newSlider.setTickInterval(5)
newSlider.valueChanged.connect(
lambda: self.update_parameters(source=QSlider)
)
# Bundle layout for label, line edit, and slider # Bundle layout for label, line edit, and slider
newControlLayout = QHBoxLayout() self.parameterControlList.append(QHBoxLayout())
newControlLayout.addWidget(newLabel) self.parameterControlList[-1].addWidget(self.labelList[-1])
newControlLayout.addWidget(newLineEdit) self.parameterControlList[-1].addWidget(self.lineEditList[-1])
newControlLayout.addWidget(newSlider) self.parameterControlList[-1].addWidget(self.sliderList[-1])
self.parameterControlList.append(newControlLayout)
self.labelList.append(newLabel)
self.lineEditList.append(newLineEdit)
self.sliderList.append(newSlider)
self.toolboxLayout.addLayout(newControlLayout) self.toolboxLayout.addLayout(self.parameterControlList[-1])
self.rerunButton = QPushButton("Re-run") self.rerunButton = QPushButton("Re-run")
self.rerunButton.clicked.connect(self.call_algorithm) self.rerunButton.clicked.connect(self.call_algorithm)
...@@ -172,7 +171,7 @@ class MainWindow(QMainWindow): ...@@ -172,7 +171,7 @@ class MainWindow(QMainWindow):
def create_plot_box(self): def create_plot_box(self):
self.plotWidget = QWidget(self.centralWidget) self.plotWidget = QWidget(self.centralWidget)
self.plotWidget.setSizePolicy(expandingSizePolicy) self.plotWidget.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred))
self.plotWidget.setMinimumSize(QSize(720, 480)) self.plotWidget.setMinimumSize(QSize(720, 480))
self.plotLayout = QVBoxLayout(self.plotWidget) self.plotLayout = QVBoxLayout(self.plotWidget)
...@@ -190,49 +189,25 @@ class MainWindow(QMainWindow): ...@@ -190,49 +189,25 @@ class MainWindow(QMainWindow):
self.centralLayout.setStretch(1, 5) self.centralLayout.setStretch(1, 5)
self.centralWidget.setLayout(self.centralLayout) self.centralWidget.setLayout(self.centralLayout)
# def update_parameters(self, source=None):
# for slider, lineEdit, parameter in zip(
# self.sliderList, self.lineEditList, self.parameterSet
# ):
# if source == QSlider:
# newValue = parameter.scaleFrom100Ratio(slider.value())
# parameter.value = newValue
# lineEdit.setText(str(newValue))
# if source == QLineEdit:
# try:
# newValue = float(lineEdit.text())
# parameter.value = newValue
# slider.setValue(parameter.scaleTo100Ratio())
# except ValueError:
# pass
# if source == None:
# newValue = round(parameter.value, 4)
# slider.setValue(parameter.scaleTo100Ratio())
# lineEdit.setText(str(newValue))
# self.update_chart()
def update_parameters(self, source=None): def update_parameters(self, source=None):
if source == QSlider: for slider, lineEdit, parameter in zip(
for idx in range(len(self.parameterSet)): self.sliderList, self.lineEditList, self.parameterSet
newValue = self.parameterSet[idx].scaleFrom100Ratio(self.sliderList[idx].value()) ):
self.parameterSet[idx].value = newValue if source == QSlider:
self.lineEditList[idx].setText(str(newValue)) newValue = parameter.scaleFrom100Ratio(slider.value())
parameter.value = newValue
if source == QLineEdit: lineEdit.update_value(newValue)
for idx in range(len(self.parameterSet)):
if source == QLineEdit:
try: try:
self.parameterSet[idx].value = float(self.lineEditList[idx].text()) parameter.value = float(lineEdit.text())
self.sliderList[idx].setValue(self.parameterSet[idx].scaleTo100Ratio()) slider.update_value(parameter.scaleTo100Ratio())
except ValueError: except ValueError:
pass pass
if source is None: if source == None:
for idx in range(len(self.parameterSet)): slider.update_value(parameter.scaleTo100Ratio())
self.sliderList[idx].setValue(self.parameterSet[idx].scaleTo100Ratio()) lineEdit.update_value(round(parameter.value, 4))
self.lineEditList[idx].setText(str(self.parameterSet[idx].value))
self.update_chart() self.update_chart()
...@@ -276,4 +251,18 @@ class MainWindow(QMainWindow): ...@@ -276,4 +251,18 @@ class MainWindow(QMainWindow):
diff = [int(100 * (a - b)) for a, b in zip(A, B)] diff = [int(100 * (a - b)) for a, b in zip(A, B)]
if sum(list(map(abs, diff))) > 0: if sum(list(map(abs, diff))) > 0:
print(diff) print(diff)
self.update_parameters() self.update_parameters()
\ No newline at end of file
def about(self):
QMessageBox.about(
self,
"About Nulling-Python",
"<b>Nulling-Python</b> is a small tool for analyzing and testing"
" algorithms for nulling systems of mmWave WLANs. <br/>"
" It is developed by Sepehr and Sohrab Madani and available on"
"<a href='https://gitlab.engr.illinois.edu/smadani2/nulling-python'>"
" UIUC Engineering Department Gitlab</a>.",
)
def aboutQt(self):
QMessageBox.aboutQt(self, "About Qt")
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment