diff options
author | Caolán McNamara <caolanm@redhat.com> | 2019-10-11 13:02:57 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2019-10-13 16:16:24 +0200 |
commit | 226fcda0a888c4959b1f895de31856f1624f04ee (patch) | |
tree | 6c13e9ff0231f9f3fc744884937e3849b641773e /vcl | |
parent | b2e5f9ead2bb7f2979afe4ba13e3950e8a3cc278 (diff) |
weld ConditionalFormattingDialog
Change-Id: I87c03555c5555b12a1be997e368a96d9b07d2b63
Reviewed-on: https://gerrit.libreoffice.org/80689
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/source/app/salvtables.cxx | 59 | ||||
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkinst.cxx | 79 |
2 files changed, 132 insertions, 6 deletions
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index d12c3464c75d..6cf9e010178c 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -923,14 +923,17 @@ class SalInstanceToolbar : public SalInstanceWidget, public virtual weld::Toolba { private: VclPtr<ToolBox> m_xToolBox; + std::map<sal_uInt16, VclPtr<vcl::Window>> m_aFloats; DECL_LINK(ClickHdl, ToolBox*, void); + DECL_LINK(DropdownClick, ToolBox*, void); public: SalInstanceToolbar(ToolBox* pToolBox, SalInstanceBuilder* pBuilder, bool bTakeOwnership) : SalInstanceWidget(pToolBox, pBuilder, bTakeOwnership) , m_xToolBox(pToolBox) { m_xToolBox->SetSelectHdl(LINK(this, SalInstanceToolbar, ClickHdl)); + m_xToolBox->SetDropdownClickHdl(LINK(this, SalInstanceToolbar, DropdownClick)); } virtual void set_item_sensitive(const OString& rIdent, bool bSensitive) override @@ -945,7 +948,19 @@ public: virtual void set_item_active(const OString& rIdent, bool bActive) override { - m_xToolBox->CheckItem(m_xToolBox->GetItemId(OUString::fromUtf8(rIdent)), bActive); + sal_uInt16 nItemId = m_xToolBox->GetItemId(OUString::fromUtf8(rIdent)); + m_xToolBox->CheckItem(nItemId, bActive); + + if (m_xToolBox->GetItemBits(nItemId) & ToolBoxItemBits::DROPDOWN) + { + auto pFloat = m_aFloats[nItemId]; + if (!pFloat) + return; + if (bActive) + vcl::Window::GetDockingManager()->StartPopupMode(m_xToolBox, pFloat, FloatWinPopupFlags::GrabFocus); + else + vcl::Window::GetDockingManager()->EndPopupMode(pFloat); + } } virtual bool get_item_active(const OString& rIdent) const override @@ -953,6 +968,17 @@ public: return m_xToolBox->IsItemChecked(m_xToolBox->GetItemId(OUString::fromUtf8(rIdent))); } + virtual void set_item_popover(const OString& rIdent, weld::Widget* pPopover) override + { + SalInstanceWidget* pPopoverWidget = dynamic_cast<SalInstanceWidget*>(pPopover); + + vcl::Window* pFloat = pPopoverWidget ? pPopoverWidget->getWidget() : nullptr; + if (pFloat) + pFloat->EnableDocking(); + + m_aFloats[m_xToolBox->GetItemId(OUString::fromUtf8(rIdent))] = pFloat; + } + virtual void insert_separator(int pos, const OUString& /*rId*/) override { auto nInsertPos = pos == -1 ? ToolBox::APPEND : pos; @@ -961,6 +987,7 @@ public: virtual ~SalInstanceToolbar() override { + m_xToolBox->SetDropdownClickHdl(Link<ToolBox*, void>()); m_xToolBox->SetSelectHdl(Link<ToolBox*, void>()); } }; @@ -971,6 +998,12 @@ IMPL_LINK_NOARG(SalInstanceToolbar, ClickHdl, ToolBox*, void) signal_clicked(m_xToolBox->GetItemCommand(nItemId).toUtf8()); } +IMPL_LINK_NOARG(SalInstanceToolbar, DropdownClick, ToolBox*, void) +{ + sal_uInt16 nItemId = m_xToolBox->GetCurItemId(); + set_item_active(m_xToolBox->GetItemCommand(nItemId).toUtf8(), true); +} + class SalInstanceSizeGroup : public weld::SizeGroup { private: @@ -994,9 +1027,10 @@ public: class SalInstanceContainer : public SalInstanceWidget, public virtual weld::Container { -private: +protected: VclPtr<vcl::Window> m_xContainer; +private: void implResetDefault(const vcl::Window* _pWindow) { vcl::Window* pChildLoop = _pWindow->GetWindow(GetWindowType::FirstChild); @@ -1060,6 +1094,21 @@ std::unique_ptr<weld::Container> SalInstanceWidget::weld_parent() const return std::make_unique<SalInstanceContainer>(pParent, m_pBuilder, false); } +class SalInstanceBox : public SalInstanceContainer, public virtual weld::Box +{ +public: + SalInstanceBox(vcl::Window* pContainer, SalInstanceBuilder* pBuilder, bool bTakeOwnership) + : SalInstanceContainer(pContainer, pBuilder, bTakeOwnership) + { + } + virtual void reorder_child(weld::Widget* pWidget, int nNewPosition) override + { + SalInstanceWidget* pVclWidget = dynamic_cast<SalInstanceWidget*>(pWidget); + assert(pVclWidget); + pVclWidget->getWidget()->reorderWithinParent(nNewPosition); + } +}; + namespace { void CollectChildren(const vcl::Window& rCurrent, const basegfx::B2IPoint& rTopLeft, weld::ScreenShotCollection& rControlDataCollection) @@ -5809,6 +5858,12 @@ public: return pContainer ? std::make_unique<SalInstanceContainer>(pContainer, this, bTakeOwnership) : nullptr; } + virtual std::unique_ptr<weld::Box> weld_box(const OString &id, bool bTakeOwnership) override + { + vcl::Window* pContainer = m_xBuilder->get<vcl::Window>(id); + return pContainer ? std::make_unique<SalInstanceBox>(pContainer, this, bTakeOwnership) : nullptr; + } + virtual std::unique_ptr<weld::Frame> weld_frame(const OString &id, bool bTakeOwnership) override { VclFrame* pFrame = m_xBuilder->get<VclFrame>(id); diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx index 59066bde6502..38fc905c8091 100644 --- a/vcl/unx/gtk3/gtk3gtkinst.cxx +++ b/vcl/unx/gtk3/gtk3gtkinst.cxx @@ -3208,6 +3208,27 @@ std::unique_ptr<weld::Container> GtkInstanceWidget::weld_parent() const return std::make_unique<GtkInstanceContainer>(GTK_CONTAINER(pParent), m_pBuilder, false); } +class GtkInstanceBox : public GtkInstanceContainer, public virtual weld::Box +{ +private: + GtkBox* m_pBox; + +public: + GtkInstanceBox(GtkBox* pBox, GtkInstanceBuilder* pBuilder, bool bTakeOwnership) + : GtkInstanceContainer(GTK_CONTAINER(pBox), pBuilder, bTakeOwnership) + , m_pBox(pBox) + { + } + + virtual void reorder_child(weld::Widget* pWidget, int nNewPosition) override + { + GtkInstanceWidget* pGtkWidget = dynamic_cast<GtkInstanceWidget*>(pWidget); + assert(pGtkWidget); + GtkWidget* pChild = pGtkWidget->getWidget(); + gtk_box_reorder_child(m_pBox, pChild, nNewPosition); + } +}; + namespace { void set_cursor(GtkWidget* pWidget, const char *pName) @@ -6671,6 +6692,21 @@ private: GtkToolbar* m_pToolbar; std::map<OString, GtkToolButton*> m_aMap; + std::map<OString, std::unique_ptr<GtkInstanceMenuButton>> m_aMenuButtonMap; + + // at the time of writing there is no gtk_menu_tool_button_set_popover available + // though there will be in the future + // https://gitlab.gnome.org/GNOME/gtk/commit/03e30431a8af9a947a0c4ccab545f24da16bfe17?w=1 + static void find_menu_button(GtkWidget *pWidget, gpointer user_data) + { + if (g_strcmp0(gtk_widget_get_name(pWidget), "GtkMenuButton") == 0) + { + GtkWidget **ppToggleButton = static_cast<GtkWidget**>(user_data); + *ppToggleButton = pWidget; + } + else if (GTK_IS_CONTAINER(pWidget)) + gtk_container_forall(GTK_CONTAINER(pWidget), find_menu_button, user_data); + } static void collect(GtkWidget* pItem, gpointer widget) { @@ -6678,15 +6714,22 @@ private: { GtkToolButton* pToolItem = GTK_TOOL_BUTTON(pItem); GtkInstanceToolbar* pThis = static_cast<GtkInstanceToolbar*>(widget); - pThis->add_to_map(pToolItem); + + GtkMenuButton* pMenuButton = nullptr; + if (GTK_IS_MENU_TOOL_BUTTON(pItem)) + find_menu_button(pItem, &pMenuButton); + + pThis->add_to_map(pToolItem, pMenuButton); } } - void add_to_map(GtkToolButton* pToolItem) + void add_to_map(GtkToolButton* pToolItem, GtkMenuButton* pMenuButton) { const gchar* pStr = gtk_buildable_get_name(GTK_BUILDABLE(pToolItem)); OString id(pStr, pStr ? strlen(pStr) : 0); m_aMap[id] = pToolItem; + if (pMenuButton) + m_aMenuButtonMap[id] = std::make_unique<GtkInstanceMenuButton>(pMenuButton, m_pBuilder, false); g_signal_connect(pToolItem, "clicked", G_CALLBACK(signalItemClicked), this); } @@ -6738,13 +6781,27 @@ public: virtual void set_item_active(const OString& rIdent, bool bActive) override { disable_item_notify_events(); - gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(m_aMap[rIdent]), bActive); + + auto aFind = m_aMenuButtonMap.find(rIdent); + if (aFind != m_aMenuButtonMap.end()) + aFind->second->set_active(bActive); + else + { + GtkToolButton* pToolButton = m_aMap.find(rIdent)->second; + gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(pToolButton), bActive); + } + enable_item_notify_events(); } virtual bool get_item_active(const OString& rIdent) const override { - return gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(m_aMap.find(rIdent)->second)); + auto aFind = m_aMenuButtonMap.find(rIdent); + if (aFind != m_aMenuButtonMap.end()) + return aFind->second->get_active(); + + GtkToolButton* pToolButton = m_aMap.find(rIdent)->second; + return gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(pToolButton)); } virtual void insert_separator(int pos, const OUString& rId) override @@ -6755,6 +6812,11 @@ public: gtk_widget_show(GTK_WIDGET(pItem)); } + virtual void set_item_popover(const OString& rIdent, weld::Widget* pPopover) override + { + m_aMenuButtonMap[rIdent]->set_popover(pPopover); + } + virtual ~GtkInstanceToolbar() override { for (auto& a : m_aMap) @@ -11864,6 +11926,15 @@ public: return std::make_unique<GtkInstanceContainer>(pContainer, this, bTakeOwnership); } + virtual std::unique_ptr<weld::Box> weld_box(const OString &id, bool bTakeOwnership) override + { + GtkBox* pBox = GTK_BOX(gtk_builder_get_object(m_pBuilder, id.getStr())); + if (!pBox) + return nullptr; + auto_add_parentless_widgets_to_container(GTK_WIDGET(pBox)); + return std::make_unique<GtkInstanceBox>(pBox, this, bTakeOwnership); + } + virtual std::unique_ptr<weld::Frame> weld_frame(const OString &id, bool bTakeOwnership) override { GtkFrame* pFrame = GTK_FRAME(gtk_builder_get_object(m_pBuilder, id.getStr())); |