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:
@@ -13,8 +13,70 @@
|
||||
#ifndef _WX_TOGGLEBUTTON_H_
|
||||
#define _WX_TOGGLEBUTTON_H_
|
||||
|
||||
#include "wx/bitmap.h"
|
||||
|
||||
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)
|
||||
class WXDLLIMPEXP_CORE wxToggleButton : public wxToggleButtonBase
|
||||
{
|
||||
|
@@ -38,6 +38,9 @@
|
||||
#include "wx/log.h"
|
||||
#endif // WX_PRECOMP
|
||||
|
||||
#include "wx/renderer.h"
|
||||
#include "wx/dcclient.h"
|
||||
|
||||
#include "wx/msw/private.h"
|
||||
#include "wx/msw/private/button.h"
|
||||
|
||||
@@ -45,17 +48,209 @@
|
||||
// macros
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxToggleButton, wxControl)
|
||||
DEFINE_EVENT_TYPE(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED)
|
||||
|
||||
// ============================================================================
|
||||
// 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
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxToggleButton, wxControl)
|
||||
|
||||
// Single check box item
|
||||
bool wxToggleButton::Create(wxWindow *parent,
|
||||
wxWindowID id,
|
||||
|
Reference in New Issue
Block a user