diff options
author | Miklos Vajna <vmiklos@collabora.com> | 2021-12-16 08:56:25 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2022-06-29 14:54:44 +0200 |
commit | 4b139336b89c99b60e25149c7871dbabcb8a41db (patch) | |
tree | 7cc82e5e81fd3b26d8815778c414c9e125f43a77 /cui | |
parent | faefd179af737cf68b96cd25901be0a7195fc8b9 (diff) |
sd theme: add UI to set individual colors of a color set
Which completes the UI to set and get various parts of the theme itself
(not yet referring to a theme).
(cherry picked from commit 48cb441fceab83a6320dc871f291dcb313696650)
Change-Id: I30cb575046d1146083cb5723377400b67de79a69
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136606
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Diffstat (limited to 'cui')
-rw-r--r-- | cui/qa/uitest/tabpages/themepage.py | 31 | ||||
-rw-r--r-- | cui/source/inc/themepage.hxx | 14 | ||||
-rw-r--r-- | cui/source/tabpages/themepage.cxx | 61 | ||||
-rw-r--r-- | cui/uiconfig/ui/themetabpage.ui | 441 |
4 files changed, 537 insertions, 10 deletions
diff --git a/cui/qa/uitest/tabpages/themepage.py b/cui/qa/uitest/tabpages/themepage.py index 25726c63feda..f85af965f626 100644 --- a/cui/qa/uitest/tabpages/themepage.py +++ b/cui/qa/uitest/tabpages/themepage.py @@ -9,6 +9,7 @@ from libreoffice.uno.propertyvalue import mkPropertyValues from uitest.framework import UITestCase from uitest.uihelper.common import get_state_as_dict from uitest.uihelper.common import select_pos +from uitest.uihelper.common import select_by_text # Test for cui/source/tabpages/themepage.cxx. class Test(UITestCase): @@ -24,7 +25,21 @@ class Test(UITestCase): master = drawPage.MasterPage theme = mkPropertyValues({ "Name": "nameA", - "ColorSchemeName": "colorSetA" + "ColorSchemeName": "colorSetA", + "ColorScheme": tuple([ + 0x000000, # dk1 + 0x000000, # lt1 + 0x000000, # dk2 + 0x000000, # lt2 + 0x0000ff, # accent1 + 0x000000, # accent2 + 0x000000, # accent3 + 0x000000, # accent4 + 0x000000, # accent5 + 0x000000, # accent6 + 0x000000, # hlink + 0x000000, # folHlink + ]) }) master.Theme = theme @@ -43,6 +58,15 @@ class Test(UITestCase): colorSetName.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"})) colorSetName.executeAction("TYPE", mkPropertyValues({"TEXT": "colorSetB"})) + # Select a custom accent1 color. + accent1 = xDialog.getChild("btnAccent1") + accent1.executeAction("OPENLIST", tuple()) + floatWindow = self.xUITest.getFloatWindow() + paletteSelector = floatWindow.getChild("palette_listbox") + select_by_text(paletteSelector, "chart-palettes") + colorSet = floatWindow.getChild("colorset") + colorSet.executeAction("CHOOSE", mkPropertyValues({"POS": "2"})) + # Then make sure the doc model is updated accordingly: # Without the accompanying fix in place, this test would have failed with: # AssertionError: 'nameA' != 'nameB' @@ -53,6 +77,11 @@ class Test(UITestCase): # AssertionError: 'colorSetA' != 'colorSetB' # i.e. the UI didn't update the color scheme name. self.assertEqual(theme["ColorSchemeName"], "colorSetB") + colorSet = theme["ColorScheme"] + # Without the accompanying fix in place, this test would have failed with: + # AssertionError: 0 != 16728590 (#ff420e) + # i.e. the UI didn't update the accent1 color from black to a custom value. + self.assertEqual(colorSet[4], 0xff420e) # vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/cui/source/inc/themepage.hxx b/cui/source/inc/themepage.hxx index 613650c075b6..894a09c9385b 100644 --- a/cui/source/inc/themepage.hxx +++ b/cui/source/inc/themepage.hxx @@ -15,6 +15,8 @@ #include <memory> +class ColorListBox; + /// Tab page for themes class SvxThemePage : public SfxTabPage { @@ -22,6 +24,18 @@ class SvxThemePage : public SfxTabPage std::unique_ptr<weld::Entry> m_xThemeName; std::unique_ptr<weld::Entry> m_xColorSetName; + std::unique_ptr<ColorListBox> m_xDk1; + std::unique_ptr<ColorListBox> m_xLt1; + std::unique_ptr<ColorListBox> m_xDk2; + std::unique_ptr<ColorListBox> m_xLt2; + std::unique_ptr<ColorListBox> m_xAccent1; + std::unique_ptr<ColorListBox> m_xAccent2; + std::unique_ptr<ColorListBox> m_xAccent3; + std::unique_ptr<ColorListBox> m_xAccent4; + std::unique_ptr<ColorListBox> m_xAccent5; + std::unique_ptr<ColorListBox> m_xAccent6; + std::unique_ptr<ColorListBox> m_xHlink; + std::unique_ptr<ColorListBox> m_xFolHlink; public: SvxThemePage(weld::Container* pPage, weld::DialogController* pController, diff --git a/cui/source/tabpages/themepage.cxx b/cui/source/tabpages/themepage.cxx index 99abeed799fb..c01d72def6cc 100644 --- a/cui/source/tabpages/themepage.cxx +++ b/cui/source/tabpages/themepage.cxx @@ -10,11 +10,14 @@ #include <sal/config.h> #include <com/sun/star/beans/PropertyValues.hpp> +#include <com/sun/star/util/Color.hpp> +#include <comphelper/sequence.hxx> #include <comphelper/sequenceashashmap.hxx> #include <editeng/editids.hrc> #include <sal/log.hxx> #include <svl/grabbagitem.hxx> +#include <svx/colorbox.hxx> #include <themepage.hxx> @@ -28,6 +31,30 @@ SvxThemePage::SvxThemePage(weld::Container* pPage, weld::DialogController* pCont : SfxTabPage(pPage, pController, "cui/ui/themetabpage.ui", "ThemePage", &rInAttrs) , m_xThemeName(m_xBuilder->weld_entry("themeName")) , m_xColorSetName(m_xBuilder->weld_entry("colorSetName")) + , m_xDk1(new ColorListBox(m_xBuilder->weld_menu_button("btnDk1"), + [this] { return GetDialogController()->getDialog(); })) + , m_xLt1(new ColorListBox(m_xBuilder->weld_menu_button("btnLt1"), + [this] { return GetDialogController()->getDialog(); })) + , m_xDk2(new ColorListBox(m_xBuilder->weld_menu_button("btnDk2"), + [this] { return GetDialogController()->getDialog(); })) + , m_xLt2(new ColorListBox(m_xBuilder->weld_menu_button("btnLt2"), + [this] { return GetDialogController()->getDialog(); })) + , m_xAccent1(new ColorListBox(m_xBuilder->weld_menu_button("btnAccent1"), + [this] { return GetDialogController()->getDialog(); })) + , m_xAccent2(new ColorListBox(m_xBuilder->weld_menu_button("btnAccent2"), + [this] { return GetDialogController()->getDialog(); })) + , m_xAccent3(new ColorListBox(m_xBuilder->weld_menu_button("btnAccent3"), + [this] { return GetDialogController()->getDialog(); })) + , m_xAccent4(new ColorListBox(m_xBuilder->weld_menu_button("btnAccent4"), + [this] { return GetDialogController()->getDialog(); })) + , m_xAccent5(new ColorListBox(m_xBuilder->weld_menu_button("btnAccent5"), + [this] { return GetDialogController()->getDialog(); })) + , m_xAccent6(new ColorListBox(m_xBuilder->weld_menu_button("btnAccent6"), + [this] { return GetDialogController()->getDialog(); })) + , m_xHlink(new ColorListBox(m_xBuilder->weld_menu_button("btnHlink"), + [this] { return GetDialogController()->getDialog(); })) + , m_xFolHlink(new ColorListBox(m_xBuilder->weld_menu_button("btnFolHlink"), + [this] { return GetDialogController()->getDialog(); })) { } @@ -66,6 +93,25 @@ void SvxThemePage::Reset(const SfxItemSet* pAttrs) it->second >>= aName; m_xColorSetName->set_text(aName); } + + it = aMap.find("ColorScheme"); + if (it != aMap.end()) + { + uno::Sequence<util::Color> aColors; + it->second >>= aColors; + m_xDk1->SelectEntry(Color(ColorTransparency, aColors[0])); + m_xLt1->SelectEntry(Color(ColorTransparency, aColors[1])); + m_xDk2->SelectEntry(Color(ColorTransparency, aColors[2])); + m_xLt2->SelectEntry(Color(ColorTransparency, aColors[3])); + m_xAccent1->SelectEntry(Color(ColorTransparency, aColors[4])); + m_xAccent2->SelectEntry(Color(ColorTransparency, aColors[5])); + m_xAccent3->SelectEntry(Color(ColorTransparency, aColors[6])); + m_xAccent4->SelectEntry(Color(ColorTransparency, aColors[7])); + m_xAccent5->SelectEntry(Color(ColorTransparency, aColors[8])); + m_xAccent6->SelectEntry(Color(ColorTransparency, aColors[9])); + m_xHlink->SelectEntry(Color(ColorTransparency, aColors[10])); + m_xFolHlink->SelectEntry(Color(ColorTransparency, aColors[11])); + } } bool SvxThemePage::FillItemSet(SfxItemSet* pAttrs) @@ -86,6 +132,21 @@ bool SvxThemePage::FillItemSet(SfxItemSet* pAttrs) aMap["Name"] <<= m_xThemeName->get_text(); aMap["ColorSchemeName"] <<= m_xColorSetName->get_text(); + std::vector<util::Color> aColorScheme = { + static_cast<sal_Int32>(m_xDk1->GetSelectEntryColor()), + static_cast<sal_Int32>(m_xLt1->GetSelectEntryColor()), + static_cast<sal_Int32>(m_xDk2->GetSelectEntryColor()), + static_cast<sal_Int32>(m_xLt2->GetSelectEntryColor()), + static_cast<sal_Int32>(m_xAccent1->GetSelectEntryColor()), + static_cast<sal_Int32>(m_xAccent2->GetSelectEntryColor()), + static_cast<sal_Int32>(m_xAccent3->GetSelectEntryColor()), + static_cast<sal_Int32>(m_xAccent4->GetSelectEntryColor()), + static_cast<sal_Int32>(m_xAccent5->GetSelectEntryColor()), + static_cast<sal_Int32>(m_xAccent6->GetSelectEntryColor()), + static_cast<sal_Int32>(m_xHlink->GetSelectEntryColor()), + static_cast<sal_Int32>(m_xFolHlink->GetSelectEntryColor()), + }; + aMap["ColorScheme"] <<= comphelper::containerToSequence(aColorScheme); beans::PropertyValues aTheme = aMap.getAsConstPropertyValueList(); aGrabBagItem.GetGrabBag()["Theme"] <<= aTheme; diff --git a/cui/uiconfig/ui/themetabpage.ui b/cui/uiconfig/ui/themetabpage.ui index 81c1affbe85f..f991d65aa4b2 100644 --- a/cui/uiconfig/ui/themetabpage.ui +++ b/cui/uiconfig/ui/themetabpage.ui @@ -18,10 +18,11 @@ <object class="GtkGrid" id="gdGeneral"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="margin_start">6</property> - <property name="margin_end">6</property> - <property name="row_spacing">3</property> - <property name="column_spacing">6</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="border_width">6</property> + <property name="row_spacing">6</property> + <property name="column_spacing">12</property> <child> <object class="GtkLabel" id="lbThemeName"> <property name="visible">True</property> @@ -78,15 +79,17 @@ <object class="GtkGrid" id="gdColors"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="margin_start">6</property> - <property name="margin_end">6</property> - <property name="row_spacing">3</property> - <property name="column_spacing">6</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="border_width">6</property> + <property name="row_spacing">6</property> + <property name="column_spacing">12</property> <child> <object class="GtkLabel" id="lbColorSetName"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="label" translatable="yes" context="themetabpage|lbColorSetName">Name:</property> + <property name="xalign">0</property> <accessibility> <relation type="label-for" target="colorSetName"/> </accessibility> @@ -109,13 +112,433 @@ <property name="top_attach">0</property> </packing> </child> + <child> + <object class="GtkLabel" id="lbDk1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="themetabpage|lbDk1">Background - Dark 1:</property> + <property name="xalign">0</property> + <accessibility> + <relation type="label-for" target="btnDk1"/> + </accessibility> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="lbLt1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="themetabpage|lbLt1">Text - Light 1:</property> + <property name="xalign">0</property> + <accessibility> + <relation type="label-for" target="btnLt1"/> + </accessibility> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="lbDk2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="themetabpage|lbDk2">Background - Dark 2:</property> + <property name="xalign">0</property> + <accessibility> + <relation type="label-for" target="btnDk2"/> + </accessibility> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">3</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="lbLt2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="themetabpage|lbLt2">Text - Light 2:</property> + <property name="xalign">0</property> + <accessibility> + <relation type="label-for" target="btnLt2"/> + </accessibility> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">4</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="lbAccent1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="themetabpage|lbAccent1">Accent 1:</property> + <property name="xalign">0</property> + <accessibility> + <relation type="label-for" target="btnAccent1"/> + </accessibility> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">5</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="lbAccent2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="themetabpage|lbAccent2">Accent 2:</property> + <property name="xalign">0</property> + <accessibility> + <relation type="label-for" target="btnAccent2"/> + </accessibility> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">6</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="lbAccent3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="themetabpage|lbAccent3">Accent 3:</property> + <property name="xalign">0</property> + <accessibility> + <relation type="label-for" target="btnAccent3"/> + </accessibility> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">7</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="lbAccent4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="themetabpage|lbAccent4">Accent 4:</property> + <property name="xalign">0</property> + <accessibility> + <relation type="label-for" target="btnAccent4"/> + </accessibility> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">8</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="lbAccent5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="themetabpage|lbAccent5">Accent 5:</property> + <property name="xalign">0</property> + <accessibility> + <relation type="label-for" target="btnAccent5"/> + </accessibility> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">9</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="lbAccent6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="themetabpage|lbAccent6">Accent 6:</property> + <property name="xalign">0</property> + <accessibility> + <relation type="label-for" target="btnAccent6"/> + </accessibility> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">10</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="lbHlink"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="themetabpage|lbHlink">Hyperlink:</property> + <property name="xalign">0</property> + <accessibility> + <relation type="label-for" target="btnHlink"/> + </accessibility> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">11</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="lbFolHlink"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="themetabpage|lbFolHlink">Followed Hyperlink:</property> + <property name="xalign">0</property> + <accessibility> + <relation type="label-for" target="btnFolHlink"/> + </accessibility> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">12</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="btnDk1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + <property name="xalign">0</property> + <property name="label" translatable="no"></property> + <child> + <placeholder/> + </child> + <accessibility> + <relation type="labelled-by" target="lbDk1"/> + </accessibility> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="btnLt1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + <property name="xalign">0</property> + <property name="label" translatable="no"></property> + <child> + <placeholder/> + </child> + <accessibility> + <relation type="labelled-by" target="lbLt1"/> + </accessibility> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">2</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="btnDk2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + <property name="xalign">0</property> + <property name="label" translatable="no"></property> + <child> + <placeholder/> + </child> + <accessibility> + <relation type="labelled-by" target="lbDk2"/> + </accessibility> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">3</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="btnLt2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + <property name="xalign">0</property> + <property name="label" translatable="no"></property> + <child> + <placeholder/> + </child> + <accessibility> + <relation type="labelled-by" target="lbLt2"/> + </accessibility> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">4</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="btnAccent1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + <property name="xalign">0</property> + <property name="label" translatable="no"></property> + <child> + <placeholder/> + </child> + <accessibility> + <relation type="labelled-by" target="lbAccent1"/> + </accessibility> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">5</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="btnAccent2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + <property name="xalign">0</property> + <property name="label" translatable="no"></property> + <child> + <placeholder/> + </child> + <accessibility> + <relation type="labelled-by" target="lbAccent2"/> + </accessibility> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">6</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="btnAccent3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + <property name="xalign">0</property> + <property name="label" translatable="no"></property> + <child> + <placeholder/> + </child> + <accessibility> + <relation type="labelled-by" target="lbAccent3"/> + </accessibility> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">7</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="btnAccent4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + <property name="xalign">0</property> + <property name="label" translatable="no"></property> + <child> + <placeholder/> + </child> + <accessibility> + <relation type="labelled-by" target="lbAccent4"/> + </accessibility> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">8</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="btnAccent5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + <property name="xalign">0</property> + <property name="label" translatable="no"></property> + <child> + <placeholder/> + </child> + <accessibility> + <relation type="labelled-by" target="lbAccent5"/> + </accessibility> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">9</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="btnAccent6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + <property name="xalign">0</property> + <property name="label" translatable="no"></property> + <child> + <placeholder/> + </child> + <accessibility> + <relation type="labelled-by" target="lbAccent6"/> + </accessibility> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">10</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="btnHlink"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + <property name="xalign">0</property> + <property name="label" translatable="no"></property> + <child> + <placeholder/> + </child> + <accessibility> + <relation type="labelled-by" target="lbHlink"/> + </accessibility> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">11</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="btnFolHlink"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + <property name="xalign">0</property> + <property name="label" translatable="no"></property> + <child> + <placeholder/> + </child> + <accessibility> + <relation type="labelled-by" target="lbFolHlink"/> + </accessibility> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">12</property> + </packing> + </child> </object> </child> <child type="label"> <object class="GtkLabel" id="colorSet"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="label" translatable="yes" context="themetabpage|colorSet">Color set</property> + <property name="label" translatable="yes" context="themetabpage|colorSet">Color Set</property> <attributes> <attribute name="weight" value="bold"/> </attributes> |