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_
|
#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
|
||||||
{
|
{
|
||||||
|
@@ -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,
|
||||||
|
Reference in New Issue
Block a user