From cde9090c525b17ac9ff3d87153f9cbf5f8a42b07 Mon Sep 17 00:00:00 2001 From: Joachim Schmitz Date: Sat, 6 Jun 2026 16:47:22 +0200 Subject: [PATCH 1/9] Make Revision in Score properties a clickable URL to the corresponding commit --- .../internal/Properties/projectpropertiesmodel.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/project/qml/MuseScore/Project/internal/Properties/projectpropertiesmodel.cpp b/src/project/qml/MuseScore/Project/internal/Properties/projectpropertiesmodel.cpp index 7adf125ed6af..426fe62ef075 100644 --- a/src/project/qml/MuseScore/Project/internal/Properties/projectpropertiesmodel.cpp +++ b/src/project/qml/MuseScore/Project/internal/Properties/projectpropertiesmodel.cpp @@ -161,10 +161,12 @@ QString ProjectPropertiesModel::revision() const { int rev = m_projectMetaInfo.musescoreRevision; QString revision; - if (rev > 99999) { // MuseScore 1.3 is decimal 5702, 2.0 and later uses a 7-digit hex SHA - revision = QString::number(rev, 16); - } else { - revision = QString::number(rev, 10); + if (rev > 0 && rev <= 5709) { // MuseScore 1.x and earlier used decimal numbers, referring to a commit on SourceForge.net, the largest being 5709 + revision = QString("%1").arg(QString::number(rev, 10)); + } else if (rev > 0xffffff) { // MuseScore 2.0 and later use a >= 7-digit hex SHA, referring to a commit on GitHub.com + revision = QString("%1").arg(QString::number(rev, 16)); + } else { // unknown, like in a self-built development version, or in a very old version of MuseScore before the revision number was tracked + revision = QString::number(rev, 10); // or "" or "Unknown"? } return revision; From cce74b3e58ed705267bce7f49b6bf0af677e449d Mon Sep 17 00:00:00 2001 From: Joachim Schmitz Date: Sat, 6 Jun 2026 17:00:12 +0200 Subject: [PATCH 2/9] Adjust `$r` Macro replacement to use a similar logic No URL in the score though, as that isn't supported yet, see #18055 --- src/engraving/rendering/score/headerfooterlayout.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/engraving/rendering/score/headerfooterlayout.cpp b/src/engraving/rendering/score/headerfooterlayout.cpp index beb823c63bd0..92fd36a1f264 100644 --- a/src/engraving/rendering/score/headerfooterlayout.cpp +++ b/src/engraving/rendering/score/headerfooterlayout.cpp @@ -357,14 +357,15 @@ TextBlock HeaderFooterLayout::replaceTextMacros(LayoutContext& ctx, const Page* break; case 'r': if (page->score()->dirty()) { - static String revision; // FIXME - newFragments.back().text += revision; + newFragments.back().text += String(); // FIXME } else { int rev = page->score()->mscoreRevision(); - if (rev > 99999) { // MuseScore 1.3 is decimal 5702, 2.0 and later uses a 7-digit hex SHA - newFragments.back().text += String::number(rev, 16); - } else { + if (rev > 0 && rev <= 5709) { // MuseScore 1.x and earlier used decimal numbers, referring to a commit on SourceForge.net, the largest being 5709 newFragments.back().text += String::number(rev, 10); + } else if (rev > 0xffffff) { // MuseScore 2.0 and later use a >= 7-digit hex SHA, referring to a commit on GitHub.com + newFragments.back().text += String::number(rev, 16); + } else { // unknown, like in a self-built development version, or in a very old version of MuseScore before the revision number was tracked + newFragments.back().text += String::number(rev, 10); // or "" or "Unknown"? } } break; From 332abfac3b69900585532a761db27cf5532cf254 Mon Sep 17 00:00:00 2001 From: Joachim Schmitz Date: Sat, 6 Jun 2026 17:15:59 +0200 Subject: [PATCH 3/9] Resolve an old FIXME --- src/engraving/rendering/score/headerfooterlayout.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engraving/rendering/score/headerfooterlayout.cpp b/src/engraving/rendering/score/headerfooterlayout.cpp index 92fd36a1f264..68229050401e 100644 --- a/src/engraving/rendering/score/headerfooterlayout.cpp +++ b/src/engraving/rendering/score/headerfooterlayout.cpp @@ -357,7 +357,7 @@ TextBlock HeaderFooterLayout::replaceTextMacros(LayoutContext& ctx, const Page* break; case 'r': if (page->score()->dirty()) { - newFragments.back().text += String(); // FIXME + newFragments.back().text += application()->revision(); } else { int rev = page->score()->mscoreRevision(); if (rev > 0 && rev <= 5709) { // MuseScore 1.x and earlier used decimal numbers, referring to a commit on SourceForge.net, the largest being 5709 From 28ebef2bee7bd9e91f8b76eaf25c2ad9501b2a99 Mon Sep 17 00:00:00 2001 From: Joachim Schmitz Date: Sat, 6 Jun 2026 17:53:44 +0200 Subject: [PATCH 4/9] Make the Revision in the About box a clickable URL too Update muse_Framwork, as a prerequisite for having URLs work --- src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp b/src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp index f9c57e57a894..5ec54df5efde 100644 --- a/src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp +++ b/src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp @@ -45,7 +45,8 @@ QString AboutModel::museScoreVersion() const QString AboutModel::museScoreRevision() const { - return QString::fromStdString(configuration()->museScoreRevision()); + return QString("%1") + .arg(QString::fromStdString(configuration()->museScoreRevision())); } QVariantMap AboutModel::museScoreUrl() const From 36d1b8d3a97b7b98232a5cb897bb986dc9963e80 Mon Sep 17 00:00:00 2001 From: Joachim Schmitz Date: Sat, 6 Jun 2026 17:53:05 +0200 Subject: [PATCH 5/9] Fixing URL in the About box clipboard the old one makes sense on musescore.org, as it automagically turns into a URL there, but it doesn't work on GitHub. This way it works on both. --- src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp b/src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp index 5ec54df5efde..16124335597b 100644 --- a/src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp +++ b/src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp @@ -88,15 +88,13 @@ QVariantMap AboutModel::musicXMLLicenseDeedUrl() const void AboutModel::copyRevisionToClipboard() const { QGuiApplication::clipboard()->setText( - QString("OS: %1, Arch.: %2, MuseScore Studio version (%3-bit): %4-%5, revision: github-musescore-musescore-%6") + QString("OS: %1, Arch.: %2, MuseScore Studio version (%3-bit): %4-%5, revision: " + "[%6](https://github.com/musescore/MuseScore/commit/%6)") .arg(QSysInfo::prettyProductName() + ((QSysInfo::productType() == "windows" && (QSysInfo::productVersion() == "10" || QSysInfo::productVersion() == "11")) - ? " or later" : "")) - .arg(QSysInfo::currentCpuArchitecture()) + ? " or later" : ""), QSysInfo::currentCpuArchitecture()) .arg(QSysInfo::WordSize) - .arg(application()->version().toString()) - .arg(application()->build()) - .arg(application()->revision())); + .arg(application()->version().toString(), application()->build(), application()->revision())); } void AboutModel::toggleDevMode() From 0bbdb91dbec589ba3db3862c82a12e2d7ecbecdb Mon Sep 17 00:00:00 2001 From: Joachim Schmitz Date: Sun, 7 Jun 2026 19:24:24 +0200 Subject: [PATCH 6/9] Avoid nonsensical link in clipboard --- src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp b/src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp index 16124335597b..2f412cdabeab 100644 --- a/src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp +++ b/src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp @@ -94,7 +94,10 @@ void AboutModel::copyRevisionToClipboard() const + ((QSysInfo::productType() == "windows" && (QSysInfo::productVersion() == "10" || QSysInfo::productVersion() == "11")) ? " or later" : ""), QSysInfo::currentCpuArchitecture()) .arg(QSysInfo::WordSize) - .arg(application()->version().toString(), application()->build(), application()->revision())); + .arg(application()->version().toString(), application()->build()) + + + QString(application()->revision().isEmpty() ? "" : ", revision: [%1](https://github.com/musescore/MuseScore/commit/%1)") + .arg(application()->revision())); } void AboutModel::toggleDevMode() From 1cd596244336626dab10c9588ea8d71288b79adb Mon Sep 17 00:00:00 2001 From: Joachim Schmitz Date: Mon, 8 Jun 2026 13:36:41 +0200 Subject: [PATCH 7/9] Add build date and time to About dialog --- .../qml/MuseScore/AppShell/AboutDialog.qml | 9 +++++++++ .../qml/MuseScore/AppShell/aboutmodel.cpp | 19 +++++++++++++++++++ .../qml/MuseScore/AppShell/aboutmodel.h | 1 + 3 files changed, 29 insertions(+) diff --git a/src/appshell/qml/MuseScore/AppShell/AboutDialog.qml b/src/appshell/qml/MuseScore/AppShell/AboutDialog.qml index 6d8efdf363f5..bb3b9b5dacd5 100644 --- a/src/appshell/qml/MuseScore/AppShell/AboutDialog.qml +++ b/src/appshell/qml/MuseScore/AppShell/AboutDialog.qml @@ -106,6 +106,15 @@ StyledDialogView { } } } + StyledTextLabel { + Layout.fillWidth: true + + text: qsTrc("appshell/about", "Build date: %1") + .arg(aboutModel.museScoreBuildDateTime()) + + wrapMode: Text.WordWrap + maximumLineCount: 2 + } StyledTextLabel { Layout.fillWidth: true diff --git a/src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp b/src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp index 2f412cdabeab..c9645a318756 100644 --- a/src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp +++ b/src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp @@ -49,6 +49,25 @@ QString AboutModel::museScoreRevision() const .arg(QString::fromStdString(configuration()->museScoreRevision())); } +QString AboutModel::museScoreBuildDateTime() const +{ + auto buildDateISO = []() -> QString { + // Attempt to convert __DATE__ into ISO 8601 format (YYYY-MM-DD) + QDate date = QDate::fromString(__DATE__, "MMM dd yyyy"); + if (!date.isValid()) { + date = QDate::fromString(__DATE__, "MMM d yyyy"); + } + return date.isValid() ? date.toString(Qt::ISODate) : __DATE__; + }; + + QString dateTime; + dateTime += buildDateISO(); + dateTime += " "; + dateTime += __TIME__; + + return dateTime; +} + QVariantMap AboutModel::museScoreUrl() const { QUrl museScoreUrl(QString::fromStdString(configuration()->museScoreUrl())); diff --git a/src/appshell/qml/MuseScore/AppShell/aboutmodel.h b/src/appshell/qml/MuseScore/AppShell/aboutmodel.h index 8b0652decc8a..f9a939d86df7 100644 --- a/src/appshell/qml/MuseScore/AppShell/aboutmodel.h +++ b/src/appshell/qml/MuseScore/AppShell/aboutmodel.h @@ -50,6 +50,7 @@ class AboutModel : public QObject, public muse::Contextable Q_INVOKABLE QString museScoreVersion() const; Q_INVOKABLE QString museScoreRevision() const; + Q_INVOKABLE QString museScoreBuildDateTime() const; Q_INVOKABLE QVariantMap museScoreUrl() const; Q_INVOKABLE QVariantMap museScoreForumUrl() const; Q_INVOKABLE QVariantMap museScoreContributionUrl() const; From bf442dd6fd7172b12ef3853348202af3bcc27e80 Mon Sep 17 00:00:00 2001 From: Calum Matheson Date: Mon, 10 Aug 2026 19:10:50 +0200 Subject: [PATCH 8/9] Revision rework - cleanup points/refactoring --- .../qml/MuseScore/AppShell/AboutDialog.qml | 4 +- .../qml/MuseScore/AppShell/aboutmodel.cpp | 41 ++++++++++++------- .../qml/MuseScore/AppShell/aboutmodel.h | 2 +- .../Properties/projectpropertiesmodel.cpp | 28 +++++++++---- 4 files changed, 49 insertions(+), 26 deletions(-) diff --git a/src/appshell/qml/MuseScore/AppShell/AboutDialog.qml b/src/appshell/qml/MuseScore/AppShell/AboutDialog.qml index bb3b9b5dacd5..b8160c782646 100644 --- a/src/appshell/qml/MuseScore/AppShell/AboutDialog.qml +++ b/src/appshell/qml/MuseScore/AppShell/AboutDialog.qml @@ -83,7 +83,7 @@ StyledDialogView { StyledTextLabel { anchors.horizontalCenter: parent.horizontalCenter - text: qsTrc("appshell/about", "Version:") + " " + aboutModel.museScoreVersion() + text: qsTrc("appshell/about", "Version: %1").arg(aboutModel.museScoreVersion()) font: ui.theme.bodyBoldFont } @@ -93,7 +93,7 @@ StyledDialogView { StyledTextLabel { anchors.verticalCenter: parent.verticalCenter - text: qsTrc("appshell/about", "Revision:") + " " + aboutModel.museScoreRevision() + text: qsTrc("appshell/about", "Revision: %1").arg(aboutModel.museScoreRevisionLink()) } FlatButton { diff --git a/src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp b/src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp index c9645a318756..cda4783b3073 100644 --- a/src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp +++ b/src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp @@ -30,6 +30,9 @@ using namespace mu::appshell; +//! NOTE: Should match value in projectpropertiesmodel.cpp +static const QString GITHUB_REVISION_URL("https://github.com/musescore/MuseScore/commit/"); + AboutModel::AboutModel(QObject* parent) : QObject(parent), muse::Contextable(muse::iocCtxForQmlObject(this)) { @@ -43,10 +46,14 @@ QString AboutModel::museScoreVersion() const : version; } -QString AboutModel::museScoreRevision() const +QString AboutModel::museScoreRevisionLink() const { - return QString("%1") - .arg(QString::fromStdString(configuration()->museScoreRevision())); + const QString rev = QString::fromStdString(configuration()->museScoreRevision()); + if (rev.isEmpty()) { + return muse::qtrc("global", "Unknown"); + } + const QString revUrl = GITHUB_REVISION_URL + rev; + return QString("%2").arg(revUrl, rev); } QString AboutModel::museScoreBuildDateTime() const @@ -106,17 +113,23 @@ QVariantMap AboutModel::musicXMLLicenseDeedUrl() const void AboutModel::copyRevisionToClipboard() const { - QGuiApplication::clipboard()->setText( - QString("OS: %1, Arch.: %2, MuseScore Studio version (%3-bit): %4-%5, revision: " - "[%6](https://github.com/musescore/MuseScore/commit/%6)") - .arg(QSysInfo::prettyProductName() - + ((QSysInfo::productType() == "windows" && (QSysInfo::productVersion() == "10" || QSysInfo::productVersion() == "11")) - ? " or later" : ""), QSysInfo::currentCpuArchitecture()) - .arg(QSysInfo::WordSize) - .arg(application()->version().toString(), application()->build()) - + - QString(application()->revision().isEmpty() ? "" : ", revision: [%1](https://github.com/musescore/MuseScore/commit/%1)") - .arg(application()->revision())); + QString osName = QSysInfo::prettyProductName(); + if (QSysInfo::productType() == "windows" && (QSysInfo::productVersion() == "10" || QSysInfo::productVersion() == "11")) { + osName += " or later"; + } + + QString forClipboard = QString("OS: %1, Arch.: %2, MuseScore Studio version (%3-bit): %4-%5") + .arg(osName, QSysInfo::currentCpuArchitecture()) + .arg(QSysInfo::WordSize) + .arg(application()->version().toString(), application()->build()); + + const QString rev = QString::fromStdString(configuration()->museScoreRevision()); + if (!rev.isEmpty()) { + const QString revUrl = GITHUB_REVISION_URL + rev; + forClipboard += QString(", revision: [%1](%2)").arg(rev, revUrl); + } + + QGuiApplication::clipboard()->setText(forClipboard); } void AboutModel::toggleDevMode() diff --git a/src/appshell/qml/MuseScore/AppShell/aboutmodel.h b/src/appshell/qml/MuseScore/AppShell/aboutmodel.h index f9a939d86df7..dfe186f59e6a 100644 --- a/src/appshell/qml/MuseScore/AppShell/aboutmodel.h +++ b/src/appshell/qml/MuseScore/AppShell/aboutmodel.h @@ -49,7 +49,7 @@ class AboutModel : public QObject, public muse::Contextable explicit AboutModel(QObject* parent = nullptr); Q_INVOKABLE QString museScoreVersion() const; - Q_INVOKABLE QString museScoreRevision() const; + Q_INVOKABLE QString museScoreRevisionLink() const; Q_INVOKABLE QString museScoreBuildDateTime() const; Q_INVOKABLE QVariantMap museScoreUrl() const; Q_INVOKABLE QVariantMap museScoreForumUrl() const; diff --git a/src/project/qml/MuseScore/Project/internal/Properties/projectpropertiesmodel.cpp b/src/project/qml/MuseScore/Project/internal/Properties/projectpropertiesmodel.cpp index 426fe62ef075..28041627c076 100644 --- a/src/project/qml/MuseScore/Project/internal/Properties/projectpropertiesmodel.cpp +++ b/src/project/qml/MuseScore/Project/internal/Properties/projectpropertiesmodel.cpp @@ -32,6 +32,10 @@ using namespace muse::modularity; using namespace mu::notation; using namespace mu::project; +//! NOTE: Should match value in aboutmodel.cpp +static const QString GITHUB_REVISION_URL("https://github.com/musescore/MuseScore/commit/"); +static const QString SOURCEFORGE_REVISION_URL("https://sourceforge.net/p/mscore/code/"); + ProjectPropertiesModel::ProjectPropertiesModel(QObject* parent) : QAbstractListModel(parent), muse::Contextable(muse::iocCtxForQmlObject(this)) { @@ -159,17 +163,23 @@ QString ProjectPropertiesModel::version() const QString ProjectPropertiesModel::revision() const { - int rev = m_projectMetaInfo.musescoreRevision; - QString revision; - if (rev > 0 && rev <= 5709) { // MuseScore 1.x and earlier used decimal numbers, referring to a commit on SourceForge.net, the largest being 5709 - revision = QString("%1").arg(QString::number(rev, 10)); - } else if (rev > 0xffffff) { // MuseScore 2.0 and later use a >= 7-digit hex SHA, referring to a commit on GitHub.com - revision = QString("%1").arg(QString::number(rev, 16)); - } else { // unknown, like in a self-built development version, or in a very old version of MuseScore before the revision number was tracked - revision = QString::number(rev, 10); // or "" or "Unknown"? + const int rev = m_projectMetaInfo.musescoreRevision; + if (rev > 0 && rev <= 5709) { + // MuseScore 1.x and earlier used decimal numbers, referring to a commit on SourceForge.net, the largest being 5709 + const QString revText = QString::number(rev, 10); + const QString revUrl = SOURCEFORGE_REVISION_URL + revText; + return QString("%2").arg(revUrl, revText); + } + + if (rev > 0xffffff) { + // MuseScore 2.0 and later use a >= 7-digit hex SHA, referring to a commit on GitHub.com + const QString revText = QString::number(rev, 16); + const QString revUrl = GITHUB_REVISION_URL + revText; + return QString("%2").arg(revUrl, revText); } - return revision; + // unknown, like in a self-built development version, or in a very old version of MuseScore before the revision number was tracked + return muse::qtrc("global", "Unknown"); } QString ProjectPropertiesModel::apiLevel() const From c4c03cfe4bbebe8c4d817e77e478b1b8cabf2088 Mon Sep 17 00:00:00 2001 From: Calum Matheson Date: Mon, 2 Nov 2026 14:08:35 +0100 Subject: [PATCH 9/9] About dialog QML rework: - Remove invisible OK button - Dynamically set height based on contents --- .../qml/MuseScore/AppShell/AboutDialog.qml | 175 ++++++++---------- 1 file changed, 76 insertions(+), 99 deletions(-) diff --git a/src/appshell/qml/MuseScore/AppShell/AboutDialog.qml b/src/appshell/qml/MuseScore/AppShell/AboutDialog.qml index b8160c782646..49e55519b9fe 100644 --- a/src/appshell/qml/MuseScore/AppShell/AboutDialog.qml +++ b/src/appshell/qml/MuseScore/AppShell/AboutDialog.qml @@ -33,143 +33,120 @@ StyledDialogView { title: qsTrc("appshell/about", "About MuseScore Studio") - contentHeight: 424 - contentWidth: 480 + contentHeight: content.implicitHeight + contentWidth: 400 + + margins: 40 AboutModel { id: aboutModel } ColumnLayout { - anchors.fill: parent - spacing: 30 - - ColumnLayout { - id: content + id: content - Layout.fillWidth: true - Layout.fillHeight: true - Layout.topMargin: 36 - Layout.leftMargin: 40 - Layout.rightMargin: 40 - - spacing: 32 + anchors.fill: parent + spacing: 32 - Image { - id: logo - Layout.alignment: Qt.AlignHCenter + Image { + id: logo + Layout.alignment: Qt.AlignHCenter - source: "resources/mu_logo.svg" - sourceSize: Qt.size(100, 100) + source: "resources/mu_logo.svg" + sourceSize: Qt.size(100, 100) - MouseArea { - anchors.fill: parent + MouseArea { + anchors.fill: parent - property int clickCount: 0 + property int clickCount: 0 - onClicked: { - clickCount++ + onClicked: { + clickCount++ - if (clickCount % 3 == 0) { - aboutModel.toggleDevMode() - } + if (clickCount % 3 == 0) { + aboutModel.toggleDevMode() } } } + } - Column { - spacing: 8 - Layout.fillWidth: true + Column { + spacing: 8 + Layout.fillWidth: true - StyledTextLabel { - anchors.horizontalCenter: parent.horizontalCenter - text: qsTrc("appshell/about", "Version: %1").arg(aboutModel.museScoreVersion()) - font: ui.theme.bodyBoldFont - } + StyledTextLabel { + anchors.horizontalCenter: parent.horizontalCenter + text: qsTrc("appshell/about", "Version: %1").arg(aboutModel.museScoreVersion()) + font: ui.theme.bodyBoldFont + } - Row { - spacing: 4 - anchors.horizontalCenter: parent.horizontalCenter + Row { + spacing: 4 + anchors.horizontalCenter: parent.horizontalCenter - StyledTextLabel { - anchors.verticalCenter: parent.verticalCenter - text: qsTrc("appshell/about", "Revision: %1").arg(aboutModel.museScoreRevisionLink()) - } + StyledTextLabel { + anchors.verticalCenter: parent.verticalCenter + text: qsTrc("appshell/about", "Revision: %1").arg(aboutModel.museScoreRevisionLink()) + } - FlatButton { - anchors.verticalCenter: parent.verticalCenter - icon: IconCode.COPY + FlatButton { + anchors.verticalCenter: parent.verticalCenter + icon: IconCode.COPY - onClicked: { - aboutModel.copyRevisionToClipboard() - } + onClicked: { + aboutModel.copyRevisionToClipboard() } } } - StyledTextLabel { - Layout.fillWidth: true - - text: qsTrc("appshell/about", "Build date: %1") - .arg(aboutModel.museScoreBuildDateTime()) - - wrapMode: Text.WordWrap - maximumLineCount: 2 - } - - StyledTextLabel { - Layout.fillWidth: true - text: { - let museScoreUrl = aboutModel.museScoreUrl() - - //: %1 will be a link to the MuseScore website - let line1 = qsTrc("appshell/about", "Visit %1 for new versions and more information.") - .arg(`${museScoreUrl.displayName}`) + } - let line2 = qsTrc("appshell/about", "Get help with the program or contribute to its development.") - .arg(aboutModel.museScoreForumUrl().url) - .arg(aboutModel.museScoreContributionUrl().url) + StyledTextLabel { + Layout.fillWidth: true - return line1 + "
" + line2 - } - wrapMode: Text.WordWrap - maximumLineCount: 3 - } + text: qsTrc("appshell/about", "Build date: %1") + .arg(aboutModel.museScoreBuildDateTime()) - StyledTextLabel { - Layout.fillWidth: true + wrapMode: Text.WordWrap + maximumLineCount: 2 + } - text: qsTrc("appshell/about", "For privacy information, see our privacy policy.") - .arg(aboutModel.museScorePrivacyPolicyUrl().url) + StyledTextLabel { + Layout.fillWidth: true + text: { + let museScoreUrl = aboutModel.museScoreUrl() - wrapMode: Text.WordWrap - maximumLineCount: 3 - } + //: %1 will be a link to the MuseScore website + let line1 = qsTrc("appshell/about", "Visit %1 for new versions and more information.") + .arg(`${museScoreUrl.displayName}`) - StyledTextLabel { - Layout.fillWidth: true - text: qsTrc("appshell/about", "Copyright © 1999-2026 MuseScore Limited and others.\nPublished under the GNU General Public License version 3.") - .arg("https://www.gnu.org/licenses/gpl-3.0.html") - .replace("\n", "
") + let line2 = qsTrc("appshell/about", "Get help with the program or contribute to its development.") + .arg(aboutModel.museScoreForumUrl().url) + .arg(aboutModel.museScoreContributionUrl().url) - wrapMode: Text.WordWrap - maximumLineCount: 3 + return line1 + "
" + line2 } + wrapMode: Text.WordWrap + maximumLineCount: 3 } - RowLayout { - Layout.alignment: Qt.AlignRight - Layout.rightMargin: 16 - Layout.bottomMargin: 16 + StyledTextLabel { + Layout.fillWidth: true + + text: qsTrc("appshell/about", "For privacy information, see our privacy policy.") + .arg(aboutModel.museScorePrivacyPolicyUrl().url) - spacing: 12 + wrapMode: Text.WordWrap + maximumLineCount: 3 + } - FlatButton { - text: qsTrc("global", "OK") + StyledTextLabel { + Layout.fillWidth: true + text: qsTrc("appshell/about", "Copyright © 1999-2026 MuseScore Limited and others.\nPublished under the GNU General Public License version 3.") + .arg("https://www.gnu.org/licenses/gpl-3.0.html") + .replace("\n", "
") - onClicked: { - root.hide() - } - } + wrapMode: Text.WordWrap + maximumLineCount: 3 } } }