Only show the default close button in wxInfoBar if there are no others.

Assume that user-added buttons can be already used to close the message so
don't show the default close button if any were added.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62280 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2009-10-05 22:55:40 +00:00
parent c0945eb234
commit 6a3f8b4f1f
5 changed files with 74 additions and 18 deletions

View File

@@ -57,6 +57,10 @@ protected:
private: private:
void Init() { m_impl = NULL; } void Init() { m_impl = NULL; }
// add a button with the given id/label and return its widget
GtkWidget *GTKAddButton(wxWindowID btnid,
const wxString& label = wxString());
// only used when the native implementation is really being used // only used when the native implementation is really being used
class wxInfoBarGTKImpl *m_impl; class wxInfoBarGTKImpl *m_impl;

View File

@@ -36,7 +36,8 @@ public:
virtual void ShowMessage(const wxString& msg, virtual void ShowMessage(const wxString& msg,
int flags = wxICON_INFORMATION) = 0; int flags = wxICON_INFORMATION) = 0;
// add an extra button to the bar, near the message // add an extra button to the bar, near the message (replacing the default
// close button which is only shown if no extra buttons are used)
virtual void AddButton(wxWindowID btnid, virtual void AddButton(wxWindowID btnid,
const wxString& label = wxString()) = 0; const wxString& label = wxString()) = 0;

View File

@@ -114,7 +114,9 @@ public:
The button added by this method will be shown to the right of the text The button added by this method will be shown to the right of the text
(in LTR layout), with each successive button being added to the right (in LTR layout), with each successive button being added to the right
of the previous one. of the previous one. If any buttons are added to the info bar using
this method, the default "Close" button is not shown as it is assumed
that the extra buttons already allow the user to close it.
Clicking the button will generate a normal EVT_COMMAND_BUTTON_CLICKED Clicking the button will generate a normal EVT_COMMAND_BUTTON_CLICKED
event which can be handled as usual. The default handler in wxInfoBar event which can be handled as usual. The default handler in wxInfoBar

View File

@@ -245,8 +245,14 @@ void wxInfoBarGeneric::AddButton(wxWindowID btnid, const wxString& label)
wxSizer * const sizer = GetSizer(); wxSizer * const sizer = GetSizer();
wxCHECK_RET( sizer, "must be created first" ); wxCHECK_RET( sizer, "must be created first" );
sizer->Insert(sizer->GetItemCount() - 1, // user-added buttons replace the standard close button so remove it if we
new wxButton(this, btnid, label), // hadn't done it yet
if ( sizer->Detach(m_button) )
{
m_button->Hide();
}
sizer->Add(new wxButton(this, btnid, label),
wxSizerFlags().Centre().DoubleBorder()); wxSizerFlags().Centre().DoubleBorder());
} }
@@ -263,7 +269,6 @@ void wxInfoBarGeneric::RemoveButton(wxWindowID btnid)
node != items.GetFirst(); node != items.GetFirst();
node = node->GetPrevious() ) node = node->GetPrevious() )
{ {
node = node->GetPrevious();
const wxSizerItem * const item = node->GetData(); const wxSizerItem * const item = node->GetData();
// if we reached the spacer separating the buttons from the text // if we reached the spacer separating the buttons from the text
@@ -282,6 +287,15 @@ void wxInfoBarGeneric::RemoveButton(wxWindowID btnid)
break; break;
} }
} }
// check if there are any custom buttons left
if ( sizer->GetChildren().GetLast()->GetData()->IsSpacer() )
{
// if the last item is the spacer, none are left so restore the
// standard close button
sizer->Add(m_button, wxSizerFlags().Centre().DoubleBorder());
m_button->Show();
}
} }
void wxInfoBarGeneric::OnButton(wxCommandEvent& WXUNUSED(event)) void wxInfoBarGeneric::OnButton(wxCommandEvent& WXUNUSED(event))

View File

@@ -45,10 +45,17 @@ public:
wxInfoBarGTKImpl() wxInfoBarGTKImpl()
{ {
m_label = NULL; m_label = NULL;
m_close = NULL;
} }
// label for the text shown in the bar
GtkWidget *m_label; GtkWidget *m_label;
// the default close button, NULL if not needed (m_buttons is not empty) or
// not created yet
GtkWidget *m_close;
// information about the buttons added using AddButton()
struct Button struct Button
{ {
Button(GtkWidget *button_, int id_) Button(GtkWidget *button_, int id_)
@@ -152,6 +159,13 @@ void wxInfoBar::ShowMessage(const wxString& msg, int flags)
return; return;
} }
// if we don't have any buttons, create a standard close one to give the
// user at least some way to close the bar
if ( m_impl->m_buttons.empty() && !m_impl->m_close )
{
m_impl->m_close = GTKAddButton(wxID_CLOSE);
}
GtkMessageType type; GtkMessageType type;
if ( wxGTKImpl::ConvertMessageTypeFromWX(flags, &type) ) if ( wxGTKImpl::ConvertMessageTypeFromWX(flags, &type) )
gtk_info_bar_set_message_type(GTK_INFO_BAR(m_widget), type); gtk_info_bar_set_message_type(GTK_INFO_BAR(m_widget), type);
@@ -176,13 +190,11 @@ void wxInfoBar::GTKResponse(int btnid)
} }
} }
void wxInfoBar::AddButton(wxWindowID btnid, const wxString& label) GtkWidget *wxInfoBar::GTKAddButton(wxWindowID btnid, const wxString& label)
{ {
if ( !UseNative() ) // as GTK+ lays out the buttons vertically, adding another button changes
{ // our best size (at least in vertical direction)
wxInfoBarGeneric::AddButton(btnid, label); InvalidateBestSize();
return;
}
GtkWidget *button = gtk_info_bar_add_button GtkWidget *button = gtk_info_bar_add_button
( (
@@ -192,9 +204,30 @@ void wxInfoBar::AddButton(wxWindowID btnid, const wxString& label)
: label, : label,
btnid btnid
); );
wxCHECK_RET( button, "unexpectedly failed to add button to info bar" );
g_object_ref(button); wxASSERT_MSG( button, "unexpectedly failed to add button to info bar" );
return button;
}
void wxInfoBar::AddButton(wxWindowID btnid, const wxString& label)
{
if ( !UseNative() )
{
wxInfoBarGeneric::AddButton(btnid, label);
return;
}
// if we had created the default close button before, remove it now that we
// have some user-defined button
if ( m_impl->m_close )
{
gtk_widget_destroy(m_impl->m_close);
m_impl->m_close = NULL;
}
GtkWidget * const button = GTKAddButton(btnid, label);
if ( button )
m_impl->m_buttons.push_back(wxInfoBarGTKImpl::Button(button, btnid)); m_impl->m_buttons.push_back(wxInfoBarGTKImpl::Button(button, btnid));
} }
@@ -212,10 +245,12 @@ void wxInfoBar::RemoveButton(wxWindowID btnid)
i != buttons.rend(); i != buttons.rend();
++i ) ++i )
{ {
GtkWidget * const button = i->button; gtk_widget_destroy(i->button);
buttons.erase(i.base()); buttons.erase(i.base());
gtk_widget_destroy(button);
g_object_unref(button); // see comment in GTKAddButton()
InvalidateBestSize();
return; return;
} }