kde-frameworks/kxmlgui: fix XML merging (shortcut scheme handling)

KDE-bug: https://bugs.kde.org/show_bug.cgi?id=475016
Signed-off-by: Sam James <sam@gentoo.org>
This commit is contained in:
Sam James
2023-10-03 16:28:54 +01:00
parent 1dccc0a025
commit 84f85d1105
2 changed files with 205 additions and 0 deletions

View File

@@ -0,0 +1,156 @@
https://invent.kde.org/frameworks/kxmlgui/-/merge_requests/190
https://bugs.kde.org/show_bug.cgi?id=475016
From f015fa6006d2e2eea2d2aac11c18219b255722ef Mon Sep 17 00:00:00 2001
From: Mladen Milinkovic <maxrd2@smoothware.net>
Date: Fri, 29 Sep 2023 20:01:49 +0200
Subject: [PATCH] Fix merging of XMLs with multiple ActionProperties tags
BUG: 475016
--- a/autotests/kxmlgui_unittest.cpp
+++ b/autotests/kxmlgui_unittest.cpp
@@ -88,6 +88,26 @@ static void createXmlFile(QFile &file, int version, int flags, const QByteArray
file.write("</" + toplevelTag + ">\n");
}
+class ShortcutSchemeHandler
+{
+public:
+ ShortcutSchemeHandler(const QString &scheme)
+ : cgScheme(KSharedConfig::openConfig(), "Shortcut Schemes")
+ , prevScheme(cgScheme.readEntry("Current Scheme", QStringLiteral("Default")))
+ {
+ cgScheme.writeEntry("Current Scheme", scheme);
+ }
+
+ ~ShortcutSchemeHandler()
+ {
+ cgScheme.writeEntry("Current Scheme", prevScheme);
+ }
+
+private:
+ KConfigGroup cgScheme;
+ const QString prevScheme;
+};
+
static void clickApply(KEditToolBar *dialog)
{
QDialogButtonBox *box = dialog->findChild<QDialogButtonBox *>();
@@ -106,6 +126,15 @@ void KXmlGui_UnitTest::initTestCase()
QFile::remove(configFile);
KSharedConfig::openConfig()->reparseConfiguration();
}
+
+ // Create "Test" shortcut scheme to eliminate the KF warning
+ QFile testScheme = QFile(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)
+ + QLatin1String("/%1/shortcuts/%2").arg(QCoreApplication::applicationName(), QStringLiteral("Test")));
+ if (!testScheme.exists()) {
+ QVERIFY(QFileInfo(testScheme).dir().mkpath(QStringLiteral(".")));
+ QVERIFY(testScheme.open(QIODevice::WriteOnly));
+ testScheme.write(QByteArray("<gui><ActionProperties/></gui>"));
+ }
}
void KXmlGui_UnitTest::testFindVersionNumber_data()
@@ -457,6 +486,56 @@ void KXmlGui_UnitTest::testPartMerging()
factory.removeClient(&hostClient);
}
+void KXmlGui_UnitTest::testShortcutSchemeMerging()
+{
+ TestGuiClient client;
+
+ ShortcutSchemeHandler sss(QStringLiteral("Test"));
+
+ KActionCollection *ac = client.actionCollection();
+
+ QAction *a = ac->addAction(QStringLiteral("test_action"));
+ ac->setDefaultShortcut(a, QKeySequence(QStringLiteral("Ctrl+A")));
+
+ const QByteArray appXml = R"(<?xml version = "1.0"?>
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="foo" version="5">
+<MenuBar>
+ <Menu name="file"><text>&amp;File</text>
+ <Action name="test_action" />
+ </Menu>
+</MenuBar></kpartgui>
+)";
+ client.createGUI(appXml, false);
+
+ const QByteArray settingsXml = R"(<!DOCTYPE kpartgui SYSTEM 'kpartgui.dtd'>
+<kpartgui name="foo" version="1">
+ <MenuBar>
+ <Menu name="file">
+ <text>&amp;File</text>
+ <Action name="test_action" />
+ </Menu>
+ </MenuBar>
+ <ActionProperties scheme="Default">
+ <Action name="test_action" shortcut="Ctrl+B"/>
+ </ActionProperties>
+ <ActionProperties scheme="Test">
+ <Action name="test_action" shortcut="Ctrl+C"/>
+ </ActionProperties>
+</kpartgui>
+)";
+ client.mergeXML(settingsXml);
+
+ KMainWindow mainWindow;
+ KXMLGUIBuilder builder(&mainWindow);
+ KXMLGUIFactory factory(&builder);
+ factory.addClient(&client);
+
+ QCOMPARE(a->shortcut(), QKeySequence(QStringLiteral("Ctrl+C")));
+
+ factory.removeClient(&client);
+}
+
void KXmlGui_UnitTest::testPartMergingSettings() // #252911
{
const QByteArray hostXml =
--- a/autotests/kxmlgui_unittest.h
+++ b/autotests/kxmlgui_unittest.h
@@ -23,6 +23,7 @@ private Q_SLOTS:
void testVersionHandlerNewVersionUserChanges();
void testPartMerging();
void testPartMergingSettings();
+ void testShortcutSchemeMerging();
void testUiStandardsMerging_data();
void testUiStandardsMerging();
void testActionListAndSeparator();
--- a/autotests/testguiclient.h
+++ b/autotests/testguiclient.h
@@ -42,6 +42,10 @@ public:
setXML(QString::fromLatin1(xml), true);
}
+ void mergeXML(const QByteArray &xml)
+ {
+ setXML(QString::fromLatin1(xml), true);
+ }
void createActions(const QStringList &actionNames)
{
KActionCollection *coll = actionCollection();
--- a/src/kxmlguiclient.cpp
+++ b/src/kxmlguiclient.cpp
@@ -587,6 +587,8 @@ bool KXMLGUIClientPrivate::isEmptyContainer(const QDomElement &base, KActionColl
QDomElement KXMLGUIClientPrivate::findMatchingElement(const QDomElement &base, const QDomElement &additive)
{
+ const QString idAttribute(base.tagName() == QLatin1String("ActionProperties") ? QStringLiteral("scheme") : QStringLiteral("name"));
+
QDomNode n = additive.firstChild();
while (!n.isNull()) {
QDomElement e = n.toElement();
@@ -604,7 +606,7 @@ QDomElement KXMLGUIClientPrivate::findMatchingElement(const QDomElement &base, c
// now see if our tags are equivalent
if (equalstr(tag, base.tagName()) //
- && e.attribute(QStringLiteral("name")) == base.attribute(QStringLiteral("name"))) {
+ && e.attribute(idAttribute) == base.attribute(idAttribute)) {
return e;
}
}
--
GitLab

View File

@@ -0,0 +1,49 @@
# Copyright 1999-2023 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
ECM_DESIGNERPLUGIN="true"
PVCUT=$(ver_cut 1-2)
QTMIN=5.15.9
inherit ecm frameworks.kde.org
DESCRIPTION="Framework for managing menu and toolbar actions in an abstract way"
KEYWORDS="~amd64 ~arm ~arm64 ~loong ~ppc64 ~riscv ~x86"
LICENSE="LGPL-2+"
IUSE=""
# slot op: includes QtCore/private/qlocale_p.h
DEPEND="
>=dev-qt/qtcore-${QTMIN}:5=
>=dev-qt/qtdbus-${QTMIN}:5
>=dev-qt/qtgui-${QTMIN}:5
>=dev-qt/qtnetwork-${QTMIN}:5[ssl]
>=dev-qt/qtprintsupport-${QTMIN}:5
>=dev-qt/qtwidgets-${QTMIN}:5
>=dev-qt/qtxml-${QTMIN}:5
=kde-frameworks/kconfig-${PVCUT}*:5
=kde-frameworks/kconfigwidgets-${PVCUT}*:5
=kde-frameworks/kcoreaddons-${PVCUT}*:5
=kde-frameworks/kglobalaccel-${PVCUT}*:5
=kde-frameworks/kguiaddons-${PVCUT}*:5
=kde-frameworks/ki18n-${PVCUT}*:5
=kde-frameworks/kiconthemes-${PVCUT}*:5
=kde-frameworks/kitemviews-${PVCUT}*:5
=kde-frameworks/kwidgetsaddons-${PVCUT}*:5
"
RDEPEND="${DEPEND}"
PATCHES=(
"${FILESDIR}"/${PN}-5.111.0-fix-xml-merging.patch
)
src_test() {
# Files are missing; whatever. Bugs 650290, 668198, 808216
local myctestargs=(
-E "(ktoolbar_unittest|kxmlgui_unittest|ktooltiphelper_unittest)"
)
ecm_src_test
}