Implemented wxBitmapToggleButton generically for now

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57437 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2008-12-19 16:04:31 +00:00
parent dc61b49e6a
commit 76c13f8f22
2 changed files with 258 additions and 1 deletions

View File

@@ -13,8 +13,70 @@
#ifndef _WX_TOGGLEBUTTON_H_ #ifndef _WX_TOGGLEBUTTON_H_
#define _WX_TOGGLEBUTTON_H_ #define _WX_TOGGLEBUTTON_H_
#include "wx/bitmap.h"
extern WXDLLIMPEXP_DATA_CORE(const char) wxCheckBoxNameStr[]; extern WXDLLIMPEXP_DATA_CORE(const char) wxCheckBoxNameStr[];
//-----------------------------------------------------------------------------
// wxBitmapToggleButton
//-----------------------------------------------------------------------------
class WXDLLIMPEXP_CORE wxBitmapToggleButton: public wxToggleButtonBase
{
public:
// construction/destruction
wxBitmapToggleButton() { Init(); }
wxBitmapToggleButton(wxWindow *parent,
wxWindowID id,
const wxBitmap& label,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxCheckBoxNameStr)
{
Create(parent, id, label, pos, size, style, validator, name);
}
// Create the control
bool Create(wxWindow *parent,
wxWindowID id,
const wxBitmap& label,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, long style = 0,
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxCheckBoxNameStr);
// Get/set the value
void SetValue(bool state);
bool GetValue() const;
// Set the label
virtual void SetLabel(const wxString& label) { wxControl::SetLabel(label); }
virtual void SetLabel(const wxBitmap& label);
bool Enable(bool enable = TRUE);
protected:
void Init();
wxBitmap m_bitmap;
wxBitmap m_disabledBitmap;
bool m_capturing;
bool m_depressed,m_oldValue;
void OnPaint(wxPaintEvent &event);
void OnMouse(wxMouseEvent &event);
void OnChar(wxKeyEvent &event);
void OnSize(wxSizeEvent &event);
virtual wxSize DoGetBestSize() const;
private:
DECLARE_EVENT_TABLE()
DECLARE_DYNAMIC_CLASS(wxBitmapToggleButton)
};
// Checkbox item (single checkbox) // Checkbox item (single checkbox)
class WXDLLIMPEXP_CORE wxToggleButton : public wxToggleButtonBase class WXDLLIMPEXP_CORE wxToggleButton : public wxToggleButtonBase
{ {

View File

@@ -38,6 +38,9 @@
#include "wx/log.h" #include "wx/log.h"
#endif // WX_PRECOMP #endif // WX_PRECOMP
#include "wx/renderer.h"
#include "wx/dcclient.h"
#include "wx/msw/private.h" #include "wx/msw/private.h"
#include "wx/msw/private/button.h" #include "wx/msw/private/button.h"
@@ -45,17 +48,209 @@
// macros // macros
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
IMPLEMENT_DYNAMIC_CLASS(wxToggleButton, wxControl)
DEFINE_EVENT_TYPE(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED) DEFINE_EVENT_TYPE(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED)
// ============================================================================ // ============================================================================
// implementation // implementation
// ============================================================================ // ============================================================================
//-----------------------------------------------------------------------------
// wxBitmapToggleButton
//-----------------------------------------------------------------------------
IMPLEMENT_DYNAMIC_CLASS(wxBitmapToggleButton, wxControl)
BEGIN_EVENT_TABLE(wxBitmapToggleButton,wxToggleButtonBase)
EVT_PAINT(wxBitmapToggleButton::OnPaint)
EVT_MOUSE_EVENTS(wxBitmapToggleButton::OnMouse)
EVT_CHAR(wxBitmapToggleButton::OnChar)
EVT_SIZE(wxBitmapToggleButton::OnSize)
END_EVENT_TABLE();
void wxBitmapToggleButton::Init()
{
m_depressed = false;
m_oldValue = false;
m_capturing = false;
}
bool wxBitmapToggleButton::Create( wxWindow *parent, wxWindowID id,
const wxBitmap& label,const wxPoint& pos, const wxSize& size, long style,
const wxValidator& validator, const wxString& name )
{
Init();
if (!wxToggleButtonBase::Create( parent, id, pos, size, style, validator, name ))
return false;
m_bitmap = label;
if (size.x == -1 || size.y == -1)
{
wxSize new_size = GetBestSize();
if (size.x != -1)
new_size.x = size.x;
if (size.y != -1)
new_size.y = size.y;
SetSize( new_size );
}
return true;
}
void wxBitmapToggleButton::SetValue(bool state)
{
if (m_capturing) return;
if (state == m_depressed) return;
m_depressed = state;
Refresh();
}
bool wxBitmapToggleButton::GetValue() const
{
return m_depressed;
}
void wxBitmapToggleButton::SetLabel(const wxBitmap& label)
{
m_bitmap = label;
m_disabledBitmap = wxBitmap();
Refresh();
}
bool wxBitmapToggleButton::Enable(bool enable)
{
if (m_capturing) return false;
if (!wxToggleButtonBase::Enable( enable ))
return false;
Refresh();
return true;
}
void wxBitmapToggleButton::OnPaint(wxPaintEvent &WXUNUSED(event))
{
wxSize size = GetSize();
wxBitmap bitmap = m_bitmap;
wxPaintDC dc(this);
wxRendererNative &renderer = wxRendererNative::Get();
int flags = 0;
if (m_depressed)
flags |= wxCONTROL_PRESSED;
wxRect rect(0,0,size.x,size.y);
renderer.DrawPushButton( this, dc, rect, flags );
if (bitmap.IsOk())
{
if (!IsEnabled())
{
if (!m_disabledBitmap.IsOk())
{
wxImage image = m_bitmap.ConvertToImage();
m_disabledBitmap = wxBitmap( image.ConvertToGreyscale() );
}
bitmap = m_disabledBitmap;
}
wxSize bsize = bitmap.GetSize();
int offset = 0;
if (m_depressed) offset = 1;
dc.DrawBitmap( bitmap, (size.x-bsize.x) / 2 + offset, (size.y-bsize.y) / 2 + offset, true );
}
}
void wxBitmapToggleButton::OnMouse(wxMouseEvent &event)
{
if (!IsEnabled())
return;
wxSize size = GetSize();
bool mouse_in = ((event.GetX() > 0) && (event.GetX() < size.x) &&
(event.GetY() > 0) && (event.GetY() < size.y));
if (m_capturing)
{
bool old_depressed = m_depressed;
if (mouse_in)
m_depressed = !m_oldValue;
else
m_depressed = m_oldValue;
if (event.LeftUp())
{
ReleaseCapture();
m_capturing = false;
if (mouse_in)
{
wxCommandEvent event(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, m_windowId);
event.SetInt(GetValue());
event.SetEventObject(this);
ProcessCommand(event);
}
}
if (old_depressed != m_depressed)
Refresh();
}
else
{
if (event.LeftDown())
{
m_capturing = true;
m_oldValue = m_depressed;
m_depressed = !m_oldValue;
CaptureMouse();
Refresh();
}
}
}
void wxBitmapToggleButton::OnChar(wxKeyEvent &event)
{
if (event.GetKeyCode() == WXK_SPACE)
{
m_depressed = !m_depressed;
Refresh();
wxCommandEvent event(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, m_windowId);
event.SetInt(GetValue());
event.SetEventObject(this);
ProcessCommand(event);
}
}
void wxBitmapToggleButton::OnSize(wxSizeEvent &WXUNUSED(event))
{
Refresh();
}
wxSize wxBitmapToggleButton::DoGetBestSize() const
{
if (!m_bitmap.IsOk())
return wxSize(16,16);
wxSize ret = m_bitmap.GetSize();
ret.x += 8;
ret.y += 8;
return ret;
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// wxToggleButton // wxToggleButton
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
IMPLEMENT_DYNAMIC_CLASS(wxToggleButton, wxControl)
// Single check box item // Single check box item
bool wxToggleButton::Create(wxWindow *parent, bool wxToggleButton::Create(wxWindow *parent,
wxWindowID id, wxWindowID id,