cui/inc/strings.hrc | 5 cui/source/options/appearance.cxx | 304 +- cui/source/options/appearance.hxx | 27 cui/uiconfig/ui/appearance.ui | 452 ++- include/svtools/colorcfg.hxx | 2 include/vcl/settings.hxx | 20 include/vcl/themecolors.hxx | 62 officecfg/registry/data/org/openoffice/Office/UI.xcu | 1546 ------------- officecfg/registry/schema/org/openoffice/Office/Common.xcs | 32 sc/source/ui/unoobj/docuno.cxx | 8 sd/source/ui/unoidl/unomodel.cxx | 8 sfx2/source/appl/appserv.cxx | 26 svtools/source/config/colorcfg.cxx | 65 sw/qa/extras/tiledrendering/tiledrendering.cxx | 3 sw/source/uibase/uno/unotxdoc.cxx | 9 vcl/README.themes.md | 209 - vcl/osx/salframe.cxx | 11 vcl/osx/salinst.cxx | 6 vcl/osx/salnativewidgets.cxx | 12 vcl/qt5/QtCustomStyle.cxx | 11 vcl/qt5/QtFrame.cxx | 1 vcl/qt5/QtMenu.cxx | 6 vcl/source/app/settings.cxx | 49 vcl/source/app/themecolors.cxx | 27 vcl/unx/gtk3/custom-theme.cxx | 1207 ++++++---- vcl/unx/gtk3/custom-theme.hxx | 1 vcl/unx/gtk3/gtkframe.cxx | 6 vcl/unx/gtk3/salnativewidgets-gtk.cxx | 4 vcl/win/gdi/salnativewidgets-luna.cxx | 75 vcl/win/window/salframe.cxx | 11 30 files changed, 1345 insertions(+), 2860 deletions(-)
New commits: commit 38d39d9113dc30e5a0c7a491de59e359ef413fb3 Author: Sahil Gautam <[email protected]> AuthorDate: Mon Jan 26 20:33:44 2026 +0530 Commit: Michael Stahl <[email protected]> CommitDate: Tue Jan 27 12:37:36 2026 +0100 theming: revert recently merged theming patches Some of these commits introduced string changes amid a string freeze. Revert "tdf#164970 move customizations frame below the themes frame" This reverts commit 156406c259d62b79264dcb2eea3ada179faf1812. Revert "tdf#164970 add checkbox for toggling document color customization" This reverts commit 126378132cf7b22bf050b11173abff9d719c9d71. Revert "tdf#164970 add a checkbox for enabling/disabling application theming" This reverts commit 06f69de8cd04edb15d1c0e2a6cad7adf2a34e90d. Revert "tdf#164970 cleanup the ui file for making further work convenient" This reverts commit 13e72a66058c40794c18f595c0610a6b3aa0bf3c. Revert "tdf#164970 remove add and remove buttons from appearance tab" This reverts commit db27f9b2d908647d4b57edb2b2f540a2ff077d36. Revert "tdf#164970 Merge appearance options with themes dropdown" This reverts commit ba8c5158893c8dcd793ccf597dcea4d0a08f2c73. Revert "tdf#164970 use proper enums for ApplicationAppearance instead of raw ints" This reverts commit a035a033d6404ca366c8d620bfab2651f9685266. Revert "tdf#164970 themes code cleanup, remove unneccessary assignment statements" This reverts commit 7b7fe696b7b4a90d1c629ff34f03062cf69441f2. Reapply "tdf#165803 use COL_WHITE for DOCCOLOR for both light and dark modes" This reverts commit 005f592aa6007eca55edd6277714e44f716faeac. Revert "tdf#165803 use COL_WHITE for DOCCOLOR for both light and dark modes" This reverts commit f401c1dcf70c77d86cd2f3cd34174318d1120b20. Revert "Add vcl/README.themes.md for themes implementation details" This reverts commit 53828cf16ff987e7e8b01fcd1d15c337fa6f28b5. Revert "remove unused include from vcl" This reverts commit 3dea7fa454e0a0a2ec3fc9d6cf0d028a7034ed61. Revert "remove unused LoadColorsFromTheme() from gtk theming code" This reverts commit e627e15e9163c271f4a817404436d16ca2db955e. Revert "tdf#164969 fix widget theming/styling in gtk" This reverts commit 5e1cf95ecb7cc8287c9ea9a9d0073f5ca6047d0b. Revert "tdf#164950 Set GtkCssProvider at APPLICATION level, not USER" This reverts commit 05ca63a7a60f81c3dfb8b966cc321bbb2ce72e88. Revert "tdf#164393 [API CHANGE] Make the "Automatic" theme Customizable" This reverts commit c7c7a2e5dfeb23304758c78aece1d439c8ceead2. Revert "Set StyleSettings::DisableColor value in Win" This reverts commit 3de945fca589ceb8c79e3b3e16e9e3452b8869e7. Reapply "remove unused #include from svtools" This reverts commit 459f1612ac54b3cbb6b7ebeec38632202058cc29. Revert "tdf#164420 Fix unselected Check/Radio buttons not following themes in GTK" This reverts commit e8f6751abb8894913933305c5273acf88ce1bac9. Revert "remove unused #include from svtools" This reverts commit 6d263b058e2e25cc18be14a38832907def237054. Revert "Use disable color for disabled controls in GTK" This reverts commit e06d5e7e4ee16b4c71007ccbc0d454b6df3c23a0. Revert "tdf#164393 Change themes UI as per UX feedback" This reverts commit 956a485f941472e9735a1b35fd54d413b2dcf0b0. Revert "tdf#164393 [API CHANGE] ThemeColors refactor part 3" This reverts commit 1655e4297355684570abfc0af0bd94045f8d400f. Revert "tdf#164393 ThemeColors refactor part 2" This reverts commit 31c07a54d281a0455acb5a462fb56e9b7881b251. Revert "tdf#164393 ThemeColors refactor part 1" This reverts commit f0f3624aa39bf9e51dc01cf2799c6e624c92a9ea. Revert "tdf#164393 Format the code to make clang-format happy" This reverts commit 62914a17f1cbdb9d0ea4aa3efe44b39e0872f435. Revert "tdf#164393 nicely format gtk-css-declarations for custom themeing" This reverts commit 0dc9fea9cce7a8c9be800139565f757cb4775fc2. Change-Id: I860d0479d4f7502a84ad32a2d4aabf93a8249468 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/198160 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Michael Stahl <[email protected]> diff --git a/cui/inc/strings.hrc b/cui/inc/strings.hrc index 08c42ccfded6..4b8ec0da311d 100644 --- a/cui/inc/strings.hrc +++ b/cui/inc/strings.hrc @@ -400,8 +400,6 @@ // Translatable names of color schemes #define RID_COLOR_SCHEME_LIBREOFFICE_AUTOMATIC NC_("RID_COLOR_SCHEME_LIBREOFFICE_AUTOMATIC", "Automatic") -#define RID_COLOR_SCHEME_LIBREOFFICE_LIGHT NC_("RID_COLOR_SCHEME_LIBREOFFICE_LIGHT", "Light") -#define RID_COLOR_SCHEME_LIBREOFFICE_DARK NC_("RID_COLOR_SCHEME_LIBREOFFICE_DARK", "Dark") // Translatable Bitmap Names #define BMP_FUZZY_LIGHTGREY NC_("BMP_FUZZY_LIGHTGREY", "Fuzzy Lightgrey") @@ -450,6 +448,9 @@ #define BMP_TIGER NC_("BMP_TIGER", "Tiger") #define BMP_ZEBRA NC_("BMP_ZEBRA", "Zebra") +#define LIGHT_COLOR_LBL NC_("LIGHT_COLOR_LBL", "Light") +#define DARK_COLOR_LBL NC_("DARK_COLOR_LBL", "Dark") + // Translated Registry Entries #define REG_DOCCOLOR NC_("REG_DOCCOLOR", "Document background") #define REG_DOCBOUNDARIES NC_("REG_DOCBOUNDARIES", "Document boundaries") diff --git a/cui/source/options/appearance.cxx b/cui/source/options/appearance.cxx index 3bcd7b6960c5..718603f8549a 100644 --- a/cui/source/options/appearance.cxx +++ b/cui/source/options/appearance.cxx @@ -21,7 +21,6 @@ #include <tools/debug.hxx> #include <unotools/resmgr.hxx> #include <vcl/svapp.hxx> -#include <vcl/themecolors.hxx> #include <comphelper/dispatchcommand.hxx> #include <comphelper/propertyvalue.hxx> #include <map> @@ -87,13 +86,6 @@ std::vector<BitmapData> const& getBitmapList() } } -static bool IsDarkModeEnabled() -{ - return MiscSettings::GetAppColorMode() == AppearanceMode::DARK - || (MiscSettings::GetAppColorMode() == AppearanceMode::AUTO - && MiscSettings::GetUseDarkMode()); -} - SvxAppearanceTabPage::SvxAppearanceTabPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rSet) @@ -102,13 +94,16 @@ SvxAppearanceTabPage::SvxAppearanceTabPage(weld::Container* pPage, , pColorConfig(new EditableColorConfig) , m_xSchemeList(m_xBuilder->weld_combo_box(u"scheme"_ustr)) , m_xMoreThemesBtn(m_xBuilder->weld_button(u"morethemesbtn"_ustr)) - , m_xEnableAppTheming(m_xBuilder->weld_check_button(u"enableapptheming"_ustr)) - , m_xUseOnlyWhiteDocBackground(m_xBuilder->weld_check_button(u"useonlywhitedocbackground"_ustr)) + , m_xAddSchemeBtn(m_xBuilder->weld_button(u"newschemebtn"_ustr)) + , m_xRemoveSchemeBtn(m_xBuilder->weld_button(u"removeschemebtn"_ustr)) + , m_xAppearanceSystem(m_xBuilder->weld_radio_button(u"system"_ustr)) + , m_xAppearanceLight(m_xBuilder->weld_radio_button(u"light"_ustr)) + , m_xAppearanceDark(m_xBuilder->weld_radio_button(u"dark"_ustr)) , m_xColorEntryBtn(m_xBuilder->weld_combo_box(u"registrydropdown"_ustr)) , m_xColorChangeBtn((new ColorListBox(m_xBuilder->weld_menu_button(u"colorsdropdownbtn"_ustr), [this] { return GetFrameWeld(); }))) + , m_xColorLbl(m_xBuilder->weld_label(u"colorlbl"_ustr)) , m_xShowInDocumentChkBtn(m_xBuilder->weld_check_button(u"showindocumentchkbtn"_ustr)) - , m_xResetAllBtn(m_xBuilder->weld_button(u"resetallbtn"_ustr)) , m_xColorRadioBtn(m_xBuilder->weld_radio_button(u"colorradiobtn"_ustr)) , m_xImageRadioBtn(m_xBuilder->weld_radio_button(u"imageradiobtn"_ustr)) , m_xStretchedRadioBtn(m_xBuilder->weld_radio_button(u"stretchedradiobtn"_ustr)) @@ -116,36 +111,33 @@ SvxAppearanceTabPage::SvxAppearanceTabPage(weld::Container* pPage, , m_xBitmapDropDownBtn(m_xBuilder->weld_combo_box(u"bitmapdropdown"_ustr)) { InitThemes(); + InitAppearance(); InitCustomization(); + UpdateControlsState(); +} + +void SvxAppearanceTabPage::UpdateControlsState() +{ + // in case of AUTOMATIC_COLOR_SCHEME, disable all the controls + bool bEnableControls = m_xSchemeList->get_active_id() != AUTOMATIC_COLOR_SCHEME; + m_xShowInDocumentChkBtn->set_sensitive(bEnableControls); + EnableImageControls(bEnableControls && GetActiveEntry() == static_cast<int>(APPBACKGROUND)); } void SvxAppearanceTabPage::LoadSchemeList() { m_xSchemeList->clear(); css::uno::Sequence<OUString> aSchemeNames = pColorConfig->GetSchemeNames(); - - // insert auto, light, dark themes first + for (size_t i = 0; i < aSchemeNames.size(); ++i) + { + if (aSchemeNames[i] != AUTOMATIC_COLOR_SCHEME) + m_xSchemeList->insert(i, aSchemeNames[i], nullptr, nullptr, nullptr); + } m_xSchemeList->insert(0, CuiResId(RID_COLOR_SCHEME_LIBREOFFICE_AUTOMATIC), &AUTOMATIC_COLOR_SCHEME, nullptr, nullptr); - m_xSchemeList->insert(1, CuiResId(RID_COLOR_SCHEME_LIBREOFFICE_LIGHT), &LIGHT_COLOR_SCHEME, - nullptr, nullptr); - m_xSchemeList->insert(2, CuiResId(RID_COLOR_SCHEME_LIBREOFFICE_DARK), &DARK_COLOR_SCHEME, - nullptr, nullptr); - // insert all the custom color schemes - for (size_t i = 0; i < aSchemeNames.size(); ++i) - if (ThemeColors::IsCustomTheme(aSchemeNames[i])) - m_xSchemeList->append_text(aSchemeNames[i]); - - // since this function just loads entries into the list, we don't call - // MiscSettings::SetAppColorMode(...) here, and instead do so in the - // SchemeChangeHdl callback. - if (ThemeColors::IsAutomaticTheme(pColorConfig->GetCurrentSchemeName())) + if (pColorConfig->GetCurrentSchemeName() == AUTOMATIC_COLOR_SCHEME) m_xSchemeList->set_active_id(AUTOMATIC_COLOR_SCHEME); - else if (ThemeColors::IsLightTheme(pColorConfig->GetCurrentSchemeName())) - m_xSchemeList->set_active_id(LIGHT_COLOR_SCHEME); - else if (ThemeColors::IsDarkTheme(pColorConfig->GetCurrentSchemeName())) - m_xSchemeList->set_active_id(DARK_COLOR_SCHEME); else m_xSchemeList->set_active_text(pColorConfig->GetCurrentSchemeName()); } @@ -181,10 +173,30 @@ OUString SvxAppearanceTabPage::GetAllStrings() bool SvxAppearanceTabPage::FillItemSet(SfxItemSet* /* rSet */) { + // commit appearance value + if (eCurrentAppearanceMode != static_cast<Appearance>(MiscSettings::GetAppColorMode())) + { + MiscSettings::SetAppColorMode(static_cast<int>(eCurrentAppearanceMode)); + m_bRestartRequired = true; + // for automatic scheme, restart is not required as customizations section is disabled + if (pColorConfig->GetCurrentSchemeName() == AUTOMATIC_COLOR_SCHEME) + UpdateOldAppearance(); + } + // commit ColorConfig if (pColorConfig->IsModified()) pColorConfig->Commit(); + // commit LibreOfficeTheme, enable it if the current scheme is not Automatic + if (m_xSchemeList->get_value_changed_from_saved()) + { + bool bIsLibreOfficeThemeEnabled = m_xSchemeList->get_active_id() != AUTOMATIC_COLOR_SCHEME; + auto pChange(comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Appearance::LibreOfficeTheme::set(bIsLibreOfficeThemeEnabled, + pChange); + pChange->commit(); + } + return true; } @@ -197,6 +209,11 @@ void SvxAppearanceTabPage::Reset(const SfxItemSet* /* rSet */) !officecfg::Office::Common::Appearance::ApplicationAppearance::isReadOnly()); m_xSchemeList->save_value(); + UpdateRemoveBtnState(); + + // reset appearance + eCurrentAppearanceMode = static_cast<Appearance>(MiscSettings::GetAppColorMode()); + // reset ColorConfig if (pColorConfig) { @@ -218,17 +235,17 @@ IMPL_LINK_NOARG(SvxAppearanceTabPage, ShowInDocumentHdl, weld::Toggleable&, void pColorConfig->SetColorValue(static_cast<ColorConfigEntry>(nEntry), aCurrentEntryColor); } -IMPL_LINK_NOARG(SvxAppearanceTabPage, EnableAppThemingHdl, weld::Toggleable&, void) +IMPL_LINK_NOARG(SvxAppearanceTabPage, AppearanceChangeHdl, weld::Toggleable&, void) { - ThemeColors::SetThemeState(m_xEnableAppTheming->get_active() ? ThemeState::ENABLED - : ThemeState::DISABLED); - m_bRestartRequired = true; -} + if (m_xAppearanceSystem->get_state() == TRISTATE_TRUE) + eCurrentAppearanceMode = Appearance::SYSTEM; + if (m_xAppearanceLight->get_state() == TRISTATE_TRUE) + eCurrentAppearanceMode = Appearance::LIGHT; + if (m_xAppearanceDark->get_state() == TRISTATE_TRUE) + eCurrentAppearanceMode = Appearance::DARK; + // set the extension theme on light/dark -IMPL_LINK_NOARG(SvxAppearanceTabPage, UseOnlyWhiteDocBackgroundHdl, weld::Toggleable&, void) -{ - ThemeColors::SetUseOnlyWhiteDocBackground(m_xUseOnlyWhiteDocBackground->get_active()); - m_bRestartRequired = true; + UpdateColorDropdown(); } IMPL_LINK_NOARG(SvxAppearanceTabPage, ColorEntryChgHdl, weld::ComboBox&, void) @@ -310,42 +327,16 @@ IMPL_LINK_NOARG(SvxAppearanceTabPage, ColorValueChgHdl, ColorListBox&, void) IMPL_LINK_NOARG(SvxAppearanceTabPage, SchemeChangeHdl, weld::ComboBox&, void) { - AppearanceMode eMode; - OUString sNewScheme; - - if (ThemeColors::IsAutomaticTheme(m_xSchemeList->get_active_id())) - { - sNewScheme = AUTOMATIC_COLOR_SCHEME; - eMode = AppearanceMode::AUTO; - } - else if (ThemeColors::IsLightTheme(m_xSchemeList->get_active_id())) - { - sNewScheme = LIGHT_COLOR_SCHEME; - eMode = AppearanceMode::LIGHT; - } - else if (ThemeColors::IsDarkTheme(m_xSchemeList->get_active_id())) - { - sNewScheme = DARK_COLOR_SCHEME; - eMode = AppearanceMode::DARK; - } + if (m_xSchemeList->get_active_id() == AUTOMATIC_COLOR_SCHEME) + pColorConfig->LoadScheme(AUTOMATIC_COLOR_SCHEME); else - { - sNewScheme = m_xSchemeList->get_active_text(); - // for custom theme, keep appearance to AUTO, doesn't matter for the most part, - // but if some colors like document colors are not specified, then they will be - // set as per the OS appearance mode - eMode = AppearanceMode::AUTO; - } - - // NOTE: LoadScheme must be called after updating the AppearanceMode as LoadScheme calls Lode - // which loads colors based on the current application appearance. - MiscSettings::SetAppColorMode(eMode); - pColorConfig->LoadScheme(sNewScheme); + pColorConfig->LoadScheme(m_xSchemeList->get_active_text()); - if (m_xSchemeList->get_value_changed_from_saved() && !ThemeColors::IsThemeDisabled()) + if (m_xSchemeList->get_value_changed_from_saved()) m_bRestartRequired = true; - UpdateColorDropdown(); + UpdateControlsState(); + UpdateRemoveBtnState(); } IMPL_LINK_NOARG(SvxAppearanceTabPage, SchemeListToggleHdl, weld::ComboBox&, void) @@ -353,6 +344,12 @@ IMPL_LINK_NOARG(SvxAppearanceTabPage, SchemeListToggleHdl, weld::ComboBox&, void LoadSchemeList(); } +IMPL_LINK(SvxAppearanceTabPage, CheckNameHdl_Impl, AbstractSvxNameDialog&, rDialog, bool) +{ + OUString sName = rDialog.GetName(); + return !sName.isEmpty() && m_xSchemeList->find_text(sName) == -1; +} + IMPL_STATIC_LINK_NOARG(SvxAppearanceTabPage, MoreThemesHdl, weld::Button&, void) { css::uno::Sequence<css::beans::PropertyValue> aArgs{ comphelper::makePropertyValue( @@ -360,6 +357,58 @@ IMPL_STATIC_LINK_NOARG(SvxAppearanceTabPage, MoreThemesHdl, weld::Button&, void) comphelper::dispatchCommand(u".uno:AdditionsDialog"_ustr, aArgs); } +IMPL_LINK(SvxAppearanceTabPage, AddRemoveSchemeHdl, weld::Button&, rButton, void) +{ + if (m_xAddSchemeBtn.get() == &rButton) + { + OUString sName; + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + ScopedVclPtr<AbstractSvxNameDialog> aNameDlg(pFact->CreateSvxNameDialog( + GetFrameWeld(), sName, CuiResId(RID_CUISTR_COLOR_CONFIG_SAVE2))); + aNameDlg->SetCheckNameHdl(LINK(this, SvxAppearanceTabPage, CheckNameHdl_Impl)); + aNameDlg->SetText(CuiResId(RID_CUISTR_COLOR_CONFIG_SAVE1)); + aNameDlg->SetHelpId(HID_OPTIONS_COLORCONFIG_SAVE_SCHEME); + aNameDlg->SetCheckNameHdl(LINK(this, SvxAppearanceTabPage, CheckNameHdl_Impl)); + if (RET_OK == aNameDlg->Execute()) + { + sName = aNameDlg->GetName(); + pColorConfig->AddScheme(sName); + m_xSchemeList->append_text(sName); + m_xSchemeList->set_active_text(sName); + SchemeChangeHdl(*m_xSchemeList); + + ColorConfigValue aValue; + aValue.nDarkColor = COL_AUTO; + aValue.nLightColor = COL_AUTO; + + for (size_t i = 0; i < WINDOWCOLOR; ++i) + pColorConfig->SetColorValue(static_cast<ColorConfigEntry>(i), aValue); + } + } + else + { + DBG_ASSERT(m_xSchemeList->get_count() > 1, "don't delete the last scheme"); + std::unique_ptr<weld::MessageDialog> xQuery(Application::CreateMessageDialog( + GetFrameWeld(), VclMessageType::Question, VclButtonsType::YesNo, + CuiResId(RID_CUISTR_COLOR_CONFIG_DELETE))); + xQuery->set_title(CuiResId(RID_CUISTR_COLOR_CONFIG_DELETE_TITLE)); + + if (RET_YES == xQuery->run()) + { + OUString sDeleteScheme(m_xSchemeList->get_active_text()); + m_xSchemeList->remove(m_xSchemeList->get_active()); + m_xSchemeList->set_active(0); + SchemeChangeHdl(*m_xSchemeList); + //first select the new scheme and then delete the old one + pColorConfig->DeleteScheme(sDeleteScheme); + } + } + + // disable remove button if only one scheme available + // or if the selected theme is AUTOMATIC_COLOR_SCHEME + UpdateRemoveBtnState(); +} + IMPL_LINK_NOARG(SvxAppearanceTabPage, ColorImageToggleHdl, weld::Toggleable&, void) { // get the active entry @@ -400,28 +449,6 @@ IMPL_LINK_NOARG(SvxAppearanceTabPage, BitmapChangeHdl, weld::ComboBox&, void) m_bRestartRequired = true; } -IMPL_LINK_NOARG(SvxAppearanceTabPage, ResetAllBtnHdl, weld::Button&, void) -{ - // load default document colors - ColorConfigValue aValue; - for (size_t i = 0; i < ColorConfigEntryCount; ++i) - { - aValue.nDarkColor = COL_AUTO; - aValue.nLightColor = COL_AUTO; - pColorConfig->SetColorValue(static_cast<ColorConfigEntry>(i), aValue); - } - pColorConfig->Commit(); - - // RESET state for themes just prevents the theme colors from being used before - // they are realoaded from the StyleSettings, please read the comment above - // ColorConfig::SetupTheme()'s definition - if (!ThemeColors::IsThemeDisabled()) - { - ThemeColors::ResetTheme(); - m_bRestartRequired = true; - } -} - void SvxAppearanceTabPage::InitThemes() { // init schemes combobox @@ -429,14 +456,34 @@ void SvxAppearanceTabPage::InitThemes() m_xSchemeList->connect_changed(LINK(this, SvxAppearanceTabPage, SchemeChangeHdl)); m_xSchemeList->connect_popup_toggled(LINK(this, SvxAppearanceTabPage, SchemeListToggleHdl)); + m_xAddSchemeBtn->connect_clicked(LINK(this, SvxAppearanceTabPage, AddRemoveSchemeHdl)); m_xMoreThemesBtn->connect_clicked(LINK(this, SvxAppearanceTabPage, MoreThemesHdl)); + m_xRemoveSchemeBtn->connect_clicked(LINK(this, SvxAppearanceTabPage, AddRemoveSchemeHdl)); + + UpdateRemoveBtnState(); +} - m_xEnableAppTheming->connect_toggled(LINK(this, SvxAppearanceTabPage, EnableAppThemingHdl)); - m_xEnableAppTheming->set_active(ThemeColors::IsThemeEnabled()); +void SvxAppearanceTabPage::InitAppearance() +{ + m_xAppearanceSystem->connect_toggled(LINK(this, SvxAppearanceTabPage, AppearanceChangeHdl)); + m_xAppearanceDark->connect_toggled(LINK(this, SvxAppearanceTabPage, AppearanceChangeHdl)); - m_xUseOnlyWhiteDocBackground->connect_toggled( - LINK(this, SvxAppearanceTabPage, UseOnlyWhiteDocBackgroundHdl)); - m_xUseOnlyWhiteDocBackground->set_active(ThemeColors::UseOnlyWhiteDocBackground()); + Appearance nAppearance = static_cast<Appearance>(MiscSettings::GetAppColorMode()); + switch (nAppearance) + { + case Appearance::SYSTEM: + m_xAppearanceSystem->set_state(TRISTATE_TRUE); + eCurrentAppearanceMode = Appearance::SYSTEM; + break; + case Appearance::LIGHT: + m_xAppearanceLight->set_state(TRISTATE_TRUE); + eCurrentAppearanceMode = Appearance::LIGHT; + break; + case Appearance::DARK: + m_xAppearanceDark->set_state(TRISTATE_TRUE); + eCurrentAppearanceMode = Appearance::DARK; + break; + } } void SvxAppearanceTabPage::InitCustomization() @@ -445,7 +492,6 @@ void SvxAppearanceTabPage::InitCustomization() m_xColorChangeBtn->SetSelectHdl(LINK(this, SvxAppearanceTabPage, ColorValueChgHdl)); m_xShowInDocumentChkBtn->connect_toggled(LINK(this, SvxAppearanceTabPage, ShowInDocumentHdl)); m_xBitmapDropDownBtn->connect_changed(LINK(this, SvxAppearanceTabPage, BitmapChangeHdl)); - m_xResetAllBtn->connect_clicked(LINK(this, SvxAppearanceTabPage, ResetAllBtnHdl)); m_xColorRadioBtn->connect_toggled(LINK(this, SvxAppearanceTabPage, ColorImageToggleHdl)); m_xStretchedRadioBtn->connect_toggled( @@ -470,6 +516,14 @@ void SvxAppearanceTabPage::InitCustomization() EnableImageControls(false); } +// disable remove if only one scheme available or if the selected theme is AUTOMATIC_COLOR_SCHEME +void SvxAppearanceTabPage::UpdateRemoveBtnState() +{ + bool bEnableRemoveButton = (m_xSchemeList->get_count() > 1) + && (m_xSchemeList->get_active_id() != AUTOMATIC_COLOR_SCHEME); + m_xRemoveSchemeBtn->set_sensitive(bEnableRemoveButton); +} + void SvxAppearanceTabPage::EnableImageControls(bool bEnabled) { m_xImageRadioBtn->set_sensitive(bEnabled); @@ -480,6 +534,24 @@ void SvxAppearanceTabPage::EnableImageControls(bool bEnabled) void SvxAppearanceTabPage::UpdateColorDropdown() { + switch (eCurrentAppearanceMode) + { + case Appearance::LIGHT: + m_xColorLbl->set_label(CuiResId(LIGHT_COLOR_LBL)); + break; + case Appearance::DARK: + m_xColorLbl->set_label(CuiResId(DARK_COLOR_LBL)); + break; + case Appearance::SYSTEM: + { + if (IsDarkModeEnabled()) + m_xColorLbl->set_label(CuiResId(DARK_COLOR_LBL)); + else + m_xColorLbl->set_label(CuiResId(LIGHT_COLOR_LBL)); + } + break; + } + // update color to light/dark size_t nEntry = GetActiveEntry(); const ColorConfigValue& rCurrentEntryColor @@ -495,6 +567,32 @@ void SvxAppearanceTabPage::UpdateColorDropdown() m_xColorChangeBtn->SelectEntry(rCurrentEntryColor.nLightColor); } +// if the user changes appearance options for automatic theme, then follow the old behaviour +// and change the document colors to light/dark based on the choice. +void SvxAppearanceTabPage::UpdateOldAppearance() +{ + if (pColorConfig->GetCurrentSchemeName() != AUTOMATIC_COLOR_SCHEME) + return; + + ColorConfigValue aValue; + bool bIsDarkModeEnabled = IsDarkModeEnabled(); + for (size_t i = 0; i < WINDOWCOLOR; ++i) + { + if (bIsDarkModeEnabled) + aValue.nDarkColor = ColorConfig::GetDefaultColor(static_cast<ColorConfigEntry>(i), 1); + else + aValue.nLightColor = ColorConfig::GetDefaultColor(static_cast<ColorConfigEntry>(i), 0); + + pColorConfig->SetColorValue(static_cast<ColorConfigEntry>(i), aValue); + } +} + +bool SvxAppearanceTabPage::IsDarkModeEnabled() +{ + return eCurrentAppearanceMode == Appearance::DARK + || (eCurrentAppearanceMode == Appearance::SYSTEM && MiscSettings::GetUseDarkMode()); +} + void SvxAppearanceTabPage::FillItemsList() { static const std::map<ColorConfigEntry, OUString> aRegistryEntries @@ -630,11 +728,9 @@ void SvxAppearanceTabPage::FillItemsList() aRegistryEntries.at(static_cast<ColorConfigEntry>(i))); m_xColorEntryBtn->append_separator("SeparatorID"); - // don't show UI customization options if theme is disabled - if (!ThemeColors::IsThemeDisabled()) - for (size_t i = WINDOWCOLOR; i <= INACTIVEBORDERCOLOR; ++i) - m_xColorEntryBtn->append(OUString(cNames[i].cName), - aRegistryEntries.at(static_cast<ColorConfigEntry>(i))); + for (size_t i = WINDOWCOLOR; i <= INACTIVEBORDERCOLOR; ++i) + m_xColorEntryBtn->append(OUString(cNames[i].cName), + aRegistryEntries.at(static_cast<ColorConfigEntry>(i))); } size_t SvxAppearanceTabPage::GetActiveEntry() diff --git a/cui/source/options/appearance.hxx b/cui/source/options/appearance.hxx index d131a07e63b5..7675d54e3bc4 100644 --- a/cui/source/options/appearance.hxx +++ b/cui/source/options/appearance.hxx @@ -33,17 +33,28 @@ using namespace svtools; class SvxAppearanceTabPage : public SfxTabPage { private: + enum class Appearance + { + SYSTEM, + LIGHT, + DARK, + }; + bool m_bRestartRequired; + Appearance eCurrentAppearanceMode; std::unique_ptr<EditableColorConfig> pColorConfig; std::unique_ptr<weld::ComboBox> m_xSchemeList; std::unique_ptr<weld::Button> m_xMoreThemesBtn; - std::unique_ptr<weld::CheckButton> m_xEnableAppTheming; - std::unique_ptr<weld::CheckButton> m_xUseOnlyWhiteDocBackground; + std::unique_ptr<weld::Button> m_xAddSchemeBtn; + std::unique_ptr<weld::Button> m_xRemoveSchemeBtn; + std::unique_ptr<weld::RadioButton> m_xAppearanceSystem; + std::unique_ptr<weld::RadioButton> m_xAppearanceLight; + std::unique_ptr<weld::RadioButton> m_xAppearanceDark; std::unique_ptr<weld::ComboBox> m_xColorEntryBtn; std::unique_ptr<ColorListBox> m_xColorChangeBtn; + std::unique_ptr<weld::Label> m_xColorLbl; std::unique_ptr<weld::CheckButton> m_xShowInDocumentChkBtn; - std::unique_ptr<weld::Button> m_xResetAllBtn; std::unique_ptr<weld::RadioButton> m_xColorRadioBtn; std::unique_ptr<weld::RadioButton> m_xImageRadioBtn; @@ -52,26 +63,30 @@ private: std::unique_ptr<weld::ComboBox> m_xBitmapDropDownBtn; + DECL_LINK(AppearanceChangeHdl, weld::Toggleable&, void); DECL_LINK(ColorEntryChgHdl, weld::ComboBox&, void); DECL_LINK(ColorValueChgHdl, ColorListBox&, void); DECL_LINK(ShowInDocumentHdl, weld::Toggleable&, void); - DECL_LINK(EnableAppThemingHdl, weld::Toggleable&, void); - DECL_LINK(UseOnlyWhiteDocBackgroundHdl, weld::Toggleable&, void); DECL_LINK(SchemeChangeHdl, weld::ComboBox&, void); DECL_LINK(SchemeListToggleHdl, weld::ComboBox&, void); DECL_STATIC_LINK(SvxAppearanceTabPage, MoreThemesHdl, weld::Button&, void); + DECL_LINK(AddRemoveSchemeHdl, weld::Button&, void); + DECL_LINK(CheckNameHdl_Impl, AbstractSvxNameDialog&, bool); DECL_LINK(ColorImageToggleHdl, weld::Toggleable&, void); DECL_LINK(StretchedTiledToggleHdl, weld::Toggleable&, void); DECL_LINK(BitmapChangeHdl, weld::ComboBox&, void); - DECL_LINK(ResetAllBtnHdl, weld::Button&, void); void InitThemes(); + void InitAppearance(); void InitCustomization(); void UpdateControlsState(); void LoadSchemeList(); + void UpdateRemoveBtnState(); void EnableImageControls(bool bEnabled); void UpdateColorDropdown(); + void UpdateOldAppearance(); + bool IsDarkModeEnabled(); void FillItemsList(); size_t GetActiveEntry(); diff --git a/cui/uiconfig/ui/appearance.ui b/cui/uiconfig/ui/appearance.ui index 09b1eb1d038d..d270b0e862f1 100644 --- a/cui/uiconfig/ui/appearance.ui +++ b/cui/uiconfig/ui/appearance.ui @@ -10,22 +10,18 @@ <object class="GtkBox" id="AppearanceTabPage"> <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="margin-top">6</property> - <property name="margin-bottom">6</property> <property name="border-width">6</property> - <property name="spacing">24</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> <child> <object class="GtkBox"> <property name="visible">True</property> <property name="can-focus">False</property> - <property name="orientation">vertical</property> - <property name="spacing">6</property> <child> <object class="GtkFrame" id="libreofficethemes"> <property name="visible">True</property> <property name="can-focus">False</property> + <property name="margin-end">12</property> <property name="label-xalign">0</property> <property name="shadow-type">none</property> <child> @@ -35,12 +31,10 @@ <property name="margin-start">12</property> <property name="margin-top">6</property> <property name="orientation">vertical</property> - <property name="spacing">3</property> <child> <object class="GtkBox"> <property name="visible">True</property> <property name="can-focus">False</property> - <property name="halign">start</property> <property name="spacing">3</property> <child> <object class="GtkComboBoxText" id="scheme"> @@ -76,41 +70,44 @@ </packing> </child> <child> - <object class="GtkCheckButton" id="enableapptheming"> - <property name="label" translatable="yes" context="appearance|enableapptheming">Enable application theming</property> + <object class="GtkButtonBox"> <property name="visible">True</property> - <property name="can-focus">True</property> - <property name="receives-default">False</property> - <property name="draw-indicator">True</property> - <child internal-child="accessible"> - <object class="AtkObject" id="enableapptheming-atkobject"> - <property name="AtkObject::accessible-description" translatable="yes" context="appearance|extended_tip|enableapptheming">Check to enable application theming with extension themes.</property> + <property name="can-focus">False</property> + <property name="margin-top">12</property> + <property name="layout-style">spread</property> + <child> + <object class="GtkButton" id="newschemebtn"> + <property name="label" translatable="yes" context="appearancetabpage|newschemebtn">New</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="margin-end">3</property> </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="useonlywhitedocbackground"> - <property name="label" translatable="yes" context="appearance|enableapptheming">Use white document background</property> - <property name="visible">True</property> - <property name="can-focus">True</property> - <property name="receives-default">False</property> - <property name="draw-indicator">True</property> - <child internal-child="accessible"> - <object class="AtkObject" id="useonlywhitedocbackground-atkobject"> - <property name="AtkObject::accessible-description" translatable="yes" context="appearance|extended_tip|useonlywhitedocbackground">Check to disable document color customizations and only use white document colors.</property> + <child> + <object class="GtkButton" id="removeschemebtn"> + <property name="label" translatable="yes" context="appearancetabpage|removeschemebtn">Remove</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="margin-start">3</property> </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> </child> </object> <packing> <property name="expand">False</property> <property name="fill">True</property> - <property name="position">2</property> + <property name="position">1</property> </packing> </child> </object> @@ -119,7 +116,8 @@ <object class="GtkLabel" id="libreofficethemeslb"> <property name="visible">True</property> <property name="can-focus">False</property> - <property name="label" translatable="yes" context="appearancetabpage|libreofficethemeslb">%PRODUCTNAME Themes</property> + <property name="margin-bottom">6</property> + <property name="label" translatable="yes" context="appearancetabpage|libreofficethemeslb">LibreOffice Themes</property> <attributes> <attribute name="weight" value="bold"/> </attributes> @@ -133,35 +131,34 @@ </packing> </child> <child> - <object class="GtkFrame" id="items"> + <object class="GtkBox"> <property name="visible">True</property> <property name="can-focus">False</property> - <property name="label-xalign">0</property> - <property name="shadow-type">none</property> + <property name="orientation">vertical</property> <child> - <object class="GtkBox"> + <object class="GtkFrame" id="options"> <property name="visible">True</property> <property name="can-focus">False</property> <property name="margin-start">12</property> - <property name="margin-start">12</property> - <property name="margin-top">6</property> - <property name="orientation">vertical</property> - <property name="spacing">3</property> + <property name="margin-bottom">6</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> <child> - <!-- n-columns=2 n-rows=5 --> + <!-- n-columns=2 n-rows=1 --> <object class="GtkGrid"> <property name="visible">True</property> <property name="can-focus">False</property> - <property name="row-spacing">3</property> - <property name="column-spacing">6</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> <child> - <object class="GtkLabel" id="itemslb"> + <object class="GtkLabel" id="appearancelb"> <property name="visible">True</property> <property name="can-focus">False</property> - <property name="halign">start</property> - <property name="label" translatable="yes" context="appearancetabpage|items">Items: </property> + <property name="valign">start</property> + <property name="margin-end">6</property> + <property name="label" translatable="yes" context="appearancetabpage|appearancelb">Appearance:</property> <property name="use-underline">True</property> - <property name="mnemonic-widget">registrydropdown</property> + <property name="mnemonic-widget">system</property> </object> <packing> <property name="left-attach">0</property> @@ -169,16 +166,54 @@ </packing> </child> <child> - <object class="GtkComboBoxText" id="registrydropdown"> + <object class="GtkBox"> <property name="visible">True</property> <property name="can-focus">False</property> - <property name="halign">start</property> - <property name="hexpand">False</property> - <child internal-child="accessible"> - <object class="AtkObject" id="registrydropdown-atkobject"> - <property name="AtkObject::accessible-name" translatable="yes" context="appearancetabpage|registrycolorslist">registrycolorslist</property> - <property name="AtkObject::accessible-description" translatable="yes" context="appearance|extended_tip|registrydropdown">Select the item to customize color or render with an image.</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkRadioButton" id="system"> + <property name="label" translatable="yes" context="appearancetabpage|system">System</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="active">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="light"> + <property name="label" translatable="yes" context="appearancetabpage|light">Light</property> + <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="group">system</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="dark"> + <property name="label" translatable="yes" context="appearancetabpage|dark">Dark</property> + <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="group">system</property> </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> </child> </object> <packing> @@ -186,91 +221,156 @@ <property name="top-attach">0</property> </packing> </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="optionslb"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="appearancetabpage|optionslb">Options</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="items"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">12</property> + <property name="margin-top">6</property> + <property name="label-xalign">0</property> + <property name="shadow-type">none</property> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-start">13</property> + <property name="margin-top">6</property> + <property name="orientation">vertical</property> + <property name="spacing">3</property> <child> - <object class="GtkRadioButton" id="colorradiobtn"> - <property name="label" translatable="yes" context="appearancetabpage|colorradiobtn">Color:</property> + <!-- n-columns=2 n-rows=7 --> + <object class="GtkGrid"> <property name="visible">True</property> - <property name="can-focus">True</property> - <property name="receives-default">False</property> - <property name="halign">start</property> - <property name="draw-indicator">True</property> - <property name="group">imageradiobtn</property> - <child internal-child="accessible"> - <object class="AtkObject" id="colorradiobtn-atkobject"> - <property name="AtkObject::accessible-description" translatable="yes" context="appearance|extended_tip|colorradiobtn">Apply color to the item.</property> + <property name="can-focus">False</property> + <property name="row-spacing">3</property> + <property name="column-spacing">6</property> + <child> + <object class="GtkLabel" id="itemslb"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">start</property> + <property name="label" translatable="yes" context="appearancetabpage|items">Items: </property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">registrydropdown</property> </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + </packing> </child> - </object> - <packing> - <property name="left-attach">0</property> - <property name="top-attach">1</property> - </packing> - </child> - <child> - <object class="GtkMenuButton" id="colorsdropdownbtn"> - <property name="visible">True</property> - <property name="can-focus">True</property> - <property name="focus-on-click">False</property> - <property name="receives-default">True</property> - <property name="halign">start</property> - <property name="draw-indicator">True</property> <child> - <placeholder/> + <object class="GtkComboBoxText" id="registrydropdown"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">start</property> + <property name="hexpand">False</property> + <child internal-child="accessible"> + <object class="AtkObject" id="registrydropdown-atkobject"> + <property name="AtkObject::accessible-name" translatable="yes" context="appearancetabpage|registrycolorslist">registrycolorslist</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">0</property> + </packing> </child> - <child internal-child="accessible"> - <object class="AtkObject" id="colorsdropdownbtn-atkobject"> - <property name="AtkObject::accessible-description" translatable="yes" context="appearance|extended_tip|colorsdropdownbtn">Select the color of the item.</property> + <child> + <object class="GtkRadioButton" id="colorradiobtn"> + <property name="label" translatable="yes" context="appearancetabpage|colorradiobtn">Color:</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="halign">start</property> + <property name="active">True</property> + <property name="draw-indicator">True</property> + <property name="group">imageradiobtn</property> </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> </child> - </object> - <packing> - <property name="left-attach">1</property> - <property name="top-attach">1</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="showindocumentchkbtn"> - <property name="label" translatable="yes" context="appearancetabpage|showindocumentchkbtn">Show in Document</property> - <property name="visible">True</property> - <property name="can-focus">True</property> - <property name="receives-default">False</property> - <property name="draw-indicator">True</property> - <child internal-child="accessible"> - <object class="AtkObject" id="showindocumentchkbtn-atkobject"> - <property name="AtkObject::accessible-description" translatable="yes" context="appearance|extended_tip|showindocumentchkbtn">Immediately display the color choice in the document.</property> + <child> + <object class="GtkLabel" id="colorlbl"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">start</property> + <property name="margin-start">18</property> + <property name="label" translatable="no" context="appearancetabpage|colorlbl">colorlbl</property> + <property name="use-underline">True</property> + <property name="mnemonic-widget">colorsdropdownbtn</property> </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> </child> - </object> - <packing> - <property name="left-attach">1</property> - <property name="top-attach">2</property> - </packing> - </child> - <child> - <object class="GtkRadioButton" id="imageradiobtn"> - <property name="label" translatable="yes" context="appearancetabpage|imageradiobtn">Image:</property> - <property name="visible">True</property> - <property name="can-focus">True</property> - <property name="receives-default">False</property> - <property name="active">True</property> - <property name="draw-indicator">True</property> - <child internal-child="accessible"> - <object class="AtkObject" id="imageradiobtn-atkobject"> - <property name="AtkObject::accessible-description" translatable="yes" context="appearance|extended_tip|imageradiobtn">Apply an image to the item</property> + <child> + <object class="GtkMenuButton" id="colorsdropdownbtn"> + <property name="label" translatable="no" context="appearancetabpage|colorsdropdownbtn"></property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="focus-on-click">False</property> + <property name="receives-default">True</property> + <property name="halign">start</property> + <property name="draw-indicator">True</property> + <property name="label" translatable="no"></property> + <child> + <placeholder/> + </child> </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="showindocumentchkbtn"> + <property name="label" translatable="yes" context="appearancetabpage|showindocumentchkbtn">Show in Document</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">3</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="imageradiobtn"> + <property name="label" translatable="yes" context="appearancetabpage|imageradiobtn">Image:</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="active">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">4</property> + </packing> </child> - </object> - <packing> - <property name="left-attach">0</property> - <property name="top-attach">3</property> - </packing> - </child> - <child> - <object class="GtkBox"> - <property name="visible">True</property> - <property name="can-focus">False</property> - <property name="halign">start</property> - <property name="spacing">3</property> <child> <object class="GtkComboBoxText" id="bitmapdropdown"> <property name="visible">True</property> @@ -279,21 +379,18 @@ <child internal-child="accessible"> <object class="AtkObject" id="bitmapdropdown-atkobject"> <property name="AtkObject::accessible-name" translatable="yes" context="appearancetabpage|bitmapdropdown">bitmapdropdown</property> - <property name="AtkObject::accessible-description" translatable="yes" context="appearance|extended_tip|bitmapdropdown">Select the image for the item, if supported.</property> </object> </child> </object> <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> + <property name="left-attach">1</property> + <property name="top-attach">5</property> </packing> </child> <child> <object class="GtkBox"> <property name="visible">True</property> <property name="can-focus">False</property> - <property name="spacing">3</property> <child> <object class="GtkRadioButton" id="stretchedradiobtn"> <property name="label" translatable="yes" context="appearancetabpage|stretchedradiobtn">Stretched</property> @@ -302,11 +399,6 @@ <property name="receives-default">False</property> <property name="draw-indicator">True</property> <property name="group">tiledradiobtn</property> - <child internal-child="accessible"> - <object class="AtkObject" id="stretchedradiobtn-atkobject"> - <property name="AtkObject::accessible-description" translatable="yes" context="appearance|extended_tip|stretchedradiobtn">Stretches the image to fill the area of the item.</property> - </object> - </child> </object> <packing> <property name="expand">False</property> @@ -322,11 +414,6 @@ <property name="receives-default">False</property> <property name="active">True</property> <property name="draw-indicator">True</property> - <child internal-child="accessible"> - <object class="AtkObject" id="tiledradiobtn-atkobject"> - <property name="AtkObject::accessible-description" translatable="yes" context="appearance|extended_tip|tiledradiobtn">Tiles the image to fill the area of the item.</property> - </object> - </child> </object> <packing> <property name="expand">False</property> @@ -336,53 +423,50 @@ </child> </object> <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> + <property name="left-attach">1</property> + <property name="top-attach">6</property> </packing> </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> </object> <packing> - <property name="left-attach">1</property> - <property name="top-attach">3</property> - </packing> - </child> - <child> - <object class="GtkButton" id="resetallbtn"> - <property name="label" translatable="yes" context="appearancetabpage|resetallbtn">Reset All</property> - <property name="visible">True</property> - <property name="can-focus">True</property> - <property name="receives-default">True</property> - </object> - <packing> - <property name="left-attach">0</property> - <property name="top-attach">4</property> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> </packing> </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> + </child> + <child type="label"> + <object class="GtkLabel" id="customizationslb"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="appearancetabpage|customizationslb">Customizations</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> </child> </object> - </child> - <child type="label"> - <object class="GtkLabel" id="customizationslb"> - <property name="visible">True</property> - <property name="can-focus">False</property> - <property name="label" translatable="yes" context="appearancetabpage|customizationslb">Customizations</property> - <attributes> - <attribute name="weight" value="bold"/> - </attributes> - </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> </child> </object> <packing> diff --git a/include/svtools/colorcfg.hxx b/include/svtools/colorcfg.hxx index 43698ff529f6..40417e507a0c 100644 --- a/include/svtools/colorcfg.hxx +++ b/include/svtools/colorcfg.hxx @@ -131,8 +131,6 @@ enum ColorConfigEntry : int }; constexpr OUString AUTOMATIC_COLOR_SCHEME = u"COLOR_SCHEME_LIBREOFFICE_AUTOMATIC"_ustr; -constexpr OUString LIGHT_COLOR_SCHEME = u"COLOR_SCHEME_LIBREOFFICE_LIGHT"_ustr; -constexpr OUString DARK_COLOR_SCHEME = u"COLOR_SCHEME_LIBREOFFICE_DARK"_ustr; constexpr size_t THEME_APPLICATION_COLORS_COUNT = ColorConfigEntryCount - WINDOWCOLOR; namespace { diff --git a/include/vcl/settings.hxx b/include/vcl/settings.hxx index ec6249f7ffe7..4c4f77e31c50 100644 --- a/include/vcl/settings.hxx +++ b/include/vcl/settings.hxx @@ -23,7 +23,6 @@ #include <config_options.h> #include <vcl/dllapi.h> -#include <vcl/themecolors.hxx> #include <tools/color.hxx> #include <tools/gen.hxx> #include <o3tl/cow_wrapper.hxx> @@ -231,9 +230,6 @@ public: SAL_DLLPRIVATE void Set3DColors( const Color& rColor ); - void SetSystemColorsLoaded( bool bLoaded ); - bool GetSystemColorsLoaded() const; - void SetFaceColor( const Color& rColor ); const Color& GetFaceColor() const; @@ -258,7 +254,7 @@ public: const Color& GetDarkShadowColor() const; void SetDefaultButtonTextColor( const Color& rColor ); - const Color& GetDefaultButtonTextColor() const; + SAL_DLLPRIVATE const Color& GetDefaultButtonTextColor() const; void SetButtonTextColor( const Color& rColor ); const Color& GetButtonTextColor() const; @@ -390,7 +386,7 @@ public: const Color& GetMenuBarColor() const; void SetMenuBarRolloverColor( const Color& rColor ); - const Color& GetMenuBarRolloverColor() const; + SAL_DLLPRIVATE const Color& GetMenuBarRolloverColor() const; void SetMenuBorderColor( const Color& rColor ); const Color& GetMenuBorderColor() const; @@ -402,7 +398,7 @@ public: const Color& GetMenuBarTextColor() const; void SetMenuBarRolloverTextColor( const Color& rColor ); - const Color& GetMenuBarRolloverTextColor() const; + SAL_DLLPRIVATE const Color& GetMenuBarRolloverTextColor() const; void SetMenuBarHighlightTextColor( const Color& rColor ); const Color& GetMenuBarHighlightTextColor() const; @@ -673,13 +669,13 @@ public: bool GetDisablePrinting() const; void SetEnableLocalizedDecimalSep( bool bEnable ); bool GetEnableLocalizedDecimalSep() const; - - static void SetDarkMode(AppearanceMode nMode); - static AppearanceMode GetDarkMode(); + // 0 auto, 1 light, 2, dark + static void SetDarkMode(int nMode); + static int GetDarkMode(); // return if dark mode is active, resolving 'auto' to dark (true) or light (false) static bool GetUseDarkMode(); - static void SetAppColorMode(AppearanceMode nMode); - static AppearanceMode GetAppColorMode(); + static void SetAppColorMode(int nMode); + static int GetAppColorMode(); // return true if system preferences are set to use reduced animation static bool GetUseReducedAnimation(); static bool IsAnimatedGraphicAllowed(); diff --git a/include/vcl/themecolors.hxx b/include/vcl/themecolors.hxx index 9e04f40a5f54..80f56db5e0e4 100644 --- a/include/vcl/themecolors.hxx +++ b/include/vcl/themecolors.hxx @@ -11,79 +11,23 @@ #include <vcl/dllapi.h> #include <svtools/colorcfg.hxx> -/* ThemeState represents registry values for "LibreOfficeTheme" enumeration - * in officecfg/registry/schema/org/openoffice/Office/Common.xcs, which means - * that the associations here have a meaning. Please don't change it. */ -enum class ThemeState -{ - DISABLED = 0, - ENABLED = 1, - RESET = 2, -}; - -/* - AUTO app colors follow os, light doc colors (default) - LIGHT app colors follow os, light doc colors - DARK app colors follow os, dark doc colors - COUNT app color modes count -*/ -enum class AppearanceMode -{ - AUTO = 0, - LIGHT = 1, - DARK = 2, - COUNT, -}; - class VCL_DLLPUBLIC ThemeColors { ThemeColors() {} - static bool m_bIsThemeCached; + static bool m_bIsThemeLoaded; static ThemeColors m_aThemeColors; public: static ThemeColors& GetThemeColors() { return m_aThemeColors; } static void SetThemeColors(const ThemeColors& rThemeColors) { m_aThemeColors = rThemeColors; } - static bool IsThemeCached() { return m_bIsThemeCached; } - static void SetThemeCached(bool bCached) { m_bIsThemeCached = bCached; } + static bool IsThemeLoaded() { return m_bIsThemeLoaded; } + static void SetThemeLoaded(bool bLoaded) { m_bIsThemeLoaded = bLoaded; } static bool IsAutomaticTheme(std::u16string_view rThemeName) { return rThemeName == svtools::AUTOMATIC_COLOR_SCHEME; } - static bool IsLightTheme(std::u16string_view rThemeName) - { - return rThemeName == svtools::LIGHT_COLOR_SCHEME; - } - - static bool IsDarkTheme(std::u16string_view rThemeName) - { - return rThemeName == svtools::DARK_COLOR_SCHEME; - } - - static bool IsCustomTheme(std::u16string_view rThemeName) - { - return !IsAutomaticTheme(rThemeName) && !IsLightTheme(rThemeName) - && !IsDarkTheme(rThemeName); - } - - static ThemeState GetThemeState(); - static void SetThemeState(ThemeState eState); - - static bool IsThemeDisabled() { return GetThemeState() == ThemeState::DISABLED; }; - static bool IsThemeEnabled() { return GetThemeState() == ThemeState::ENABLED; }; - static bool IsThemeReset() { return GetThemeState() == ThemeState::RESET; } - static void ResetTheme() { SetThemeState(ThemeState::RESET); } - - static bool UseOnlyWhiteDocBackground(); - static void SetUseOnlyWhiteDocBackground(bool bFlag); - - // !IsThemeCached means that the ThemeColors object doesn't have the colors from the registry yet. - // IsThemeReset means that the user pressed the Reset All button and the UI colors in the registry - // are not valid anymore => read from the system again - static bool VclPluginCanUseThemeColors() { return IsThemeCached() && !IsThemeReset(); }; - void SetWindowColor(const Color& rColor) { m_aWindowColor = rColor; } void SetWindowTextColor(const Color& rColor) { m_aWindowTextColor = rColor; } void SetBaseColor(const Color& rColor) { m_aBaseColor = rColor; } diff --git a/officecfg/registry/data/org/openoffice/Office/UI.xcu b/officecfg/registry/data/org/openoffice/Office/UI.xcu index 808d77be34ee..4524acda923b 100644 --- a/officecfg/registry/data/org/openoffice/Office/UI.xcu +++ b/officecfg/registry/data/org/openoffice/Office/UI.xcu @@ -915,1552 +915,6 @@ </prop> </node> </node> - <node oor:name="COLOR_SCHEME_LIBREOFFICE_LIGHT" oor:op="replace"> - <!-- Group_General --> - <node oor:name="DocColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="DocBoundaries"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="AppBackground"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="BackgroundType"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Bitmap"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="TableBoundaries"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="FontColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="Links"> - <prop oor:name="IsVisible"> - <value>false</value> - </prop> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="LinksVisited"> - <prop oor:name="IsVisible"> - <value>false</value> - </prop> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="Spell"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="Grammar"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="SmartTags"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="Shadow"> - <prop oor:name="IsVisible"> - <value>true</value> - </prop> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="WriterTextGrid"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="WriterFieldShadings"> - <prop oor:name="IsVisible"> - <value>true</value> - </prop> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="WriterIdxShadings"> - <prop oor:name="IsVisible"> - <value>true</value> - </prop> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="WriterDirectCursor"> - <prop oor:name="IsVisible"> - <value>true</value> - </prop> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="WriterScriptIndicator"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="WriterSectionBoundaries"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="WriterHeaderFooterMark"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="WriterPageBreaks"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="WriterNonPrintChars"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="HTMLSGML"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="HTMLComment"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="HTMLKeyword"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="HTMLUnknown"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="CalcGrid"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="CalcCellFocus"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="CalcPageBreak"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="CalcPageBreakManual"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="CalcPageBreakAutomatic"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="CalcHiddenColRow"> - <prop oor:name="IsVisible"> - <value>false</value> - </prop> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="CalcTextOverflow"> - <prop oor:name="IsVisible"> - <value>true</value> - </prop> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="CalcComments"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="CalcDetective"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="CalcDetectiveError"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="CalcReference"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="CalcNotesBackground"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="CalcValue"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="CalcFormula"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="CalcText"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="CalcProtectedBackground"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="DrawGrid"> - <prop oor:name="IsVisible"> - <value>true</value> - </prop> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="Author1"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="Author2"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="Author3"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="Author4"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="Author5"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="Author6"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="Author7"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="Author8"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="Author9"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="BASICEditor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="BASICIdentifier"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="BASICComment"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="BASICNumber"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="BASICString"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="BASICOperator"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="BASICKeyword"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="BASICError"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="SQLIdentifier"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="SQLNumber"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="SQLString"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="SQLOperator"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="SQLKeyword"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="SQLParameter"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="SQLComment"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <!-- Group Application --> - <node oor:name="WindowColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="WindowTextColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="BaseColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="ButtonColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="ButtonTextColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="AccentColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="DisabledColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="DisabledTextColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="ShadowColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="SeparatorColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="FaceColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="ActiveColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="ActiveTextColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="ActiveBorderColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="FieldColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="MenuBarColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="MenuBarTextColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="MenuBarHighlightColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="MenuBarHighlightTextColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="MenuColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="MenuTextColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="MenuHighlightColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="MenuHighlightTextColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="MenuBorderColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="InactiveColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="InactiveTextColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="InactiveBorderColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - </node> - <node oor:name="COLOR_SCHEME_LIBREOFFICE_DARK" oor:op="replace"> - <!-- Group_General --> - <node oor:name="DocColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="DocBoundaries"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="AppBackground"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="BackgroundType"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Bitmap"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="TableBoundaries"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="FontColor"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="Links"> - <prop oor:name="IsVisible"> - <value>false</value> - </prop> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="LinksVisited"> - <prop oor:name="IsVisible"> - <value>false</value> - </prop> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="Spell"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="Grammar"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="SmartTags"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="Shadow"> - <prop oor:name="IsVisible"> - <value>true</value> - </prop> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="WriterTextGrid"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="WriterFieldShadings"> - <prop oor:name="IsVisible"> - <value>true</value> - </prop> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="WriterIdxShadings"> - <prop oor:name="IsVisible"> - <value>true</value> - </prop> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="WriterDirectCursor"> - <prop oor:name="IsVisible"> - <value>true</value> - </prop> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="WriterScriptIndicator"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="WriterSectionBoundaries"> - <prop oor:name="Light"> - <value xsi:nil="true"/> - </prop> - <prop oor:name="Dark"> - <value xsi:nil="true"/> - </prop> - </node> - <node oor:name="WriterHeaderFooterMark"> - <prop oor:name="Light"> -e ... etc. - the rest is truncated
