WIP: Add first-start machine actions

This commit is contained in:
Lipu Fei 2019-03-19 12:08:42 +01:00
parent d4c0104bc2
commit 8d68db9ff0
16 changed files with 288 additions and 1559 deletions

View File

@ -753,8 +753,6 @@ class CuraApplication(QtApplication):
# Initialize setting visibility presets model.
self._setting_visibility_presets_model = SettingVisibilityPresetsModel(self.getPreferences(), parent = self)
self._first_start_machine_actions_model.initialize()
# Initialize Cura API
self._cura_API.initialize()

View File

@ -1,52 +1,54 @@
# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from typing import Optional
from PyQt5.QtCore import QObject, Qt
from UM.Qt.ListModel import ListModel
#
# This model holds all first-start machine actions for the currently active machine. It has 2 roles:
# - title : the title/name of the action
# - content : the QObject of the QML content of the action
#
class FirstStartMachineActionsModel(ListModel):
TitleRole = Qt.UserRole + 1
ContentRole = Qt.UserRole + 2
def __init__(self, parent: Optional[QObject] = None) -> None:
super().__init__(parent)
self.addRoleName(self.TitleRole, "title")
self.addRoleName(self.ContentRole, "content")
from cura.CuraApplication import CuraApplication
self._application = CuraApplication.getInstance()
def initialize(self) -> None:
self._application.getMachineManager().globalContainerChanged.connect(self._update)
self._update()
def _update(self) -> None:
global_stack = self._application.getMachineManager().activeMachine
if global_stack is None:
self.setItems([])
return
definition_id = global_stack.definition.getId()
first_start_actions = self._application.getMachineActionManager().getFirstStartActions(definition_id)
item_list = []
for item in first_start_actions:
item_list.append({"title": item.label,
"content": item.displayItem,
})
self.setItems(item_list)
__all__ = ["FirstStartMachineActionsModel"]
# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from typing import Optional
from PyQt5.QtCore import QObject, Qt
from UM.Qt.ListModel import ListModel
#
# This model holds all first-start machine actions for the currently active machine. It has 2 roles:
# - title : the title/name of the action
# - content : the QObject of the QML content of the action
#
class FirstStartMachineActionsModel(ListModel):
TitleRole = Qt.UserRole + 1
ContentRole = Qt.UserRole + 2
def __init__(self, parent: Optional[QObject] = None) -> None:
super().__init__(parent)
self.addRoleName(self.TitleRole, "title")
self.addRoleName(self.ContentRole, "content")
from cura.CuraApplication import CuraApplication
self._application = CuraApplication.getInstance()
self._application.initializationFinished.connect(self._initialize)
def _initialize(self) -> None:
self._application.getMachineManager().globalContainerChanged.connect(self._update)
self._update()
def _update(self) -> None:
global_stack = self._application.getMachineManager().activeMachine
if global_stack is None:
self.setItems([])
return
definition_id = global_stack.definition.getId()
first_start_actions = self._application.getMachineActionManager().getFirstStartActions(definition_id)
item_list = []
for item in first_start_actions:
item_list.append({"title": item.label,
"content": item.displayItem,
})
self.setItems(item_list)
__all__ = ["FirstStartMachineActionsModel"]

View File

@ -25,10 +25,16 @@ class MachineSettingsManager(QObject):
# an extruder's compatible material diameter. This ensures that after the modification, changes can be notified
# and updated right away.
@pyqtSlot(int)
def updateMaterialForDiameter(self, extruder_position: int):
def updateMaterialForDiameter(self, extruder_position: int) -> None:
# Updates the material container to a material that matches the material diameter set for the printer
self._application.getMachineManager().updateMaterialWithVariant(str(extruder_position))
@pyqtSlot(int)
def setMachineExtruderCount(self, extruder_count: int) -> None:
# Note: this method was in this class before, but since it's quite generic and other plugins also need it
# it was moved to the machine manager instead. Now this method just calls the machine manager.
self._application.getMachineManager().setActiveMachineExtruderCount(extruder_count)
# FIXME(Lipu): Better document what this function does, especially the fuzzy gcode flavor and has_materials logic
# regarding UM2 and UM2+
# Function for the Machine Settings panel (QML) to update after the usre changes "Number of Extruders".
@ -37,7 +43,7 @@ class MachineSettingsManager(QObject):
machine_manager = self._application.getMachineManager()
material_manager = self._application.getMaterialManager()
global_stack = material_manager.activeMachine
global_stack = machine_manager.activeMachine
definition = global_stack.definition
if definition.getProperty("machine_gcode_flavor", "value") != "UltiGCode" or definition.getMetaDataEntry(

View File

@ -30,13 +30,6 @@ class WelcomePagesModel(ListModel):
def initialize(self) -> None:
from cura.CuraApplication import CuraApplication
self._pages.append({"id": "test",
"page_url": QUrl.fromLocalFile(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles,
os.path.join("WelcomePages",
"TestContent.qml"))),
})
# Add default welcome pages
self._pages.append({"id": "welcome",
"page_url": QUrl.fromLocalFile(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles,
@ -68,6 +61,11 @@ class WelcomePagesModel(ListModel):
os.path.join("WelcomePages",
"AddPrinterByIpContent.qml"))),
})
self._pages.append({"id": "machine_actions",
"page_url": QUrl.fromLocalFile(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles,
os.path.join("WelcomePages",
"FirstStartMachineActionsContent.qml"))),
})
self._pages.append({"id": "cloud",
"page_url": QUrl.fromLocalFile(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles,
os.path.join("WelcomePages",

File diff suppressed because it is too large Load Diff

View File

@ -7,13 +7,10 @@ import QtQuick.Controls 2.3
import UM 1.3 as UM
import Cura 1.1 as Cura
import "../MachineSettings"
//
// This component contains the content for the "Welcome" page of the welcome on-boarding process.
//
Item
{
id: base
@ -68,7 +65,7 @@ Item
renderType: Text.NativeRendering
}
NumericTextFieldWithUnit // "Nozzle size"
Cura.NumericTextFieldWithUnit // "Nozzle size"
{
id: extruderNozzleSizeField
visible: !Cura.MachineManager.hasVariants
@ -83,7 +80,7 @@ Item
forceUpdateOnChangeFunction: forceUpdateFunction
}
NumericTextFieldWithUnit // "Compatible material diameter"
Cura.NumericTextFieldWithUnit // "Compatible material diameter"
{
id: extruderCompatibleMaterialDiameterField
containerStackId: base.extruderStackId
@ -99,7 +96,7 @@ Item
afterOnEditingFinishedFunction: updateMaterialDiameter
}
NumericTextFieldWithUnit // "Nozzle offset X"
Cura.NumericTextFieldWithUnit // "Nozzle offset X"
{
id: extruderNozzleOffsetXField
containerStackId: base.extruderStackId
@ -113,7 +110,7 @@ Item
forceUpdateOnChangeFunction: forceUpdateFunction
}
NumericTextFieldWithUnit // "Nozzle offset Y"
Cura.NumericTextFieldWithUnit // "Nozzle offset Y"
{
id: extruderNozzleOffsetYField
containerStackId: base.extruderStackId
@ -127,7 +124,7 @@ Item
forceUpdateOnChangeFunction: forceUpdateFunction
}
NumericTextFieldWithUnit // "Cooling Fan Number"
Cura.NumericTextFieldWithUnit // "Cooling Fan Number"
{
id: extruderNozzleCoolingFanNumberField
containerStackId: base.extruderStackId
@ -152,7 +149,7 @@ Item
anchors.right: parent.right
anchors.margins: UM.Theme.getSize("default_margin").width
GcodeTextArea // "Extruder Start G-code"
Cura.GcodeTextArea // "Extruder Start G-code"
{
anchors.top: parent.top
anchors.bottom: parent.bottom
@ -166,7 +163,7 @@ Item
settingStoreIndex: propertyStoreIndex
}
GcodeTextArea // "Extruder End G-code"
Cura.GcodeTextArea // "Extruder End G-code"
{
anchors.top: parent.top
anchors.bottom: parent.bottom

View File

@ -7,8 +7,6 @@ import QtQuick.Controls 2.3
import UM 1.3 as UM
import Cura 1.1 as Cura
import "../MachineSettings"
//
// This the content in the "Printer" tab in the Machine Settings dialog.
@ -62,7 +60,7 @@ Item
renderType: Text.NativeRendering
}
NumericTextFieldWithUnit // "X (Width)"
Cura.NumericTextFieldWithUnit // "X (Width)"
{
id: machineXWidthField
containerStackId: machineStackId
@ -76,7 +74,7 @@ Item
forceUpdateOnChangeFunction: forceUpdateFunction
}
NumericTextFieldWithUnit // "Y (Depth)"
Cura.NumericTextFieldWithUnit // "Y (Depth)"
{
id: machineYDepthField
containerStackId: machineStackId
@ -90,7 +88,7 @@ Item
forceUpdateOnChangeFunction: forceUpdateFunction
}
NumericTextFieldWithUnit // "Z (Height)"
Cura.NumericTextFieldWithUnit // "Z (Height)"
{
id: machineZHeightField
containerStackId: machineStackId
@ -104,7 +102,7 @@ Item
forceUpdateOnChangeFunction: forceUpdateFunction
}
ComboBoxWithOptions // "Build plate shape"
Cura.ComboBoxWithOptions // "Build plate shape"
{
id: buildPlateShapeComboBox
containerStackId: machineStackId
@ -117,7 +115,7 @@ Item
forceUpdateOnChangeFunction: forceUpdateFunction
}
SimpleCheckBox // "Origin at center"
Cura.SimpleCheckBox // "Origin at center"
{
id: originAtCenterCheckBox
containerStackId: machineStackId
@ -129,7 +127,7 @@ Item
forceUpdateOnChangeFunction: forceUpdateFunction
}
SimpleCheckBox // "Heated bed"
Cura.SimpleCheckBox // "Heated bed"
{
id: heatedBedCheckBox
containerStackId: machineStackId
@ -141,7 +139,7 @@ Item
forceUpdateOnChangeFunction: forceUpdateFunction
}
ComboBoxWithOptions // "G-code flavor"
Cura.ComboBoxWithOptions // "G-code flavor"
{
id: gcodeFlavorComboBox
containerStackId: machineStackId
@ -177,7 +175,7 @@ Item
renderType: Text.NativeRendering
}
PrintHeadMinMaxTextField // "X min"
Cura.PrintHeadMinMaxTextField // "X min"
{
id: machineXMinField
@ -195,7 +193,7 @@ Item
forceUpdateOnChangeFunction: forceUpdateFunction
}
PrintHeadMinMaxTextField // "Y min"
Cura.PrintHeadMinMaxTextField // "Y min"
{
id: machineYMinField
@ -213,7 +211,7 @@ Item
forceUpdateOnChangeFunction: forceUpdateFunction
}
PrintHeadMinMaxTextField // "X max"
Cura.PrintHeadMinMaxTextField // "X max"
{
id: machineXMaxField
@ -231,7 +229,7 @@ Item
forceUpdateOnChangeFunction: forceUpdateFunction
}
PrintHeadMinMaxTextField // "Y max"
Cura.PrintHeadMinMaxTextField // "Y max"
{
id: machineYMaxField
@ -251,7 +249,7 @@ Item
forceUpdateOnChangeFunction: forceUpdateFunction
}
NumericTextFieldWithUnit // "Gantry Height"
Cura.NumericTextFieldWithUnit // "Gantry Height"
{
id: machineGantryHeightField
containerStackId: machineStackId
@ -265,7 +263,7 @@ Item
forceUpdateOnChangeFunction: forceUpdateFunction
}
ComboBoxWithOptions // "Number of Extruders"
Cura.ComboBoxWithOptions // "Number of Extruders"
{
id: numberOfExtrudersComboBox
containerStackId: machineStackId
@ -280,6 +278,7 @@ Item
// This has something to do with UM2 and UM2+ regarding "has_material" and the gcode flavor settings.
// I don't remember exactly what.
afterOnEditingFinishedFunction: CuraApplication.getMachineSettingsManager().updateHasMaterialsMetadata
setValueFunction: CuraApplication.getMachineSettingsManager().setMachineExtruderCount
optionModel: ListModel
{
@ -289,7 +288,10 @@ Item
extruderCountModel.clear()
for (var i = 1; i <= Cura.MachineManager.activeMachine.maxExtruderCount; i++)
{
extruderCountModel.append({text: String(i), value: i})
// Use String as value. JavaScript only has Number. PropertyProvider.setPropertyValue()
// takes a QVariant as value, and Number gets translated into a float. This will cause problem
// for integer settings such as "Number of Extruders".
extruderCountModel.append({ text: String(i), value: String(i) })
}
}
}
@ -306,7 +308,7 @@ Item
anchors.right: parent.right
anchors.margins: UM.Theme.getSize("default_margin").width
GcodeTextArea // "Start G-code"
Cura.GcodeTextArea // "Start G-code"
{
anchors.top: parent.top
anchors.bottom: parent.bottom
@ -320,7 +322,7 @@ Item
settingStoreIndex: propertyStoreIndex
}
GcodeTextArea // "End G-code"
Cura.GcodeTextArea // "End G-code"
{
anchors.top: parent.top
anchors.bottom: parent.bottom

View File

@ -41,6 +41,7 @@ UM.TooltipArea
// callback functions
property var forceUpdateOnChangeFunction: dummy_func
property var afterOnEditingFinishedFunction: dummy_func
property var setValueFunction: null
// a dummy function for default property values
function dummy_func() {}
@ -76,7 +77,7 @@ UM.TooltipArea
for (var i = 0; i < options.length; i++)
{
var option = options[i].substring(1, options[i].length - 1).split("', '")
append({text: option[1], value: option[0]})
append({ text: option[1], value: option[0] })
}
}
}
@ -118,9 +119,17 @@ UM.TooltipArea
onActivated:
{
if (propertyProvider.properties.value != model.get(index).value)
var newValue = model.get(index).value
if (propertyProvider.properties.value != newValue)
{
propertyProvider.setPropertyValue("value", model.get(index).value)
if (setValueFunction !== null)
{
setValueFunction(newValue)
}
else
{
propertyProvider.setPropertyValue("value", newValue)
}
forceUpdateOnChangeFunction()
afterOnEditingFinishedFunction()
}

View File

@ -1,55 +0,0 @@
import QtQuick 2.10
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.3
Item
{
id: base
anchors.fill: parent
TabBar
{
id: bar
width: parent.width
TabButton
{
text: "Printer"
}
Repeater
{
id: extrudersTabsRepeater
model: ["Extruder 1", "Extruder 2", "Extruder 3"]
TabButton
{
text: modelData
}
}
}
StackLayout
{
width: parent.width
currentIndex: bar.currentIndex
Item
{
id: printerTab
}
Repeater
{
model: ["Extruder 1", "Extruder 2", "Extruder 3"]
Item
{
anchors.centerIn: parent
Label // TODO: this is a dummy
{
anchors.centerIn: parent
text: modelData
}
}
}
}
}

View File

@ -1,120 +0,0 @@
// Copyright (c) 2019 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.10
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.3
import UM 1.3 as UM
import Cura 1.1 as Cura
//
// TextField for editing polygon data in the Machine Settings dialog.
//
UM.TooltipArea
{
UM.I18nCatalog { id: catalog; name: "cura"; }
height: textField.height
width: textField.width
text: tooltip
property alias containerStackId: propertyProvider.containerStackId
property alias settingKey: propertyProvider.key
property alias settingStoreIndex: propertyProvider.storeIndex
property alias labelText: fieldLabel.text
property alias labelWidth: fieldLabel.width
property string unitText: catalog.i18nc("@label", "mm")
// callback functions
property var forceUpdateOnChangeFunction: dummy_func
// a dummy function for default property values
function dummy_func() {}
property var printHeadPolygon:
{
"x": {
"min": 0,
"max": 0,
},
"y": {
"min": 0,
"max": 0,
},
}
UM.SettingPropertyProvider
{
id: propertyProvider
watchedProperties: [ "value" ]
}
Row
{
spacing: UM.Theme.getSize("default_margin").width
Label
{
id: fieldLabel
anchors.verticalCenter: textFieldWithUnit.verticalCenter
visible: text != ""
elide: Text.ElideRight
//width: Math.max(0, settingsTabs.labelColumnWidth)
}
Item
{
id: textFieldWithUnit
width: textField.width
height: textField.height
TextField
{
id: textField
text:
{
var polygon = JSON.parse(propertyProvider.properties.value)
var item = (axis == "x") ? 0 : 1
var result = polygon[0][item]
for (var i = 1; i < polygon.length; i++) {
result = (side == "min")
? Math.min(result, polygon[i][item])
: Math.max(result, polygon[i][item])
}
result = Math.abs(result)
printHeadPolygon[axis][side] = result
return result
}
validator: RegExpValidator { regExp: /[0-9\.,]{0,6}/ }
onEditingFinished:
{
printHeadPolygon[axis][side] = parseFloat(textField.text.replace(',','.'))
var polygon = [
[-printHeadPolygon["x"]["min"], printHeadPolygon["y"]["max"]],
[-printHeadPolygon["x"]["min"], -printHeadPolygon["y"]["min"]],
[ printHeadPolygon["x"]["max"], printHeadPolygon["y"]["max"]],
[ printHeadPolygon["x"]["max"], -printHeadPolygon["y"]["min"]]
]
var polygon_string = JSON.stringify(polygon)
if (polygon_string != propertyProvider.properties.value)
{
propertyProvider.setPropertyValue("value", polygon_string)
forceUpdateOnChangeFunction()
}
}
}
Label
{
id: unitLabel
text: unitText
anchors.right: textField.right
anchors.rightMargin: y - textField.y
anchors.verticalCenter: textField.verticalCenter
}
}
}
}

View File

@ -1,272 +0,0 @@
import QtQuick 2.10
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.3
Column
{
spacing: UM.Theme.getSize("default_margin").height
Row
{
width: parent.width
spacing: UM.Theme.getSize("default_margin").height
Column
{
width: settingsTabs.columnWidth
spacing: UM.Theme.getSize("default_lining").height
Label
{
text: catalog.i18nc("@label", "Printer Settings")
font.bold: true
renderType: Text.NativeRendering
}
Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height }
Loader
{
id: buildAreaWidthField
sourceComponent: numericTextFieldWithUnit
property string settingKey: "machine_width"
property string label: catalog.i18nc("@label", "X (Width)")
property string unit: catalog.i18nc("@label", "mm")
property bool forceUpdateOnChange: true
}
Loader
{
id: buildAreaDepthField
sourceComponent: numericTextFieldWithUnit
property string settingKey: "machine_depth"
property string label: catalog.i18nc("@label", "Y (Depth)")
property string unit: catalog.i18nc("@label", "mm")
property bool forceUpdateOnChange: true
}
Loader
{
id: buildAreaHeightField
sourceComponent: numericTextFieldWithUnit
property string settingKey: "machine_height"
property string label: catalog.i18nc("@label", "Z (Height)")
property string unit: catalog.i18nc("@label", "mm")
property bool forceUpdateOnChange: true
}
Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height }
Loader
{
id: shapeComboBox
sourceComponent: comboBoxWithOptions
property string settingKey: "machine_shape"
property string label: catalog.i18nc("@label", "Build plate shape")
property bool forceUpdateOnChange: true
}
Loader
{
id: centerIsZeroCheckBox
sourceComponent: simpleCheckBox
property string settingKey: "machine_center_is_zero"
property string label: catalog.i18nc("@option:check", "Origin at center")
property bool forceUpdateOnChange: true
}
Loader
{
id: heatedBedCheckBox
sourceComponent: simpleCheckBox
property var settingKey: "machine_heated_bed"
property string label: catalog.i18nc("@option:check", "Heated bed")
property bool forceUpdateOnChange: true
}
Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height }
Loader
{
id: gcodeFlavorComboBox
sourceComponent: comboBoxWithOptions
property string settingKey: "machine_gcode_flavor"
property string label: catalog.i18nc("@label", "G-code flavor")
property bool forceUpdateOnChange: true
property var afterOnActivate: manager.updateHasMaterialsMetadata
}
}
Column
{
width: settingsTabs.columnWidth
spacing: UM.Theme.getSize("default_lining").height
Label
{
text: catalog.i18nc("@label", "Printhead Settings")
font.bold: true
renderType: Text.NativeRendering
}
Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height }
Loader
{
id: printheadXMinField
sourceComponent: headPolygonTextField
property string label: catalog.i18nc("@label", "X min")
property string tooltip: catalog.i18nc("@tooltip", "Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".")
property string axis: "x"
property string side: "min"
}
Loader
{
id: printheadYMinField
sourceComponent: headPolygonTextField
property string label: catalog.i18nc("@label", "Y min")
property string tooltip: catalog.i18nc("@tooltip", "Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".")
property string axis: "y"
property string side: "min"
}
Loader
{
id: printheadXMaxField
sourceComponent: headPolygonTextField
property string label: catalog.i18nc("@label", "X max")
property string tooltip: catalog.i18nc("@tooltip", "Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".")
property string axis: "x"
property string side: "max"
}
Loader
{
id: printheadYMaxField
sourceComponent: headPolygonTextField
property string label: catalog.i18nc("@label", "Y max")
property string tooltip: catalog.i18nc("@tooltip", "Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".")
property string axis: "y"
property string side: "max"
}
Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height }
Loader
{
id: gantryHeightField
sourceComponent: numericTextFieldWithUnit
property string settingKey: "gantry_height"
property string label: catalog.i18nc("@label", "Gantry height")
property string unit: catalog.i18nc("@label", "mm")
property string tooltip: catalog.i18nc("@tooltip", "The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions between previous prints and the gantry when printing \"One at a Time\".")
property bool forceUpdateOnChange: true
}
Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height }
UM.TooltipArea
{
height: childrenRect.height
width: childrenRect.width
text: machineExtruderCountProvider.properties.description
visible: extruderCountModel.count >= 2
Row
{
spacing: UM.Theme.getSize("default_margin").width
Label
{
anchors.verticalCenter: extruderCountComboBox.verticalCenter
width: Math.max(0, settingsTabs.labelColumnWidth)
text: catalog.i18nc("@label", "Number of Extruders")
elide: Text.ElideRight
renderType: Text.NativeRendering
}
ComboBox
{
id: extruderCountComboBox
model: ListModel
{
id: extruderCountModel
Component.onCompleted:
{
for(var i = 0; i < manager.definedExtruderCount; i++)
{
extruderCountModel.append({text: String(i + 1), value: i})
}
}
}
Connections
{
target: manager
onDefinedExtruderCountChanged:
{
extruderCountModel.clear();
for(var i = 0; i < manager.definedExtruderCount; ++i)
{
extruderCountModel.append({text: String(i + 1), value: i});
}
}
}
currentIndex: machineExtruderCountProvider.properties.value - 1
onActivated:
{
manager.setMachineExtruderCount(index + 1);
}
}
}
}
}
}
Row
{
spacing: UM.Theme.getSize("default_margin").width
anchors.left: parent.left
anchors.right: parent.right
height: parent.height - y
Column
{
height: parent.height
width: settingsTabs.columnWidth
Label
{
text: catalog.i18nc("@label", "Start G-code")
font.bold: true
}
Loader
{
id: machineStartGcodeField
sourceComponent: gcodeTextArea
property int areaWidth: parent.width
property int areaHeight: parent.height - y
property string settingKey: "machine_start_gcode"
property string tooltip: catalog.i18nc("@tooltip", "G-code commands to be executed at the very start.")
}
}
Column {
height: parent.height
width: settingsTabs.columnWidth
Label
{
text: catalog.i18nc("@label", "End G-code")
font.bold: true
}
Loader
{
id: machineEndGcodeField
sourceComponent: gcodeTextArea
property int areaWidth: parent.width
property int areaHeight: parent.height - y
property string settingKey: "machine_end_gcode"
property string tooltip: catalog.i18nc("@tooltip", "G-code commands to be executed at the very end.")
}
}
}
}

View File

@ -137,18 +137,18 @@ Item
// Create a network printer
const networkPrinterItem = addNetworkPrinterDropDown.contentItem.currentItem
CuraApplication.getDiscoveredPrintersModel().createMachineFromDiscoveredPrinter(networkPrinterItem)
// If we have created a machine, go to the last page, which is the "cloud" page.
base.gotoPage("cloud")
}
else
{
// Create a local printer
const localPrinterItem = addLocalPrinterDropDown.contentItem.currentItem
Cura.MachineManager.addMachine(localPrinterItem.id)
base.gotoPage("machine_actions")
}
// TODO: implement machine actions
// If we have created a machine, go to the last page, which is the "cloud" page.
base.gotoPage("cloud")
}
}
}

View File

@ -0,0 +1,91 @@
// Copyright (c) 2019 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.10
import QtQuick.Controls 2.3
import UM 1.3 as UM
import Cura 1.1 as Cura
//
// This component contains the content for the "What's new in Ultimaker Cura" page of the welcome on-boarding process.
//
Item
{
UM.I18nCatalog { id: catalog; name: "cura" }
property var machineActionsModel: CuraApplication.getFirstStartMachineActionsModel()
property int currentActionIndex: 0
property var currentActionItem: currentActionIndex >= machineActionsModel.count
? null : machineActionsModel.getItem(currentActionIndex)
property bool hasActions: machineActionsModel.count > 0
// Reset to the first page if the model gets changed.
Connections
{
target: machineActionsModel
onItemsChanged: currentActionIndex = 0
}
onVisibleChanged:
{
if (visible)
{
currentActionIndex = 0
if (!hasActions)
{
base.showNextPage()
}
}
}
Label
{
id: titleLabel
anchors.top: parent.top
anchors.topMargin: 40
anchors.horizontalCenter: parent.horizontalCenter
horizontalAlignment: Text.AlignHCenter
text: currentActionItem.title
color: UM.Theme.getColor("primary_button")
font: UM.Theme.getFont("large_bold")
renderType: Text.NativeRendering
}
Item
{
anchors.top: titleLabel.bottom
anchors.bottom: nextButton.top
anchors.topMargin: UM.Theme.getSize("default_margin").height
anchors.bottomMargin: UM.Theme.getSize("default_margin").height
anchors.left: parent.left
anchors.right: parent.right
data: currentActionItem == undefined ? null : currentActionItem.content
}
Cura.PrimaryButton
{
id: nextButton
anchors.right: parent.right
anchors.bottom: parent.bottom
anchors.margins: 40
text: catalog.i18nc("@button", "Next")
width: 140
fixedWidthMode: true
onClicked:
{
// If no more first-start actions to show, go to the next page.
if (currentActionIndex + 1 >= machineActionsModel.count)
{
currentActionIndex = 0
base.showNextPage()
return
}
currentActionIndex++
}
}
}

View File

@ -67,7 +67,7 @@ Item
break
}
}
if (page_index > 0)
if (page_index >= 0)
{
currentStep = page_index
}

View File

@ -1,107 +0,0 @@
// Copyright (c) 2019 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.10
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.3
import UM 1.3 as UM
import Cura 1.1 as Cura
import "../MachineSettings"
import "../Widgets"
//
// This component contains the content for the "Welcome" page of the welcome on-boarding process.
//
Item
{
id: base
UM.I18nCatalog { id: catalog; name: "cura" }
anchors.fill: parent
anchors.margins: UM.Theme.getSize("default_margin").width
property var extrudersModel: Cura.ExtrudersModel {}
// If we create a CuraTabButton for "Printer" and use Repeater for extruders, for some reason, once the component
// finishes it will automatically change "currentIndex = 1", and it is VERY difficult to change "currentIndex = 0"
// after that. Using a model and a Repeater to create both "Printer" and extruder CuraTabButtons seem to solve this
// problem.
Connections
{
target: extrudersModel
onItemsChanged: tabNameModel.update()
}
ListModel
{
id: tabNameModel
Component.onCompleted: update()
function update()
{
clear()
append({ name: catalog.i18nc("@title:tab", "Printer") })
for (var i = 0; i < extrudersModel.count; i++)
{
const m = extrudersModel.getItem(i)
append({ name: m.name })
}
}
}
Rectangle
{
anchors.fill: parent
border.color: tabBar.visible ? UM.Theme.getColor("lining") : "transparent"
border.width: UM.Theme.getSize("default_lining").width
radius: UM.Theme.getSize("default_radius").width
UM.TabRow
{
id: tabBar
width: parent.width
Repeater
{
model: tabNameModel
delegate: CuraTabButton
{
text: model.name
}
}
}
StackLayout
{
id: tabStack
anchors.top: tabBar.bottom
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
width: parent.width
currentIndex: tabBar.currentIndex
MachineSettingsPrinterTab
{
id: printerTab
}
Repeater
{
model: extrudersModel
delegate: MachineSettingsExtruderTab
{
id: discoverTab
extruderPosition: model.index
extruderStackId: model.id
}
}
}
}
}

View File

@ -17,3 +17,20 @@ SettingView 1.0 SettingView.qml
ProfileMenu 1.0 ProfileMenu.qml
CheckBoxWithTooltip 1.0 CheckBoxWithTooltip.qml
ToolTip 1.0 ToolTip.qml
# Cura/Widgets
CuraCheckBox 1.0 CuraCheckBox.qml
CuraComboBox 1.0 CuraComboBox.qml
CuraProgressBar 1.0 CuraProgressBar.qml
CuraTabButton 1.0 CuraTabButton.qml
# Cura/MachineSettings
ComboBoxWithOptions 1.0 ComboBoxWithOptions.qml
GcodeTextArea 1.0 GcodeTextArea.qml
NumericTextFieldWithUnit 1.0 NumericTextFieldWithUnit.qml
PrintHeadMinMaxTextField 1.0 PrintHeadMinMaxTextField.qml
SimpleCheckBox 1.0 SimpleCheckBox.qml