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:
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -245,9 +245,15 @@ 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
|
||||||
wxSizerFlags().Centre().DoubleBorder());
|
if ( sizer->Detach(m_button) )
|
||||||
|
{
|
||||||
|
m_button->Hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
sizer->Add(new wxButton(this, btnid, label),
|
||||||
|
wxSizerFlags().Centre().DoubleBorder());
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxInfoBarGeneric::RemoveButton(wxWindowID btnid)
|
void wxInfoBarGeneric::RemoveButton(wxWindowID btnid)
|
||||||
@@ -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))
|
||||||
|
@@ -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,10 +204,31 @@ 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" );
|
||||||
m_impl->m_buttons.push_back(wxInfoBarGTKImpl::Button(button, btnid));
|
|
||||||
|
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));
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxInfoBar::RemoveButton(wxWindowID btnid)
|
void wxInfoBar::RemoveButton(wxWindowID 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user