summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2021-06-15 13:09:59 +0100
committerCaolán McNamara <caolanm@redhat.com>2021-06-15 17:07:36 +0200
commitae2948516305415cf48ba43f2412e0d7a9b5d73e (patch)
treea3d20d5e39add70e8350fab3d3ab71b501b02b0b
parent7099902bc9ebdc5407d7cd917a57188bb575dd66 (diff)
gtk4: further disambiguation of Image/Picture
examples of GtkPicture wanted: a) math, format, spacing b) all, help, about examples of GtkImage wanted: a) writer, format, columns, next/prev b) writer, insert, hyperlink c) calc, paste special Change-Id: I53ad0a40f30a4963a8490c4e76fa50c463de0903 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/117249 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r--vcl/unx/gtk4/convert3to4.cxx84
1 files changed, 52 insertions, 32 deletions
diff --git a/vcl/unx/gtk4/convert3to4.cxx b/vcl/unx/gtk4/convert3to4.cxx
index f99bdc9517ff..436fa1728868 100644
--- a/vcl/unx/gtk4/convert3to4.cxx
+++ b/vcl/unx/gtk4/convert3to4.cxx
@@ -308,25 +308,27 @@ struct ConvertResult
{
bool m_bChildCanFocus;
bool m_bHasVisible;
- bool m_bHasSymbolicIconName;
+ bool m_bHasIconSize;
bool m_bAlwaysShowImage;
bool m_bImageAtTop;
bool m_bUseUnderline;
bool m_bVertOrientation;
css::uno::Reference<css::xml::dom::XNode> m_xPropertyLabel;
+ css::uno::Reference<css::xml::dom::XNode> m_xPropertyIconName;
- ConvertResult(bool bChildCanFocus, bool bHasVisible, bool bHasSymbolicIconName,
- bool bAlwaysShowImage, bool bImageAtTop, bool bUseUnderline,
- bool bVertOrientation,
- const css::uno::Reference<css::xml::dom::XNode>& rPropertyLabel)
+ ConvertResult(bool bChildCanFocus, bool bHasVisible, bool bHasIconSize, bool bAlwaysShowImage,
+ bool bImageAtTop, bool bUseUnderline, bool bVertOrientation,
+ const css::uno::Reference<css::xml::dom::XNode>& rPropertyLabel,
+ const css::uno::Reference<css::xml::dom::XNode>& rPropertyIconName)
: m_bChildCanFocus(bChildCanFocus)
, m_bHasVisible(bHasVisible)
- , m_bHasSymbolicIconName(bHasSymbolicIconName)
+ , m_bHasIconSize(bHasIconSize)
, m_bAlwaysShowImage(bAlwaysShowImage)
, m_bImageAtTop(bImageAtTop)
, m_bUseUnderline(bUseUnderline)
, m_bVertOrientation(bVertOrientation)
, m_xPropertyLabel(rPropertyLabel)
+ , m_xPropertyIconName(rPropertyIconName)
{
}
};
@@ -341,19 +343,20 @@ ConvertResult Convert3To4(const css::uno::Reference<css::xml::dom::XNode>& xNode
{
css::uno::Reference<css::xml::dom::XNodeList> xNodeList = xNode->getChildNodes();
if (!xNodeList.is())
- return ConvertResult(false, false, false, false, false, false, false, nullptr);
+ return ConvertResult(false, false, false, false, false, false, false, nullptr, nullptr);
std::vector<css::uno::Reference<css::xml::dom::XNode>> xRemoveList;
OUString sBorderWidth;
bool bChildCanFocus = false;
bool bHasVisible = false;
- bool bHasSymbolicIconName = false;
+ bool bHasIconSize = false;
bool bAlwaysShowImage = false;
bool bImageAtTop = false;
bool bUseUnderline = false;
bool bVertOrientation = false;
css::uno::Reference<css::xml::dom::XNode> xPropertyLabel;
+ css::uno::Reference<css::xml::dom::XNode> xPropertyIconName;
css::uno::Reference<css::xml::dom::XNode> xCantFocus;
css::uno::Reference<css::xml::dom::XNode> xChild = xNode->getFirstChild();
@@ -433,22 +436,7 @@ ConvertResult Convert3To4(const css::uno::Reference<css::xml::dom::XNode>& xNode
bHasVisible = true;
if (sName == "icon-name")
- {
- OUString sIconName(xChild->getFirstChild()->getNodeValue());
- bHasSymbolicIconName = IsAllowedBuiltInIcon(sIconName);
- if (!bHasSymbolicIconName)
- {
- auto xDoc = xChild->getOwnerDocument();
- // private:graphicrepository/ would be turned by gio (?) into private:///graphicrepository/
- // so use private:///graphicrepository/ here. At the moment we just want this to be transported
- // as-is to postprocess_widget. Though it might be nice to register a protocol handler with gio
- // to avoid us doing the load in that second pass.
- auto xUri
- = CreateProperty(xDoc, "file", "private:///graphicrepository/" + sIconName);
- xChild->getParentNode()->insertBefore(xUri, xChild);
- xRemoveList.push_back(xChild);
- }
- }
+ xPropertyIconName = xChild;
if (sName == "events")
xRemoveList.push_back(xChild);
@@ -493,6 +481,8 @@ ConvertResult Convert3To4(const css::uno::Reference<css::xml::dom::XNode>& xNode
{
if (GetParentObjectType(xChild) == "GtkImage")
{
+ bHasIconSize = true;
+
OUString sSize = xChild->getFirstChild()->getNodeValue();
/*
old:
@@ -514,8 +504,6 @@ ConvertResult Convert3To4(const css::uno::Reference<css::xml::dom::XNode>& xNode
<< xChild->getFirstChild()->getNodeValue());
xRemoveList.push_back(xChild);
}
- else if (GetParentObjectType(xChild) == "GtkPicture")
- xRemoveList.push_back(xChild);
}
if (sName == "truncate-multiline")
@@ -929,13 +917,14 @@ ConvertResult Convert3To4(const css::uno::Reference<css::xml::dom::XNode>& xNode
}
}
- bool bChildHasSymbolicIconName = false;
+ bool bChildHasIconSize = false;
bool bChildHasVisible = false;
bool bChildAlwaysShowImage = false;
bool bChildImageAtTop = false;
bool bChildUseUnderline = false;
bool bChildVertOrientation = false;
css::uno::Reference<css::xml::dom::XNode> xChildPropertyLabel;
+ css::uno::Reference<css::xml::dom::XNode> xChildPropertyIconName;
if (xChild->hasChildNodes())
{
auto aChildRes = Convert3To4(xChild);
@@ -948,12 +937,13 @@ ConvertResult Convert3To4(const css::uno::Reference<css::xml::dom::XNode>& xNode
if (xChild->getNodeName() == "object")
{
bChildHasVisible = aChildRes.m_bHasVisible;
- bChildHasSymbolicIconName = aChildRes.m_bHasSymbolicIconName;
+ bChildHasIconSize = aChildRes.m_bHasIconSize;
bChildAlwaysShowImage = aChildRes.m_bAlwaysShowImage;
bChildImageAtTop = aChildRes.m_bImageAtTop;
bChildUseUnderline = aChildRes.m_bUseUnderline;
bChildVertOrientation = aChildRes.m_bVertOrientation;
xChildPropertyLabel = aChildRes.m_xPropertyLabel;
+ xChildPropertyIconName = aChildRes.m_xPropertyIconName;
}
}
@@ -1198,9 +1188,39 @@ ConvertResult Convert3To4(const css::uno::Reference<css::xml::dom::XNode>& xNode
{
xClass->setNodeValue("GtkCheckButton");
}
- else if (sClass == "GtkImage" && !bChildHasSymbolicIconName)
+ else if (sClass == "GtkImage")
{
- xClass->setNodeValue("GtkPicture");
+ /* a) keep symbolic icon-names as GtkImage, e.g. writer, format, columns, next/prev
+ buttons
+ b) assume that an explicit icon-size represents a request for a scaled icon
+ so keep those as GtkImage. e.g. hyperlink dialog notebook tab images and
+ calc paste special button images
+ c) turn everything else into a GtkPicture, e.g. help, about. If a GtkPicture
+ ends up used to display just a simple icon that's generally not a problem.
+ */
+ bool bKeepAsImage = false;
+ if (bChildHasIconSize)
+ bKeepAsImage = true;
+ else if (xChildPropertyIconName.is())
+ {
+ OUString sIconName(xChildPropertyIconName->getFirstChild()->getNodeValue());
+ bool bHasSymbolicIconName = IsAllowedBuiltInIcon(sIconName);
+ if (bHasSymbolicIconName)
+ bKeepAsImage = true;
+ else
+ {
+ // private:graphicrepository/ would be turned by gio (?) into private:///graphicrepository/
+ // so use private:///graphicrepository/ here. At the moment we just want this to be transported
+ // as-is to postprocess_widget. Though it might be nice to register a protocol handler with gio
+ // to avoid us doing the load in that second pass.
+ auto xUri = CreateProperty(xDoc, "file",
+ "private:///graphicrepository/" + sIconName);
+ xChild->insertBefore(xUri, xChildPropertyIconName);
+ xChild->removeChild(xChildPropertyIconName);
+ }
+ }
+ if (!bKeepAsImage)
+ xClass->setNodeValue("GtkPicture");
}
else if (sClass == "GtkPopover" && !bHasVisible)
{
@@ -1279,8 +1299,8 @@ ConvertResult Convert3To4(const css::uno::Reference<css::xml::dom::XNode>& xNode
for (auto& xRemove : xRemoveList)
xNode->removeChild(xRemove);
- return ConvertResult(bChildCanFocus, bHasVisible, bHasSymbolicIconName, bAlwaysShowImage,
- bImageAtTop, bUseUnderline, bVertOrientation, xPropertyLabel);
+ return ConvertResult(bChildCanFocus, bHasVisible, bHasIconSize, bAlwaysShowImage, bImageAtTop,
+ bUseUnderline, bVertOrientation, xPropertyLabel, xPropertyIconName);
}
}