From: Vadim Zeitlin Date: Mon, 5 Oct 2009 22:55:32 +0000 (+0000) Subject: Generate the button clicks in GTK version of wxInfoBar. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/c0945eb2343660c0510a0c7262d8429afc0dcb31 Generate the button clicks in GTK version of wxInfoBar. Also add an example of handling info bar buttons events to the sample and mention that this must be done using Connect() or by deriving from wxInfoBar in the documentation. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62279 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/interface/wx/infobar.h b/interface/wx/infobar.h index 9f57867d3c..a59e1edea7 100644 --- a/interface/wx/infobar.h +++ b/interface/wx/infobar.h @@ -116,10 +116,20 @@ public: (in LTR layout), with each successive button being added to the right of the previous one. - Clicking the button will generate a normal event which can be handled - as usual. Notice that if you wish the info bar to be hidden when the - button is clicked, simply call @c event.Skip() in the button handler to - let the base class handler do it. + Clicking the button will generate a normal EVT_COMMAND_BUTTON_CLICKED + event which can be handled as usual. The default handler in wxInfoBar + itself closes the window whenever a button in it is clicked so if you + wish the info bar to be hidden when the button is clicked, simply call + @c event.Skip() in the button handler to let the base class handler do + it. On the other hand, if you don't skip the event, the info bar will + remain opened so make sure to do it for at least some buttons to allow + the user to close it. + + Notice that the generic wxInfoBar implementation handles the button + events itself and so they are not propagated to the info bar parent and + you need to either inherit from wxInfoBar and handle them in your + derived class or use wxEvtHandler::Connect(), as is done in the dialogs + sample, to handle the button events in the parent frame. @param btnid Id of the button. It will be used in the button message clicking diff --git a/samples/dialogs/dialogs.cpp b/samples/dialogs/dialogs.cpp index 1558b54a25..0319bb4541 100644 --- a/samples/dialogs/dialogs.cpp +++ b/samples/dialogs/dialogs.cpp @@ -528,21 +528,33 @@ MyFrame::MyFrame(const wxString& title) // an info bar can be created very simply and used without any extra effort m_infoBarSimple = new wxInfoBar(this); - // or it can also be customized + // or it can also be customized by m_infoBarAdvanced = new wxInfoBar(this); + + // ... adding extra buttons (but more than two will usually be too many) m_infoBarAdvanced->AddButton(wxID_UNDO); m_infoBarAdvanced->AddButton(wxID_REDO); + m_infoBarAdvanced->Connect(wxID_REDO, wxEVT_COMMAND_BUTTON_CLICKED, + wxCommandEventHandler(MyFrame::OnInfoBarRedo), + NULL, + this); + // adding and removing a button immediately doesn't make sense here, of // course, it's done just to show that it is possible m_infoBarAdvanced->AddButton(wxID_EXIT); m_infoBarAdvanced->RemoveButton(wxID_EXIT); + // ... changing the colours and/or fonts m_infoBarAdvanced->SetOwnBackgroundColour(0xc8ffff); + m_infoBarAdvanced->SetFont(GetFont().Bold().Larger()); + + // ... and changing the effect (only does anything under MSW currently) m_infoBarAdvanced->SetShowHideEffects(wxSHOW_EFFECT_EXPAND, wxSHOW_EFFECT_EXPAND); m_infoBarAdvanced->SetEffectDuration(1500); + // to use the info bars we need to use sizer for the window layout wxBoxSizer * const sizer = new wxBoxSizer(wxVERTICAL); sizer->Add(m_infoBarSimple, wxSizerFlags().Expand()); @@ -709,6 +721,11 @@ void MyFrame::InfoBarAdvanced(wxCommandEvent& WXUNUSED(event)) m_infoBarAdvanced->ShowMessage("Sorry, it didn't work out.", wxICON_WARNING); } +void MyFrame::OnInfoBarRedo(wxCommandEvent& WXUNUSED(event)) +{ + m_infoBarAdvanced->ShowMessage("Still no, sorry again.", wxICON_ERROR); +} + #endif // wxUSE_INFOBAR diff --git a/samples/dialogs/dialogs.h b/samples/dialogs/dialogs.h index 57a7105b43..fc11ed657a 100644 --- a/samples/dialogs/dialogs.h +++ b/samples/dialogs/dialogs.h @@ -429,6 +429,8 @@ private: wxWindow *m_canvas; #if wxUSE_INFOBAR + void OnInfoBarRedo(wxCommandEvent& event); + wxInfoBar *m_infoBarSimple, *m_infoBarAdvanced; #endif // wxUSE_INFOBAR diff --git a/src/gtk/infobar.cpp b/src/gtk/infobar.cpp index 53d075d04b..237b99a9f0 100644 --- a/src/gtk/infobar.cpp +++ b/src/gtk/infobar.cpp @@ -163,11 +163,17 @@ void wxInfoBar::ShowMessage(const wxString& msg, int flags) UpdateParent(); } -void wxInfoBar::GTKResponse(int WXUNUSED(btnid)) +void wxInfoBar::GTKResponse(int btnid) { - Hide(); + wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, btnid); + event.SetEventObject(this); - UpdateParent(); + if ( !HandleWindowEvent(event) ) + { + Hide(); + + UpdateParent(); + } } void wxInfoBar::AddButton(wxWindowID btnid, const wxString& label)