diff --git a/FilePane.qml b/FilePane.qml new file mode 100644 index 0000000000..190c42b17c --- /dev/null +++ b/FilePane.qml @@ -0,0 +1,76 @@ +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Layouts 1.1 + +import UM 1.0 as UM + +Rectangle { + id: base; + + signal requestOpenFile(); + signal openFile(url file); + + function setDirectory(file) + { + UM.Models.directoryListModel.directory = file + } + + ColumnLayout { + anchors.fill: parent; + anchors.margins: UM.Theme.defaultMargin; + + Button { text: "Open File"; iconSource: UM.Resources.getIcon("open.png"); Layout.fillWidth: true; onClicked: base.requestOpenFile(); } + + Rectangle { + Layout.fillWidth: true; + Layout.fillHeight: true; + border.width: 1; + border.color: "#aaa"; + + ScrollView { + anchors.fill: parent; + anchors.margins: 1; + + ListView { + id: listView; + model: UM.Models.directoryListModel; + delegate: listDelegate; + } + } + } + + ToolButton { + anchors.horizontalCenter: parent.horizontalCenter; + iconSource: UM.Resources.getIcon('expand.png'); + } + } + + Component { + id: listDelegate; + Rectangle { + id: item; + + anchors.left: parent.left; + anchors.right: parent.right; + + height: 40; + + color: mouseArea.pressed ? "#f00" : index % 2 ? "#eee" : "#fff"; + + Label { + anchors.verticalCenter: parent.verticalCenter; + anchors.left: parent.left; + anchors.leftMargin: UM.Theme.defaultMargin; + + text: model.name; + } + + MouseArea { + id: mouseArea; + anchors.fill: parent; + + onClicked: base.openFile(model.url); + } + } + } +} diff --git a/OutputGCodeButton.qml b/OutputGCodeButton.qml new file mode 100644 index 0000000000..44c394296b --- /dev/null +++ b/OutputGCodeButton.qml @@ -0,0 +1,45 @@ +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 +import QtQuick.Layouts 1.1 + +import UM 1.0 as UM + +Button { + id: saveButton; + + text: "Save"; + + iconSource: UM.Resources.getIcon('save.png'); + + onClicked: saveDialog.open(); + + style: ButtonStyle { + background: Rectangle { + color: UM.Theme.primaryColor; + border.width: 1; + border.color: UM.Theme.borderColor; + } + label: Item { + Label { + anchors.verticalCenter: parent.verticalCenter; + anchors.left: parent.left; + anchors.right: icon.left; + text: control.text; + horizontalAlignment: Text.AlignHCenter; + font.pointSize: UM.Theme.largeTextSize; + } + + Rectangle { + id: icon; + + anchors.right: parent.right; + anchors.verticalCenter: parent.verticalCenter; + + width: control.height; + height: control.height; + UM.RecolorImage { anchors.centerIn: parent; source: control.iconSource; color: "#f00"; } + } + } + } +} diff --git a/Printer.qml b/Printer.qml index 9db3eb3b21..a898fc6cf1 100644 --- a/Printer.qml +++ b/Printer.qml @@ -1,29 +1,305 @@ -import QtQuick 2.1 +import QtQuick 2.2 import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 import QtQuick.Layouts 1.1 import QtQuick.Dialogs 1.1 import UM 1.0 as UM -UM.DefaultWindow { - title: "Cura" +UM.MainWindow { + id: base + visible: true - function saveClicked() { - saveDialog.open(); + width: 1280 + height: 720 + + title: "Cura"; + + Item { + id: backgroundItem; + anchors.fill: parent; + + UM.ApplicationMenu { + id: menu + window: base + + Menu { + title: '&File'; + + MenuItem { action: loadFileAction; } + MenuItem { action: saveFileAction; } + + MenuSeparator { } + + MenuItem { action: quitAction; } + } + + Menu { + title: '&Edit'; + + MenuItem { action: undoAction; } + MenuItem { action: redoAction; } + MenuSeparator { } + MenuItem { action: deleteAction; } + MenuItem { action: deleteAllAction; } + } + + Menu { + id: machineMenu; + title: "&Machine"; + + Instantiator { + model: UM.Models.machinesModel + MenuItem { + text: model.name; + checkable: true; + exclusiveGroup: machineMenuGroup; + } + onObjectAdded: machineMenu.insertItem(index, object) + onObjectRemoved: machineMenu.removeItem(object) + } + + ExclusiveGroup { id: machineMenuGroup; } + MenuSeparator { } + MenuItem { text: "Add new machine..."; enabled: false; } + } + + Menu { + title: 'E&xtensions'; + + MenuItem { text: "No extensions loaded"; enabled: false; } + } + + Menu { + title: '&Settings'; + + MenuItem { action: preferencesAction; } + } + + Menu { + title: '&Help'; + + MenuItem { action: helpAction; enabled: false; } + MenuItem { action: aboutAction; enabled: false; } + } + } + + Item { + id: contentItem; + + y: menu.height + width: parent.width; + height: parent.height - menu.height; + + Keys.forwardTo: menu + + DropArea { + anchors.fill: parent; + onDropped: { + if(drop.urls.length > 0) { + for(var i in drop.urls) { + UM.Controller.addMesh(drop.urls[i]); + } + } + } + } + + UM.Toolbar { + id: toolbar; + + anchors { + left: parent.left; + right: parent.right; + top: parent.top; + } + + undo: undoAction; + redo: redoAction; + settings: settingsAction; + } + + FilePane { + id: files; + + anchors.left: parent.left; + anchors.leftMargin: UM.Theme.windowLeftMargin; + anchors.top: toolbar.bottom; + anchors.topMargin: -1; + + border.width: 1; + border.color: UM.Theme.borderColor; + + width: UM.Theme.panelWidth; + height: base.height / 2 - UM.Theme.toolbarHeight; + + onRequestOpenFile: openDialog.open(); + onOpenFile: UM.Controller.addMesh(file); + } + + SettingsPane { + id: settings; + + anchors.right: parent.right; + anchors.rightMargin: UM.Theme.windowRightMargin; + anchors.top: toolbar.bottom; + anchors.topMargin: -1; + + border.width: 1; + border.color: UM.Theme.borderColor; + + width: UM.Theme.panelWidth; + + expandedHeight: base.height; + } + + OutputGCodeButton { + anchors.right: parent.right; + anchors.rightMargin: UM.Theme.windowRightMargin; + + anchors.bottom: parent.bottom; + anchors.bottomMargin: -1; + + width: UM.Theme.panelWidth; + height: 40; + } + +// UM.JobList { anchors.left: parent.left; anchors.bottom: parent.bottom; width: parent.width / 10; height: parent.height / 5; } + +// ProgressBar { +// id: progressBar; +// +// anchors { +// left: parent.left; +// bottom: parent.bottom; +// right: parent.right; +// } +// +// minimumValue: 0; +// maximumValue: 1; +// +// Connections { +// target: UM.Backend; +// onProcessingProgress: progressBar.value = amount; +// } +// } + } + } + + UM.PreferencesDialog { id: preferences } + + Action { + id: undoAction; + text: "Undo"; + iconName: "edit-undo"; + shortcut: StandardKey.Undo; + onTriggered: UM.OperationStack.undo(); + enabled: UM.OperationStack.canUndo; + } + + Action { + id: redoAction; + text: "Redo"; + iconName: "edit-redo"; + shortcut: StandardKey.Redo; + onTriggered: UM.OperationStack.redo(); + enabled: UM.OperationStack.canRedo; + } + + Action { + id: quitAction; + text: "Quit"; + iconName: "application-exit"; + shortcut: StandardKey.Quit; + onTriggered: Qt.quit(); + } + + Action { + id: preferencesAction; + text: "Preferences"; + iconName: "configure"; + onTriggered: preferences.visible = true; + } + + Action { + id: settingsAction; + text: "Configure Printers"; + iconSource: UM.Resources.getIcon("settings.png"); + onTriggered: preferences.visible = true; + } + + Action { + id: helpAction; + text: "Show Manual"; + iconName: "help-contents"; + shortcut: StandardKey.Help; + } + + Action { + id: aboutAction; + text: "About..."; + iconName: "help-about"; + } + + Action { + id: deleteAction; + text: "Delete Selection"; + iconName: "edit-delete"; + shortcut: StandardKey.Delete; + onTriggered: UM.Controller.removeSelection(); + } + + Action { + id: deleteAllAction; + text: "Clear Build Platform"; + iconName: "edit-clear"; + enabled: false; + } + + Action { + id: loadFileAction; + text: "Open..."; + iconName: "document-open"; + shortcut: StandardKey.Open; + onTriggered: openDialog.open(); + } + + Action { + id: saveFileAction; + text: "Save..."; + iconName: "document-save"; + shortcut: StandardKey.Save; + enabled: false; + } + + Menu { + id: contextMenu; + + MenuItem { action: deleteAction; } } FileDialog { - id: saveDialog + id: openDialog; - title: "Choose Filename" + title: "Choose files" + modality: Qt.NonModal + //TODO: Support multiple file selection, workaround bug in KDE file dialog + //selectMultiple: true - modality: Qt.NonModal; + onAccepted: + { + UM.Controller.addMesh(fileUrl) + files.setDirectory(fileUrl) + } + } + FileDialog { + id: saveDialog; + title: "Choose Filename"; selectExisting: false; onAccepted: { - Printer.saveGCode(fileUrl) + Printer.saveGCode(fileUrl); } } } diff --git a/PrinterApplication.py b/PrinterApplication.py index d8225710aa..10306b93dd 100644 --- a/PrinterApplication.py +++ b/PrinterApplication.py @@ -20,7 +20,8 @@ class PrinterApplication(QtApplication): def __init__(self): super().__init__() self.setApplicationName('printer') - self._machine_settings.loadSettingsFromFile(Resources.getPath(Resources.SettingsLocation, "ultimaker2.json")) + self._machine_settings.loadSettingsFromFile(Resources.getPath(Resources.SettingsLocation, "ultimaker_original+.json")) + self.setRequiredPlugins(['CuraEngineBackend', 'MeshView', 'LayerView', 'STLReader','SelectionTool','CameraTool']) self._physics = None def _loadPlugins(self): @@ -33,8 +34,6 @@ class PrinterApplication(QtApplication): self._plugin_registry.loadPlugin('CuraEngineBackend') def run(self): - - controller = self.getController() controller.setActiveView("MeshView") @@ -66,7 +65,7 @@ class PrinterApplication(QtApplication): camera = Camera('3d', root) camera.translate(Vector(0, 150, 150)) proj = Matrix() - proj.setPerspective(45, 640/480, 1, 500) + proj.setPerspective(85, 640/480, 1, 500) camera.setProjectionMatrix(proj) camera.setPerspective(True) camera.lookAt(Vector(0, 0, 0), Vector(0, 1, 0)) diff --git a/SettingsPane.qml b/SettingsPane.qml new file mode 100644 index 0000000000..aed4c429aa --- /dev/null +++ b/SettingsPane.qml @@ -0,0 +1,162 @@ +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 +import QtQuick.Layouts 1.1 + +import UM 1.0 as UM + +Rectangle { + id: base; + + height: childrenRect.height; + + property real expandedHeight: 500; + + property bool collapsed: true; + + MouseArea { + anchors.left: parent.left; + anchors.right: parent.right; + height: contents.height; + + acceptedButtons: Qt.AllButtons; + + onWheel: { + wheel.accepted = true; + } + } + + Column { + id: contents; + spacing: UM.Theme.defaultMargin; + + anchors { + left: parent.left; + leftMargin: UM.Theme.defaultMargin; + right: parent.right; + rightMargin: UM.Theme.defaultMargin; + } + + Label { text: "Print Settings"; width: parent.width; } + + Item { + width: parent.width; + height: childrenRect.height; + + Label { anchors.right: parent.horizontalCenter; text: "Material"; width: parent.width / 2; } + ComboBox { + anchors.left: parent.horizontalCenter; + width: parent.width / 2; + model: ListModel { + ListElement { text: "PLA"; } + ListElement { text: "ABS"; } + } + } + } + + Item { + width: parent.width; + height: childrenRect.height; + + Label { anchors.right: parent.horizontalCenter; text: "Time"; width: parent.width / 2; } + Label { anchors.left: parent.horizontalCenter; text: "10:10"; width: parent.width / 2; } + } + + Rectangle { color: "black"; height: 1; width: parent.width; } + + Item { + id: speedSlider; + + width: parent.width; + height: 60; + + Slider { + anchors.left: parent.left; + anchors.right: parent.right; + height: 20; + + style: SliderStyle { + groove: Rectangle { + height: 1; + color: "black"; + + Rectangle { + anchors.left: parent.left; + anchors.verticalCenter: parent.verticalCenter; + width: 1; + height: control.height; + color: "black"; + } + Rectangle { + anchors.right: parent.right; + anchors.verticalCenter: parent.verticalCenter; + width: 1; + height: control.height; + color: "black"; + } + } + handle: Rectangle { width: 5; height: control.height; color: UM.Theme.primaryColor; } + } + } + + Label { + anchors.left: parent.left; + anchors.bottom: parent.bottom; + text: "0:00\nLow Quality"; + } + + Label { + anchors.right: parent.right; + anchors.bottom: parent.bottom; + horizontalAlignment: Text.AlignRight; + text: "10:00\nHigh Quality"; + } + } + + UM.SettingsView { id: settingsView; width: parent.width; height: 0; opacity: 0; visible: false; verticalScrollBarPolicy: Qt.ScrollBarAlwaysOff } + + Rectangle { color: "black"; height: 1; width: parent.width; } + + Item { + Layout.columnSpan: 2; + height: childrenRect.height; + width: parent.width; + + ToolButton { + anchors.horizontalCenter: parent.horizontalCenter; + iconSource: UM.Resources.getIcon('expand.png'); + onClicked: base.collapsed = !base.collapsed + } + } + } + + states: [ + State { + name: 'expanded'; + when: !base.collapsed; + + PropertyChanges { target: speedSlider; opacity: 0; height: 0; visible: false; } + PropertyChanges { + target: settingsView; + opacity: 1; + height: Math.min(settingsView.listHeight, base.expandedHeight * 0.6); + visible: true; + verticalScrollBarPolicy: Qt.ScrollBarAsNeeded; + } + } + ] + + transitions: [ + Transition { + to: 'expanded'; + reversible: true; + SequentialAnimation { + NumberAnimation { target: speedSlider; property: 'opacity'; duration: 100; } + PropertyAction { target: settingsView; property: 'visible'; } + NumberAnimation { property: 'height'; duration: 200; } + PropertyAction { target: speedSlider; property: 'visible'; } + NumberAnimation { target: settingsView; property: 'opacity'; duration: 100; } + } + } + ] +}