]> git.saurik.com Git - wxWidgets.git/commitdiff
implement support for button bitmaps (normal state only for now) for wxGTK
authorVadim Zeitlin <vadim@wxwidgets.org>
Tue, 16 Jun 2009 05:16:31 +0000 (05:16 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Tue, 16 Jun 2009 05:16:31 +0000 (05:16 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61075 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/gtk/button.h
src/gtk/button.cpp

index d04870f76e132c846c5c164eb0cd39e13e970a93..cdf674aa782ab5497c998b634bcf3cdb29bf04b2 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        wx/gtk/button.h
 /////////////////////////////////////////////////////////////////////////////
 // Name:        wx/gtk/button.h
-// Purpose:
+// Purpose:     wxGTK wxButton class declaration
 // Author:      Robert Roebling
 // Id:          $Id$
 // Copyright:   (c) 1998 Robert Roebling
 // Author:      Robert Roebling
 // Id:          $Id$
 // Copyright:   (c) 1998 Robert Roebling
 // wxButton
 //-----------------------------------------------------------------------------
 
 // wxButton
 //-----------------------------------------------------------------------------
 
-class WXDLLIMPEXP_CORE wxButton: public wxButtonBase
+class WXDLLIMPEXP_CORE wxButton : public wxButtonBase
 {
 public:
 {
 public:
-    wxButton();
+    wxButton() { }
     wxButton(wxWindow *parent, wxWindowID id,
            const wxString& label = wxEmptyString,
            const wxPoint& pos = wxDefaultPosition,
     wxButton(wxWindow *parent, wxWindowID id,
            const wxString& label = wxEmptyString,
            const wxPoint& pos = wxDefaultPosition,
@@ -28,8 +28,6 @@ public:
         Create(parent, id, label, pos, size, style, validator, name);
     }
 
         Create(parent, id, label, pos, size, style, validator, name);
     }
 
-    virtual ~wxButton();
-
     bool Create(wxWindow *parent, wxWindowID id,
            const wxString& label = wxEmptyString,
            const wxPoint& pos = wxDefaultPosition,
     bool Create(wxWindow *parent, wxWindowID id,
            const wxString& label = wxEmptyString,
            const wxPoint& pos = wxDefaultPosition,
@@ -39,7 +37,7 @@ public:
 
     virtual wxWindow *SetDefault();
     virtual void SetLabel( const wxString &label );
 
     virtual wxWindow *SetDefault();
     virtual void SetLabel( const wxString &label );
-    virtual bool Enable( bool enable = TRUE );
+    virtual bool Enable( bool enable = true );
 
     // implementation
     // --------------
 
     // implementation
     // --------------
@@ -56,7 +54,13 @@ protected:
 
     virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const;
 
 
     virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const;
 
+    virtual wxBitmap DoGetBitmap(State which) const;
+    virtual void DoSetBitmap(const wxBitmap& bitmap, State which);
+    virtual void DoSetBitmapPosition(wxDirection dir);
+
 private:
 private:
+    wxBitmap m_bitmaps[State_Max];
+
     DECLARE_DYNAMIC_CLASS(wxButton)
 };
 
     DECLARE_DYNAMIC_CLASS(wxButton)
 };
 
index 066183e717c9cfba0204d1bd07ec99a83ad5e0c8..71b8bd98fff8aeb1e30cf3abf8d5d8658778f3fb 100644 (file)
@@ -75,14 +75,6 @@ gtk_button_style_set_callback(GtkWidget* widget, GtkStyle*, wxButton* win)
 
 IMPLEMENT_DYNAMIC_CLASS(wxButton,wxControl)
 
 
 IMPLEMENT_DYNAMIC_CLASS(wxButton,wxControl)
 
-wxButton::wxButton()
-{
-}
-
-wxButton::~wxButton()
-{
-}
-
 bool wxButton::Create(wxWindow *parent,
                       wxWindowID id,
                       const wxString &label,
 bool wxButton::Create(wxWindow *parent,
                       wxWindowID id,
                       const wxString &label,
@@ -262,7 +254,7 @@ wxSize wxButton::DoGetBestSize() const
 {
     // the default button in wxGTK is bigger than the other ones because of an
     // extra border around it, but we don't want to take it into account in
 {
     // the default button in wxGTK is bigger than the other ones because of an
     // extra border around it, but we don't want to take it into account in
-    // our size calculations (otherwsie the result is visually ugly), so
+    // our size calculations (otherwise the result is visually ugly), so
     // always return the size of non default button from here
     const bool isDefault = GTK_WIDGET_HAS_DEFAULT(m_widget);
     if ( isDefault )
     // always return the size of non default button from here
     const bool isDefault = GTK_WIDGET_HAS_DEFAULT(m_widget);
     if ( isDefault )
@@ -282,8 +274,10 @@ wxSize wxButton::DoGetBestSize() const
     if (!HasFlag(wxBU_EXACTFIT))
     {
         wxSize defaultSize = GetDefaultSize();
     if (!HasFlag(wxBU_EXACTFIT))
     {
         wxSize defaultSize = GetDefaultSize();
-        if (ret.x < defaultSize.x) ret.x = defaultSize.x;
-        if (ret.y < defaultSize.y) ret.y = defaultSize.y;
+        if (ret.x < defaultSize.x)
+            ret.x = defaultSize.x;
+        if (ret.y < defaultSize.y)
+            ret.y = defaultSize.y;
     }
 
     CacheBestSize(ret);
     }
 
     CacheBestSize(ret);
@@ -297,4 +291,81 @@ wxButton::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))
     return GetDefaultAttributesFromGTKWidget(gtk_button_new);
 }
 
     return GetDefaultAttributesFromGTKWidget(gtk_button_new);
 }
 
+// ----------------------------------------------------------------------------
+// bitmaps support
+// ----------------------------------------------------------------------------
+
+wxBitmap wxButton::DoGetBitmap(State which) const
+{
+    return m_bitmaps[which];
+}
+
+void wxButton::DoSetBitmap(const wxBitmap& bitmap, State which)
+{
+#ifdef __WXGTK26__
+    // normal image is special: setting it enables images for the button and
+    // resetting it to nothing disables all of them
+    if ( which == State_Normal )
+    {
+        if ( !gtk_check_version(2,6,0) )
+        {
+            GtkWidget *image = gtk_button_get_image(GTK_BUTTON(m_widget));
+            if ( image && !bitmap.IsOk() )
+            {
+                gtk_container_remove(GTK_CONTAINER(m_widget), image);
+                InvalidateBestSize();
+            }
+            else if ( !image && bitmap.IsOk() )
+            {
+                image = gtk_image_new();
+                gtk_button_set_image(GTK_BUTTON(m_widget), image);
+                InvalidateBestSize();
+            }
+            //else: image presence or absence didn't change
+
+            if ( bitmap.IsOk() )
+            {
+                gtk_image_set_from_pixbuf(GTK_IMAGE(image), bitmap.GetPixbuf());
+            }
+        }
+    }
+#endif // GTK+ 2.6+
+
+    m_bitmaps[which] = bitmap;
+}
+
+void wxButton::DoSetBitmapPosition(wxDirection dir)
+{
+#ifdef __WXGTK210__
+    if ( !gtk_check_version(2,10,0) )
+    {
+        GtkPositionType gtkpos;
+        switch ( dir )
+        {
+            default:
+                wxFAIL_MSG( "invalid position" );
+                // fall through
+
+            case wxLEFT:
+                gtkpos = GTK_POS_LEFT;
+                break;
+
+            case wxRIGHT:
+                gtkpos = GTK_POS_RIGHT;
+                break;
+
+            case wxTOP:
+                gtkpos = GTK_POS_TOP;
+                break;
+
+            case wxBOTTOM:
+                gtkpos = GTK_POS_BOTTOM;
+                break;
+        }
+
+        gtk_button_set_image_position(GTK_BUTTON(m_widget), gtkpos);
+    }
+#endif // GTK+ 2.10+
+}
+
 #endif // wxUSE_BUTTON
 #endif // wxUSE_BUTTON