mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-08-14 16:05:56 +08:00
Merge branch '2.3' of github.com:Ultimaker/Cura into 2.3
This commit is contained in:
commit
fcf3caba5a
@ -554,6 +554,7 @@ class CuraApplication(QtApplication):
|
|||||||
qmlRegisterType(cura.Settings.UserProfilesModel, "Cura", 1, 0, "UserProfilesModel")
|
qmlRegisterType(cura.Settings.UserProfilesModel, "Cura", 1, 0, "UserProfilesModel")
|
||||||
qmlRegisterType(cura.Settings.MaterialSettingsVisibilityHandler, "Cura", 1, 0, "MaterialSettingsVisibilityHandler")
|
qmlRegisterType(cura.Settings.MaterialSettingsVisibilityHandler, "Cura", 1, 0, "MaterialSettingsVisibilityHandler")
|
||||||
qmlRegisterType(cura.Settings.QualitySettingsModel, "Cura", 1, 0, "QualitySettingsModel")
|
qmlRegisterType(cura.Settings.QualitySettingsModel, "Cura", 1, 0, "QualitySettingsModel")
|
||||||
|
qmlRegisterType(cura.Settings.MachineNameValidator, "Cura", 1, 0, "MachineNameValidator")
|
||||||
|
|
||||||
qmlRegisterSingletonType(cura.Settings.ContainerManager, "Cura", 1, 0, "ContainerManager", cura.Settings.ContainerManager.createContainerManager)
|
qmlRegisterSingletonType(cura.Settings.ContainerManager, "Cura", 1, 0, "ContainerManager", cura.Settings.ContainerManager.createContainerManager)
|
||||||
|
|
||||||
|
69
cura/Settings/MachineNameValidator.py
Normal file
69
cura/Settings/MachineNameValidator.py
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
# Copyright (c) 2016 Ultimaker B.V.
|
||||||
|
# Cura is released under the terms of the AGPLv3 or higher.
|
||||||
|
|
||||||
|
from PyQt5.QtCore import pyqtSlot, pyqtProperty, QObject, pyqtSignal, QRegExp
|
||||||
|
from PyQt5.QtGui import QValidator
|
||||||
|
import os #For statvfs.
|
||||||
|
import urllib #To escape machine names for how they're saved to file.
|
||||||
|
|
||||||
|
import UM.Resources
|
||||||
|
import UM.Settings.ContainerRegistry
|
||||||
|
import UM.Settings.InstanceContainer
|
||||||
|
|
||||||
|
## Are machine names valid?
|
||||||
|
#
|
||||||
|
# Performs checks based on the length of the name.
|
||||||
|
class MachineNameValidator(QObject):
|
||||||
|
def __init__(self, parent = None):
|
||||||
|
super().__init__(parent)
|
||||||
|
|
||||||
|
#Compute the validation regex for printer names. This is limited by the maximum file name length.
|
||||||
|
try:
|
||||||
|
filename_max_length = os.statvfs(UM.Resources.getDataStoragePath()).f_namemax
|
||||||
|
except AttributeError: #Doesn't support statvfs. Probably because it's not a Unix system.
|
||||||
|
filename_max_length = 255 #Assume it's Windows on NTFS.
|
||||||
|
machine_name_max_length = filename_max_length - len("_current_settings.") - len(UM.Settings.ContainerRegistry.getMimeTypeForContainer(UM.Settings.InstanceContainer).preferredSuffix)
|
||||||
|
# Characters that urllib.parse.quote_plus escapes count for 12! So now
|
||||||
|
# we must devise a regex that allows only 12 normal characters or 1
|
||||||
|
# special character, and that up to [machine_name_max_length / 12] times.
|
||||||
|
maximum_special_characters = int(machine_name_max_length / 12)
|
||||||
|
unescaped = r"[a-zA-Z0-9_\-\.\/]"
|
||||||
|
self.machine_name_regex = r"((" + unescaped + "){0,12}|.){0," + str(maximum_special_characters) + r"}"
|
||||||
|
|
||||||
|
validationChanged = pyqtSignal()
|
||||||
|
|
||||||
|
## Check if a specified machine name is allowed.
|
||||||
|
#
|
||||||
|
# \param name The machine name to check.
|
||||||
|
# \param position The current position of the cursor in the text box.
|
||||||
|
# \return ``QValidator.Invalid`` if it's disallowed, or
|
||||||
|
# ``QValidator.Acceptable`` if it's allowed.
|
||||||
|
def validate(self, name, position):
|
||||||
|
#Check for file name length of the current settings container (which is the longest file we're saving with the name).
|
||||||
|
try:
|
||||||
|
filename_max_length = os.statvfs(UM.Resources.getDataStoragePath()).f_namemax
|
||||||
|
except AttributeError: #Doesn't support statvfs. Probably because it's not a Unix system.
|
||||||
|
filename_max_length = 255 #Assume it's Windows on NTFS.
|
||||||
|
escaped_name = urllib.parse.quote_plus(name)
|
||||||
|
current_settings_filename = escaped_name + "_current_settings." + UM.Settings.ContainerRegistry.getMimeTypeForContainer(UM.Settings.InstanceContainer).preferredSuffix
|
||||||
|
if len(current_settings_filename) > filename_max_length:
|
||||||
|
return QValidator.Invalid
|
||||||
|
|
||||||
|
return QValidator.Acceptable #All checks succeeded.
|
||||||
|
|
||||||
|
## Updates the validation state of a machine name text field.
|
||||||
|
@pyqtSlot(str)
|
||||||
|
def updateValidation(self, new_name):
|
||||||
|
is_valid = self.validate(new_name, 0)
|
||||||
|
if is_valid == QValidator.Acceptable:
|
||||||
|
print("VALID")
|
||||||
|
self.validation_regex = "^.*$" #Matches anything.
|
||||||
|
else:
|
||||||
|
print("BROKEN!")
|
||||||
|
self.validation_regex = "a^" #Never matches (unless you manage to get "a" before the start of the string... good luck).
|
||||||
|
self.validationChanged.emit()
|
||||||
|
|
||||||
|
@pyqtProperty("QRegExp", notify=validationChanged)
|
||||||
|
def machineNameRegex(self):
|
||||||
|
print(self.machine_name_regex)
|
||||||
|
return QRegExp(self.machine_name_regex)
|
@ -8,6 +8,7 @@ from .CuraContainerRegistry import CuraContainerRegistry
|
|||||||
from .ExtruderManager import ExtruderManager
|
from .ExtruderManager import ExtruderManager
|
||||||
from .ExtrudersModel import ExtrudersModel
|
from .ExtrudersModel import ExtrudersModel
|
||||||
from .MachineManager import MachineManager
|
from .MachineManager import MachineManager
|
||||||
|
from .MachineNameValidator import MachineNameValidator
|
||||||
from .MaterialSettingsVisibilityHandler import MaterialSettingsVisibilityHandler
|
from .MaterialSettingsVisibilityHandler import MaterialSettingsVisibilityHandler
|
||||||
from .SettingOverrideDecorator import SettingOverrideDecorator
|
from .SettingOverrideDecorator import SettingOverrideDecorator
|
||||||
from .QualitySettingsModel import QualitySettingsModel
|
from .QualitySettingsModel import QualitySettingsModel
|
||||||
|
@ -175,6 +175,14 @@ UM.Dialog
|
|||||||
text: getMachineName()
|
text: getMachineName()
|
||||||
implicitWidth: UM.Theme.getSize("standard_list_input").width
|
implicitWidth: UM.Theme.getSize("standard_list_input").width
|
||||||
maximumLength: 40
|
maximumLength: 40
|
||||||
|
//validator: Cura.MachineNameValidator { } //TODO: Gives a segfault in PyQt5.6. For now, we must use a signal on text changed.
|
||||||
|
validator: RegExpValidator
|
||||||
|
{
|
||||||
|
regExp: {
|
||||||
|
machineName.machine_name_validator.machineNameRegex
|
||||||
|
}
|
||||||
|
}
|
||||||
|
property var machine_name_validator: Cura.MachineNameValidator { }
|
||||||
anchors.bottom:parent.bottom
|
anchors.bottom:parent.bottom
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user