Skip to content

Commit

Permalink
Refactor UI a bit and add strength slider
Browse files Browse the repository at this point in the history
  • Loading branch information
lebaston100 committed Mar 1, 2024
1 parent 6a3b1f1 commit 7ebe521
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 49 deletions.
2 changes: 0 additions & 2 deletions server/modules/Motor.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@

class Motor(QObject):
"""Represents a motor attached to an ESP Pin (Channel)"""

speedChanged = QSignal(list, float)

def __init__(self, settings: dict, parent: QObject | None = None) -> None:
Expand All @@ -19,7 +18,6 @@ def __init__(self, settings: dict, parent: QObject | None = None) -> None:
self._maxPwm: int = settings["maxPwm"]
self._point = Sphere3D(self._name)
self._point.xyz = settings["xyz"]

self.currentPWM: int = 0

def setSpeed(self, newSpeed: float) -> None:
Expand Down
9 changes: 2 additions & 7 deletions server/modules/Server.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,16 +39,11 @@ def __init__(self, *args, **kwargs) -> None:
self.vrcOscConnector.connect()
# TODO: Connect this to ContactGroups instead
self.vrcOscConnector.onVrcContact.connect(self._vrcOscDataReceived)
# self.vrcOscConnector.addToFilter("pat_2")
# self.vrcOscConnector.addToFilter("pat_2") # This will be signal triggered

self.hwManager = HwManager()

self._solverRunnerThread = QThread()
self.solverRunner = SolverRunner(config)

# self._solverRunnerThread.started.connect(self.solverRunner.runSolvers)
# self.solverRunner.moveToThread(self._solverRunnerThread)
# self._solverRunnerThread.start()
# ContactGroupManager here

self.hwManager.createAllHardwareDevicesFromConfig()

Expand Down
16 changes: 9 additions & 7 deletions server/ui/ContactGroupSettings.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
from PyQt6.QtWidgets import (QAbstractItemView, QAbstractScrollArea, QCheckBox,
QComboBox, QDialogButtonBox, QFormLayout,
QHBoxLayout, QHeaderView, QLineEdit, QPushButton,
QSizePolicy, QSpacerItem, QTableView, QTabWidget,
QVBoxLayout, QWidget)
QSizePolicy, QSlider, QSpacerItem, QTableView,
QTabWidget, QVBoxLayout, QWidget)

from modules import OptionAdapter, config
from ui.Delegates import FloatSpinBoxDelegate, IntSpinBoxDelegate
Expand Down Expand Up @@ -78,7 +78,6 @@ def buildUi(self) -> None:
def handleSaveButton(self) -> None:
"""Save all options when save button was pressed."""
logger.debug(f"handleSaveButton in {__class__.__name__}")
# TODO: Save other tabs too
self.tab_general.saveOptions()
self.tab_motors.saveOptions()
self.tab_colliderPoints.saveOptions()
Expand All @@ -96,7 +95,6 @@ def closeEvent(self, event: QCloseEvent) -> None:

# this might be removed later if it blocks processing data
# check and warn for unsaved changes
# TODO: Check other tabs too
if (self.tab_general.hasUnsavedOptions()
or self.tab_motors.hasUnsavedOptions()
or self.tab_colliderPoints.hasUnsavedOptions()
Expand Down Expand Up @@ -392,9 +390,15 @@ def buildUi(self) -> None:
self.cb_solverType.setCurrentText("Mlat")
self.cb_solverType.currentTextChanged.connect(self.changeSolver)
self.addOpt("solverType", self.cb_solverType)

self.selfLayout.addRow("Solver Type:", self.cb_solverType)

# the strength slider
self.hsld_strength = QSlider(Qt.Orientation.Horizontal)
self.hsld_strength.setMinimum(0)
self.hsld_strength.setMaximum(100)
self.addOpt("strength", self.hsld_strength, int)
self.selfLayout.addRow("Strength", self.hsld_strength)

# TODO: Refactor so each solver's setting is in their own class
# that is swapped out

Expand All @@ -408,15 +412,13 @@ def buildUi(self) -> None:
self.cb_allowOnlyUpperSphereHalf, bool)
self._solverOptionMapping.append(
("Mlat", self.cb_allowOnlyUpperSphereHalf))

self.selfLayout.addRow("", self.cb_allowOnlyUpperSphereHalf)

# contact only (on/off instead of pwm, might be better in the contact point?)
self.cb_contactOnly = QCheckBox(self)
self.cb_contactOnly.setObjectName("cb_contactOnly")
self.cb_contactOnly.setText("Contact only")
self.addOpt("contactOnly", self.cb_contactOnly, bool)

self.selfLayout.addRow("", self.cb_contactOnly)

# spacer
Expand Down
108 changes: 75 additions & 33 deletions server/ui/MainWindow.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
"""The main application window
"""
"""The main application window."""

import webbrowser
from functools import partial
Expand All @@ -14,7 +13,7 @@

import ui
from modules import HardwareDevice, ServerSingleton, config
from ui import EspSettingsDialog
from ui import EspSettingsDialog, ContactGroupSettings
from utils import LoggerClass
from utils import HardwareConnectionType

Expand Down Expand Up @@ -135,11 +134,11 @@ def setupUi(self) -> None:
self.contactGroupScrollAreaWidgetContentLayout.setContentsMargins(
0, 0, 0, 0)

# TODO: add rows here
self.testContactGroupInstance1 = ContactGroupRow(
self.contactGroupScrollAreaWidgetContent)
self.testContactGroupInstance2 = ContactGroupRow(
self.contactGroupScrollAreaWidgetContent)
# TODO: dynamically add rows
self.testContactGroupInstance1 = ContactGroupRow("0",
self.contactGroupScrollAreaWidgetContent)
self.testContactGroupInstance2 = ContactGroupRow("0",
self.contactGroupScrollAreaWidgetContent)
self.contactGroupScrollAreaWidgetContentLayout.addWidget(
self.testContactGroupInstance1)
self.contactGroupScrollAreaWidgetContentLayout.addWidget(
Expand Down Expand Up @@ -254,6 +253,7 @@ def __init__(self, parent: QWidget | None) -> None:
super().__init__(parent)

self.expandingWidget = None
self._settingsWindow: QWidget | None = None
self.buildCommonUi()
self.buildUi()

Expand Down Expand Up @@ -281,6 +281,30 @@ def _deleteExpandingWidget(self) -> None:
self.expandingWidget.close()
self.expandingWidget = None

@QSlot()
def _openSettingsWindow(self,
win: type[ContactGroupSettings] |
type[EspSettingsDialog], configKey: str):
if self._settingsWindow:
self._settingsWindow.raise_()
self._settingsWindow.activateWindow()
else:
self._settingsWindow = win(configKey)
self._settingsWindow.destroyed.connect(
self._closedSettingsWindow)
self._settingsWindow.show()

def _closedSettingsWindow(self):
self._settingsWindow = None

def _lockSlider(self) -> None:
logger.debug("Slider locked")
self.sliderLocked = True

def _unlockSlider(self) -> None:
logger.debug("Slider unlocked")
self.sliderLocked = False


class ExpandedWidgetDataRowBase(QHBoxLayout):
""" The base for the expanding widgets """
Expand All @@ -300,15 +324,23 @@ def buildUi(self) -> None:
def updateValue(self) -> None:
raise NotImplementedError

def _lockSlider(self) -> None:
logger.debug("Slider locked")
self.sliderLocked = True

def _unlockSlider(self) -> None:
logger.debug("Slider unlocked")
self.sliderLocked = False


class HardwareEspRow(BaseRow):
"""A independent hardware row inside the scroll area."""

def __init__(self, configKey: str, deviceRef: HardwareDevice,
parent: QWidget | None) -> None:
self._configKey = configKey
super().__init__(parent)
self._hwSettingsWindow: QWidget | None = None
self._configKey = configKey
self._deviceRef = deviceRef

self._updateStaticText()
Expand Down Expand Up @@ -374,25 +406,13 @@ def buildUi(self) -> None:
self.bt_openEspSettings.setFont(font11)
self.bt_openEspSettings.setToolTip("Configure")
self.bt_openEspSettings.setText("\ud83d\udd27")
self.bt_openEspSettings.clicked.connect(self._openHardwareSettings)
self.bt_openEspSettings.clicked.connect(
partial(self._openSettingsWindow,
EspSettingsDialog, self._configKey))
self.hl_espTopRow.addWidget(self.bt_openEspSettings)

self.selfLayout.addLayout(self.hl_espTopRow)

@QSlot()
def _openHardwareSettings(self):
if self._hwSettingsWindow:
self._hwSettingsWindow.raise_()
self._hwSettingsWindow.activateWindow()
else:
self._hwSettingsWindow = EspSettingsDialog(self._configKey)
self._hwSettingsWindow.destroyed.connect(
self._closedHardwareSettings)
self._hwSettingsWindow.show()

def _closedHardwareSettings(self):
self._hwSettingsWindow = None

def _updateStaticText(self) -> None:
id = config.get(f"{self._configKey}.id")
name = config.get(f"{self._configKey}.name")
Expand Down Expand Up @@ -524,14 +544,6 @@ def closeEvent(self, event: QCloseEvent) -> None:
"""
logger.debug(f"closeEvent in {__class__.__name__}")

def _lockSlider(self) -> None:
logger.debug("Slider locked")
self.sliderLocked = True

def _unlockSlider(self) -> None:
logger.debug("Slider unlocked")
self.sliderLocked = False

@QSlot(int)
def _sliderValueChanged(self, value: int) -> None:
"""Add the channelId to the slider value change event.
Expand Down Expand Up @@ -559,9 +571,11 @@ def updateValue(self, value: int) -> None:

class ContactGroupRow(BaseRow):
"""A independent contact group row inside the scroll area."""
strengthSliderValueChanged = QSignal(int, int)

def __init__(self, parent: QWidget | None) -> None:
def __init__(self, configKey: str, parent: QWidget | None) -> None:
# logger.debug(f"Creating {__class__.__name__}")
self._configKey = configKey
super().__init__(parent)

def buildUi(self) -> None:
Expand All @@ -583,6 +597,20 @@ def buildUi(self) -> None:

self.hl_groupTopRow.addWidget(self.lb_groupHasIncomingData)

# the strength slider
self.hsld_strength = QSlider(Qt.Orientation.Horizontal)
self.hsld_strength.setMinimumSize(QSize(100, 0))
self.hsld_strength.setMinimum(0)
self.hsld_strength.setMaximum(100)
self.hsld_strength.setTracking(True)
self.hsld_strength.valueChanged.connect(self._sliderValueChanged)
self.hl_groupTopRow.addWidget(self.hsld_strength)

# the strength number
self.lb_strength = ui.StaticLabel("Strength: ", "-", "%")
self.hl_groupTopRow.addWidget(self.lb_strength)
# TODO: This label needs updating

# spacer
self.spc_groupRow_1 = QSpacerItem(
10, 2, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Minimum)
Expand Down Expand Up @@ -614,10 +642,24 @@ def buildUi(self) -> None:
self.bt_openGroupSettings.setFont(font11)
self.bt_openGroupSettings.setToolTip("Configure")
self.bt_openGroupSettings.setText("\ud83d\udd27")
self.bt_openGroupSettings.clicked.connect(
partial(self._openSettingsWindow,
ContactGroupSettings, self._configKey))
self.hl_groupTopRow.addWidget(self.bt_openGroupSettings)

self.selfLayout.addLayout(self.hl_groupTopRow)

@QSlot(int)
def _sliderValueChanged(self, value: int) -> None:
"""Add the group id to the slider value change event.
Args:
value (int): The sliders percentage value.
"""
# TODO: Add group id
# TODO: WE MIGHT NOT EVEN NEED THIS!!
self.strengthSliderValueChanged.emit("group id", value)


class ContactGroupPointsWidget(QWidget):
def __init__(self, *args, **kwargs) -> None:
Expand Down

0 comments on commit 7ebe521

Please sign in to comment.