mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-04-16 18:59:39 +08:00
91 lines
3.0 KiB
Python
91 lines
3.0 KiB
Python
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"]))
|
|
|