Added wxToggleBitmapButton (it compiles).
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26131 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
8471ea9033
commit
4f85606724
@ -13,11 +13,14 @@
|
||||
#ifndef _WX_GTK_TOGGLEBUTTON_H_
|
||||
#define _WX_GTK_TOGGLEBUTTON_H_
|
||||
|
||||
#include "wx/bitmap.h"
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// classes
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
class wxToggleButton;
|
||||
class wxToggleBitmapButton;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// global data
|
||||
@ -25,6 +28,59 @@ class wxToggleButton;
|
||||
|
||||
extern const wxChar *wxCheckBoxNameStr;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxToggleBitmapButton
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
class wxToggleBitmapButton: public wxControl
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
wxToggleBitmapButton() {}
|
||||
wxToggleBitmapButton(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
|
||||
void SetLabel(const wxBitmap& label);
|
||||
bool Enable(bool enable = TRUE);
|
||||
|
||||
|
||||
// implementation
|
||||
bool m_blockEvent;
|
||||
wxBitmap m_bitmap;
|
||||
|
||||
void OnSetBitmap();
|
||||
void ApplyWidgetStyle();
|
||||
bool IsOwnGtkWindow(GdkWindow *window);
|
||||
|
||||
virtual void OnInternalIdle();
|
||||
virtual wxSize DoGetBestSize() const;
|
||||
|
||||
private:
|
||||
DECLARE_DYNAMIC_CLASS(wxToggleBitmapButton)
|
||||
};
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxToggleButton
|
||||
//-----------------------------------------------------------------------------
|
||||
|
@ -13,11 +13,14 @@
|
||||
#ifndef _WX_GTK_TOGGLEBUTTON_H_
|
||||
#define _WX_GTK_TOGGLEBUTTON_H_
|
||||
|
||||
#include "wx/bitmap.h"
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// classes
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
class wxToggleButton;
|
||||
class wxToggleBitmapButton;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// global data
|
||||
@ -25,6 +28,59 @@ class wxToggleButton;
|
||||
|
||||
extern const wxChar *wxCheckBoxNameStr;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxToggleBitmapButton
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
class wxToggleBitmapButton: public wxControl
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
wxToggleBitmapButton() {}
|
||||
wxToggleBitmapButton(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
|
||||
void SetLabel(const wxBitmap& label);
|
||||
bool Enable(bool enable = TRUE);
|
||||
|
||||
|
||||
// implementation
|
||||
bool m_blockEvent;
|
||||
wxBitmap m_bitmap;
|
||||
|
||||
void OnSetBitmap();
|
||||
void ApplyWidgetStyle();
|
||||
bool IsOwnGtkWindow(GdkWindow *window);
|
||||
|
||||
virtual void OnInternalIdle();
|
||||
virtual wxSize DoGetBestSize() const;
|
||||
|
||||
private:
|
||||
DECLARE_DYNAMIC_CLASS(wxToggleBitmapButton)
|
||||
};
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxToggleButton
|
||||
//-----------------------------------------------------------------------------
|
||||
|
@ -43,9 +43,186 @@ static void gtk_togglebutton_clicked_callback(GtkWidget *WXUNUSED(widget), wxTog
|
||||
cb->GetEventHandler()->ProcessEvent(event);
|
||||
}
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxToggleButton, wxControl)
|
||||
DEFINE_EVENT_TYPE(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED)
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
// wxToggleBitmapButton
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxToggleBitmapButton, wxControl)
|
||||
|
||||
bool wxToggleBitmapButton::Create(wxWindow *parent, wxWindowID id,
|
||||
const wxBitmap &label, const wxPoint &pos,
|
||||
const wxSize &size, long style,
|
||||
const wxValidator& validator,
|
||||
const wxString &name)
|
||||
{
|
||||
m_needParent = TRUE;
|
||||
m_acceptsFocus = TRUE;
|
||||
|
||||
m_blockEvent = FALSE;
|
||||
|
||||
if (!PreCreation(parent, pos, size) ||
|
||||
!CreateBase(parent, id, pos, size, style, validator, name ))
|
||||
{
|
||||
wxFAIL_MSG(wxT("wxToggleBitmapButton creation failed"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
m_bitmap = label;
|
||||
|
||||
// Create the gtk widget.
|
||||
m_widget = gtk_toggle_button_new();
|
||||
|
||||
if (style & wxNO_BORDER)
|
||||
gtk_button_set_relief( GTK_BUTTON(m_widget), GTK_RELIEF_NONE );
|
||||
|
||||
if (m_bitmap.Ok())
|
||||
{
|
||||
wxSize newSize = size;
|
||||
int border = (style & wxNO_BORDER) ? 4 : 10;
|
||||
if (newSize.x == -1)
|
||||
newSize.x = m_bitmap.GetWidth()+border;
|
||||
if (newSize.y == -1)
|
||||
newSize.y = m_bitmap.GetHeight()+border;
|
||||
SetSize( newSize.x, newSize.y );
|
||||
OnSetBitmap();
|
||||
}
|
||||
|
||||
gtk_signal_connect(GTK_OBJECT(m_widget), "clicked",
|
||||
GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback),
|
||||
(gpointer *)this);
|
||||
|
||||
m_parent->DoAddChild(this);
|
||||
|
||||
PostCreation();
|
||||
InheritAttributes();
|
||||
|
||||
Show( TRUE );
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// void SetValue(bool state)
|
||||
// Set the value of the toggle button.
|
||||
void wxToggleBitmapButton::SetValue(bool state)
|
||||
{
|
||||
wxCHECK_RET(m_widget != NULL, wxT("invalid toggle button"));
|
||||
|
||||
if (state == GetValue())
|
||||
return;
|
||||
|
||||
m_blockEvent = TRUE;
|
||||
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_widget), state);
|
||||
|
||||
m_blockEvent = FALSE;
|
||||
}
|
||||
|
||||
// bool GetValue() const
|
||||
// Get the value of the toggle button.
|
||||
bool wxToggleBitmapButton::GetValue() const
|
||||
{
|
||||
wxCHECK_MSG(m_widget != NULL, FALSE, wxT("invalid toggle button"));
|
||||
|
||||
return GTK_TOGGLE_BUTTON(m_widget)->active;
|
||||
}
|
||||
|
||||
void wxToggleBitmapButton::SetLabel(const wxBitmap& label)
|
||||
{
|
||||
wxCHECK_RET(m_widget != NULL, wxT("invalid toggle button"));
|
||||
|
||||
m_bitmap = label;
|
||||
|
||||
OnSetBitmap();
|
||||
}
|
||||
|
||||
void wxToggleBitmapButton::OnSetBitmap()
|
||||
{
|
||||
if (!m_bitmap.Ok()) return;
|
||||
|
||||
GdkBitmap *mask = (GdkBitmap *) NULL;
|
||||
if (m_bitmap.GetMask()) mask = m_bitmap.GetMask()->GetBitmap();
|
||||
|
||||
GtkWidget *child = BUTTON_CHILD(m_widget);
|
||||
if (child == NULL)
|
||||
{
|
||||
// initial bitmap
|
||||
GtkWidget *pixmap = gtk_pixmap_new(m_bitmap.GetPixmap(), mask);
|
||||
gtk_widget_show(pixmap);
|
||||
gtk_container_add(GTK_CONTAINER(m_widget), pixmap);
|
||||
}
|
||||
else
|
||||
{ // subsequent bitmaps
|
||||
GtkPixmap *g_pixmap = GTK_PIXMAP(child);
|
||||
gtk_pixmap_set(g_pixmap, m_bitmap.GetPixmap(), mask);
|
||||
}
|
||||
}
|
||||
|
||||
bool wxToggleBitmapButton::Enable(bool enable /*=TRUE*/)
|
||||
{
|
||||
if (!wxControl::Enable(enable))
|
||||
return FALSE;
|
||||
|
||||
gtk_widget_set_sensitive(BUTTON_CHILD(m_widget), enable);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void wxToggleBitmapButton::ApplyWidgetStyle()
|
||||
{
|
||||
SetWidgetStyle();
|
||||
gtk_widget_set_style(m_widget, m_widgetStyle);
|
||||
gtk_widget_set_style(BUTTON_CHILD(m_widget), m_widgetStyle);
|
||||
}
|
||||
|
||||
bool wxToggleBitmapButton::IsOwnGtkWindow(GdkWindow *window)
|
||||
{
|
||||
return window == TOGGLE_BUTTON_EVENT_WIN(m_widget);
|
||||
}
|
||||
|
||||
void wxToggleBitmapButton::OnInternalIdle()
|
||||
{
|
||||
wxCursor cursor = m_cursor;
|
||||
|
||||
if (g_globalCursor.Ok())
|
||||
cursor = g_globalCursor;
|
||||
|
||||
GdkWindow *win = TOGGLE_BUTTON_EVENT_WIN(m_widget);
|
||||
if ( win && cursor.Ok() )
|
||||
{
|
||||
/* I now set the cursor the anew in every OnInternalIdle call
|
||||
as setting the cursor in a parent window also effects the
|
||||
windows above so that checking for the current cursor is
|
||||
not possible. */
|
||||
|
||||
gdk_window_set_cursor(win, cursor.GetCursor());
|
||||
}
|
||||
|
||||
if (wxUpdateUIEvent::CanUpdate(this))
|
||||
UpdateWindowUI(wxUPDATE_UI_FROMIDLE);
|
||||
}
|
||||
|
||||
// wxSize DoGetBestSize() const
|
||||
// Get the "best" size for this control.
|
||||
wxSize wxToggleBitmapButton::DoGetBestSize() const
|
||||
{
|
||||
wxSize ret(wxControl::DoGetBestSize());
|
||||
|
||||
if (!HasFlag(wxBU_EXACTFIT))
|
||||
{
|
||||
if (ret.x < 80) ret.x = 80;
|
||||
}
|
||||
|
||||
|
||||
return ret;
|
||||
}
|
||||
// ------------------------------------------------------------------------
|
||||
// wxToggleButton
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxToggleButton, wxControl)
|
||||
|
||||
bool wxToggleButton::Create(wxWindow *parent, wxWindowID id,
|
||||
const wxString &label, const wxPoint &pos,
|
||||
const wxSize &size, long style,
|
||||
|
@ -43,9 +43,186 @@ static void gtk_togglebutton_clicked_callback(GtkWidget *WXUNUSED(widget), wxTog
|
||||
cb->GetEventHandler()->ProcessEvent(event);
|
||||
}
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxToggleButton, wxControl)
|
||||
DEFINE_EVENT_TYPE(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED)
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
// wxToggleBitmapButton
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxToggleBitmapButton, wxControl)
|
||||
|
||||
bool wxToggleBitmapButton::Create(wxWindow *parent, wxWindowID id,
|
||||
const wxBitmap &label, const wxPoint &pos,
|
||||
const wxSize &size, long style,
|
||||
const wxValidator& validator,
|
||||
const wxString &name)
|
||||
{
|
||||
m_needParent = TRUE;
|
||||
m_acceptsFocus = TRUE;
|
||||
|
||||
m_blockEvent = FALSE;
|
||||
|
||||
if (!PreCreation(parent, pos, size) ||
|
||||
!CreateBase(parent, id, pos, size, style, validator, name ))
|
||||
{
|
||||
wxFAIL_MSG(wxT("wxToggleBitmapButton creation failed"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
m_bitmap = label;
|
||||
|
||||
// Create the gtk widget.
|
||||
m_widget = gtk_toggle_button_new();
|
||||
|
||||
if (style & wxNO_BORDER)
|
||||
gtk_button_set_relief( GTK_BUTTON(m_widget), GTK_RELIEF_NONE );
|
||||
|
||||
if (m_bitmap.Ok())
|
||||
{
|
||||
wxSize newSize = size;
|
||||
int border = (style & wxNO_BORDER) ? 4 : 10;
|
||||
if (newSize.x == -1)
|
||||
newSize.x = m_bitmap.GetWidth()+border;
|
||||
if (newSize.y == -1)
|
||||
newSize.y = m_bitmap.GetHeight()+border;
|
||||
SetSize( newSize.x, newSize.y );
|
||||
OnSetBitmap();
|
||||
}
|
||||
|
||||
gtk_signal_connect(GTK_OBJECT(m_widget), "clicked",
|
||||
GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback),
|
||||
(gpointer *)this);
|
||||
|
||||
m_parent->DoAddChild(this);
|
||||
|
||||
PostCreation();
|
||||
InheritAttributes();
|
||||
|
||||
Show( TRUE );
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// void SetValue(bool state)
|
||||
// Set the value of the toggle button.
|
||||
void wxToggleBitmapButton::SetValue(bool state)
|
||||
{
|
||||
wxCHECK_RET(m_widget != NULL, wxT("invalid toggle button"));
|
||||
|
||||
if (state == GetValue())
|
||||
return;
|
||||
|
||||
m_blockEvent = TRUE;
|
||||
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_widget), state);
|
||||
|
||||
m_blockEvent = FALSE;
|
||||
}
|
||||
|
||||
// bool GetValue() const
|
||||
// Get the value of the toggle button.
|
||||
bool wxToggleBitmapButton::GetValue() const
|
||||
{
|
||||
wxCHECK_MSG(m_widget != NULL, FALSE, wxT("invalid toggle button"));
|
||||
|
||||
return GTK_TOGGLE_BUTTON(m_widget)->active;
|
||||
}
|
||||
|
||||
void wxToggleBitmapButton::SetLabel(const wxBitmap& label)
|
||||
{
|
||||
wxCHECK_RET(m_widget != NULL, wxT("invalid toggle button"));
|
||||
|
||||
m_bitmap = label;
|
||||
|
||||
OnSetBitmap();
|
||||
}
|
||||
|
||||
void wxToggleBitmapButton::OnSetBitmap()
|
||||
{
|
||||
if (!m_bitmap.Ok()) return;
|
||||
|
||||
GdkBitmap *mask = (GdkBitmap *) NULL;
|
||||
if (m_bitmap.GetMask()) mask = m_bitmap.GetMask()->GetBitmap();
|
||||
|
||||
GtkWidget *child = BUTTON_CHILD(m_widget);
|
||||
if (child == NULL)
|
||||
{
|
||||
// initial bitmap
|
||||
GtkWidget *pixmap = gtk_pixmap_new(m_bitmap.GetPixmap(), mask);
|
||||
gtk_widget_show(pixmap);
|
||||
gtk_container_add(GTK_CONTAINER(m_widget), pixmap);
|
||||
}
|
||||
else
|
||||
{ // subsequent bitmaps
|
||||
GtkPixmap *g_pixmap = GTK_PIXMAP(child);
|
||||
gtk_pixmap_set(g_pixmap, m_bitmap.GetPixmap(), mask);
|
||||
}
|
||||
}
|
||||
|
||||
bool wxToggleBitmapButton::Enable(bool enable /*=TRUE*/)
|
||||
{
|
||||
if (!wxControl::Enable(enable))
|
||||
return FALSE;
|
||||
|
||||
gtk_widget_set_sensitive(BUTTON_CHILD(m_widget), enable);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void wxToggleBitmapButton::ApplyWidgetStyle()
|
||||
{
|
||||
SetWidgetStyle();
|
||||
gtk_widget_set_style(m_widget, m_widgetStyle);
|
||||
gtk_widget_set_style(BUTTON_CHILD(m_widget), m_widgetStyle);
|
||||
}
|
||||
|
||||
bool wxToggleBitmapButton::IsOwnGtkWindow(GdkWindow *window)
|
||||
{
|
||||
return window == TOGGLE_BUTTON_EVENT_WIN(m_widget);
|
||||
}
|
||||
|
||||
void wxToggleBitmapButton::OnInternalIdle()
|
||||
{
|
||||
wxCursor cursor = m_cursor;
|
||||
|
||||
if (g_globalCursor.Ok())
|
||||
cursor = g_globalCursor;
|
||||
|
||||
GdkWindow *win = TOGGLE_BUTTON_EVENT_WIN(m_widget);
|
||||
if ( win && cursor.Ok() )
|
||||
{
|
||||
/* I now set the cursor the anew in every OnInternalIdle call
|
||||
as setting the cursor in a parent window also effects the
|
||||
windows above so that checking for the current cursor is
|
||||
not possible. */
|
||||
|
||||
gdk_window_set_cursor(win, cursor.GetCursor());
|
||||
}
|
||||
|
||||
if (wxUpdateUIEvent::CanUpdate(this))
|
||||
UpdateWindowUI(wxUPDATE_UI_FROMIDLE);
|
||||
}
|
||||
|
||||
// wxSize DoGetBestSize() const
|
||||
// Get the "best" size for this control.
|
||||
wxSize wxToggleBitmapButton::DoGetBestSize() const
|
||||
{
|
||||
wxSize ret(wxControl::DoGetBestSize());
|
||||
|
||||
if (!HasFlag(wxBU_EXACTFIT))
|
||||
{
|
||||
if (ret.x < 80) ret.x = 80;
|
||||
}
|
||||
|
||||
|
||||
return ret;
|
||||
}
|
||||
// ------------------------------------------------------------------------
|
||||
// wxToggleButton
|
||||
// ------------------------------------------------------------------------
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxToggleButton, wxControl)
|
||||
|
||||
bool wxToggleButton::Create(wxWindow *parent, wxWindowID id,
|
||||
const wxString &label, const wxPoint &pos,
|
||||
const wxSize &size, long style,
|
||||
|
Loading…
Reference in New Issue
Block a user