From c9df840d207c8d965b2df993e0a90be89f52c254 Mon Sep 17 00:00:00 2001 From: Tomaž Vajngerl Date: Wed, 26 Aug 2015 11:32:13 +0900 Subject: ColorSets: add preview to ThemePanel, move impl. to own file Change-Id: I1b05edc954125e5bdeed05b5fdce1430f8eaba26 --- include/svx/ColorSets.hxx | 70 +++++++++++++ svx/Library_svxcore.mk | 1 + svx/source/styles/ColorSets.cxx | 126 ++++++++++++++++++++++++ sw/source/uibase/sidebar/ThemePanel.cxx | 167 +++++++++++++------------------- sw/source/uibase/sidebar/ThemePanel.hxx | 13 ++- sw/uiconfig/swriter/ui/sidebartheme.ui | 26 +++-- 6 files changed, 290 insertions(+), 113 deletions(-) create mode 100644 include/svx/ColorSets.hxx create mode 100644 svx/source/styles/ColorSets.cxx diff --git a/include/svx/ColorSets.hxx b/include/svx/ColorSets.hxx new file mode 100644 index 000000000000..009ee4017af4 --- /dev/null +++ b/include/svx/ColorSets.hxx @@ -0,0 +1,70 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + */ + +#ifndef INCLUDED_SVX_COLORSETS_HXX +#define INCLUDED_SVX_COLORSETS_HXX + +#include +#include +#include +#include + +namespace svx +{ + +class SVX_DLLPUBLIC ColorSet +{ + OUString maName; + std::vector maColors; +public: + ColorSet(OUString aName); + ~ColorSet(); + + void add(sal_uInt32 nIndex, sal_uInt32 aColorData) + { + maColors[nIndex] = Color(aColorData); + } + + const OUString& getName() const + { + return maName; + } + const Color& getColor(sal_uInt32 nIndex) const + { + return maColors[nIndex]; + } +}; + +class SVX_DLLPUBLIC ColorSets +{ + std::vector maColorSets; +public: + ColorSets(); + ~ColorSets(); + + void init(); + const std::vector& getColorSets() + { + return maColorSets; + } + + const ColorSet& getColorSet(sal_uInt32 nIndex) + { + return maColorSets[nIndex]; + } + + const ColorSet& getColorSet(const OUString& rName); +}; + +} // end of namespace svx + +#endif // INCLUDED_SVX_COLORSETS_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svx/Library_svxcore.mk b/svx/Library_svxcore.mk index 6ba013ae5fcb..89b1eb0b89f2 100644 --- a/svx/Library_svxcore.mk +++ b/svx/Library_svxcore.mk @@ -341,6 +341,7 @@ $(eval $(call gb_Library_add_exception_objects,svxcore,\ svx/source/svdraw/svdxcgv \ svx/source/styles/CommonStylePreviewRenderer \ svx/source/styles/CommonStyleManager \ + svx/source/styles/ColorSets \ svx/source/table/cell \ svx/source/table/cellcursor \ svx/source/table/cellrange \ diff --git a/svx/source/styles/ColorSets.cxx b/svx/source/styles/ColorSets.cxx new file mode 100644 index 000000000000..43ac4a73dcb4 --- /dev/null +++ b/svx/source/styles/ColorSets.cxx @@ -0,0 +1,126 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + */ + +#include + +namespace svx +{ + +ColorSet::ColorSet(OUString aName) + : maName(aName) + , maColors(12) +{} + +ColorSet::~ColorSet() +{} + +ColorSets::ColorSets() +{} + +ColorSets::~ColorSets() +{} + +void ColorSets::init() +{ + { + ColorSet aColorSet("Breeze"); + aColorSet.add(0, 0x232629); + aColorSet.add(1, 0xFCFCFC); + aColorSet.add(2, 0x31363B); + aColorSet.add(3, 0xEFF0F1); + aColorSet.add(4, 0xDA4453); + aColorSet.add(5, 0xF47750); + aColorSet.add(6, 0xFDBC4B); + aColorSet.add(7, 0xC9CE3B); + aColorSet.add(8, 0x1CDC9A); + aColorSet.add(9, 0x2ECC71); + aColorSet.add(10, 0x1D99F3); + aColorSet.add(11, 0x3DAEE9); + maColorSets.push_back(aColorSet); + } + { + ColorSet aColorSet("Tango"); + aColorSet.add(0, 0x000000); + aColorSet.add(1, 0xFFFFFF); + aColorSet.add(2, 0x2E3436); + aColorSet.add(3, 0xBABDB6); + aColorSet.add(4, 0x3465A4); + aColorSet.add(5, 0x73D216); + aColorSet.add(6, 0xF57900); + aColorSet.add(7, 0x888A85); + aColorSet.add(8, 0xEDD400); + aColorSet.add(9, 0xEF2929); + aColorSet.add(10, 0x75507B); + aColorSet.add(11, 0x555753); + maColorSets.push_back(aColorSet); + } + { + ColorSet aColorSet("Material Blue"); + aColorSet.add(0, 0x212121); + aColorSet.add(1, 0xFFFFFF); + aColorSet.add(2, 0x37474F); + aColorSet.add(3, 0xECEFF1); + aColorSet.add(4, 0x7986CB); + aColorSet.add(5, 0x303F9F); + aColorSet.add(6, 0x64B5F6); + aColorSet.add(7, 0x1976D2); + aColorSet.add(8, 0x4FC3F7); + aColorSet.add(9, 0x0277BD); + aColorSet.add(10, 0x4DD0E1); + aColorSet.add(11, 0x0097A7); + maColorSets.push_back(aColorSet); + } + { + ColorSet aColorSet("Material Red"); + aColorSet.add(0, 0x212121); + aColorSet.add(1, 0xFFFFFF); + aColorSet.add(2, 0x424242); + aColorSet.add(3, 0xF5F5F5); + aColorSet.add(4, 0xFF9800); + aColorSet.add(5, 0xFF6D00); + aColorSet.add(6, 0xFF5722); + aColorSet.add(7, 0xDD2C00); + aColorSet.add(8, 0xF44336); + aColorSet.add(9, 0xD50000); + aColorSet.add(10, 0xE91E63); + aColorSet.add(11, 0xC51162); + maColorSets.push_back(aColorSet); + } + { + ColorSet aColorSet("Material Green"); + aColorSet.add(0, 0x212121); + aColorSet.add(1, 0xFFFFFF); + aColorSet.add(2, 0x424242); + aColorSet.add(3, 0xF5F5F5); + aColorSet.add(4, 0x009688); + aColorSet.add(5, 0x00bfa5); + aColorSet.add(6, 0x4caf50); + aColorSet.add(7, 0x00c853); + aColorSet.add(8, 0x8bc34a); + aColorSet.add(9, 0x64dd17); + aColorSet.add(10, 0xcddc39); + aColorSet.add(11, 0xaeea00); + maColorSets.push_back(aColorSet); + } +} + +const ColorSet& ColorSets::getColorSet(const OUString& rName) +{ + for (size_t i = 0; i < maColorSets.size(); ++i) + { + if (maColorSets[i].getName() == rName) + return maColorSets[i]; + } + return maColorSets[0]; +} + +} // end of namespace svx + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/uibase/sidebar/ThemePanel.cxx b/sw/source/uibase/sidebar/ThemePanel.cxx index c0457bbef5eb..93b0f1cf9015 100644 --- a/sw/source/uibase/sidebar/ThemePanel.cxx +++ b/sw/source/uibase/sidebar/ThemePanel.cxx @@ -15,8 +15,6 @@ #include #include -#include - #include #include #include @@ -55,13 +53,6 @@ public: OUString msBaseFont; }; -class ColorSet -{ -public: - OUString maName; - Color maColors[10]; -}; - class ColorVariable { public: @@ -99,26 +90,13 @@ public: maVariable = aVariable; } - Color getColor(ColorSet& rColorSet) + Color getColor(svx::ColorSet& rColorSet) { Color aColor; if (maVariable.mnIndex > -1) { - aColor.SetColor(rColorSet.maColors[maVariable.mnIndex].GetColor()); - if (maVariable.mnTintShade < 0) - { - double fFactor = std::abs(maVariable.mnTintShade) / 10000.0; - aColor.SetRed(MinMax(aColor.GetRed() + (fFactor * (255.0 - aColor.GetRed())), 0, 255)); - aColor.SetGreen(MinMax(aColor.GetGreen() + (fFactor * (255.0 - aColor.GetGreen())), 0, 255)); - aColor.SetBlue(MinMax(aColor.GetBlue() + (fFactor * (255.0 - aColor.GetBlue())), 0, 255)); - } - else if (maVariable.mnTintShade > 0) - { - double fFactor = 1.0 - std::abs(maVariable.mnTintShade) / 10000.0; - aColor.SetRed(MinMax(aColor.GetRed() * fFactor, 0, 255)); - aColor.SetGreen(MinMax(aColor.GetGreen() * fFactor, 0, 255)); - aColor.SetBlue(MinMax(aColor.GetBlue() * fFactor, 0, 255)); - } + aColor = rColorSet.getColor(maVariable.mnIndex); + aColor.ApplyTintOrShade(maVariable.mnTintShade); } else { @@ -163,61 +141,61 @@ StyleSet setupThemes() { StyleRedefinition aRedefinition("Heading 1"); - aRedefinition.setColorVariable(ColorVariable(0, 4000)); + aRedefinition.setColorVariable(ColorVariable(10, -1000)); aSet.add(aRedefinition); } { StyleRedefinition aRedefinition("Heading 2"); - aRedefinition.setColorVariable(ColorVariable(0, 2500)); + aRedefinition.setColorVariable(ColorVariable(7, -500)); aSet.add(aRedefinition); } { StyleRedefinition aRedefinition("Heading 3"); - aRedefinition.setColorVariable(ColorVariable(0, 1000)); + aRedefinition.setColorVariable(ColorVariable(5, 0)); aSet.add(aRedefinition); } { StyleRedefinition aRedefinition("Heading 4"); - aRedefinition.setColorVariable(ColorVariable(0)); + aRedefinition.setColorVariable(ColorVariable(6, -1000)); aSet.add(aRedefinition); } { StyleRedefinition aRedefinition("Heading 5"); - aRedefinition.setColorVariable(ColorVariable(0, -500)); + aRedefinition.setColorVariable(ColorVariable(4, -1500)); aSet.add(aRedefinition); } { StyleRedefinition aRedefinition("Heading 6"); - aRedefinition.setColorVariable(ColorVariable(0, -1000)); + aRedefinition.setColorVariable(ColorVariable(3, -2500)); aSet.add(aRedefinition); } { StyleRedefinition aRedefinition("Heading 7"); - aRedefinition.setColorVariable(ColorVariable(0, -1500)); + aRedefinition.setColorVariable(ColorVariable(3, -2500)); aSet.add(aRedefinition); } { StyleRedefinition aRedefinition("Heading 8"); - aRedefinition.setColorVariable(ColorVariable(0, -2000)); + aRedefinition.setColorVariable(ColorVariable(2, 0)); aSet.add(aRedefinition); } { StyleRedefinition aRedefinition("Heading 9"); - aRedefinition.setColorVariable(ColorVariable(0, -2500)); + aRedefinition.setColorVariable(ColorVariable(2, 0)); aSet.add(aRedefinition); } { StyleRedefinition aRedefinition("Heading 10"); - aRedefinition.setColorVariable(ColorVariable(0, -3000)); + aRedefinition.setColorVariable(ColorVariable(0, 0)); aSet.add(aRedefinition); } @@ -276,7 +254,7 @@ void changeFont(SwFormat* pFormat, SwDocStyleSheet* pStyle, FontSet& rFontSet) } }*/ -void changeColor(SwTextFormatColl* pCollection, ColorSet& rColorSet, StyleRedefinition* pRedefinition) +void changeColor(SwTextFormatColl* pCollection, svx::ColorSet& rColorSet, StyleRedefinition* pRedefinition) { Color aColor = pRedefinition->getColor(rColorSet); @@ -373,62 +351,15 @@ FontSet getFontSet(const OUString& rFontVariant, std::vector& aFontSets return aFontSets[0]; } -std::vector initColorSets() -{ - std::vector aColorSets; - { - ColorSet aColorSet; - aColorSet.maName = "Default"; - aColorSet.maColors[0] = Color(0x00, 0x00, 0x00); - aColorSets.push_back(aColorSet); - } - { - ColorSet aColorSet; - aColorSet.maName = "Red"; - aColorSet.maColors[0] = Color(0xa4, 0x00, 0x00); - aColorSets.push_back(aColorSet); - } - { - ColorSet aColorSet; - aColorSet.maName = "Green"; - aColorSet.maColors[0] = Color(0x00, 0xa4, 0x00); - aColorSets.push_back(aColorSet); - } - { - ColorSet aColorSet; - aColorSet.maName = "Blue"; - aColorSet.maColors[0] = Color(0x00, 0x00, 0xa4); - aColorSets.push_back(aColorSet); - } - { - ColorSet aColorSet; - aColorSet.maName = "Sky"; - aColorSet.maColors[0] = Color(0x72, 0x9f, 0xcf); - aColorSets.push_back(aColorSet); - } - - return aColorSets; -} - -ColorSet getColorSet(const OUString& rColorVariant, std::vector& aColorSets) -{ - for (size_t i = 0; i < aColorSets.size(); ++i) - { - if (aColorSets[i].maName == rColorVariant) - return aColorSets[i]; - } - return aColorSets[0]; -} - -void applyTheme(SfxStyleSheetBasePool* pPool, const OUString& sFontSetName, const OUString& sColorSetName, StyleSet& rStyleSet) +void applyTheme(SfxStyleSheetBasePool* pPool, const OUString& sFontSetName, const OUString& sColorSetName, + StyleSet& rStyleSet, svx::ColorSets& rColorSets) { SwDocStyleSheet* pStyle; std::vector aFontSets = initFontSets(); FontSet aFontSet = getFontSet(sFontSetName, aFontSets); - std::vector aColorSets = initColorSets(); - ColorSet aColorSet = getColorSet(sColorSetName, aColorSets); + svx::ColorSet aColorSet = rColorSets.getColorSet(sColorSetName); pPool->SetSearchMask(SFX_STYLE_FAMILY_PARA); pStyle = static_cast(pPool->First()); @@ -480,19 +411,53 @@ VclPtr ThemePanel::Create (vcl::Window* pParent, return VclPtr::Create(pParent, rxFrame, pBindings); } +BitmapEx ThemePanel::GenerateColorPreview(const svx::ColorSet& rColorSet) +{ + ScopedVclPtrInstance pVirtualDev(*Application::GetDefaultDevice()); + sal_Int32 nScaleFactor = pVirtualDev->GetDPIScaleFactor(); + long BORDER = 2 * nScaleFactor; + long SIZE = 12 * nScaleFactor; + + Size aSize(BORDER * 7 + SIZE * 6, BORDER * 3 + SIZE * 2); + pVirtualDev->SetOutputSizePixel(aSize); + + long x = BORDER; + long y1 = BORDER; + long y2 = y1 + SIZE + BORDER; + + pVirtualDev->SetLineColor(COL_LIGHTGRAY); + + for (sal_uInt32 i = 0; i < 12; i += 2) + { + pVirtualDev->SetFillColor(rColorSet.getColor(i)); + pVirtualDev->DrawRect(Rectangle(x, y1, x + SIZE, y1 + SIZE)); + + pVirtualDev->SetFillColor(rColorSet.getColor(i + 1)); + pVirtualDev->DrawRect(Rectangle(x, y2, x + SIZE, y2 + SIZE)); + + x += SIZE + BORDER; + } + + return pVirtualDev->GetBitmapEx(Point(), aSize); +} + ThemePanel::ThemePanel(vcl::Window* pParent, - const css::uno::Reference& rxFrame, - SfxBindings* pBindings) + const css::uno::Reference& rxFrame, + SfxBindings* pBindings) : PanelLayout(pParent, "ThemePanel", "modules/swriter/ui/sidebartheme.ui", rxFrame) , mpBindings(pBindings) + , maColorSets() { - get(mpListBoxFonts, "listbox_fonts"); - get(mpListBoxColors, "listbox_colors"); - get(mpApplyButton, "apply"); + get(mpListBoxFonts, "listbox_fonts"); + get(mpValueSetColors, "valueset_colors"); + get(mpApplyButton, "apply"); + + mpValueSetColors->SetColCount(2); + mpValueSetColors->SetLineCount(4); mpApplyButton->SetClickHdl(LINK(this, ThemePanel, ClickHdl)); mpListBoxFonts->SetDoubleClickHdl(LINK(this, ThemePanel, DoubleClickHdl)); - mpListBoxColors->SetDoubleClickHdl(LINK(this, ThemePanel, DoubleClickHdl)); + mpValueSetColors->SetDoubleClickHdl(LINK(this, ThemePanel, DoubleClickHdl)); std::vector aFontSets = initFontSets(); for (size_t i = 0; i < aFontSets.size(); ++i) @@ -500,10 +465,16 @@ ThemePanel::ThemePanel(vcl::Window* pParent, mpListBoxFonts->InsertEntry(aFontSets[i].maName); } - std::vector aColorSets = initColorSets(); + maColorSets.init(); + + const std::vector& aColorSets = maColorSets.getColorSets(); for (size_t i = 0; i < aColorSets.size(); ++i) { - mpListBoxColors->InsertEntry(aColorSets[i].maName); + const svx::ColorSet& rColorSet = aColorSets[i]; + + OUString aName = rColorSet.getName(); + BitmapEx aPreview = GenerateColorPreview(rColorSet); + mpValueSetColors->InsertItem(i, Image(aPreview), aName); } } @@ -515,7 +486,7 @@ ThemePanel::~ThemePanel() void ThemePanel::dispose() { mpListBoxFonts.clear(); - mpListBoxColors.clear(); + mpValueSetColors.clear(); mpApplyButton.clear(); PanelLayout::dispose(); @@ -525,17 +496,19 @@ IMPL_LINK_NOARG_TYPED(ThemePanel, ClickHdl, Button*, void) { DoubleClickHdl(NULL); } + IMPL_LINK_NOARG(ThemePanel, DoubleClickHdl) { SwDocShell* pDocSh = static_cast(SfxObjectShell::Current()); if (pDocSh) { OUString sEntryFonts = mpListBoxFonts->GetSelectEntry(); - OUString sEntryColors = mpListBoxColors->GetSelectEntry(); + sal_uInt32 nItemId = mpValueSetColors->GetSelectItemId(); + OUString sEntryColors = maColorSets.getColorSet(nItemId).getName(); StyleSet aStyleSet = setupThemes(); - applyTheme(pDocSh->GetStyleSheetPool(), sEntryFonts, sEntryColors, aStyleSet); + applyTheme(pDocSh->GetStyleSheetPool(), sEntryFonts, sEntryColors, aStyleSet, maColorSets); } return 1; } diff --git a/sw/source/uibase/sidebar/ThemePanel.hxx b/sw/source/uibase/sidebar/ThemePanel.hxx index 0e95c5e0f205..a2af076c21be 100644 --- a/sw/source/uibase/sidebar/ThemePanel.hxx +++ b/sw/source/uibase/sidebar/ThemePanel.hxx @@ -32,8 +32,12 @@ #include #include +#include + #include +#include + #include "docsh.hxx" namespace sw { namespace sidebar { @@ -56,18 +60,23 @@ private: ThemePanel(vcl::Window* pParent, const css::uno::Reference& rxFrame, SfxBindings* pBindings); - virtual ~ThemePanel(); + virtual void dispose() SAL_OVERRIDE; + BitmapEx GenerateColorPreview(const svx::ColorSet& rColorSet); + SfxBindings* mpBindings; VclPtr mpListBoxFonts; - VclPtr mpListBoxColors; + VclPtr mpValueSetColors; VclPtr mpApplyButton; + svx::ColorSets maColorSets; + DECL_LINK_TYPED(ClickHdl, Button*, void); DECL_LINK(DoubleClickHdl, void*); + }; }} // end of namespace sw::sidebar diff --git a/sw/uiconfig/swriter/ui/sidebartheme.ui b/sw/uiconfig/swriter/ui/sidebartheme.ui index b422773d6e27..ec0d850db52f 100644 --- a/sw/uiconfig/swriter/ui/sidebartheme.ui +++ b/sw/uiconfig/swriter/ui/sidebartheme.ui @@ -2,6 +2,8 @@ + + True False @@ -43,20 +45,6 @@ 1 - - - True - True - True - - - - - - 0 - 3 - - True @@ -82,6 +70,16 @@ 4 + + + True + False + + + 0 + 3 + + -- cgit v1.2.3