Add wxRibbonBar::DeletePage() and ClearPages() methods.

Also add a trivial GetPageCount() helper.

Closes #14437.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71888 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2012-06-30 16:33:18 +00:00
parent 34f5c1053a
commit c21b99e0e2
5 changed files with 117 additions and 4 deletions

View File

@@ -542,6 +542,7 @@ All (GUI):
- Send wxEVT_UPDATE_UI for wxRibbonButtonBar and wxRibbonToolBar (Emilien Kia). - Send wxEVT_UPDATE_UI for wxRibbonButtonBar and wxRibbonToolBar (Emilien Kia).
- Add InsertXXXButton() to wxRibbonButtonBar and wxRibbonToolBar (Emilien Kia). - Add InsertXXXButton() to wxRibbonButtonBar and wxRibbonToolBar (Emilien Kia).
- Allow enabling/disabling and toggling tools in wxRibbonToolBar (Emilien Kia). - Allow enabling/disabling and toggling tools in wxRibbonToolBar (Emilien Kia).
- Add wxRibbonBar::DeletePage() and ClearPages() methods (Emilien Kia).
- Implement support for extension button to wxRibbonPanel (Emilien Kia). - Implement support for extension button to wxRibbonPanel (Emilien Kia).
- Fix multiple item selection in generic wxTreeCtrl (Igor Korot). - Fix multiple item selection in generic wxTreeCtrl (Igor Korot).
- Implement wxMenuBar::IsEnabledTop() for all major ports (Igor Korot). - Implement wxMenuBar::IsEnabledTop() for all major ports (Igor Korot).

View File

@@ -113,8 +113,12 @@ public:
bool SetActivePage(wxRibbonPage* page); bool SetActivePage(wxRibbonPage* page);
int GetActivePage() const; int GetActivePage() const;
wxRibbonPage* GetPage(int n); wxRibbonPage* GetPage(int n);
size_t GetPageCount() const;
bool DismissExpandedPanel(); bool DismissExpandedPanel();
void DeletePage(size_t n);
void ClearPages();
void ShowPanels(bool show = true); void ShowPanels(bool show = true);
void HidePanels() { ShowPanels(false); } void HidePanels() { ShowPanels(false); }
bool ArePanelsShown() const { return m_arePanelsShown; } bool ArePanelsShown() const { return m_arePanelsShown; }

View File

@@ -206,6 +206,13 @@ public:
*/ */
wxRibbonPage* GetPage(int n); wxRibbonPage* GetPage(int n);
/**
Get the number of pages in this bar.
@since 2.9.4
*/
size_t GetPageCount() const;
/** /**
Dismiss the expanded panel of the currently active page. Dismiss the expanded panel of the currently active page.
@@ -214,6 +221,23 @@ public:
*/ */
bool DismissExpandedPanel(); bool DismissExpandedPanel();
/**
Delete a single page from this ribbon bar.
The user must call wxRibbonBar::Realize() after one (or more) calls to
this function.
@since 2.9.4
*/
void DeletePage(size_t n);
/**
Delete all pages from the ribbon bar.
@since 2.9.4
*/
void ClearPages();
/** /**
Shows or hides the panel area of the ribbon bar. Shows or hides the panel area of the ribbon bar.

View File

@@ -82,7 +82,8 @@ public:
ID_UI_CHECK_UPDATED, ID_UI_CHECK_UPDATED,
ID_CHANGE_TEXT1, ID_CHANGE_TEXT1,
ID_CHANGE_TEXT2, ID_CHANGE_TEXT2,
ID_UI_CHANGE_TEXT_UPDATED ID_UI_CHANGE_TEXT_UPDATED,
ID_REMOVE_PAGE
}; };
void OnEnableUpdateUI(wxUpdateUIEvent& evt); void OnEnableUpdateUI(wxUpdateUIEvent& evt);
@@ -127,7 +128,7 @@ public:
void OnPositionLeftIcons(wxCommandEvent& evt); void OnPositionLeftIcons(wxCommandEvent& evt);
void OnPositionLeftBoth(wxCommandEvent& evt); void OnPositionLeftBoth(wxCommandEvent& evt);
void OnPositionLeftDropdown(wxRibbonToolBarEvent& evt); void OnPositionLeftDropdown(wxRibbonToolBarEvent& evt);
void OnRemovePage(wxRibbonButtonBarEvent& evt);
void OnTogglePanels(wxCommandEvent& evt); void OnTogglePanels(wxCommandEvent& evt);
void OnExtButton(wxRibbonPanelEvent& evt); void OnExtButton(wxRibbonPanelEvent& evt);
@@ -226,6 +227,7 @@ EVT_MENU(ID_POSITION_TOP_ICONS, MyFrame::OnPositionTopIcons)
EVT_MENU(ID_POSITION_TOP_BOTH, MyFrame::OnPositionTopBoth) EVT_MENU(ID_POSITION_TOP_BOTH, MyFrame::OnPositionTopBoth)
EVT_TOGGLEBUTTON(ID_TOGGLE_PANELS, MyFrame::OnTogglePanels) EVT_TOGGLEBUTTON(ID_TOGGLE_PANELS, MyFrame::OnTogglePanels)
EVT_RIBBONPANEL_EXTBUTTON_ACTIVATED(wxID_ANY, MyFrame::OnExtButton) EVT_RIBBONPANEL_EXTBUTTON_ACTIVATED(wxID_ANY, MyFrame::OnExtButton)
EVT_RIBBONBUTTONBAR_CLICKED(ID_REMOVE_PAGE, MyFrame::OnRemovePage)
END_EVENT_TABLE() END_EVENT_TABLE()
#include "align_center.xpm" #include "align_center.xpm"
@@ -386,7 +388,12 @@ MyFrame::MyFrame()
bar->AddButton(ID_UI_CHANGE_TEXT_UPDATED, wxT("Zero"), ribbon_xpm); bar->AddButton(ID_UI_CHANGE_TEXT_UPDATED, wxT("Zero"), ribbon_xpm);
} }
new wxRibbonPage(m_ribbon, wxID_ANY, wxT("Empty Page"), empty_xpm); new wxRibbonPage(m_ribbon, wxID_ANY, wxT("Empty Page"), empty_xpm);
new wxRibbonPage(m_ribbon, wxID_ANY, wxT("Another Page"), empty_xpm); {
wxRibbonPage* page = new wxRibbonPage(m_ribbon, wxID_ANY, wxT("Another Page"), empty_xpm);
wxRibbonPanel *panel = new wxRibbonPanel(page, wxID_ANY, wxT("Page manipulation"), ribbon_xpm);
wxRibbonButtonBar *bar = new wxRibbonButtonBar(panel, wxID_ANY);
bar->AddButton(ID_REMOVE_PAGE, wxT("Remove"), wxArtProvider::GetBitmap(wxART_DELETE, wxART_OTHER, wxSize(24, 24)));
}
m_ribbon->Realize(); m_ribbon->Realize();
@@ -967,3 +974,13 @@ void MyFrame::SetArtProvider(wxRibbonArtProvider *prov)
m_ribbon->Thaw(); m_ribbon->Thaw();
GetSizer()->Layout(); GetSizer()->Layout();
} }
void MyFrame::OnRemovePage(wxRibbonButtonBarEvent& WXUNUSED(evt))
{
size_t n = m_ribbon->GetPageCount();
if(n > 0)
{
m_ribbon->DeletePage(n-1);
m_ribbon->Realize();
}
}

View File

@@ -20,6 +20,7 @@
#include "wx/ribbon/bar.h" #include "wx/ribbon/bar.h"
#include "wx/ribbon/art.h" #include "wx/ribbon/art.h"
#include "wx/dcbuffer.h" #include "wx/dcbuffer.h"
#include "wx/app.h"
#ifndef WX_PRECOMP #ifndef WX_PRECOMP
#endif #endif
@@ -275,6 +276,72 @@ wxRibbonPage* wxRibbonBar::GetPage(int n)
return m_pages.Item(n).page; return m_pages.Item(n).page;
} }
size_t wxRibbonBar::GetPageCount() const
{
return m_pages.GetCount();
}
void wxRibbonBar::DeletePage(size_t n)
{
if(n < m_pages.GetCount())
{
wxRibbonPage *page = m_pages.Item(n).page;
// Schedule page object for destruction and not destroying directly
// as this function can be called in an event handler and page functions
// can be called afeter removing.
// Like in wxRibbonButtonBar::OnMouseUp
if(!wxTheApp->IsScheduledForDestruction(page))
{
wxTheApp->ScheduleForDestruction(page);
}
m_pages.RemoveAt(n);
if(m_current_page == static_cast<int>(n))
{
m_current_page = -1;
if(m_pages.GetCount() > 0)
{
if(n >= m_pages.GetCount())
{
SetActivePage(m_pages.GetCount() - 1);
}
else
{
SetActivePage(n - 1);
}
}
}
else if(m_current_page > static_cast<int>(n))
{
m_current_page--;
}
}
}
void wxRibbonBar::ClearPages()
{
size_t i;
for(i=0; i<m_pages.GetCount(); i++)
{
wxRibbonPage *page = m_pages.Item(i).page;
// Schedule page object for destruction and not destroying directly
// as this function can be called in an event handler and page functions
// can be called afeter removing.
// Like in wxRibbonButtonBar::OnMouseUp
if(!wxTheApp->IsScheduledForDestruction(page))
{
wxTheApp->ScheduleForDestruction(page);
}
}
m_pages.Empty();
Realize();
m_current_page = -1;
Refresh();
}
bool wxRibbonBar::SetActivePage(size_t page) bool wxRibbonBar::SetActivePage(size_t page)
{ {
if(m_current_page == (int)page) if(m_current_page == (int)page)