diff --git a/src/framework/ui/qml/MuseScore/Ui/internal/StandardDialog.qml b/src/framework/ui/qml/MuseScore/Ui/internal/StandardDialog.qml index 96eda13a48..4f0ea272dd 100644 --- a/src/framework/ui/qml/MuseScore/Ui/internal/StandardDialog.qml +++ b/src/framework/ui/qml/MuseScore/Ui/internal/StandardDialog.qml @@ -41,6 +41,9 @@ StyledDialogView { property var buttons: [ { "buttonId": 1, "title": qsTrc("global", "OK") } ] property alias defaultButtonId: content.defaultButtonId + contentWidth: content.implicitWidth + contentHeight: content.implicitHeight + margins: 16 onOpened: { @@ -49,21 +52,11 @@ StyledDialogView { StandardDialogPanel { id: content - anchors.fill: parent navigation.section: root.navigationSection - buttons: root.buttons - onContentWidthChanged: { - root.contentWidth = Math.max(Math.min(491, content.contentWidth), 306) - } - - onContentHeightChanged: { - root.contentHeight = Math.max(104, content.contentHeight) - } - onClicked: function(buttonId, showAgain) { root.ret = { "errcode": 0, "value": { "buttonId": buttonId, "showAgain": showAgain}} root.hide() diff --git a/src/framework/ui/qml/MuseScore/Ui/internal/StandardDialogPanel.qml b/src/framework/ui/qml/MuseScore/Ui/internal/StandardDialogPanel.qml index c5bf78bc97..cac8f5619f 100644 --- a/src/framework/ui/qml/MuseScore/Ui/internal/StandardDialogPanel.qml +++ b/src/framework/ui/qml/MuseScore/Ui/internal/StandardDialogPanel.qml @@ -25,7 +25,7 @@ import QtQuick.Layouts 1.15 import MuseScore.Ui 1.0 import MuseScore.UiComponents 1.0 -Rectangle { +RowLayout { id: root property string type: "INFO" // "QUESTION", "INFO", "WARNING", "ERROR" @@ -42,15 +42,10 @@ Rectangle { property var buttons: [] property int defaultButtonId: 0 - property real contentWidth: Math.max(textContent.contentWidth, buttons.width) - property real contentHeight: content.contentHeight - property alias navigation: navPanel signal clicked(int buttonId, bool showAgain) - color: ui.theme.backgroundPrimaryColor - function onOpened() { var btn = root.firstFocusBtn() btn.navigation.requestActive() @@ -112,126 +107,109 @@ Rectangle { name: root.title + " " + root.text + " " + root.firstFocusBtn().text + " " + qsTrc("global", "Button") } - ColumnLayout { - id: content + spacing: 27 - anchors.fill: parent + StyledIconLabel { + id: icon - property int contentHeight: childrenRect.height + Layout.alignment: Qt.AlignTop + Layout.preferredWidth: 48 + Layout.preferredHeight: 48 - spacing: 16 + font.pixelSize: 48 + iconCode: root.standardIcon(root.type) - RowLayout { - id: textContent + visible: root.withIcon && !isEmpty + } - property int contentWidth: (icon.visible ? icon.width + textContent.spacing : 0) + textColumn._preferredWidth + Column { + Layout.fillWidth: true - Layout.preferredWidth: content.width - Layout.preferredHeight: childrenRect.height + // Unclear why "+ 1" is needed; apparently implicitWidth is incorrect + readonly property real textsImplicitWidth: Math.max(titleLabel.implicitWidth, + textLabel.implicitWidth, + withShowAgainCheckBox.implicitWidth) + 1 - spacing: 28 + // Allow the text to make the dialog wider, but not too much wider + readonly property real textsImplicitWidthBounded: Math.min(420, textsImplicitWidth) - StyledIconLabel { - id: icon + // But if the buttons need more space, then the dialog becomes as wide as necessary + Layout.preferredWidth: Math.max(buttons.width, textsImplicitWidthBounded) - Layout.alignment: Qt.AlignTop - Layout.preferredWidth: 48 - Layout.preferredHeight: 48 + spacing: 18 - font.pixelSize: 48 - iconCode: root.standardIcon(root.type) + Column { + width: parent.width + height: Math.max(implicitHeight, 32) + spacing: 18 - visible: root.withIcon && !isEmpty + StyledTextLabel { + id: titleLabel + width: parent.width + + font: ui.theme.largeBodyBoldFont + horizontalAlignment: Text.AlignLeft + maximumLineCount: 2 + wrapMode: Text.Wrap + + visible: !isEmpty } - Column { - id: textColumn + StyledTextLabel { + id: textLabel + width: parent.width - property int _preferredWidth: Math.max(Math.min(titleLabel.implicitWidth, 420), - Math.min(textLabel.implicitWidth, 420)) + horizontalAlignment: Text.AlignLeft + maximumLineCount: 3 + wrapMode: Text.Wrap - Layout.preferredWidth: _preferredWidth + /*todo*/ 76 - Layout.preferredHeight: childrenRect.height + visible: !isEmpty + } - spacing: 16 + CheckBox { + id: withShowAgainCheckBox + width: parent.width + visible: Boolean(root.withShowAgain) - StyledTextLabel { - id: titleLabel + text: qsTrc("ui", "Show this message again") + checked: true - width: parent._preferredWidth + /*todo*/ 4 - - font: ui.theme.largeBodyBoldFont - horizontalAlignment: Text.AlignLeft - maximumLineCount: 2 - wrapMode: Text.Wrap - - visible: !isEmpty - } - - StyledTextLabel { - id: textLabel - - width: parent._preferredWidth + /*todo*/ 4 - - horizontalAlignment: Text.AlignLeft - maximumLineCount: 3 - wrapMode: Text.Wrap - - visible: !isEmpty - } - - CheckBox { - id: withShowAgainCheckBox - - Layout.fillWidth: true - - text: qsTrc("ui", "Show this message again") - - checked: true - - visible: Boolean(root.withShowAgain) - - onClicked: { - checked = !checked - } + onClicked: { + checked = !checked } } } - Item { - Layout.preferredHeight: 30 - Layout.preferredWidth: content.width + ListView { + id: buttons + anchors.right: parent.right + spacing: 12 - ListView { - id: buttons - anchors.right: parent.right - spacing: 12 + width: contentWidth + height: contentHeight + contentHeight: 30 - width: contentWidth - height: contentHeight + model: root.buttons + orientation: Qt.Horizontal + interactive: false - model: root.buttons - orientation: Qt.Horizontal + delegate: FlatButton { + navigation.panel: navPanel + navigation.column: model.index - delegate: FlatButton { - - navigation.panel: navPanel - navigation.column: model.index - - //! NOTE See description about AccessibleItem { id: accessibleInfo } - accessible.ignored: true - navigation.onActiveChanged: { - if (navigation.active) { - accessible.ignored = false - } + //! NOTE See description about AccessibleItem { id: accessibleInfo } + accessible.ignored: true + navigation.onActiveChanged: { + if (navigation.active) { + accessible.ignored = false } + } - text: modelData.title - accentButton: Boolean(modelData.accent) + text: modelData.title + accentButton: Boolean(modelData.accent) - onClicked: { - root.clicked(modelData.buttonId, withShowAgainCheckBox.checked) - } + onClicked: { + root.clicked(modelData.buttonId, withShowAgainCheckBox.checked) } } } diff --git a/src/framework/uicomponents/view/popupview.cpp b/src/framework/uicomponents/view/popupview.cpp index 19d0b3c012..eb553f0796 100644 --- a/src/framework/uicomponents/view/popupview.cpp +++ b/src/framework/uicomponents/view/popupview.cpp @@ -103,6 +103,10 @@ void PopupView::componentComplete() m_window->setOnHidden([this]() { onHidden(); }); m_window->setContent(m_contentItem); + if (isDialog()) { + connect(m_window, &IPopupWindow::sizeChanged, this, &PopupView::updateSize); + } + // TODO: Can't use new `connect` syntax because the IPopupWindow::aboutToClose // has a parameter of type QQuickCloseEvent, which is not public, so we // can't include any header for it and it will always be an incomplete @@ -175,11 +179,7 @@ void PopupView::open() qWindow->setModality(Qt::NonModal); #endif - QRect winRect = m_window->geometry(); - qWindow->setMinimumSize(winRect.size()); - if (!m_resizable) { - qWindow->setMaximumSize(winRect.size()); - } + updateSize(); } m_window->show(m_globalPos.toPoint()); @@ -574,6 +574,24 @@ QRect PopupView::currentScreenGeometry() const return currentScreen->availableGeometry(); } +void PopupView::updateSize() +{ + if (!isDialog()) { + return; + } + + QWindow* qWindow = this->qWindow(); + if (!qWindow) { + return; + } + + QSize size = qWindow->size(); + qWindow->setMinimumSize(size); + if (!m_resizable) { + qWindow->setMaximumSize(size); + } +} + void PopupView::updatePosition() { const QQuickItem* parent = parentItem(); diff --git a/src/framework/uicomponents/view/popupview.h b/src/framework/uicomponents/view/popupview.h index daff273c26..d89dfcfd9b 100644 --- a/src/framework/uicomponents/view/popupview.h +++ b/src/framework/uicomponents/view/popupview.h @@ -198,6 +198,7 @@ protected: void setErrCode(Ret::Code code); QRect currentScreenGeometry() const; + void updateSize(); void updatePosition(); void updateContentPosition(); diff --git a/src/framework/uicomponents/view/popupwindow/ipopupwindow.h b/src/framework/uicomponents/view/popupwindow/ipopupwindow.h index 90826f641c..707fe64006 100644 --- a/src/framework/uicomponents/view/popupwindow/ipopupwindow.h +++ b/src/framework/uicomponents/view/popupwindow/ipopupwindow.h @@ -61,6 +61,7 @@ public: virtual void setOnHidden(const std::function& callback) = 0; signals: + void sizeChanged(); void aboutToClose(QQuickCloseEvent* event); }; } diff --git a/src/framework/uicomponents/view/popupwindow/popupwindow_qquickview.cpp b/src/framework/uicomponents/view/popupwindow/popupwindow_qquickview.cpp index b1461191c3..b55d40e0e2 100644 --- a/src/framework/uicomponents/view/popupwindow/popupwindow_qquickview.cpp +++ b/src/framework/uicomponents/view/popupwindow/popupwindow_qquickview.cpp @@ -91,6 +91,7 @@ void PopupWindow_QQuickView::setContent(QQuickItem* item) } if (item->implicitWidth() != m_view->width()) { m_view->resize(item->implicitWidth(), item->implicitHeight()); + emit sizeChanged(); } }); @@ -100,6 +101,7 @@ void PopupWindow_QQuickView::setContent(QQuickItem* item) } if (item->implicitHeight() != m_view->height()) { m_view->resize(item->implicitWidth(), item->implicitHeight()); + emit sizeChanged(); } }); }