mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-10 08:17:49 -06:00
Merge branch 'master' of github.com:Ultimaker/Cura
This commit is contained in:
commit
9940bc8551
8 changed files with 179 additions and 147 deletions
|
@ -1,8 +1,11 @@
|
||||||
import collections
|
import collections
|
||||||
|
from typing import Dict, Optional
|
||||||
|
|
||||||
from UM.i18n import i18nCatalog
|
from UM.i18n import i18nCatalog
|
||||||
catalog = i18nCatalog("cura")
|
catalog = i18nCatalog("cura")
|
||||||
|
|
||||||
intent_translations = collections.OrderedDict() # type: "collections.OrderedDict[str, Dict[str, Optional[str]]]"
|
|
||||||
|
intent_translations = collections.OrderedDict() # type: collections.OrderedDict[str, Dict[str, Optional[str]]]
|
||||||
intent_translations["default"] = {
|
intent_translations["default"] = {
|
||||||
"name": catalog.i18nc("@label", "Default")
|
"name": catalog.i18nc("@label", "Default")
|
||||||
}
|
}
|
||||||
|
|
|
@ -165,8 +165,9 @@ Item
|
||||||
}
|
}
|
||||||
|
|
||||||
onHeightChanged : {
|
onHeightChanged : {
|
||||||
// After a height change, the pixel-position of the lower handle is out of sync with the property value
|
// After a height change, the pixel-position of the handles is out of sync with the property value
|
||||||
setLowerValue(lowerValue)
|
setLowerValue(lowerValue)
|
||||||
|
setUpperValue(upperValue)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Upper handle
|
// Upper handle
|
||||||
|
|
|
@ -59,13 +59,15 @@ class Toolbox(QObject, Extension):
|
||||||
# The responses as given by the server parsed to a list.
|
# The responses as given by the server parsed to a list.
|
||||||
self._server_response_data = {
|
self._server_response_data = {
|
||||||
"authors": [],
|
"authors": [],
|
||||||
"packages": []
|
"packages": [],
|
||||||
|
"updates": [],
|
||||||
} # type: Dict[str, List[Any]]
|
} # type: Dict[str, List[Any]]
|
||||||
|
|
||||||
# Models:
|
# Models:
|
||||||
self._models = {
|
self._models = {
|
||||||
"authors": AuthorsModel(self),
|
"authors": AuthorsModel(self),
|
||||||
"packages": PackagesModel(self),
|
"packages": PackagesModel(self),
|
||||||
|
"updates": PackagesModel(self),
|
||||||
} # type: Dict[str, Union[AuthorsModel, PackagesModel]]
|
} # type: Dict[str, Union[AuthorsModel, PackagesModel]]
|
||||||
|
|
||||||
self._plugins_showcase_model = PackagesModel(self)
|
self._plugins_showcase_model = PackagesModel(self)
|
||||||
|
@ -195,21 +197,27 @@ class Toolbox(QObject, Extension):
|
||||||
cloud_api_version = self._cloud_api_version,
|
cloud_api_version = self._cloud_api_version,
|
||||||
sdk_version = self._sdk_version
|
sdk_version = self._sdk_version
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# We need to construct a query like installed_packages=ID:VERSION&installed_packages=ID:VERSION, etc.
|
||||||
|
installed_package_ids_with_versions = [":".join(items) for items in
|
||||||
|
self._package_manager.getAllInstalledPackageIdsAndVersions()]
|
||||||
|
installed_packages_query = "&installed_packages=".join(installed_package_ids_with_versions)
|
||||||
|
|
||||||
self._request_urls = {
|
self._request_urls = {
|
||||||
"authors": QUrl("{base_url}/authors".format(base_url = self._api_url)),
|
"authors": QUrl("{base_url}/authors".format(base_url = self._api_url)),
|
||||||
"packages": QUrl("{base_url}/packages".format(base_url = self._api_url))
|
"packages": QUrl("{base_url}/packages".format(base_url = self._api_url)),
|
||||||
|
"updates": QUrl("{base_url}/packages/package-updates?installed_packages={query}".format(
|
||||||
|
base_url = self._api_url, query = installed_packages_query))
|
||||||
}
|
}
|
||||||
|
|
||||||
self._application.getCuraAPI().account.loginStateChanged.connect(self._restart)
|
self._application.getCuraAPI().account.loginStateChanged.connect(self._restart)
|
||||||
|
|
||||||
if CuraApplication.getInstance().getPreferences().getValue("info/automatic_update_check"):
|
# On boot we check which packages have updates.
|
||||||
|
if CuraApplication.getInstance().getPreferences().getValue("info/automatic_update_check") and len(installed_package_ids_with_versions) > 0:
|
||||||
# Request the latest and greatest!
|
# Request the latest and greatest!
|
||||||
self._fetchPackageData()
|
self._fetchPackageUpdates()
|
||||||
|
|
||||||
def _fetchPackageData(self):
|
def _prepareNetworkManager(self):
|
||||||
# Create the network manager:
|
|
||||||
# This was formerly its own function but really had no reason to be as
|
|
||||||
# it was never called more than once ever.
|
|
||||||
if self._network_manager is not None:
|
if self._network_manager is not None:
|
||||||
self._network_manager.finished.disconnect(self._onRequestFinished)
|
self._network_manager.finished.disconnect(self._onRequestFinished)
|
||||||
self._network_manager.networkAccessibleChanged.disconnect(self._onNetworkAccessibleChanged)
|
self._network_manager.networkAccessibleChanged.disconnect(self._onNetworkAccessibleChanged)
|
||||||
|
@ -217,10 +225,15 @@ class Toolbox(QObject, Extension):
|
||||||
self._network_manager.finished.connect(self._onRequestFinished)
|
self._network_manager.finished.connect(self._onRequestFinished)
|
||||||
self._network_manager.networkAccessibleChanged.connect(self._onNetworkAccessibleChanged)
|
self._network_manager.networkAccessibleChanged.connect(self._onNetworkAccessibleChanged)
|
||||||
|
|
||||||
|
def _fetchPackageUpdates(self):
|
||||||
|
self._prepareNetworkManager()
|
||||||
|
self._makeRequestByType("updates")
|
||||||
|
|
||||||
|
def _fetchPackageData(self):
|
||||||
|
self._prepareNetworkManager()
|
||||||
# Make remote requests:
|
# Make remote requests:
|
||||||
self._makeRequestByType("packages")
|
self._makeRequestByType("packages")
|
||||||
self._makeRequestByType("authors")
|
self._makeRequestByType("authors")
|
||||||
|
|
||||||
# Gather installed packages:
|
# Gather installed packages:
|
||||||
self._updateInstalledModels()
|
self._updateInstalledModels()
|
||||||
|
|
||||||
|
@ -644,6 +657,10 @@ class Toolbox(QObject, Extension):
|
||||||
elif response_type == "authors":
|
elif response_type == "authors":
|
||||||
self._models[response_type].setFilter({"package_types": "material"})
|
self._models[response_type].setFilter({"package_types": "material"})
|
||||||
self._models[response_type].setFilter({"tags": "generic"})
|
self._models[response_type].setFilter({"tags": "generic"})
|
||||||
|
elif response_type == "updates":
|
||||||
|
# Tell the package manager that there's a new set of updates available.
|
||||||
|
packages = set([pkg["package_id"] for pkg in self._server_response_data[response_type]])
|
||||||
|
self._package_manager.setPackagesWithUpdate(packages)
|
||||||
|
|
||||||
self.metadataChanged.emit()
|
self.metadataChanged.emit()
|
||||||
|
|
||||||
|
|
|
@ -72,7 +72,6 @@
|
||||||
"zyyx_pro_flex",
|
"zyyx_pro_flex",
|
||||||
"zyyx_pro_pla"
|
"zyyx_pro_pla"
|
||||||
],
|
],
|
||||||
|
|
||||||
"machine_extruder_trains":
|
"machine_extruder_trains":
|
||||||
{
|
{
|
||||||
"0": "leapfrog_bolt_pro_extruder_right",
|
"0": "leapfrog_bolt_pro_extruder_right",
|
||||||
|
@ -107,7 +106,6 @@
|
||||||
"machine_start_gcode": {"default_value": "G90\nG28 X0 Y0 Z0\nG1 Z5 F1000\nG92 E0\nG1 Y-32 F12000\nG1 E15 F1000\nG1 E45 F150\nG4 S5"},
|
"machine_start_gcode": {"default_value": "G90\nG28 X0 Y0 Z0\nG1 Z5 F1000\nG92 E0\nG1 Y-32 F12000\nG1 E15 F1000\nG1 E45 F150\nG4 S5"},
|
||||||
"machine_end_gcode": {"default_value": "G92 E0\nG1 E-3 F300\nM104 S0 T0\nM104 S0 T1\nM140 S0\nG28 X0 Y0\nM84"},
|
"machine_end_gcode": {"default_value": "G92 E0\nG1 E-3 F300\nM104 S0 T0\nM104 S0 T1\nM140 S0\nG28 X0 Y0\nM84"},
|
||||||
"prime_tower_enable": { "resolve": "extruders_enabled_count > 1"},
|
"prime_tower_enable": { "resolve": "extruders_enabled_count > 1"},
|
||||||
"prime_tower_circular": {"default_value": false},
|
|
||||||
"prime_tower_position_x": {"value": "169" },
|
"prime_tower_position_x": {"value": "169" },
|
||||||
"prime_tower_position_y": {"value": "25" },
|
"prime_tower_position_y": {"value": "25" },
|
||||||
"speed_travel": { "value": "200" },
|
"speed_travel": { "value": "200" },
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"id": "leapfrog_bolt_pro_extruder_left",
|
|
||||||
"version": 2,
|
"version": 2,
|
||||||
"name": "Left extruder",
|
"name": "Left extruder",
|
||||||
"inherits": "fdmextruder",
|
"inherits": "fdmextruder",
|
||||||
|
@ -7,7 +6,6 @@
|
||||||
"machine": "leapfrog_bolt_pro",
|
"machine": "leapfrog_bolt_pro",
|
||||||
"position": "1"
|
"position": "1"
|
||||||
},
|
},
|
||||||
|
|
||||||
"overrides": {
|
"overrides": {
|
||||||
"extruder_nr": {
|
"extruder_nr": {
|
||||||
"default_value": 1,
|
"default_value": 1,
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{
|
||||||
"id": "leapfrog_bolt_pro_extruder_right",
|
|
||||||
"version": 2,
|
"version": 2,
|
||||||
"name": "Right extruder",
|
"name": "Right extruder",
|
||||||
"inherits": "fdmextruder",
|
"inherits": "fdmextruder",
|
||||||
|
@ -7,7 +6,6 @@
|
||||||
"machine": "leapfrog_bolt_pro",
|
"machine": "leapfrog_bolt_pro",
|
||||||
"position": "0"
|
"position": "0"
|
||||||
},
|
},
|
||||||
|
|
||||||
"overrides": {
|
"overrides": {
|
||||||
"extruder_nr": {
|
"extruder_nr": {
|
||||||
"default_value": 0,
|
"default_value": 0,
|
||||||
|
|
|
@ -160,14 +160,20 @@ Item
|
||||||
enabled: model.description !== undefined
|
enabled: model.description !== undefined
|
||||||
acceptedButtons: Qt.NoButton // react to hover only, don't steal clicks
|
acceptedButtons: Qt.NoButton // react to hover only, don't steal clicks
|
||||||
|
|
||||||
onEntered:
|
Timer
|
||||||
{
|
{
|
||||||
base.showTooltip(
|
id: intentTooltipTimer
|
||||||
|
interval: 500
|
||||||
|
running: false
|
||||||
|
repeat: false
|
||||||
|
onTriggered: base.showTooltip(
|
||||||
intentCategoryLabel,
|
intentCategoryLabel,
|
||||||
Qt.point(-(intentCategoryLabel.x - qualityRow.x) - UM.Theme.getSize("thick_margin").width, 0),
|
Qt.point(-(intentCategoryLabel.x - qualityRow.x) - UM.Theme.getSize("thick_margin").width, 0),
|
||||||
model.description
|
model.description
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onEntered: intentTooltipTimer.start()
|
||||||
onExited: base.hideTooltip()
|
onExited: base.hideTooltip()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,11 +3,12 @@
|
||||||
|
|
||||||
import json # To check files for unnecessarily overridden properties.
|
import json # To check files for unnecessarily overridden properties.
|
||||||
import os
|
import os
|
||||||
import os.path
|
|
||||||
import pytest #This module contains automated tests.
|
import pytest #This module contains automated tests.
|
||||||
from typing import Any, Dict
|
from typing import Any, Dict
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
|
from unittest.mock import patch, MagicMock
|
||||||
|
|
||||||
import UM.Settings.ContainerRegistry #To create empty instance containers.
|
import UM.Settings.ContainerRegistry #To create empty instance containers.
|
||||||
import UM.Settings.ContainerStack #To set the container registry the container stacks use.
|
import UM.Settings.ContainerStack #To set the container registry the container stacks use.
|
||||||
from UM.Settings.DefinitionContainer import DefinitionContainer #To check against the class of DefinitionContainer.
|
from UM.Settings.DefinitionContainer import DefinitionContainer #To check against the class of DefinitionContainer.
|
||||||
|
@ -24,6 +25,10 @@ definition_filepaths = machine_filepaths + extruder_filepaths
|
||||||
all_meshes = os.listdir(os.path.join(os.path.dirname(__file__), "..", "..", "resources", "meshes"))
|
all_meshes = os.listdir(os.path.join(os.path.dirname(__file__), "..", "..", "resources", "meshes"))
|
||||||
all_images = os.listdir(os.path.join(os.path.dirname(__file__), "..", "..", "resources", "images"))
|
all_images = os.listdir(os.path.join(os.path.dirname(__file__), "..", "..", "resources", "images"))
|
||||||
|
|
||||||
|
# Loading definition files needs a functioning ContainerRegistry
|
||||||
|
cr = UM.Settings.ContainerRegistry.ContainerRegistry(None)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def definition_container():
|
def definition_container():
|
||||||
uid = str(uuid.uuid4())
|
uid = str(uuid.uuid4())
|
||||||
|
@ -39,8 +44,14 @@ def test_validateMachineDefinitionContainer(file_path, definition_container):
|
||||||
if file_name == "fdmprinter.def.json" or file_name == "fdmextruder.def.json":
|
if file_name == "fdmprinter.def.json" or file_name == "fdmextruder.def.json":
|
||||||
return # Stop checking, these are root files.
|
return # Stop checking, these are root files.
|
||||||
|
|
||||||
|
from UM.VersionUpgradeManager import FilesDataUpdateResult
|
||||||
|
|
||||||
|
mocked_vum = MagicMock()
|
||||||
|
mocked_vum.updateFilesData = lambda ct, v, fdl, fnl: FilesDataUpdateResult(ct, v, fdl, fnl)
|
||||||
|
with patch("UM.VersionUpgradeManager.VersionUpgradeManager.getInstance", MagicMock(return_value = mocked_vum)):
|
||||||
assertIsDefinitionValid(definition_container, file_path)
|
assertIsDefinitionValid(definition_container, file_path)
|
||||||
|
|
||||||
|
|
||||||
def assertIsDefinitionValid(definition_container, file_path):
|
def assertIsDefinitionValid(definition_container, file_path):
|
||||||
with open(file_path, encoding = "utf-8") as data:
|
with open(file_path, encoding = "utf-8") as data:
|
||||||
json = data.read()
|
json = data.read()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue