Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml
2023-02-24 14:28:13 +01:00

258 lines
8.6 KiB
QML

// 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.3
import UM 1.3 as UM
import Cura 1.0 as Cura
import "Recommended"
import "Custom"
Item
{
id: content
property int absoluteMinimumHeight: 200 * screenScaleFactor
implicitWidth: UM.Theme.getSize("print_setup_widget").width
implicitHeight: contents.height + buttonRow.height
enum Mode
{
Recommended = 0,
Custom = 1
}
// Catch all mouse events
MouseArea
{
anchors.fill: parent
hoverEnabled: true
}
// Set the current mode index to the value that is stored in the preferences or Recommended mode otherwise.
property int currentModeIndex:
{
var index = Math.round(UM.Preferences.getValue("cura/active_mode"))
if (index != null && !isNaN(index))
{
return index
}
return PrintSetupSelectorContents.Mode.Recommended
}
onCurrentModeIndexChanged: UM.Preferences.setValue("cura/active_mode", currentModeIndex)
Item
{
id: contents
// Use the visible property instead of checking the currentModeIndex. That creates a binding that
// evaluates the new height every time the visible property changes.
height: recommendedPrintSetup.visible ? recommendedPrintSetup.height : customPrintSetup.height
anchors
{
top: parent.top
left: parent.left
right: parent.right
}
RecommendedPrintSetup
{
id: recommendedPrintSetup
anchors
{
left: parent.left
right: parent.right
top: parent.top
}
visible: currentModeIndex == PrintSetupSelectorContents.Mode.Recommended
height: {
const height = base.height - (recommendedPrintSetup.mapToItem(null, 0, 0).y + buttonRow.height + UM.Theme.getSize("default_margin").height);
const maxHeight = UM.Preferences.getValue("view/settings_list_height");
return Math.min(height, maxHeight);
}
Connections
{
target: UM.Preferences
function onPreferenceChanged(preference)
{
if (preference !== "view/settings_list_height" && preference !== "general/window_height" && preference !== "general/window_state")
{
return;
}
const height = base.height - (recommendedPrintSetup.mapToItem(null, 0, 0).y + buttonRow.height + UM.Theme.getSize("default_margin").height);
const maxHeight = UM.Preferences.getValue("view/settings_list_height");
recommendedPrintSetup.height = Math.min(maxHeight, height);
updateDragPosition();
}
}
function onModeChanged()
{
currentModeIndex = PrintSetupSelectorContents.Mode.Custom;
}
}
CustomPrintSetup
{
id: customPrintSetup
anchors
{
left: parent.left
right: parent.right
top: parent.top
}
height: UM.Preferences.getValue("view/settings_list_height") - UM.Theme.getSize("default_margin").height
Connections
{
target: UM.Preferences
function onPreferenceChanged(preference)
{
if (preference !== "view/settings_list_height" && preference !== "general/window_height" && preference !== "general/window_state")
{
return;
}
customPrintSetup.height =
Math.min
(
UM.Preferences.getValue("view/settings_list_height"),
Math.max
(
absoluteMinimumHeight,
base.height - (customPrintSetup.mapToItem(null, 0, 0).y + buttonRow.height + UM.Theme.getSize("default_margin").height)
)
);
updateDragPosition();
}
}
visible: currentModeIndex == PrintSetupSelectorContents.Mode.Custom
}
}
Rectangle
{
id: buttonsSeparator
// The buttonsSeparator is inside the contents. This is to avoid a double line in the bottom
anchors.bottom: contents.bottom
width: parent.width
height: UM.Theme.getSize("default_lining").height
color: UM.Theme.getColor("lining")
}
Item
{
id: buttonRow
property real padding: UM.Theme.getSize("default_margin").width
height:
{
const draggable_area_height = draggableArea.visible ? draggableArea.height : 0;
if (currentModeIndex == PrintSetupSelectorContents.Mode.Custom)
{
return recommendedButton.height + 2 * padding + draggable_area_height;
}
return draggable_area_height;
}
anchors
{
bottom: parent.bottom
left: parent.left
right: parent.right
}
Cura.SecondaryButton
{
id: recommendedButton
anchors.top: parent.top
anchors.left: parent.left
anchors.margins: parent.padding
leftPadding: UM.Theme.getSize("default_margin").width
rightPadding: UM.Theme.getSize("default_margin").width
text: catalog.i18nc("@button", "Recommended")
iconSource: UM.Theme.getIcon("ChevronSingleLeft")
visible: currentModeIndex == PrintSetupSelectorContents.Mode.Custom
onClicked: currentModeIndex = PrintSetupSelectorContents.Mode.Recommended
}
//Invisible area at the bottom with which you can resize the panel.
MouseArea
{
id: draggableArea
anchors
{
left: parent.left
right: parent.right
bottom: parent.bottom
}
height: childrenRect.height
cursorShape: Qt.SplitVCursor
drag
{
target: parent
axis: Drag.YAxis
}
onMouseYChanged:
{
if(drag.active)
{
// position of mouse relative to dropdown align vertical centre of mouse area to cursor
// v------------------------------v v------------v
var h = mouseY + buttonRow.y + content.y - height / 2 | 0;
if(h < absoluteMinimumHeight) //Enforce a minimum size.
{
h = absoluteMinimumHeight;
}
//Absolute mouse Y position in the window, to prevent it from going outside the window.
var mouse_absolute_y = mapToGlobal(mouseX, mouseY).y - UM.Preferences.getValue("general/window_top");
if(mouse_absolute_y > base.height)
{
h -= mouse_absolute_y - base.height;
}
// Enforce a minimum size (again).
// This is a bit of a hackish way to do it, but we've seen some occasional reports that the size
// could get below the the minimum height.
if(h < absoluteMinimumHeight)
{
h = absoluteMinimumHeight;
}
UM.Preferences.setValue("view/settings_list_height", h);
}
}
Rectangle
{
width: parent.width
height: UM.Theme.getSize("narrow_margin").height
color: UM.Theme.getColor("secondary")
Rectangle
{
anchors.bottom: parent.top
width: parent.width
height: UM.Theme.getSize("default_lining").height
color: UM.Theme.getColor("lining")
}
UM.ColorImage
{
width: UM.Theme.getSize("drag_icon").width
height: UM.Theme.getSize("drag_icon").height
anchors.centerIn: parent
source: UM.Theme.getIcon("ThreeDots")
color: UM.Theme.getColor("small_button_text")
}
}
}
}
}