Extract "Close" button creation from wxInfoBarGeneric into new function.

Such buttons may be needed in other places and it's not obvious to create
them, so add a new public wxBitmapButton::NewCloseButton() method to allow
creating them easily.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72474 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2012-09-13 17:14:14 +00:00
parent be682205c1
commit be7a086c0c
5 changed files with 92 additions and 54 deletions

View File

@@ -547,6 +547,7 @@ All (GUI):
- Add expand/collapse button to wxRibbonBar (rakeshthp). - Add expand/collapse button to wxRibbonBar (rakeshthp).
- Fix item data access in wxDataViewListCtrl (Kry). - Fix item data access in wxDataViewListCtrl (Kry).
- Fix problem with floating maximized AUI panes (Laurent Poujoulat). - Fix problem with floating maximized AUI panes (Laurent Poujoulat).
- Add wxBitmapButton::NewCloseButton().
wxGTK: wxGTK:

View File

@@ -25,6 +25,8 @@
#define wxHAS_BUTTON_BITMAP #define wxHAS_BUTTON_BITMAP
#endif #endif
class WXDLLIMPEXP_FWD_CORE wxBitmapButton;
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// wxBitmapButton: a button which shows bitmaps instead of the usual string. // wxBitmapButton: a button which shows bitmaps instead of the usual string.
// It has different bitmaps for different states (focused/disabled/pressed) // It has different bitmaps for different states (focused/disabled/pressed)
@@ -64,6 +66,12 @@ public:
validator, name); validator, name);
} }
// Special creation function for a standard "Close" bitmap. It allows to
// simply create a close button with the image appropriate for the common
// platform.
static wxBitmapButton* NewCloseButton(wxWindow* parent, wxWindowID winid);
// set/get the margins around the button // set/get the margins around the button
virtual void SetMargins(int x, int y) virtual void SetMargins(int x, int y)
{ {

View File

@@ -99,5 +99,21 @@ public:
long style = wxBU_AUTODRAW, long style = wxBU_AUTODRAW,
const wxValidator& validator = wxDefaultValidator, const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxButtonNameStr); const wxString& name = wxButtonNameStr);
/**
Helper function creating a standard-looking "Close" button.
To get the best results, platform-specific code may need to be used to
create a small, title bar-like "Close" button. This function is
provided to avoid the need to test for the current platform and creates
the button with as native look as possible.
@param parent The button parent window, must be non-@NULL.
@param winid The identifier for the new button.
@return The new button.
@since 2.9.5
*/
static wxBitmapButton* NewCloseButton(wxWindow* parent, wxWindowID winid);
}; };

View File

@@ -26,6 +26,9 @@
#include "wx/image.h" #include "wx/image.h"
#endif #endif
#include "wx/artprov.h"
#include "wx/renderer.h"
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// XTI // XTI
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -90,4 +93,67 @@ bitmap "focus" ,
bitmap "disabled" , bitmap "disabled" ,
*/ */
namespace
{
#ifdef wxHAS_DRAW_TITLE_BAR_BITMAP
wxBitmap
GetCloseButtonBitmap(wxWindow *win,
const wxSize& size,
const wxColour& colBg,
int flags = 0)
{
wxBitmap bmp(size);
wxMemoryDC dc(bmp);
dc.SetBackground(colBg);
dc.Clear();
wxRendererNative::Get().
DrawTitleBarBitmap(win, dc, size, wxTITLEBAR_BUTTON_CLOSE, flags);
return bmp;
}
#endif // wxHAS_DRAW_TITLE_BAR_BITMAP
} // anonymous namespace
/* static */
wxBitmapButton*
wxBitmapButtonBase::NewCloseButton(wxWindow* parent, wxWindowID winid)
{
wxCHECK_MSG( parent, NULL, wxS("Must have a valid parent") );
const wxColour colBg = parent->GetBackgroundColour();
#ifdef wxHAS_DRAW_TITLE_BAR_BITMAP
const wxSize sizeBmp = wxArtProvider::GetSizeHint(wxART_BUTTON);
wxBitmap bmp = GetCloseButtonBitmap(parent, sizeBmp, colBg);
#else // !wxHAS_DRAW_TITLE_BAR_BITMAP
wxBitmap bmp = wxArtProvider::GetBitmap(wxART_CLOSE, wxART_BUTTON);
#endif // wxHAS_DRAW_TITLE_BAR_BITMAP
wxBitmapButton* const button = new wxBitmapButton
(
parent,
winid,
bmp,
wxDefaultPosition,
wxDefaultSize,
wxBORDER_NONE
);
#ifdef wxHAS_DRAW_TITLE_BAR_BITMAP
button->SetBitmapPressed(
GetCloseButtonBitmap(parent, sizeBmp, colBg, wxCONTROL_PRESSED));
button->SetBitmapCurrent(
GetCloseButtonBitmap(parent, sizeBmp, colBg, wxCONTROL_CURRENT));
#endif // wxHAS_DRAW_TITLE_BAR_BITMAP
// The button should blend with its parent background.
button->SetBackgroundColour(colBg);
return button;
}
#endif // wxUSE_BMPBUTTON #endif // wxUSE_BMPBUTTON

View File

@@ -38,41 +38,12 @@
#endif // WX_PRECOMP #endif // WX_PRECOMP
#include "wx/artprov.h" #include "wx/artprov.h"
#include "wx/renderer.h"
#include "wx/scopeguard.h" #include "wx/scopeguard.h"
BEGIN_EVENT_TABLE(wxInfoBarGeneric, wxInfoBarBase) BEGIN_EVENT_TABLE(wxInfoBarGeneric, wxInfoBarBase)
EVT_BUTTON(wxID_ANY, wxInfoBarGeneric::OnButton) EVT_BUTTON(wxID_ANY, wxInfoBarGeneric::OnButton)
END_EVENT_TABLE() END_EVENT_TABLE()
// ----------------------------------------------------------------------------
// local helpers
// ----------------------------------------------------------------------------
namespace
{
#ifdef wxHAS_DRAW_TITLE_BAR_BITMAP
wxBitmap
GetCloseButtonBitmap(wxWindow *win,
const wxSize& size,
const wxColour& colBg,
int flags = 0)
{
wxBitmap bmp(size);
wxMemoryDC dc(bmp);
dc.SetBackground(colBg);
dc.Clear();
wxRendererNative::Get().
DrawTitleBarBitmap(win, dc, size, wxTITLEBAR_BUTTON_CLOSE, flags);
return bmp;
}
#endif // wxHAS_DRAW_TITLE_BAR_BITMAP
} // anonymous namespace
// ============================================================================ // ============================================================================
// implementation // implementation
// ============================================================================ // ============================================================================
@@ -111,31 +82,7 @@ bool wxInfoBarGeneric::Create(wxWindow *parent, wxWindowID winid)
m_text = new wxStaticText(this, wxID_ANY, ""); m_text = new wxStaticText(this, wxID_ANY, "");
#ifdef wxHAS_DRAW_TITLE_BAR_BITMAP m_button = wxBitmapButton::NewCloseButton(parent, wxID_ANY);
const wxSize sizeBmp = wxArtProvider::GetSizeHint(wxART_BUTTON);
wxBitmap bmp = GetCloseButtonBitmap(this, sizeBmp, colBg);
#else // !wxHAS_DRAW_TITLE_BAR_BITMAP
wxBitmap bmp = wxArtProvider::GetBitmap(wxART_CLOSE, wxART_BUTTON);
#endif // wxHAS_DRAW_TITLE_BAR_BITMAP
m_button = new wxBitmapButton
(
this,
wxID_ANY,
bmp,
wxDefaultPosition,
wxDefaultSize,
wxBORDER_NONE
);
#ifdef wxHAS_DRAW_TITLE_BAR_BITMAP
m_button->SetBitmapPressed(
GetCloseButtonBitmap(this, sizeBmp, colBg, wxCONTROL_PRESSED));
m_button->SetBitmapCurrent(
GetCloseButtonBitmap(this, sizeBmp, colBg, wxCONTROL_CURRENT));
#endif // wxHAS_DRAW_TITLE_BAR_BITMAP
m_button->SetBackgroundColour(colBg);
m_button->SetToolTip(_("Hide this notification message.")); m_button->SetToolTip(_("Hide this notification message."));
// center the text inside the sizer with an icon to the left of it and a // center the text inside the sizer with an icon to the left of it and a