From 94f698cc15dca3683c2e39a4ee3147fee121bd2d Mon Sep 17 00:00:00 2001 From: Uwe Runtemund Date: Mon, 18 Apr 2022 12:01:28 +0200 Subject: [PATCH] Add functions for getting current ribbon tool rectangle wxRibbonButtonBar::GetItemRect() and wxRibbonToolBar::GetActiveTool() are helpful for positioning other windows (e.g. popup ones) that should be aligned to tools and buttons in the ribbon bar. Closes #22329. --- include/wx/ribbon/buttonbar.h | 1 + include/wx/ribbon/toolbar.h | 2 ++ interface/wx/ribbon/buttonbar.h | 11 +++++++++++ interface/wx/ribbon/toolbar.h | 9 +++++++++ src/ribbon/buttonbar.cpp | 23 +++++++++++++++++++++++ src/ribbon/toolbar.cpp | 5 +++++ 6 files changed, 51 insertions(+) diff --git a/include/wx/ribbon/buttonbar.h b/include/wx/ribbon/buttonbar.h index 03966a1286..7a57da6913 100644 --- a/include/wx/ribbon/buttonbar.h +++ b/include/wx/ribbon/buttonbar.h @@ -132,6 +132,7 @@ public: virtual wxRibbonButtonBarButtonBase *GetItem(size_t n) const; virtual wxRibbonButtonBarButtonBase *GetItemById(int id) const; virtual int GetItemId(wxRibbonButtonBarButtonBase *button) const; + virtual wxRect GetItemRect(int button_id) const; virtual bool Realize() wxOVERRIDE; diff --git a/include/wx/ribbon/toolbar.h b/include/wx/ribbon/toolbar.h index 02578cd0c0..393613b7ec 100644 --- a/include/wx/ribbon/toolbar.h +++ b/include/wx/ribbon/toolbar.h @@ -134,6 +134,8 @@ public: virtual wxRibbonToolBarToolBase* GetToolByPos(wxCoord x, wxCoord y)const; virtual size_t GetToolCount() const; virtual int GetToolId(const wxRibbonToolBarToolBase* tool)const; + virtual wxRibbonToolBarToolBase* GetActiveTool() const; + virtual wxObject* GetToolClientData(int tool_id)const; virtual bool GetToolEnabled(int tool_id)const; diff --git a/interface/wx/ribbon/buttonbar.h b/interface/wx/ribbon/buttonbar.h index 48b5ad3e36..0ef2602cac 100644 --- a/interface/wx/ribbon/buttonbar.h +++ b/interface/wx/ribbon/buttonbar.h @@ -429,6 +429,17 @@ public: */ virtual int GetItemId(wxRibbonButtonBarButtonBase *item) const; + /** + Returns the items's rect with coordinates relative to the button bar's + parent, or a default-constructed rect if the tool is not found. + + @param button_id + ID of the button in question. + + @since 3.1.7 + */ + virtual wxRect GetItemRect(int button_id) const; + /** Calculate button layouts and positions. diff --git a/interface/wx/ribbon/toolbar.h b/interface/wx/ribbon/toolbar.h index 39dccc7f41..accf86873e 100644 --- a/interface/wx/ribbon/toolbar.h +++ b/interface/wx/ribbon/toolbar.h @@ -334,6 +334,15 @@ public: */ virtual int GetToolId(const wxRibbonToolBarToolBase* tool)const; + /** + Returns the active item of the tool bar or NULL if there is none. + + The active tool is the one being clicked. + + @since 3.1.7 + */ + virtual wxRibbonToolBarToolBase* GetActiveTool() const; + /** Get any client data associated with the tool. diff --git a/src/ribbon/buttonbar.cpp b/src/ribbon/buttonbar.cpp index 0728ac54ac..98b559538e 100644 --- a/src/ribbon/buttonbar.cpp +++ b/src/ribbon/buttonbar.cpp @@ -1508,6 +1508,29 @@ int wxRibbonButtonBar::GetItemId(wxRibbonButtonBarButtonBase *item) const return item->id; } +wxRect wxRibbonButtonBar::GetItemRect(int button_id)const +{ + wxRibbonButtonBarLayout* layout = m_layouts.Item(m_current_layout); + size_t btn_count = layout->buttons.Count(); + size_t btn_i; + + for (btn_i = 0; btn_i < btn_count; ++btn_i) + { + wxRibbonButtonBarButtonInstance& instance = layout->buttons.Item(btn_i); + wxRibbonButtonBarButtonBase* button = instance.base; + + if (button->id == button_id) + { + wxRibbonButtonBarButtonSizeInfo& size = button->sizes[instance.size]; + wxRect btn_rect; + btn_rect.SetTopLeft(m_layout_offset + instance.position); + btn_rect.SetSize(size.size); + + return btn_rect; + } + } + return wxRect(); +} bool wxRibbonButtonBarEvent::PopupMenu(wxMenu* menu) { diff --git a/src/ribbon/toolbar.cpp b/src/ribbon/toolbar.cpp index 74911ca582..f663fbdb22 100644 --- a/src/ribbon/toolbar.cpp +++ b/src/ribbon/toolbar.cpp @@ -470,6 +470,11 @@ int wxRibbonToolBar::GetToolId(const wxRibbonToolBarToolBase* tool)const return tool->id; } +wxRibbonToolBarToolBase* wxRibbonToolBar::GetActiveTool() const +{ + return m_active_tool == NULL ? NULL : m_active_tool; +} + wxObject* wxRibbonToolBar::GetToolClientData(int tool_id)const { wxRibbonToolBarToolBase* tool = FindById(tool_id);