123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- import os
- import urllib.parse
- from configparser import ConfigParser
- from typing import List
- from PyQt6.QtCore import pyqtProperty, QObject, pyqtSignal
- from UM.Logger import Logger
- from UM.MimeTypeDatabase import MimeTypeDatabase
- class SettingVisibilityPreset(QObject):
- onSettingsChanged = pyqtSignal()
- onNameChanged = pyqtSignal()
- onWeightChanged = pyqtSignal()
- onIdChanged = pyqtSignal()
- def __init__(self, preset_id: str = "", name: str = "", weight: int = 0, parent = None) -> None:
- super().__init__(parent)
- self._settings = [] # type: List[str]
- self._id = preset_id
- self._weight = weight
- self._name = name
- @pyqtProperty("QStringList", notify = onSettingsChanged)
- def settings(self) -> List[str]:
- return self._settings
- @pyqtProperty(str, notify = onIdChanged)
- def presetId(self) -> str:
- return self._id
- @pyqtProperty(int, notify = onWeightChanged)
- def weight(self) -> int:
- return self._weight
- @pyqtProperty(str, notify = onNameChanged)
- def name(self) -> str:
- return self._name
- def setName(self, name: str) -> None:
- if name != self._name:
- self._name = name
- self.onNameChanged.emit()
- def setId(self, id: str) -> None:
- if id != self._id:
- self._id = id
- self.onIdChanged.emit()
- def setWeight(self, weight: int) -> None:
- if weight != self._weight:
- self._weight = weight
- self.onWeightChanged.emit()
- def setSettings(self, settings: List[str]) -> None:
- if set(settings) != set(self._settings):
- self._settings = list(set(settings)) # filter out non unique
- self.onSettingsChanged.emit()
- # Load a preset from file. We expect a file that can be parsed by means of the config parser.
- # The sections indicate the categories and the parameters placed in it (which don't need values) are the settings
- # that should be considered visible.
- def loadFromFile(self, file_path: str) -> None:
- mime_type = MimeTypeDatabase.getMimeTypeForFile(file_path)
- item_id = urllib.parse.unquote_plus(mime_type.stripExtension(os.path.basename(file_path)))
- if not os.path.isfile(file_path):
- Logger.log("e", "[%s] is not a file", file_path)
- return None
- parser = ConfigParser(interpolation = None, allow_no_value = True) # Accept options without any value,
- parser.read([file_path])
- if not parser.has_option("general", "name") or not parser.has_option("general", "weight"):
- return None
- settings = [] # type: List[str]
- for section in parser.sections():
- if section == "general":
- continue
- settings.append(section)
- for option in parser[section].keys():
- settings.append(option)
- self.setSettings(settings)
- self.setId(item_id)
- self.setName(parser["general"]["name"])
- self.setWeight(int(parser["general"]["weight"]))
|