mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-18 20:28:01 -06:00
Add a object list panel instead of the open file button
This commit is contained in:
parent
75b185d462
commit
86c7d3e5ab
7 changed files with 240 additions and 59 deletions
|
@ -864,7 +864,7 @@ class CuraApplication(QtApplication):
|
||||||
|
|
||||||
def getObjectsModel(self, *args):
|
def getObjectsModel(self, *args):
|
||||||
if self._object_manager is None:
|
if self._object_manager is None:
|
||||||
self._object_manager = ObjectsModel.createObjectsModel()
|
self._object_manager = ObjectsModel(self)
|
||||||
return self._object_manager
|
return self._object_manager
|
||||||
|
|
||||||
@pyqtSlot(result = QObject)
|
@pyqtSlot(result = QObject)
|
||||||
|
@ -967,7 +967,7 @@ class CuraApplication(QtApplication):
|
||||||
|
|
||||||
qmlRegisterType(NetworkMJPGImage, "Cura", 1, 0, "NetworkMJPGImage")
|
qmlRegisterType(NetworkMJPGImage, "Cura", 1, 0, "NetworkMJPGImage")
|
||||||
|
|
||||||
qmlRegisterSingletonType(ObjectsModel, "Cura", 1, 0, "ObjectsModel", self.getObjectsModel)
|
qmlRegisterType(ObjectsModel, "Cura", 1, 0, "ObjectsModel")
|
||||||
qmlRegisterType(BuildPlateModel, "Cura", 1, 0, "BuildPlateModel")
|
qmlRegisterType(BuildPlateModel, "Cura", 1, 0, "BuildPlateModel")
|
||||||
qmlRegisterType(MultiBuildPlateModel, "Cura", 1, 0, "MultiBuildPlateModel")
|
qmlRegisterType(MultiBuildPlateModel, "Cura", 1, 0, "MultiBuildPlateModel")
|
||||||
qmlRegisterType(InstanceContainer, "Cura", 1, 0, "InstanceContainer")
|
qmlRegisterType(InstanceContainer, "Cura", 1, 0, "InstanceContainer")
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# Copyright (c) 2018 Ultimaker B.V.
|
# Copyright (c) 2018 Ultimaker B.V.
|
||||||
# Cura is released under the terms of the LGPLv3 or higher.
|
# Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
from PyQt5.QtCore import QTimer
|
from PyQt5.QtCore import QTimer, Qt
|
||||||
|
|
||||||
from UM.Application import Application
|
from UM.Application import Application
|
||||||
from UM.Qt.ListModel import ListModel
|
from UM.Qt.ListModel import ListModel
|
||||||
|
@ -16,8 +16,20 @@ catalog = i18nCatalog("cura")
|
||||||
|
|
||||||
## Keep track of all objects in the project
|
## Keep track of all objects in the project
|
||||||
class ObjectsModel(ListModel):
|
class ObjectsModel(ListModel):
|
||||||
def __init__(self):
|
NameRole = Qt.UserRole + 1
|
||||||
super().__init__()
|
SelectedRole = Qt.UserRole + 2
|
||||||
|
OutsideAreaRole = Qt.UserRole + 3
|
||||||
|
BuilplateNumberRole = Qt.UserRole + 4
|
||||||
|
NodeRole = Qt.UserRole + 5
|
||||||
|
|
||||||
|
def __init__(self, parent = None):
|
||||||
|
super().__init__(parent)
|
||||||
|
|
||||||
|
self.addRoleName(self.NameRole, "name")
|
||||||
|
self.addRoleName(self.SelectedRole, "selected")
|
||||||
|
self.addRoleName(self.OutsideAreaRole, "outside_build_area")
|
||||||
|
self.addRoleName(self.BuilplateNumberRole, "buildplate_number")
|
||||||
|
self.addRoleName(self.SelectedRole, "node")
|
||||||
|
|
||||||
Application.getInstance().getController().getScene().sceneChanged.connect(self._updateDelayed)
|
Application.getInstance().getController().getScene().sceneChanged.connect(self._updateDelayed)
|
||||||
Application.getInstance().getPreferences().preferenceChanged.connect(self._updateDelayed)
|
Application.getInstance().getPreferences().preferenceChanged.connect(self._updateDelayed)
|
||||||
|
@ -78,9 +90,9 @@ class ObjectsModel(ListModel):
|
||||||
|
|
||||||
nodes.append({
|
nodes.append({
|
||||||
"name": name,
|
"name": name,
|
||||||
"isSelected": Selection.isSelected(node),
|
"selected": Selection.isSelected(node),
|
||||||
"isOutsideBuildArea": is_outside_build_area,
|
"outside_build_area": is_outside_build_area,
|
||||||
"buildPlateNumber": node_build_plate_number,
|
"buildplate_number": node_build_plate_number,
|
||||||
"node": node
|
"node": node
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -88,7 +100,3 @@ class ObjectsModel(ListModel):
|
||||||
self.setItems(nodes)
|
self.setItems(nodes)
|
||||||
|
|
||||||
self.itemsChanged.emit()
|
self.itemsChanged.emit()
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def createObjectsModel():
|
|
||||||
return ObjectsModel()
|
|
||||||
|
|
|
@ -24,14 +24,14 @@ Item
|
||||||
Item
|
Item
|
||||||
{
|
{
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
width: openFileButton.width + itemRow.width + UM.Theme.getSize("default_margin").width
|
width: objectSelector.width + itemRow.width + UM.Theme.getSize("default_margin").width
|
||||||
height: parent.height
|
height: parent.height
|
||||||
|
|
||||||
RowLayout
|
RowLayout
|
||||||
{
|
{
|
||||||
id: itemRow
|
id: itemRow
|
||||||
|
|
||||||
anchors.left: openFileButton.right
|
anchors.left: objectSelector.right
|
||||||
anchors.leftMargin: UM.Theme.getSize("default_margin").width
|
anchors.leftMargin: UM.Theme.getSize("default_margin").width
|
||||||
|
|
||||||
width: Math.round(0.9 * prepareMenu.width)
|
width: Math.round(0.9 * prepareMenu.width)
|
||||||
|
@ -82,53 +82,60 @@ Item
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Button
|
Cura.ObjectSelector
|
||||||
{
|
{
|
||||||
id: openFileButton
|
id: objectSelector
|
||||||
height: UM.Theme.getSize("stage_menu").height
|
height: UM.Theme.getSize("stage_menu").height
|
||||||
width: UM.Theme.getSize("stage_menu").height
|
width: UM.Theme.getSize("stage_menu").height
|
||||||
onClicked: Cura.Actions.open.trigger()
|
|
||||||
hoverEnabled: true
|
|
||||||
|
|
||||||
contentItem: Item
|
|
||||||
{
|
|
||||||
anchors.fill: parent
|
|
||||||
UM.RecolorImage
|
|
||||||
{
|
|
||||||
id: buttonIcon
|
|
||||||
anchors.centerIn: parent
|
|
||||||
source: UM.Theme.getIcon("load")
|
|
||||||
width: UM.Theme.getSize("button_icon").width
|
|
||||||
height: UM.Theme.getSize("button_icon").height
|
|
||||||
color: UM.Theme.getColor("icon")
|
|
||||||
|
|
||||||
sourceSize.height: height
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
background: Rectangle
|
|
||||||
{
|
|
||||||
id: background
|
|
||||||
height: UM.Theme.getSize("stage_menu").height
|
|
||||||
width: UM.Theme.getSize("stage_menu").height
|
|
||||||
|
|
||||||
radius: UM.Theme.getSize("default_radius").width
|
|
||||||
color: openFileButton.hovered ? UM.Theme.getColor("action_button_hovered") : UM.Theme.getColor("action_button")
|
|
||||||
}
|
|
||||||
|
|
||||||
DropShadow
|
|
||||||
{
|
|
||||||
id: shadow
|
|
||||||
// Don't blur the shadow
|
|
||||||
radius: 0
|
|
||||||
anchors.fill: background
|
|
||||||
source: background
|
|
||||||
verticalOffset: 2
|
|
||||||
visible: true
|
|
||||||
color: UM.Theme.getColor("action_button_shadow")
|
|
||||||
// Should always be drawn behind the background.
|
|
||||||
z: background.z - 1
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Button
|
||||||
|
// {
|
||||||
|
// id: openFileButton
|
||||||
|
// height: UM.Theme.getSize("stage_menu").height
|
||||||
|
// width: UM.Theme.getSize("stage_menu").height
|
||||||
|
// onClicked: Cura.Actions.open.trigger()
|
||||||
|
// hoverEnabled: true
|
||||||
|
//
|
||||||
|
// contentItem: Item
|
||||||
|
// {
|
||||||
|
// anchors.fill: parent
|
||||||
|
// UM.RecolorImage
|
||||||
|
// {
|
||||||
|
// id: buttonIcon
|
||||||
|
// anchors.centerIn: parent
|
||||||
|
// source: UM.Theme.getIcon("load")
|
||||||
|
// width: UM.Theme.getSize("button_icon").width
|
||||||
|
// height: UM.Theme.getSize("button_icon").height
|
||||||
|
// color: UM.Theme.getColor("icon")
|
||||||
|
//
|
||||||
|
// sourceSize.height: height
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// background: Rectangle
|
||||||
|
// {
|
||||||
|
// id: background
|
||||||
|
// height: UM.Theme.getSize("stage_menu").height
|
||||||
|
// width: UM.Theme.getSize("stage_menu").height
|
||||||
|
//
|
||||||
|
// radius: UM.Theme.getSize("default_radius").width
|
||||||
|
// color: openFileButton.hovered ? UM.Theme.getColor("action_button_hovered") : UM.Theme.getColor("action_button")
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// DropShadow
|
||||||
|
// {
|
||||||
|
// id: shadow
|
||||||
|
// // Don't blur the shadow
|
||||||
|
// radius: 0
|
||||||
|
// anchors.fill: background
|
||||||
|
// source: background
|
||||||
|
// verticalOffset: 2
|
||||||
|
// visible: true
|
||||||
|
// color: UM.Theme.getColor("action_button_shadow")
|
||||||
|
// // Should always be drawn behind the background.
|
||||||
|
// z: background.z - 1
|
||||||
|
// }
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
58
resources/qml/ObjectItemButton.qml
Normal file
58
resources/qml/ObjectItemButton.qml
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
// Copyright (c) 2018 Ultimaker B.V.
|
||||||
|
// Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
|
import QtQuick 2.7
|
||||||
|
import QtQuick.Controls 2.1
|
||||||
|
|
||||||
|
import UM 1.1 as UM
|
||||||
|
import Cura 1.0 as Cura
|
||||||
|
|
||||||
|
Button
|
||||||
|
{
|
||||||
|
id: objectItemButton
|
||||||
|
|
||||||
|
width: parent.width
|
||||||
|
height: UM.Theme.getSize("action_button").height
|
||||||
|
leftPadding: UM.Theme.getSize("thick_margin").width
|
||||||
|
rightPadding: UM.Theme.getSize("thick_margin").width
|
||||||
|
checkable: true
|
||||||
|
hoverEnabled: true
|
||||||
|
|
||||||
|
contentItem: Item
|
||||||
|
{
|
||||||
|
width: objectItemButton.width - objectItemButton.leftPadding
|
||||||
|
height: UM.Theme.getSize("action_button").height
|
||||||
|
|
||||||
|
Label
|
||||||
|
{
|
||||||
|
id: buttonText
|
||||||
|
anchors
|
||||||
|
{
|
||||||
|
left: parent.left
|
||||||
|
right: printerTypes.left
|
||||||
|
verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
text: {
|
||||||
|
print("HOLAAAAAAAA", objectItemButton.text)
|
||||||
|
return objectItemButton.text
|
||||||
|
}
|
||||||
|
color: UM.Theme.getColor("text")
|
||||||
|
font: UM.Theme.getFont("medium")
|
||||||
|
visible: text != ""
|
||||||
|
renderType: Text.NativeRendering
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
elide: Text.ElideRight
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
background: Rectangle
|
||||||
|
{
|
||||||
|
id: backgroundRect
|
||||||
|
color: objectItemButton.hovered ? UM.Theme.getColor("action_button_hovered") : "transparent"
|
||||||
|
radius: UM.Theme.getSize("action_button_radius").width
|
||||||
|
border.width: UM.Theme.getSize("default_lining").width
|
||||||
|
border.color: objectItemButton.checked ? UM.Theme.getColor("primary") : "transparent"
|
||||||
|
}
|
||||||
|
|
||||||
|
onClicked: Cura.SceneController.changeSelection(index)
|
||||||
|
}
|
108
resources/qml/ObjectSelector.qml
Normal file
108
resources/qml/ObjectSelector.qml
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
// Copyright (c) 2019 Ultimaker B.V.
|
||||||
|
// Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
|
import QtQuick 2.7
|
||||||
|
import QtQuick.Controls 2.3
|
||||||
|
|
||||||
|
import UM 1.2 as UM
|
||||||
|
import Cura 1.0 as Cura
|
||||||
|
|
||||||
|
Cura.ExpandableComponent
|
||||||
|
{
|
||||||
|
id: base
|
||||||
|
|
||||||
|
headerCornerSide: Cura.RoundedRectangle.Direction.All
|
||||||
|
contentAlignment: Cura.ExpandablePopup.ContentAlignment.AlignLeft
|
||||||
|
contentHeaderTitle: catalog.i18nc("@label", "Object list")
|
||||||
|
|
||||||
|
headerItem: Item
|
||||||
|
{
|
||||||
|
anchors.fill: parent
|
||||||
|
UM.RecolorImage
|
||||||
|
{
|
||||||
|
id: buttonIcon
|
||||||
|
anchors.centerIn: parent
|
||||||
|
source: UM.Theme.getIcon("load")
|
||||||
|
width: UM.Theme.getSize("button_icon").width
|
||||||
|
height: UM.Theme.getSize("button_icon").height
|
||||||
|
color: UM.Theme.getColor("icon")
|
||||||
|
|
||||||
|
sourceSize.height: height
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
contentItem: Item
|
||||||
|
{
|
||||||
|
id: popup
|
||||||
|
width: UM.Theme.getSize("machine_selector_widget_content").width
|
||||||
|
|
||||||
|
ScrollView
|
||||||
|
{
|
||||||
|
id: scroll
|
||||||
|
width: parent.width
|
||||||
|
clip: true
|
||||||
|
leftPadding: UM.Theme.getSize("default_lining").width
|
||||||
|
rightPadding: UM.Theme.getSize("default_lining").width
|
||||||
|
|
||||||
|
ListView
|
||||||
|
{
|
||||||
|
id: listView
|
||||||
|
|
||||||
|
// Can't use parent.width since the parent is the flickable component and not the ScrollView
|
||||||
|
width: scroll.width - scroll.leftPadding - scroll.rightPadding
|
||||||
|
property real maximumHeight: UM.Theme.getSize("machine_selector_widget_content").height - buttonRow.height
|
||||||
|
|
||||||
|
// We use an extra property here, since we only want to to be informed about the content size changes.
|
||||||
|
onContentHeightChanged:
|
||||||
|
{
|
||||||
|
scroll.height = Math.min(contentHeight, maximumHeight)
|
||||||
|
popup.height = scroll.height + buttonRow.height
|
||||||
|
}
|
||||||
|
|
||||||
|
Component.onCompleted:
|
||||||
|
{
|
||||||
|
scroll.height = Math.min(contentHeight, maximumHeight)
|
||||||
|
popup.height = scroll.height + buttonRow.height
|
||||||
|
}
|
||||||
|
model: Cura.ObjectsModel {}
|
||||||
|
|
||||||
|
delegate: ObjectItemButton
|
||||||
|
{
|
||||||
|
text: model.name
|
||||||
|
width: listView.width
|
||||||
|
|
||||||
|
checked: model.selected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle
|
||||||
|
{
|
||||||
|
id: separator
|
||||||
|
|
||||||
|
anchors.top: scroll.bottom
|
||||||
|
width: parent.width
|
||||||
|
height: UM.Theme.getSize("default_lining").height
|
||||||
|
color: UM.Theme.getColor("lining")
|
||||||
|
}
|
||||||
|
|
||||||
|
Row
|
||||||
|
{
|
||||||
|
id: buttonRow
|
||||||
|
|
||||||
|
// The separator is inside the buttonRow. This is to avoid some weird behaviours with the scroll bar.
|
||||||
|
anchors.top: separator.top
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
padding: UM.Theme.getSize("default_margin").width
|
||||||
|
spacing: UM.Theme.getSize("default_margin").width
|
||||||
|
|
||||||
|
Cura.SecondaryButton
|
||||||
|
{
|
||||||
|
leftPadding: UM.Theme.getSize("default_margin").width
|
||||||
|
rightPadding: UM.Theme.getSize("default_margin").width
|
||||||
|
text: catalog.i18nc("@button", "Add file")
|
||||||
|
onClicked: Cura.Actions.open.trigger()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -130,7 +130,6 @@ Cura.ExpandablePopup
|
||||||
scroll.height = Math.min(contentHeight, maximumHeight)
|
scroll.height = Math.min(contentHeight, maximumHeight)
|
||||||
popup.height = scroll.height + buttonRow.height
|
popup.height = scroll.height + buttonRow.height
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
module Cura
|
module Cura
|
||||||
|
|
||||||
MachineSelector 1.0 MachineSelector.qml
|
MachineSelector 1.0 MachineSelector.qml
|
||||||
|
objectSelector 1.0 objectSelector.qml
|
||||||
CustomConfigurationSelector 1.0 CustomConfigurationSelector.qml
|
CustomConfigurationSelector 1.0 CustomConfigurationSelector.qml
|
||||||
PrintSetupSelector 1.0 PrintSetupSelector.qml
|
PrintSetupSelector 1.0 PrintSetupSelector.qml
|
||||||
ActionButton 1.0 ActionButton.qml
|
ActionButton 1.0 ActionButton.qml
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue