mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-04-20 12:49:38 +08:00
258 lines
8.6 KiB
QML
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")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|