Files
MSMD-Player/Settings.py
Keith Smith a830b6b27f Add fallback handling for missing icon files
Add graceful fallback behavior when icon image files (refresh.png, settings.png, MSMD32.png) are not found. The application now uses Unicode symbols (⟳, ⚙) as button text alternatives, preventing crashes when running without bundled assets.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-15 16:43:03 -07:00

184 lines
6.9 KiB
Python

# -*- coding: utf-8 -*-
"""
Created on Fri Apr 20 18:11:20 2018
@author: Nick
"""
from PyQt5.QtCore import Qt, pyqtSignal
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import (QHBoxLayout, QVBoxLayout, QGridLayout, QComboBox, QLabel, QSpinBox, QGroupBox, QPushButton, QWidget, QFrame, QSpacerItem, QSizePolicy, QCheckBox)
class QHLine(QFrame):
def __init__(self):
super(QHLine, self).__init__()
self.setFrameShape(QFrame.HLine)
self.setFrameShadow(QFrame.Sunken)
class Settings(QWidget):
Closing = pyqtSignal(str)
def __init__(self, SettingsIn):
super(QWidget, self).__init__()
self.__UserAbort = True
#-----Widget Settings-----
import os
if os.path.exists('MSMD32.png'):
self.setWindowIcon(QIcon('MSMD32.png'))
self.setWindowTitle('MSMD Settings')
#Remove Maximize and Minimize buttons
self.setWindowFlags(self.windowFlags() & ~Qt.WindowMinMaxButtonsHint)
#-----Widget Lists-----
MasterUpgradeTriggers = ['Folder', 'Hotspot']
MasterUpgradeMode = ['Both', 'Left', 'Right', 'Distance']
TriggerIdx = [x.lower() for x in MasterUpgradeTriggers].index(SettingsIn['upgradeTrigger'])
ModeIdx = [x.lower() for x in MasterUpgradeMode].index(SettingsIn['upgradeMode'])
#-----Widgets-----
UpgradeFrame = QGroupBox()
UpgradeFrame.setTitle('Upgrades')
SpeedFrame = QGroupBox()
SpeedFrame.setTitle('Speed')
self.UpgradeTrigger = QComboBox()
self.UpgradeTrigger.setToolTip('Set robot upgrade interval to hotspots or levels')
self.UpgradeTrigger.setFixedWidth(80)
for Trigger in MasterUpgradeTriggers:
self.UpgradeTrigger.addItem(Trigger)
self.UpgradeTrigger.setCurrentIndex(TriggerIdx)
self.UpgradeMode = QComboBox()
self.UpgradeMode.setToolTip('Set robot upgrade mode')
self.UpgradeMode.setFixedWidth(80)
for Mode in MasterUpgradeMode:
self.UpgradeMode.addItem(Mode)
self.UpgradeMode.setCurrentIndex(ModeIdx)
self.MinPower = QSpinBox()
self.MinPower.setToolTip('Set minimum power for robot to start moving')
self.MinPower.setMaximum(255)
self.MinPower.setMinimum(0)
self.MinPower.setSingleStep(5)
self.MinPower.setFixedWidth(60)
self.MinPower.setValue(int(SettingsIn['minPowerToMove']))
self.MaxPower = QSpinBox()
self.MaxPower.setToolTip('Set maximum power for robot to start moving')
self.MaxPower.setMaximum(255)
self.MaxPower.setMinimum(0)
self.MaxPower.setSingleStep(5)
self.MaxPower.setFixedWidth(60)
self.MaxPower.setValue(int(SettingsIn['maxPowerToMove']))
self.ShowReferenceCreator = QCheckBox()
self.ShowReferenceCreator.setToolTip('Show the "Create Reference" button in the main window')
self.ShowReferenceCreator.setChecked(int(SettingsIn.get('showReferenceCreator', '0')) == 1)
SetButton = QPushButton()
SetButton.setToolTip('Use the current settings')
SetButton.setText('Set')
SetButton.setFixedWidth(80)
SetButton.clicked.connect(self.__Close)
CancelButton = QPushButton()
CancelButton.setToolTip('Cancel')
CancelButton.setText('Cancel')
CancelButton.setFixedWidth(80)
CancelButton.clicked.connect(self.Abort)
#-----Layouts-----
hlayout1 = QHBoxLayout()
hlayout2 = QHBoxLayout()
glayout1 = QGridLayout()
glayout2 = QGridLayout()
vlayout3 = QVBoxLayout()
glayout1.addWidget(QLabel('Upgrade Trigger'), 1, 1)
glayout1.addWidget(self.UpgradeTrigger, 1, 3)
glayout1.addWidget(QLabel('Upgrade Mode'), 3, 1)
glayout1.addWidget(self.UpgradeMode, 3, 3)
UpgradeFrame.setLayout(glayout1)
space = QSpacerItem(1, 1, QSizePolicy.Fixed, QSizePolicy.Expanding)
glayout2.addWidget(QLabel('Min Power to Move'), 1, 1)
glayout2.addWidget(self.MinPower, 1, 3)
glayout2.addWidget(QLabel('Max Power to Move'), 3, 1)
glayout2.addWidget(self.MaxPower, 3, 3)
SpeedFrame.setLayout(glayout2)
hlayout1.addWidget(UpgradeFrame)
hlayout1.addWidget(SpeedFrame)
hlayoutRefCreator = QHBoxLayout()
hlayoutRefCreator.addWidget(QLabel('Show Reference Creator:'))
hlayoutRefCreator.addWidget(self.ShowReferenceCreator)
hlayoutRefCreator.addStretch(1)
hlayout2.addStretch(1)
hlayout2.addWidget(SetButton)
hlayout2.addWidget(CancelButton)
vlayout3.addLayout(hlayout1)
vlayout3.addLayout(hlayoutRefCreator)
vlayout3.addStretch(1)
vlayout3.addWidget(QHLine())
vlayout3.addLayout(hlayout2)
self.setLayout(vlayout3)
def getSettings(self):
out = {'upgradeTrigger': str(self.UpgradeTrigger.currentText()).lower(),
'upgradeMode': str(self.UpgradeMode.currentText()).lower(),
'minPowerToMove': str(self.MinPower.value()),
'maxPowerToMove': str(self.MaxPower.value()),
'showReferenceCreator': '1' if self.ShowReferenceCreator.isChecked() else '0'}
return(out)
#==============================================================================
# Input Parameters: none
# Output Returns: none
#
# Description: This function closes the window and emits 'Abort' when the 'x'
# is pressed.
#==============================================================================
def closeEvent(self, event):
if(self.__UserAbort):
self.Closing.emit('Abort')
event.accept()
#==============================================================================
# Input Parameters: none
# Output Returns: none
#
# Description: This function closes the window and sets the user abort to false
#==============================================================================
def Abort(self):
#Close the application
self.__UserAbort = False
self.Closing.emit('Abort')
self.close()
#==============================================================================
# Input Parameters: none
# Output Returns: none
#
# Description: This function closes the window and sets the user abort to false
#==============================================================================
def __Close(self):
#Close the application
self.__UserAbort = False
self.Closing.emit('Closed')
self.close()