diff options
author | Heiko Tietze <tietze.heiko@gmail.com> | 2020-08-02 17:10:00 +0200 |
---|---|---|
committer | Heiko Tietze <heiko.tietze@documentfoundation.org> | 2020-10-07 18:02:06 +0200 |
commit | ed8df0ec6ed1af600a4d31223d5bfc3f65c5d7ba (patch) | |
tree | 8ea2a707ad62fd23a32b5f25c2b955964fb4d29c /cui | |
parent | 0c9ccc7dbf6deb4d012e0d1e6eb934e54e0f19bc (diff) |
Resolves tdf#117463 - Dialog to show UI options
* New dialog to pick and apply one of the UI variants
* Tip-of-the-Day enhanced to execute UNO commands in order
to advertise the UI chooser on first start
Change-Id: I5e5c4a8e0fb11d11bafc99cc37b7ec244a993781
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/99957
Tested-by: Jenkins
Reviewed-by: Heiko Tietze <heiko.tietze@documentfoundation.org>
Diffstat (limited to 'cui')
-rw-r--r-- | cui/Library_cui.mk | 1 | ||||
-rw-r--r-- | cui/UIConfig_cui.mk | 1 | ||||
-rw-r--r-- | cui/inc/strings.hrc | 2 | ||||
-rw-r--r-- | cui/inc/tipoftheday.hrc | 3 | ||||
-rw-r--r-- | cui/inc/toolbarmode.hrc | 37 | ||||
-rw-r--r-- | cui/source/dialogs/tipofthedaydlg.cxx | 31 | ||||
-rw-r--r-- | cui/source/dialogs/toolbarmodedlg.cxx | 214 | ||||
-rw-r--r-- | cui/source/factory/dlgfact.cxx | 8 | ||||
-rw-r--r-- | cui/source/factory/dlgfact.hxx | 2 | ||||
-rw-r--r-- | cui/source/inc/toolbarmodedlg.hxx | 33 | ||||
-rw-r--r-- | cui/uiconfig/ui/toolbarmodedialog.ui | 381 |
11 files changed, 707 insertions, 6 deletions
diff --git a/cui/Library_cui.mk b/cui/Library_cui.mk index ec2d222a34d9..1d1f0feb9ea8 100644 --- a/cui/Library_cui.mk +++ b/cui/Library_cui.mk @@ -147,6 +147,7 @@ $(eval $(call gb_Library_add_exception_objects,cui,\ cui/source/dialogs/splitcelldlg \ cui/source/dialogs/srchxtra \ cui/source/dialogs/thesdlg \ + cui/source/dialogs/toolbarmodedlg \ cui/source/dialogs/zoom \ cui/source/factory/cuiexp \ cui/source/factory/cuiresmgr \ diff --git a/cui/UIConfig_cui.mk b/cui/UIConfig_cui.mk index a6dcd3bfb88f..153d6fe98fda 100644 --- a/cui/UIConfig_cui.mk +++ b/cui/UIConfig_cui.mk @@ -203,6 +203,7 @@ $(eval $(call gb_UIConfig_add_uifiles,cui,\ cui/uiconfig/ui/textdialog \ cui/uiconfig/ui/textflowpage \ cui/uiconfig/ui/thesaurus \ + cui/uiconfig/ui/toolbarmodedialog \ cui/uiconfig/ui/transparencytabpage \ cui/uiconfig/ui/tsaurldialog \ cui/uiconfig/ui/twolinespage \ diff --git a/cui/inc/strings.hrc b/cui/inc/strings.hrc index fb43379f1d8b..e96e76e85fd2 100644 --- a/cui/inc/strings.hrc +++ b/cui/inc/strings.hrc @@ -400,4 +400,6 @@ #define RID_SVXSTR_ADDITIONS_LOADING NC_("RID_SVXSTR_ADDITIONS_LOADING", "Loading...") #define RID_SVXSTR_ADDITIONS_DIALOG_TITLE_PREFIX NC_("RID_SVXSTR_ADDITIONS_DIALOG_TITLE_PREFIX", "Extensions") +#define RID_SVXSTR_UI_APPLYALL NC_("RID_SVXSTR_UI_APPLYALL", "Apply to %MODULE") + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/cui/inc/tipoftheday.hrc b/cui/inc/tipoftheday.hrc index 74de677d2b32..f464a1f3d936 100644 --- a/cui/inc/tipoftheday.hrc +++ b/cui/inc/tipoftheday.hrc @@ -44,6 +44,7 @@ const std::tuple<const char*, OUString, OUString> TIPOFTHEDAY_STRINGARRAY[] = { + { NC_("RID_CUI_TIPOFTHEDAY", "%PRODUCTNAME offers a variety of user interface options to make you feel at home"), ".uno:ToolbarModeUI", "toolbarmode.png"}, { NC_("RID_CUI_TIPOFTHEDAY", "Need to allow changes to parts of a read-only document in Writer? Insert frames or sections that can authorize changes."), "https://help.libreoffice.org/%PRODUCTVERSION/%LANGUAGENAME/text/swriter/guide/section_edit.html", "tipoftheday_w.png"}, //local help missing { NC_("RID_CUI_TIPOFTHEDAY", "To print the notes of your slides go to File ▸ Print ▸ Impress tab and select Notes under Document ▸ Type."), "", "tipoftheday_i.png"}, { NC_("RID_CUI_TIPOFTHEDAY", "To start temporarily with a fresh user profile, or to restore a non-working %PRODUCTNAME, use Help ▸ Restart in Safe Mode."), "svx/ui/safemodedialog/SafeModeDialog", ""}, //https://help.libreoffice.org/%PRODUCTVERSION/%LANGUAGENAME/text/shared/01/profile_safe_mode.html @@ -270,6 +271,8 @@ const std::tuple<const char*, OUString, OUString> TIPOFTHEDAY_STRINGARRAY[] = #define STR_HELP_LINK NC_("STR_HELP_LINK", "%PRODUCTNAME Help") #define STR_MORE_LINK NC_("STR_MORE_LINK", "More info") +#define STR_UNO_LINK NC_("STR_UNO_LINK", "Run this action now...") +#define STR_UNO_EXECUTE NC_("STR_UNO_EXECUTE", "Execute the command %COMMAND") //tooltip for STR_UNO_LINK #define STR_TITLE NC_("STR_TITLE", "Tip of the Day") #define STR_CMD NC_("STR_CMD", "⌘ Cmd") //use narrow no-break space U+202F here #define STR_CTRL NC_("STR_CTRL", "Ctrl") diff --git a/cui/inc/toolbarmode.hrc b/cui/inc/toolbarmode.hrc new file mode 100644 index 000000000000..25de3b569cdf --- /dev/null +++ b/cui/inc/toolbarmode.hrc @@ -0,0 +1,37 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#define NC_(Context, String) reinterpret_cast<char const *>(Context "\004" u8##String) + +#include <rtl/ustring.hxx> +#include <tuple> + +/* + Description, ui file name, preview file name +*/ +const std::tuple<const char*, OUString, OUString> TOOLBARMODES_ARRAY[] = +{ + { NC_("RID_CUI_TOOLBARMODES", "Standard user interface with menu, toolbar, and collapsed sidebar. Intended to user who are familiar with the classic interface."), "Default", "default.png"}, + { NC_("RID_CUI_TOOLBARMODES", "Standard user interface but with only one toolbar. Intended for use on small screens."), "Single", "single.png"}, + { NC_("RID_CUI_TOOLBARMODES", "Standard user interface with expanded sidebar. Expert users who want to quickly change many different properties are advised to use this UI."), "Sidebar", "sidebar.png"}, + { NC_("RID_CUI_TOOLBARMODES", "The Tabbed user interface is the most similar to the Ribbons used by Microsoft. It organize functions in tabs and makes the main menu obsolete."), "notebookbar.ui", "notebookbar.png"}, + { NC_("RID_CUI_TOOLBARMODES", "The Tabbed Compact variant aims to be familiar with Microsoft's interface having at the same time a short interface for small screen sizes."), "notebookbar_compact.ui", "notebookbar_compact.png"}, + { NC_("RID_CUI_TOOLBARMODES", "The Groupedbar Compact variant provides access to functions in groups with most frequently used features in icons and less often used in a dropdown menu. The compact variant favors vertical size."), "notebookbar_groupedbar_compact.ui", "notebookbar_groupedbar_compact.png"}, + { NC_("RID_CUI_TOOLBARMODES", "The Groupedbar interface provides access to functions in groups with most frequently used features in icons and less often used in a dropdown menu. The full variant favors functions and is slighly larger than other variants."), "notebookbar_groupedbar_full.ui", "notebookbar_groupedbar_full.png"}, + { NC_("RID_CUI_TOOLBARMODES", "The Contextual Single interface shows functions in a single line toolbar with contextual depending content."), "notebookbar_single.ui", "notebookbar_single.png"}, + { NC_("RID_CUI_TOOLBARMODES", "The Contextual Groups interface focus on beginners. It exposes to the most frequently used functions on groups with the core action as large icon and a couple of small additional features. All functions have a label. Depending on the context an additional section provides access to those functions."), "notebookbar_groups.ui", "notebookbar_groups.png"}, +}; + +//hide experimental UIs +constexpr int nContextSingle = 7; +constexpr int nContextGroup = 8; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/cui/source/dialogs/tipofthedaydlg.cxx b/cui/source/dialogs/tipofthedaydlg.cxx index 4775ed0578b9..c64362d35c08 100644 --- a/cui/source/dialogs/tipofthedaydlg.cxx +++ b/cui/source/dialogs/tipofthedaydlg.cxx @@ -17,18 +17,22 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ +#include <sal/config.h> #include <tipofthedaydlg.hxx> - -#include <dialmgr.hxx> -#include <officecfg/Office/Common.hxx> -#include <osl/file.hxx> -#include <rtl/bootstrap.hxx> #include <tipoftheday.hrc> + #include <vcl/graphicfilter.hxx> #include <vcl/help.hxx> #include <vcl/virdev.hxx> #include <vcl/svapp.hxx> + +#include <comphelper/dispatchcommand.hxx> +#include <comphelper/propertysequence.hxx> +#include <dialmgr.hxx> #include <i18nlangtag/languagetag.hxx> +#include <officecfg/Office/Common.hxx> +#include <osl/file.hxx> +#include <rtl/bootstrap.hxx> #include <unotools/resmgr.hxx> #include <unotools/configmgr.hxx> @@ -108,6 +112,13 @@ void TipOfTheDayDialog::UpdateTip() { m_pLink->set_visible(false); } + else if (aLink.startsWith(".uno:")) + { + m_pLink->set_uri(CuiResId(STR_UNO_EXECUTE).replaceFirst("%COMMAND", aLink)); + m_pLink->set_label(CuiResId(STR_UNO_LINK)); + m_pLink->set_visible(true); + m_pLink->connect_activate_link(LINK(this, TipOfTheDayDialog, OnLinkClick)); + } else if (aLink.startsWith("http")) { // Links may have some %PRODUCTVERSION which need to be expanded @@ -155,7 +166,15 @@ void TipOfTheDayDialog::UpdateTip() IMPL_LINK_NOARG(TipOfTheDayDialog, OnLinkClick, weld::LinkButton&, bool) { - Application::GetHelp()->Start(aLink, static_cast<weld::Widget*>(nullptr)); + if (aLink.startsWith("http")) + { + Application::GetHelp()->Start(aLink, static_cast<weld::Widget*>(nullptr)); + } + else if (aLink.startsWith(".uno:")) + { + comphelper::dispatchCommand(aLink, {}); + TipOfTheDayDialog::response(RET_OK); + } return true; } diff --git a/cui/source/dialogs/toolbarmodedlg.cxx b/cui/source/dialogs/toolbarmodedlg.cxx new file mode 100644 index 000000000000..21bd7055bd96 --- /dev/null +++ b/cui/source/dialogs/toolbarmodedlg.cxx @@ -0,0 +1,214 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <sal/config.h> + +#include <toolbarmodedlg.hxx> +#include <toolbarmode.hrc> + +#include <com/sun/star/frame/ModuleManager.hpp> +#include <comphelper/dispatchcommand.hxx> +#include <comphelper/propertysequence.hxx> +#include <comphelper/types.hxx> +#include <dialmgr.hxx> +#include <officecfg/Office/UI/ToolbarMode.hxx> +#include <osl/file.hxx> +#include <rtl/bootstrap.hxx> +#include <sfx2/viewfrm.hxx> +#include <strings.hrc> +#include <svtools/miscopt.hxx> +#include <unotools/confignode.hxx> +#include <vcl/virdev.hxx> +#include <vcl/graphicfilter.hxx> +#include <vcl/EnumContext.hxx> +#include <vcl/weld.hxx> + +static OUString GetCurrentApp() +{ + OUString sResult; + if (SfxViewFrame* pViewFrame = SfxViewFrame::Current()) + { + const auto xCurrentFrame = pViewFrame->GetFrame().GetFrameInterface(); + const auto xContext = comphelper::getProcessComponentContext(); + const auto xModuleManager = css::frame::ModuleManager::create(xContext); + switch (vcl::EnumContext::GetApplicationEnum(xModuleManager->identify(xCurrentFrame))) + { + case vcl::EnumContext::Application::Writer: + sResult = "Writer"; + break; + case vcl::EnumContext::Application::Calc: + sResult = "Calc"; + break; + case vcl::EnumContext::Application::Impress: + sResult = "Impress"; + break; + case vcl::EnumContext::Application::Draw: + sResult = "Draw"; + break; + case vcl::EnumContext::Application::Formula: + sResult = "Formula"; + break; + case vcl::EnumContext::Application::Base: + sResult = "Base"; + break; + default: + sResult = "Unsupported"; + } + } + return sResult; +} + +static OUString GetCurrentMode() +{ + OUString sResult; + if (SfxViewFrame* pViewFrame = SfxViewFrame::Current()) + { + const auto xCurrentFrame = pViewFrame->GetFrame().GetFrameInterface(); + const auto xContext = comphelper::getProcessComponentContext(); + const auto xModuleManager = css::frame::ModuleManager::create(xContext); + const utl::OConfigurationTreeRoot aAppNode( + xContext, "org.openoffice.Office.UI.ToolbarMode/Applications/" + GetCurrentApp(), true); + if (aAppNode.isValid()) + sResult = comphelper::getString(aAppNode.getNodeValue("Active")); + }; + return sResult; +} + +ToolbarmodeDialog::ToolbarmodeDialog(weld::Window* pParent) + : GenericDialogController(pParent, "cui/ui/toolbarmodedialog.ui", "ToolbarmodeDialog") + , m_pImage(m_xBuilder->weld_image("imImage")) + , m_pApply(m_xBuilder->weld_button("btnApply")) + , m_pApplyAll(m_xBuilder->weld_button("btnApplyAll")) + , m_pRadioButtons{ (m_xBuilder->weld_radio_button("rbButton1")), + (m_xBuilder->weld_radio_button("rbButton2")), + (m_xBuilder->weld_radio_button("rbButton3")), + (m_xBuilder->weld_radio_button("rbButton4")), + (m_xBuilder->weld_radio_button("rbButton5")), + (m_xBuilder->weld_radio_button("rbButton6")), + (m_xBuilder->weld_radio_button("rbButton7")), + (m_xBuilder->weld_radio_button("rbButton8")), + (m_xBuilder->weld_radio_button("rbButton9")) } + , m_pInfoLabel(m_xBuilder->weld_label("lbInfo")) +{ + static_assert(SAL_N_ELEMENTS(m_pRadioButtons) == SAL_N_ELEMENTS(TOOLBARMODES_ARRAY)); + + Link<weld::ToggleButton&, void> aLink = LINK(this, ToolbarmodeDialog, SelectToolbarmode); + + const OUString sCurrentMode = GetCurrentMode(); + for (unsigned long i = 0; i < SAL_N_ELEMENTS(m_pRadioButtons); i++) + { + m_pRadioButtons[i]->connect_toggled(aLink); + if (sCurrentMode == std::get<1>(TOOLBARMODES_ARRAY[i])) + { + m_pRadioButtons[i]->set_active(true); + UpdateImage(std::get<2>(TOOLBARMODES_ARRAY[i])); + m_pInfoLabel->set_label(CuiResId(std::get<0>(TOOLBARMODES_ARRAY[i]))); + } + } + + m_pApply->set_label(CuiResId(RID_SVXSTR_UI_APPLYALL).replaceFirst("%MODULE", GetCurrentApp())); + m_pApply->connect_clicked(LINK(this, ToolbarmodeDialog, OnApplyClick)); + m_pApplyAll->connect_clicked(LINK(this, ToolbarmodeDialog, OnApplyClick)); + + if (!SvtMiscOptions().IsExperimentalMode()) + { + m_pRadioButtons[nContextSingle]->set_visible(false); + m_pRadioButtons[nContextGroup]->set_visible(false); + } +} + +ToolbarmodeDialog::~ToolbarmodeDialog() = default; + +static bool file_exists(const OUString& fileName) +{ + osl::File aFile(fileName); + return aFile.open(osl_File_OpenFlag_Read) == osl::FileBase::E_None; +} + +int ToolbarmodeDialog::GetActiveRadioButton() +{ + for (unsigned long i = 0; i < SAL_N_ELEMENTS(m_pRadioButtons); i++) + { + if (m_pRadioButtons[i]->get_active()) + return i; + } + return -1; +} + +void ToolbarmodeDialog::UpdateImage(OUString sFileName) +{ + // load image + OUString aURL("$BRAND_BASE_DIR/$BRAND_SHARE_SUBDIR/toolbarmode/"); + rtl::Bootstrap::expandMacros(aURL); + aURL += sFileName; + if (sFileName.isEmpty() || !file_exists(aURL)) + return; + // draw image + Graphic aGraphic; + if (GraphicFilter::LoadGraphic(aURL, OUString(), aGraphic) == ERRCODE_NONE) + { + ScopedVclPtr<VirtualDevice> m_pVirDev = m_pImage->create_virtual_device(); + m_pVirDev->SetOutputSizePixel(aGraphic.GetSizePixel()); + m_pVirDev->DrawBitmapEx(Point(0, 0), aGraphic.GetBitmapEx()); + m_pImage->set_image(m_pVirDev.get()); + m_pVirDev.disposeAndClear(); + } +} + +IMPL_LINK_NOARG(ToolbarmodeDialog, SelectToolbarmode, weld::ToggleButton&, void) +{ + const int i = GetActiveRadioButton(); + if (i > -1) + { + UpdateImage(std::get<2>(TOOLBARMODES_ARRAY[i])); + m_pInfoLabel->set_label(CuiResId(std::get<0>(TOOLBARMODES_ARRAY[i]))); + } +} + +IMPL_LINK(ToolbarmodeDialog, OnApplyClick, weld::Button&, rButton, void) +{ + const int i = GetActiveRadioButton(); + if (i == -1) + return; + const OUString sCmd = std::get<1>(TOOLBARMODES_ARRAY[i]); + //apply to all except current module + if (&rButton == m_pApplyAll.get()) + { + std::shared_ptr<comphelper::ConfigurationChanges> aBatch( + comphelper::ConfigurationChanges::create(::comphelper::getProcessComponentContext())); + officecfg::Office::UI::ToolbarMode::ActiveWriter::set(sCmd, aBatch); + officecfg::Office::UI::ToolbarMode::ActiveCalc::set(sCmd, aBatch); + officecfg::Office::UI::ToolbarMode::ActiveImpress::set(sCmd, aBatch); + officecfg::Office::UI::ToolbarMode::ActiveDraw::set(sCmd, aBatch); + aBatch->commit(); + + OUString sCurrentApp = GetCurrentApp(); + if (SfxViewFrame* pViewFrame = SfxViewFrame::Current()) + { + const auto xCurrentFrame = pViewFrame->GetFrame().GetFrameInterface(); + const auto xContext = comphelper::getProcessComponentContext(); + const auto xModuleManager = css::frame::ModuleManager::create(xContext); + const utl::OConfigurationTreeRoot aAppNode( + xContext, "org.openoffice.Office.UI.ToolbarMode/Applications/", true); + if (sCurrentApp != "Writer") + aAppNode.setNodeValue("Writer/Active", css::uno::makeAny(sCmd)); + if (sCurrentApp != "Calc") + aAppNode.setNodeValue("Calc/Active", css::uno::makeAny(sCmd)); + if (sCurrentApp != "Impress") + aAppNode.setNodeValue("Impress/Active", css::uno::makeAny(sCmd)); + if (sCurrentApp != "Draw") + aAppNode.setNodeValue("Draw/Active", css::uno::makeAny(sCmd)); + aAppNode.commit(); + }; + } + //apply to current module + comphelper::dispatchCommand(".uno:ToolbarMode?Mode:string=" + sCmd, {}); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/cui/source/factory/dlgfact.cxx b/cui/source/factory/dlgfact.cxx index 731303dc50a3..f970e4a10503 100644 --- a/cui/source/factory/dlgfact.cxx +++ b/cui/source/factory/dlgfact.cxx @@ -88,6 +88,7 @@ #include <hyphen.hxx> #include <thesdlg.hxx> #include <tipofthedaydlg.hxx> +#include <toolbarmodedlg.hxx> #include <DiagramDialog.hxx> using namespace ::com::sun::star; @@ -1679,6 +1680,13 @@ AbstractDialogFactory_Impl::CreateTipOfTheDayDialog(weld::Window* pParent) std::make_unique<TipOfTheDayDialog>(pParent)); } +VclPtr<VclAbstractDialog> +AbstractDialogFactory_Impl::CreateToolbarmodeDialog(weld::Window* pParent) +{ + return VclPtr<CuiAbstractController_Impl>::Create( + std::make_unique<ToolbarmodeDialog>(pParent)); +} + VclPtr<AbstractDiagramDialog> AbstractDialogFactory_Impl::CreateDiagramDialog(weld::Window* pParent, std::shared_ptr<DiagramDataInterface> pDiagramData) { diff --git a/cui/source/factory/dlgfact.hxx b/cui/source/factory/dlgfact.hxx index fd11ee459d73..4d0b569108dd 100644 --- a/cui/source/factory/dlgfact.hxx +++ b/cui/source/factory/dlgfact.hxx @@ -941,6 +941,8 @@ public: virtual VclPtr<VclAbstractDialog> CreateTipOfTheDayDialog(weld::Window* pParent) override; + virtual VclPtr<VclAbstractDialog> CreateToolbarmodeDialog(weld::Window* pParent) override; + virtual VclPtr<AbstractDiagramDialog> CreateDiagramDialog( weld::Window* pParent, std::shared_ptr<DiagramDataInterface> pDiagramData) override; diff --git a/cui/source/inc/toolbarmodedlg.hxx b/cui/source/inc/toolbarmodedlg.hxx new file mode 100644 index 000000000000..40d6dc835851 --- /dev/null +++ b/cui/source/inc/toolbarmodedlg.hxx @@ -0,0 +1,33 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include <vcl/weld.hxx> + +class ToolbarmodeDialog : public weld::GenericDialogController +{ +public: + ToolbarmodeDialog(weld::Window* pWindow); + virtual ~ToolbarmodeDialog() override; + +private: + std::unique_ptr<weld::Image> m_pImage; + std::unique_ptr<weld::Button> m_pApply; + std::unique_ptr<weld::Button> m_pApplyAll; + std::unique_ptr<weld::RadioButton> m_pRadioButtons[9]; + std::unique_ptr<weld::Label> m_pInfoLabel; + + void UpdateImage(OUString sFileName); + int GetActiveRadioButton(); + DECL_LINK(SelectToolbarmode, weld::ToggleButton&, void); + DECL_LINK(OnApplyClick, weld::Button&, void); +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/cui/uiconfig/ui/toolbarmodedialog.ui b/cui/uiconfig/ui/toolbarmodedialog.ui new file mode 100644 index 000000000000..79523b56a457 --- /dev/null +++ b/cui/uiconfig/ui/toolbarmodedialog.ui @@ -0,0 +1,381 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.36.0 --> +<interface domain="cui"> + <requires lib="gtk+" version="3.18"/> + <object class="GtkImage" id="imgApply"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-apply</property> + </object> + <object class="GtkDialog" id="ToolbarmodeDialog"> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="title" translatable="yes" context="ToolbarmodeDialog|Name">Select Your Preferred User Interface</property> + <property name="resizable">False</property> + <property name="modal">True</property> + <property name="window_position">center-on-parent</property> + <property name="type_hint">dialog</property> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area"> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="btnApplyAll"> + <property name="label">A_pply to All</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">True</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="btnApply"> + <property name="label">A_pply to %MODULE</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">True</property> + <property name="image">imgApply</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="btnClose"> + <property name="label">gtk-close</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">True</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkFrame"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_start">12</property> + <property name="margin_end">12</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkAlignment"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="left_padding">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">3</property> + <child> + <object class="GtkRadioButton" id="rbButton1"> + <property name="label" translatable="yes" context="ToolbarmodeDialog|radiobutton1">Standard Toolbar</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="valign">start</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="rbButton2"> + <property name="label" translatable="yes" context="ToolbarmodeDialog|radiobutton2">Single Toolbar</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="valign">start</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <property name="group">rbButton1</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="rbButton3"> + <property name="label" translatable="yes" context="ToolbarmodeDialog|radiobutton3">Sidebar</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="valign">start</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <property name="group">rbButton1</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="rbButton4"> + <property name="label" translatable="yes" context="ToolbarmodeDialog|radiobutton4">Tabbed</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="valign">start</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <property name="group">rbButton1</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="rbButton5"> + <property name="label" translatable="yes" context="ToolbarmodeDialog|radiobutton5">Tabbed Compact</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="valign">start</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <property name="group">rbButton1</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="rbButton6"> + <property name="label" translatable="yes" context="ToolbarmodeDialog|radiobutton6">Groupedbar Compact</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="valign">start</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <property name="group">rbButton1</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="rbButton7"> + <property name="label" translatable="yes" context="ToolbarmodeDialog|radiobutton7">Groupedbar</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="valign">start</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <property name="group">rbButton1</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="rbButton8"> + <property name="label" translatable="yes" context="ToolbarmodeDialog|radiobutton8">Contextual Single</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="valign">start</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <property name="group">rbButton1</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="rbButton9"> + <property name="label" translatable="yes" context="ToolbarmodeDialog|radiobutton9">Contextual Groups</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="valign">start</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <property name="group">rbButton1</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="ToolbarmodeDialog|leftframe">UI variants</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_start">12</property> + <property name="margin_end">12</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkAlignment"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="left_padding">12</property> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="baseline_position">top</property> + <child> + <object class="GtkImage" id="imImage"> + <property name="height_request">100</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="vexpand">True</property> + <property name="stock">gtk-missing-image</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="lbInfo"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">start</property> + <property name="margin_top">12</property> + <property name="label">Information:</property> + <property name="wrap">True</property> + <property name="wrap_mode">word-char</property> + <property name="max_width_chars">50</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="ToolbarmodeDialog|rightframe">Preview</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="expand">False</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">0</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="-5">btnApplyAll</action-widget> + <action-widget response="-5">btnApply</action-widget> + <action-widget response="-7">btnClose</action-widget> + </action-widgets> + <child type="titlebar"> + <placeholder/> + </child> + </object> +</interface> |