From b1f54536ba882c75251a3f8f5844b4338fbb4fc8 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 29 Aug 2019 14:16:40 +0200 Subject: [PATCH 01/13] QmlDesigner: Make AnimationCurveDialog a normal modal dialog QDialog::open() opens the dialog as a modal dialog. Since no dialog parent was set the dialog did not block any parent windows. In this patch we set Core::ICore::dialogParent as the parent and use show() instead of open(). The dialog is not modal anymore and Qt Creator is the proper parent window. Therefore Qt::WindowStaysOnTopHint is not required anymore. Change-Id: Iea48a73e67de5e9d2568e71145d57d0ffd0df78b Reviewed-by: Tim Jenssen --- .../components/timelineeditor/animationcurvedialog.cpp | 2 -- .../components/timelineeditor/timelinetoolbar.cpp | 5 +++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/plugins/qmldesigner/components/timelineeditor/animationcurvedialog.cpp b/src/plugins/qmldesigner/components/timelineeditor/animationcurvedialog.cpp index abc77781252..08269f0a927 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/animationcurvedialog.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/animationcurvedialog.cpp @@ -33,7 +33,6 @@ AnimationCurveDialog::AnimationCurveDialog(QWidget *parent) : QDialog(parent) , m_editor(nullptr) { - setWindowFlag(Qt::WindowStaysOnTopHint, true); setWindowFlag(Qt::WindowContextHelpButtonHint, false); } @@ -41,7 +40,6 @@ AnimationCurveDialog::AnimationCurveDialog(DesignTools::CurveEditorModel *model, : QDialog(parent) , m_editor(nullptr) { - setWindowFlag(Qt::WindowStaysOnTopHint, true); setWindowFlag(Qt::WindowContextHelpButtonHint, false); setModel(model); } diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinetoolbar.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinetoolbar.cpp index 33c6dafa343..6e6ae34e433 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinetoolbar.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinetoolbar.cpp @@ -40,6 +40,7 @@ #include #include +#include #include @@ -101,7 +102,7 @@ QAction *createAction(const Core::Id &id, TimelineToolBar::TimelineToolBar(QWidget *parent) : QToolBar(parent) , m_grp() - , m_dialog() + , m_dialog(Core::ICore::dialogParent()) , m_curveModel(new AnimationCurveEditorModel(0., 500.)) { m_dialog.setModel(m_curveModel); @@ -221,7 +222,7 @@ void TimelineToolBar::removeTimeline(const QmlTimeline &timeline) void TimelineToolBar::openAnimationCurveEditor() { - m_dialog.open(); + m_dialog.show(); } void TimelineToolBar::updateCurve(DesignTools::PropertyTreeItem *item) From 6f774ff10e9f2348824e41ab0ff419d9f1254a40 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 30 Aug 2019 16:03:53 +0200 Subject: [PATCH 02/13] QmlDesigner: Open color dialog from property editor Task-number: QDS-601 Change-Id: I8ab2b286213174c19b330b1db4c27efd7af8792c Reviewed-by: Tim Jenssen --- .../imports/HelperWidgets/ColorButton.qml | 20 ++++++++++-- .../HelperWidgets/ColorCheckButton.qml | 14 ++++++-- .../imports/HelperWidgets/ColorEditor.qml | 32 ++++++++++++++++--- .../HelperWidgets/SimpleColorPalette.qml | 22 ++++++++++++- .../simplecolorpalettemodel.cpp | 15 +++++++++ .../propertyeditor/simplecolorpalettemodel.h | 6 ++++ 6 files changed, 98 insertions(+), 11 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorButton.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorButton.qml index f960e5ea238..cb896024e93 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorButton.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorButton.qml @@ -43,6 +43,7 @@ Item { property bool block: false signal clicked + signal rightMouseButtonClicked onAlphaChanged: invalidateColor(); onSaturationChanged: invalidateColor(); @@ -202,7 +203,7 @@ Item { id: mapMouseArea anchors.fill: parent onPositionChanged: { - if (pressed) { + if (pressed && mouse.button === Qt.LeftButton) { var xx = Math.max(0, Math.min(mouse.x, parent.width)) var yy = Math.max(0, Math.min(mouse.y, parent.height)) @@ -210,8 +211,21 @@ Item { colorButton.saturation = xx / parent.width; } } - onPressed: positionChanged(mouse) - onReleased: colorButton.clicked() + onPressed: { + if (mouse.button === Qt.LeftButton) + positionChanged(mouse) + } + onReleased: { + if (mouse.button === Qt.LeftButton) + colorButton.clicked() + } + + acceptedButtons: Qt.LeftButton | Qt.RightButton + + onClicked: { + if (mouse.button === Qt.RightButton) + colorButton.rightMouseButtonClicked() + } } Rectangle { anchors.fill: parent diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorCheckButton.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorCheckButton.qml index 5f094dc00d9..9751c7c777a 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorCheckButton.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorCheckButton.qml @@ -26,12 +26,13 @@ import QtQuick 2.1 Item { - id: colorCheckButtonRoot + id: root property bool checked: false property alias buttonColor: checkBox.color width: 30 height: 24 + signal rightMouseButtonClicked Rectangle { id: backgroundBox @@ -63,13 +64,20 @@ Item { anchors.right: backgroundBox.left anchors.rightMargin: 2 opacity: colorToolTip.containsMouse ? 1 : 0.8 - rotation: colorCheckButtonRoot.checked ? 0.0 : 270.0 + rotation: root.checked ? 0.0 : 270.0 } ToolTipArea { id: colorToolTip - onClicked: checked = !checked + acceptedButtons: Qt.LeftButton | Qt.RightButton + + onClicked: { + if (mouse.button === Qt.RightButton) + root.rightMouseButtonClicked() + else + root.checked = !root.checked + } hoverEnabled: true anchors.fill: parent anchors.leftMargin: -arrowImage.width diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml index 15246a4405a..ade6b3e5268 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml @@ -26,6 +26,8 @@ import QtQuick 2.1 import QtQuick.Layouts 1.0 import QtQuickDesignerTheme 1.0 +import QtQuick.Dialogs 1.3 +import StudioControls 1.0 as StudioControls Column { id: colorEditor @@ -198,6 +200,12 @@ Column { ColorCheckButton { id: checkButton buttonColor: colorEditor.color + + onCheckedChanged: { + if (contextMenu.opened) + contextMenu.close() + } + onRightMouseButtonClicked: contextMenu.popup(checkButton) } LineEdit { @@ -615,7 +623,13 @@ Column { sliderMargins: 4 - onClicked: colorEditor.color = colorButton.color + onClicked: { + colorEditor.color = colorButton.color + if (contextMenu.opened) + contextMenu.close() + } + + onRightMouseButtonClicked: contextMenu.popup(colorButton) } Item { @@ -702,13 +716,23 @@ Column { clickable: !colorEditor.transparent - onSelectedColorChanged: { - colorEditor.color = colorPalette.selectedColor; - } + onSelectedColorChanged: colorEditor.color = colorPalette.selectedColor + + + onDialogColorChanged: colorEditor.color = colorPalette.selectedColor } } } } } + + StudioControls.Menu { + id: contextMenu + + StudioControls.MenuItem { + text: qsTr("Open Color Dialog") + onTriggered: colorPalette.showColorDialog(colorEditor.color) + } + } } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SimpleColorPalette.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SimpleColorPalette.qml index 9cc787bd235..d69fc08e4b6 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SimpleColorPalette.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SimpleColorPalette.qml @@ -32,7 +32,12 @@ import QtQuick.Controls.Private 1.0 // showing a ToolTip Item { property color selectedColor property bool clickable : true + property color oldColor + function showColorDialog(color) { + oldColor = color + paletteModel.showDialog(color) + } width: 200 height: 40 @@ -43,6 +48,8 @@ Item { paletteModel.addItem(colorCode) } + signal dialogColorChanged + Component { id: colorItemDelegate @@ -94,7 +101,20 @@ Item { } } - SimpleColorPaletteModel { id: paletteModel } + SimpleColorPaletteModel { + + id: paletteModel + + onCurrentColorChanged: { + selectedColor = color + dialogColorChanged() + + } + onColorDialogRejected: { + selectedColor = oldColor + dialogColorChanged() + } + } ListView { id: colorPaletteView model: paletteModel diff --git a/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettemodel.cpp b/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettemodel.cpp index b3207f0006d..71d4c1b6d45 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettemodel.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettemodel.cpp @@ -29,6 +29,9 @@ #include "designersettings.h" +#include + +#include #include #include #include @@ -143,4 +146,16 @@ void SimpleColorPaletteModel::write() SimpleColorPaletteSingleton::getInstance().writePalette(); } +void SimpleColorPaletteModel::showDialog(QColor color) +{ + auto colorDialog = new QColorDialog(Core::ICore::dialogParent()); + colorDialog->setCurrentColor(color); + colorDialog->setAttribute(Qt::WA_DeleteOnClose); + + connect(colorDialog, &QDialog::rejected, this, &SimpleColorPaletteModel::colorDialogRejected); + connect(colorDialog, &QColorDialog::currentColorChanged, this, &SimpleColorPaletteModel::currentColorChanged); + + QTimer::singleShot(0, [colorDialog](){ colorDialog->exec(); }); +} + } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettemodel.h b/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettemodel.h index 3ed2cc8a31d..f487859d073 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettemodel.h +++ b/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettemodel.h @@ -59,6 +59,12 @@ public: bool read(); void write(); + Q_INVOKABLE void showDialog(QColor color); + +signals: + void colorDialogRejected(); + void currentColorChanged(const QColor &color); + private slots: void setPalette(); From 53d00e5e8ad02924f63b1e091c0de761f5c62330 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 30 Aug 2019 16:27:29 +0200 Subject: [PATCH 03/13] Update qbs submodule MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To HEAD of 1.14 branch. Change-Id: Iff2853200df560e9b0c110d46bbcb8682db2a91e Reviewed-by: Jörg Bornemann --- src/shared/qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/qbs b/src/shared/qbs index 817a292690c..53673312503 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit 817a292690ccdea7bae185319beb22ea653db946 +Subproject commit 5367331250368ada068c02c3027369e1d7a59ee7 From 90816d78971e05c69bf4363598bc40ea9dec24b8 Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Sun, 1 Sep 2019 13:16:34 +0200 Subject: [PATCH 04/13] QmlDesigner: add missing QTimer include Change-Id: I7aaf180957006a2e3a9abde73e64808adcd57c95 Reviewed-by: Tim Jenssen --- .../components/propertyeditor/simplecolorpalettemodel.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettemodel.cpp b/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettemodel.cpp index 71d4c1b6d45..a67a2fc91f6 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettemodel.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettemodel.cpp @@ -36,6 +36,7 @@ #include #include #include +#include namespace QmlDesigner { From fa5af00db6056985d7f6ec27f4be2e4291508f41 Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Sun, 1 Sep 2019 17:39:49 +0200 Subject: [PATCH 05/13] QmlDesigner: add missing QColor include Change-Id: Icb8ad0c5e3dd0873ec7c1dea5bb622314e43479c Reviewed-by: Tim Jenssen --- .../components/propertyeditor/simplecolorpalettemodel.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettemodel.cpp b/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettemodel.cpp index a67a2fc91f6..a3bd38e514a 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettemodel.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettemodel.cpp @@ -37,6 +37,7 @@ #include #include #include +#include namespace QmlDesigner { From 330126af1e69190628c7c4e90b2386fc82db7fcb Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 2 Sep 2019 07:36:29 +0200 Subject: [PATCH 06/13] QmlDesigner: Fix includes and compile on Linux Change-Id: If1cf1d6a2f7c9ec25d7e2bd949f4f4cd6295b694 Reviewed-by: Tim Jenssen --- .../components/propertyeditor/simplecolorpalettemodel.cpp | 1 - .../components/propertyeditor/simplecolorpalettemodel.h | 1 + .../components/propertyeditor/simplecolorpalettesingleton.h | 1 - 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettemodel.cpp b/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettemodel.cpp index a3bd38e514a..a67a2fc91f6 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettemodel.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettemodel.cpp @@ -37,7 +37,6 @@ #include #include #include -#include namespace QmlDesigner { diff --git a/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettemodel.h b/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettemodel.h index f487859d073..c1babf263e3 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettemodel.h +++ b/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettemodel.h @@ -28,6 +28,7 @@ #include #include #include +#include namespace QmlDesigner { diff --git a/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettesingleton.h b/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettesingleton.h index 77ad2b0732a..8a2019a1d76 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettesingleton.h +++ b/src/plugins/qmldesigner/components/propertyeditor/simplecolorpalettesingleton.h @@ -29,7 +29,6 @@ #include #include #include -#include #include namespace QmlDesigner { From 9af2563a69cf713fe68e51cfdf6a10287e58f662 Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Fri, 30 Aug 2019 17:17:08 +0200 Subject: [PATCH 07/13] QmlDesigner: Fix SpinBox DragHandler issue Fixes an issue of the RealSpinBox DragHandler where the value compression timer, which is responsible to trigger a write to the backend, wasn't triggered anymore, because the SpinBox had no focus after ending the drag operation. Change-Id: Ibdf02856c96b997db20c3019438f9645fa853e75 Reviewed-by: Thomas Hartmann --- .../imports/StudioControls/RealSpinBox.qml | 2 ++ .../imports/StudioControls/RealSpinBoxInput.qml | 13 ++++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBox.qml index 3f0d1296e52..39cd51d2887 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBox.qml @@ -71,6 +71,8 @@ T.SpinBox { property real __sliderIndicatorWidth: StudioTheme.Values.squareComponentWidth property real __sliderIndicatorHeight: StudioTheme.Values.height + property alias compressedValueTimer: myTimer + signal realValueModified signal compressedRealValueModified signal dragStarted diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBoxInput.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBoxInput.qml index 7de0eb735e7..243859e2d88 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBoxInput.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBoxInput.qml @@ -88,6 +88,10 @@ TextInput { // Force focus on the non visible component to receive key events dragModifierWorkaround.forceActiveFocus() } else { + if (myControl.compressedValueTimer.running) { + myControl.compressedValueTimer.stop() + calcValue(myControl.compressedRealValueModified) + } mouseArea.cursorShape = Qt.PointingHandCursor // TODO myControl.drag = false myControl.dragEnded() @@ -97,15 +101,14 @@ TextInput { myControl.focus = false } } - onTranslationChanged: calcValue() - onMultiplierChanged: calcValue() + onTranslationChanged: calcValue(myControl.realValueModified) + onMultiplierChanged: calcValue(myControl.realValueModified) - function calcValue() { + function calcValue(callback) { var tmp = myControl.realDragRange / StudioTheme.Values.dragLength var currValue = myControl.realValue myControl.setRealValue(dragHandler.initialValue + (tmp * dragHandler.translation.x * dragHandler.multiplier)) - if (currValue !== myControl.realValue) - myControl.realValueModified() + callback() } } From e6190babdbb2f5d9ea2ef6e5fcf6e7ad00c91847 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 28 Aug 2019 09:32:55 +0200 Subject: [PATCH 08/13] Debugger: skip child items when looking for partial variables Change-Id: Id76f3b1009b068bf8b685d7b7a88d49d85033f03 Fixes: QTCREATORBUG-19356 Reviewed-by: Christian Stenger --- src/libs/qtcreatorcdbext/pycdbextmodule.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/libs/qtcreatorcdbext/pycdbextmodule.cpp b/src/libs/qtcreatorcdbext/pycdbextmodule.cpp index fc55076ea68..c1584587c0c 100644 --- a/src/libs/qtcreatorcdbext/pycdbextmodule.cpp +++ b/src/libs/qtcreatorcdbext/pycdbextmodule.cpp @@ -220,12 +220,17 @@ static PyObject *cdbext_listOfLocals(PyObject *, PyObject *args) // -> [ Value ] ++currentPartialIname; // skip "local" part ULONG symbolGroupIndex = 0; + ULONG childEndIndex = 0; for (;symbolGroupIndex < scopeEnd; ++symbolGroupIndex) { - const PyValue value(symbolGroupIndex, symbolGroup); - if (value.name() == *currentPartialIname) { - PyList_Append(locals, createPythonObject(value)); - return locals; + PyValue value(symbolGroupIndex, symbolGroup); + if (childEndIndex <= symbolGroupIndex) { // do not return a child value + if (value.name() == *currentPartialIname) { + PyList_Append(locals, createPythonObject(value)); + return locals; + } + ++childEndIndex; } + childEndIndex += ULONG(value.childCount()); } } From 489c9b2e58de5d819302d73bf8d28abd65f251be Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Mon, 2 Sep 2019 17:25:51 +0200 Subject: [PATCH 09/13] QmlDesigner: Fix RealSpinBox Slider issue Change-Id: Ib5da6c699a94ba42b4e7cbb9913a9caaa570a731 Reviewed-by: Thomas Hartmann --- .../imports/StudioControls/RealSliderPopup.qml | 5 +---- .../imports/StudioControls/RealSpinBoxInput.qml | 6 +----- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSliderPopup.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSliderPopup.qml index d260940c394..fe83e82ee60 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSliderPopup.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSliderPopup.qml @@ -81,11 +81,8 @@ T.Popup { } onMoved: { - var currValue = myControl.value myControl.realValue = slider.value - - if (currValue !== myControl.realValue) - myControl.realValueModified() + myControl.realValueModified() } } } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBoxInput.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBoxInput.qml index 243859e2d88..72a713c2820 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBoxInput.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/RealSpinBoxInput.qml @@ -106,7 +106,6 @@ TextInput { function calcValue(callback) { var tmp = myControl.realDragRange / StudioTheme.Values.dragLength - var currValue = myControl.realValue myControl.setRealValue(dragHandler.initialValue + (tmp * dragHandler.translation.x * dragHandler.multiplier)) callback() } @@ -164,12 +163,9 @@ TextInput { if (wheel.modifiers & Qt.ShiftModifier) mouseArea.stepSize = myControl.maxStepSize - var currValue = myControl.realValue myControl.valueFromText(textInput.text, myControl.locale) myControl.setRealValue(myControl.realValue + (wheel.angleDelta.y / 120.0 * mouseArea.stepSize)) - - if (currValue !== myControl.realValue) - myControl.realValueModified() + myControl.realValueModified() // Reset stepSize mouseArea.stepSize = myControl.realStepSize From 428d8f03079a531c45cc3dfb79b58e307aa12ffd Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Mon, 2 Sep 2019 17:33:23 +0200 Subject: [PATCH 10/13] QmlDesigner: PropertyEditor cleanup * Adapt SpinBox ranges and decimals * Add missing qsTr() to labels Change-Id: If85999a22778b6f61e30f7437905354884086596 Reviewed-by: Thomas Hartmann --- .../QtQuick/AdvancedSection.qml | 2 +- .../QtQuick/AnchorRow.qml | 14 +++---- .../QtQuick/Controls/PopupSection.qml | 4 +- .../QtQuick/ImageSpecifics.qml | 8 ++-- .../QtQuick/ListViewSpecifics.qml | 4 +- .../QtQuick/PathViewSpecifics.qml | 2 + .../HelperWidgets/FlickableSection.qml | 41 ++++++++++--------- .../imports/HelperWidgets/Label.qml | 2 +- .../imports/HelperWidgets/MarginSection.qml | 20 ++++----- .../imports/HelperWidgets/Section.qml | 6 +-- .../imports/StudioTheme/Values.qml | 2 + 11 files changed, 55 insertions(+), 50 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/AdvancedSection.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/AdvancedSection.qml index 6d9c073c77a..ab6b17dd12b 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/AdvancedSection.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/AdvancedSection.qml @@ -53,8 +53,8 @@ Section { backendValue: backendValues.scale hasSlider: true decimals: 2 - minimumValue: 0.01 stepSize: 0.1 + minimumValue: -10 maximumValue: 10 Layout.preferredWidth: 140 } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/AnchorRow.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/AnchorRow.qml index 2514fde1d30..602a713b6ab 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/AnchorRow.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/AnchorRow.qml @@ -62,7 +62,7 @@ RowLayout { property alias buttonRow: buttonRow - readonly property color __defaultTextColor: Theme.color(Theme.PanelTextColorLight) + readonly property color __defaultTextColor: StudioTheme.Values.themeTextColor IconLabel { id: icon @@ -135,13 +135,13 @@ RowLayout { id: group } - StudioControls.AbstractButton { + AbstractButton { id: buttonSameEdge buttonIcon: verticalAnchor ? StudioTheme.Constants.anchorTop : StudioTheme.Constants.anchorLeft checkable: true autoExclusive: true StudioControls.ButtonGroup.group: group - //tooltip: verticalAnchor ? qsTr("Anchor to the top of the target.") : qsTr("Anchor to the left of the target.") + tooltip: verticalAnchor ? qsTr("Anchor to the top of the target.") : qsTr("Anchor to the left of the target.") onClicked: { if (!invertRelativeTargets) sameEdgeButtonClicked(); @@ -149,22 +149,22 @@ RowLayout { oppositeEdgeButtonClicked(); } } - StudioControls.AbstractButton { + AbstractButton { id: buttonCenter buttonIcon: verticalAnchor ? StudioTheme.Constants.centerVertical : StudioTheme.Constants.centerHorizontal checkable: true autoExclusive: true StudioControls.ButtonGroup.group: group - //tooltip: verticalAnchor ? qsTr("Anchor to the vertical center of the target.") : qsTr("Anchor to the horizontal center of the target.") + tooltip: verticalAnchor ? qsTr("Anchor to the vertical center of the target.") : qsTr("Anchor to the horizontal center of the target.") onClicked: centerButtonClicked(); } - StudioControls.AbstractButton { + AbstractButton { id: buttonOppositeEdge buttonIcon: verticalAnchor ? StudioTheme.Constants.anchorBottom : StudioTheme.Constants.anchorRight checkable: true autoExclusive: true StudioControls.ButtonGroup.group: group - //tooltip: verticalAnchor ? qsTr("Anchor to the bottom of the target.") : qsTr("Anchor to the right of the target.") + tooltip: verticalAnchor ? qsTr("Anchor to the bottom of the target.") : qsTr("Anchor to the right of the target.") onClicked: { if (!invertRelativeTargets) oppositeEdgeButtonClicked(); diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/Controls/PopupSection.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/Controls/PopupSection.qml index 0f2cb21b306..6b0b0de8355 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/Controls/PopupSection.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/Controls/PopupSection.qml @@ -158,8 +158,8 @@ Section { } SecondColumnLayout { SpinBox { - maximumValue: 9999999 - minimumValue: -9999999 + minimumValue: -4000 + maximumValue: 4000 decimals: 0 backendValue: backendValues.spacing Layout.fillWidth: true diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ImageSpecifics.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ImageSpecifics.qml index ebf07866aa8..8f742f06e24 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ImageSpecifics.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ImageSpecifics.qml @@ -80,8 +80,8 @@ Column { SpinBox { backendValue: backendValues.sourceSize_width - minimumValue: -2000 - maximumValue: 2000 + minimumValue: 0 + maximumValue: 8192 decimals: 0 } @@ -97,8 +97,8 @@ Column { SpinBox { backendValue: backendValues.sourceSize_height - minimumValue: -2000 - maximumValue: 2000 + minimumValue: 0 + maximumValue: 8192 decimals: 0 } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ListViewSpecifics.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ListViewSpecifics.qml index ed3d74304bc..058cbb724a3 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ListViewSpecifics.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ListViewSpecifics.qml @@ -130,8 +130,8 @@ Column { SectionLayout { SpinBox { backendValue: backendValues.spacing - minimumValue: 0 - maximumValue: 1000 + minimumValue: -4000 + maximumValue: 4000 decimals: 0 } ExpandingSpacer { diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/PathViewSpecifics.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/PathViewSpecifics.qml index f3bd9d9b3d3..b2d48045ecb 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/PathViewSpecifics.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/PathViewSpecifics.qml @@ -166,6 +166,7 @@ Column { backendValue: backendValues.preferredHighlightBegin minimumValue: 0 maximumValue: 1 + stepSize: 0.1 decimals: 2 } ExpandingSpacer { @@ -182,6 +183,7 @@ Column { backendValue: backendValues.preferredHighlightEnd minimumValue: 0 maximumValue: 1 + stepSize: 0.1 decimals: 2 } ExpandingSpacer { diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FlickableSection.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FlickableSection.qml index 8725ba6979c..2b97df06467 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FlickableSection.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FlickableSection.qml @@ -34,6 +34,7 @@ Section { id: root + property int labelWidth: 42 property int spinBoxWidth: 96 SectionLayout { @@ -173,13 +174,13 @@ Section { Label { text: "W" - width: 42 + width: root.labelWidth } SpinBox { backendValue: backendValues.contentWidth minimumValue: 0 - maximumValue: 8000 + maximumValue: 10000 implicitWidth: root.spinBoxWidth Layout.fillWidth: true } @@ -191,13 +192,13 @@ Section { Label { text: "H" - width: 42 + width: root.labelWidth } SpinBox { backendValue: backendValues.contentHeight minimumValue: 0 - maximumValue: 8000 + maximumValue: 10000 implicitWidth: root.spinBoxWidth Layout.fillWidth: true } @@ -213,12 +214,12 @@ Section { Label { text: "X" - width: 42 + width: root.labelWidth } SpinBox { backendValue: backendValues.contentX - minimumValue: 0 + minimumValue: -8000 maximumValue: 8000 implicitWidth: root.spinBoxWidth Layout.fillWidth: true @@ -231,12 +232,12 @@ Section { Label { text: "Y" - width: 42 + width: root.labelWidth } SpinBox { backendValue: backendValues.contentY - minimumValue: 0 + minimumValue: -8000 maximumValue: 8000 implicitWidth: root.spinBoxWidth Layout.fillWidth: true @@ -254,13 +255,13 @@ Section { Label { text: "Top" - width: 42 + width: root.labelWidth } SpinBox { backendValue: backendValues.topMargin - maximumValue: 0xffff - minimumValue: 0 + minimumValue: -10000 + maximumValue: 10000 decimals: 0 implicitWidth: root.spinBoxWidth Layout.fillWidth: true @@ -273,13 +274,13 @@ Section { Label { text: "Bottom" - width: 42 + width: root.labelWidth } SpinBox { backendValue: backendValues.bottomMargin - maximumValue: 0xffff - minimumValue: 0 + minimumValue: -10000 + maximumValue: 10000 decimals: 0 implicitWidth: root.spinBoxWidth Layout.fillWidth: true @@ -297,13 +298,13 @@ Section { Label { text: "Left" - width: 42 + width: root.labelWidth } SpinBox { backendValue: backendValues.leftMargin - maximumValue: 0xffff - minimumValue: 0 + minimumValue: -10000 + maximumValue: 10000 decimals: 0 implicitWidth: root.spinBoxWidth Layout.fillWidth: true @@ -316,13 +317,13 @@ Section { Label { text: "Right" - width: 42 + width: root.labelWidth } SpinBox { backendValue: backendValues.rightMargin - maximumValue: 0xffff - minimumValue: 0 + minimumValue: -10000 + maximumValue: 10000 decimals: 0 implicitWidth: root.spinBoxWidth Layout.fillWidth: true diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/Label.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/Label.qml index e4129c6dcff..ce1a0d41540 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/Label.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/Label.qml @@ -38,7 +38,7 @@ Controls.Label { property alias toolTip: toolTipArea.tooltip width: Math.max(Math.min(240, parent.width - 280), 50) - color: Theme.color(Theme.PanelTextColorLight) + color: StudioTheme.Values.themeTextColor elide: Text.ElideRight font.pixelSize: StudioTheme.Values.myFontSize diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/MarginSection.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/MarginSection.qml index 153d7cb27b1..63b8f8702b4 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/MarginSection.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/MarginSection.qml @@ -45,8 +45,8 @@ Section { width: 42 } SpinBox { - maximumValue: 9999999 - minimumValue: -9999999 + minimumValue: -10000 + maximumValue: 10000 decimals: 0 backendValue: backendValues.topMargin Layout.fillWidth: true @@ -62,8 +62,8 @@ Section { width: 42 } SpinBox { - maximumValue: 9999999 - minimumValue: -9999999 + minimumValue: -10000 + maximumValue: 10000 decimals: 0 backendValue: backendValues.bottomMargin Layout.fillWidth: true @@ -80,8 +80,8 @@ Section { width: 42 } SpinBox { - maximumValue: 9999999 - minimumValue: -9999999 + minimumValue: -10000 + maximumValue: 10000 decimals: 0 backendValue: backendValues.leftMargin Layout.fillWidth: true @@ -97,8 +97,8 @@ Section { width: 42 } SpinBox { - maximumValue: 9999999 - minimumValue: -9999999 + minimumValue: -10000 + maximumValue: 10000 decimals: 0 backendValue: backendValues.rightMargin Layout.fillWidth: true @@ -111,8 +111,8 @@ Section { } SecondColumnLayout { SpinBox { - maximumValue: 9999999 - minimumValue: -9999999 + minimumValue: -10000 + maximumValue: 10000 decimals: 0 backendValue: backendValues.margins Layout.fillWidth: true diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/Section.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/Section.qml index 10b09287b71..583b11ee9a5 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/Section.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/Section.qml @@ -24,7 +24,7 @@ ****************************************************************************/ import QtQuick 2.1 -import QtQuick.Controls 1.1 as Controls +import QtQuick.Controls 2.12 as Controls import QtQuick.Layouts 1.0 import QtQuickDesignerTheme 1.0 import StudioTheme 1.0 as StudioTheme @@ -52,7 +52,7 @@ Item { Controls.Label { id: label anchors.verticalCenter: parent.verticalCenter - color: Theme.color(Theme.PanelTextColorLight) + color: StudioTheme.Values.themeTextColor x: 22 font.bold: true font.pixelSize: StudioTheme.Values.myFontSize @@ -75,7 +75,7 @@ Item { } - color: Theme.color(Theme.BackgroundColorDark) + color: StudioTheme.Values.themeSectionHeadBackground Rectangle { visible: false diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/Values.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/Values.qml index 46d2141adc5..32136421a46 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/Values.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioTheme/Values.qml @@ -123,6 +123,8 @@ QtObject { property string themeTranslationIndicatorBorder: "#7f7f7f" + property string themeSectionHeadBackground: "#191919" + // Taken out of Constants.js property string themeChangedStateText: "#99ccff" } From b6487499260f19aacc7d39ae6d410c27109e53e7 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Mon, 2 Sep 2019 17:01:24 +0200 Subject: [PATCH 11/13] Doc: Describe setting Ninja as the CMake generator Task-number: QTCREATORBUG-22889 Change-Id: Ide3e7ebdb08791790d2370ed6841ee203ea5548f Reviewed-by: Mitch Curtis Reviewed-by: Tobias Hunger --- .../qtcreator-build-steps-cmake-ninja.png | Bin 0 -> 34365 bytes .../creator-projects-cmake-building.qdocinc | 35 +++++++++++++++++- .../creator-projects-targets.qdoc | 2 + 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 doc/images/qtcreator-build-steps-cmake-ninja.png diff --git a/doc/images/qtcreator-build-steps-cmake-ninja.png b/doc/images/qtcreator-build-steps-cmake-ninja.png new file mode 100644 index 0000000000000000000000000000000000000000..0f1ba4fa745d6a5c6a535119c69035f616268c7a GIT binary patch literal 34365 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 mY1f2LFD@?T1_^&Y`JdTt?WAK \uicontrol Options > \uicontrol Kits, and + then select the build and run kit for the project. + \li Select \uicontrol Change next to the \uicontrol {CMake generator} + field to open the \uicontrol {CMake Generator} dialog. + \image qtcreator-build-steps-cmake-ninja.png + \li In the \uicontrol Generator field, select \uicontrol Ninja. + \li Select \uicontrol OK to return to the \uicontrol Kits tab. + \li Select \uicontrol OK or \uicontrol Apply to save your changes. + \endlist + + \note To make sure that old build artifacts don't get in the way + the first time you build the project after the change, select + \uicontrol Build > \uicontrol {Rebuild Project}. This cleans up the + build directory and performs a new build. + +//! [cmake ninja] + + //! [cmake clean steps] \section2 CMake Clean Steps diff --git a/doc/src/projects/creator-only/creator-projects-targets.qdoc b/doc/src/projects/creator-only/creator-projects-targets.qdoc index 6438abc42bb..dc23a5e8348 100644 --- a/doc/src/projects/creator-only/creator-projects-targets.qdoc +++ b/doc/src/projects/creator-only/creator-projects-targets.qdoc @@ -194,6 +194,8 @@ choose the kit to use. To set the selected kit as the default kit, select \uicontrol {Make Default}. + \include creator-projects-cmake-building.qdocinc cmake ninja + \section1 Editing Qbs Profiles To view the Qbs profile associated with the kit, select \uicontrol Tools > From 9b7bab7d3521d3d3551b347eacc1a2bf4874a96c Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 3 Sep 2019 15:41:25 +0200 Subject: [PATCH 12/13] QmlDesigner: Hide curve editor style editor Normal users are not supposed to use the style editor. Change-Id: I3fe99f8b893189b51690f4d54052f19ed1846722 Reviewed-by: Tim Jenssen --- .../components/curveeditor/detail/graphicsview.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp index ed968bd0078..6186fe736cf 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp @@ -296,8 +296,11 @@ void GraphicsView::contextMenuEvent(QContextMenuEvent *event) auto openStyleEditor = [this]() { m_dialog.show(); }; QMenu menu; - QAction *openEditorAction = menu.addAction(tr("Open Style Editor")); - connect(openEditorAction, &QAction::triggered, openStyleEditor); + + if (qEnvironmentVariableIsSet("QTC_STYLE_CURVE_EDITOR")) { + QAction *openEditorAction = menu.addAction(tr("Open Style Editor")); + connect(openEditorAction, &QAction::triggered, openStyleEditor); + } menu.addSeparator(); auto insertKeyframes = [this, event]() { From b4340b336101c6814e19f3d45c9606a8d2940b6e Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 4 Sep 2019 15:33:59 +0200 Subject: [PATCH 13/13] Doc: Describe the Curve Editor Modify the curve picker docs to try to make it clearer that the old easing curve editor and the new curve editor are two separate things. Change-Id: I6a57d151c0edef15850cff264a27d519fbe6635b Reviewed-by: Thomas Hartmann --- doc/images/studio-curve-editor.png | Bin 0 -> 18457 bytes doc/src/qtquick/qtquick-timeline.qdoc | 47 +++++++++++++++++++++----- 2 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 doc/images/studio-curve-editor.png diff --git a/doc/images/studio-curve-editor.png b/doc/images/studio-curve-editor.png new file mode 100644 index 0000000000000000000000000000000000000000..f1f82e0abeedd1daf8c6e107058c7885c5eb4f39 GIT binary patch literal 18457 zcmeAS@N?(olHy`uVBq!ia0y~yU}0cjV5;F@Vqjo+@9z@Az`(#+;1OBOz`%C|gc+x5 z^GP!>FtC?+`ns||=49b87uDUbd=@O^8d2g{T9T1p#ISPR84m^q2A&evh!U67;^d;t zf|AVqJO*J-MP&vC1}>1ebACZ(QD%BZ3BwxxGgb@?418eGqSQo?QiYPt+*AhB@BEw$ z3=Etgnc)1ilJdl&REF4s{~+buAVHVR;^dsf%-qx>hV2Ko^fNFpaDarv6N~aP^U@g( zNIz?bIW0K9v?w{1;p_kA*Dz(y`MJ5Nc_j?r&P?0Sz`(!;(i)Okl9S4?;@u^61_rk$ zo-U3d6}R5r<)1O-Yoh+I@GC0}Uxr?}V(-1{&7sY=f;lp;yt#FFYyTVx>8++E4>>-Acx`>W{Yec528SvQ1_p)&44|MzW(XLo_f~bM&b|Nla(>PBDZj0@ z<*j67WoWRN9kT8VKLf*+a>gHr?*FU5WY55GB(s*5Ch4yZ+KY>G!{vmhb<2ZsT9~ zx?NAQ|G!^1ou9u_-M(&J@!xIt_UX^EFM2#@rK@@6%ay<9-?{$(=o9Z}TkAiZnIu>B zY~6R$={27h-8cIZZ+wftKELQk@5LQ;rVI=|H}32#mjAhX|L%9?bt|HD%s z)^dtAg!9RDEMivQ^KpOu|E12{|L5n+TZ`Sb`)^;L_%4;bDn9ntZTWxG-~InuzxMaJ z+50Pg_mt27wb}fhl-=L?KPO7xUjFU)^WXDNEq(V-r8dp+4gdA^`}c3(l2Z4K{dWGJ z2RGcb|2X=)$?yDlY~{_<=l6=Z26O+LbgAcYI5UHTWy>A;OZ9c^Czk$i@-mnsbdUAL z+wF_y@2`9G|JLu%^Y`wmJN@pmzvar0wfjpxbxy8|xBm4xevfd}!T$K_$7{FWmov(> zpX&Ml_~t)XEI;f0{P=y|?~fe&b&4mS{JkrF)rE||?)mSZoJ{}H{)6Aow4Q-s#bdq# zi`8Gg$WQ&G=U}NW^EdO#@5S5C*%e;mRG%Z@TUAs2{m}h6g!5C8Y^cYEEZ zTNg5S@60SXX7{`#O#C z9exL|S4zMCz2ErfB=2)~w&_==e%t+U^_lgr?jJSSy7K2q_4!rnHr6-S-~Z^qT<>}B zUPI!$J@41cJlcJ62cH%bLqlgtL&453U+mkME~sB=D8Faf27WJooR|H)CUQ z>-oPwUNQcs`o3aOQ}nl5^~uMagWm7nS04SoJ&$Ln-Q>^zpDyKZE3hj)*ZcX9@4Nfc zxL-d!-QV+VI#2oY*86Acc7L{1XJcRxNKXE(u%Y+n8x>u!EUuI+Pb zPOeX{J~&hUPeAd#zh7dd&Hl*0SDyL!dp^%`CELpX!AoT_P2SAq-!kXlU74Br>HmBf z7*=d)RIX?1W7Yb|etZM_gEz+YnGZ|Dzy14iwRyda-Rt`5_xkth{$8D4UQ_XH%ZIi1 z!tYBwVmGSX`#xe`Re$__e(vvk!ClVZ+Gl;AMN{djIk&e(rOa`}%ji)tyZ%t>5eZ z`CP8-GxzhvXTRs~sgM6=bN5-s4=#hRJ@*>@-8sHb{OOzi?5}FDbLz>v{#WkYiMcfQ z`M(o)YSYe{O#9Esuwn(Tv{}pd-}*Oh%zw@BFxvcH#p4t9bx!W?$M;lzZu@iZO9 zdhXuI`j&?`u`)C)>3=9s8 z3=9k+4A>Y8E*Z^dzHsSM61aSSx8pHiH3I{Kf-6XM0H}OtWnf?+mVw6}98$PVZ_u(j zDG(5tzxV64+mVKUZu{AMJmNW7ZSU*Y_eNLPE;undFgAQzGQa$uW!b0QewI65?f=!g zczyi~XL+fIY{&a#tN(tzUjO5;{J%%y`z>BBnaopqiXEcMh(p@W-}dd@t-s#3^T|s6 zWJ{k{`Rw=o|Nm-#f0N8&&REE>fFb16`oFi<|9y97r}~_NL+1N`o_+uRMk1q%9mCO| z=YN0fum5v;|DV%|#<@&=(^s4fP|sx06=4u*@cQ|q^!nc4cW3%0$^ZXx{CEh1ok4Nh zkBQ~?D$@_Q@!D7X`)T<1l3?Ap>;Ep-&$2Ghvq%Y3^qf~<(c);(AjZXTWe3BYnxgv` zHz@W^{}-It@96Pi`P{Oob(S_?J{)fT^q1Yv!0Yvi-#43>1lC#p{c`zupvMYp@%Wm; zAK&Ny|2dzxm2pb|Ljc37C0n;{eY@%Ou3fwCSyX+Qxc~R=OZ5ghU!*j69)4QUx&Oe* z<@09ko^bnTK*4!dagUxqsZ}Rcr}NCQ-I;rPn__-5$P|y}SG9Z&9{;nit=ai}UiH2o zNA>Gop8sESeO+wwua5;^&YiFOwmCe$w)C+1e#>R@Jk|VqzplpDKJGO?G&{NFS;50r zalT!*^Xoo8xBp*h!SX`-{*Shs6GDDkYQ}KHO9_L5c|ug^E#?W{{}q4P|9Y|b@$UA5 z7k(C>(%0Pn*Zh6&``YJo%j4e3G}!++Z2za({zr3k-p>+#m--VXj?`~hBSoPE4`0~8^ zRa>g>)>mt8m-)t*mvP7D!}S(-GwZ4k2bZ7v8{PI}Z+Of_iNDe3mmS)!skyIiNAxs} z?Xo8J>by&qepq`)>~d$Wwr=UkzNi0AS>DsofhazoH#Xep=tpr z^&C+fRm=K0p^ai?V+zg%5k_x0m(dHer=KJ&}jSQIobcJJqtQ8wwa+`e|-o0&)F zR~h_1b=Rh*Xa1*x`?*C@%T3J}l`q5pMPEPV|NZ~Pqu2S%PaEEz z7CQ4}=%Y!pxnaCI`)c{^YO0sETZJ)OJm0qT^Y`^Xt}J(}ar1rg&%MGZjcw1Vm;3d^ zxEQz`EHC|!|9dt5??w5)7nk|YR;vhqeB+ON>iy3A2h4?sq@UP+JR;03rt_nF|BvoJ zOdsZb-?Mzm?yPy2Hhi7g$lLb!|Jl4lb1v=I-T1TZC$G56{5`o|TmC=1{WmApK1x&Fi7_x1HM_M)HuYA&B+^x^4YetVgF-;KYYv$uT6 z+jQtAtE$?wHr4NU%MQEDAzu<*p&%E#V>JK)`fBQf2|2F$spR^Ch+TYQAye9u7-^L}&wrthk z`*!lhXY&-Ny?JnS`rpoH($m@+Ww%Hy+p^X7hKKyCRYK^2y!j|4xVL&%Il&`TOjrv-J!fevBIVzvQ>i|MNtBAp?)fKk@jQ zk3XN!&(F`7-*Hefea^?r^Z#wxa^%m0-PiE?ue)>TzkA9hbJD=&Y( zj&uE=)#2;;=Kq;``tRAZXZ830DSBy`AK$^{Z@a@X=ilyyJJqu?GIqb+cKTP-p=UyM zcAMAM{@?fEy@$O7U+ld7`xhtITl`q?h0lOb@l;B`^NF0!yEez}Tc2|7Xw;I|nHark z@tqYdf^s$X;wg(#{gc=Yet-DZo4@6_<=?n>QHFOojlUZFmt|sckl}Xt{r+EGUh(g1 zYokx^erqqoWYWhcVE6j_{O!5BAAYa@|GNJ7_MPA5{@(k(Pu$M@`L*bL+h4z4Kb%^0 z>i7NsSAri`-k*Br+X0Q7FS-^QyVL)B+)O;Det6qA_QkcuUG)V8EN^z$R?j;y<>&OT z_g|+Tc3nEL{&7c9`E1L-KOWXP|GU=|{p>H}P2PLSHm@JF>(~D@EN2 zZ(_~qc-_9|>5rE04OZXp6mze$DS2^W|Nr0nr{&OCd4 zXLUv8{~ed=Yk3lGtg`$6!&x?Wo;&N}kV9XjZwDtY`DuU7egU627X#M;iB-?EA8B+rC>DKCbk+ zU9sv1JG=XVpErBEAAWbqH8-*Un(*vT^9M8I>9QRAe>E}x=3eY^F<-}YQp@hxy@j4z zzP`KN{%>z{p5+gIiI0jrxtC?j{~w$6dtcGb#_9SQI}%QJ{V$F$IVwKw-!bF)yY{~L zwc^Jt!_&F!yzhUA=(QX$DfqiT{ptO*KV8$`cz9=>P@TQ~N73ww{rovQ0^Og<79A@* zbADNs#DQA=buV`5%1oGC?bo{e%3JT9~ znuR^ze>BcCK0Nzfd-#G6|9;v3ILM#%k7N4Zlk;0H*BCqgPq*Lwx6k^Q+&513KPSca z&)98O<8WjCznk-Ca!nPu*YNer_dVq;(kAyeJezF)=gV7B3(qH8=kKjLXZf6`rZO(f z(U0p;+LgK1<a)40#M;n2o^JN+4d zr`>bsXs#Z~Lx-<2(c*~`E7PK-sNX-$sy+5aB`JZWV z9;ZS>W^~ks{!vkDcb9hHW@SiEx*LT58HT8h+Rp+GceY)CgI? z;2^o@b?ket_iVq9UAzt|j9>l#7I?o!3#9htlga*O@aCq4d9D_9aZk-PMFmg&Xi_Ir)?EWW6lE!TBxU3_@W*-h2E>~C!kOK z(DdQ`wb9#;ZDw$}IQe@_{oh?@T3IhI&R>6Lp69pQ=4JKkRC6BfU-4pA&YSwg-9Pvl z7$ncz{m!YorvFc-p>y>WONPx+vv!s9v;2PcQk=Jtmw_Q5b*dJ_?ecQ-tvoU}_vfGI zc8(F=_V4{h76yg|U0UBf54;Ym+nw!u{mZ*|D^_amTCQ9C!2hD@%%BZvXPqza{=Q~U z-OR@g3=9kQaUJ-UntT0u{l#r-KHO%#?(%wFessDb1A~Le-0F8bFFttuPrH!sfG3+2 z14Gv9x7+X6eLO0@`txp3e`&?W$^Ldbmo8N;uY6+5u)FMS5U4A~$tP=N62o{R*5du1 z&uagoPX#de{XA>GZA;dRv+rw8DljkvEb?r_+Ch7yYL?G@>&B;_+cNx3{%)7*v)Q+A z^8|X3HgyWKaJyejL{)ah>h>+XF@D!DdE^t#Ju z^Rkv~yMGTed86OQ$zQ6uy|;Vu?6CaKL*?S}!n!wa82+AB9sT{zmQC5m-(=4_7sIiA z=Dhmf%MZVuo^wY~@6O$_%ahh+96bK6S8jLa-+5=&zv@im`zOS}AkwhP`o`|X&kICk z>uPSdFE>wHe{);u!&7%>a&JE0HSg}F?{}O3-nT7K*_>JbdEUF7lYhTceE;pPv{~A| z+nb+vuK0RL<5bOtBImT~`fq-VW;X9`7<;me;>&Y`gd3 z&q?3&cH0)e_~tu3?z2Pox^S6FldiHgzi;_&KJ4hS_WL~hoz;i0i;30jyy*k#7O&{t zynKFq#nnFMy}rEZ?PverTwnG59shs1o7Ef2&;Qbub)*U=yZ0`m zD0s@>yl3Ao+wHFSlzzCiIXXXTXY~cYhR56a-MLcFGxIIyI@7z0-_7@?@4vu<(?R2_ zA-50yQ~pt0wM#GF^25=GPrdhTv-y8)bM*4uAE!@mZhvdk! z;BgJtzLtw;GxGC0%ih1cv(wnMzw%hmzi#W_^5q{bRBBQVNj$OL6eL&2#I8~=5M-%+ zs5vh)v-8-#7nAMzo;gQ7Z$4@8=CzBhPn*?0nTBO;(`NRjxBrj5tuQMn^KG_yZj_B~ z%#NzB%Y3(=^EkUWZf{lL{x^&D$cV?1FLNIML&3dMuKhH4qOjzPYVxtQv%}(TlUoi5953uRE7vg3 zwtjD&&i4CzJ}&!U$?$nu`u!9CH$Jr$(h~JO6mDv}@kf`nvF={uS=(N|k}O}AV(##L zy14EunM|3eNj64rx9iROw)W`$z2#pYU6QYR#I~eB;F6_wS=qgt-#LuF8|Ty4aRHrC5_kZ+w}W%_#2tii~9~*97*Rt@UYKtpYrp*v$5Ra zc`-XStv(!G8T2y!`<7+z_Wt!hcei?Rrmkk?jhlbAm%Y6eou513@QH;=b&A#dn3DA8 z=LDBIO0g|T5D2o@{v{V4qIc1cOa*GsGHp71+msXPCEq`iCp)tQn#ljKWf zjxFS=X1Mp~+;kQfk41Z{zx#FnOZ@t3#nV?;S6_DvUt^}Sq&lp{S!P{L(#N?EP3`VZ zPDqfsWG$a|XO~4WgL`oBcj1?{(gzPYdOS}#k@F#b?#;IsH~lca99DkqEMMn7XR1hMq&ns)oP?ekUpf)x%Qth;#cO72I_-`edm?IFEBn*8>m z%#&6{PP9C&Z#C~uEl z7e%kTwI%a%=-s=%zB7%>FKy&B_#9N9dS!0yg}eSbaUyc1A1#(-rdWAb{_vEaP;#zI za{Ib}SFWtoUwf}4_1WrzefJlY__aMMyfOFG&kJ&8O)-*kB^EzY{k|N@Pw#8>x?iIq z*AlW$=8)Znf0ySSmj3M%UHkl8)l44sl9G~|hurZJ-@&!-_1N-Q%m0faH!pg7oAum} z>L(N3#q?qQmk>-;h2z@>WG+gqi# zGMD%M7Qb6~Tz0E1OU6Ox*wblGQ~!VX+CQ)2(L&Z|3=9k*%W|fCK9{B&A@-@}N4cZg z)$?59a$H66u1Bw*iTbv4*|Yw8lXfb7{@RqfeM`=tFH__1rLSaQaA=+KU8Z4Lf8Dd< z%ggU?E_(WH!n^BhI_>_xoElhywWdw!{~5Xc&95Bo4FL=c3+%WYL~JY1f4#o`bWDVS z?XPdA-p)+fUz_~>dDJ1bf8AZ{PRhOdf2geekFav^vOhH!7u{=Xn?Jwqm-XU%Kek?1 zlePG;Zfmys`}_a(oY@(!w0g~DHdwuMW%YN54f*rxE(%D^Z%ZCp2@&ax;SY*^M<^q+jn0p@jbuKIj6)w`q_c`i?WTDCY+tszO4Lx zWaVF@Bkh#~MzufwBey#ss)m6yM@T%2WJYm8IMd`V7)2Gz^E_l3$|1|?c z0Kv--P*)cRQF?1T;@oV_{`n-V!gTq`aO}%=LOQS}?$@81?$h$^Y&LIvdaLsCa@W82dl${ze0$oKd7`owpMErERBcKB z`ET>5{P{mW7W`(eeiygB+WpzH^z(CUZHs^JtJe5&$tNM>p~L?Td;c%$?%OXrVex;) zhFxOwZ5bx7-&69bJ2v`V-2LCt+UsV{-~H^de04(HmlyvgJiGla*5>EMuQ%W8ovSPV zX8L{Gw|jew9v@;(uiduw`^5=A*zf;)S@8SA-E}9w-@9vOyrq>@e)smo^LJ-f-}s#5 z|8Tm&oJUaaJIs`MbN6C#h5Pw;$G7{=yEkKR+U;wt+U48^OUff*$YhU$-|GU}y zQq11w-@9D<@5#RE6T54_x2-!51NLP}J<6 z{OZyAIX4Y<{yy;V-+DDdtpb+6rSZEn%Pcxpe7*Nsy*&TNtwT-v=Ce6@w6_aC*mj%G z6&za*taEJt{yDU|Oy)&ymW6d!k?ex<_y0b;pSYL3`um#umo66X_@Q^`?c$8nhf16G zZB73C?!*444__>()D8Sr^l$nyCS{K3zx?ucFPpgaZft$cvY3%UgCVtuvIfJv+OwC7 z7r$!`3@)2oAM!!9N8=3(hwOtx-1Wv?^US0e8khpq*p1yk$p7E8{Pm})%<(dD`<`T< z{+w^KyYyDu{yjF;FV3A|-M>BM+q>4;?tA_|>z&STb#D0sZ;7M*btRX=_kAi4d?K(Q z>EPC6KX$um9`i9c4N1KE1PLU)MxgdP17w=np~&{vDQ&icO~DMS(yy(FyD5U9L8{dw@KRGSgH{%()cy77 z-x}8IvE_l!oKEXz?~;p3I4PjMe$OYbA1n>m`TSTta3;kwk>$ zlL$){Wf#7f;-d->ESD&{ykZcGX$t3? z`b*`(!Py^YFON4lVtSPQ=b5N$Uw7Kh&x=m`ZGW*R+FrQ!XP340;iKp7UR-wcZMk08 zx~!_CkD}%8&culN-Y)stV_p8vB!D4A!-en8v5gL5F^9l)!ra>@=68Sk{cVqco@ku# zwtw$Cqdr~!Kg;7+I*0Z5GIL+<_P-{j@8A0W+5O!uy!B-8W+s7OwHEW%Z`^qCQlp4e zVt8HN(}eF1T#wbnVlG%k6?L4P$uL!m;o`2T_uoZbHr>11IxDN|T_*R+y6TIjGiO1% ze1|;`^v7&}W_d47QK9LzIN{_>(8#2=d8SYzw6tv z7w5BcdxK{Gd%o@b{R=k}yQJ8g4Gx`pD4hIf<-GOZdup1G`J2q*7ya~gULf0l;pCXx z)o~%|0&ca}t~{$W`BTEB-Tq?^d(1Va4YiTCzy6HhqO1L>y<8?Oq_EQMtg3U`++7*0AH_fY<&b?K{O!v%C(Va; zXZ}w-Jv%jgEfYg(KI6^Be{PGLm)2{?yqZ@WT76}vrEbEptKn|d{}*1`Z)@`P%(_3i z&QmJb|2wSuT$P-ho$YTL&gY!=_tAtULQ}Rgdra8s^;7lS6Twr_Yp31i&~A^|%e#Wf zA?ECk(%f&d^@kLbeecHaQxg6yez)lAGT+(jUcKWBZ@t{Ox{%3X9ka{d{Fhg6Rn=^L z+A0>5>wTYVVZzgZt1AMxh-rC*gar$~WVlqnw7D+w+4Bjq3$~rsyUv)kyC{HRMYQ$% zGqtb6_MLORsT2^q^VGhw+-+<;Yr^anGCQnd_I>v9{*3C<_b2y0IsTAeJ3{j%^W(lr zm;SSC{}NzP8UP3aty`DQSq%-F@fO!~A`} z9E`XbmQ3SgxN==I&~<^Zop{kP9-d?3Pbfw93WbwP^FeRjFlyG&OyAGtF! z$TCd$r+$S+X*cVcg3fqGhA!UniWPhem+B{-YEV=7xR`-Kb#K8d28F-sn>ZsjtD1g^ z-o)i_Hrz~iet!2im&^65AD(#pdbd?o(RG=~d!^T&FPDkj_w&P zS0A3eVgA;XkERzV^~!EuzjJ%(d0*|_WoPz1dwHg{VD`(O+v~0F)SWyg`|!}+Tyx!* zU1BwF?!DMJ``Y`HcKqNjImlA?b&RtbF7z`6FtS&df05~1bhtnN_lGZcT<((C-LEo? z$vctr{`@^plj0B47cevQY~_r&c+~QHwAB?)Mu~f8+D_hOXPflvNoMe-o&VqU+g`XJ zJ=cEc%bUl`MDFf;c_~}&MD4dv2bKHXF7{!s<)^Hg(%*TJQNb|slyGH>+5)yCx?iGY zuH-XXRR8+f8vfSe!tE;sWjFrJ|GNsMzBjz0_NU;t#;r{ScNgTpy|KsoPkyC^Mn;_X zl)ZEQFJ0+yGhWt}eZs%1467#m=C%78!*K5Z2j=ZQ=W{OF@A&%3VCiS|&(C!I@BH1k zT)Jxa;*-9C-*(Tu?f?7Dqm%P_#rg8~Wpz94!O$S9TJnspdc3 zS>v1d7(D(9uV!4mNVIn@o9{b!Mv2MIf89TP_x-T$bU0s4Va3l$>vhlX|M=!wru4s0 zpWZCAHWvSLZ_>@(;(2l(zs)v}vwLANze(Sbongs;&b9BJZ95DB)SUE4~9P>3s1>TqYm#csNwE5M#H)-$P&VM{4m9SU+`(lQkHyBk&a3`?|E@cR9C{IO~4)dM2y zzAL%2^s4@nR(-XMfx(JFMWJr$zdJg9|0`t|9QSK@nANcLe!{dhzR8GP#q=+Kj_i+? z?mcQ{OI)F3i9{Z&YQX+o?85m?4CMoZEneNEWah>ON;&Pf~9&Xn$)Z9UyD#jb&g z!HPlP@|XC9TOI$s&(htsX@QW+O8zTfXBAvvw0}D1qh7w_ zf9AnO_FN1B&%*6w8776uX~nX2m2-=%xV*US(M}_1Ch~@FyY_h2(~tBs})DQ1Xjng7)DCo`q0nB@Pa|%@A18CJ&QSc#J^|n?q0A> z+xenAD}%(NshjqI0!-m=_zKRR--1_b#2tOZ+Q3fOd_7;5VafkZCXFB83P^0_ms!tJ zzII0ZMz4UUQx}Trb1^JnZul~Pf|NjL!tFA>cjt5G?_an%IY3n-TYkm4Qy1FmMHn2| z8O|!s^j#2R&EmF#h51zJm4Kz;ZP&Jd!%LIvV`g<%XkPn)6}1Xo_pAHCPVITyy0!@F zq~)9;mW=(?;*P4@yq-fQU*?UWNOBp=LD!8(lqsy9EgTWzopFy=D^UL}*Y?BIK&elzeW_F9< z<%{KvTHMIop7rnE;sv1O6rz0G`~T1B$3>bRM>2aw@;>|b%%5kU?@qgUJm8>sY5(qG zebehXE7tWbk-x3SRLj81aDma`mw&-8`R_lynN1b=oUIO775LOY++h#Wg?o&<$`y%ChY?y@fQpW z%vAO|v@7 zj15cnHeLH>lOW6RGX9r*C2Q!*FYz0=x>oJbR``GYXys1pjS>)lu8(A2k#TKJn%Mf+ zsc(-YLBeD|+s@64vKOwHw414GdTH$XUtn*QFf6Hmxqr^XO~2f=!b-vq6qL_i5;{MY z1(a|azUcpr7F=2$dE2#tiD6^3{_*D^%jY(-tnYB!yZXzT?@%Lxq@JGr5O}qQ+jXZO z=Y}=j@0qn2xfotB#FPUq`gt-1v50Q_*{3LR;sGym|HG*-KoR;bCp1OZFcl#a)-q6-tP_ zzCkD?L;T=@ySF&OL3U~Xm-xDkwf&od#GblL+j=$j=5Gg+hp{Y2d!5+9@w23Uwesm* zd0LK%3-)IpZF_im&*3^yz%;DjI^Gn#eD&f@I@zyxX?<_p`S$bvy6at!qkT{!^|(||5(#^YWJG8FS7of(zvM& zE~M(eUb)zI^$ti|7OzI?Iw=iMARSlrh z!{h&w?7RrsrCLv|JslVuRMy;m^Qr?j{-Tel2GK14EqV#D6QBI}=M; zxEPMa#?EJd<0}4g{tn+Bqji02t_3hK?1@nNs~#p>%Vq!$)m2Pl+e-yO<~RsB&-;>} z6jB_U(%Qzv5b(~r2fJGV5heB!^AiNCHhIxsS< zI{RAhQvKcnwhf_@8Vn8MeoN|KCFDg2HbOk>@jo?AFtUFk14G5zC4HL}UdB8Mb6LRP zut(*SO@jVjAA={J|JB+=1vMBLJpNCaY23ib%CLgt_Pq)JR{nI7|K4>%iiefKf!*QP z@^hE$!7jdJzta2vHKzp(4lyeKY!cS*6PowM-$(4%k84iXVl_a)qZ)a2pVO~?-E;`h<$MXf^3@6f3=H}Qt|&b8{2!6p$i(n+>b%bldlz{9 zzqJ3QV7qJnUuG_b2c{A)?On4<*$UQ(?fuHH!O(C$VM#p$C|x=HS}x;N6Mf^xx|%gB z0~i=e7*5?6@c3{^{%h<)23Ceks&heQ?@P|_m-fF*Jj=|*&=8*Va=z3D$phB{K`|9S z@!!guJR5H@f>O;M3Ge?N|G_EbO7ynwhr9PRl=5jX2q>Rp{#G?-$(Q%B@f&`E>U~*< zPm7PuVYE3Y+V@q6i=lx};lB6(8Egv}7+x@3vRCWe%B#V^5I1!x$c+rL4!_iOKOb4e zCc=;)kk9g@HS*W;qE!WK1yX5ErGi`x4cB8|#{W8A#U{eQu>R~WMm1)zIi6mnO!8{X zpulYS!ha2vQdEoOHiT!qobR>bh2(+E+5Fe+LDn>1p8D_LD^?K(2K`H#UjKJ7K7(u0 zUBJLlF?ZTO&yOvPA`A;uKn*Y#+f%EZ(ixUldPO`3N!$8W9GU)aV;CbV!-3UXzw~p$ zbcbnzqz_K}=XrPzqX$l)t*@b9Mmu8fAN#n76v8g9Pf%5(qKncwDuKF zn*0H@o>bQ1SNj(~{?&pa3=5>@u)jGP{VV;^97Y~cN(WT}Q;MH4fJ5(ZvnU71D~FcW z3z=803EIL0^39DVSq3f!13i$dwPe36{hy+JUGl&)&spKJAjKyT!Rz}ORQi-Kyp(4E zCDaN3Jnx8XI%dG9!QjAZ$$vw8*O&7@e()qXFfw?=vQPMDn7GCk#6G&ZqOe5x*@0b5 zA`A^F`__5?4@nYZgt!P42~VHdB*;4aN?)T^!L}h2lz8|Q{xW;s@L}L$aBzxyu(V#w zd^*%dMo@?}?D)oLP^q=OsK7;liy@#6_n93~k%aEJ-rW?WLQWj+^K3&TtKHNp;z z3?HiW{|39CQF35xs3?>(xMaVy09-mu2|mNm!X(TYz`!7MmGM*atP5-nObipA@G1Na zepz|+M;NOghZ`fq1x9d&NJyH)KIa)ouB&hkV~!Og7lXqatA;Q9AU)Ig6#h1^1#Qb% zV#w(6e?~|HlY{J!ukruCX0P9S&0+zwkHLJ-ECvmREA8BRI}RvJnfSRO_$uR)`eP|; z(ivulADG~0#Nu;dalc)bfJZdDhWCm|{}i`AmCrgY$Dnpf(V>IslD%O{79$tK)JFme zmu@nKZCyX%A7cQ6$71)*J}t`G%Z@W2%N`rI542^b%gA-ofS9D-FGTD}aVXD{vz|8rAY^gIVR;evu zV7OxO_cdt#m*J%sXrB-lLx9$EM)gj<13#t|v2A!nEm2@U1!v|yCR*z`rq& z2P|M#m_GlZRL<{C_L|c{68oG|6Qsl%kZji zxh@w&fa5u4zp`KAY7%~$^BF;{qbu>ht}}Mr&S4Q@U|2PAdkM(mhAm6#Wg8^?JRBGq z1h$nh90(R=WmsYGobkHZUv9CG`Nj>d^#KeFS=0Vy7p-Y+ImmJO(notx!dvlWJu^7j zX(NY(v!CDb|3})Ft3&Ni|0Qm8>7?WVkdAv$9U)qOkNCT3wEmyg|~%XpFs02D#daI zm6z*{vKsg%s6cY)l6u(#OG^LnF96wK#ZbZ2#KbV++!y^Oxbr*b@2c3<$i$%e)F$C& zyoRS1xPo)Ayj)-P0u;*)U*@k6i7)4nBA9?7Z@so0Y)< zl6o3CJ%3gn02wU7n$9r$Oal{xf!8m0cF@}Ypeg^pGRiU}edYPI#fgz&!oO06W0r>* zMHn2+CQSp!yvNdzx$HWBUo&(*F>bJ3=m1jWDh8^6e@*{a+VI7Oe0*B6}{Xdu*K*0nJ zyMDfa>&Ei_@&ODD3ss-lBuIL6c#6(ve8b7a#V{f3@Y4FV4o5%@o+b4q4NuP3+Y~x5 zGAyZgkz@ebx|Tr}lzmn_{@k$lZ9m@xzjF-VrZBQHcqqTze~^)PggKe}SJk$rvvV;h-0!fnVgRR*#mo)M*)$jqxEy(ClkigBk==oj z;gZuYcXkQKcRUH_TT^!LEY9rQeD^aGD}zVTFZM`~f}kn?N|{R-J}dzT#SvKs5r%}M zRrPWkzV!12tb5L_W~ss8P`g|*lKo>w!+C~dml;_ZCj1kuV(@1dVQ~26{sI)9uQdKP z^F8QH&g;+2dwp1g;Xq5sFPjH}&OK9_?|^DT&W)>TTfg-48HAltIeUj(@%=@!eW2xgg|&3pkD(*-gPX)qkHaQ?sIy2pPHdx7&m-$XVrG5DDL z<&UwSCS-o z<|z@(UOxXHrkR)PnQrKCO#XXX*RBMVyxhF}{}=HjU6}FY979{Df2=G6I2@ONisqN{ zvJ7Xy$x7aHMO*!;BI*7AW|{u8a(?bpF2P9Lve?BnuZ#=)QneHs62`LUP5>?^K5 zIG*yy@OdCZgVgf+6=}cpITm-GcQ&+S-jT4Sv_a%p3CQdv^|_5VmR?#?)-cO{|B+fy zpn0@77lMSeeoC@G94(JB(KtL>MOgTWI#uo-fhlpsd2V!+yN#DL+KZSQmi2 zx3yan#Q~!NF z9B^~K)YjT{ts7-a3wbJM&(N7N#r?CE&%9NCl|&d8OnWJ>CHnn+lwtjhHxc@`XIvI* zW1AMD+3lkmU>3l@(As!K{olcz1$n>!@XnQ0W;v^v?Qkb4_0ypX1=fsia+OmRLW2t* zL@2E1<6@X_z(oJA@xdMT6K{miad|vb;qnE>V}_r!93TB|yUqa$Lc#B+% zpWoY;d(7C&QhLiushwGqq2Y_a(&IYb%Mr0l4z%R*u01)!x?qKz`ohDFpq#62*%^Py ztCGDVoj;KCktL^Z9V^3%>tFn5J>I9F%C?flr{L*&nF<( zdo*yT*Mw~w*Cuk8T1)_yy+<_OdH>P$Oc3!eJ>NR(%>NVX7(fnOS@cM}u!NzlT2E!4 z(3P5BH$_3^p1o-QZ=wAHZC(P~U#5pclK5{c1}(=|^O)i?K<-Mn>5Tv6QNUinw!v${ zkAImEMJ`|EbXHuJal57ExW>xiU8y^707Jv9rS(Zue;loqWtghKTkH=Kidt45xumVo zephzuk@d_AgqHl=`5@JUkzvXI7WIEk*MIMP`+4y>zQt2M@m-iaS7r6PsEt}N`57Ti zU#9x2vw>3k{5d=1Zyq|nV&QVrTbrK#n7VfDO^K9SD_B5deKSiva;zPmbbuq^Xzir@ zf?xba@oiEIn3wDkYPs7iy=gbQ_QrXgZyhuGID!}$UfRFwjK7oaBUvCKFm)YE>Bqc~b0B{jEves{=%YU&KzQxibIi-6rY?xPH!+MCR5k6l>5RX_ z9@12xR#j2BqI>HiDNx4H|J$$o&il_1y|X4}ZI5f_u=~hpIlg0Eq!%_jtAUB((*7^@ zIgiA@ubj>&;ClQ%&z7xQ-&Zv|PYo`unEAuy;%S#0ZO1y^3oM|#cX`sk+z0B0vI?*M z|IxoVe@Exf*%SEoY`LijvS5tRW(_sp)Z(2_q}RlK(qq)L-xV`N+<}$=X3it5FSP zY`phT?O%QWw_SO7j-l`!gQ)MBr6EmypKRy+QCq;K!JzOrT=}E;`WMfm4lsOt#}Ha) zD!E9A=U%vsZ-sv2WU#BXMZYVze_>Er%66roJLu!SN1OKCu`uyqWOx~Whh1TrY{Hf4 zvpe^wWHNCvs3`soSO3`ko59M#XUb9`5p%{=2gZh7p8r!L9d94tcaSY@FbZq>!=ACd zfr-J>@4wjx<_Syq0;YK-fCNr@f&>gE@=a)vv03J2@FWkcJz{yi^bbajWcH3%&y$~> zj^mV3Uc%rYb9q1SABK>HY%1%Sdv*$K`F2-r>uy#N291-TPSw{l<%hYJY^>jE^zqC7 zrKX?b3*{SLl{bXA-b>VW%#PE%5%kRH!sW}GU#$~;c*yekoW%?db1R=t4L`KMTg-K5 zeROoS6T5`_FZsOB%nTv>nO!_>WHOYdCU|H6J6+tb z)-`m7HvO{;Q0I4HY}mAxbxA$LtL@AcbG4i$G^`jb=BY&%1;}1o#c*UlTTA%rKjz0( zCca?=b@1{j|48b*e3>J?xOkD`8>Cz{(J$GH31mTT*_v_4nAtTz;YZhtb24 zx4`AX4YxHL3wJzukn6B;o|VJ5%HLk^nh#uC_qMufdL6&nf98PevI<2m7bL75%q+i% z9Oq0EZ)%U><>9#T{Ay$TZ`CR z8f@^~)B|~ptPHOj&i)Tbjer00r%Uo;clMKcOsBxkx-h+8c+RBBe_t$!Np+A9U|8T4 zSNU}6^|&UTp}*Q^J$?LS>5~+Ds})7^D=M{5xc+Z^GU4*AUtVjh8kij3 zoSh-~_DMsc$x?&iNciuy-OFpUKjy!W-Mi!c>(#S<1=pvWjhTU%qJoX?+sq6`|I&*#omewTjd*7v79nZ9?ce+&PAxA$VGZeYk} zrU}+u8cTPxzl$=w|Hg!`P^x9Zr1fjR_I9Tx|8BXZ8A?Z~vT^)+cAY zO3aV_c+*C8TE&7(vJYp8QXd zQC30v@8j7rYLOlRU6=js|K5FHx4p38*0Luo?oaMCPx`0mX{xa8Ht$b) z0tyTa9f|B3I~FiFY<+v9@Dr!H1RKMGTe1#}4Yz(A*w+8^#5vUlj-$Of7x6bh;D^L&J|JO4SS+vy&rPH~)Fm zt$%MpU6KF>-)_=z4-06ABT13Ff%YLQIz79te$sPYhUWs8_W(% zMf~#^7#LSRV>~Ixpk;lOmx;ll=F)y9hnb@951gv!zc4YMlVQS}29p@QRYvU$j0_H4 zH<%qP=a%2AOx>@_;NZm+bXTOoU9R#-k?M`D+2J=q$|p6He0g#4mj(m3xZai+PCx6n zCd~{C0`=!$8-Uc7i=z{S8YLFm8z>Q6CO Ur+iS!1+DAzboFyt=akR{07rS30{{R3 literal 0 HcmV?d00001 diff --git a/doc/src/qtquick/qtquick-timeline.qdoc b/doc/src/qtquick/qtquick-timeline.qdoc index 3462330208d..de012b94e56 100644 --- a/doc/src/qtquick/qtquick-timeline.qdoc +++ b/doc/src/qtquick/qtquick-timeline.qdoc @@ -245,8 +245,11 @@ components can appear to pick up speed, slow down, or bounce back at the end of the animation. By default, the animations you specify on the timeline are \e linear, which means that they move from the beginning to - the end at a constant speed. You can use the curve picker to edit the - easing curve at a keyframe. + the end at a constant speed. You can use the \e {curve picker} to edit the + easing curve between two keyframes. You can also use the more advanced + \e {curve editor} to edit the curves for the whole animation. + + \section2 Attaching Easing Curves to Keyframes \image studio-curve-picker.png @@ -256,16 +259,16 @@ custom curve. For more information about easing curve types, see the documentation for \l [QML] {PropertyAnimation}{easing curves}. - To zoom into and out of the easing curve editor, use the mouse roller. To - reset the zoom factor, right-click in the editor and select + To zoom into and out of the easing curve picker, use the mouse roller. To + reset the zoom factor, right-click in the picker and select \uicontrol {Reset Zoom}. - To select easing curves: + To attach easing curves to keyframes: \list 1 \li Select a keyframe on the timeline. \li Select \uicontrol {Curve Picker (C)} on the toolbar, or press - \key C to open the \uicontrol {Easing Curve Editor} dialog. + \key C to open the curve picker. \li Select an easing curve in the \uicontrol Presets tab. \li In the \uicontrol {Duration (ms)} field, select the duration of the easing function in milliseconds. @@ -279,11 +282,13 @@ to \inlineimage keyframe_manualbezier_inactive.png . + \section2 Customizing Easing Curves + To customize easing curves: \list 1 - \li In the \uicontrol {Easing Curve Editor} dialog, select an easing - curve in the \uicontrol Presets tab. + \li In the curve picker, select an easing curve in the + \uicontrol Presets tab. \li Drag the curve handlers to modify the curve. \li Right-click in the editor, and select \uicontrol {Add Point} to add points to the curve. @@ -299,6 +304,32 @@ To paste easing curve definitions to the curve picker as text, select the \uicontrol Text tab. + \section1 Editing Animation Curves + + In the curve editor, you can view and modify the whole animation curve. You + can insert keyframes to the curve and drag them and the point handlers to + modify the curve. You can modify the appearance of the curve in the style + editor. + + You can also edit easing curves that you added with the curve picker. + + \image studio-curve-editor.png + + To edit animation curves: + + \list 1 + \li In the \uicontrol Timeline view, insert at least one keyframe. + \li Select \inlineimage curveGraphIcon.png + (\uicontrol {Curve Editor (C)} on the toolbar or press \key C + to open the curve editor. + \li Right-click in the curve editor, and select + \uicontrol {Insert Keyframe} to add a keyframe. + \li Select keyframes to display the easing curves attached to them. + To select multiple keyframes, press and hold \key Ctrl. + \endlist + + Your changes are automatically saved when you close the editor. + \section1 Rotating Items To animate components that rotate around a central point, you can use the