cui/qa/uitest/dialogs/chardlg.py | 11 ++++++ cui/source/tabpages/chardlg.cxx | 2 + editeng/source/items/textitem.cxx | 4 ++ include/editeng/colritem.hxx | 4 ++ include/svx/Palette.hxx | 2 + include/svx/PaletteManager.hxx | 3 + include/svx/strings.hrc | 5 +++ svx/source/tbxctrls/PaletteManager.cxx | 52 +++++++++++++++++++++++++++++++-- svx/source/tbxctrls/tbcontrl.cxx | 4 +- 9 files changed, 82 insertions(+), 5 deletions(-)
New commits: commit 286b586f633966a0530d4e74dc304701ee9d769f Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Tue Dec 21 08:51:56 2021 +0100 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Wed Jun 29 14:56:12 2022 +0200 sd theme: allow setting color effects in the chardlg Which means not only the 12 colors from the theme are offered (which comes from the current master page), but also lighter/darker variants. And once these are selected, their theme index and luminance modulation / offset is also remembered. This means if you pick light blue and later change accent1 from blue to orange, you get light orange out of the box. (cherry picked from commit 4f140ebac1f971d72f5bb59ee23a3fe248c4d16e) Change-Id: Ia83b8971ad894d02ed4ec5ca914684fc9cf9a677 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136609 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Miklos Vajna <vmik...@collabora.com> diff --git a/cui/qa/uitest/dialogs/chardlg.py b/cui/qa/uitest/dialogs/chardlg.py index c49c08dbc687..631766922a0d 100644 --- a/cui/qa/uitest/dialogs/chardlg.py +++ b/cui/qa/uitest/dialogs/chardlg.py @@ -94,7 +94,8 @@ class Test(UITestCase): paletteSelector = floatWindow.getChild("palette_listbox") select_by_text(paletteSelector, "Theme colors") colorSet = floatWindow.getChild("colorset") - colorSet.executeAction("CHOOSE", mkPropertyValues({"POS": "4"})) + # 4 would be accent1, +12 is the first from the effect variants. + colorSet.executeAction("CHOOSE", mkPropertyValues({"POS": "16"})) # Then make sure the doc model has the correct color theme index: drawPage = component.getDrawPages().getByIndex(0) @@ -109,6 +110,14 @@ class Test(UITestCase): # i.e. no theme index was set, instead of accent1 (index into the above color scheme). self.assertEqual(portion.CharColorTheme, 4) + # Then make sure that '80% lighter' is lum-mod=2000 and lum-off=8000: + # Without the accompanying fix in place, this test would have failed with: + # AssertionError: 10000 != 2000 + # i.e. the effects where not applied, luminancen modulation was the default instead of a + # custom value. + self.assertEqual(portion.CharColorLumMod, 2000) + self.assertEqual(portion.CharColorLumOff, 8000) + def testSvxCharEffectsPageWriter(self): # Start Writer. with self.ui_test.create_doc_in_start_center("writer") as component: diff --git a/cui/source/tabpages/chardlg.cxx b/cui/source/tabpages/chardlg.cxx index 834707e67e9f..7e1fb4077ca1 100644 --- a/cui/source/tabpages/chardlg.cxx +++ b/cui/source/tabpages/chardlg.cxx @@ -1601,6 +1601,8 @@ bool SvxCharEffectsPage::FillItemSetColor_Impl( SfxItemSet& rSet ) { // The color was picked from the theme palette, remember its index. aItem.SetThemeIndex(aSelectedColor.m_nThemeIndex); + aItem.SetLumMod(aSelectedColor.m_nLumMod); + aItem.SetLumOff(aSelectedColor.m_nLumOff); } rSet.Put(aItem); diff --git a/editeng/source/items/textitem.cxx b/editeng/source/items/textitem.cxx index f3338f300567..2c787d34b171 100644 --- a/editeng/source/items/textitem.cxx +++ b/editeng/source/items/textitem.cxx @@ -1523,6 +1523,10 @@ void SvxColorItem::dumpAsXml(xmlTextWriterPtr pWriter) const (void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("value"), BAD_CAST(ss.str().c_str())); (void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("theme-index"), BAD_CAST(OString::number(maThemeIndex).getStr())); + (void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("lum-mod"), + BAD_CAST(OString::number(mnLumMod).getStr())); + (void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("lum-off"), + BAD_CAST(OString::number(mnLumOff).getStr())); OUString aStr; IntlWrapper aIntlWrapper(SvtSysLocale().GetUILanguageTag()); diff --git a/include/editeng/colritem.hxx b/include/editeng/colritem.hxx index 99ebed218748..21e389115b11 100644 --- a/include/editeng/colritem.hxx +++ b/include/editeng/colritem.hxx @@ -83,8 +83,12 @@ public: maTintShade = nTintOrShade; } + void SetLumMod(sal_Int16 nLumMod) { mnLumMod = nLumMod; } + sal_Int16 GetLumMod() const { return mnLumMod; } + void SetLumOff(sal_Int16 nLumOff) { mnLumOff = nLumOff; } + sal_Int16 GetLumOff() const { return mnLumOff; } void dumpAsXml(xmlTextWriterPtr pWriter) const override; diff --git a/include/svx/Palette.hxx b/include/svx/Palette.hxx index fc9b7cb7ad33..c23a09f9cbc8 100644 --- a/include/svx/Palette.hxx +++ b/include/svx/Palette.hxx @@ -39,6 +39,8 @@ struct SVXCORE_DLLPUBLIC NamedThemedColor Color m_aColor; OUString m_aName; sal_Int16 m_nThemeIndex = -1; + sal_Int16 m_nLumMod = 10000; + sal_Int16 m_nLumOff = 0; static NamedThemedColor FromNamedColor(const NamedColor& rNamedColor); diff --git a/include/svx/PaletteManager.hxx b/include/svx/PaletteManager.hxx index cfe19e29994e..d67623555157 100644 --- a/include/svx/PaletteManager.hxx +++ b/include/svx/PaletteManager.hxx @@ -76,6 +76,9 @@ public: bool IsThemePaletteSelected() const; + static void GetThemeIndexLumModOff(sal_uInt16 nItemId, sal_Int16& rThemeIndex, + sal_Int16& rLumMod, sal_Int16& rLumOff); + static void DispatchColorCommand(const OUString& aCommand, const svx::NamedThemedColor& rColor); }; diff --git a/include/svx/strings.hrc b/include/svx/strings.hrc index 24c9dcfa8cfb..a368a4c77906 100644 --- a/include/svx/strings.hrc +++ b/include/svx/strings.hrc @@ -1132,6 +1132,11 @@ #define RID_SVXSTR_THEME_COLOR10 NC_("RID_SVXSTR_THEME_COLOR10", "Accent 6") #define RID_SVXSTR_THEME_COLOR11 NC_("RID_SVXSTR_THEME_COLOR11", "Hyperlink") #define RID_SVXSTR_THEME_COLOR12 NC_("RID_SVXSTR_THEME_COLOR12", "Followed Hyperlink") +#define RID_SVXSTR_THEME_EFFECT1 NC_("RID_SVXSTR_THEME_EFFECT1", "%1, 80% Lighter") +#define RID_SVXSTR_THEME_EFFECT2 NC_("RID_SVXSTR_THEME_EFFECT2", "%1, 60% Lighter") +#define RID_SVXSTR_THEME_EFFECT3 NC_("RID_SVXSTR_THEME_EFFECT3", "%1, 40% Lighter") +#define RID_SVXSTR_THEME_EFFECT4 NC_("RID_SVXSTR_THEME_EFFECT4", "%1, 25% Darker") +#define RID_SVXSTR_THEME_EFFECT5 NC_("RID_SVXSTR_THEME_EFFECT5", "%1, 50% Darker") #define RID_SVX_EXTRUSION_BAR NC_("RID_SVX_EXTRUSION_BAR", "Extrusion") #define RID_SVXSTR_UNDO_APPLY_EXTRUSION_ON_OFF NC_("RID_SVXSTR_UNDO_APPLY_EXTRUSION_ON_OFF", "Apply Extrusion On/Off") diff --git a/svx/source/tbxctrls/PaletteManager.cxx b/svx/source/tbxctrls/PaletteManager.cxx index 4ed6d3059187..c9ca2a3f70ab 100644 --- a/svx/source/tbxctrls/PaletteManager.cxx +++ b/svx/source/tbxctrls/PaletteManager.cxx @@ -43,6 +43,17 @@ #include <palettes.hxx> +namespace +{ +// Luminance modulation for the 6 effect presets. +// 10000 is the default. +sal_Int16 g_aLumMods[] = { 10000, 2000, 4000, 6000, 7500, 5000 }; + +// Luminance offset for the 6 effect presets. +// 0 is the default. +sal_Int16 g_aLumOffs[] = { 0, 8000, 6000, 4000, 0, 0 }; +} + PaletteManager::PaletteManager() : mnMaxRecentColors(Application::GetSettings().GetStyleSettings().GetColorValueSetColumnCount()), mnNumOfPalettes(3), @@ -131,6 +142,17 @@ bool PaletteManager::IsThemePaletteSelected() const return mnCurrentPalette == mnNumOfPalettes - 2; } +void PaletteManager::GetThemeIndexLumModOff(sal_uInt16 nItemId, sal_Int16& rThemeIndex, + sal_Int16& rLumMod, sal_Int16& rLumOff) +{ + // Each column is the same color with different effects. + rThemeIndex = nItemId % 12; + + // Each row is the same effect with different colors. + rLumMod = g_aLumMods[nItemId / 12]; + rLumOff = g_aLumOffs[nItemId / 12]; +} + void PaletteManager::ReloadColorSet(SvxColorValueSet &rColorSet) { if( mnCurrentPalette == 0) @@ -156,7 +178,13 @@ void PaletteManager::ReloadColorSet(SvxColorValueSet &rColorSet) rColorSet.Clear(); if (aColors.size() >= 12) { - std::vector<OUString> aNames = { + std::vector<OUString> aEffectNames = { + SvxResId(RID_SVXSTR_THEME_EFFECT1), SvxResId(RID_SVXSTR_THEME_EFFECT2), + SvxResId(RID_SVXSTR_THEME_EFFECT3), SvxResId(RID_SVXSTR_THEME_EFFECT4), + SvxResId(RID_SVXSTR_THEME_EFFECT5), + }; + + std::vector<OUString> aColorNames = { SvxResId(RID_SVXSTR_THEME_COLOR1), SvxResId(RID_SVXSTR_THEME_COLOR2), SvxResId(RID_SVXSTR_THEME_COLOR3), SvxResId(RID_SVXSTR_THEME_COLOR4), SvxResId(RID_SVXSTR_THEME_COLOR5), SvxResId(RID_SVXSTR_THEME_COLOR6), @@ -164,9 +192,27 @@ void PaletteManager::ReloadColorSet(SvxColorValueSet &rColorSet) SvxResId(RID_SVXSTR_THEME_COLOR9), SvxResId(RID_SVXSTR_THEME_COLOR10), SvxResId(RID_SVXSTR_THEME_COLOR11), SvxResId(RID_SVXSTR_THEME_COLOR12), }; - for (int i = 0; i < 12; ++i) + + sal_uInt16 nItemId = 0; + // Each row is one effect type (no effect + each type). + for (size_t nEffect = 0; nEffect < aEffectNames.size() + 1; ++nEffect) { - rColorSet.InsertItem(i, aColors[i], aNames[i]); + // Each column is one color type. + for (size_t nColor = 0; nColor < aColorNames.size(); ++nColor) + { + Color aColor = aColors[nColor]; + aColor.ApplyLumModOff(g_aLumMods[nEffect], g_aLumOffs[nEffect]); + OUString aColorName; + if (nEffect == 0) + { + aColorName = aColorNames[nColor]; + } + else + { + aColorName = aEffectNames[nEffect - 1].replaceAll("%1", aColorNames[nColor]); + } + rColorSet.InsertItem(nItemId++, aColor, aColorName); + } } } } diff --git a/svx/source/tbxctrls/tbcontrl.cxx b/svx/source/tbxctrls/tbcontrl.cxx index eb16366d55d2..a649578e0e51 100644 --- a/svx/source/tbxctrls/tbcontrl.cxx +++ b/svx/source/tbxctrls/tbcontrl.cxx @@ -1972,7 +1972,9 @@ IMPL_LINK(ColorWindow, SelectHdl, ValueSet*, pColorSet, void) auto aNamedThemedColor = svx::NamedThemedColor::FromNamedColor(aNamedColor); if (mxPaletteManager->IsThemePaletteSelected()) { - aNamedThemedColor.m_nThemeIndex = pColorSet->GetSelectedItemId(); + PaletteManager::GetThemeIndexLumModOff( + pColorSet->GetSelectedItemId(), aNamedThemedColor.m_nThemeIndex, + aNamedThemedColor.m_nLumMod, aNamedThemedColor.m_nLumOff); } aColorSelectFunction(sCommand, aNamedThemedColor); }