[Libreoffice-commits] core.git: svx/source sw/source
Dennis Francis (via logerrit)
logerrit at kemper.freedesktop.org
Tue Mar 24 17:53:21 UTC 2020
svx/source/xoutdev/xattr.cxx | 13 +++++++++++
sw/source/uibase/shells/drawdlg.cxx | 41 ++++++++++++++++++++++++++++++++++++
2 files changed, 54 insertions(+)
New commits:
commit f08bbb5648c06a387e69f3a0e0a6a9a1eda7fc37
Author: Dennis Francis <dennis.francis at collabora.com>
AuthorDate: Sun Mar 22 19:43:03 2020 +0530
Commit: Dennis Francis <dennis.francis at collabora.com>
CommitDate: Tue Mar 24 18:52:47 2020 +0100
lokit: unify fill transparency items
Online just listens to .uno:FillFloatTransparence but the set-item
in core it corresponds to, does not represent the fill-transparency
types like 'None' and 'Solid'. This is represented by another item
called XFillTransparencyItem. As a result the mobile wizard does not
show the correct transparency fill type always.
To solve this, this patch encodes the constant transparency percentage
in case of Solid and None(always 0%) as an intensity and stores this
info in the statechange message of .uno:FillFloatTransparence whenever
there is no gradient type and corrects the 'style' attribute of the
message appropriately.
More detailed information is provided as comments at appropriate
places in the patch.
Change-Id: I443ef4ce349badf28f6c2c702b1014868d9c6ed5
(cherry picked from commit 34969e9c04f9305d19826c72a29e38e26794cbe3)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/90986
Tested-by: Jenkins
Reviewed-by: Dennis Francis <dennis.francis at collabora.com>
diff --git a/svx/source/xoutdev/xattr.cxx b/svx/source/xoutdev/xattr.cxx
index 4b11483e8e3a..2fc8ff28f861 100644
--- a/svx/source/xoutdev/xattr.cxx
+++ b/svx/source/xoutdev/xattr.cxx
@@ -2502,6 +2502,19 @@ boost::property_tree::ptree XFillFloatTransparenceItem::dumpAsJSON() const
boost::property_tree::ptree aTree = XFillGradientItem::dumpAsJSON();
aTree.put("commandName", ".uno:FillFloatTransparence");
+ if (!bEnabled)
+ {
+ boost::property_tree::ptree& rState = aTree.get_child("state");
+ // When gradient fill is disabled, the intensity fields contain the
+ // constant encoded percent-transparency. However we use that here to just
+ // distinguish between 'None' and 'Solid' types and correct the 'style'
+ // property appropriately.
+ if (GetGradientValue().GetStartIntens() == 100)
+ rState.put("style", "NONE");
+ else
+ rState.put("style", "SOLID");
+ }
+
return aTree;
}
diff --git a/sw/source/uibase/shells/drawdlg.cxx b/sw/source/uibase/shells/drawdlg.cxx
index 78c49e0e5488..9e5939697602 100644
--- a/sw/source/uibase/shells/drawdlg.cxx
+++ b/sw/source/uibase/shells/drawdlg.cxx
@@ -36,6 +36,9 @@
#include <svx/chrtitem.hxx>
#include <svx/xlnwtit.hxx>
#include <svx/xflgrit.hxx>
+#include <svx/xflftrit.hxx>
+#include <svx/xfltrit.hxx>
+#include <comphelper/lok.hxx>
using namespace com::sun::star::drawing;
@@ -314,6 +317,40 @@ void SwDrawShell::ExecDrawAttrArgs(SfxRequest const & rReq)
pView->GetModel()->SetChanged();
}
+static void lcl_unifyFillTransparencyItems(SfxItemSet& rSet)
+{
+ // Transparent fill options are None, Solid, Linear, Axial, Radial, Elliptical, Quadratic, Square.
+ // But this is represented across two items namely XFillTransparenceItem (for None and Solid)
+ // and XFillFloatTransparenceItem (for the rest). To simplify the representation in LOKit case let's
+ // use XFillFloatTransparenceItem to carry the information of XFillTransparenceItem when gradients
+ // are disabled. When gradient transparency is disabled, all fields of XFillFloatTransparenceItem are invalid
+ // and not used. So convert XFillTransparenceItem's constant transparency percentage as an intensity
+ // and assign this to the XFillFloatTransparenceItem's start-intensity and end-intensity fields.
+ // Now the LOK clients need only listen to statechange messages of XFillFloatTransparenceItem
+ // to get fill-transparency settings instead of listening to two separate items.
+
+ XFillFloatTransparenceItem* pFillFloatTranspItem =
+ const_cast<XFillFloatTransparenceItem*>
+ (rSet.GetItem<XFillFloatTransparenceItem>(XATTR_FILLFLOATTRANSPARENCE));
+ if (!pFillFloatTranspItem || pFillFloatTranspItem->IsEnabled())
+ return;
+
+ const XFillTransparenceItem* pFillTranspItem =
+ rSet.GetItem<XFillTransparenceItem>(XATTR_FILLTRANSPARENCE);
+
+ if (!pFillTranspItem)
+ return;
+
+ XGradient aTmpGradient = pFillFloatTranspItem->GetGradientValue();
+ sal_uInt16 nTranspPercent = pFillTranspItem->GetValue();
+ // Encode transparancy percentage as intensity
+ sal_uInt16 nIntensity = 100 - std::min<sal_uInt16>
+ (std::max<sal_uInt16>(nTranspPercent, 0), 100);
+ aTmpGradient.SetStartIntens(nIntensity);
+ aTmpGradient.SetEndIntens(nIntensity);
+ pFillFloatTranspItem->SetGradientValue(aTmpGradient);
+}
+
void SwDrawShell::GetDrawAttrState(SfxItemSet& rSet)
{
SdrView* pSdrView = GetShell().GetDrawView();
@@ -323,7 +360,11 @@ void SwDrawShell::GetDrawAttrState(SfxItemSet& rSet)
bool bDisable = Disable( rSet );
if( !bDisable )
+ {
pSdrView->GetAttributes( rSet );
+ if (comphelper::LibreOfficeKit::isActive())
+ lcl_unifyFillTransparencyItems(rSet);
+ }
}
else
rSet.Put(pSdrView->GetDefaultAttr());
More information about the Libreoffice-commits
mailing list